Fix that accessibility shortcuts still turned but FM disappeared on the screen in owner mode after switching user.

Root cause:
Accessibility manager service seems to be not ready.

Actions:
Add the service callbacks to avoid getting wrong shortcut data.

Bug: 258320314
Test: atest MenuInfoRepositoryTest
Change-Id: Ib37b1fbd7964974bf5eb6791b25e95f180fa9f7a
This commit is contained in:
Peter Liang
2022-12-26 11:01:54 +08:00
parent b6861f44a2
commit 816b570388
9 changed files with 104 additions and 15 deletions

View File

@@ -42,6 +42,7 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.view.accessibility.AccessibilityManager;
import androidx.annotation.NonNull;
@@ -71,6 +72,9 @@ class MenuInfoRepository {
private final Context mContext;
private final Configuration mConfiguration;
private final AccessibilityManager mAccessibilityManager;
private final AccessibilityManager.AccessibilityServicesStateChangeListener
mA11yServicesStateChangeListener = manager -> onTargetFeaturesChanged();
private final Handler mHandler = new Handler(Looper.getMainLooper());
private final OnSettingsContentsChanged mSettingsContentsCallback;
private Position mPercentagePosition;
@@ -85,12 +89,12 @@ class MenuInfoRepository {
int ENABLED = 1;
}
private final ContentObserver mMenuTargetFeaturesContentObserver =
@VisibleForTesting
final ContentObserver mMenuTargetFeaturesContentObserver =
new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
mSettingsContentsCallback.onTargetFeaturesChanged(
getTargets(mContext, ACCESSIBILITY_BUTTON));
onTargetFeaturesChanged();
}
};
@@ -125,8 +129,7 @@ class MenuInfoRepository {
}
if ((diff & ActivityInfo.CONFIG_LOCALE) != 0) {
mSettingsContentsCallback.onTargetFeaturesChanged(
getTargets(mContext, ACCESSIBILITY_BUTTON));
onTargetFeaturesChanged();
}
mConfiguration.setTo(newConfig);
@@ -138,8 +141,10 @@ class MenuInfoRepository {
}
};
MenuInfoRepository(Context context, OnSettingsContentsChanged settingsContentsChanged) {
MenuInfoRepository(Context context, AccessibilityManager accessibilityManager,
OnSettingsContentsChanged settingsContentsChanged) {
mContext = context;
mAccessibilityManager = accessibilityManager;
mConfiguration = new Configuration(context.getResources().getConfiguration());
mSettingsContentsCallback = settingsContentsChanged;
@@ -209,6 +214,11 @@ class MenuInfoRepository {
UserHandle.USER_CURRENT);
}
private void onTargetFeaturesChanged() {
mSettingsContentsCallback.onTargetFeaturesChanged(
getTargets(mContext, ACCESSIBILITY_BUTTON));
}
private Position getStartPosition() {
final String absolutePositionString = Prefs.getString(mContext,
Prefs.Key.ACCESSIBILITY_FLOATING_MENU_POSITION, /* defaultValue= */ null);
@@ -240,6 +250,9 @@ class MenuInfoRepository {
/* notifyForDescendants */ false, mMenuFadeOutContentObserver,
UserHandle.USER_CURRENT);
mContext.registerComponentCallbacks(mComponentCallbacks);
mAccessibilityManager.addAccessibilityServicesStateChangeListener(
mA11yServicesStateChangeListener);
}
void unregisterObserversAndCallbacks() {
@@ -247,6 +260,9 @@ class MenuInfoRepository {
mContext.getContentResolver().unregisterContentObserver(mMenuSizeContentObserver);
mContext.getContentResolver().unregisterContentObserver(mMenuFadeOutContentObserver);
mContext.unregisterComponentCallbacks(mComponentCallbacks);
mAccessibilityManager.removeAccessibilityServicesStateChangeListener(
mA11yServicesStateChangeListener);
}
interface OnSettingsContentsChanged {

View File

@@ -154,7 +154,7 @@ class MenuViewLayer extends FrameLayout implements
mAccessibilityManager = accessibilityManager;
mFloatingMenu = floatingMenu;
mMenuViewModel = new MenuViewModel(context);
mMenuViewModel = new MenuViewModel(context, accessibilityManager);
mMenuViewAppearance = new MenuViewAppearance(context, windowManager);
mMenuView = new MenuView(context, mMenuViewModel, mMenuViewAppearance);
mMenuAnimationController = mMenuView.getMenuAnimationController();

View File

@@ -17,6 +17,7 @@
package com.android.systemui.accessibility.floatingmenu;
import android.content.Context;
import android.view.accessibility.AccessibilityManager;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
@@ -41,8 +42,9 @@ class MenuViewModel implements MenuInfoRepository.OnSettingsContentsChanged {
private final MutableLiveData<Position> mPercentagePositionData = new MutableLiveData<>();
private final MenuInfoRepository mInfoRepository;
MenuViewModel(Context context) {
mInfoRepository = new MenuInfoRepository(context, /* settingsContentsChanged= */ this);
MenuViewModel(Context context, AccessibilityManager accessibilityManager) {
mInfoRepository = new MenuInfoRepository(context,
accessibilityManager, /* settingsContentsChanged= */ this);
}
@Override

View File

@@ -22,6 +22,7 @@ import static org.mockito.Mockito.verify;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
import androidx.test.filters.SmallTest;
@@ -29,8 +30,12 @@ import com.android.systemui.SysuiTestCase;
import com.android.wm.shell.bubbles.DismissView;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
/** Tests for {@link DismissAnimationController}. */
@SmallTest
@@ -40,10 +45,16 @@ public class DismissAnimationControllerTest extends SysuiTestCase {
private DismissAnimationController mDismissAnimationController;
private DismissView mDismissView;
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
@Mock
private AccessibilityManager mAccessibilityManager;
@Before
public void setUp() throws Exception {
final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class);
final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext);
final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager);
final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext,
stubWindowManager);
final MenuView stubMenuView = new MenuView(mContext, stubMenuViewModel,

View File

@@ -31,6 +31,7 @@ import android.testing.TestableLooper;
import android.view.View;
import android.view.ViewPropertyAnimator;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
import androidx.dynamicanimation.animation.DynamicAnimation;
import androidx.dynamicanimation.animation.FlingAnimation;
@@ -43,9 +44,13 @@ import com.android.systemui.SysuiTestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import java.util.Optional;
@@ -61,12 +66,18 @@ public class MenuAnimationControllerTest extends SysuiTestCase {
private MenuView mMenuView;
private TestMenuAnimationController mMenuAnimationController;
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
@Mock
private AccessibilityManager mAccessibilityManager;
@Before
public void setUp() throws Exception {
final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class);
final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext,
stubWindowManager);
final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext);
final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager);
mMenuView = spy(new MenuView(mContext, stubMenuViewModel, stubMenuViewAppearance));
mViewPropertyAnimator = spy(mMenuView.animate());

View File

@@ -16,17 +16,23 @@
package com.android.systemui.accessibility.floatingmenu;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.content.res.Configuration;
import android.testing.AndroidTestingRunner;
import android.view.accessibility.AccessibilityManager;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -35,6 +41,8 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
/** Tests for {@link MenuInfoRepository}. */
@@ -44,14 +52,29 @@ public class MenuInfoRepositoryTest extends SysuiTestCase {
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
@Mock
private AccessibilityManager mAccessibilityManager;
@Mock
private MenuInfoRepository.OnSettingsContentsChanged mMockSettingsContentsChanged;
private MenuInfoRepository mMenuInfoRepository;
private final List<String> mShortcutTargets = new ArrayList<>();
@Before
public void setUp() {
mMenuInfoRepository = new MenuInfoRepository(mContext, mMockSettingsContentsChanged);
mContext.addMockSystemService(Context.ACCESSIBILITY_SERVICE, mAccessibilityManager);
mShortcutTargets.add(MAGNIFICATION_CONTROLLER_NAME);
doReturn(mShortcutTargets).when(mAccessibilityManager).getAccessibilityShortcutTargets(
anyInt());
mMenuInfoRepository = new MenuInfoRepository(mContext, mAccessibilityManager,
mMockSettingsContentsChanged);
}
@After
public void tearDown() {
mShortcutTargets.clear();
}
@Test

View File

@@ -29,6 +29,7 @@ import android.graphics.Rect;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
@@ -55,6 +56,9 @@ public class MenuItemAccessibilityDelegateTest extends SysuiTestCase {
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
@Mock
private AccessibilityManager mAccessibilityManager;
@Mock
private DismissAnimationController.DismissCallback mStubDismissCallback;
@@ -69,7 +73,7 @@ public class MenuItemAccessibilityDelegateTest extends SysuiTestCase {
final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class);
final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext,
stubWindowManager);
final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext);
final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager);
final int halfScreenHeight =
stubWindowManager.getCurrentWindowMetrics().getBounds().height() / 2;

View File

@@ -31,6 +31,7 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.test.filters.SmallTest;
@@ -42,8 +43,12 @@ import com.android.wm.shell.bubbles.DismissView;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import java.util.ArrayList;
import java.util.Collections;
@@ -64,10 +69,16 @@ public class MenuListViewTouchHandlerTest extends SysuiTestCase {
private RecyclerView mStubListView;
private DismissView mDismissView;
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
@Mock
private AccessibilityManager mAccessibilityManager;
@Before
public void setUp() throws Exception {
final WindowManager windowManager = mContext.getSystemService(WindowManager.class);
final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext);
final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager);
final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext,
windowManager);
mStubMenuView = new MenuView(mContext, stubMenuViewModel, stubMenuViewAppearance);

View File

@@ -29,6 +29,7 @@ import android.graphics.drawable.GradientDrawable;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
import androidx.test.filters.SmallTest;
@@ -37,8 +38,12 @@ import com.android.systemui.SysuiTestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
/** Tests for {@link MenuView}. */
@RunWith(AndroidTestingRunner.class)
@@ -52,12 +57,18 @@ public class MenuViewTest extends SysuiTestCase {
private String mLastPosition;
private MenuViewAppearance mStubMenuViewAppearance;
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
@Mock
private AccessibilityManager mAccessibilityManager;
@Before
public void setUp() throws Exception {
mUiModeManager = mContext.getSystemService(UiModeManager.class);
mNightMode = mUiModeManager.getNightMode();
mUiModeManager.setNightMode(MODE_NIGHT_YES);
final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext);
final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager);
final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class);
mStubMenuViewAppearance = new MenuViewAppearance(mContext, stubWindowManager);
mMenuView = spy(new MenuView(mContext, stubMenuViewModel, mStubMenuViewAppearance));