Loading app/src/main/AndroidManifest.xml +12 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,18 @@ <data android:mimeType="image/*" /> <data android:mimeType="video/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- The app is a good candidate for URL in https://domain.name/@xxxxxx--> <!-- It should cover every URLs for statuses but some others not related to mastodon matching this scheme --> <data android:host="*" android:pathPrefix="/@" android:scheme="https" /> </intent-filter> </activity> <activity-alias Loading app/src/main/java/app/fedilab/android/BaseMainActivity.java +71 −1 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; Loading Loading @@ -998,8 +999,77 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt Toasty.warning(BaseMainActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show(); } } } else if (Intent.ACTION_VIEW.equals(action)) { String url = intent.getDataString(); if (url == null) { intent.replaceExtras(new Bundle()); intent.setAction(""); intent.setData(null); intent.setFlags(0); return; } Matcher matcher; matcher = Patterns.WEB_URL.matcher(url); boolean isUrl = false; while (matcher.find()) { isUrl = true; } if (!isUrl) { intent.replaceExtras(new Bundle()); intent.setAction(""); intent.setData(null); intent.setFlags(0); return; } //Here we know that the intent contains a valid URL if (!url.contains("medium.com")) { Pattern link = Pattern.compile("https?://([\\da-z.-]+\\.[a-z.]{2,10})/(@[\\w._-]*[0-9]*)(/[0-9]+)?$"); Matcher matcherLink = null; matcherLink = link.matcher(url); if (matcherLink.find()) { if (matcherLink.group(3) != null && Objects.requireNonNull(matcherLink.group(3)).length() > 0) { //It's a toot CrossActionHelper.fetchRemoteStatus(BaseMainActivity.this, currentAccount, url, new CrossActionHelper.Callback() { @Override public void federatedStatus(Status status) { Intent intent = new Intent(BaseMainActivity.this, ContextActivity.class); intent.putExtra(Helper.ARG_STATUS, status); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } @Override public void federatedAccount(app.fedilab.android.client.entities.api.Account account) { } }); } else {//It's an account CrossActionHelper.fetchRemoteAccount(BaseMainActivity.this, currentAccount, matcherLink.group(2) + "@" + matcherLink.group(1), new CrossActionHelper.Callback() { @Override public void federatedStatus(Status status) { } @Override public void federatedAccount(app.fedilab.android.client.entities.api.Account account) { Intent intent = new Intent(BaseMainActivity.this, ProfileActivity.class); Bundle b = new Bundle(); b.putSerializable(Helper.ARG_ACCOUNT, account); intent.putExtras(b); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } }); } } else { Helper.forwardToBrowser(BaseMainActivity.this, intent); } } else { Helper.forwardToBrowser(BaseMainActivity.this, intent); } } intent.replaceExtras(new Bundle()); intent.setAction(""); intent.setData(null); intent.setFlags(0); } private void manageFilters(int position) { Loading app/src/main/java/app/fedilab/android/helper/Helper.java +29 −0 Original line number Diff line number Diff line Loading @@ -26,11 +26,13 @@ import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; Loading @@ -53,6 +55,7 @@ import android.os.CountDownTimer; import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.os.Parcelable; import android.provider.MediaStore; import android.provider.OpenableColumns; import android.text.TextUtils; Loading Loading @@ -1914,6 +1917,32 @@ public class Helper { Runtime.getRuntime().exit(0); } public static void forwardToBrowser(Activity activity, Intent i) { Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(i.getData(), i.getType()); List<ResolveInfo> activities = activity.getPackageManager().queryIntentActivities(intent, 0); ArrayList<Intent> targetIntents = new ArrayList<>(); String thisPackageName = activity.getPackageName(); for (ResolveInfo currentInfo : activities) { String packageName = currentInfo.activityInfo.packageName; if (!thisPackageName.equals(packageName)) { Intent targetIntent = new Intent(android.content.Intent.ACTION_VIEW); targetIntent.setDataAndType(intent.getData(), intent.getType()); targetIntent.setPackage(intent.getPackage()); targetIntent.setComponent(new ComponentName(packageName, currentInfo.activityInfo.name)); targetIntents.add(targetIntent); } } if (targetIntents.size() > 0) { Intent chooserIntent = Intent.createChooser(targetIntents.remove(0), activity.getString(R.string.open_with)); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[]{})); activity.startActivity(chooserIntent); } } //Enum that described actions to replace inside a toot content public enum PatternType { MENTION, Loading Loading
app/src/main/AndroidManifest.xml +12 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,18 @@ <data android:mimeType="image/*" /> <data android:mimeType="video/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- The app is a good candidate for URL in https://domain.name/@xxxxxx--> <!-- It should cover every URLs for statuses but some others not related to mastodon matching this scheme --> <data android:host="*" android:pathPrefix="/@" android:scheme="https" /> </intent-filter> </activity> <activity-alias Loading
app/src/main/java/app/fedilab/android/BaseMainActivity.java +71 −1 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; Loading Loading @@ -998,8 +999,77 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt Toasty.warning(BaseMainActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show(); } } } else if (Intent.ACTION_VIEW.equals(action)) { String url = intent.getDataString(); if (url == null) { intent.replaceExtras(new Bundle()); intent.setAction(""); intent.setData(null); intent.setFlags(0); return; } Matcher matcher; matcher = Patterns.WEB_URL.matcher(url); boolean isUrl = false; while (matcher.find()) { isUrl = true; } if (!isUrl) { intent.replaceExtras(new Bundle()); intent.setAction(""); intent.setData(null); intent.setFlags(0); return; } //Here we know that the intent contains a valid URL if (!url.contains("medium.com")) { Pattern link = Pattern.compile("https?://([\\da-z.-]+\\.[a-z.]{2,10})/(@[\\w._-]*[0-9]*)(/[0-9]+)?$"); Matcher matcherLink = null; matcherLink = link.matcher(url); if (matcherLink.find()) { if (matcherLink.group(3) != null && Objects.requireNonNull(matcherLink.group(3)).length() > 0) { //It's a toot CrossActionHelper.fetchRemoteStatus(BaseMainActivity.this, currentAccount, url, new CrossActionHelper.Callback() { @Override public void federatedStatus(Status status) { Intent intent = new Intent(BaseMainActivity.this, ContextActivity.class); intent.putExtra(Helper.ARG_STATUS, status); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } @Override public void federatedAccount(app.fedilab.android.client.entities.api.Account account) { } }); } else {//It's an account CrossActionHelper.fetchRemoteAccount(BaseMainActivity.this, currentAccount, matcherLink.group(2) + "@" + matcherLink.group(1), new CrossActionHelper.Callback() { @Override public void federatedStatus(Status status) { } @Override public void federatedAccount(app.fedilab.android.client.entities.api.Account account) { Intent intent = new Intent(BaseMainActivity.this, ProfileActivity.class); Bundle b = new Bundle(); b.putSerializable(Helper.ARG_ACCOUNT, account); intent.putExtras(b); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } }); } } else { Helper.forwardToBrowser(BaseMainActivity.this, intent); } } else { Helper.forwardToBrowser(BaseMainActivity.this, intent); } } intent.replaceExtras(new Bundle()); intent.setAction(""); intent.setData(null); intent.setFlags(0); } private void manageFilters(int position) { Loading
app/src/main/java/app/fedilab/android/helper/Helper.java +29 −0 Original line number Diff line number Diff line Loading @@ -26,11 +26,13 @@ import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; Loading @@ -53,6 +55,7 @@ import android.os.CountDownTimer; import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.os.Parcelable; import android.provider.MediaStore; import android.provider.OpenableColumns; import android.text.TextUtils; Loading Loading @@ -1914,6 +1917,32 @@ public class Helper { Runtime.getRuntime().exit(0); } public static void forwardToBrowser(Activity activity, Intent i) { Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(i.getData(), i.getType()); List<ResolveInfo> activities = activity.getPackageManager().queryIntentActivities(intent, 0); ArrayList<Intent> targetIntents = new ArrayList<>(); String thisPackageName = activity.getPackageName(); for (ResolveInfo currentInfo : activities) { String packageName = currentInfo.activityInfo.packageName; if (!thisPackageName.equals(packageName)) { Intent targetIntent = new Intent(android.content.Intent.ACTION_VIEW); targetIntent.setDataAndType(intent.getData(), intent.getType()); targetIntent.setPackage(intent.getPackage()); targetIntent.setComponent(new ComponentName(packageName, currentInfo.activityInfo.name)); targetIntents.add(targetIntent); } } if (targetIntents.size() > 0) { Intent chooserIntent = Intent.createChooser(targetIntents.remove(0), activity.getString(R.string.open_with)); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[]{})); activity.startActivity(chooserIntent); } } //Enum that described actions to replace inside a toot content public enum PatternType { MENTION, Loading