package github.hellocsl.smartmonitor;


import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;

import github.hellocsl.smartmonitor.state.IMonitorService;
import github.hellocsl.smartmonitor.state.Impl.IdleState;
import github.hellocsl.smartmonitor.state.MonitorState;
import github.hellocsl.smartmonitor.utils.Constant;

import static android.view.accessibility.AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOWS_CHANGED;
import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED;
import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;


/**
 * Created by chensuilun on 16-10-8.
 */
public class VideoAccessibilityService extends AccessibilityService implements IMonitorService {
    private static final String TAG = "VideoAccessibilityServi";
    public static boolean sIsEnable = false;

    private MonitorState mCurState;

    @Override
    public void setState(MonitorState state) {
        mCurState = state;
    }


    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        registerScreenReceiver();
        if (BuildConfig.DEBUG) {
            Log.d(TAG, "onServiceConnected: ");
        }
        sIsEnable = true;
        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        info.eventTypes = TYPE_WINDOW_CONTENT_CHANGED | TYPE_WINDOWS_CHANGED | TYPE_WINDOW_STATE_CHANGED | TYPE_NOTIFICATION_STATE_CHANGED;

        // If you only want this service to work with specific applications, set their
        // package names here.  Otherwise, when the service is activated, it will listen
        // to events from all applications.
        info.packageNames = new String[]{Constant.QQ_PKG};

        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
//        info.flags = AccessibilityServiceInfo.DEFAULT;
        info.notificationTimeout = 100;

        this.setServiceInfo(info);
        setState(new IdleState(this));
    }

    @Override
    public boolean onUnbind(Intent intent) {
        if (BuildConfig.DEBUG) {
            Log.d(TAG, "onUnbind: ");
        }
        unRegisterScreenReceiver();
        sIsEnable = false;
        return super.onUnbind(intent);
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
        if (BuildConfig.DEBUG) {
            Log.v(TAG, "onAccessibilityEvent: event:" + accessibilityEvent.getEventType());
        }
        if (mCurState != null) {
            mCurState.handle(accessibilityEvent);
        }
    }


    @Override
    public void onInterrupt() {
        if (BuildConfig.DEBUG) {
            Log.d(TAG, "onInterrupt: ");
        }
    }


    @Override
    public AccessibilityNodeInfo getWindowNode() {
        return getRootInActiveWindow();
    }


    private ScreenReceiver mScreenReceiver;

    private void registerScreenReceiver() {
        if (mScreenReceiver == null) {
            mScreenReceiver = new ScreenReceiver();
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
            registerReceiver(mScreenReceiver, intentFilter);
        }
    }

    private void unRegisterScreenReceiver() {
        if (mScreenReceiver != null) {
            unregisterReceiver(mScreenReceiver);
        }
    }

    /**
     * @author chensuilun
     */
    public class ScreenReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            switch (intent.getAction()) {
                case Intent.ACTION_SCREEN_OFF:
                    if (BuildConfig.DEBUG) {
                        Log.d(TAG, "onReceive: Screen off");
                    }
                    setState(new IdleState(VideoAccessibilityService.this));
                    break;
                default:
                    break;
            }
        }
    }

}