From 26d0595373ef34fb345b6e0ab69a03c2c3c6980a Mon Sep 17 00:00:00 2001 From: Christine Franks Date: Tue, 3 Jul 2018 14:44:08 -0700 Subject: [PATCH 01/12] Use ColorDisplayManager Bug: 111215474 Test: make RunSettingsRoboTests -j100 Change-Id: I78bb44a1c4824f2b5223ca0d58ad224b96591d9a --- ...DisplayActivationPreferenceController.java | 4 ++- ...htDisplayAutoModePreferenceController.java | 5 +++- ...playCustomEndTimePreferenceController.java | 5 +++- ...ayCustomStartTimePreferenceController.java | 5 +++- ...ightDisplayFooterPreferenceController.java | 6 ++-- ...tDisplayIntensityPreferenceController.java | 5 ++-- .../NightDisplayPreferenceController.java | 3 +- .../display/NightDisplaySettings.java | 7 +++-- .../NightDisplayPreferenceControllerTest.java | 28 +++---------------- 9 files changed, 32 insertions(+), 36 deletions(-) diff --git a/src/com/android/settings/display/NightDisplayActivationPreferenceController.java b/src/com/android/settings/display/NightDisplayActivationPreferenceController.java index 6421ebdbd4e..706ac8539c8 100644 --- a/src/com/android/settings/display/NightDisplayActivationPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayActivationPreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.display; import android.content.Context; +import android.hardware.display.ColorDisplayManager; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; @@ -53,7 +54,8 @@ public class NightDisplayActivationPreferenceController extends TogglePreference @Override public int getAvailabilityStatus() { - return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; } @Override diff --git a/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java b/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java index cfe17915fd6..8ad5e630e2b 100644 --- a/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java +++ b/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java @@ -18,6 +18,8 @@ package com.android.settings.display; import android.content.Context; +import android.hardware.display.ColorDisplayManager; + import androidx.preference.DropDownPreference; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; @@ -39,7 +41,8 @@ public class NightDisplayAutoModePreferenceController extends BasePreferenceCont @Override public int getAvailabilityStatus() { - return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; } @Override diff --git a/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java b/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java index e2abe1b24c8..f7a5425f48b 100644 --- a/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java +++ b/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java @@ -20,6 +20,8 @@ import android.content.Context; import androidx.preference.Preference; +import android.hardware.display.ColorDisplayManager; + import com.android.internal.app.ColorDisplayController; import com.android.settings.core.BasePreferenceController; @@ -37,7 +39,8 @@ public class NightDisplayCustomEndTimePreferenceController extends BasePreferenc @Override public int getAvailabilityStatus() { - return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; } @Override diff --git a/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java b/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java index 255003c7011..346ddd6725a 100644 --- a/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java +++ b/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java @@ -20,6 +20,8 @@ import android.content.Context; import androidx.preference.Preference; +import android.hardware.display.ColorDisplayManager; + import com.android.internal.app.ColorDisplayController; import com.android.settings.core.BasePreferenceController; @@ -37,7 +39,8 @@ public class NightDisplayCustomStartTimePreferenceController extends BasePrefere @Override public int getAvailabilityStatus() { - return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; } @Override diff --git a/src/com/android/settings/display/NightDisplayFooterPreferenceController.java b/src/com/android/settings/display/NightDisplayFooterPreferenceController.java index bb598590bc5..e0c12c3fcc0 100644 --- a/src/com/android/settings/display/NightDisplayFooterPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayFooterPreferenceController.java @@ -20,7 +20,8 @@ import android.content.Context; import androidx.preference.Preference; -import com.android.internal.app.ColorDisplayController; +import android.hardware.display.ColorDisplayManager; + import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settingslib.widget.FooterPreference; @@ -33,7 +34,8 @@ public class NightDisplayFooterPreferenceController extends BasePreferenceContro @Override public int getAvailabilityStatus() { - return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; } @Override diff --git a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java index db053a596ff..6adaf23990d 100644 --- a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.display; import android.content.Context; +import android.hardware.display.ColorDisplayManager; import android.text.TextUtils; import androidx.preference.Preference; @@ -37,7 +38,7 @@ public class NightDisplayIntensityPreferenceController extends SliderPreferenceC @Override public int getAvailabilityStatus() { - if (!ColorDisplayController.isAvailable(mContext)) { + if (!ColorDisplayManager.isNightDisplayAvailable(mContext)) { return UNSUPPORTED_ON_DEVICE; } else if (!mController.isActivated()) { return DISABLED_DEPENDENT_SETTING; @@ -54,7 +55,7 @@ public class NightDisplayIntensityPreferenceController extends SliderPreferenceC public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); final SeekBarPreference preference = (SeekBarPreference) screen.findPreference( - getPreferenceKey()); + getPreferenceKey()); preference.setContinuousUpdates(true); preference.setMax(getMaxSteps()); } diff --git a/src/com/android/settings/display/NightDisplayPreferenceController.java b/src/com/android/settings/display/NightDisplayPreferenceController.java index 3cb57e0272b..678e4d36cfe 100644 --- a/src/com/android/settings/display/NightDisplayPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayPreferenceController.java @@ -15,6 +15,7 @@ package com.android.settings.display; import android.content.Context; +import android.hardware.display.ColorDisplayManager; import com.android.internal.app.ColorDisplayController; import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; @@ -42,7 +43,7 @@ public class NightDisplayPreferenceController extends AbstractPreferenceControll @Override public boolean isAvailable() { - return ColorDisplayController.isAvailable(mContext); + return ColorDisplayManager.isNightDisplayAvailable(mContext); } @Override diff --git a/src/com/android/settings/display/NightDisplaySettings.java b/src/com/android/settings/display/NightDisplaySettings.java index fbd5d3ef3a0..7e7741520c8 100644 --- a/src/com/android/settings/display/NightDisplaySettings.java +++ b/src/com/android/settings/display/NightDisplaySettings.java @@ -19,6 +19,7 @@ package com.android.settings.display; import android.app.Dialog; import android.app.TimePickerDialog; import android.content.Context; +import android.hardware.display.ColorDisplayManager; import android.os.Bundle; import android.provider.SearchIndexableResource; @@ -178,7 +179,7 @@ public class NightDisplaySettings extends DashboardFragment return buildPreferenceControllers(context); } - private static List buildPreferenceControllers(Context context) { + private static List buildPreferenceControllers(Context context) { final List controllers = new ArrayList<>(1); controllers.add(new NightDisplayFooterPreferenceController(context)); return controllers; @@ -198,12 +199,12 @@ public class NightDisplaySettings extends DashboardFragment @Override protected boolean isPageSearchEnabled(Context context) { - return ColorDisplayController.isAvailable(context); + return ColorDisplayManager.isNightDisplayAvailable(context); } @Override public List createPreferenceControllers( - Context context) { + Context context) { return buildPreferenceControllers(context); } }; diff --git a/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java index 9c4c539c2d9..3822f73cbfa 100644 --- a/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java @@ -3,17 +3,14 @@ package com.android.settings.display; import static com.google.common.truth.Truth.assertThat; import android.app.Application; -import android.content.ComponentName; import android.provider.Settings.Secure; import com.android.internal.app.ColorDisplayController; import com.android.settings.R; -import com.android.settings.Settings.NightDisplaySuggestionActivity; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.SettingsShadowResources; import org.junit.After; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; @@ -25,16 +22,8 @@ import org.robolectric.annotation.Config; }) public class NightDisplayPreferenceControllerTest { - private NightDisplayPreferenceController mPreferenceController; - - @Before - public void setUp() { - mPreferenceController = new NightDisplayPreferenceController(RuntimeEnvironment.application); - } - @After public void tearDown() { - mPreferenceController = null; SettingsShadowResources.reset(); } @@ -43,9 +32,7 @@ public class NightDisplayPreferenceControllerTest { final Application context = RuntimeEnvironment.application; Secure.putInt(context.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_DISABLED); - final ComponentName componentName = - new ComponentName(context, NightDisplaySuggestionActivity.class); - assertThat(mPreferenceController.isSuggestionComplete(context)).isFalse(); + assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isFalse(); } @Test @@ -53,9 +40,7 @@ public class NightDisplayPreferenceControllerTest { final Application context = RuntimeEnvironment.application; Secure.putInt(context.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_CUSTOM); - final ComponentName componentName = - new ComponentName(context, NightDisplaySuggestionActivity.class); - assertThat(mPreferenceController.isSuggestionComplete(context)).isTrue(); + assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue(); } @Test @@ -63,9 +48,7 @@ public class NightDisplayPreferenceControllerTest { final Application context = RuntimeEnvironment.application; Secure.putInt(context.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_TWILIGHT); - final ComponentName componentName = - new ComponentName(context, NightDisplaySuggestionActivity.class); - assertThat(mPreferenceController.isSuggestionComplete(context)).isTrue(); + assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue(); } @Test @@ -74,9 +57,6 @@ public class NightDisplayPreferenceControllerTest { Secure.putInt(context.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_DISABLED); SettingsShadowResources.overrideResource(R.bool.config_night_light_suggestion_enabled, false); - - final ComponentName componentName = - new ComponentName(context, NightDisplaySuggestionActivity.class); - assertThat(mPreferenceController.isSuggestionComplete(context)).isTrue(); + assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue(); } } From 203856e44481d6d31075a35afa02807781772fc3 Mon Sep 17 00:00:00 2001 From: Eran Messeri Date: Fri, 9 Nov 2018 13:21:34 +0000 Subject: [PATCH 02/12] Private DNS: Add policy transparency When the Private DNS setting is disabled via a user restriction, show information to the user explaining that they cannot change this setting due to IT admin policy. Testing steps: * Installed & configured TestDPC on the device. * Made sure that the Private DNS setting is usable. * Set the user restriction via TestDPC ("User Restrictions" -> "Disallow config Private DNS"). * Navigated to Settings -> Network & Internet -> Advanced * Observed that Private DNS is greyed out and the Restricted icon is showing. * Observed that when tapping either the icon or the greyed-out text I get a dialog with policy information. Implementation notes: I have not utilized the existing RestrictedPreference as the Private DNS mode preference extends CustomDialogPreferenceCompat. I have also not utilized the RestrictedPreferenceHelper as it modifies the summary shown for the preference. This preference has its own summary (showing the current state of Private DNS configuration) which I did not want to override. Bug: 112982691 Test: Manual, see above. Change-Id: I9b7496b5b2cbb26012d889369f2199239cd2e00f --- .../PrivateDnsModeDialogPreference.java | 57 +++++++++++++++++++ .../PrivateDnsPreferenceController.java | 1 - 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java index a4e7d2ad541..322fdc432d0 100644 --- a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java +++ b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java @@ -22,12 +22,16 @@ import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME import static android.system.OsConstants.AF_INET; import static android.system.OsConstants.AF_INET6; +import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; + import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.NetworkUtils; +import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings; import android.system.Os; import android.text.Editable; @@ -43,6 +47,7 @@ import android.widget.TextView; import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; +import androidx.preference.PreferenceViewHolder; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; @@ -50,6 +55,8 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.utils.AnnotationSpan; import com.android.settingslib.CustomDialogPreferenceCompat; import com.android.settingslib.HelpUtils; +import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedLockUtilsInternal; import java.util.HashMap; import java.util.Map; @@ -99,19 +106,23 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat public PrivateDnsModeDialogPreference(Context context) { super(context); + initialize(); } public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs) { super(context, attrs); + initialize(); } public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + initialize(); } public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); + initialize(); } private final AnnotationSpan.LinkInfo mUrlLinkInfo = new AnnotationSpan.LinkInfo( @@ -129,6 +140,30 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat } }); + private void initialize() { + // Add the "Restricted" icon resource so that if the preference is disabled by the + // admin, an information button will be shown. + setWidgetLayoutResource(R.layout.restricted_icon); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + if (isDisabledByAdmin()) { + // If the preference is disabled by the admin, set the inner item as enabled so + // it could act as a click target. The preference itself will have been disabled + // by the controller. + holder.itemView.setEnabled(true); + } + + final View restrictedIcon = holder.findViewById(R.id.restricted_icon); + if (restrictedIcon != null) { + // Show the "Restricted" icon if, and only if, the preference was disabled by + // the admin. + restrictedIcon.setVisibility(isDisabledByAdmin() ? View.VISIBLE : View.GONE); + } + } + @Override protected void onBindDialogView(View view) { final Context context = getContext(); @@ -202,6 +237,28 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat updateDialogInfo(); } + @Override + public void performClick() { + EnforcedAdmin enforcedAdmin = getEnforcedAdmin(); + + if (enforcedAdmin == null) { + // If the restriction is not restricted by admin, continue as usual. + super.performClick(); + } else { + // Show a dialog explaining to the user why they cannot change the preference. + RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(), enforcedAdmin); + } + } + + private EnforcedAdmin getEnforcedAdmin() { + return RestrictedLockUtilsInternal.checkIfRestrictionEnforced( + getContext(), UserManager.DISALLOW_CONFIG_PRIVATE_DNS, UserHandle.myUserId()); + } + + private boolean isDisabledByAdmin() { + return getEnforcedAdmin() != null; + } + private Button getSaveButton() { final AlertDialog dialog = (AlertDialog) getDialog(); if (dialog == null) { diff --git a/src/com/android/settings/network/PrivateDnsPreferenceController.java b/src/com/android/settings/network/PrivateDnsPreferenceController.java index 8b3bfa0bf72..37adea72b87 100644 --- a/src/com/android/settings/network/PrivateDnsPreferenceController.java +++ b/src/com/android/settings/network/PrivateDnsPreferenceController.java @@ -143,7 +143,6 @@ public class PrivateDnsPreferenceController extends BasePreferenceController @Override public void updateState(Preference preference) { super.updateState(preference); - //TODO(b/112982691): Add policy transparency explaining why this setting is disabled. preference.setEnabled(!isManagedByAdmin()); } From cf57eb7558ad07b4fff11d1be0a52d16fdeb4593 Mon Sep 17 00:00:00 2001 From: cosmohsieh Date: Wed, 7 Nov 2018 13:55:24 +0800 Subject: [PATCH 03/12] Implement NetworkRequestDialog architecture(cont.) For NetworkRequestTimeoutDialogFragment, the dialog show after WiFi scanning timeout or get no WiFi ap to list. Dialog will ask if user want to continue scanning or cancel. Bug: 117399926 Test: RunSettingsRoboTests Change-Id: I0551a753c10265e69a7830833813852a95eab5ef --- res/values/strings.xml | 4 + .../wifi/NetworkRequestDialogFragment.java | 52 +++++++++-- .../NetworkRequestTimeoutDialogFragment.java | 66 ++++++++++++++ .../NetworkRequestDialogFragmentTest.java | 27 +++++- ...tworkRequestTimeoutDialogFragmentTest.java | 90 +++++++++++++++++++ 5 files changed, 231 insertions(+), 8 deletions(-) create mode 100644 src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java create mode 100644 tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index f30c63d2f80..969353e703e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10266,6 +10266,10 @@ Choose device + + No devices found. Make sure the device is turned on and available to connect. + + Scan again %1$d device connected diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java index 9aac5090e92..c58ff579110 100644 --- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java +++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java @@ -19,6 +19,8 @@ package com.android.settings.wifi; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.os.Handler; +import android.os.Message; import androidx.appcompat.app.AlertDialog; import android.os.Bundle; import android.view.LayoutInflater; @@ -37,14 +39,16 @@ import java.util.List; public class NetworkRequestDialogFragment extends InstrumentedDialogFragment implements DialogInterface.OnClickListener { + /** Message sent to us to stop scanning wifi and pop up timeout dialog. */ + private static final int MESSAGE_STOP_SCAN_WIFI_LIST = 0; + + /** Delayed time to stop scanning wifi. */ + private static final int DELAY_TIME_STOP_SCAN_MS = 30*1000; + private List mAccessPointList; - public static NetworkRequestDialogFragment newInstance(int uid, String packageName) { - Bundle args = new Bundle(); - args.putInt("uid", uid); - args.putString("packageName", packageName); + public static NetworkRequestDialogFragment newInstance() { NetworkRequestDialogFragment dialogFragment = new NetworkRequestDialogFragment(); - dialogFragment.setArguments(args); return dialogFragment; } @@ -84,6 +88,44 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp public void onClick(DialogInterface dialog, int which) { } + @Override + public void onPause() { + super.onPause(); + + mHandler.removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST); + } + + @Override + public void onResume() { + super.onResume(); + + // TODO(b/117399926): Starts to scan current WiFi. + + // Sets time-out to stop scanning. + mHandler.sendEmptyMessageDelayed(MESSAGE_STOP_SCAN_WIFI_LIST, DELAY_TIME_STOP_SCAN_MS); + } + + private Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MESSAGE_STOP_SCAN_WIFI_LIST: + removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST); + stopScanningAndPopTimeoutDialog(); + break; + default: + // Do nothing. + break; + } + } + }; + + protected void stopScanningAndPopTimeoutDialog() { + dismiss(); + NetworkRequestTimeoutDialogFragment fragment = NetworkRequestTimeoutDialogFragment.newInstance(); + fragment.show(getActivity().getSupportFragmentManager(), null); + } + @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.WIFI_SCANNING_NEEDED_DIALOG; diff --git a/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java new file mode 100644 index 00000000000..08f285b0b8c --- /dev/null +++ b/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2018 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.wifi; + +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import androidx.appcompat.app.AlertDialog; +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.core.instrumentation.InstrumentedDialogFragment; + +public class NetworkRequestTimeoutDialogFragment extends InstrumentedDialogFragment implements + DialogInterface.OnClickListener { + + public static NetworkRequestTimeoutDialogFragment newInstance() { + NetworkRequestTimeoutDialogFragment fragment = new NetworkRequestTimeoutDialogFragment(); + return fragment; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()) + .setMessage(R.string.network_connection_timeout_dialog_message) + .setPositiveButton(R.string.network_connection_timeout_dialog_ok, this) + .setNegativeButton(R.string.cancel, null); + return builder.create(); + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.WIFI_SCANNING_NEEDED_DIALOG; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + startScanningDialog(); + break; + case DialogInterface.BUTTON_NEGATIVE: + default: + // Do nothing. + break; + } + } + + protected void startScanningDialog() { + NetworkRequestDialogFragment fragment = NetworkRequestDialogFragment.newInstance(); + fragment.show(getActivity().getSupportFragmentManager(), null); + } +} diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java index f987f404021..17718a692c7 100644 --- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java @@ -18,8 +18,6 @@ package com.android.settings.wifi; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; - import android.content.DialogInterface; import android.widget.Button; import androidx.appcompat.app.AlertDialog; @@ -33,6 +31,7 @@ import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.annotation.Config; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; +import org.robolectric.shadows.ShadowLooper; @RunWith(SettingsRobolectricTestRunner.class) @Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class}) @@ -44,7 +43,7 @@ public class NetworkRequestDialogFragmentTest { @Before public void setUp() { mActivity = Robolectric.setupActivity(FragmentActivity.class); - networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance(-1, null)); + networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance()); } @Test @@ -67,4 +66,26 @@ public class NetworkRequestDialogFragmentTest { positiveButton.performClick(); assertThat(alertDialog.isShowing()).isFalse(); } + + @Test + public void onResumeAndWaitTimeout_shouldCallTimeoutDialog() { + FakeNetworkRequestDialogFragment fakeFragment = new FakeNetworkRequestDialogFragment(); + FakeNetworkRequestDialogFragment spyFakeFragment = spy(fakeFragment); + spyFakeFragment.show(mActivity.getSupportFragmentManager(), null); + + assertThat(fakeFragment.bCalledStopAndPop).isFalse(); + + ShadowLooper.getShadowMainLooper().runToEndOfTasks(); + + assertThat(fakeFragment.bCalledStopAndPop).isTrue(); + } + + class FakeNetworkRequestDialogFragment extends NetworkRequestDialogFragment { + boolean bCalledStopAndPop = false; + + @Override + public void stopScanningAndPopTimeoutDialog() { + bCalledStopAndPop = true; + } + } } diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java new file mode 100644 index 00000000000..ed28e60c0a1 --- /dev/null +++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2018 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.wifi; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.internal.verification.VerificationModeFactory.times; + +import android.content.DialogInterface; +import android.widget.Button; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentActivity; +import com.android.settings.R; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class}) +public class NetworkRequestTimeoutDialogFragmentTest { + + private FragmentActivity mActivity; + private NetworkRequestTimeoutDialogFragment mFragment; + + @Before + public void setUp() { + mActivity = Robolectric.setupActivity(FragmentActivity.class); + mFragment = spy(NetworkRequestTimeoutDialogFragment.newInstance()); + mFragment.show(mActivity.getSupportFragmentManager(), null); + } + + @Test + public void display_shouldShowTheDialog() { + AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + + assertThat(alertDialog).isNotNull(); + assertThat(alertDialog.isShowing()).isTrue(); + + ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog); + assertThat(RuntimeEnvironment.application + .getString(R.string.network_connection_timeout_dialog_message)) + .isEqualTo(shadowAlertDialog.getMessage()); + } + + @Test + public void clickPositiveButton_shouldCallStartScanningDialog() { + AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(alertDialog.isShowing()).isTrue(); + + Button positiveButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); + assertThat(positiveButton).isNotNull(); + + positiveButton.performClick(); + verify(mFragment, times(1)).startScanningDialog(); + } + + @Test + public void clickNegativeButton_shouldCloseTheDialog() { + AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(alertDialog.isShowing()).isTrue(); + + Button negativeButton = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE); + assertThat(negativeButton).isNotNull(); + + negativeButton.performClick(); + assertThat(alertDialog.isShowing()).isFalse(); + } +} From 2c93ec8ae3f31313f97c6f1c827cff2d49fb9c52 Mon Sep 17 00:00:00 2001 From: Sunny Shao Date: Tue, 13 Nov 2018 16:47:36 +0800 Subject: [PATCH 04/12] Enabled the floating search bar feature Added the CoordinatorLayout as the top level layout Added the AppBarLayout to enclose the search bar Added the app:layout_behavior="@string/appbar_scrolling_view_behavior" to NestedScrollView Bug: 118886724 Test: manual test Change-Id: I4a8ef14637dc1dc7cf9618eca00e4b7d7a77c725 --- res/layout/search_bar.xml | 1 + res/layout/settings_homepage_container.xml | 42 ++++++++++++++-------- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/res/layout/search_bar.xml b/res/layout/search_bar.xml index 1ba64ad1ce0..3d4d0d64722 100644 --- a/res/layout/search_bar.xml +++ b/res/layout/search_bar.xml @@ -21,6 +21,7 @@ android:id="@+id/search_bar_container" android:layout_width="match_parent" android:layout_height="wrap_content" + app:layout_scrollFlags="scroll|enterAlways" android:background="?android:attr/colorPrimary"> - - - + android:layout_height="wrap_content"> + - + + + android:layout_height="wrap_content" + android:orientation="vertical" + android:descendantFocusability="blocksDescendants"> - + - - + + + + + From 03014707576cdeb5b3a05e072779e87f42e658c9 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 13 Nov 2018 14:42:50 -0800 Subject: [PATCH 05/12] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: Ic00cbf2b25c019d77c85c93203e58f4a1cf102c1 --- res/values-bs/strings.xml | 6 ++--- res/values-ca/strings.xml | 4 +-- res/values-de/strings.xml | 8 +++--- res/values-en-rCA/strings.xml | 4 +-- res/values-es-rUS/strings.xml | 2 +- res/values-fr/strings.xml | 2 +- res/values-in/strings.xml | 4 +-- res/values-iw/strings.xml | 48 +++++++++++++++++------------------ res/values-ja/strings.xml | 4 +-- res/values-ko/strings.xml | 18 ++++++------- res/values-pl/strings.xml | 4 +-- res/values-pt-rBR/strings.xml | 2 +- res/values-pt-rPT/strings.xml | 22 ++++++++-------- res/values-pt/strings.xml | 2 +- res/values-ta/strings.xml | 4 +-- res/values-uk/strings.xml | 2 +- res/values-zh-rCN/strings.xml | 1 - 17 files changed, 68 insertions(+), 69 deletions(-) diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 36cdeb4f50f..e9aef5e3625 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -2049,11 +2049,11 @@ "Stil titlova" "Prilagođene opcije" "Boja pozadine" - "Neprozirnost pozadine" + "Prozirnost pozadine" "Boja prozora za titlove" - "Neprozirnost prozora naslova" + "Prozirnost prozora naslova" "Boja teksta" - "Neprozirnost teksta" + "Prozirnost teksta" "Boja rubova" "Vrsta rubova" "Skup fontova" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index f72e8825ad9..f54fd3c220e 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -2834,7 +2834,7 @@ "Toca i paga" "Com funciona" "Paga a les botigues amb el telèfon" - "Aplicació de pagament predeterminada" + "Aplicació per pagar predeterminada" "No definida" "%1$s - %2$s" "Utilitza l\'aplicació predeterminada" @@ -3758,7 +3758,7 @@ "Configura el programa de Llum nocturna" "Canvia automàticament el color de la pantalla cada nit" "Opció Llum nocturna activada" - "La pantalla té un to groguenc; això t\'ajudarà a adormir-te." + "La pantalla té un to ambre; això t\'ajudarà a adormir-te." "Suggeriments personalitzats" "Suggeriments" "+%1$d" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index eeed04a4acc..05fc46cb323 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -1263,7 +1263,7 @@ "SD-Karte trennen, damit du sie sicher entfernen kannst" "USB-Speicher für Bereitst. einlegen" "SD-Karte zur Bereitstellung einlegen" - "USB-Speicher bereitst." + "USB-Speicher bereitstellen" "SD-Karte bereitstellen" @@ -1848,7 +1848,7 @@ "Tippfehler korrigieren" "Autom. Groß-/Kleinschreibung" "Jeden Satz mit einem Großbuchstaben beginnen" - "Autom. Zeichensetzung" + "Automatische Zeichensetzung" "Einstellungen für physische Tastatur" "Leertaste zweimal drücken, um \".\" hinzuzufügen" "Passwörter anzeigen" @@ -1955,7 +1955,7 @@ "Auf dem Sperrbildschirm erlauben" "Wenn die Verknüpfung aktiviert ist, kannst du Bedienungshilfen starten, indem du die beiden Lautstärketasten drei Sekunden lang gedrückt hältst." "Text mit hohem Kontrast" - "Vergrößerung autom. aktualisieren" + "Vergrößerung automatisch aktualisieren" "Vergrößerung bei App-Übergängen aktualisieren" "Ein/Aus beendet Anruf" "Großer Mauszeiger" @@ -2525,7 +2525,7 @@ "Daten können jederzeit synchronisiert, gesendet und empfangen werden." "Hintergrunddaten deaktivieren?" "Durch die Deaktivierung von Hintergrunddaten kann die Akkulaufzeit verlängert und die Verwendung von Daten verringert werden. Einige Apps nutzen die Hintergrunddatenverbindung eventuell weiterhin." - "App-Daten autom. synchronisieren" + "App-Daten automatisch synchronisieren" "Synchronisierung: AN" "Synchronisierung: AUS" "Synchronisierungsfehler" diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml index 5a88b901a45..341b6bf2cb9 100644 --- a/res/values-en-rCA/strings.xml +++ b/res/values-en-rCA/strings.xml @@ -1010,7 +1010,7 @@ "Activate Wi‑Fi Calling" "Turn on Wi‑Fi calling" "Wi‑Fi calling is not supported for %1$s" - "Carrier" + "Operator" "Display" "Sound" "Volumes" @@ -2916,7 +2916,7 @@ "SIM name" "Enter SIM name" "SIM slot %1$d" - "Carrier" + "Operator" "Number" "SIM colour" "Select SIM card" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 495e7d47875..2c4b3f5198e 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -3953,7 +3953,7 @@ "Para cambiar de app, desliza el dedo hacia arriba en el botón de inicio. Vuelve a deslizarlo para ver todas las apps. Funciona desde cualquier pantalla. Ya no aparecerá el botón Recientes en la parte inferior derecha de la pantalla." "Prueba el nuevo botón de inicio" "Activa el nuevo gesto para cambiar de app" - "Presionar dos veces el teléfono para revisarlo" + "Presiona la pantalla dos veces para consultar el teléfono" "Presionar dos veces la tablet para revisarla" "Presionar dos veces el dispositivo para revisarlo" "Para consultar la hora, los íconos de notificaciones y otros datos, presiona dos veces la pantalla." diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 1ab28e0cd9b..4631c028de7 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -178,7 +178,7 @@ "Vous devez redémarrer l\'appareil pour modifier ce paramètre." "Redémarrer" "Annuler" - "Périphériques multimédias disponibles" + "Appareils multimédias disponibles" "Périphériques d\'appel disponibles" "Actuellement connecté" "Appareils enregistrés" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index a2236c2b49e..b3a01ea90b9 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -56,7 +56,7 @@ "Pendaftaran IMS: %1$s\nSuara melalui LTE: %2$s\nSuara melalui Wi-Fi: %3$s\nVideo Call: %4$s\nAntarmuka UT: %5$s" "Dalam Layanan" "Di Luar Area Layanan" - "Telepon urgen saja" + "Panggilan Darurat Saja" "Radio Nonaktif" "Roaming" "Tidak Roaming" @@ -1098,7 +1098,7 @@ "Optimalkan tingkat kecerahan untuk cahaya di sekitar. Jika fitur ini diaktifkan, Anda tetap dapat mengatur kecerahan sementara." "Kecerahan layar akan disesuaikan otomatis dengan lingkungan dan aktivitas Anda. Anda dapat memindahkan penggeser secara manual untuk membantu kecerahan adaptif belajar dari preferensi Anda." "Cahaya Malam" - "Cahaya Malam memberikan rona kuning pada layar. Membuat Anda dapat melihat layar atau membaca dengan lebih mudah saat cahaya redup, serta membantu Anda lebih mudah tidur." + "Cahaya Malam memberikan rona kuning pada layar. Ini membuat Anda dapat melihat layar atau membaca dengan lebih mudah saat cahaya redup, serta membantu Anda lebih mudah tidur." "Jadwal" "Tidak ada" "Aktifkan pada waktu khusus" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index c36e5aeda0e..f19b949e618 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -374,7 +374,7 @@ "הפעל יישומי ווידג\'ט" "הושבת על ידי מנהל המכשיר" "הצגת אפשרות סגירה" - "‏הצגת אפשרות של לחצן ההפעלה שמשבית את Smart Lock, את ביטול הנעילה באמצעות טביעת אצבע ואת ההודעות המוצגות במסך הנעילה." + "‏הצגת אפשרות של לחצן ההפעלה שמשבית את Smart Lock, את ביטול הנעילה באמצעות טביעת אצבע ואת ההתראות המוצגות במסך הנעילה." "ללא" "%1$d / %2$d" "‏לדוגמה, ה-Android של יוסי." @@ -1172,7 +1172,7 @@ "פועל תמיד / צריכה מוגברת של הסוללה" "התראות חדשות" "מתי להציג" - "הודעות חדשות" + "התראות חדשות" "המסך יתעורר כשמתקבלות התראות" "פועל תמיד" "הצגה של השעה, סמלי ההתראות ופרטים אחרים. צריכה מוגברת של הסוללה." @@ -2246,7 +2246,7 @@ להגביל את האפליקציה? "כדי לחסוך בשימוש בסוללה, יש למנוע מ-%1$s שימוש בסוללה ברקע. ייתכן שהאפליקציה לא תפעל כראוי ויהיה עיכוב בקבלת הודעות." - "כדי לחסוך בשימוש בסוללה, יש למנוע מהאפליקציות הבאות שימוש בסוללה ברקע. ייתכן שהאפליקציות שיש להן הגבלה לא יפעלו כראוי ויהיה עיכוב בקבלת הודעות.\n\nאפליקציות:" + "כדי לחסוך בשימוש בסוללה, יש למנוע מהאפליקציות הבאות שימוש בסוללה ברקע. ייתכן שהאפליקציות שיש להן הגבלה לא יפעלו כראוי ויהיה עיכוב בקבלת התראות.\n\nאפליקציות:" "כדי לחסוך בשימוש בסוללה, יש למנוע מהאפליקציות הבאות שימוש בסוללה ברקע. ייתכן שהאפליקציות שיש להן הגבלה לא יפעלו כראוי ויהיה עיכוב בקבלת הודעות.\n\nאפליקציות:\n%1$s." "הגבלה" "להסיר את ההגבלה?" @@ -2259,9 +2259,9 @@ "מנהל הסוללה" "ניהול אפליקציות באופן אוטומטי" "הגבלת שימוש בסוללה לאפליקציות שבהן לא נעשה שימוש לעתים קרובות" - "כשמנהל הסוללה יזהה שאפליקציות גורמות להתרוקנות הסוללה, תהיה לך אפשרות להגביל אותן. ייתכן שהאפליקציות שיש להן הגבלה לא יפעלו כראוי ויהיה עיכוב בקבלת הודעות." - "כשמנהל הסוללה יזהה שאפליקציות גורמות להתרוקנות הסוללה, תהיה לך אפשרות להגביל אותן. ייתכן שהאפליקציות שיש להן הגבלה לא יפעלו כראוי ויהיה עיכוב בקבלת הודעות." - "כשמנהל הסוללה יזהה שאפליקציות גורמות להתרוקנות הסוללה, תהיה לך אפשרות להגביל אותן. ייתכן שהאפליקציות שיש להן הגבלה לא יפעלו כראוי ויהיה עיכוב בקבלת הודעות." + "כשמנהל הסוללה יזהה שאפליקציות גורמות להתרוקנות הסוללה, תהיה לך אפשרות להגביל אותן. ייתכן שהאפליקציות שיש להן הגבלה לא יפעלו כראוי ויהיה עיכוב בקבלת התראות." + "כשמנהל הסוללה יזהה שאפליקציות גורמות להתרוקנות הסוללה, תהיה לך אפשרות להגביל אותן. ייתכן שהאפליקציות שיש להן הגבלה לא יפעלו כראוי ויהיה עיכוב בקבלת התראות." + "כשמנהל הסוללה יזהה שאפליקציות גורמות להתרוקנות הסוללה, תהיה לך אפשרות להגביל אותן. ייתכן שהאפליקציות שיש להן הגבלה לא יפעלו כראוי ויהיה עיכוב בקבלת התראות." "אפליקציות בשימוש מוגבל" ‏מגביל שימוש בסוללה של %1$d אפליקציות @@ -2269,7 +2269,7 @@ ‏מגביל שימוש בסוללה של %1$d אפליקציות ‏מגביל שימוש בסוללה של אפליקציה אחת (%1$d) - "אפליקציות אלה השתמשו בסוללה ברקע. ייתכן שאפליקציות מוגבלות לא יפעלו כראוי ושיהיה עיכוב בקבלת הודעות." + "אפליקציות אלה השתמשו בסוללה ברקע. ייתכן שאפליקציות מוגבלות לא יפעלו כראוי ושיהיה עיכוב בקבלת התראות." "שימוש במנהל הסוללה" "זיהוי אפליקציות שגורמות להתרוקנות הסוללה" "פועל / מזהה כשאפליקציות גורמות להתרוקנות הסוללה" @@ -3085,7 +3085,7 @@ "טביעת אצבע" "לסובב, להפוך, סיבוב, לאורך, לרוחב, כיוון, אנכי, אופקי" "‏שדרוג, Android" - "‏dnd, לוח זמנים, הודעות, חסימה, השתקה, רטט, שינה, עבודה, הדגשה, צליל, יום, יום בשבוע, סוף שבוע, לילה באמצע שבוע, אירוע" + "‏dnd, לוח זמנים, התראות חסימה, השתקה, רטט, שינה, עבודה, הדגשה, צליל, יום, יום בשבוע, סוף שבוע, לילה באמצע שבוע, אירוע" "מסך, זמן נעילה, זמן קצוב לתפוגה, נעילת מסך" "זיכרון, נתונים, מחיקה, ניקוי, פינוי, שטח אחסון" "מחובר, מכשיר, אוזניות, אוזניות עם מיקרופון, רמקול, אלחוטי, התאמה, אוזניות כפתור, מוזיקה, מדיה" @@ -3168,11 +3168,11 @@ "כשמצב \'נא לא להפריע\' פועל" "התראות" "ללא צליל מהתראות" - "יוצגו הודעות במסך" + "יוצגו התראות על המסך" "כשיגיעו התראות, הטלפון לא ישמיע צליל ולא יפעיל רטט." "ללא סימנים חזותיים או צלילים מהתראות" "התראות לא יוצגו ולא יושמעו" - "הטלפון שלך לא יציג הודעות חדשות או קיימות, ולא ישמיע צליל או רטט. הודעות לא יופיעו בעת החלקה כלפי מטה מהחלק העליון של המסך.\n\nחשוב לזכור, הודעות החיוניות לפעולת הטלפון ולסטטוס עדיין יופיעו." + "הטלפון שלך לא יציג התראות חדשות או קיימות, ולא ישמיע צליל או רטט. התראות לא יופיעו בעת החלקה כלפי מטה מהחלק העליון של המסך.\n\nחשוב לזכור, התראות החיוניות לפעולת הטלפון ולסטטוס עדיין יופיעו." "התאמה אישית" "הפעלת הגדרה מותאמת אישית" "הסרת הגדרה מותאמת אישית" @@ -3185,7 +3185,7 @@ "השתקה של צלילים ורטט" "אל תפעיל את המסך" "אל תציג אור מהבהב" - "אל תציג הודעות קופצות במסך" + "לא להציג התראות קופצות במסך" "הסתרה של סמלי שורת הסטטוס" "הסתרה של סימני ההתראות" "אני לא רוצה להציג התראות" @@ -3195,7 +3195,7 @@ "כאשר המסך פועל" "צלילים ורטט" "צלילים, רטט וחלק מהסימנים החזותיים של הודעות" - "צלילים, רטט וסימנים חזותיים של הודעות" + "צלילים, רטט וסימנים חזותיים של התראות" "לעולם לא יוסתרו הודעות הדרושות לפעולת הטלפון הבסיסית ולסטטוס" "ללא" "אפשרויות אחרות" @@ -3243,9 +3243,9 @@ "כשמצב \'נא לא להפריע\' פועל, הודעות, תזכורות ואירועים מושתקים, חוץ מהפריטים שאפשרת למעלה. ניתן לשנות את הגדרות ההודעות כדי לאפשר לחברים, לבני משפחה או לאנשי קשר אחרים ליצור איתך קשר." "סיום" "הגדרות" - "ללא סימנים חזותיים או צלילים מהודעות" - "ללא צליל מהודעות" - "הודעות לא יוצגו ולא יושמעו. מותרות שיחות מאנשי קשר שמסומנים בכוכב וממתקשרים חוזרים." + "ללא סימנים חזותיים או צלילים מהתראות" + "ללא צליל מהתראות" + "התראות לא יוצגו ולא יושמעו. מותרות שיחות מאנשי קשר שמסומנים בכוכב וממתקשרים חוזרים." "(ההגדרה הנוכחית)" "האם לשנות את ההגדרות של ההתראות במצב \'נא לא להפריע\'?" "צלילי פרופיל עבודה" @@ -3297,18 +3297,18 @@ "גבוהה" "דחופה" "סוגי הפרעות שאפשר להפעיל" - "האפליקציה יכולה להפעיל צלילים ורטט ו/או להציג הודעות קופצות במסך" + "האפליקציה יכולה להפעיל צלילים ורטט ו/או להציג התראות קופצות במסך" "חשיבות נמוכה" "חשיבות בינונית" "חשיבות גבוהה" "חשיבות דחופה" - "הצגת הודעות" + "הצגת התראות" "אסיסטנט ההתראות" "~%1$s ביום" "~%1$s בשבוע" "אף פעם" "גישה אל התראות" - "הגישה להודעות של פרופיל העבודה חסומה" + "הגישה חסומה להתראות של פרופיל העבודה" "לאפליקציות אין אפשרות לקרוא התראות" ‏%d אפליקציות יכולות לקרוא התראות @@ -3339,7 +3339,7 @@ "אין אפליקציות מותקנות שביקשו גישה אל \'נא לא להפריע\'" "טוען אפליקציות..." "‏לבקשתך, מערכת Android חוסמת במכשיר זה הצגת הודעות מאפליקציה זו" - "‏לבקשתך, מערכת Android חוסמת במכשיר הצגה של קטגוריית הודעות זו" + "‏לבקשתך, מערכת Android חוסמת במכשיר הצגה של קטגוריית התראות זו" "‏לבקשתך, מערכת Android חוסמת במכשיר הצגה של מקבץ הודעות זה" "קטגוריות" "אחר" @@ -3373,7 +3373,7 @@ "הצגה של סימן ההתראות" "הצגה של סימן ההתראות" "ביטול / שינוי של \'נא לא להפריע\'" - "הודעות אלה יוכלו להמשיך ולהפריע כשמצב \'נא לא להפריע\' מופעל" + "התראות אלה יוכלו להמשיך ולהפריע כשמצב \'נא לא להפריע\' מופעל" "במסך הנעילה" "חסום" "עדיפות גבוהה" @@ -3509,7 +3509,7 @@ "ניתן להגביר את ההגנה על המכשיר על ידי דרישה להזנת סיסמה לפני שהוא מופעל. עד שהמכשיר יופעל, הוא לא יוכל לקבל שיחות, הודעות או התראות, כולל התראות קוליות. \n\nהדבר יסייע להגן על נתונים במכשירים שאבדו או נגנבו. האם לדרוש סיסמה כדי להפעיל את המכשיר?" "בנוסף לשימוש בטביעת אצבע כדי לבטל את הנעילה של המכשיר, ניתן להגביר את ההגנה עליו על ידי דרישה להזנת קוד גישה לפני שהוא מופעל. עד שהמכשיר יופעל, הוא לא יוכל לקבל שיחות, הודעות או התראות, כולל התראות קוליות.\n\nהדבר יסייע להגן על נתונים במכשירים שאבדו או נגנבו. האם לדרוש הזנה של קוד גישה כדי להפעיל את המכשיר?" "בנוסף לשימוש בטביעת אצבע כדי לבטל את הנעילה של המכשיר, ניתן להגביר את ההגנה עליו על ידי דרישה לסמן את קו ביטול הנעילה לפני שהוא מופעל. עד שהמכשיר יופעל, הוא לא יוכל לקבל שיחות, הודעות או התראות, כולל התראות קוליות.\n\nהדבר יסייע להגן על נתונים במכשירים שאבדו או נגנבו. האם לדרוש סימון של קו ביטול הנעילה כדי להפעיל את המכשיר?" - "כדי לשפר את רמת האבטחה של המכשיר בנוסף לביטול הנעילה באמצעות טביעת אצבע, תוכל להגדיר את המכשיר כך שתידרש להזין סיסמה לפני הפעלתו. עד להפעלה של המכשיר, לא ניתן לקבל שיחות, הודעות או הודעות.\n\nכך, תוכל להגן על הנתונים אם המכשיר ייגנב או יאבד. לדרוש סיסמה להפעלת המכשיר?" + "כדי לשפר את רמת האבטחה של המכשיר בנוסף לביטול הנעילה באמצעות טביעת אצבע, תוכל להגדיר את המכשיר כך שתידרש להזין סיסמה לפני הפעלתו. עד להפעלה של המכשיר, לא ניתן לקבל שיחות, הודעות או התראות.\n\nכך, תוכל להגן על הנתונים אם המכשיר ייגנב או יאבד. לדרוש סיסמה להפעלת המכשיר?" "כן" "לא" "מוגבל" @@ -3664,7 +3664,7 @@ "אופטימיזציה של סוללה אינה זמינה" "אל תפעיל אופטימיזציה של הסוללה. הסוללה עשויה להתרוקן מהר יותר." "האם לאפשר לאפליקציה לפעול תמיד ברקע?" - "מתן אישור ל-%1$s לפעול תמיד ברקע עשוי לקצר את משך חיי הסוללה. \n\nניתן לשנות זאת מאוחר יותר דרך ההגדרות של אפליקציות והודעות." + "מתן אישור ל-%1$s לפעול תמיד ברקע עשוי לקצר את משך חיי הסוללה. \n\nניתן לשנות זאת מאוחר יותר דרך ההגדרות של אפליקציות והתראות." "נעשה שימוש ב-%1$s מאז הטעינה המלאה האחרונה" "ניהול צריכת החשמל" "לא נעשה שימוש בסוללה מאז הטעינה המלאה האחרונה" @@ -3861,8 +3861,8 @@ "שיחות והודעות יושתקו" "המכשיר מוגדר לרטט" "הטלפון מוגדר לרטט" - "המכשיר ירטוט כשמתקבלות שיחות והודעות" - "הטלפון ירטוט כשמתקבלות שיחות והודעות" + "המכשיר ירטוט כשמתקבלות שיחות והתראות" + "הטלפון ירטוט כשמתקבלות שיחות והתראות" "הגדרת לוח זמנים לתאורת לילה" "שינוי גוון המסך באופן אוטומטי מדי לילה" "\'תאורת לילה\' פועלת" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 6f25b38c2bd..fe832b5fcb0 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -3317,7 +3317,7 @@ "削除" "不明" "現在、この設定は変更できません。アプリ(%1$s)のカスタム設定によってサイレント モードが自動的に ON になりました。" - "現在、この設定は変更できません。アプリのカスタム設定によってマナーモードが自動的に ON になりました。" + "現在、この設定は変更できません。アプリのカスタム設定によってサイレント モードが自動的に ON になりました。" "現在、この設定は変更できません。ユーザーのカスタム設定によってサイレント モードが ON に設定されました。" "時間" "自動ルールでは指定時間内はサイレント モードを ON に設定します" @@ -3399,7 +3399,7 @@ "画面が ON のとき" "サイレント モードでサイレントに設定した通知を受信したときに、画面上にポップアップ表示され、ステータスバーにアイコンが表示されます" "画面が OFF のとき" - "マナーモードでサイレントに設定した通知を受信したときに、画面が ON になり、光が点滅します" + "サイレント モードでサイレントに設定した通知を受信したときに、画面が ON になり、光が点滅します" "サイレント モードでサイレントに設定した通知を受信したときに、画面が ON になります" "通知設定" "OK" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index c48f3f5fd51..0e05058f309 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -2160,9 +2160,9 @@ "태블릿 배터리 수명 향상" "기기 배터리 수명 향상" "배터리 관리자를 사용 설정하세요." - "배터리 세이버 사용 설정" + "절전 모드 사용 설정" "배터리가 평소보다 빨리 소진될 수 있습니다." - "배터리 세이버 사용 중" + "절전 모드 사용 중" "일부 기능이 제한될 수 있습니다." "휴대전화를 평소보다 더 많이 사용함" "태블릿을 평소보다 더 많이 사용함" @@ -2199,9 +2199,9 @@ "이 앱은 백그라운드에서 배터리를 사용할 수 있으므로 배터리가 예상보다 빨리 소진될 수 있습니다." "삭제" "취소" - "앱의 배터리 사용량이 평소와 같습니다. 앱에서 배터리를 너무 많이 사용하면 휴대전화에서 취하실 수 있는 조치를 알려 드리겠습니다.\n\n배터리가 부족하면 언제든지 배터리 세이버 모드를 사용 설정하세요." - "앱의 배터리 사용량이 평소와 같습니다. 앱에서 배터리를 너무 많이 사용하면 태블릿에서 취하실 수 있는 조치를 알려 드리겠습니다.\n\n배터리가 부족하면 언제든지 배터리 세이버 모드를 사용 설정하세요." - "앱의 배터리 사용량이 평소와 같습니다. 앱에서 배터리를 너무 많이 사용하면 기기에서 취하실 수 있는 조치를 알려 드리겠습니다.\n\n배터리가 부족하면 언제든지 배터리 세이버 모드를 사용 설정하세요." + "앱의 배터리 사용량이 평소와 같습니다. 앱에서 배터리를 너무 많이 사용하면 휴대전화에서 취하실 수 있는 조치를 알려 드리겠습니다.\n\n배터리가 부족하면 언제든지 절전 모드를 사용 설정하세요." + "앱의 배터리 사용량이 평소와 같습니다. 앱에서 배터리를 너무 많이 사용하면 태블릿에서 취하실 수 있는 조치를 알려 드리겠습니다.\n\n배터리가 부족하면 언제든지 절전 모드를 사용 설정하세요." + "앱의 배터리 사용량이 평소와 같습니다. 앱에서 배터리를 너무 많이 사용하면 기기에서 취하실 수 있는 조치를 알려 드리겠습니다.\n\n배터리가 부족하면 언제든지 절전 모드를 사용 설정하세요." "배터리 관리자" "자동으로 앱 관리" "자주 사용하지 않는 앱의 배터리 사용량 제한" @@ -2326,11 +2326,11 @@ "Android OS" "미디어 서버" "앱 최적화" - "배터리 세이버" + "절전 모드" "자동으로 사용 설정" "%1$s 도달 시" "켜기" - "배터리 세이버 사용" + "절전 모드 사용" "자동으로 사용 설정" "사용 안함" "배터리 잔량 %1$s" @@ -3739,8 +3739,8 @@ "비행기 모드 사용 중" "비행기 모드가 켜져 있으면 Wi‑Fi, 블루투스 및 모바일 네트워크가 사용 중지됩니다. Wi‑Fi와 블루투스는 다시 사용 설정할 수 있습니다." "알림 일시중지 사용 중" - "배터리 세이버 사용 중" - "배터리 세이버 기능을 사용하면 기기의 일부 기능이 사용 중지되며 앱이 제한됩니다." + "절전 모드 사용 중" + "절전 모드 기능을 사용하면 기기의 일부 기능이 사용 중지되며 앱이 제한됩니다." "모바일 데이터 사용 중지됨" "인터넷은 Wi-Fi를 통해서만 사용할 수 있습니다." "데이터 절약 모드 사용" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index eb26e7c05ef..a01aa69db37 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -1991,7 +1991,7 @@ "Dźwięk mono" "Połącz kanały podczas odtwarzania dźwięku" "Czas dotknięcia i przytrzymania" - "Inwersja kolorów" + "Odwrócenie kolorów" "Może wpłynąć na wydajność" "Czas oczekiwania" "Jeśli używasz myszki, możesz ustawić urządzenie tak, by kliknięcie następowało automatycznie, gdy myszka nie będzie poruszała się przez określony czas." @@ -2530,7 +2530,7 @@ "Aktywowanie tej aplikacji do zarządzania pozwoli aplikacji %1$s wykonywać te operacje:" "Aplikacja do zarządzania jest aktywna i pozwala aplikacji %1$s wykonywać te operacje:" "Czy aktywować menedżera profilów?" - "Jeśli przejdziesz dalej, Twoim kontem użytkownika będzie zarządzał administrator, który obok Twoich danych osobistych będzie mógł zapisać dane powiązane.\n\nAdministrator może monitorować ustawienia, uprawnienia dostępu, aplikacje i dane (w tym aktywność w sieci i lokalizację urządzenia) powiązane z tym użytkownikiem oraz zarządzać nimi." + "Jeśli przejdziesz dalej, Twoim kontem użytkownika będzie zarządzał administrator, który obok Twoich danych osobistych będzie mógł zapisać dane powiązane.\n\nAdministrator może monitorować ustawienia, uprawnienia dostępu, aplikacje i dane powiązane z tym użytkownikiem (w tym aktywność w sieci i lokalizację urządzenia) oraz zarządzać nimi." "Inne opcje zablokował administrator" "Więcej szczegółów" "Ogólne" diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index ae1d937048a..971ff7a7da8 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -2377,7 +2377,7 @@ "Serviços de entrada de texto por voz" "Hotword completa e interação" "Conversão simples de fala em texto" - "Este serviço de entrada por voz poderá executar monitoramento por voz sempre ativado e apps com o recurso de controle por voz em seu nome. Ele está incluído no app %s. Quer ativar o uso deste serviço?" + "Este serviço de entrada por voz poderá executar monitoramento por voz sempre ativado e apps com o recurso de comando de voz em seu nome. Ele está incluído no app %s. Quer ativar o uso deste serviço?" "Mecanismo preferencial" "Configurações do mecanismo" "Taxa e tom da fala" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 5e73e022921..1ced671538e 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -316,7 +316,7 @@ "Roaming de dados" "Ligar a serviços de dados em roaming" "Ligar a serviços de dados em roaming" - "A ligação de dados foi perdida porque saiu do alcance da sua rede e o roaming de dados estava desactivado." + "A ligação de dados foi perdida porque saiu do alcance da sua rede e o roaming de dados estava desativado." "Ligar" "Pode incorrer em custos significativos." "Ao permitir o roaming de dados, podem ser cobradas tarifas de roaming significativas!\n\nEsta definição afeta todos os utilizadores deste tablet." @@ -1272,7 +1272,7 @@ "Apaga todos os dados do armazenamento USB interno, como músicas e fotos" "Apaga todos os dados do cartão SD, tais como música e fotos" "Limpar dados em cache?" - "Irá limpar os dados em cache de todas as aplic." + "Irá limpar os dados em cache de todas as app" "A função MTP ou PTP está ativa" "Desmontar mem. arm. USB?" "Desmontar cartão SD?" @@ -1543,7 +1543,7 @@ "Procurar por Bluetooth" "Permita que as aplicações e os serviços procurem dispositivos próximos em qualquer altura, mesmo quando o Bluetooth estiver desativado. Isto pode ser utilizado, por exemplo, para melhorar as funcionalidades e os serviços baseados na localização." "Wi-Fi e localização de rede de telemóvel" - "Permitir que aplic. usem o serv. localiz. Google p/ calcular mais rapida/ a sua localização. Dados localização recolhidos e enviados à Google." + "Permitir que app usem o serv. localiz. Google p/ calcular mais rapida/ a sua localização. Dados localização recolhidos e enviados à Google." "Localização determinada por Wi-Fi" "Satélites GPS" "Permitir que as aplicações utilizem o GPS do tablet para localizar a sua posição" @@ -1554,7 +1554,7 @@ "Localização e pesquisa do Google" "Permitir que o Google utilize a sua localização para melhorar os resultados da pesquisa e os outros serviços" "Acesso à localização" - "Permitir que aplic. com permissão utilizem informações sobre a sua localização" + "Permitir que app com permissão utilizem informações sobre a sua localização" "Origens da localização" "Acerca do tablet" "Acerca do telefone" @@ -1662,7 +1662,7 @@ "Gerir aplicações, configurar atalhos de início rápido" "Definições da aplicação" "Fontes desconhecidas" - "Permit. todas as fontes aplic." + "Permit. todas as fontes app" "Aplicações abertas recentemente" "Ver as %1$d aplicações" "O seu tablet e os dados pessoais são mais vulneráveis a ataques de aplicações desconhecidas. Ao instalar aplicações desta fonte, aceita ser responsável por quaisquer danos no tablet ou perdas de dados que possam resultar da utilização do mesmo." @@ -2115,7 +2115,7 @@ "A utilização em segundo plano não pode ser restringida." "Pretende limitar a atividade em segundo plano?" "Se limitar a atividade em segundo plano de uma aplicação, esta pode apresentar um comportamento anormal." - "A aplic. não está def. p/ otimizar a bateria, não a pode restringir.\n\nP/ restringir a aplic., ative a otimiz. da bateria." + "A app não está def. p/ otimizar a bateria, não a pode restringir.\n\nP/ restringir a app, ative a otimiz. da bateria." "Utilização do ecrã desde carregamento completo" "Consumo do ecrã" "Procura de redes móveis" @@ -2595,7 +2595,7 @@ "Sincr. auto. dados de trabalho" "Alterar ciclo..." "Dia do mês para repor o ciclo de utilização de dados:" - "Nenhuma aplic. util. dados durante este período." + "Nenhuma app util. dados durante este período." "Primeiro plano" "Fundo" "restrito" @@ -2839,7 +2839,7 @@ "%1$s%2$s" "Utilizar predefinição" "Sempre" - "Exceto enquanto aberta outra aplic. de pagamento" + "Exceto enquanto aberta outra app de pagamento" "Num terminal Tocar e pagar, pagar com:" "Pagar num terminal" "Configure uma aplicação de pagamento. Em seguida, basta aproximar a parte de trás do telemóvel a um terminal com o símbolo de pagamento sem contacto." @@ -3443,7 +3443,7 @@ "%1$s utilizados em %2$s" "Armazenamento interno" "Armazenamento externo" - "Utilização dados da aplic." + "Utilização dados da app" "%1$s util. desde %2$s" "Armazenamento utilizado" "Alterar" @@ -3544,7 +3544,7 @@ "Otimização da bateria" "Alertas de utilização" "Mostrar utilização total do dispositivo" - "Mostrar utilização de aplic." + "Mostrar utilização de app" "Utilização elevada" %2$d aplicações estão a apresentar um comportamento anormal @@ -3892,7 +3892,7 @@ "Recorte no ecrã" "ecrã com recorte, entalhe" "Predefinição do dispositivo" - "Acesso especial a aplic." + "Acesso especial a app" %d aplicações podem utilizar dados sem restrições 1 aplicação pode utilizar dados sem restrições diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index ae1d937048a..971ff7a7da8 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -2377,7 +2377,7 @@ "Serviços de entrada de texto por voz" "Hotword completa e interação" "Conversão simples de fala em texto" - "Este serviço de entrada por voz poderá executar monitoramento por voz sempre ativado e apps com o recurso de controle por voz em seu nome. Ele está incluído no app %s. Quer ativar o uso deste serviço?" + "Este serviço de entrada por voz poderá executar monitoramento por voz sempre ativado e apps com o recurso de comando de voz em seu nome. Ele está incluído no app %s. Quer ativar o uso deste serviço?" "Mecanismo preferencial" "Configurações do mecanismo" "Taxa e tom da fala" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 17cfe88c93e..d59d17996dc 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -1299,7 +1299,7 @@ "அமை" "உலாவு" "இடத்தைக் காலியாக்கு" - "சேமிப்பகத்தை நிர்வகி" + "சேமிப்பிடத்தை நிர்வகி" "USB கணினி இணைப்பு" "இவ்வாறு இணை" "மீடியா சாதனம் (MTP)" @@ -3933,7 +3933,7 @@ %s வினாடிகள் 1 வினாடி - "சேமிப்பகத்தை நிர்வகி" + "சேமிப்பிடத்தை நிர்வகி" "சேமிப்பக இடத்தைக் காலியாக்க உதவ, காப்புப் பிரதி எடுக்கப்பட்ட படங்களையும் வீடியோக்களையும் உங்கள் சாதனத்திலிருந்து சேமிப்பக நிர்வாகி அகற்றும்." "படங்கள் & வீடியோக்களை அகற்று" "சேமிப்பக நிர்வாகி" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 2ec12fc3eb8..b47e6f5aefa 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -4279,7 +4279,7 @@ "Збільште час роботи акумулятора телефона" "Не дзвонити" - "Одночасно натисніть кнопки живлення та збільшення гучності" + "Одночасно натиснути кнопки живлення та збільшення гучності" "Комбінація клавіш, щоб вимкнути звук дзвінка" "Вібросигнал" "Без звуку" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index bdddf753cc7..13a7b895341 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -16,7 +16,6 @@ - "%1$s%2$s" "是" "否" "创建" From 069d293ba5ab3d147642d1a21a4fc62ededbae8c Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Tue, 13 Nov 2018 14:54:26 -0800 Subject: [PATCH 06/12] Add setup chooselock internal activity to manifest. Declare SetupChooseLockGeneric$InternalActivity in AndroidManifest.xml so that it can be launched properly. Change-Id: Ia924f759c16d01c17a4f6a99d7c43bf13c0f494a Fixes: 112706989 Test: atest com.android.settings.password.SetupChooseLockGenericTest --- AndroidManifest.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index eb3be0e37d1..79821d0d750 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1598,6 +1598,11 @@ + + Date: Tue, 13 Nov 2018 15:25:13 +0800 Subject: [PATCH 07/12] Sort contextual cards based on their score. Fixes: 119493779 Bug: 111822376 Test: robotests Change-Id: I254cba3c92ca1b58633f2ea6b2fa381607549e0c --- .../ContextualCardManager.java | 11 +-- .../ConditionalContextualCard.java | 6 ++ .../ContextualCardLoaderTest.java | 1 - .../ContextualCardManagerTest.java | 67 +++++++++++++++++++ .../ConditionalContextualCardTest.java | 12 +++- 5 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java rename tests/robotests/src/com/android/settings/homepage/contextualcards/{ => conditional}/ConditionalContextualCardTest.java (74%) diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java index 39ceff317b6..ae6f6132c83 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java @@ -29,6 +29,7 @@ import android.widget.BaseAdapter; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import androidx.loader.app.LoaderManager; import androidx.loader.content.Loader; @@ -109,9 +110,12 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo } } - //TODO(b/111822376): implement sorting mechanism. - private void sortCards(List cards) { + @VisibleForTesting + List sortCards(List cards) { //take mContextualCards as the source and do the ranking based on the rule. + return cards.stream() + .sorted((c1, c2) -> Double.compare(c2.getRankingScore(), c1.getRankingScore())) + .collect(Collectors.toList()); } @Override @@ -127,10 +131,9 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo allCards.addAll( updateList.values().stream().flatMap(List::stream).collect(Collectors.toList())); - sortCards(allCards); //replace with the new data mContextualCards.clear(); - mContextualCards.addAll(allCards); + mContextualCards.addAll(sortCards(allCards)); loadCardControllers(); diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java index 81219c33010..4f92534cc18 100644 --- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java +++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java @@ -16,6 +16,8 @@ package com.android.settings.homepage.contextualcards.conditional; +import androidx.annotation.VisibleForTesting; + import com.android.settings.homepage.contextualcards.ContextualCard; /** @@ -26,6 +28,9 @@ import com.android.settings.homepage.contextualcards.ContextualCard; */ public class ConditionalContextualCard extends ContextualCard { + @VisibleForTesting + static final double UNSUPPORTED_RANKING_SCORE = -100.0; + private final long mConditionId; private final int mMetricsConstant; private final CharSequence mActionText; @@ -83,6 +88,7 @@ public class ConditionalContextualCard extends ContextualCard { } public ConditionalContextualCard build() { + setRankingScore(UNSUPPORTED_RANKING_SCORE); return new ConditionalContextualCard(this); } } diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java index 598e23f6f7c..f9eda497cb2 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java @@ -38,7 +38,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadows.ShadowContentResolver; -import org.robolectric.shadows.ShadowLog; import java.util.ArrayList; import java.util.Arrays; diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java new file mode 100644 index 00000000000..091a51b1d4c --- /dev/null +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2018 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.homepage.contextualcards; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.net.Uri; + +import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RuntimeEnvironment; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(SettingsRobolectricTestRunner.class) +public class ContextualCardManagerTest { + + private Context mContext; + private ContextualCardManager mManager; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + final ContextualCardsFragment fragment = new ContextualCardsFragment(); + mManager = new ContextualCardManager(mContext, fragment.getSettingsLifecycle()); + } + + @Test + public void sortCards_hasConditionalAndSliceCards_conditionalShouldAlwaysBeTheLast() { + final String sliceUri = "content://com.android.settings.slices/action/flashlight"; + final List cards = new ArrayList<>(); + cards.add(new ConditionalContextualCard.Builder().build()); + cards.add(buildContextualCard(sliceUri)); + + final List sortedCards = mManager.sortCards(cards); + + assertThat(sortedCards.get(cards.size() - 1).getCardType()) + .isEqualTo(ContextualCard.CardType.CONDITIONAL); + } + + private ContextualCard buildContextualCard(String sliceUri) { + return new ContextualCard.Builder() + .setName("test_name") + .setSliceUri(Uri.parse(sliceUri)) + .build(); + } +} diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ConditionalContextualCardTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java similarity index 74% rename from tests/robotests/src/com/android/settings/homepage/contextualcards/ConditionalContextualCardTest.java rename to tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java index 74e88d7eebf..1c74ef32bcc 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ConditionalContextualCardTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java @@ -14,10 +14,14 @@ * limitations under the License. */ -package com.android.settings.homepage.contextualcards; +package com.android.settings.homepage.contextualcards.conditional; + +import static com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard + .UNSUPPORTED_RANKING_SCORE; import static com.google.common.truth.Truth.assertThat; +import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -39,4 +43,10 @@ public class ConditionalContextualCardTest { assertThat(new ConditionalContextualCard.Builder().build().getCardType()) .isEqualTo(ContextualCard.CardType.CONDITIONAL); } + + @Test + public void getRankingScore_shouldAlwaysBeUnsupportedScore() { + assertThat(new ConditionalContextualCard.Builder().build().getRankingScore()) + .isEqualTo(UNSUPPORTED_RANKING_SCORE); + } } From a6c7db18884ab9b08a8948b44749f5d9e5608092 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Mon, 12 Nov 2018 01:28:32 -0800 Subject: [PATCH 08/12] Update logging: switch a bunch of action() logging calls. Use generic action(int, int, int, String, int) instead of action(Context, int, string, Pair...) when possible. Bug: 117860032 Test: robotests Change-Id: I5213b52b2b10d80a3c488c37718df81b3b0a428f --- .../applications/UsageAccessDetails.java | 11 ++- .../AppButtonsPreferenceController.java | 14 ++-- .../appinfo/DrawOverlayDetails.java | 11 ++- .../defaultapps/DefaultAppPickerFragment.java | 9 +-- .../deviceadmin/DeviceAdminAdd.java | 8 ++- .../PictureInPictureDetails.java | 15 ++-- .../premiumsms/PremiumSmsAccess.java | 14 +++- .../vrlistener/VrListenerSettings.java | 11 ++- .../core/instrumentation/StatsLogWriter.java | 7 +- .../SuggestionFeatureProvider.java | 9 --- .../SuggestionFeatureProviderImpl.java | 19 ----- .../BuildNumberPreferenceController.java | 36 ++++++---- .../AnomalyDetectionJobService.java | 26 +++---- .../batterytip/actions/RestrictAppAction.java | 19 ++--- .../actions/UnrestrictAppAction.java | 11 +-- .../batterytip/tips/RestrictAppTip.java | 8 +-- .../slices/SliceBroadcastReceiver.java | 28 +++----- .../settings/slices/SliceBuilderUtils.java | 11 +-- .../applications/UsageAccessDetailsTest.java | 20 ++++-- .../AppButtonsPreferenceControllerTest.java | 11 ++- .../appinfo/DrawOverlayDetailsTest.java | 14 ++-- .../DefaultAppPickerFragmentTest.java | 13 ++-- .../deviceadmin/DeviceAdminAddTest.java | 20 ++++-- .../PictureInPictureDetailsTest.java | 20 ++++-- .../premiumsms/PremiumSmsAccessTest.java | 29 +++++--- .../vrlistener/VrListenerSettingsTest.java | 22 +++--- .../SuggestionFeatureProviderImplTest.java | 40 +---------- .../BuildNumberPreferenceControllerTest.java | 4 +- .../AnomalyDetectionJobServiceTest.java | 26 +++---- .../actions/RestrictAppActionTest.java | 21 +++--- .../actions/UnrestrictAppActionTest.java | 11 +-- .../batterytip/tips/RestrictAppTipTest.java | 21 +++--- .../slices/SliceBroadcastReceiverTest.java | 42 +++-------- .../slices/SliceBuilderUtilsTest.java | 72 +++++++------------ 34 files changed, 319 insertions(+), 334 deletions(-) diff --git a/src/com/android/settings/applications/UsageAccessDetails.java b/src/com/android/settings/applications/UsageAccessDetails.java index 62ce08e0a77..0a01896f879 100644 --- a/src/com/android/settings/applications/UsageAccessDetails.java +++ b/src/com/android/settings/applications/UsageAccessDetails.java @@ -36,6 +36,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.applications.AppStateUsageBridge.UsageState; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenceChangeListener, OnPreferenceClickListener { @@ -113,8 +114,14 @@ public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenc void logSpecialPermissionChange(boolean newState, String packageName) { int logCategory = newState ? MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW : MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY; - FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action(getContext(), - logCategory, packageName); + final MetricsFeatureProvider metricsFeatureProvider = + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider(); + metricsFeatureProvider.action( + metricsFeatureProvider.getAttribution(getActivity()), + logCategory, + getMetricsCategory(), + packageName, + 0); } @Override diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index 12c4d9d7f2c..6d726b9eed9 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -51,6 +51,7 @@ import com.android.settings.Utils; import com.android.settings.applications.ApplicationFeatureProvider; import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminAdd; import com.android.settings.core.BasePreferenceController; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.overlay.FeatureFactory; import com.android.settings.widget.ActionButtonPreference; @@ -106,7 +107,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp private final UserManager mUserManager; private final PackageManager mPm; private final SettingsActivity mActivity; - private final Fragment mFragment; + private final InstrumentedPreferenceFragment mFragment; private final MetricsFeatureProvider mMetricsFeatureProvider; private final ApplicationFeatureProvider mApplicationFeatureProvider; private final int mUserId; @@ -119,7 +120,8 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp private boolean mFinishing = false; private boolean mAppsControlDisallowedBySystem; - public AppButtonsPreferenceController(SettingsActivity activity, Fragment fragment, + public AppButtonsPreferenceController(SettingsActivity activity, + InstrumentedPreferenceFragment fragment, Lifecycle lifecycle, String packageName, ApplicationsState state, int requestUninstall, int requestRemoveDeviceAdmin) { super(activity, KEY_ACTION_BUTTONS); @@ -517,8 +519,12 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp @VisibleForTesting void forceStopPackage(String pkgName) { - FeatureFactory.getFactory(mContext).getMetricsFeatureProvider().action(mContext, - MetricsProto.MetricsEvent.ACTION_APP_FORCE_STOP, pkgName); + mMetricsFeatureProvider.action( + mMetricsFeatureProvider.getAttribution(mActivity), + MetricsProto.MetricsEvent.ACTION_APP_FORCE_STOP, + mFragment.getMetricsCategory(), + pkgName, + 0); ActivityManager am = (ActivityManager) mActivity.getSystemService( Context.ACTIVITY_SERVICE); Log.d(TAG, "Stopping package " + pkgName); diff --git a/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java b/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java index 8405c618dc4..f0d1068fd58 100644 --- a/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java +++ b/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java @@ -42,6 +42,7 @@ import com.android.settings.applications.AppStateOverlayBridge; import com.android.settings.applications.AppStateOverlayBridge.OverlayState; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.applications.ApplicationsState.AppEntry; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenceChangeListener, OnPreferenceClickListener { @@ -129,8 +130,14 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc void logSpecialPermissionChange(boolean newState, String packageName) { int logCategory = newState ? MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW : MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_DENY; - FeatureFactory.getFactory(getContext()) - .getMetricsFeatureProvider().action(getContext(), logCategory, packageName); + final MetricsFeatureProvider metricsFeatureProvider = + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider(); + metricsFeatureProvider.action( + metricsFeatureProvider.getAttribution(getActivity()), + logCategory, + getMetricsCategory(), + packageName, + 0); } @Override diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java index 9a337a5943f..14bf1ef82d4 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java +++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java @@ -17,12 +17,12 @@ package com.android.settings.applications.defaultapps; import android.app.Dialog; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.DialogInterface; import android.content.pm.PackageManager; import android.os.Bundle; import android.text.TextUtils; -import android.util.Pair; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; @@ -69,11 +69,12 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment @Override protected void onRadioButtonConfirmed(String selectedKey) { - mMetricsFeatureProvider.action(getContext(), + mMetricsFeatureProvider.action( + mMetricsFeatureProvider.getAttribution(getActivity()), MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP, + getMetricsCategory(), selectedKey, - Pair.create(MetricsEvent.FIELD_CONTEXT, getMetricsCategory())); - + 0 /* value */); super.onRadioButtonConfirmed(selectedKey); } diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java index 7c05bab1d20..a260f678db5 100644 --- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java +++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java @@ -23,6 +23,7 @@ import android.app.Dialog; import android.app.admin.DeviceAdminInfo; import android.app.admin.DeviceAdminReceiver; import android.app.admin.DevicePolicyManager; +import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; @@ -489,7 +490,12 @@ public class DeviceAdminAdd extends Activity { void logSpecialPermissionChange(boolean allow, String packageName) { int logCategory = allow ? MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW : MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY; - FeatureFactory.getFactory(this).getMetricsFeatureProvider().action(this, logCategory, packageName); + FeatureFactory.getFactory(this).getMetricsFeatureProvider().action( + SettingsEnums.PAGE_UNKNOWN, + logCategory, + SettingsEnums.PAGE_UNKNOWN, + packageName, + 0); } @Override diff --git a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java index 33a779fd9e7..c36c97ad34e 100644 --- a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java +++ b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java @@ -33,6 +33,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.applications.AppInfoWithHeader; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; public class PictureInPictureDetails extends AppInfoWithHeader implements OnPreferenceChangeListener { @@ -99,7 +100,7 @@ public class PictureInPictureDetails extends AppInfoWithHeader /** * @return whether the app associated with the given {@param packageName} is allowed to enter - * picture-in-picture. + * picture-in-picture. */ static boolean getEnterPipStateForPackage(Context context, int uid, String packageName) { final AppOpsManager appOps = context.getSystemService(AppOpsManager.class); @@ -108,7 +109,7 @@ public class PictureInPictureDetails extends AppInfoWithHeader /** * @return the summary for the current state of whether the app associated with the given - * {@param packageName} is allowed to enter picture-in-picture. + * {@param packageName} is allowed to enter picture-in-picture. */ public static int getPreferenceSummary(Context context, int uid, String packageName) { final boolean enabled = PictureInPictureDetails.getEnterPipStateForPackage(context, uid, @@ -122,7 +123,13 @@ public class PictureInPictureDetails extends AppInfoWithHeader int logCategory = newState ? MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW : MetricsEvent.APP_PICTURE_IN_PICTURE_DENY; - FeatureFactory.getFactory(getContext()) - .getMetricsFeatureProvider().action(getContext(), logCategory, packageName); + final MetricsFeatureProvider metricsFeatureProvider = + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider(); + metricsFeatureProvider.action( + metricsFeatureProvider.getAttribution(getActivity()), + logCategory, + getMetricsCategory(), + packageName, + 0); } } diff --git a/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java b/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java index 5c0d4b145aa..2ccf64ff5e1 100644 --- a/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java +++ b/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java @@ -44,6 +44,7 @@ import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.Callbacks; import com.android.settingslib.applications.ApplicationsState.Session; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.FooterPreference; @@ -126,8 +127,15 @@ public class PremiumSmsAccess extends EmptyTextSettings break; } if (category != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) { - FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action( - getContext(), category, packageName); + // TODO(117860032): Category is wrong. It should be defined in SettingsEnums. + final MetricsFeatureProvider metricsFeatureProvider = + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider(); + metricsFeatureProvider.action( + metricsFeatureProvider.getAttribution(getActivity()), + category, + getMetricsCategory(), + packageName, + smsState); } } @@ -214,7 +222,7 @@ public class PremiumSmsAccess extends EmptyTextSettings setIcon(mAppEntry.icon); } setEntries(R.array.security_settings_premium_sms_values); - setEntryValues(new CharSequence[] { + setEntryValues(new CharSequence[]{ String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER), String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW), String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW), diff --git a/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettings.java b/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettings.java index cad59571c58..b0c745dae6a 100644 --- a/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettings.java +++ b/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettings.java @@ -29,6 +29,7 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.utils.ManagedServiceSettings; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; @@ -73,8 +74,14 @@ public class VrListenerSettings extends ManagedServiceSettings { void logSpecialPermissionChange(boolean enable, String packageName) { int logCategory = enable ? MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW : MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_DENY; - FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action(getContext(), - logCategory, packageName); + final MetricsFeatureProvider metricsFeatureProvider = + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider(); + metricsFeatureProvider.action( + metricsFeatureProvider.getAttribution(getActivity()), + logCategory, + getMetricsCategory(), + packageName, + 0); } public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = diff --git a/src/com/android/settings/core/instrumentation/StatsLogWriter.java b/src/com/android/settings/core/instrumentation/StatsLogWriter.java index 2617259235d..b6644c677fa 100644 --- a/src/com/android/settings/core/instrumentation/StatsLogWriter.java +++ b/src/com/android/settings/core/instrumentation/StatsLogWriter.java @@ -18,8 +18,8 @@ package com.android.settings.core.instrumentation; import android.app.settings.SettingsEnums; import android.content.Context; -import android.util.Pair; import android.util.StatsLog; +import android.util.Pair; import com.android.settingslib.core.instrumentation.LogWriter; @@ -45,7 +45,7 @@ public class StatsLogWriter implements LogWriter { 0 /* changedPreferenceIntValue */); } - @Override + @Override public void action(Context context, int action, Pair... taggedData) { action(SettingsEnums.PAGE_UNKNOWN /* attribution */, action, @@ -73,8 +73,7 @@ public class StatsLogWriter implements LogWriter { } @Override - public void action(Context context, int action, String pkg, - Pair... taggedData) { + public void action(Context context, int action, String pkg) { action(SettingsEnums.PAGE_UNKNOWN /* attribution */, action, SettingsEnums.PAGE_UNKNOWN /* pageId */, diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java index 00111770104..b755ba7861a 100644 --- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java +++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java @@ -19,12 +19,9 @@ package com.android.settings.dashboard.suggestions; import android.content.ComponentName; import android.content.Context; import android.content.SharedPreferences; -import android.service.settings.suggestions.Suggestion; import androidx.annotation.NonNull; -import com.android.settingslib.suggestions.SuggestionControllerMixinCompat; - /** Interface should be implemented if you have added new suggestions */ public interface SuggestionFeatureProvider { @@ -45,10 +42,4 @@ public interface SuggestionFeatureProvider { * Returns the {@link SharedPreferences} that holds metadata for suggestions. */ SharedPreferences getSharedPrefs(Context context); - - /** - * Dismisses a suggestion. - */ - void dismissSuggestion(Context context, SuggestionControllerMixinCompat suggestionMixin, - Suggestion suggestion); } diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java index 39d0299c0f5..bfa44e5216e 100644 --- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java @@ -20,12 +20,9 @@ import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.SharedPreferences; -import android.service.settings.suggestions.Suggestion; -import android.util.Log; import androidx.annotation.NonNull; -import com.android.internal.logging.nano.MetricsProto; import com.android.settings.Settings.NightDisplaySuggestionActivity; import com.android.settings.biometrics.fingerprint.FingerprintEnrollSuggestionActivity; import com.android.settings.biometrics.fingerprint.FingerprintSuggestionActivity; @@ -37,10 +34,6 @@ import com.android.settings.password.ScreenLockSuggestionActivity; import com.android.settings.wallpaper.WallpaperSuggestionActivity; import com.android.settings.wifi.calling.WifiCallingSuggestionActivity; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; -import com.android.settingslib.drawer.Tile; -import com.android.settingslib.suggestions.SuggestionControllerMixinCompat; - -import java.util.List; public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider { @@ -95,16 +88,4 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider mMetricsFeatureProvider = FeatureFactory.getFactory(appContext) .getMetricsFeatureProvider(); } - - @Override - public void dismissSuggestion(Context context, SuggestionControllerMixinCompat mixin, - Suggestion suggestion) { - if (mixin == null || suggestion == null || context == null) { - return; - } - mMetricsFeatureProvider.action( - context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION, - suggestion.getId()); - mixin.dismissSuggestion(suggestion); - } } diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java index 6256e23dcde..65492d5b054 100644 --- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java +++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java @@ -26,16 +26,15 @@ import android.os.UserHandle; import android.os.UserManager; import android.text.BidiFormatter; import android.text.TextUtils; -import android.util.Pair; import android.widget.Toast; -import androidx.fragment.app.Fragment; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.Utils; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockSettingsHelper; @@ -57,7 +56,7 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle private static final String KEY_BUILD_NUMBER = "build_number"; private final Activity mActivity; - private final Fragment mFragment; + private final InstrumentedPreferenceFragment mFragment; private final UserManager mUm; private final MetricsFeatureProvider mMetricsFeatureProvider; @@ -67,8 +66,8 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle private int mDevHitCountdown; private boolean mProcessingLastDevHit; - public BuildNumberPreferenceController(Context context, Activity activity, Fragment fragment, - Lifecycle lifecycle) { + public BuildNumberPreferenceController(Context context, Activity activity, + InstrumentedPreferenceFragment fragment, Lifecycle lifecycle) { super(context); mActivity = activity; mFragment = fragment; @@ -145,7 +144,7 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle .setPackage(componentName.getPackageName()) .setAction("com.android.settings.action.REQUEST_DEBUG_FEATURES"); final ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity( - requestDebugFeatures, 0); + requestDebugFeatures, 0); if (resolveInfo != null) { mContext.startActivity(requestDebugFeatures); return false; @@ -176,9 +175,11 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle enableDevelopmentSettings(); } mMetricsFeatureProvider.action( - mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF, - Pair.create(MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED, - mProcessingLastDevHit ? 0 : 1)); + mMetricsFeatureProvider.getAttribution(mActivity), + MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED, + mFragment.getMetricsCategory(), + null, + mProcessingLastDevHit ? 0 : 1); } else if (mDevHitCountdown > 0 && mDevHitCountdown < (TAPS_TO_BE_A_DEVELOPER - 2)) { if (mDevHitToast != null) { @@ -191,10 +192,13 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle Toast.LENGTH_SHORT); mDevHitToast.show(); } + mMetricsFeatureProvider.action( - mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF, - Pair.create(MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED, - 0)); + mMetricsFeatureProvider.getAttribution(mActivity), + MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED, + mFragment.getMetricsCategory(), + null, + 0); } else if (mDevHitCountdown < 0) { if (mDevHitToast != null) { mDevHitToast.cancel(); @@ -203,9 +207,11 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle Toast.LENGTH_LONG); mDevHitToast.show(); mMetricsFeatureProvider.action( - mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF, - Pair.create(MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED, - 1)); + mMetricsFeatureProvider.getAttribution(mActivity), + MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED, + mFragment.getMetricsCategory(), + null, + 1); } return true; } diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java index b3be061dd7a..2534d083b4c 100644 --- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java +++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java @@ -26,6 +26,7 @@ import android.app.job.JobParameters; import android.app.job.JobScheduler; import android.app.job.JobService; import android.app.job.JobWorkItem; +import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; @@ -35,7 +36,6 @@ import android.os.StatsDimensionsValue; import android.os.UserManager; import android.provider.Settings; import android.util.Log; -import android.util.Pair; import androidx.annotation.GuardedBy; import androidx.annotation.VisibleForTesting; @@ -146,20 +146,18 @@ public class AnomalyDetectionJobService extends JobService { final int uid = extractUidFromStatsDimensionsValue(intentDimsValue); final boolean autoFeatureOn = powerUsageFeatureProvider.isSmartBatterySupported() ? Settings.Global.getInt(contentResolver, - Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON) == ON + Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON) == ON : Settings.Global.getInt(contentResolver, Settings.Global.APP_AUTO_RESTRICTION_ENABLED, ON) == ON; final String packageName = batteryUtils.getPackageName(uid); final long versionCode = batteryUtils.getAppLongVersionCode(packageName); - + final String versionedPackage = packageName + "/" + versionCode; if (batteryUtils.shouldHideAnomaly(powerWhitelistBackend, uid, anomalyInfo)) { - metricsFeatureProvider.action(context, + metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED, - packageName, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, - anomalyInfo.anomalyType), - Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, - versionCode)); + SettingsEnums.PAGE_UNKNOWN, + versionedPackage, + anomalyInfo.anomalyType); } else { if (autoFeatureOn && anomalyInfo.autoRestriction) { // Auto restrict this app @@ -173,13 +171,11 @@ public class AnomalyDetectionJobService extends JobService { AnomalyDatabaseHelper.State.NEW, timeMs); } - metricsFeatureProvider.action(context, + metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED, - packageName, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, - anomalyInfo.anomalyType), - Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, - versionCode)); + SettingsEnums.PAGE_UNKNOWN, + versionedPackage, + anomalyInfo.anomalyType); } } catch (NullPointerException | IndexOutOfBoundsException e) { diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java index ac946df571d..d52a9676c23 100644 --- a/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java +++ b/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java @@ -17,8 +17,8 @@ package com.android.settings.fuelgauge.batterytip.actions; import android.app.AppOpsManager; +import android.app.settings.SettingsEnums; import android.content.Context; -import android.util.Pair; import androidx.annotation.VisibleForTesting; @@ -64,15 +64,18 @@ public class RestrictAppAction extends BatteryTipAction { AppOpsManager.MODE_IGNORED); if (CollectionUtils.isEmpty(appInfo.anomalyTypes)) { // Only log context if there is no anomaly type - mMetricsFeatureProvider.action(mContext, - MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, packageName, - Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey)); + mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, + metricsKey, + packageName, + 0); } else { for (int type : appInfo.anomalyTypes) { - mMetricsFeatureProvider.action(mContext, - MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, packageName, - Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey), - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, type)); + mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, + metricsKey, + packageName, + type); } } } diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java index 419e0431345..db882e5bac7 100644 --- a/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java +++ b/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java @@ -17,8 +17,8 @@ package com.android.settings.fuelgauge.batterytip.actions; import android.app.AppOpsManager; +import android.app.settings.SettingsEnums; import android.content.Context; -import android.util.Pair; import androidx.annotation.VisibleForTesting; @@ -50,8 +50,11 @@ public class UnrestrictAppAction extends BatteryTipAction { // Clear force app standby, then app can run in the background mBatteryUtils.setForceAppStandby(appInfo.uid, appInfo.packageName, AppOpsManager.MODE_ALLOWED); - mMetricsFeatureProvider.action(mContext, - MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, appInfo.packageName, - Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey)); + mMetricsFeatureProvider.action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, + metricsKey, + appInfo.packageName, + 0); } } diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java index 4ff0d28cd6f..f16673484ec 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java @@ -16,11 +16,11 @@ package com.android.settings.fuelgauge.batterytip.tips; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.res.Resources; import android.icu.text.ListFormatter; import android.os.Parcel; -import android.util.Pair; import androidx.annotation.VisibleForTesting; @@ -126,12 +126,12 @@ public class RestrictAppTip extends BatteryTip { for (int i = 0, size = mRestrictAppList.size(); i < size; i++) { final AppInfo appInfo = mRestrictAppList.get(i); for (Integer anomalyType : appInfo.anomalyTypes) { - metricsFeatureProvider.action(context, + metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST, + SettingsEnums.PAGE_UNKNOWN, appInfo.packageName, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, anomalyType)); + anomalyType); } - } } } diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java index 4b86f336332..2860e9a7544 100644 --- a/src/com/android/settings/slices/SliceBroadcastReceiver.java +++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java @@ -17,24 +17,20 @@ package com.android.settings.slices; import static com.android.settings.bluetooth.BluetoothSliceBuilder.ACTION_BLUETOOTH_SLICE_CHANGED; -import static com.android.settings.flashlight.FlashlightSliceBuilder - .ACTION_FLASHLIGHT_SLICE_CHANGED; -import static com.android.settings.network.telephony.Enhanced4gLteSliceHelper - .ACTION_ENHANCED_4G_LTE_CHANGED; +import static com.android.settings.flashlight.FlashlightSliceBuilder.ACTION_FLASHLIGHT_SLICE_CHANGED; +import static com.android.settings.network.telephony.Enhanced4gLteSliceHelper.ACTION_ENHANCED_4G_LTE_CHANGED; import static com.android.settings.notification.ZenModeSliceBuilder.ACTION_ZEN_MODE_SLICE_CHANGED; +import static com.android.settings.slices.SettingsSliceProvider.ACTION_COPY; import static com.android.settings.slices.SettingsSliceProvider.ACTION_SLIDER_CHANGED; import static com.android.settings.slices.SettingsSliceProvider.ACTION_TOGGLE_CHANGED; -import static com.android.settings.slices.SettingsSliceProvider.ACTION_COPY; import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_KEY; import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_PLATFORM_DEFINED; import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_CHANGED; -import static com.android.settings.wifi.calling.WifiCallingSliceHelper - .ACTION_WIFI_CALLING_PREFERENCE_CELLULAR_PREFERRED; -import static com.android.settings.wifi.calling.WifiCallingSliceHelper - .ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY; -import static com.android.settings.wifi.calling.WifiCallingSliceHelper - .ACTION_WIFI_CALLING_PREFERENCE_WIFI_PREFERRED; +import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_PREFERENCE_CELLULAR_PREFERRED; +import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY; +import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_PREFERENCE_WIFI_PREFERRED; +import android.app.settings.SettingsEnums; import android.app.slice.Slice; import android.content.BroadcastReceiver; import android.content.ContentResolver; @@ -44,7 +40,6 @@ import android.net.Uri; import android.provider.SettingsSlicesContract; import android.text.TextUtils; import android.util.Log; -import android.util.Pair; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.bluetooth.BluetoothSliceBuilder; @@ -216,12 +211,11 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { * follows the pattern in SharedPreferenceLogger. */ private void logSliceValueChange(Context context, String sliceKey, int newValue) { - final Pair namePair = Pair.create( - MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceKey); - final Pair valuePair = Pair.create( - MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE, newValue); FeatureFactory.getFactory(context).getMetricsFeatureProvider() - .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED, namePair, valuePair); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED, + SettingsEnums.PAGE_UNKNOWN, + sliceKey, newValue); } private BasePreferenceController getPreferenceController(Context context, String key) { diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java index f6cc57f4f0e..f18225ade27 100644 --- a/src/com/android/settings/slices/SliceBuilderUtils.java +++ b/src/com/android/settings/slices/SliceBuilderUtils.java @@ -22,6 +22,7 @@ import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_PLAT import android.annotation.ColorInt; import android.app.PendingIntent; +import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -77,12 +78,12 @@ public class SliceBuilderUtils { public static Slice buildSlice(Context context, SliceData sliceData) { Log.d(TAG, "Creating slice for: " + sliceData.getPreferenceController()); final BasePreferenceController controller = getPreferenceController(context, sliceData); - final Pair sliceNamePair = - Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceData.getKey()); - // Log Slice requests using the same schema as SharedPreferenceLogger (but with a different - // action name). FeatureFactory.getFactory(context).getMetricsFeatureProvider() - .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, sliceNamePair); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, + SettingsEnums.PAGE_UNKNOWN, + sliceData.getKey(), + 0); if (!controller.isAvailable()) { // Cannot guarantee setting page is accessible, let the presenter handle error case. diff --git a/tests/robotests/src/com/android/settings/applications/UsageAccessDetailsTest.java b/tests/robotests/src/com/android/settings/applications/UsageAccessDetailsTest.java index f9cb01b9881..183468905c5 100644 --- a/tests/robotests/src/com/android/settings/applications/UsageAccessDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/UsageAccessDetailsTest.java @@ -18,12 +18,10 @@ package com.android.settings.applications; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.nullable; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import android.content.Context; +import android.app.settings.SettingsEnums; import android.os.Bundle; import com.android.internal.logging.nano.MetricsProto; @@ -54,12 +52,20 @@ public class UsageAccessDetailsTest { @Test public void logSpecialPermissionChange() { mFragment.logSpecialPermissionChange(true, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW, + mFragment.getMetricsCategory(), + "app", + 0); mFragment.logSpecialPermissionChange(false, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY, + mFragment.getMetricsCategory(), + "app", + 0); } @Test diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java index 44ace780c82..f7b27003aa8 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java @@ -35,6 +35,7 @@ import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.app.Application; import android.app.admin.DevicePolicyManager; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -42,10 +43,9 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.UserManager; -import androidx.fragment.app.Fragment; - import com.android.settings.R; import com.android.settings.SettingsActivity; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.widget.ActionButtonPreference; @@ -377,12 +377,17 @@ public class AppButtonsPreferenceControllerTest { * The test fragment which implements * {@link ButtonActionDialogFragment.AppButtonsDialogListener} */ - public static class TestFragment extends Fragment + public static class TestFragment extends InstrumentedPreferenceFragment implements ButtonActionDialogFragment.AppButtonsDialogListener { @Override public void handleDialogClick(int type) { // Do nothing } + + @Override + public int getMetricsCategory() { + return SettingsEnums.PAGE_UNKNOWN; + } } } diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java index 1b25286cef8..4093cba68de 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java @@ -19,12 +19,10 @@ package com.android.settings.applications.appinfo; import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import static org.junit.Assert.assertEquals; -import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.nullable; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.content.Context; +import android.app.settings.SettingsEnums; import android.view.Window; import android.view.WindowManager.LayoutParams; @@ -75,12 +73,14 @@ public class DrawOverlayDetailsTest { when(mFragment.getContext()).thenReturn(RuntimeEnvironment.application); mFragment.logSpecialPermissionChange(true, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW, + mFragment.getMetricsCategory(), "app", 0); mFragment.logSpecialPermissionChange(false, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_DENY), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_DENY, + mFragment.getMetricsCategory(), "app", 0); } @Test diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java index 541954b7822..de602badec1 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java @@ -17,15 +17,14 @@ package com.android.settings.applications.defaultapps; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.settings.SettingsEnums; import android.content.Context; import android.os.UserManager; -import android.util.Pair; import androidx.fragment.app.FragmentActivity; import androidx.preference.PreferenceScreen; @@ -89,10 +88,12 @@ public class DefaultAppPickerFragmentTest { mFragment.onAttach((Context) mActivity); mFragment.onRadioButtonConfirmed("test_pkg"); - verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class), - eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP), - eq("test_pkg"), - any(Pair.class)); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP, + mFragment.getMetricsCategory(), + "test_pkg", + 0); } public static class TestFragment extends DefaultAppPickerFragment { diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java index 6bc143ca25b..eaccdc0ac4b 100644 --- a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java +++ b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java @@ -16,10 +16,8 @@ package com.android.settings.applications.specialaccess.deviceadmin; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; @@ -29,7 +27,7 @@ import static org.mockito.Mockito.when; import android.app.AppOpsManager; import android.app.admin.DeviceAdminInfo; -import android.content.Context; +import android.app.settings.SettingsEnums; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.fuelgauge.BatteryUtils; @@ -73,12 +71,20 @@ public class DeviceAdminAddTest { @Test public void logSpecialPermissionChange() { mDeviceAdminAdd.logSpecialPermissionChange(true, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW, + SettingsEnums.PAGE_UNKNOWN, + "app", + 0); mDeviceAdminAdd.logSpecialPermissionChange(false, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY, + SettingsEnums.PAGE_UNKNOWN, + "app", + 0); } @Test diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetailsTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetailsTest.java index 9d53f956103..b3d695849f4 100644 --- a/tests/robotests/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetailsTest.java +++ b/tests/robotests/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetailsTest.java @@ -18,11 +18,9 @@ package com.android.settings.applications.specialaccess.pictureinpicture; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.nullable; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; -import android.content.Context; +import android.app.settings.SettingsEnums; import android.content.pm.ActivityInfo; import com.android.internal.logging.nano.MetricsProto; @@ -75,12 +73,20 @@ public class PictureInPictureDetailsTest { @Test public void logSpecialPermissionChange() { mFragment.logSpecialPermissionChange(true, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW, + mFragment.getMetricsCategory(), + "app", + 0); mFragment.logSpecialPermissionChange(false, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_DENY), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_DENY, + mFragment.getMetricsCategory(), + "app", + 0); } private boolean checkPackageHasPictureInPictureActivities(String packageName, diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccessTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccessTest.java index 3978825474e..1f32b18da0e 100644 --- a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccessTest.java +++ b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccessTest.java @@ -16,11 +16,9 @@ package com.android.settings.applications.specialaccess.premiumsms; -import static org.mockito.ArgumentMatchers.nullable; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; -import android.content.Context; +import android.app.settings.SettingsEnums; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.telephony.SmsUsageMonitor; @@ -51,18 +49,29 @@ public class PremiumSmsAccessTest { public void logSpecialPermissionChange() { mFragment.logSpecialPermissionChange(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ASK), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ASK, + mFragment.getMetricsCategory(), + "app", + SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER); mFragment.logSpecialPermissionChange(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_DENY), eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_DENY, + mFragment.getMetricsCategory(), + "app", + SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW); mFragment.logSpecialPermissionChange(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ALWAYS_ALLOW), - eq("app")); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ALWAYS_ALLOW, + mFragment.getMetricsCategory(), + "app", + SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW); } } diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettingsTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettingsTest.java index 4f5b2bbed1d..3f0bc1d3895 100644 --- a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettingsTest.java +++ b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettingsTest.java @@ -16,11 +16,7 @@ package com.android.settings.applications.specialaccess.vrlistener; -import static org.mockito.ArgumentMatchers.nullable; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.verify; - -import android.content.Context; +import android.app.settings.SettingsEnums; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.testutils.FakeFeatureFactory; @@ -47,11 +43,19 @@ public class VrListenerSettingsTest { @Test public void logSpecialPermissionChange() { mFragment.logSpecialPermissionChange(true, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW), eq("app")); + mFeatureFactory.metricsFeatureProvider.action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW, + SettingsEnums.PAGE_UNKNOWN, + "app", + 0); mFragment.logSpecialPermissionChange(false, "app"); - verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), - eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_DENY), eq("app")); + mFeatureFactory.metricsFeatureProvider.action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_DENY, + SettingsEnums.PAGE_UNKNOWN, + "app", + 0); } } diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java index f9a737942a2..3c97f489360 100644 --- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java @@ -18,10 +18,6 @@ package com.android.settings.dashboard.suggestions; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.app.ActivityManager; @@ -31,13 +27,10 @@ import android.content.pm.PackageManager; import android.hardware.fingerprint.FingerprintManager; import android.service.settings.suggestions.Suggestion; -import com.android.internal.logging.nano.MetricsProto; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.ShadowSecureSettings; -import com.android.settingslib.drawer.CategoryKey; -import com.android.settingslib.drawer.Tile; import com.android.settingslib.suggestions.SuggestionControllerMixinCompat; import org.junit.After; @@ -49,9 +42,6 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; -import java.util.ArrayList; -import java.util.List; - @RunWith(SettingsRobolectricTestRunner.class) @Config(shadows = ShadowSecureSettings.class) public class SuggestionFeatureProviderImplTest { @@ -111,36 +101,8 @@ public class SuggestionFeatureProviderImplTest { } @Test - public void isSuggestionV2Enabled_isNotLowMemoryDevice_shouldReturnTrue() { + public void isSuggestionEnabled_isNotLowMemoryDevice_shouldReturnTrue() { when(mActivityManager.isLowRamDevice()).thenReturn(false); assertThat(mProvider.isSuggestionEnabled(mContext)).isTrue(); } - - @Test - public void dismissSuggestion_noControllerOrSuggestion_noop() { - mProvider.dismissSuggestion(mContext, null, null); - mProvider.dismissSuggestion(mContext, mSuggestionControllerMixin, null); - mProvider.dismissSuggestion(mContext, null, new Suggestion.Builder("id").build()); - - verifyZeroInteractions(mFactory.metricsFeatureProvider); - verifyZeroInteractions(mSuggestionControllerMixin); - } - - @Test - public void dismissSuggestion_noContext_shouldDoNothing() { - mProvider.dismissSuggestion(null, mSuggestionControllerMixin, mSuggestion); - - verifyZeroInteractions(mFactory.metricsFeatureProvider); - } - - @Test - public void dismissSuggestion_shouldLogAndDismiss() { - mProvider.dismissSuggestion(mContext, mSuggestionControllerMixin, mSuggestion); - - verify(mFactory.metricsFeatureProvider).action( - eq(mContext), - eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION), - anyString()); - verify(mSuggestionControllerMixin).dismissSuggestion(mSuggestion); - } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java index c88237d7b7c..9bec78d2bcd 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java @@ -33,12 +33,12 @@ import android.os.UserManager; import android.provider.Settings; import android.text.BidiFormatter; -import androidx.fragment.app.Fragment; import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowUtils; @@ -64,7 +64,7 @@ public class BuildNumberPreferenceControllerTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Activity mActivity; @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private Fragment mFragment; + private InstrumentedPreferenceFragment mFragment; @Mock(answer = RETURNS_DEEP_STUBS) private PreferenceScreen mScreen; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java index 8622e658c10..11b22ddc3e6 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java @@ -43,13 +43,13 @@ import android.app.job.JobInfo; import android.app.job.JobParameters; import android.app.job.JobScheduler; import android.app.job.JobWorkItem; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Process; import android.os.StatsDimensionsValue; import android.os.UserManager; -import android.util.Pair; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; @@ -174,11 +174,11 @@ public class AnomalyDetectionJobServiceTest { verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(), anyInt(), anyLong()); - verify(mFeatureFactory.metricsFeatureProvider).action(mContext, + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED, - SYSTEM_PACKAGE, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE), - Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE)); + SettingsEnums.PAGE_UNKNOWN, + SYSTEM_PACKAGE + "/" + VERSION_CODE, + ANOMALY_TYPE); } @Test @@ -229,11 +229,11 @@ public class AnomalyDetectionJobServiceTest { verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6), eq(AnomalyDatabaseHelper.State.AUTO_HANDLED), anyLong()); - verify(mFeatureFactory.metricsFeatureProvider).action(mContext, + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED, - SYSTEM_PACKAGE, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE), - Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE)); + SettingsEnums.PAGE_UNKNOWN, + SYSTEM_PACKAGE + "/" + VERSION_CODE, + ANOMALY_TYPE); } @Test @@ -254,11 +254,11 @@ public class AnomalyDetectionJobServiceTest { verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6), eq(AnomalyDatabaseHelper.State.NEW), anyLong()); - verify(mFeatureFactory.metricsFeatureProvider).action(mContext, + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED, - SYSTEM_PACKAGE, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE), - Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE)); + SettingsEnums.PAGE_UNKNOWN, + SYSTEM_PACKAGE + "/" + VERSION_CODE, + ANOMALY_TYPE); } @Test diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java index 0d6f9c55ba6..86c6714ef83 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java @@ -18,7 +18,7 @@ package com.android.settings.fuelgauge.batterytip.actions; import static org.mockito.Mockito.verify; import android.app.AppOpsManager; -import android.util.Pair; +import android.app.settings.SettingsEnums; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.fuelgauge.BatteryUtils; @@ -91,16 +91,13 @@ public class RestrictAppActionTest { .setForceAppStandby(UID_1, PACKAGE_NAME_1, AppOpsManager.MODE_IGNORED); verify(mBatteryUtils) .setForceAppStandby(UID_2, PACKAGE_NAME_2, AppOpsManager.MODE_IGNORED); - verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application, - MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_1, Pair.create( - MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY)); - verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application, - MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_2, - Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY), - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKEUP)); - verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application, - MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_2, - Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY), - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_BT)); + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_1, 0); + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_2, + ANOMALY_WAKEUP); + verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_2, + ANOMALY_BT); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java index c44ae786bf3..f57284a05e9 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java @@ -18,7 +18,7 @@ package com.android.settings.fuelgauge.batterytip.actions; import static org.mockito.Mockito.verify; import android.app.AppOpsManager; -import android.util.Pair; +import android.app.settings.SettingsEnums; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.fuelgauge.BatteryUtils; @@ -75,8 +75,11 @@ public class UnrestrictAppActionTest { verify(mBatteryUtils) .setForceAppStandby(UID_1, PACKAGE_NAME_1, AppOpsManager.MODE_ALLOWED); - verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application, - MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, PACKAGE_NAME_1, Pair.create( - MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY)); + verify(mFeatureFactory.metricsFeatureProvider).action( + SettingsEnums.PAGE_UNKNOWN, + MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, + METRICS_KEY, + PACKAGE_NAME_1, + 0); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java index 317e4266431..d4a10bce476 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java @@ -17,7 +17,6 @@ package com.android.settings.fuelgauge.batterytip.tips; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doReturn; @@ -26,11 +25,11 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Parcel; -import android.util.Pair; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; @@ -99,7 +98,8 @@ public class RestrictAppTipTest { mUsageAppList.add(mAppInfo); mNewBatteryTip = new RestrictAppTip(BatteryTip.StateType.NEW, mUsageAppList); mHandledBatteryTip = new RestrictAppTip(BatteryTip.StateType.HANDLED, mUsageAppList); - mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>()); + mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE, + new ArrayList<>()); } @After @@ -142,7 +142,7 @@ public class RestrictAppTipTest { @Test public void getSummary_stateNew_showRestrictSummary() { assertThat(mNewBatteryTip.getSummary(mContext)) - .isEqualTo("app has high background battery usage"); + .isEqualTo("app has high background battery usage"); } @Test @@ -226,14 +226,16 @@ public class RestrictAppTipTest { verify(mMetricsFeatureProvider).action(mContext, MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.NEW); - verify(mMetricsFeatureProvider).action(mContext, + verify(mMetricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST, + SettingsEnums.PAGE_UNKNOWN, PACKAGE_NAME, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKEUP)); - verify(mMetricsFeatureProvider).action(mContext, + ANOMALY_WAKEUP); + verify(mMetricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN, MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST, + SettingsEnums.PAGE_UNKNOWN, PACKAGE_NAME, - Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKELOCK)); + ANOMALY_WAKELOCK); } @Test @@ -242,7 +244,8 @@ public class RestrictAppTipTest { verify(mMetricsFeatureProvider).action(mContext, MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.HANDLED); - verify(mMetricsFeatureProvider, never()).action(any(), anyInt(), anyString(), any()); + verify(mMetricsFeatureProvider, never()).action( + anyInt(), anyInt(), anyInt(), anyString(), anyInt()); } } diff --git a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java index 4e09632c9b2..bd59179b2b6 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java @@ -28,6 +28,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.settings.SettingsEnums; import android.app.slice.Slice; import android.content.ContentResolver; import android.content.ContentValues; @@ -37,7 +38,6 @@ import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.provider.Settings; import android.provider.SettingsSlicesContract; -import android.util.Pair; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.core.BasePreferenceController; @@ -54,7 +54,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) @@ -72,8 +71,6 @@ public class SliceBroadcastReceiverTest { private SliceBroadcastReceiver mReceiver; private SearchFeatureProvider mSearchFeatureProvider; private FakeFeatureFactory mFakeFeatureFactory; - private ArgumentCaptor> mLoggingNameArgumentCatpor; - private ArgumentCaptor> mLoggingValueArgumentCatpor; @Before public void setUp() { @@ -88,8 +85,6 @@ public class SliceBroadcastReceiverTest { CustomSliceManager manager = new CustomSliceManager(mContext); when(mFakeFeatureFactory.slicesFeatureProvider.getCustomSliceManager(any())) .thenReturn(manager); - mLoggingNameArgumentCatpor = ArgumentCaptor.forClass(Pair.class); - mLoggingValueArgumentCatpor = ArgumentCaptor.forClass(Pair.class); } @After @@ -123,20 +118,12 @@ public class SliceBroadcastReceiverTest { assertThat(fakeToggleController.isChecked()).isFalse(); verify(mFakeFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), - eq(MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED), - mLoggingNameArgumentCatpor.capture(), - mLoggingValueArgumentCatpor.capture()); - - final Pair namePair = mLoggingNameArgumentCatpor.getValue(); - final Pair valuePair = mLoggingValueArgumentCatpor.getValue(); - assertThat(namePair.first).isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(namePair.second).isEqualTo(fakeToggleController.getPreferenceKey()); - + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED, + SettingsEnums.PAGE_UNKNOWN, + fakeToggleController.getPreferenceKey(), + 0); verify(resolver).notifyChange(uri, null); - assertThat(valuePair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE); - assertThat(valuePair.second).isEqualTo(0); } @Test @@ -229,20 +216,13 @@ public class SliceBroadcastReceiverTest { assertThat(fakeSliderController.getSliderPosition()).isEqualTo(position); verify(mFakeFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), - eq(MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED), - mLoggingNameArgumentCatpor.capture(), - mLoggingValueArgumentCatpor.capture()); - - final Pair namePair = mLoggingNameArgumentCatpor.getValue(); - final Pair valuePair = mLoggingValueArgumentCatpor.getValue(); - assertThat(namePair.first).isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(namePair.second).isEqualTo(key); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED, + SettingsEnums.PAGE_UNKNOWN, + key, + position); verify(resolver).notifyChange(uri, null); - assertThat(valuePair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE); - assertThat(valuePair.second).isEqualTo(position); } @Test(expected = IllegalArgumentException.class) diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java index 43712788312..2e2104be7c0 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java @@ -18,11 +18,11 @@ package com.android.settings.slices; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -52,7 +52,6 @@ import com.android.settings.testutils.SliceTester; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) @@ -77,14 +76,11 @@ public class SliceBuilderUtilsTest { private Context mContext; private FakeFeatureFactory mFeatureFactory; - private ArgumentCaptor> mLoggingArgumentCatpor; @Before public void setUp() { mContext = RuntimeEnvironment.application; mFeatureFactory = FakeFeatureFactory.setupForTest(); - mLoggingArgumentCatpor = ArgumentCaptor.forClass(Pair.class); - // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); } @@ -103,14 +99,11 @@ public class SliceBuilderUtilsTest { final Slice slice = SliceBuilderUtils.buildSlice(mContext, dummyData); verify(mFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), - mLoggingArgumentCatpor.capture()); - final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); - - assertThat(capturedLoggingPair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(capturedLoggingPair.second) - .isEqualTo(dummyData.getKey()); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, + SettingsEnums.PAGE_UNKNOWN, + dummyData.getKey(), + 0); SliceTester.testSettingsToggleSlice(mContext, slice, dummyData); } @@ -120,14 +113,11 @@ public class SliceBuilderUtilsTest { final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); verify(mFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), - mLoggingArgumentCatpor.capture()); - final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); - - assertThat(capturedLoggingPair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(capturedLoggingPair.second) - .isEqualTo(data.getKey()); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, + SettingsEnums.PAGE_UNKNOWN, + data.getKey(), + 0); SliceTester.testSettingsSliderSlice(mContext, slice, data); } @@ -137,14 +127,11 @@ public class SliceBuilderUtilsTest { final Slice slice = SliceBuilderUtils.buildSlice(mContext, dummyData); verify(mFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), - mLoggingArgumentCatpor.capture()); - final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); - - assertThat(capturedLoggingPair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(capturedLoggingPair.second) - .isEqualTo(dummyData.getKey()); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, + SettingsEnums.PAGE_UNKNOWN, + dummyData.getKey(), + 0); SliceTester.testSettingsCopyableSlice(mContext, slice, dummyData); } @@ -390,14 +377,12 @@ public class SliceBuilderUtilsTest { final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); verify(mFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), - mLoggingArgumentCatpor.capture()); - final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, + SettingsEnums.PAGE_UNKNOWN, + data.getKey(), + 0); - assertThat(capturedLoggingPair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(capturedLoggingPair.second) - .isEqualTo(data.getKey()); SliceTester.testSettingsUnavailableSlice(mContext, slice, data); } @@ -412,16 +397,11 @@ public class SliceBuilderUtilsTest { final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); verify(mFeatureFactory.metricsFeatureProvider) - .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED), - mLoggingArgumentCatpor.capture()); - - final Pair capturedLoggingPair = mLoggingArgumentCatpor.getValue(); - - assertThat(capturedLoggingPair.first) - .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); - assertThat(capturedLoggingPair.second) - .isEqualTo(data.getKey()); - assertThat(slice).isNull(); + .action(SettingsEnums.PAGE_UNKNOWN, + MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, + SettingsEnums.PAGE_UNKNOWN, + data.getKey(), + 0); } @Test From 0bfbdf1b1f86d56080178c5b79c4151e763e8914 Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Wed, 14 Nov 2018 15:02:21 +0800 Subject: [PATCH 09/12] Add description into strings.xml for missing comment The comment of string "show_connected_devices" was missing from ag/5336877. Fixes: 119534057 Test: robotests Change-Id: I445413cdcbb647e068a51312fa16f8c93abee36f --- res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/res/values/strings.xml b/res/values/strings.xml index dbf2615e622..82efb59242c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10273,6 +10273,7 @@ Scan again + %1$d device connected %1$d devices connected From 913790b4cb4ff1b1bde524ac93d385028b567a89 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Wed, 14 Nov 2018 18:17:32 +0800 Subject: [PATCH 10/12] Update strings Bug: 118399687 Test: visual Change-Id: I0b5f86235b7fd7530ba8eeed9649f0c3dc3b94bf --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index dbf2615e622..ccaf4219308 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7112,7 +7112,7 @@ Default alarm sound - Also vibrate for calls + Vibrate for calls Other sounds From 22e29a28eef0abd588ed32ed117a0329bc6290f8 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Wed, 14 Nov 2018 20:32:59 +0800 Subject: [PATCH 11/12] Update delete user strings in multiple users page Change-Id: I3ab25e491af3894f8163d9ef9a88c446575ebbc3 Fixes: 111723127 Test: visual --- res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index dbf2615e622..8a4bb50d4de 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6462,7 +6462,7 @@ Delete yourself? - Remove this user? + Delete this user? Remove this profile? @@ -6500,7 +6500,7 @@ Turn on phone calls & SMS - Remove user + Delete user Turn on phone calls? From 127da9c73c9ce1d2959f39f60fe7bd84b79504d6 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Fri, 9 Nov 2018 16:13:53 -0800 Subject: [PATCH 12/12] Fix ConfirmDeviceCredentials for work profiles 1) Fixed the theme for CDCA$InternalActivity to be transparent 2) CDCA only cares about biometrics, which are tied to userId 3) Moved shared methods to a util class Fixes: 119296586 Test: Followed the steps in comment#1 of the bug linked above Change-Id: Ie47fc7c3a53dfb7780087937e1ca83287cc52d71 --- AndroidManifest.xml | 2 +- .../settings/password/BiometricFragment.java | 11 +++- .../ConfirmDeviceCredentialActivity.java | 35 ++++++---- .../ConfirmDeviceCredentialBaseFragment.java | 38 ----------- .../ConfirmDeviceCredentialUtils.java | 65 +++++++++++++++++++ .../password/ConfirmLockPassword.java | 5 +- .../settings/password/ConfirmLockPattern.java | 5 +- 7 files changed, 104 insertions(+), 57 deletions(-) create mode 100644 src/com/android/settings/password/ConfirmDeviceCredentialUtils.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index eb3be0e37d1..6ffc3b2823b 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1463,7 +1463,7 @@ android:exported="false" android:permission="android.permission.MANAGE_USERS" android:resizeableActivity="false" - android:theme="@android:style/Theme.NoDisplay"> + android:theme="@android:style/Theme.Translucent.NoTitleBar"> diff --git a/src/com/android/settings/password/BiometricFragment.java b/src/com/android/settings/password/BiometricFragment.java index 6e1ae10d841..3a12bacfd8a 100644 --- a/src/com/android/settings/password/BiometricFragment.java +++ b/src/com/android/settings/password/BiometricFragment.java @@ -50,6 +50,9 @@ public class BiometricFragment extends InstrumentedFragment { private Executor mClientExecutor; private AuthenticationCallback mClientCallback; + // Re-settable by the application. + private int mUserId; + // Created/Initialized once and retained private final Handler mHandler = new Handler(Looper.getMainLooper()); private PromptInfo mPromptInfo; @@ -96,6 +99,10 @@ public class BiometricFragment extends InstrumentedFragment { mClientCallback = callback; } + public void setUser(int userId) { + mUserId = userId; + } + public void cancel() { if (mCancellationSignal != null) { mCancellationSignal.cancel(); @@ -126,8 +133,8 @@ public class BiometricFragment extends InstrumentedFragment { mCancellationSignal = new CancellationSignal(); // TODO: CC doesn't use crypto for now - mBiometricPrompt.authenticate(mCancellationSignal, mClientExecutor, - mAuthenticationCallback); + mBiometricPrompt.authenticateUser(mCancellationSignal, mClientExecutor, + mAuthenticationCallback, mUserId); } @Override diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java index f68c04ad298..5eb1f322c27 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java @@ -20,9 +20,9 @@ package com.android.settings.password; import android.app.Activity; import android.app.KeyguardManager; import android.app.admin.DevicePolicyManager; +import android.app.trust.TrustManager; import android.content.Context; import android.content.Intent; -import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricPrompt; import android.hardware.biometrics.BiometricPrompt.AuthenticationCallback; @@ -84,13 +84,13 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { private DevicePolicyManager mDevicePolicyManager; private LockPatternUtils mLockPatternUtils; private UserManager mUserManager; + private TrustManager mTrustManager; private ChooseLockSettingsHelper mChooseLockSettingsHelper; private Handler mHandler = new Handler(Looper.getMainLooper()); private String mTitle; private String mDetails; private int mUserId; - private int mEffectiveUserId; private int mCredentialMode; private boolean mGoingToBackground; @@ -108,10 +108,16 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { showConfirmCredentials(); } } - } public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) { + mTrustManager.setDeviceLockedForUser(mUserId, false); + + ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils, mUserManager, + mUserId); + ConfirmDeviceCredentialUtils.checkForPendingIntent( + ConfirmDeviceCredentialActivity.this); + setResult(Activity.RESULT_OK); finish(); } @@ -124,6 +130,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { mBiometricManager = getSystemService(BiometricManager.class); mDevicePolicyManager = getSystemService(DevicePolicyManager.class); mUserManager = UserManager.get(this); + mTrustManager = getSystemService(TrustManager.class); mLockPatternUtils = new LockPatternUtils(this); Intent intent = getIntent(); @@ -134,7 +141,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { boolean frp = KeyguardManager.ACTION_CONFIRM_FRP_CREDENTIAL.equals(intent.getAction()); mUserId = UserHandle.myUserId(); - mEffectiveUserId = mUserManager.getCredentialOwnerProfile(mUserId); + final int effectiveUserId = mUserManager.getCredentialOwnerProfile(mUserId); if (isInternalActivity()) { try { mUserId = Utils.getUserIdFromBundle(this, intent.getExtras()); @@ -162,21 +169,23 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { } else if (isManagedProfile && isInternalActivity() && !lockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) { mCredentialMode = CREDENTIAL_MANAGED; - if (isBiometricAllowed()) { + if (isBiometricAllowed(effectiveUserId)) { showBiometricPrompt(); launchedBiometric = true; } else { showConfirmCredentials(); + launchedCDC = true; } } else { mCredentialMode = CREDENTIAL_NORMAL; - if (isBiometricAllowed()) { + if (isBiometricAllowed(effectiveUserId)) { // Don't need to check if biometrics / pin/pattern/pass are enrolled. It will go to // onAuthenticationError and do the right thing automatically. showBiometricPrompt(); launchedBiometric = true; } else { showConfirmCredentials(); + launchedCDC = true; } } @@ -217,19 +226,20 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { // credential. Otherwise, biometric can't unlock fbe/keystore through // verifyTiedProfileChallenge. In such case, we also wanna show the user message that // biometric is disabled due to device restart. - private boolean isStrongAuthRequired() { - return !mLockPatternUtils.isBiometricAllowedForUser(mEffectiveUserId) + private boolean isStrongAuthRequired(int effectiveUserId) { + return !mLockPatternUtils.isBiometricAllowedForUser(effectiveUserId) || !mUserManager.isUserUnlocked(mUserId); } - private boolean isBiometricDisabledByAdmin() { + private boolean isBiometricDisabledByAdmin(int effectiveUserId) { final int disabledFeatures = - mDevicePolicyManager.getKeyguardDisabledFeatures(null, mEffectiveUserId); + mDevicePolicyManager.getKeyguardDisabledFeatures(null, effectiveUserId); return (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_BIOMETRICS) != 0; } - private boolean isBiometricAllowed() { - return !isStrongAuthRequired() && !isBiometricDisabledByAdmin(); + private boolean isBiometricAllowed(int effectiveUserId) { + return !isStrongAuthRequired(effectiveUserId) + && !isBiometricDisabledByAdmin(effectiveUserId); } private void showBiometricPrompt() { @@ -250,6 +260,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { newFragment = true; } mBiometricFragment.setCallbacks(mExecutor, mAuthenticationCallback); + mBiometricFragment.setUser(mUserId); if (newFragment) { getSupportFragmentManager().beginTransaction() diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java index 9b677aa4ace..2de7625b9ed 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java @@ -18,17 +18,12 @@ package com.android.settings.password; import android.annotation.Nullable; -import android.app.ActivityManager; -import android.app.ActivityOptions; import android.app.Dialog; -import android.app.IActivityManager; import android.app.KeyguardManager; import android.app.admin.DevicePolicyManager; -import android.app.trust.TrustManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.IntentSender; import android.content.pm.UserInfo; import android.graphics.Point; import android.graphics.PorterDuff; @@ -36,7 +31,6 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; -import android.os.RemoteException; import android.os.UserManager; import android.text.TextUtils; import android.view.View; @@ -199,29 +193,6 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr public void startEnterAnimation() { } - protected void checkForPendingIntent() { - int taskId = getActivity().getIntent().getIntExtra(Intent.EXTRA_TASK_ID, -1); - if (taskId != -1) { - try { - IActivityManager activityManager = ActivityManager.getService(); - final ActivityOptions options = ActivityOptions.makeBasic(); - activityManager.startActivityFromRecents(taskId, options.toBundle()); - return; - } catch (RemoteException e) { - // Do nothing. - } - } - IntentSender intentSender = getActivity().getIntent() - .getParcelableExtra(Intent.EXTRA_INTENT); - if (intentSender != null) { - try { - getActivity().startIntentSenderForResult(intentSender, -1, null, 0, 0, 0); - } catch (IntentSender.SendIntentException e) { - /* ignore */ - } - } - } - private void setWorkChallengeBackground(View baseView, int userId) { View mainContent = getActivity().findViewById(com.android.settings.R.id.main_content); if (mainContent != null) { @@ -246,15 +217,6 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr } } - protected void reportSuccessfulAttempt() { - mLockPatternUtils.reportSuccessfulPasswordAttempt(mEffectiveUserId); - if (mUserManager.isManagedProfile(mEffectiveUserId)) { - // Keyguard is responsible to disable StrongAuth for primary user. Disable StrongAuth - // for work challenge only here. - mLockPatternUtils.userPresent(mEffectiveUserId); - } - } - protected void reportFailedAttempt() { updateErrorMessage( mLockPatternUtils.getCurrentFailedPasswordAttempts(mEffectiveUserId) + 1); diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java b/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java new file mode 100644 index 00000000000..11d69246206 --- /dev/null +++ b/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2018 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.password; + +import android.app.Activity; +import android.app.ActivityManager; +import android.app.ActivityOptions; +import android.app.IActivityManager; +import android.content.Intent; +import android.content.IntentSender; +import android.os.RemoteException; +import android.os.UserManager; + +import com.android.internal.widget.LockPatternUtils; + +/** Class containing methods shared between CDCA and CDCBA */ +public class ConfirmDeviceCredentialUtils { + + public static void checkForPendingIntent(Activity activity) { + // See Change-Id I52c203735fa9b53fd2f7df971824747eeb930f36 for context + int taskId = activity.getIntent().getIntExtra(Intent.EXTRA_TASK_ID, -1); + if (taskId != -1) { + try { + IActivityManager activityManager = ActivityManager.getService(); + final ActivityOptions options = ActivityOptions.makeBasic(); + activityManager.startActivityFromRecents(taskId, options.toBundle()); + return; + } catch (RemoteException e) { + // Do nothing. + } + } + IntentSender intentSender = activity.getIntent().getParcelableExtra(Intent.EXTRA_INTENT); + if (intentSender != null) { + try { + activity.startIntentSenderForResult(intentSender, -1, null, 0, 0, 0); + } catch (IntentSender.SendIntentException e) { + /* ignore */ + } + } + } + + public static void reportSuccessfulAttempt(LockPatternUtils utils, UserManager userManager, + int userId) { + utils.reportSuccessfulPasswordAttempt(userId); + if (userManager.isManagedProfile(userId)) { + // Keyguard is responsible to disable StrongAuth for primary user. Disable StrongAuth + // for work challenge only here. + utils.userPresent(userId); + } + } +} diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java index d380fc966ab..45b8129e31f 100644 --- a/src/com/android/settings/password/ConfirmLockPassword.java +++ b/src/com/android/settings/password/ConfirmLockPassword.java @@ -434,10 +434,11 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { mPasswordEntryInputDisabler.setInputEnabled(true); if (matched) { if (newResult) { - reportSuccessfulAttempt(); + ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils, + mUserManager, mEffectiveUserId); } startDisappearAnimation(intent); - checkForPendingIntent(); + ConfirmDeviceCredentialUtils.checkForPendingIntent(getActivity()); } else { if (timeoutMs > 0) { refreshLockScreen(); diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java index 95a0aca4fdd..83141ea3d68 100644 --- a/src/com/android/settings/password/ConfirmLockPattern.java +++ b/src/com/android/settings/password/ConfirmLockPattern.java @@ -487,10 +487,11 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { mLockPatternView.setEnabled(true); if (matched) { if (newResult) { - reportSuccessfulAttempt(); + ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils, + mUserManager, mEffectiveUserId); } startDisappearAnimation(intent); - checkForPendingIntent(); + ConfirmDeviceCredentialUtils.checkForPendingIntent(getActivity()); } else { if (timeoutMs > 0) { refreshLockScreen();