1ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa/*
2ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Copyright (C) 2014 The Android Open Source Project
3ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa *
4ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Licensed under the Apache License, Version 2.0 (the "License");
5ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * you may not use this file except in compliance with the License.
6ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * You may obtain a copy of the License at
7ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa *
8ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa *      http://www.apache.org/licenses/LICENSE-2.0
9ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa *
10ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * Unless required by applicable law or agreed to in writing, software
11ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * distributed under the License is distributed on an "AS IS" BASIS,
12ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * See the License for the specific language governing permissions and
14ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * limitations under the License
15ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */
16ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
17ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaapackage com.android.server.location;
18ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
19ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport android.location.GpsMeasurementsEvent;
20ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport android.location.IGpsMeasurementsListener;
216568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaaimport android.os.Handler;
22ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaaimport android.os.RemoteException;
236568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaaimport android.util.Log;
24ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
25ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa/**
26ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * An base implementation for GPS measurements provider.
27ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * It abstracts out the responsibility of handling listeners, while still allowing technology
28ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * specific implementations to be built.
29ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa *
30ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa * @hide
31ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa */
32ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaapublic abstract class GpsMeasurementsProvider
33ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        extends RemoteListenerHelper<IGpsMeasurementsListener> {
346568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa    private static final String TAG = "GpsMeasurementsProvider";
356568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa
3613a60b0d41c740448ea39ca19842c7b193c61efddestradaa    protected GpsMeasurementsProvider(Handler handler) {
376568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa        super(handler, TAG);
384b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa    }
39ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa
40ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    public void onMeasurementsAvailable(final GpsMeasurementsEvent event) {
41ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        ListenerOperation<IGpsMeasurementsListener> operation =
42ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                new ListenerOperation<IGpsMeasurementsListener>() {
43ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa            @Override
44ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa            public void execute(IGpsMeasurementsListener listener) throws RemoteException {
45ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa                listener.onGpsMeasurementsReceived(event);
46ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa            }
47ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        };
48ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa        foreach(operation);
49ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa    }
506568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa
516568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa    public void onCapabilitiesUpdated(boolean isGpsMeasurementsSupported) {
5213a60b0d41c740448ea39ca19842c7b193c61efddestradaa        setSupported(isGpsMeasurementsSupported);
5313a60b0d41c740448ea39ca19842c7b193c61efddestradaa        updateResult();
5413a60b0d41c740448ea39ca19842c7b193c61efddestradaa    }
5513a60b0d41c740448ea39ca19842c7b193c61efddestradaa
5613a60b0d41c740448ea39ca19842c7b193c61efddestradaa    public void onGpsEnabledChanged() {
5713a60b0d41c740448ea39ca19842c7b193c61efddestradaa        if (tryUpdateRegistrationWithService()) {
5813a60b0d41c740448ea39ca19842c7b193c61efddestradaa            updateResult();
5913a60b0d41c740448ea39ca19842c7b193c61efddestradaa        }
606568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa    }
616568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa
626568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa    @Override
636568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa    protected ListenerOperation<IGpsMeasurementsListener> getHandlerOperation(int result) {
6413a60b0d41c740448ea39ca19842c7b193c61efddestradaa        int status;
656568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa        switch (result) {
666568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa            case RESULT_SUCCESS:
676568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa                status = GpsMeasurementsEvent.STATUS_READY;
686568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa                break;
696568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa            case RESULT_NOT_AVAILABLE:
706568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa            case RESULT_NOT_SUPPORTED:
716568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa            case RESULT_INTERNAL_ERROR:
726568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa                status = GpsMeasurementsEvent.STATUS_NOT_SUPPORTED;
736568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa                break;
746568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa            case RESULT_GPS_LOCATION_DISABLED:
756568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa                status = GpsMeasurementsEvent.STATUS_GPS_LOCATION_DISABLED;
766568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa                break;
7713a60b0d41c740448ea39ca19842c7b193c61efddestradaa            case RESULT_UNKNOWN:
7813a60b0d41c740448ea39ca19842c7b193c61efddestradaa                return null;
796568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa            default:
806568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa                Log.v(TAG, "Unhandled addListener result: " + result);
816568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa                return null;
826568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa        }
836568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa        return new StatusChangedOperation(status);
846568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa    }
856568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa
8613a60b0d41c740448ea39ca19842c7b193c61efddestradaa    private static class StatusChangedOperation
8713a60b0d41c740448ea39ca19842c7b193c61efddestradaa            implements ListenerOperation<IGpsMeasurementsListener> {
886568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa        private final int mStatus;
896568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa
906568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa        public StatusChangedOperation(int status) {
916568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa            mStatus = status;
926568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa        }
936568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa
946568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa        @Override
956568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa        public void execute(IGpsMeasurementsListener listener) throws RemoteException {
966568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa            listener.onStatusChanged(mStatus);
976568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa        }
986568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa    }
99ea8a8a6076f04360de2d25b3e5853cde8026cd5fdestradaa}
100