blob: 7cbb436c84eef82c8554631c13eeabcc98e6cb5c [file] [log] [blame]
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -08001/*
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 */
16package android.hardware.location;
17
Arthur Ishigurob9ae7bd2017-10-09 12:47:52 -070018import android.annotation.Nullable;
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -060019import android.annotation.RequiresPermission;
20import android.annotation.SuppressLint;
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080021import android.annotation.SystemApi;
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -060022import android.annotation.SystemService;
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080023import android.content.Context;
Peng Xu9ff7d222016-02-11 13:02:05 -080024import android.os.Handler;
Peng Xu9ff7d222016-02-11 13:02:05 -080025import android.os.Looper;
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080026import android.os.RemoteException;
Peng Xu9ff7d222016-02-11 13:02:05 -080027import android.os.ServiceManager;
Jeff Sharkey49ca5292016-05-10 12:54:45 -060028import android.os.ServiceManager.ServiceNotFoundException;
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080029import android.util.Log;
30
Arthur Ishigurob9ae7bd2017-10-09 12:47:52 -070031import java.util.List;
32
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080033/**
destradaa8bad3fe2016-03-15 12:33:40 -070034 * A class that exposes the Context hubs on a device to applications.
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080035 *
destradaa8bad3fe2016-03-15 12:33:40 -070036 * Please note that this class is not expected to be used by unbundled applications. Also, calling
37 * applications are expected to have LOCATION_HARDWARE permissions to use this class.
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080038 *
39 * @hide
40 */
41@SystemApi
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -060042@SystemService(Context.CONTEXTHUB_SERVICE)
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080043public final class ContextHubManager {
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080044 private static final String TAG = "ContextHubManager";
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080045
Peng Xu9ff7d222016-02-11 13:02:05 -080046 private final Looper mMainLooper;
Jeff Sharkey49ca5292016-05-10 12:54:45 -060047 private final IContextHubService mService;
Greg Kaiser6ba60e62016-03-18 10:08:39 -070048 private Callback mCallback;
Peng Xu9ff7d222016-02-11 13:02:05 -080049 private Handler mCallbackHandler;
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080050
51 /**
destradaa78cebca2016-04-14 18:40:14 -070052 * @deprecated Use {@code mCallback} instead.
53 */
54 @Deprecated
55 private ICallback mLocalCallback;
56
57 /**
destradaa8bad3fe2016-03-15 12:33:40 -070058 * An interface to receive asynchronous communication from the context hub.
Peng Xu9ff7d222016-02-11 13:02:05 -080059 */
Greg Kaiser6ba60e62016-03-18 10:08:39 -070060 public abstract static class Callback {
61 protected Callback() {}
destradaa8bad3fe2016-03-15 12:33:40 -070062
Peng Xu9ff7d222016-02-11 13:02:05 -080063 /**
destradaa8bad3fe2016-03-15 12:33:40 -070064 * Callback function called on message receipt from context hub.
Peng Xu9ff7d222016-02-11 13:02:05 -080065 *
destradaa8bad3fe2016-03-15 12:33:40 -070066 * @param hubHandle Handle (system-wide unique identifier) of the hub of the message.
Ashutosh Joshib741e3b2016-03-29 09:19:56 -070067 * @param nanoAppHandle Handle (unique identifier) for app instance that sent the message.
destradaa8bad3fe2016-03-15 12:33:40 -070068 * @param message The context hub message.
Peng Xu9ff7d222016-02-11 13:02:05 -080069 *
70 * @see ContextHubMessage
71 */
destradaa8bad3fe2016-03-15 12:33:40 -070072 public abstract void onMessageReceipt(
73 int hubHandle,
74 int nanoAppHandle,
75 ContextHubMessage message);
Peng Xu9ff7d222016-02-11 13:02:05 -080076 }
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080077
78 /**
destradaa78cebca2016-04-14 18:40:14 -070079 * @deprecated Use {@link Callback} instead.
80 * @hide
81 */
82 @Deprecated
83 public interface ICallback {
84 /**
85 * Callback function called on message receipt from context hub.
86 *
87 * @param hubHandle Handle (system-wide unique identifier) of the hub of the message.
88 * @param nanoAppHandle Handle (unique identifier) for app instance that sent the message.
89 * @param message The context hub message.
90 *
91 * @see ContextHubMessage
92 */
93 void onMessageReceipt(int hubHandle, int nanoAppHandle, ContextHubMessage message);
94 }
95
96 /**
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -080097 * Get a handle to all the context hubs in the system
98 * @return array of context hub handles
99 */
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -0600100 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
Peng Xu9ff7d222016-02-11 13:02:05 -0800101 public int[] getContextHubHandles() {
Peng Xu9ff7d222016-02-11 13:02:05 -0800102 try {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600103 return mService.getContextHubHandles();
Peng Xu9ff7d222016-02-11 13:02:05 -0800104 } catch (RemoteException e) {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600105 throw e.rethrowFromSystemServer();
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800106 }
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800107 }
108
109 /**
110 * Get more information about a specific hub.
111 *
destradaa8bad3fe2016-03-15 12:33:40 -0700112 * @param hubHandle Handle (system-wide unique identifier) of a context hub.
113 * @return ContextHubInfo Information about the requested context hub.
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800114 *
115 * @see ContextHubInfo
116 */
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -0600117 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
destradaa8bad3fe2016-03-15 12:33:40 -0700118 public ContextHubInfo getContextHubInfo(int hubHandle) {
Peng Xu9ff7d222016-02-11 13:02:05 -0800119 try {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600120 return mService.getContextHubInfo(hubHandle);
Peng Xu9ff7d222016-02-11 13:02:05 -0800121 } catch (RemoteException e) {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600122 throw e.rethrowFromSystemServer();
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800123 }
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800124 }
125
126 /**
destradaa8bad3fe2016-03-15 12:33:40 -0700127 * Load a nano app on a specified context hub.
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800128 *
Greg Kaiserfac5be22016-08-17 15:33:10 -0700129 * Note that loading is asynchronous. When we return from this method,
130 * the nano app (probably) hasn't loaded yet. Assuming a return of 0
131 * from this method, then the final success/failure for the load, along
132 * with the "handle" for the nanoapp, is all delivered in a byte
133 * string via a call to Callback.onMessageReceipt.
134 *
135 * TODO(b/30784270): Provide a better success/failure and "handle" delivery.
136 *
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800137 * @param hubHandle handle of context hub to load the app on.
138 * @param app the nanoApp to load on the hub
139 *
Greg Kaiserfac5be22016-08-17 15:33:10 -0700140 * @return 0 if the command for loading was sent to the context hub;
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800141 * -1 otherwise
142 *
143 * @see NanoApp
144 */
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -0600145 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800146 public int loadNanoApp(int hubHandle, NanoApp app) {
Peng Xu9ff7d222016-02-11 13:02:05 -0800147 try {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600148 return mService.loadNanoApp(hubHandle, app);
Peng Xu9ff7d222016-02-11 13:02:05 -0800149 } catch (RemoteException e) {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600150 throw e.rethrowFromSystemServer();
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800151 }
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800152 }
153
154 /**
155 * Unload a specified nanoApp
156 *
Greg Kaiserfac5be22016-08-17 15:33:10 -0700157 * Note that unloading is asynchronous. When we return from this method,
158 * the nano app (probably) hasn't unloaded yet. Assuming a return of 0
159 * from this method, then the final success/failure for the unload is
160 * delivered in a byte string via a call to Callback.onMessageReceipt.
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800161 *
Greg Kaiserfac5be22016-08-17 15:33:10 -0700162 * TODO(b/30784270): Provide a better success/failure delivery.
163 *
164 * @param nanoAppHandle handle of the nanoApp to unload
165 *
166 * @return 0 if the command for unloading was sent to the context hub;
167 * -1 otherwise
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800168 */
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -0600169 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
destradaa8bad3fe2016-03-15 12:33:40 -0700170 public int unloadNanoApp(int nanoAppHandle) {
Peng Xu9ff7d222016-02-11 13:02:05 -0800171 try {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600172 return mService.unloadNanoApp(nanoAppHandle);
Peng Xu9ff7d222016-02-11 13:02:05 -0800173 } catch (RemoteException e) {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600174 throw e.rethrowFromSystemServer();
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800175 }
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800176 }
177
178 /**
179 * get information about the nano app instance
180 *
Greg Kaiser3be73d32016-08-18 10:13:52 -0700181 * NOTE: The returned NanoAppInstanceInfo does _not_ contain correct
182 * information for several fields, specifically:
183 * - getName()
184 * - getPublisher()
185 * - getNeededExecMemBytes()
186 * - getNeededReadMemBytes()
187 * - getNeededWriteMemBytes()
188 *
189 * For example, say you call loadNanoApp() with a NanoApp that has
190 * getName() returning "My Name". Later, if you call getNanoAppInstanceInfo
191 * for that nanoapp, the returned NanoAppInstanceInfo's getName()
192 * method will claim "Preloaded app, unknown", even though you would
193 * have expected "My Name". For now, as the user, you'll need to
194 * separately track the above fields if they are of interest to you.
195 *
196 * TODO(b/30943489): Have the returned NanoAppInstanceInfo contain the
197 * correct information.
198 *
destradaa8bad3fe2016-03-15 12:33:40 -0700199 * @param nanoAppHandle handle of the nanoAppInstance
200 * @return NanoAppInstanceInfo Information about the nano app instance.
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800201 *
202 * @see NanoAppInstanceInfo
203 */
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -0600204 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
destradaa8bad3fe2016-03-15 12:33:40 -0700205 public NanoAppInstanceInfo getNanoAppInstanceInfo(int nanoAppHandle) {
Peng Xu9ff7d222016-02-11 13:02:05 -0800206 try {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600207 return mService.getNanoAppInstanceInfo(nanoAppHandle);
Peng Xu9ff7d222016-02-11 13:02:05 -0800208 } catch (RemoteException e) {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600209 throw e.rethrowFromSystemServer();
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800210 }
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800211 }
212
213 /**
214 * Find a specified nano app on the system
215 *
216 * @param hubHandle handle of hub to search for nano app
217 * @param filter filter specifying the search criteria for app
218 *
219 * @see NanoAppFilter
220 *
destradaa8bad3fe2016-03-15 12:33:40 -0700221 * @return int[] Array of handles to any found nano apps
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800222 */
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -0600223 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
destradaa8bad3fe2016-03-15 12:33:40 -0700224 public int[] findNanoAppOnHub(int hubHandle, NanoAppFilter filter) {
Peng Xu9ff7d222016-02-11 13:02:05 -0800225 try {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600226 return mService.findNanoAppOnHub(hubHandle, filter);
Peng Xu9ff7d222016-02-11 13:02:05 -0800227 } catch (RemoteException e) {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600228 throw e.rethrowFromSystemServer();
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800229 }
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800230 }
231
232 /**
destradaa8bad3fe2016-03-15 12:33:40 -0700233 * Send a message to a specific nano app instance on a context hub.
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800234 *
Greg Kaiserfac5be22016-08-17 15:33:10 -0700235 * Note that the return value of this method only speaks of success
236 * up to the point of sending this to the Context Hub. It is not
237 * an assurance that the Context Hub successfully sent this message
238 * on to the nanoapp. If assurance is desired, a protocol should be
239 * established between your code and the nanoapp, with the nanoapp
240 * sending a confirmation message (which will be reported via
241 * Callback.onMessageReceipt).
242 *
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800243 * @param hubHandle handle of the hub to send the message to
244 * @param nanoAppHandle handle of the nano app to send to
destradaa8bad3fe2016-03-15 12:33:40 -0700245 * @param message Message to be sent
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800246 *
247 * @see ContextHubMessage
248 *
249 * @return int 0 on success, -1 otherwise
250 */
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -0600251 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
Peng Xu9ff7d222016-02-11 13:02:05 -0800252 public int sendMessage(int hubHandle, int nanoAppHandle, ContextHubMessage message) {
Peng Xu9ff7d222016-02-11 13:02:05 -0800253 try {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600254 return mService.sendMessage(hubHandle, nanoAppHandle, message);
Peng Xu9ff7d222016-02-11 13:02:05 -0800255 } catch (RemoteException e) {
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600256 throw e.rethrowFromSystemServer();
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800257 }
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800258 }
259
Peng Xu9ff7d222016-02-11 13:02:05 -0800260 /**
Arthur Ishigurob9ae7bd2017-10-09 12:47:52 -0700261 * Returns the list of context hubs in the system.
262 *
263 * @return the list of context hub informations
264 *
265 * @see ContextHubInfo
266 *
267 * @hide
268 */
269 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
270 public List<ContextHubInfo> getContextHubs() {
271 throw new UnsupportedOperationException("TODO: Implement this");
272 }
273
274 /**
275 * Loads a nanoapp at the specified Context Hub.
276 *
277 * After the nanoapp binary is successfully loaded at the specified hub, the nanoapp will be in
278 * the enabled state.
279 *
280 * @param hubInfo the hub to load the nanoapp on
281 * @param appBinary The app binary to load
282 *
283 * @return the ContextHubTransaction of the request
284 *
285 * @see NanoAppBinary
286 *
287 * @hide
288 */
289 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
290 public ContextHubTransaction<Void> loadNanoApp(
291 ContextHubInfo hubInfo, NanoAppBinary appBinary) {
292 throw new UnsupportedOperationException("TODO: Implement this");
293 }
294
295 /**
296 * Unloads a nanoapp at the specified Context Hub.
297 *
298 * @param hubInfo the hub to unload the nanoapp from
299 * @param nanoAppId the app to unload
300 *
301 * @return the ContextHubTransaction of the request
302 *
303 * @hide
304 */
305 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
306 public ContextHubTransaction<Void> unloadNanoApp(ContextHubInfo hubInfo, long nanoAppId) {
307 throw new UnsupportedOperationException("TODO: Implement this");
308 }
309
310 /**
311 * Enables a nanoapp at the specified Context Hub.
312 *
313 * @param hubInfo the hub to enable the nanoapp on
314 * @param nanoAppId the app to enable
315 *
316 * @return the ContextHubTransaction of the request
317 *
318 * @hide
319 */
320 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
321 public ContextHubTransaction<Void> enableNanoApp(ContextHubInfo hubInfo, long nanoAppId) {
322 throw new UnsupportedOperationException("TODO: Implement this");
323 }
324
325 /**
326 * Disables a nanoapp at the specified Context Hub.
327 *
328 * @param hubInfo the hub to disable the nanoapp on
329 * @param nanoAppId the app to disable
330 *
331 * @return the ContextHubTransaction of the request
332 *
333 * @hide
334 */
335 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
336 public ContextHubTransaction<Void> disableNanoApp(ContextHubInfo hubInfo, long nanoAppId) {
337 throw new UnsupportedOperationException("TODO: Implement this");
338 }
339
340 /**
341 * Requests a query for nanoapps loaded at the specified Context Hub.
342 *
343 * @param hubInfo the hub to query a list of nanoapps from
344 *
345 * @return the ContextHubTransaction of the request
346 *
347 * @hide
348 */
349 @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
350 public ContextHubTransaction<List<NanoAppState>> queryNanoApps(ContextHubInfo hubInfo) {
351 throw new UnsupportedOperationException("TODO: Implement this");
352 }
353
354 /**
Peng Xu9ff7d222016-02-11 13:02:05 -0800355 * Set a callback to receive messages from the context hub
356 *
Peng Xu9ff7d222016-02-11 13:02:05 -0800357 * @param callback Callback object
358 *
Greg Kaiser6ba60e62016-03-18 10:08:39 -0700359 * @see Callback
Peng Xu9ff7d222016-02-11 13:02:05 -0800360 *
361 * @return int 0 on success, -1 otherwise
362 */
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -0600363 @SuppressLint("Doclava125")
Greg Kaiser6ba60e62016-03-18 10:08:39 -0700364 public int registerCallback(Callback callback) {
365 return registerCallback(callback, null);
Peng Xu9ff7d222016-02-11 13:02:05 -0800366 }
367
368 /**
destradaa78cebca2016-04-14 18:40:14 -0700369 * @deprecated Use {@link #registerCallback(Callback)} instead.
370 * @hide
371 */
372 @Deprecated
373 public int registerCallback(ICallback callback) {
374 if (mLocalCallback != null) {
375 Log.w(TAG, "Max number of local callbacks reached!");
376 return -1;
377 }
378 mLocalCallback = callback;
379 return 0;
380 }
381
382 /**
Peng Xu9ff7d222016-02-11 13:02:05 -0800383 * Set a callback to receive messages from the context hub
384 *
Peng Xu9ff7d222016-02-11 13:02:05 -0800385 * @param callback Callback object
destradaa8bad3fe2016-03-15 12:33:40 -0700386 * @param handler Handler object
Peng Xu9ff7d222016-02-11 13:02:05 -0800387 *
Greg Kaiser6ba60e62016-03-18 10:08:39 -0700388 * @see Callback
Peng Xu9ff7d222016-02-11 13:02:05 -0800389 *
390 * @return int 0 on success, -1 otherwise
391 */
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -0600392 @SuppressLint("Doclava125")
Greg Kaiser6ba60e62016-03-18 10:08:39 -0700393 public int registerCallback(Callback callback, Handler handler) {
Peng Xu9ff7d222016-02-11 13:02:05 -0800394 synchronized(this) {
395 if (mCallback != null) {
Ashutosh Joshib741e3b2016-03-29 09:19:56 -0700396 Log.w(TAG, "Max number of callbacks reached!");
Peng Xu9ff7d222016-02-11 13:02:05 -0800397 return -1;
398 }
399 mCallback = callback;
400 mCallbackHandler = handler;
401 }
402 return 0;
403 }
404
405 /**
Arthur Ishigurob9ae7bd2017-10-09 12:47:52 -0700406 * Creates and registers a client and its callback with the Context Hub Service.
407 *
408 * A client is registered with the Context Hub Service for a specified Context Hub. When the
409 * registration succeeds, the client can send messages to nanoapps through the returned
410 * {@link ContextHubClient} object, and receive notifications through the provided callback.
411 *
412 * @param callback the notification callback to register
413 * @param hubInfo the hub to attach this client to
414 * @param handler the handler to invoke the callback, if null uses the current thread Looper
415 *
416 * @return the registered client object
417 *
418 * @see ContextHubClientCallback
419 *
420 * @hide
421 */
422 public ContextHubClient createClient(
423 ContextHubClientCallback callback, ContextHubInfo hubInfo, @Nullable Handler handler) {
424 throw new UnsupportedOperationException(
425 "TODO: Implement this, and throw an exception on error");
426 }
427
428 /**
destradaa8bad3fe2016-03-15 12:33:40 -0700429 * Unregister a callback for receive messages from the context hub.
Peng Xu9ff7d222016-02-11 13:02:05 -0800430 *
Greg Kaiser6ba60e62016-03-18 10:08:39 -0700431 * @see Callback
Peng Xu9ff7d222016-02-11 13:02:05 -0800432 *
433 * @param callback method to deregister
434 *
435 * @return int 0 on success, -1 otherwise
436 */
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -0600437 @SuppressLint("Doclava125")
Greg Kaiser6ba60e62016-03-18 10:08:39 -0700438 public int unregisterCallback(Callback callback) {
Peng Xu9ff7d222016-02-11 13:02:05 -0800439 synchronized(this) {
440 if (callback != mCallback) {
Ashutosh Joshib741e3b2016-03-29 09:19:56 -0700441 Log.w(TAG, "Cannot recognize callback!");
Peng Xu9ff7d222016-02-11 13:02:05 -0800442 return -1;
443 }
444
445 mCallback = null;
446 mCallbackHandler = null;
447 }
448 return 0;
449 }
450
destradaa78cebca2016-04-14 18:40:14 -0700451 /**
452 * @deprecated Use {@link #unregisterCallback(Callback)} instead.
453 * @hide
454 */
Aurimas Liutikas514c5ef2016-05-24 15:22:55 -0700455 @Deprecated
destradaa78cebca2016-04-14 18:40:14 -0700456 public synchronized int unregisterCallback(ICallback callback) {
457 if (callback != mLocalCallback) {
458 Log.w(TAG, "Cannot recognize local callback!");
459 return -1;
460 }
461 mLocalCallback = null;
462 return 0;
463 }
464
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600465 private final IContextHubCallback.Stub mClientCallback = new IContextHubCallback.Stub() {
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800466 @Override
Peng Xu9ff7d222016-02-11 13:02:05 -0800467 public void onMessageReceipt(final int hubId, final int nanoAppId,
destradaa8bad3fe2016-03-15 12:33:40 -0700468 final ContextHubMessage message) {
Peng Xu9ff7d222016-02-11 13:02:05 -0800469 if (mCallback != null) {
470 synchronized(this) {
Greg Kaiser6ba60e62016-03-18 10:08:39 -0700471 final Callback callback = mCallback;
Peng Xu9ff7d222016-02-11 13:02:05 -0800472 Handler handler = mCallbackHandler == null ?
473 new Handler(mMainLooper) : mCallbackHandler;
474 handler.post(new Runnable() {
475 @Override
476 public void run() {
477 callback.onMessageReceipt(hubId, nanoAppId, message);
478 }
479 });
480 }
destradaa78cebca2016-04-14 18:40:14 -0700481 } else if (mLocalCallback != null) {
482 // we always ensure that mCallback takes precedence, because mLocalCallback is only
483 // for internal compatibility
484 synchronized (this) {
485 mLocalCallback.onMessageReceipt(hubId, nanoAppId, message);
486 }
Peng Xu9ff7d222016-02-11 13:02:05 -0800487 } else {
488 Log.d(TAG, "Context hub manager client callback is NULL");
489 }
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800490 }
491 };
492
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600493 /** @throws ServiceNotFoundException
494 * @hide */
495 public ContextHubManager(Context context, Looper mainLooper) throws ServiceNotFoundException {
Peng Xu9ff7d222016-02-11 13:02:05 -0800496 mMainLooper = mainLooper;
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600497 mService = IContextHubService.Stub.asInterface(
Ashutosh Joshi420e45e2016-12-20 16:34:41 -0800498 ServiceManager.getServiceOrThrow(Context.CONTEXTHUB_SERVICE));
Jeff Sharkey49ca5292016-05-10 12:54:45 -0600499 try {
500 mService.registerCallback(mClientCallback);
501 } catch (RemoteException e) {
502 Log.w(TAG, "Could not register callback:" + e);
Peng Xu9ff7d222016-02-11 13:02:05 -0800503 }
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800504 }
Ashutosh Joshi1d1ac542016-01-18 17:19:27 -0800505}