diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java index c3320ed6a..964c535dd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java @@ -120,10 +120,12 @@ public class PgpImportExport { // If there aren't even any keys, do nothing here. if (entries == null || !entries.hasNext()) { return new ImportKeyResult( - ImportKeyResult.RESULT_FAIL_NOTHING, mProviderHelper.getLog(), 0, 0, 0, 0); + ImportKeyResult.RESULT_FAIL_NOTHING, mProviderHelper.getLog(), 0, 0, 0, 0, + new long[]{}); } int newKeys = 0, oldKeys = 0, badKeys = 0, secret = 0; + ArrayList importedMasterKeyIds = new ArrayList(); int position = 0; double progSteps = 100.0 / num; @@ -165,11 +167,13 @@ public class PgpImportExport { badKeys += 1; } else if (result.updated()) { oldKeys += 1; + importedMasterKeyIds.add(key.getMasterKeyId()); } else { newKeys += 1; if (key.isSecret()) { secret += 1; } + importedMasterKeyIds.add(key.getMasterKeyId()); } } catch (IOException e) { @@ -210,8 +214,14 @@ public class PgpImportExport { resultType |= ImportKeyResult.RESULT_CANCELLED; } - return new ImportKeyResult(resultType, log, newKeys, oldKeys, badKeys, secret); + // convert to long array + long[] importedMasterKeyIdsArray = new long[importedMasterKeyIds.size()]; + for (int i = 0; i < importedMasterKeyIds.size(); ++i) { + importedMasterKeyIdsArray[i] = importedMasterKeyIds.get(i); + } + return new ImportKeyResult(resultType, log, newKeys, oldKeys, badKeys, secret, + importedMasterKeyIdsArray); } public Bundle exportKeyRings(ArrayList publicKeyRingMasterIds, diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/results/ImportKeyResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/results/ImportKeyResult.java index fa0dc6af3..0d71af876 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/results/ImportKeyResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/results/ImportKeyResult.java @@ -37,6 +37,7 @@ import org.sufficientlysecure.keychain.ui.LogDisplayFragment; public class ImportKeyResult extends OperationResult { public final int mNewKeys, mUpdatedKeys, mBadKeys, mSecret; + public final long[] mImportedMasterKeyIds; // At least one new key public static final int RESULT_OK_NEWKEYS = 8; @@ -69,21 +70,28 @@ public class ImportKeyResult extends OperationResult { return (mResult & RESULT_FAIL_NOTHING) == RESULT_FAIL_NOTHING; } + public long[] getImportedMasterKeyIds() { + return mImportedMasterKeyIds; + } + public ImportKeyResult(Parcel source) { super(source); mNewKeys = source.readInt(); mUpdatedKeys = source.readInt(); mBadKeys = source.readInt(); mSecret = source.readInt(); + mImportedMasterKeyIds = source.createLongArray(); } public ImportKeyResult(int result, OperationLog log, - int newKeys, int updatedKeys, int badKeys, int secret) { + int newKeys, int updatedKeys, int badKeys, int secret, + long[] importedMasterKeyIds) { super(result, log); mNewKeys = newKeys; mUpdatedKeys = updatedKeys; mBadKeys = badKeys; mSecret = secret; + mImportedMasterKeyIds = importedMasterKeyIds; } @Override @@ -93,6 +101,7 @@ public class ImportKeyResult extends OperationResult { dest.writeInt(mUpdatedKeys); dest.writeInt(mBadKeys); dest.writeInt(mSecret); + dest.writeLongArray(mImportedMasterKeyIds); } public static Creator CREATOR = new Creator() { @@ -162,8 +171,8 @@ public class ImportKeyResult extends OperationResult { color = Style.RED; if (isFailNothing()) { str = activity.getString((resultType & ImportKeyResult.RESULT_CANCELLED) > 0 - ? R.string.import_error_nothing_cancelled - : R.string.import_error_nothing); + ? R.string.import_error_nothing_cancelled + : R.string.import_error_nothing); } else { str = activity.getResources().getQuantityString(R.plurals.import_error, mBadKeys); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/AddKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/AddKeysActivity.java index 2dc6cc7ee..436ed050f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/AddKeysActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/AddKeysActivity.java @@ -74,6 +74,7 @@ public class AddKeysActivity extends ActionBarActivity implements View mActionSafeSlinger; ImageView mActionSafeSlingerIcon; View mActionQrCode; + View mActionNfc; View mActionSearchCloud; ProviderHelper mProviderHelper; @@ -103,6 +104,7 @@ public class AddKeysActivity extends ActionBarActivity implements mActionSafeSlingerIcon.setColorFilter(getResources().getColor(R.color.tertiary_text_light), PorterDuff.Mode.SRC_IN); mActionQrCode = findViewById(R.id.add_keys_qr_code); + mActionNfc = findViewById(R.id.add_keys_nfc); mActionSearchCloud = findViewById(R.id.add_keys_search_cloud); mSafeSlingerKeySpinner.setOnKeyChangedListener(new KeySpinner.OnKeyChangedListener() { @@ -126,6 +128,16 @@ public class AddKeysActivity extends ActionBarActivity implements } }); + mActionNfc.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // show nfc help + Intent intent = new Intent(AddKeysActivity.this, HelpActivity.class); + intent.putExtra(HelpActivity.EXTRA_SELECTED_TAB, HelpActivity.TAB_NFC); + startActivityForResult(intent, 0); + } + }); + mActionSearchCloud.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -183,8 +195,7 @@ public class AddKeysActivity extends ActionBarActivity implements getSupportLoaderManager().restartLoader(LOADER_ID_BYTES, null, this); break; case ExchangeActivity.RESULT_EXCHANGE_CANCELED: - // handle canceled result - // ... + // do nothing break; } break; @@ -291,29 +302,13 @@ public class AddKeysActivity extends ActionBarActivity implements } @Override - public void onLoadFinished(Loader>> loader, AsyncTaskResultWrapper> data) { - + public void onLoadFinished(Loader>> loader, + AsyncTaskResultWrapper> data) { Log.d(Constants.TAG, "data: " + data.getResult()); - // swap in the real data! -// mAdapter.setData(data.getResult()); -// mAdapter.notifyDataSetChanged(); -// -// setListAdapter(mAdapter); -// -// // The list should now be shown. -// if (isResumed()) { -// setListShown(true); -// } else { -// setListShownNoAnimation(true); -// } - Exception error = data.getError(); - // free old cached key data -// mCachedKeyData = null; - LongSparseArray mCachedKeyData = null; - + LongSparseArray cachedKeyData = null; // TODO: Use parcels!!!!!!!!!!!!!!! switch (loader.getId()) { @@ -321,8 +316,8 @@ public class AddKeysActivity extends ActionBarActivity implements if (error == null) { // No error - mCachedKeyData = ((ImportKeysListLoader) loader).getParcelableRings(); - Log.d(Constants.TAG, "no error!:" + mCachedKeyData); + cachedKeyData = ((ImportKeysListLoader) loader).getParcelableRings(); + Log.d(Constants.TAG, "no error!:" + cachedKeyData); } else if (error instanceof ImportKeysListLoader.NoValidKeysException) { Notify.showNotify(this, R.string.error_import_no_valid_keys, Notify.Style.ERROR); @@ -361,7 +356,7 @@ public class AddKeysActivity extends ActionBarActivity implements break; } - importKeys(mCachedKeyData); + importKeys(cachedKeyData); } @Override @@ -434,21 +429,11 @@ public class AddKeysActivity extends ActionBarActivity implements return; } - // TODO: start certify with received keys - -// if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT.equals(getIntent().getAction()) -// || ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN.equals(getIntent().getAction())) { -// Intent intent = new Intent(); -// intent.putExtra(ImportKeyResult.EXTRA_RESULT, result); -// ImportKeysActivity.this.setResult(RESULT_OK, intent); -// ImportKeysActivity.this.finish(); -// return; -// } -// if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_TO_SERVICE.equals(getIntent().getAction())) { -// ImportKeysActivity.this.setResult(RESULT_OK, mPendingIntentData); -// ImportKeysActivity.this.finish(); -// return; -// } + finish(); + Intent certifyIntent = new Intent(); // TODO: certify + certifyIntent.putExtra(ImportKeyResult.EXTRA_RESULT, result); + certifyIntent.putExtra("key ids", result.getImportedMasterKeyIds()); // TODO: extra + startActivity(certifyIntent); result.createNotify(AddKeysActivity.this).show(); } diff --git a/OpenKeychain/src/main/res/layout/add_key_activity.xml b/OpenKeychain/src/main/res/layout/add_key_activity.xml index 624ef9ed4..548d1224e 100644 --- a/OpenKeychain/src/main/res/layout/add_key_activity.xml +++ b/OpenKeychain/src/main/res/layout/add_key_activity.xml @@ -21,7 +21,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:text="Secure Exchange" /> + android:text="@string/add_keys_section_secure_exchange" /> @@ -87,7 +87,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="32dp" - android:text="Secure add" /> + android:text="@string/add_keys_section_secure_add" /> + + + + + android:text="@string/add_keys_section_import" /> diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index ac2be23fa..ac594065f 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -284,6 +284,17 @@ "Successfully decrypted and valid signature (uncertified)" "Successfully decrypted and valid signature (certified)" + + "Secure Exchange" + "Secure Add" + "Import (untrusted)" + "My key:" + "Start exchange" + "Scan QR Code" + "Receive via NFC" + "Search cloud" + + "Done." "Cancel"