1 /*
2  * Copyright (C) 2016 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  */
16 package com.android.cts.verifier.vr;
17 
18 import android.content.ComponentName;
19 import android.content.Intent;
20 import android.os.IBinder;
21 import android.service.vr.VrListenerService;
22 import android.util.Log;
23 
24 import java.util.concurrent.ArrayBlockingQueue;
25 import java.util.concurrent.atomic.AtomicInteger;
26 
27 public class MockVrListenerService extends VrListenerService {
28     private static final String TAG = "MockVrListener";
29     private static final AtomicInteger sNumBound = new AtomicInteger();
30 
31     private static final ArrayBlockingQueue<Event> sEventQueue = new ArrayBlockingQueue<>(4096);
32 
getPendingEvents()33     public static ArrayBlockingQueue<Event> getPendingEvents() {
34         return sEventQueue;
35     }
36 
getNumBoundMockVrListeners()37     public static int getNumBoundMockVrListeners() {
38         return sNumBound.get();
39     }
40 
41     public enum EventType{
42         ONBIND,
43         ONREBIND,
44         ONUNBIND,
45         ONCREATE,
46         ONDESTROY,
47         ONCURRENTVRMODEACTIVITYCHANGED
48     }
49 
50     public static class Event {
51         public final VrListenerService instance;
52         public final EventType type;
53         public final Object arg1;
54 
Event(VrListenerService i, EventType t, Object o)55         private Event(VrListenerService i, EventType t, Object o) {
56             instance = i;
57             type = t;
58             arg1 = o;
59         }
60 
build(VrListenerService instance, EventType type, Object argument1)61         public static Event build(VrListenerService instance, EventType type, Object argument1) {
62             return new Event(instance, type, argument1);
63         }
64 
build(VrListenerService instance, EventType type)65         public static Event build(VrListenerService instance, EventType type) {
66             return new Event(instance, type, null);
67         }
68     }
69 
70     @Override
onBind(Intent intent)71     public IBinder onBind(Intent intent) {
72         Log.i(TAG, "onBind called");
73         sNumBound.getAndIncrement();
74         try {
75             sEventQueue.put(Event.build(this, EventType.ONBIND, intent));
76         } catch (InterruptedException e) {
77             Log.e(TAG, "Service thread interrupted: " + e);
78         }
79         return super.onBind(intent);
80     }
81 
82     @Override
onRebind(Intent intent)83     public void onRebind(Intent intent) {
84         Log.i(TAG, "onRebind called");
85         try {
86             sEventQueue.put(Event.build(this, EventType.ONREBIND, intent));
87         } catch (InterruptedException e) {
88             Log.e(TAG, "Service thread interrupted: " + e);
89         }
90         super.onRebind(intent);
91     }
92 
93     @Override
onUnbind(Intent intent)94     public boolean onUnbind(Intent intent) {
95         Log.i(TAG, "onUnbind called");
96         sNumBound.getAndDecrement();
97         try {
98             sEventQueue.put(Event.build(this, EventType.ONUNBIND, intent));
99         } catch (InterruptedException e) {
100             Log.e(TAG, "Service thread interrupted: " + e);
101         }
102         return super.onUnbind(intent);
103     }
104 
105     @Override
onCreate()106     public void onCreate() {
107         Log.i(TAG, "onCreate called");
108         try {
109             sEventQueue.put(Event.build(this, EventType.ONCREATE));
110         } catch (InterruptedException e) {
111             Log.e(TAG, "Service thread interrupted: " + e);
112         }
113         super.onCreate();
114     }
115 
116     @Override
onDestroy()117     public void onDestroy() {
118         Log.i(TAG, "onDestroy called");
119         try {
120             sEventQueue.put(Event.build(this, EventType.ONDESTROY));
121         } catch (InterruptedException e) {
122             Log.e(TAG, "Service thread interrupted: " + e);
123         }
124         super.onDestroy();
125     }
126 
127     @Override
onCurrentVrActivityChanged(ComponentName component)128     public void onCurrentVrActivityChanged(ComponentName component) {
129         Log.i(TAG, "onCurrentVrActivityChanged called with: " + component);
130         try {
131             sEventQueue.put(Event.build(this, EventType.ONCURRENTVRMODEACTIVITYCHANGED, component));
132         } catch (InterruptedException e) {
133             Log.e(TAG, "Service thread interrupted: " + e);
134         }
135     }
136 
137 }
138