1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.settings.applications; 17 18 import static android.net.NetworkPolicyManager.POLICY_NONE; 19 import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; 20 21 import android.app.ActivityManager; 22 import android.app.AlertDialog; 23 import android.app.AppOpsManager; 24 import android.app.INotificationManager; 25 import android.content.Context; 26 import android.content.DialogInterface; 27 import android.content.pm.ApplicationInfo; 28 import android.content.pm.IPackageManager; 29 import android.content.pm.PackageManager; 30 import android.net.NetworkPolicyManager; 31 import android.os.AsyncTask; 32 import android.os.Bundle; 33 import android.os.RemoteException; 34 import android.os.ServiceManager; 35 import android.os.UserHandle; 36 37 import com.android.settings.R; 38 39 import java.util.List; 40 41 public class ResetAppsHelper implements DialogInterface.OnClickListener, 42 DialogInterface.OnDismissListener { 43 44 private static final String EXTRA_RESET_DIALOG = "resetDialog"; 45 46 private final PackageManager mPm; 47 private final IPackageManager mIPm; 48 private final INotificationManager mNm; 49 private final NetworkPolicyManager mNpm; 50 private final AppOpsManager mAom; 51 private final Context mContext; 52 53 private AlertDialog mResetDialog; 54 ResetAppsHelper(Context context)55 public ResetAppsHelper(Context context) { 56 mContext = context; 57 mPm = context.getPackageManager(); 58 mIPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); 59 mNm = INotificationManager.Stub.asInterface( 60 ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 61 mNpm = NetworkPolicyManager.from(context); 62 mAom = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); 63 } 64 onRestoreInstanceState(Bundle savedInstanceState)65 public void onRestoreInstanceState(Bundle savedInstanceState) { 66 if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) { 67 buildResetDialog(); 68 } 69 } 70 onSaveInstanceState(Bundle outState)71 public void onSaveInstanceState(Bundle outState) { 72 if (mResetDialog != null) { 73 outState.putBoolean(EXTRA_RESET_DIALOG, true); 74 } 75 } 76 stop()77 public void stop() { 78 if (mResetDialog != null) { 79 mResetDialog.dismiss(); 80 mResetDialog = null; 81 } 82 } 83 buildResetDialog()84 void buildResetDialog() { 85 if (mResetDialog == null) { 86 mResetDialog = new AlertDialog.Builder(mContext) 87 .setTitle(R.string.reset_app_preferences_title) 88 .setMessage(R.string.reset_app_preferences_desc) 89 .setPositiveButton(R.string.reset_app_preferences_button, this) 90 .setNegativeButton(R.string.cancel, null) 91 .setOnDismissListener(this) 92 .show(); 93 } 94 } 95 96 @Override onDismiss(DialogInterface dialog)97 public void onDismiss(DialogInterface dialog) { 98 if (mResetDialog == dialog) { 99 mResetDialog = null; 100 } 101 } 102 103 @Override onClick(DialogInterface dialog, int which)104 public void onClick(DialogInterface dialog, int which) { 105 if (mResetDialog != dialog) { 106 return; 107 } 108 AsyncTask.execute(new Runnable() { 109 @Override 110 public void run() { 111 List<ApplicationInfo> apps = mPm.getInstalledApplications( 112 PackageManager.GET_DISABLED_COMPONENTS); 113 for (int i = 0; i < apps.size(); i++) { 114 ApplicationInfo app = apps.get(i); 115 try { 116 mNm.setNotificationsEnabledForPackage(app.packageName, app.uid, true); 117 } catch (android.os.RemoteException ex) { 118 } 119 if (!app.enabled) { 120 if (mPm.getApplicationEnabledSetting(app.packageName) 121 == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) { 122 mPm.setApplicationEnabledSetting(app.packageName, 123 PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 124 PackageManager.DONT_KILL_APP); 125 } 126 } 127 } 128 try { 129 mIPm.resetApplicationPreferences(UserHandle.myUserId()); 130 } catch (RemoteException e) { 131 } 132 mAom.resetAllModes(); 133 final int[] restrictedUids = mNpm.getUidsWithPolicy( 134 POLICY_REJECT_METERED_BACKGROUND); 135 final int currentUserId = ActivityManager.getCurrentUser(); 136 for (int uid : restrictedUids) { 137 // Only reset for current user 138 if (UserHandle.getUserId(uid) == currentUserId) { 139 mNpm.setUidPolicy(uid, POLICY_NONE); 140 } 141 } 142 } 143 }); 144 } 145 } 146