Merge "Skip falsing on unfolded devices." into tm-qpr-dev
This commit is contained in:
@@ -251,6 +251,10 @@ public final class DeviceStateManager {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private Boolean lastResult;
|
private Boolean lastResult;
|
||||||
|
|
||||||
|
public FoldStateListener(Context context) {
|
||||||
|
this(context, folded -> {});
|
||||||
|
}
|
||||||
|
|
||||||
public FoldStateListener(Context context, Consumer<Boolean> listener) {
|
public FoldStateListener(Context context, Consumer<Boolean> listener) {
|
||||||
mFoldedDeviceStates = context.getResources().getIntArray(
|
mFoldedDeviceStates = context.getResources().getIntArray(
|
||||||
com.android.internal.R.array.config_foldedDeviceStates);
|
com.android.internal.R.array.config_foldedDeviceStates);
|
||||||
@@ -266,5 +270,10 @@ public final class DeviceStateManager {
|
|||||||
mDelegate.accept(folded);
|
mDelegate.accept(folded);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Boolean getFolded() {
|
||||||
|
return lastResult;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,7 +176,8 @@ public class BrightLineFalsingManager implements FalsingManager {
|
|||||||
private @Classifier.InteractionType int mPriorInteractionType = Classifier.GENERIC;
|
private @Classifier.InteractionType int mPriorInteractionType = Classifier.GENERIC;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public BrightLineFalsingManager(FalsingDataProvider falsingDataProvider,
|
public BrightLineFalsingManager(
|
||||||
|
FalsingDataProvider falsingDataProvider,
|
||||||
MetricsLogger metricsLogger,
|
MetricsLogger metricsLogger,
|
||||||
@Named(BRIGHT_LINE_GESTURE_CLASSIFERS) Set<FalsingClassifier> classifiers,
|
@Named(BRIGHT_LINE_GESTURE_CLASSIFERS) Set<FalsingClassifier> classifiers,
|
||||||
SingleTapClassifier singleTapClassifier, LongTapClassifier longTapClassifier,
|
SingleTapClassifier singleTapClassifier, LongTapClassifier longTapClassifier,
|
||||||
@@ -399,7 +400,9 @@ public class BrightLineFalsingManager implements FalsingManager {
|
|||||||
|| mDataProvider.isJustUnlockedWithFace()
|
|| mDataProvider.isJustUnlockedWithFace()
|
||||||
|| mDataProvider.isDocked()
|
|| mDataProvider.isDocked()
|
||||||
|| mAccessibilityManager.isTouchExplorationEnabled()
|
|| mAccessibilityManager.isTouchExplorationEnabled()
|
||||||
|| mDataProvider.isA11yAction();
|
|| mDataProvider.isA11yAction()
|
||||||
|
|| (mFeatureFlags.isEnabled(Flags.FALSING_OFF_FOR_UNFOLDED)
|
||||||
|
&& !mDataProvider.isFolded());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.systemui.classifier;
|
package com.android.systemui.classifier;
|
||||||
|
|
||||||
|
import android.hardware.devicestate.DeviceStateManager.FoldStateListener;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.MotionEvent.PointerCoords;
|
import android.view.MotionEvent.PointerCoords;
|
||||||
@@ -42,6 +43,7 @@ public class FalsingDataProvider {
|
|||||||
private final int mWidthPixels;
|
private final int mWidthPixels;
|
||||||
private final int mHeightPixels;
|
private final int mHeightPixels;
|
||||||
private BatteryController mBatteryController;
|
private BatteryController mBatteryController;
|
||||||
|
private final FoldStateListener mFoldStateListener;
|
||||||
private final DockManager mDockManager;
|
private final DockManager mDockManager;
|
||||||
private final float mXdpi;
|
private final float mXdpi;
|
||||||
private final float mYdpi;
|
private final float mYdpi;
|
||||||
@@ -65,12 +67,14 @@ public class FalsingDataProvider {
|
|||||||
public FalsingDataProvider(
|
public FalsingDataProvider(
|
||||||
DisplayMetrics displayMetrics,
|
DisplayMetrics displayMetrics,
|
||||||
BatteryController batteryController,
|
BatteryController batteryController,
|
||||||
|
FoldStateListener foldStateListener,
|
||||||
DockManager dockManager) {
|
DockManager dockManager) {
|
||||||
mXdpi = displayMetrics.xdpi;
|
mXdpi = displayMetrics.xdpi;
|
||||||
mYdpi = displayMetrics.ydpi;
|
mYdpi = displayMetrics.ydpi;
|
||||||
mWidthPixels = displayMetrics.widthPixels;
|
mWidthPixels = displayMetrics.widthPixels;
|
||||||
mHeightPixels = displayMetrics.heightPixels;
|
mHeightPixels = displayMetrics.heightPixels;
|
||||||
mBatteryController = batteryController;
|
mBatteryController = batteryController;
|
||||||
|
mFoldStateListener = foldStateListener;
|
||||||
mDockManager = dockManager;
|
mDockManager = dockManager;
|
||||||
|
|
||||||
FalsingClassifier.logInfo("xdpi, ydpi: " + getXdpi() + ", " + getYdpi());
|
FalsingClassifier.logInfo("xdpi, ydpi: " + getXdpi() + ", " + getYdpi());
|
||||||
@@ -376,6 +380,10 @@ public class FalsingDataProvider {
|
|||||||
return mBatteryController.isWirelessCharging() || mDockManager.isDocked();
|
return mBatteryController.isWirelessCharging() || mDockManager.isDocked();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isFolded() {
|
||||||
|
return Boolean.TRUE.equals(mFoldStateListener.getFolded());
|
||||||
|
}
|
||||||
|
|
||||||
/** Implement to be alerted abotu the beginning and ending of falsing tracking. */
|
/** Implement to be alerted abotu the beginning and ending of falsing tracking. */
|
||||||
public interface SessionListener {
|
public interface SessionListener {
|
||||||
/** Called when the lock screen is shown and falsing-tracking begins. */
|
/** Called when the lock screen is shown and falsing-tracking begins. */
|
||||||
|
|||||||
@@ -207,6 +207,9 @@ object Flags {
|
|||||||
val AUTO_PIN_CONFIRMATION =
|
val AUTO_PIN_CONFIRMATION =
|
||||||
unreleasedFlag(224, "auto_pin_confirmation", "auto_pin_confirmation")
|
unreleasedFlag(224, "auto_pin_confirmation", "auto_pin_confirmation")
|
||||||
|
|
||||||
|
// TODO(b/262859270): Tracking Bug
|
||||||
|
@JvmField val FALSING_OFF_FOR_UNFOLDED = releasedFlag(225, "falsing_off_for_unfolded")
|
||||||
|
|
||||||
// 300 - power menu
|
// 300 - power menu
|
||||||
// TODO(b/254512600): Tracking Bug
|
// TODO(b/254512600): Tracking Bug
|
||||||
@JvmField val POWER_MENU_LITE = releasedFlag(300, "power_menu_lite")
|
@JvmField val POWER_MENU_LITE = releasedFlag(300, "power_menu_lite")
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
package com.android.systemui.unfold
|
package com.android.systemui.unfold
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.hardware.devicestate.DeviceStateManager
|
||||||
|
import com.android.systemui.dagger.qualifiers.Application
|
||||||
|
import com.android.systemui.dagger.qualifiers.Main
|
||||||
import com.android.systemui.keyguard.LifecycleScreenStatusProvider
|
import com.android.systemui.keyguard.LifecycleScreenStatusProvider
|
||||||
import com.android.systemui.unfold.config.UnfoldTransitionConfig
|
import com.android.systemui.unfold.config.UnfoldTransitionConfig
|
||||||
import com.android.systemui.unfold.system.SystemUnfoldSharedModule
|
import com.android.systemui.unfold.system.SystemUnfoldSharedModule
|
||||||
@@ -32,6 +35,7 @@ import dagger.Lazy
|
|||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.Provides
|
import dagger.Provides
|
||||||
import java.util.Optional
|
import java.util.Optional
|
||||||
|
import java.util.concurrent.Executor
|
||||||
import javax.inject.Named
|
import javax.inject.Named
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@@ -40,6 +44,20 @@ class UnfoldTransitionModule {
|
|||||||
|
|
||||||
@Provides @UnfoldTransitionATracePrefix fun tracingTagPrefix() = "systemui"
|
@Provides @UnfoldTransitionATracePrefix fun tracingTagPrefix() = "systemui"
|
||||||
|
|
||||||
|
/** A globally available FoldStateListener that allows one to query the fold state. */
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
fun providesFoldStateListener(
|
||||||
|
deviceStateManager: DeviceStateManager,
|
||||||
|
@Application context: Context,
|
||||||
|
@Main executor: Executor
|
||||||
|
): DeviceStateManager.FoldStateListener {
|
||||||
|
val listener = DeviceStateManager.FoldStateListener(context)
|
||||||
|
deviceStateManager.registerCallback(executor, listener)
|
||||||
|
|
||||||
|
return listener
|
||||||
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun providesFoldStateLoggingProvider(
|
fun providesFoldStateLoggingProvider(
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ public class BrightLineClassifierTest extends SysuiTestCase {
|
|||||||
mClassifiers.add(mClassifierB);
|
mClassifiers.add(mClassifierB);
|
||||||
when(mFalsingDataProvider.getRecentMotionEvents()).thenReturn(mMotionEventList);
|
when(mFalsingDataProvider.getRecentMotionEvents()).thenReturn(mMotionEventList);
|
||||||
when(mKeyguardStateController.isShowing()).thenReturn(true);
|
when(mKeyguardStateController.isShowing()).thenReturn(true);
|
||||||
|
when(mFalsingDataProvider.isFolded()).thenReturn(true);
|
||||||
mBrightLineFalsingManager = new BrightLineFalsingManager(mFalsingDataProvider,
|
mBrightLineFalsingManager = new BrightLineFalsingManager(mFalsingDataProvider,
|
||||||
mMetricsLogger, mClassifiers, mSingleTapClassfier, mLongTapClassifier,
|
mMetricsLogger, mClassifiers, mSingleTapClassfier, mLongTapClassifier,
|
||||||
mDoubleTapClassifier, mHistoryTracker, mKeyguardStateController,
|
mDoubleTapClassifier, mHistoryTracker, mKeyguardStateController,
|
||||||
@@ -121,6 +122,7 @@ public class BrightLineClassifierTest extends SysuiTestCase {
|
|||||||
mGestureFinalizedListener = gestureCompleteListenerCaptor.getValue();
|
mGestureFinalizedListener = gestureCompleteListenerCaptor.getValue();
|
||||||
mFakeFeatureFlags.set(Flags.FALSING_FOR_LONG_TAPS, true);
|
mFakeFeatureFlags.set(Flags.FALSING_FOR_LONG_TAPS, true);
|
||||||
mFakeFeatureFlags.set(Flags.MEDIA_FALSING_PENALTY, true);
|
mFakeFeatureFlags.set(Flags.MEDIA_FALSING_PENALTY, true);
|
||||||
|
mFakeFeatureFlags.set(Flags.FALSING_OFF_FOR_UNFOLDED, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -89,25 +89,27 @@ public class BrightLineFalsingManagerTest extends SysuiTestCase {
|
|||||||
mClassifiers.add(mClassifierA);
|
mClassifiers.add(mClassifierA);
|
||||||
when(mFalsingDataProvider.getRecentMotionEvents()).thenReturn(mMotionEventList);
|
when(mFalsingDataProvider.getRecentMotionEvents()).thenReturn(mMotionEventList);
|
||||||
when(mKeyguardStateController.isShowing()).thenReturn(true);
|
when(mKeyguardStateController.isShowing()).thenReturn(true);
|
||||||
|
when(mFalsingDataProvider.isFolded()).thenReturn(true);
|
||||||
mBrightLineFalsingManager = new BrightLineFalsingManager(mFalsingDataProvider,
|
mBrightLineFalsingManager = new BrightLineFalsingManager(mFalsingDataProvider,
|
||||||
mMetricsLogger, mClassifiers, mSingleTapClassifier, mLongTapClassifier,
|
mMetricsLogger, mClassifiers, mSingleTapClassifier, mLongTapClassifier,
|
||||||
mDoubleTapClassifier, mHistoryTracker, mKeyguardStateController,
|
mDoubleTapClassifier, mHistoryTracker, mKeyguardStateController,
|
||||||
mAccessibilityManager, false, mFakeFeatureFlags);
|
mAccessibilityManager, false, mFakeFeatureFlags);
|
||||||
mFakeFeatureFlags.set(Flags.FALSING_FOR_LONG_TAPS, true);
|
mFakeFeatureFlags.set(Flags.FALSING_FOR_LONG_TAPS, true);
|
||||||
|
mFakeFeatureFlags.set(Flags.FALSING_OFF_FOR_UNFOLDED, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testA11yDisablesGesture() {
|
public void testA11yDisablesGesture() {
|
||||||
assertThat(mBrightLineFalsingManager.isFalseTap(1)).isTrue();
|
assertThat(mBrightLineFalsingManager.isFalseTouch(Classifier.GENERIC)).isTrue();
|
||||||
when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(true);
|
when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(true);
|
||||||
assertThat(mBrightLineFalsingManager.isFalseTap(1)).isFalse();
|
assertThat(mBrightLineFalsingManager.isFalseTouch(Classifier.GENERIC)).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testA11yDisablesTap() {
|
public void testA11yDisablesTap() {
|
||||||
assertThat(mBrightLineFalsingManager.isFalseTouch(Classifier.GENERIC)).isTrue();
|
assertThat(mBrightLineFalsingManager.isFalseTap(1)).isTrue();
|
||||||
when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(true);
|
when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(true);
|
||||||
assertThat(mBrightLineFalsingManager.isFalseTouch(Classifier.GENERIC)).isFalse();
|
assertThat(mBrightLineFalsingManager.isFalseTap(1)).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -179,4 +181,11 @@ public class BrightLineFalsingManagerTest extends SysuiTestCase {
|
|||||||
when(mFalsingDataProvider.isA11yAction()).thenReturn(true);
|
when(mFalsingDataProvider.isA11yAction()).thenReturn(true);
|
||||||
assertThat(mBrightLineFalsingManager.isFalseTap(1)).isFalse();
|
assertThat(mBrightLineFalsingManager.isFalseTap(1)).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSkipUnfolded() {
|
||||||
|
assertThat(mBrightLineFalsingManager.isFalseTouch(Classifier.GENERIC)).isTrue();
|
||||||
|
when(mFalsingDataProvider.isFolded()).thenReturn(false);
|
||||||
|
assertThat(mBrightLineFalsingManager.isFalseTouch(Classifier.GENERIC)).isFalse();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.systemui.classifier;
|
package com.android.systemui.classifier;
|
||||||
|
|
||||||
|
import android.hardware.devicestate.DeviceStateManager.FoldStateListener;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
|
|
||||||
@@ -38,6 +39,7 @@ public class ClassifierTest extends SysuiTestCase {
|
|||||||
private float mOffsetY = 0;
|
private float mOffsetY = 0;
|
||||||
@Mock
|
@Mock
|
||||||
private BatteryController mBatteryController;
|
private BatteryController mBatteryController;
|
||||||
|
private FoldStateListener mFoldStateListener = new FoldStateListener(mContext);
|
||||||
private final DockManagerFake mDockManager = new DockManagerFake();
|
private final DockManagerFake mDockManager = new DockManagerFake();
|
||||||
|
|
||||||
public void setup() {
|
public void setup() {
|
||||||
@@ -47,7 +49,8 @@ public class ClassifierTest extends SysuiTestCase {
|
|||||||
displayMetrics.ydpi = 100;
|
displayMetrics.ydpi = 100;
|
||||||
displayMetrics.widthPixels = 1000;
|
displayMetrics.widthPixels = 1000;
|
||||||
displayMetrics.heightPixels = 1000;
|
displayMetrics.heightPixels = 1000;
|
||||||
mDataProvider = new FalsingDataProvider(displayMetrics, mBatteryController, mDockManager);
|
mDataProvider = new FalsingDataProvider(
|
||||||
|
displayMetrics, mBatteryController, mFoldStateListener, mDockManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.never;
|
|||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.hardware.devicestate.DeviceStateManager.FoldStateListener;
|
||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
@@ -50,6 +51,8 @@ public class FalsingDataProviderTest extends ClassifierTest {
|
|||||||
private FalsingDataProvider mDataProvider;
|
private FalsingDataProvider mDataProvider;
|
||||||
@Mock
|
@Mock
|
||||||
private BatteryController mBatteryController;
|
private BatteryController mBatteryController;
|
||||||
|
@Mock
|
||||||
|
private FoldStateListener mFoldStateListener;
|
||||||
private final DockManagerFake mDockManager = new DockManagerFake();
|
private final DockManagerFake mDockManager = new DockManagerFake();
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -61,7 +64,8 @@ public class FalsingDataProviderTest extends ClassifierTest {
|
|||||||
displayMetrics.ydpi = 100;
|
displayMetrics.ydpi = 100;
|
||||||
displayMetrics.widthPixels = 1000;
|
displayMetrics.widthPixels = 1000;
|
||||||
displayMetrics.heightPixels = 1000;
|
displayMetrics.heightPixels = 1000;
|
||||||
mDataProvider = new FalsingDataProvider(displayMetrics, mBatteryController, mDockManager);
|
mDataProvider = new FalsingDataProvider(
|
||||||
|
displayMetrics, mBatteryController, mFoldStateListener, mDockManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
@@ -316,4 +320,16 @@ public class FalsingDataProviderTest extends ClassifierTest {
|
|||||||
mDataProvider.onA11yAction();
|
mDataProvider.onA11yAction();
|
||||||
assertThat(mDataProvider.isA11yAction()).isTrue();
|
assertThat(mDataProvider.isA11yAction()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_FoldedState_Folded() {
|
||||||
|
when(mFoldStateListener.getFolded()).thenReturn(true);
|
||||||
|
assertThat(mDataProvider.isFolded()).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_FoldedState_Unfolded() {
|
||||||
|
when(mFoldStateListener.getFolded()).thenReturn(false);
|
||||||
|
assertThat(mDataProvider.isFolded()).isFalse();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user