package mil.nga.giat.asam; import java.lang.ref.WeakReference; import java.util.List; import mil.nga.giat.asam.db.AsamDbHelper; import mil.nga.giat.asam.model.AsamBean; import mil.nga.giat.asam.model.AsamJsonParser; import mil.nga.giat.asam.net.AsamWebService; import mil.nga.giat.asam.util.AsamConstants; import mil.nga.giat.asam.util.AsamLog; import mil.nga.giat.asam.util.AsamUtils; import mil.nga.giat.asam.util.SyncTime; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.preference.PreferenceManager; import android.support.v7.app.ActionBarActivity; import android.view.MenuItem; import android.view.View; import android.widget.CheckBox; import android.widget.TextView; public class PreferencesActivity extends ActionBarActivity { private static class QueryHandler extends Handler { WeakReference<PreferencesActivity> mPreferencesActivity; QueryHandler(PreferencesActivity preferencesActivity) { mPreferencesActivity = new WeakReference<PreferencesActivity>(preferencesActivity); } @Override public void handleMessage(Message message) { PreferencesActivity preferencesActivity = mPreferencesActivity.get(); preferencesActivity.mQueryProgressDialog.dismiss(); if (preferencesActivity.mQueryError) { preferencesActivity.mQueryError = false; preferencesActivity.showSimpleDialog(preferencesActivity.getString(R.string.preferences_query_error_text), preferencesActivity.getString(R.string.preferences_query_error_text)); return; } SyncTime.finishedSync(preferencesActivity); TextView lastSyncTimeUI = (TextView)preferencesActivity.findViewById(R.id.preferences_last_sync_time_ui); lastSyncTimeUI.setText(SyncTime.getLastSyncTimeAsText(preferencesActivity)); preferencesActivity.showSimpleDialog(preferencesActivity.getString(R.string.preferences_sync_complete_title_text), preferencesActivity.getString(R.string.preferences_sync_complete_description_text)); } } private CheckBox mDisclaimerCheckBoxUI; private volatile boolean mQueryError; private QueryHandler mQueryHandler; private ProgressDialog mQueryProgressDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AsamLog.i(PreferencesActivity.class.getName() + ":onCreate"); setContentView(R.layout.preferences); getSupportActionBar().setDisplayHomeAsUpEnabled(true); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); mDisclaimerCheckBoxUI = (CheckBox)findViewById(R.id.preferences_hide_disclaimer_checkbox_ui); mDisclaimerCheckBoxUI.setChecked(preferences.getBoolean(AsamConstants.HIDE_DISCLAIMER_KEY, false)); // Called to handle the UI after the query has run. mQueryHandler = new QueryHandler(this); } @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); if (itemId == android.R.id.home) { finish(); return true; } return super.onOptionsItemSelected(item); } public void syncButtonClicked(View view) { if (SyncTime.isSynched(this)) { showSimpleDialog(getString(R.string.preferences_no_sync_title_text), getString(R.string.preferences_no_sync_description_text)); return; } mQueryProgressDialog = ProgressDialog.show(this, getString(R.string.preferences_query_progress_dialog_title_text), getString(R.string.preferences_query_progress_dialog_content_text), true); new QueryThread().start(); } public void disclaimerButtonClicked(View view) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean(AsamConstants.HIDE_DISCLAIMER_KEY, mDisclaimerCheckBoxUI.isChecked()); editor.commit(); } @Override protected void onResume() { super.onResume(); AsamLog.i(PreferencesActivity.class.getName() + ":onResume"); TextView lastSyncTimeUI = (TextView)findViewById(R.id.preferences_last_sync_time_ui); lastSyncTimeUI.setText(SyncTime.getLastSyncTimeAsText(this)); } private void showSimpleDialog(String title, String message) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(title); builder.setMessage(message); builder.setPositiveButton(getString(R.string.preferences_ok_button_text), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); builder.show(); } private class QueryThread extends Thread { @Override public void run() { mQueryError = false; Context context = PreferencesActivity.this; String json = null; SQLiteDatabase db = null; try { AsamWebService webService = new AsamWebService(context); json = webService.query(); if (!AsamUtils.isEmpty(json)) { AsamJsonParser parser = new AsamJsonParser(); List<AsamBean> asams = parser.parseJson(json); if (asams.size() > 0) { // Do a diff of what the web service returned and what's currently in the db. AsamDbHelper dbHelper = new AsamDbHelper(context); db = dbHelper.getWritableDatabase(); asams = dbHelper.removeDuplicates(db, asams); dbHelper.insertAsams(db, asams); } } SyncTime.finishedSync(context); } catch (Exception caught) { AsamLog.e("There was an error parsing ASAM feed", caught); mQueryError = true; } finally { if (db != null) { db.close(); db = null; } } mQueryHandler.sendEmptyMessage(0); } } }