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