Unlimited accounts

This commit is contained in:
世界 2021-03-12 21:33:53 +08:00
parent aadfcb7e96
commit b30bc1ed80
No known key found for this signature in database
GPG Key ID: CD109927C34A63C4
9 changed files with 40 additions and 17 deletions

View File

@ -494,9 +494,13 @@ void init(JNIEnv *env, jclass c, jint instanceNum, jint version, jint layer, jin
void setJava(JNIEnv *env, jclass c, jboolean useJavaByteBuffers) {
ConnectionsManager::useJavaVM(java, useJavaByteBuffers);
for (int a = 0; a < MAX_ACCOUNT_COUNT; a++) {
ConnectionsManager::getInstance(a).setDelegate(new Delegate());
}
void setJava1(JNIEnv *env, jclass c, jint instanceNum) {
if (instanceNum >= jniEnv.capacity()) {
jniEnv.resize(instanceNum + 10, nullptr);
}
ConnectionsManager::getInstance(instanceNum).setDelegate(new Delegate());
}
static const char *ConnectionsManagerClassPathName = "org/telegram/tgnet/ConnectionsManager";
@ -528,6 +532,7 @@ static JNINativeMethod ConnectionsManagerMethods[] = {
{"native_setNetworkAvailable", "(IZIZ)V", (void *) setNetworkAvailable},
{"native_setPushConnectionEnabled", "(IZ)V", (void *) setPushConnectionEnabled},
{"native_setJava", "(Z)V", (void *) setJava},
{"native_setJava", "(I)V", (void *) setJava1},
{"native_applyDnsConfig", "(IJLjava/lang/String;I)V", (void *) applyDnsConfig},
{"native_checkProxy", "(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/telegram/tgnet/RequestTimeDelegate;)J", (void *) checkProxy},
{"native_onHostNameResolved", "(Ljava/lang/String;JLjava/lang/String;Z)V", (void *) onHostNameResolved}

View File

@ -35,7 +35,7 @@
#include <jni.h>
JavaVM *javaVm = nullptr;
//JNIEnv *jniEnv[MAX_ACCOUNT_COUNT];
std::vector<JNIEnv*> jniEnv(MAX_ACCOUNT_COUNT);
std::vector<JNIEnv*> jniEnv(10);
jclass jclass_ByteBuffer = nullptr;
jmethodID jclass_ByteBuffer_allocateDirect = 0;
#endif
@ -133,11 +133,15 @@ ConnectionsManager::~ConnectionsManager() {
pthread_mutex_destroy(&mutex);
}
std::vector<ConnectionsManager*> ConnectionsManager::_instances = std::vector<ConnectionsManager*>(MAX_ACCOUNT_COUNT);
std::vector<ConnectionsManager*> ConnectionsManager::_instances = std::vector<ConnectionsManager*>(10);
ConnectionsManager& ConnectionsManager::getInstance(int32_t instanceNum) {
static std::mutex _new_mutex;
if (instanceNum >= _instances.capacity()) {
_instances.resize(instanceNum + 10, nullptr);
}
if(_instances[instanceNum] == nullptr) {
_new_mutex.lock();
if(_instances[instanceNum] == nullptr)

View File

@ -79,6 +79,10 @@ public class ApplicationLoader extends Application {
Reflection.unseal(base);
}
super.attachBaseContext(base);
try {
applicationContext = getApplicationContext();
} catch (Throwable ignore) {
}
if (SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
MultiDex.install(this);
}
@ -291,7 +295,14 @@ public class ApplicationLoader extends Application {
public static void loadAccount(int account) {
if (!loadedAccounts.add(account)) return;
UserConfig.getInstance(account).loadConfig();
UserConfig inst = UserConfig.getInstance(account);
inst.loadConfig();
if (!inst.isClientActivated()) {
if (SharedConfig.activeAccounts.remove(account)) {
SharedConfig.saveAccounts();
}
}
MessagesController.getInstance(account);
if (account == 0) {
SharedConfig.pushStringStatus = "__FIREBASE_GENERATING_SINCE_" + ConnectionsManager.getInstance(account).getCurrentTime() + "__";

View File

@ -1042,7 +1042,7 @@ public class SharedConfig {
showNotificationsForAllAccounts = preferences.getBoolean("AllAccounts", true);
activeAccounts = Arrays.stream(preferences.getString("active_accounts", "").split(",")).filter(StrUtil::isNotBlank).map(Integer::parseInt).collect(Collectors.toCollection(HashSet::new));
if (!preferences.contains("account_list_loaded")) {
if (!preferences.contains("accounts_loaded")) {
int maxAccounts;
File sharedPrefs = new File(ApplicationLoader.applicationContext.getFilesDir().getParentFile(), "shared_prefs");
@ -1070,7 +1070,7 @@ public class SharedConfig {
preferences.edit().putString("active_accounts", StringUtils.join(activeAccounts, ",")).apply();
}
preferences.edit().putBoolean("account_list_loaded", true).apply();
preferences.edit().putBoolean("accounts_loaded", true).apply();
}
configLoaded = true;

View File

@ -163,6 +163,7 @@ public class ConnectionsManager extends BaseController {
public ConnectionsManager(int instance) {
super(instance);
ConnectionsManager.native_setJava(instance);
connectionState = native_getConnectionState(currentAccount);
String deviceModel;
String systemLangCode;
@ -748,6 +749,8 @@ public class ConnectionsManager extends BaseController {
public static native void native_setJava(boolean useJavaByteBuffers);
public static native void native_setJava(int instanceNum);
public static native void native_setPushConnectionEnabled(int currentAccount, boolean value);
public static native void native_applyDnsConfig(int currentAccount, long address, String phone, int date);

View File

@ -513,8 +513,8 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
switchToAccount(((DrawerUserCell) view).getAccountNumber(), true);
drawerLayoutContainer.closeDrawer(false);
} else if (view instanceof DrawerAddCell) {
int freeAccount = -1;
for (int account = 0;account < UserConfig.MAX_ACCOUNT_COUNT; account++) {
int freeAccount;
for (int account = 0;; account++) {
if (!SharedConfig.activeAccounts.contains(account)) {
freeAccount = account;
break;

View File

@ -1534,6 +1534,8 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No
private void needFinishActivity(boolean afterSignup) {
clearCurrentState();
SharedConfig.activeAccounts.add(currentAccount);
SharedConfig.saveAccounts();
if (getParentActivity() instanceof LaunchActivity) {
if (newAccount) {
newAccount = false;
@ -1555,8 +1557,6 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No
}
private void onAuthSuccess(TLRPC.TL_auth_authorization res, boolean afterSignup) {
SharedConfig.activeAccounts.add(currentAccount);
SharedConfig.saveAccounts();
ConnectionsManager.getInstance(currentAccount).setUserId(res.user.id);
UserConfig.getInstance(currentAccount).clearConfig();
MessagesController.getInstance(currentAccount).cleanup();

View File

@ -114,8 +114,8 @@ public class LogoutActivity extends BaseFragment {
listView.setAdapter(listAdapter);
listView.setOnItemClickListener((view, position, x, y) -> {
if (position == addAccountRow) {
int freeAccount = -1;
for (int account = 0;account < UserConfig.MAX_ACCOUNT_COUNT; account++) {
int freeAccount;
for (int account = 0;; account++) {
if (!SharedConfig.activeAccounts.contains(account)) {
freeAccount = account;
break;

View File

@ -7177,8 +7177,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
new SearchResult(500, LocaleController.getString("EditName", R.string.EditName), 0, () -> presentFragment(new ChangeNameActivity())),
new SearchResult(501, LocaleController.getString("ChangePhoneNumber", R.string.ChangePhoneNumber), 0, () -> presentFragment(new ActionIntroActivity(ActionIntroActivity.ACTION_TYPE_CHANGE_PHONE_NUMBER))),
new SearchResult(502, LocaleController.getString("AddAnotherAccount", R.string.AddAnotherAccount), 0, () -> {
int freeAccount = -1;
for (int account = 0;account < UserConfig.MAX_ACCOUNT_COUNT; account++) {
int freeAccount;
for (int account = 0;; account++) {
if (!SharedConfig.activeAccounts.contains(account)) {
freeAccount = account;
break;
@ -7617,8 +7617,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
}
if (stringBuilder != null && i == searchArgs.length - 1) {
if (result.guid == 502) {
int freeAccount = -1;
for (int account = 0;account < UserConfig.MAX_ACCOUNT_COUNT; account++) {
int freeAccount;
for (int account = 0;; account++) {
if (!SharedConfig.activeAccounts.contains(account)) {
freeAccount = account;
break;