From c7035fe4fe69e9cc4bf574489193b10412df55b6 Mon Sep 17 00:00:00 2001 From: Maryam Karimzadehgan Date: Tue, 8 Sep 2020 11:35:09 -0700 Subject: [PATCH 1/4] Use ML model for the Back Gesture in EdgeBackGestureHandler. Change-Id: I2fd5255e903932c03a35ae463b0eff3840dc81bd Merged-In: I2fd5255e903932c03a35ae463b0eff3840dc81bd Test: manual model test and getting the results Bug: 150170384 --- .../sysui/SystemUiDeviceConfigFlags.java | 11 ++ .../com/android/systemui/SystemUIFactory.java | 11 ++ .../BackGestureTfClassifierProvider.java | 66 +++++++++ .../phone/EdgeBackGestureHandler.java | 139 +++++++++++++++--- 4 files changed, 209 insertions(+), 18 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/phone/BackGestureTfClassifierProvider.java diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index b4cd145ca374c..3c5eba78174f2 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -428,6 +428,17 @@ public final class SystemUiDeviceConfigFlags { */ public static final String SCREENSHOT_KEYCHORD_DELAY = "screenshot_keychord_delay"; + /** + * (boolean) Whether to use an ML model for the Back Gesture. + */ + public static final String USE_BACK_GESTURE_ML_MODEL = "use_back_gesture_ml_model"; + + /** + * (float) Threshold for Back Gesture ML model prediction. + */ + public static final String BACK_GESTURE_ML_MODEL_THRESHOLD = "back_gesture_ml_model_threshold"; + + private SystemUiDeviceConfigFlags() { } } diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index 5674fdd3bb369..4a77de2850dd6 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -18,6 +18,7 @@ package com.android.systemui; import android.annotation.NonNull; import android.content.Context; +import android.content.res.AssetManager; import android.content.res.Resources; import android.os.Handler; import android.os.Looper; @@ -39,6 +40,7 @@ import com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvide import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; +import com.android.systemui.statusbar.phone.BackGestureTfClassifierProvider; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBouncer; import com.android.systemui.statusbar.phone.KeyguardBypassController; @@ -182,4 +184,13 @@ public class SystemUIFactory { return mContext; } } + + /** + * Creates an instance of BackGestureTfClassifierProvider. + * This method is overridden in vendor specific implementation of Sys UI. + */ + public BackGestureTfClassifierProvider createBackGestureTfClassifierProvider( + AssetManager am) { + return new BackGestureTfClassifierProvider(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BackGestureTfClassifierProvider.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BackGestureTfClassifierProvider.java new file mode 100644 index 0000000000000..0af79c3886b90 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BackGestureTfClassifierProvider.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.statusbar.phone; + +import android.content.res.AssetManager; + +import java.util.HashMap; +import java.util.Map; + +/** + * This class can be overridden by a vendor-specific sys UI implementation, + * in order to provide classification models for the Back Gesture. + */ +public class BackGestureTfClassifierProvider { + private static final String TAG = "BackGestureTfClassifierProvider"; + + /** + * Default implementation that returns an empty map. + * This method is overridden in vendor-specific Sys UI implementation. + * + * @param am An AssetManager to get the vocab file. + */ + public Map loadVocab(AssetManager am) { + return new HashMap(); + } + + /** + * This method is overridden in vendor-specific Sys UI implementation. + * + * @param featuresVector List of input features. + * + */ + public float predict(Object[] featuresVector) { + return -1; + } + + /** + * Interpreter owns resources. This method releases the resources after + * use to avoid memory leak. + * This method is overridden in vendor-specific Sys UI implementation. + * + */ + public void release() {} + + /** + * Returns whether to use the ML model for Back Gesture. + * This method is overridden in vendor-specific Sys UI implementation. + * + */ + public boolean isActive() { + return false; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java index 00a932cb1e8a4..2641bca04aeab 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java @@ -56,6 +56,7 @@ import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.policy.GestureNavigationSettingsObserver; import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.SystemUIFactory; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.bubbles.BubbleController; import com.android.systemui.model.SysUiState; @@ -76,6 +77,7 @@ import com.android.systemui.tracing.nano.SystemUiTraceProto; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.concurrent.Executor; /** @@ -117,8 +119,31 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa public void onTaskStackChanged() { mGestureBlockingActivityRunning = isGestureBlockingActivityRunning(); } + @Override + public void onTaskCreated(int taskId, ComponentName componentName) { + if (componentName != null) { + mPackageName = componentName.getPackageName(); + } else { + mPackageName = "_UNKNOWN"; + } + } }; + private DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener = + new DeviceConfig.OnPropertiesChangedListener() { + @Override + public void onPropertiesChanged(DeviceConfig.Properties properties) { + if (DeviceConfig.NAMESPACE_SYSTEMUI.equals(properties.getNamespace()) + && (properties.getKeyset().contains( + SystemUiDeviceConfigFlags.BACK_GESTURE_ML_MODEL_THRESHOLD) + || properties.getKeyset().contains( + SystemUiDeviceConfigFlags.USE_BACK_GESTURE_ML_MODEL))) { + updateMLModelState(); + } + } + }; + + private final Context mContext; private final OverviewProxyService mOverviewProxyService; private final Runnable mStateChangeCallback; @@ -173,6 +198,13 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa private int mRightInset; private int mSysUiFlags; + // For Tf-Lite model. + private BackGestureTfClassifierProvider mBackGestureTfClassifierProvider; + private Map mVocab; + private boolean mUseMLModel; + private float mMLModelThreshold; + private String mPackageName; + private final GestureNavigationSettingsObserver mGestureNavigationSettingsObserver; private final NavigationEdgeBackPlugin.BackCallback mBackCallback = @@ -230,7 +262,6 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa Log.e(TAG, "Failed to add gesture blocking activities", e); } } - mLongPressTimeout = Math.min(MAX_LONG_PRESS_TIMEOUT, ViewConfiguration.getLongPressTimeout()); @@ -344,6 +375,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa mContext.getSystemService(DisplayManager.class).unregisterDisplayListener(this); mPluginManager.removePluginListener(this); ActivityManagerWrapper.getInstance().unregisterTaskStackListener(mTaskStackListener); + DeviceConfig.removeOnPropertiesChangedListener(mOnPropertiesChangedListener); try { WindowManagerGlobal.getWindowManagerService() @@ -359,6 +391,9 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa mContext.getSystemService(DisplayManager.class).registerDisplayListener(this, mContext.getMainThreadHandler()); ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener); + DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI, + runnable -> (mContext.getMainThreadHandler()).post(runnable), + mOnPropertiesChangedListener); try { WindowManagerGlobal.getWindowManagerService() @@ -379,6 +414,8 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa mPluginManager.addPluginListener( this, NavigationEdgeBackPlugin.class, /*allowMultiple=*/ false); } + // Update the ML model resources. + updateMLModelState(); } @Override @@ -431,27 +468,88 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa } } + private void updateMLModelState() { + boolean newState = mIsEnabled && DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.USE_BACK_GESTURE_ML_MODEL, false); + + if (newState == mUseMLModel) { + return; + } + + if (newState) { + mBackGestureTfClassifierProvider = SystemUIFactory.getInstance() + .createBackGestureTfClassifierProvider(mContext.getAssets()); + mMLModelThreshold = DeviceConfig.getFloat(DeviceConfig.NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.BACK_GESTURE_ML_MODEL_THRESHOLD, 0.9f); + if (mBackGestureTfClassifierProvider.isActive()) { + mVocab = mBackGestureTfClassifierProvider.loadVocab(mContext.getAssets()); + mUseMLModel = true; + return; + } + } + + mUseMLModel = false; + if (mBackGestureTfClassifierProvider != null) { + mBackGestureTfClassifierProvider.release(); + mBackGestureTfClassifierProvider = null; + } + } + + private float getBackGesturePredictionsCategory(int x, int y) { + if (!mVocab.containsKey(mPackageName)) { + return -1; + } + + int distanceFromEdge; + int location; + if (x <= mDisplaySize.x / 2.0) { + location = 1; // left + distanceFromEdge = x; + } else { + location = 2; // right + distanceFromEdge = mDisplaySize.x - x; + } + + Object[] featuresVector = { + new long[]{(long) mDisplaySize.x}, + new long[]{(long) distanceFromEdge}, + new long[]{(long) location}, + new long[]{(long) mVocab.get(mPackageName)}, + new long[]{(long) y}, + }; + + final float results = mBackGestureTfClassifierProvider.predict(featuresVector); + if (results == -1) return -1; + + return results >= mMLModelThreshold ? 1 : 0; + } + private boolean isWithinTouchRegion(int x, int y) { - // Disallow if we are in the bottom gesture area - if (y >= (mDisplaySize.y - mBottomGestureHeight)) { - return false; - } + boolean withinRange = false; + float results = -1; - // If the point is way too far (twice the margin), it is - // not interesting to us for logging purposes, nor we - // should process it. Simply return false and keep - // mLogGesture = false. - if (x > 2 * (mEdgeWidthLeft + mLeftInset) - && x < (mDisplaySize.x - 2 * (mEdgeWidthRight + mRightInset))) { - return false; + if (mUseMLModel && (results = getBackGesturePredictionsCategory(x, y)) != -1) { + withinRange = results == 1 ? true : false; + } else { + // Disallow if we are in the bottom gesture area + if (y >= (mDisplaySize.y - mBottomGestureHeight)) { + return false; + } + // If the point is way too far (twice the margin), it is + // not interesting to us for logging purposes, nor we + // should process it. Simply return false and keep + // mLogGesture = false. + if (x > 2 * (mEdgeWidthLeft + mLeftInset) + && x < (mDisplaySize.x - 2 * (mEdgeWidthRight + mRightInset))) { + return false; + } + // Denotes whether we should proceed with the gesture. + // Even if it is false, we may want to log it assuming + // it is not invalid due to exclusion. + withinRange = x <= mEdgeWidthLeft + mLeftInset + || x >= (mDisplaySize.x - mEdgeWidthRight - mRightInset); } - // Denotes whether we should proceed with the gesture. - // Even if it is false, we may want to log it assuming - // it is not invalid due to exclusion. - boolean withinRange = x <= mEdgeWidthLeft + mLeftInset - || x >= (mDisplaySize.x - mEdgeWidthRight - mRightInset); - // Always allow if the user is in a transient sticky immersive state if (mIsNavBarShownTransiently) { mLogGesture = true; @@ -648,6 +746,11 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa ActivityManager.RunningTaskInfo runningTask = ActivityManagerWrapper.getInstance().getRunningTask(); ComponentName topActivity = runningTask == null ? null : runningTask.topActivity; + if (topActivity != null) { + mPackageName = topActivity.getPackageName(); + } else { + mPackageName = "_UNKNOWN"; + } return topActivity != null && mGestureBlockingActivities.contains(topActivity); } From 832d0601688ab3808a6a504335dab0b643a764a2 Mon Sep 17 00:00:00 2001 From: Maryam Karimzadehgan Date: Tue, 22 Sep 2020 10:24:31 -0700 Subject: [PATCH 2/4] Add log entries for the results for the ML model for the back gesture. Test: manual Bug: 150170384 Change-Id: Ic08bdea27fea085bcbb425dbac6682a88d29aa8a Merged-In: Ic08bdea27fea085bcbb425dbac6682a88d29aa8a --- cmds/statsd/src/atoms.proto | 2 ++ .../statusbar/phone/EdgeBackGestureHandler.java | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 22222670c1a2e..0c1c577516e65 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -3038,6 +3038,8 @@ message BackGesture { optional int32 end_y = 7; // Y coordinate for ACTION_MOVE event. optional int32 left_boundary = 8; // left edge width + left inset optional int32 right_boundary = 9; // screen width - (right edge width + right inset) + optional float ml_model_score = 10; // The score between 0 and 1 which is the prediction output + // for the Back Gesture model. enum WindowHorizontalLocation { DEFAULT_LOCATION = 0; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java index 2641bca04aeab..ad071c865de47 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java @@ -204,6 +204,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa private boolean mUseMLModel; private float mMLModelThreshold; private String mPackageName; + private float mMLResults; private final GestureNavigationSettingsObserver mGestureNavigationSettingsObserver; @@ -518,10 +519,10 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa new long[]{(long) y}, }; - final float results = mBackGestureTfClassifierProvider.predict(featuresVector); - if (results == -1) return -1; + mMLResults = mBackGestureTfClassifierProvider.predict(featuresVector); + if (mMLResults == -1) return -1; - return results >= mMLModelThreshold ? 1 : 0; + return mMLResults >= mMLModelThreshold ? 1 : 0; } private boolean isWithinTouchRegion(int x, int y) { @@ -598,7 +599,8 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa (int) mDownPoint.x, (int) mDownPoint.y, (int) mEndPoint.x, (int) mEndPoint.y, mEdgeWidthLeft + mLeftInset, - mDisplaySize.x - (mEdgeWidthRight + mRightInset)); + mDisplaySize.x - (mEdgeWidthRight + mRightInset), + mUseMLModel ? mMLResults : -2); } private void onMotionEvent(MotionEvent ev) { @@ -607,6 +609,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa // Verify if this is in within the touch region and we aren't in immersive mode, and // either the bouncer is showing or the notification panel is hidden mIsOnLeftEdge = ev.getX() <= mEdgeWidthLeft + mLeftInset; + mMLResults = 0; mLogGesture = false; mInRejectedExclusion = false; mAllowGesture = !mDisabledForQuickstep && mIsBackGestureAllowed From 8c95065cb7230fabd7c6f5533d86f666a50823e7 Mon Sep 17 00:00:00 2001 From: Maryam Karimzadehgan Date: Mon, 5 Oct 2020 18:05:46 -0700 Subject: [PATCH 3/4] Add package_name to log for debugging the back gesture model. Test: manual. Bug: 150170384 Change-Id: I94efa3ec6af62b485c45f9bf17861722b73ecca3 Merged-In: I94efa3ec6af62b485c45f9bf17861722b73ecca3 --- cmds/statsd/src/atoms.proto | 5 +++-- .../systemui/statusbar/phone/EdgeBackGestureHandler.java | 7 ++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 0c1c577516e65..2bc153189e167 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -3038,8 +3038,9 @@ message BackGesture { optional int32 end_y = 7; // Y coordinate for ACTION_MOVE event. optional int32 left_boundary = 8; // left edge width + left inset optional int32 right_boundary = 9; // screen width - (right edge width + right inset) - optional float ml_model_score = 10; // The score between 0 and 1 which is the prediction output - // for the Back Gesture model. + // The score between 0 and 1 which is the prediction output for the Back Gesture model. + optional float ml_model_score = 10; + optional string package_name = 11; // The name of the top 100 most used package by all users. enum WindowHorizontalLocation { DEFAULT_LOCATION = 0; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java index ad071c865de47..3271abe313f9f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java @@ -592,6 +592,11 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa return; } mLogGesture = false; + String logPackageName = ""; + // Due to privacy, only top 100 most used apps by all users can be logged. + if (mUseMLModel && mVocab.containsKey(mPackageName) && mVocab.get(mPackageName) < 100) { + logPackageName = mPackageName; + } SysUiStatsLog.write(SysUiStatsLog.BACK_GESTURE_REPORTED_REPORTED, backType, (int) mDownPoint.y, mIsOnLeftEdge ? SysUiStatsLog.BACK_GESTURE__X_LOCATION__LEFT @@ -600,7 +605,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa (int) mEndPoint.x, (int) mEndPoint.y, mEdgeWidthLeft + mLeftInset, mDisplaySize.x - (mEdgeWidthRight + mRightInset), - mUseMLModel ? mMLResults : -2); + mUseMLModel ? mMLResults : -2, logPackageName); } private void onMotionEvent(MotionEvent ev) { From 0ed68db06c408cae61c05270282b45da086516d4 Mon Sep 17 00:00:00 2001 From: Maryam Karimzadehgan Date: Wed, 28 Oct 2020 15:36:50 -0700 Subject: [PATCH 4/4] Add flag to get the name of the Model file from the flag in case we want to try out different models. In addition, we should not log touches in the middle of the screen for logging so moving the block at the very beginning. Test: unittest, manual test Bug: 150170384 Change-Id: I6ecb556fea01f26323248b999d17c7b1d1b7eeb7 Merged-In: I6ecb556fea01f26323248b999d17c7b1d1b7eeb7 --- .../sysui/SystemUiDeviceConfigFlags.java | 5 +++ .../com/android/systemui/SystemUIFactory.java | 2 +- .../phone/EdgeBackGestureHandler.java | 33 +++++++++++-------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 3c5eba78174f2..40c21bddf41b8 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -433,6 +433,11 @@ public final class SystemUiDeviceConfigFlags { */ public static final String USE_BACK_GESTURE_ML_MODEL = "use_back_gesture_ml_model"; + /** + * (string) The name of the ML model for Back Gesture. + */ + public static final String BACK_GESTURE_ML_MODEL_NAME = "back_gesture_ml_model_name"; + /** * (float) Threshold for Back Gesture ML model prediction. */ diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index 4a77de2850dd6..eebf70b7564c4 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -190,7 +190,7 @@ public class SystemUIFactory { * This method is overridden in vendor specific implementation of Sys UI. */ public BackGestureTfClassifierProvider createBackGestureTfClassifierProvider( - AssetManager am) { + AssetManager am, String modelName) { return new BackGestureTfClassifierProvider(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java index 3271abe313f9f..dc42997be0d36 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java @@ -137,7 +137,9 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa && (properties.getKeyset().contains( SystemUiDeviceConfigFlags.BACK_GESTURE_ML_MODEL_THRESHOLD) || properties.getKeyset().contains( - SystemUiDeviceConfigFlags.USE_BACK_GESTURE_ML_MODEL))) { + SystemUiDeviceConfigFlags.USE_BACK_GESTURE_ML_MODEL) + || properties.getKeyset().contains( + SystemUiDeviceConfigFlags.BACK_GESTURE_ML_MODEL_NAME))) { updateMLModelState(); } } @@ -478,8 +480,10 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa } if (newState) { + String mlModelName = DeviceConfig.getString(DeviceConfig.NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.BACK_GESTURE_ML_MODEL_NAME, "backgesture"); mBackGestureTfClassifierProvider = SystemUIFactory.getInstance() - .createBackGestureTfClassifierProvider(mContext.getAssets()); + .createBackGestureTfClassifierProvider(mContext.getAssets(), mlModelName); mMLModelThreshold = DeviceConfig.getFloat(DeviceConfig.NAMESPACE_SYSTEMUI, SystemUiDeviceConfigFlags.BACK_GESTURE_ML_MODEL_THRESHOLD, 0.9f); if (mBackGestureTfClassifierProvider.isActive()) { @@ -529,21 +533,22 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa boolean withinRange = false; float results = -1; + // Disallow if we are in the bottom gesture area + if (y >= (mDisplaySize.y - mBottomGestureHeight)) { + return false; + } + // If the point is way too far (twice the margin), it is + // not interesting to us for logging purposes, nor we + // should process it. Simply return false and keep + // mLogGesture = false. + if (x > 2 * (mEdgeWidthLeft + mLeftInset) + && x < (mDisplaySize.x - 2 * (mEdgeWidthRight + mRightInset))) { + return false; + } + if (mUseMLModel && (results = getBackGesturePredictionsCategory(x, y)) != -1) { withinRange = results == 1 ? true : false; } else { - // Disallow if we are in the bottom gesture area - if (y >= (mDisplaySize.y - mBottomGestureHeight)) { - return false; - } - // If the point is way too far (twice the margin), it is - // not interesting to us for logging purposes, nor we - // should process it. Simply return false and keep - // mLogGesture = false. - if (x > 2 * (mEdgeWidthLeft + mLeftInset) - && x < (mDisplaySize.x - 2 * (mEdgeWidthRight + mRightInset))) { - return false; - } // Denotes whether we should proceed with the gesture. // Even if it is false, we may want to log it assuming // it is not invalid due to exclusion.