From 044fd13e514705b6e511dccc3c20e9e9e2be3e8c Mon Sep 17 00:00:00 2001 From: M M Arif Date: Thu, 17 Jul 2025 11:17:21 +0500 Subject: [PATCH] Remove add account screen, sync with login screen for new accounts --- app/src/main/AndroidManifest.xml | 4 - .../activities/AddNewAccountActivity.java | 396 ------------------ .../gitnex/activities/DeepLinksActivity.java | 6 +- .../mian/gitnex/activities/LoginActivity.java | 37 +- .../adapters/UserAccountsNavAdapter.java | 12 +- .../org/mian/gitnex/helpers/AlertDialogs.java | 10 +- .../res/layout/activity_add_new_account.xml | 143 ------- 7 files changed, 47 insertions(+), 561 deletions(-) delete mode 100644 app/src/main/java/org/mian/gitnex/activities/AddNewAccountActivity.java delete mode 100644 app/src/main/res/layout/activity_add_new_account.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b7471095..30ff8fb3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -139,10 +139,6 @@ - diff --git a/app/src/main/java/org/mian/gitnex/activities/AddNewAccountActivity.java b/app/src/main/java/org/mian/gitnex/activities/AddNewAccountActivity.java deleted file mode 100644 index e37c791e..00000000 --- a/app/src/main/java/org/mian/gitnex/activities/AddNewAccountActivity.java +++ /dev/null @@ -1,396 +0,0 @@ -package org.mian.gitnex.activities; - -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.os.Bundle; -import android.os.Handler; -import android.util.TypedValue; -import android.widget.ArrayAdapter; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.core.text.HtmlCompat; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import io.mikael.urlbuilder.UrlBuilder; -import java.net.URI; -import java.util.Objects; -import org.gitnex.tea4j.v2.models.GeneralAPISettings; -import org.gitnex.tea4j.v2.models.ServerVersion; -import org.gitnex.tea4j.v2.models.User; -import org.mian.gitnex.R; -import org.mian.gitnex.clients.RetrofitClient; -import org.mian.gitnex.database.api.BaseApi; -import org.mian.gitnex.database.api.UserAccountsApi; -import org.mian.gitnex.database.models.UserAccount; -import org.mian.gitnex.databinding.ActivityAddNewAccountBinding; -import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.PathsHelper; -import org.mian.gitnex.helpers.SnackBar; -import org.mian.gitnex.helpers.UrlHelper; -import org.mian.gitnex.helpers.Version; -import org.mian.gitnex.structs.Protocol; -import retrofit2.Call; -import retrofit2.Callback; - -/** - * @author M M Arif - */ -public class AddNewAccountActivity extends BaseActivity { - - private ActivityAddNewAccountBinding viewBinding; - - private String spinnerSelectedValue; - private Version giteaVersion; - private int maxResponseItems = 50; - private int defaultPagingNumber = 30; - - @Override - public void onCreate(Bundle savedInstanceState) { - - super.onCreate(savedInstanceState); - - viewBinding = ActivityAddNewAccountBinding.inflate(getLayoutInflater()); - setContentView(viewBinding.getRoot()); - - getWindow().getDecorView().setBackground(new ColorDrawable(Color.TRANSPARENT)); - - viewBinding.instanceUrl.setText(getIntent().getStringExtra("instanceUrl")); - viewBinding.loginToken.setText(getIntent().getStringExtra("token")); - String scheme = getIntent().getStringExtra("scheme"); - if (scheme != null && scheme.equals("http")) { - viewBinding.protocolSpinner.setText(Protocol.HTTP.toString()); - spinnerSelectedValue = Protocol.HTTP.toString(); - } else { // default is https - viewBinding.protocolSpinner.setText(Protocol.HTTPS.toString()); - spinnerSelectedValue = Protocol.HTTPS.toString(); - } - - viewBinding.tokenHelper.setOnClickListener(token -> showTokenHelpDialog()); - - ArrayAdapter adapterProtocols = - new ArrayAdapter<>(ctx, R.layout.list_spinner_items, Protocol.values()); - - viewBinding.topAppBar.setNavigationOnClickListener(v -> finish()); - - viewBinding.protocolSpinner.setAdapter(adapterProtocols); - viewBinding.protocolSpinner.setOnItemClickListener( - (parent, view1, position, id) -> - spinnerSelectedValue = String.valueOf(parent.getItemAtPosition(position))); - - viewBinding.topAppBar.setOnMenuItemClickListener( - menuItem -> { - int id = menuItem.getItemId(); - - if (id == R.id.addAccount) { - processLogin(); - return true; - } else { - return super.onOptionsItemSelected(menuItem); - } - }); - } - - private void showTokenHelpDialog() { - - MaterialAlertDialogBuilder dialogBuilder = - new MaterialAlertDialogBuilder(this) - .setMessage( - HtmlCompat.fromHtml( - getString(R.string.where_to_get_token_message), - HtmlCompat.FROM_HTML_MODE_LEGACY)) - .setPositiveButton(R.string.close, null) - .setCancelable(true); - - AlertDialog dialog = dialogBuilder.create(); - dialog.show(); - - TextView messageView = dialog.findViewById(android.R.id.message); - if (messageView != null) { - messageView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); - int paddingTop = - (int) - TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, - 16, - getResources().getDisplayMetrics()); - messageView.setPadding( - messageView.getPaddingLeft(), - paddingTop, - messageView.getPaddingRight(), - messageView.getPaddingBottom()); - } - } - - private void processLogin() { - - try { - - String instanceUrlET = - String.valueOf(viewBinding.instanceUrl.getText()) - .replaceAll("[\\uFEFF|#]", "") - .trim(); - String loginToken = - String.valueOf(viewBinding.loginToken.getText()) - .replaceAll("[\\uFEFF|#]", "") - .trim(); - String protocol = spinnerSelectedValue; - - if (protocol == null) { - - SnackBar.error( - ctx, - findViewById(android.R.id.content), - getString(R.string.protocolEmptyError)); - return; - } - - if (instanceUrlET.isEmpty()) { - - SnackBar.error( - ctx, findViewById(android.R.id.content), getString(R.string.emptyFieldURL)); - return; - } - - if (loginToken.isEmpty()) { - - SnackBar.error( - ctx, - findViewById(android.R.id.content), - getString(R.string.loginTokenError)); - return; - } - - URI rawInstanceUrl = - UrlBuilder.fromString(UrlHelper.fixScheme(instanceUrlET, "http")).toUri(); - - URI instanceUrl = - UrlBuilder.fromUri(rawInstanceUrl) - .withScheme(protocol.toLowerCase()) - .withPath(PathsHelper.join(rawInstanceUrl.getPath(), "/api/v1/")) - .toUri(); - - versionCheck(instanceUrl.toString(), loginToken); - serverPageLimitSettings(); - - } catch (Exception e) { - - SnackBar.error( - ctx, findViewById(android.R.id.content), getString(R.string.malformedUrl)); - } - } - - private void versionCheck(final String instanceUrl, final String loginToken) { - - Call callVersion = - RetrofitClient.getApiInterface(ctx, instanceUrl, "token " + loginToken, null) - .getVersion(); - callVersion.enqueue( - new Callback<>() { - - @Override - public void onResponse( - @NonNull final Call callVersion, - @NonNull retrofit2.Response responseVersion) { - - if (responseVersion.code() == 200) { - - ServerVersion version = responseVersion.body(); - - assert version != null; - - if (!Version.valid(version.getVersion())) { - - SnackBar.error( - ctx, - findViewById(android.R.id.content), - getString(R.string.versionUnknown)); - return; - } - - giteaVersion = new Version(version.getVersion()); - - if (giteaVersion.less(getString(R.string.versionLow))) { - - MaterialAlertDialogBuilder materialAlertDialogBuilder = - new MaterialAlertDialogBuilder(ctx) - .setTitle( - getString( - R.string.versionAlertDialogHeader)) - .setMessage( - getResources() - .getString( - R.string - .versionUnsupportedOld, - version.getVersion())) - .setNeutralButton( - getString(R.string.cancelButton), null) - .setPositiveButton( - getString(R.string.textContinue), - (dialog, which) -> { - dialog.dismiss(); - login(instanceUrl, loginToken); - }); - - materialAlertDialogBuilder.create().show(); - } else if (giteaVersion.lessOrEqual(getString(R.string.versionHigh))) { - - login(instanceUrl, loginToken); - } else { - - SnackBar.error( - ctx, - findViewById(android.R.id.content), - getString(R.string.versionUnsupportedNew)); - login(instanceUrl, loginToken); - } - } else if (responseVersion.code() == 401) { - - SnackBar.error( - ctx, - findViewById(android.R.id.content), - getString(R.string.unauthorizedApiError)); - } else if (responseVersion.code() == 403) { - - login(instanceUrl, loginToken); - } - } - - private void login(String instanceUrl, String loginToken) { - - setupNewAccountWithToken(instanceUrl, loginToken); - } - - @Override - public void onFailure( - @NonNull Call callVersion, @NonNull Throwable t) { - - SnackBar.error( - ctx, - findViewById(android.R.id.content), - getString(R.string.genericServerResponseError)); - } - }); - } - - private void serverPageLimitSettings() { - - Call generalAPISettings = - RetrofitClient.getApiInterface(ctx).getGeneralAPISettings(); - generalAPISettings.enqueue( - new Callback<>() { - - @Override - public void onResponse( - @NonNull final Call generalAPISettings, - @NonNull retrofit2.Response response) { - - if (response.code() == 200 && response.body() != null) { - - if (response.body().getMaxResponseItems() != null) { - maxResponseItems = - Math.toIntExact(response.body().getMaxResponseItems()); - } - if (response.body().getDefaultPagingNum() != null) { - defaultPagingNumber = - Math.toIntExact(response.body().getDefaultPagingNum()); - } - } - } - - @Override - public void onFailure( - @NonNull Call generalAPISettings, - @NonNull Throwable t) {} - }); - } - - private void setupNewAccountWithToken(String instanceUrl, final String loginToken) { - - Call call = - RetrofitClient.getApiInterface(ctx, instanceUrl, "token " + loginToken, null) - .userGetCurrent(); - - call.enqueue( - new Callback<>() { - - @Override - public void onResponse( - @NonNull Call call, @NonNull retrofit2.Response response) { - - User userDetails = response.body(); - - switch (response.code()) { - case 200: - assert userDetails != null; - // insert new account to db if does not exist - String accountName = userDetails.getLogin() + "@" + instanceUrl; - UserAccountsApi userAccountsApi = - BaseApi.getInstance(ctx, UserAccountsApi.class); - boolean userAccountExists = - Objects.requireNonNull(userAccountsApi) - .userAccountExists(accountName); - - if (!userAccountExists) { - - long id = - userAccountsApi.createNewAccount( - accountName, - instanceUrl, - userDetails.getLogin(), - loginToken, - giteaVersion.toString(), - maxResponseItems, - defaultPagingNumber); - UserAccount account = userAccountsApi.getAccountById((int) id); - AppUtil.switchToAccount(AddNewAccountActivity.this, account); - SnackBar.success( - ctx, - findViewById(android.R.id.content), - getString(R.string.accountAddedMessage)); - MainActivity.refActivity = true; - new Handler().postDelayed(() -> finish(), 3000); - } else { - UserAccount account = - userAccountsApi.getAccountByName(accountName); - if (account.isLoggedIn()) { - SnackBar.error( - ctx, - findViewById(android.R.id.content), - getString(R.string.accountAlreadyExistsError)); - AppUtil.switchToAccount(ctx, account); - } else { - userAccountsApi.updateTokenByAccountName( - accountName, loginToken); - userAccountsApi.login(account.getAccountId()); - AppUtil.switchToAccount( - AddNewAccountActivity.this, account); - } - } - break; - - case 401: - SnackBar.error( - ctx, - findViewById(android.R.id.content), - getString(R.string.unauthorizedApiError)); - break; - - default: - SnackBar.error( - ctx, - findViewById(android.R.id.content), - getString(R.string.genericApiError, response.code())); - } - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - - SnackBar.error( - ctx, - findViewById(android.R.id.content), - getString(R.string.genericError)); - } - }); - } -} diff --git a/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java b/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java index 3eeee5d9..128753ee 100644 --- a/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java @@ -140,7 +140,8 @@ public class DeepLinksActivity extends BaseActivity { finish(); } else if (data.getPathSegments().get(0).equals("user") && data.getPathSegments().get(1).equals("login")) { // open login - Intent loginIntent = new Intent(ctx, AddNewAccountActivity.class); + Intent loginIntent = new Intent(ctx, LoginActivity.class); + intent.putExtra("mode", "new_account"); loginIntent.putExtra("instanceUrl", data.getHost()); loginIntent.putExtra("instanceProtocol", data.getScheme()); ctx.startActivity(loginIntent); @@ -453,8 +454,9 @@ public class DeepLinksActivity extends BaseActivity { viewBinding.addNewAccount.setOnClickListener( addNewAccount -> { - Intent accountIntent = new Intent(ctx, AddNewAccountActivity.class); + Intent accountIntent = new Intent(ctx, LoginActivity.class); accountIntent.putExtra("instanceUrl", data.getHost()); + intent.putExtra("mode", "new_account"); startActivity(accountIntent); finish(); }); diff --git a/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java b/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java index d83fe96d..1de7eb88 100644 --- a/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java @@ -11,6 +11,7 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.TypedValue; +import android.view.View; import android.widget.ArrayAdapter; import android.widget.TextView; import androidx.activity.result.ActivityResultLauncher; @@ -58,6 +59,8 @@ public class LoginActivity extends BaseActivity { private int defaultPagingNumber = 25; private final String DATABASE_NAME = "gitnex"; private boolean hasShownInitialNetworkError = false; + private String mode; + private int btnText; @Override public void onCreate(Bundle savedInstanceState) { @@ -67,6 +70,23 @@ public class LoginActivity extends BaseActivity { activityLoginBinding = ActivityLoginBinding.inflate(getLayoutInflater()); setContentView(activityLoginBinding.getRoot()); + mode = getIntent().getStringExtra("mode"); + if (mode == null) { + mode = "login"; + btnText = R.string.btnLogin; + } + else { + btnText = R.string.addNewAccountText; + } + + if (mode.equals("new_account")) { + activityLoginBinding.loginButton.setText(btnText); + activityLoginBinding.restoreFromBackup.setVisibility(View.GONE); + } else { + activityLoginBinding.loginButton.setText(btnText); + activityLoginBinding.restoreFromBackup.setVisibility(View.VISIBLE); + } + NetworkStatusObserver networkStatusObserver = NetworkStatusObserver.getInstance(ctx); activityLoginBinding.appVersion.setText(AppUtil.getAppVersion(appCtx)); @@ -76,6 +96,14 @@ public class LoginActivity extends BaseActivity { LoginActivity.this, R.layout.list_spinner_items, Protocol.values()); activityLoginBinding.instanceUrl.setText(getIntent().getStringExtra("instanceUrl")); + String scheme = getIntent().getStringExtra("scheme"); + if (scheme != null && scheme.equals("http")) { + activityLoginBinding.httpsSpinner.setText(Protocol.HTTP.toString()); + selectedProtocol = Protocol.HTTP.toString(); + } else { + activityLoginBinding.httpsSpinner.setText(Protocol.HTTPS.toString()); + selectedProtocol = Protocol.HTTPS.toString(); + } activityLoginBinding.httpsSpinner.setAdapter(adapterProtocols); activityLoginBinding.httpsSpinner.setSelection(0); @@ -108,7 +136,7 @@ public class LoginActivity extends BaseActivity { } else { disableProcessButton(); activityLoginBinding.loginButton.setText( - getResources().getString(R.string.btnLogin)); + btnText); if (hasShownInitialNetworkError) { SnackBar.error( ctx, @@ -460,15 +488,10 @@ public class LoginActivity extends BaseActivity { private void enableProcessButton() { - activityLoginBinding.loginButton.setText(R.string.btnLogin); + activityLoginBinding.loginButton.setText(btnText); activityLoginBinding.loginButton.setEnabled(true); } - private enum LoginType { - BASIC, - TOKEN - } - private void requestRestoreFile() { Intent intentRestore = new Intent(Intent.ACTION_OPEN_DOCUMENT); diff --git a/app/src/main/java/org/mian/gitnex/adapters/UserAccountsNavAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/UserAccountsNavAdapter.java index bf17c89d..0868b816 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/UserAccountsNavAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/UserAccountsNavAdapter.java @@ -18,7 +18,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import java.util.List; import org.mian.gitnex.R; -import org.mian.gitnex.activities.AddNewAccountActivity; +import org.mian.gitnex.activities.LoginActivity; import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.helpers.UrlHelper; @@ -81,10 +81,12 @@ public class UserAccountsNavAdapter } newAccount.setOnClickListener( - item -> { - context.startActivity(new Intent(context, AddNewAccountActivity.class)); - dialog.dismiss(); - }); + item -> { + Intent intent = new Intent(context, LoginActivity.class); + intent.putExtra("mode", "new_account"); + context.startActivity(intent); + dialog.dismiss(); + }); UserAccountsAdapter arrayAdapter = new UserAccountsAdapter(context, dialog); listView.setLayoutManager(new LinearLayoutManager(context)); diff --git a/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java b/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java index 135add40..853d9b82 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java @@ -10,8 +10,8 @@ import org.mian.gitnex.R; import org.mian.gitnex.actions.CollaboratorActions; import org.mian.gitnex.actions.PullRequestActions; import org.mian.gitnex.actions.TeamActions; -import org.mian.gitnex.activities.AddNewAccountActivity; import org.mian.gitnex.activities.CreateLabelActivity; +import org.mian.gitnex.activities.LoginActivity; import org.mian.gitnex.databinding.CustomPrUpdateStrategyDialogBinding; import org.mian.gitnex.helpers.contexts.RepositoryContext; @@ -35,9 +35,11 @@ public class AlertDialogs { .setNeutralButton(R.string.cancelButton, null) .setPositiveButton( R.string.addNewAccountText, - (dialog, which) -> - context.startActivity( - new Intent(context, AddNewAccountActivity.class))) + (dialog, which) -> { + Intent intent = new Intent(context, LoginActivity.class); + intent.putExtra("mode", "new_account"); + context.startActivity(intent); + }) .show(); } diff --git a/app/src/main/res/layout/activity_add_new_account.xml b/app/src/main/res/layout/activity_add_new_account.xml deleted file mode 100644 index 31886cee..00000000 --- a/app/src/main/res/layout/activity_add_new_account.xml +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -