summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2012-05-13 15:25:14 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-05-13 15:25:14 -0700
commite5050b1be72c5552bfc9c734d5a0e89f215bed62 (patch)
treeaf4f733fe0401f04c16f7bbcca637aeb841f2a0d /src/com
parentcefc41fd9705d3d3c5cbc47d1dd854a618bcf313 (diff)
parent14d5714a8238b244b974e4e62fe688398ab45dcb (diff)
downloadpackages_apps_settings-e5050b1be72c5552bfc9c734d5a0e89f215bed62.zip
packages_apps_settings-e5050b1be72c5552bfc9c734d5a0e89f215bed62.tar.gz
packages_apps_settings-e5050b1be72c5552bfc9c734d5a0e89f215bed62.tar.bz2
Merge "Implement issue #6477793: Add "restore" button to manage apps" into jb-dev
Diffstat (limited to 'src/com')
-rw-r--r--src/com/android/settings/applications/ManageApplications.java125
1 files changed, 124 insertions, 1 deletions
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index fdbb289..37967d1 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -16,19 +16,30 @@
package com.android.settings.applications;
+import static android.net.NetworkPolicyManager.POLICY_NONE;
+import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
import static com.android.settings.Utils.prepareCustomPreferencesList;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.DialogFragment;
import android.app.Fragment;
+import android.app.INotificationManager;
import android.content.ComponentName;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.net.NetworkPolicyManager;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
+import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -67,6 +78,7 @@ import com.android.settings.deviceinfo.StorageMeasurement;
import java.util.ArrayList;
import java.util.Comparator;
+import java.util.List;
final class CanBeOnSdCardChecker {
final IPackageManager mPm;
@@ -116,7 +128,8 @@ final class CanBeOnSdCardChecker {
* intent.
*/
public class ManageApplications extends Fragment implements
- OnItemClickListener {
+ OnItemClickListener, DialogInterface.OnClickListener,
+ DialogInterface.OnDismissListener {
static final String TAG = "ManageApplications";
static final boolean DEBUG = false;
@@ -125,6 +138,7 @@ public class ManageApplications extends Fragment implements
private static final String EXTRA_SORT_ORDER = "sortOrder";
private static final String EXTRA_SHOW_BACKGROUND = "showBackground";
private static final String EXTRA_DEFAULT_LIST_TYPE = "defaultListType";
+ private static final String EXTRA_RESET_DIALOG = "resetDialog";
// attributes used as keys when passing values to InstalledAppDetails activity
public static final String APP_CHG = "chg";
@@ -148,6 +162,7 @@ public class ManageApplications extends Fragment implements
public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5;
public static final int SHOW_RUNNING_SERVICES = MENU_OPTIONS_BASE + 6;
public static final int SHOW_BACKGROUND_PROCESSES = MENU_OPTIONS_BASE + 7;
+ public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 8;
// sort order
private int mSortOrder = SORT_ORDER_ALPHA;
// Filter value
@@ -205,6 +220,8 @@ public class ManageApplications extends Fragment implements
private Spinner mSpinner;
private FrameLayout mSpinnerContent;
+ AlertDialog mResetDialog;
+
final Runnable mRunningProcessesAvail = new Runnable() {
public void run() {
handleRunningProcessesAvail();
@@ -625,6 +642,10 @@ public class ManageApplications extends Fragment implements
prepareCustomPreferencesList(container, spinnerHost, mListView, false);
+ if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
+ buildResetDialog();
+ }
+
return spinnerHost;
}
@@ -652,6 +673,9 @@ public class ManageApplications extends Fragment implements
outState.putInt(EXTRA_DEFAULT_LIST_TYPE, mDefaultListType);
}
outState.putBoolean(EXTRA_SHOW_BACKGROUND, mShowBackground);
+ if (mResetDialog != null) {
+ outState.putBoolean(EXTRA_RESET_DIALOG, true);
+ }
}
@Override
@@ -668,6 +692,15 @@ public class ManageApplications extends Fragment implements
}
@Override
+ public void onStop() {
+ super.onStop();
+ if (mResetDialog != null) {
+ mResetDialog.dismiss();
+ mResetDialog = null;
+ }
+ }
+
+ @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
mApplicationsState.requestSize(mCurrentPkgName);
@@ -708,6 +741,8 @@ public class ManageApplications extends Fragment implements
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
menu.add(0, SHOW_BACKGROUND_PROCESSES, 3, R.string.show_background_processes)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ menu.add(0, RESET_APP_PREFERENCES, 4, R.string.reset_app_preferences)
+ .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
updateOptionsMenu();
}
@@ -743,11 +778,97 @@ public class ManageApplications extends Fragment implements
mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false);
mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground);
mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground);
+ mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false);
} else {
mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(false);
mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(false);
+ mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(true);
+ }
+ }
+
+ void buildResetDialog() {
+ if (mResetDialog == null) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setTitle(R.string.reset_app_preferences_title);
+ builder.setMessage(R.string.reset_app_preferences_desc);
+ builder.setPositiveButton(R.string.reset_app_preferences_button, this);
+ builder.setNegativeButton(R.string.cancel, null);
+ mResetDialog = builder.show();
+ mResetDialog.setOnDismissListener(this);
+ }
+ }
+
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ if (mResetDialog == dialog) {
+ mResetDialog = null;
+ }
+ }
+
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (mResetDialog == dialog) {
+ final PackageManager pm = getActivity().getPackageManager();
+ final INotificationManager nm = INotificationManager.Stub.asInterface(
+ ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+ final NetworkPolicyManager npm = NetworkPolicyManager.from(getActivity());
+ final Handler handler = new Handler(getActivity().getMainLooper());
+ (new AsyncTask<Void, Void, Void>() {
+ @Override protected Void doInBackground(Void... params) {
+ List<ApplicationInfo> apps = pm.getInstalledApplications(
+ PackageManager.GET_DISABLED_COMPONENTS);
+ for (int i=0; i<apps.size(); i++) {
+ ApplicationInfo app = apps.get(i);
+ try {
+ if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName);
+ nm.setNotificationsEnabledForPackage(app.packageName, true);
+ } catch (android.os.RemoteException ex) {
+ }
+ if (DEBUG) Log.v(TAG, "Clearing preferred: " + app.packageName);
+ pm.clearPackagePreferredActivities(app.packageName);
+ if (!app.enabled) {
+ if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName);
+ if (pm.getApplicationEnabledSetting(app.packageName)
+ == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
+ pm.setApplicationEnabledSetting(app.packageName,
+ PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+ PackageManager.DONT_KILL_APP);
+ }
+ }
+ }
+ // We should have cleared all of the preferred apps above;
+ // just in case some may be lingering, retrieve whatever is
+ // still set and remove it.
+ ArrayList<IntentFilter> filters = new ArrayList<IntentFilter>();
+ ArrayList<ComponentName> prefActivities = new ArrayList<ComponentName>();
+ pm.getPreferredActivities(filters, prefActivities, null);
+ for (int i=0; i<prefActivities.size(); i++) {
+ if (DEBUG) Log.v(TAG, "Clearing preferred: "
+ + prefActivities.get(i).getPackageName());
+ pm.clearPackagePreferredActivities(prefActivities.get(i).getPackageName());
+ }
+ final int[] restrictedAppIds = npm.getAppsWithPolicy(
+ POLICY_REJECT_METERED_BACKGROUND);
+ for (int i : restrictedAppIds) {
+ if (DEBUG) Log.v(TAG, "Clearing data policy: " + i);
+ npm.setAppPolicy(i, POLICY_NONE);
+ }
+ handler.post(new Runnable() {
+ @Override public void run() {
+ if (DEBUG) Log.v(TAG, "Done clearing");
+ if (getActivity() != null && mActivityResumed) {
+ if (DEBUG) Log.v(TAG, "Updating UI!");
+ mApplicationsAdapter.pause();
+ showCurrentList();
+ }
+ }
+ });
+ return null;
+ }
+ }).execute();
}
}
@@ -765,6 +886,8 @@ public class ManageApplications extends Fragment implements
} else if (menuId == SHOW_BACKGROUND_PROCESSES) {
mShowBackground = true;
mRunningProcessesView.mAdapter.setShowBackground(true);
+ } else if (menuId == RESET_APP_PREFERENCES) {
+ buildResetDialog();
} else {
// Handle the home button
return false;