1 /*
2  * Copyright (C) 2015 Google Inc.
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;
18 
19 import android.content.Context;
20 import android.location.GnssMeasurementsEvent;
21 import android.location.GnssNavigationMessage;
22 import android.location.GnssStatus;
23 import android.location.GpsStatus;
24 import android.location.LocationListener;
25 import android.location.LocationManager;
26 import android.os.Handler;
27 import android.os.Looper;
28 import android.util.Log;
29 
30 import junit.framework.Assert;
31 
32 /**
33  * A {@code LocationManager} wrapper that logs GNSS turn-on and turn-off.
34  */
35 public class TestLocationManager {
36 
37     private static final String TAG = "TestLocationManager";
38     private LocationManager mLocationManager;
39     private Context mContext;
40 
TestLocationManager(Context context)41     public TestLocationManager(Context context) {
42         mContext = context;
43         mLocationManager =
44                 (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
45     }
46 
47     /**
48      * See {@code LocationManager#removeUpdates(LocationListener)}.
49      *
50      * @param listener the listener to remove
51      */
removeLocationUpdates(LocationListener listener)52     public void removeLocationUpdates(LocationListener listener) {
53         Log.i(TAG, "Remove Location updates.");
54         mLocationManager.removeUpdates(listener);
55     }
56 
57     /**
58      * See {@link android.location.LocationManager#registerGnssMeasurementsCallback
59      * (GnssMeasurementsEvent.Callback callback)}
60      *
61      * @param callback the listener to add
62      */
registerGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback)63     public void registerGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback) {
64         Log.i(TAG, "Add Gnss Measurement Callback.");
65         boolean measurementListenerAdded =
66                 mLocationManager.registerGnssMeasurementsCallback(callback);
67         if (!measurementListenerAdded) {
68             // Registration of GnssMeasurements listener has failed, this indicates a platform bug.
69             Log.i(TAG, TestMeasurementUtil.REGISTRATION_ERROR_MESSAGE);
70             Assert.fail(TestMeasurementUtil.REGISTRATION_ERROR_MESSAGE);
71         }
72     }
73 
74     /**
75      * See {@link android.location.LocationManager#registerGnssMeasurementsCallback(GnssMeasurementsEvent.Callback callback)}
76      *
77      * @param callback the listener to add
78      * @param handler the handler that the callback runs at.
79      */
registerGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback, Handler handler)80     public void registerGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback,
81             Handler handler) {
82         Log.i(TAG, "Add Gnss Measurement Callback.");
83         boolean measurementListenerAdded =
84                 mLocationManager.registerGnssMeasurementsCallback(callback, handler);
85         if (!measurementListenerAdded) {
86             // Registration of GnssMeasurements listener has failed, this indicates a platform bug.
87             Log.i(TAG, TestMeasurementUtil.REGISTRATION_ERROR_MESSAGE);
88             Assert.fail(TestMeasurementUtil.REGISTRATION_ERROR_MESSAGE);
89         }
90     }
91 
92     /**
93      * See {@link android.location.LocationManager#unregisterGnssMeasurementsCallback
94      * (GnssMeasurementsEvent.Callback)}.
95      *
96      * @param callback the listener to remove
97      */
unregisterGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback)98     public void unregisterGnssMeasurementCallback(GnssMeasurementsEvent.Callback callback) {
99         Log.i(TAG, "Remove Gnss Measurement Callback.");
100         mLocationManager.unregisterGnssMeasurementsCallback(callback);
101     }
102 
103     /**
104      * See {@code LocationManager#requestLocationUpdates}.
105      *
106      * @param locationListener location listener for request
107      */
requestLocationUpdates(LocationListener locationListener)108     public void requestLocationUpdates(LocationListener locationListener) {
109         if (mLocationManager.getProvider(LocationManager.GPS_PROVIDER) != null) {
110             Log.i(TAG, "Request Location updates.");
111             mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
112                     0 /* minTime*/,
113                     0 /* minDistance */,
114                     locationListener,
115                     Looper.getMainLooper());
116         }
117     }
118 
119     /**
120      * See {@code LocationManager#requestNetworkLocationUpdates}.
121      *
122      * @param locationListener location listener for request
123      */
requestNetworkLocationUpdates(LocationListener locationListener)124     public void requestNetworkLocationUpdates(LocationListener locationListener) {
125         if (mLocationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null) {
126             Log.i(TAG, "Request Network Location updates.");
127             mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
128                 0 /* minTime*/,
129                 0 /* minDistance */,
130                 locationListener,
131                 Looper.getMainLooper());
132         }
133     }
134     /**
135      * See {@link android.location.LocationManager#addGpsStatusListener (GpsStatus.Listener)}.
136      * @param listener the GpsStatus.Listener to add
137      */
addGpsStatusListener(final GpsStatus.Listener listener)138     public void addGpsStatusListener(final GpsStatus.Listener listener) {
139         Log.i(TAG, "Add Gps Status Listener.");
140         Handler mainThreadHandler = new Handler(Looper.getMainLooper());
141         // Add Gps status listener to the main thread, since the Gps Status updates will go to
142         // the main thread while the test thread is blocked by mGpsStatusListener.await()
143         mainThreadHandler.post(new Runnable() {
144             @Override
145             public void run() {
146                 mLocationManager.addGpsStatusListener(listener);
147             }
148         });
149     }
150 
151     /**
152      * See {@link android.location.LocationManager#removeGpsStatusListener (GpsStatus.Listener)}.
153      *
154      * @param listener the listener to remove
155      */
removeGpsStatusListener(GpsStatus.Listener listener)156     public void removeGpsStatusListener(GpsStatus.Listener listener) {
157         Log.i(TAG, "Remove Gps Status Listener.");
158         mLocationManager.removeGpsStatusListener(listener);
159     }
160 
161     /**
162      * See {@link android.location.LocationManager#sendExtraCommand}.
163      *
164      * @param command name of the command to send to the provider.
165      *
166      * @return true if the command succeeds.
167      */
sendExtraCommand(String command)168     public boolean sendExtraCommand(String command) {
169         Log.i(TAG, "Send Extra Command = " + command);
170         boolean extraCommandStatus = mLocationManager.sendExtraCommand(LocationManager.GPS_PROVIDER,
171                 command, null);
172         Log.i(TAG, "Sent extra command (" + command + ") status = " + extraCommandStatus);
173         return extraCommandStatus;
174     }
175 
176     /**
177      * Add a GNSS Navigation Message callback.
178      *
179      * @param callback a {@link GnssNavigationMessage.Callback} object to register.
180      * @return {@code true} if the listener was added successfully, {@code false} otherwise.
181      */
registerGnssNavigationMessageCallback( GnssNavigationMessage.Callback callback)182     public boolean registerGnssNavigationMessageCallback(
183             GnssNavigationMessage.Callback callback) {
184         Log.i(TAG, "Add Gnss Navigation Message Callback.");
185         return mLocationManager.registerGnssNavigationMessageCallback(callback);
186     }
187 
188     /**
189      * Add a GNSS Navigation Message callback.
190      *
191      * @param callback a {@link GnssNavigationMessage.Callback} object to register.
192      * @param handler the handler that the callback runs at.
193      * @return {@code true} if the listener was added successfully, {@code false} otherwise.
194      */
registerGnssNavigationMessageCallback( GnssNavigationMessage.Callback callback, Handler handler)195     public boolean registerGnssNavigationMessageCallback(
196             GnssNavigationMessage.Callback callback, Handler handler) {
197         Log.i(TAG, "Add Gnss Navigation Message Callback.");
198         return mLocationManager.registerGnssNavigationMessageCallback(callback, handler);
199     }
200 
201     /**
202      * Removes a GNSS Navigation Message callback.
203      *
204      * @param callback a {@link GnssNavigationMessage.Callback} object to remove.
205      */
unregisterGnssNavigationMessageCallback(GnssNavigationMessage.Callback callback)206     public void unregisterGnssNavigationMessageCallback(GnssNavigationMessage.Callback callback) {
207         Log.i(TAG, "Remove Gnss Navigation Message Callback.");
208         mLocationManager.unregisterGnssNavigationMessageCallback(callback);
209     }
210 
211     /**
212      * Add a GNSS Status callback.
213      *
214      * @param callback a {@link GnssStatus.Callback} object to register.
215      * @return {@code true} if the listener was added successfully, {@code false} otherwise.
216      */
registerGnssStatusCallback(GnssStatus.Callback callback)217     public boolean registerGnssStatusCallback(GnssStatus.Callback callback) {
218         Log.i(TAG, "Add Gnss Status Callback.");
219         return mLocationManager.registerGnssStatusCallback(
220             callback, new Handler(Looper.getMainLooper()));
221     }
222 
223     /**
224      * Removes a GNSS Status callback.
225      *
226      * @param callback a {@link GnssStatus.Callback} object to remove.
227      */
unregisterGnssStatusCallback(GnssStatus.Callback callback)228     public void unregisterGnssStatusCallback(GnssStatus.Callback callback) {
229         Log.i(TAG, "Remove Gnss Status Callback.");
230         mLocationManager.unregisterGnssStatusCallback(callback);
231     }
232 
233     /**
234      * Get LocationManager
235      *
236      * @return locationManager
237      */
getLocationManager()238     public LocationManager getLocationManager() {
239         return mLocationManager;
240     }
241     /**
242      * Get Context
243      *
244      * @return context
245      */
getContext()246     public Context getContext() {
247         return mContext;
248     }
249 }
250