diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml
index 6b7677a14..51ce60576 100644
--- a/OpenKeychain/src/main/AndroidManifest.xml
+++ b/OpenKeychain/src/main/AndroidManifest.xml
@@ -929,6 +929,10 @@
android:configChanges="keyboardHidden|keyboard"
android:label="@string/title_backup" />
+
+
.
+ */
+
+package org.sufficientlysecure.keychain.remote.ui;
+
+
+import java.nio.CharBuffer;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.FragmentActivity;
+import android.view.ContextThemeWrapper;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder;
+import org.sufficientlysecure.keychain.ui.util.ThemeChanger;
+import org.sufficientlysecure.keychain.ui.widget.PrefixedEditText;
+import org.sufficientlysecure.keychain.util.Numeric9x4PassphraseUtil;
+import org.sufficientlysecure.keychain.util.Passphrase;
+
+
+public class RemoteDisplayTransferCodeActivity extends FragmentActivity {
+ public static final String EXTRA_TRANSFER_CODE = "transfer_code";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (savedInstanceState == null) {
+ DisplayTransferCodeDialogFragment frag = new DisplayTransferCodeDialogFragment();
+ frag.setArguments(getIntent().getExtras());
+ frag.show(getSupportFragmentManager(), "displayTransferCode");
+ }
+ }
+
+ public static class DisplayTransferCodeDialogFragment extends DialogFragment {
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ final Activity activity = getActivity();
+
+ Passphrase transferCode = getArguments().getParcelable(EXTRA_TRANSFER_CODE);
+
+ ContextThemeWrapper theme = ThemeChanger.getDialogThemeWrapper(activity);
+ CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(theme);
+
+ @SuppressLint("InflateParams")
+ View view = LayoutInflater.from(theme).inflate(R.layout.api_display_transfer_code, null, false);
+ alert.setView(view);
+ alert.setPositiveButton(R.string.button_got_it, (dialog, which) -> dismiss());
+
+ TextView[] transferCodeTextViews = new TextView[9];
+ transferCodeTextViews[0] = view.findViewById(R.id.transfer_code_block_1);
+ transferCodeTextViews[1] = view.findViewById(R.id.transfer_code_block_2);
+ transferCodeTextViews[2] = view.findViewById(R.id.transfer_code_block_3);
+ transferCodeTextViews[3] = view.findViewById(R.id.transfer_code_block_4);
+ transferCodeTextViews[4] = view.findViewById(R.id.transfer_code_block_5);
+ transferCodeTextViews[5] = view.findViewById(R.id.transfer_code_block_6);
+ transferCodeTextViews[6] = view.findViewById(R.id.transfer_code_block_7);
+ transferCodeTextViews[7] = view.findViewById(R.id.transfer_code_block_8);
+ transferCodeTextViews[8] = view.findViewById(R.id.transfer_code_block_9);
+
+ setTransferCode(transferCodeTextViews, transferCode);
+
+ return alert.create();
+ }
+
+ private void setTransferCode(TextView[] view, Passphrase transferCode) {
+ CharBuffer transferCodeChars = CharBuffer.wrap(transferCode.getCharArray()).asReadOnlyBuffer();
+ if (!Numeric9x4PassphraseUtil.isNumeric9x4Passphrase(transferCodeChars)) {
+ throw new IllegalStateException("Illegal passphrase format!");
+ }
+
+ PrefixedEditText prefixedEditText = (PrefixedEditText) view[0];
+ prefixedEditText.setHint("34");
+ prefixedEditText.setPrefix(transferCodeChars.subSequence(0, 2));
+ prefixedEditText.setText(transferCodeChars.subSequence(2, 4));
+
+ for (int i = 1; i < 9; i++) {
+ view[i].setText(transferCodeChars.subSequence(i*5, i*5+4));
+ }
+ }
+
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ super.onDismiss(dialog);
+
+ getActivity().finish();
+ }
+ }
+
+}
diff --git a/OpenKeychain/src/main/res/layout/api_display_transfer_code.xml b/OpenKeychain/src/main/res/layout/api_display_transfer_code.xml
new file mode 100644
index 000000000..adb970240
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/api_display_transfer_code.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/extern/openpgp-api-lib b/extern/openpgp-api-lib
index bfb355c5b..3631265b3 160000
--- a/extern/openpgp-api-lib
+++ b/extern/openpgp-api-lib
@@ -1 +1 @@
-Subproject commit bfb355c5bfa57245f50efd747a4f297eda57254a
+Subproject commit 3631265b348a02ea3c79f4f38f6c031a82298ed5