1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko/*
2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko * Copyright (C) 2017 The Android Open Source Project
3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *
4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko * Licensed under the Apache License, Version 2.0 (the "License");
5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko * you may not use this file except in compliance with the License.
6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko * You may obtain a copy of the License at
7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *
8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *      http://www.apache.org/licenses/LICENSE-2.0
9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *
10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko * Unless required by applicable law or agreed to in writing, software
11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko * distributed under the License is distributed on an "AS IS" BASIS,
12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko * See the License for the specific language governing permissions and
14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko * limitations under the License.
15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko */
16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define LOG_TAG "VrManager"
18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <utils/Log.h>
19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <vr/vr_manager/vr_manager.h>
21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <stdint.h>
22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <sys/types.h>
23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <binder/Parcel.h>
24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android {
26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Must be kept in sync with interface defined in IVrStateCallbacks.aidl.
28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass BpVrStateCallbacks : public BpInterface<IVrStateCallbacks> {
30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  explicit BpVrStateCallbacks(const sp<IBinder>& impl)
32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      : BpInterface<IVrStateCallbacks>(impl) {}
33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  void onVrStateChanged(bool enabled) {
35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    Parcel data, reply;
36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    data.writeInterfaceToken(IVrStateCallbacks::getInterfaceDescriptor());
37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    data.writeBool(enabled);
38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    remote()->transact(ON_VR_STATE_CHANGED, data, &reply, IBinder::FLAG_ONEWAY);
39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoIMPLEMENT_META_INTERFACE(VrStateCallbacks, "android.service.vr.IVrStateCallbacks");
43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostatus_t BnVrStateCallbacks::onTransact(uint32_t code, const Parcel& data,
45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                        Parcel* reply, uint32_t flags) {
46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  switch(code) {
47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    case ON_VR_STATE_CHANGED: {
48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      CHECK_INTERFACE(IVrStateCallbacks, data, reply);
49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      onVrStateChanged(data.readBool());
50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      return OK;
51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return BBinder::onTransact(code, data, reply, flags);
54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
56050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas// Must be kept in sync with interface defined in
57050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas// IPersistentVrStateCallbacks.aidl.
58050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas
59050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomasclass BpPersistentVrStateCallbacks
60050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    : public BpInterface<IPersistentVrStateCallbacks> {
61050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas public:
62050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  explicit BpPersistentVrStateCallbacks(const sp<IBinder>& impl)
63050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas      : BpInterface<IPersistentVrStateCallbacks>(impl) {}
64050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas
65050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  void onPersistentVrStateChanged(bool enabled) {
66050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    Parcel data, reply;
67050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    data.writeInterfaceToken(
68050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas        IPersistentVrStateCallbacks::getInterfaceDescriptor());
69050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    data.writeBool(enabled);
70050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    remote()->transact(ON_PERSISTENT_VR_STATE_CHANGED,
71050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas                       data, &reply, IBinder::FLAG_ONEWAY);
72050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  }
73050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas};
74050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas
75050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven ThomasIMPLEMENT_META_INTERFACE(PersistentVrStateCallbacks,
76050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas                         "android.service.vr.IPersistentVrStateCallbacks");
77050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas
78050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomasstatus_t BnPersistentVrStateCallbacks::onTransact(
79050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
80050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  switch(code) {
81050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    case ON_PERSISTENT_VR_STATE_CHANGED: {
82050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas      CHECK_INTERFACE(IPersistentVrStateCallbacks, data, reply);
83050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas      onPersistentVrStateChanged(data.readBool());
84050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas      return OK;
85050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    }
86050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  }
87050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  return BBinder::onTransact(code, data, reply, flags);
88050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas}
89050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas
90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Must be kept in sync with interface defined in IVrManager.aidl.
91e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
92e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass BpVrManager : public BpInterface<IVrManager> {
93e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
94e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  explicit BpVrManager(const sp<IBinder>& impl)
95e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      : BpInterface<IVrManager>(impl) {}
96e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
97e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  void registerListener(const sp<IVrStateCallbacks>& cb) override {
98e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    Parcel data;
99e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    data.writeInterfaceToken(IVrManager::getInterfaceDescriptor());
100e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    data.writeStrongBinder(IInterface::asBinder(cb));
101e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    remote()->transact(REGISTER_LISTENER, data, NULL);
102e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
103e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  void unregisterListener(const sp<IVrStateCallbacks>& cb) override {
105e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    Parcel data;
106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    data.writeInterfaceToken(IVrManager::getInterfaceDescriptor());
107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    data.writeStrongBinder(IInterface::asBinder(cb));
108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    remote()->transact(UNREGISTER_LISTENER, data, NULL);
109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
111050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  void registerPersistentVrStateListener(
112050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas      const sp<IPersistentVrStateCallbacks>& cb) override {
113050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    Parcel data;
114050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    data.writeInterfaceToken(IVrManager::getInterfaceDescriptor());
115050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    data.writeStrongBinder(IInterface::asBinder(cb));
116050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    remote()->transact(REGISTER_PERSISTENT_VR_STATE_LISTENER, data, NULL);
117050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  }
118050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas
119050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  void unregisterPersistentVrStateListener(
120050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas      const sp<IPersistentVrStateCallbacks>& cb) override {
121050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    Parcel data;
122050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    data.writeInterfaceToken(IVrManager::getInterfaceDescriptor());
123050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    data.writeStrongBinder(IInterface::asBinder(cb));
124050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas    remote()->transact(UNREGISTER_PERSISTENT_VR_STATE_LISTENER, data, NULL);
125050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas  }
126050b2c83304bd16ec3a838da08b6ba6acf6a3af4Steven Thomas
127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool getVrModeState() override {
128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    Parcel data, reply;
129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    data.writeInterfaceToken(IVrManager::getInterfaceDescriptor());
130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    remote()->transact(GET_VR_MODE_STATE, data, &reply);
131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    int32_t ret = reply.readExceptionCode();
132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (ret != 0) {
133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      return false;
134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return reply.readBool();
136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoIMPLEMENT_META_INTERFACE(VrManager, "android.service.vr.IVrManager");
140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace android
142