From 290eb284c679454776bc1ea7478d40e888ac6f55 Mon Sep 17 00:00:00 2001 From: Lais Andrade Date: Thu, 17 Jun 2021 20:06:11 +0100 Subject: [PATCH] Add receiver to user switch to VibrationSettings The current user settings held by the vibrator manager service is not updating on user switch. Adding a receiver to trigger settings update on that broadcast. Fix: 186142123 Test: VibrationSettingsTest Change-Id: I177bc6fd0c12185526ce82faf066a76901520468 --- .../server/vibrator/VibrationSettings.java | 19 +++++++++++++++++ .../vibrator/VibrationSettingsTest.java | 21 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/services/core/java/com/android/server/vibrator/VibrationSettings.java b/services/core/java/com/android/server/vibrator/VibrationSettings.java index 4a07c1ac1e39d..f756434e981a9 100644 --- a/services/core/java/com/android/server/vibrator/VibrationSettings.java +++ b/services/core/java/com/android/server/vibrator/VibrationSettings.java @@ -19,7 +19,10 @@ package com.android.server.vibrator; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.IUidObserver; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.content.res.Resources; import android.database.ContentObserver; import android.media.AudioManager; @@ -61,6 +64,9 @@ final class VibrationSettings { private final SettingsObserver mSettingObserver; @VisibleForTesting final UidObserver mUidObserver; + @VisibleForTesting + final UserObserver mUserReceiver; + @GuardedBy("mLock") private final List mListeners = new ArrayList<>(); @@ -94,6 +100,7 @@ final class VibrationSettings { mContext = context; mSettingObserver = new SettingsObserver(handler); mUidObserver = new UidObserver(); + mUserReceiver = new UserObserver(); VibrationEffect clickEffect = createEffectFromResource( com.android.internal.R.array.config_virtualKeyVibePattern); @@ -150,6 +157,7 @@ final class VibrationSettings { } }); + mContext.registerReceiver(mUserReceiver, new IntentFilter(Intent.ACTION_USER_SWITCHED)); registerSettingsObserver(Settings.System.getUriFor(Settings.System.VIBRATE_INPUT_DEVICES)); registerSettingsObserver(Settings.System.getUriFor(Settings.System.VIBRATE_WHEN_RINGING)); registerSettingsObserver(Settings.Global.getUriFor(Settings.Global.APPLY_RAMPING_RINGER)); @@ -457,6 +465,17 @@ final class VibrationSettings { } } + /** Implementation of {@link BroadcastReceiver} to update settings on current user change. */ + @VisibleForTesting + final class UserObserver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) { + updateSettings(); + } + } + } + /** Implementation of {@link ContentObserver} to be registered to a setting {@link Uri}. */ @VisibleForTesting final class UidObserver extends IUidObserver.Stub { diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java index 855012459bd68..7d24a2f5845e8 100644 --- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java +++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java @@ -33,6 +33,7 @@ import android.app.ActivityManager; import android.content.ContentResolver; import android.content.Context; import android.content.ContextWrapper; +import android.content.Intent; import android.media.AudioManager; import android.os.Handler; import android.os.PowerManagerInternal; @@ -69,6 +70,7 @@ import org.mockito.junit.MockitoRule; public class VibrationSettingsTest { private static final int UID = 1; + private static final int USER_OPERATION_TIMEOUT_MILLIS = 60_000; // 1 min private static final PowerSaveState NORMAL_POWER_STATE = new PowerSaveState.Builder().build(); private static final PowerSaveState LOW_POWER_STATE = new PowerSaveState.Builder() .setBatterySaverEnabled(true).build(); @@ -407,6 +409,25 @@ public class VibrationSettingsTest { mVibrationSettings.getCurrentIntensity(VibrationAttributes.USAGE_RINGTONE)); } + @Test + public void getCurrentIntensity_updateTriggeredAfterUserSwitched() { + mFakeVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_OFF); + setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, + Vibrator.VIBRATION_INTENSITY_HIGH); + assertEquals(Vibrator.VIBRATION_INTENSITY_HIGH, + mVibrationSettings.getCurrentIntensity(VibrationAttributes.USAGE_RINGTONE)); + + // Switching user is not working with FakeSettingsProvider. + // Testing the broadcast flow manually. + Settings.System.putIntForUser(mContextSpy.getContentResolver(), + Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW, + UserHandle.USER_CURRENT); + mVibrationSettings.mUserReceiver.onReceive(mContextSpy, + new Intent(Intent.ACTION_USER_SWITCHED)); + assertEquals(Vibrator.VIBRATION_INTENSITY_LOW, + mVibrationSettings.getCurrentIntensity(VibrationAttributes.USAGE_RINGTONE)); + } + @Test public void getFallbackEffect_returnsEffectsFromSettings() { assertNotNull(mVibrationSettings.getFallbackEffect(VibrationEffect.EFFECT_TICK));