package com.zte.appopscontrol; import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; import android.app.AppOpsManager; import android.app.Dialog; import android.app.DialogFragment; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.preference.PreferenceActivity; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; import com.zte.appopscontrol.R; import com.zte.appopscontrol.Utils; import java.util.List; public class AppOpsDetailsActivity extends Activity { static final String TAG = "AppOpsDetails"; public static final String ARG_PACKAGE_NAME = "package"; private AppOpsState2 mState; private PackageManager mPm; private AppOpsManager mAppOps; private PackageInfo mPackageInfo; private LayoutInflater mInflater; private View mRootView; private TextView mAppVersion; private LinearLayout mOperationsSection; private String mAppLabel; private final int batchSettingId = 0; private final int MODE_ALLOWED = 0; private final int MODE_IGNORED = 1; private final int MODE_ASK = 2; private int modeToPosition(int mode) { switch (mode) { case AppOpsManager.MODE_ALLOWED: return MODE_ALLOWED; case AppOpsManager.MODE_IGNORED: return MODE_IGNORED; case AppOpsManager.MODE_ASK: return MODE_ASK; }; return MODE_IGNORED; } private int positionToMode(int position) { switch (position) { case MODE_ALLOWED: return AppOpsManager.MODE_ALLOWED; case MODE_IGNORED: return AppOpsManager.MODE_IGNORED; case MODE_ASK: return AppOpsManager.MODE_ASK; }; return AppOpsManager.MODE_IGNORED; } // Utility method to set application label and icon. private void setAppLabelAndIcon(PackageInfo pkgInfo) { final View appSnippet = findViewById(R.id.app_snippet); appSnippet.setPaddingRelative(0, appSnippet.getPaddingTop(), 0, appSnippet.getPaddingBottom()); ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon); icon.setImageDrawable(mPm.getApplicationIcon(pkgInfo.applicationInfo)); // Set application name. TextView label = (TextView) appSnippet.findViewById(R.id.app_name); label.setText(mPm.getApplicationLabel(pkgInfo.applicationInfo)); // Version number of application mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size); if (pkgInfo.versionName != null) { mAppVersion.setVisibility(View.VISIBLE); mAppVersion.setText(getString(R.string.version_text, String.valueOf(pkgInfo.versionName))); } else { mAppVersion.setVisibility(View.INVISIBLE); } } private String retrieveAppEntry() { final Bundle args = getIntent().getExtras(); String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null; if (packageName == null) { Intent intent = (args == null) ? this.getIntent() : (Intent) args.getParcelable("intent"); if (intent != null) { packageName = intent.getData().getSchemeSpecificPart(); } } try { mPackageInfo = mPm.getPackageInfo(packageName, PackageManager.GET_DISABLED_COMPONENTS | PackageManager.GET_UNINSTALLED_PACKAGES); } catch (NameNotFoundException e) { Log.e(TAG, "Exception when retrieving package:" + packageName, e); ; } if(mPackageInfo != null) { ApplicationInfo mInfo = mPackageInfo.applicationInfo; packageName = mInfo.loadLabel(mPm).toString(); } return packageName; } private boolean refreshUi(int batchPos) { if (mPackageInfo == null) { return false; } setAppLabelAndIcon(mPackageInfo); Resources res = this.getResources(); mOperationsSection.removeAllViews(); String lastPermGroup = ""; for(int index = 0; index < AppOpsState2.ALL_TEMPLATES.length; index ++){ final AppOpsState2.OpsTemplate tpl = AppOpsState2.ALL_TEMPLATES[index]; List<AppOpsState2.AppOpEntry> entries = mState.buildState(tpl, mPackageInfo.applicationInfo.uid, mPackageInfo.packageName); for (final AppOpsState2.AppOpEntry entry : entries) { final AppOpsManager.OpEntry firstOp = entry.getOpEntry(0); final View view = mInflater.inflate(R.layout.app_ops_details_item, mOperationsSection, false); mOperationsSection.addView(view); String perm = AppOpsManager.opToPermission(firstOp.getOp()); Drawable drawIcon = this.getResources().getDrawable(AppOpsState2.TEMPLATES_ICON[index]); ((ImageView)view.findViewById(R.id.op_icon)).setImageDrawable(drawIcon); ((TextView)view.findViewById(R.id.op_name)).setText( tpl.resId); // entry.getSwitchText(mState)); ((TextView)view.findViewById(R.id.op_counts)).setText( entry.getCountsText(res)); ((TextView)view.findViewById(R.id.op_time)).setText( entry.getTimeText(res, true)); Spinner sw = (Spinner)view.findViewById(R.id.spinnerWidget); final int switchOp = AppOpsManager.opToSwitch(firstOp.getOp()); int mode = 0; //batch operation if(batchPos != -1) { mode = positionToMode(batchPos); for(int op : tpl.ops){ final int swOp = AppOpsManager.opToSwitch(op); mAppOps.setMode(swOp, entry.getPackageOps().getUid(), entry.getPackageOps().getPackageName(), positionToMode(batchPos)); } } else { mode = mAppOps.checkOp(switchOp, entry.getPackageOps().getUid(), entry.getPackageOps().getPackageName()); } sw.setSelection(modeToPosition(mode)); sw.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() { boolean firstMode = true; @Override public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { if(firstMode) { firstMode = false; return; } for(int op : tpl.ops){ final int switchOp = AppOpsManager.opToSwitch(op); mAppOps.setMode(switchOp, entry.getPackageOps().getUid(), entry.getPackageOps().getPackageName(), positionToMode(position)); } } @Override public void onNothingSelected(AdapterView<?> parentView) { // Do nothing } }); } } return true; } private void setIntentAndFinish(boolean finish, boolean appChanged) { Intent intent = new Intent(); //intent.putExtra(ManageApplications.APP_CHG, appChanged); //PreferenceActivity pa = (PreferenceActivity)getActivity(); //pa.finishPreferencePanel(this, Activity.RESULT_OK, intent); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); mState = new AppOpsState2(this); mPm = getPackageManager(); mInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mAppOps = (AppOpsManager)this.getSystemService(Context.APP_OPS_SERVICE); setContentView(R.layout.app_ops_details); mOperationsSection = (LinearLayout) findViewById(R.id.operations_section); mAppLabel = retrieveAppEntry(); //set action bar ActionBar actionBar = getActionBar();//��ʼ��ActionBar actionBar.setDisplayHomeAsUpEnabled(true);//��ʾ��ߵ�С��ͷ actionBar.setTitle(mAppLabel); } @Override public void onResume() { super.onResume(); if (!refreshUi(-1)) { setIntentAndFinish(true, true); } } private void batchSettingPerms(int position) { //for batch operation refreshUi(position); } private class BatchSettingDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setTitle(mAppLabel) .setItems(R.array.perm_batch_operation, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { batchSettingPerms(which); } }) .setPositiveButton(null,null) .setNegativeButton(R.string.cancel,null) .create(); } } private void showResetDialog() { BatchSettingDialogFragment dialog = new BatchSettingDialogFragment(); dialog.show(getFragmentManager(), "batch_setting_dialog"); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuItem menu1 = menu.add(0, batchSettingId, 0, getString(R.string.batch_operation)); menu1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: this.finish(); return true; case batchSettingId: showResetDialog(); return true; default: return super.onOptionsItemSelected(item); } } }