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