diff options
author | Fan Zhang <zhfan@google.com> | 2017-05-15 11:28:25 -0700 |
---|---|---|
committer | Fan Zhang <zhfan@google.com> | 2017-05-15 13:22:51 -0700 |
commit | 9834bd82da89cd777aaa5005760f90b95f0b292d (patch) | |
tree | 5e71c40be0c7d0ad29d54b3b2736cb67b8f3290f | |
parent | 5230ffe3a53a098c5d730d645418146c700ff601 (diff) | |
download | packages_apps_Settings-9834bd82da89cd777aaa5005760f90b95f0b292d.tar.gz packages_apps_Settings-9834bd82da89cd777aaa5005760f90b95f0b292d.tar.bz2 packages_apps_Settings-9834bd82da89cd777aaa5005760f90b95f0b292d.zip |
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
12 files changed, 117 insertions, 207 deletions
diff --git a/res/values/strings.xml b/res/values/strings.xml index afa207b8f0..3bd969112f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -43,6 +43,9 @@ <!-- [CHAR LIMIT=NONE] Device Info screen. Okay we get it, stop pressing, you already have it on --> <string name="show_dev_already">No need, you are already a developer.</string> + <!-- [CHAR LIMIT=NONE] Toast message when user attemps to launch developer otions before enabling it. --> + <string name="dev_settings_disabled_warning">Please enable developer options first.</string> + <!-- Category headings in left-pane header menu --> <skip /> <!-- Settings main menu category heading. Wireless and networks (Wi-Fi, Bluetooth, data usage...). [CHAR LIMIT=40] --> <string name="header_category_wireless_networks">Wireless & networks</string> @@ -6737,12 +6740,6 @@ <!-- Apps > App Details > Picture-in-picture > Description. [CHAR LIMIT=NONE] --> <string name="picture_in_picture_app_detail_summary">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.</string> - <!-- Summary of app allowed to enter picture-in-picture. [CHAR LIMIT=60] --> - <string name="picture_in_picture_on">Yes</string> - - <!-- Summary of app not allowed to enter picture-in-picture. [CHAR LIMIT=60] --> - <string name="picture_in_picture_off">No</string> - <!-- Sound & notification > Advanced section: Title for managing Do Not Disturb access option. [CHAR LIMIT=40] --> <string name="manage_zen_access_title">Do Not Disturb access</string> @@ -7703,10 +7700,12 @@ <!-- Label for showing apps that can display over other apps [CHAR LIMIT=45] --> <string name="filter_overlay_apps">Apps with permission</string> - <!-- Summary of app allowed to display over other apps [CHAR LIMIT=60] --> - <string name="system_alert_window_on">Yes</string> - <!-- Summary of app not allowed to display over other apps [CHAR LIMIT=60] --> - <string name="system_alert_window_off">No</string> + + <!-- Preference summary text for an app when it is allowed for a permission. [CHAR LIMIT=45] --> + <string name="app_permission_summary_allowed">Allowed</string> + + <!-- Preference summary text for an app when it is disallowed for a permission. [CHAR LIMIT=45] --> + <string name="app_permission_summary_not_allowed">Not allowed</string> <!-- Title for settings screen for controlling apps that can install other apps on device [CHAR LIMIT=50] --> <string name="install_other_apps">Install unknown apps</string> @@ -7735,14 +7734,6 @@ <string name="permit_write_settings">Allow modify system settings</string> <!-- Description of the write system settings [CHAR LIMIT=NONE] --> <string name="write_settings_description">This permission allows an app to modify system settings.</string> - <!-- Summary of app allowed to write system settings [CHAR LIMIT=45] --> - <string name="write_settings_on">Yes</string> - <!-- Summary of app not allowed to write system settings [CHAR LIMIT=45] --> - <string name="write_settings_off">No</string> - <!-- Summary of app trusted to install apps [CHAR LIMIT=45] --> - <string name="external_source_trusted">Allowed</string> - <!-- Summary of app not trusted to install apps [CHAR LIMIT=45] --> - <string name="external_source_untrusted">Not allowed</string> <!-- Title of switch preference that controls whether an external app source is trusted or not [CHAR LIMIT=50] --> <string name="external_source_switch_title">Allow from this source</string> diff --git a/src/com/android/settings/applications/DrawOverlayDetails.java b/src/com/android/settings/applications/DrawOverlayDetails.java index 72564bc3f8..c6f3cc0c1e 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 fe51a87ab7..7158900398 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 cfa60420a4..b6b58616d9 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 41f006acb5..a886a3df55 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 31f461c7e1..069db76de1 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; + +import java.util.ArrayList; +import java.util.List; + +public class SpecialAccessSettings extends DashboardFragment { -public class SpecialAccessSettings extends SettingsPreferenceFragment { + private static final String TAG = "SpecialAccessSettings"; + + @Override + protected String getLogTag() { + return TAG; + } @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - addPreferencesFromResource(R.xml.special_access); + protected int getPreferenceScreenResId() { + return R.xml.special_access; + } + + @Override + protected List<PreferenceController> 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<SearchIndexableResource> getXmlResourcesToIndex(Context context, + boolean enabled) { + final ArrayList<SearchIndexableResource> 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 aea05b3bbb..50e6948bbf 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<AppOpsManager.PackageOps> 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 beb0ba1453..0000000000 --- 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 31f7a2018e..9ea24da2ce 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 75ac350129..ce8135c33d 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 9ecc0b4488..544b2c7cbd 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 0000000000..67733aa92c --- /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)); + } +} |