package net.wigle.wigleandroid; import java.util.concurrent.atomic.AtomicBoolean; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.pm.PackageManager; import android.database.Cursor; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.media.AudioManager; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.ActivityCompat; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.view.MenuItemCompat; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapView; import com.google.android.gms.maps.MapsInitializer; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import net.wigle.wigleandroid.background.QueryThread; import net.wigle.wigleandroid.model.ConcurrentLinkedHashMap; import net.wigle.wigleandroid.model.Network; /** * show a map! */ public final class MappingFragment extends Fragment { private static class State { private boolean locked = true; private boolean firstMove = true; private LatLng oldCenter = null; private final int oldZoom = Integer.MIN_VALUE; } private final State state = new State(); private MapView mapView; private MapRender mapRender; private final Handler timer = new Handler(); private AtomicBoolean finishing; private Location previousLocation; private int previousRunNets; private static final String DIALOG_PREFIX = "DialogPrefix"; public static final String MAP_DIALOG_PREFIX = ""; public static LocationListener STATIC_LOCATION_LISTENER = null; private static final int DEFAULT_ZOOM = 17; public static final LatLng DEFAULT_POINT = new LatLng(41.95d, -87.65d); private static final int MENU_EXIT = 12; private static final int MENU_ZOOM_IN = 13; private static final int MENU_ZOOM_OUT = 14; private static final int MENU_TOGGLE_LOCK = 15; private static final int MENU_TOGGLE_NEWDB = 16; private static final int MENU_LABEL = 17; private static final int MENU_FILTER = 18; private static final int MENU_CLUSTER = 19; private static final int MENU_TRAFFIC = 20; private static final int MENU_MAP_TYPE = 21; private static final int MENU_WAKELOCK = 22; private static final int SSID_FILTER = 102; /** Called when the activity is first created. */ @Override public void onCreate(final Bundle savedInstanceState) { MainActivity.info("MAP: onCreate"); super.onCreate(savedInstanceState); setHasOptionsMenu(true); // set language MainActivity.setLocale(getActivity()); finishing = new AtomicBoolean(false); // media volume getActivity().setVolumeControlStream(AudioManager.STREAM_MUSIC); setupQuery(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mapView = new MapView(getActivity()); final int serviceAvailable = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity()); if (serviceAvailable == ConnectionResult.SUCCESS) { try { mapView.onCreate(savedInstanceState); } catch (final SecurityException ex) { MainActivity.error("security exception oncreateview map: " + ex, ex); Toast.makeText(getActivity(), getString(R.string.status_fail), Toast.LENGTH_LONG).show(); } } else { Toast.makeText(getActivity(), getString(R.string.map_needs_playservice), Toast.LENGTH_LONG).show(); } MapsInitializer.initialize(getActivity()); final View view = inflater.inflate(R.layout.map, container, false); LatLng oldCenter = null; int oldZoom = Integer.MIN_VALUE; if (state.oldCenter != null) { // pry an orientation change, which calls destroy oldCenter = state.oldCenter; oldZoom = state.oldZoom; } setupMapView(view, oldCenter, oldZoom); return view; } private void setupMapView(final View view, final LatLng oldCenter, final int oldZoom) { // view final RelativeLayout rlView = (RelativeLayout) view.findViewById(R.id.map_rl); if (mapView != null) { ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); mapView.setLayoutParams(params); } // conditionally replace the tile source final SharedPreferences prefs = getActivity().getSharedPreferences(ListFragment.SHARED_PREFS, 0); rlView.addView(mapView); // guard against not having google play services mapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(final GoogleMap googleMap) { if (ActivityCompat.checkSelfPermission(MappingFragment.this.getContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(MappingFragment.this.getContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { googleMap.setMyLocationEnabled(true); } googleMap.setBuildingsEnabled(true); final boolean showTraffic = prefs.getBoolean(ListFragment.PREF_MAP_TRAFFIC, true); googleMap.setTrafficEnabled(showTraffic); final int mapType = prefs.getInt(ListFragment.PREF_MAP_TYPE, GoogleMap.MAP_TYPE_NORMAL); googleMap.setMapType(mapType); mapRender = new MapRender(getActivity(), googleMap, false); // controller final LatLng centerPoint = getCenter(getActivity(), oldCenter, previousLocation); float zoom = DEFAULT_ZOOM; if (oldZoom >= 0) { zoom = oldZoom; } else { zoom = prefs.getFloat(ListFragment.PREF_PREV_ZOOM, zoom); } final CameraPosition cameraPosition = new CameraPosition.Builder() .target(centerPoint).zoom(zoom).build(); googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); } }); MainActivity.info("done setupMapView."); } public static LatLng getCenter( final Context context, final LatLng priorityCenter, final Location previousLocation ) { LatLng centerPoint = DEFAULT_POINT; final Location location = ListFragment.lameStatic.location; final SharedPreferences prefs = context.getSharedPreferences( ListFragment.SHARED_PREFS, 0 ); if ( priorityCenter != null ) { centerPoint = priorityCenter; } else if ( location != null ) { centerPoint = new LatLng( location.getLatitude(), location.getLongitude() ); } else if ( previousLocation != null ) { centerPoint = new LatLng( previousLocation.getLatitude(), previousLocation.getLongitude() ); } else { final Location gpsLocation = safelyGetLast(context, LocationManager.GPS_PROVIDER); final Location networkLocation = safelyGetLast(context, LocationManager.NETWORK_PROVIDER); if ( gpsLocation != null ) { centerPoint = new LatLng( gpsLocation.getLatitude(), gpsLocation.getLongitude() ); } else if ( networkLocation != null ) { centerPoint = new LatLng( networkLocation.getLatitude(), networkLocation.getLongitude() ); } else { // ok, try the saved prefs float lat = prefs.getFloat( ListFragment.PREF_PREV_LAT, Float.MIN_VALUE ); float lon = prefs.getFloat( ListFragment.PREF_PREV_LON, Float.MIN_VALUE ); if ( lat != Float.MIN_VALUE && lon != Float.MIN_VALUE ) { centerPoint = new LatLng( lat, lon ); } } } return centerPoint; } private static Location safelyGetLast( final Context context, final String provider ) { Location retval = null; try { final LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); retval = locationManager.getLastKnownLocation( provider ); } catch ( final IllegalArgumentException | SecurityException ex ) { MainActivity.info("exception getting last known location: " + ex); } return retval; } final Runnable mUpdateTimeTask = new MapRunnable(); private class MapRunnable implements Runnable { @Override public void run() { // make sure the app isn't trying to finish if ( ! finishing.get() ) { final Location location = ListFragment.lameStatic.location; if ( location != null ) { if ( state.locked ) { mapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(final GoogleMap googleMap) { // MainActivity.info( "mapping center location: " + location ); final LatLng locLatLng = new LatLng(location.getLatitude(), location.getLongitude()); final CameraUpdate centerUpdate = CameraUpdateFactory.newLatLng(locLatLng); if (state.firstMove) { googleMap.moveCamera(centerUpdate); state.firstMove = false; } else { googleMap.animateCamera(centerUpdate); } } }); } else if ( previousLocation == null || previousLocation.getLatitude() != location.getLatitude() || previousLocation.getLongitude() != location.getLongitude() || previousRunNets != ListFragment.lameStatic.runNets) { // location or nets have changed, update the view if (mapView != null) { mapView.postInvalidate(); } } // set if location isn't null previousLocation = location; } previousRunNets = ListFragment.lameStatic.runNets; final View view = getView(); if (view != null) { TextView tv = (TextView) view.findViewById(R.id.stats_run); tv.setText(getString(R.string.run) + ": " + ListFragment.lameStatic.runNets); tv = (TextView) view.findViewById(R.id.stats_new); tv.setText(getString(R.string.new_word) + ": " + ListFragment.lameStatic.newNets); tv = (TextView) view.findViewById(R.id.stats_dbnets); tv.setText(getString(R.string.db) + ": " + ListFragment.lameStatic.dbNets); } final long period = 1000L; // info("wifitimer: " + period ); timer.postDelayed( this, period ); } else { MainActivity.info( "finishing mapping timer" ); } } } private void setupTimer() { timer.removeCallbacks( mUpdateTimeTask ); timer.postDelayed( mUpdateTimeTask, 250 ); } @Override public void onDetach() { MainActivity.info( "MAP: onDetach."); super.onDetach(); } @Override public void onDestroy() { MainActivity.info( "MAP: destroy mapping." ); finishing.set( true ); mapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(final GoogleMap googleMap) { // save zoom final SharedPreferences prefs = getActivity().getSharedPreferences( ListFragment.SHARED_PREFS, 0 ); final Editor edit = prefs.edit(); edit.putFloat( ListFragment.PREF_PREV_ZOOM, googleMap.getCameraPosition().zoom ); edit.apply(); // save center state.oldCenter = googleMap.getCameraPosition().target; } }); try { mapView.onDestroy(); } catch (NullPointerException ex) { // seen in the wild MainActivity.info("exception in mapView.onDestroy: " + ex, ex); } super.onDestroy(); } @Override public void onPause() { MainActivity.info("MAP: onPause"); super.onPause(); try { mapView.onPause(); } catch (final NullPointerException ex) { MainActivity.error("npe on mapview pause: " + ex, ex); } if (mapRender != null) { // save memory mapRender.clear(); } } @Override public void onResume() { MainActivity.info( "MAP: onResume" ); super.onResume(); setupTimer(); getActivity().setTitle(R.string.mapping_app_name); mapView.onResume(); } @Override public void onSaveInstanceState(final Bundle outState) { MainActivity.info( "MAP: onSaveInstanceState" ); super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } @Override public void onLowMemory() { MainActivity.info( "MAP: onLowMemory" ); super.onLowMemory(); mapView.onLowMemory(); } public void addNetwork(final Network network) { if (mapRender != null && mapRender.okForMapTab(network)) { mapRender.addItem(network); } } public void updateNetwork(final Network network) { if (mapRender != null) { mapRender.updateNetwork(network); } } public void reCluster() { if (mapRender != null) { mapRender.reCluster(); } } /* Creates the menu items */ @Override public void onCreateOptionsMenu (final Menu menu, final MenuInflater inflater) { MainActivity.info( "MAP: onCreateOptionsMenu" ); MenuItem item; final SharedPreferences prefs = getActivity().getSharedPreferences( ListFragment.SHARED_PREFS, 0 ); final boolean showNewDBOnly = prefs.getBoolean( ListFragment.PREF_MAP_ONLY_NEWDB, false ); final boolean showLabel = prefs.getBoolean( ListFragment.PREF_MAP_LABEL, true ); final boolean showCluster = prefs.getBoolean( ListFragment.PREF_MAP_CLUSTER, true ); final boolean showTraffic = prefs.getBoolean( ListFragment.PREF_MAP_TRAFFIC, true ); String nameLabel = showLabel ? getString(R.string.menu_labels_off) : getString(R.string.menu_labels_on); item = menu.add(0, MENU_LABEL, 0, nameLabel); item.setIcon( android.R.drawable.ic_dialog_info ); String nameCluster = showCluster ? getString(R.string.menu_cluster_off) : getString(R.string.menu_cluster_on); item = menu.add(0, MENU_CLUSTER, 0, nameCluster); item.setIcon( android.R.drawable.ic_menu_add ); String nameTraffic = showTraffic ? getString(R.string.menu_traffic_off) : getString(R.string.menu_traffic_on); item = menu.add(0, MENU_TRAFFIC, 0, nameTraffic); item.setIcon( android.R.drawable.ic_menu_directions ); item = menu.add(0, MENU_MAP_TYPE, 0, getString(R.string.menu_map_type)); item.setIcon( android.R.drawable.ic_menu_mapmode ); MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); item = menu.add(0, MENU_FILTER, 0, getString(R.string.menu_ssid_filter)); item.setIcon( android.R.drawable.ic_menu_search ); MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); String name = state.locked ? getString(R.string.menu_turn_off_lockon) : getString(R.string.menu_turn_on_lockon); item = menu.add(0, MENU_TOGGLE_LOCK, 0, name); item.setIcon( android.R.drawable.ic_lock_lock ); String nameDB = showNewDBOnly ? getString(R.string.menu_show_old) : getString(R.string.menu_show_new); item = menu.add(0, MENU_TOGGLE_NEWDB, 0, nameDB); item.setIcon( android.R.drawable.ic_menu_edit ); final String wake = MainActivity.isScreenLocked( this ) ? getString(R.string.menu_screen_sleep) : getString(R.string.menu_screen_wake); item = menu.add(0, MENU_WAKELOCK, 0, wake); item.setIcon( android.R.drawable.ic_menu_gallery ); // item = menu.add(0, MENU_ZOOM_IN, 0, getString(R.string.menu_zoom_in)); // item.setIcon( android.R.drawable.ic_menu_add ); // item = menu.add(0, MENU_ZOOM_OUT, 0, getString(R.string.menu_zoom_out)); // item.setIcon( android.R.drawable.ic_menu_revert ); // item = menu.add(0, MENU_SETTINGS, 0, getString(R.string.menu_settings)); // item.setIcon( android.R.drawable.ic_menu_preferences ); // item = menu.add(0, MENU_EXIT, 0, getString(R.string.menu_exit)); // item.setIcon( android.R.drawable.ic_menu_close_clear_cancel ); super.onCreateOptionsMenu(menu, inflater); } /* Handles item selections */ @Override public boolean onOptionsItemSelected( final MenuItem item ) { final SharedPreferences prefs = getActivity().getSharedPreferences( ListFragment.SHARED_PREFS, 0 ); switch ( item.getItemId() ) { case MENU_EXIT: { final MainActivity main = MainActivity.getMainActivity(); main.finish(); return true; } case MENU_ZOOM_IN: { mapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(final GoogleMap googleMap) { float zoom = googleMap.getCameraPosition().zoom; zoom++; final CameraUpdate zoomUpdate = CameraUpdateFactory.zoomTo(zoom); googleMap.animateCamera(zoomUpdate); } }); return true; } case MENU_ZOOM_OUT: { mapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(final GoogleMap googleMap) { float zoom = googleMap.getCameraPosition().zoom; zoom--; final CameraUpdate zoomUpdate = CameraUpdateFactory.zoomTo(zoom); googleMap.animateCamera(zoomUpdate); } }); return true; } case MENU_TOGGLE_LOCK: { state.locked = ! state.locked; String name = state.locked ? getString(R.string.menu_turn_off_lockon) : getString(R.string.menu_turn_on_lockon); item.setTitle( name ); return true; } case MENU_TOGGLE_NEWDB: { final boolean showNewDBOnly = ! prefs.getBoolean( ListFragment.PREF_MAP_ONLY_NEWDB, false ); Editor edit = prefs.edit(); edit.putBoolean( ListFragment.PREF_MAP_ONLY_NEWDB, showNewDBOnly ); edit.apply(); String name = showNewDBOnly ? getString(R.string.menu_show_old) : getString(R.string.menu_show_new); item.setTitle( name ); if (mapRender != null) { mapRender.reCluster(); } return true; } case MENU_LABEL: { final boolean showLabel = ! prefs.getBoolean( ListFragment.PREF_MAP_LABEL, true ); Editor edit = prefs.edit(); edit.putBoolean( ListFragment.PREF_MAP_LABEL, showLabel ); edit.apply(); String name = showLabel ? getString(R.string.menu_labels_off) : getString(R.string.menu_labels_on); item.setTitle( name ); if (mapRender != null) { mapRender.reCluster(); } return true; } case MENU_CLUSTER: { final boolean showCluster = ! prefs.getBoolean( ListFragment.PREF_MAP_CLUSTER, true ); Editor edit = prefs.edit(); edit.putBoolean( ListFragment.PREF_MAP_CLUSTER, showCluster ); edit.apply(); String name = showCluster ? getString(R.string.menu_cluster_off) : getString(R.string.menu_cluster_on); item.setTitle( name ); if (mapRender != null) { mapRender.reCluster(); } return true; } case MENU_TRAFFIC: { final boolean showTraffic = ! prefs.getBoolean( ListFragment.PREF_MAP_TRAFFIC, true ); Editor edit = prefs.edit(); edit.putBoolean( ListFragment.PREF_MAP_TRAFFIC, showTraffic ); edit.apply(); String name = showTraffic ? getString(R.string.menu_traffic_off) : getString(R.string.menu_traffic_on); item.setTitle( name ); mapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(final GoogleMap googleMap) { googleMap.setTrafficEnabled(showTraffic); } }); return true; } case MENU_FILTER: { onCreateDialog( SSID_FILTER ); return true; } case MENU_MAP_TYPE: { mapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(final GoogleMap googleMap) { int newMapType = prefs.getInt(ListFragment.PREF_MAP_TYPE, GoogleMap.MAP_TYPE_NORMAL); switch (newMapType) { case GoogleMap.MAP_TYPE_NORMAL: newMapType = GoogleMap.MAP_TYPE_SATELLITE; Toast.makeText(getActivity(), getString(R.string.map_toast_satellite), Toast.LENGTH_SHORT).show(); break; case GoogleMap.MAP_TYPE_SATELLITE: newMapType = GoogleMap.MAP_TYPE_HYBRID; Toast.makeText(getActivity(), getString(R.string.map_toast_hybrid), Toast.LENGTH_SHORT).show(); break; case GoogleMap.MAP_TYPE_HYBRID: newMapType = GoogleMap.MAP_TYPE_TERRAIN; Toast.makeText(getActivity(), getString(R.string.map_toast_terrain), Toast.LENGTH_SHORT).show(); break; case GoogleMap.MAP_TYPE_TERRAIN: newMapType = GoogleMap.MAP_TYPE_NORMAL; Toast.makeText(getActivity(), getString(R.string.map_toast_normal), Toast.LENGTH_SHORT).show(); break; default: MainActivity.error("unhandled mapType: " + newMapType); } Editor edit = prefs.edit(); edit.putInt(ListFragment.PREF_MAP_TYPE, newMapType); edit.apply(); googleMap.setMapType(newMapType); } }); } case MENU_WAKELOCK: { boolean screenLocked = ! MainActivity.isScreenLocked( this ); MainActivity.setLockScreen( this, screenLocked ); final String wake = screenLocked ? getString(R.string.menu_screen_sleep) : getString(R.string.menu_screen_wake); item.setTitle( wake ); return true; } } return false; } public void onCreateDialog( int which ) { DialogFragment dialogFragment = null; switch ( which ) { case SSID_FILTER: dialogFragment = createSsidFilterDialog( MAP_DIALOG_PREFIX ); break; default: MainActivity.error( "unhandled dialog: " + which ); } if (dialogFragment != null) { final FragmentManager fm = getActivity().getSupportFragmentManager(); try { dialogFragment.show(fm, MainActivity.LIST_FRAGMENT_TAG); } catch (final IllegalStateException ex) { MainActivity.error("dialog error: " + ex, ex); } } } public static class MapDialogFragment extends DialogFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final String prefix = getArguments().getString(DIALOG_PREFIX); final Dialog dialog = getDialog(); final Activity activity = getActivity(); final View view = inflater.inflate(R.layout.filterdialog, container); dialog.setTitle( "SSID Filter" ); MainActivity.info("make new dialog. prefix: " + prefix); final SharedPreferences prefs = activity.getSharedPreferences( ListFragment.SHARED_PREFS, 0 ); final EditText regex = (EditText) view.findViewById( R.id.edit_regex ); regex.setText( prefs.getString( prefix + ListFragment.PREF_MAPF_REGEX, "") ); final CheckBox invert = MainActivity.prefSetCheckBox( activity, view, R.id.showinvert, prefix + ListFragment.PREF_MAPF_INVERT, false ); final CheckBox open = MainActivity.prefSetCheckBox( activity, view, R.id.showopen, prefix + ListFragment.PREF_MAPF_OPEN, true ); final CheckBox wep = MainActivity.prefSetCheckBox( activity, view, R.id.showwep, prefix + ListFragment.PREF_MAPF_WEP, true ); final CheckBox wpa = MainActivity.prefSetCheckBox( activity, view, R.id.showwpa, prefix + ListFragment.PREF_MAPF_WPA, true ); final CheckBox cell = MainActivity.prefSetCheckBox( activity, view, R.id.showcell, prefix + ListFragment.PREF_MAPF_CELL, true ); final CheckBox enabled = MainActivity.prefSetCheckBox( activity, view, R.id.enabled, prefix + ListFragment.PREF_MAPF_ENABLED, true ); Button ok = (Button) view.findViewById( R.id.ok_button ); ok.setOnClickListener( new OnClickListener() { @Override public void onClick( final View buttonView ) { try { final Editor editor = prefs.edit(); editor.putString( prefix + ListFragment.PREF_MAPF_REGEX, regex.getText().toString() ); editor.putBoolean( prefix + ListFragment.PREF_MAPF_INVERT, invert.isChecked() ); editor.putBoolean( prefix + ListFragment.PREF_MAPF_OPEN, open.isChecked() ); editor.putBoolean( prefix + ListFragment.PREF_MAPF_WEP, wep.isChecked() ); editor.putBoolean( prefix + ListFragment.PREF_MAPF_WPA, wpa.isChecked() ); editor.putBoolean( prefix + ListFragment.PREF_MAPF_CELL, cell.isChecked() ); editor.putBoolean( prefix + ListFragment.PREF_MAPF_ENABLED, enabled.isChecked() ); editor.apply(); MainActivity.reclusterMap(); dialog.dismiss(); } catch ( Exception ex ) { // guess it wasn't there anyways MainActivity.info( "exception dismissing filter dialog: " + ex ); } } } ); Button cancel = (Button) view.findViewById( R.id.cancel_button ); cancel.setOnClickListener( new OnClickListener() { @Override public void onClick( final View buttonView ) { try { regex.setText( prefs.getString( prefix + ListFragment.PREF_MAPF_REGEX, "") ); MainActivity.prefSetCheckBox( activity, view, R.id.showinvert, prefix + ListFragment.PREF_MAPF_INVERT, false ); MainActivity.prefSetCheckBox( activity, view, R.id.showopen, prefix + ListFragment.PREF_MAPF_OPEN, true ); MainActivity.prefSetCheckBox( activity, view, R.id.showwep, prefix + ListFragment.PREF_MAPF_WEP, true ); MainActivity.prefSetCheckBox( activity, view, R.id.showwpa, prefix + ListFragment.PREF_MAPF_WPA, true ); MainActivity.prefSetCheckBox( activity, view, R.id.showcell, prefix + ListFragment.PREF_MAPF_CELL, true ); MainActivity.prefSetCheckBox( activity, view, R.id.enabled, prefix + ListFragment.PREF_MAPF_ENABLED, true ); dialog.dismiss(); } catch ( Exception ex ) { // guess it wasn't there anyways MainActivity.info( "exception dismissing filter dialog: " + ex ); } } } ); return view; } } public static DialogFragment createSsidFilterDialog( final String prefix ) { final DialogFragment dialog = new MapDialogFragment(); final Bundle bundle = new Bundle(); bundle.putString(DIALOG_PREFIX, prefix); dialog.setArguments(bundle); return dialog; } private void setupQuery() { final int cacheSize = MainActivity.getNetworkCache().size(); if (cacheSize > (ListFragment.lameStatic.networkCache.maxSize() / 4)) { // don't load, there's already networks to show MainActivity.info("cacheSize: " + cacheSize + ", skipping previous networks"); return; } final String sql = "SELECT bssid FROM " + DatabaseHelper.LOCATION_TABLE + " ORDER BY _id DESC LIMIT " + (ListFragment.lameStatic.networkCache.maxSize() * 2); final QueryThread.Request request = new QueryThread.Request( sql, new QueryThread.ResultHandler() { @Override public boolean handleRow( final Cursor cursor ) { final String bssid = cursor.getString(0); final ConcurrentLinkedHashMap<String,Network> networkCache = MainActivity.getNetworkCache(); Network network = networkCache.get( bssid ); // MainActivity.info("RAW bssid: " + bssid); if ( network == null ) { network = ListFragment.lameStatic.dbHelper.getNetwork( bssid ); if ( network != null ) { networkCache.put( network.getBssid(), network ); if (networkCache.isFull()) { MainActivity.info("Cache is full, breaking out of query result handling"); return false; } } } return true; } @Override public void complete() { if ( mapView != null ) { // force a redraw mapView.postInvalidate(); } } }); if (ListFragment.lameStatic.dbHelper != null) { ListFragment.lameStatic.dbHelper.addToQueue( request ); } } }