package nico.styTool;

import android.app.ProgressDialog;
import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;

import dump.o.SilentInstall;

public class buff_ext extends AppCompatActivity 
implements AdapterView.OnItemClickListener, IUninstall, SearchView.OnQueryTextListener, AdapterView.OnItemLongClickListener
{

    TextView apkPathText;
    List<AppInfo> list;// 数据
    List<AppInfo> allList = new ArrayList<AppInfo>();
    ListView lv; // 列表视图
    //ImageView img;
    apiAdapter adapter; // 适配器

    public static final int SORT_NAME = 0;//按名称排序
    public static final int SORT_DATE = 1;//按日期排序
    public static final int SORT_SIZE = 2;//按大小排序

    // final String[] sorts = {"名称", "日期", "大小"};

    int currSort = SORT_DATE;//当前排序
    Comparator<AppInfo> comparator = null;// 当前所使用的比较器

    String apkPath;

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
	// Inflate the menu; this adds items to the action bar if it is present.
	getMenuInflater().inflate(R.menu.apk_main, menu);
	
	 search = menu.findItem(R.id.search);//容器
	 sv = (SearchView) search.getActionView();//真正的搜索对象
	// sv.setIconifiedByDefault(false);//图标显示在外侧
	 //sv.setSubmitButtonEnabled(true);//让提交按钮可用
	// sv.setQueryHint("请输入应用名");//提示用户信息
	 //sv.setOnQueryTextListener(buff_ext.this);//关联提交事件
	 
	return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {

	int id = item.getItemId();


	if (id == R.id.sort_name)
	{
	    currSort = SORT_NAME;// 给排序状态赋值
	}
	else if (id == R.id.sort_date)
	{
	    currSort = SORT_DATE;
	}
	else if (id == R.id.sort_size)
	{
	    currSort = SORT_SIZE;
	}


	update_sort();// 调用统一的排序方法

	asc *= -1;//负数,正数

	return super.onOptionsItemSelected(item);
    }

    // 带排序的更新
    private void update_sort()
    {
	if (currSort == SORT_NAME)
	{
	    comparator = nameComparator;// 选择不同的比较器
	}
	if (currSort == SORT_DATE)
	{
	    comparator = dateComparator;
	}
	if (currSort == SORT_SIZE)
	{
	    comparator = sizeComparator;
	}
	Collections.sort(list, comparator);// 这里才是排序的操作
	adapter.setList(list);
	adapter.notifyDataSetChanged();// 刷新视图
	update_infobar();
    }

    int asc = 1; // 可以帮助在正序和倒序之间进行切换
    // 日期比较器
    Comparator<AppInfo> dateComparator = new Comparator<AppInfo>() {
	@Override
	public int compare(AppInfo lhs, AppInfo rhs)
	{


	    if (rhs.lastUpdateTime > lhs.lastUpdateTime
		)
	    {
		return -1 * asc;
	    }
	    else if (rhs.lastUpdateTime == lhs.lastUpdateTime)
	    {
		return 0;
	    }
	    else
	    {
		return 1 * asc;
	    }
	}//
    };

    // 大小比较器
    Comparator<AppInfo> sizeComparator = new Comparator<AppInfo>() {
	@Override
	public int compare(AppInfo lhs, AppInfo rhs)
	{
	    if (rhs.byteSize > lhs.byteSize)
	    {
		return -1 * asc;
	    }
	    else if (rhs.byteSize == lhs.byteSize)
	    {
		return 0;
	    }
	    else
	    {
		return 1 * asc;
	    }
	}
    };

    // 应用名比较器
    Comparator<AppInfo> nameComparator = new Comparator<AppInfo>() {
	@Override
	public int compare(AppInfo lhs, AppInfo rhs)
	{
	    // 为了适应汉字的比较
	    Collator c = Collator.getInstance(Locale.CHINA);
	    return (asc == 1) ? c.compare(lhs.appName, rhs.appName)
		: c.compare(rhs.appName, lhs.appName);
	}
    };


    // 1声明进度框对象
    ProgressDialog pd;

    // 显示一个环形进度框
    public void showProgressDialog()
    {
	// 实例化
	pd = new ProgressDialog(this);
	// "旋转"风格
	pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
	pd.setTitle("系统信息");
	pd.setMessage("正在加载应用列表,请耐心等待...");
	pd.show();// 显示
    }

    Handler handler = new Handler() {// 内部类

	@Override
	public void handleMessage(Message msg)
	{
	    // 重写方法
	    if (msg.what == 1)
	    {// UI 线程的回调处理
		pd.dismiss();
		// 更新列表
		adapter.notifyDataSetChanged();
		//  size();

		//Toast.makeText(MainActivity.this, "应用数:" + list.size(), Toast.LENGTH_LONG).show();
		update_sort();
	    }
	}
    };

    //3.子线程
    private void updateData()
    {

	// (1)--启动新线程,处理耗时操作
	new Thread() {
	    public void run()
	    {
		// 获得数据(所有的应用)
		list = apitils.getAppList(buff_ext.this);
		allList.clear();// 清空
		allList.addAll(list);// 复制集合
		adapter.setList(list);
		// 给主线程发消息

		Message msg = handler.obtainMessage();
		msg.what = 1;
		handler.sendMessage(msg);// msg.what=1
	    }

    }.start();
	// (2) --
	showProgressDialog();// 显示进度框
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
	// 获取本行的应用信息对象
	AppInfo app = (AppInfo) parent.getItemAtPosition(position);
	// 运行应用
	apitils.openPackage(this, app.packageName);
    }

    @Override
    public void onBtnClick(int pos, String packageName)
    {
	apitils.uninstallApk(this, packageName, 0);//0-requestCode
    }
    /*
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data)
     {
     // 接收窗体返回值
     if (requestCode == 0)
     {
     // 刷新列表
     updateData();
     }

     super.onActivityResult(requestCode, resultCode, data);
     }
     */
    ImageView iv_asc;
    TextView sort, count, size;

    // 更新顶部信息栏中内容
    private void update_infobar()
    {


	if (asc == 1)
	{
	 //   iv_asc.setImageResource(android.R.drawable.arrow_up_float);
	}
	else
	{
	 //   iv_asc.setImageResource(android.R.drawable.arrow_down_float);
	}


	//sort.setText("排序: " + sorts[currSort]);

	//sort.setOnClickListener(this);
	count.setText("已安装:" + list.size());
	size.setText("占用内存:" + getListSize());
    }

    /**
     * 遍历数据集合,累加全部的Size
     *
     * @return
     */
    private String getListSize()
    {
	long sum = 0;// 总和
	for (AppInfo app : list)
	{// foreach
	    sum += app.byteSize;
	}
	return apitils.getSize2(sum);
    }

    public void clickImg(View v)
    {
	// (1)切换正序/倒序
	update_sort();
	asc *= -1;

    }
    @Override
    public boolean onQueryTextSubmit(String query)
    {
	//提交关键字
	//Utils.toast(this, "您查询的关键字是 :" + query.trim());
	apitils.KEY = query.trim();
	list = apitils.getSearchResult(allList, query);//根据关键字生成结果
	update_sort();//重新排序事件

	return true;//消化事件
    }

    @Override
    public boolean onQueryTextChange(String newText)
    {
	//结果集越搜越小
	//我们永远保持一个最初结果集
	// Utils.toast(this, "您查询的是:" + newText.trim());
	apitils.KEY = newText.trim();
	list = apitils.getSearchResult(allList, newText.trim());//根就关键字生成结果
	update_sort();//重新排序更新

	return true;
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
    {
	AppInfo app = (AppInfo) parent.getItemAtPosition(position);
	Intent intent = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS");
	String pkg = "com.android.settings";
	String cls = "com.android.settings.applications.InstalledAppDetails";
	intent.setComponent(new ComponentName(pkg, cls));
	intent.setData(Uri.parse("package:" + app.packageName));//指明要打开的应用
	startActivity(intent);// 用普通的方法去打开界面
	return true;// 消化掉事件
    }
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_buff);
	StatusBarUtil.setColor(this, getResources().getColor(R.color.colorPrimary));
        apkPathText = (TextView) findViewById(R.id.apkPathText);
	apitils.KEY = "";//初始化
	// 初始化控件
	lv = (ListView) findViewById(R.id.lv_main);
	adapter = new apiAdapter(this);
	adapter.setList(list);
	adapter.setUninstall(buff_ext.this);// 传入接口
	lv.setAdapter(adapter);
	lv.setOnItemClickListener(buff_ext.this);
	lv.setOnItemLongClickListener(buff_ext.this);
	sort = (TextView) findViewById(R.id.sort);
	count = (TextView) findViewById(R.id.count);
	size = (TextView) findViewById(R.id.size);
	iv_asc = (ImageView) findViewById(R.id.iv_asc);
	//img = (ImageView) findViewById(R.id.img3);
	// donghua();
	updateData();// 子线程--拿数据
    }

    //声明变量3
    SearchView sv;
    MenuItem search;

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if (requestCode == 0 && resultCode == RESULT_OK)
	{
            apkPath = data.getStringExtra("apk_path");
            apkPathText.setText(apkPath);
        }
    }

    public void onSilentInstall(View view)
    {
        if (!isRoot())
	{
            Toast.makeText(this, "没有ROOT权限", Toast.LENGTH_SHORT).show();
            return;
        }
        if (TextUtils.isEmpty(apkPath))
	{
	    Intent intent = new Intent(this, FileExplorer.class);
	    startActivityForResult(intent, 0);
            return;
        }
        final Button button = (Button) view;
        button.setText("安装中");
        new Thread(new Runnable() {
		@Override
		public void run()
		{
		    SilentInstall installHelper = new SilentInstall();
		    final boolean result = installHelper.install(apkPath);
		    runOnUiThread(new Runnable() {
			    @Override
			    public void run()
			    {
				if (result)
				{
				    Toast.makeText(buff_ext.this, "安装成功!", Toast.LENGTH_SHORT).show();
				}
				else
				{
				    Toast.makeText(buff_ext.this, "安装失败!", Toast.LENGTH_SHORT).show();
				}
				button.setText("root秒装");
			    }
			});

		}
	    }).start();

    }

    public void onForwardToAccessibility(View view)
    {
        Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
        startActivity(intent);
    }

    public void onSmartInstall(View view)
    {
        if (TextUtils.isEmpty(apkPath))
	{

            return;
        }
        Uri uri = Uri.fromFile(new File(apkPath));
        Intent localIntent = new Intent(Intent.ACTION_VIEW);
        localIntent.setDataAndType(uri, "application/vnd.android.package-archive");
        startActivity(localIntent);
    }

    /**
     * 判断手机是否拥有Root权限。
     * @return 有root权限返回true,否则返回false。
     */
    public boolean isRoot()
    {
        boolean bool = false;
        try
	{
            bool = new File("/system/bin/su").exists() || new File("/system/xbin/su").exists();
        }
	catch (Exception e)
	{
            e.printStackTrace();
        }
        return bool;
    }
}