package com.permissionnanny.demo.location; import android.app.Dialog; import android.content.Context; import android.location.Criteria; import android.location.GpsStatus; import android.location.Location; import android.location.LocationListener; import android.os.Bundle; import android.util.SparseArray; import com.permissionnanny.common.BundleUtil; import com.permissionnanny.demo.DataAdapter; import com.permissionnanny.demo.ResponseDisplayListener; import com.permissionnanny.demo.ResponseListener; import com.permissionnanny.demo.SimpleRequestFactory; import com.permissionnanny.demo.extra.CriteriaExtra; import com.permissionnanny.demo.extra.Extra; import com.permissionnanny.demo.extra.ExtrasDialogBuilder; import com.permissionnanny.demo.extra.FloatExtra; import com.permissionnanny.demo.extra.LongExtra; import com.permissionnanny.demo.extra.StringExtra; import com.permissionnanny.lib.request.simple.LocationRequest; import com.permissionnanny.lib.request.simple.SimpleRequest; /** * */ public class LocationRequestFactory implements SimpleRequestFactory { private String[] mLabels = new String[]{ LocationRequest.ADD_GPS_STATUS_LISTENER, LocationRequest.ADD_NMEA_LISTENER, LocationRequest.GET_LAST_KNOWN_LOCATION, LocationRequest.REQUEST_LOCATION_UPDATES1, LocationRequest.REQUEST_LOCATION_UPDATES2, LocationRequest.REQUEST_SINGLE_UPDATE, LocationRequest.REQUEST_SINGLE_UPDATE1, }; private SparseArray<Extra[]> mExtras = new SparseArray<Extra[]>() {{ put(3, new Extra[]{new LongExtra(), new FloatExtra(), new CriteriaExtra()}); put(4, new Extra[]{new StringExtra("gps"), new LongExtra(), new FloatExtra()}); put(5, new Extra[]{new StringExtra("gps")}); put(6, new Extra[]{new CriteriaExtra()}); }}; private SparseArray<String[]> mExtrasLabels = new SparseArray<String[]>() {{ put(3, new String[]{"minTime", "minDistance", "criteria"}); put(4, new String[]{"provider", "minTime", "minDistance"}); put(5, new String[]{"provider"}); put(6, new String[]{"criteria"}); }}; private ExtrasDialogBuilder mBuilder = new ExtrasDialogBuilder(); @Override public int getCount() { return mLabels.length; } @Override public String getLabel(int position) { return mLabels[position]; } @Override public boolean hasExtras(int position) { return mExtras.get(position) != null; } @Override public Dialog buildDialog(Context context, int position) { return mBuilder.build(context, mExtras.get(position), mExtrasLabels.get(position)); } @Override public SimpleRequest getRequest(final int position, final DataAdapter adapter) { Extra[] extras = mExtras.get(position); switch (position) { case 0: return LocationRequest.addGpsStatusListener(new GpsStatus.Listener() { @Override public void onGpsStatusChanged(int event) { adapter.onData(position, "onGpsStatusChanged: " + event); } }).listener(new ResponseListener(position, adapter)); case 1: return LocationRequest.addNmeaListener(new GpsStatus.NmeaListener() { @Override public void onNmeaReceived(long timestamp, String nmea) { adapter.onData(position, "onGpsStatusChanged: ts=" + timestamp + " nmea=" + nmea); } }).listener(new ResponseListener(position, adapter)); case 2: return LocationRequest.getLastKnownLocation("gps") .listener(new ResponseDisplayListener(position, adapter)); case 3: return LocationRequest.requestLocationUpdates(((long) extras[0].getValue()), ((float) extras[1].getValue()), ((Criteria) extras[2].getValue()), new DemoLocationListener(position, adapter), null) .listener(new ResponseListener(position, adapter)); case 4: return LocationRequest.requestLocationUpdates((String) extras[0].getValue(), (long) extras[1].getValue(), (float) extras[2].getValue(), new DemoLocationListener(position, adapter), null) .listener(new ResponseListener(position, adapter)); case 5: return LocationRequest.requestSingleUpdate((String) extras[0].getValue(), new DemoLocationListener(position, adapter), null) .listener(new ResponseListener(position, adapter)); case 6: return LocationRequest.requestSingleUpdate((Criteria) extras[0].getValue(), new DemoLocationListener(position, adapter), null) .listener(new ResponseListener(position, adapter)); } return null; } private static class DemoLocationListener implements LocationListener { private int mPosition; private DataAdapter mAdapter; public DemoLocationListener(int position, DataAdapter adapter) { mPosition = position; mAdapter = adapter; } @Override public void onLocationChanged(Location location) { String data = "onLocationChanged: " + location; mAdapter.onData(mPosition, data); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { String data = "onStatusChanged: provider=" + provider + " status=" + status + " extras=" + BundleUtil.toString(extras); mAdapter.onData(mPosition, data); } @Override public void onProviderEnabled(String provider) { String data = "onProviderEnabled: " + provider; mAdapter.onData(mPosition, data); } @Override public void onProviderDisabled(String provider) { String data = "onProviderDisabled: " + provider; mAdapter.onData(mPosition, data); } } }