package com.wmx.newspushmonitor;

import android.Manifest;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.widget.Button;

import com.wmx.newspushmonitor.ui.NewsInfoAdapter;
import com.wmx.newspushmonitor.ui.NewsInfoItem;

import java.util.List;

public class MainActivity extends AppCompatActivity
        implements AccessibilityManager.AccessibilityStateChangeListener {
    private static final String TAG = "MainActivity";

    private AccessibilityManager accessibilityManager;
    private Button mServiceControlBtn;
    private RecyclerView mNewsInfoRecycleView;
    private NewsInfoAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initAccessibilityService();
        checkPermission();
        handleIntent(getIntent());
    }

    @Override
    public void onAccessibilityStateChanged(boolean enabled) {
        updateMonitorStatus();
    }

    @Override
    protected void onResume() {
        super.onResume();
        updateMonitorStatus();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        handleIntent(intent);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.setting) {
            Intent intent = new Intent(this, SettingsActivity.class);
            startActivity(intent);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int id = view.getId();
            switch (id) {
                case R.id.service_ctl_btn:
                    Intent accessibleIntent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
                    startActivity(accessibleIntent);
                    break;

                default:
                    break;
            }
        }
    };

    private void initView() {
        Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(myToolbar);

        mNewsInfoRecycleView = (RecyclerView) findViewById(R.id.newsinfo_recycler_view);
        mNewsInfoRecycleView.setLayoutManager(new LinearLayoutManager(this));
        mNewsInfoRecycleView.addItemDecoration(
                new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
        mAdapter = new NewsInfoAdapter();
        mNewsInfoRecycleView.setAdapter(mAdapter);

        mServiceControlBtn = (Button) findViewById(R.id.service_ctl_btn);
        mServiceControlBtn.setOnClickListener(mOnClickListener);
    }

    private void initAccessibilityService() {
        accessibilityManager = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
        accessibilityManager.addAccessibilityStateChangeListener(this);
    }

    private void handleIntent(Intent intent) {
        String newsInfo = intent.getStringExtra("newsInfo");
        String packageName = intent.getStringExtra("packageName");
        if (!TextUtils.isEmpty(packageName)){
            mAdapter.addNewsInfoItem(new NewsInfoItem(packageName, newsInfo));
        }
    }

    private void updateMonitorStatus() {
        String statusStr;
        if (isServiceEnabled()) {
            statusStr = getString(R.string.close_service);
        } else {
            statusStr = getString(R.string.start_service);
        }
        mServiceControlBtn.setText(statusStr);
    }

    private boolean isServiceEnabled() {
        List<AccessibilityServiceInfo> accessibilityServices =
                accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);
        for (AccessibilityServiceInfo info : accessibilityServices) {
            if (info.getId().equals(getPackageName() + "/.PushMonitorAccessibilityService")) {
                return true;
            }
        }
        return false;
    }

    private void checkPermission() {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                            "android.permission.GET_INTENT_SENDER_INTENT"}, 0);
        }
    }
}