mirror of
https://github.com/KokaKiwi/BarInsta
synced 2024-11-22 22:57:29 +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:supportsRtl="true"
|
||||||
android:theme="@style/AppTheme"
|
android:theme="@style/AppTheme"
|
||||||
tools:ignore="UnusedAttribute">
|
tools:ignore="UnusedAttribute">
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activities.MainActivity"
|
android:name=".activities.MainActivity"
|
||||||
android:launchMode="singleTop"
|
android:launchMode="singleTop"
|
||||||
@ -29,18 +28,15 @@
|
|||||||
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.SEND" />
|
<action android:name="android.intent.action.SEND" />
|
||||||
<action android:name="android.intent.action.SEARCH" />
|
<!--<action android:name="android.intent.action.SEARCH" />-->
|
||||||
<action android:name="android.intent.action.WEB_SEARCH" />
|
<!--<action android:name="android.intent.action.WEB_SEARCH" />-->
|
||||||
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
|
||||||
<data android:mimeType="text/plain" />
|
<data android:mimeType="text/plain" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
|
||||||
@ -49,18 +45,15 @@
|
|||||||
|
|
||||||
<data android:scheme="http" />
|
<data android:scheme="http" />
|
||||||
<data android:scheme="https" />
|
<data android:scheme="https" />
|
||||||
|
|
||||||
<data android:host="ig.me" />
|
<data android:host="ig.me" />
|
||||||
<data android:host="www.ig.me" />
|
<data android:host="www.ig.me" />
|
||||||
<data android:host="instagram.com" />
|
<data android:host="instagram.com" />
|
||||||
<data android:host="www.instagram.com" />
|
<data android:host="www.instagram.com" />
|
||||||
|
|
||||||
<data android:pathPrefix="/" />
|
<data android:pathPrefix="/" />
|
||||||
<data android:pathPrefix="/p" />
|
<data android:pathPrefix="/p" />
|
||||||
<data android:pathPrefix="/explore/tags" />
|
<data android:pathPrefix="/explore/tags" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="awaisomereport.ErrorReporterActivity"
|
android:name="awaisomereport.ErrorReporterActivity"
|
||||||
android:allowEmbedded="false"
|
android:allowEmbedded="false"
|
||||||
@ -77,7 +70,6 @@
|
|||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
android:taskAffinity="awais.instagrabber.errorreport"
|
android:taskAffinity="awais.instagrabber.errorreport"
|
||||||
android:theme="@android:style/Theme.DeviceDefault.Dialog" />
|
android:theme="@android:style/Theme.DeviceDefault.Dialog" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".directdownload.MultiDirectDialog"
|
android:name=".directdownload.MultiDirectDialog"
|
||||||
android:allowEmbedded="false"
|
android:allowEmbedded="false"
|
||||||
@ -93,7 +85,6 @@
|
|||||||
android:noHistory="false"
|
android:noHistory="false"
|
||||||
android:taskAffinity="awais.instagrabber.multidialog"
|
android:taskAffinity="awais.instagrabber.multidialog"
|
||||||
android:theme="@style/FlyingGayDialog" />
|
android:theme="@style/FlyingGayDialog" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".directdownload.DirectDownload"
|
android:name=".directdownload.DirectDownload"
|
||||||
android:allowEmbedded="false"
|
android:allowEmbedded="false"
|
||||||
@ -110,7 +101,6 @@
|
|||||||
android:lockTaskMode="never"
|
android:lockTaskMode="never"
|
||||||
android:noHistory="false"
|
android:noHistory="false"
|
||||||
android:theme="@style/CompletelyTransparent">
|
android:theme="@style/CompletelyTransparent">
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.SEND" />
|
<action android:name="android.intent.action.SEND" />
|
||||||
<action android:name="android.intent.action.SEARCH" />
|
<action android:name="android.intent.action.SEARCH" />
|
||||||
@ -121,7 +111,6 @@
|
|||||||
|
|
||||||
<data android:mimeType="text/plain" />
|
<data android:mimeType="text/plain" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
@ -131,98 +120,22 @@
|
|||||||
<data android:scheme="https" />
|
<data android:scheme="https" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</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
|
<activity
|
||||||
android:name=".activities.NotificationsViewer"
|
android:name=".activities.NotificationsViewer"
|
||||||
android:parentActivityName=".activities.MainActivity">
|
android:parentActivityName=".activities.MainActivity">
|
||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.support.PARENT_ACTIVITY"
|
android:name="android.support.PARENT_ACTIVITY"
|
||||||
android:value=".activities.MainActivity" />
|
android:value=".activities.MainActivity" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activities.Login"
|
android:name=".activities.Login"
|
||||||
android:label="@string/login"
|
android:label="@string/login"
|
||||||
android:parentActivityName=".activities.MainActivity">
|
android:parentActivityName=".activities.MainActivity">
|
||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.support.PARENT_ACTIVITY"
|
android:name="android.support.PARENT_ACTIVITY"
|
||||||
android:value=".activities.MainActivity" />
|
android:value=".activities.MainActivity" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<!--<activity-->
|
|
||||||
<!-- android:name=".activities.DirectMessagesActivity"-->
|
|
||||||
<!-- android:parentActivityName=".activities.MainActivity">-->
|
|
||||||
|
|
||||||
<!-- <meta-data-->
|
|
||||||
<!-- android:name="android.support.PARENT_ACTIVITY"-->
|
|
||||||
<!-- android:value=".activities.MainActivity" />-->
|
|
||||||
<!--</activity>-->
|
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.core.content.FileProvider"
|
android:name="androidx.core.content.FileProvider"
|
||||||
android:authorities="${applicationId}.provider"
|
android:authorities="${applicationId}.provider"
|
||||||
|
@ -811,7 +811,7 @@
|
|||||||
// if (data != null && !Utils.isEmpty(data)) {
|
// if (data != null && !Utils.isEmpty(data)) {
|
||||||
// if (data.indexOf('\n') > 0) data = data.substring(data.lastIndexOf('\n') + 1);
|
// 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) {
|
// if (model != null) {
|
||||||
// final String modelText = model.getText();
|
// final String modelText = model.getText();
|
||||||
// final IntentModelType modelType = model.getType();
|
// final IntentModelType modelType = model.getType();
|
||||||
|
@ -2,8 +2,10 @@ package awais.instagrabber.activities;
|
|||||||
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Intent;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
import android.database.MatrixCursor;
|
import android.database.MatrixCursor;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@ -41,10 +43,12 @@ import awais.instagrabber.asyncs.SuggestionsFetcher;
|
|||||||
import awais.instagrabber.customviews.helpers.CustomHideBottomViewOnScrollBehavior;
|
import awais.instagrabber.customviews.helpers.CustomHideBottomViewOnScrollBehavior;
|
||||||
import awais.instagrabber.databinding.ActivityMainBinding;
|
import awais.instagrabber.databinding.ActivityMainBinding;
|
||||||
import awais.instagrabber.interfaces.FetchListener;
|
import awais.instagrabber.interfaces.FetchListener;
|
||||||
|
import awais.instagrabber.models.IntentModel;
|
||||||
import awais.instagrabber.models.SuggestionModel;
|
import awais.instagrabber.models.SuggestionModel;
|
||||||
import awais.instagrabber.models.enums.SuggestionType;
|
import awais.instagrabber.models.enums.SuggestionType;
|
||||||
import awais.instagrabber.utils.Constants;
|
import awais.instagrabber.utils.Constants;
|
||||||
import awais.instagrabber.utils.FlavorTown;
|
import awais.instagrabber.utils.FlavorTown;
|
||||||
|
import awais.instagrabber.utils.IntentUtils;
|
||||||
import awais.instagrabber.utils.Utils;
|
import awais.instagrabber.utils.Utils;
|
||||||
|
|
||||||
import static awais.instagrabber.utils.NavigationExtensions.setupWithNavController;
|
import static awais.instagrabber.utils.NavigationExtensions.setupWithNavController;
|
||||||
@ -110,6 +114,46 @@ public class MainActivity extends BaseLanguageActivity {
|
|||||||
setupSuggestions();
|
setupSuggestions();
|
||||||
FlavorTown.updateCheck(this);
|
FlavorTown.updateCheck(this);
|
||||||
FlavorTown.changelogCheck(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() {
|
private void setupSuggestions() {
|
||||||
@ -144,17 +188,6 @@ public class MainActivity extends BaseLanguageActivity {
|
|||||||
binding.bottomNavView.requestLayout();
|
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() {
|
private boolean setupSearchView() {
|
||||||
final View actionView = searchMenuItem.getActionView();
|
final View actionView = searchMenuItem.getActionView();
|
||||||
if (!(actionView instanceof SearchView)) return false;
|
if (!(actionView instanceof SearchView)) return false;
|
||||||
@ -371,29 +404,92 @@ public class MainActivity extends BaseLanguageActivity {
|
|||||||
binding.collapsingToolbarLayout.requestLayout();
|
binding.collapsingToolbarLayout.requestLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private void handleIntent(final Intent intent) {
|
||||||
protected void onSaveInstanceState(@NonNull final Bundle outState) {
|
if (intent == null) return;
|
||||||
outState.putString(FIRST_FRAGMENT_GRAPH_INDEX_KEY, String.valueOf(firstFragmentGraphIndex));
|
final String action = intent.getAction();
|
||||||
super.onSaveInstanceState(outState);
|
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
|
private void handleUrl(final String url) {
|
||||||
protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) {
|
if (url == null) return;
|
||||||
super.onRestoreInstanceState(savedInstanceState);
|
// Log.d(TAG, url);
|
||||||
final String key = (String) savedInstanceState.get(FIRST_FRAGMENT_GRAPH_INDEX_KEY);
|
final IntentModel intentModel = IntentUtils.parseUrl(url);
|
||||||
if (key != null) {
|
if (intentModel == null) return;
|
||||||
try {
|
showView(intentModel);
|
||||||
firstFragmentGraphIndex = Integer.parseInt(key);
|
|
||||||
} catch (NumberFormatException ignored) { }
|
|
||||||
}
|
|
||||||
setupBottomNavigationBar(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private void showView(final IntentModel intentModel) {
|
||||||
public boolean onSupportNavigateUp() {
|
switch (intentModel.getType()) {
|
||||||
if (currentNavControllerLiveData != null && currentNavControllerLiveData.getValue() != null) {
|
case USERNAME:
|
||||||
return currentNavControllerLiveData.getValue().navigateUp();
|
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.HttpURLConnection;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
|
||||||
import awais.instagrabber.BuildConfig;
|
|
||||||
import awais.instagrabber.interfaces.FetchListener;
|
import awais.instagrabber.interfaces.FetchListener;
|
||||||
import awais.instagrabber.models.ProfileModel;
|
import awais.instagrabber.models.ProfileModel;
|
||||||
import awais.instagrabber.models.ViewerPostModel;
|
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;
|
import static awais.instagrabber.utils.Utils.logCollector;
|
||||||
|
|
||||||
public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]> {
|
public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]> {
|
||||||
|
private static final String TAG = "PostFetcher";
|
||||||
|
|
||||||
private final String shortCode;
|
private final String shortCode;
|
||||||
private final FetchListener<ViewerPostModel[]> fetchListener;
|
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")
|
final JSONObject media = new JSONObject(Utils.readFromConnection(conn)).getJSONObject("graphql")
|
||||||
.getJSONObject("shortcode_media");
|
.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
|
// to check if file exists
|
||||||
final File downloadDir = new File(Environment.getExternalStorageDirectory(), "Download" +
|
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;
|
File customDir = null;
|
||||||
if (Utils.settingsHelper.getBoolean(FOLDER_SAVE_TO)) {
|
if (Utils.settingsHelper.getBoolean(FOLDER_SAVE_TO)) {
|
||||||
final String customPath = Utils.settingsHelper.getString(FOLDER_PATH +
|
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);
|
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;
|
final long commentsCount = commentObject != null ? commentObject.optLong("count") : 0;
|
||||||
|
|
||||||
String endCursor = null;
|
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");
|
endCursor = commentObject.optString("end_cursor");
|
||||||
|
}
|
||||||
|
|
||||||
final ProfileModel profileModel = ProfileModel.getDefaultProfileModel(null, username);
|
|
||||||
if (mediaItemType != MediaItemType.MEDIA_TYPE_SLIDER) {
|
if (mediaItemType != MediaItemType.MEDIA_TYPE_SLIDER) {
|
||||||
final ViewerPostModel postModel = new ViewerPostModel(mediaItemType,
|
final ViewerPostModel postModel = new ViewerPostModel(
|
||||||
|
mediaItemType,
|
||||||
media.getString(Constants.EXTRAS_ID),
|
media.getString(Constants.EXTRAS_ID),
|
||||||
isVideo ? media.getString("video_url") : Utils.getHighQualityImage(media),
|
isVideo ? media.getString("video_url") : Utils.getHighQualityImage(media),
|
||||||
shortCode,
|
shortCode,
|
||||||
@ -116,7 +142,8 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
|
|||||||
final JSONObject node = children.getJSONObject(i).getJSONObject("node");
|
final JSONObject node = children.getJSONObject(i).getJSONObject("node");
|
||||||
final boolean isChildVideo = node.getBoolean("is_video");
|
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),
|
media.getString(Constants.EXTRAS_ID),
|
||||||
isChildVideo ? node.getString("video_url") : Utils.getHighQualityImage(node),
|
isChildVideo ? node.getString("video_url") : Utils.getHighQualityImage(node),
|
||||||
node.getString(Constants.EXTRAS_SHORTCODE),
|
node.getString(Constants.EXTRAS_SHORTCODE),
|
||||||
@ -142,9 +169,10 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
|
|||||||
|
|
||||||
conn.disconnect();
|
conn.disconnect();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (logCollector != null)
|
if (logCollector != null) {
|
||||||
logCollector.appendException(e, LogCollector.LogFile.ASYNC_POST_FETCHER, "doInBackground");
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ import awais.instagrabber.models.ViewerPostModel;
|
|||||||
import awais.instagrabber.models.enums.DownloadMethod;
|
import awais.instagrabber.models.enums.DownloadMethod;
|
||||||
import awais.instagrabber.models.enums.IntentModelType;
|
import awais.instagrabber.models.enums.IntentModelType;
|
||||||
import awais.instagrabber.utils.Constants;
|
import awais.instagrabber.utils.Constants;
|
||||||
|
import awais.instagrabber.utils.IntentUtils;
|
||||||
import awais.instagrabber.utils.Utils;
|
import awais.instagrabber.utils.Utils;
|
||||||
|
|
||||||
import static awais.instagrabber.utils.Utils.CHANNEL_ID;
|
import static awais.instagrabber.utils.Utils.CHANNEL_ID;
|
||||||
@ -109,7 +110,7 @@ public final class DirectDownload extends Activity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (data != null && !Utils.isEmpty(data)) {
|
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) {
|
if (model != null && model.getType() == IntentModelType.POST) {
|
||||||
final String text = model.getText();
|
final String text = model.getText();
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import android.content.res.ColorStateList;
|
|||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
import android.text.SpannableStringBuilder;
|
import android.text.SpannableStringBuilder;
|
||||||
import android.text.style.RelativeSizeSpan;
|
import android.text.style.RelativeSizeSpan;
|
||||||
import android.text.style.StyleSpan;
|
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.NestedCoordinatorLayout;
|
||||||
import awais.instagrabber.customviews.helpers.RecyclerLazyLoader;
|
import awais.instagrabber.customviews.helpers.RecyclerLazyLoader;
|
||||||
import awais.instagrabber.databinding.FragmentHashtagBinding;
|
import awais.instagrabber.databinding.FragmentHashtagBinding;
|
||||||
import awais.instagrabber.viewmodels.PostsViewModel;
|
|
||||||
import awais.instagrabber.interfaces.FetchListener;
|
import awais.instagrabber.interfaces.FetchListener;
|
||||||
import awais.instagrabber.models.HashtagModel;
|
import awais.instagrabber.models.HashtagModel;
|
||||||
import awais.instagrabber.models.PostModel;
|
import awais.instagrabber.models.PostModel;
|
||||||
@ -53,6 +53,7 @@ import awais.instagrabber.models.enums.DownloadMethod;
|
|||||||
import awais.instagrabber.models.enums.PostItemType;
|
import awais.instagrabber.models.enums.PostItemType;
|
||||||
import awais.instagrabber.utils.Constants;
|
import awais.instagrabber.utils.Constants;
|
||||||
import awais.instagrabber.utils.Utils;
|
import awais.instagrabber.utils.Utils;
|
||||||
|
import awais.instagrabber.viewmodels.PostsViewModel;
|
||||||
import awaisomereport.LogCollector;
|
import awaisomereport.LogCollector;
|
||||||
|
|
||||||
import static awais.instagrabber.utils.Utils.logCollector;
|
import static awais.instagrabber.utils.Utils.logCollector;
|
||||||
@ -297,7 +298,11 @@ public class HashTagFragment extends Fragment {
|
|||||||
private void setTitle() {
|
private void setTitle() {
|
||||||
final ActionBar actionBar = fragmentActivity.getSupportActionBar();
|
final ActionBar actionBar = fragmentActivity.getSupportActionBar();
|
||||||
if (actionBar != null) {
|
if (actionBar != null) {
|
||||||
|
Log.d(TAG, "setting title: " + hashtag);
|
||||||
|
final Handler handler = new Handler();
|
||||||
|
handler.postDelayed(() -> {
|
||||||
actionBar.setTitle(hashtag);
|
actionBar.setTitle(hashtag);
|
||||||
|
}, 200);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,6 @@ import awais.instagrabber.adapters.PostViewAdapter.OnPostViewChildViewClickListe
|
|||||||
import awais.instagrabber.asyncs.PostFetcher;
|
import awais.instagrabber.asyncs.PostFetcher;
|
||||||
import awais.instagrabber.asyncs.i.iPostFetcher;
|
import awais.instagrabber.asyncs.i.iPostFetcher;
|
||||||
import awais.instagrabber.databinding.FragmentPostViewBinding;
|
import awais.instagrabber.databinding.FragmentPostViewBinding;
|
||||||
import awais.instagrabber.viewmodels.ViewerPostViewModel;
|
|
||||||
import awais.instagrabber.interfaces.FetchListener;
|
import awais.instagrabber.interfaces.FetchListener;
|
||||||
import awais.instagrabber.interfaces.MentionClickListener;
|
import awais.instagrabber.interfaces.MentionClickListener;
|
||||||
import awais.instagrabber.models.ViewerPostModel;
|
import awais.instagrabber.models.ViewerPostModel;
|
||||||
@ -40,6 +39,7 @@ import awais.instagrabber.services.MediaService;
|
|||||||
import awais.instagrabber.services.ServiceCallback;
|
import awais.instagrabber.services.ServiceCallback;
|
||||||
import awais.instagrabber.utils.Constants;
|
import awais.instagrabber.utils.Constants;
|
||||||
import awais.instagrabber.utils.Utils;
|
import awais.instagrabber.utils.Utils;
|
||||||
|
import awais.instagrabber.viewmodels.ViewerPostViewModel;
|
||||||
|
|
||||||
import static androidx.core.content.ContextCompat.checkSelfPermission;
|
import static androidx.core.content.ContextCompat.checkSelfPermission;
|
||||||
import static awais.instagrabber.utils.Utils.settingsHelper;
|
import static awais.instagrabber.utils.Utils.settingsHelper;
|
||||||
@ -71,8 +71,10 @@ public class PostViewFragment extends Fragment {
|
|||||||
if (firstPost == null) return;
|
if (firstPost == null) return;
|
||||||
String idOrCode = isId ? firstPost.getPostId() : firstPost.getShortCode();
|
String idOrCode = isId ? firstPost.getPostId() : firstPost.getShortCode();
|
||||||
if (idOrCode == null) return;
|
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('_'));
|
idOrCode = idOrCode.substring(0, idOrCode.indexOf('_'));
|
||||||
|
}
|
||||||
final int index = idOrCodeList.indexOf(idOrCode);
|
final int index = idOrCodeList.indexOf(idOrCode);
|
||||||
if (index < 0) return;
|
if (index < 0) return;
|
||||||
final ViewerPostModelWrapper viewerPostModelWrapper = temp.get(index);
|
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;
|
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
|
@NonNull
|
||||||
public static CharSequence getMentionText(@NonNull final CharSequence text) {
|
public static CharSequence getMentionText(@NonNull final CharSequence text) {
|
||||||
final int commentLength = text.length();
|
final int commentLength = text.length();
|
||||||
|
Loading…
Reference in New Issue
Block a user