package net.wigle.wigleandroid; import android.content.res.Configuration; import android.content.res.Resources; import android.media.AudioManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; 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.ViewGroup; import android.widget.ScrollView; import android.widget.TextView; import net.wigle.wigleandroid.background.ApiDownloader; import net.wigle.wigleandroid.background.ApiListener; import net.wigle.wigleandroid.background.DownloadHandler; import org.json.JSONException; import org.json.JSONObject; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Locale; import java.util.concurrent.atomic.AtomicBoolean; public class SiteStatsFragment extends Fragment { private static final int MSG_SITE_DONE = 100; private static final int MENU_USER_STATS = 200; private static final int MENU_RANK_STATS = 202; private static final String KEY_NETLOC = "netloc"; private static final String KEY_LOCTOTAL = "loctotal"; private static final String KEY_GENLOC = "genloc"; private static final String KEY_USERSTOT = "userstot"; private static final String KEY_TRANSTOT = "transtot"; private static final String KEY_NETWPA2 = "netwpa2"; private static final String KEY_NETWPA = "netwpa"; private static final String KEY_NETWEP = "netwep"; private static final String KEY_NETNOWEP = "netnowep"; private static final String KEY_NETWEP_UNKNOWN = "netwepunknown"; private static final String[] ALL_SITE_KEYS = new String[] { KEY_NETLOC, KEY_LOCTOTAL, KEY_GENLOC, KEY_USERSTOT, KEY_TRANSTOT, KEY_NETWPA2, KEY_NETWPA, KEY_NETWEP, KEY_NETNOWEP, KEY_NETWEP_UNKNOWN, }; private AtomicBoolean finishing; private NumberFormat numberFormat; /** Called when the activity is first created. */ @Override public void onCreate( final Bundle savedInstanceState ) { MainActivity.info("SITESTATS: 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(0); numberFormat.setMaximumFractionDigits(2); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final int orientation = getResources().getConfiguration().orientation; MainActivity.info("SITESTATS: onCreateView. orientation: " + orientation); final ScrollView scrollView = (ScrollView) inflater.inflate(R.layout.sitestats, container, false); downloadLatestSiteStats(scrollView); return scrollView; } private final static class SiteDownloadHandler extends DownloadHandler { private SiteDownloadHandler(final View view, final NumberFormat numberFormat, final String packageName, final Resources resources) { super(view, numberFormat, packageName, resources); } @Override public void handleMessage(final Message msg) { final Bundle bundle = msg.getData(); if (msg.what == MSG_SITE_DONE) { TextView tv; for (final String key : ALL_SITE_KEYS) { int id = resources.getIdentifier(key, "id", packageName); tv = (TextView) view.findViewById(id); tv.setText(numberFormat.format(bundle.getLong(key))); } } } } public void downloadLatestSiteStats(final View view) { // what runs on the gui thread final Handler handler = new SiteDownloadHandler(view, numberFormat, getActivity().getPackageName(), getResources()); final ApiDownloader task = new ApiDownloader(getActivity(), ListFragment.lameStatic.dbHelper, "site-stats-cache.json", MainActivity.SITE_STATS_URL, false, false, false, ApiDownloader.REQUEST_GET, new ApiListener() { @Override public void requestComplete(final JSONObject json, final boolean isCache) { handleSiteStats(json, handler); } }); try { task.startDownload(this); } catch (WiGLEAuthException waex) { //unauthenticated call - should never trip MainActivity.warn("Authentication error on site stats load (should not happen)", waex); } } private void handleSiteStats(final JSONObject json, final Handler handler) { MainActivity.info("handleSiteStats"); if (json == null) { MainActivity.info("handleSiteStats null json, returning"); return; } final Bundle bundle = new Bundle(); try { for (final String key : ALL_SITE_KEYS) { String jsonKey = key; if (KEY_NETWEP_UNKNOWN.equals(key)) jsonKey = "netwep?"; bundle.putLong(key, json.getLong(jsonKey)); } } catch (final JSONException ex) { MainActivity.error("json error: " + ex, ex); } catch (final Exception e) { MainActivity.error("Statistics error: " + e, e); } final Message message = new Message(); message.setData(bundle); message.what = MSG_SITE_DONE; handler.sendMessage(message); } @Override public void onDestroy() { MainActivity.info( "SITESTATS: onDestroy" ); finishing.set( true ); super.onDestroy(); } @Override public void onResume() { MainActivity.info("SITESTATS: onResume"); super.onResume(); getActivity().setTitle(R.string.site_stats_app_name); } @Override public void onStart() { MainActivity.info( "SITESTATS: onStart" ); super.onStart(); } @Override public void onPause() { MainActivity.info( "SITESTATS: onPause" ); super.onPause(); } @Override public void onStop() { MainActivity.info( "SITESTATS: onStop" ); super.onStop(); } @Override public void onConfigurationChanged( final Configuration newConfig ) { MainActivity.info("SITESTATS: config changed"); super.onConfigurationChanged( newConfig ); } /* Creates the menu items */ @Override public void onCreateOptionsMenu (final Menu menu, final MenuInflater inflater) { MenuItem item = menu.add(0, MENU_USER_STATS, 0, getString(R.string.user_stats_app_name)); item.setIcon( android.R.drawable.ic_menu_myplaces ); MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); item = menu.add(0, MENU_USER_STATS, 0, getString(R.string.user_stats_app_name)); item.setIcon(android.R.drawable.ic_menu_myplaces); item = menu.add(0, MENU_RANK_STATS, 0, getString(R.string.rank_stats_app_name)); item.setIcon(android.R.drawable.ic_menu_sort_by_size); MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); item = menu.add(0, MENU_RANK_STATS, 0, getString(R.string.rank_stats_app_name)); item.setIcon(android.R.drawable.ic_menu_sort_by_size); super.onCreateOptionsMenu(menu, inflater); } /* Handles item selections */ @Override public boolean onOptionsItemSelected( final MenuItem item ) { final MainActivity main = MainActivity.getMainActivity(); switch ( item.getItemId() ) { case MENU_USER_STATS: main.selectFragment(MainActivity.USER_STATS_TAB_POS); return true; case MENU_RANK_STATS: main.selectFragment(MainActivity.RANK_STATS_TAB_POS); return true; } return false; } }