package com.zzzmode.appopsx.ui.main.group; import android.app.AppOpsManager; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Parcelable; import android.preference.PreferenceManager; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.widget.PopupMenu; import androidx.appcompat.widget.Toolbar; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.h6ah4i.android.widget.advrecyclerview.expandable.RecyclerViewExpandableItemManager; import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils; import com.zzzmode.appopsx.R; import com.zzzmode.appopsx.ui.BaseActivity; import com.zzzmode.appopsx.ui.model.PermissionChildItem; import com.zzzmode.appopsx.ui.model.PermissionGroup; import com.zzzmode.appopsx.ui.widget.CommonDivderDecorator; import java.util.List; /** * Created by zl on 2017/1/17. */ public class PermissionGroupActivity extends BaseActivity implements RecyclerViewExpandableItemManager.OnGroupCollapseListener, RecyclerViewExpandableItemManager.OnGroupExpandListener, PopupMenu.OnMenuItemClickListener, PopupMenu.OnDismissListener,IPermGroupView { private static final String SAVED_STATE_EXPANDABLE_ITEM_MANAGER = "RecyclerViewExpandableItemManager"; private static final String TAG = "PermissionGroupActivity"; private ProgressBar progressBar; private RecyclerView recyclerView; private View coordinatorLayout; private RecyclerView.LayoutManager mLayoutManager; private RecyclerView.Adapter mWrappedAdapter; private RecyclerViewExpandableItemManager mRecyclerViewExpandableItemManager; private PermissionGroupAdapter myItemAdapter; private TextView tvError; private int contextGroupPosition = -1; private PermGroupPresenter mPresenter; private ScrollTopHelper stickyHelper; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_prems_group); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); setTitle(R.string.menu_permission_sort); recyclerView = findViewById(R.id.recyclerView); coordinatorLayout = findViewById(R.id.coordinator_layout); tvError = findViewById(R.id.tv_error); progressBar = findViewById(R.id.progressBar); mLayoutManager = new LinearLayoutManager(this); final Parcelable eimSavedState = (savedInstanceState != null) ? savedInstanceState .getParcelable(SAVED_STATE_EXPANDABLE_ITEM_MANAGER) : null; mRecyclerViewExpandableItemManager = new RecyclerViewExpandableItemManager(eimSavedState); mRecyclerViewExpandableItemManager.setOnGroupExpandListener(this); mRecyclerViewExpandableItemManager.setOnGroupCollapseListener(this); recyclerView.setHasFixedSize(true); myItemAdapter = new PermissionGroupAdapter(mRecyclerViewExpandableItemManager); myItemAdapter.setHasStableIds(true); myItemAdapter.setListener(new PermissionGroupAdapter.OnSwitchItemClickListener() { @Override public void onSwitch(int groupPosition, int childPosition, PermissionChildItem info, boolean v) { mPresenter.changeMode(groupPosition, childPosition, info); } }, new PermissionGroupAdapter.OnGroupOtherClickListener() { @Override public void onOtherClick(int groupPosition, View view) { contextGroupPosition = groupPosition; showPopMenu(groupPosition, view); } }); recyclerView.setLayoutManager(mLayoutManager); recyclerView.addItemDecoration(new CommonDivderDecorator(getApplicationContext())); mRecyclerViewExpandableItemManager.attachRecyclerView(recyclerView); stickyHelper = new ScrollTopHelper(recyclerView, (LinearLayoutManager) mLayoutManager, mRecyclerViewExpandableItemManager,findViewById(R.id.fab)); mPresenter = new PermGroupPresenter(this,getApplicationContext()); mPresenter.loadPerms(); } private void showPopMenu(int groupPosition, View view) { PopupMenu popupMenu = new PopupMenu(this, view); getMenuInflater().inflate(R.menu.group_item_menu, popupMenu.getMenu()); popupMenu.setOnDismissListener(this); popupMenu.setOnMenuItemClickListener(this); popupMenu.show(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mRecyclerViewExpandableItemManager != null) { outState.putParcelable( SAVED_STATE_EXPANDABLE_ITEM_MANAGER, mRecyclerViewExpandableItemManager.getSavedState()); } } @Override protected void onDestroy() { super.onDestroy(); if(mPresenter != null){ mPresenter.destroy(); } if(stickyHelper != null) { stickyHelper.release(); } if (mRecyclerViewExpandableItemManager != null) { mRecyclerViewExpandableItemManager.release(); mRecyclerViewExpandableItemManager = null; } if (recyclerView != null) { recyclerView.setItemAnimator(null); recyclerView.setAdapter(null); recyclerView = null; } if (mWrappedAdapter != null) { WrapperAdapterUtils.releaseAll(mWrappedAdapter); mWrappedAdapter = null; } mLayoutManager = null; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.action_with_net: return true; default: return super.onOptionsItemSelected(item); } } @Override public boolean onCreateOptionsMenu(Menu menu) { if(mPresenter != null && mPresenter.isLoadSuccess()){ getMenuInflater().inflate(R.menu.group_menu,menu); MenuItem menuShowNet = menu.findItem(R.id.action_with_net); MenuItem mendShowHided = menu.findItem(R.id.action_show_ignored); final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); MenuItem.OnMenuItemClickListener itemClickListener = new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { item.setChecked(!item.isChecked()); switch (item.getItemId()){ case R.id.action_with_net: sp.edit().putBoolean("key_g_show_net", item.isChecked()).apply(); break; case R.id.action_show_ignored: sp.edit().putBoolean("key_g_show_ignored", item.isChecked()).apply(); break; } invalidateOptionsMenu(); return true; } }; menuShowNet.setChecked(sp.getBoolean("key_g_show_net", false)); menuShowNet.setOnMenuItemClickListener(itemClickListener); mendShowHided.setChecked(sp.getBoolean("key_g_show_ignored",false)); mendShowHided.setOnMenuItemClickListener(itemClickListener); } return super.onCreateOptionsMenu(menu); } @Override public void changeTitle(int groupPosition, int childPosition, boolean allowed) { myItemAdapter.changeTitle(groupPosition, allowed); mRecyclerViewExpandableItemManager.notifyChildItemChanged(groupPosition, childPosition); mRecyclerViewExpandableItemManager.notifyGroupItemChanged(groupPosition); } @Override public void refreshItem(int groupPosition, int childPosition) { mRecyclerViewExpandableItemManager.notifyChildItemChanged(groupPosition, childPosition); } @Override public void showList(List<PermissionGroup> value) { if (isFinishing()) { return; } progressBar.setVisibility(View.GONE); coordinatorLayout.setVisibility(View.VISIBLE); recyclerView.setVisibility(View.VISIBLE); myItemAdapter.setData(value); mWrappedAdapter = mRecyclerViewExpandableItemManager.createWrappedAdapter(myItemAdapter); recyclerView.setAdapter(mWrappedAdapter); invalidateOptionsMenu(); } @Override public void showError(Throwable e) { try { progressBar.setVisibility(View.GONE); tvError.setVisibility(View.VISIBLE); tvError.setText(getString(R.string.error_msg,"", Log.getStackTraceString(e))); } catch (Exception e1) { e1.printStackTrace(); } } private void changeAll(int newMode) { if (contextGroupPosition >= 0) { try { final int groupPosition = contextGroupPosition; PermissionGroup permissionGroup = myItemAdapter.getData().get(groupPosition); List<PermissionChildItem> apps = permissionGroup.apps; int size = apps.size(); for (int i = 0; i < size; i++) { PermissionChildItem info = apps.get(i); if (info.opEntryInfo.mode != newMode) { //changeMode(groupPosition, i, info); mPresenter.changeMode(groupPosition,i,info); } } } catch (Exception e) { e.printStackTrace(); } } } @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_close_all: changeAll(AppOpsManager.MODE_IGNORED); return true; case R.id.action_open_all: changeAll(AppOpsManager.MODE_ALLOWED); return true; } return super.onContextItemSelected(item); } @Override public void onDismiss(PopupMenu menu) { contextGroupPosition = -1; } @Override public void onGroupCollapse(int groupPosition, boolean fromUser, Object o) { } @Override public void onGroupExpand(int groupPosition, boolean fromUser, Object o) { if (fromUser) { adjustScrollPositionOnGroupExpanded(groupPosition); } } private void adjustScrollPositionOnGroupExpanded(int groupPosition) { int pad = (int) (getResources().getDisplayMetrics().density * 10); int childItemHeight = getResources().getDimensionPixelSize(android.R.dimen.app_icon_size) + pad * 2; int topMargin = (int) (getResources().getDisplayMetrics().density * 16); mRecyclerViewExpandableItemManager .scrollToGroup(groupPosition, childItemHeight, topMargin, topMargin); recyclerView.smoothScrollBy(0,-100); } }