diff --git a/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java index b5e20c91..09166f2e 100644 --- a/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java @@ -33,6 +33,9 @@ import org.gitnex.tea4j.models.UserRepositories; import org.gitnex.tea4j.models.WatchInfo; 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.fragments.BottomSheetIssuesFilterFragment; import org.mian.gitnex.fragments.BottomSheetMilestonesFilterFragment; import org.mian.gitnex.fragments.BottomSheetPullRequestFilterFragment; @@ -778,6 +781,19 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe } + @Override + protected void onDestroy() { + if(!isFinishing()) { + return; + } + if(getIntent().getBooleanExtra("switchAccountBackOnFinish", false)) { + UserAccount a = BaseApi.getInstance(this, UserAccountsApi.class) + .getAccountById(getIntent().getIntExtra("oldAccountId", 0)); + AppUtil.switchToAccount(this, a); + } + super.onDestroy(); + } + // Issues milestone filter interface public FragmentRefreshListener getFragmentRefreshListenerFilterIssuesByMilestone() { return fragmentRefreshListenerFilterIssuesByMilestone; } diff --git a/app/src/main/java/org/mian/gitnex/fragments/FilesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/FilesFragment.java index da9a28d3..e7f82578 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/FilesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/FilesFragment.java @@ -18,24 +18,30 @@ import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.Files; +import org.gitnex.tea4j.models.UserRepositories; import org.mian.gitnex.R; -import org.mian.gitnex.activities.DeepLinksActivity; import org.mian.gitnex.activities.FileViewActivity; import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.adapters.FilesAdapter; +import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.database.api.BaseApi; +import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.api.UserAccountsApi; +import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.databinding.FragmentFilesBinding; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Path; +import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.viewmodels.FilesViewModel; import java.util.ArrayList; import java.util.Collections; import java.util.List; import moe.feng.common.view.breadcrumbs.DefaultBreadcrumbsCallback; import moe.feng.common.view.breadcrumbs.model.BreadcrumbItem; +import retrofit2.Call; +import retrofit2.Callback; /** * Author M M Arif @@ -203,15 +209,14 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter Uri url = AppUtil.getUriFromGitUrl(rawUrl); String host = url.getHost(); - UserAccountsApi userAccountsApi = BaseApi.getInstance(requireContext(), UserAccountsApi.class); List userAccounts = userAccountsApi.usersAccounts(); - boolean accountFound = false; + UserAccount account = null; for(UserAccount userAccount : userAccounts) { Uri instanceUri = Uri.parse(userAccount.getInstanceUrl()); if(instanceUri.getHost().toLowerCase().equals(host)) { - accountFound = true; + account = userAccount; // if scheme is wrong fix it if (!url.getScheme().equals(instanceUri.getScheme())) { url = AppUtil.changeScheme(url,instanceUri.getScheme()); @@ -220,10 +225,76 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter } } - if(accountFound) { - Intent iLink = new Intent(requireContext(), DeepLinksActivity.class); - iLink.setData(url); - startActivity(iLink); + if(account != null) { + TinyDB tinyDB = TinyDB.getInstance(requireContext()); + int oldId = tinyDB.getInt("currentActiveAccountId"); + AppUtil.switchToAccount(requireContext(), account); + List splittedUrl = url.getPathSegments(); + if(splittedUrl.size() < 2) { + AppUtil.openUrlInBrowser(requireContext(), url.toString()); + } + String owner = splittedUrl.get(splittedUrl.size() - 2); + String repo = splittedUrl.get(splittedUrl.size() - 1); + if (repo.endsWith(".git")) { // Git clone URL + repo = repo.substring(0, repo.length() - 4); + } + + Call call = RetrofitClient + .getApiInterface(requireContext(), account.getInstanceUrl()) + .getUserRepository(Authorization.get(requireContext()), owner, repo); + + Uri finalUrl = url; + call.enqueue(new Callback() { + + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + + UserRepositories repoInfo = response.body(); + + if (response.code() == 200) { + + assert repoInfo != null; + + Intent repoIntent = new Intent(requireContext(), RepoDetailActivity.class); + repoIntent.putExtra("repoFullName", repoInfo.getFullName()); + repoIntent.putExtra("goToSection", "yes"); + repoIntent.putExtra("goToSectionType", "repo"); + repoIntent.putExtra("switchAccountBackOnFinish", true); + repoIntent.putExtra("oldAccountId", oldId); + + tinyDB.putString("repoFullName", repoInfo.getFullName()); + if(repoInfo.getPrivateFlag()) { + tinyDB.putString("repoType", getResources().getString(R.string.strPrivate)); + } + else { + tinyDB.putString("repoType", getResources().getString(R.string.strPublic)); + } + tinyDB.putBoolean("isRepoAdmin", repoInfo.getPermissions().isAdmin()); + tinyDB.putString("repoBranch", repoInfo.getDefault_branch()); + + int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId"); + + RepositoriesApi repositoryData = BaseApi.getInstance(requireContext(), RepositoriesApi.class); + Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); + if(count == 0) { + long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); + tinyDB.putLong("repositoryId", id); + } else { + Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); + tinyDB.putLong("repositoryId", data.getRepositoryId()); + } + + startActivity(repoIntent); + } else { + AppUtil.openUrlInBrowser(requireContext(), finalUrl.toString()); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + AppUtil.openUrlInBrowser(requireContext(), finalUrl.toString()); + } + }); } else { AppUtil.openUrlInBrowser(requireContext(), url.toString()); } 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 c9123b9a..899c8e56 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java @@ -383,24 +383,16 @@ public class AppUtil { if(host != null) { return uri; } - // must be a SSH URL now - return Uri.parse(getUriHostFromSSHUrl(url)); + // must be a Git SSH URL now (old rcp standard) + return Uri.parse(getUriFromSSHUrl(url)); } - public static String getUriHostFromSSHUrl(String url) { - int scheme = url.indexOf("://"); - if (scheme >= 0) { - url = url.substring(scheme+3); + public static String getUriFromSSHUrl(String url) { + String[] urlParts = url.split("://"); + if (urlParts.length > 1) { + url = urlParts[1]; } - - String result = ""; - String[] userHost = url.split("@"); // for a full URL this should be ["//user", "host.tld"] - if(userHost.length < 2) { - result = userHost[0].replace("//", ""); - } else { - result = userHost[1]; - } - return "https://" + result.replace(":", "/"); + return "https://" + url.replace(":", "/"); } public static Uri changeScheme(Uri origin, String scheme) { diff --git a/app/src/test/java/org/mian/gitnex/helpers/AppUtilTest.java b/app/src/test/java/org/mian/gitnex/helpers/AppUtilTest.java index 9b007e42..98c1332d 100644 --- a/app/src/test/java/org/mian/gitnex/helpers/AppUtilTest.java +++ b/app/src/test/java/org/mian/gitnex/helpers/AppUtilTest.java @@ -37,11 +37,11 @@ public class AppUtilTest { @Test public void parseSSHUrl() { - assertEquals("https://codeberg.org/gitnex/GitNex", AppUtil.getUriHostFromSSHUrl("ssh://git@codeberg.org:gitnex/GitNex")); - assertEquals("https://codeberg.org/gitnex/GitNex", AppUtil.getUriHostFromSSHUrl("codeberg.org:gitnex/GitNex")); - assertEquals("https://codeberg.org/gitnex/GitNex", AppUtil.getUriHostFromSSHUrl("ssh://git@codeberg.org/gitnex/GitNex")); - assertEquals("https://codeberg.org/gitnex/GitNex.git", AppUtil.getUriHostFromSSHUrl("ssh://git@codeberg.org:gitnex/GitNex.git")); - assertEquals("https://codeberg.org/gitnex/GitNex.git", AppUtil.getUriHostFromSSHUrl("codeberg.org:gitnex/GitNex.git")); + assertEquals("https://git@codeberg.org/gitnex/GitNex", AppUtil.getUriFromSSHUrl("ssh://git@codeberg.org:gitnex/GitNex")); + assertEquals("https://codeberg.org/gitnex/GitNex", AppUtil.getUriFromSSHUrl("codeberg.org:gitnex/GitNex")); + assertEquals("https://git@codeberg.org/gitnex/GitNex", AppUtil.getUriFromSSHUrl("ssh://git@codeberg.org/gitnex/GitNex")); + assertEquals("https://git@codeberg.org/gitnex/GitNex.git", AppUtil.getUriFromSSHUrl("ssh://git@codeberg.org:gitnex/GitNex.git")); + assertEquals("https://codeberg.org/gitnex/GitNex.git", AppUtil.getUriFromSSHUrl("codeberg.org:gitnex/GitNex.git")); } }