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