package net.wigle.wigleandroid.background; import net.wigle.wigleandroid.MainActivity; import net.wigle.wigleandroid.R; import net.wigle.wigleandroid.SettingsFragment; import net.wigle.wigleandroid.background.AbstractBackgroundTask.ProgressDialogFragment; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.widget.Toast; public class BackgroundGuiHandler extends Handler { public static final int WRITING_PERCENT_START = 100000; public static final int AUTHENTICATION_ERROR = 1; public static final String ERROR = "error"; public static final String FILENAME = "filename"; public static final String FILEPATH = "filepath"; private FragmentActivity context; private final Object lock; private final ProgressDialogFragment pd; private final AlertSettable alertSettable; private String msg_text = ""; public BackgroundGuiHandler(final FragmentActivity context, final Object lock, final ProgressDialogFragment pd, final AlertSettable alertSettable) { this.context = context; this.lock = lock; this.pd = pd; this.alertSettable = alertSettable; } public void setContext(final FragmentActivity context) { synchronized(lock) { this.context = context; } } @Override public void handleMessage( final Message msg ) { synchronized ( lock ) { if (msg.what == AUTHENTICATION_ERROR) { Toast.makeText(this.context, R.string.status_login_fail , Toast.LENGTH_LONG).show(); } if (pd == null) { // no dialog box, just return return; } if ( msg.what >= WRITING_PERCENT_START ) { final int percentTimesTen = msg.what - WRITING_PERCENT_START; pd.setMessage( context.getSupportFragmentManager(), msg_text + " " + (percentTimesTen/10f) + "%" ); // "The progress range is 0..10000." pd.setProgress( context.getSupportFragmentManager(), percentTimesTen * 10 ); return; } if ( msg.what >= Status.values().length || msg.what < 0 ) { MainActivity.error( "msg.what: " + msg.what + " out of bounds on Status values"); return; } final Status status = Status.values()[ msg.what ]; if ( Status.UPLOADING.equals( status ) ) { // pd.setMessage( status.getMessage() ); msg_text = context.getString( status.getMessage() ); pd.setProgress(context.getSupportFragmentManager(), 0); return; } if ( Status.WRITING.equals( status ) ) { msg_text = context.getString( status.getMessage() ); pd.setProgress(context.getSupportFragmentManager(), 0); return; } // If we got this far then the task is done // make sure we didn't lose this dialog this somewhere if ( pd != null ) { try { MainActivity.info("fragment from pd: " + pd); pd.dismiss(); alertSettable.clearProgressDialog(); } catch ( Exception ex ) { // guess it wasn't there anyways MainActivity.info( "exception dismissing dialog: " + ex ); } } // Activity context final FragmentManager fm = context.getSupportFragmentManager(); final DialogFragment dialog = (DialogFragment) fm.findFragmentByTag(AbstractBackgroundTask.PROGRESS_TAG); if (dialog != null) { try { MainActivity.info("fragment from dialog: " + dialog); dialog.dismiss(); } catch ( Exception ex ) { // guess it wasn't there anyways MainActivity.info( "exception dismissing fm dialog: " + ex ); } } final BackgroundAlertDialog alertDialog = BackgroundAlertDialog.newInstance(msg, status); try { alertDialog.show(fm, "background-dialog"); } catch (IllegalStateException ex) { MainActivity.warn("illegal state in background gui handler: " + ex, ex); } } } public static class BackgroundAlertDialog extends DialogFragment { public static BackgroundAlertDialog newInstance( final Message msg, final Status status ) { final BackgroundAlertDialog frag = new BackgroundAlertDialog(); Bundle args = msg.peekData(); args.putInt("title", status.getTitle()); args.putInt("message", status.getMessage()); args.putInt("status", status.ordinal()); frag.setArguments(args); return frag; } @Override @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { final FragmentActivity activity = getActivity(); final AlertDialog.Builder builder = new AlertDialog.Builder( activity ); builder.setCancelable( false ); final Bundle bundle = getArguments(); builder.setTitle( bundle.getInt("title") ); final int message = bundle.getInt("message"); final int status = bundle.getInt("status"); String filename; String filepath = bundle.getString( FILEPATH ); filepath = filepath == null ? "" : filepath + "\n"; filename = bundle.getString( FILENAME ); if ( filename != null ) { // just don't show the gz int index = filename.indexOf( ".gz" ); if ( index > 0 ) { filename = filename.substring( 0, index ); } index = filename.indexOf( ".kml" ); if ( index > 0 ) { filename = filename.substring( 0, index ); } } if ( filename == null ) { filename = ""; } else { filename = "\n\nFile location:\n" + filepath + filename; } String error = bundle.getString( ERROR ); error = error == null ? "" : " Error: " + error; builder.setMessage( activity.getString( message ) + error + filename ); AlertDialog ad = builder.create(); ad.setButton( DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { @Override public void onClick( final DialogInterface dialog, final int which ) { try { dialog.dismiss(); } catch ( Exception ex ) { // guess it wasn't there anyways MainActivity.info( "exception dismissing alert dialog: " + ex ); } if (status == Status.BAD_USERNAME.ordinal() || status == Status.BAD_PASSWORD.ordinal() || status == Status.BAD_LOGIN.ordinal()) { MainActivity.info("dialog: start settings fragment"); try { MainActivity.getMainActivity().selectFragment(MainActivity.SETTINGS_TAB_POS); } catch (Exception ex) { MainActivity.info("failed to start settings fragment: " + ex, ex); } } } }); return ad; } } }