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..73fc00f8 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; @@ -46,7 +47,7 @@ import retrofit2.Call; import retrofit2.Callback; /** - * @author M M Arif + * @author mmarif */ public class LoginActivity extends BaseActivity { @@ -58,6 +59,8 @@ public class LoginActivity extends BaseActivity { private int defaultPagingNumber = 25; private final String DATABASE_NAME = "gitnex"; private boolean hasShownInitialNetworkError = false; + private int btnText; + private String selectedProvider = "gitea"; @Override public void onCreate(Bundle savedInstanceState) { @@ -67,6 +70,22 @@ public class LoginActivity extends BaseActivity { activityLoginBinding = ActivityLoginBinding.inflate(getLayoutInflater()); setContentView(activityLoginBinding.getRoot()); + String 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)); @@ -75,14 +94,25 @@ public class LoginActivity extends BaseActivity { new ArrayAdapter<>( LoginActivity.this, R.layout.list_spinner_items, Protocol.values()); + ArrayAdapter adapterProviders = + ArrayAdapter.createFromResource( + this, R.array.provider_options, R.layout.list_spinner_items); + 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); activityLoginBinding.httpsSpinner.setOnItemClickListener( (parent, view, position, id) -> { selectedProtocol = String.valueOf(parent.getItemAtPosition(position)); - if (selectedProtocol.equals(String.valueOf(Protocol.HTTP))) { SnackBar.warning( ctx, @@ -91,6 +121,17 @@ public class LoginActivity extends BaseActivity { } }); + activityLoginBinding.providerSpinner.setAdapter(adapterProviders); + activityLoginBinding.providerSpinner.setSelection(0); + activityLoginBinding.providerSpinner.setText(adapterProviders.getItem(0), false); + activityLoginBinding.providerSpinner.setOnItemClickListener( + (parent, view, position, id) -> { + selectedProvider = + position == 0 + ? "gitea" + : position == 1 || position == 2 ? "forgejo" : "infer"; + }); + if (AppUtil.hasNetworkConnection(ctx)) { enableProcessButton(); } else { @@ -107,8 +148,7 @@ public class LoginActivity extends BaseActivity { enableProcessButton(); } else { disableProcessButton(); - activityLoginBinding.loginButton.setText( - getResources().getString(R.string.btnLogin)); + activityLoginBinding.loginButton.setText(btnText); if (hasShownInitialNetworkError) { SnackBar.error( ctx, @@ -179,6 +219,15 @@ public class LoginActivity extends BaseActivity { try { + if (selectedProvider == null || selectedProvider.isEmpty()) { + SnackBar.error( + ctx, + findViewById(android.R.id.content), + getString(R.string.provider_empty_error)); + enableProcessButton(); + return; + } + if (selectedProtocol == null) { SnackBar.error( @@ -189,12 +238,32 @@ public class LoginActivity extends BaseActivity { return; } + if (Objects.requireNonNull(activityLoginBinding.instanceUrl.getText()) + .toString() + .isEmpty()) { + + SnackBar.error( + ctx, findViewById(android.R.id.content), getString(R.string.emptyFieldURL)); + enableProcessButton(); + return; + } + String loginToken = Objects.requireNonNull(activityLoginBinding.loginTokenCode.getText()) .toString() .replaceAll("[\\uFEFF|#]", "") .trim(); + if (loginToken.isEmpty()) { + + SnackBar.error( + ctx, + findViewById(android.R.id.content), + getString(R.string.loginTokenError)); + enableProcessButton(); + return; + } + URI rawInstanceUrl = UrlBuilder.fromString( UrlHelper.fixScheme( @@ -213,24 +282,6 @@ public class LoginActivity extends BaseActivity { .withPath(PathsHelper.join(rawInstanceUrl.getPath(), "/api/v1/")) .toUri(); - if (activityLoginBinding.instanceUrl.getText().toString().isEmpty()) { - - SnackBar.error( - ctx, findViewById(android.R.id.content), getString(R.string.emptyFieldURL)); - enableProcessButton(); - return; - } - - if (loginToken.isEmpty()) { - - SnackBar.error( - ctx, - findViewById(android.R.id.content), - getString(R.string.loginTokenError)); - enableProcessButton(); - return; - } - versionCheck(loginToken); serverPageLimitSettings(String.valueOf(instanceUrl), loginToken); @@ -305,6 +356,9 @@ public class LoginActivity extends BaseActivity { } giteaVersion = new Version(version.getVersion()); + if (selectedProvider.equals("infer")) { + selectedProvider = AppUtil.inferProvider(version.getVersion()); + } if (giteaVersion.less(getString(R.string.versionLow))) { @@ -406,11 +460,17 @@ public class LoginActivity extends BaseActivity { loginToken, giteaVersion.toString(), maxResponseItems, - defaultPagingNumber); + defaultPagingNumber, + selectedProvider); account = userAccountsApi.getAccountById((int) accountId); } else { userAccountsApi.updateTokenByAccountName( accountName, loginToken); + userAccountsApi.updateProvider( + selectedProvider, + userAccountsApi + .getAccountByName(accountName) + .getAccountId()); userAccountsApi.login( userAccountsApi .getAccountByName(accountName) @@ -460,15 +520,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/activities/MainActivity.java b/app/src/main/java/org/mian/gitnex/activities/MainActivity.java index 1b9626bf..afc0627f 100644 --- a/app/src/main/java/org/mian/gitnex/activities/MainActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/MainActivity.java @@ -4,7 +4,6 @@ import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.os.Handler; -import android.text.Html; import android.util.TypedValue; import android.view.View; import android.widget.ImageView; @@ -12,6 +11,7 @@ import android.widget.TextView; import androidx.activity.EdgeToEdge; import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; +import androidx.core.text.HtmlCompat; import androidx.navigation.NavController; import androidx.navigation.NavOptions; import androidx.navigation.fragment.NavHostFragment; @@ -95,11 +95,23 @@ public class MainActivity extends BaseActivity return; } - if (tinyDB.getInt("currentActiveAccountId", -1) <= 0) { + int currentAccountId = tinyDB.getInt("currentActiveAccountId", -1); + if (currentAccountId <= 0) { AppUtil.logout(this); return; } + UserAccountsApi userAccountsApi = BaseApi.getInstance(this, UserAccountsApi.class); + if (userAccountsApi != null) { + UserAccount currentAccount = userAccountsApi.getAccountById(currentAccountId); + if (currentAccount != null + && (currentAccount.getProvider() == null + || currentAccount.getProvider().isEmpty())) { + String inferredProvider = AppUtil.inferProvider(currentAccount.getServerVersion()); + userAccountsApi.updateProvider(inferredProvider, currentAccountId); + } + } + setSupportActionBar(binding.toolbar); binding.toolbar.setVisibility(View.GONE); binding.toolbar.invalidate(); @@ -322,7 +334,9 @@ public class MainActivity extends BaseActivity ImageView userAvatar = binding.userAvatar; if (name != null && !name.isEmpty()) { - userFullname.setText(Html.fromHtml(name)); + userFullname.setText( + HtmlCompat.fromHtml( + name, HtmlCompat.FROM_HTML_MODE_LEGACY)); } else { userFullname.setText(username); } 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..3bd835fd 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/UserAccountsNavAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/UserAccountsNavAdapter.java @@ -18,12 +18,12 @@ 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; /** - * @author M M Arif + * @author mmarif */ public class UserAccountsNavAdapter extends RecyclerView.Adapter { @@ -82,7 +82,9 @@ public class UserAccountsNavAdapter newAccount.setOnClickListener( item -> { - context.startActivity(new Intent(context, AddNewAccountActivity.class)); + Intent intent = new Intent(context, LoginActivity.class); + intent.putExtra("mode", "new_account"); + context.startActivity(intent); dialog.dismiss(); }); diff --git a/app/src/main/java/org/mian/gitnex/database/api/UserAccountsApi.java b/app/src/main/java/org/mian/gitnex/database/api/UserAccountsApi.java index f010cf50..c85a732e 100644 --- a/app/src/main/java/org/mian/gitnex/database/api/UserAccountsApi.java +++ b/app/src/main/java/org/mian/gitnex/database/api/UserAccountsApi.java @@ -7,7 +7,7 @@ import org.mian.gitnex.database.dao.UserAccountsDao; import org.mian.gitnex.database.models.UserAccount; /** - * @author M M Arif + * @author mmarif */ public class UserAccountsApi extends BaseApi { @@ -25,7 +25,8 @@ public class UserAccountsApi extends BaseApi { String token, String serverVersion, int maxResponseItems, - int defaultPagingNumber) { + int defaultPagingNumber, + String provider) { UserAccount userAccount = new UserAccount(); userAccount.setAccountName(accountName); @@ -36,6 +37,7 @@ public class UserAccountsApi extends BaseApi { userAccount.setLoggedIn(true); userAccount.setMaxResponseItems(maxResponseItems); userAccount.setDefaultPagingNumber(defaultPagingNumber); + userAccount.setProvider(provider); return userAccountsDao.createAccount(userAccount); } @@ -117,4 +119,8 @@ public class UserAccountsApi extends BaseApi { public void login(int accountId) { executorService.execute(() -> userAccountsDao.login(accountId)); } + + public void updateProvider(final String provider, final int accountId) { + executorService.execute(() -> userAccountsDao.updateProvider(provider, accountId)); + } } diff --git a/app/src/main/java/org/mian/gitnex/database/dao/UserAccountsDao.java b/app/src/main/java/org/mian/gitnex/database/dao/UserAccountsDao.java index 21388fa2..199764ab 100644 --- a/app/src/main/java/org/mian/gitnex/database/dao/UserAccountsDao.java +++ b/app/src/main/java/org/mian/gitnex/database/dao/UserAccountsDao.java @@ -8,7 +8,7 @@ import java.util.List; import org.mian.gitnex.database.models.UserAccount; /** - * @author M M Arif + * @author mmarif */ @Dao public interface UserAccountsDao { @@ -81,4 +81,7 @@ public interface UserAccountsDao { @Query("DELETE FROM UserAccounts WHERE accountId = :accountId") void deleteAccount(int accountId); + + @Query("UPDATE UserAccounts SET provider = :provider WHERE accountId = :accountId") + void updateProvider(String provider, int accountId); } diff --git a/app/src/main/java/org/mian/gitnex/database/db/GitnexDatabase.java b/app/src/main/java/org/mian/gitnex/database/db/GitnexDatabase.java index d9fa92b3..b02386bb 100644 --- a/app/src/main/java/org/mian/gitnex/database/db/GitnexDatabase.java +++ b/app/src/main/java/org/mian/gitnex/database/db/GitnexDatabase.java @@ -17,11 +17,11 @@ import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.database.models.UserAccount; /** - * @author M M Arif + * @author mmarif */ @Database( entities = {Repository.class, UserAccount.class, Notes.class, AppSettings.class}, - version = 10, + version = 11, exportSchema = false) public abstract class GitnexDatabase extends RoomDatabase { @@ -30,7 +30,6 @@ public abstract class GitnexDatabase extends RoomDatabase { new Migration(1, 2) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { - // database.execSQL("DROP TABLE Drafts"); database.execSQL("ALTER TABLE 'Drafts' ADD COLUMN 'commentId' TEXT"); } }; @@ -110,6 +109,16 @@ public abstract class GitnexDatabase extends RoomDatabase { database.execSQL("DROP table Drafts"); } }; + + private static final Migration MIGRATION_10_11 = + new Migration(10, 11) { + + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("ALTER TABLE 'userAccounts' ADD COLUMN 'provider' TEXT"); + } + }; + private static volatile GitnexDatabase gitnexDatabase; public static GitnexDatabase getDatabaseInstance(Context context) { @@ -131,7 +140,8 @@ public abstract class GitnexDatabase extends RoomDatabase { MIGRATION_6_7, MIGRATION_7_8, MIGRATION_8_9, - MIGRATION_9_10) + MIGRATION_9_10, + MIGRATION_10_11) .build(); } } diff --git a/app/src/main/java/org/mian/gitnex/database/models/UserAccount.java b/app/src/main/java/org/mian/gitnex/database/models/UserAccount.java index c426cf41..2b6b0bb2 100644 --- a/app/src/main/java/org/mian/gitnex/database/models/UserAccount.java +++ b/app/src/main/java/org/mian/gitnex/database/models/UserAccount.java @@ -6,7 +6,7 @@ import androidx.room.PrimaryKey; import java.io.Serializable; /** - * @author M M Arif + * @author mmarif */ @Entity(tableName = "userAccounts") public class UserAccount implements Serializable { @@ -24,6 +24,7 @@ public class UserAccount implements Serializable { private int defaultPagingNumber; private int maxAttachmentsSize; private int maxNumberOfAttachments; + private String provider; public int getAccountId() { return accountId; @@ -112,4 +113,12 @@ public class UserAccount implements Serializable { public void setMaxNumberOfAttachments(int maxNumberOfAttachments) { this.maxNumberOfAttachments = maxNumberOfAttachments; } + + public String getProvider() { + return provider; + } + + public void setProvider(String provider) { + this.provider = provider; + } } 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/java/org/mian/gitnex/helpers/AppUtil.java b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java index 3e2fda59..2aa98158 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java @@ -721,4 +721,13 @@ public class AppUtil { } return resource; } + + public static String inferProvider(String version) { + if (Version.valid(version)) { + Version v = new Version(version); + int majorVersion = v.getValues().isEmpty() ? 0 : v.getValues().get(0); + return majorVersion == 1 ? "gitea" : "forgejo"; + } + return "gitea"; + } } diff --git a/app/src/main/java/org/mian/gitnex/helpers/Version.java b/app/src/main/java/org/mian/gitnex/helpers/Version.java index d6cf5128..bbbffe3e 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/Version.java +++ b/app/src/main/java/org/mian/gitnex/helpers/Version.java @@ -236,4 +236,8 @@ public class Version { return raw; } + + public List getValues() { + return values; + } } diff --git a/app/src/main/java/org/mian/gitnex/helpers/contexts/AccountContext.java b/app/src/main/java/org/mian/gitnex/helpers/contexts/AccountContext.java index 7a13eca1..8ec1fc6a 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/contexts/AccountContext.java +++ b/app/src/main/java/org/mian/gitnex/helpers/contexts/AccountContext.java @@ -83,4 +83,8 @@ public class AccountContext implements Serializable { assert account.getAccountName() != null; return new File(context.getCacheDir() + "responses", account.getAccountName()); } + + public String getProvider() { + return getAccount().getProvider(); + } } 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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 422514da..893e0e62 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -65,6 +65,29 @@ android:orientation="vertical" android:padding="@dimen/dimen28dp"> + + + + + + zh-TW + + Gitea + Forgejo + Codeberg (Forgejo-based) + I am not sure + + Roboto Manrope diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b30be8ad..1e6b368a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1002,4 +1002,6 @@ Switch account Clear Cache (%1$s) Repository does not exist + Select instance provider + Please select an instance provider