diff options
| -rw-r--r-- | services/core/java/com/android/server/vr/EnabledComponentsObserver.java | 24 | ||||
| -rw-r--r-- | services/core/java/com/android/server/vr/VrManagerService.java | 113 |
2 files changed, 123 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/vr/EnabledComponentsObserver.java b/services/core/java/com/android/server/vr/EnabledComponentsObserver.java index 249a076df8f1..77e8b1fa541f 100644 --- a/services/core/java/com/android/server/vr/EnabledComponentsObserver.java +++ b/services/core/java/com/android/server/vr/EnabledComponentsObserver.java @@ -207,6 +207,30 @@ public class EnabledComponentsObserver implements SettingChangeListener { } } + /** + * Return all VrListenerService components installed for this user. + * + * @param userId ID of the user to check. + * @return a set of {@link ComponentName}s. + */ + public ArraySet<ComponentName> getInstalled(int userId) { + synchronized (mLock) { + return mInstalledSet.get(userId); + } + } + + /** + * Return all VrListenerService components enabled for this user. + * + * @param userId ID of the user to check. + * @return a set of {@link ComponentName}s. + */ + public ArraySet<ComponentName> getEnabled(int userId) { + synchronized (mLock) { + return mEnabledSet.get(userId); + } + } + private int[] getCurrentProfileIds() { UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); if (userManager == null) { diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java index a9553a586c5c..844b5e6d5bfa 100644 --- a/services/core/java/com/android/server/vr/VrManagerService.java +++ b/services/core/java/com/android/server/vr/VrManagerService.java @@ -59,12 +59,13 @@ 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.text.SimpleDateFormat; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Objects; -import java.util.Set; /** * Service tracking whether VR mode is active, and notifying listening services of state changes. @@ -93,6 +94,7 @@ public class VrManagerService extends SystemService implements EnabledComponentC public static final String VR_MANAGER_BINDER_SERVICE = "vrmanager"; private static final int PENDING_STATE_DELAY_MS = 300; + private static final int EVENT_LOG_SIZE = 32; private static native void initializeNative(); private static native void setVrModeNative(boolean enabled); @@ -117,6 +119,7 @@ public class VrManagerService extends SystemService implements EnabledComponentC private String mPreviousCoarseLocationPackage; private String mPreviousManageOverlayPackage; private VrState mPendingState; + private final ArrayDeque<VrState> mLoggingDeque = new ArrayDeque<>(EVENT_LOG_SIZE); private static final int MSG_VR_STATE_CHANGE = 0; private static final int MSG_PENDING_VR_STATE_CHANGE = 1; @@ -154,6 +157,8 @@ public class VrManagerService extends SystemService implements EnabledComponentC final int userId; final ComponentName targetPackageName; final ComponentName callingPackage; + final long timestamp; + final boolean defaultPermissionsGranted; VrState(boolean enabled, ComponentName targetPackageName, int userId, ComponentName callingPackage) { @@ -161,8 +166,20 @@ public class VrManagerService extends SystemService implements EnabledComponentC this.userId = userId; this.targetPackageName = targetPackageName; this.callingPackage = callingPackage; + this.defaultPermissionsGranted = false; + this.timestamp = System.currentTimeMillis(); } - }; + + VrState(boolean enabled, ComponentName targetPackageName, int userId, + ComponentName callingPackage, boolean defaultPermissionsGranted) { + this.enabled = enabled; + this.userId = userId; + this.targetPackageName = targetPackageName; + this.callingPackage = callingPackage; + this.defaultPermissionsGranted = defaultPermissionsGranted; + this.timestamp = System.currentTimeMillis(); + } + } private static final BinderChecker sBinderChecker = new BinderChecker() { @Override @@ -235,22 +252,42 @@ public class VrManagerService extends SystemService implements EnabledComponentC + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()); return; } - pw.print("mVrModeEnabled="); - pw.println(mVrModeEnabled); - pw.print("mCurrentVrModeUser="); - pw.println(mCurrentVrModeUser); - pw.print("mRemoteCallbacks="); + pw.println("********* Dump of VrManagerService *********"); + pw.println("Previous state transitions:\n"); + String tab = " "; + dumpStateTransitions(pw); + pw.println("\n\nRemote Callbacks:"); int i=mRemoteCallbacks.beginBroadcast(); // create the broadcast item array while(i-->0) { + pw.print(tab); pw.print(mRemoteCallbacks.getBroadcastItem(i)); - if (i>0) pw.print(", "); + if (i>0) pw.println(","); } mRemoteCallbacks.finishBroadcast(); - pw.println(); - pw.print("mCurrentVrService="); - pw.println(mCurrentVrService != null ? mCurrentVrService.getComponent() : "(none)"); - pw.print("mCurrentVrModeComponent="); - pw.println(mCurrentVrModeComponent); + pw.println("\n"); + pw.println("Installed VrListenerService components:"); + int userId = mCurrentVrModeUser; + ArraySet<ComponentName> installed = mComponentObserver.getInstalled(userId); + if (installed == null || installed.size() == 0) { + pw.println("None"); + } else { + for (ComponentName n : installed) { + pw.print(tab); + pw.println(n.flattenToString()); + } + } + pw.println("Enabled VrListenerService components:"); + ArraySet<ComponentName> enabled = mComponentObserver.getEnabled(userId); + if (enabled == null || enabled.size() == 0) { + pw.println("None"); + } else { + for (ComponentName n : enabled) { + pw.print(tab); + pw.println(n.flattenToString()); + } + } + pw.println("\n"); + pw.println("********* End of VrManagerService Dump *********"); } }; @@ -486,6 +523,9 @@ public class VrManagerService extends SystemService implements EnabledComponentC boolean validUserComponent = (mComponentObserver.isValid(component, userId) == EnabledComponentsObserver.NO_ERROR); + if (!mVrModeEnabled && !enabled) { + return validUserComponent; // Disabled -> Disabled transition does nothing. + } // Always send mode change events. changeVrModeLocked(enabled, (enabled && validUserComponent) ? component : null); @@ -539,6 +579,7 @@ public class VrManagerService extends SystemService implements EnabledComponentC } }); } + logStateLocked(); return validUserComponent; } finally { @@ -827,6 +868,50 @@ public class VrManagerService extends SystemService implements EnabledComponentC } } + private void logStateLocked() { + ComponentName currentBoundService = (mCurrentVrService == null) ? null : + mCurrentVrService.getComponent(); + VrState current = new VrState(mVrModeEnabled, currentBoundService, mCurrentVrModeUser, + mCurrentVrModeComponent, mWasDefaultGranted); + if (mLoggingDeque.size() == EVENT_LOG_SIZE) { + mLoggingDeque.removeFirst(); + } + mLoggingDeque.add(current); + } + + private void dumpStateTransitions(PrintWriter pw) { + SimpleDateFormat d = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); + String tab = " "; + if (mLoggingDeque.size() == 0) { + pw.print(tab); + pw.println("None"); + } + for (VrState state : mLoggingDeque) { + pw.print(d.format(new Date(state.timestamp))); + pw.print(tab); + pw.print("State changed to:"); + pw.print(tab); + pw.println((state.enabled) ? "ENABLED" : "DISABLED"); + if (state.enabled) { + pw.print(tab); + pw.print("User="); + pw.println(state.userId); + pw.print(tab); + pw.print("Current VR Activity="); + pw.println((state.callingPackage == null) ? + "None" : state.callingPackage.flattenToString()); + pw.print(tab); + pw.print("Bound VrListenerService="); + pw.println((state.targetPackageName == null) ? + "None" : state.targetPackageName.flattenToString()); + if (state.defaultPermissionsGranted) { + pw.print(tab); + pw.println("Default permissions granted to the bound VrListenerService."); + } + } + } + } + /* * Implementation of VrManagerInternal calls. These are callable from system services. */ |