Join and launch chat directly after creating new account

This commit is contained in:
wch423
2026-02-06 18:36:42 +01:00
parent 1dcf7e4860
commit 7844e146b1
4 changed files with 60 additions and 43 deletions
@@ -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,
}
@@ -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);
}
}
/**
@@ -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<Void, Void, Boolean>() {
@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)
@@ -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);