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