diff options
5 files changed, 81 insertions, 1 deletions
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index f5854f5f7a36..bd3c6bafaf5e 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -159,6 +159,9 @@ <!-- DND access --> <uses-permission android:name="android.permission.MANAGE_NOTIFICATIONS" /> + <!-- It's like, reality, but, you know, virtual --> + <uses-permission android:name="android.permission.ACCESS_VR_MANAGER" /> + <application android:name=".SystemUIApplication" android:persistent="true" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 1b2393afcccf..3ac7b26a9968 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -63,6 +63,8 @@ import android.service.dreams.IDreamManager; import android.service.notification.NotificationListenerService; import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.StatusBarNotification; +import android.service.vr.IVrManager; +import android.service.vr.IVrStateCallbacks; import android.text.TextUtils; import android.util.ArraySet; import android.util.Log; @@ -262,11 +264,24 @@ public abstract class BaseStatusBar extends SystemUI implements protected AssistManager mAssistManager; + protected boolean mVrMode; + @Override // NotificationData.Environment public boolean isDeviceProvisioned() { return mDeviceProvisioned; } + private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() { + @Override + public void onVrStateChanged(boolean enabled) { + mVrMode = enabled; + } + }; + + public boolean isDeviceInVrMode() { + return mVrMode; + } + protected final ContentObserver mSettingsObserver = new ContentObserver(mHandler) { @Override public void onChange(boolean selfChange) { @@ -776,6 +791,14 @@ public abstract class BaseStatusBar extends SystemUI implements mContext.registerReceiverAsUser(mAllUsersReceiver, UserHandle.ALL, allUsersFilter, null, null); updateCurrentProfilesCache(); + + IVrManager vrManager = IVrManager.Stub.asInterface(ServiceManager.getService("vrmanager")); + try { + vrManager.registerListener(mVrStateCallbacks); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to register VR mode state listener: " + e); + } + } protected void notifyUserAboutHiddenNotifications() { @@ -2353,6 +2376,10 @@ public abstract class BaseStatusBar extends SystemUI implements } protected boolean shouldPeek(Entry entry, StatusBarNotification sbn) { + if (isDeviceInVrMode()) { + return false; + } + if (mNotificationData.shouldFilterOut(sbn)) { if (DEBUG) Log.d(TAG, "No peeking: filtered notification: " + sbn.getKey()); return false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 75430ffe2d0a..c8a2ec01d94a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -1374,6 +1374,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } private boolean shouldSuppressFullScreenIntent(String key) { + if (isDeviceInVrMode()) { + return true; + } + if (mPowerManager.isInteractive()) { return mNotificationData.shouldSuppressScreenOn(key); } else { diff --git a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java index 160d44c58bc9..27077f2f74f7 100644 --- a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java +++ b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java @@ -27,8 +27,11 @@ import android.graphics.PixelFormat; import android.graphics.drawable.ColorDrawable; import android.os.Handler; import android.os.Message; +import android.os.RemoteException; +import android.os.ServiceManager; import android.os.UserHandle; import android.provider.Settings; +import android.service.vr.IVrManager; import android.util.DisplayMetrics; import android.util.Slog; import android.util.SparseBooleanArray; @@ -45,6 +48,7 @@ import android.widget.Button; import android.widget.FrameLayout; import com.android.internal.R; +import com.android.server.vr.VrManagerService; /** * Helper to manage showing/hiding a confirmation prompt when the navigation bar is hidden @@ -66,6 +70,7 @@ public class ImmersiveModeConfirmation { private long mPanicTime; private WindowManager mWindowManager; private int mCurrentUserId; + private IVrManager mVrManager; public ImmersiveModeConfirmation(Context context) { mContext = context; @@ -75,6 +80,8 @@ public class ImmersiveModeConfirmation { .getInteger(R.integer.config_immersive_mode_confirmation_panic); mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + mVrManager = (IVrManager) IVrManager.Stub.asInterface( + ServiceManager.getService(VrManagerService.VR_MANAGER_BINDER_SERVICE)); } private long getNavBarExitDuration() { @@ -112,6 +119,14 @@ public class ImmersiveModeConfirmation { } } + private boolean getVrMode() { + boolean vrMode = false; + try { + vrMode = mVrManager.getVrModeState(); + } catch (RemoteException ex) { } + return vrMode; + } + public void immersiveModeChanged(String pkg, boolean isImmersiveMode, boolean userSetupComplete) { mHandler.removeMessages(H.SHOW); @@ -119,7 +134,10 @@ public class ImmersiveModeConfirmation { final boolean disabled = PolicyControl.disableImmersiveConfirmation(pkg); if (DEBUG) Slog.d(TAG, String.format("immersiveModeChanged() disabled=%s mConfirmed=%s", disabled, mConfirmed)); - if (!disabled && (DEBUG_SHOW_EVERY_TIME || !mConfirmed) && userSetupComplete) { + if (!disabled + && (DEBUG_SHOW_EVERY_TIME || !mConfirmed) + && userSetupComplete + && !getVrMode()) { mHandler.sendEmptyMessageDelayed(H.SHOW, mShowDelayMs); } } else { diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java index f004b4592413..07e017f8bd2f 100644 --- a/services/core/java/com/android/server/vr/VrManagerService.java +++ b/services/core/java/com/android/server/vr/VrManagerService.java @@ -50,6 +50,8 @@ import com.android.server.vr.EnabledComponentsObserver.EnabledComponentChangeLis import com.android.server.utils.ManagedApplicationService; import com.android.server.utils.ManagedApplicationService.BinderChecker; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.lang.StringBuilder; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -186,6 +188,32 @@ public class VrManagerService extends SystemService implements EnabledComponentC return VrManagerService.this.getVrMode(); } + @Override + protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (getContext().checkCallingOrSelfPermission(android.Manifest.permission.DUMP) + != PackageManager.PERMISSION_GRANTED) { + pw.println("permission denied: can't dump VrManagerService from pid=" + + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()); + return; + } + pw.print("mVrModeEnabled="); + pw.println(mVrModeEnabled); + pw.print("mCurrentVrModeUser="); + pw.println(mCurrentVrModeUser); + pw.print("mRemoteCallbacks="); + int i=mRemoteCallbacks.beginBroadcast(); // create the broadcast item array + while(i-->0) { + pw.print(mRemoteCallbacks.getBroadcastItem(i)); + if (i>0) pw.print(", "); + } + mRemoteCallbacks.finishBroadcast(); + pw.println(); + pw.print("mCurrentVrService="); + pw.println(mCurrentVrService != null ? mCurrentVrService.getComponent() : "(none)"); + pw.print("mCurrentVrModeComponent="); + pw.println(mCurrentVrModeComponent); + } + }; private void enforceCallerPermission(String permission) { |