package com.kale.floatbar.service;

import android.accessibilityservice.AccessibilityService;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import com.kale.floatbar.R;
import com.kale.floatbar.util.Prefs;
import com.kale.floatbar.util.Util;

/**
 * @author:金凯
 * @tips :简洁风格的悬浮窗 http://my.oschina.net/u/698243/blog/129168
 * @date :2014-1-24
 */
public class FloatService extends AccessibilityService {
	String tag = getClass().getSimpleName();
	// android 4.1 API 16
	private AccessibilityService service;
	// 定义浮动窗口布局
	LinearLayout mFloatLayout;
	WindowManager.LayoutParams wmParams;
	// 创建浮动窗口设置布局参数的对象
	WindowManager mWindowManager;
	Window window;
	static ImageButton sampleFloat;

	private Prefs prefs;

	public FloatService() {
		service = this;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		Log.e(tag, "onCreate");
		prefs = new Prefs(service);
		createFloatView();
		
	}
	
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		//Log.e(tag, "onStartCommand");
		updateFloatService();
		return super.onStartCommand(intent, flags, startId);
	}
	
	@Override
	public void onDestroy() {
		super.onDestroy();
		//Log.e(tag, "destroy");

		if (mFloatLayout != null) {
			// 移除悬浮窗口
			mWindowManager.removeView(mFloatLayout);
		}
	}
	
	@Override
	public void onAccessibilityEvent(AccessibilityEvent event) {
		
	}
	
	@Override
	public void onInterrupt() {

	}

	@Override
	protected void onServiceConnected() {
		//Log.e(tag, "onServiceConnected");
		updateFloatService();
	}

	@Override
	public boolean onUnbind(Intent intent) {
		return super.onUnbind(intent);
	}

	////////////////////////////////////////////////////////////////////////////


	private void createFloatView() {
		wmParams = Util.getParams(wmParams);
		// 悬浮窗默认显示以左上角为起始坐标
		wmParams.gravity = Gravity.RIGHT| Gravity.TOP;
		if (!prefs.isRightMode()) {
			wmParams.gravity = Gravity.LEFT | Gravity.TOP;
		}
		// 以屏幕右上角为原点,设置x、y初始值,确定显示窗口的起始位置
		wmParams.x = 0;
		wmParams.y = 0;
		mWindowManager = (WindowManager) service.getSystemService(Context.WINDOW_SERVICE);
		LayoutInflater inflater = LayoutInflater.from(service);
		// 获取浮动窗口视图所在布局
		mFloatLayout = (LinearLayout) inflater.inflate(R.layout.floating, null);
		// 添加悬浮窗的视图
		mWindowManager.addView(mFloatLayout, wmParams);
		
		/**
		 * 设置悬浮窗的点击、滑动事件
		 */
		sampleFloat = (ImageButton) mFloatLayout.findViewById(R.id.float_button_id);
		sampleFloat.getBackground().setAlpha(150);
		sampleFloat.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				prefs.doTouch(service);
			}
		});
		
		/**
		 * 设置有无反馈
		 */
		MyOnGestureListener listener = new MyOnGestureListener();
		@SuppressWarnings("deprecation")
		final GestureDetector mGestureDetector = new GestureDetector(listener);

		sampleFloat.setOnTouchListener(new MyOnTouchListener(mGestureDetector));
	}

	
	private void updateFloatService() {
		/**
		 * 设置悬浮窗靠左/靠右
		 */
		if (!prefs.isRightMode()) {
			wmParams.gravity = Gravity.LEFT | Gravity.TOP;
		}
		else {
			wmParams.gravity = Gravity.RIGHT | Gravity.TOP;
		}
		/**
		 * 悬浮窗的上边距
		 */
		wmParams.y = prefs.getDistance();
		mWindowManager.updateViewLayout(mFloatLayout, wmParams);
		
		/**
		 * 设置悬浮窗是否可用
		 */
		if(prefs.isEnabled()) {
			sampleFloat.setVisibility(View.VISIBLE);
		}
		else {
			sampleFloat.setVisibility(View.GONE);
		}

		/**
		 * 设置悬浮窗的大小
		 */
		sampleFloat.setMinimumWidth(prefs.getWidth());
		sampleFloat.setMinimumHeight(prefs.getHeight());
		
		/**
		 * 悬浮窗的颜色和透明度
		 */
		sampleFloat.setBackgroundColor(prefs.getColor());
		sampleFloat.getBackground().setAlpha(prefs.getAlpha());
		
		
	}
	
	//////////////////////////// 下方是监听器 /////////////////////////////////
	
	/**
	 * @author:Jack Tony
	 * @tips  :设置触摸监听器,处理触摸的事件
	 * @date  :2014-8-13
	 */
	private class MyOnTouchListener implements OnTouchListener{
		private GestureDetector mGestureDetector;
		
		public MyOnTouchListener(GestureDetector mGestureDetector) {
			this.mGestureDetector = mGestureDetector;
		}
		
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			if (prefs.isFeedback()) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					v.setBackgroundColor(Color.parseColor("#ffd060"));
				} else if (event.getAction() == MotionEvent.ACTION_UP) {
					v.setBackgroundColor(prefs.getColor());
					v.getBackground().setAlpha(prefs.getAlpha());
				}
			}
			
			return mGestureDetector.onTouchEvent(event);
		}
	}

	/**
	 * @author:金凯
	 * @tips :自己定义的手势监听类,设置悬浮窗上下左右滑动、双击的动作
	 * @date :2014-3-29
	 */
	class MyOnGestureListener extends SimpleOnGestureListener {

		@Override
		public boolean onDoubleTap(MotionEvent e) {
			Log.e(tag, "doubleClick");
			prefs.doDoubleClick(service);
			return false;
		}
		
		@Override
		public void onLongPress(MotionEvent e) {
			super.onLongPress(e);
			Log.e(tag, "longPress");
			prefs.doLongClick(service);
		}

		@Override
		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
				float velocityY) {

			int dy = (int) (e2.getY() - e1.getY()); // 计算滑动的距离,纵向操作
			int dx = (int) (e2.getX() - e1.getX());

			if (dy < -20 && Math.abs(velocityY) > Math.abs(velocityX)) {
				Log.i("sample", "向上");
				prefs.doSwipUp(service);
			}

			if (dy > 20 && Math.abs(velocityY) > Math.abs(velocityX)) {
				Log.i("sample", "向下");
				prefs.doSwipDown(service);
			}

			if (dx > 20 && Math.abs(velocityX) > Math.abs(velocityY)) {
				Log.i("sample", "向右");
				prefs.doSwipRight(service);
			}
			if (dx < -20 && Math.abs(velocityX) > Math.abs(velocityY)) {
				Log.i("sample", "向左");
				prefs.doSwipLeft(service);

			}
			return false;
		}

	}


	
}