17a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro/* 27a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * Copyright 2017 The Android Open Source Project 37a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * 47a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * Licensed under the Apache License, Version 2.0 (the "License"); 57a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * you may not use this file except in compliance with the License. 67a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * You may obtain a copy of the License at 77a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * 87a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * http://www.apache.org/licenses/LICENSE-2.0 97a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * 107a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * Unless required by applicable law or agreed to in writing, software 117a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * distributed under the License is distributed on an "AS IS" BASIS, 127a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * See the License for the specific language governing permissions and 147a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * limitations under the License. 157a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro */ 167a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 177a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguropackage com.android.server.location; 187a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 197a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguroimport android.hardware.location.ContextHubTransaction; 207a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguroimport android.hardware.location.NanoAppState; 217a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 227a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguroimport java.util.List; 237a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguroimport java.util.concurrent.TimeUnit; 247a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 257a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro/** 267a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * An abstract class representing transactions requested to the Context Hub Service. 277a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * 287a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * @hide 297a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro */ 307a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro/* package */ abstract class ContextHubServiceTransaction { 317a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro private final int mTransactionId; 327a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro @ContextHubTransaction.Type 337a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro private final int mTransactionType; 347a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 357a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /* 367a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * true if the transaction has already completed, false otherwise 377a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro */ 387a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro private boolean mIsComplete = false; 397a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 407a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /* package */ ContextHubServiceTransaction(int id, int type) { 417a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro mTransactionId = id; 427a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro mTransactionType = type; 437a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro } 447a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 457a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /** 467a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * Starts this transaction with a Context Hub. 477a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * 487a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * All instances of this class must implement this method by making an asynchronous request to 497a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * a hub. 507a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * 517a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * @return the synchronous error code of the transaction start 527a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro */ 537a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /* package */ 547a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro abstract int onTransact(); 557a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 567a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /** 577a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * A function to invoke when the transaction completes. 587a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * 5975a95694281bcb053e93fe624f4adc359e2612ddArthur Ishiguro * For transactions with expected contents (such as a query), the class instance should 6075a95694281bcb053e93fe624f4adc359e2612ddArthur Ishiguro * implement the appropriate behavior (e.g. invoke onQueryResponse with an empty list). 617a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * 627a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * @param result the result of the transaction 637a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro */ 6457f00904cbfeb7eae23c8aed71fbfbdff6d05ea4Arthur Ishiguro /* package */ void onTransactionComplete(@ContextHubTransaction.Result int result) { 657a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro } 667a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 677a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /** 687a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * A function to invoke when a query transaction completes. 697a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * 707a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * Only relevant for query transactions. 717a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * 727a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * @param result the result of the query 737a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * @param nanoAppStateList the list of nanoapps given by the query response 747a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro */ 7557f00904cbfeb7eae23c8aed71fbfbdff6d05ea4Arthur Ishiguro /* package */ void onQueryResponse( 7657f00904cbfeb7eae23c8aed71fbfbdff6d05ea4Arthur Ishiguro @ContextHubTransaction.Result int result, List<NanoAppState> nanoAppStateList) { 777a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro } 787a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 797a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /** 807a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * @return the ID of this transaction 817a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro */ 827a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /* package */ int getTransactionId() { 837a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro return mTransactionId; 847a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro } 857a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 867a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /** 877a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * @return the type of this transaction 887a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * @see ContextHubTransaction.Type 897a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro */ 907a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro @ContextHubTransaction.Type 917a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /* package */ int getTransactionType() { 927a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro return mTransactionType; 937a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro } 947a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 957a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /** 967a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * Gets the timeout period as defined in IContexthub.hal 977a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * 987a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * @return the timeout of this transaction in the specified time unit 997a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro */ 1007a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /* package */ long getTimeout(TimeUnit unit) { 1017a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro switch (mTransactionType) { 1027a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro case ContextHubTransaction.TYPE_LOAD_NANOAPP: 1037a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro return unit.convert(30L, TimeUnit.SECONDS); 1047a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro case ContextHubTransaction.TYPE_UNLOAD_NANOAPP: 1057a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro case ContextHubTransaction.TYPE_ENABLE_NANOAPP: 1067a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro case ContextHubTransaction.TYPE_DISABLE_NANOAPP: 1077a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro case ContextHubTransaction.TYPE_QUERY_NANOAPPS: 1087a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro // Note: query timeout is not specified at the HAL 1097a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro default: /* fall through */ 1107a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro return unit.convert(5L, TimeUnit.SECONDS); 1117a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro } 1127a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro } 1137a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 1147a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /** 1157a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * Marks the transaction as complete. 1167a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * 1177a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * Should only be called as a result of a response from a Context Hub callback 1187a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro */ 1197a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /* package */ void setComplete() { 1207a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro mIsComplete = true; 1217a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro } 1227a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 1237a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /** 1247a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro * @return true if the transaction has already completed, false otherwise 1257a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro */ 1267a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro /* package */ boolean isComplete() { 1277a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro return mIsComplete; 1287a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro } 1297a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro 1307a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro @Override 1317a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro public String toString() { 1324493e1498455147a4aefc3c0a8534e43d64177c3Arthur Ishiguro return ContextHubTransaction.typeToString(mTransactionType, true /* upperCase */) 1334493e1498455147a4aefc3c0a8534e43d64177c3Arthur Ishiguro + " transaction (ID = " + mTransactionId + ")"; 1347a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro } 1357a23a96871bc9f258117d2b720c475d605ad249eArthur Ishiguro} 136