diff --git a/src/main/java/chat/delta/rpc/types/SecurejoinUiPath.java b/src/main/java/chat/delta/rpc/types/SecurejoinUiPath.java index 4b4b4fb89..91e09b8e0 100644 --- a/src/main/java/chat/delta/rpc/types/SecurejoinUiPath.java +++ b/src/main/java/chat/delta/rpc/types/SecurejoinUiPath.java @@ -12,5 +12,6 @@ public enum SecurejoinUiPath { NewContact, /** The user scanned a join QR code when creating a new profile from Instant Onborading Screen */ - InstantOnboarding, + // FIXME: need to be added in core + // InstantOnboarding, } diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java index d1e60710e..df8c3aa3b 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java @@ -97,6 +97,8 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit public static final String CLEAR_NOTIFICATIONS = "clear_notifications"; public static final String ACCOUNT_ID_EXTRA = "account_id"; public static final String FROM_WELCOME = "from_welcome"; + public static final String FROM_WELCOME_LAUNCH_CHAT = "from_welcome_launch_chat"; + public static final String FROM_WELCOME_RAW_QR = "from_welcome_raw_qr"; private static final int REQUEST_CODE_CONFIRM_CREDENTIALS_DELETE_PROFILE = ScreenLockUtil.REQUEST_CODE_CONFIRM_CREDENTIALS+1; private ConversationListFragment conversationListFragment; @@ -191,6 +193,13 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit if (BuildConfig.DEBUG) checkNdkArchitecture(); DcHelper.maybeShowMigrationError(this); + + // Launch chat directly, if coming from onboarding with a join chat/group QR + if (getIntent().getBooleanExtra(FROM_WELCOME_LAUNCH_CHAT, false)) { + QrCodeHandler qrCodeHandler = new QrCodeHandler(this); + String rawQrString = getIntent().getStringExtra(FROM_WELCOME_RAW_QR); + qrCodeHandler.secureJoinByQr(rawQrString, SecurejoinSource.Scan, SecurejoinUiPath.Unknown); + } } /** diff --git a/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java b/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java index 55cf16502..01f6423e2 100644 --- a/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java @@ -61,6 +61,8 @@ import java.io.File; import java.io.IOException; import java.security.SecureRandom; import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import chat.delta.rpc.Rpc; import chat.delta.rpc.RpcException; @@ -84,6 +86,7 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements private boolean avatarChanged; private boolean imageLoaded; private String providerHost; + private String providerQrData; private String rawQrData; private DcLot parsedQrData; private boolean isDcLogin; @@ -98,6 +101,8 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements private DcContext dcContext; + private ExecutorService executor = Executors.newSingleThreadExecutor(); + @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); @@ -124,7 +129,7 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements isDcLogin = false; providerHost = DEFAULT_CHATMAIL_HOST; - rawQrData = DCACCOUNT + ":" + providerHost; + providerQrData = DCACCOUNT + ":" + providerHost; attachmentManager = new AttachmentManager(this, () -> {}); avatarChanged = false; registerForEvents(); @@ -213,7 +218,7 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements isDcLogin = true; // Intentional fall-through case DcContext.DC_QR_ACCOUNT: providerHost = qrParsed.getText1(); - rawQrData = rawQr; + providerQrData = rawQr; updateProvider(); break; case DcContext.DC_QR_ASK_VERIFYCONTACT: @@ -276,6 +281,7 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements public void onDestroy() { super.onDestroy(); DcHelper.getEventCenter(this).removeObservers(this); + executor.shutdown(); } private void handleIntent() { @@ -465,11 +471,15 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements Intent intent = new Intent(getApplicationContext(), ConversationListActivity.class); intent.putExtra(ConversationListActivity.FROM_WELCOME, true); + if (isContactInvitation || isGroupInvitation) { + intent.putExtra(ConversationListActivity.FROM_WELCOME_LAUNCH_CHAT, true); + intent.putExtra(ConversationListActivity.FROM_WELCOME_RAW_QR, rawQrData); + } + startActivity(intent); finishAffinity(); } - @SuppressLint("StaticFieldLeak") private void createProfile() { if (TextUtils.isEmpty(this.name.getText())) { Toast.makeText(this, R.string.please_enter_name, Toast.LENGTH_LONG).show(); @@ -477,38 +487,31 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements } final String name = this.name.getText().toString(); - // FIXME: deprecated and also (unlikely but possible) memory leak - new AsyncTask() { - @Override - protected Boolean doInBackground(Void... params) { - Context context = InstantOnboardingActivity.this; - DcHelper.set(context, DcHelper.CONFIG_DISPLAY_NAME, name); + executor.execute(() -> { + Context context = InstantOnboardingActivity.this; + DcHelper.set(context, DcHelper.CONFIG_DISPLAY_NAME, name); - if (avatarChanged) { - try { - AvatarHelper.setSelfAvatar(InstantOnboardingActivity.this, avatarBmp); - Prefs.setProfileAvatarId(InstantOnboardingActivity.this, new SecureRandom().nextInt()); - } catch (IOException e) { - Log.w(TAG, e); - return false; - } + boolean result = true; + if (avatarChanged) { + try { + AvatarHelper.setSelfAvatar(InstantOnboardingActivity.this, avatarBmp); + Prefs.setProfileAvatarId(InstantOnboardingActivity.this, new SecureRandom().nextInt()); + } catch (IOException e) { + Log.w(TAG, e); + result = false; } - - return true; } - @Override - public void onPostExecute(Boolean result) { - super.onPostExecute(result); - - if (result) { + boolean finalResult = result; + runOnUiThread(() -> { + if (finalResult) { attachmentManager.cleanup(); - startQrAccountCreation(rawQrData); + startQrAccountCreation(providerQrData); } else { Toast.makeText(InstantOnboardingActivity.this, R.string.error, Toast.LENGTH_LONG).show(); } - } - }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + }); + }); } private void startQrAccountCreation(String qrCode) diff --git a/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java b/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java index bd1f9c841..3cef03312 100644 --- a/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java +++ b/src/main/java/org/thoughtcrime/securesms/qr/QrCodeHandler.java @@ -325,25 +325,29 @@ public class QrCodeHandler { } builder.setMessage(msg); builder.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> { - try { - int newChatId = DcHelper.getRpc(activity).secureJoinWithUxInfo(dcContext.getAccountId(), qrRawString, source, uipath); - if (newChatId == 0) throw new Exception("Securejoin failed to create a chat"); - - Intent intent = new Intent(activity, ConversationActivity.class); - intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, newChatId); - activity.startActivity(intent); - } catch (Exception e) { - e.printStackTrace(); - AlertDialog.Builder builder1 = new AlertDialog.Builder(activity); - builder1.setMessage(e.getMessage()); - builder1.setPositiveButton(android.R.string.ok, null); - builder1.create().show(); - } + secureJoinByQr(qrRawString, source, uipath); }); builder.setNegativeButton(android.R.string.cancel, null); } - public void addRelay(String qrData) { + public void secureJoinByQr(String qrRawString, SecurejoinSource source, SecurejoinUiPath uipath) { + try { + int newChatId = DcHelper.getRpc(activity).secureJoinWithUxInfo(dcContext.getAccountId(), qrRawString, source, uipath); + if (newChatId == 0) throw new Exception("Securejoin failed to create a chat"); + + Intent intent = new Intent(activity, ConversationActivity.class); + intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, newChatId); + activity.startActivity(intent); + } catch (Exception e) { + e.printStackTrace(); + AlertDialog.Builder builder1 = new AlertDialog.Builder(activity); + builder1.setMessage(e.getMessage()); + builder1.setPositiveButton(android.R.string.ok, null); + builder1.create().show(); + } + } + + public void addRelay(String qrData) { ProgressDialog progressDialog = new ProgressDialog(activity); progressDialog.setMessage(activity.getResources().getString(R.string.one_moment)); progressDialog.setCanceledOnTouchOutside(false);