Open link with the app.
This commit is contained in:
parent
2fa46290a1
commit
9a64dd60b0
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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…
Reference in New Issue