/*------------------------------------------------------------------------------ ** Ident: Sogeti Smart Mobile Solutions ** Author: rene ** Copyright: (c) Apr 24, 2011 Sogeti Nederland B.V. All Rights Reserved. **------------------------------------------------------------------------------ ** Sogeti Nederland B.V. | No part of this file may be reproduced ** Distributed Software Engineering | or transmitted in any form or by any ** Lange Dreef 17 | means, electronic or mechanical, for the ** 4131 NJ Vianen | purpose, without the express written ** The Netherlands | permission of the copyright holder. *------------------------------------------------------------------------------ * * This file is part of OpenGPSTracker. * * OpenGPSTracker is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenGPSTracker is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenGPSTracker. If not, see <http://www.gnu.org/licenses/>. * */ package nl.sogeti.android.gpstracker.actions; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import nl.sogeti.android.gpstracker.R; import nl.sogeti.android.gpstracker.actions.tasks.GpxCreator; import nl.sogeti.android.gpstracker.actions.tasks.GpxSharing; import nl.sogeti.android.gpstracker.actions.tasks.JogmapSharing; import nl.sogeti.android.gpstracker.actions.tasks.KmzCreator; import nl.sogeti.android.gpstracker.actions.tasks.KmzSharing; import nl.sogeti.android.gpstracker.actions.tasks.OsmSharing; import nl.sogeti.android.gpstracker.actions.utils.ProgressListener; import nl.sogeti.android.gpstracker.actions.utils.StatisticsCalulator; import nl.sogeti.android.gpstracker.actions.utils.StatisticsDelegate; import nl.sogeti.android.gpstracker.adapter.BreadcrumbsAdapter; import nl.sogeti.android.gpstracker.db.GPStracking.Tracks; import nl.sogeti.android.gpstracker.util.Constants; import nl.sogeti.android.gpstracker.util.UnitsI18n; import nl.sogeti.android.gpstracker.viewer.LoggerMap; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.RemoteViews; import android.widget.Spinner; import android.widget.Toast; public class ShareTrack extends Activity implements StatisticsDelegate { private static final String TAG = "OGT.ShareTrack"; private static final int EXPORT_TYPE_KMZ = 0; private static final int EXPORT_TYPE_GPX = 1; private static final int EXPORT_TYPE_TEXTLINE = 2; private static final int EXPORT_TARGET_SAVE = 0; private static final int EXPORT_TARGET_SEND = 1; private static final int EXPORT_TARGET_JOGRUN = 2; private static final int EXPORT_TARGET_OSM = 3; private static final int EXPORT_TARGET_BREADCRUMBS = 4; private static final int EXPORT_TARGET_TWITTER = 0; private static final int EXPORT_TARGET_SMS = 1; private static final int EXPORT_TARGET_TEXT = 2; private static final int PROGRESS_STEPS = 10; private static final int DIALOG_ERROR = Menu.FIRST + 28; private static final int DIALOG_CONNECTBREADCRUMBS = Menu.FIRST + 29; private static final int DESCRIBE = 312; private static File sTempBitmap; private RemoteViews mContentView; private int barProgress = 0; private Notification mNotification; private NotificationManager mNotificationManager; private EditText mFileNameView; private EditText mTweetView; private Spinner mShareTypeSpinner; private Spinner mShareTargetSpinner; private Uri mTrackUri; private OnClickListener mBreadcrumbsDialogListener = new OnClickListener() { public void onClick(DialogInterface dialog, int which) { BreadcrumbsAdapter breadcrumbAdapter = new BreadcrumbsAdapter(ShareTrack.this, null); breadcrumbAdapter.requestBreadcrumbsOauthToken(ShareTrack.this); } }; private String mErrorDialogMessage; private Throwable mErrorDialogException; private ImageView mImageView; private ImageButton mCloseImageView; private Uri mImageUri; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sharedialog); mTrackUri = getIntent().getData(); mFileNameView = (EditText) findViewById(R.id.fileNameField); mTweetView = (EditText) findViewById(R.id.tweetField); mImageView = (ImageView) findViewById(R.id.imageView); mCloseImageView = (ImageButton) findViewById(R.id.closeImageView); mShareTypeSpinner = (Spinner) findViewById(R.id.shareTypeSpinner); ArrayAdapter<CharSequence> shareTypeAdapter = ArrayAdapter.createFromResource(this, R.array.sharetype_choices, android.R.layout.simple_spinner_item); shareTypeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mShareTypeSpinner.setAdapter(shareTypeAdapter); mShareTargetSpinner = (Spinner) findViewById(R.id.shareTargetSpinner); //ArrayAdapter creation and setup is deferred depending on share type selection, see set*ExportTargets methods family mShareTargetSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { // public void onItemSelected(AdapterView<?> parent, // View view, int pos, long id) { public void onItemSelected(AdapterView< ? > arg0, View arg1, int position, long arg3) { //OK, there are two objects at play, first it checks the other spinner 'ShareType', then it checks itself 'ShareTarget' with variable position if (mShareTypeSpinner.getSelectedItemPosition() == EXPORT_TYPE_GPX && position == EXPORT_TARGET_BREADCRUMBS) { BreadcrumbsAdapter breadcrumbAdapter = new BreadcrumbsAdapter(ShareTrack.this, null); boolean authorized = breadcrumbAdapter.connectionSetup(); if (!authorized) { showDialog(DIALOG_CONNECTBREADCRUMBS); } } else if (mShareTypeSpinner.getSelectedItemPosition() == EXPORT_TYPE_TEXTLINE && position != EXPORT_TARGET_SMS ) { readScreenBitmap(); } else { removeScreenBitmap(); } } public void onNothingSelected(AdapterView< ? > arg0) { /* NOOP */ } }); mShareTypeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView< ? > arg0, View arg1, int position, long arg3) { adjustTargetToType(position); } public void onNothingSelected(AdapterView< ? > arg0) { /* NOOP */ } }); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); int lastType = prefs.getInt(Constants.EXPORT_TYPE, EXPORT_TYPE_KMZ); mShareTypeSpinner.setSelection(lastType); adjustTargetToType(lastType); mFileNameView.setText(queryForTrackName(getContentResolver(), mTrackUri)); Button okay = (Button) findViewById(R.id.okayshare_button); okay.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { v.setEnabled(false); share(); } }); Button cancel = (Button) findViewById(R.id.cancelshare_button); cancel.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { v.setEnabled(false); ShareTrack.this.finish(); } }); } @Override protected void onResume() { super.onResume(); // Upgrade from stored OSM username/password to OAuth authorization SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); if (prefs.contains(Constants.OSM_USERNAME) || prefs.contains(Constants.OSM_PASSWORD)) { Editor editor = prefs.edit(); editor.remove(Constants.OSM_USERNAME); editor.remove(Constants.OSM_PASSWORD); editor.commit(); } findViewById(R.id.okayshare_button).setEnabled(true); findViewById(R.id.cancelshare_button).setEnabled(true); } /** * @see android.app.Activity#onCreateDialog(int) */ @Override protected Dialog onCreateDialog(int id) { Dialog dialog = null; Builder builder = null; switch (id) { case DIALOG_ERROR: builder = new AlertDialog.Builder(this); String exceptionMessage = mErrorDialogException == null ? "" : " (" + mErrorDialogException.getMessage() + ") "; builder.setIcon(android.R.drawable.ic_dialog_alert).setTitle(android.R.string.dialog_alert_title) .setMessage(mErrorDialogMessage + exceptionMessage).setNeutralButton(android.R.string.cancel, null); dialog = builder.create(); return dialog; case DIALOG_CONNECTBREADCRUMBS: builder = new AlertDialog.Builder(this); builder.setTitle(R.string.dialog_breadcrumbsconnect).setMessage(R.string.dialog_breadcrumbsconnect_message) .setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton(R.string.btn_okay, mBreadcrumbsDialogListener) .setNegativeButton(R.string.btn_cancel, null); dialog = builder.create(); return dialog; default: return super.onCreateDialog(id); } } /** * @see android.app.Activity#onPrepareDialog(int, android.app.Dialog) */ @Override protected void onPrepareDialog(int id, Dialog dialog) { super.onPrepareDialog(id, dialog); AlertDialog alert; switch (id) { case DIALOG_ERROR: alert = (AlertDialog) dialog; String exceptionMessage = mErrorDialogException == null ? "" : " (" + mErrorDialogException.getMessage() + ") "; alert.setMessage(mErrorDialogMessage + exceptionMessage); break; } } private void setGpxExportTargets() { ArrayAdapter<CharSequence> shareTargetAdapter = ArrayAdapter.createFromResource(this, R.array.sharegpxtarget_choices, android.R.layout.simple_spinner_item); shareTargetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mShareTargetSpinner.setAdapter(shareTargetAdapter); int lastTarget = PreferenceManager.getDefaultSharedPreferences(this).getInt(Constants.EXPORT_GPXTARGET, EXPORT_TARGET_SEND); mShareTargetSpinner.setSelection(lastTarget); removeScreenBitmap(); } private void setKmzExportTargets() { ArrayAdapter<CharSequence> shareTargetAdapter = ArrayAdapter.createFromResource(this, R.array.sharekmztarget_choices, android.R.layout.simple_spinner_item); shareTargetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mShareTargetSpinner.setAdapter(shareTargetAdapter); int lastTarget = PreferenceManager.getDefaultSharedPreferences(this).getInt(Constants.EXPORT_KMZTARGET, EXPORT_TARGET_SEND); mShareTargetSpinner.setSelection(lastTarget); removeScreenBitmap(); } private void setTextLineExportTargets() { ArrayAdapter<CharSequence> shareTargetAdapter = ArrayAdapter.createFromResource(this, R.array.sharetexttarget_choices, android.R.layout.simple_spinner_item); shareTargetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mShareTargetSpinner.setAdapter(shareTargetAdapter); int lastTarget = PreferenceManager.getDefaultSharedPreferences(this).getInt(Constants.EXPORT_TXTTARGET, EXPORT_TARGET_TWITTER); mShareTargetSpinner.setSelection(lastTarget); } private void share() { String chosenFileName = mFileNameView.getText().toString(); String textLine = mTweetView.getText().toString(); //Because code knows layout in advance (ie : in which order selection will be presented in the spinner) int type = (int) mShareTypeSpinner.getSelectedItemId(); int target = (int) mShareTargetSpinner.getSelectedItemId(); Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit(); editor.putInt(Constants.EXPORT_TYPE, type); switch (type) { case EXPORT_TYPE_KMZ: editor.putInt(Constants.EXPORT_KMZTARGET, target); editor.commit(); exportKmz(chosenFileName, target); break; case EXPORT_TYPE_GPX: editor.putInt(Constants.EXPORT_GPXTARGET, target); editor.commit(); exportGpx(chosenFileName, target); break; case EXPORT_TYPE_TEXTLINE: editor.putInt(Constants.EXPORT_TXTTARGET, target); editor.commit(); exportTextLine(textLine, target); break; default: Log.e(TAG, "Failed to determine sharing type" + type); break; } } protected void exportKmz(String chosenFileName, int target) { switch (target) { case EXPORT_TARGET_SEND: new KmzSharing(this, mTrackUri, chosenFileName, new ShareProgressListener(chosenFileName)).execute(); break; case EXPORT_TARGET_SAVE: new KmzCreator(this, mTrackUri, chosenFileName, new ShareProgressListener(chosenFileName)).execute(); break; default: Log.e(TAG, "Unable to determine target for sharing KMZ " + target); break; } ShareTrack.this.finish(); } protected void exportGpx(String chosenFileName, int target) { switch (target) { case EXPORT_TARGET_SAVE: new GpxCreator(this, mTrackUri, chosenFileName, true, new ShareProgressListener(chosenFileName)).execute(); ShareTrack.this.finish(); break; case EXPORT_TARGET_SEND: new GpxSharing(this, mTrackUri, chosenFileName, true, new ShareProgressListener(chosenFileName)).execute(); ShareTrack.this.finish(); break; case EXPORT_TARGET_JOGRUN: new JogmapSharing(this, mTrackUri, chosenFileName, false, new ShareProgressListener(chosenFileName)).execute(); ShareTrack.this.finish(); break; case EXPORT_TARGET_OSM: new OsmSharing(this, mTrackUri, false, new ShareProgressListener(OsmSharing.OSM_FILENAME)).execute(); ShareTrack.this.finish(); break; case EXPORT_TARGET_BREADCRUMBS: sendToBreadcrumbs(mTrackUri, chosenFileName); break; default: Log.e(TAG, "Unable to determine target for sharing GPX " + target); break; } } protected void exportTextLine(String message, int target) { String subject = "Open GPS Tracker"; switch (target) { case EXPORT_TARGET_TWITTER: sendTweet(message); break; case EXPORT_TARGET_SMS: sendSMS(message); ShareTrack.this.finish(); break; case EXPORT_TARGET_TEXT: sentGenericText(subject, message); ShareTrack.this.finish(); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_CANCELED) { String name; switch (requestCode) { case DESCRIBE: Uri trackUri = data.getData(); if (data.getExtras() != null && data.getExtras().containsKey(Constants.NAME)) { name = data.getExtras().getString(Constants.NAME); } else { name = "shareToGobreadcrumbs"; } BreadcrumbsAdapter adapter = new BreadcrumbsAdapter(this, null); adapter.startUploadTask(this, new ShareProgressListener(name), trackUri, name); finish(); break; default: super.onActivityResult(requestCode, resultCode, data); break; } } } private void sendTweet(String tweet) { final Intent intent = findTwitterClient(); intent.putExtra(Intent.EXTRA_TEXT, tweet); if (mImageUri != null) { intent.putExtra(Intent.EXTRA_STREAM, mImageUri); } startActivity(intent); ShareTrack.this.finish(); } private void sendSMS(String msg) { final Intent intent = new Intent(Intent.ACTION_VIEW); intent.setType("vnd.android-dir/mms-sms"); intent.putExtra("sms_body", msg); startActivity(intent); } private void sentGenericText(String subject, String msg) { final Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_TEXT, msg); if (mImageUri != null) { intent.putExtra(Intent.EXTRA_STREAM, mImageUri); } startActivity(intent); } private void sendToBreadcrumbs(Uri mTrackUri, String chosenFileName) { // Start a description of the track Intent namingIntent = new Intent(this, DescribeTrack.class); namingIntent.setData(mTrackUri); namingIntent.putExtra(Constants.NAME, chosenFileName); startActivityForResult(namingIntent, DESCRIBE); } private Intent findTwitterClient() { final String[] twitterApps = { // package // name "com.twitter.android", // official "com.twidroid", // twidroyd "com.handmark.tweetcaster", // Tweecaster "com.thedeck.android" // TweetDeck }; Intent tweetIntent = new Intent(Intent.ACTION_SEND); tweetIntent.setType("text/plain"); final PackageManager packageManager = getPackageManager(); List<ResolveInfo> list = packageManager.queryIntentActivities(tweetIntent, PackageManager.MATCH_DEFAULT_ONLY); for (int i = 0; i < twitterApps.length; i++) { for (ResolveInfo resolveInfo : list) { String p = resolveInfo.activityInfo.packageName; if (p != null && p.startsWith(twitterApps[i])) { tweetIntent.setPackage(p); } } } return tweetIntent; } private void createTweetText() { StatisticsCalulator calculator = new StatisticsCalulator(this, new UnitsI18n(this), this); findViewById(R.id.tweet_progress).setVisibility(View.VISIBLE); calculator.execute(mTrackUri); } public void finishedCalculations(StatisticsCalulator calculated) { String name = queryForTrackName(getContentResolver(), mTrackUri); String distString = calculated.getDistanceText(); String avgSpeed = calculated.getAvgSpeedText(); String duration = calculated.getDurationText(); String tweetText = String.format(getString(R.string.tweettext, name, distString, avgSpeed, duration)); if (mTweetView.getText().toString().equals("")) { mTweetView.setText(tweetText); } findViewById(R.id.tweet_progress).setVisibility(View.GONE); } private void adjustTargetToType(int position) { switch (position) { case EXPORT_TYPE_KMZ: setKmzExportTargets(); mFileNameView.setVisibility(View.VISIBLE); mTweetView.setVisibility(View.GONE); break; case EXPORT_TYPE_GPX: setGpxExportTargets(); mFileNameView.setVisibility(View.VISIBLE); mTweetView.setVisibility(View.GONE); break; case EXPORT_TYPE_TEXTLINE: setTextLineExportTargets(); mFileNameView.setVisibility(View.GONE); mTweetView.setVisibility(View.VISIBLE); createTweetText(); break; default: break; } } public static void sendFile(Context context, Uri fileUri, String fileContentType, String body) { Intent sendActionIntent = new Intent(Intent.ACTION_SEND); sendActionIntent.putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.email_subject)); sendActionIntent.putExtra(Intent.EXTRA_TEXT, body); sendActionIntent.putExtra(Intent.EXTRA_STREAM, fileUri); sendActionIntent.setType(fileContentType); context.startActivity(Intent.createChooser(sendActionIntent, context.getString(R.string.sender_chooser))); } public static String queryForTrackName(ContentResolver resolver, Uri trackUri) { Cursor trackCursor = null; String name = null; try { trackCursor = resolver.query(trackUri, new String[] { Tracks.NAME }, null, null, null); if (trackCursor.moveToFirst()) { name = trackCursor.getString(0); } } finally { if (trackCursor != null) { trackCursor.close(); } } return name; } public class ShareProgressListener implements ProgressListener { private String mFileName; private int mProgress; public ShareProgressListener(String sharename) { mFileName = sharename; } public void startNotification() { String ns = Context.NOTIFICATION_SERVICE; mNotificationManager = (NotificationManager) ShareTrack.this.getSystemService(ns); int icon = android.R.drawable.ic_menu_save; CharSequence tickerText = getString(R.string.ticker_saving) + "\"" + mFileName + "\""; mNotification = new Notification(); PendingIntent contentIntent = PendingIntent.getActivity(ShareTrack.this, 0, new Intent(ShareTrack.this, LoggerMap.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), PendingIntent.FLAG_UPDATE_CURRENT); mNotification.contentIntent = contentIntent; mNotification.tickerText = tickerText; mNotification.icon = icon; mNotification.flags |= Notification.FLAG_ONGOING_EVENT; mContentView = new RemoteViews(getPackageName(), R.layout.savenotificationprogress); mContentView.setImageViewResource(R.id.icon, icon); mContentView.setTextViewText(R.id.progresstext, tickerText); mNotification.contentView = mContentView; } private void updateNotification() { // Log.d( "TAG", "Progress " + progress + " of " + goal ); if (mProgress > 0 && mProgress < Window.PROGRESS_END) { if ((mProgress * PROGRESS_STEPS) / Window.PROGRESS_END != barProgress) { barProgress = (mProgress * PROGRESS_STEPS) / Window.PROGRESS_END; mContentView.setProgressBar(R.id.progress, Window.PROGRESS_END, mProgress, false); mNotificationManager.notify(R.layout.savenotificationprogress, mNotification); } } else if (mProgress == 0) { mContentView.setProgressBar(R.id.progress, Window.PROGRESS_END, mProgress, true); mNotificationManager.notify(R.layout.savenotificationprogress, mNotification); } else if (mProgress >= Window.PROGRESS_END) { mContentView.setProgressBar(R.id.progress, Window.PROGRESS_END, mProgress, false); mNotificationManager.notify(R.layout.savenotificationprogress, mNotification); } } public void endNotification(Uri file) { mNotificationManager.cancel(R.layout.savenotificationprogress); } public void setIndeterminate(boolean indeterminate) { Log.w(TAG, "Unsupported indeterminate progress display"); } public void started() { startNotification(); } public void setProgress(int value) { mProgress = value; updateNotification(); } public void finished(Uri result) { endNotification(result); } public void showError(String task, String errorDialogMessage, Exception errorDialogException) { endNotification(null); mErrorDialogMessage = errorDialogMessage; mErrorDialogException = errorDialogException; if (!isFinishing()) { showDialog(DIALOG_ERROR); } else { Toast toast = Toast.makeText(ShareTrack.this, errorDialogMessage, Toast.LENGTH_LONG); toast.show(); } } } public static Uri storeScreenBitmap(Bitmap bm) { Uri fileUri = null; FileOutputStream stream = null; try { clearScreenBitmap(); sTempBitmap = File.createTempFile("shareimage", ".png"); fileUri = Uri.fromFile(sTempBitmap); stream = new FileOutputStream(sTempBitmap); bm.compress(CompressFormat.PNG, 100, stream); } catch (IOException e) { Log.e(TAG, "Bitmap extra storing failed", e); } finally { try { if (stream != null) { stream.close(); } } catch (IOException e) { Log.e(TAG, "Bitmap extra close failed", e); } } return fileUri; } public static void clearScreenBitmap() { if( sTempBitmap != null && sTempBitmap.exists() ) { sTempBitmap.delete(); sTempBitmap = null; } } private void readScreenBitmap() { mImageView.setVisibility(View.GONE); mCloseImageView.setVisibility(View.GONE); if (getIntent().getExtras() != null && getIntent().hasExtra(Intent.EXTRA_STREAM)) { mImageUri = getIntent().getExtras().getParcelable(Intent.EXTRA_STREAM); if( mImageUri != null ) { InputStream is = null; try { is = getContentResolver().openInputStream(mImageUri); mImageView.setImageBitmap(BitmapFactory.decodeStream(is)); mImageView.setVisibility(View.VISIBLE); mCloseImageView.setVisibility(View.VISIBLE); mCloseImageView.setOnClickListener( new View.OnClickListener() { public void onClick(View v) { removeScreenBitmap(); } }); } catch (FileNotFoundException e) { Log.e(TAG, "Failed reading image from file", e); } finally { if (is != null) { try { is.close(); } catch (IOException e) { Log.e(TAG, "Failed close image from file", e); } } } } } } private void removeScreenBitmap() { mImageView.setVisibility(View.GONE); mCloseImageView.setVisibility(View.GONE); mImageUri = null; } }