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