package com.forfan.bigbang.component.activity.setting;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.ContentLoadingProgressBar;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.forfan.bigbang.R;
import com.forfan.bigbang.baseCard.DividerItemDecoration;
import com.forfan.bigbang.component.activity.whitelist.AppListAdapter;
import com.forfan.bigbang.component.base.BaseActivity;
import com.forfan.bigbang.util.ToastUtil;
import com.forfan.bigbang.util.UrlCountUtil;
import com.shang.xposed.setting.StatusBarCompat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static com.forfan.bigbang.component.activity.setting.MonitorSettingCard.SPINNER_ARRAY;
import static com.forfan.bigbang.component.activity.whitelist.AppListAdapter.ApplicationInfoWrap.NON_SELECTION;
import static com.shang.xposed.XposedConstant.SP_NAME;
public class XposedAppManagerActivity extends BaseActivity {
private RecyclerView mAppListView;
private AppListAdapter mAppAdapter;
private List<AppListAdapter.ApplicationInfoWrap> mCanOpenApplicationInfos;
private List<AppListAdapter.ApplicationInfoWrap> mAllApplicationInfos;
private List<AppListAdapter.ApplicationInfoWrap> mShowApplicationInfos;
private Set<AppListAdapter.ApplicationInfoWrap> mSelectedApplicationInfos;
private ContentLoadingProgressBar mLoadingProgressBar;
private Toolbar toolbar;
private MenuItem selectAll;
private MenuItem setSelection;
private SharedPreferences mPreferences;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO 自动生成的方法存根
super.onCreate(savedInstanceState);
StatusBarCompat.setupStatusBarView(this, (ViewGroup) this.getWindow().getDecorView(), true, R.color.colorPrimary);
setContentView(R.layout.activity_monitor_white_list);
mPreferences=getSharedPreferences(SP_NAME,MODE_WORLD_READABLE);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(R.string.xposed_white_list);
initView();
ToastUtil.show(R.string.white_list_tip);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
getMenuInflater().inflate(R.menu.white_list_activity_menu, menu);
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView searchView = (SearchView) menu.findItem(R.id.ab_search).getActionView();
selectAll=menu.findItem(R.id.select_all);
setSelection=menu.findItem(R.id.setSelection);
final SearchView.SearchAutoComplete searchEditText = (SearchView.SearchAutoComplete) searchView.findViewById(R.id.search_src_text);
searchEditText.setTextColor(getResources().getColor(R.color.white));
searchView.setQueryHint("Search");
// 将搜索按钮放到搜索输入框的外边
searchView.setIconifiedByDefault(false);
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
refreshListByQuery(searchView.getQuery().toString());
return true;
}
});
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
refreshListByQuery("");
return false;
}
});
// MenuItem menuItem=menu.add("恢复默认");
// menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
// menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
// @Override
// public boolean onMenuItemClick(MenuItem item) {
// if(mSelectedApplicationInfos==null){
// SnackBarUtil.show(toolbar,R.string.wait_until_loaded);
// return true;
// }
// for (AppListAdapter.ApplicationInfoWrap app:mSelectedApplicationInfos){
// app.isSelected=false;
// }
// mSelectedApplicationInfos.clear();
// mAppAdapter.notifyDataSetChanged();
// refreshTV();
// return true;
// }
// });
}
setSelection.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
showPopupMenu(toolbar);
return true;
}
});
refreshMenu(false);
return true;
}
private void refreshMenu(boolean isEditMode){
if (mSelectedApplicationInfos==null){
return;
}
if (mSelectedApplicationInfos.size()>0 || isEditMode){
selectAll.setVisible(true);
setSelection.setVisible(true);
selectAll.setIcon(R.drawable.select_all);
selectAll.setTitle(R.string.select_all);
selectAll.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
boolean isAllSelected=true;
for (AppListAdapter.ApplicationInfoWrap app:mShowApplicationInfos) {
if (!app.isSelected){
isAllSelected=false;
break;
}
}
for (AppListAdapter.ApplicationInfoWrap app:mShowApplicationInfos) {
if (isAllSelected){
app.isSelected = false;
mSelectedApplicationInfos.remove(app);
}else {
app.isSelected = true;
mSelectedApplicationInfos.add(app);
}
}
mAppAdapter.notifyDataSetChanged();
UrlCountUtil.onEvent(UrlCountUtil.STATUS_WL_SELECT_ALL,!isAllSelected);
return true;
}
});
}else {
selectAll.setVisible(true);
setSelection.setVisible(false);
selectAll.setIcon(R.drawable.select_mode);
selectAll.setTitle(R.string.select_mode);
selectAll.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (mAppAdapter!=null) {
mAppAdapter.setEditMode(true);
refreshMenu(true);
UrlCountUtil.onEvent(UrlCountUtil.CLICK_WL_SELECT_MODE);
}
return true;
}
});
}
}
public void showPopupMenu(View view) {
//参数View 是设置当前菜单显示的相对于View组件位置,具体位置系统会处理
PopupMenu popupMenu = new PopupMenu(this, view, Gravity.RIGHT,R.attr.popupMenuStyle,R.style.PopUpMenuStyle);
//加载menu布局
Menu menu=popupMenu.getMenu();
String[] spinnerArray = getResources().getStringArray(SPINNER_ARRAY);
int i=0;
for (i=0;i<spinnerArray.length;i++) {
menu.add(0,i,i,spinnerArray[i]);
}
menu.add(0,i,i,R.string.select_cancel);
//设置menu中的item点击事件
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (mAppAdapter==null){
return false;
}
int id = item.getItemId();
if (id<spinnerArray.length){
for (AppListAdapter.ApplicationInfoWrap app:mSelectedApplicationInfos){
app.selection=id;
}
mAppAdapter.notifyDataSetChanged();
refreshMenu(true);
}else {
unSelectAll();
refreshMenu(false);
}
UrlCountUtil.onEvent(UrlCountUtil.STATUS_WL_SELECTION,id+"");
return true;
}
});
popupMenu.show();
}
private void unSelectAll() {
for (AppListAdapter.ApplicationInfoWrap app:mSelectedApplicationInfos){
app.isSelected=false;
}
mSelectedApplicationInfos.clear();
mAppAdapter.setEditMode(false);
mAppAdapter.notifyDataSetChanged();
}
@Override
protected void onNewIntent(Intent intent) {
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
//use the query to search your data somehow
refreshListByQuery(query);
}
}
private void refreshListByQuery(String query) {
if (mCanOpenApplicationInfos == null) {
return;
}
if (TextUtils.isEmpty(query)) {
mShowApplicationInfos = mCanOpenApplicationInfos;
} else {
mShowApplicationInfos = new ArrayList<>();
for (AppListAdapter.ApplicationInfoWrap app : mCanOpenApplicationInfos) {
if (app.applicationInfo.loadLabel(getPackageManager()).toString().toLowerCase().contains(query.toLowerCase())) {
mShowApplicationInfos.add(app);
}
}
}
if (mAppAdapter != null) {
mAppAdapter.setAppList(mShowApplicationInfos);
mAppAdapter.notifyDataSetChanged();
}
}
@Override
public void onBackPressed() {
if (mAppAdapter!=null&&mAppAdapter.isEditMode()){
unSelectAll();
refreshMenu(false);
return;
}
super.onBackPressed();
}
@Override
protected void onStop() {
saveSelectedApp();
super.onStop();
}
private void initView() {
mSelectedApplicationInfos = new HashSet<>();
mLoadingProgressBar = (ContentLoadingProgressBar) findViewById(R.id.loading);
mAppListView = (RecyclerView) findViewById(R.id.app_list);
mLoadingProgressBar.show();
final Handler handler = new Handler();
new Thread(new Runnable() {
@Override
public void run() {
queryFilterAppInfo();
querySelectedApp();
handler.post(new Runnable() {
@Override
public void run() {
mLoadingProgressBar.hide();
initAppList();
mAppListView.setVisibility(View.VISIBLE);
}
});
}
}).start();
}
private void querySelectedApp() {
for (AppListAdapter.ApplicationInfoWrap app:mCanOpenApplicationInfos){
int type=getPackageSelection(app.applicationInfo.packageName);
app.selection = type;
}
}
private int getPackageSelection(String packageName){
return mPreferences.getInt(packageName,NON_SELECTION);
}
private void saveSelectedApp() {
if (mCanOpenApplicationInfos!=null) {
SharedPreferences.Editor editor=mPreferences.edit();
for (AppListAdapter.ApplicationInfoWrap appInfo : mCanOpenApplicationInfos) {
editor.putInt(appInfo.applicationInfo.packageName, appInfo.selection);
}
editor.apply();
ToastUtil.show(R.string.please_restart);
}
}
private void initAppList() {
mAppListView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
DividerItemDecoration divider = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST);
divider.setDivider(this.getResources().getDrawable(R.drawable.situation_divider));
mAppListView.addItemDecoration(divider);
mAppAdapter = new AppListAdapter(this);
mAppAdapter.setAppList(mShowApplicationInfos);
mAppAdapter.setmListener(new AppListAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position, boolean isChecked) {
if (position < 0 || position >= mShowApplicationInfos.size()) {
return;
}
int size=mSelectedApplicationInfos.size();
final AppListAdapter.ApplicationInfoWrap select = mShowApplicationInfos.get(position);
select.isSelected = isChecked;
if (isChecked) {
mSelectedApplicationInfos.add(select);
} else {
mSelectedApplicationInfos.remove(select);
}
if (size==mSelectedApplicationInfos.size()){
return;
}
if (mSelectedApplicationInfos.size()==0){
mAppAdapter.setEditMode(false);
}
refreshMenu(false);
}
@Override
public void onItemSpinnerChanged(int position, int selectPosition) {
if (position < 0 || position >= mShowApplicationInfos.size()) {
return;
}
final AppListAdapter.ApplicationInfoWrap select = mShowApplicationInfos.get(position);
select.selection=selectPosition;
UrlCountUtil.onEvent(UrlCountUtil.STATUS_WL_SELECTION,selectPosition+"");
}
@Override
public void onLongClick(int position) {
if (position < 0 || position >= mShowApplicationInfos.size()) {
return;
}
final AppListAdapter.ApplicationInfoWrap select = mShowApplicationInfos.get(position);
select.isSelected=true;
mSelectedApplicationInfos.add(select);
refreshMenu(true);
mAppAdapter.setEditMode(true);
}
});
mAppListView.setAdapter(mAppAdapter);
}
//全部程序包
private void queryFilterAppInfo() {
final PackageManager pm = this.getPackageManager();
// 查询所有已经安装的应用程序
List<ApplicationInfo> appInfos = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);// GET_UNINSTALLED_PACKAGES代表已删除,但还有安装目录的
List<AppListAdapter.ApplicationInfoWrap> applicationInfos = new ArrayList<>();
List<AppListAdapter.ApplicationInfoWrap> allApp = new ArrayList<>();
// 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// 通过getPackageManager()的queryIntentActivities方法遍历,得到所有能打开的app的packageName
List<ResolveInfo> resolveinfoList = pm.queryIntentActivities(resolveIntent, 0);
Set<String> allowPackages = new HashSet();
for (ResolveInfo resolveInfo : resolveinfoList) {
allowPackages.add(resolveInfo.activityInfo.packageName);
}
for (ApplicationInfo app : appInfos) {
// if((app.flags & ApplicationInfo.FLAG_SYSTEM) <= 0)//排除系统应用
// {
// applicationInfos.add(app);
// }
// if(app.uid > 10000){
// applicationInfos.add(app);
// }
AppListAdapter.ApplicationInfoWrap wrap = new AppListAdapter.ApplicationInfoWrap();
wrap.applicationInfo = app;
if (allowPackages.contains(app.packageName)) {
applicationInfos.add(wrap);
}
allApp.add(wrap);
}
Collections.sort(applicationInfos, new Comparator<AppListAdapter.ApplicationInfoWrap>() {//按名字排序,便于找到应用
@Override
public int compare(AppListAdapter.ApplicationInfoWrap lhs, AppListAdapter.ApplicationInfoWrap rhs) {
// TODO 自动生成的方法存根
String lhsName=lhs.applicationInfo.packageName;
String rhsName=rhs.applicationInfo.packageName;
if (rhsName.equals("im.yixin")){
return 1000000;
}else if (rhsName.equals("com.alibaba.android.rimet")){
return 2000000;
}else if (rhsName.equals("com.immomo.momo")){
return 3000000;
}else if (rhsName.equals("com.sina.weibo")){
return 4000000;
}else if (rhsName.equals("com.eg.android.AlipayGphone")){
return 5000000;
}else if (rhsName.equals("com.tencent.mobileqq")){
return 6000000;
}else if (rhsName.equals("com.tencent.mm")){
return 7000000;
}
if (lhsName.equals("im.yixin")){
return -1000000;
}else if (lhsName.equals("com.alibaba.android.rimet")){
return -2000000;
}else if (lhsName.equals("com.immomo.momo")){
return -3000000;
}else if (lhsName.equals("com.sina.weibo")){
return -4000000;
}else if (lhsName.equals("com.eg.android.AlipayGphone")){
return -5000000;
}else if (lhsName.equals("com.tencent.mobileqq")){
return -6000000;
}else if (lhsName.equals("com.tencent.mm")){
return -7000000;
}
return lhs.applicationInfo.loadLabel(pm).toString().compareToIgnoreCase(rhs.applicationInfo.loadLabel(pm).toString());
}
});
mAllApplicationInfos = allApp;
mCanOpenApplicationInfos = applicationInfos;
mShowApplicationInfos = mCanOpenApplicationInfos;
}
}