From 4b4c88d44d483fa36f3cb7beff70bf5f6a037bd7 Mon Sep 17 00:00:00 2001 From: Grishka Date: Mon, 17 Apr 2023 06:47:49 +0300 Subject: [PATCH] Support opening mastodon.online and mastodon.social links --- mastodon/src/main/AndroidManifest.xml | 12 +++++ .../joinmastodon/android/MainActivity.java | 49 ++++++++++++++++++- .../fragments/discover/SearchFragment.java | 1 - mastodon/src/main/res/values/strings.xml | 2 + 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/AndroidManifest.xml b/mastodon/src/main/AndroidManifest.xml index 79a8c719a..29741b000 100644 --- a/mastodon/src/main/AndroidManifest.xml +++ b/mastodon/src/main/AndroidManifest.xml @@ -37,6 +37,18 @@ + + + + + + + + + + + + diff --git a/mastodon/src/main/java/org/joinmastodon/android/MainActivity.java b/mastodon/src/main/java/org/joinmastodon/android/MainActivity.java index 81bbf89b6..1c7fccbc3 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/MainActivity.java +++ b/mastodon/src/main/java/org/joinmastodon/android/MainActivity.java @@ -4,13 +4,15 @@ import android.Manifest; import android.app.Application; import android.app.Fragment; import android.content.Intent; -import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.util.Log; +import android.widget.Toast; import org.joinmastodon.android.api.ObjectValidationException; +import org.joinmastodon.android.api.requests.search.GetSearchResults; import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.fragments.ComposeFragment; @@ -20,6 +22,7 @@ import org.joinmastodon.android.fragments.SplashFragment; import org.joinmastodon.android.fragments.ThreadFragment; import org.joinmastodon.android.fragments.onboarding.AccountActivationFragment; import org.joinmastodon.android.model.Notification; +import org.joinmastodon.android.model.SearchResults; import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.updater.GithubSelfUpdater; import org.parceler.Parcels; @@ -28,6 +31,9 @@ import java.lang.reflect.InvocationTargetException; import androidx.annotation.Nullable; import me.grishka.appkit.FragmentStackActivity; +import me.grishka.appkit.Nav; +import me.grishka.appkit.api.Callback; +import me.grishka.appkit.api.ErrorResponse; public class MainActivity extends FragmentStackActivity{ @Override @@ -64,6 +70,8 @@ public class MainActivity extends FragmentStackActivity{ showFragmentForNotification(notification, session.getID()); }else if(intent.getBooleanExtra("compose", false)){ showCompose(); + }else if(Intent.ACTION_VIEW.equals(intent.getAction())){ + handleURL(intent.getData()); }else{ maybeRequestNotificationsPermission(); } @@ -105,11 +113,50 @@ public class MainActivity extends FragmentStackActivity{ } }else if(intent.getBooleanExtra("compose", false)){ showCompose(); + }else if(Intent.ACTION_VIEW.equals(intent.getAction())){ + handleURL(intent.getData()); }/*else if(intent.hasExtra(PackageInstaller.EXTRA_STATUS) && GithubSelfUpdater.needSelfUpdating()){ GithubSelfUpdater.getInstance().handleIntentFromInstaller(intent, this); }*/ } + private void handleURL(Uri uri){ + if(uri==null) + return; + if(!"https".equals(uri.getScheme()) && !"http".equals(uri.getScheme())) + return; + if(!uri.getPath().startsWith("/@")) + return; + AccountSession session=AccountSessionManager.getInstance().getLastActiveAccount(); + if(session==null || !session.activated) + return; + + new GetSearchResults(uri.toString(), null, true) + .setCallback(new Callback<>(){ + @Override + public void onSuccess(SearchResults result){ + Bundle args=new Bundle(); + args.putString("account", session.getID()); + if(result.statuses!=null && !result.statuses.isEmpty()){ + args.putParcelable("status", Parcels.wrap(result.statuses.get(0))); + Nav.go(MainActivity.this, ThreadFragment.class, args); + }else if(result.accounts!=null && !result.accounts.isEmpty()){ + args.putParcelable("profileAccount", Parcels.wrap(result.accounts.get(0))); + Nav.go(MainActivity.this, ProfileFragment.class, args); + }else{ + Toast.makeText(MainActivity.this, R.string.link_not_supported, Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onError(ErrorResponse error){ + error.showToast(MainActivity.this); + } + }) + .wrapProgress(this, R.string.opening_link, true) + .exec(session.getID()); + } + private void showFragmentForNotification(Notification notification, String accountID){ Fragment fragment; Bundle args=new Bundle(); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchFragment.java index e0ed682e2..f9027d645 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchFragment.java @@ -37,7 +37,6 @@ import androidx.recyclerview.widget.RecyclerView; import me.grishka.appkit.Nav; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; -import me.grishka.appkit.api.SimpleCallback; import me.grishka.appkit.utils.MergeRecyclerAdapter; import me.grishka.appkit.utils.V; diff --git a/mastodon/src/main/res/values/strings.xml b/mastodon/src/main/res/values/strings.xml index 2c26bc778..712af65e1 100644 --- a/mastodon/src/main/res/values/strings.xml +++ b/mastodon/src/main/res/values/strings.xml @@ -451,4 +451,6 @@ Mastodon is a decentralized social network, meaning no single company controls it. It’s made up of many independently-run servers, all connected together. What are servers? + Opening link… + This link is not supported in the app \ No newline at end of file