• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package android.support.car;
18 
19 import java.util.HashMap;
20 import java.util.Map;
21 
22 /**
23  * Implementation of {@link CarAppFocusManager} for embedded.
24  * @hide
25  */
26 public class CarAppFocusManagerEmbedded extends CarAppFocusManager {
27 
28     private final android.car.CarAppFocusManager mManager;
29 
30     private final Map<OnAppFocusChangedListener, OnAppFocusChangedListenerProxy>
31             mChangeListeners = new HashMap<>();
32     private final Map<OnAppFocusOwnershipCallback, OnAppFocusOwnershipCallbackProxy>
33             mOwnershipCallbacks = new HashMap<>();
34 
35     /**
36      * @hide
37      */
CarAppFocusManagerEmbedded(Object manager)38     CarAppFocusManagerEmbedded(Object manager) {
39         mManager = (android.car.CarAppFocusManager) manager;
40     }
41 
42     @Override
addFocusListener(OnAppFocusChangedListener listener, int appType)43     public void addFocusListener(OnAppFocusChangedListener listener, int appType)
44             throws CarNotConnectedException {
45         if (listener == null) {
46             throw new IllegalArgumentException("null listener");
47         }
48         OnAppFocusChangedListenerProxy proxy;
49         synchronized (this) {
50             proxy = mChangeListeners.get(listener);
51             if (proxy == null) {
52                 proxy = new OnAppFocusChangedListenerProxy(this, listener);
53                 mChangeListeners.put(listener, proxy);
54             }
55         }
56         try {
57             mManager.addFocusListener(proxy, appType);
58         } catch (android.car.CarNotConnectedException e) {
59             throw new CarNotConnectedException(e);
60         }
61     }
62 
63     @Override
removeFocusListener(OnAppFocusChangedListener listener, int appType)64     public void removeFocusListener(OnAppFocusChangedListener listener, int appType) {
65         OnAppFocusChangedListenerProxy proxy;
66         synchronized (this) {
67             proxy = mChangeListeners.get(listener);
68             if (proxy == null) {
69                 return;
70             }
71         }
72         mManager.removeFocusListener(proxy, appType);
73     }
74 
75     @Override
removeFocusListener(OnAppFocusChangedListener listener)76     public void removeFocusListener(OnAppFocusChangedListener listener) {
77         OnAppFocusChangedListenerProxy proxy;
78         synchronized (this) {
79             proxy = mChangeListeners.remove(listener);
80             if (proxy == null) {
81                 return;
82             }
83         }
84         mManager.removeFocusListener(proxy);
85     }
86 
87     @Override
isOwningFocus(int appType, OnAppFocusOwnershipCallback listener)88     public boolean isOwningFocus(int appType, OnAppFocusOwnershipCallback listener)
89             throws CarNotConnectedException {
90         OnAppFocusOwnershipCallbackProxy proxy;
91         synchronized (this) {
92             proxy = mOwnershipCallbacks.get(listener);
93             if (proxy == null) {
94                 return false;
95             }
96         }
97         try {
98             return mManager.isOwningFocus(proxy, appType);
99         } catch (android.car.CarNotConnectedException e) {
100             throw new CarNotConnectedException(e);
101         }
102     }
103 
104     @Override
requestAppFocus(int appType, OnAppFocusOwnershipCallback ownershipCallback)105     public int requestAppFocus(int appType, OnAppFocusOwnershipCallback ownershipCallback)
106             throws IllegalStateException, SecurityException, CarNotConnectedException {
107         if (ownershipCallback == null) {
108             throw new IllegalArgumentException("null listener");
109         }
110         OnAppFocusOwnershipCallbackProxy proxy;
111         synchronized (this) {
112             proxy = mOwnershipCallbacks.get(ownershipCallback);
113             if (proxy == null) {
114                 proxy = new OnAppFocusOwnershipCallbackProxy(this, ownershipCallback);
115                 mOwnershipCallbacks.put(ownershipCallback, proxy);
116             }
117         }
118         try {
119             return mManager.requestAppFocus(appType, proxy);
120         } catch (android.car.CarNotConnectedException e) {
121             throw new CarNotConnectedException(e);
122         }
123     }
124 
125     @Override
abandonAppFocus(OnAppFocusOwnershipCallback ownershipCallback, int appType)126     public void abandonAppFocus(OnAppFocusOwnershipCallback ownershipCallback, int appType) {
127         if (ownershipCallback == null) {
128             throw new IllegalArgumentException("null listener");
129         }
130         OnAppFocusOwnershipCallbackProxy proxy;
131         synchronized (this) {
132             proxy = mOwnershipCallbacks.get(ownershipCallback);
133             if (proxy == null) {
134                 return;
135             }
136         }
137         mManager.abandonAppFocus(proxy, appType);
138     }
139 
140     @Override
abandonAppFocus(OnAppFocusOwnershipCallback ownershipCallback)141     public void abandonAppFocus(OnAppFocusOwnershipCallback ownershipCallback) {
142         if (ownershipCallback == null) {
143             throw new IllegalArgumentException("null listener");
144         }
145         OnAppFocusOwnershipCallbackProxy proxy;
146         synchronized (this) {
147             proxy = mOwnershipCallbacks.get(ownershipCallback);
148             if (proxy == null) {
149                 return;
150             }
151         }
152         mManager.abandonAppFocus(proxy);
153     }
154 
155     @Override
onCarDisconnected()156     public void onCarDisconnected() {
157         // nothing to do
158     }
159 
160     private static class OnAppFocusChangedListenerProxy
161             implements android.car.CarAppFocusManager.OnAppFocusChangedListener {
162 
163         private final OnAppFocusChangedListener mListener;
164         private final CarAppFocusManager mManager;
165 
OnAppFocusChangedListenerProxy(CarAppFocusManager manager, OnAppFocusChangedListener listener)166         OnAppFocusChangedListenerProxy(CarAppFocusManager manager,
167                 OnAppFocusChangedListener listener) {
168             mManager = manager;
169             mListener = listener;
170         }
171 
172         @Override
onAppFocusChanged(int appType, boolean active)173         public void onAppFocusChanged(int appType, boolean active) {
174             mListener.onAppFocusChanged(mManager, appType, active);
175         }
176     }
177 
178     private static class OnAppFocusOwnershipCallbackProxy
179             implements android.car.CarAppFocusManager.OnAppFocusOwnershipCallback {
180 
181         private final OnAppFocusOwnershipCallback mListener;
182         private final CarAppFocusManager mManager;
183 
184 
OnAppFocusOwnershipCallbackProxy(CarAppFocusManager manager, OnAppFocusOwnershipCallback listener)185         OnAppFocusOwnershipCallbackProxy(CarAppFocusManager manager,
186                 OnAppFocusOwnershipCallback listener) {
187             mListener = listener;
188             mManager = manager;
189         }
190 
191         @Override
onAppFocusOwnershipLost(int focusType)192         public void onAppFocusOwnershipLost(int focusType) {
193             mListener.onAppFocusOwnershipLost(mManager, focusType);
194         }
195 
196         @Override
onAppFocusOwnershipGranted(int focusType)197         public void onAppFocusOwnershipGranted(int focusType) {
198             mListener.onAppFocusOwnershipGranted(mManager, focusType);
199         }
200     }
201 }
202