diff options
| author | 2022-12-25 11:33:32 +0800 | |
|---|---|---|
| committer | 2023-01-04 16:51:36 +0800 | |
| commit | b6861f44a2ad954bb8d2d30403b50b42a0a05fec (patch) | |
| tree | 37c79368bc9bf236a5c5e04d2f20dddfffc71309 | |
| parent | 0a30707b174266d6df859d7a61e449eea9b31ab2 (diff) | |
Fix didn’t update the strings immediately after language locale change.
Actions:
Need to refetch the latest data of services over the accessibility manager under locale change.
Bug: 263109670
Test: Manual test
Change-Id: I799a0b8092b8f703af0d19ea065d215225df31bd
4 files changed, 60 insertions, 8 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java index 05e1d3f0e126..468646d3dff6 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java @@ -30,13 +30,20 @@ import static com.android.systemui.accessibility.floatingmenu.MenuViewAppearance import android.annotation.FloatRange; import android.annotation.IntDef; +import android.content.ComponentCallbacks; import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.res.Configuration; import android.database.ContentObserver; +import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.NonNull; import com.android.internal.accessibility.dialog.AccessibilityTarget; import com.android.internal.annotations.VisibleForTesting; @@ -50,6 +57,9 @@ import java.util.List; * Stores and observe the settings contents for the menu view. */ class MenuInfoRepository { + private static final String TAG = "MenuInfoRepository"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG) || Build.IS_DEBUGGABLE; + @FloatRange(from = 0.0, to = 1.0) private static final float DEFAULT_MENU_POSITION_X_PERCENT = 1.0f; @@ -60,6 +70,7 @@ class MenuInfoRepository { private static final int DEFAULT_MIGRATION_TOOLTIP_VALUE_PROMPT = MigrationPrompt.DISABLED; private final Context mContext; + private final Configuration mConfiguration; private final Handler mHandler = new Handler(Looper.getMainLooper()); private final OnSettingsContentsChanged mSettingsContentsCallback; private Position mPercentagePosition; @@ -102,8 +113,34 @@ class MenuInfoRepository { } }; + @VisibleForTesting + final ComponentCallbacks mComponentCallbacks = new ComponentCallbacks() { + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + final int diff = newConfig.diff(mConfiguration); + + if (DEBUG) { + Log.d(TAG, "onConfigurationChanged = " + Configuration.configurationDiffToString( + diff)); + } + + if ((diff & ActivityInfo.CONFIG_LOCALE) != 0) { + mSettingsContentsCallback.onTargetFeaturesChanged( + getTargets(mContext, ACCESSIBILITY_BUTTON)); + } + + mConfiguration.setTo(newConfig); + } + + @Override + public void onLowMemory() { + // Do nothing. + } + }; + MenuInfoRepository(Context context, OnSettingsContentsChanged settingsContentsChanged) { mContext = context; + mConfiguration = new Configuration(context.getResources().getConfiguration()); mSettingsContentsCallback = settingsContentsChanged; mPercentagePosition = getStartPosition(); @@ -181,7 +218,7 @@ class MenuInfoRepository { : Position.fromString(absolutePositionString); } - void registerContentObservers() { + void registerObserversAndCallbacks() { mContext.getContentResolver().registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS), /* notifyForDescendants */ false, mMenuTargetFeaturesContentObserver, @@ -202,12 +239,14 @@ class MenuInfoRepository { Settings.Secure.getUriFor(ACCESSIBILITY_FLOATING_MENU_OPACITY), /* notifyForDescendants */ false, mMenuFadeOutContentObserver, UserHandle.USER_CURRENT); + mContext.registerComponentCallbacks(mComponentCallbacks); } - void unregisterContentObservers() { + void unregisterObserversAndCallbacks() { mContext.getContentResolver().unregisterContentObserver(mMenuTargetFeaturesContentObserver); mContext.getContentResolver().unregisterContentObserver(mMenuSizeContentObserver); mContext.getContentResolver().unregisterContentObserver(mMenuFadeOutContentObserver); + mContext.unregisterComponentCallbacks(mComponentCallbacks); } interface OnSettingsContentsChanged { diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java index 986aa51ecce1..a36a3e2af2d4 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java @@ -299,7 +299,7 @@ class MenuView extends FrameLayout implements mMenuViewModel.getSizeTypeData().observeForever(mSizeTypeObserver); mMenuViewModel.getMoveToTuckedData().observeForever(mMoveToTuckedObserver); setVisibility(VISIBLE); - mMenuViewModel.registerContentObservers(); + mMenuViewModel.registerObserversAndCallbacks(); getViewTreeObserver().addOnComputeInternalInsetsListener(this); getViewTreeObserver().addOnDrawListener(mSystemGestureExcludeUpdater); } @@ -312,7 +312,7 @@ class MenuView extends FrameLayout implements mMenuViewModel.getTargetFeaturesData().removeObserver(mTargetFeaturesObserver); mMenuViewModel.getSizeTypeData().removeObserver(mSizeTypeObserver); mMenuViewModel.getMoveToTuckedData().removeObserver(mMoveToTuckedObserver); - mMenuViewModel.unregisterContentObservers(); + mMenuViewModel.unregisterObserversAndCallbacks(); getViewTreeObserver().removeOnComputeInternalInsetsListener(this); getViewTreeObserver().removeOnDrawListener(mSystemGestureExcludeUpdater); } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java index 5fea3b0ba2f9..0d7a73285a1d 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewModel.java @@ -111,11 +111,11 @@ class MenuViewModel implements MenuInfoRepository.OnSettingsContentsChanged { return mTargetFeaturesData; } - void registerContentObservers() { - mInfoRepository.registerContentObservers(); + void registerObserversAndCallbacks() { + mInfoRepository.registerObserversAndCallbacks(); } - void unregisterContentObservers() { - mInfoRepository.unregisterContentObservers(); + void unregisterObserversAndCallbacks() { + mInfoRepository.unregisterObserversAndCallbacks(); } }
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java index e62a3295a7e2..465709ae9df7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepositoryTest.java @@ -20,6 +20,7 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.any; import static org.mockito.Mockito.verify; +import android.content.res.Configuration; import android.testing.AndroidTestingRunner; import androidx.test.filters.SmallTest; @@ -34,6 +35,8 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; +import java.util.Locale; + /** Tests for {@link MenuInfoRepository}. */ @RunWith(AndroidTestingRunner.class) @SmallTest @@ -64,4 +67,14 @@ public class MenuInfoRepositoryTest extends SysuiTestCase { verify(mMockSettingsContentsChanged).onFadeEffectInfoChanged(any(MenuFadeEffectInfo.class)); } + + @Test + public void localeChange_verifyTargetFeaturesChanged() { + final Configuration configuration = new Configuration(); + configuration.setLocale(Locale.TAIWAN); + + mMenuInfoRepository.mComponentCallbacks.onConfigurationChanged(configuration); + + verify(mMockSettingsContentsChanged).onTargetFeaturesChanged(any()); + } } |