VrManagerService.java revision dd18a0b69537954d1cc34929a1386deb54f12b14
1dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk/* 2dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * Copyright (C) 2015 The Android Open Source Project 3dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * 4dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License"); 5dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * you may not use this file except in compliance with the License. 6dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * You may obtain a copy of the License at 7dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * 8dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * http://www.apache.org/licenses/LICENSE-2.0 9dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * 10dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * Unless required by applicable law or agreed to in writing, software 11dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS, 12dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * See the License for the specific language governing permissions and 14dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * limitations under the License. 15dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk */ 16dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunkpackage com.android.server.vr; 17dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 18dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunkimport android.content.Context; 19dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunkimport android.content.Intent; 20dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunkimport android.content.pm.PackageManager; 21dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunkimport android.os.UserHandle; 22dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunkimport android.util.ArraySet; 23dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunkimport android.util.Slog; 24dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 25dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunkimport com.android.server.SystemService; 26dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 27dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunkimport java.util.ArrayList; 28dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 29dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk/** 30dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * Service tracking whether VR mode is active, and notifying listening system services of state 31dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * changes. 32dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * 33dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * {@hide} 34dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk */ 35dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunkpublic class VrManagerService extends SystemService { 36dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 37dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk public static final boolean DEBUG = false; 38dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk public static final String TAG = "VrManagerService"; 39dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 40dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk private final Object mLock = new Object(); 41dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk private boolean mVrModeEnabled = false; 42dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk private ArraySet<VrStateListener> mListeners = new ArraySet<>(); 43dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 44dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk private final class LocalService extends VrManagerInternal { 45dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk @Override 46dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk public boolean isInVrMode() { 47dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk return VrManagerService.this.getVrMode(); 48dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 49dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 50dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk @Override 51dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk public void setVrMode(boolean enabled) { 52dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk VrManagerService.this.setVrMode(enabled); 53dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 54dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 55dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk @Override 56dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk public void registerListener(VrStateListener listener) { 57dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk VrManagerService.this.addListener(listener); 58dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 59dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 60dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk @Override 61dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk public void unregisterListener(VrStateListener listener) { 62dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk VrManagerService.this.removeListener(listener); 63dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 64dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 65dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 66dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk public VrManagerService(Context context) { 67dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk super(context); 68dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 69dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 70dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk @Override 71dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk public void onStart() { 72dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk publishLocalService(VrManagerInternal.class, new LocalService()); 73dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 74dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 75dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk private void addListener(VrStateListener listener) { 76dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk synchronized (mLock) { 77dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk mListeners.add(listener); 78dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 79dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 80dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 81dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk private void removeListener(VrStateListener listener) { 82dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk synchronized (mLock) { 83dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk mListeners.remove(listener); 84dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 85dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 86dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 87dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk private void setVrMode(boolean enabled) { 88dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk synchronized (mLock) { 89dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk if (mVrModeEnabled != enabled) { 90dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk mVrModeEnabled = enabled; 91dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk if (DEBUG) Slog.d(TAG, "VR mode " + ((mVrModeEnabled) ? "enabled" : "disabled")); 92dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk onVrModeChangedLocked(); 93dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 94dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 95dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 96dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 97dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk private boolean getVrMode() { 98dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk synchronized (mLock) { 99dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk return mVrModeEnabled; 100dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 101dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 102dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk 103dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk /** 104dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk * Notify system services of VR mode change. 105dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk */ 106dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk private void onVrModeChangedLocked() { 107dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk for (VrStateListener l : mListeners) { 108dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk l.onVrStateChanged(mVrModeEnabled); 109dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 110dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk } 111dd18a0b69537954d1cc34929a1386deb54f12b14Ruben Brunk} 112