From 2c872109eb0b9360e8534e1770d7df7cf826c74f Mon Sep 17 00:00:00 2001 From: Nobuyuki Nakamura Date: Mon, 22 Feb 2016 17:32:31 +0900 Subject: [PATCH 01/10] Show help string when onEnrollmentHelp() is called The help string is not shown when onEnrollmentHelp() is called between onEnrollmentProgressChange() and mTouchAgainRunnable#run(). To fix this issue, showError() should be called. Bug: 30274453 Test: manual - start enrolling fingerprint and move finger fast on the sensor Change-Id: Ie604532940e40cca66dc54b56c3cb4b828a07987 --- .../settings/fingerprint/FingerprintEnrollEnrolling.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java index b4146270972..868953025f0 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java @@ -33,6 +33,7 @@ import android.graphics.drawable.Drawable; import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; import android.os.UserHandle; +import android.text.TextUtils; import android.view.MotionEvent; import android.view.View; import android.view.animation.AnimationUtils; @@ -264,7 +265,10 @@ public class FingerprintEnrollEnrolling extends FingerprintEnrollBase @Override public void onEnrollmentHelp(CharSequence helpString) { - mErrorText.setText(helpString); + if (!TextUtils.isEmpty(helpString)) { + mErrorText.removeCallbacks(mTouchAgainRunnable); + showError(helpString); + } } @Override From 813f0b5ba9972c0c029efb9d4a3526c85d129675 Mon Sep 17 00:00:00 2001 From: Oren Blasberg Date: Fri, 28 Jul 2017 16:51:42 -0700 Subject: [PATCH 02/10] SMS mirroring: Add placeholder summary. Prevents the summary text from shifting once the final text is loaded, if OEM specific implementations do an async load of the summary text. Bug: 37546615 Test: Verified the placeholder works. Change-Id: Ia16fe53dbf7a8daf96b9fa955ef9a02fa1eb784f --- res/xml/connected_devices.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml index abbeda67384..4ca92bfd71b 100644 --- a/res/xml/connected_devices.xml +++ b/res/xml/connected_devices.xml @@ -42,6 +42,7 @@ android:key="sms_mirroring" android:title="@string/sms_mirroring_pref" android:icon="@drawable/ic_compare_arrows_24dp" + android:summary="@string/summary_placeholder" android:order="-3"/> Date: Thu, 3 Aug 2017 17:55:00 -0700 Subject: [PATCH 03/10] Clean up logic for dismissing suggestion We no longer bring suggestions back after dismissing, so some logic is no longer necessary. Change-Id: I9d931fbbbc79bade191bebf6d057870d088a5fde Fixes: 64297191 Test: robotests --- .../SuggestionFeatureProviderImpl.java | 27 +---------- .../SuggestionFeatureProviderImplTest.java | 46 +++++-------------- 2 files changed, 13 insertions(+), 60 deletions(-) diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java index e4f58d77aae..f8b5a8b6a60 100644 --- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java @@ -25,7 +25,6 @@ import android.content.pm.PackageManager; import android.provider.Settings.Secure; import android.support.annotation.NonNull; import android.support.annotation.VisibleForTesting; -import android.text.format.DateUtils; import android.util.Log; import com.android.internal.logging.nano.MetricsProto; @@ -55,12 +54,6 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider private static final String SHARED_PREF_FILENAME = "suggestions"; - // Suggestion category name and expiration threshold for first impression type. Needs to keep - // in sync with suggestion_ordering.xml - private static final String CATEGORY_FIRST_IMPRESSION = - "com.android.settings.suggested.category.FIRST_IMPRESSION"; - private static final long FIRST_IMPRESSION_EXPIRE_DAY_IN_MILLIS = 14 * DateUtils.DAY_IN_MILLIS; - private final SuggestionRanker mSuggestionRanker; private final MetricsFeatureProvider mMetricsFeatureProvider; @@ -141,12 +134,7 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION, getSuggestionIdentifier(context, suggestion)); - boolean isSmartSuggestionEnabled = isSmartSuggestionEnabled(context); - if (isSmartSuggestionEnabled) { - // Disable smart suggestion if we are still showing first impression suggestions. - isSmartSuggestionEnabled = !isShowingFirstImpressionSuggestion(context); - } - if (!parser.dismissSuggestion(suggestion, isSmartSuggestionEnabled)) { + if (!parser.dismissSuggestion(suggestion)) { return; } context.getPackageManager().setComponentEnabledSetting( @@ -155,19 +143,6 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider PackageManager.DONT_KILL_APP); } - private boolean isShowingFirstImpressionSuggestion(Context context) { - final String keySetupTime = CATEGORY_FIRST_IMPRESSION + SuggestionParser.SETUP_TIME; - final long currentTime = System.currentTimeMillis(); - final SharedPreferences sharedPrefs = getSharedPrefs(context); - if (!sharedPrefs.contains(keySetupTime)) { - return true; - } - final long setupTime = sharedPrefs.getLong(keySetupTime, 0); - final long elapsedTime = currentTime - setupTime; - Log.d(TAG, "Day " + elapsedTime / DateUtils.DAY_IN_MILLIS + " for first impression"); - return elapsedTime <= FIRST_IMPRESSION_EXPIRE_DAY_IN_MILLIS; - } - @Override public String getSuggestionIdentifier(Context context, Tile suggestion) { if (suggestion.intent == null || suggestion.intent.getComponent() == null diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java index 2fde357584f..59b918a936f 100644 --- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java @@ -17,8 +17,17 @@ package com.android.settings.dashboard.suggestions; -import android.app.ActivityManager; +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; +import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -59,18 +68,6 @@ import org.robolectric.annotation.Config; import java.util.ArrayList; import java.util.List; -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyBoolean; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; -import static org.mockito.Mockito.when; - @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, @@ -337,7 +334,7 @@ public class SuggestionFeatureProviderImplTest { @Test public void dismissSuggestion_hasMoreDismissCount_shouldNotDisableComponent() { - when(mSuggestionParser.dismissSuggestion(any(Tile.class), anyBoolean())) + when(mSuggestionParser.dismissSuggestion(any(Tile.class))) .thenReturn(false); mProvider.dismissSuggestion(mContext, mSuggestionParser, mSuggestion); @@ -348,25 +345,6 @@ public class SuggestionFeatureProviderImplTest { verify(mContext, never()).getPackageManager(); } - @Test - public void dismissSuggestion_isShowingFirstImpressionType_dismissWithoutSmartSuggestionRule() { - mProvider = spy(mProvider); - when(mProvider.isSmartSuggestionEnabled(any(Context.class))).thenReturn(true); - final SharedPreferences pref = RuntimeEnvironment.application.getSharedPreferences( - "test_pref", Context.MODE_PRIVATE); - when(mProvider.getSharedPrefs(mContext)).thenReturn(pref); - when(mSuggestionParser.dismissSuggestion(any(Tile.class), anyBoolean())) - .thenReturn(false); - - mProvider.dismissSuggestion(mContext, mSuggestionParser, mSuggestion); - - verify(mFactory.metricsFeatureProvider).action( - eq(mContext), - eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION), - anyString()); - verify(mSuggestionParser).dismissSuggestion(any(Tile.class), eq(false)); - } - @Test public void dismissSuggestion_noContext_shouldDoNothing() { mProvider.dismissSuggestion(null, mSuggestionParser, mSuggestion); @@ -376,7 +354,7 @@ public class SuggestionFeatureProviderImplTest { @Test public void dismissSuggestion_hasNoMoreDismissCount_shouldDisableComponent() { - when(mSuggestionParser.dismissSuggestion(any(Tile.class), anyBoolean())) + when(mSuggestionParser.dismissSuggestion(any(Tile.class))) .thenReturn(true); mProvider.dismissSuggestion(mContext, mSuggestionParser, mSuggestion); From fe5a771e92cb22631e688403cce45c826bbda044 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Wed, 26 Jul 2017 13:14:46 -0700 Subject: [PATCH 04/10] Add uid data even though on battery stats Advacned battery page doesn't show background toggle because it doesn't get uid from battery stats. This cl make it get uid by package name even though without battery stats. Bug: 64049162 Test: RunSettingsRoboTests Change-Id: Ie0f67ce9d080c02763a8382740e0640a66ce6053 --- .../settings/fuelgauge/AdvancedPowerUsageDetail.java | 9 ++++++++- .../fuelgauge/AdvancedPowerUsageDetailTest.java | 10 ++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index 471710983e2..3b83fa52653 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -31,6 +31,7 @@ import android.support.annotation.VisibleForTesting; import android.support.v14.preference.PreferenceFragment; import android.support.v7.preference.Preference; import android.text.TextUtils; +import android.util.Log; import android.view.View; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; @@ -163,9 +164,15 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements public static void startBatteryDetailPage(SettingsActivity caller, PreferenceFragment fragment, String packageName) { - final Bundle args = new Bundle(2); + final Bundle args = new Bundle(3); + final PackageManager packageManager = caller.getPackageManager(); args.putString(EXTRA_PACKAGE_NAME, packageName); args.putString(EXTRA_POWER_USAGE_PERCENT, Utils.formatPercentage(0)); + try { + args.putInt(EXTRA_UID, packageManager.getPackageUid(packageName, 0 /* no flag */)); + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Cannot find package: " + packageName, e); + } caller.startPreferencePanelAsUser(fragment, AdvancedPowerUsageDetail.class.getName(), args, R.string.battery_details_title, null, new UserHandle(UserHandle.myUserId())); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java index c7eebc84e6c..54d043c419d 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java @@ -368,6 +368,16 @@ public class AdvancedPowerUsageDetailTest { "0%"); } + @Test + public void testStartBatteryDetailPage_batteryEntryNotExisted_extractUidFromPackageName() throws + PackageManager.NameNotFoundException{ + doReturn(UID).when(mPackageManager).getPackageUid(PACKAGE_NAME[0], 0 /* no flag */); + + AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, PACKAGE_NAME[0]); + + assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID); + } + @Test public void testStartBatteryDetailPage_defaultPackageNull_chooseFromBatterySipper() { mBatteryEntry.defaultPackageName = null; From 52da8a79b9d63abdfcd5ec1972889d02ead61b19 Mon Sep 17 00:00:00 2001 From: Salvador Martinez Date: Mon, 7 Aug 2017 10:22:37 -0700 Subject: [PATCH 05/10] Refactor tether logic for reuse Some logic related to permissions needs to be used elsewhere. This CL refactors the relevant code into a method so that it stays in sync in both places. Test: robotests still pass Bug: 64092292 Change-Id: I3b54529865e16b7e1640b0adda7f7edb9d1a41f7 --- .../settings/network/TetherPreferenceController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/network/TetherPreferenceController.java b/src/com/android/settings/network/TetherPreferenceController.java index 571290796cf..1c9959e5a88 100644 --- a/src/com/android/settings/network/TetherPreferenceController.java +++ b/src/com/android/settings/network/TetherPreferenceController.java @@ -88,8 +88,7 @@ public class TetherPreferenceController extends AbstractPreferenceController imp public TetherPreferenceController(Context context, Lifecycle lifecycle) { super(context); mBluetoothPan = new AtomicReference<>(); - mAdminDisallowedTetherConfig = checkIfRestrictionEnforced( - mContext, DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()) != null; + mAdminDisallowedTetherConfig = isTetherConfigDisallowed(context); mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); @@ -170,6 +169,11 @@ public class TetherPreferenceController extends AbstractPreferenceController imp } } + public static boolean isTetherConfigDisallowed(Context context) { + return checkIfRestrictionEnforced( + context, DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()) != null; + } + @VisibleForTesting void updateSummary() { if (mPreference == null) { From 0372e3f2587649f307cccba17310577298cf8ba9 Mon Sep 17 00:00:00 2001 From: Winston Man Date: Tue, 8 Aug 2017 14:32:52 +0100 Subject: [PATCH 06/10] Move work notification settings back to bottom - Settings order now matches - screenshot with work profile: https://hsv.googleplex.com/5742195667632128 - screenshot without work profile: https://hsv.googleplex.com/5683485175971840 Bug: 64436619 Test: RunSettingsRoboTests; manual Change-Id: Ia665ee5295981e11193e69585232874d1dddba23 --- res/xml/configure_notification_settings.xml | 31 ++++++++++----------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml index 1d36c48728f..21904e671a9 100644 --- a/res/xml/configure_notification_settings.xml +++ b/res/xml/configure_notification_settings.xml @@ -22,16 +22,11 @@ android:key="dashboard_tile_placeholder" android:order="1"/> - - - - - + + - - - + + + + + From 3f9d0f16145c4a90dc9123aeaecf6cbcdf701546 Mon Sep 17 00:00:00 2001 From: Alison Cichowlas Date: Tue, 8 Aug 2017 11:05:23 -0400 Subject: [PATCH 07/10] Add new strings for b/63109928 Test: Strings only; manual Bug: 63109928 Change-Id: Ib2d491aff81faa866300e6b4f3a0d7c0e1417b98 --- res/values/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/res/values/strings.xml b/res/values/strings.xml index 6eae5d1cb0a..56771c3af76 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6833,6 +6833,10 @@ Make sound and pop on screen + + Pop on screen + From fb83e50d995db134d63048500e2c15ebf4e03024 Mon Sep 17 00:00:00 2001 From: Daniel Nishi Date: Thu, 27 Jul 2017 11:06:41 -0700 Subject: [PATCH 08/10] Add floats to the SecureSettings shadow. Test: Exercised in other robotests Change-Id: I0791bdddf0bc97abc21cd27613998247b11d7bb4 --- .../shadow/ShadowSecureSettings.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java index 1ae5398657e..0f61a5d816e 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java @@ -89,6 +89,32 @@ public class ShadowSecureSettings { } } + @Implementation + public static boolean putFloatForUser( + ContentResolver resolver, String name, float value, int userHandle) { + final Table userTable = getUserTable(resolver); + synchronized (userTable) { + userTable.put(userHandle, name, value); + return true; + } + } + + @Implementation + public static float getFloatForUser( + ContentResolver resolver, String name, float def, int userHandle) { + final Table userTable = getUserTable(resolver); + synchronized (userTable) { + final Object object = userTable.get(userHandle, name); + return object instanceof Float ? (Float) object : def; + } + } + + public static void clear() { + synchronized (sUserDataMap) { + sUserDataMap.clear(); + } + } + private static Table getUserTable(ContentResolver contentResolver) { synchronized (sUserDataMap) { Table table = sUserDataMap.get(contentResolver); From 135619d483d324cd0c5b565b93723953c1ff5a4a Mon Sep 17 00:00:00 2001 From: Salvador Martinez Date: Mon, 7 Aug 2017 10:22:37 -0700 Subject: [PATCH 09/10] Refactor tether logic for reuse Some logic related to permissions needs to be used elsewhere. This CL refactors the relevant code into a method so that it stays in sync in both places. Test: robotests still pass Bug: 64092292 Change-Id: If8191698023d1da90db99b518d9f770683b5c789 Merged-In: I3b54529865e16b7e1640b0adda7f7edb9d1a41f7 --- .../settings/network/TetherPreferenceController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/network/TetherPreferenceController.java b/src/com/android/settings/network/TetherPreferenceController.java index b865ea5b268..933bc8a33a5 100644 --- a/src/com/android/settings/network/TetherPreferenceController.java +++ b/src/com/android/settings/network/TetherPreferenceController.java @@ -88,8 +88,7 @@ public class TetherPreferenceController extends PreferenceController public TetherPreferenceController(Context context, Lifecycle lifecycle) { super(context); mBluetoothPan = new AtomicReference<>(); - mAdminDisallowedTetherConfig = checkIfRestrictionEnforced( - context, DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()) != null; + mAdminDisallowedTetherConfig = isTetherConfigDisallowed(context); mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); @@ -170,6 +169,11 @@ public class TetherPreferenceController extends PreferenceController } } + public static boolean isTetherConfigDisallowed(Context context) { + return checkIfRestrictionEnforced( + context, DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()) != null; + } + @VisibleForTesting void updateSummary() { if (mPreference == null) { From b82f51099ad5efed52a9e840252fe2dcc4cdf8f7 Mon Sep 17 00:00:00 2001 From: Eric Schwarzenbach Date: Tue, 8 Aug 2017 14:11:51 -0700 Subject: [PATCH 10/10] Add modify string to resources. Bug: 36483704 Test: n/a Change-Id: I8c68e11a7bbaff98e6384713dea69ef34bf46d01 --- res/values/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/res/values/strings.xml b/res/values/strings.xml index 31a18728f81..822573d46eb 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1950,6 +1950,8 @@ Failed to connect to network Forget + + Modify Failed to forget network