14b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa/* 24b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * Copyright (C) 2014 The Android Open Source Project 34b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * 44b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * Licensed under the Apache License, Version 2.0 (the "License"); 54b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * you may not use this file except in compliance with the License. 64b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * You may obtain a copy of the License at 74b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * 84b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * http://www.apache.org/licenses/LICENSE-2.0 94b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * 104b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * Unless required by applicable law or agreed to in writing, software 114b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * distributed under the License is distributed on an "AS IS" BASIS, 124b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * See the License for the specific language governing permissions and 144b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * limitations under the License 154b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa */ 164b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 174b3e3931270f8e406fc806bc7fa1c2788256687ddestradaapackage com.android.server.location; 184b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 194b3e3931270f8e406fc806bc7fa1c2788256687ddestradaaimport android.location.GpsNavigationMessageEvent; 204b3e3931270f8e406fc806bc7fa1c2788256687ddestradaaimport android.location.IGpsNavigationMessageListener; 216568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaaimport android.os.Handler; 224b3e3931270f8e406fc806bc7fa1c2788256687ddestradaaimport android.os.RemoteException; 236568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaaimport android.util.Log; 244b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 254b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa/** 264b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * An base implementation for GPS navigation messages provider. 274b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * It abstracts out the responsibility of handling listeners, while still allowing technology 284b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * specific implementations to be built. 294b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * 304b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa * @hide 314b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa */ 324b3e3931270f8e406fc806bc7fa1c2788256687ddestradaapublic abstract class GpsNavigationMessageProvider 334b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa extends RemoteListenerHelper<IGpsNavigationMessageListener> { 346568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa private static final String TAG = "GpsNavigationMessageProvider"; 356568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 366568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa public GpsNavigationMessageProvider(Handler handler) { 376568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa super(handler, TAG); 384b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa } 394b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa 404b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa public void onNavigationMessageAvailable(final GpsNavigationMessageEvent event) { 414b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa ListenerOperation<IGpsNavigationMessageListener> operation = 424b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa new ListenerOperation<IGpsNavigationMessageListener>() { 434b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa @Override 444b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa public void execute(IGpsNavigationMessageListener listener) 454b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa throws RemoteException { 464b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa listener.onGpsNavigationMessageReceived(event); 474b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa } 484b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa }; 494b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa foreach(operation); 504b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa } 516568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 526568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa public void onCapabilitiesUpdated(boolean isGpsNavigationMessageSupported) { 536568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa int status = isGpsNavigationMessageSupported ? 546568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa GpsNavigationMessageEvent.STATUS_READY : 556568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa GpsNavigationMessageEvent.STATUS_NOT_SUPPORTED; 566568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa setSupported(isGpsNavigationMessageSupported, new StatusChangedOperation(status)); 576568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa } 586568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 596568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa @Override 606568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa protected ListenerOperation<IGpsNavigationMessageListener> getHandlerOperation(int result) { 616568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa final int status; 626568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa switch (result) { 636568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa case RESULT_SUCCESS: 646568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa status = GpsNavigationMessageEvent.STATUS_READY; 656568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa break; 666568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa case RESULT_NOT_AVAILABLE: 676568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa case RESULT_NOT_SUPPORTED: 686568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa case RESULT_INTERNAL_ERROR: 696568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa status = GpsNavigationMessageEvent.STATUS_NOT_SUPPORTED; 706568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa break; 716568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa case RESULT_GPS_LOCATION_DISABLED: 726568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa status = GpsNavigationMessageEvent.STATUS_GPS_LOCATION_DISABLED; 736568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa break; 746568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa default: 756568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa Log.v(TAG, "Unhandled addListener result: " + result); 766568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa return null; 776568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa } 786568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa return new StatusChangedOperation(status); 796568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa } 806568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 816568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa @Override 826568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa protected void handleGpsEnabledChanged(boolean enabled) { 836568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa int status = enabled ? 846568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa GpsNavigationMessageEvent.STATUS_READY : 856568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa GpsNavigationMessageEvent.STATUS_GPS_LOCATION_DISABLED; 866568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa foreach(new StatusChangedOperation(status)); 876568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa } 886568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 896568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa private class StatusChangedOperation 906568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa implements ListenerOperation<IGpsNavigationMessageListener> { 916568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa private final int mStatus; 926568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 936568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa public StatusChangedOperation(int status) { 946568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa mStatus = status; 956568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa } 966568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa 976568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa @Override 986568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa public void execute(IGpsNavigationMessageListener listener) throws RemoteException { 996568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa listener.onStatusChanged(mStatus); 1006568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa } 1016568d709e78d6ccaf256b7d0e4a19cdfb26deafbdestradaa } 1024b3e3931270f8e406fc806bc7fa1c2788256687ddestradaa} 103