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); + } + } + } + }); + } +}