1
0
mirror of https://github.com/KokaKiwi/BarInsta synced 2024-11-22 14:47:29 +00:00

Handle intents (urls/share) from outside the app

This commit is contained in:
Ammar Githam 2020-09-07 21:17:06 +09:00
parent 17a5f978e8
commit 466ac22d23
9 changed files with 262 additions and 195 deletions

View File

@ -17,7 +17,6 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="UnusedAttribute">
<activity
android:name=".activities.MainActivity"
android:launchMode="singleTop"
@ -29,18 +28,15 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEARCH" />
<action android:name="android.intent.action.WEB_SEARCH" />
<!--<action android:name="android.intent.action.SEARCH" />-->
<!--<action android:name="android.intent.action.WEB_SEARCH" />-->
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
@ -49,18 +45,15 @@
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="ig.me" />
<data android:host="www.ig.me" />
<data android:host="instagram.com" />
<data android:host="www.instagram.com" />
<data android:pathPrefix="/" />
<data android:pathPrefix="/p" />
<data android:pathPrefix="/explore/tags" />
</intent-filter>
</activity>
<activity
android:name="awaisomereport.ErrorReporterActivity"
android:allowEmbedded="false"
@ -77,7 +70,6 @@
android:screenOrientation="portrait"
android:taskAffinity="awais.instagrabber.errorreport"
android:theme="@android:style/Theme.DeviceDefault.Dialog" />
<activity
android:name=".directdownload.MultiDirectDialog"
android:allowEmbedded="false"
@ -93,7 +85,6 @@
android:noHistory="false"
android:taskAffinity="awais.instagrabber.multidialog"
android:theme="@style/FlyingGayDialog" />
<activity
android:name=".directdownload.DirectDownload"
android:allowEmbedded="false"
@ -110,7 +101,6 @@
android:lockTaskMode="never"
android:noHistory="false"
android:theme="@style/CompletelyTransparent">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEARCH" />
@ -121,7 +111,6 @@
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
@ -131,98 +120,22 @@
<data android:scheme="https" />
</intent-filter>
</activity>
<!--<activity-->
<!-- android:name=".activities.PostViewer"-->
<!-- android:parentActivityName=".activities.MainActivity">-->
<!-- <meta-data-->
<!-- android:name="android.support.PARENT_ACTIVITY"-->
<!-- android:value=".activities.MainActivity" />-->
<!--</activity>-->
<!--<activity-->
<!-- android:name=".activities.CommentsViewerFragment"-->
<!-- android:parentActivityName=".activities.PostViewer">-->
<!-- <meta-data-->
<!-- android:name="android.support.PARENT_ACTIVITY"-->
<!-- android:value=".activities.PostViewer" />-->
<!--</activity>-->
<!--<activity-->
<!-- android:name=".activities.StoryViewer"-->
<!-- android:parentActivityName=".activities.MainActivity">-->
<!-- <meta-data-->
<!-- android:name="android.support.PARENT_ACTIVITY"-->
<!-- android:value=".activities.MainActivity" />-->
<!--</activity>-->
<!--<activity-->
<!-- android:name=".activities.FollowViewerFragment"-->
<!-- android:parentActivityName=".activities.MainActivity">-->
<!-- <meta-data-->
<!-- android:name="android.support.PARENT_ACTIVITY"-->
<!-- android:value=".activities.MainActivity" />-->
<!--</activity>-->
<!--<activity-->
<!-- android:name=".activities.ProfilePicViewer"-->
<!-- android:parentActivityName=".activities.MainActivity">-->
<!-- <meta-data-->
<!-- android:name="android.support.PARENT_ACTIVITY"-->
<!-- android:value=".activities.MainActivity" />-->
<!--</activity>-->
<!--<activity-->
<!-- android:name=".activities.ProfileViewer"-->
<!-- android:parentActivityName=".activities.PostViewer">-->
<!-- <meta-data-->
<!-- android:name="android.support.PARENT_ACTIVITY"-->
<!-- android:value=".activities.PostViewer" />-->
<!--</activity>-->
<!--<activity-->
<!-- android:name=".activities.SavedViewerFragment"-->
<!-- android:parentActivityName=".activities.MainActivity">-->
<!-- <meta-data-->
<!-- android:name="android.support.PARENT_ACTIVITY"-->
<!-- android:value=".activities.MainActivity" />-->
<!--</activity>-->
<activity
android:name=".activities.NotificationsViewer"
android:parentActivityName=".activities.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.MainActivity" />
</activity>
<activity
android:name=".activities.Login"
android:label="@string/login"
android:parentActivityName=".activities.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.MainActivity" />
</activity>
<!--<activity-->
<!-- android:name=".activities.DirectMessagesActivity"-->
<!-- android:parentActivityName=".activities.MainActivity">-->
<!-- <meta-data-->
<!-- android:name="android.support.PARENT_ACTIVITY"-->
<!-- android:value=".activities.MainActivity" />-->
<!--</activity>-->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"

View File

@ -811,7 +811,7 @@
// if (data != null && !Utils.isEmpty(data)) {
// if (data.indexOf('\n') > 0) data = data.substring(data.lastIndexOf('\n') + 1);
//
// final IntentModel model = Utils.stripString(data);
// final IntentModel model = Utils.parseUrl(data);
// if (model != null) {
// final String modelText = model.getText();
// final IntentModelType modelType = model.getType();

View File

@ -2,8 +2,10 @@ package awais.instagrabber.activities;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.res.TypedArray;
import android.database.MatrixCursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
@ -41,10 +43,12 @@ import awais.instagrabber.asyncs.SuggestionsFetcher;
import awais.instagrabber.customviews.helpers.CustomHideBottomViewOnScrollBehavior;
import awais.instagrabber.databinding.ActivityMainBinding;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.IntentModel;
import awais.instagrabber.models.SuggestionModel;
import awais.instagrabber.models.enums.SuggestionType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.FlavorTown;
import awais.instagrabber.utils.IntentUtils;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.NavigationExtensions.setupWithNavController;
@ -110,6 +114,46 @@ public class MainActivity extends BaseLanguageActivity {
setupSuggestions();
FlavorTown.updateCheck(this);
FlavorTown.changelogCheck(this);
final Intent intent = getIntent();
handleIntent(intent);
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
searchMenuItem = menu.findItem(R.id.search);
if (!showSearch) {
searchMenuItem.setVisible(false);
return true;
}
return setupSearchView();
}
@Override
protected void onSaveInstanceState(@NonNull final Bundle outState) {
outState.putString(FIRST_FRAGMENT_GRAPH_INDEX_KEY, String.valueOf(firstFragmentGraphIndex));
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
final String key = (String) savedInstanceState.get(FIRST_FRAGMENT_GRAPH_INDEX_KEY);
if (key != null) {
try {
firstFragmentGraphIndex = Integer.parseInt(key);
} catch (NumberFormatException ignored) { }
}
setupBottomNavigationBar(false);
}
@Override
public boolean onSupportNavigateUp() {
if (currentNavControllerLiveData != null && currentNavControllerLiveData.getValue() != null) {
return currentNavControllerLiveData.getValue().navigateUp();
}
return false;
}
private void setupSuggestions() {
@ -144,17 +188,6 @@ public class MainActivity extends BaseLanguageActivity {
binding.bottomNavView.requestLayout();
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
searchMenuItem = menu.findItem(R.id.search);
if (!showSearch) {
searchMenuItem.setVisible(false);
return true;
}
return setupSearchView();
}
private boolean setupSearchView() {
final View actionView = searchMenuItem.getActionView();
if (!(actionView instanceof SearchView)) return false;
@ -371,29 +404,92 @@ public class MainActivity extends BaseLanguageActivity {
binding.collapsingToolbarLayout.requestLayout();
}
@Override
protected void onSaveInstanceState(@NonNull final Bundle outState) {
outState.putString(FIRST_FRAGMENT_GRAPH_INDEX_KEY, String.valueOf(firstFragmentGraphIndex));
super.onSaveInstanceState(outState);
private void handleIntent(final Intent intent) {
if (intent == null) return;
final String action = intent.getAction();
final String type = intent.getType();
// Log.d(TAG, action + " " + type);
if (Intent.ACTION_MAIN.equals(action)) return;
if (Intent.ACTION_SEND.equals(action) && type != null) {
if (type.equals("text/plain")) {
handleUrl(intent.getStringExtra(Intent.EXTRA_TEXT));
}
return;
}
if (Intent.ACTION_VIEW.equals(action)) {
final Uri data = intent.getData();
if (data == null) return;
handleUrl(data.toString());
}
}
@Override
protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
final String key = (String) savedInstanceState.get(FIRST_FRAGMENT_GRAPH_INDEX_KEY);
if (key != null) {
try {
firstFragmentGraphIndex = Integer.parseInt(key);
} catch (NumberFormatException ignored) { }
}
setupBottomNavigationBar(false);
private void handleUrl(final String url) {
if (url == null) return;
// Log.d(TAG, url);
final IntentModel intentModel = IntentUtils.parseUrl(url);
if (intentModel == null) return;
showView(intentModel);
}
@Override
public boolean onSupportNavigateUp() {
if (currentNavControllerLiveData != null && currentNavControllerLiveData.getValue() != null) {
return currentNavControllerLiveData.getValue().navigateUp();
}
return false;
private void showView(final IntentModel intentModel) {
switch (intentModel.getType()) {
case USERNAME:
showProfileView(intentModel);
break;
case POST:
showPostView(intentModel);
break;
case LOCATION:
showLocationView(intentModel);
break;
case HASHTAG:
showHashtagView(intentModel);
break;
case UNKNOWN:
default:
Log.w(TAG, "Unknown model type received!");
}
}
private void showProfileView(@NonNull final IntentModel intentModel) {
final String username = intentModel.getText();
// Log.d(TAG, "username: " + username);
final NavController navController = currentNavControllerLiveData.getValue();
if (currentNavControllerLiveData == null || navController == null) return;
final Bundle bundle = new Bundle();
bundle.putString("username", "@" + username);
navController.navigate(R.id.action_global_profileFragment, bundle);
}
private void showPostView(@NonNull final IntentModel intentModel) {
final String shortCode = intentModel.getText();
// Log.d(TAG, "shortCode: " + shortCode);
final NavController navController = currentNavControllerLiveData.getValue();
if (currentNavControllerLiveData == null || navController == null) return;
final Bundle bundle = new Bundle();
bundle.putStringArray("idOrCodeArray", new String[]{shortCode});
bundle.putInt("index", 0);
bundle.putBoolean("isId", false);
navController.navigate(R.id.action_global_postViewFragment, bundle);
}
private void showLocationView(@NonNull final IntentModel intentModel) {
final String locationId = intentModel.getText();
// Log.d(TAG, "locationId: " + locationId);
final NavController navController = currentNavControllerLiveData.getValue();
if (currentNavControllerLiveData == null || navController == null) return;
final Bundle bundle = new Bundle();
bundle.putString("locationId", locationId);
navController.navigate(R.id.action_global_locationFragment, bundle);
}
private void showHashtagView(@NonNull final IntentModel intentModel) {
final String hashtag = intentModel.getText();
// Log.d(TAG, "hashtag: " + hashtag);
final NavController navController = currentNavControllerLiveData.getValue();
if (currentNavControllerLiveData == null || navController == null) return;
final Bundle bundle = new Bundle();
bundle.putString("hashtag", "#" + hashtag);
navController.navigate(R.id.action_global_hashTagFragment, bundle);
}
}

View File

@ -11,7 +11,6 @@ import java.io.File;
import java.net.HttpURLConnection;
import java.net.URL;
import awais.instagrabber.BuildConfig;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.ProfileModel;
import awais.instagrabber.models.ViewerPostModel;
@ -26,6 +25,8 @@ import static awais.instagrabber.utils.Constants.FOLDER_SAVE_TO;
import static awais.instagrabber.utils.Utils.logCollector;
public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]> {
private static final String TAG = "PostFetcher";
private final String shortCode;
private final FetchListener<ViewerPostModel[]> fetchListener;
@ -48,15 +49,39 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
final JSONObject media = new JSONObject(Utils.readFromConnection(conn)).getJSONObject("graphql")
.getJSONObject("shortcode_media");
final String username = media.has("owner") ? media.getJSONObject("owner").getString(Constants.EXTRAS_USERNAME) : null;
ProfileModel profileModel = null;
if (media.has("owner")) {
final JSONObject owner = media.getJSONObject("owner");
profileModel = new ProfileModel(
owner.optBoolean("is_private"),
owner.optBoolean("is_private"),
owner.optBoolean("is_verified"),
owner.optString("id"),
owner.optString("username"),
owner.optString("full_name"),
null,
null,
owner.optString("profile_pic_url"),
owner.optString("profile_pic_url"),
owner.optInt("edge_owner_to_timeline_media"),
owner.optInt("edge_followed_by"),
-1,
owner.optBoolean("followed_by_viewer"),
owner.optBoolean("restricted_by_viewer"),
owner.optBoolean("blocked_by_viewer"),
owner.optBoolean("requested_by_viewer")
);
}
final String username = profileModel == null ? "" : profileModel.getUsername();
// to check if file exists
final File downloadDir = new File(Environment.getExternalStorageDirectory(), "Download" +
(Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER) ? ("/" + username) : ""));
File customDir = null;
if (Utils.settingsHelper.getBoolean(FOLDER_SAVE_TO)) {
final String customPath = Utils.settingsHelper.getString(FOLDER_PATH +
(Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER) ? ("/"+username) : ""));
(Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER)
? ("/" + username)
: ""));
if (!Utils.isEmpty(customPath)) customDir = new File(customPath);
}
@ -83,12 +108,13 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
final long commentsCount = commentObject != null ? commentObject.optLong("count") : 0;
String endCursor = null;
if (commentObject != null && (commentObject = commentObject.optJSONObject("page_info")) != null)
if (commentObject != null && (commentObject = commentObject.optJSONObject("page_info")) != null) {
endCursor = commentObject.optString("end_cursor");
}
final ProfileModel profileModel = ProfileModel.getDefaultProfileModel(null, username);
if (mediaItemType != MediaItemType.MEDIA_TYPE_SLIDER) {
final ViewerPostModel postModel = new ViewerPostModel(mediaItemType,
final ViewerPostModel postModel = new ViewerPostModel(
mediaItemType,
media.getString(Constants.EXTRAS_ID),
isVideo ? media.getString("video_url") : Utils.getHighQualityImage(media),
shortCode,
@ -116,7 +142,8 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
final JSONObject node = children.getJSONObject(i).getJSONObject("node");
final boolean isChildVideo = node.getBoolean("is_video");
postModels[i] = new ViewerPostModel(isChildVideo ? MediaItemType.MEDIA_TYPE_VIDEO : MediaItemType.MEDIA_TYPE_IMAGE,
postModels[i] = new ViewerPostModel(
isChildVideo ? MediaItemType.MEDIA_TYPE_VIDEO : MediaItemType.MEDIA_TYPE_IMAGE,
media.getString(Constants.EXTRAS_ID),
isChildVideo ? node.getString("video_url") : Utils.getHighQualityImage(node),
node.getString(Constants.EXTRAS_SHORTCODE),
@ -142,9 +169,10 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
conn.disconnect();
} catch (Exception e) {
if (logCollector != null)
if (logCollector != null) {
logCollector.appendException(e, LogCollector.LogFile.ASYNC_POST_FETCHER, "doInBackground");
if (BuildConfig.DEBUG) Log.e("AWAISKING_APP", "", e);
}
Log.e(TAG, "Error fetching post", e);
}
return result;
}

View File

@ -33,6 +33,7 @@ import awais.instagrabber.models.ViewerPostModel;
import awais.instagrabber.models.enums.DownloadMethod;
import awais.instagrabber.models.enums.IntentModelType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.IntentUtils;
import awais.instagrabber.utils.Utils;
import static awais.instagrabber.utils.Utils.CHANNEL_ID;
@ -109,7 +110,7 @@ public final class DirectDownload extends Activity {
}
if (data != null && !Utils.isEmpty(data)) {
final IntentModel model = Utils.stripString(data);
final IntentModel model = IntentUtils.parseUrl(data);
if (model != null && model.getType() == IntentModelType.POST) {
final String text = model.getText();

View File

@ -4,6 +4,7 @@ import android.content.res.ColorStateList;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.text.SpannableStringBuilder;
import android.text.style.RelativeSizeSpan;
import android.text.style.StyleSpan;
@ -44,7 +45,6 @@ import awais.instagrabber.customviews.helpers.GridSpacingItemDecoration;
import awais.instagrabber.customviews.helpers.NestedCoordinatorLayout;
import awais.instagrabber.customviews.helpers.RecyclerLazyLoader;
import awais.instagrabber.databinding.FragmentHashtagBinding;
import awais.instagrabber.viewmodels.PostsViewModel;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.HashtagModel;
import awais.instagrabber.models.PostModel;
@ -53,6 +53,7 @@ import awais.instagrabber.models.enums.DownloadMethod;
import awais.instagrabber.models.enums.PostItemType;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.viewmodels.PostsViewModel;
import awaisomereport.LogCollector;
import static awais.instagrabber.utils.Utils.logCollector;
@ -297,7 +298,11 @@ public class HashTagFragment extends Fragment {
private void setTitle() {
final ActionBar actionBar = fragmentActivity.getSupportActionBar();
if (actionBar != null) {
Log.d(TAG, "setting title: " + hashtag);
final Handler handler = new Handler();
handler.postDelayed(() -> {
actionBar.setTitle(hashtag);
}, 200);
}
}

View File

@ -30,7 +30,6 @@ import awais.instagrabber.adapters.PostViewAdapter.OnPostViewChildViewClickListe
import awais.instagrabber.asyncs.PostFetcher;
import awais.instagrabber.asyncs.i.iPostFetcher;
import awais.instagrabber.databinding.FragmentPostViewBinding;
import awais.instagrabber.viewmodels.ViewerPostViewModel;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.interfaces.MentionClickListener;
import awais.instagrabber.models.ViewerPostModel;
@ -40,6 +39,7 @@ import awais.instagrabber.services.MediaService;
import awais.instagrabber.services.ServiceCallback;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.Utils;
import awais.instagrabber.viewmodels.ViewerPostViewModel;
import static androidx.core.content.ContextCompat.checkSelfPermission;
import static awais.instagrabber.utils.Utils.settingsHelper;
@ -71,8 +71,10 @@ public class PostViewFragment extends Fragment {
if (firstPost == null) return;
String idOrCode = isId ? firstPost.getPostId() : firstPost.getShortCode();
if (idOrCode == null) return;
// some values are appended to the post/short code with `_`
if (isId) {
// the post id is appended with `_` in the result
idOrCode = idOrCode.substring(0, idOrCode.indexOf('_'));
}
final int index = idOrCodeList.indexOf(idOrCode);
if (index < 0) return;
final ViewerPostModelWrapper viewerPostModelWrapper = temp.get(index);

View File

@ -0,0 +1,75 @@
package awais.instagrabber.utils;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import awais.instagrabber.models.IntentModel;
import awais.instagrabber.models.enums.IntentModelType;
public final class IntentUtils {
@Nullable
public static IntentModel parseUrl(@NonNull String url) {
final int wwwDel = url.contains("www.") ? 4 : 0;
final boolean isHttps = url.startsWith("https");
IntentModelType type = IntentModelType.UNKNOWN;
if (url.contains("instagram.com/")) {
url = url.substring((isHttps ? 22 : 21) + wwwDel);
// final char firstChar = url.charAt(0);
if (url.startsWith("p/") || url.startsWith("reel/") || url.startsWith("tv/")) {
url = url.substring(url.startsWith("p/") ? 2 : (url.startsWith("tv/") ? 3 : 5));
type = IntentModelType.POST;
} else if (url.startsWith("explore/tags/")) {
url = url.substring(13);
type = IntentModelType.HASHTAG;
} else if (url.startsWith("explore/locations/")) {
url = url.substring(18);
type = IntentModelType.LOCATION;
} else if (url.startsWith("_u/")) { // usually exists in embeds
url = url.substring(3);
type = IntentModelType.USERNAME;
}
url = cleanString(url);
if (TextUtils.isEmpty(url)) return null;
else if (type == IntentModelType.UNKNOWN){
type = IntentModelType.USERNAME;
}
} else if (url.contains("ig.me/u/")) {
url = url.substring((isHttps ? 16 : 15) + wwwDel);
url = cleanString(url);
type = IntentModelType.USERNAME;
} else return null;
final int clipLen = url.length() - 1;
if (url.charAt(clipLen) == '/')
url = url.substring(0, clipLen);
if (type == IntentModelType.LOCATION && url.contains("/")) {
url = url.substring(0, url.indexOf("/"));
}
if (!url.contains("/")) return new IntentModel(type, url);
return null;
}
@NonNull
public static String cleanString(@NonNull final String clipString) {
final int queryIndex = clipString.indexOf('?');
final int paramIndex = clipString.indexOf('#');
int startIndex = -1;
if (queryIndex > 0 && paramIndex > 0) {
if (queryIndex < paramIndex) startIndex = queryIndex;
else if (paramIndex < queryIndex) startIndex = paramIndex;
} else if (queryIndex == -1 && paramIndex >= 0) {
startIndex = paramIndex;
} else if (paramIndex == -1 && queryIndex >= 0) {
startIndex = queryIndex;
}
return startIndex != -1 ? clipString.substring(0, startIndex) : clipString;
}
}

View File

@ -170,59 +170,6 @@ public final class Utils {
return null;
}
@Nullable
public static IntentModel stripString(@NonNull String clipString) {
final int wwwDel = clipString.contains("www.") ? 4 : 0;
final boolean isHttps = clipString.startsWith("https");
IntentModelType type = IntentModelType.UNKNOWN;
if (clipString.contains("instagram.com/")) {
clipString = clipString.substring((isHttps ? 22 : 21) + wwwDel);
final char firstChar = clipString.charAt(0);
if (clipString.startsWith("p/") || clipString.startsWith("reel/") || clipString.startsWith("tv/")) {
clipString = clipString.substring(clipString.startsWith("p/") ? 2 : (clipString.startsWith("tv/") ? 3 : 5));
type = IntentModelType.POST;
} else if (clipString.startsWith("explore/tags/")) {
clipString = clipString.substring(13);
type = IntentModelType.HASHTAG;
} else if (clipString.startsWith("explore/locations/")) {
clipString = clipString.substring(18);
type = IntentModelType.LOCATION;
} else if (clipString.startsWith("_u/")) { // usually exists in embeds
clipString = clipString.substring(3);
type = IntentModelType.USERNAME;
}
clipString = cleanString(clipString);
} else if (clipString.contains("ig.me/u/")) {
clipString = clipString.substring((isHttps ? 16 : 15) + wwwDel);
clipString = cleanString(clipString);
type = IntentModelType.USERNAME;
} else return null;
final int clipLen = clipString.length() - 1;
if (clipString.charAt(clipLen) == '/')
clipString = clipString.substring(0, clipLen);
if (!clipString.contains("/")) return new IntentModel(type, clipString);
else return null;
}
@NonNull
public static String cleanString(@NonNull final String clipString) {
final int queryIndex = clipString.indexOf('?');
final int paramIndex = clipString.indexOf('#');
int startIndex = -1;
if (queryIndex > 0 && paramIndex > 0) {
if (queryIndex < paramIndex) startIndex = queryIndex;
else if (paramIndex < queryIndex) startIndex = paramIndex;
} else if (queryIndex == -1 && paramIndex > 0) startIndex = paramIndex;
else if (paramIndex == -1 && queryIndex > 0) startIndex = queryIndex;
return startIndex != -1 ? clipString.substring(0, startIndex) : clipString;
}
@NonNull
public static CharSequence getMentionText(@NonNull final CharSequence text) {
final int commentLength = text.length();