package com.permissionnanny.lib.request.simple;
import android.app.PendingIntent;
import android.content.Context;
import android.location.Criteria;
import android.location.GpsStatus.Listener;
import android.location.GpsStatus.NmeaListener;
import android.location.LocationListener;
import android.os.Looper;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.permissionnanny.lib.PPP;
import com.permissionnanny.lib.request.RequestParams;
/**
* Factory that creates {@link android.location.LocationManager} requests.
*/
public class LocationRequest extends SimpleRequest {
@PPP public static final String ADD_GPS_STATUS_LISTENER = "addGpsStatusListener";
@PPP public static final String ADD_NMEA_LISTENER = "addNmeaListener";
@PPP public static final String ADD_PROXIMITY_ALERT = "addProximityAlert";
@PPP public static final String GET_LAST_KNOWN_LOCATION = "getLastKnownLocation";
@PPP public static final String REMOVE_GPS_STATUS_LISTENER = "removeGpsStatusListener";
@PPP public static final String REMOVE_NMEA_LISTENER = "removeNmeaListener";
@PPP public static final String REMOVE_PROXIMITY_ALERT = "removeProximityAlert";
@PPP public static final String REMOVE_UPDATES = "removeUpdates";
@PPP public static final String REMOVE_UPDATES1 = "removeUpdates1";
@PPP public static final String REQUEST_LOCATION_UPDATES = "requestLocationUpdates";
@PPP public static final String REQUEST_LOCATION_UPDATES1 = "requestLocationUpdates1";
@PPP public static final String REQUEST_LOCATION_UPDATES2 = "requestLocationUpdates2";
@PPP public static final String REQUEST_LOCATION_UPDATES3 = "requestLocationUpdates3";
@PPP public static final String REQUEST_LOCATION_UPDATES4 = "requestLocationUpdates4";
@PPP public static final String REQUEST_SINGLE_UPDATE = "requestSingleUpdate";
@PPP public static final String REQUEST_SINGLE_UPDATE1 = "requestSingleUpdate1";
@PPP public static final String REQUEST_SINGLE_UPDATE2 = "requestSingleUpdate2";
@PPP public static final String REQUEST_SINGLE_UPDATE3 = "requestSingleUpdate3";
public static LocationRequest addGpsStatusListener(Listener listener) {
RequestParams p = new RequestParams();
p.opCode = ADD_GPS_STATUS_LISTENER;
LocationRequest request = new LocationRequest(p);
request.addFilter(new GpsStatusEvent(listener));
return request;
}
public static LocationRequest addNmeaListener(NmeaListener listener) {
RequestParams p = new RequestParams();
p.opCode = ADD_NMEA_LISTENER;
LocationRequest request = new LocationRequest(p);
request.addFilter(new NmeaEvent(listener));
return request;
}
public static LocationRequest addProximityAlert(double latitude, double longtitude, float radius, long
expiration, PendingIntent intent) {
RequestParams p = new RequestParams();
p.opCode = ADD_PROXIMITY_ALERT;
p.double0 = latitude;
p.double1 = longtitude;
p.float0 = radius;
p.long0 = expiration;
p.pendingIntent0 = intent;
return new LocationRequest(p);
}
public static LocationRequest getLastKnownLocation(String provider) {
RequestParams p = new RequestParams();
p.opCode = GET_LAST_KNOWN_LOCATION;
p.string0 = provider;
return new LocationRequest(p);
}
public static LocationRequest removeProximityAlert(PendingIntent intent) {
RequestParams p = new RequestParams();
p.opCode = REMOVE_PROXIMITY_ALERT;
p.pendingIntent0 = intent;
return new LocationRequest(p);
}
public static LocationRequest removeUpdates(PendingIntent intent) {
RequestParams p = new RequestParams();
p.opCode = REMOVE_UPDATES;
p.pendingIntent0 = intent;
return new LocationRequest(p);
}
public static LocationRequest requestLocationUpdates(long minTime,
float minDistance,
Criteria criteria,
PendingIntent intent) {
RequestParams p = new RequestParams();
p.opCode = REQUEST_LOCATION_UPDATES;
p.long0 = minTime;
p.float0 = minDistance;
p.criteria0 = criteria;
p.pendingIntent0 = intent;
return new LocationRequest(p);
}
public static LocationRequest requestLocationUpdates(long minTime,
float minDistance,
Criteria criteria,
LocationListener listener,
Looper looper) {
RequestParams p = new RequestParams();
p.opCode = REQUEST_LOCATION_UPDATES1;
p.long0 = minTime;
p.float0 = minDistance;
p.criteria0 = criteria;
LocationRequest request = new LocationRequest(p);
request.addFilter(new LocationEvent(listener, newHandler(looper)));
return request;
}
public static LocationRequest requestLocationUpdates(String provider,
long minTime,
float minDistance,
LocationListener listener) {
return requestLocationUpdates(provider, minTime, minDistance, listener, null);
}
public static LocationRequest requestLocationUpdates(String provider,
long minTime,
float minDistance,
LocationListener listener,
@Nullable Looper looper) {
RequestParams p = new RequestParams();
p.opCode = REQUEST_LOCATION_UPDATES2;
p.string0 = provider;
p.long0 = minTime;
p.float0 = minDistance;
LocationRequest request = new LocationRequest(p);
request.addFilter(new LocationEvent(listener, newHandler(looper)));
return request;
}
public static LocationRequest requestLocationUpdates(String provider,
long minTime,
float minDistance,
PendingIntent intent) {
RequestParams p = new RequestParams();
p.opCode = REQUEST_LOCATION_UPDATES3;
p.string0 = provider;
p.long0 = minTime;
p.float0 = minDistance;
p.pendingIntent0 = intent;
return new LocationRequest(p);
}
public static LocationRequest requestSingleUpdate(String provider, LocationListener listener, Looper looper) {
RequestParams p = new RequestParams();
p.opCode = REQUEST_SINGLE_UPDATE;
p.string0 = provider;
LocationRequest request = new LocationRequest(p);
request.addFilter(new LocationEvent(listener, newHandler(looper)));
return request;
}
public static LocationRequest requestSingleUpdate(Criteria criteria, LocationListener listener, Looper looper) {
RequestParams p = new RequestParams();
p.opCode = REQUEST_SINGLE_UPDATE1;
p.criteria0 = criteria;
LocationRequest request = new LocationRequest(p);
request.addFilter(new LocationEvent(listener, newHandler(looper)));
return request;
}
public static LocationRequest requestSingleUpdate(String provider, PendingIntent intent) {
RequestParams p = new RequestParams();
p.opCode = REQUEST_SINGLE_UPDATE2;
p.string0 = provider;
p.pendingIntent0 = intent;
return new LocationRequest(p);
}
public static LocationRequest requestSingleUpdate(Criteria criteria, PendingIntent intent) {
RequestParams p = new RequestParams();
p.opCode = REQUEST_SINGLE_UPDATE3;
p.criteria0 = criteria;
p.pendingIntent0 = intent;
return new LocationRequest(p);
}
private Context mContext;
public LocationRequest(RequestParams params) {
super(params);
}
@Override
public void startRequest(@NonNull Context context, @Nullable String rationale) {
mContext = context;
super.startRequest(context, rationale);
}
public void stop() {
stop(mContext);
}
}