1 /*
2  * Copyright (C) 2020 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
14  * limitations under the License.
15  */
16 
17 package android.location.cts.common;
18 
19 import android.content.Context;
20 import android.location.GnssMeasurementRequest;
21 import android.location.GnssMeasurementsEvent;
22 import android.location.GnssNavigationMessage;
23 import android.location.GnssRequest;
24 import android.location.GnssStatus;
25 import android.location.LocationListener;
26 import android.location.LocationManager;
27 import android.location.LocationRequest;
28 import android.os.Handler;
29 import android.os.Looper;
30 import android.util.Log;
31 
32 import junit.framework.Assert;
33 
34 /**
35  * A {@code LocationManager} wrapper that logs GNSS turn-on and turn-off.
36  */
37 public class TestLocationManager {
38 
39     private static final String TAG = "TestLocationManager";
40     private LocationManager mLocationManager;
41     private Context mContext;
42 
TestLocationManager(Context context)43     public TestLocationManager(Context context) {
44         mContext = context;
45         mLocationManager =
46                 (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
47     }
48 
49     /**
50      * See {@code LocationManager#removeUpdates(LocationListener)}.
51      *
52      * @param listener the listener to remove
53      */
removeLocationUpdates(LocationListener listener)54     public void removeLocationUpdates(LocationListener listener) {
55         Log.i(TAG, "Remove Location updates.");
56         mLocationManager.removeUpdates(listener);
57     }
58 
59     /**
60      * See {@link android.location.LocationManager#registerGnssMeasurementsCallback
61      * (GnssMeasurementsEvent.Callback callback)}
62      *
63      * @param callback the listener to add
64      */
registerGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback)65     public void registerGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback) {
66         Log.i(TAG, "Add Gnss Measurement Callback.");
67         boolean measurementListenerAdded =
68                 mLocationManager.registerGnssMeasurementsCallback(callback);
69         if (!measurementListenerAdded) {
70             // Registration of GnssMeasurements listener has failed, this indicates a platform bug.
71             Log.i(TAG, TestMeasurementUtil.REGISTRATION_ERROR_MESSAGE);
72             Assert.fail(TestMeasurementUtil.REGISTRATION_ERROR_MESSAGE);
73         }
74     }
75 
76     /**
77      * See {@link android.location.LocationManager#registerGnssMeasurementsCallback(GnssMeasurementsEvent.Callback callback)}
78      *
79      * @param callback the listener to add
80      * @param handler the handler that the callback runs at.
81      */
registerGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback, Handler handler)82     public void registerGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback,
83             Handler handler) {
84         Log.i(TAG, "Add Gnss Measurement Callback.");
85         boolean measurementListenerAdded =
86                 mLocationManager.registerGnssMeasurementsCallback(callback, handler);
87         if (!measurementListenerAdded) {
88             // Registration of GnssMeasurements listener has failed, this indicates a platform bug.
89             Log.i(TAG, TestMeasurementUtil.REGISTRATION_ERROR_MESSAGE);
90             Assert.fail(TestMeasurementUtil.REGISTRATION_ERROR_MESSAGE);
91         }
92     }
93 
94     /**
95      * See {@link android.location.LocationManager#registerGnssMeasurementsCallback
96      * (GnssMeasurementsEvent.Callback callback)}
97      *
98      * @param callback the listener to add
99      */
registerGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback, GnssRequest request)100     public void registerGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback,
101             GnssRequest request) {
102         Log.i(TAG, "Add Gnss Measurement Callback. enableFullTracking=" + request);
103         boolean measurementListenerAdded =
104                 mLocationManager.registerGnssMeasurementsCallback(request, Runnable::run, callback);
105         if (!measurementListenerAdded) {
106             // Registration of GnssMeasurements listener has failed, this indicates a platform bug.
107             Log.i(TAG, TestMeasurementUtil.REGISTRATION_ERROR_MESSAGE);
108             Assert.fail(TestMeasurementUtil.REGISTRATION_ERROR_MESSAGE);
109         }
110     }
111 
112     /**
113      * See {@link android.location.LocationManager#registerGnssMeasurementsCallback
114      * (GnssMeasurementsEvent.Callback callback)}
115      *
116      * @param callback the listener to add
117      */
registerGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback, GnssMeasurementRequest request)118     public void registerGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback,
119             GnssMeasurementRequest request) {
120         Log.i(TAG, "Add Gnss Measurement Callback. enableFullTracking=" + request);
121         boolean measurementListenerAdded =
122                 mLocationManager.registerGnssMeasurementsCallback(request, Runnable::run, callback);
123         if (!measurementListenerAdded) {
124             // Registration of GnssMeasurements listener has failed, this indicates a platform bug.
125             Log.i(TAG, TestMeasurementUtil.REGISTRATION_ERROR_MESSAGE);
126             Assert.fail(TestMeasurementUtil.REGISTRATION_ERROR_MESSAGE);
127         }
128     }
129 
130     /**
131      * Request GNSS location updates with {@code LocationRequest#setLowPowerMode()} enabled.
132      *
133      * See {@code LocationManager#requestLocationUpdates}.
134      *
135      * @param locationListener location listener for request
136      */
requestLowPowerModeGnssLocationUpdates(int minTimeMillis, LocationListener locationListener)137     public void requestLowPowerModeGnssLocationUpdates(int minTimeMillis,
138             LocationListener locationListener) {
139         if (mLocationManager.getProvider(LocationManager.GPS_PROVIDER) != null) {
140             Log.i(TAG, "Request Location updates.");
141             mLocationManager.requestLocationUpdates(
142                     LocationManager.GPS_PROVIDER,
143                     new LocationRequest.Builder(minTimeMillis).setLowPower(true).build(),
144                     mContext.getMainExecutor(),
145                     locationListener);
146         }
147     }
148 
149     /**
150      * See {@link android.location.LocationManager#unregisterGnssMeasurementsCallback
151      * (GnssMeasurementsEvent.Callback)}.
152      *
153      * @param callback the listener to remove
154      */
unregisterGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback)155     public void unregisterGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback) {
156         Log.i(TAG, "Remove Gnss Measurement Callback.");
157         mLocationManager.unregisterGnssMeasurementsCallback(callback);
158     }
159 
160     /**
161      * See {@code LocationManager#requestLocationUpdates}.
162      *
163      * @param locationListener location listener for request
164      */
requestLocationUpdates(LocationListener locationListener, int minTimeMsec)165     public void requestLocationUpdates(LocationListener locationListener, int minTimeMsec) {
166         if (mLocationManager.getProvider(LocationManager.GPS_PROVIDER) != null) {
167             Log.i(TAG, "Request Location updates.");
168             mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
169                     minTimeMsec,
170                     0 /* minDistance */,
171                     locationListener,
172                     Looper.getMainLooper());
173         }
174     }
175 
176     /**
177      * See {@code LocationManager#requestLocationUpdates}.
178      *
179      * @param locationListener location listener for request
180      */
requestLocationUpdates(LocationListener locationListener)181     public void requestLocationUpdates(LocationListener locationListener) {
182         requestLocationUpdates(locationListener, 0 /* minTimeMsec */);
183     }
184 
185     /**
186      * See {@code LocationManager#requestNetworkLocationUpdates}.
187      *
188      * @param locationListener location listener for request
189      * @return {@code true} if the network provider is valid, {@code false} otherwise.
190      */
requestNetworkLocationUpdates(LocationListener locationListener)191     public boolean requestNetworkLocationUpdates(LocationListener locationListener) {
192         if (mLocationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null) {
193             Log.i(TAG, "Request Network Location updates.");
194             mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
195                 0 /* minTime*/,
196                 0 /* minDistance */,
197                 locationListener,
198                 Looper.getMainLooper());
199             return true;
200         }
201         return false;
202     }
203 
204     /**
205      * See {@code LocationManager#requestLocationUpdates}.
206      *
207      * @param locationListener location listener for request
208      */
requestPassiveLocationUpdates(LocationListener locationListener, int minTimeMsec)209     public void requestPassiveLocationUpdates(LocationListener locationListener, int minTimeMsec) {
210         if (mLocationManager.getProvider(LocationManager.PASSIVE_PROVIDER) != null) {
211             Log.i(TAG, "Request Passive Location updates.");
212             mLocationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER,
213                     minTimeMsec,
214                     0 /* minDistance */,
215                     locationListener,
216                     Looper.getMainLooper());
217         }
218     }
219 
220     /**
221      * See {@link android.location.LocationManager#sendExtraCommand}.
222      *
223      * @param command name of the command to send to the provider.
224      *
225      * @return true if the command succeeds.
226      */
sendExtraCommand(String command)227     public boolean sendExtraCommand(String command) {
228         Log.i(TAG, "Send Extra Command = " + command);
229         boolean extraCommandStatus = mLocationManager.sendExtraCommand(LocationManager.GPS_PROVIDER,
230                 command, null);
231         Log.i(TAG, "Sent extra command (" + command + ") status = " + extraCommandStatus);
232         return extraCommandStatus;
233     }
234 
235     /**
236      * Add a GNSS Navigation Message callback.
237      *
238      * @param callback a {@link GnssNavigationMessage.Callback} object to register.
239      * @return {@code true} if the listener was added successfully, {@code false} otherwise.
240      */
registerGnssNavigationMessageCallback( GnssNavigationMessage.Callback callback)241     public boolean registerGnssNavigationMessageCallback(
242             GnssNavigationMessage.Callback callback) {
243         Log.i(TAG, "Add Gnss Navigation Message Callback.");
244         return mLocationManager.registerGnssNavigationMessageCallback(callback);
245     }
246 
247     /**
248      * Add a GNSS Navigation Message callback.
249      *
250      * @param callback a {@link GnssNavigationMessage.Callback} object to register.
251      * @param handler the handler that the callback runs at.
252      * @return {@code true} if the listener was added successfully, {@code false} otherwise.
253      */
registerGnssNavigationMessageCallback( GnssNavigationMessage.Callback callback, Handler handler)254     public boolean registerGnssNavigationMessageCallback(
255             GnssNavigationMessage.Callback callback, Handler handler) {
256         Log.i(TAG, "Add Gnss Navigation Message Callback.");
257         return mLocationManager.registerGnssNavigationMessageCallback(callback, handler);
258     }
259 
260     /**
261      * Removes a GNSS Navigation Message callback.
262      *
263      * @param callback a {@link GnssNavigationMessage.Callback} object to remove.
264      */
unregisterGnssNavigationMessageCallback(GnssNavigationMessage.Callback callback)265     public void unregisterGnssNavigationMessageCallback(GnssNavigationMessage.Callback callback) {
266         Log.i(TAG, "Remove Gnss Navigation Message Callback.");
267         mLocationManager.unregisterGnssNavigationMessageCallback(callback);
268     }
269 
270     /**
271      * Add a GNSS Status callback.
272      *
273      * @param callback a {@link GnssStatus.Callback} object to register.
274      * @return {@code true} if the listener was added successfully, {@code false} otherwise.
275      */
registerGnssStatusCallback(GnssStatus.Callback callback)276     public boolean registerGnssStatusCallback(GnssStatus.Callback callback) {
277         Log.i(TAG, "Add Gnss Status Callback.");
278         return mLocationManager.registerGnssStatusCallback(
279             callback, new Handler(Looper.getMainLooper()));
280     }
281 
282     /**
283      * Removes a GNSS Status callback.
284      *
285      * @param callback a {@link GnssStatus.Callback} object to remove.
286      */
unregisterGnssStatusCallback(GnssStatus.Callback callback)287     public void unregisterGnssStatusCallback(GnssStatus.Callback callback) {
288         Log.i(TAG, "Remove Gnss Status Callback.");
289         mLocationManager.unregisterGnssStatusCallback(callback);
290     }
291 
292     /**
293      * Get LocationManager
294      *
295      * @return locationManager
296      */
getLocationManager()297     public LocationManager getLocationManager() {
298         return mLocationManager;
299     }
300     /**
301      * Get Context
302      *
303      * @return context
304      */
getContext()305     public Context getContext() {
306         return mContext;
307     }
308 }
309