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:
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user