mirror of
https://github.com/KokaKiwi/BarInsta
synced 2024-12-23 05:16:58 +00:00
Handle intents (urls/share) from outside the app
This commit is contained in:
parent
17a5f978e8
commit
466ac22d23
@ -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"
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
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!");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
||||
@ -46,17 +47,41 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
|
||||
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
|
||||
|
||||
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;
|
||||
.getJSONObject("shortcode_media");
|
||||
|
||||
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) : ""));
|
||||
(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);
|
||||
}
|
||||
|
||||
@ -76,19 +101,20 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
|
||||
else {
|
||||
final JSONArray captions = mediaToCaption.optJSONArray("edges");
|
||||
postCaption = captions != null && captions.length() > 0 ?
|
||||
captions.getJSONObject(0).getJSONObject("node").optString("text") : null;
|
||||
captions.getJSONObject(0).getJSONObject("node").optString("text") : null;
|
||||
}
|
||||
|
||||
JSONObject commentObject = media.optJSONObject("edge_media_to_parent_comment");
|
||||
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,
|
||||
@ -99,7 +125,7 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
|
||||
media.getJSONObject("edge_media_preview_like").getLong("count"),
|
||||
media.isNull("location") ? null : media.getJSONObject("location").optString("name"),
|
||||
media.isNull("location") ? null :
|
||||
(media.getJSONObject("location").optString("id") + "/" +
|
||||
(media.getJSONObject("location").optString("id") + "/" +
|
||||
media.getJSONObject("location").optString("slug")));
|
||||
|
||||
postModel.setCommentsCount(commentsCount);
|
||||
@ -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),
|
||||
@ -127,8 +154,8 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
|
||||
media.getJSONObject("edge_media_preview_like").getLong("count"),
|
||||
media.isNull("location") ? null : media.getJSONObject("location").optString("name"),
|
||||
media.isNull("location") ? null :
|
||||
(media.getJSONObject("location").optString("id") + "/" +
|
||||
media.getJSONObject("location").optString("slug")));
|
||||
(media.getJSONObject("location").optString("id") + "/" +
|
||||
media.getJSONObject("location").optString("slug")));
|
||||
postModels[i].setSliderDisplayUrl(node.getString("display_url"));
|
||||
|
||||
Utils.checkExistence(downloadDir, customDir, true, postModels[i]);
|
||||
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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) {
|
||||
actionBar.setTitle(hashtag);
|
||||
Log.d(TAG, "setting title: " + hashtag);
|
||||
final Handler handler = new Handler();
|
||||
handler.postDelayed(() -> {
|
||||
actionBar.setTitle(hashtag);
|
||||
}, 200);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 `_`
|
||||
idOrCode = idOrCode.substring(0, idOrCode.indexOf('_'));
|
||||
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);
|
||||
|
75
app/src/main/java/awais/instagrabber/utils/IntentUtils.java
Normal file
75
app/src/main/java/awais/instagrabber/utils/IntentUtils.java
Normal 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;
|
||||
}
|
||||
}
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user