package net.wigle.wigleandroid;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.location.Location;
import android.media.AudioManager;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ScrollView;
import android.widget.TextView;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicBoolean;
public class DashboardFragment extends Fragment {
private final Handler timer = new Handler();
private AtomicBoolean finishing;
private NumberFormat numberFormat;
private ScrollView scrollView;
private View landscape;
private View portrait;
private static final int MENU_EXIT = 11;
private static final int MENU_SETTINGS = 12;
/** Called when the activity is first created. */
@Override
public void onCreate( final Bundle savedInstanceState ) {
MainActivity.info("DASH: onCreate");
super.onCreate( savedInstanceState );
setHasOptionsMenu(true);
// set language
MainActivity.setLocale( getActivity() );
// media volume
getActivity().setVolumeControlStream( AudioManager.STREAM_MUSIC );
finishing = new AtomicBoolean( false );
numberFormat = NumberFormat.getNumberInstance( Locale.US );
if ( numberFormat instanceof DecimalFormat ) {
numberFormat.setMinimumFractionDigits(2);
numberFormat.setMaximumFractionDigits(2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final int orientation = getResources().getConfiguration().orientation;
MainActivity.info("DASH: onCreateView. orientation: " + orientation);
scrollView = (ScrollView) inflater.inflate(R.layout.dash, container, false);
landscape = inflater.inflate(R.layout.dashlandscape, container, false);
portrait = inflater.inflate(R.layout.dashportrait, container, false);
switchView();
return scrollView;
}
private void switchView() {
if (scrollView != null) {
final int orientation = getResources().getConfiguration().orientation;
View component = portrait;
if (orientation == 2) {
component = landscape;
}
scrollView.removeAllViews();
scrollView.addView(component);
}
}
private final Runnable mUpdateTimeTask = new Runnable() {
@Override
public void run() {
// make sure the app isn't trying to finish
if ( ! finishing.get() ) {
final View view = getView();
if (view != null) {
updateUI( view );
}
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 );
}
private void updateUI( final View view ) {
TextView tv = (TextView) view.findViewById( R.id.runnets );
tv.setText( ListFragment.lameStatic.runNets + " " + getString(R.string.run));
tv = (TextView) view.findViewById( R.id.newwifi );
final String scanning = MainActivity.isScanning(getActivity()) ? "" : getString(R.string.dash_scan_off) + "\n";
final String newTitle = ListFragment.lameStatic.newWifi >= 10 ? getString(R.string.new_word)
: getString(R.string.dash_new_wifi);
tv.setText( scanning + ListFragment.lameStatic.newWifi + " " + newTitle );
tv = (TextView) view.findViewById( R.id.currnets );
tv.setText( getString(R.string.dash_vis_nets) + " " + ListFragment.lameStatic.currNets );
tv = (TextView) view.findViewById( R.id.newNetsSinceUpload );
tv.setText( getString(R.string.dash_new_upload) + " " + newNetsSinceUpload() );
tv = (TextView) view.findViewById( R.id.newcells );
tv.setText( getString(R.string.dash_new_cells) + " " + ListFragment.lameStatic.newCells );
updateDist( view, R.id.rundist, ListFragment.PREF_DISTANCE_RUN, getString(R.string.dash_dist_run) );
updateDist( view, R.id.totaldist, ListFragment.PREF_DISTANCE_TOTAL, getString(R.string.dash_dist_total) );
updateDist( view, R.id.prevrundist, ListFragment.PREF_DISTANCE_PREV_RUN, getString(R.string.dash_dist_prev) );
tv = (TextView) view.findViewById( R.id.queuesize );
tv.setText( getString(R.string.dash_db_queue) + " " + ListFragment.lameStatic.preQueueSize );
tv = (TextView) view.findViewById( R.id.dbNets );
tv.setText( getString(R.string.dash_db_nets) + " " + ListFragment.lameStatic.dbNets );
tv = (TextView) view.findViewById( R.id.dbLocs );
tv.setText( getString(R.string.dash_db_locs) + " " + ListFragment.lameStatic.dbLocs );
tv = (TextView) view.findViewById( R.id.gpsstatus );
Location location = ListFragment.lameStatic.location;
String gpsStatus = getString(R.string.dash_no_loc);
if ( location != null ) {
gpsStatus = location.getProvider();
}
tv.setText( getString(R.string.dash_short_loc) + " " + gpsStatus );
}
private long newNetsSinceUpload() {
final SharedPreferences prefs = getActivity().getSharedPreferences( ListFragment.SHARED_PREFS, 0 );
final long marker = prefs.getLong( ListFragment.PREF_DB_MARKER, 0L );
final long uploaded = prefs.getLong( ListFragment.PREF_NETS_UPLOADED, 0L );
long newSinceUpload = 0;
// marker is set but no uploaded, a migration situation, so return zero
if (marker == 0 || uploaded != 0) {
newSinceUpload = ListFragment.lameStatic.dbNets - uploaded;
if ( newSinceUpload < 0 ) {
newSinceUpload = 0;
}
}
return newSinceUpload;
}
private void updateDist( final View view, final int id, final String pref, final String title ) {
final SharedPreferences prefs = getActivity().getSharedPreferences( ListFragment.SHARED_PREFS, 0 );
float dist = prefs.getFloat( pref, 0f );
final String distString = metersToString( numberFormat, getActivity(), dist, false );
final TextView tv = (TextView) view.findViewById( id );
tv.setText( title + " " + distString );
}
public static String metersToString(final NumberFormat numberFormat, final Context context, final float meters,
final boolean useShort ) {
final SharedPreferences prefs = context.getSharedPreferences( ListFragment.SHARED_PREFS, 0 );
final boolean metric = prefs.getBoolean( ListFragment.PREF_METRIC, false );
String retval;
if ( meters > 3000f ) {
if ( metric ) {
retval = numberFormat.format( meters / 1000f ) + " " + context.getString(R.string.km_short);
}
else {
retval = numberFormat.format( meters / 1609.344f ) + " " +
(useShort ? context.getString(R.string.mi_short) : context.getString(R.string.miles));
}
}
else if ( metric ){
retval = numberFormat.format( meters ) + " " +
(useShort ? context.getString(R.string.m_short) : context.getString(R.string.meters));
}
else {
retval = numberFormat.format( meters * 3.2808399f ) + " " +
(useShort ? context.getString(R.string.ft_short) : context.getString(R.string.feet));
}
return retval;
}
// XXX
// @Override
// public void finish() {
// ListActivity.info( "finish dash." );
// finishing.set( true );
//
// super.finish();
// }
@Override
public void onDestroy() {
MainActivity.info( "DASH: onDestroy" );
finishing.set( true );
super.onDestroy();
}
@Override
public void onResume() {
MainActivity.info( "DASH: onResume" );
super.onResume();
setupTimer();
getActivity().setTitle(R.string.dashboard_app_name);
}
@Override
public void onStart() {
MainActivity.info( "DASH: onStart" );
super.onStart();
}
@Override
public void onPause() {
MainActivity.info( "DASH: onPause" );
super.onPause();
}
@Override
public void onStop() {
MainActivity.info( "DASH: onStop" );
super.onStop();
}
@Override
public void onConfigurationChanged( final Configuration newConfig ) {
MainActivity.info( "DASH: config changed" );
switchView();
super.onConfigurationChanged( newConfig );
}
/* Creates the menu items */
@Override
public void onCreateOptionsMenu (final Menu menu, final MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
}
/* Handles item selections */
@Override
public boolean onOptionsItemSelected( final MenuItem item ) {
return false;
}
}