pass through messenger to certify service from ViewKeyActivity

the idea here is to handle progress and result of the CertifyActivity
directly in ViewKeyActivity by passing a messenger through to it. this
allows smoother transition from an uncertified to certified state.
This commit is contained in:
Vincent Breitmoser 2015-02-28 04:28:21 +01:00
parent f3710b12f6
commit 2ae4d6ce05
4 changed files with 85 additions and 47 deletions

View File

@ -17,14 +17,12 @@
package org.sufficientlysecure.keychain.ui; package org.sufficientlysecure.keychain.ui;
import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
public class CertifyFingerprintActivity extends BaseActivity { public class CertifyFingerprintActivity extends BaseActivity {
@ -79,14 +77,4 @@ public class CertifyFingerprintActivity extends BaseActivity {
getSupportFragmentManager().executePendingTransactions(); getSupportFragmentManager().executePendingTransactions();
} }
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// if a result has been returned, display a notify
if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
setResult(RESULT_OK, data);
finish();
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
} }

View File

@ -41,6 +41,8 @@ import org.sufficientlysecure.keychain.util.Log;
public class CertifyFingerprintFragment extends LoaderFragment implements public class CertifyFingerprintFragment extends LoaderFragment implements
LoaderManager.LoaderCallbacks<Cursor> { LoaderManager.LoaderCallbacks<Cursor> {
static final int REQUEST_CERTIFY = 1;
public static final String ARG_DATA_URI = "uri"; public static final String ARG_DATA_URI = "uri";
private TextView mFingerprint; private TextView mFingerprint;
@ -177,8 +179,20 @@ public class CertifyFingerprintFragment extends LoaderFragment implements
Log.e(Constants.TAG, "key not found!", e); Log.e(Constants.TAG, "key not found!", e);
} }
Intent certifyIntent = new Intent(getActivity(), CertifyKeyActivity.class); Intent certifyIntent = new Intent(getActivity(), CertifyKeyActivity.class);
certifyIntent.putExtras(getActivity().getIntent());
certifyIntent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, new long[]{keyId}); certifyIntent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, new long[]{keyId});
startActivityForResult(certifyIntent, 0); startActivityForResult(certifyIntent, REQUEST_CERTIFY);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// always just pass this one through
if (requestCode == REQUEST_CERTIFY) {
getActivity().setResult(resultCode, data);
getActivity().finish();
return;
}
super.onActivityResult(requestCode, resultCode, data);
} }
} }

View File

@ -31,6 +31,7 @@ import android.os.Bundle;
import android.os.Message; import android.os.Message;
import android.os.Messenger; import android.os.Messenger;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable;
import android.support.v4.app.LoaderManager; import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader; import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader; import android.support.v4.content.Loader;
@ -94,6 +95,7 @@ public class CertifyKeyFragment extends LoaderFragment
private static final int INDEX_IS_REVOKED = 4; private static final int INDEX_IS_REVOKED = 4;
private MultiUserIdsAdapter mUserIdsAdapter; private MultiUserIdsAdapter mUserIdsAdapter;
private Messenger mPassthroughMessenger;
@Override @Override
public void onActivityCreated(Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
@ -109,6 +111,9 @@ public class CertifyKeyFragment extends LoaderFragment
return; return;
} }
mPassthroughMessenger = getActivity().getIntent().getParcelableExtra(
KeychainIntentService.EXTRA_MESSENGER);
// preselect certify key id if given // preselect certify key id if given
long certifyKeyId = getActivity().getIntent().getLongExtra(CertifyKeyActivity.EXTRA_CERTIFY_KEY_ID, Constants.key.none); long certifyKeyId = getActivity().getIntent().getLongExtra(CertifyKeyActivity.EXTRA_CERTIFY_KEY_ID, Constants.key.none);
if (certifyKeyId != Constants.key.none) { if (certifyKeyId != Constants.key.none) {
@ -332,7 +337,6 @@ public class CertifyKeyFragment extends LoaderFragment
} }
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) { switch (requestCode) {
@ -362,51 +366,63 @@ public class CertifyKeyFragment extends LoaderFragment
return; return;
} }
Bundle data = new Bundle();
{
// fill values for this action
CertifyActionsParcel parcel = new CertifyActionsParcel(mSignMasterKeyId);
parcel.mCertifyActions.addAll(certifyActions);
data.putParcelable(KeychainIntentService.CERTIFY_PARCEL, parcel);
if (mUploadKeyCheckbox.isChecked()) {
String keyserver = Preferences.getPreferences(getActivity()).getPreferredKeyserver();
data.putString(KeychainIntentService.UPLOAD_KEY_SERVER, keyserver);
}
}
// Send all information needed to service to sign key in other thread // Send all information needed to service to sign key in other thread
Intent intent = new Intent(getActivity(), KeychainIntentService.class); Intent intent = new Intent(getActivity(), KeychainIntentService.class);
intent.setAction(KeychainIntentService.ACTION_CERTIFY_KEYRING); intent.setAction(KeychainIntentService.ACTION_CERTIFY_KEYRING);
// fill values for this action
CertifyActionsParcel parcel = new CertifyActionsParcel(mSignMasterKeyId);
parcel.mCertifyActions.addAll(certifyActions);
Bundle data = new Bundle();
data.putParcelable(KeychainIntentService.CERTIFY_PARCEL, parcel);
if (mUploadKeyCheckbox.isChecked()) {
String keyserver = Preferences.getPreferences(getActivity()).getPreferredKeyserver();
data.putString(KeychainIntentService.UPLOAD_KEY_SERVER, keyserver);
}
intent.putExtra(KeychainIntentService.EXTRA_DATA, data); intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
// Message is received after signing is done in KeychainIntentService if (mPassthroughMessenger != null) {
KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(getActivity(), intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, mPassthroughMessenger);
getString(R.string.progress_certifying), ProgressDialog.STYLE_SPINNER, true) { } else {
public void handleMessage(Message message) {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) { // Message is received after signing is done in KeychainIntentService
Bundle data = message.getData(); KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(getActivity(),
CertifyResult result = data.getParcelable(CertifyResult.EXTRA_RESULT); getString(R.string.progress_certifying), ProgressDialog.STYLE_SPINNER, true) {
public void handleMessage(Message message) {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
Intent intent = new Intent(); if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
intent.putExtra(CertifyResult.EXTRA_RESULT, result); Bundle data = message.getData();
getActivity().setResult(Activity.RESULT_OK, intent); CertifyResult result = data.getParcelable(CertifyResult.EXTRA_RESULT);
getActivity().finish();
Intent intent = new Intent();
intent.putExtra(CertifyResult.EXTRA_RESULT, result);
getActivity().setResult(Activity.RESULT_OK, intent);
getActivity().finish();
}
} }
} };
};
// Create a new Messenger for the communication back // Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler); Messenger messenger = new Messenger(saveHandler);
intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
// show progress dialog // show progress dialog
saveHandler.showProgressDialog(getActivity()); saveHandler.showProgressDialog(getActivity());
}
// start service with intent // start service with intent
getActivity().startService(intent); getActivity().startService(intent);
if (mPassthroughMessenger != null) {
getActivity().setResult(Activity.RESULT_OK);
getActivity().finish();
}
} }
} }

View File

@ -21,11 +21,11 @@ package org.sufficientlysecure.keychain.ui;
import android.animation.ArgbEvaluator; import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ActivityOptions; import android.app.ActivityOptions;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri; import android.net.Uri;
import android.nfc.NdefMessage; import android.nfc.NdefMessage;
import android.nfc.NdefRecord; import android.nfc.NdefRecord;
@ -62,6 +62,7 @@ import com.getbase.floatingactionbutton.FloatingActionButton;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.operations.results.CertifyResult;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.pgp.KeyRing; import org.sufficientlysecure.keychain.pgp.KeyRing;
@ -385,6 +386,25 @@ public class ViewKeyActivity extends BaseActivity implements
private void certifyFingeprint(Uri dataUri) { private void certifyFingeprint(Uri dataUri) {
Intent intent = new Intent(this, CertifyFingerprintActivity.class); Intent intent = new Intent(this, CertifyFingerprintActivity.class);
intent.setData(dataUri); intent.setData(dataUri);
// Message is received after signing is done in KeychainIntentService
KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(this) {
public void handleMessage(Message message) {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
Bundle data = message.getData();
CertifyResult result = data.getParcelable(CertifyResult.EXTRA_RESULT);
result.createNotify(ViewKeyActivity.this).show();
}
}
};
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
startActivityForResult(intent, 0); startActivityForResult(intent, 0);
} }