fix bad crashes

This commit is contained in:
Dominik Schürmann 2014-01-09 23:13:23 +01:00
parent bb161d5fa9
commit 37fd7dbbc7
6 changed files with 80 additions and 251 deletions

View File

@ -71,9 +71,6 @@ public class DrawerActivity extends SherlockFragmentActivity {
// set a custom shadow that overlays the main content when the drawer // set a custom shadow that overlays the main content when the drawer
// opens // opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view with items and click listener
// mDrawerList
// .setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mItemsText));
NavItem mItemIconTexts[] = new NavItem[] { NavItem mItemIconTexts[] = new NavItem[] {
new NavItem("fa-user", getString(R.string.nav_contacts)), new NavItem("fa-user", getString(R.string.nav_contacts)),
@ -90,13 +87,6 @@ public class DrawerActivity extends SherlockFragmentActivity {
mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
// <com.beardedhen.androidbootstrap.FontAwesomeText
// android:layout_width="wrap_content"
// android:layout_height="wrap_content"
// android:layout_margin="10dp"
// android:textSize="32sp"
// fontawesometext:fa_icon="fa-github" />
// enable ActionBar app icon to behave as action to toggle nav drawer // enable ActionBar app icon to behave as action to toggle nav drawer
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setHomeButtonEnabled(true);

View File

@ -27,6 +27,7 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.Id; import org.sufficientlysecure.keychain.Id;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.ActionBarHelper; import org.sufficientlysecure.keychain.helper.ActionBarHelper;
import org.sufficientlysecure.keychain.helper.ExportHelper;
import org.sufficientlysecure.keychain.pgp.PgpConversionHelper; import org.sufficientlysecure.keychain.pgp.PgpConversionHelper;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
@ -61,11 +62,12 @@ import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.Toast; import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.MenuItem;
import com.beardedhen.androidbootstrap.BootstrapButton; import com.beardedhen.androidbootstrap.BootstrapButton;
public class EditKeyActivity extends KeyActivity { public class EditKeyActivity extends SherlockFragmentActivity {
// Actions for internal use only: // Actions for internal use only:
public static final String ACTION_CREATE_KEY = Constants.INTENT_PREFIX + "CREATE_KEY"; public static final String ACTION_CREATE_KEY = Constants.INTENT_PREFIX + "CREATE_KEY";
@ -100,10 +102,14 @@ public class EditKeyActivity extends KeyActivity {
Vector<Integer> mKeysUsages; Vector<Integer> mKeysUsages;
boolean masterCanSign = true; boolean masterCanSign = true;
ExportHelper mExportHelper;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mExportHelper = new ExportHelper(this);
mUserIds = new Vector<String>(); mUserIds = new Vector<String>();
mKeys = new Vector<PGPSecretKey>(); mKeys = new Vector<PGPSecretKey>();
mKeysUsages = new Vector<Integer>(); mKeysUsages = new Vector<Integer>();
@ -322,7 +328,7 @@ public class EditKeyActivity extends KeyActivity {
cancelClicked(); cancelClicked();
return true; return true;
case R.id.menu_key_edit_export_file: case R.id.menu_key_edit_export_file:
showExportKeysDialog(mDataUri, Id.type.secret_key, Constants.path.APP_DIR mExportHelper.showExportKeysDialog(mDataUri, Id.type.secret_key, Constants.path.APP_DIR
+ "/secexport.asc"); + "/secexport.asc");
return true; return true;
case R.id.menu_key_edit_delete: { case R.id.menu_key_edit_delete: {
@ -337,7 +343,7 @@ public class EditKeyActivity extends KeyActivity {
} }
}; };
deleteKey(mDataUri, Id.type.secret_key, returnHandler); mExportHelper.deleteKey(mDataUri, Id.type.secret_key, returnHandler);
return true; return true;
} }
} }
@ -656,4 +662,11 @@ public class EditKeyActivity extends KeyActivity {
mChangePassPhrase.setText(isPassphraseSet() ? getString(R.string.btn_change_passphrase) mChangePassPhrase.setText(isPassphraseSet() ? getString(R.string.btn_change_passphrase)
: getString(R.string.btn_set_passphrase)); : getString(R.string.btn_set_passphrase));
} }
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!mExportHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
}
} }

View File

@ -1,208 +0,0 @@
/*
* Copyright (C) 2013-2014 Dominik Schürmann <dominik@dominikschuermann.de>
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.sufficientlysecure.keychain.ui;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.Id;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
import org.sufficientlysecure.keychain.ui.dialog.FileDialogFragment;
import org.sufficientlysecure.keychain.util.Log;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.widget.Toast;
/**
* This implements export key method and delete key method. Used in lists and key view and key edit.
*
* TODO: get key type by looking at dataUri!
*
*/
public class KeyActivity extends DrawerActivity {
protected FileDialogFragment mFileDialog;
protected String mExportFilename;
protected void deleteKey(Uri dataUri, final int keyType, Handler deleteHandler) {
long keyRingRowId = Long.valueOf(dataUri.getLastPathSegment());
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(deleteHandler);
DeleteKeyDialogFragment deleteKeyDialog = DeleteKeyDialogFragment.newInstance(messenger,
new long[] { keyRingRowId }, keyType);
deleteKeyDialog.show(getSupportFragmentManager(), "deleteKeyDialog");
}
/**
* Show dialog where to export keys
*
* @param keyRingMasterKeyId
* if -1 export all keys
*/
public void showExportKeysDialog(final Uri dataUri, final int keyType,
final String exportFilename) {
mExportFilename = exportFilename;
// Message is received after file is selected
Handler returnHandler = new Handler() {
@Override
public void handleMessage(Message message) {
if (message.what == FileDialogFragment.MESSAGE_OKAY) {
Bundle data = message.getData();
mExportFilename = data.getString(FileDialogFragment.MESSAGE_DATA_FILENAME);
long keyRingRowId = Long.valueOf(dataUri.getLastPathSegment());
// TODO?
long keyRingMasterKeyId = ProviderHelper.getSecretMasterKeyId(KeyActivity.this,
keyRingRowId);
exportKeys(keyRingMasterKeyId, keyType);
}
}
};
// Create a new Messenger for the communication back
final Messenger messenger = new Messenger(returnHandler);
DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() {
public void run() {
String title = null;
if (dataUri != null) {
// single key export
title = getString(R.string.title_export_key);
} else {
title = getString(R.string.title_export_keys);
}
String message = null;
if (keyType == Id.type.public_key) {
message = getString(R.string.specify_file_to_export_to);
} else {
message = getString(R.string.specify_file_to_export_secret_keys_to);
}
mFileDialog = FileDialogFragment.newInstance(messenger, title, message,
exportFilename, null, Id.request.filename);
mFileDialog.show(getSupportFragmentManager(), "fileDialog");
}
});
}
/**
* Export keys
*
* @param keyRingMasterKeyId
* if -1 export all keys
*/
public void exportKeys(long keyRingMasterKeyId, int keyType) {
Log.d(Constants.TAG, "exportKeys started");
// Send all information needed to service to export key in other thread
Intent intent = new Intent(this, KeychainIntentService.class);
intent.setAction(KeychainIntentService.ACTION_EXPORT_KEYRING);
// fill values for this action
Bundle data = new Bundle();
data.putString(KeychainIntentService.EXPORT_FILENAME, mExportFilename);
data.putInt(KeychainIntentService.EXPORT_KEY_TYPE, keyType);
if (keyRingMasterKeyId == -1) {
data.putBoolean(KeychainIntentService.EXPORT_ALL, true);
} else {
data.putLong(KeychainIntentService.EXPORT_KEY_RING_MASTER_KEY_ID, keyRingMasterKeyId);
}
intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
// Message is received after exporting is done in ApgService
KeychainIntentServiceHandler exportHandler = new KeychainIntentServiceHandler(this,
R.string.progress_exporting, ProgressDialog.STYLE_HORIZONTAL) {
public void handleMessage(Message message) {
// handle messages by standard ApgHandler first
super.handleMessage(message);
if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
// get returned data bundle
Bundle returnData = message.getData();
int exported = returnData.getInt(KeychainIntentService.RESULT_EXPORT);
String toastMessage;
if (exported == 1) {
toastMessage = getString(R.string.key_exported);
} else if (exported > 0) {
toastMessage = getString(R.string.keys_exported, exported);
} else {
toastMessage = getString(R.string.no_keys_exported);
}
Toast.makeText(KeyActivity.this, toastMessage, Toast.LENGTH_SHORT).show();
}
};
};
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(exportHandler);
intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog
exportHandler.showProgressDialog(this);
// start service with intent
startService(intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case Id.request.filename: {
if (resultCode == RESULT_OK && data != null) {
try {
String path = data.getData().getPath();
Log.d(Constants.TAG, "path=" + path);
// set filename used in export/import dialogs
mFileDialog.setFilename(path);
} catch (NullPointerException e) {
Log.e(Constants.TAG, "Nullpointer while retrieving path!", e);
}
}
return;
}
default: {
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}

View File

@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.ui;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.Id; import org.sufficientlysecure.keychain.Id;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.ExportHelper;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@ -27,12 +28,16 @@ import android.os.Bundle;
import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.MenuItem;
public class KeyListPublicActivity extends KeyActivity { public class KeyListPublicActivity extends DrawerActivity {
ExportHelper mExportHelper;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mExportHelper = new ExportHelper(this);
setContentView(R.layout.key_list_public_activity); setContentView(R.layout.key_list_public_activity);
// now setup navigation drawer in DrawerActivity... // now setup navigation drawer in DrawerActivity...
@ -55,7 +60,7 @@ public class KeyListPublicActivity extends KeyActivity {
return true; return true;
case R.id.menu_key_list_public_export: case R.id.menu_key_list_public_export:
showExportKeysDialog(null, Id.type.public_key, Constants.path.APP_DIR mExportHelper.showExportKeysDialog(null, Id.type.public_key, Constants.path.APP_DIR
+ "/pubexport.asc"); + "/pubexport.asc");
return true; return true;
@ -64,8 +69,11 @@ public class KeyListPublicActivity extends KeyActivity {
} }
} }
// @Override @Override
// protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!mExportHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
// switch (requestCode) { // switch (requestCode) {
// case Id.request.look_up_key_id: { // case Id.request.look_up_key_id: {
// if (resultCode == RESULT_CANCELED || data == null // if (resultCode == RESULT_CANCELED || data == null
@ -86,5 +94,5 @@ public class KeyListPublicActivity extends KeyActivity {
// break; // break;
// } // }
// } // }
// } }
} }

View File

@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.ui;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.Id; import org.sufficientlysecure.keychain.Id;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.helper.ExportHelper;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@ -27,12 +28,16 @@ import android.os.Bundle;
import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.MenuItem;
public class KeyListSecretActivity extends KeyActivity { public class KeyListSecretActivity extends DrawerActivity {
ExportHelper mExportHelper;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mExportHelper = new ExportHelper(this);
setContentView(R.layout.key_list_secret_activity); setContentView(R.layout.key_list_secret_activity);
// now setup navigation drawer in DrawerActivity... // now setup navigation drawer in DrawerActivity...
@ -58,7 +63,7 @@ public class KeyListSecretActivity extends KeyActivity {
return true; return true;
case R.id.menu_key_list_secret_export: case R.id.menu_key_list_secret_export:
showExportKeysDialog(null, Id.type.secret_key, Constants.path.APP_DIR mExportHelper.showExportKeysDialog(null, Id.type.secret_key, Constants.path.APP_DIR
+ "/secexport.asc"); + "/secexport.asc");
return true; return true;
@ -86,4 +91,11 @@ public class KeyListSecretActivity extends KeyActivity {
startActivityForResult(intent, 0); startActivityForResult(intent, 0);
} }
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!mExportHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
}
} }

View File

@ -29,6 +29,7 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.Id; import org.sufficientlysecure.keychain.Id;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection; import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
import org.sufficientlysecure.keychain.helper.ExportHelper;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment; import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
@ -55,13 +56,17 @@ import android.view.View.OnClickListener;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.MenuItem;
import com.beardedhen.androidbootstrap.BootstrapButton; import com.beardedhen.androidbootstrap.BootstrapButton;
@SuppressLint("NewApi") @SuppressLint("NewApi")
public class KeyViewActivity extends KeyActivity implements CreateNdefMessageCallback, public class KeyViewActivity extends SherlockFragmentActivity implements CreateNdefMessageCallback,
OnNdefPushCompleteCallback { OnNdefPushCompleteCallback {
ExportHelper mExportHelper;
private Uri mDataUri; private Uri mDataUri;
private PGPPublicKey mPublicKey; private PGPPublicKey mPublicKey;
@ -81,6 +86,8 @@ public class KeyViewActivity extends KeyActivity implements CreateNdefMessageCal
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mExportHelper = new ExportHelper(this);
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setHomeButtonEnabled(true);
@ -125,7 +132,7 @@ public class KeyViewActivity extends KeyActivity implements CreateNdefMessageCal
uploadToKeyserver(mDataUri); uploadToKeyserver(mDataUri);
return true; return true;
case R.id.menu_key_view_export_file: case R.id.menu_key_view_export_file:
showExportKeysDialog(mDataUri, Id.type.public_key, Constants.path.APP_DIR mExportHelper.showExportKeysDialog(mDataUri, Id.type.public_key, Constants.path.APP_DIR
+ "/pubexport.asc"); + "/pubexport.asc");
return true; return true;
case R.id.menu_key_view_share_default: case R.id.menu_key_view_share_default:
@ -152,7 +159,7 @@ public class KeyViewActivity extends KeyActivity implements CreateNdefMessageCal
} }
}; };
deleteKey(mDataUri, Id.type.public_key, returnHandler); mExportHelper.deleteKey(mDataUri, Id.type.public_key, returnHandler);
return true; return true;
} }
} }
@ -373,4 +380,11 @@ public class KeyViewActivity extends KeyActivity implements CreateNdefMessageCal
} }
}; };
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!mExportHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
}
} }