diff options
| author | 2018-03-03 00:36:28 +0000 | |
|---|---|---|
| committer | 2018-03-03 00:36:28 +0000 | |
| commit | dd33df2393f62e405206233163f32cc0da9f7066 (patch) | |
| tree | 753023895e2243363dd3b7225db02e6c8530b2cb | |
| parent | b87a7a749c7c3578b21fc6781b53539e5bac603d (diff) | |
| parent | 64543e668f3f044916363f586f27161004bf3c4b (diff) | |
Merge "Prevent nav bar vibrations when overview proxy is connected (1/2)"
8 files changed, 52 insertions, 7 deletions
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 914ba0c673aa..75940e8b6129 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -283,6 +283,11 @@ interface IWindowManager */ oneway void setPipVisibility(boolean visible); + /** + * Called by System UI to enable or disable haptic feedback on the navigation bar buttons. + */ + void setNavBarVirtualKeyHapticFeedbackEnabled(boolean enabled); + /** * Device has a software navigation bar (separate from the status bar). */ diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java index 5b49e67f5492..a9c80c62e998 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java @@ -109,4 +109,16 @@ public class WindowManagerWrapper { Log.w(TAG, "Failed to end prolonged animations: ", e); } } + + /** + * Enable or disable haptic feedback on the navigation bar buttons. + */ + public void setNavBarVirtualKeyHapticFeedbackEnabled(boolean enabled) { + try { + WindowManagerGlobal.getWindowManagerService() + .setNavBarVirtualKeyHapticFeedbackEnabled(enabled); + } catch (RemoteException e) { + Log.w(TAG, "Failed to enable or disable navigation bar button haptics: ", e); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index 0ed69e66b03e..da042d2bb8ce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -46,7 +46,6 @@ import android.database.ContentObserver; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.AnimatedVectorDrawable; -import android.graphics.drawable.Drawable; import android.inputmethodservice.InputMethodService; import android.os.Binder; import android.os.Bundle; @@ -88,6 +87,7 @@ import com.android.systemui.fragments.FragmentHostManager.FragmentListener; import com.android.systemui.recents.Recents; import com.android.systemui.recents.misc.SysUiTaskStackChangeListener; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.WindowManagerWrapper; import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue.Callbacks; @@ -165,6 +165,8 @@ public class NavigationBarFragment extends Fragment implements Callbacks { public void onConnectionChanged(boolean isConnected) { mNavigationBarView.onOverviewProxyConnectionChanged(isConnected); updateScreenPinningGestures(); + WindowManagerWrapper.getInstance() + .setNavBarVirtualKeyHapticFeedbackEnabled(!isConnected); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index e7b802d0067f..aec05cd9218f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -232,12 +232,7 @@ public class KeyButtonView extends ImageView implements ButtonInterface { performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); } mIsPressed = true; - if (isProxyConnected) { - // Provide small vibration for quick step or immediate down feedback - AsyncTask.execute(() -> - mVibrator.vibrate(VibrationEffect - .get(VibrationEffect.EFFECT_TICK, false))); - } else { + if (!isProxyConnected) { playSoundEffect(SoundEffectConstants.CLICK); setPressed(mIsPressed); } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index eaa17ca104cb..ab0779b8fb33 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -541,6 +541,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { volatile boolean mGoingToSleep; volatile boolean mRequestedOrGoingToSleep; volatile boolean mRecentsVisible; + volatile boolean mNavBarVirtualKeyHapticFeedbackEnabled; volatile boolean mPictureInPictureVisible; // Written by vr manager thread, only read in this class. volatile private boolean mPersistentVrModeEnabled; @@ -4368,6 +4369,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { } @Override + public void setNavBarVirtualKeyHapticFeedbackEnabledLw(boolean enabled) { + mNavBarVirtualKeyHapticFeedbackEnabled = enabled; + } + + @Override public int adjustSystemUiVisibilityLw(int visibility) { mStatusBarController.adjustSystemUiVisibilityLw(mLastSystemUiFlags, visibility); mNavigationBarController.adjustSystemUiVisibilityLw(mLastSystemUiFlags, visibility); @@ -5892,8 +5898,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { return result; } + // Enable haptics if down and virtual key without multiple repetitions. If this is a hard + // virtual key such as a navigation bar button, only vibrate if flag is enabled. + final boolean isNavBarVirtKey = ((event.getFlags() & KeyEvent.FLAG_VIRTUAL_HARD_KEY) != 0); boolean useHapticFeedback = down && (policyFlags & WindowManagerPolicy.FLAG_VIRTUAL) != 0 + && (!isNavBarVirtKey || mNavBarVirtualKeyHapticFeedbackEnabled) && event.getRepeatCount() == 0; // Handle special keys. diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index a07f5eb09ab7..ab331a5263c8 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -1531,6 +1531,11 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { void setPipVisibilityLw(boolean visible); /** + * Called by System UI to enable or disable haptic feedback on the navigation bar buttons. + */ + void setNavBarVirtualKeyHapticFeedbackEnabledLw(boolean enabled); + + /** * Specifies whether there is an on-screen navigation bar separate from the status bar. */ public boolean hasNavigationBar(); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 0c6429a30db9..78c04e8e6a2c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -5922,6 +5922,18 @@ public class WindowManagerService extends IWindowManager.Stub } } + public void setNavBarVirtualKeyHapticFeedbackEnabled(boolean enabled) { + if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Caller does not hold permission " + + android.Manifest.permission.STATUS_BAR); + } + + synchronized (mWindowMap) { + mPolicy.setNavBarVirtualKeyHapticFeedbackEnabledLw(enabled); + } + } + // TODO(multidisplay): StatusBar on multiple screens? private boolean updateStatusBarVisibilityLocked(int visibility) { if (mLastDispatchedSystemUiVisibility == visibility) { diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java index 206ee7af2966..34c5db3c220b 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -637,6 +637,10 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { } @Override + public void setNavBarVirtualKeyHapticFeedbackEnabledLw(boolean enabled) { + } + + @Override public void onSystemUiStarted() { } |