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
This commit is contained in:
Fan Zhang
2017-05-15 11:28:25 -07:00
parent 5230ffe3a5
commit 9834bd82da
12 changed files with 117 additions and 207 deletions

View File

@@ -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 &amp; 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>

View File

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

View File

@@ -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) {

View File

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

View File

@@ -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

View File

@@ -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<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;
}
};
}

View File

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

View File

@@ -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();
}
};
}

View File

@@ -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();
}
}

View File

@@ -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);

View File

@@ -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

View File

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