Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 064e6127 authored by Daniel Sandler's avatar Daniel Sandler Committed by Android (Google) Code Review
Browse files

Merge changes from topic 'vr-fixes' into nyc-dev

* changes:
  Suppress immersive mode confirmation in VR mode.
  Suppress heads-up notifications in VR mode.
parents d2eec0ef 096ba22a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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"
+27 −0
Original line number Diff line number Diff line
@@ -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;
+4 −0
Original line number Diff line number Diff line
@@ -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 {
+19 −1
Original line number Diff line number Diff line
@@ -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 {
+28 −0
Original line number Diff line number Diff line
@@ -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) {