From 9834bd82da89cd777aaa5005760f90b95f0b292d Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Mon, 15 May 2017 11:28:25 -0700 Subject: [PATCH] Update strings in special app access and dev options - Change all yes/no or on/off strings in special app access to Allowed/Not allowed - Remove some dead code in related files - Add a toast string in DevelopmentSettingsDisabledActivity to prompt user enable dev options before use. - Add search in SpecialAccessSettings Change-Id: I8b2535e037a86e76bdbcd3fb6e1cf2e0347bedbf Fix: 38290299 Fix: 37469224 Test: make RunSettingsRoboTests --- res/values/strings.xml | 27 ++---- .../applications/DrawOverlayDetails.java | 31 +------ .../applications/ExternalSourcesDetails.java | 14 +-- .../applications/ManageApplications.java | 5 +- .../applications/PictureInPictureDetails.java | 11 ++- .../applications/SpecialAccessSettings.java | 44 ++++++++- .../applications/WriteSettingsDetails.java | 49 +--------- .../datausage/BillingCyclePreference.java | 91 ------------------- .../DevelopmentSettingsDisabledActivity.java | 4 + .../search/SearchIndexableResources.java | 3 +- .../grandfather_not_implementing_indexable | 1 - ...velopmentSettingsDisabledActivityTest.java | 44 +++++++++ 12 files changed, 117 insertions(+), 207 deletions(-) delete mode 100644 src/com/android/settings/datausage/BillingCyclePreference.java create mode 100644 tests/robotests/src/com/android/settings/development/DevelopmentSettingsDisabledActivityTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index afa207b8f0f..3bd969112fe 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -43,6 +43,9 @@ No need, you are already a developer. + + Please enable developer options first. + Wireless & networks @@ -6737,12 +6740,6 @@ Allow this app to create a picture-in-picture window while the app is open or after you leave it (for example, to continue watching a video). This window displays on top of other apps you're using. - - Yes - - - No - Do Not Disturb access @@ -7703,10 +7700,12 @@ Apps with permission - - Yes - - No + + + Allowed + + + Not allowed Install unknown apps @@ -7735,14 +7734,6 @@ Allow modify system settings This permission allows an app to modify system settings. - - Yes - - No - - Allowed - - Not allowed Allow from this source diff --git a/src/com/android/settings/applications/DrawOverlayDetails.java b/src/com/android/settings/applications/DrawOverlayDetails.java index 72564bc3f8e..c6f3cc0c1e6 100644 --- a/src/com/android/settings/applications/DrawOverlayDetails.java +++ b/src/com/android/settings/applications/DrawOverlayDetails.java @@ -20,8 +20,6 @@ import android.app.AppOpsManager; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; import android.os.Bundle; import android.os.UserHandle; import android.provider.Settings; @@ -206,33 +204,6 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc public static CharSequence getSummary(Context context, OverlayState overlayState) { return context.getString(overlayState.isPermissible() ? - R.string.system_alert_window_on : R.string.system_alert_window_off); - } - - public static CharSequence getSummary(Context context, String pkg) { - // first check if pkg is a system pkg - PackageManager packageManager = context.getPackageManager(); - int uid = -1; - try { - ApplicationInfo appInfo = packageManager.getApplicationInfo(pkg, 0); - uid = appInfo.uid; - if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { - return context.getString(R.string.system_alert_window_on); - } - } catch (PackageManager.NameNotFoundException e) { - // pkg doesn't even exist? - Log.w(LOG_TAG, "Package " + pkg + " not found", e); - return context.getString(R.string.system_alert_window_off); - } - - AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context - .APP_OPS_SERVICE); - if (uid == -1) { - return context.getString(R.string.system_alert_window_off); - } - - int mode = appOpsManager.noteOpNoThrow(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg); - return context.getString((mode == AppOpsManager.MODE_ALLOWED) ? - R.string.system_alert_window_on : R.string.system_alert_window_off); + R.string.app_permission_summary_allowed : R.string.app_permission_summary_not_allowed); } } diff --git a/src/com/android/settings/applications/ExternalSourcesDetails.java b/src/com/android/settings/applications/ExternalSourcesDetails.java index fe51a87ab77..7158900398a 100644 --- a/src/com/android/settings/applications/ExternalSourcesDetails.java +++ b/src/com/android/settings/applications/ExternalSourcesDetails.java @@ -15,11 +15,6 @@ */ package com.android.settings.applications; -import static android.app.Activity.RESULT_CANCELED; -import static android.app.Activity.RESULT_OK; - -import com.android.internal.logging.nano.MetricsProto.MetricsEvent; - import android.app.AlertDialog; import android.app.AppOpsManager; import android.content.Context; @@ -29,12 +24,16 @@ import android.os.UserManager; import android.support.v7.preference.Preference; import android.support.v7.preference.Preference.OnPreferenceChangeListener; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.applications.AppStateInstallAppsBridge.InstallAppsState; import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.applications.ApplicationsState.AppEntry; +import static android.app.Activity.RESULT_CANCELED; +import static android.app.Activity.RESULT_OK; + public class ExternalSourcesDetails extends AppInfoWithHeader implements OnPreferenceChangeListener { @@ -97,8 +96,9 @@ public class ExternalSourcesDetails extends AppInfoWithHeader appsState = new AppStateInstallAppsBridge(context, null, null) .createInstallAppsStateFor(entry.info.packageName, entry.info.uid); } - return context.getString(appsState.canInstallApps() ? R.string.external_source_trusted - : R.string.external_source_untrusted); + return context.getString(appsState.canInstallApps() + ? R.string.app_permission_summary_allowed + : R.string.app_permission_summary_not_allowed); } private void setCanInstallApps(boolean newState) { diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java index cfa60420a41..b6b58616d91 100644 --- a/src/com/android/settings/applications/ManageApplications.java +++ b/src/com/android/settings/applications/ManageApplications.java @@ -1367,8 +1367,9 @@ public class ManageApplications extends InstrumentedPreferenceFragment case LIST_TYPE_USAGE_ACCESS: if (holder.entry.extraInfo != null) { holder.summary.setText((new UsageState((PermissionState) holder.entry - .extraInfo)).isPermissible() ? R.string.switch_on_text : - R.string.switch_off_text); + .extraInfo)).isPermissible() + ? R.string.app_permission_summary_allowed + : R.string.app_permission_summary_not_allowed); } else { holder.summary.setText(null); } diff --git a/src/com/android/settings/applications/PictureInPictureDetails.java b/src/com/android/settings/applications/PictureInPictureDetails.java index 41f006acb51..a886a3df554 100644 --- a/src/com/android/settings/applications/PictureInPictureDetails.java +++ b/src/com/android/settings/applications/PictureInPictureDetails.java @@ -15,10 +15,6 @@ */ package com.android.settings.applications; -import static android.app.AppOpsManager.MODE_ALLOWED; -import static android.app.AppOpsManager.MODE_ERRORED; -import static android.app.AppOpsManager.OP_PICTURE_IN_PICTURE; - import android.app.AlertDialog; import android.app.AppOpsManager; import android.content.Context; @@ -34,6 +30,10 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.overlay.FeatureFactory; +import static android.app.AppOpsManager.MODE_ALLOWED; +import static android.app.AppOpsManager.MODE_ERRORED; +import static android.app.AppOpsManager.OP_PICTURE_IN_PICTURE; + public class PictureInPictureDetails extends AppInfoWithHeader implements OnPreferenceChangeListener { @@ -124,7 +124,8 @@ public class PictureInPictureDetails extends AppInfoWithHeader static int getPreferenceSummary(Context context, int uid, String packageName) { final boolean enabled = PictureInPictureDetails.getEnterPipStateForPackage(context, uid, packageName); - return enabled ? R.string.picture_in_picture_on : R.string.picture_in_picture_off; + return enabled ? R.string.app_permission_summary_allowed + : R.string.app_permission_summary_not_allowed; } @VisibleForTesting diff --git a/src/com/android/settings/applications/SpecialAccessSettings.java b/src/com/android/settings/applications/SpecialAccessSettings.java index 31f461c7e18..069db76de1c 100644 --- a/src/com/android/settings/applications/SpecialAccessSettings.java +++ b/src/com/android/settings/applications/SpecialAccessSettings.java @@ -14,20 +14,54 @@ package com.android.settings.applications; -import android.os.Bundle; +import android.content.Context; +import android.provider.SearchIndexableResource; + import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.core.PreferenceController; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.search.Indexable; -public class SpecialAccessSettings extends SettingsPreferenceFragment { +import java.util.ArrayList; +import java.util.List; + +public class SpecialAccessSettings extends DashboardFragment { + + private static final String TAG = "SpecialAccessSettings"; @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - addPreferencesFromResource(R.xml.special_access); + protected String getLogTag() { + return TAG; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.special_access; + } + + @Override + protected List getPreferenceControllers(Context context) { + return null; } @Override public int getMetricsCategory() { return MetricsEvent.SPECIAL_ACCESS; } + + public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List getXmlResourcesToIndex(Context context, + boolean enabled) { + final ArrayList result = new ArrayList<>(); + + final SearchIndexableResource sir = new SearchIndexableResource(context); + sir.xmlResId = R.xml.special_access; + result.add(sir); + return result; + } + }; } diff --git a/src/com/android/settings/applications/WriteSettingsDetails.java b/src/com/android/settings/applications/WriteSettingsDetails.java index aea05b3bbb0..50e6948bbf1 100644 --- a/src/com/android/settings/applications/WriteSettingsDetails.java +++ b/src/com/android/settings/applications/WriteSettingsDetails.java @@ -20,8 +20,6 @@ import android.app.AppOpsManager; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; import android.os.Bundle; import android.os.UserHandle; import android.provider.Settings; @@ -38,8 +36,6 @@ import com.android.settings.applications.AppStateWriteSettingsBridge.WriteSettin import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.applications.ApplicationsState.AppEntry; -import java.util.List; - public class WriteSettingsDetails extends AppInfoWithHeader implements OnPreferenceChangeListener, OnPreferenceClickListener { @@ -182,47 +178,8 @@ public class WriteSettingsDetails extends AppInfoWithHeader implements OnPrefere } public static CharSequence getSummary(Context context, WriteSettingsState writeSettingsState) { - return context.getString(writeSettingsState.isPermissible() ? R.string.write_settings_on : - R.string.write_settings_off); - } - - public static CharSequence getSummary(Context context, String pkg) { - // first check if pkg is a system pkg - boolean isSystem = false; - PackageManager packageManager = context.getPackageManager(); - try { - ApplicationInfo appInfo = packageManager.getApplicationInfo(pkg, 0); - if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { - isSystem = true; - } - } catch (PackageManager.NameNotFoundException e) { - // pkg doesn't even exist? - Log.w(LOG_TAG, "Package " + pkg + " not found", e); - return context.getString(R.string.write_settings_off); - } - - AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context - .APP_OPS_SERVICE); - List packageOps = appOpsManager.getPackagesForOps( - APP_OPS_OP_CODE); - if (packageOps == null) { - return context.getString(R.string.write_settings_off); - } - - int uid = isSystem ? 0 : -1; - for (AppOpsManager.PackageOps packageOp : packageOps) { - if (pkg.equals(packageOp.getPackageName())) { - uid = packageOp.getUid(); - break; - } - } - - if (uid == -1) { - return context.getString(R.string.write_settings_off); - } - - int mode = appOpsManager.noteOpNoThrow(AppOpsManager.OP_WRITE_SETTINGS, uid, pkg); - return context.getString((mode == AppOpsManager.MODE_ALLOWED) ? - R.string.write_settings_on : R.string.write_settings_off); + return context.getString(writeSettingsState.isPermissible() + ? R.string.app_permission_summary_allowed + : R.string.app_permission_summary_not_allowed); } } diff --git a/src/com/android/settings/datausage/BillingCyclePreference.java b/src/com/android/settings/datausage/BillingCyclePreference.java deleted file mode 100644 index beb0ba14530..00000000000 --- a/src/com/android/settings/datausage/BillingCyclePreference.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2016 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.datausage; - -import android.content.Context; -import android.content.Intent; -import android.net.NetworkPolicy; -import android.net.NetworkTemplate; -import android.os.Bundle; -import android.os.RemoteException; -import android.support.v7.preference.Preference; -import android.util.AttributeSet; - -import com.android.internal.logging.nano.MetricsProto; -import com.android.settings.R; -import com.android.settings.Utils; -import com.android.settings.datausage.CellDataPreference.DataStateListener; - -public class BillingCyclePreference extends Preference implements TemplatePreference { - - private NetworkTemplate mTemplate; - private NetworkServices mServices; - private NetworkPolicy mPolicy; - private int mSubId; - - public BillingCyclePreference(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - public void onAttached() { - super.onAttached(); - mListener.setListener(true, mSubId, getContext()); - } - - @Override - public void onDetached() { - mListener.setListener(false, mSubId, getContext()); - super.onDetached(); - } - - @Override - public void setTemplate(NetworkTemplate template, int subId, - NetworkServices services) { - mTemplate = template; - mSubId = subId; - mServices = services; - mPolicy = services.mPolicyEditor.getPolicy(mTemplate); - setSummary(getContext().getString(R.string.billing_cycle_fragment_summary, mPolicy != null - ? mPolicy.cycleDay - : "1")); - setIntent(getIntent()); - } - - private void updateEnabled() { - try { - setEnabled(mPolicy != null && mServices.mNetworkService.isBandwidthControlEnabled() - && mServices.mTelephonyManager.getDataEnabled(mSubId) - && mServices.mUserManager.isAdminUser()); - } catch (RemoteException e) { - setEnabled(false); - } - } - - @Override - public Intent getIntent() { - Bundle args = new Bundle(); - args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate); - return Utils.onBuildStartFragmentIntent(getContext(), BillingCycleSettings.class.getName(), - args, null, 0, getTitle(), false, MetricsProto.MetricsEvent.VIEW_UNKNOWN); - } - - private final DataStateListener mListener = new DataStateListener() { - @Override - public void onChange(boolean selfChange) { - updateEnabled(); - } - }; -} diff --git a/src/com/android/settings/development/DevelopmentSettingsDisabledActivity.java b/src/com/android/settings/development/DevelopmentSettingsDisabledActivity.java index 31f7a2018e1..9ea24da2ce9 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDisabledActivity.java +++ b/src/com/android/settings/development/DevelopmentSettingsDisabledActivity.java @@ -18,11 +18,15 @@ package com.android.settings.development; import android.app.Activity; import android.os.Bundle; +import android.widget.Toast; + +import com.android.settings.R; public class DevelopmentSettingsDisabledActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Toast.makeText(this, R.string.dev_settings_disabled_warning, Toast.LENGTH_SHORT).show(); finish(); } } diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java index 75ac350129e..ce8135c33df 100644 --- a/src/com/android/settings/search/SearchIndexableResources.java +++ b/src/com/android/settings/search/SearchIndexableResources.java @@ -133,8 +133,7 @@ public final class SearchIndexableResources { R.xml.battery_saver_settings, R.drawable.ic_settings_battery); addIndex(AdvancedAppSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_applications); addIndex(ManageAssist.class, NO_DATA_RES_ID, R.drawable.ic_settings_applications); - addIndex(SpecialAccessSettings.class, - R.xml.special_access, R.drawable.ic_settings_applications); + addIndex(SpecialAccessSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_applications); addIndex(UserSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_multiuser); addIndex(AssistGestureSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_gestures); addIndex(PickupGestureSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_gestures); diff --git a/tests/robotests/assets/grandfather_not_implementing_indexable b/tests/robotests/assets/grandfather_not_implementing_indexable index 9ecc0b44888..544b2c7cbdd 100644 --- a/tests/robotests/assets/grandfather_not_implementing_indexable +++ b/tests/robotests/assets/grandfather_not_implementing_indexable @@ -47,7 +47,6 @@ com.android.settings.notification.ZenModeScheduleRuleSettings com.android.settings.datausage.BillingCycleSettings com.android.settings.notification.NotificationStation com.android.settings.print.PrintJobSettingsFragment -com.android.settings.applications.SpecialAccessSettings com.android.settings.accessibility.ToggleScreenReaderPreferenceFragmentForSetupWizard com.android.settings.accessibility.ToggleSelectToSpeakPreferenceFragmentForSetupWizard com.android.settings.accounts.AccountSyncSettings diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDisabledActivityTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDisabledActivityTest.java new file mode 100644 index 00000000000..67733aa92c8 --- /dev/null +++ b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDisabledActivityTest.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2017 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.development; + + +import com.android.settings.R; +import com.android.settings.SettingsRobolectricTestRunner; +import com.android.settings.TestConfig; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowToast; + +import static com.google.common.truth.Truth.assertThat; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class DevelopmentSettingsDisabledActivityTest { + + @Test + public void launchActivity_shouldShowToast() { + Robolectric.setupActivity(DevelopmentSettingsDisabledActivity.class); + + assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo( + RuntimeEnvironment.application.getString(R.string.dev_settings_disabled_warning)); + } +}