diff --git a/res/menu/manage_apps.xml b/res/menu/manage_apps.xml
index 577e9812e5a..225f9741d16 100644
--- a/res/menu/manage_apps.xml
+++ b/res/menu/manage_apps.xml
@@ -18,6 +18,25 @@
+ android:showAsAction="never" />
+
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a0b0653df5c..f416d89774c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4234,8 +4234,10 @@
12 hours
1 day
-
+
Show system
+
+ Hide system
Use Uss
@@ -6359,15 +6361,9 @@
With domain URLs
-
- Reset preferences across all apps to defaults
-
Disabled by administrator
-
- %d apps installed, including system and downloaded apps
-
Advanced
diff --git a/res/xml/advanced_apps.xml b/res/xml/advanced_apps.xml
index 0307a60889a..28324ca8ecd 100644
--- a/res/xml/advanced_apps.xml
+++ b/res/xml/advanced_apps.xml
@@ -40,22 +40,6 @@
android:value="com.android.settings.Settings$DomainsURLsAppListActivity" />
-
-
-
-
-
-
allApps = mSession.getAllApps();
- mAllAppsPreference.setSummary(getString(R.string.all_apps_summary, allApps.size()));
int countAppWithDomainURLs = 0;
for (AppEntry entry : allApps) {
@@ -136,25 +83,6 @@ public class AdvancedAppSettings extends SettingsPreferenceFragment implements C
mAppDomainURLsPreference.setSummary(summary);
}
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
- buildResetDialog();
- }
-
- return super.onCreateView(inflater, container, savedInstanceState);
- }
-
- @Override
- public void onStop() {
- super.onStop();
- if (mResetDialog != null) {
- mResetDialog.dismiss();
- mResetDialog = null;
- }
- }
-
@Override
protected int getMetricsCategory() {
return MetricsLogger.APPLICATIONS_ADVANCED;
@@ -163,97 +91,9 @@ public class AdvancedAppSettings extends SettingsPreferenceFragment implements C
@Override
public void onResume() {
super.onResume();
- mActivityResumed = true;
mPermissionsInfo = new PermissionsInfo(getActivity(), this);
}
- @Override
- public void onPause() {
- mActivityResumed = false;
- super.onPause();
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- if (mResetDialog != null) {
- outState.putBoolean(EXTRA_RESET_DIALOG, 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) {
- (new AsyncTask() {
- @Override protected Void doInBackground(Void... params) {
- List apps = mPm.getInstalledApplications(
- PackageManager.GET_DISABLED_COMPONENTS);
- for (int i=0; i parent, View view, int position, long id) {
if (mApplications != null && mApplications.getCount() > position) {
@@ -506,7 +544,9 @@ public class ManageApplications extends InstrumentedFragment
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
- mApplications.setFilter(mFilterAdapter.getFilter(position));
+ mFilter = mFilterAdapter.getFilter(position);
+ mApplications.setFilter(mFilter);
+ if (DEBUG) Log.d(TAG, "Selecting filter " + mFilter);
}
@Override
@@ -522,17 +562,11 @@ public class ManageApplications extends InstrumentedFragment
}
public void setHasDisabled(boolean hasDisabledApps) {
- if (mListType == LIST_TYPE_MAIN) {
- // No filtering on main app list.
- return;
- }
- if (hasDisabledApps) {
- mFilterAdapter.enableFilter(FILTER_APPS_ENABLED);
- mFilterAdapter.enableFilter(FILTER_APPS_DISABLED);
- } else {
- mFilterAdapter.disableFilter(FILTER_APPS_ENABLED);
- mFilterAdapter.disableFilter(FILTER_APPS_DISABLED);
- }
+ mHasDisabledApps = hasDisabledApps;
+ mFilterAdapter.setFilterEnabled(
+ mShowSystem ? FILTER_APPS_ENABLED : FILTER_APPS_DL_ENABLED, hasDisabledApps);
+ mFilterAdapter.setFilterEnabled(
+ mShowSystem ? FILTER_APPS_DISABLED : FILTER_APPS_DL_DISABLED, hasDisabledApps);
}
static class FilterSpinnerAdapter extends ArrayAdapter {
@@ -553,23 +587,45 @@ public class ManageApplications extends InstrumentedFragment
return mFilterOptions.get(position);
}
+ public void setFilterEnabled(int filter, boolean enabled) {
+ if (enabled) {
+ enableFilter(filter);
+ } else {
+ disableFilter(filter);
+ }
+ }
+
public void enableFilter(int filter) {
if (mFilterOptions.contains(filter)) return;
+ if (DEBUG) Log.d(TAG, "Enabling filter " + filter);
mFilterOptions.add(filter);
Collections.sort(mFilterOptions);
mManageApplications.mSpinnerHeader.setVisibility(
mFilterOptions.size() > 1 ? View.VISIBLE : View.GONE);
notifyDataSetChanged();
+ if (mFilterOptions.size() == 1) {
+ if (DEBUG) Log.d(TAG, "Auto selecting filter " + filter);
+ mManageApplications.mFilterSpinner.setSelection(0);
+ mManageApplications.onItemSelected(null, null, 0, 0);
+ }
}
public void disableFilter(int filter) {
if (!mFilterOptions.remove((Integer) filter)) {
return;
}
+ if (DEBUG) Log.d(TAG, "Disabling filter " + filter);
Collections.sort(mFilterOptions);
mManageApplications.mSpinnerHeader.setVisibility(
mFilterOptions.size() > 1 ? View.VISIBLE : View.GONE);
notifyDataSetChanged();
+ if (mManageApplications.mFilter == filter) {
+ if (mFilterOptions.size() > 0) {
+ if (DEBUG) Log.d(TAG, "Auto selecting filter " + mFilterOptions.get(0));
+ mManageApplications.mFilterSpinner.setSelection(0);
+ mManageApplications.onItemSelected(null, null, 0, 0);
+ }
+ }
}
@Override
@@ -716,7 +772,7 @@ public class ManageApplications extends InstrumentedFragment
}
filterObj = FILTERS[mFilterMode];
switch (mLastSortMode) {
- case SORT_ORDER_SIZE:
+ case R.id.sort_order_size:
switch (mWhichSize) {
case SIZE_INTERNAL:
comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR;
@@ -845,7 +901,7 @@ public class ManageApplications extends InstrumentedFragment
}
}
if (holder.entry.info.packageName.equals(mManageApplications.mCurrentPkgName)
- && mLastSortMode == SORT_ORDER_SIZE) {
+ && mLastSortMode == R.id.sort_order_size) {
// We got the size information for the last app the
// user viewed, and are sorting by size... they may
// have cleared data, so we immediately want to resort
@@ -866,7 +922,7 @@ public class ManageApplications extends InstrumentedFragment
@Override
public void onAllSizesComputed() {
- if (mLastSortMode == SORT_ORDER_SIZE) {
+ if (mLastSortMode == R.id.sort_order_size) {
rebuild(false);
}
}
diff --git a/src/com/android/settings/applications/ResetAppsHelper.java b/src/com/android/settings/applications/ResetAppsHelper.java
new file mode 100644
index 00000000000..cc831574b17
--- /dev/null
+++ b/src/com/android/settings/applications/ResetAppsHelper.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.applications;
+
+import static android.net.NetworkPolicyManager.POLICY_NONE;
+import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
+
+import android.app.ActivityManager;
+import android.app.AlertDialog;
+import android.app.AppOpsManager;
+import android.app.INotificationManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.net.NetworkPolicyManager;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+
+import com.android.settings.R;
+
+import java.util.List;
+
+public class ResetAppsHelper implements DialogInterface.OnClickListener,
+ DialogInterface.OnDismissListener {
+
+ private static final String EXTRA_RESET_DIALOG = "resetDialog";
+
+ private final PackageManager mPm;
+ private final IPackageManager mIPm;
+ private final INotificationManager mNm;
+ private final NetworkPolicyManager mNpm;
+ private final AppOpsManager mAom;
+ private final Context mContext;
+
+ private AlertDialog mResetDialog;
+
+ public ResetAppsHelper(Context context) {
+ mContext = context;
+ mPm = context.getPackageManager();
+ mIPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
+ mNm = INotificationManager.Stub.asInterface(
+ ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+ mNpm = NetworkPolicyManager.from(context);
+ mAom = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+ }
+
+ public void onRestoreInstanceState(Bundle savedInstanceState) {
+ if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
+ buildResetDialog();
+ }
+ }
+
+ public void onSaveInstanceState(Bundle outState) {
+ if (mResetDialog != null) {
+ outState.putBoolean(EXTRA_RESET_DIALOG, true);
+ }
+ }
+
+ public void stop() {
+ if (mResetDialog != null) {
+ mResetDialog.dismiss();
+ mResetDialog = null;
+ }
+ }
+
+ void buildResetDialog() {
+ if (mResetDialog == null) {
+ mResetDialog = new AlertDialog.Builder(mContext)
+ .setTitle(R.string.reset_app_preferences_title)
+ .setMessage(R.string.reset_app_preferences_desc)
+ .setPositiveButton(R.string.reset_app_preferences_button, this)
+ .setNegativeButton(R.string.cancel, null)
+ .setOnDismissListener(this)
+ .show();
+ }
+ }
+
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ if (mResetDialog == dialog) {
+ mResetDialog = null;
+ }
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (mResetDialog != dialog) {
+ return;
+ }
+ AsyncTask.execute(new Runnable() {
+ @Override
+ public void run() {
+ List apps = mPm.getInstalledApplications(
+ PackageManager.GET_DISABLED_COMPONENTS);
+ for (int i = 0; i < apps.size(); i++) {
+ ApplicationInfo app = apps.get(i);
+ try {
+ mNm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);
+ } catch (android.os.RemoteException ex) {
+ }
+ if (!app.enabled) {
+ if (mPm.getApplicationEnabledSetting(app.packageName)
+ == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
+ mPm.setApplicationEnabledSetting(app.packageName,
+ PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+ PackageManager.DONT_KILL_APP);
+ }
+ }
+ }
+ try {
+ mIPm.resetPreferredActivities(UserHandle.myUserId());
+ } catch (RemoteException e) {
+ }
+ mAom.resetAllModes();
+ final int[] restrictedUids = mNpm.getUidsWithPolicy(
+ POLICY_REJECT_METERED_BACKGROUND);
+ final int currentUserId = ActivityManager.getCurrentUser();
+ for (int uid : restrictedUids) {
+ // Only reset for current user
+ if (UserHandle.getUserId(uid) == currentUserId) {
+ mNpm.setUidPolicy(uid, POLICY_NONE);
+ }
+ }
+ }
+ });
+ }
+}