blob: 55e427f70180f55261c45cc0e25d09361aeb06d5 [file] [log] [blame]
destradaaea8a8a62014-06-23 18:19:03 -07001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
Anil Admalefd9dc62019-03-12 17:39:20 -070014 * limitations under the License.
destradaaea8a8a62014-06-23 18:19:03 -070015 */
16
17package com.android.server.location;
18
Yu-Han Yang8de21502018-04-23 01:40:25 -070019import android.content.Context;
Lifu Tang818aa2c2016-02-01 01:52:00 -080020import android.location.GnssMeasurementsEvent;
21import android.location.IGnssMeasurementsListener;
destradaa6568d702014-10-27 12:47:41 -070022import android.os.Handler;
destradaaea8a8a62014-06-23 18:19:03 -070023import android.os.RemoteException;
Yu-Han Yang8de21502018-04-23 01:40:25 -070024import android.provider.Settings;
destradaa6568d702014-10-27 12:47:41 -070025import android.util.Log;
destradaaea8a8a62014-06-23 18:19:03 -070026
Yu-Han Yang8de21502018-04-23 01:40:25 -070027import com.android.internal.annotations.VisibleForTesting;
28
destradaaea8a8a62014-06-23 18:19:03 -070029/**
gomo226b7b72018-12-12 16:49:39 -080030 * An base implementation for GPS measurements provider. It abstracts out the responsibility of
31 * handling listeners, while still allowing technology specific implementations to be built.
destradaaea8a8a62014-06-23 18:19:03 -070032 *
33 * @hide
34 */
gomo226b7b72018-12-12 16:49:39 -080035public abstract class GnssMeasurementsProvider
36 extends RemoteListenerHelper<IGnssMeasurementsListener> {
Lifu Tang818aa2c2016-02-01 01:52:00 -080037 private static final String TAG = "GnssMeasurementsProvider";
Yu-Han Yang8de21502018-04-23 01:40:25 -070038 private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
destradaa6568d702014-10-27 12:47:41 -070039
Yu-Han Yang8de21502018-04-23 01:40:25 -070040 private final GnssMeasurementProviderNative mNative;
41
42 private boolean mIsCollectionStarted;
43 private boolean mEnableFullTracking;
44
45 protected GnssMeasurementsProvider(Context context, Handler handler) {
46 this(context, handler, new GnssMeasurementProviderNative());
47 }
48
49 @VisibleForTesting
Sasha Kuznetsovb9f26b42019-10-03 17:30:46 -070050 public GnssMeasurementsProvider(
gomo226b7b72018-12-12 16:49:39 -080051 Context context, Handler handler, GnssMeasurementProviderNative aNative) {
Anil Admal75b9fd62018-11-28 11:22:50 -080052 super(context, handler, TAG);
Yu-Han Yang8de21502018-04-23 01:40:25 -070053 mNative = aNative;
54 }
55
Yu-Han Yang8de21502018-04-23 01:40:25 -070056 void resumeIfStarted() {
57 if (DEBUG) {
58 Log.d(TAG, "resumeIfStarted");
59 }
60 if (mIsCollectionStarted) {
61 mNative.startMeasurementCollection(mEnableFullTracking);
62 }
63 }
64
65 @Override
66 public boolean isAvailableInPlatform() {
67 return mNative.isMeasurementSupported();
68 }
69
70 @Override
71 protected int registerWithService() {
72 int devOptions = Settings.Secure.getInt(mContext.getContentResolver(),
73 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
74 int fullTrackingToggled = Settings.Global.getInt(mContext.getContentResolver(),
75 Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, 0);
76 boolean enableFullTracking = (devOptions == 1 /* Developer Mode enabled */)
77 && (fullTrackingToggled == 1 /* Raw Measurements Full Tracking enabled */);
78 boolean result = mNative.startMeasurementCollection(enableFullTracking);
79 if (result) {
80 mIsCollectionStarted = true;
81 mEnableFullTracking = enableFullTracking;
82 return RemoteListenerHelper.RESULT_SUCCESS;
83 } else {
84 return RemoteListenerHelper.RESULT_INTERNAL_ERROR;
85 }
86 }
87
88 @Override
89 protected void unregisterFromService() {
90 boolean stopped = mNative.stopMeasurementCollection();
91 if (stopped) {
92 mIsCollectionStarted = false;
93 }
destradaa4b3e3932014-07-21 18:01:47 -070094 }
destradaaea8a8a62014-06-23 18:19:03 -070095
Lifu Tang818aa2c2016-02-01 01:52:00 -080096 public void onMeasurementsAvailable(final GnssMeasurementsEvent event) {
Anil Admal08b96122019-01-30 16:55:05 -080097 foreach((IGnssMeasurementsListener listener, CallerIdentity callerIdentity) -> {
98 if (!hasPermission(mContext, callerIdentity)) {
99 logPermissionDisabledEventNotReported(
100 TAG, callerIdentity.mPackageName, "GNSS measurements");
101 return;
102 }
103 listener.onGnssMeasurementsReceived(event);
104 });
destradaaea8a8a62014-06-23 18:19:03 -0700105 }
destradaa6568d702014-10-27 12:47:41 -0700106
Anil Admalefd9dc62019-03-12 17:39:20 -0700107 /** Handle GNSS capabilities update from the GNSS HAL implementation. */
Anil Admal312fddb2019-03-25 12:15:43 -0700108 public void onCapabilitiesUpdated(boolean isGnssMeasurementsSupported) {
Lifu Tang818aa2c2016-02-01 01:52:00 -0800109 setSupported(isGnssMeasurementsSupported);
destradaa13a60b02015-01-15 18:36:01 -0800110 updateResult();
111 }
112
113 public void onGpsEnabledChanged() {
Wyatt Rileyaa420d52017-07-03 15:14:42 -0700114 tryUpdateRegistrationWithService();
115 updateResult();
destradaa6568d702014-10-27 12:47:41 -0700116 }
117
118 @Override
Lifu Tang818aa2c2016-02-01 01:52:00 -0800119 protected ListenerOperation<IGnssMeasurementsListener> getHandlerOperation(int result) {
destradaa13a60b02015-01-15 18:36:01 -0800120 int status;
destradaa6568d702014-10-27 12:47:41 -0700121 switch (result) {
122 case RESULT_SUCCESS:
Lifu Tange8abe8e2016-04-01 10:32:05 -0700123 status = GnssMeasurementsEvent.Callback.STATUS_READY;
destradaa6568d702014-10-27 12:47:41 -0700124 break;
125 case RESULT_NOT_AVAILABLE:
126 case RESULT_NOT_SUPPORTED:
127 case RESULT_INTERNAL_ERROR:
Lifu Tange8abe8e2016-04-01 10:32:05 -0700128 status = GnssMeasurementsEvent.Callback.STATUS_NOT_SUPPORTED;
destradaa6568d702014-10-27 12:47:41 -0700129 break;
gomo48f1a642017-11-10 20:35:46 -0800130 case RESULT_NOT_ALLOWED:
131 status = GnssMeasurementsEvent.Callback.STATUS_NOT_ALLOWED;
132 break;
destradaa6568d702014-10-27 12:47:41 -0700133 case RESULT_GPS_LOCATION_DISABLED:
Lifu Tange8abe8e2016-04-01 10:32:05 -0700134 status = GnssMeasurementsEvent.Callback.STATUS_LOCATION_DISABLED;
destradaa6568d702014-10-27 12:47:41 -0700135 break;
destradaa13a60b02015-01-15 18:36:01 -0800136 case RESULT_UNKNOWN:
137 return null;
destradaa6568d702014-10-27 12:47:41 -0700138 default:
139 Log.v(TAG, "Unhandled addListener result: " + result);
140 return null;
141 }
142 return new StatusChangedOperation(status);
143 }
144
destradaa13a60b02015-01-15 18:36:01 -0800145 private static class StatusChangedOperation
Lifu Tang818aa2c2016-02-01 01:52:00 -0800146 implements ListenerOperation<IGnssMeasurementsListener> {
destradaa6568d702014-10-27 12:47:41 -0700147 private final int mStatus;
148
149 public StatusChangedOperation(int status) {
150 mStatus = status;
151 }
152
153 @Override
Anil Admal75b9fd62018-11-28 11:22:50 -0800154 public void execute(IGnssMeasurementsListener listener,
Anil Admal08b96122019-01-30 16:55:05 -0800155 CallerIdentity callerIdentity) throws RemoteException {
destradaa6568d702014-10-27 12:47:41 -0700156 listener.onStatusChanged(mStatus);
157 }
158 }
Yu-Han Yang8de21502018-04-23 01:40:25 -0700159
160 @VisibleForTesting
Sasha Kuznetsovb9f26b42019-10-03 17:30:46 -0700161 public static class GnssMeasurementProviderNative {
Yu-Han Yang8de21502018-04-23 01:40:25 -0700162 public boolean isMeasurementSupported() {
163 return native_is_measurement_supported();
164 }
165
166 public boolean startMeasurementCollection(boolean enableFullTracking) {
167 return native_start_measurement_collection(enableFullTracking);
168 }
169
170 public boolean stopMeasurementCollection() {
171 return native_stop_measurement_collection();
172 }
173 }
174
175 private static native boolean native_is_measurement_supported();
176
177 private static native boolean native_start_measurement_collection(boolean enableFullTracking);
178
179 private static native boolean native_stop_measurement_collection();
destradaaea8a8a62014-06-23 18:19:03 -0700180}