1.从settings查看哪里控制谷歌助手打开关闭
分析控制器是通过属性值来打开和关闭谷歌助手底部边缘手势,Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED
public class GestureNavigationSettingsAssistController extends TogglePreferenceController {
public GestureNavigationSettingsAssistController(Context context, String key) {
super(context, key);
}
@Override
public boolean isChecked() {
boolean onByDefault = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_assistTouchGestureEnabledDefault);
return Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED, onByDefault ? 1 : 0)
== 1;
}
@Override
public boolean setChecked(boolean isChecked) {
return Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED, isChecked ? 1 : 0);
}
@Override
public int getAvailabilityStatus() {
return SystemNavigationPreferenceController.isGestureAvailable(mContext) ? AVAILABLE
: UNSUPPORTED_ON_DEVICE;
}
@Override
public int getSliceHighlightMenuRes() {
return R.string.menu_key_system;
}
}
发现SystemUI的NavBarHelper.java中有使用这个值
######################1#####################
public void init() {
mContentResolver.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.ASSISTANT),
false /* notifyForDescendants */, mAssistContentObserver, UserHandle.USER_ALL);
mContentResolver.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.ASSIST_LONG_PRESS_HOME_ENABLED),
false, mAssistContentObserver, UserHandle.USER_ALL);
mContentResolver.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED),
false, mAssistContentObserver, UserHandle.USER_ALL);
updateAssistantAvailability();
updateA11yState();
}
######################2#####################
private void updateAssistantAvailability() {
boolean assistantAvailableForUser = mAssistManagerLazy.get()
.getAssistInfoForUser(UserHandle.USER_CURRENT) != null;
boolean longPressDefault = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_assistLongPressHomeEnabledDefault);
mLongPressHomeEnabled = Settings.Secure.getIntForUser(mContentResolver,
Settings.Secure.ASSIST_LONG_PRESS_HOME_ENABLED, longPressDefault ? 1 : 0,
mUserTracker.getUserId()) != 0;
boolean gestureDefault = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_assistTouchGestureEnabledDefault);
mAssistantTouchGestureEnabled = Settings.Secure.getIntForUser(mContentResolver,
Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED, gestureDefault ? 1 : 0,
mUserTracker.getUserId()) != 0;
mAssistantAvailable = assistantAvailableForUser
&& mAssistantTouchGestureEnabled
&& QuickStepContract.isGesturalMode(mNavBarMode);
dispatchAssistantEventUpdate(mAssistantAvailable);
}
先看回调方法最终调用updateAssistantAvailability()
private void dispatchAssistantEventUpdate(boolean assistantAvailable) {
for (NavbarTaskbarStateUpdater listener : mA11yEventListeners) {
listener.updateAssistantAvailable(assistantAvailable);
}
}
其中NavbarTaskbarStateUpdater是一个接口,此处为实现了接口功能的实现类都会回调。
A实现走
private void updateAssistantEntrypoints(boolean assistantAvailable) {
if (mOverviewProxyService.getProxy() != null) {
try {
mOverviewProxyService.getProxy().onAssistantAvailable(assistantAvailable);
} catch (RemoteException e) {
Log.w(TAG, "Unable to send assistant availability data to launcher");
}
}
reconfigureHomeLongClick();
}
B实现走
private void updateAssistantAvailability(boolean assistantAvailable) {
if (mOverviewProxyService.getProxy() == null) {
return;
}
try {
mOverviewProxyService.getProxy().onAssistantAvailable(assistantAvailable);
} catch (RemoteException e) {
Log.e(TAG, "onAssistantAvailable() failed, available: " + assistantAvailable, e);
}
}
最终调用mOverviewProxyService.getProxy().onAssistantAvailable(assistantAvailable);方法去实现
通过aidl通信去launcher3中实现。
通过这里来判断是否触发谷歌助手
public boolean canTriggerAssistantAction(MotionEvent ev) {
return mAssistantAvailable
&& !QuickStepContract.isAssistantGestureDisabled(mSystemUiStateFlags)
&& mRotationTouchHelper.touchInAssistantRegion(ev)
&& !isLockToAppActive();
}
添加log后发现是mRotationTouchHelper.touchInAssistantRegion(ev)这个方法一直为false,所以无法唤起Google助手
具体实现方法为OrientationTouchTransformer.java中
boolean touchInAssistantRegion(MotionEvent ev) {
return mAssistantLeftRegion.contains(ev.getX(), (ev.getY() -(float)0.01))
|| mAssistantRightRegion.contains(ev.getX(), (ev.getY() - (float)0.01));
}
最终加入log后发现,每次ev.getY()恰好和mAssistantLeftRegion或mAssistantRightRegion的Y相等,所以判断不在范围内
解决如下:
boolean touchInAssistantRegion(MotionEvent ev) {
return mAssistantLeftRegion.contains(ev.getX(), (ev.getY() -(float)0.01))
|| mAssistantRightRegion.contains(ev.getX(), (ev.getY() - (float)0.01));
}