From c6d7191cb9530d37523021bcd3d7834fffcb2003 Mon Sep 17 00:00:00 2001 From: Ivan Chiang Date: Thu, 24 May 2018 17:52:49 +0800 Subject: [PATCH 01/21] Fix gray out previously connected device preference issue Count the dock devices in previously connected device controller. Change-Id: I08d82ec715698ecf894a4a7cd0631c5f1de0f591 Fix: 80227045 Test: m -j SettingsRoboTests RunSettingsRoboTests --- ...uslyConnectedDevicePreferenceController.java | 17 +++++++++++++++-- ...ConnectedDevicePreferenceControllerTest.java | 6 ++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java index bb60df929e4..27b7676a2f2 100644 --- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java +++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java @@ -21,11 +21,13 @@ import android.content.pm.PackageManager; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; + import com.android.settings.bluetooth.BluetoothDeviceUpdater; import com.android.settings.bluetooth.SavedBluetoothDeviceUpdater; +import com.android.settings.connecteddevice.dock.DockUpdater; import com.android.settings.core.BasePreferenceController; import com.android.settings.dashboard.DashboardFragment; - +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; @@ -35,10 +37,14 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc private Preference mPreference; private BluetoothDeviceUpdater mBluetoothDeviceUpdater; + private DockUpdater mSavedDockUpdater; private int mPreferenceSize; public PreviouslyConnectedDevicePreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); + + mSavedDockUpdater = FeatureFactory.getFactory( + context).getDockUpdaterFeatureProvider().getSavedDockUpdater(context, this); } @Override @@ -60,12 +66,14 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc @Override public void onStart() { mBluetoothDeviceUpdater.registerCallback(); + mSavedDockUpdater.registerCallback(); updatePreferenceOnSizeChanged(); } @Override public void onStop() { mBluetoothDeviceUpdater.unregisterCallback(); + mSavedDockUpdater.unregisterCallback(); } public void init(DashboardFragment fragment) { @@ -90,6 +98,11 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc mBluetoothDeviceUpdater = bluetoothDeviceUpdater; } + @VisibleForTesting + void setSavedDockUpdater(DockUpdater savedDockUpdater) { + mSavedDockUpdater = savedDockUpdater; + } + @VisibleForTesting void setPreferenceSize(int size) { mPreferenceSize = size; @@ -105,4 +118,4 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc mPreference.setEnabled(mPreferenceSize != 0); } } -} \ No newline at end of file +} diff --git a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java index fd2ff0d8975..6e69e67ba0c 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java @@ -20,6 +20,7 @@ import android.content.pm.PackageManager; import androidx.preference.Preference; import com.android.settings.bluetooth.BluetoothDeviceUpdater; +import com.android.settings.connecteddevice.dock.DockUpdater; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -45,6 +46,8 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { @Mock private BluetoothDeviceUpdater mBluetoothDeviceUpdater; @Mock + private DockUpdater mDockUpdater; + @Mock private PackageManager mPackageManager; private Context mContext; @@ -60,6 +63,7 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { mPreConnectedDeviceController = new PreviouslyConnectedDevicePreferenceController(mContext, KEY); mPreConnectedDeviceController.setBluetoothDeviceUpdater(mBluetoothDeviceUpdater); + mPreConnectedDeviceController.setSavedDockUpdater(mDockUpdater); mPreference = new Preference(mContext); mPreConnectedDeviceController.setPreference(mPreference); @@ -70,10 +74,12 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { // register the callback in onStart() mPreConnectedDeviceController.onStart(); verify(mBluetoothDeviceUpdater).registerCallback(); + verify(mDockUpdater).registerCallback(); // unregister the callback in onStop() mPreConnectedDeviceController.onStop(); verify(mBluetoothDeviceUpdater).unregisterCallback(); + verify(mDockUpdater).unregisterCallback(); } @Test From 9ceb587ede0c89c597e0c417018b16997c561c0f Mon Sep 17 00:00:00 2001 From: Antony Sargent Date: Thu, 31 May 2018 12:49:46 -0700 Subject: [PATCH 02/21] Don't crash on null Intent in FingerprintEnrollFindSensor During a run of the setup wizard, a tester one time encountered a case where the 'Accept Legal terms' screen followed by the Security screen showed for a second time after already confirming the pattern in the Security screen. The logs showed a crash in FingerprintEnrollFindSensor.onActivityResult which could only have happened if it was called with a requestCode of CONFIRM_REQUEST and a resultCode of RESULT_OK, but a null Intent. This isn't an expected flow, and AFAIK we haven't been able to reproduce the original problem, but it seems reasonable to at least not crash in settings, so this CL defends against that crash by just calling finish() in this case, which means the caller who started the FingerprintEnrollFindSensor will see the default result code of Activity.RESULT_CANCELLED. Bug: 80099085 Test: make -j RunSettingsRoboTests Change-Id: I94401eabe295e4d5396cf7d324fbf1902dc45f6d --- .../fingerprint/FingerprintEnrollFindSensor.java | 6 ++++-- .../fingerprint/FingerprintEnrollFindSensorTest.java | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java index 95a534cdd42..03bba42f5be 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java @@ -24,6 +24,7 @@ import androidx.annotation.Nullable; import android.view.View; import android.widget.Button; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.Utils; @@ -35,7 +36,8 @@ import com.android.settings.password.ChooseLockSettingsHelper; */ public class FingerprintEnrollFindSensor extends FingerprintEnrollBase { - private static final int CONFIRM_REQUEST = 1; + @VisibleForTesting + static final int CONFIRM_REQUEST = 1; private static final int ENROLLING = 2; public static final String EXTRA_KEY_LAUNCHED_CONFIRM = "launched_confirm_lock"; @@ -170,7 +172,7 @@ public class FingerprintEnrollFindSensor extends FingerprintEnrollBase { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CONFIRM_REQUEST) { - if (resultCode == RESULT_OK) { + if (resultCode == RESULT_OK && data != null) { mToken = data.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); overridePendingTransition(R.anim.suw_slide_next_in, R.anim.suw_slide_next_out); getIntent().putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken); diff --git a/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java index e83e93d9bc9..1fe09310e76 100644 --- a/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java +++ b/tests/robotests/src/com/android/settings/fingerprint/FingerprintEnrollFindSensorTest.java @@ -22,6 +22,7 @@ import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.verify; import static org.robolectric.RuntimeEnvironment.application; +import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.hardware.fingerprint.FingerprintManager; @@ -151,4 +152,12 @@ public class FingerprintEnrollFindSensorTest { return callbackCaptor.getValue(); } + + @Test + public void onActivityResult_withNullIntentShouldNotCrash() { + // this should not crash + mActivity.onActivityResult(FingerprintEnrollFindSensor.CONFIRM_REQUEST, Activity.RESULT_OK, + null); + assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(Activity.RESULT_CANCELED); + } } From b77145401fcf3417e1b6e4e49c0271513ca26275 Mon Sep 17 00:00:00 2001 From: Beverly Date: Tue, 5 Jun 2018 13:05:12 -0400 Subject: [PATCH 03/21] Add null check in displayPreference Change-Id: I3afaa3f587dc5c9989d5e520f1c8a0b33e57ec7d Fixes: 109740402 Test: ZenModeStarredContactsPreferenceControllerTest.java --- .../ZenModeStarredContactsPreferenceController.java | 5 ++++- .../ZenModeStarredContactsPreferenceControllerTest.java | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/notification/ZenModeStarredContactsPreferenceController.java b/src/com/android/settings/notification/ZenModeStarredContactsPreferenceController.java index 28475b6b5e3..10a7b561353 100644 --- a/src/com/android/settings/notification/ZenModeStarredContactsPreferenceController.java +++ b/src/com/android/settings/notification/ZenModeStarredContactsPreferenceController.java @@ -68,7 +68,10 @@ public class ZenModeStarredContactsPreferenceController extends public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(KEY); - mPreference.setOnPreferenceClickListener(this); + + if (mPreference != null) { + mPreference.setOnPreferenceClickListener(this); + } } @Override diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeStarredContactsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeStarredContactsPreferenceControllerTest.java index 064c0911319..ad8e0de7193 100644 --- a/tests/robotests/src/com/android/settings/notification/ZenModeStarredContactsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/ZenModeStarredContactsPreferenceControllerTest.java @@ -190,4 +190,13 @@ public class ZenModeStarredContactsPreferenceControllerTest { assertThat(contacts.get(i)).isNotNull(); } } + + @Test + public void nullPreference_displayPreference() { + when(mPreferenceScreen.findPreference(mMessagesController.getPreferenceKey())) + .thenReturn(null); + + // should not throw a null pointer + mMessagesController.displayPreference(mPreferenceScreen); + } } From 752350c8d88cf4a6d530bc9ab55b5308dc4c05aa Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 5 Jun 2018 09:17:19 -0700 Subject: [PATCH 04/21] Suppress prevent ringer gesture parent page in search. The full page verion of prevent ringing is still searchable. - Created a new controller for parent entry. - On the child controller, inherit the same getAvailabilityStatus() but override AVILABLE_UNSEARCHABLE to AVAILABLE so it becomes searchable. Fixes: 72748524 Test: existing robotests for PreventRingingPreferenceController Change-Id: Id2454db110c81b59fa4a98338602b03de0812f8a --- res/xml/gestures.xml | 2 +- res/xml/sound_settings.xml | 2 +- ...ventRingingParentPreferenceController.java | 36 ++++++++++ .../PreventRingingPreferenceController.java | 23 ++++--- ...RingingParentPreferenceControllerTest.java | 69 +++++++++++++++++++ 5 files changed, 119 insertions(+), 13 deletions(-) create mode 100644 src/com/android/settings/gestures/PreventRingingParentPreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/gestures/PreventRingingParentPreferenceControllerTest.java diff --git a/res/xml/gestures.xml b/res/xml/gestures.xml index 650b1c44005..9f69102a3cb 100644 --- a/res/xml/gestures.xml +++ b/res/xml/gestures.xml @@ -67,6 +67,6 @@ android:key="gesture_prevent_ringing_summary" android:title="@string/gesture_prevent_ringing_screen_title" android:fragment="com.android.settings.gestures.PreventRingingGestureSettings" - settings:controller="com.android.settings.gestures.PreventRingingPreferenceController" /> + settings:controller="com.android.settings.gestures.PreventRingingParentPreferenceController" /> diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml index 54a4190b8ef..b7b64f54758 100644 --- a/res/xml/sound_settings.xml +++ b/res/xml/sound_settings.xml @@ -101,7 +101,7 @@ android:title="@string/gesture_prevent_ringing_sound_title" android:order="-110" android:fragment="com.android.settings.gestures.PreventRingingGestureSettings" - settings:controller="com.android.settings.gestures.PreventRingingPreferenceController" /> + settings:controller="com.android.settings.gestures.PreventRingingParentPreferenceController" /> Date: Tue, 5 Jun 2018 11:42:17 -0700 Subject: [PATCH 05/21] Properly suppress zen mode entry from soundsetting page. Change-Id: If2c033232b05753f3ba52bb986dd6c85cab6e452 Fixes: 72748524 Test: robotests --- res/xml/configure_notification_settings.xml | 1 + res/xml/sound_settings.xml | 3 +- .../ConfigureNotificationSettings.java | 8 ++--- .../settings/notification/SoundSettings.java | 21 +++-------- .../ZenModePreferenceController.java | 35 ++++++------------- .../ZenModePreferenceControllerTest.java | 10 +++--- 6 files changed, 28 insertions(+), 50 deletions(-) diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml index f563643aea4..fbb464ca938 100644 --- a/res/xml/configure_notification_settings.xml +++ b/res/xml/configure_notification_settings.xml @@ -56,6 +56,7 @@ android:title="@string/zen_mode_settings_title" settings:useAdminDisabledSummary="true" android:fragment="com.android.settings.notification.ZenModeSettings" + settings:controller="com.android.settings.notification.ZenModePreferenceController" settings:allowDividerAbove="false" /> diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml index b7b64f54758..d38a8e4dc7c 100644 --- a/res/xml/sound_settings.xml +++ b/res/xml/sound_settings.xml @@ -94,7 +94,8 @@ android:order="-120" settings:useAdminDisabledSummary="true" settings:keywords="@string/keywords_sounds_and_notifications_interruptions" - settings:allowDividerAbove="true"/> + settings:allowDividerAbove="true" + settings:controller="com.android.settings.notification.ZenModePreferenceController" /> - onPreferenceDataChanged(listPreference)); + onPreferenceDataChanged(listPreference)); mHfpOutputControllerKey = use(HandsFreeProfileOutputPreferenceController.class).getPreferenceKey(); @@ -235,7 +234,6 @@ public class SoundSettings extends DashboardFragment { private static List buildPreferenceControllers(Context context, SoundSettings fragment, Lifecycle lifecycle) { final List controllers = new ArrayList<>(); - controllers.add(new ZenModePreferenceController(context, lifecycle, KEY_ZEN_MODE)); // Volumes are added via xml @@ -309,15 +307,6 @@ public class SoundSettings extends DashboardFragment { return buildPreferenceControllers(context, null /* fragment */, null /* lifecycle */); } - - @Override - public List getNonIndexableKeys(Context context) { - List keys = super.getNonIndexableKeys(context); - // Duplicate results - keys.add((new ZenModePreferenceController(context, null, KEY_ZEN_MODE)) - .getPreferenceKey()); - return keys; - } }; // === Work Sound Settings === diff --git a/src/com/android/settings/notification/ZenModePreferenceController.java b/src/com/android/settings/notification/ZenModePreferenceController.java index 0d94029f47c..d70ffe28b8b 100644 --- a/src/com/android/settings/notification/ZenModePreferenceController.java +++ b/src/com/android/settings/notification/ZenModePreferenceController.java @@ -23,38 +23,30 @@ import android.net.Uri; import android.os.Handler; import android.os.UserHandle; import android.provider.Settings; -import androidx.preference.Preference; -import androidx.preference.PreferenceScreen; -import android.util.Slog; -import com.android.settings.core.PreferenceControllerMixin; -import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settings.core.BasePreferenceController; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; -public class ZenModePreferenceController extends AbstractPreferenceController - implements LifecycleObserver, OnResume, OnPause, PreferenceControllerMixin { +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +public class ZenModePreferenceController extends BasePreferenceController + implements LifecycleObserver, OnResume, OnPause { - private final String mKey; private SettingObserver mSettingObserver; private ZenModeSettings.SummaryBuilder mSummaryBuilder; - public ZenModePreferenceController(Context context, Lifecycle lifecycle, String key) { - super(context); + public ZenModePreferenceController(Context context, String key) { + super(context, key); mSummaryBuilder = new ZenModeSettings.SummaryBuilder(context); - - if (lifecycle != null) { - lifecycle.addObserver(this); - } - mKey = key; } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - mSettingObserver = new SettingObserver(screen.findPreference(mKey)); + mSettingObserver = new SettingObserver(screen.findPreference(getPreferenceKey())); } @Override @@ -72,13 +64,8 @@ public class ZenModePreferenceController extends AbstractPreferenceController } @Override - public String getPreferenceKey() { - return mKey; - } - - @Override - public boolean isAvailable() { - return true; + public int getAvailabilityStatus() { + return AVAILABLE_UNSEARCHABLE; } @Override diff --git a/tests/robotests/src/com/android/settings/notification/ZenModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModePreferenceControllerTest.java index 3ea4471fadc..ece25e2661b 100644 --- a/tests/robotests/src/com/android/settings/notification/ZenModePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/ZenModePreferenceControllerTest.java @@ -16,6 +16,7 @@ package com.android.settings.notification; +import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doReturn; @@ -27,7 +28,6 @@ import static org.mockito.Mockito.when; import android.app.NotificationManager; import android.app.NotificationManager.Policy; import android.content.Context; -import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -40,6 +40,8 @@ import org.mockito.MockitoAnnotations; import org.robolectric.shadows.ShadowApplication; import org.robolectric.util.ReflectionHelpers; +import androidx.preference.Preference; + @RunWith(SettingsRobolectricTestRunner.class) public class ZenModePreferenceControllerTest { @@ -61,7 +63,7 @@ public class ZenModePreferenceControllerTest { ShadowApplication shadowApplication = ShadowApplication.getInstance(); shadowApplication.setSystemService(Context.NOTIFICATION_SERVICE, mNotificationManager); mContext = shadowApplication.getApplicationContext(); - mController = new ZenModePreferenceController(mContext, null, KEY_ZEN_MODE); + mController = new ZenModePreferenceController(mContext, KEY_ZEN_MODE); when(mNotificationManager.getNotificationPolicy()).thenReturn(mPolicy); mSummaryBuilder = spy(new ZenModeSettings.SummaryBuilder(mContext)); ReflectionHelpers.setField(mController, "mSummaryBuilder", mSummaryBuilder); @@ -69,8 +71,8 @@ public class ZenModePreferenceControllerTest { } @Test - public void isAlwaysAvailable() { - assertThat(mController.isAvailable()).isTrue(); + public void isAvailable_unsearchable() { + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE); } @Test From 1503b0273b866c412e1ed8595c09e29986e1d67b Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Tue, 5 Jun 2018 15:28:27 -0700 Subject: [PATCH 06/21] Only add entry with unique package name to default browser list. When we query the package manager for activities that can handle the web data uri, different capable activities within the same package will be returned as separate entries. However, when we show the default browser apps to the user, the entries are simply base on package name. So, if there are multiple activities within the same package that can handle the web data, they will be shown as duplicate entries. When we process the resolved activities, check the corresponding package name for duplicate entries before adding it to the default browser list. Change-Id: I70c88866eb3d5fe6466554749e23c85f429dd30c Fixes: 84207432 Test: make RunSettingsRoboTests --- .../defaultapps/DefaultBrowserPicker.java | 11 ++++- .../defaultapps/DefaultBrowserPickerTest.java | 48 +++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java index 8153be281b3..c243970bad0 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java +++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java @@ -17,9 +17,11 @@ package com.android.settings.applications.defaultapps; import android.content.Context; +import android.content.pm.ComponentInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.util.ArraySet; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; @@ -27,6 +29,7 @@ import com.android.settingslib.applications.DefaultAppInfo; import java.util.ArrayList; import java.util.List; +import java.util.Set; /** * Fragment for choosing default browser. @@ -62,14 +65,20 @@ public class DefaultBrowserPicker extends DefaultAppPickerFragment { DefaultBrowserPreferenceController.BROWSE_PROBE, PackageManager.MATCH_ALL, mUserId); final int count = list.size(); + final Set addedPackages = new ArraySet<>(); for (int i = 0; i < count; i++) { ResolveInfo info = list.get(i); if (info.activityInfo == null || !info.handleAllWebDataURI) { continue; } + final String packageName = info.activityInfo.packageName; + if (addedPackages.contains(packageName)) { + continue; + } try { candidates.add(new DefaultAppInfo(context, mPm, - mPm.getApplicationInfoAsUser(info.activityInfo.packageName, 0, mUserId))); + mPm.getApplicationInfoAsUser(packageName, 0, mUserId))); + addedPackages.add(packageName); } catch (PackageManager.NameNotFoundException e) { // Skip unknown packages. } diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java index f7a21d8ed7c..bdf249d1f5e 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java @@ -16,6 +16,8 @@ package com.android.settings.applications.defaultapps; +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.eq; import static org.mockito.Mockito.verify; @@ -23,10 +25,20 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.ResolveInfo; import android.os.UserManager; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.applications.DefaultAppInfo; + +import java.util.ArrayList; +import java.util.List; import org.junit.Before; import org.junit.Test; @@ -53,6 +65,7 @@ public class DefaultBrowserPickerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); + FakeFeatureFactory.setupForTest(); when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); mPicker = new DefaultBrowserPicker(); @@ -72,4 +85,39 @@ public class DefaultBrowserPickerTest { mPicker.getDefaultKey(); verify(mPackageManager).getDefaultBrowserPackageNameAsUser(anyInt()); } + + @Test + public void getCandidates_shouldNotIncludeDuplicatePackageName() throws NameNotFoundException { + final List resolveInfos = new ArrayList<>(); + final String PACKAGE_ONE = "com.first.package"; + final String PACKAGE_TWO = "com.second.package"; + resolveInfos.add(createResolveInfo(PACKAGE_ONE)); + resolveInfos.add(createResolveInfo(PACKAGE_TWO)); + resolveInfos.add(createResolveInfo(PACKAGE_ONE)); + resolveInfos.add(createResolveInfo(PACKAGE_TWO)); + when(mPackageManager.queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt())) + .thenReturn(resolveInfos); + when(mPackageManager.getApplicationInfoAsUser(eq(PACKAGE_ONE), anyInt(), anyInt())) + .thenReturn(createApplicationInfo(PACKAGE_ONE)); + when(mPackageManager.getApplicationInfoAsUser(eq(PACKAGE_TWO), anyInt(), anyInt())) + .thenReturn(createApplicationInfo(PACKAGE_TWO)); + + final List defaultBrowserInfo = mPicker.getCandidates(); + + assertThat(defaultBrowserInfo.size()).isEqualTo(2); + } + + private ResolveInfo createResolveInfo(String packageName) { + final ResolveInfo info = new ResolveInfo(); + info.handleAllWebDataURI = true; + info.activityInfo = new ActivityInfo(); + info.activityInfo.packageName = packageName; + return info; + } + + private ApplicationInfo createApplicationInfo(String packageName) { + final ApplicationInfo info = new ApplicationInfo(); + info.packageName = packageName; + return info; + } } From d63c8ef3b9b2dfed6cec482438794a935e569114 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 5 Jun 2018 16:29:32 -0700 Subject: [PATCH 07/21] No-op clean up on UserSettings to make it more readable Bug: 72319180 Test: existing tests Change-Id: Ie7a327658d1fe16055aad7e90ecffc1e56eb6657 --- .../android/settings/users/UserSettings.java | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index 52a36928c3a..a33561b3bbe 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -42,13 +42,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.provider.ContactsContract; import android.provider.SearchIndexableResource; -import android.provider.Settings.Global; -import androidx.annotation.VisibleForTesting; -import androidx.annotation.WorkerThread; -import androidx.preference.Preference; -import androidx.preference.Preference.OnPreferenceClickListener; -import androidx.preference.PreferenceGroup; -import androidx.preference.PreferenceScreen; import android.util.Log; import android.util.SparseArray; import android.view.Menu; @@ -82,6 +75,13 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; +import androidx.annotation.VisibleForTesting; +import androidx.annotation.WorkerThread; +import androidx.preference.Preference; +import androidx.preference.Preference.OnPreferenceClickListener; +import androidx.preference.PreferenceGroup; +import androidx.preference.PreferenceScreen; + /** * Screen that manages the list of users on the device. * Guest user is an always visible entry, even if the guest is not currently @@ -109,6 +109,8 @@ public class UserSettings extends SettingsPreferenceFragment private static final int MENU_REMOVE_USER = Menu.FIRST; + private static final IntentFilter USER_REMOVED_INTENT_FILTER; + private static final int DIALOG_CONFIRM_REMOVE = 1; private static final int DIALOG_ADD_USER = 2; private static final int DIALOG_SETUP_USER = 3; @@ -134,6 +136,11 @@ public class UserSettings extends SettingsPreferenceFragment private static final String KEY_TITLE = "title"; private static final String KEY_SUMMARY = "summary"; + static { + USER_REMOVED_INTENT_FILTER = new IntentFilter(Intent.ACTION_USER_REMOVED); + USER_REMOVED_INTENT_FILTER.addAction(Intent.ACTION_USER_INFO_CHANGED); + } + private PreferenceGroup mUserListCategory; private UserPreference mMePreference; private RestrictedPreference mAddUser; @@ -195,13 +202,14 @@ public class UserSettings extends SettingsPreferenceFragment public void onCreate(Bundle icicle) { super.onCreate(icicle); addPreferencesFromResource(R.xml.user_settings); - if (Global.getInt(getContext().getContentResolver(), Global.DEVICE_PROVISIONED, 0) == 0) { - getActivity().finish(); + final Activity activity = getActivity(); + if (!Utils.isDeviceProvisioned(getActivity())) { + activity.finish(); return; } - final Context context = getActivity(); + mAddUserWhenLockedPreferenceController = new AddUserWhenLockedPreferenceController( - context, KEY_ADD_USER_WHEN_LOCKED, getLifecycle()); + activity, KEY_ADD_USER_WHEN_LOCKED, getLifecycle()); final PreferenceScreen screen = getPreferenceScreen(); mAddUserWhenLockedPreferenceController.displayPreference(screen); @@ -218,8 +226,8 @@ public class UserSettings extends SettingsPreferenceFragment mEditUserInfoController.onRestoreInstanceState(icicle); } - mUserCaps = UserCapabilities.create(context); - mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); + mUserCaps = UserCapabilities.create(activity); + mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE); if (!mUserCaps.mEnabled) { return; } @@ -248,9 +256,10 @@ public class UserSettings extends SettingsPreferenceFragment } else { mAddUser.setVisible(false); } - final IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED); - filter.addAction(Intent.ACTION_USER_INFO_CHANGED); - context.registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null, mHandler); + + activity.registerReceiverAsUser( + mUserChangeReceiver, UserHandle.ALL, USER_REMOVED_INTENT_FILTER, null, mHandler); + loadProfile(); updateUserList(); mShouldUpdateUserList = false; @@ -762,9 +771,11 @@ public class UserSettings extends SettingsPreferenceFragment } private void updateUserList() { - if (getActivity() == null) return; - List users = mUserManager.getUsers(true); final Context context = getActivity(); + if (context == null) { + return; + } + final List users = mUserManager.getUsers(true); final boolean voiceCapable = Utils.isVoiceCapable(context); final ArrayList missingIcons = new ArrayList<>(); From 366418dab748978ed36379c14f262d149b7aa15c Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Tue, 5 Jun 2018 17:31:22 -0700 Subject: [PATCH 08/21] Fix monkey crash on selecting account sync prefernece. When running monkey, the authority in the preference might not have been properly set. Add a check for valid authority before trying to update the sync automatically setting. Change-Id: I59f910565fc9f128e86bd92337135fe46fed12e1 Fixes: 80551551 Test: make RunSettingsRoboTests --- .../accounts/AccountSyncSettings.java | 9 ++- .../accounts/AccountSyncSettingsTest.java | 57 +++++++++++++++++++ .../shadow/ShadowContentResolver.java | 9 +++ 3 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/accounts/AccountSyncSettingsTest.java diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java index 66f9179ed64..66e8d2205c0 100644 --- a/src/com/android/settings/accounts/AccountSyncSettings.java +++ b/src/com/android/settings/accounts/AccountSyncSettings.java @@ -247,10 +247,13 @@ public class AccountSyncSettings extends AccountPreferenceBase { } if (preference instanceof SyncStateSwitchPreference) { SyncStateSwitchPreference syncPref = (SyncStateSwitchPreference) preference; - String authority = syncPref.getAuthority(); - Account account = syncPref.getAccount(); + final String authority = syncPref.getAuthority(); + if (TextUtils.isEmpty(authority)) { + return false; + } + final Account account = syncPref.getAccount(); final int userId = mUserHandle.getIdentifier(); - String packageName = syncPref.getPackageName(); + final String packageName = syncPref.getPackageName(); boolean syncAutomatically = ContentResolver.getSyncAutomaticallyAsUser(account, authority, userId); diff --git a/tests/robotests/src/com/android/settings/accounts/AccountSyncSettingsTest.java b/tests/robotests/src/com/android/settings/accounts/AccountSyncSettingsTest.java new file mode 100644 index 00000000000..da361852ab1 --- /dev/null +++ b/tests/robotests/src/com/android/settings/accounts/AccountSyncSettingsTest.java @@ -0,0 +1,57 @@ +/* + * 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.accounts; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.accounts.Account; +import android.app.Activity; +import android.content.Context; +import android.os.UserHandle; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.ShadowContentResolver; +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {ShadowContentResolver.class}) +public class AccountSyncSettingsTest { + + @After + public void tearDown() { + ShadowContentResolver.reset(); + } + + @Test + public void onPreferenceTreeClick_nullAuthority_shouldNotCrash() { + final Context context = RuntimeEnvironment.application; + final AccountSyncSettings settings = spy(new AccountSyncSettings()); + when(settings.getActivity()).thenReturn(mock(Activity.class)); + final SyncStateSwitchPreference preference = new SyncStateSwitchPreference(context, + new Account("acct1", "type1"), "" /* authority */, "testPackage", 1 /* uid */); + preference.setOneTimeSyncMode(false); + ReflectionHelpers.setField(settings, "mUserHandle", UserHandle.CURRENT); + + settings.onPreferenceTreeClick(preference); + // no crash + } +} diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowContentResolver.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowContentResolver.java index 50c0330828a..928779b5c05 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowContentResolver.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowContentResolver.java @@ -24,6 +24,7 @@ import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; import android.provider.SearchIndexablesContract; +import android.text.TextUtils; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import org.robolectric.annotation.Resetter; @@ -66,6 +67,14 @@ public class ShadowContentResolver { return sSyncAutomatically.containsKey(authority) ? sSyncAutomatically.get(authority) : true; } + @Implementation + public static void setSyncAutomaticallyAsUser(Account account, String authority, boolean sync, + int userId) { + if (TextUtils.isEmpty(authority)) { + throw new IllegalArgumentException("Authority must be non-empty"); + } + } + @Implementation public static boolean getMasterSyncAutomaticallyAsUser(int userId) { return sMasterSyncAutomatically.containsKey(userId) From 688d1d81cba16deb03e0f495b1e65c71a981d5a4 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Tue, 5 Jun 2018 13:58:48 -0700 Subject: [PATCH 09/21] Only add entry with unique package name to default browser list. When we query the package manager for activities that can handle the web data uri, different capable activities within the same package will be returned as separate entries. However, when we show the default browser apps to the user, the entries are simply base on package name. So, if there are multiple activities within the same package that can handle the web data, they will be shown as duplicate entries. When we process the resolved activities, check the corresponding package name for duplicate entries before adding it to the default browser list. Change-Id: I4e1f1e1ea22781efe24d791b367246423ca7a3c4 Merged-In: I70c88866eb3d5fe6466554749e23c85f429dd30c Fixes: 84207432 Test: make RunSettingsRoboTests --- .../defaultapps/DefaultBrowserPicker.java | 11 ++++- .../defaultapps/DefaultBrowserPickerTest.java | 47 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java index 8153be281b3..c243970bad0 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java +++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java @@ -17,9 +17,11 @@ package com.android.settings.applications.defaultapps; import android.content.Context; +import android.content.pm.ComponentInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.util.ArraySet; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; @@ -27,6 +29,7 @@ import com.android.settingslib.applications.DefaultAppInfo; import java.util.ArrayList; import java.util.List; +import java.util.Set; /** * Fragment for choosing default browser. @@ -62,14 +65,20 @@ public class DefaultBrowserPicker extends DefaultAppPickerFragment { DefaultBrowserPreferenceController.BROWSE_PROBE, PackageManager.MATCH_ALL, mUserId); final int count = list.size(); + final Set addedPackages = new ArraySet<>(); for (int i = 0; i < count; i++) { ResolveInfo info = list.get(i); if (info.activityInfo == null || !info.handleAllWebDataURI) { continue; } + final String packageName = info.activityInfo.packageName; + if (addedPackages.contains(packageName)) { + continue; + } try { candidates.add(new DefaultAppInfo(context, mPm, - mPm.getApplicationInfoAsUser(info.activityInfo.packageName, 0, mUserId))); + mPm.getApplicationInfoAsUser(packageName, 0, mUserId))); + addedPackages.add(packageName); } catch (PackageManager.NameNotFoundException e) { // Skip unknown packages. } diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java index 4f4c90e2ad2..15a1a67fe59 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java @@ -16,6 +16,8 @@ package com.android.settings.applications.defaultapps; +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.eq; import static org.mockito.Mockito.verify; @@ -23,11 +25,20 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.ResolveInfo; import android.os.UserManager; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.applications.DefaultAppInfo; import com.android.settingslib.wrapper.PackageManagerWrapper; +import java.util.ArrayList; +import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -53,6 +64,7 @@ public class DefaultBrowserPickerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); + FakeFeatureFactory.setupForTest(); when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); mPicker = new DefaultBrowserPicker(); @@ -72,4 +84,39 @@ public class DefaultBrowserPickerTest { mPicker.getDefaultKey(); verify(mPackageManager).getDefaultBrowserPackageNameAsUser(anyInt()); } + + @Test + public void getCandidates_shouldNotIncludeDuplicatePackageName() throws NameNotFoundException { + final List resolveInfos = new ArrayList<>(); + final String PACKAGE_ONE = "com.first.package"; + final String PACKAGE_TWO = "com.second.package"; + resolveInfos.add(createResolveInfo(PACKAGE_ONE)); + resolveInfos.add(createResolveInfo(PACKAGE_TWO)); + resolveInfos.add(createResolveInfo(PACKAGE_ONE)); + resolveInfos.add(createResolveInfo(PACKAGE_TWO)); + when(mPackageManager.queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt())) + .thenReturn(resolveInfos); + when(mPackageManager.getApplicationInfoAsUser(eq(PACKAGE_ONE), anyInt(), anyInt())) + .thenReturn(createApplicationInfo(PACKAGE_ONE)); + when(mPackageManager.getApplicationInfoAsUser(eq(PACKAGE_TWO), anyInt(), anyInt())) + .thenReturn(createApplicationInfo(PACKAGE_TWO)); + + final List defaultBrowserInfo = mPicker.getCandidates(); + + assertThat(defaultBrowserInfo.size()).isEqualTo(2); + } + + private ResolveInfo createResolveInfo(String packageName) { + final ResolveInfo info = new ResolveInfo(); + info.handleAllWebDataURI = true; + info.activityInfo = new ActivityInfo(); + info.activityInfo.packageName = packageName; + return info; + } + + private ApplicationInfo createApplicationInfo(String packageName) { + final ApplicationInfo info = new ApplicationInfo(); + info.packageName = packageName; + return info; + } } From 97915b15d9e7dc91159115d6b50ec342f897c93f Mon Sep 17 00:00:00 2001 From: Steven Wu Date: Thu, 24 May 2018 20:29:34 -0400 Subject: [PATCH 10/21] Add a flashlight slice in settings. - It retrieves the flashlight status from Settings.Secure. - It uses the broadcast relay to update flashlight status without action on the slice. Test: robotests Change-Id: Ib4d636541f5166b8634326cce76aed5665989b76 Fixes: 74913192 --- res/drawable/ic_signal_flashlight.xml | 28 ++++ .../flashlight/FlashlightSliceBuilder.java | 156 ++++++++++++++++++ .../slices/SettingsSliceProvider.java | 63 ++++--- .../slices/SliceBroadcastReceiver.java | 5 + .../FlashlightSliceBuilderTest.java | 81 +++++++++ .../slices/SettingsSliceProviderTest.java | 15 +- 6 files changed, 320 insertions(+), 28 deletions(-) create mode 100644 res/drawable/ic_signal_flashlight.xml create mode 100644 src/com/android/settings/flashlight/FlashlightSliceBuilder.java create mode 100644 tests/robotests/src/com/android/settings/flashlight/FlashlightSliceBuilderTest.java diff --git a/res/drawable/ic_signal_flashlight.xml b/res/drawable/ic_signal_flashlight.xml new file mode 100644 index 00000000000..e63595300d5 --- /dev/null +++ b/res/drawable/ic_signal_flashlight.xml @@ -0,0 +1,28 @@ + + + + + + diff --git a/src/com/android/settings/flashlight/FlashlightSliceBuilder.java b/src/com/android/settings/flashlight/FlashlightSliceBuilder.java new file mode 100644 index 00000000000..6317ce760f4 --- /dev/null +++ b/src/com/android/settings/flashlight/FlashlightSliceBuilder.java @@ -0,0 +1,156 @@ +/* + * 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.flashlight; + +import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; +import static androidx.slice.builders.ListBuilder.ICON_IMAGE; + +import android.annotation.ColorInt; +import android.app.PendingIntent; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraManager; +import android.net.Uri; +import android.provider.Settings; +import android.provider.Settings.Secure; +import android.provider.SettingsSlicesContract; +import android.util.Log; + +import androidx.core.graphics.drawable.IconCompat; +import com.android.settings.R; +import com.android.settings.Utils; +import com.android.settings.slices.SettingsSliceProvider; +import com.android.settings.slices.SliceBroadcastReceiver; + +import androidx.slice.Slice; +import androidx.slice.builders.ListBuilder; +import androidx.slice.builders.SliceAction; + +import android.app.StatusBarManager; + + +/** + * Utility class to build a Flashlight Slice, and handle all associated actions. + */ +public class FlashlightSliceBuilder { + + private static final String TAG = "FlashlightSliceBuilder"; + + public static final String KEY_FLASHLIGHT = "flashlight"; + + /** + * Backing Uri for the Flashlight Slice. + */ + public static final Uri FLASHLIGHT_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) + .appendPath(KEY_FLASHLIGHT) + .build(); + + /** + * Action notifying a change on the Flashlight Slice. + */ + public static final String ACTION_FLASHLIGHT_SLICE_CHANGED = + "com.android.settings.flashlight.action.FLASHLIGHT_SLICE_CHANGED"; + + /** + * Action broadcasting a change on whether flashlight is on or off. + */ + public static final String ACTION_FLASHLIGHT_CHANGED = + "com.android.settings.flashlight.action.FLASHLIGHT_CHANGED"; + + public static final IntentFilter INTENT_FILTER = new IntentFilter(ACTION_FLASHLIGHT_CHANGED); + + private FlashlightSliceBuilder() {} + + /** + * Return a Flashlight Slice bound to {@link #FLASHLIGHT_URI}. + */ + public static Slice getSlice(Context context) { + if (!isFlashlightAvailable(context)) { + return null; + } + final PendingIntent toggleAction = getBroadcastIntent(context); + @ColorInt final int color = Utils.getColorAccentDefaultColor(context); + final IconCompat icon = + IconCompat.createWithResource(context, R.drawable.ic_signal_flashlight); + return new ListBuilder(context, FLASHLIGHT_URI, ListBuilder.INFINITY) + .setAccentColor(color) + .addRow(b -> b + .setTitle(context.getText(R.string.power_flashlight)) + .setTitleItem(icon, ICON_IMAGE) + .setPrimaryAction( + new SliceAction(toggleAction, null, isFlashlightEnabled(context)))) + .build(); + } + + /** + * Update the current flashlight status to the boolean value keyed by + * {@link android.app.slice.Slice#EXTRA_TOGGLE_STATE} on {@param intent}. + */ + public static void handleUriChange(Context context, Intent intent) { + try { + final String cameraId = getCameraId(context); + if (cameraId != null) { + final boolean state = intent.getBooleanExtra( + EXTRA_TOGGLE_STATE, isFlashlightEnabled(context)); + final CameraManager cameraManager = context.getSystemService(CameraManager.class); + cameraManager.setTorchMode(cameraId, state); + } + } catch (CameraAccessException e) { + Log.e(TAG, "Camera couldn't set torch mode.", e); + } + context.getContentResolver().notifyChange(FLASHLIGHT_URI, null); + } + + private static String getCameraId(Context context) throws CameraAccessException { + final CameraManager cameraManager = context.getSystemService(CameraManager.class); + final String[] ids = cameraManager.getCameraIdList(); + for (String id : ids) { + CameraCharacteristics c = cameraManager.getCameraCharacteristics(id); + Boolean flashAvailable = c.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); + Integer lensFacing = c.get(CameraCharacteristics.LENS_FACING); + if (flashAvailable != null && flashAvailable + && lensFacing != null && lensFacing == CameraCharacteristics.LENS_FACING_BACK) { + return id; + } + } + return null; + } + + private static PendingIntent getBroadcastIntent(Context context) { + final Intent intent = new Intent(ACTION_FLASHLIGHT_SLICE_CHANGED); + intent.setClass(context, SliceBroadcastReceiver.class); + return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, + PendingIntent.FLAG_CANCEL_CURRENT); + } + + private static boolean isFlashlightAvailable(Context context) { + return Settings.Secure.getInt( + context.getContentResolver(), Secure.FLASHLIGHT_AVAILABLE, 0) == 1; + } + + private static boolean isFlashlightEnabled(Context context) { + return Settings.Secure.getInt( + context.getContentResolver(), Secure.FLASHLIGHT_ENABLED, 0) == 1; + } +} diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java index db09a378e1b..7eda82b902f 100644 --- a/src/com/android/settings/slices/SettingsSliceProvider.java +++ b/src/com/android/settings/slices/SettingsSliceProvider.java @@ -34,6 +34,7 @@ import android.util.Pair; import com.android.settings.bluetooth.BluetoothSliceBuilder; import com.android.settings.core.BasePreferenceController; +import com.android.settings.flashlight.FlashlightSliceBuilder; import com.android.settings.location.LocationSliceBuilder; import com.android.settings.notification.ZenModeSliceBuilder; import com.android.settings.mobilenetwork.Enhanced4gLteSliceHelper; @@ -160,6 +161,10 @@ public class SettingsSliceProvider extends SliceProvider { } else if (BluetoothSliceBuilder.BLUETOOTH_URI.equals(sliceUri)) { registerIntentToUri(BluetoothSliceBuilder.INTENT_FILTER, sliceUri); return; + } else if (FlashlightSliceBuilder.FLASHLIGHT_URI.equals(sliceUri)) { + registerIntentToUri(FlashlightSliceBuilder.INTENT_FILTER , sliceUri); + mRegisteredUris.add(sliceUri); + return; } // Start warming the slice, we expect someone will want it soon. @@ -191,32 +196,35 @@ public class SettingsSliceProvider extends SliceProvider { Log.e(TAG, "Requested blocked slice with Uri: " + sliceUri); return null; } - // If adding a new Slice, do not directly match Slice URIs. - // Use {@link SlicesDatabaseAccessor}. - if (WifiCallingSliceHelper.WIFI_CALLING_URI.equals(sliceUri)) { - return FeatureFactory.getFactory(getContext()) - .getSlicesFeatureProvider() - .getNewWifiCallingSliceHelper(getContext()) - .createWifiCallingSlice(sliceUri); - } else if (WifiSliceBuilder.WIFI_URI.equals(sliceUri)) { - return WifiSliceBuilder.getSlice(getContext()); - } else if (ZenModeSliceBuilder.ZEN_MODE_URI.equals(sliceUri)) { - return ZenModeSliceBuilder.getSlice(getContext()); - } else if (BluetoothSliceBuilder.BLUETOOTH_URI.equals(sliceUri)) { - return BluetoothSliceBuilder.getSlice(getContext()); - } else if (LocationSliceBuilder.LOCATION_URI.equals(sliceUri)) { - return LocationSliceBuilder.getSlice(getContext()); - } else if (Enhanced4gLteSliceHelper.SLICE_URI.equals(sliceUri)) { - return FeatureFactory.getFactory(getContext()) - .getSlicesFeatureProvider() - .getNewEnhanced4gLteSliceHelper(getContext()) - .createEnhanced4gLteSlice(sliceUri); - } else if (WifiCallingSliceHelper.WIFI_CALLING_PREFERENCE_URI.equals(sliceUri)) { - return FeatureFactory.getFactory(getContext()) - .getSlicesFeatureProvider() - .getNewWifiCallingSliceHelper(getContext()) - .createWifiCallingPreferenceSlice(sliceUri); - } + + // If adding a new Slice, do not directly match Slice URIs. + // Use {@link SlicesDatabaseAccessor}. + if (WifiCallingSliceHelper.WIFI_CALLING_URI.equals(sliceUri)) { + return FeatureFactory.getFactory(getContext()) + .getSlicesFeatureProvider() + .getNewWifiCallingSliceHelper(getContext()) + .createWifiCallingSlice(sliceUri); + } else if (WifiSliceBuilder.WIFI_URI.equals(sliceUri)) { + return WifiSliceBuilder.getSlice(getContext()); + } else if (ZenModeSliceBuilder.ZEN_MODE_URI.equals(sliceUri)) { + return ZenModeSliceBuilder.getSlice(getContext()); + } else if (BluetoothSliceBuilder.BLUETOOTH_URI.equals(sliceUri)) { + return BluetoothSliceBuilder.getSlice(getContext()); + } else if (LocationSliceBuilder.LOCATION_URI.equals(sliceUri)) { + return LocationSliceBuilder.getSlice(getContext()); + } else if (Enhanced4gLteSliceHelper.SLICE_URI.equals(sliceUri)) { + return FeatureFactory.getFactory(getContext()) + .getSlicesFeatureProvider() + .getNewEnhanced4gLteSliceHelper(getContext()) + .createEnhanced4gLteSlice(sliceUri); + } else if (WifiCallingSliceHelper.WIFI_CALLING_PREFERENCE_URI.equals(sliceUri)) { + return FeatureFactory.getFactory(getContext()) + .getSlicesFeatureProvider() + .getNewWifiCallingSliceHelper(getContext()) + .createWifiCallingPreferenceSlice(sliceUri); + } else if (FlashlightSliceBuilder.FLASHLIGHT_URI.equals(sliceUri)) { + return FlashlightSliceBuilder.getSlice(getContext()); + } SliceData cachedSliceData = mSliceWeakDataCache.get(sliceUri); if (cachedSliceData == null) { @@ -381,7 +389,8 @@ public class SettingsSliceProvider extends SliceProvider { private List getSpecialCaseOemUris() { return Arrays.asList( - ZenModeSliceBuilder.ZEN_MODE_URI + ZenModeSliceBuilder.ZEN_MODE_URI, + FlashlightSliceBuilder.FLASHLIGHT_URI ); } diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java index 9f1ef769d7d..95f053844e5 100644 --- a/src/com/android/settings/slices/SliceBroadcastReceiver.java +++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java @@ -17,6 +17,7 @@ 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.notification.ZenModeSliceBuilder.ACTION_ZEN_MODE_SLICE_CHANGED; import static com.android.settings.slices.SettingsSliceProvider.ACTION_SLIDER_CHANGED; import static com.android.settings.slices.SettingsSliceProvider.ACTION_TOGGLE_CHANGED; @@ -45,6 +46,7 @@ import com.android.settings.bluetooth.BluetoothSliceBuilder; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.SliderPreferenceController; import com.android.settings.core.TogglePreferenceController; +import com.android.settings.flashlight.FlashlightSliceBuilder; import com.android.settings.notification.ZenModeSliceBuilder; import com.android.settings.overlay.FeatureFactory; import com.android.settings.wifi.WifiSliceBuilder; @@ -102,6 +104,9 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { .getNewWifiCallingSliceHelper(context) .handleWifiCallingPreferenceChanged(intent); break; + case ACTION_FLASHLIGHT_SLICE_CHANGED: + FlashlightSliceBuilder.handleUriChange(context, intent); + break; default: final String uriString = intent.getStringExtra(SliceBroadcastRelay.EXTRA_URI); if (!TextUtils.isEmpty(uriString)) { diff --git a/tests/robotests/src/com/android/settings/flashlight/FlashlightSliceBuilderTest.java b/tests/robotests/src/com/android/settings/flashlight/FlashlightSliceBuilderTest.java new file mode 100644 index 00000000000..5862ab3d286 --- /dev/null +++ b/tests/robotests/src/com/android/settings/flashlight/FlashlightSliceBuilderTest.java @@ -0,0 +1,81 @@ +/* + * 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.flashlight; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + +import android.content.Context; + +import com.android.settings.R; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.SliceTester; + +import android.content.res.Resources; +import android.provider.Settings; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RuntimeEnvironment; + +import java.util.List; + +import androidx.slice.Slice; +import androidx.slice.SliceItem; +import androidx.slice.SliceMetadata; +import androidx.slice.SliceProvider; +import androidx.slice.core.SliceAction; +import androidx.slice.widget.SliceLiveData; + + +@RunWith(SettingsRobolectricTestRunner.class) +public class FlashlightSliceBuilderTest { + + private Context mContext; + + @Before + public void setUp() { + mContext = spy(RuntimeEnvironment.application); + + // Prevent crash in SliceMetadata. + Resources resources = spy(mContext.getResources()); + doReturn(60).when(resources).getDimensionPixelSize(anyInt()); + doReturn(resources).when(mContext).getResources(); + + // Set-up specs for SliceMetadata. + SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); + } + + @Test + public void getFlashlightSlice_correctData() { + Settings.Secure.putInt( + mContext.getContentResolver(), Settings.Secure.FLASHLIGHT_AVAILABLE, 1); + final Slice slice = FlashlightSliceBuilder.getSlice(mContext); + final SliceMetadata metadata = SliceMetadata.from(mContext, slice); + + final List toggles = metadata.getToggles(); + assertThat(toggles).hasSize(1); + + final List sliceItems = slice.getItems(); + SliceTester.assertTitle(sliceItems, mContext.getString(R.string.power_flashlight)); + } +} diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java index 6b1262a1e2c..c72e9f6c542 100644 --- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java +++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java @@ -33,10 +33,12 @@ import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.os.StrictMode; +import android.provider.Settings; import android.provider.SettingsSlicesContract; import android.util.ArraySet; import com.android.settings.bluetooth.BluetoothSliceBuilder; +import com.android.settings.flashlight.FlashlightSliceBuilder; import com.android.settings.location.LocationSliceBuilder; import com.android.settings.notification.ZenModeSliceBuilder; import com.android.settings.testutils.DatabaseTestUtils; @@ -95,7 +97,8 @@ public class SettingsSliceProviderTest { ); private static final List SPECIAL_CASE_OEM_URIS = Arrays.asList( - ZenModeSliceBuilder.ZEN_MODE_URI + ZenModeSliceBuilder.ZEN_MODE_URI, + FlashlightSliceBuilder.FLASHLIGHT_URI ); @Before @@ -444,6 +447,16 @@ public class SettingsSliceProviderTest { assertThat(wifiSlice.getUri()).isEqualTo(WifiSliceBuilder.WIFI_URI); } + @Test + public void bindSlice_flashlightSlice_returnsFlashlightSlice() { + Settings.Secure.putInt( + mContext.getContentResolver(), Settings.Secure.FLASHLIGHT_AVAILABLE, 1); + + final Slice flashlightSlice = mProvider.onBindSlice(FlashlightSliceBuilder.FLASHLIGHT_URI); + + assertThat(flashlightSlice.getUri()).isEqualTo(FlashlightSliceBuilder.FLASHLIGHT_URI); + } + @Test public void onSlicePinned_noIntentRegistered_specialCaseUri_doesNotCrash() { final Uri uri = new Uri.Builder() From da412f07e5a8833dc96f820ac13c44bb70114ac6 Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 6 Jun 2018 11:00:09 -0400 Subject: [PATCH 11/21] If zen settings are updated, don't show onboarding Change-Id: I33c328e5d90f1b948c7dacb2e7f6265a1e496d35 Bug: 109668117 Test: ZenOnboardingActivity --- .../notification/ZenOnboardingActivity.java | 6 ++++ .../ZenOnboardingActivityTest.java | 36 ++++++++++++++++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/notification/ZenOnboardingActivity.java b/src/com/android/settings/notification/ZenOnboardingActivity.java index 7b50dde157c..99bc1723c1e 100644 --- a/src/com/android/settings/notification/ZenOnboardingActivity.java +++ b/src/com/android/settings/notification/ZenOnboardingActivity.java @@ -157,6 +157,12 @@ public class ZenOnboardingActivity extends Activity { // ZEN_SETTINGS_UPDATED is true for: // - fresh P+ device // - if zen visual effects values were changed by the user in Settings + NotificationManager nm = context.getSystemService(NotificationManager.class); + if (NotificationManager.Policy.areAllVisualEffectsSuppressed( + nm.getNotificationPolicy().suppressedVisualEffects)) { + Settings.Global.putInt(context.getContentResolver(), + Settings.Global.ZEN_SETTINGS_UPDATED, 1); + } return Settings.Global.getInt(context.getContentResolver(), Settings.Global.ZEN_SETTINGS_UPDATED, 0) != 0; } diff --git a/tests/robotests/src/com/android/settings/notification/ZenOnboardingActivityTest.java b/tests/robotests/src/com/android/settings/notification/ZenOnboardingActivityTest.java index e09dc0d2b8c..3ca9fdac779 100644 --- a/tests/robotests/src/com/android/settings/notification/ZenOnboardingActivityTest.java +++ b/tests/robotests/src/com/android/settings/notification/ZenOnboardingActivityTest.java @@ -51,6 +51,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; +import org.robolectric.shadows.ShadowApplication; @RunWith(SettingsRobolectricTestRunner.class) public class ZenOnboardingActivityTest { @@ -68,6 +69,8 @@ public class ZenOnboardingActivityTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); + ShadowApplication shadowApplication = ShadowApplication.getInstance(); + shadowApplication.setSystemService(Context.NOTIFICATION_SERVICE, mNm); mActivity = Robolectric.buildActivity(ZenOnboardingActivity.class) .create() @@ -124,6 +127,9 @@ public class ZenOnboardingActivityTest { @Test public void isSuggestionComplete_zenUpdated() { + Policy policy = new Policy(0, 0, 0, 0); + when(mNm.getNotificationPolicy()).thenReturn(policy); + setZenUpdated(true); setShowSettingsSuggestion(false); setWithinTimeThreshold(true); @@ -132,6 +138,9 @@ public class ZenOnboardingActivityTest { @Test public void isSuggestionComplete_withinTimeThreshold() { + Policy policy = new Policy(0, 0, 0, 0); + when(mNm.getNotificationPolicy()).thenReturn(policy); + setZenUpdated(false); setShowSettingsSuggestion(false); setWithinTimeThreshold(true); @@ -140,6 +149,9 @@ public class ZenOnboardingActivityTest { @Test public void isSuggestionComplete_showSettingsSuggestionTrue() { + Policy policy = new Policy(0, 0, 0, 0); + when(mNm.getNotificationPolicy()).thenReturn(policy); + setZenUpdated(false); setShowSettingsSuggestion(true); setWithinTimeThreshold(false); @@ -148,17 +160,33 @@ public class ZenOnboardingActivityTest { @Test public void isSuggestionComplete_showSettingsSuggestionFalse_notWithinTimeThreshold() { + Policy policy = new Policy(0, 0, 0, 0); + when(mNm.getNotificationPolicy()).thenReturn(policy); + setZenUpdated(false); setShowSettingsSuggestion(false); setWithinTimeThreshold(false); assertThat(isSuggestionComplete(mContext)).isTrue(); } + + @Test + public void isSuggestionComplete_visualEffectsUpdated() { + // all values suppressed + Policy policy = new Policy(0, 0, 0, 511); + when(mNm.getNotificationPolicy()).thenReturn(policy); + + setZenUpdated(false); + setShowSettingsSuggestion(true); + setWithinTimeThreshold(true); + assertThat(isSuggestionComplete(mContext)).isTrue(); + assertThat(Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.ZEN_SETTINGS_UPDATED, -1)).isEqualTo(1); + } + + private void setZenUpdated(boolean updated) { - int zenUpdated = 0; - if (updated) { - zenUpdated = 1; - } + int zenUpdated = updated ? 1 : 0; Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ZEN_SETTINGS_UPDATED, zenUpdated); From 7a1d52eb061a7b936f15aa99b997a87f5bb0b16f Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Wed, 6 Jun 2018 12:52:05 -0700 Subject: [PATCH 12/21] Request Focus in fingerprint rename dialog Bug: 68841055 Test: Manual. dialog comes up with focused entry Change-Id: I5bb1b7227c1323595bf7f483e11e87e2c3550093 --- src/com/android/settings/fingerprint/FingerprintSettings.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java index 6eaf3d2d556..992c04b8f1c 100644 --- a/src/com/android/settings/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/fingerprint/FingerprintSettings.java @@ -781,6 +781,7 @@ public class FingerprintSettings extends SubSettings { if (mDeleteInProgress) { mAlertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false); } + mDialogTextField.requestFocus(); } }); if (mTextHadFocus == null || mTextHadFocus) { From e83388164c05bcf9c6a0752f7e2d53abbf82636d Mon Sep 17 00:00:00 2001 From: Salvador Martinez Date: Tue, 29 May 2018 17:53:02 -0700 Subject: [PATCH 13/21] Change UI for wireless AP tether band selection We decided to use the list preference after all due to some devices not supporting various combinations of AP configurations. This change makes it so that there are three different UIs depending on the configurations which are supported. - 5.0 GHz unsupported: disable the preference and just set the value to 2.4 GHz - all supported, no dual mode: allow the user to choose EITHER 2.4 GHz or 5.0 GHz - all supported, dual mode: allow the user to choose 2.4 GHz or BOTH 2.4 GHz & 5.0 GHz with 5.0 being preferred Test: atest SettingsRoboTests Bug: 80315296 Change-Id: I888d35811a98b8cf0155a3cb96c42ff762763378 --- res/values/arrays.xml | 20 +- res/values/strings.xml | 4 +- res/xml/wifi_tether_settings.xml | 8 +- .../HotspotApBandSelectionPreference.java | 258 ------------------ .../WifiTetherApBandPreferenceController.java | 67 +++-- .../HotspotApBandSelectionPreferenceTest.java | 158 ----------- ...iTetherApBandPreferenceControllerTest.java | 67 +++-- 7 files changed, 120 insertions(+), 462 deletions(-) delete mode 100644 src/com/android/settings/widget/HotspotApBandSelectionPreference.java delete mode 100644 tests/robotests/src/com/android/settings/widget/HotspotApBandSelectionPreferenceTest.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 37462f9ba7d..cbfc42814ab 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -268,17 +268,27 @@ - + + 0 + 1 + + + @string/wifi_ap_choose_2G @string/wifi_ap_choose_5G - - @string/wifi_ap_2G - @string/wifi_ap_5G + + 0 + -1 - + + @string/wifi_ap_choose_2G + @string/wifi_ap_prefer_5G + + + @string/wifi_ap_choose_auto @string/wifi_ap_choose_2G diff --git a/res/values/strings.xml b/res/values/strings.xml index e64bd87f8a5..773e17f8a4a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1993,8 +1993,10 @@ Auto 2.4 GHz Band - + 5.0 GHz Band + + 5.0 GHz Band preferred 2.4 GHz diff --git a/res/xml/wifi_tether_settings.xml b/res/xml/wifi_tether_settings.xml index e8694838189..3e8f93f6a6a 100644 --- a/res/xml/wifi_tether_settings.xml +++ b/res/xml/wifi_tether_settings.xml @@ -44,11 +44,7 @@ android:title="@string/wifi_hotspot_auto_off_title" android:summary="@string/wifi_hotspot_auto_off_summary" /> - + android:title="@string/wifi_hotspot_ap_band_title" /> diff --git a/src/com/android/settings/widget/HotspotApBandSelectionPreference.java b/src/com/android/settings/widget/HotspotApBandSelectionPreference.java deleted file mode 100644 index b249b993856..00000000000 --- a/src/com/android/settings/widget/HotspotApBandSelectionPreference.java +++ /dev/null @@ -1,258 +0,0 @@ -/* - * 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.widget; - -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.net.wifi.WifiConfiguration; -import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; -import androidx.annotation.VisibleForTesting; -import android.util.AttributeSet; -import android.view.View; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.LinearLayout; - -import com.android.settings.R; -import com.android.settingslib.CustomDialogPreference; - -import java.util.ArrayList; - -public class HotspotApBandSelectionPreference extends CustomDialogPreference implements - CompoundButton.OnCheckedChangeListener, DialogInterface.OnShowListener { - private static final int UNSET = Integer.MIN_VALUE; - - @VisibleForTesting - static final String KEY_CHECKED_BANDS = "checked_bands"; - @VisibleForTesting - static final String KEY_HOTSPOT_SUPER_STATE = "hotspot_super_state"; - - @VisibleForTesting - CheckBox mBox2G; - @VisibleForTesting - CheckBox mBox5G; - @VisibleForTesting - ArrayList mRestoredBands; - @VisibleForTesting - boolean mShouldRestore; - - private String[] mBandEntries; - private int mExistingConfigValue = UNSET; - - public HotspotApBandSelectionPreference(Context context) { - super(context); - } - - public HotspotApBandSelectionPreference(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public HotspotApBandSelectionPreference(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public HotspotApBandSelectionPreference(Context context, AttributeSet attrs, int defStyleAttr, - int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - @Override - protected void onRestoreInstanceState(Parcelable state) { - SavedState myState = (SavedState) state; - - super.onRestoreInstanceState(myState.getSuperState()); - - mShouldRestore = myState.shouldRestore; - if (mShouldRestore) { - mRestoredBands = new ArrayList<>(); - if (myState.enabled2G) { - mRestoredBands.add(WifiConfiguration.AP_BAND_2GHZ); - } - if (myState.enabled5G) { - mRestoredBands.add(WifiConfiguration.AP_BAND_5GHZ); - } - } else { - mRestoredBands = null; - } - updatePositiveButton(); - } - - @Override - protected void onBindDialogView(View view) { - super.onBindDialogView(view); - final Context context = getContext(); - - // Register so we can adjust the buttons if needed once the dialog is available. - setOnShowListener(this); - - mBandEntries = context.getResources().getStringArray(R.array.wifi_ap_band_config_full); - // add a checkbox for every band entry. - addApBandViews((LinearLayout) view); - // try to update the button just in case we already missed the onShow call. - updatePositiveButton(); - // clear any saved state so it doesn't leak across multiple rotations/dialog closings - mRestoredBands = null; - mShouldRestore = false; - } - - @Override - protected Parcelable onSaveInstanceState() { - final Parcelable superState = super.onSaveInstanceState(); - - SavedState myState = new SavedState(superState); - myState.shouldRestore = getDialog() != null; - myState.enabled2G = mBox2G != null && mBox2G.isChecked(); - myState.enabled5G = mBox5G != null && mBox5G.isChecked(); - return myState; - } - - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (!(buttonView instanceof CheckBox)) { - return; - } - updatePositiveButton(); - } - - @Override - protected void onClick(DialogInterface dialog, int which) { - // we only want to persist our enabled bands if apply is clicked - if (which == DialogInterface.BUTTON_POSITIVE) { - if (mBox2G.isChecked() || mBox5G.isChecked()) { - int wifiBand = getWifiBand(); - mExistingConfigValue = wifiBand; - callChangeListener(wifiBand); - } - } - } - - /** - * Used to set the band selection for the preference if one already exists - * @param band the band to set it to from {@link WifiConfiguration} - */ - public void setExistingConfigValue(int band) { - mExistingConfigValue = band; - } - - private void addApBandViews(LinearLayout view) { - mBox2G = view.findViewById(R.id.box_2g); - mBox2G.setText(mBandEntries[WifiConfiguration.AP_BAND_2GHZ]); - mBox2G.setChecked(restoreBandIfNeeded(WifiConfiguration.AP_BAND_2GHZ)); - mBox2G.setOnCheckedChangeListener(this); - - mBox5G = view.findViewById(R.id.box_5g); - mBox5G.setText(mBandEntries[WifiConfiguration.AP_BAND_5GHZ]); - mBox5G.setChecked(restoreBandIfNeeded(WifiConfiguration.AP_BAND_5GHZ)); - mBox5G.setOnCheckedChangeListener(this); - } - - private boolean restoreBandIfNeeded(int band) { - // Only use the provided config if we aren't restoring, restore if state available - return (isBandPreviouslySelected(band) && !mShouldRestore) - || (mShouldRestore && mRestoredBands.contains(band)); - } - - private void updatePositiveButton() { - AlertDialog dialog = (AlertDialog) getDialog(); - Button button = dialog == null ? null : dialog.getButton(DialogInterface.BUTTON_POSITIVE); - if (button != null && mBox5G != null && mBox2G != null) { - button.setEnabled(mBox2G.isChecked() || mBox5G.isChecked()); - } - } - - @VisibleForTesting - int getWifiBand() { - final boolean checked_2g = mBox2G.isChecked(); - final boolean checked_5g = mBox5G.isChecked(); - if (checked_2g && checked_5g) { - return WifiConfiguration.AP_BAND_ANY; - } else if (checked_2g && !checked_5g) { - return WifiConfiguration.AP_BAND_2GHZ; - } else if (checked_5g && !checked_2g) { - return WifiConfiguration.AP_BAND_5GHZ; - } else { - throw new IllegalStateException("Wifi Config only supports selecting one or all bands"); - } - } - - private boolean isBandPreviouslySelected(int bandIndex) { - switch(mExistingConfigValue) { - case WifiConfiguration.AP_BAND_ANY: - return true; - case WifiConfiguration.AP_BAND_2GHZ: - return bandIndex == 0; - case WifiConfiguration.AP_BAND_5GHZ: - return bandIndex == 1; - case UNSET: - default: - return false; - } - } - - @Override - public void onShow(DialogInterface dialog) { - updatePositiveButton(); - } - - private static class SavedState extends BaseSavedState { - boolean shouldRestore; - boolean enabled2G; - boolean enabled5G; - - public SavedState(Parcelable source) { - super(source); - } - - private SavedState(Parcel in) { - super(in); - shouldRestore = in.readByte() == 1; - enabled2G = in.readByte() == 1; - enabled5G = in.readByte() == 1; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeByte((byte) (shouldRestore ? 1 : 0)); - dest.writeByte((byte) (enabled2G ? 1: 0)); - dest.writeByte((byte) (enabled5G ? 1 : 0)); - } - - @Override - public String toString() { - return "HotspotApBandSelectionPreference.SavedState{" - + Integer.toHexString(System.identityHashCode(this)) - + " shouldRestore=" + shouldRestore - + " enabled2G=" + enabled2G - + " enabled5G=" + enabled5G + "}"; - } - - public static final Parcelable.Creator CREATOR - = new Parcelable.Creator() { - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } -} diff --git a/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java index 8dde24bdb47..b1f171be3d5 100644 --- a/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java +++ b/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java @@ -16,36 +16,32 @@ package com.android.settings.wifi.tether; -import static android.net.wifi.WifiConfiguration.AP_BAND_2GHZ; -import static android.net.wifi.WifiConfiguration.AP_BAND_5GHZ; - import android.content.Context; import android.content.res.Resources; -import android.icu.text.ListFormatter; import android.net.wifi.WifiConfiguration; + +import androidx.annotation.VisibleForTesting; +import androidx.preference.ListPreference; import androidx.preference.Preference; import android.util.Log; import com.android.settings.R; -import com.android.settings.widget.HotspotApBandSelectionPreference; public class WifiTetherApBandPreferenceController extends WifiTetherBasePreferenceController { private static final String TAG = "WifiTetherApBandPref"; private static final String PREF_KEY = "wifi_tether_network_ap_band"; - public static final String[] BAND_VALUES = - {String.valueOf(AP_BAND_2GHZ), String.valueOf(AP_BAND_5GHZ)}; - private final String[] mBandEntries; - private final String[] mBandSummaries; + private String[] mBandEntries; + private String[] mBandSummaries; private int mBandIndex; + private boolean isDualMode; public WifiTetherApBandPreferenceController(Context context, OnTetherConfigUpdateListener listener) { super(context, listener); - Resources res = mContext.getResources(); - mBandEntries = res.getStringArray(R.array.wifi_ap_band_config_full); - mBandSummaries = res.getStringArray(R.array.wifi_ap_band_summary_full); + isDualMode = mWifiManager.isDualModeSupported(); + updatePreferenceEntries(); } @Override @@ -55,7 +51,7 @@ public class WifiTetherApBandPreferenceController extends WifiTetherBasePreferen mBandIndex = 0; Log.d(TAG, "Updating band index to 0 because no config"); } else if (is5GhzBandSupported()) { - mBandIndex = config.apBand; + mBandIndex = validateSelection(config.apBand); Log.d(TAG, "Updating band index to " + mBandIndex); } else { config.apBand = 0; @@ -63,21 +59,23 @@ public class WifiTetherApBandPreferenceController extends WifiTetherBasePreferen mBandIndex = config.apBand; Log.d(TAG, "5Ghz not supported, updating band index to " + mBandIndex); } - HotspotApBandSelectionPreference preference = - (HotspotApBandSelectionPreference) mPreference; + ListPreference preference = + (ListPreference) mPreference; + preference.setEntries(mBandSummaries); + preference.setEntryValues(mBandEntries); if (!is5GhzBandSupported()) { preference.setEnabled(false); preference.setSummary(R.string.wifi_ap_choose_2G); } else { - preference.setExistingConfigValue(config.apBand); + preference.setValue(Integer.toString(config.apBand)); preference.setSummary(getConfigSummary()); } } String getConfigSummary() { if (mBandIndex == WifiConfiguration.AP_BAND_ANY) { - return ListFormatter.getInstance().format((Object[]) mBandSummaries); + return mContext.getString(R.string.wifi_ap_prefer_5G); } return mBandSummaries[mBandIndex]; } @@ -89,13 +87,46 @@ public class WifiTetherApBandPreferenceController extends WifiTetherBasePreferen @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - mBandIndex = (Integer) newValue; + mBandIndex = validateSelection(Integer.parseInt((String) newValue)); Log.d(TAG, "Band preference changed, updating band index to " + mBandIndex); preference.setSummary(getConfigSummary()); mListener.onTetherConfigUpdated(); return true; } + private int validateSelection(int band) { + // Reset the band to 2.4 GHz if we get a weird config back to avoid a crash. + final boolean isDualMode = mWifiManager.isDualModeSupported(); + + // unsupported states: + // 1: no dual mode means we can't have AP_BAND_ANY - default to 5GHZ + // 2: no 5 GHZ support means we can't have AP_BAND_5GHZ - default to 2GHZ + // 3: With Dual mode support we can't have AP_BAND_5GHZ - default to ANY + if (!isDualMode && WifiConfiguration.AP_BAND_ANY == band) { + return WifiConfiguration.AP_BAND_5GHZ; + } else if (!mWifiManager.is5GHzBandSupported() && WifiConfiguration.AP_BAND_5GHZ == band) { + return WifiConfiguration.AP_BAND_2GHZ; + } else if (isDualMode && WifiConfiguration.AP_BAND_5GHZ == band) { + return WifiConfiguration.AP_BAND_ANY; + } + + return band; + } + + @VisibleForTesting + void updatePreferenceEntries() { + Resources res = mContext.getResources(); + int entriesRes = R.array.wifi_ap_band_config_full; + int summariesRes = R.array.wifi_ap_band_summary_full; + // change the list options if this is a dual mode device + if (isDualMode) { + entriesRes = R.array.wifi_ap_band_dual_mode; + summariesRes = R.array.wifi_ap_band_dual_mode_summary; + } + mBandEntries = res.getStringArray(entriesRes); + mBandSummaries = res.getStringArray(summariesRes); + } + private boolean is5GhzBandSupported() { final String countryCode = mWifiManager.getCountryCode(); if (!mWifiManager.isDualBandSupported() || countryCode == null) { diff --git a/tests/robotests/src/com/android/settings/widget/HotspotApBandSelectionPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/HotspotApBandSelectionPreferenceTest.java deleted file mode 100644 index 0ffda3baa96..00000000000 --- a/tests/robotests/src/com/android/settings/widget/HotspotApBandSelectionPreferenceTest.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * 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.widget; - -import static com.android.settingslib.CustomDialogPreference.CustomPreferenceDialogFragment; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.app.AlertDialog; -import android.content.Context; -import android.net.wifi.WifiConfiguration; -import android.os.Bundle; -import android.os.Parcelable; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.LinearLayout; - -import com.android.settings.R; -import com.android.settings.testutils.SettingsRobolectricTestRunner; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.util.ReflectionHelpers; - -import java.util.List; - -@RunWith(SettingsRobolectricTestRunner.class) -public class HotspotApBandSelectionPreferenceTest { - private HotspotApBandSelectionPreference mPreference; - private Context mContext; - private Button mSaveButton; - private View mLayout; - - @Before - public void setUp() { - mContext = RuntimeEnvironment.application; - mSaveButton = spy(new Button(mContext)); - - final CustomPreferenceDialogFragment fragment = mock(CustomPreferenceDialogFragment.class); - final AlertDialog dialog = mock(AlertDialog.class); - when(fragment.getDialog()).thenReturn(dialog); - when(dialog.getButton(anyInt())).thenReturn(mSaveButton); - - mPreference = new HotspotApBandSelectionPreference(mContext); - ReflectionHelpers.setField(mPreference, "mFragment", fragment); - - final LayoutInflater inflater = LayoutInflater.from(mContext); - mLayout = inflater.inflate(R.layout.hotspot_ap_band_selection_dialog, - new LinearLayout(mContext), false); - } - - @Test - public void getWifiBand_updatesBandPresetConfigProvided() { - mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_ANY); - mPreference.onBindDialogView(mLayout); - - // check that the boxes are set correctly when a pre-existing config is set - assertThat(mPreference.getWifiBand()).isEqualTo(WifiConfiguration.AP_BAND_ANY); - } - - @Test - public void getWifiBand_updatesBandWhenBoxesToggled() { - mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_ANY); - mPreference.onBindDialogView(mLayout); - - assertThat(mPreference.getWifiBand()).isEqualTo(WifiConfiguration.AP_BAND_ANY); - - // make sure we have the expected box then toggle it - mPreference.mBox2G.setChecked(false); - - // check that band is updated - assertThat(mPreference.getWifiBand()).isEqualTo(WifiConfiguration.AP_BAND_5GHZ); - } - - @Test - public void onSaveInstanceState_skipWhenDialogGone() { - mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_2GHZ); - mPreference.onBindDialogView(mLayout); - // remove the fragment to make the dialog unavailable - ReflectionHelpers.setField(mPreference, "mFragment", null); - - mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_ANY); - mPreference.onBindDialogView(mLayout); - - // state should only be saved when the dialog is available - Parcelable parcelable = mPreference.onSaveInstanceState(); - mPreference.onRestoreInstanceState(parcelable); - assertThat(mPreference.mShouldRestore).isFalse(); - } - - @Test - public void onSaveInstanceState_doesNotCrashWhenViewGone() { - mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_2GHZ); - mPreference.onBindDialogView(mLayout); - // When the device dozes the view and dialog can become null - mPreference.mBox5G = null; - mPreference.mBox2G = null; - ReflectionHelpers.setField(mPreference, "mFragment", null); - - // make sure it does not crash and state is not restored - Parcelable parcelable = mPreference.onSaveInstanceState(); - mPreference.onRestoreInstanceState(parcelable); - assertThat(mPreference.mShouldRestore).isFalse(); - } - - @Test - public void onSaveInstanceState_presentWhenDialogPresent() { - mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_2GHZ); - mPreference.onBindDialogView(mLayout); - - Parcelable parcelable = mPreference.onSaveInstanceState(); - mPreference.onRestoreInstanceState(parcelable); - assertThat(mPreference.mShouldRestore).isTrue(); - } - - @Test - public void positiveButton_updatedCorrectly() { - mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_ANY); - mPreference.onBindDialogView(mLayout); - - // button is enabled whole time so far since we have a pre-existing selection - verify(mSaveButton, never()).setEnabled(false); - - // clear all boxes and make sure it stays enabled until empty - mPreference.mBox2G.setChecked(false); - mPreference.mBox5G.setChecked(false); - - // button should be disabled now - verify(mSaveButton, times(1)).setEnabled(false); - } -} diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceControllerTest.java index 4b81b345001..4b2aa1c6418 100644 --- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceControllerTest.java @@ -18,6 +18,7 @@ package com.android.settings.wifi.tether; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -26,16 +27,16 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; + +import androidx.preference.ListPreference; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settings.widget.HotspotApBandSelectionPreference; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; @@ -43,8 +44,9 @@ import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) public class WifiTetherApBandPreferenceControllerTest { - private static final String ALL_BANDS = "2.4 GHz and 5.0 GHz"; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private static final String ALL_BANDS = "5.0 GHz Band preferred"; + private static final String TWO_GHZ_STRING = "2.4 GHz Band"; + private static final String FIVE_GHZ_STRING = "5.0 GHz Band"; private Context mContext; @Mock private ConnectivityManager mConnectivityManager; @@ -56,12 +58,13 @@ public class WifiTetherApBandPreferenceControllerTest { private PreferenceScreen mScreen; private WifiTetherApBandPreferenceController mController; - private HotspotApBandSelectionPreference mPreference; + private ListPreference mPreference; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mPreference = new HotspotApBandSelectionPreference(RuntimeEnvironment.application); + mContext = spy(RuntimeEnvironment.application); + mPreference = new ListPreference(RuntimeEnvironment.application); when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager); when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)) .thenReturn(mConnectivityManager); @@ -71,6 +74,7 @@ public class WifiTetherApBandPreferenceControllerTest { WifiConfiguration config = new WifiConfiguration(); config.apBand = WifiConfiguration.AP_BAND_ANY; when(mWifiManager.getWifiApConfiguration()).thenReturn(new WifiConfiguration()); + when(mWifiManager.isDualModeSupported()).thenReturn(false); mController = new WifiTetherApBandPreferenceController(mContext, mListener); } @@ -79,9 +83,10 @@ public class WifiTetherApBandPreferenceControllerTest { public void display_5GhzSupported_shouldDisplayFullList() { when(mWifiManager.getCountryCode()).thenReturn("US"); when(mWifiManager.isDualBandSupported()).thenReturn(true); + when(mWifiManager.isDualModeSupported()).thenReturn(true); mController.displayPreference(mScreen); - mController.onPreferenceChange(mPreference, -1); + mController.onPreferenceChange(mPreference, "-1"); assertThat(mPreference.getSummary()).isEqualTo(ALL_BANDS); } @@ -110,24 +115,54 @@ public class WifiTetherApBandPreferenceControllerTest { } @Test - public void changePreference_shouldUpdateValue() { + public void changePreference_noDualModeWith5G_shouldUpdateValue() { when(mWifiManager.is5GHzBandSupported()).thenReturn(true); mController.displayPreference(mScreen); + // -1 is WifiConfiguration.AP_BAND_ANY, for 'Auto' option. This should be prevented from + // being set since it is invalid for this configuration + mController.onPreferenceChange(mPreference, "-1"); + assertThat(mController.getBandIndex()).isEqualTo(1); + assertThat(mPreference.getSummary()).isEqualTo(FIVE_GHZ_STRING); + verify(mListener, times(1)).onTetherConfigUpdated(); + + // set to 5 Ghz + mController.onPreferenceChange(mPreference, "1"); + assertThat(mController.getBandIndex()).isEqualTo(1); + assertThat(mPreference.getSummary()).isEqualTo(FIVE_GHZ_STRING); + verify(mListener, times(2)).onTetherConfigUpdated(); + + // set to 2 Ghz + mController.onPreferenceChange(mPreference, "0"); + assertThat(mController.getBandIndex()).isEqualTo(0); + assertThat(mPreference.getSummary()).isEqualTo(TWO_GHZ_STRING); + verify(mListener, times(3)).onTetherConfigUpdated(); + } + + @Test + public void changePreference_dualModeWith5G_shouldUpdateValue() { + when(mWifiManager.is5GHzBandSupported()).thenReturn(true); + when(mWifiManager.isDualModeSupported()).thenReturn(true); + + mController.displayPreference(mScreen); + // -1 is WifiConfiguration.AP_BAND_ANY, for 'Auto' option. - mController.onPreferenceChange(mPreference, -1); + mController.onPreferenceChange(mPreference, "-1"); assertThat(mController.getBandIndex()).isEqualTo(-1); assertThat(mPreference.getSummary()).isEqualTo(ALL_BANDS); + verify(mListener, times(1)).onTetherConfigUpdated(); - mController.onPreferenceChange(mPreference, 1); - assertThat(mController.getBandIndex()).isEqualTo(1); - assertThat(mPreference.getSummary()).isEqualTo("5.0 GHz"); + // should revert to the default for 5 Ghz only since this is not supported with this config + mController.onPreferenceChange(mPreference, "1"); + assertThat(mController.getBandIndex()).isEqualTo(-1); + assertThat(mPreference.getSummary()).isEqualTo(ALL_BANDS); + verify(mListener, times(2)).onTetherConfigUpdated(); - mController.onPreferenceChange(mPreference, 0); + // set to 2 Ghz + mController.onPreferenceChange(mPreference, "0"); assertThat(mController.getBandIndex()).isEqualTo(0); - assertThat(mPreference.getSummary()).isEqualTo("2.4 GHz"); - + assertThat(mPreference.getSummary()).isEqualTo(TWO_GHZ_STRING); verify(mListener, times(3)).onTetherConfigUpdated(); } @@ -136,7 +171,7 @@ public class WifiTetherApBandPreferenceControllerTest { // Set controller band index to 1 and verify is set. when(mWifiManager.is5GHzBandSupported()).thenReturn(true); mController.displayPreference(mScreen); - mController.onPreferenceChange(mPreference, 1); + mController.onPreferenceChange(mPreference, "1"); assertThat(mController.getBandIndex()).isEqualTo(1); // Disable 5Ghz band From ff3c83466c41cedb3f40ea495f5d852e240545c9 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 6 Jun 2018 13:20:03 -0700 Subject: [PATCH 14/21] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I8cc9d67a4676ed8db1d8c48a76478efc715375fb --- res/values-af/strings.xml | 1 - res/values-am/strings.xml | 1 - res/values-ar/strings.xml | 1 - res/values-as/strings.xml | 6 ++++-- res/values-az/strings.xml | 1 - res/values-b+sr+Latn/strings.xml | 1 - res/values-be/strings.xml | 8 ++++++-- res/values-bg/strings.xml | 1 - res/values-bn/strings.xml | 6 ++++-- res/values-bs/strings.xml | 9 ++++----- res/values-ca/strings.xml | 3 +-- res/values-cs/strings.xml | 1 - res/values-da/strings.xml | 1 - res/values-de/strings.xml | 1 - res/values-el/strings.xml | 1 - res/values-en-rAU/strings.xml | 1 - res/values-en-rCA/strings.xml | 1 - res/values-en-rGB/strings.xml | 1 - res/values-en-rIN/strings.xml | 1 - res/values-en-rXC/strings.xml | 1 - res/values-es-rUS/strings.xml | 1 - res/values-es/strings.xml | 3 +-- res/values-et/strings.xml | 6 ++++-- res/values-eu/strings.xml | 1 - res/values-fa/strings.xml | 6 ++++-- res/values-fi/strings.xml | 1 - res/values-fr-rCA/strings.xml | 1 - res/values-fr/strings.xml | 1 - res/values-gl/strings.xml | 1 - res/values-gu/strings.xml | 6 ++++-- res/values-hi/strings.xml | 6 ++++-- res/values-hr/strings.xml | 1 - res/values-hu/strings.xml | 6 ++++-- res/values-hy/strings.xml | 8 +++++--- res/values-in/strings.xml | 6 ++++-- res/values-is/strings.xml | 1 - res/values-it/strings.xml | 1 - res/values-iw/strings.xml | 8 ++++++-- res/values-ja/strings.xml | 13 ++++++------- res/values-ka/strings.xml | 6 ++++-- res/values-kk/strings.xml | 6 ++++-- res/values-km/strings.xml | 6 ++++-- res/values-kn/strings.xml | 6 ++++-- res/values-ko/strings.xml | 6 ++++-- res/values-ky/strings.xml | 6 ++++-- res/values-lo/strings.xml | 6 ++++-- res/values-lt/strings.xml | 8 ++++++-- res/values-lv/strings.xml | 7 +++++-- res/values-mk/strings.xml | 6 ++++-- res/values-ml/strings.xml | 6 ++++-- res/values-mn/strings.xml | 6 ++++-- res/values-mr/strings.xml | 6 ++++-- res/values-ms/strings.xml | 6 ++++-- res/values-my/strings.xml | 1 - res/values-nb/strings.xml | 6 ++++-- res/values-ne/strings.xml | 6 ++++-- res/values-nl/strings.xml | 1 - res/values-or/strings.xml | 6 ++++-- res/values-pa/strings.xml | 6 ++++-- res/values-pl/strings.xml | 1 - res/values-pt-rBR/strings.xml | 1 - res/values-pt-rPT/strings.xml | 1 - res/values-pt/strings.xml | 1 - res/values-ro/strings.xml | 7 +++++-- res/values-ru/strings.xml | 1 - res/values-si/strings.xml | 6 ++++-- res/values-sk/strings.xml | 1 - res/values-sl/strings.xml | 8 ++++++-- res/values-sq/strings.xml | 6 ++++-- res/values-sr/strings.xml | 1 - res/values-sv/strings.xml | 1 - res/values-sw/strings.xml | 1 - res/values-ta/strings.xml | 6 ++++-- res/values-te/strings.xml | 6 ++++-- res/values-th/strings.xml | 6 ++++-- res/values-tl/strings.xml | 6 ++++-- res/values-tr/strings.xml | 6 ++++-- res/values-uk/strings.xml | 1 - res/values-ur/strings.xml | 6 ++++-- res/values-uz/strings.xml | 1 - res/values-vi/strings.xml | 6 ++++-- res/values-zh-rCN/strings.xml | 6 ++++-- res/values-zh-rHK/strings.xml | 1 - res/values-zh-rTW/strings.xml | 1 - res/values-zu/strings.xml | 1 - 85 files changed, 187 insertions(+), 139 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index d194ca6b360..2654f5200ef 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -3775,7 +3775,6 @@ "Gebruik koeler skermkleure" "Skakel skerm af om kleur toe te pas" "Kameralasersensor" - "Logiese kamera as verstek" "Outomatiese stelselopdaterings" "Pas opdaterings toe wanneer toestel herbegin" "Gebruik" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index f51a85ae030..609611fde7a 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -3775,7 +3775,6 @@ "ቀዝቀዝ ያሉ የማሳያ ቀለሞችን ይጠቀሙ" "የቀለም ለውጥን ለመተግበር ማያ ገጹን ያጥፉት" "የካሜራ ሌዘር ዳሳሽ" - "ምክንያታዊ ካሜራ እንደ ነባሪ" "ራስ-ሰር የስርዓት ዝማኔዎች" "መሣሪያ ዳግም ሲጀምር ዝማኔዎችን ተፈጻሚ አድርግ" "አጠቃቀም" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 7c45e0727fa..0a4239d6f60 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -3995,7 +3995,6 @@ "استخدم ألوان عرض هادئة" "لتطبيق التغيير في اللون، أوقف الشاشة." "مُستشعِر الليزر في الكاميرا" - "الاختيار التلقائي للكاميرا" "تحديثات النظام التلقائية" "تطبيق التحديثات عند إعادة تشغيل الجهاز" "الاستخدام" diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml index adb14a077c2..87e2d26cc07 100644 --- a/res/values-as/strings.xml +++ b/res/values-as/strings.xml @@ -3341,7 +3341,10 @@ "কলৰ অনুমতি দিয়ক" "অসুবিধা নিদিব ম\'ড অন থকা অৱস্থাত অন্তৰ্গামী কলবোৰক অৱৰোধ কৰা হয়। আপুনি নিজৰ বন্ধু, পৰিয়ালৰ সদস্য় বা অন্য় সম্পৰ্কসমূহক আপোনাৰ সৈতে যোগাযোগ কৰিবৰ বাবে অনুমতি দিবলৈ ছেটিংসমূহ মিলাব পাৰে।" "তৰাযুক্ত সম্পৰ্কসমূহ" - + + %d অন্য + %d অন্য + "বাৰ্তাসমূহ" "বাৰ্তাৰ অনুমতি দিয়ক" "বাৰ্তাবোৰ" @@ -3774,7 +3777,6 @@ "শীতল ডিছপ্লে ৰং ব্যৱহাৰ কৰক" "ৰঙৰ সাল-সলনি প্ৰযোগ্য হ\'বলৈ স্ক্ৰীণ অফ কৰক" "কেমেৰা লেজাৰ ছেন্সৰ" - "ডিফ\'ল্ট হিচাপে লজিকেল কেমেৰা ছেট কৰা আছে" "স্বয়ংক্ৰিয় ছিষ্টেম আপডেটসমূহ" "ডিভাইচটো ৰিষ্টাৰ্ট হ\'লে আপডেট প্ৰয়োগ কৰক" "ব্যৱহাৰ" diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index c193bc010a6..2fdd4fb3a49 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -3775,7 +3775,6 @@ "Serinləşdirici ekran rənglərini istifadə edin" "Rəng dəyişikliyini tətbiq etmək üçün ekranı söndürün" "Kamera Lazer Sensoru" - "Defolt olaraq Məntiqi Kamera" "Avtomatik sistem güncəlləmələri" "Cihaz yenidən başladıqda güncəlləmələri tətbiq edin" "İstifadə" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index e971343cc46..134d3e1c087 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -3830,7 +3830,6 @@ "Koristi hladnije boje ekrana" "Da biste primenili promenu boje, isključite ekran" "Senzor lasera Kamere" - "Logička kamera kao podrazumevana" "Automatska ažuriranja sistema" "Primeni ispravke kad se uređaj ponovo pokrene" "Potrošnja" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 3702473106a..511576e2a33 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -3425,7 +3425,12 @@ "Дазволіць выклікі" "Калі ўключаны рэжым \"Не турбаваць\", уваходныя выклікі блакіруюцца. Вы можаце змяніць налады, каб дазволіць сябрам, членам сям\'і і іншым кантактам звязацца з вамі." "Пазначаныя кантакты" - + + Яшчэ %d + Яшчэ %d + Яшчэ %d + Яшчэ %d + "Паведамленні" "Дазволіць паведамленні" "Паведамленні" @@ -3882,7 +3887,6 @@ "Выкарыстоўваць больш халодныя колеры экрана" "Каб прымяніць змяненне колеру, адключыце экран" "Лазерны датчык камеры" - "Стандартная лагічная камера" "Аўтаматычныя абнаўленні сістэмы" "Ужыць абнаўленні падчас перазапуску прылады" "Выкарыстанне" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 26a26c832e1..9fae44a6007 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -3775,7 +3775,6 @@ "Използване на по-студени цветове за дисплея" "За да приложите промяната на цветовете, изключете екрана" "Сензор на лазера на камерата" - "Логическа камера по подразбиране" "Автоматични системни актуализации" "Прилагане на актуализациите, когато устройството се рестартира" "Пренос на данни" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index 4dd30ba4265..5e721016de2 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -3342,7 +3342,10 @@ "কলের অনুমতি দিন" "\'বিরক্ত করবেন না\' মোড চালু থাকলে ইনকামিং কল ব্লক করা হয়। আপনার বন্ধুবান্ধব, পরিবারের সদস্য অথবা অন্য পরিচিতিরা যাতে আপনার সাথে যোগাযোগ করতে পারেন তার জন্য আপনি সেটিংস অ্যাডজাস্ট করে নিতে পারেন।" "তারা চিহ্নিত পরিচিতি" - + + আরও %dটি + আরও %dটি + "মেসেজ" "মেসেজের অনুমতি দিন" "মেসেজ" @@ -3772,7 +3775,6 @@ "কুলার প্রদর্শনী রঙগুলি ব্যবহার করুন" "রঙের পরিবর্তন প্রয়োগ করতে, স্ক্রিন বন্ধ করুন" "ক্যামেরা লেজার সেন্সর" - "লজিক্যাল ক্যামেরা ডিফল্ট" "অটোমেটিক সিস্টেম আপডেটগুলি" "ডিভাইস রিস্টার্ট হওয়ার সময় আপগ্রেড প্রয়োগ করুন" "ব্যবহার" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index e298b922cb1..c83574b87b8 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -496,7 +496,7 @@ "Unesena lozinka je ispravna, ali nažalost vaši podaci su oštećeni. \n\nDa biste nastavili koristiti tablet, morate izvršiti vraćanje na fabričke postavke. Prilikom podešavanja tableta nakon ponovnog postavljanja, imat ćete priliku da vratite podatke čija sigurnosna kopija je spremljena u vaš Google račun." "Unesena lozinka je ispravna, ali nažalost vaši podaci su oštećeni. \n\nDa biste nastavili koristiti telefon, morate izvršiti vraćanje na fabričke postavke. Prilikom podešavanja telefona nakon ponovnog postavljanja, imat ćete priliku da vratite podatke čija sigurnosna kopija je spremljena u vaš Google račun." "Promjena načina unosa" - "Osigurajte telefon" + "Zaštitite telefon" "Postavite zaključavanje ekrana da zaštitite tablet" "Postavite zaključavanje ekrana da zaštitite uređaj" "Postavite zaključavanje ekrana da zaštitite telefon" @@ -3384,9 +3384,9 @@ "Kada je uključen način rada Ne ometaj, blokirani su dolazni pozivi. Postavke možete podesiti tako da omogućite prijateljima, porodici ili drugim kontaktima da vas kontaktiraju." "Kontakti označeni zvjezdicom" - %d drugi - %d druga - %d drugih + Još %d osoba + Još %d osobe + Još %d osoba "Poruke" "Dozvoli poruke" @@ -3830,7 +3830,6 @@ "Koristite hladnije boje prikaza" "Isključite ekran kako biste primijenili promjenu boje" "Laserski senzor kamere" - "Logička kamera kao zadana" "Automatsko ažuriranje sistema" "Ažuriraj nakon što se uređaj ponovo pokrene" "Potrošnja" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 9062d14b002..be4b720b465 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -205,7 +205,7 @@ "Atenció" "D\'acord" "El nom d\'amfitrió que has escrit no és vàlid." - "La llista d\'exclusió que has escrit no té un format adequat. Introdueix una llista separada per comes de dominis exclosos." + "La llista d\'exclusions que has escrit no té un format adequat. Introdueix una llista separada per comes de dominis exclosos." "Has de completar el camp del port." "El camp del port ha de ser buit si el camp de l\'amfitrió és buit." "El port que has escrit no és vàlid." @@ -3775,7 +3775,6 @@ "Utilitza colors de pantalla més freds" "Desactiva la pantalla per aplicar el canvi de color" "Sensor del làser de la càmera" - "Utilitza la càmera lògica com a predeterminada" "Actualitzacions del sistema automàtiques" "Aplica les actualitzacions quan es reiniciï el dispositiu" "Ús" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index fe5d1a320ee..4a493bf335c 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -3885,7 +3885,6 @@ "Použijí se studenější barvy zobrazení" "Chcete-li změnu barev použít, vypněte obrazovku" "Laserový senzor fotoaparátu" - "Logický fotoaparát jako výchozí" "Automatické aktualizace systému" "Nainstalovat aktualizace po restartu zařízení" "Využití" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index c1b755bb910..e4ff630a172 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -3775,7 +3775,6 @@ "Brug køligere skærmfarver" "Du skal slå skærmen fra, før du kan anvende farveændringer" "Kameraets lasersensor" - "Logisk kamera som standard" "Automatiske systemopdateringer" "Anvend opdateringer, når enheden genstarter" "Forbrug" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 2d5c1becb5d..26f8de4b6ea 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -3775,7 +3775,6 @@ "Kältere Displayfarben verwenden" "Deaktiviere den Bildschirm, um die neue Farbeinstellung zu übernehmen" "Kamera-Lasersensor" - "Logical Camera als Standard" "Automatische Systemupdates" "Updates anwenden, sobald das Gerät neu gestartet wird" "Nutzung" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 7728540926f..393e4ec75e3 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -3775,7 +3775,6 @@ "Χρήση πιο ψυχρών χρωμάτων οθόνης" "Για να εφαρμόσετε μια αλλαγή στο χρώμα, απενεργοποιήστε την οθόνη" "Αισθητήρας λέιζερ κάμερας" - "Logical Camera ως προεπιλογή" "Αυτόματες ενημερώσεις συστήματος" "Εφαρμογή ενημερώσεων κατά την επανεκκίνηση της συσκευής" "Χρήση" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 026037ecdc7..ee5f59f70c9 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -3775,7 +3775,6 @@ "Use cooler display colours" "To apply colour change, turn off screen" "Camera laser sensor" - "Logical Camera As Default" "Automatic system updates" "Apply updates when device restarts" "Usage" diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml index 416dabffabf..1ac434f0a17 100644 --- a/res/values-en-rCA/strings.xml +++ b/res/values-en-rCA/strings.xml @@ -3775,7 +3775,6 @@ "Use cooler display colours" "To apply colour change, turn off screen" "Camera laser sensor" - "Logical Camera As Default" "Automatic system updates" "Apply updates when device restarts" "Usage" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 026037ecdc7..ee5f59f70c9 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -3775,7 +3775,6 @@ "Use cooler display colours" "To apply colour change, turn off screen" "Camera laser sensor" - "Logical Camera As Default" "Automatic system updates" "Apply updates when device restarts" "Usage" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 026037ecdc7..ee5f59f70c9 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -3775,7 +3775,6 @@ "Use cooler display colours" "To apply colour change, turn off screen" "Camera laser sensor" - "Logical Camera As Default" "Automatic system updates" "Apply updates when device restarts" "Usage" diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml index 3edf548c851..e60268c5899 100644 --- a/res/values-en-rXC/strings.xml +++ b/res/values-en-rXC/strings.xml @@ -3774,7 +3774,6 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‎‎‏‎‏‏‎‏‎‏‎‎‎Use cooler display colors‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‎‏‏‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎To apply color change, turn off screen‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‏‎‏‏‎‏‏‎‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‎‏‎‎‎‎Camera Laser Sensor‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‏‏‎‎‎‏‎‎‎‎‏‏‏‎‏‏‎‏‎Logical Camera As Default‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‏‎‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‏‎‎‏‏‏‎‎‎‏‎‏‎‏‎‎Automatic system updates‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‏‏‏‏‎Apply updates when device restarts‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‎‏‎‏‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‎‏‏‎‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‎‎Usage‎‏‎‎‏‎" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index c4d1e438a88..9dbadf85730 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -3773,7 +3773,6 @@ "Usar colores de pantalla más fríos" "Para aplicar el cambio de color, apaga la pantalla" "Sensor láser de la cámara" - "Cámara lógica como predeterminada" "Actualizaciones automáticas del sistema" "Aplicar actualizaciones al reiniciar el dispositivo" "Uso" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index ac689be86b4..48155d8883d 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -2953,7 +2953,7 @@ "Bluetooth, modo de conducción" "Bluetooth, NFC" "Bluetooth" - "Aplicaciones y notific." + "Aplicaciones y notificaciones" "Permisos, aplicaciones predeterminadas" "Cuentas" "No se ha añadido ninguna cuenta" @@ -3775,7 +3775,6 @@ "Utilizar colores de pantalla más fríos" "Para aplicar el cambio de color, apaga la pantalla" "Sensor láser de la cámara" - "Usar cámara lógica como predeterminada" "Actualizaciones del sistema automáticas" "Aplicar actualizaciones cuando se reinicie el dispositivo" "Uso" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 5486d412f32..e1781468c14 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -3342,7 +3342,10 @@ "Luba kõned" "Kui funktsioon Mitte segada on sisse lülitatud, blokeeritakse sissetulevad kõned. Teil on võimalik seadeid kohandada, et võimaldada sõpradel, pereliikmetel või muudel kontaktidel teiega ühendust võtta." "Tärniga tähistatud kontaktid" - + + Veel %d inimest + Veel 1 inimene + "Sõnumid" "Luba sõnumid" "Sõnumid" @@ -3772,7 +3775,6 @@ "Kasutatakse külmemaid ekraanivärve" "Värvi muutmise rakendamiseks lülitage ekraan välja" "Kaamera laserandur" - "Vaikekaamera on Logical Camera" "Automaatsed süsteemivärskendused" "Rakenda värskendused seadme taaskäivitamisel" "Kasutus" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 613c961909a..c73270fd9b7 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -3775,7 +3775,6 @@ "Erabili kolore hotzagoak pantailan" "Kolorea aldatzeko, itzal ezazu pantaila" "Kameraren laser-sentsorea" - "Erabili kamera logikoa modu lehenetsian" "Sistemaren eguneratze automatikoak" "Aplikatu eguneratzeak gailua berrabiaraztean" "Erabilera" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index ce54180393c..30a82a8f247 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -3342,7 +3342,10 @@ "اجازه دادن به تماس‌های تلفنی" "وقتی «مزاحم نشوید» روشن است، تماس‌های ورودی مسدود می‌شوند. می‌توانید تنظیماتتان را به‌گونه‌ای انجام دهید که دوستانتان، خانواده یا سایر مخاطبین بتوانند به شما دسترسی پیدا کنند." "مخاطبین ستاره‌دار" - + + %d نفر دیگر + %d نفر دیگر + "پیام‌ها" "اجازه دادن به پیام‌ها" "پیام‌ها" @@ -3772,7 +3775,6 @@ "استفاده از رنگ‌های سردتر نمایشگر" "برای اعمال تغییر رنگ، صفحه را خاموش کنید" "حسگر لیزری دوربین" - "تنظیم دوربین مجازی به‌عنوان پیش‌فرض" "به‌روزرسانی‌های خودکار سیستم" "وقتی دستگاه راه‌اندازی مجدد می‌شود، به‌روزرسانی‌ها اعمال شود" "میزان مصرف" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 34ac79ee11f..6394754fed4 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -3775,7 +3775,6 @@ "Käytä viileämpiä värilämpötiloja" "Ota värin muutos käyttöön sammuttamalla näyttö." "Kameran laseranturi" - "Looginen kamera oletuksena" "Automaattiset järjestelmäpäivitykset" "Päivitä, kun laite käynnistyy uudelleen." "Käyttö" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index fb0e82e8ab3..654002ded53 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -3775,7 +3775,6 @@ "Utiliser des couleurs plus froides à l\'écran" "Pour appliquer la modification des couleurs, éteignez l\'écran" "Capteur laser de l\'appareil photo" - "Utiliser l\'appareil photo logique par défaut" "Mises à jour automatiques du système" "Appliquer les mises à jour au redémarrage de l\'appareil" "Utilisation" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 0b2fa395e67..38f6bfdebf5 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -3775,7 +3775,6 @@ "Utiliser des couleurs plus froides à l\'écran" "Pour appliquer la modification des couleurs, éteignez l\'écran." "Capteur du laser de l\'appareil photo" - "Caméra logique par défaut" "Mises à jour automatiques du système" "Appliquer les mises à jour au démarrage de l\'appareil" "Consommation" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index cce2cea4193..4d33a19552a 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -3776,7 +3776,6 @@ "Utiliza cores de visualización máis frías" "Para aplicar o cambio de cor, apaga a pantalla" "Sensor láser da cámara" - "Cámara lóxica como opción predeterminada" "Actualizacións automáticas do sistema" "Aplica as actualizacións cando se reinicia o dispositivo" "Uso" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index b7c39efdb4b..3756f807691 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -3342,7 +3342,10 @@ "કૉલને મંજૂરી આપો" "ખલેલ પાડશો નહીં મોડ ચાલુ હોય, ત્યારે ઇનકમિંગ કૉલ બ્લૉક કરવામાં આવે છે. તમારા મિત્રો, પરિવારજનો અથવા અન્ય સંપર્કો તમારો સંપર્ક કરી શકે તે માટે તમે સેટિંગને અનુકૂળ કરી શકો છો." "સ્ટાર આપેલ સંપર્કો" - + + %d અન્ય + %d અન્યો + "સંદેશા" "સંદેશાને મંજૂરી આપો" "સંદેશા" @@ -3772,7 +3775,6 @@ "વધુ કૂલ પ્રદર્શન રંગોનો ઉપયોગ કરો" "રંગ ફેરફાર લાગુ કરવા માટે, સ્ક્રીન બંધ કરો" "કૅમેરાનું લેસર સેન્સર" - "ડિફૉલ્ટ તરીકે લોજીકલ કૅમેરા" "સ્વચાલિત સિસ્ટમ અપડેટ્સ" "ઉપકરણ ફરી શરૂ થાય, ત્યારે અપડેટ લાગુ કરો" "વપરાશ" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index b7b7b4faf16..b41c1db4bd7 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -3342,7 +3342,10 @@ "कॉल आने की मंज़ूरी दें" "\'परेशान न करें\' सुविधा चालू होने पर आने वाले (इनकमिंग) कॉल पर रोक लगा दी जाएगी. आप सेटिंग में अपने हिसाब से बदलाव कर अपने दोस्तों, परिवार के सदस्यों और दूसरे संपर्कों के कॉल आने की मंज़ूरी दे सकते हैं." "तारे के निशान वाले संपर्क" - + + %d और संपर्क + %d और संपर्क + "मैसेज" "मैसेज दिखाने की मंज़ूरी दें" "मैसेज" @@ -3772,7 +3775,6 @@ "डिसप्ले में हलके रंगों का इस्तेमाल करें" "रंग बदलाव लागू करने के लिए, स्‍क्रीन बंद करें" "कैमरा लेज़र सेंसर" - "\'लॉजिकल कैमरा\' को डिफ़ॉल्ट कैमरे के तौर पर सेट करें" "अपने आप होने वाले सिस्टम अपडेट" "डिवाइस फिर से चालू होने पर अपडेट लागू करें" "उपयोग" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 084b5c5858a..817a54cc065 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -3830,7 +3830,6 @@ "Upotrebljavaj hladnije boje prikaza" "Da biste primijenili promjenu boje, isključite zaslon" "Laserski senzor fotoaparata" - "Logična kamera kao zadano" "Automatska ažuriranja sustava" "Primijeni ažuriranja pri ponovnom pokretanju uređaja" "Potrošnja" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index e9ffa3b97cd..b0c75c4c5e8 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -3342,7 +3342,10 @@ "Hívások engedélyezése" "Ha a „Ne zavarjanak” mód aktív, akkor a bejövő hívások tiltva vannak. A beállítások módosításával lehetővé teheti, hogy ismerősei, családtagjai vagy más névjegyei elérhessék Önt." "Csillagozott névjegyek" - + + %d további + 1 további + "Üzenetek" "Üzenetek engedélyezése" "Üzenetek" @@ -3772,7 +3775,6 @@ "Hidegebb színhőmérséklet használata a kijelzőn" "A színmódosítások alkalmazásához kapcsolja ki a képernyőt" "A kamera lézeres érzékelője" - "Logikai kamera alapértelmezettként" "Automatikus rendszerfrissítések" "Frissítések alkalmazása az eszköz újraindításakor" "Használat" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 4edc5b60215..752e69b9bbd 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -3342,7 +3342,10 @@ "Թույլատրել զանգերը" "«Չանհանգստացնել» ռեժիմում մուտքային զանգերն արգելափակված են: Փոփոխեք կարգավորումները, որպեսզի ձեր մտերիմները և այլ կոնտակտներ կարողանան կապվել ձեզ հետ:" "Աստղանշված կոնտակտներ" - + + Եվս %d կոնտակտ + Եվս %d կոնտակտ + "Հաղորդագրություններ" "Թույլատրել հաղորդագրությունները" "Հաղորդագրություններ" @@ -3389,7 +3392,7 @@ "Ակտիվացնել «Միայն զարթուցիչը» ռեժիմը մինչև %1$s-ը" "Ակտիվացնել «Միշտ ընդհատել» ռեժիմը" "Երբ էկրանը միացված է" - "Թույլատրել, «Չանհանգստացնել» ռեժիմում արգելված ծանուցումներին հայտնվել էկրանին և կարգավիճակի գոտում" + "Թույլատրել «Չանհանգստացնել» ռեժիմում արգելված ծանուցումներին հայտնվել էկրանին և կարգավիճակի գոտում" "Երբ էկրանն անջատված է" "«Չանհանգստացնել» գործառույթի միջոցով լռեցված ծանուցումներին թույլատրել միացնել էկրանն ու լուսաթարթել" "«Չանհանգստացնել» գործառույթի միջոցով լռեցված ծանուցումներին թույլատրել միացնել էկրանը" @@ -3772,7 +3775,6 @@ "Օգտագործել էկրանի ավելի սառը գույներ" "Գույնի փոփոխությունը կիրառելու համար անջատեք էկրանը" "Տեսախցիկի լազերային սենսոր" - "Տրամաբանական տեսախցիկ՝ որպես կանխադրված" "Ավտոմատ համակարգային թարմացումներ" "Տեղադրել թարմացումները վերագործարկելիս" "Օգտագործում" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index be1ed588495..c9214456973 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -3342,7 +3342,10 @@ "Izinkan panggilan" "Jika mode Jangan Ganggu diaktifkan, panggilan masuk diblokir. Anda dapat menyesuaikan setelan untuk mengizinkan teman, keluarga, atau kontak lain menghubungi Anda." "Kontak berbintang" - + + %d lainnya + 1 lainnya + "Pesan" "Izinkan pesan" "Pesan" @@ -3772,7 +3775,6 @@ "Gunakan suhu tampilan yang lebih sejuk" "Untuk menerapkan perubahan warna, nonaktifkan layar" "Sensor Laser Kamera" - "Kamera Logis Sebagai Default" "Update sistem otomatis" "Terapkan update saat perangkat dinyalakan ulang" "Penggunaan" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 5f83b89c101..ca0f2b8bf92 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -3775,7 +3775,6 @@ "Nota svalari skjáliti" "Slökktu á skjánum til að virkja litbreytinguna" "Leysigeislaskynjari myndavélar" - "Rökfræðileg myndavél sem sjálfgefin" "Sjálfvirkar kerfisuppfærslur" "Uppfæra þegar tækið er endurræst" "Notkun" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 21a0aaf3386..75a168b5ce0 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -3775,7 +3775,6 @@ "Utilizza colori del display più freddi" "Per applicare la modifica ai colori, disattiva lo schermo" "Sensore laser della fotocamera" - "Logical Camera come predefinita" "Aggiornamenti di sistema automatici" "Applica gli aggiornamenti al riavvio del dispositivo" "Utilizzo" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index b0b7589f980..41938e41ac0 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -3426,7 +3426,12 @@ "אני רוצה לאפשר שיחות" "כשמצב \'נא לא להפריע\' פועל, השיחות הנכנסות חסומות. ניתן לשנות את ההגדרות כדי לאפשר לחברים, לבני משפחה או לאנשי קשר אחרים ליצור איתך קשר." "אנשי קשר שמסומנים בכוכב" - + + %d נוספים + %d נוספים + %d נוספים + 1 נוסף + "הודעות" "אני רוצה לאפשר הודעות" "הודעות" @@ -3882,7 +3887,6 @@ "השתמש בצבעי תצוגה קרירים יותר" "כבה את המסך כדי להחיל שינוי צבע" "חיישן הלייזר של המצלמה" - "מצלמה לוגית כברירת מחדל" "עדכוני מערכת אוטומטיים" "החלת עדכונים כאשר המכשיר מופעל מחדש" "שימוש" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index c0c65f7b5ea..fd7faf9ab90 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -2158,7 +2158,7 @@ "スマートフォンの電池寿命の改善" "タブレットの電池寿命の改善" "端末の電池寿命の改善" - "Battery Manager を ON にしてください" + "バッテリー マネージャを ON にしてください" "バッテリー セーバーを ON にしてください" "電池が通常より早くなくなる可能性があります" "バッテリー セーバー ON" @@ -2201,19 +2201,19 @@ "アプリの電池使用量は正常です。アプリが電池を使いすぎる場合は、対処可能なおすすめの方法がスマートフォンに表示されます。\n\n電池の残量が少なくなったら、いつでもバッテリー セーバーを ON にできます。" "アプリの電池使用量は正常です。アプリが電池を使いすぎる場合は、対処可能なおすすめの方法がタブレットに表示されます。\n\n電池の残量が少なくなったら、いつでもバッテリー セーバーを ON にできます。" "アプリの電池使用量は正常です。アプリが電池を使いすぎる場合は、対処可能なおすすめの方法が端末に表示されます。\n\n電池の残量が少なくなったら、いつでもバッテリー セーバーを ON にできます。" - "Battery Manager" + "バッテリー マネージャ" "アプリを自動的に管理" "使用頻度の低いアプリの電池使用を制限します" - "Battery Manager によってアプリの電池使用量が多いことが検出された場合は、該当するアプリを制限できます。制限したアプリは正常に動作しないことがあります。また、通知が遅れる可能性もあります。" - "Battery Manager によってアプリの電池使用量が多いことが検出された場合は、該当するアプリを制限できます。制限したアプリは正常に動作しないことがあります。また、通知が遅れる可能性もあります。" - "Battery Manager によってアプリの電池使用量が多いことが検出された場合は、該当するアプリを制限できます。制限したアプリは正常に動作しないことがあります。また、通知が遅れる可能性もあります。" + "バッテリー マネージャによってアプリの電池使用量が多いことが検出された場合は、該当するアプリを制限できます。制限したアプリは正常に動作しないことがあります。また、通知が遅れる可能性もあります。" + "バッテリー マネージャによってアプリの電池使用量が多いことが検出された場合は、該当するアプリを制限できます。制限したアプリは正常に動作しないことがあります。また、通知が遅れる可能性もあります。" + "バッテリー マネージャによってアプリの電池使用量が多いことが検出された場合は、該当するアプリを制限できます。制限したアプリは正常に動作しないことがあります。また、通知が遅れる可能性もあります。" "制限されたアプリ" %1$d 個のアプリの電池使用を制限しています %1$d 個のアプリの電池使用を制限しています "このアプリがバックグラウンドで電池を使用していました。制限したアプリは正常に動作しないことがあります。また、通知が遅れる可能性もあります。" - "Battery Manager の使用" + "バッテリー マネージャの使用" "アプリの電池使用量が多いかどうかを検出します" "ON / アプリの電池使用量が多いかどうかを検出しています" "OFF" @@ -3779,7 +3779,6 @@ "寒色の表示色を使用します" "色の変更を適用するには、画面を OFF にしてください" "カメラのレーザー センサー" - "Logical Camera をデフォルトに設定" "自動システム アップデート" "端末の再起動時にアップデートを適用する" "使用量" diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index b633508585b..e2fd2192a88 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -3342,7 +3342,10 @@ "ზარების დაშვება" "როცა ჩართულია რეჟიმი „არ შემაწუხოთ“, შემომავალი ზარები იბლოკება. სურვილისამებრ, შეგიძლიათ შეცვალოთ პარამეტრები და მისცეთ თქვენთან დაკავშირების საშუალება მეგობრებს, ოჯახის წევრებს და სხვა კონტაქტებს." "ვარსკვლავით მონიშნული კონტაქტები" - + + %d სხვა + 1 სხვა + "შეტყობინებები" "შეტყობინებების დაშვება" "შეტყობინებები" @@ -3772,7 +3775,6 @@ "ეკრანზე ცივი ფერების გამოყენება" "ფერთა ცვლილების მისასადაგებლად, გამორთეთ ეკრანი" "კამერის ლაზერული სენსორი" - "ლოგიკური კამერის ნაგულისხმევად გამოყენება" "სისტემის ავტომატური განახლება" "განახლებების მიყენება მოწყობილობის გადატვირთვისას" "მოხმარება" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 778d8563b2e..7bc0504cbc8 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -3342,7 +3342,10 @@ "Қоңырауларға рұқсат ету" "\"Мазаламау\" режимі қосулы кезде, кіріс қоңыраулар бөгеледі. Достарыңыз, отбасы мүшелері не басқа контактілер сізге хабарласа алатын етіп параметрлерді реттей аласыз." "Жұлдызшалы контактілер" - + + Тағы %d контакт + Тағы 1 контакт + "Хабарлар" "Хабарларға рұқсат ету" "Хабарлар" @@ -3772,7 +3775,6 @@ "Суығырақ дисплей түстерін пайдалану" "Түс өзгерісін қолдану үшін экранды өшіріңіз" "Камераның лазерлік датчигі" - "Логикалық камераны әдепкі ретінде пайдалану" "Автоматты жүйе жаңартулары" "Құрылғы өшіп, қайта қосылғанда, жаңа нұсқа қолданылады" "Трафик" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index 15aa0e7b90a..2fde7775fab 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -3342,7 +3342,10 @@ "អនុញ្ញាត​ការហៅ" "នៅពេល​មុខងារ​កុំរំខាន​បើក ការហៅចូល​ត្រូវបាន​ទប់ស្កាត់។ អ្នកអាច​កែតម្រូវ​ការកំណត់ ដើម្បី​អនុញ្ញាតឱ្យ​មិត្តភ័ក្តិ គ្រួសារ ឬទំនាក់ទំនង​ផ្សេងទៀត​របស់អ្នក​អាចទាក់ទង​អ្នកបាន។​" "ទំនាក់​ទំនង​​​​​មាន​ផ្កាយ" - + + %d នាក់ទៀត + 1 នាក់ទៀត + "សារ" "អនុញ្ញាត​សារ" "សារ" @@ -3772,7 +3775,6 @@ "ប្រើពណ៌បង្ហាញត្រជាក់ជាងមុន" "ដើម្បីប្តូរពណ៌ សូមបិទអេក្រង់" "ឧបករណ៍ចាប់សញ្ញារបស់កាមេរ៉ាដែលការពារពន្លឺឡាស៊ែរ" - "Logical Camera ជាលំនាំដើម" "បច្ចុប្បន្នភាពប្រព័ន្ធដោយស្វ័យប្រវត្តិ" "អនុវត្ត​កំណែថ្មី ​នៅពេល​ឧបករណ៍​ចាប់ផ្តើម​ឡើងវិញ" "ការប្រើប្រាស់" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index cff6c4f6570..f5d713edbba 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -3342,7 +3342,10 @@ "ಕರೆಗಳಿಗೆ ಅನುಮತಿಸಿ" "ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆದಾಗ ಒಳಬರುವ ಕರೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಸ್ನೇಹಿತರು, ಕುಟುಂಬ, ಅಥವಾ ಇತರ ಸಂಪರ್ಕಗಳು ನಿಮ್ಮನ್ನು ತಲುಪಲು ಅನುಮತಿಸಲು ನೀವು ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಸರಿಹೊಂದಿಸಬಹುದು." "ನಕ್ಷತ್ರ ಹಾಕಿರುವ ಸಂಪರ್ಕಗಳು" - + + %d ಇತರೆ + %d ಇತರೆ + "ಸಂದೇಶಗಳು" "ಸಂದೇಶಗಳನ್ನು ಅನುಮತಿಸಿ" "ಸಂದೇಶಗಳು" @@ -3772,7 +3775,6 @@ "ತಂಪಾದ ಪ್ರದರ್ಶನ ಬಣ್ಣಗಳನ್ನು ಬಳಸಿ" "ಬಣ್ಣದ ಬದಲಾವಣೆಯನ್ನು ಅನ್ವಯಿಸಲು, ಪರದೆ ಆಫ್ ಮಾಡಿ" "ಕ್ಯಾಮೆರಾ ಲೇಸರ್ ಸೆನ್ಸರ್" - "ತಾರ್ಕಿಕ ಕ್ಯಾಮರಾವನ್ನು ಡೀಫಾಲ್ಟ್‌ನಂತೆ ಹೊಂದಿಸಲಾಗಿದೆ" "ಸ್ವಯಂಚಾಲಿತ ಸಿಸ್ಟಂ ಅಪ್‌ಡೇಟ್‌ಗಳು" "ಸಾಧನ ಮರುಪ್ರಾರಂಭಿಸಿದಾಗ ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಅನ್ವಯಿಸಿ" "ಬಳಕೆ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 6016a05a3ef..d300be1fb89 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -3342,7 +3342,10 @@ "통화 허용" "알림 일시중지가 사용 설정되어 있으면 수신 전화가 차단됩니다. 설정을 조정하여 친구, 가족 또는 연락처에 등록된 다른 사용자가 나에게 연락하도록 허용할 수 있습니다." "별표 표시한 연락처" - + + %d + 외 1명 + "메시지" "메시지 허용" "메시지" @@ -3772,7 +3775,6 @@ "더 차가운 디스플레이 색상 사용" "색상 변경을 적용하려면 화면을 끄세요." "카메라 레이저 센서" - "기본값으로 논리 카메라 전환" "자동 시스템 업데이트" "기기가 다시 시작되면 업데이트 적용" "사용량" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index a9c1821cf35..8912da63eb7 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -3341,7 +3341,10 @@ "Чалууларга уруксат берүү" "\"Тынчымды алба\" режими күйүп турганда кириш чалуулар бөгөттөлөт. Достор, үй-бүлө же башка тааныштарыңызга сиз менен байланышууга уруксат берүү үчүн жөндөөлөрдү тууралап алсаңыз болот." "Белгиленген байланыштар" - + + Башка %d байланыш + Башка 1 байланыш + "Билдирүүлөр" "Билдирүүлөргө уруксат берүү" "Билдирүүлөр" @@ -3771,7 +3774,6 @@ "Салкыныраак дисплей түстөрүн колдонуңуз" "Түс өзгөртүүлөрүн күчүнө киргизүү үчүн, экранды өчүрүңүз" "Камеранын лазердик сенсору" - "Логикалык камера демейки катары коюлду" "Тутум автоматтык түрдө жаңырып турат" "Жаңыртуулар түзмөк өчүрүлүп-күйгүзүлгөндө орнотулат" "Дайындардын өткөрүлүшү" diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index 4edbe2650aa..c4b8448bd0c 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -3342,7 +3342,10 @@ "ອະນຸຍາດການໂທ" "ສາຍໂທເຂົ້າຈະຖືກບລັອກໄວ້ເມື່ອເປີດໃຊ້ໂໝດຫ້າມລົບກວນ. ທ່ານສາມາດປັບແຕ່ງການຕັ້ງຄ່າເພື່ອອະນຸຍາດໃຫ້ໝູ່, ຄອບຄົວ ແລະ ລາຍຊື່ຜູ້ຕິດຕໍ່ຄົນອື່ນໆສາມາດຕິດຕໍ່ຫາທ່ານໄດ້." "ລາຍຊື່ຜູ້ຕິດຕໍ່ທີ່ຕິດດາວ" - + + ອີກ %d ຄົນ + ອີກ 1 ຄົນ + "ຂໍ້​ຄວາມ" "ອະນຸຍາດຂໍ້ຄວາມ" "ຂໍ້ຄວາມ" @@ -3772,7 +3775,6 @@ "ໃຊ້ສີຈໍສະແດງຜົນທີ່ເຢັນກວ່າ" "ເພື່ອນຳໃຊ້ການປ່ຽນສີ, ໃຫ້ປິດໜ້າຈໍ" "ເຊັນເຊີເລເຊີກ້ອງ" - "ກ້ອງ Logical ເປັນຄ່າເລີ່ມຕົ້ນ" "ການອັບເດດລະບົບອັດຕະໂນມັດ" "ອັບເດດເມື່ອອຸປະກອນຣີສະຕາດ" "ການໃຊ້" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index dc3a0ee7786..f05bae66f3a 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -3424,7 +3424,12 @@ "Leisti skambučius" "Kai įjungtas netrukdymo režimas, gaunamieji skambučiai blokuojami. Galite koreguoti nustatymus, kad jūsų šeimos nariai, draugai arba kiti kontaktai galėtų su jumis susisiekti." "Žvaigždute pažymėti kontaktai" - + + Dar %d kontaktas + Dar %d kontaktai + Dar %d kontakto + Dar %d kontaktų + "Pranešimai" "Leisti pranešimus" "Pranešimai" @@ -3880,7 +3885,6 @@ "Naudoti šaltesnes ekrano spalvas" "Kad pritaikytumėte spalvos pakeitimą, išjunkite ekraną" "Fotoaparato lazerio jutiklis" - "Loginis fotoaparatas kaip numatytasis" "Automatiniai sistemos naujiniai" "Atnaujinimai pritaikomi, kai įrenginys paleidžiamas iš naujo" "Naudojimas" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 296f9a2453e..4ca72db2b70 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -3383,7 +3383,11 @@ "Zvanu atļaušana" "Esot ieslēgtam režīmam Netraucēt, ienākošie zvani ir bloķēti. Varat pielāgot iestatījumus, lai draugi, ģimene vai citas kontaktpersonas varētu ar jums sazināties." "Ar zvaigznīti atzīmētas kontaktpersonas" - + + Vēl %d kontaktpersonu + Vēl %d kontaktpersona + Vēl %d kontaktpersonas + "Ziņojumi" "Ziņojumu atļaušana" "Ziņojumi" @@ -3826,7 +3830,6 @@ "Izmantot vēsākas krāsas" "Lai mainītu krāsas, izslēdziet ekrānu" "Kameras lāzera sensors" - "Loģiskā kamera kā noklusējums" "Automātiski sistēmas atjauninājumi" "Lietot atjauninājumus pēc ierīces restartēšanas" "Lietojums" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index ea622585ab0..f2673d44c89 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -3342,7 +3342,10 @@ "Дозволи повици" "Кога е вклучен режимот „Не вознемирувај“, сите дојдовни повици се блокирани. Може да ги приспособите поставките за да им дозволите на пријателите, семејството или другите контакти да ве добијат." "Контакти означени со ѕвезда" - + + %d друг + %d други + "Пораки" "Дозволи пораки" "Пораки" @@ -3772,7 +3775,6 @@ "Користи поладни бои на екранот" "За да се примени промената на бојата, исклучете го екранот" "Ласерски сензор за камерата" - "Логичката камера како стандардна" "Автоматски ажурирања на системот" "Применувај ажурирања кога уредот се рестартира" "Користење" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index 3262b76e1a2..8ef99685490 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -3342,7 +3342,10 @@ "കോളുകൾ അനുവദിക്കുക" "ശല്യപ്പെടുത്തരുത് ഓണായിരിക്കുമ്പോൾ, ഇൻകമിംഗ് കോളുകൾ ബ്ലോക്ക് ചെയ്യപ്പെടുന്നു. നിങ്ങളെ വിളിക്കുന്നതിന് സുഹൃത്തുക്കളെയോ കുടുംബാംഗങ്ങളെയോ മറ്റ് കോൺടാക്‌റ്റുകളെയോ അനുവദിക്കാൻ നിങ്ങൾക്ക് ക്രമീകരണം ക്രമപ്പെടുത്താവുന്നതാണ്." "നക്ഷത്രചിഹ്നമിട്ട കോൺടാക്‌റ്റുകൾ" - + + മറ്റ് %d പേർ + മറ്റൊരാൾ + "സന്ദേശങ്ങള്‍" "സന്ദേശങ്ങൾ അനുവദിക്കുക" "സന്ദേശങ്ങള്‍‌" @@ -3772,7 +3775,6 @@ "കൂടുതൽ തണുത്ത ഡിസ്പ്ലേ വർണ്ണങ്ങൾ ഉപയോഗിക്കുക" "വർണ്ണ മാറ്റം ബാധകമാക്കാൻ, സ്ക്രീൻ ഓഫാക്കുക" "ക്യാമറ ലേസർ സെൻസർ" - "ഡിഫോൾട്ടായി ലോജിക്കൽ ക്യാമറ" "സ്വമേധയായുള്ള സിസ്റ്റം അപ്ഡേറ്റുകൾ" "ഉപകരണം റീസ്‌റ്റാർട്ട് ചെയ്യുമ്പോൾ അപ്‌ഡേറ്റുകൾ ബാധകമാക്കുക" "ഉപയോഗം" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index aebed295eba..5950f4da98a 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -3340,7 +3340,10 @@ "Дуудлагыг зөвшөөрөх" "Бүү саад бол горим асаалттай үед ирсэн дуудлагыг блоклох болно. Та найз нөхөд, гэр бүлийнхэн эсвэл бусад харилцагчдаа тантай холбоо барихыг зөвшөөрөхийн тулд тохиргоогоо өөрчлөх боломжтой." "Одоор тэмдэглэсэн харилцагчид" - + + бусад %d + бусад 1 + "Зурвасууд" "Зурвасыг зөвшөөрөх" "Зурвас" @@ -3770,7 +3773,6 @@ "Илүү хүйтэн дэлгэцийн өнгө ашиглах" "Өнгөний өөрчлөлтийг оруулахын тулд дэлгэцийг унтраана уу" "Камерын лазер мэдрэгч" - "Логик камерыг өгөгдмөл болгох" "Системийн автомат шинэчлэлтүүд" "Төхөөрөмжийг дахин эхлүүлэх үед шинэчлэлтийг хэрэгжүүлэх" "Хэрэглээ" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index d4d0b2b3929..21bf1f9eaca 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -3343,7 +3343,10 @@ "कॉलची अनुमती द्या" "ज्या वेळी व्यत्यय आणू नका सुरू असते, तेव्हा येणारे कॉल ब्लॉक होतात. तुम्ही सेटिंग्ज मध्ये बदल करून तुमच्या मित्रमैत्रिणींना, कुटुंबियांना आणि इतर संपर्कांना तुमच्यापर्यंत पोहोचण्याची अनुमती देऊ शकता." "तारांकित संपर्क" - + + %d अन्य + %d अन्य + "मेसेज" "मेसेजची अनुमती द्या" "मेसेज" @@ -3773,7 +3776,6 @@ "आणखी छान डिस्प्ले रंग वापरा" "रंग बदल लागू करण्यासाठी, स्क्रीन बंद करा" "कॅमेरा लेझर सेंसर" - "डीफॉल्ट म्हणून लॉजिकल कॅमेरा" "स्वयंचलित सिस्टम अपडेट" "डिव्हाइस रीस्टार्ट झाल्यानंतर अपडेट लागू करा" "वापर" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index a6c90a07af7..5c385324ecf 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -3342,7 +3342,10 @@ "Benarkan panggilan" "Apabila Jangan Ganggu dihidupkan, panggilan masuk disekat. Anda boleh melaraskan tetapan untuk membenarkan rakan, keluarga atau kenalan lain menghubungi anda." "Kenalan dibintangi" - + + %d yang lain + seorang lagi + "Mesej" "Benarkan mesej" "Mesej" @@ -3772,7 +3775,6 @@ "Gunakan warna paparan yang lebih sejuk" "Untuk mengenakan perubahan warna, matikan skrin" "Penderia Laser Kamera" - "Kamera Logik Sebagai Lalai" "Kemas kini sistem automatik" "Gunakan kemas kini apabila peranti dimulakan semula" "Penggunaan" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 08dcb1b7b2b..021fa050666 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -3775,7 +3775,6 @@ "ပိုအေးသည့် မျက်နှာပြင် အရောင်များကိုအသုံးပြုရန်" "အရောင်ပြောင်းလဲမှု ပြုလုပ်ရန်၊ မျက်နှာပြင်ကိုပိတ်ပါ" "Camera လေဆာ အာရုံခံကိရိယာ" - "Logical Camera ကို မူရင်းအဖြစ် သတ်မှတ်ခြင်း" "အလိုအလျောက် စနစ်အပ်ဒိတ်များ" "စက်ပစ္စည်းပြန်လည်စတင်သည့်အခါ အပ်ဒိတ်များကို ထည့်သွင်းပါ" "အသုံးပြုမှု" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 05d5158c044..19d9a58c34d 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -3342,7 +3342,10 @@ "Tillat anrop" "Når «Ikke forstyrr» er på, blir innkommende anrop blokkert. Du kan justere innstillinger for å la venner, familie eller andre kontakter nå deg." "Stjernemerkede kontakter" - + + %d andre + 1 annen + "Meldinger" "Tillat meldinger" "Meldinger" @@ -3772,7 +3775,6 @@ "Bruk kaldere skjermfarger" "For å bruke fargeendringen, slå av skjermen" "Kameraets lasersensor" - "Logisk kamera som standard" "Automatiske systemoppdateringer" "Bruk oppdateringer når enheten starter på nytt" "Bruk" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index d0334120bdc..3219868ce4a 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -3342,7 +3342,10 @@ "कलहरूलाई अनुमति दिनुहोस्" "बाधा नपुर्‍याउनुहोस् मोड सक्रिय भएका बेला आगमन कलहरूमाथि रोक लगाइन्छ। तपाईं आफ्ना साथीभाइ, परिवारजन वा अन्य सम्पर्कहरूलाई आफूसँग सम्पर्क राख्न दिने गरी सेटिङहरू समायोजन गर्न सक्नुहुन्छ।" "ताराङ्कित सम्पर्कहरू" - + + अन्य %d + अन्य १ + "सन्देशहरू" "सन्देशहरूलाई अनुमति दिनुहोस्" "सन्देशहरू" @@ -3772,7 +3775,6 @@ "अझ सुन्दर प्रदर्शनको रंगहरू प्रयोग गर्नुहोस्" "रंगको परिवर्तन लागू गर्न स्क्रिन बन्द गर्नुहोस्" "क्यामेरा लेजरको सेन्सर" - "लजिकल क्यामेरालाई पूर्वनिर्धारित क्यामेरा बनाउनुहोस्" "स्वचालित प्रणाली अद्यावधिकहरू" "यन्त्र पुनः सुरु भएपछि अद्यावधिकहरू लागू गर्नुहोस्" "उपयोग" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index bed1019d68c..28b6f1dfcc9 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -3775,7 +3775,6 @@ "Koelere weergavekleuren gebruiken" "Schakel het scherm uit om de kleurwijziging toe te passen" "Cameralasersensor" - "Logische camera als standaard" "Automatische systeemupdates" "Updates toepassen wanneer apparaat opnieuw wordt opgestart" "Gebruik" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index a88d8692f92..3b7fec7efb4 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -3345,7 +3345,10 @@ "କଲ୍‍ ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ" "ଯେତେବେଳେ ’ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ’ ଅନ୍ ଥିବ, ସେତେବେଳେ ଇନକମିଙ୍ଗ କଲ୍ ଅବରୋଧ ହେବ। ସାଙ୍ଗ, ପରିବାର ଲୋକେ କିମ୍ବା ଅନ୍ୟାନ୍ୟ ଯୋଗାଯୋଗ ଆପଣଙ୍କୁ ସମ୍ପର୍କ କରିବା ପାଇଁ ଆପଣ ସେଟିଙ୍ଗକୁ ଆଡଜଷ୍ଟ କରିପାରିବେ।" "ତାରାଙ୍କିତ ଯୋଗାଯୋଗ" - + + %dଟି ଅନ୍ୟ + 1ଟି ଅନ୍ୟ + "ମେସେଜ୍‌" "ମେସେଜ୍‍ ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ" "ମେସେଜ୍‌" @@ -3778,7 +3781,6 @@ "କୁଲର୍‌ ପ୍ରଦର୍ଶନ ରଙ୍ଗ ବ୍ୟବହାର କରନ୍ତୁ" "ରଙ୍ଗ ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ ସ୍କ୍ରୀନ୍‌ ବନ୍ଦ କରନ୍ତୁ" "କ୍ୟାମେରା ଲେଜର୍‌ ସେନ୍ସର୍‌" - "ଡିଫଲ୍ଟଭାବରେ ଲଜିକାଲ୍‍ କ୍ୟାମରା" "ସ୍ୱଚାଳିତ ସିଷ୍ଟମ୍‌ ଅପଡେଟ୍‌" "ଡିଭାଇସ୍ ରିଷ୍ଟାର୍ଟ ହେଲେ ଅପଡେଟ୍ ଲାଗୁ କରନ୍ତୁ" "ବ୍ୟବହାର" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 2527215f290..f07d5cdece9 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -3342,7 +3342,10 @@ "ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਆਉਣ ਦਿਓ" "ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਚਾਲੂ ਹੋਣ \'ਤੇ ਇਨਕਮਿੰਗ ਕਾਲਾਂ ਬਲਾਕ ਹੁੰਦੀਆਂ ਹਨ। ਤੁਸੀਂ ਆਪਣੇ ਦੋਸਤਾਂ, ਪਰਿਵਾਰਕ ਜਾਂ ਹੋਰ ਸੰਪਰਕਾਂ ਵੱਲੋਂ ਤੁਹਾਡੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣ ਲਈ ਸੈਟਿੰਗਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦੇ ਹੋ।" "ਤਾਰਾਬੱਧ ਸੰਪਰਕ" - + + %d ਹੋਰ + %d ਹੋਰ + "ਸੁਨੇਹੇ" "ਸੁਨੇਹੇ ਭੇਜਣ ਅਤੇ ਆਉਣ ਦਿਓ" "ਸੁਨੇਹੇ" @@ -3772,7 +3775,6 @@ "ਵਧੇਰੇ ਠੰਡੇ ਡਿਸਪਲੇ ਰੰਗਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ" "ਰੰਗ ਬਦਲਾਅ ਲਾਗੂ ਕਰਨ ਲਈ, ਸਕ੍ਰੀਨ ਨੂੰ ਬੰਦ ਕਰੋ" "ਕੈਮਰਾ ਲੇਜ਼ਰ ਸੈਂਸਰ" - "ਪੂਰਵ-ਨਿਰਧਾਰਤ ਵਜੋਂ ਲੌਜੀਕਲ ਕੈਮਰਾ" "ਸਵੈਚਲਿਤ ਸਿਸਟਮ ਅੱਪਡੇਟ" "ਡੀਵਾਈਸ ਮੁੜ-ਚਾਲੂ ਹੋਣ \'ਤੇ ਅੱਪਡੇਟ ਲਾਗੂ ਕਰੋ" "ਵਰਤੋਂ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index e931f92f101..442fd77dde3 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -3885,7 +3885,6 @@ "Używaj chłodniejszych kolorów na ekranie" "Aby zastosować zmianę kolorów, wyłącz ekran" "Czujnik lasera aparatu" - "Aparat logiczny jako domyślny" "Automatyczne aktualizacje systemu" "Zastosuj aktualizacje po ponownym uruchomieniu urządzenia" "Wykorzystanie danych" diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index cbcd3b15bdf..1d22073a065 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -3775,7 +3775,6 @@ "Usar cores de tela mais frias" "Para aplicar a alteração de cor, desative a tela" "Sensor a laser da câmera" - "Câmera lógica como padrão" "Atualizações automáticas do sistema" "Aplicar atualizações quando o dispositivo for reiniciado" "Utilização" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 3c2987fd0c4..3e2e1aee777 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -3775,7 +3775,6 @@ "Utilizar cores de visualização mais frias" "Para aplicar uma alteração de cor, desligue o ecrã" "Sensor de laser da câmara" - "Câmara lógica por predefinição" "Atualizações do sistema automáticas" "Aplique as atualizações quando o dispositivo for reiniciado." "Utilização" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index cbcd3b15bdf..1d22073a065 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -3775,7 +3775,6 @@ "Usar cores de tela mais frias" "Para aplicar a alteração de cor, desative a tela" "Sensor a laser da câmera" - "Câmera lógica como padrão" "Atualizações automáticas do sistema" "Aplicar atualizações quando o dispositivo for reiniciado" "Utilização" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index c20892e69e7..3d526816365 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -3383,7 +3383,11 @@ "Permiteți apeluri" "Când este activată funcția Nu deranja, apelurile primite sunt blocate. Puteți să modificați setările ca să le permiteți prietenilor, familiei sau altor persoane de contact să vă contacteze." "Persoane din agendă marcate cu stea" - + + încă %d persoane + încă %d de persoane + încă o persoană + "Mesaje" "Permiteți mesaje" "Mesaje" @@ -3826,7 +3830,6 @@ "Folosiți culori mai reci pentru afișare" "Pentru a aplica modificarea culorilor, dezactivați ecranul" "Senzor laser al camerei foto" - "Utilizați în mod prestabilit camera foto logică" "Actualizări automate de sistem" "Aplicați actualizările când repornește dispozitivul" "Utilizare" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index b2a4704d8a2..90f6b14c75d 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -3885,7 +3885,6 @@ "Использовать более холодные цвета на экране" "Для изменения цветовых настроек нужно отключить экран" "Лазерный датчик камеры" - "Логическая камера по умолчанию" "Автоматические обновления системы" "Устанавливать обновления при перезагрузке устройства" "Передача данных" diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index c9d40c90ba1..8dcd1a96fb3 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -3342,7 +3342,10 @@ "ඇමතුම් ඉඩ දෙන්න" "බාධා නොකරේන ක්‍රියාත්මක විට, එන ඇමතුම් අවහිර වේ. ඔබගේ මිතුරන්, පවුලේ අය හෝ වෙනත් සම්බන්ධතාවලට ඔබව සම්බන්ධ කර ගැනීමට ඔබට සැකසීම් සකස් කළ හැකිය." "තරු ලකුණු යෙදූ සම්බන්ධතා" - + + තවත් %d + තවත් %d + "පණිවිඩ" "පණිවිඩ ඉඩ දෙන්න" "පණිවිඩ" @@ -3772,7 +3775,6 @@ "වඩා සිසිල් සංදර්ශක වර්ණ භාවිත කිරීම" "වර්ණ වෙනස් කිරීම යෙදීමට තිරය ක්‍රියාවිරහිත කරන්න" "කැමරා ලේසර් සංවේදකය" - "තාර්කික කැමරාව පෙරනිමි ලෙස" "ස්වයංක්‍රිය පද්ධති යාවත්කාලීන" "උපාංගය නැවත ආරම්භ වන විට යාවත්කාලීන යොදන්න" "භාවිතය" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index e894a78c912..72866ed2b4c 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -3885,7 +3885,6 @@ "Používať studenšie farby obrazovky" "Ak chcete použiť zmenu farby, vypnite obrazovku" "Laserový snímač fotoaparátu" - "Používať logický fotoaparát ako predvolený" "Automatické aktualizácie systému" "Použiť aktualizácie po reštartovaní zariadenia" "Spotreba" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 15fa717ef86..33930ef6378 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -3424,7 +3424,12 @@ "Dovoli klice" "Pri vklopljenem načinu »ne moti« so dohodni klici blokirani. Nastavitve lahko prilagodite tako, da boste dosegljivi za prijatelje, družinske člane ali druge stike." "Stiki z zvezdico" - + + Še %d druga oseba + Še %d drugi osebi + Še %d druge osebe + Še %d drugih oseb + "Sporočila" "Dovoli sporočila" "Sporočila" @@ -3880,7 +3885,6 @@ "Uporaba hladnejših barv zaslona" "Če želite uveljaviti spremembo barv, izklopite zaslon" "Lasersko tipalo fotoaparata" - "Logični fotoaparat kot privzeta izbira" "Samodejne sistemske posodobitve" "Namesti posodobitve ob vnovičnem zagonu naprave" "Poraba" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index a86adc5e847..7bc4dc30aa1 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -3342,7 +3342,10 @@ "Lejo telefonatat" "Kur modaliteti \"Mos shqetëso\" është aktiv, telefonatat hyrëse janë të bllokuara. Mund t\'i përshtatësh cilësimet për të lejuar shokët, familjen ose kontakte të tjera të lidhen me ty." "Kontaktet me yll" - + + %d të tjerë + 1 tjetër + "Mesazhet" "Lejo mesazhet" "Mesazhet" @@ -3772,7 +3775,6 @@ "Përdor ngjyra të ftohta të ekranit" "Për të zbatuar ndryshimin e ngjyrës, çaktivizoje ekranin" "Sensori me laser i kamerës" - "\"Kamera logjike\" si e parazgjedhur" "Përditësimet automatike të sistemit" "Zbato përditësimet kur të riniset pajisja" "Përdorimi" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 5c0471aa569..8442c8e9436 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -3830,7 +3830,6 @@ "Користи хладније боје екрана" "Да бисте применили промену боје, искључите екран" "Сензор ласера Камере" - "Логичка камера као подразумевана" "Аутоматска ажурирања система" "Примени исправке кад се уређај поново покрене" "Потрошња" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 881d92ba53e..df3e4f0761c 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -3775,7 +3775,6 @@ "Använd svalare färger på skärmen" "Stäng av skärmen om du vill tillämpa färgändringen" "Lasersensor för kamera" - "Logisk kamera som standardinställning" "Automatiska systemuppdateringar" "Tillämpa uppdateringar när enheten startas om" "Användning" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 7a1ba508c6e..cae7f5ed919 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -3775,7 +3775,6 @@ "Tumia rangi yenye halijoto ya baridi zaidi kwenye onyesho" "Zima skrini ili uweze kutekeleza ubadilishaji wa rangi" "Kitambuzi cha Leza cha Kamera" - "Weka Kamera Mahiri iwe Chaguomsingi" "Masasisho ya mfumo kiotomatiki" "Weka masasisho kifaa kitakapozimwa na kuwashwa" "Matumizi" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index bad9b3dab3d..da4d0fc640c 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -3342,7 +3342,10 @@ "அழைப்புகளை அனுமதி" "\'தொந்தரவு செய்ய வேண்டாம்\' ஆனில் இருக்கும்போது, உள்வரும் அழைப்புகள் தடுக்கப்படும். உங்களை நண்பர்களோ, குடும்பத்தினரோ, வேறு தொடர்புகளோ தொடர்புகொள்வதற்கு அனுமதிக்க, நீங்கள் அமைப்புகளை மாற்றிக்கொள்ளலாம்." "நட்சத்திரமிட்ட தொடர்புகள்" - + + %d பேர் + ஒருவர் + "மெசேஜஸ்" "மெசேஜஸை அனுமதி" "மெசேஜஸ்" @@ -3772,7 +3775,6 @@ "நீல வண்ணங்களைத் திரைக்குப் பயன்படுத்து" "வண்ண மாற்றத்தைப் பயன்படுத்த, திரையை முடக்கவும்" "கேமராவின் லேசர் சென்சார்" - "இயல்பான அமைப்பாக லாஜிக்கல் கேமரா" "தானியங்கு முறைமை புதுப்பிப்புகள்" "சாதனம் மீண்டும் தொடங்கும்போது, புதுப்பிப்புகள் பயன்படுத்தப்படும்" "பயன்பாடு" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 8a685ff78d4..655eea20676 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -3342,7 +3342,10 @@ "కాల్‌లను అనుమతించండి" "అంఅంతరాయం కలిగించవద్దు ఆన్‌లో ఉన్నప్పుడు, ఇన్‌కమింగ్ కాల్‌లు బ్లాక్ చేయబడతాయి. మీ స్నేహితులు, కుటుంబం లేదా ఇతర పరిచయాలు మిమ్మల్ని చేరుకునేందుకు అనుమతించడానికి మీరు సెట్టింగ్‌లను సర్దుబాటు చేయవచ్చు." "నక్షత్రం గుర్తు ఉన్న పరిచయాలు" - + + మరో %d మంది + మరో 1 వ్యక్తి + "సందేశాలు" "సందేశాలను అనుమతించు" "సందేశాలు" @@ -3773,7 +3776,6 @@ "ప్రశాంత భావనను కలిగించే ప్రదర్శన రంగులను ఉపయోగిస్తుంది" "రంగు మార్పును వర్తింపజేయడానికి, స్క్రీన్‌ను ఆఫ్ చేయండి" "కెమెరా లేజర్ సెన్సార్" - "డిఫాల్ట్‌గా లాజికల్ కెమెరా" "ఆటోమేటిక్ సిస్టమ్ అప్‌డేట్‌లు" "పరికరం పునఃప్రారంభమైనప్పుడు అప్‌డేట్‌లను వర్తింపజేయండి" "వినియోగం" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index a229d489edf..5b75d438a50 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -3342,7 +3342,10 @@ "อนุญาตการโทร" "เมื่อเปิด \"ห้ามรบกวน\" สายเรียกเข้าจะถูกบล็อก คุณปรับเปลี่ยนการตั้งค่าเพื่ออนุญาตให้เพื่อน ครอบครัว หรือรายชื่อติดต่อคนอื่นๆ ติดต่อคุณได้" "รายชื่อติดต่อที่ติดดาว" - + + อีก %d คน + อีก 1 คน + "ข้อความ" "อนุญาตข้อความ" "ข้อความ" @@ -3772,7 +3775,6 @@ "ใช้สีแสดงผลที่เย็นกว่านี้" "หากต้องการใช้การเปลี่ยนสี ให้ปิดหน้าจอ" "เซ็นเซอร์เลเซอร์ของกล้อง" - "Logical Camera เป็นค่าเริ่มต้น" "การอัปเดตระบบอัตโนมัติ" "ใช้การอัปเดตเมื่ออุปกรณ์รีสตาร์ท" "การใช้งาน" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 939c07f8fe3..d8513c2ed4f 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -3342,7 +3342,10 @@ "Payagan ang mga tawag" "Kapag naka-on ang Huwag Istorbohin, bina-block ang mga papasok na tawag. Maaari mong isaayos ang mga setting para payagan ang iyong mga kaibigan, pamilya, o iba pang contact na makipag-ugnayan sa iyo." "Mga naka-star na contact" - + + %d iba pa + %d na iba pa + "Mga Mensahe" "Payagan ang mga mensahe" "Mga Mensahe" @@ -3772,7 +3775,6 @@ "Gumamit ng mas malalamig na kulay ng display" "Upang ilapat ang pagbabago sa kulay, i-off ang screen" "Sensor ng Laser ng Camera" - "Logical na Camera Bilang Default" "Mga awtomatikong pag-update ng system" "Ilapat ang mga update kapag nag-restart ang device" "Paggamit" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 91e7d79079e..db014352ffe 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -3342,7 +3342,10 @@ "Çağrılara izin ver" "Rahatsız Etmeyin ayarı açık olduğunda gelen aramalar engellenir. Ayarları arkadaşlarınızın, ailenizin veya diğer kişilerin size ulaşmasına izin verecek şekilde düzenleyebilirsiniz." "Yıldızlı kişiler" - + + %d kişi daha + 1 kişi daha + "İletiler" "Mesajlara izin ver" "Mesajlar" @@ -3772,7 +3775,6 @@ "Daha soğuk ekran renkleri kullan" "Renk değişikliğini uygulamak için ekranı kapatın" "Kamera Lazer Sensörü" - "Varsayılan Olarak Mantıksal Kamera" "Otomatik sistem güncellemeleri" "Cihaz yeniden başladığında güncellemeleri uygula" "Kullanım" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 5e6458c5887..7d1267cd6f4 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -3885,7 +3885,6 @@ "Використовувати холодніші кольори дисплея" "Щоб змінити кольори, вимкніть екран" "Лазерний датчик камери" - "Логічна камера за умовчанням" "Автоматичне оновлення системи" "Застосувати оновлення, коли пристрій перезапуститься" "Використання" diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index bc4443100e0..b66847ee623 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -3340,7 +3340,10 @@ "کالز کی اجازت دیں" "\'ڈسٹرب نہ کریں\' آن ہونے پر، موصول ہونے والی کالز مسدود کر دی جاتی ہیں۔ اپنے دوستوں، اہل خانہ اور دیگر رابطوں کو آپ تک پہنچنے کی اجازت دینے کیلئے، آپ ترتیبات ایڈجسٹ کر سکتے ہیں۔" "ستارہ کا نشان لگے ہوئے رابطے" - + + %d دیگر + 1 دیگر + "پیغامات" "پیغامات کی اجازت دیں" "پیغامات" @@ -3770,7 +3773,6 @@ "ڈسپلے کیلئے سرد رنگ استعمال کریں" "رنگ میں تبدیلی لاگو کرنے کیلئے اسکرین آف کریں" "کیمرا لیزر سینسر" - "بطور ڈیفالٹ لاجیکل کیمرا" "خودکار سسٹم اپ ڈیٹس" "آلہ ری اسٹارٹ ہونے پر اپ ڈیٹس لاگو کریں" "استعمال" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index 0f07c56bfb2..408ad0c035f 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -3791,7 +3791,6 @@ "Salqin displey ranglaridan foydalanish" "Rangni o‘zgartirish uchun ekranni o‘chiring" "Kameraning lazer sensori" - "Birlamchi mantiqiy kamera" "Avtomatik tizim yangilanishlari" "Yangilanishlar qurilma qayta ishga tushirilganda o‘rnatilsin" "Trafik sarfi" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 6585eaa1465..243891a7b3b 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -3342,7 +3342,10 @@ "Cho phép cuộc gọi" "Khi chế độ Không làm phiền đang bật, các cuộc gọi đến đều bị chặn. Bạn có thể điều chỉnh mục cài đặt này để cho phép bạn bè, gia đình hoặc những người khác liên hệ với bạn." "Liên hệ được gắn dấu sao" - + + %d người khác + 1 người khác + "Tin nhắn" "Cho phép tin nhắn" "Tin nhắn" @@ -3772,7 +3775,6 @@ "Sử dụng màu hiển thị lạnh hơn" "Để áp dụng thay đổi màu, hãy tắt màn hình" "Cảm biến laser của máy ảnh" - "Chuyển máy ảnh logic về mặc định" "Cập nhật hệ thống tự động" "Áp dụng bản cập nhật khi thiết bị khởi động lại" "Sử dụng" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 10b8cdbcacc..0e25a9de051 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -3342,7 +3342,10 @@ "允许进行通话" "开启勿扰模式后,系统会屏蔽来电。您可以调整相应设置,以便允许您的好友、家人或其他联系人与您联系。" "已加星标的联系人" - + + 另外 %d + 另外 1 人 + "消息" "允许显示消息" "信息" @@ -3772,7 +3775,6 @@ "使用较冷的显示颜色" "要应用颜色更改,请关闭屏幕" "相机激光传感器" - "将 Logical Camera 设置为默认" "系统自动更新" "重启设备时应用更新" "流量消耗" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 01efa6c23fb..631e92d14ab 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -3778,7 +3778,6 @@ "使用較冷的顯示器顏色" "如要套用色溫變更,請先關閉螢幕" "相機鐳射感應器" - "預設為 Logical Camera" "自動系統更新" "裝置重新啟動後套用更新" "用量" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index e3fd6069a62..261706b63f7 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -3779,7 +3779,6 @@ "使用較冷的顯示器色溫" "如要套用色溫變更設定,請關閉螢幕" "相機雷射感應器" - "將 Logical Camera 設為預設" "自動系統更新" "裝置重新啟動後套用更新" "使用情況" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 561485e12d0..8e640eb8d46 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -3776,7 +3776,6 @@ "Sebenzisa imibala yesibonisi esipholile" "Ukuze usebenzise ukushintshwa kombala, vala isikrini" "Inzwa ye-Laser yekhamera" - "Ikhamera eqondile njengokuzenzakalelayo" "Izibuyekezo zesistimu ezenzakalelayo" "Faka izibuyekezo uma idivayisi iqalisa kabusha" "Ukusetshenziswa" From 8aef786baa4e6b9e8e44f4ecd4652aa9e9a46053 Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 6 Jun 2018 11:00:09 -0400 Subject: [PATCH 15/21] If zen settings are updated, don't show onboarding Change-Id: I33c328e5d90f1b948c7dacb2e7f6265a1e496d35 Fixes: 109668117 Test: ZenOnboardingActivity (cherry picked from commit da412f07e5a8833dc96f820ac13c44bb70114ac6) --- .../notification/ZenOnboardingActivity.java | 6 ++++ .../ZenOnboardingActivityTest.java | 36 ++++++++++++++++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/notification/ZenOnboardingActivity.java b/src/com/android/settings/notification/ZenOnboardingActivity.java index fca1a6c6f00..798b0815924 100644 --- a/src/com/android/settings/notification/ZenOnboardingActivity.java +++ b/src/com/android/settings/notification/ZenOnboardingActivity.java @@ -156,6 +156,12 @@ public class ZenOnboardingActivity extends Activity { // ZEN_SETTINGS_UPDATED is true for: // - fresh P+ device // - if zen visual effects values were changed by the user in Settings + NotificationManager nm = context.getSystemService(NotificationManager.class); + if (NotificationManager.Policy.areAllVisualEffectsSuppressed( + nm.getNotificationPolicy().suppressedVisualEffects)) { + Settings.Global.putInt(context.getContentResolver(), + Settings.Global.ZEN_SETTINGS_UPDATED, 1); + } return Settings.Global.getInt(context.getContentResolver(), Settings.Global.ZEN_SETTINGS_UPDATED, 0) != 0; } diff --git a/tests/robotests/src/com/android/settings/notification/ZenOnboardingActivityTest.java b/tests/robotests/src/com/android/settings/notification/ZenOnboardingActivityTest.java index e09dc0d2b8c..3ca9fdac779 100644 --- a/tests/robotests/src/com/android/settings/notification/ZenOnboardingActivityTest.java +++ b/tests/robotests/src/com/android/settings/notification/ZenOnboardingActivityTest.java @@ -51,6 +51,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; +import org.robolectric.shadows.ShadowApplication; @RunWith(SettingsRobolectricTestRunner.class) public class ZenOnboardingActivityTest { @@ -68,6 +69,8 @@ public class ZenOnboardingActivityTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); + ShadowApplication shadowApplication = ShadowApplication.getInstance(); + shadowApplication.setSystemService(Context.NOTIFICATION_SERVICE, mNm); mActivity = Robolectric.buildActivity(ZenOnboardingActivity.class) .create() @@ -124,6 +127,9 @@ public class ZenOnboardingActivityTest { @Test public void isSuggestionComplete_zenUpdated() { + Policy policy = new Policy(0, 0, 0, 0); + when(mNm.getNotificationPolicy()).thenReturn(policy); + setZenUpdated(true); setShowSettingsSuggestion(false); setWithinTimeThreshold(true); @@ -132,6 +138,9 @@ public class ZenOnboardingActivityTest { @Test public void isSuggestionComplete_withinTimeThreshold() { + Policy policy = new Policy(0, 0, 0, 0); + when(mNm.getNotificationPolicy()).thenReturn(policy); + setZenUpdated(false); setShowSettingsSuggestion(false); setWithinTimeThreshold(true); @@ -140,6 +149,9 @@ public class ZenOnboardingActivityTest { @Test public void isSuggestionComplete_showSettingsSuggestionTrue() { + Policy policy = new Policy(0, 0, 0, 0); + when(mNm.getNotificationPolicy()).thenReturn(policy); + setZenUpdated(false); setShowSettingsSuggestion(true); setWithinTimeThreshold(false); @@ -148,17 +160,33 @@ public class ZenOnboardingActivityTest { @Test public void isSuggestionComplete_showSettingsSuggestionFalse_notWithinTimeThreshold() { + Policy policy = new Policy(0, 0, 0, 0); + when(mNm.getNotificationPolicy()).thenReturn(policy); + setZenUpdated(false); setShowSettingsSuggestion(false); setWithinTimeThreshold(false); assertThat(isSuggestionComplete(mContext)).isTrue(); } + + @Test + public void isSuggestionComplete_visualEffectsUpdated() { + // all values suppressed + Policy policy = new Policy(0, 0, 0, 511); + when(mNm.getNotificationPolicy()).thenReturn(policy); + + setZenUpdated(false); + setShowSettingsSuggestion(true); + setWithinTimeThreshold(true); + assertThat(isSuggestionComplete(mContext)).isTrue(); + assertThat(Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.ZEN_SETTINGS_UPDATED, -1)).isEqualTo(1); + } + + private void setZenUpdated(boolean updated) { - int zenUpdated = 0; - if (updated) { - zenUpdated = 1; - } + int zenUpdated = updated ? 1 : 0; Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ZEN_SETTINGS_UPDATED, zenUpdated); From f4781a79b41ea51687860d3560d6baf14ded5c52 Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Tue, 22 May 2018 13:37:30 -0700 Subject: [PATCH 16/21] Add comments and additional constants for the known bad anomaly types. They aren't being used now, but by declaring them now we can consolidate what we are encouraging OEMs to do in the PI timeframe. Bug: 78013987 Test: treehugger Change-Id: I7f86491448e799081b18d71274d2629a902d4972 --- .../batterytip/StatsManagerConfig.java | 168 +++++++++++++++++- 1 file changed, 167 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java b/src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java index 7f4b1eb7313..9fae14eac9d 100644 --- a/src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java +++ b/src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java @@ -46,15 +46,181 @@ public class StatsManagerConfig { AnomalyType.EXCESSIVE_WAKEUPS_IN_BACKGROUND, AnomalyType.EXCESSIVE_UNOPTIMIZED_BLE_SCAN, AnomalyType.EXCESSIVE_BACKGROUND_SERVICE, - AnomalyType.EXCESSIVE_WIFI_SCAN}) + AnomalyType.EXCESSIVE_WIFI_SCAN, + AnomalyType.EXCESSIVE_FLASH_WRITES, + AnomalyType.EXCESSIVE_MEMORY_IN_BACKGROUND, + AnomalyType.EXCESSIVE_DAVEY_RATE, + AnomalyType.EXCESSIVE_JANKY_FRAMES, + AnomalyType.SLOW_COLD_START_TIME, + AnomalyType.SLOW_HOT_START_TIME, + AnomalyType.SLOW_WARM_START_TIME, + AnomalyType.EXCESSIVE_BACKGROUND_SYNCS, + AnomalyType.EXCESSIVE_GPS_SCANS_IN_BACKGROUND, + AnomalyType.EXCESSIVE_JOB_SCHEDULING, + AnomalyType.EXCESSIVE_MOBILE_NETWORK_IN_BACKGROUND, + AnomalyType.EXCESSIVE_WIFI_LOCK_TIME, + AnomalyType.JOB_TIMED_OUT, + AnomalyType.LONG_UNOPTIMIZED_BLE_SCAN, + AnomalyType.BACKGROUND_ANR, + AnomalyType.BACKGROUND_CRASH_RATE, + AnomalyType.EXCESSIVE_ANR_LOOPING, + AnomalyType.EXCESSIVE_ANRS, + AnomalyType.EXCESSIVE_CRASH_RATE, + AnomalyType.EXCESSIVE_CRASH_LOOPING, + AnomalyType.NUMBER_OF_OPEN_FILES, + }) public @interface AnomalyType { + /** + * This represents an error condition in the anomaly detection. + */ int NULL = -1; + + /** + * The anomaly type does not match any other defined type. + */ int UNKNOWN_REASON = 0; + + /** + * The application held a partial (screen off) wake lock for a period of time that + * exceeded the threshold with the screen off when not charging. + */ int EXCESSIVE_WAKELOCK_ALL_SCREEN_OFF = 1; + + /** + * The application exceeded the maximum number of wakeups while in the background + * when not charging. + */ int EXCESSIVE_WAKEUPS_IN_BACKGROUND = 2; + + /** + * The application did unoptimized Bluetooth scans too frequently when not charging. + */ int EXCESSIVE_UNOPTIMIZED_BLE_SCAN = 3; + + /** + * The application ran in the background for a period of time that exceeded the + * threshold. + */ int EXCESSIVE_BACKGROUND_SERVICE = 4; + + /** + * The application exceeded the maximum number of wifi scans when not charging. + */ int EXCESSIVE_WIFI_SCAN = 5; + + /** + * The application exceed the maximum number of flash writes + */ + int EXCESSIVE_FLASH_WRITES = 6; + + /** + * The application used more than the maximum memory, while not spending any time + * in the foreground. + */ + int EXCESSIVE_MEMORY_IN_BACKGROUND = 7; + + /** + * The application exceeded the maximum percentage of frames with a render rate of + * greater than 700ms. + */ + int EXCESSIVE_DAVEY_RATE = 8; + + /** + * The application exceeded the maximum percentage of frames with a render rate + * greater than 16ms. + */ + int EXCESSIVE_JANKY_FRAMES = 9; + + /** + * The application exceeded the maximum cold start time - the app has not been + * launched since last system start, died or was killed. + */ + int SLOW_COLD_START_TIME = 10; + + /** + * The application exceeded the maximum hot start time - the app and activity are + * already in memory. + */ + int SLOW_HOT_START_TIME = 11; + + /** + * The application exceeded the maximum warm start time - the app was already in + * memory but the activity wasn’t created yet or was removed from memory. + */ + int SLOW_WARM_START_TIME = 12; + + /** + * The application exceeded the maximum number of syncs while in the background. + */ + int EXCESSIVE_BACKGROUND_SYNCS = 13; + + /** + * The application exceeded the maximum number of gps scans while in the background. + */ + int EXCESSIVE_GPS_SCANS_IN_BACKGROUND = 14; + + /** + * The application scheduled more than the maximum number of jobs while not charging. + */ + int EXCESSIVE_JOB_SCHEDULING = 15; + + /** + * The application exceeded the maximum amount of mobile network traffic while in + * the background. + */ + int EXCESSIVE_MOBILE_NETWORK_IN_BACKGROUND = 16; + + /** + * The application held the WiFi lock for more than the maximum amount of time while + * not charging. + */ + int EXCESSIVE_WIFI_LOCK_TIME = 17; + + /** + * The application scheduled a job that ran longer than the maximum amount of time. + */ + int JOB_TIMED_OUT = 18; + + /** + * The application did an unoptimized Bluetooth scan that exceeded the maximum + * time while in the background. + */ + int LONG_UNOPTIMIZED_BLE_SCAN = 19; + + /** + * The application exceeded the maximum ANR rate while in the background. + */ + int BACKGROUND_ANR = 20; + + /** + * The application exceeded the maximum crash rate while in the background. + */ + int BACKGROUND_CRASH_RATE = 21; + + /** + * The application exceeded the maximum ANR-looping rate. + */ + int EXCESSIVE_ANR_LOOPING = 22; + + /** + * The application exceeded the maximum ANR rate. + */ + int EXCESSIVE_ANRS = 23; + + /** + * The application exceeded the maximum crash rate. + */ + int EXCESSIVE_CRASH_RATE = 24; + + /** + * The application exceeded the maximum crash-looping rate. + */ + int EXCESSIVE_CRASH_LOOPING = 25; + + /** + * The application crashed because no more file descriptors were available. + */ + int NUMBER_OF_OPEN_FILES = 26; } } From 5a6c3fe64520a8f08f127aac77c6e328fedb8319 Mon Sep 17 00:00:00 2001 From: Antony Sargent Date: Wed, 6 Jun 2018 14:37:36 -0700 Subject: [PATCH 17/21] Make icon size on Printing settings match the rest of settings The icons on this page were being displayed at 48dp because we were using a generic Preference element, instead of the custom settings AppPreference which we use in lots of other places in settings for displaying app entries in a list (and has a custom layout that ends up with 32dp icons). Fixes: 78654919 Test: manual (go to Settings -> Connected devices -> Connection preferences -> Printing) Change-Id: Icf21ab6b41fc00936cd58f3342a8c5502c6dd87f --- src/com/android/settings/print/PrintSettingsFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/print/PrintSettingsFragment.java b/src/com/android/settings/print/PrintSettingsFragment.java index dca1f580314..bad1e035dcc 100644 --- a/src/com/android/settings/print/PrintSettingsFragment.java +++ b/src/com/android/settings/print/PrintSettingsFragment.java @@ -56,6 +56,7 @@ import com.android.settings.R; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.utils.ProfileSettingsPreferenceFragment; +import com.android.settings.widget.AppPreference; import com.android.settingslib.search.SearchIndexable; import java.text.DateFormat; @@ -193,7 +194,7 @@ public class PrintSettingsFragment extends ProfileSettingsPreferenceFragment } for (PrintServiceInfo service : services) { - Preference preference = new Preference(context); + AppPreference preference = new AppPreference(context); String title = service.getResolveInfo().loadLabel(pm).toString(); preference.setTitle(title); From daea8be9abd408f39a8b7451bc171cb60f8e6274 Mon Sep 17 00:00:00 2001 From: Nathan Harold Date: Tue, 5 Jun 2018 14:02:35 -0700 Subject: [PATCH 18/21] [RadioInfo] Save PreferredNetworkMode to Settings Historically, the debug menu intentionally did not save the preferred network mode once chosen. This causes problems because some settings cause a phone switch which overrides the preferred network mode, which can cause another phone switch and again override the preferred network mode, completely obliterating the requested debug setting. This change will now save the debug menu setting to the system settings, which will prevent the circular changes and loss of setting due to phone switching. However, caching the debug setting to prevent the phone switch logic from overriding the setting has a side effect, which is why it wasn't done historically. If a debug setting of the preferred network mode is set, it will cause the UX of the non-debug network preference screen to change. Thus, someone who uses the debug menu to make changes must be careful to re-set the setting to return to the correct UX of the publicly displayed menu. Bug: 95133265 Test: -manually set preferred network mode using the RadioInfo menu and observed that there is no phone switch when setting CDMA. -confirmed that changing the network mode in RadioInfo will cause UX changes to the public network preference menu. Change-Id: I91f669956a6d02515530855c4617cd0a767d73fa --- src/com/android/settings/RadioInfo.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java index 170db1695b4..5d3afa5ff58 100644 --- a/src/com/android/settings/RadioInfo.java +++ b/src/com/android/settings/RadioInfo.java @@ -17,6 +17,7 @@ package com.android.settings; import static android.net.ConnectivityManager.NetworkCallback; +import static android.provider.Settings.Global.PREFERRED_NETWORK_MODE; import android.app.Activity; import android.app.AlertDialog; @@ -39,6 +40,7 @@ import android.os.AsyncResult; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.CellInfo; import android.telephony.CellInfoCdma; @@ -1489,6 +1491,19 @@ public class RadioInfo extends Activity { if (mPreferredNetworkTypeResult != pos && pos >= 0 && pos <= mPreferredNetworkLabels.length - 2) { mPreferredNetworkTypeResult = pos; + + // TODO: Possibly migrate this to TelephonyManager.setPreferredNetworkType() + // which today still has some issues (mostly that the "set" is conditional + // on a successful modem call, which is not what we want). Instead we always + // want this setting to be set, so that if the radio hiccups and this setting + // is for some reason unsuccessful, future calls to the radio will reflect + // the users's preference which is set here. + final int subId = phone.getSubId(); + if (SubscriptionManager.isUsableSubIdValue(subId)) { + Settings.Global.putInt(phone.getContext().getContentResolver(), + PREFERRED_NETWORK_MODE + subId, mPreferredNetworkTypeResult); + } + log("Calling setPreferredNetworkType(" + mPreferredNetworkTypeResult + ")"); Message msg = mHandler.obtainMessage(EVENT_SET_PREFERRED_TYPE_DONE); phone.setPreferredNetworkType(mPreferredNetworkTypeResult, msg); } From ee96c3a259ad1ee3a8604730f8c722224ec07a50 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 7 Jun 2018 11:51:09 -0700 Subject: [PATCH 19/21] Fix context leak in AudioSwitchPreferenceController. In this controller the context is stored into a global singleton but was not cleared, thus leaking context and associated views. Change-Id: I4247f8ff753bc0a331c6c81a0e4b5b4bc41588de Fixes: 80507279 Test: robotests Test: inspected hprof before/after change --- .../settings/sound/AudioSwitchPreferenceController.java | 3 ++- .../sound/AudioOutputSwitchPreferenceControllerTest.java | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/sound/AudioSwitchPreferenceController.java b/src/com/android/settings/sound/AudioSwitchPreferenceController.java index 44e175cde83..67236608df8 100644 --- a/src/com/android/settings/sound/AudioSwitchPreferenceController.java +++ b/src/com/android/settings/sound/AudioSwitchPreferenceController.java @@ -118,7 +118,6 @@ public abstract class AudioSwitchPreferenceController extends BasePreferenceCont Log.e(TAG, "Bluetooth is not supported on this device"); return; } - mLocalBluetoothManager.setForegroundActivity(mContext); mProfileManager = mLocalBluetoothManager.getProfileManager(); } @@ -171,11 +170,13 @@ public abstract class AudioSwitchPreferenceController extends BasePreferenceCont @Override public void onStart() { + mLocalBluetoothManager.setForegroundActivity(mContext); register(); } @Override public void onStop() { + mLocalBluetoothManager.setForegroundActivity(null); unregister(); } diff --git a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java index 2455f1612c7..1140aee98fb 100644 --- a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java @@ -230,6 +230,7 @@ public class AudioOutputSwitchPreferenceControllerTest { verify(mLocalBluetoothManager.getEventManager()).registerCallback( any(BluetoothCallback.class)); verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class)); + verify(mLocalBluetoothManager).setForegroundActivity(mContext); } @Test @@ -240,6 +241,7 @@ public class AudioOutputSwitchPreferenceControllerTest { verify(mLocalBluetoothManager.getEventManager()).unregisterCallback( any(BluetoothCallback.class)); verify(mContext).unregisterReceiver(any(BroadcastReceiver.class)); + verify(mLocalBluetoothManager).setForegroundActivity(null); } @Test From 681ac5bcc31b8df3ea2d230bf62bcc0cb7780d5e Mon Sep 17 00:00:00 2001 From: Maurice Lam Date: Thu, 7 Jun 2018 13:12:50 -0700 Subject: [PATCH 20/21] Fix Robolectric tests Test: atest RunSettingsRoboTests Change-Id: I66a6d1c42d57685c4beb9daeb534685c5cdd9c50 --- .../settings/testutils/SettingsRobolectricTestRunner.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java b/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java index f071f173633..0b29af58bad 100644 --- a/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java +++ b/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java @@ -84,9 +84,9 @@ public class SettingsRobolectricTestRunner extends RobolectricTestRunner { paths.add(new ResourcePath(null, Fs.fromURL(new URL("file:frameworks/opt/setupwizard/library/recyclerview/res")), null)); paths.add(new ResourcePath(null, - Fs.fromURL(new URL("file:frameworks/support/v7/appcompat/res")), null)); + Fs.fromURL(new URL("file:frameworks/support/appcompat/res")), null)); paths.add(new ResourcePath(null, - Fs.fromURL(new URL("file:frameworks/support/v7/cardview/res")), null)); + Fs.fromURL(new URL("file:frameworks/support/cardview/res")), null)); } catch (MalformedURLException e) { throw new RuntimeException("SettingsRobolectricTestRunner failure", e); } From d9f7fba943948e3e79d7413c35af6e10c7eee2e7 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 7 Jun 2018 11:51:09 -0700 Subject: [PATCH 21/21] Fix context leak in AudioSwitchPreferenceController. In this controller the context is stored into a global singleton but was not cleared, thus leaking context and associated views. Change-Id: I4247f8ff753bc0a331c6c81a0e4b5b4bc41588de Bug: 80507279 Test: robotests Test: inspected hprof before/after change --- .../settings/sound/AudioSwitchPreferenceController.java | 3 ++- .../sound/AudioOutputSwitchPreferenceControllerTest.java | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/sound/AudioSwitchPreferenceController.java b/src/com/android/settings/sound/AudioSwitchPreferenceController.java index f35fd60ad54..119fadbd4ba 100644 --- a/src/com/android/settings/sound/AudioSwitchPreferenceController.java +++ b/src/com/android/settings/sound/AudioSwitchPreferenceController.java @@ -118,7 +118,6 @@ public abstract class AudioSwitchPreferenceController extends BasePreferenceCont Log.e(TAG, "Bluetooth is not supported on this device"); return; } - mLocalBluetoothManager.setForegroundActivity(mContext); mProfileManager = mLocalBluetoothManager.getProfileManager(); } @@ -171,11 +170,13 @@ public abstract class AudioSwitchPreferenceController extends BasePreferenceCont @Override public void onStart() { + mLocalBluetoothManager.setForegroundActivity(mContext); register(); } @Override public void onStop() { + mLocalBluetoothManager.setForegroundActivity(null); unregister(); } diff --git a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java index 56a5aa709fe..748aa0ca302 100644 --- a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java @@ -230,6 +230,7 @@ public class AudioOutputSwitchPreferenceControllerTest { verify(mLocalBluetoothManager.getEventManager()).registerCallback( any(BluetoothCallback.class)); verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class)); + verify(mLocalBluetoothManager).setForegroundActivity(mContext); } @Test @@ -240,6 +241,7 @@ public class AudioOutputSwitchPreferenceControllerTest { verify(mLocalBluetoothManager.getEventManager()).unregisterCallback( any(BluetoothCallback.class)); verify(mContext).unregisterReceiver(any(BroadcastReceiver.class)); + verify(mLocalBluetoothManager).setForegroundActivity(null); } @Test