Merge "fix(magnifier): fix deadlock when feature flag changes" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
d8565cf420
@@ -179,6 +179,7 @@ import java.util.Iterator;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
@@ -494,8 +495,13 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
|
|||||||
mA11yWindowManager = new AccessibilityWindowManager(mLock, mMainHandler,
|
mA11yWindowManager = new AccessibilityWindowManager(mLock, mMainHandler,
|
||||||
mWindowManagerService, this, mSecurityPolicy, this, mTraceManager);
|
mWindowManagerService, this, mSecurityPolicy, this, mTraceManager);
|
||||||
mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler);
|
mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler);
|
||||||
mMagnificationController = new MagnificationController(this, mLock, mContext,
|
mMagnificationController = new MagnificationController(
|
||||||
new MagnificationScaleProvider(mContext));
|
this,
|
||||||
|
mLock,
|
||||||
|
mContext,
|
||||||
|
new MagnificationScaleProvider(mContext),
|
||||||
|
Executors.newSingleThreadExecutor()
|
||||||
|
);
|
||||||
mMagnificationProcessor = new MagnificationProcessor(mMagnificationController);
|
mMagnificationProcessor = new MagnificationProcessor(mMagnificationController);
|
||||||
mCaptioningManagerImpl = new CaptioningManagerImpl(mContext);
|
mCaptioningManagerImpl = new CaptioningManagerImpl(mContext);
|
||||||
mProxyManager = new ProxyManager(mLock, mA11yWindowManager, mContext, mMainHandler,
|
mProxyManager = new ProxyManager(mLock, mA11yWindowManager, mContext, mMainHandler,
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ import com.android.internal.R;
|
|||||||
import com.android.internal.accessibility.common.MagnificationConstants;
|
import com.android.internal.accessibility.common.MagnificationConstants;
|
||||||
import com.android.internal.annotations.GuardedBy;
|
import com.android.internal.annotations.GuardedBy;
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.internal.util.ConcurrentUtils;
|
|
||||||
import com.android.internal.util.function.pooled.PooledLambda;
|
import com.android.internal.util.function.pooled.PooledLambda;
|
||||||
import com.android.server.LocalServices;
|
import com.android.server.LocalServices;
|
||||||
import com.android.server.accessibility.AccessibilityManagerService;
|
import com.android.server.accessibility.AccessibilityManagerService;
|
||||||
@@ -65,6 +64,7 @@ import com.android.server.wm.WindowManagerInternal;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -774,7 +774,8 @@ public class FullScreenMagnificationController implements
|
|||||||
public FullScreenMagnificationController(@NonNull Context context,
|
public FullScreenMagnificationController(@NonNull Context context,
|
||||||
@NonNull AccessibilityTraceManager traceManager, @NonNull Object lock,
|
@NonNull AccessibilityTraceManager traceManager, @NonNull Object lock,
|
||||||
@NonNull MagnificationInfoChangedCallback magnificationInfoChangedCallback,
|
@NonNull MagnificationInfoChangedCallback magnificationInfoChangedCallback,
|
||||||
@NonNull MagnificationScaleProvider scaleProvider) {
|
@NonNull MagnificationScaleProvider scaleProvider,
|
||||||
|
@NonNull Executor backgroundExecutor) {
|
||||||
this(
|
this(
|
||||||
new ControllerContext(
|
new ControllerContext(
|
||||||
context,
|
context,
|
||||||
@@ -785,7 +786,8 @@ public class FullScreenMagnificationController implements
|
|||||||
lock,
|
lock,
|
||||||
magnificationInfoChangedCallback,
|
magnificationInfoChangedCallback,
|
||||||
scaleProvider,
|
scaleProvider,
|
||||||
/* thumbnailSupplier= */ null);
|
/* thumbnailSupplier= */ null,
|
||||||
|
backgroundExecutor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Constructor for tests */
|
/** Constructor for tests */
|
||||||
@@ -795,7 +797,8 @@ public class FullScreenMagnificationController implements
|
|||||||
@NonNull Object lock,
|
@NonNull Object lock,
|
||||||
@NonNull MagnificationInfoChangedCallback magnificationInfoChangedCallback,
|
@NonNull MagnificationInfoChangedCallback magnificationInfoChangedCallback,
|
||||||
@NonNull MagnificationScaleProvider scaleProvider,
|
@NonNull MagnificationScaleProvider scaleProvider,
|
||||||
Supplier<MagnificationThumbnail> thumbnailSupplier) {
|
Supplier<MagnificationThumbnail> thumbnailSupplier,
|
||||||
|
@NonNull Executor backgroundExecutor) {
|
||||||
mControllerCtx = ctx;
|
mControllerCtx = ctx;
|
||||||
mLock = lock;
|
mLock = lock;
|
||||||
mMainThreadId = mControllerCtx.getContext().getMainLooper().getThread().getId();
|
mMainThreadId = mControllerCtx.getContext().getMainLooper().getThread().getId();
|
||||||
@@ -805,7 +808,7 @@ public class FullScreenMagnificationController implements
|
|||||||
mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
|
mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
|
||||||
mMagnificationThumbnailFeatureFlag = new MagnificationThumbnailFeatureFlag();
|
mMagnificationThumbnailFeatureFlag = new MagnificationThumbnailFeatureFlag();
|
||||||
mMagnificationThumbnailFeatureFlag.addOnChangedListener(
|
mMagnificationThumbnailFeatureFlag.addOnChangedListener(
|
||||||
ConcurrentUtils.DIRECT_EXECUTOR, this::onMagnificationThumbnailFeatureFlagChanged);
|
backgroundExecutor, this::onMagnificationThumbnailFeatureFlagChanged);
|
||||||
if (thumbnailSupplier != null) {
|
if (thumbnailSupplier != null) {
|
||||||
mThumbnailSupplier = thumbnailSupplier;
|
mThumbnailSupplier = thumbnailSupplier;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_
|
|||||||
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;
|
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;
|
||||||
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_NONE;
|
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_NONE;
|
||||||
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW;
|
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW;
|
||||||
import static android.view.accessibility.MagnificationAnimationCallback.STUB_ANIMATION_CALLBACK;
|
|
||||||
|
|
||||||
import static com.android.server.accessibility.AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID;
|
import static com.android.server.accessibility.AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID;
|
||||||
|
|
||||||
@@ -48,11 +47,12 @@ import android.view.accessibility.MagnificationAnimationCallback;
|
|||||||
import com.android.internal.accessibility.util.AccessibilityStatsLogUtils;
|
import com.android.internal.accessibility.util.AccessibilityStatsLogUtils;
|
||||||
import com.android.internal.annotations.GuardedBy;
|
import com.android.internal.annotations.GuardedBy;
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.internal.util.ConcurrentUtils;
|
|
||||||
import com.android.server.LocalServices;
|
import com.android.server.LocalServices;
|
||||||
import com.android.server.accessibility.AccessibilityManagerService;
|
import com.android.server.accessibility.AccessibilityManagerService;
|
||||||
import com.android.server.wm.WindowManagerInternal;
|
import com.android.server.wm.WindowManagerInternal;
|
||||||
|
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles all magnification controllers initialization, generic interactions,
|
* Handles all magnification controllers initialization, generic interactions,
|
||||||
* magnification mode transition and magnification switch UI show/hide logic
|
* magnification mode transition and magnification switch UI show/hide logic
|
||||||
@@ -101,6 +101,8 @@ public class MagnificationController implements WindowMagnificationManager.Callb
|
|||||||
/** Whether the platform supports window magnification feature. */
|
/** Whether the platform supports window magnification feature. */
|
||||||
private final boolean mSupportWindowMagnification;
|
private final boolean mSupportWindowMagnification;
|
||||||
|
|
||||||
|
private final Executor mBackgroundExecutor;
|
||||||
|
|
||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
private final SparseIntArray mCurrentMagnificationModeArray = new SparseIntArray();
|
private final SparseIntArray mCurrentMagnificationModeArray = new SparseIntArray();
|
||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
@@ -142,11 +144,13 @@ public class MagnificationController implements WindowMagnificationManager.Callb
|
|||||||
}
|
}
|
||||||
|
|
||||||
public MagnificationController(AccessibilityManagerService ams, Object lock,
|
public MagnificationController(AccessibilityManagerService ams, Object lock,
|
||||||
Context context, MagnificationScaleProvider scaleProvider) {
|
Context context, MagnificationScaleProvider scaleProvider,
|
||||||
|
Executor backgroundExecutor) {
|
||||||
mAms = ams;
|
mAms = ams;
|
||||||
mLock = lock;
|
mLock = lock;
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mScaleProvider = scaleProvider;
|
mScaleProvider = scaleProvider;
|
||||||
|
mBackgroundExecutor = backgroundExecutor;
|
||||||
LocalServices.getService(WindowManagerInternal.class)
|
LocalServices.getService(WindowManagerInternal.class)
|
||||||
.getAccessibilityController().setUiChangesForAccessibilityCallbacks(this);
|
.getAccessibilityController().setUiChangesForAccessibilityCallbacks(this);
|
||||||
mSupportWindowMagnification = context.getPackageManager().hasSystemFeature(
|
mSupportWindowMagnification = context.getPackageManager().hasSystemFeature(
|
||||||
@@ -154,15 +158,15 @@ public class MagnificationController implements WindowMagnificationManager.Callb
|
|||||||
|
|
||||||
mAlwaysOnMagnificationFeatureFlag = new AlwaysOnMagnificationFeatureFlag();
|
mAlwaysOnMagnificationFeatureFlag = new AlwaysOnMagnificationFeatureFlag();
|
||||||
mAlwaysOnMagnificationFeatureFlag.addOnChangedListener(
|
mAlwaysOnMagnificationFeatureFlag.addOnChangedListener(
|
||||||
ConcurrentUtils.DIRECT_EXECUTOR, mAms::updateAlwaysOnMagnification);
|
mBackgroundExecutor, mAms::updateAlwaysOnMagnification);
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public MagnificationController(AccessibilityManagerService ams, Object lock,
|
public MagnificationController(AccessibilityManagerService ams, Object lock,
|
||||||
Context context, FullScreenMagnificationController fullScreenMagnificationController,
|
Context context, FullScreenMagnificationController fullScreenMagnificationController,
|
||||||
WindowMagnificationManager windowMagnificationManager,
|
WindowMagnificationManager windowMagnificationManager,
|
||||||
MagnificationScaleProvider scaleProvider) {
|
MagnificationScaleProvider scaleProvider, Executor backgroundExecutor) {
|
||||||
this(ams, lock, context, scaleProvider);
|
this(ams, lock, context, scaleProvider, backgroundExecutor);
|
||||||
mFullScreenMagnificationController = fullScreenMagnificationController;
|
mFullScreenMagnificationController = fullScreenMagnificationController;
|
||||||
mWindowMagnificationMgr = windowMagnificationManager;
|
mWindowMagnificationMgr = windowMagnificationManager;
|
||||||
}
|
}
|
||||||
@@ -765,8 +769,14 @@ public class MagnificationController implements WindowMagnificationManager.Callb
|
|||||||
public FullScreenMagnificationController getFullScreenMagnificationController() {
|
public FullScreenMagnificationController getFullScreenMagnificationController() {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
if (mFullScreenMagnificationController == null) {
|
if (mFullScreenMagnificationController == null) {
|
||||||
mFullScreenMagnificationController = new FullScreenMagnificationController(mContext,
|
mFullScreenMagnificationController = new FullScreenMagnificationController(
|
||||||
mAms.getTraceManager(), mLock, this, mScaleProvider);
|
mContext,
|
||||||
|
mAms.getTraceManager(),
|
||||||
|
mLock,
|
||||||
|
this,
|
||||||
|
mScaleProvider,
|
||||||
|
mBackgroundExecutor
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return mFullScreenMagnificationController;
|
return mFullScreenMagnificationController;
|
||||||
|
|||||||
@@ -80,6 +80,9 @@ abstract class MagnificationFeatureFlagBase {
|
|||||||
*
|
*
|
||||||
* <p>{@see DeviceConfig#addOnPropertiesChangedListener(
|
* <p>{@see DeviceConfig#addOnPropertiesChangedListener(
|
||||||
* String, Executor, DeviceConfig.OnPropertiesChangedListener)}
|
* String, Executor, DeviceConfig.OnPropertiesChangedListener)}
|
||||||
|
*
|
||||||
|
* <p>Note: be weary of using a DIRECT_EXECUTOR here. You may run into deadlocks! (see
|
||||||
|
* b/281132229)
|
||||||
*/
|
*/
|
||||||
@NonNull
|
@NonNull
|
||||||
public DeviceConfig.OnPropertiesChangedListener addOnChangedListener(
|
public DeviceConfig.OnPropertiesChangedListener addOnChangedListener(
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ import android.view.accessibility.MagnificationAnimationCallback;
|
|||||||
import androidx.test.InstrumentationRegistry;
|
import androidx.test.InstrumentationRegistry;
|
||||||
import androidx.test.runner.AndroidJUnit4;
|
import androidx.test.runner.AndroidJUnit4;
|
||||||
|
|
||||||
|
import com.android.internal.util.ConcurrentUtils;
|
||||||
import com.android.internal.util.test.FakeSettingsProvider;
|
import com.android.internal.util.test.FakeSettingsProvider;
|
||||||
import com.android.server.LocalServices;
|
import com.android.server.LocalServices;
|
||||||
import com.android.server.accessibility.AccessibilityTraceManager;
|
import com.android.server.accessibility.AccessibilityTraceManager;
|
||||||
@@ -160,7 +161,8 @@ public class FullScreenMagnificationControllerTest {
|
|||||||
new Object(),
|
new Object(),
|
||||||
mRequestObserver,
|
mRequestObserver,
|
||||||
mScaleProvider,
|
mScaleProvider,
|
||||||
() -> mMockThumbnail);
|
() -> mMockThumbnail,
|
||||||
|
ConcurrentUtils.DIRECT_EXECUTOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ import android.view.ViewConfiguration;
|
|||||||
|
|
||||||
import androidx.test.runner.AndroidJUnit4;
|
import androidx.test.runner.AndroidJUnit4;
|
||||||
|
|
||||||
|
import com.android.internal.util.ConcurrentUtils;
|
||||||
import com.android.server.accessibility.AccessibilityManagerService;
|
import com.android.server.accessibility.AccessibilityManagerService;
|
||||||
import com.android.server.accessibility.AccessibilityTraceManager;
|
import com.android.server.accessibility.AccessibilityTraceManager;
|
||||||
import com.android.server.accessibility.EventStreamTransformation;
|
import com.android.server.accessibility.EventStreamTransformation;
|
||||||
@@ -170,8 +171,8 @@ public class FullScreenMagnificationGestureHandlerTest {
|
|||||||
new Object(),
|
new Object(),
|
||||||
mMagnificationInfoChangedCallback,
|
mMagnificationInfoChangedCallback,
|
||||||
new MagnificationScaleProvider(mContext),
|
new MagnificationScaleProvider(mContext),
|
||||||
() -> null
|
() -> null,
|
||||||
) {
|
ConcurrentUtils.DIRECT_EXECUTOR) {
|
||||||
@Override
|
@Override
|
||||||
public boolean magnificationRegionContains(int displayId, float x, float y) {
|
public boolean magnificationRegionContains(int displayId, float x, float y) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.test.InstrumentationRegistry;
|
import androidx.test.InstrumentationRegistry;
|
||||||
import androidx.test.runner.AndroidJUnit4;
|
import androidx.test.runner.AndroidJUnit4;
|
||||||
|
|
||||||
|
import com.android.internal.util.ConcurrentUtils;
|
||||||
import com.android.internal.util.test.FakeSettingsProvider;
|
import com.android.internal.util.test.FakeSettingsProvider;
|
||||||
import com.android.server.LocalServices;
|
import com.android.server.LocalServices;
|
||||||
import com.android.server.accessibility.AccessibilityManagerService;
|
import com.android.server.accessibility.AccessibilityManagerService;
|
||||||
@@ -199,7 +200,8 @@ public class MagnificationControllerTest {
|
|||||||
new Object(),
|
new Object(),
|
||||||
mScreenMagnificationInfoChangedCallbackDelegate,
|
mScreenMagnificationInfoChangedCallbackDelegate,
|
||||||
mScaleProvider,
|
mScaleProvider,
|
||||||
() -> null
|
() -> null,
|
||||||
|
ConcurrentUtils.DIRECT_EXECUTOR
|
||||||
));
|
));
|
||||||
mScreenMagnificationController.register(TEST_DISPLAY);
|
mScreenMagnificationController.register(TEST_DISPLAY);
|
||||||
|
|
||||||
@@ -209,7 +211,8 @@ public class MagnificationControllerTest {
|
|||||||
mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
|
mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
|
||||||
|
|
||||||
mMagnificationController = spy(new MagnificationController(mService, globalLock, mContext,
|
mMagnificationController = spy(new MagnificationController(mService, globalLock, mContext,
|
||||||
mScreenMagnificationController, mWindowMagnificationManager, mScaleProvider));
|
mScreenMagnificationController, mWindowMagnificationManager, mScaleProvider,
|
||||||
|
ConcurrentUtils.DIRECT_EXECUTOR));
|
||||||
mMagnificationController.setMagnificationCapabilities(
|
mMagnificationController.setMagnificationCapabilities(
|
||||||
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL);
|
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user