mirror of
https://github.com/KokaKiwi/BarInsta
synced 2024-11-24 23:57:30 +00:00
v16.7
This commit is contained in:
parent
cdbc0173c4
commit
394ffe19b7
@ -9,8 +9,11 @@ android {
|
|||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 29
|
targetSdkVersion 29
|
||||||
|
|
||||||
versionCode 27
|
// REMEMBER TO CHANGE versionCode as well
|
||||||
versionName '16.6'
|
// 16.7 is 31
|
||||||
|
|
||||||
|
versionCode 31
|
||||||
|
versionName '16.7'
|
||||||
|
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@ import android.widget.TextView;
|
|||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.core.view.GravityCompat;
|
import androidx.core.view.GravityCompat;
|
||||||
@ -34,15 +33,14 @@ import androidx.core.widget.ImageViewCompat;
|
|||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
|
|
||||||
import com.bumptech.glide.Glide;
|
|
||||||
import com.bumptech.glide.load.DataSource;
|
|
||||||
import com.bumptech.glide.load.engine.GlideException;
|
|
||||||
import com.bumptech.glide.request.RequestListener;
|
|
||||||
import com.bumptech.glide.request.target.Target;
|
|
||||||
import com.google.android.exoplayer2.SimpleExoPlayer;
|
import com.google.android.exoplayer2.SimpleExoPlayer;
|
||||||
import com.google.android.material.appbar.AppBarLayout;
|
import com.google.android.material.appbar.AppBarLayout;
|
||||||
import com.google.android.material.shape.MaterialShapeDrawable;
|
import com.google.android.material.shape.MaterialShapeDrawable;
|
||||||
|
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
import awais.instagrabber.activities.FollowViewer;
|
import awais.instagrabber.activities.FollowViewer;
|
||||||
@ -85,9 +83,6 @@ import static awais.instagrabber.utils.Constants.AUTOLOAD_POSTS;
|
|||||||
import static awais.instagrabber.utils.Constants.BOTTOM_TOOLBAR;
|
import static awais.instagrabber.utils.Constants.BOTTOM_TOOLBAR;
|
||||||
import static awais.instagrabber.utils.Utils.logCollector;
|
import static awais.instagrabber.utils.Utils.logCollector;
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.net.URL;
|
|
||||||
|
|
||||||
public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener {
|
public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener {
|
||||||
private static AsyncTask<?, ?, ?> currentlyExecuting;
|
private static AsyncTask<?, ?, ?> currentlyExecuting;
|
||||||
private AsyncTask<Void, Void, FeedStoryModel[]> prevStoriesFetcher;
|
private AsyncTask<Void, Void, FeedStoryModel[]> prevStoriesFetcher;
|
||||||
@ -148,6 +143,12 @@ public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener {
|
|||||||
model.setPageCursor(false, null);
|
model.setPageCursor(false, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
main.mainBinding.swipeRefreshLayout.setRefreshing(false);
|
||||||
|
main.mainBinding.privatePage1.setImageResource(R.drawable.ic_cancel);
|
||||||
|
main.mainBinding.privatePage2.setText(R.string.empty_acc);
|
||||||
|
main.mainBinding.privatePage.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
private final FetchListener<FeedModel[]> feedFetchListener = new FetchListener<FeedModel[]>() {
|
private final FetchListener<FeedModel[]> feedFetchListener = new FetchListener<FeedModel[]>() {
|
||||||
@ -403,7 +404,6 @@ public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener {
|
|||||||
}
|
}
|
||||||
if (color == -1 || color == 0) color = resources.getBoolean(R.bool.isNight) ? 0xff212121 : 0xfff5f5f5;
|
if (color == -1 || color == 0) color = resources.getBoolean(R.bool.isNight) ? 0xff212121 : 0xfff5f5f5;
|
||||||
main.mainBinding.profileInfo.setBackgroundColor(color);
|
main.mainBinding.profileInfo.setBackgroundColor(color);
|
||||||
main.mainBinding.profileInfo.setClickable(true);
|
|
||||||
if (!isBottomToolbar) main.mainBinding.toolbar.toolbar.setBackgroundColor(color);
|
if (!isBottomToolbar) main.mainBinding.toolbar.toolbar.setBackgroundColor(color);
|
||||||
|
|
||||||
main.mainBinding.appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
|
main.mainBinding.appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
|
||||||
@ -628,6 +628,9 @@ public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener {
|
|||||||
main.mainBinding.mainBiography.setMentionClickListener(null);
|
main.mainBinding.mainBiography.setMentionClickListener(null);
|
||||||
main.mainBinding.mainUrl.setVisibility(View.GONE);
|
main.mainBinding.mainUrl.setVisibility(View.GONE);
|
||||||
main.mainBinding.isVerified.setVisibility(View.GONE);
|
main.mainBinding.isVerified.setVisibility(View.GONE);
|
||||||
|
main.mainBinding.btnFollow.setVisibility(View.GONE);
|
||||||
|
main.mainBinding.btnRestrict.setVisibility(View.GONE);
|
||||||
|
main.mainBinding.btnBlock.setVisibility(View.GONE);
|
||||||
|
|
||||||
main.mainBinding.mainPosts.setNestedScrollingEnabled(false);
|
main.mainBinding.mainPosts.setNestedScrollingEnabled(false);
|
||||||
main.mainBinding.highlightsList.setVisibility(View.GONE);
|
main.mainBinding.highlightsList.setVisibility(View.GONE);
|
||||||
@ -666,7 +669,8 @@ public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener {
|
|||||||
main.mainBinding.isVerified.setVisibility(profileModel.isVerified() ? View.VISIBLE : View.GONE);
|
main.mainBinding.isVerified.setVisibility(profileModel.isVerified() ? View.VISIBLE : View.GONE);
|
||||||
final String profileId = profileModel.getId();
|
final String profileId = profileModel.getId();
|
||||||
|
|
||||||
final boolean isLoggedIn = !Utils.isEmpty(Utils.settingsHelper.getString(Constants.COOKIE));
|
final String cookie = Utils.settingsHelper.getString(Constants.COOKIE);
|
||||||
|
final boolean isLoggedIn = !Utils.isEmpty(cookie);
|
||||||
if (isLoggedIn) {
|
if (isLoggedIn) {
|
||||||
new StoryStatusFetcher(profileId, result -> {
|
new StoryStatusFetcher(profileId, result -> {
|
||||||
main.storyModels = result;
|
main.storyModels = result;
|
||||||
@ -679,6 +683,51 @@ public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener {
|
|||||||
main.highlightsAdapter.setData(result);
|
main.highlightsAdapter.setData(result);
|
||||||
}
|
}
|
||||||
}).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
}).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
|
|
||||||
|
final String myId = Utils.getUserIdFromCookie(Utils.settingsHelper.getString(Constants.COOKIE));
|
||||||
|
if (!profileId.equals(myId)) {
|
||||||
|
main.mainBinding.btnFollow.setVisibility(View.VISIBLE);
|
||||||
|
main.mainBinding.btnFollow.setOnClickListener(profileActionListener);
|
||||||
|
if (profileModel.getFollowing() == true) {
|
||||||
|
main.mainBinding.btnFollow.setText(R.string.unfollow);
|
||||||
|
main.mainBinding.btnFollow.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(
|
||||||
|
R.color.btn_purple_background, null)));
|
||||||
|
}
|
||||||
|
else if (profileModel.getRequested() == true) {
|
||||||
|
main.mainBinding.btnFollow.setText(R.string.cancel);
|
||||||
|
main.mainBinding.btnFollow.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(
|
||||||
|
R.color.btn_purple_background, null)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
main.mainBinding.btnFollow.setText(R.string.follow);
|
||||||
|
main.mainBinding.btnFollow.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(
|
||||||
|
R.color.btn_pink_background, null)));
|
||||||
|
}
|
||||||
|
main.mainBinding.btnRestrict.setVisibility(View.VISIBLE);
|
||||||
|
main.mainBinding.btnRestrict.setOnClickListener(profileActionListener);
|
||||||
|
if (profileModel.getRestricted() == true) {
|
||||||
|
main.mainBinding.btnRestrict.setText(R.string.unrestrict);
|
||||||
|
main.mainBinding.btnRestrict.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(
|
||||||
|
R.color.btn_blue_background, null)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
main.mainBinding.btnRestrict.setText(R.string.restrict);
|
||||||
|
main.mainBinding.btnRestrict.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(
|
||||||
|
R.color.btn_orange_background, null)));
|
||||||
|
}
|
||||||
|
main.mainBinding.btnBlock.setVisibility(View.VISIBLE);
|
||||||
|
main.mainBinding.btnBlock.setOnClickListener(profileActionListener);
|
||||||
|
if (profileModel.getBlocked() == true) {
|
||||||
|
main.mainBinding.btnBlock.setText(R.string.unblock);
|
||||||
|
main.mainBinding.btnBlock.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(
|
||||||
|
R.color.btn_green_background, null)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
main.mainBinding.btnBlock.setText(R.string.block);
|
||||||
|
main.mainBinding.btnBlock.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(
|
||||||
|
R.color.btn_red_background, null)));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
main.mainBinding.mainProfileImage.setEnabled(false);
|
main.mainBinding.mainProfileImage.setEnabled(false);
|
||||||
@ -735,8 +784,8 @@ public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener {
|
|||||||
main.mainBinding.mainBiography.setEnabled(true);
|
main.mainBinding.mainBiography.setEnabled(true);
|
||||||
|
|
||||||
if (!profileModel.isPrivate()) {
|
if (!profileModel.isPrivate()) {
|
||||||
main.mainBinding.swipeRefreshLayout.setRefreshing(true);
|
main.mainBinding.mainFollowing.setClickable(true);
|
||||||
main.mainBinding.mainPosts.setVisibility(View.VISIBLE);
|
main.mainBinding.mainFollowers.setClickable(true);
|
||||||
main.mainBinding.privatePage.setVisibility(View.GONE);
|
main.mainBinding.privatePage.setVisibility(View.GONE);
|
||||||
|
|
||||||
if (isLoggedIn) {
|
if (isLoggedIn) {
|
||||||
@ -749,10 +798,25 @@ public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener {
|
|||||||
main.mainBinding.mainFollowing.setOnClickListener(followingCount > 0 ? followClickListener : null);
|
main.mainBinding.mainFollowing.setOnClickListener(followingCount > 0 ? followClickListener : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (profileModel.getPostCount() == 0) {
|
||||||
|
main.mainBinding.swipeRefreshLayout.setRefreshing(false);
|
||||||
|
main.mainBinding.privatePage1.setImageResource(R.drawable.ic_cancel);
|
||||||
|
main.mainBinding.privatePage2.setText(R.string.empty_acc);
|
||||||
|
main.mainBinding.privatePage.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
main.mainBinding.swipeRefreshLayout.setRefreshing(true);
|
||||||
|
main.mainBinding.mainPosts.setVisibility(View.VISIBLE);
|
||||||
currentlyExecuting = new PostsFetcher(profileId, postsFetchListener).setUsername(profileModel.getUsername())
|
currentlyExecuting = new PostsFetcher(profileId, postsFetchListener).setUsername(profileModel.getUsername())
|
||||||
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
main.mainBinding.mainFollowers.setClickable(false);
|
||||||
|
main.mainBinding.mainFollowing.setClickable(false);
|
||||||
main.mainBinding.swipeRefreshLayout.setRefreshing(false);
|
main.mainBinding.swipeRefreshLayout.setRefreshing(false);
|
||||||
|
// error
|
||||||
|
main.mainBinding.privatePage1.setImageResource(R.drawable.lock);
|
||||||
|
main.mainBinding.privatePage2.setText(R.string.priv_acc);
|
||||||
main.mainBinding.privatePage.setVisibility(View.VISIBLE);
|
main.mainBinding.privatePage.setVisibility(View.VISIBLE);
|
||||||
main.mainBinding.mainPosts.setVisibility(View.GONE);
|
main.mainBinding.mainPosts.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
@ -880,4 +944,75 @@ public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener {
|
|||||||
main.mainBinding.mainProfileImage.setImageBitmap(mIcon_val);
|
main.mainBinding.mainProfileImage.setImageBitmap(mIcon_val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final View.OnClickListener profileActionListener = new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(final View v) {
|
||||||
|
if (v == main.mainBinding.btnFollow) {
|
||||||
|
new ProfileAction().execute("follow");
|
||||||
|
} else if (v == main.mainBinding.btnRestrict) {
|
||||||
|
new ProfileAction().execute("restrict");
|
||||||
|
} else if (v == main.mainBinding.btnBlock) {
|
||||||
|
new ProfileAction().execute("block");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ProfileAction extends AsyncTask<String, Void, Void> {
|
||||||
|
boolean ok = false;
|
||||||
|
String action;
|
||||||
|
|
||||||
|
// arg: follow / restrict / block
|
||||||
|
|
||||||
|
// restrict https://www.instagram.com/web/restrict_action/(un)restrict/
|
||||||
|
// requires form data "target_user_id: <id>"
|
||||||
|
|
||||||
|
protected Void doInBackground(String... rawAction) {
|
||||||
|
action = rawAction[0];
|
||||||
|
final String url = "https://www.instagram.com/web/"+
|
||||||
|
(action == "restrict" ? "restrict_action" : ("friendships/"+main.profileModel.getId()))+"/"+
|
||||||
|
(action == "follow" ?
|
||||||
|
((main.profileModel.getFollowing() == true ||
|
||||||
|
(main.profileModel.getFollowing() == false && main.profileModel.getRequested() == true))
|
||||||
|
? "unfollow/" : "follow/") :
|
||||||
|
(action == "restrict" ?
|
||||||
|
(main.profileModel.getRestricted() == true ? "unrestrict/" : "restrict/") :
|
||||||
|
(main.profileModel.getBlocked() == true ? "unblock/" : "block/")));
|
||||||
|
final String urlParameters = "target_user_id="+main.profileModel.getId();
|
||||||
|
try {
|
||||||
|
final HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
|
||||||
|
urlConnection.setRequestMethod("POST");
|
||||||
|
urlConnection.setUseCaches(false);
|
||||||
|
urlConnection.setRequestProperty("User-Agent", Constants.USER_AGENT);
|
||||||
|
urlConnection.setRequestProperty("x-csrftoken",
|
||||||
|
Utils.settingsHelper.getString(Constants.COOKIE).split("csrftoken=")[1].split(";")[0]);
|
||||||
|
if (action == "restrict") {
|
||||||
|
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
|
||||||
|
urlConnection.setRequestProperty("Content-Length", "" +
|
||||||
|
Integer.toString(urlParameters.getBytes().length));
|
||||||
|
urlConnection.setDoOutput(true);
|
||||||
|
DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream());
|
||||||
|
wr.writeBytes(urlParameters);
|
||||||
|
wr.flush();
|
||||||
|
wr.close();
|
||||||
|
}
|
||||||
|
else urlConnection.connect();
|
||||||
|
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
|
||||||
|
ok = true;
|
||||||
|
}
|
||||||
|
else Toast.makeText(main, R.string.downloader_unknown_error, Toast.LENGTH_SHORT);
|
||||||
|
urlConnection.disconnect();
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
Log.e("austin_debug", action+": " + ex);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Void result) {
|
||||||
|
if (ok == true) {
|
||||||
|
onRefresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -41,7 +41,8 @@ import awais.instagrabber.utils.Utils;
|
|||||||
|
|
||||||
public final class DirectMessagesUserInbox extends AppCompatActivity {
|
public final class DirectMessagesUserInbox extends AppCompatActivity {
|
||||||
private DirectItemModel directItemModel;
|
private DirectItemModel directItemModel;
|
||||||
private final ProfileModel myProfileHolder = new ProfileModel(false, false, null, null, null, null, null, null, null, 0, 0, 0);
|
private final ProfileModel myProfileHolder =
|
||||||
|
new ProfileModel(false, false, null, null, null, null, null, null, null, 0, 0, 0, false, false, false, false);
|
||||||
private final ArrayList<ProfileModel> users = new ArrayList<>();
|
private final ArrayList<ProfileModel> users = new ArrayList<>();
|
||||||
private final ArrayList<DirectItemModel> directItemModels = new ArrayList<>();
|
private final ArrayList<DirectItemModel> directItemModels = new ArrayList<>();
|
||||||
private final FetchListener<InboxThreadModel> fetchListener = new FetchListener<InboxThreadModel>() {
|
private final FetchListener<InboxThreadModel> fetchListener = new FetchListener<InboxThreadModel>() {
|
||||||
@ -160,12 +161,10 @@ public final class DirectMessagesUserInbox extends AppCompatActivity {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private ProfileModel getUser(final long userId) {
|
private ProfileModel getUser(final long userId) {
|
||||||
if (users != null) {
|
for (final ProfileModel user : users) {
|
||||||
for (final ProfileModel user : users)
|
|
||||||
if (Long.toString(userId).equals(user.getId())) return user;
|
if (Long.toString(userId).equals(user.getId())) return user;
|
||||||
return myProfileHolder;
|
|
||||||
}
|
}
|
||||||
return null;
|
return myProfileHolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void searchUsername(final String text) {
|
private void searchUsername(final String text) {
|
||||||
|
@ -72,28 +72,13 @@ public final class FollowViewer extends BaseLanguageActivity implements SwipeRef
|
|||||||
followBinding.toolbar.toolbar.setTitle(name);
|
followBinding.toolbar.toolbar.setTitle(name);
|
||||||
|
|
||||||
resources = getResources();
|
resources = getResources();
|
||||||
final ArrayAdapter<Object> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new String[]{
|
|
||||||
resources.getString(R.string.open_profile), resources.getString(R.string.followers_open_in_insta)});
|
|
||||||
final AlertDialog alertDialog = new AlertDialog.Builder(this).setAdapter(adapter, (dialog, which) -> {
|
|
||||||
if (model != null) {
|
|
||||||
if (which == 0) {
|
|
||||||
if (Main.scanHack != null) {
|
|
||||||
Main.scanHack.onResult(model.getUsername());
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
final Intent actIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://instagram.com/" + model.getUsername()));
|
|
||||||
if (Utils.isInstagramInstalled) actIntent.setPackage("com.instagram.android");
|
|
||||||
startActivity(actIntent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).setTitle(R.string.what_to_do_dialog).create();
|
|
||||||
|
|
||||||
clickListener = v -> {
|
clickListener = v -> {
|
||||||
final Object tag = v.getTag();
|
final Object tag = v.getTag();
|
||||||
if (tag instanceof FollowModel) {
|
if (tag instanceof FollowModel) {
|
||||||
model = (FollowModel) tag;
|
model = (FollowModel) tag;
|
||||||
if (!alertDialog.isShowing()) alertDialog.show();
|
Main.scanHack.onResult(model.getUsername());
|
||||||
|
finish();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -318,11 +303,11 @@ public final class FollowViewer extends BaseLanguageActivity implements SwipeRef
|
|||||||
final ArrayList<ExpandableGroup> groups = new ArrayList<>(1);
|
final ArrayList<ExpandableGroup> groups = new ArrayList<>(1);
|
||||||
|
|
||||||
if (isCompare) {
|
if (isCompare) {
|
||||||
if (followingModels.size() > 0)
|
if (followingModels != null && followingModels.size() > 0)
|
||||||
groups.add(new ExpandableGroup(resources.getString(R.string.followers_not_following, name), followingModels));
|
groups.add(new ExpandableGroup(resources.getString(R.string.followers_not_following, name), followingModels));
|
||||||
if (followersModels.size() > 0)
|
if (followersModels != null && followersModels.size() > 0)
|
||||||
groups.add(new ExpandableGroup(resources.getString(R.string.followers_not_follower, namePost), followersModels));
|
groups.add(new ExpandableGroup(resources.getString(R.string.followers_not_follower, namePost), followersModels));
|
||||||
if (allFollowing.size() > 0)
|
if (allFollowing != null && allFollowing.size() > 0)
|
||||||
groups.add(new ExpandableGroup(resources.getString(R.string.followers_both_following), allFollowing));
|
groups.add(new ExpandableGroup(resources.getString(R.string.followers_both_following), allFollowing));
|
||||||
} else {
|
} else {
|
||||||
final ExpandableGroup group = new ExpandableGroup(type, followModels);
|
final ExpandableGroup group = new ExpandableGroup(type, followModels);
|
||||||
|
@ -52,7 +52,6 @@ import awais.instagrabber.models.enums.SuggestionType;
|
|||||||
import awais.instagrabber.utils.Constants;
|
import awais.instagrabber.utils.Constants;
|
||||||
import awais.instagrabber.utils.DataBox;
|
import awais.instagrabber.utils.DataBox;
|
||||||
import awais.instagrabber.utils.FlavorTown;
|
import awais.instagrabber.utils.FlavorTown;
|
||||||
import awais.instagrabber.utils.MyApps;
|
|
||||||
import awais.instagrabber.utils.Utils;
|
import awais.instagrabber.utils.Utils;
|
||||||
|
|
||||||
import static awais.instagrabber.utils.Utils.settingsHelper;
|
import static awais.instagrabber.utils.Utils.settingsHelper;
|
||||||
@ -293,7 +292,7 @@ public final class Main extends BaseLanguageActivity {
|
|||||||
downloadAction = menu.findItem(R.id.action_download).setOnMenuItemClickListener(clickListener);
|
downloadAction = menu.findItem(R.id.action_download).setOnMenuItemClickListener(clickListener);
|
||||||
|
|
||||||
if (!Utils.isEmpty(Utils.settingsHelper.getString(Constants.COOKIE))) {
|
if (!Utils.isEmpty(Utils.settingsHelper.getString(Constants.COOKIE))) {
|
||||||
settingsAction.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
//settingsAction.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
||||||
dmsAction.setVisible(true).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
dmsAction.setVisible(true).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -305,7 +304,28 @@ public final class Main extends BaseLanguageActivity {
|
|||||||
|
|
||||||
searchView.setQueryHint(getResources().getString(R.string.action_search));
|
searchView.setQueryHint(getResources().getString(R.string.action_search));
|
||||||
searchView.setSuggestionsAdapter(suggestionAdapter);
|
searchView.setSuggestionsAdapter(suggestionAdapter);
|
||||||
searchView.setOnSearchClickListener(v -> searchView.setQuery(userQuery, false));
|
searchView.setOnSearchClickListener(v -> {
|
||||||
|
searchView.setQuery(userQuery, false);
|
||||||
|
menu.findItem(R.id.action_about).setVisible(false);
|
||||||
|
menu.findItem(R.id.action_settings).setVisible(false);
|
||||||
|
menu.findItem(R.id.action_dms).setVisible(false);
|
||||||
|
menu.findItem(R.id.action_quickaccess).setVisible(false);
|
||||||
|
});
|
||||||
|
searchAction.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onMenuItemActionExpand(MenuItem item) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onMenuItemActionCollapse(MenuItem item) {
|
||||||
|
menu.findItem(R.id.action_about).setVisible(true);
|
||||||
|
menu.findItem(R.id.action_settings).setVisible(true);
|
||||||
|
menu.findItem(R.id.action_dms).setVisible(true);
|
||||||
|
menu.findItem(R.id.action_quickaccess).setVisible(true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
|
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
|
||||||
private boolean searchUser, searchHash;
|
private boolean searchUser, searchHash;
|
||||||
private AsyncTask<?, ?, ?> prevSuggestionAsync;
|
private AsyncTask<?, ?, ?> prevSuggestionAsync;
|
||||||
@ -351,6 +371,8 @@ public final class Main extends BaseLanguageActivity {
|
|||||||
@Override
|
@Override
|
||||||
public boolean onQueryTextSubmit(final String query) {
|
public boolean onQueryTextSubmit(final String query) {
|
||||||
cancelSuggestionsAsync();
|
cancelSuggestionsAsync();
|
||||||
|
menu.findItem(R.id.action_about).setVisible(true);
|
||||||
|
menu.findItem(R.id.action_settings).setVisible(true);
|
||||||
|
|
||||||
closeAnyOpenDrawer();
|
closeAnyOpenDrawer();
|
||||||
addToStack();
|
addToStack();
|
||||||
@ -412,11 +434,6 @@ public final class Main extends BaseLanguageActivity {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MyApps.showAlertDialog(this, (parent, view, position, id) -> {
|
|
||||||
if (id == -1 && position == -1 && parent == null) super.onBackPressed();
|
|
||||||
else MyApps.openAppStore(this, position);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -157,9 +157,9 @@ public final class PostViewer extends BaseLanguageActivity {
|
|||||||
Utils.sessionVolumeFull = intVol == 1f;
|
Utils.sessionVolumeFull = intVol == 1f;
|
||||||
}
|
}
|
||||||
} else if (v == viewerBinding.btnLike) {
|
} else if (v == viewerBinding.btnLike) {
|
||||||
new Like().execute();
|
new PostAction().execute("likes");
|
||||||
} else if (v == viewerBinding.btnBookmark) {
|
} else if (v == viewerBinding.btnBookmark) {
|
||||||
new Bookmark().execute();
|
new PostAction().execute("save");
|
||||||
} else {
|
} else {
|
||||||
final Object tag = v.getTag();
|
final Object tag = v.getTag();
|
||||||
if (tag instanceof ViewerPostModel) {
|
if (tag instanceof ViewerPostModel) {
|
||||||
@ -252,8 +252,8 @@ public final class PostViewer extends BaseLanguageActivity {
|
|||||||
isMainSwipe = false;
|
isMainSwipe = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final BasePostModel[] basePostModels = mediaAdapter != null ? mediaAdapter.getPostModels() : null;
|
final BasePostModel[] basePostModels = mediaAdapter.getPostModels();
|
||||||
final int slides = basePostModels != null ? basePostModels.length : 0;
|
final int slides = basePostModels.length;
|
||||||
|
|
||||||
int position = postModel.getPosition();
|
int position = postModel.getPosition();
|
||||||
|
|
||||||
@ -685,12 +685,15 @@ public final class PostViewer extends BaseLanguageActivity {
|
|||||||
Don't ever think about running a like farm with this
|
Don't ever think about running a like farm with this
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class Like extends AsyncTask<Void, Void, Void> {
|
class PostAction extends AsyncTask<String, Void, Void> {
|
||||||
boolean ok = false;
|
boolean ok = false;
|
||||||
|
String action;
|
||||||
|
|
||||||
protected Void doInBackground(Void... voids) {
|
protected Void doInBackground(String... rawAction) {
|
||||||
final String url = "https://www.instagram.com/web/likes/"+postModel.getPostId()+"/"+
|
action = rawAction[0];
|
||||||
(postModel.getLike() == true ? "unlike/" : "like/");
|
final String url = "https://www.instagram.com/web/"+action+"/"+postModel.getPostId()+"/"+ (action == "save" ?
|
||||||
|
(postModel.getBookmark() == true ? "unsave/" : "save/") :
|
||||||
|
(postModel.getLike() == true ? "unlike/" : "like/"));
|
||||||
try {
|
try {
|
||||||
final HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
|
final HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
|
||||||
urlConnection.setRequestMethod("POST");
|
urlConnection.setRequestMethod("POST");
|
||||||
@ -703,49 +706,21 @@ public final class PostViewer extends BaseLanguageActivity {
|
|||||||
ok = true;
|
ok = true;
|
||||||
}
|
}
|
||||||
else Toast.makeText(getApplicationContext(), R.string.downloader_unknown_error, Toast.LENGTH_SHORT);
|
else Toast.makeText(getApplicationContext(), R.string.downloader_unknown_error, Toast.LENGTH_SHORT);
|
||||||
|
urlConnection.disconnect();
|
||||||
} catch (Throwable ex) {
|
} catch (Throwable ex) {
|
||||||
Log.e("austin_debug", "like: " + ex);
|
Log.e("austin_debug", action+": " + ex);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostExecute(Void result) {
|
protected void onPostExecute(Void result) {
|
||||||
if (ok == true) {
|
if (ok == true && action == "likes") {
|
||||||
viewerPostModel.setLike(postModel.getLike() == true ? false : true);
|
viewerPostModel.setLike(postModel.getLike() == true ? false : true);
|
||||||
postModel.setLike(postModel.getLike() == true ? false : true);
|
postModel.setLike(postModel.getLike() == true ? false : true);
|
||||||
refreshPost();
|
refreshPost();
|
||||||
}
|
}
|
||||||
}
|
else if (ok == true && action == "save") {
|
||||||
}
|
|
||||||
|
|
||||||
class Bookmark extends AsyncTask<Void, Void, Void> {
|
|
||||||
boolean ok = false;
|
|
||||||
|
|
||||||
protected Void doInBackground(Void... voids) {
|
|
||||||
final String url = "https://www.instagram.com/web/save/"+postModel.getPostId()+"/"+
|
|
||||||
(postModel.getBookmark() == true ? "unsave/" : "save/");
|
|
||||||
try {
|
|
||||||
final HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
|
|
||||||
urlConnection.setRequestMethod("POST");
|
|
||||||
urlConnection.setUseCaches(false);
|
|
||||||
urlConnection.setRequestProperty("User-Agent", Constants.USER_AGENT);
|
|
||||||
urlConnection.setRequestProperty("x-csrftoken",
|
|
||||||
settingsHelper.getString(Constants.COOKIE).split("csrftoken=")[1].split(";")[0]);
|
|
||||||
urlConnection.connect();
|
|
||||||
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
|
|
||||||
ok = true;
|
|
||||||
}
|
|
||||||
else Toast.makeText(getApplicationContext(), R.string.downloader_unknown_error, Toast.LENGTH_SHORT);
|
|
||||||
} catch (Throwable ex) {
|
|
||||||
Log.e("austin_debug", "bookmark: " + ex);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPostExecute(Void result) {
|
|
||||||
if (ok == true) {
|
|
||||||
viewerPostModel.setBookmark(postModel.getBookmark() == true ? false : true);
|
viewerPostModel.setBookmark(postModel.getBookmark() == true ? false : true);
|
||||||
postModel.setBookmark(postModel.getBookmark() == true ? false : true);
|
postModel.setBookmark(postModel.getBookmark() == true ? false : true);
|
||||||
refreshPost();
|
refreshPost();
|
||||||
|
@ -132,9 +132,8 @@ public final class StoryViewer extends BaseLanguageActivity {
|
|||||||
final FeedStoryModel feedStoryModel = isRightSwipe ?
|
final FeedStoryModel feedStoryModel = isRightSwipe ?
|
||||||
(index == 0 ? null : storyFeed[index - 1]) :
|
(index == 0 ? null : storyFeed[index - 1]) :
|
||||||
(storyFeed.length == index + 1 ? null : storyFeed[index + 1]);
|
(storyFeed.length == index + 1 ? null : storyFeed[index + 1]);
|
||||||
final StoryModel[] nextStoryModels = feedStoryModel.getStoryModels();
|
|
||||||
|
|
||||||
if (feedStoryModel != null) {
|
if (feedStoryModel != null) {
|
||||||
|
final StoryModel[] nextStoryModels = feedStoryModel.getStoryModels();
|
||||||
final Intent newIntent = new Intent(getApplicationContext(), StoryViewer.class)
|
final Intent newIntent = new Intent(getApplicationContext(), StoryViewer.class)
|
||||||
.putExtra(Constants.EXTRAS_STORIES, nextStoryModels)
|
.putExtra(Constants.EXTRAS_STORIES, nextStoryModels)
|
||||||
.putExtra(Constants.EXTRAS_USERNAME, feedStoryModel.getProfileModel().getUsername())
|
.putExtra(Constants.EXTRAS_USERNAME, feedStoryModel.getProfileModel().getUsername())
|
||||||
|
@ -106,7 +106,7 @@ public final class DirectMessagesAdapter extends RecyclerView.Adapter<DirectMess
|
|||||||
}
|
}
|
||||||
else if (itemType == DirectItemType.RAVEN_MEDIA) {
|
else if (itemType == DirectItemType.RAVEN_MEDIA) {
|
||||||
messageText = context.getString(R.string.direct_messages_sent_media);
|
messageText = context.getString(R.string.direct_messages_sent_media);
|
||||||
} else messageText = null;
|
} else messageText = "<i>Unsupported message</i>";
|
||||||
|
|
||||||
holder.tvMessage.setText(HtmlCompat.fromHtml(messageText.toString(), 63));
|
holder.tvMessage.setText(HtmlCompat.fromHtml(messageText.toString(), 63));
|
||||||
|
|
||||||
|
@ -227,7 +227,7 @@ public final class FeedAdapter extends RecyclerView.Adapter<FeedItemViewHolder>
|
|||||||
|
|
||||||
if (!captionEmpty && Utils.hasMentions(postCaption)) {
|
if (!captionEmpty && Utils.hasMentions(postCaption)) {
|
||||||
postCaption = Utils.getMentionText(postCaption);
|
postCaption = Utils.getMentionText(postCaption);
|
||||||
feedModel.setPostCaption(postCaption);
|
//feedModel.setPostCaption(postCaption);
|
||||||
viewHolder.viewerCaption.setText(postCaption, TextView.BufferType.SPANNABLE);
|
viewHolder.viewerCaption.setText(postCaption, TextView.BufferType.SPANNABLE);
|
||||||
viewHolder.viewerCaption.setMentionClickListener(mentionClickListener);
|
viewHolder.viewerCaption.setMentionClickListener(mentionClickListener);
|
||||||
} else {
|
} else {
|
||||||
|
@ -45,7 +45,8 @@ import static awais.instagrabber.models.direct_messages.DirectItemModel.RavenExp
|
|||||||
|
|
||||||
public final class MessageItemsAdapter extends RecyclerView.Adapter<TextMessageViewHolder> {
|
public final class MessageItemsAdapter extends RecyclerView.Adapter<TextMessageViewHolder> {
|
||||||
private static final int MESSAGE_INCOMING = 69, MESSAGE_OUTGOING = 420;
|
private static final int MESSAGE_INCOMING = 69, MESSAGE_OUTGOING = 420;
|
||||||
private final ProfileModel myProfileHolder = new ProfileModel(false, false, null, null, null, null, null, null, null, 0, 0, 0);
|
private final ProfileModel myProfileHolder =
|
||||||
|
new ProfileModel(false, false, null, null, null, null, null, null, null, 0, 0, 0, false, false, false, false);
|
||||||
private final ArrayList<DirectItemModel> directItemModels;
|
private final ArrayList<DirectItemModel> directItemModels;
|
||||||
private final ArrayList<ProfileModel> users;
|
private final ArrayList<ProfileModel> users;
|
||||||
private final View.OnClickListener onClickListener;
|
private final View.OnClickListener onClickListener;
|
||||||
|
@ -2,6 +2,7 @@ package awais.instagrabber.adapters;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
@ -115,7 +115,7 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]>
|
|||||||
owner.getString(Constants.EXTRAS_USERNAME),
|
owner.getString(Constants.EXTRAS_USERNAME),
|
||||||
null, null, null,
|
null, null, null,
|
||||||
owner.getString("profile_pic_url"),
|
owner.getString("profile_pic_url"),
|
||||||
null, 0, 0, 0);
|
null, 0, 0, 0, false, false, false, false);
|
||||||
|
|
||||||
final JSONObject likedBy = childComment.optJSONObject("edge_liked_by");
|
final JSONObject likedBy = childComment.optJSONObject("edge_liked_by");
|
||||||
|
|
||||||
@ -193,7 +193,7 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]>
|
|||||||
owner.getString(Constants.EXTRAS_USERNAME),
|
owner.getString(Constants.EXTRAS_USERNAME),
|
||||||
null, null, null,
|
null, null, null,
|
||||||
owner.getString("profile_pic_url"),
|
owner.getString("profile_pic_url"),
|
||||||
null, 0, 0, 0);
|
null, 0, 0, 0, false, false, false, false);
|
||||||
|
|
||||||
final JSONObject likedBy = comment.optJSONObject("edge_liked_by");
|
final JSONObject likedBy = comment.optJSONObject("edge_liked_by");
|
||||||
final String commentId = comment.getString(Constants.EXTRAS_ID);
|
final String commentId = comment.getString(Constants.EXTRAS_ID);
|
||||||
@ -231,7 +231,7 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]>
|
|||||||
tempJsonObject.getString(Constants.EXTRAS_USERNAME),
|
tempJsonObject.getString(Constants.EXTRAS_USERNAME),
|
||||||
null, null, null,
|
null, null, null,
|
||||||
tempJsonObject.getString("profile_pic_url"),
|
tempJsonObject.getString("profile_pic_url"),
|
||||||
null, 0, 0, 0);
|
null, 0, 0, 0, false, false, false, false);
|
||||||
|
|
||||||
tempJsonObject = childComment.optJSONObject("edge_liked_by");
|
tempJsonObject = childComment.optJSONObject("edge_liked_by");
|
||||||
childCommentModels[j] = new CommentModel(childComment.getString(Constants.EXTRAS_ID),
|
childCommentModels[j] = new CommentModel(childComment.getString(Constants.EXTRAS_ID),
|
||||||
|
@ -104,7 +104,7 @@ public final class FeedFetcher extends AsyncTask<Void, Void, FeedModel[]> {
|
|||||||
owner.optString("full_name"),
|
owner.optString("full_name"),
|
||||||
null, null,
|
null, null,
|
||||||
owner.getString("profile_pic_url"),
|
owner.getString("profile_pic_url"),
|
||||||
null, 0, 0, 0);
|
null, 0, 0, 0, false, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONObject tempJsonObject = feedItem.optJSONObject("edge_media_preview_comment");
|
JSONObject tempJsonObject = feedItem.optJSONObject("edge_media_preview_comment");
|
||||||
|
@ -61,7 +61,7 @@ public final class FeedStoriesFetcher extends AsyncTask<Void, Void, FeedStoryMod
|
|||||||
user.getString("username"),
|
user.getString("username"),
|
||||||
null, null, null,
|
null, null, null,
|
||||||
user.getString("profile_pic_url"),
|
user.getString("profile_pic_url"),
|
||||||
null, 0, 0, 0);
|
null, 0, 0, 0, false, false, false, false);
|
||||||
|
|
||||||
final String id = node.getString("id");
|
final String id = node.getString("id");
|
||||||
feedStoryIDs[i] = id;
|
feedStoryIDs[i] = id;
|
||||||
|
@ -63,7 +63,11 @@ public final class ProfileFetcher extends AsyncTask<Void, Void, ProfileModel> {
|
|||||||
user.getString("profile_pic_url_hd"),
|
user.getString("profile_pic_url_hd"),
|
||||||
timelineMedia.getLong("count"),
|
timelineMedia.getLong("count"),
|
||||||
user.getJSONObject("edge_followed_by").getLong("count"),
|
user.getJSONObject("edge_followed_by").getLong("count"),
|
||||||
user.getJSONObject("edge_follow").getLong("count"));
|
user.getJSONObject("edge_follow").getLong("count"),
|
||||||
|
user.getBoolean("followed_by_viewer"),
|
||||||
|
user.getBoolean("restricted_by_viewer"),
|
||||||
|
user.getBoolean("blocked_by_viewer"),
|
||||||
|
user.getBoolean("requested_by_viewer"));
|
||||||
}
|
}
|
||||||
|
|
||||||
conn.disconnect();
|
conn.disconnect();
|
||||||
|
@ -86,7 +86,7 @@ public final class SettingsDialog extends BottomSheetDialogFragment implements V
|
|||||||
final View contentView = View.inflate(activity, R.layout.dialog_main_settings, null);
|
final View contentView = View.inflate(activity, R.layout.dialog_main_settings, null);
|
||||||
|
|
||||||
settingTitle = contentView.findViewById(R.id.settingTitle);
|
settingTitle = contentView.findViewById(R.id.settingTitle);
|
||||||
settingTitle.setText("Settings (v"+BuildConfig.VERSION_NAME+")");
|
settingTitle.setText(getString(R.string.action_setting, BuildConfig.VERSION_NAME));
|
||||||
btnLogin = contentView.findViewById(R.id.btnLogin);
|
btnLogin = contentView.findViewById(R.id.btnLogin);
|
||||||
btnLogout = contentView.findViewById(R.id.btnLogout);
|
btnLogout = contentView.findViewById(R.id.btnLogout);
|
||||||
btnSaveTo = contentView.findViewById(R.id.btnSaveTo);
|
btnSaveTo = contentView.findViewById(R.id.btnSaveTo);
|
||||||
|
@ -28,10 +28,10 @@ public abstract class BasePostModel implements Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean setLike(final boolean like) {
|
public boolean setLike(final boolean like) {
|
||||||
liked = like; this.liked = liked; return liked;
|
liked = like; return liked;
|
||||||
}
|
}
|
||||||
public boolean setBookmark(final boolean bookmark) {
|
public boolean setBookmark(final boolean bookmark) {
|
||||||
bookmarked = bookmark; this.bookmarked = bookmarked; return bookmarked;
|
bookmarked = bookmark; return bookmarked;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MediaItemType getItemType() {
|
public MediaItemType getItemType() {
|
||||||
|
@ -33,20 +33,6 @@ public class PostModel extends BasePostModel {
|
|||||||
return endCursor;
|
return endCursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean getLike() {
|
|
||||||
return liked;
|
|
||||||
}
|
|
||||||
public boolean getBookmark() {
|
|
||||||
return bookmarked;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean setLike() {
|
|
||||||
liked = liked == true ? false : true; this.liked = liked; return liked;
|
|
||||||
}
|
|
||||||
public boolean setBookmark() {
|
|
||||||
bookmarked = bookmarked == true ? false : true; this.bookmarked = bookmarked; return bookmarked;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasNextPage() {
|
public boolean hasNextPage() {
|
||||||
return endCursor != null && hasNextPage;
|
return endCursor != null && hasNextPage;
|
||||||
}
|
}
|
||||||
|
@ -3,13 +3,14 @@ package awais.instagrabber.models;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
public final class ProfileModel implements Serializable {
|
public final class ProfileModel implements Serializable {
|
||||||
private final boolean isPrivate, isVerified;
|
private final boolean isPrivate, isVerified, following, restricted, blocked, requested;
|
||||||
private final long postCount, followersCount, followingCount;
|
private final long postCount, followersCount, followingCount;
|
||||||
private final String id, username, name, biography, url, sdProfilePic, hdProfilePic;
|
private final String id, username, name, biography, url, sdProfilePic, hdProfilePic;
|
||||||
|
|
||||||
public ProfileModel(final boolean isPrivate, final boolean isVerified, final String id, final String username,
|
public ProfileModel(final boolean isPrivate, final boolean isVerified, final String id, final String username,
|
||||||
final String name, final String biography, final String url, final String sdProfilePic, final String hdProfilePic,
|
final String name, final String biography, final String url, final String sdProfilePic, final String hdProfilePic,
|
||||||
final long postCount, final long followersCount, final long followingCount) {
|
final long postCount, final long followersCount, final long followingCount, final boolean following,
|
||||||
|
final boolean restricted, final boolean blocked, final boolean requested) {
|
||||||
this.isPrivate = isPrivate;
|
this.isPrivate = isPrivate;
|
||||||
this.isVerified = isVerified;
|
this.isVerified = isVerified;
|
||||||
this.id = id;
|
this.id = id;
|
||||||
@ -22,6 +23,10 @@ public final class ProfileModel implements Serializable {
|
|||||||
this.postCount = postCount;
|
this.postCount = postCount;
|
||||||
this.followersCount = followersCount;
|
this.followersCount = followersCount;
|
||||||
this.followingCount = followingCount;
|
this.followingCount = followingCount;
|
||||||
|
this.following = following;
|
||||||
|
this.restricted = restricted;
|
||||||
|
this.blocked = blocked;
|
||||||
|
this.requested = requested;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPrivate() {
|
public boolean isPrivate() {
|
||||||
@ -60,16 +65,23 @@ public final class ProfileModel implements Serializable {
|
|||||||
return hdProfilePic;
|
return hdProfilePic;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getPostCount() {
|
public long getPostCount() { return postCount; }
|
||||||
return postCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getFollowersCount() {
|
public long getFollowersCount() { return followersCount; }
|
||||||
return followersCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getFollowingCount() {
|
public long getFollowingCount() {
|
||||||
return followingCount;
|
return followingCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getFollowing() { return following; }
|
||||||
|
|
||||||
|
public boolean getRestricted() { return restricted; }
|
||||||
|
|
||||||
|
public boolean getBlocked() {
|
||||||
|
return blocked;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getRequested() {
|
||||||
|
return requested;
|
||||||
|
}
|
||||||
}
|
}
|
@ -24,20 +24,6 @@ public final class ViewerPostModel extends BasePostModel {
|
|||||||
this.bookmarked = bookmarked;
|
this.bookmarked = bookmarked;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean getLike() {
|
|
||||||
return liked;
|
|
||||||
}
|
|
||||||
public boolean getBookmark() {
|
|
||||||
return bookmarked;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean setLike() {
|
|
||||||
liked = liked == true ? false : true; this.liked = liked; return liked;
|
|
||||||
}
|
|
||||||
public boolean setBookmark() {
|
|
||||||
bookmarked = bookmarked == true ? false : true; this.bookmarked = bookmarked; return bookmarked;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getCommentsCount() {
|
public long getCommentsCount() {
|
||||||
return commentsCount;
|
return commentsCount;
|
||||||
}
|
}
|
||||||
|
@ -1,138 +0,0 @@
|
|||||||
package awais.instagrabber.utils;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Process;
|
|
||||||
import android.view.Gravity;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.BaseAdapter;
|
|
||||||
import android.widget.GridView;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.appcompat.widget.AppCompatImageView;
|
|
||||||
import androidx.appcompat.widget.AppCompatTextView;
|
|
||||||
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
import awais.instagrabber.R;
|
|
||||||
|
|
||||||
public final class MyApps {
|
|
||||||
public final static Icons[] iconsList = Icons.values();
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public enum Icons {
|
|
||||||
MEDIASCAN("awais.media.scanner", "mediaScanner", R.drawable.zzz_ms),
|
|
||||||
ADDME("awais.addme", "AddMe", R.drawable.zzz_adm),
|
|
||||||
LINKEDWORDS("awais.backworddictionary", "Linked Words", R.drawable.zzz_lw),
|
|
||||||
QUODB("awais.quodb", "QuoDB", R.drawable.zzz_qdb),
|
|
||||||
REVERSIFY("awais.reversify", "Reversify", R.drawable.zzz_rev),
|
|
||||||
REVERSIFY_LITE("awais.reversify.lite", "Reversify Lite", R.drawable.zzz_revl),
|
|
||||||
TESV("awais.skyrimconsole", "Skyrim Cheats", R.drawable.zzz_tesv);
|
|
||||||
private final int icon;
|
|
||||||
private final String name, pkg;
|
|
||||||
|
|
||||||
Icons(final String pkg, final String name, final int icon) {
|
|
||||||
this.name = name;
|
|
||||||
this.pkg = pkg;
|
|
||||||
this.icon = icon;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void openAppStore(@NonNull final Context context, final int position) {
|
|
||||||
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + MyApps.iconsList[position].pkg)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void showAlertDialog(final Context context, final AdapterView.OnItemClickListener clickListener) {
|
|
||||||
final DialogInterface.OnCancelListener cancelListener = d -> {
|
|
||||||
if (clickListener != null) clickListener.onItemClick(null, null, -1, -1);
|
|
||||||
else Process.killProcess(Process.myPid());
|
|
||||||
};
|
|
||||||
if (new Random().nextDouble() < 0.420D) {
|
|
||||||
cancelListener.onCancel(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final GridView gridView = new GridView(context);
|
|
||||||
gridView.setAdapter(new ImageAdapter(context));
|
|
||||||
gridView.setNumColumns(3);
|
|
||||||
gridView.setOnItemClickListener(clickListener);
|
|
||||||
final AlertDialog dialog = new AlertDialog.Builder(context).setView(gridView).setTitle("Support my apps tho").create();
|
|
||||||
dialog.setOnCancelListener(cancelListener);
|
|
||||||
dialog.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ImageAdapter extends BaseAdapter {
|
|
||||||
private final Context context;
|
|
||||||
private final int size;
|
|
||||||
|
|
||||||
public ImageAdapter(final Context context) {
|
|
||||||
this.context = context;
|
|
||||||
this.size = (int) (80 * Resources.getSystem().getDisplayMetrics().density);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getCount() {
|
|
||||||
return iconsList.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getItem(final int position) {
|
|
||||||
return iconsList[position];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getItemId(final int position) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public View getView(final int position, View convertView, final ViewGroup parent) {
|
|
||||||
final ViewHolder holder;
|
|
||||||
if (convertView == null) {
|
|
||||||
final LinearLayout linearLayout = new LinearLayout(context);
|
|
||||||
linearLayout.setOrientation(LinearLayout.VERTICAL);
|
|
||||||
final AppCompatImageView imageView = new AppCompatImageView(context);
|
|
||||||
final AppCompatTextView textView = new AppCompatTextView(context);
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
|
|
||||||
textView.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
|
|
||||||
textView.setGravity(Gravity.CENTER_HORIZONTAL);
|
|
||||||
imageView.setAdjustViewBounds(true);
|
|
||||||
linearLayout.addView(imageView, LinearLayout.LayoutParams.MATCH_PARENT, size);
|
|
||||||
linearLayout.addView(textView);
|
|
||||||
final int padding = size >> 2;
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
|
|
||||||
linearLayout.setPaddingRelative(padding, padding, padding, padding);
|
|
||||||
else linearLayout.setPadding(padding, padding, padding, padding);
|
|
||||||
convertView = linearLayout;
|
|
||||||
convertView.setTag(holder = new ViewHolder(textView, imageView));
|
|
||||||
} else
|
|
||||||
holder = (ViewHolder) convertView.getTag();
|
|
||||||
|
|
||||||
final Object item = getItem(position);
|
|
||||||
if (item instanceof Icons) {
|
|
||||||
final Icons icons = (Icons) item;
|
|
||||||
holder.title.setText(icons.name);
|
|
||||||
holder.icon.setImageResource(icons.icon);
|
|
||||||
}
|
|
||||||
return convertView;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final static class ViewHolder {
|
|
||||||
private final TextView title;
|
|
||||||
private final ImageView icon;
|
|
||||||
|
|
||||||
private ViewHolder(final TextView title, final ImageView icon) {
|
|
||||||
this.title = title;
|
|
||||||
this.icon = icon;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -81,7 +81,7 @@ public final class SettingsHelper {
|
|||||||
themeCode = sharedPreferences.getInt(APP_THEME, themeCode);
|
themeCode = sharedPreferences.getInt(APP_THEME, themeCode);
|
||||||
if (themeCode == 1) themeCode = AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY;
|
if (themeCode == 1) themeCode = AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY;
|
||||||
else if (themeCode == 3) themeCode = AppCompatDelegate.MODE_NIGHT_NO;
|
else if (themeCode == 3) themeCode = AppCompatDelegate.MODE_NIGHT_NO;
|
||||||
else if (themeCode != 2) themeCode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
|
else if (themeCode == 0) themeCode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (themeCode == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM && Build.VERSION.SDK_INT < 29)
|
if (themeCode == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM && Build.VERSION.SDK_INT < 29)
|
||||||
|
@ -388,7 +388,7 @@ public final class Utils {
|
|||||||
userObj.getString("full_name"),
|
userObj.getString("full_name"),
|
||||||
null, null,
|
null, null,
|
||||||
userObj.getString("profile_pic_url"),
|
userObj.getString("profile_pic_url"),
|
||||||
null, 0, 0, 0);
|
null, 0, 0, 0, false, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
final MediaItemType mediaType = getMediaItemType(mediaObj.optInt("media_type", -1));
|
final MediaItemType mediaType = getMediaItemType(mediaObj.optInt("media_type", -1));
|
||||||
@ -465,7 +465,7 @@ public final class Utils {
|
|||||||
userObject.getString("full_name"),
|
userObject.getString("full_name"),
|
||||||
null, null,
|
null, null,
|
||||||
userObject.getString("profile_pic_url"),
|
userObject.getString("profile_pic_url"),
|
||||||
null, 0, 0, 0);
|
null, 0, 0, 0, false, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
final JSONArray items = data.getJSONArray("items");
|
final JSONArray items = data.getJSONArray("items");
|
||||||
@ -614,7 +614,7 @@ public final class Utils {
|
|||||||
profile.getString("full_name"),
|
profile.getString("full_name"),
|
||||||
null, null,
|
null, null,
|
||||||
profile.getString("profile_pic_url"),
|
profile.getString("profile_pic_url"),
|
||||||
null, 0, 0, 0);
|
null, 0, 0, 0, false, false, false, false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
26
app/src/main/res/drawable/ic_cancel.xml
Normal file
26
app/src/main/res/drawable/ic_cancel.xml
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<!--
|
||||||
|
Copyright (C) 2015 The Android Open Source Project
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:alpha="0.8"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M12,2C6.47,2 2,6.47 2,12c0,5.53 4.47,10 10,10c5.53,0 10,-4.47 10,-10C22,6.47 17.53,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8S16.41,20 12,20z"/>
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M15.59,7l-3.59,3.59l-3.59,-3.59l-1.41,1.41l3.59,3.59l-3.59,3.59l1.41,1.41l3.59,-3.59l3.59,3.59l1.41,-1.41l-3.59,-3.59l3.59,-3.59z"/>
|
||||||
|
</vector>
|
@ -75,30 +75,14 @@
|
|||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
|
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
tools:text="retro nugget" />
|
tools:text="Austin Huang" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<awais.instagrabber.customviews.RamboTextView
|
|
||||||
android:id="@+id/mainUrl"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_below="@id/profileInfoText"
|
|
||||||
android:ellipsize="marquee"
|
|
||||||
android:paddingStart="10dp"
|
|
||||||
android:paddingLeft="10dp"
|
|
||||||
android:paddingEnd="10dp"
|
|
||||||
android:paddingRight="10dp"
|
|
||||||
android:singleLine="true"
|
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:visibility="gone"
|
|
||||||
tools:text="http://bigdickbitch.com/" />
|
|
||||||
|
|
||||||
<awais.instagrabber.customviews.RamboTextView
|
<awais.instagrabber.customviews.RamboTextView
|
||||||
android:id="@+id/mainBiography"
|
android:id="@+id/mainBiography"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@id/mainUrl"
|
android:layout_below="@id/profileInfoText"
|
||||||
android:background="?android:selectableItemBackground"
|
android:background="?android:selectableItemBackground"
|
||||||
android:paddingStart="10dp"
|
android:paddingStart="10dp"
|
||||||
android:paddingLeft="10dp"
|
android:paddingLeft="10dp"
|
||||||
@ -106,13 +90,79 @@
|
|||||||
android:paddingRight="10dp"
|
android:paddingRight="10dp"
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
|
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
tools:text="Fuck y'all for real." />
|
tools:text="THE GLORIOUS (step)OWNER OF THIS APP" />
|
||||||
|
|
||||||
|
<awais.instagrabber.customviews.RamboTextView
|
||||||
|
android:id="@+id/mainUrl"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/mainBiography"
|
||||||
|
android:ellipsize="marquee"
|
||||||
|
android:paddingStart="10dp"
|
||||||
|
android:paddingLeft="10dp"
|
||||||
|
android:paddingEnd="10dp"
|
||||||
|
android:paddingRight="10dp"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
|
||||||
|
android:textSize="16sp"
|
||||||
|
tools:text="https://austinhuang.me/"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
|
android:id="@+id/profileActions"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/mainUrl"
|
||||||
|
android:weightSum="3">
|
||||||
|
<androidx.appcompat.widget.AppCompatButton
|
||||||
|
android:id="@+id/btnFollow"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="8dp"
|
||||||
|
android:layout_marginStart="2dp"
|
||||||
|
android:layout_marginRight="8dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="@string/follow"
|
||||||
|
android:textColor="@color/btn_pink_text_color"
|
||||||
|
android:textSize="18sp"
|
||||||
|
app:backgroundTint="@color/btn_pink_background"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatButton
|
||||||
|
android:id="@+id/btnRestrict"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="8dp"
|
||||||
|
android:layout_marginEnd="1dp"
|
||||||
|
android:layout_marginStart="1dp"
|
||||||
|
android:layout_marginRight="8dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="@string/restrict"
|
||||||
|
android:textColor="@color/btn_orange_text_color"
|
||||||
|
android:textSize="18sp"
|
||||||
|
app:backgroundTint="@color/btn_orange_background"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatButton
|
||||||
|
android:id="@+id/btnBlock"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="8dp"
|
||||||
|
android:layout_marginEnd="2dp"
|
||||||
|
android:layout_marginRight="8dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="@string/block"
|
||||||
|
android:textColor="@color/btn_red_text_color"
|
||||||
|
android:textSize="18sp"
|
||||||
|
app:backgroundTint="@color/btn_red_background"
|
||||||
|
android:visibility="gone" />
|
||||||
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/highlightsList"
|
android:id="@+id/highlightsList"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@id/mainBiography"
|
android:layout_below="@id/profileActions"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:paddingStart="5dp"
|
android:paddingStart="5dp"
|
||||||
@ -146,7 +196,7 @@
|
|||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat"
|
android:textAppearance="@style/TextAppearance.AppCompat"
|
||||||
android:textSize="16sp"
|
android:textSize="15sp"
|
||||||
tools:text="35\nPosts" />
|
tools:text="35\nPosts" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatTextView
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
@ -157,7 +207,7 @@
|
|||||||
android:background="?selectableItemBackgroundBorderless"
|
android:background="?selectableItemBackgroundBorderless"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat"
|
android:textAppearance="@style/TextAppearance.AppCompat"
|
||||||
android:textSize="16sp"
|
android:textSize="15sp"
|
||||||
tools:text="68\nFollowers" />
|
tools:text="68\nFollowers" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatTextView
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
@ -172,7 +222,7 @@
|
|||||||
android:background="?selectableItemBackgroundBorderless"
|
android:background="?selectableItemBackgroundBorderless"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat"
|
android:textAppearance="@style/TextAppearance.AppCompat"
|
||||||
android:textSize="16sp"
|
android:textSize="15sp"
|
||||||
tools:text="64\nFollowing" />
|
tools:text="64\nFollowing" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
@ -212,11 +262,13 @@
|
|||||||
android:visibility="gone">
|
android:visibility="gone">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
|
android:id="@+id/privatePage1"
|
||||||
android:layout_width="@dimen/private_page_margins"
|
android:layout_width="@dimen/private_page_margins"
|
||||||
android:layout_height="@dimen/private_page_margins"
|
android:layout_height="@dimen/private_page_margins"
|
||||||
app:srcCompat="@drawable/lock" />
|
app:srcCompat="@drawable/lock" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatTextView
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
|
android:id="@+id/privatePage2"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
|
@ -99,16 +99,17 @@
|
|||||||
|
|
||||||
<androidx.appcompat.widget.LinearLayoutCompat
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="8dp"
|
android:layout_height="0dp"
|
||||||
android:layout_weight="0.26"
|
android:layout_weight="0.26"
|
||||||
android:background="#0000"
|
android:background="#0000"
|
||||||
android:weightSum="2">
|
android:weightSum="2"
|
||||||
|
android:layout_alignParentBottom="true">
|
||||||
<androidx.appcompat.widget.AppCompatButton
|
<androidx.appcompat.widget.AppCompatButton
|
||||||
android:id="@+id/btnLike"
|
android:id="@+id/btnLike"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="8dp"
|
android:layout_marginLeft="8dp"
|
||||||
android:layout_marginEnd="8dp"
|
android:layout_marginStart="6dp"
|
||||||
android:layout_marginRight="8dp"
|
android:layout_marginRight="8dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:text="@string/like"
|
android:text="@string/like"
|
||||||
@ -121,7 +122,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="8dp"
|
android:layout_marginLeft="8dp"
|
||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="6dp"
|
||||||
android:layout_marginRight="8dp"
|
android:layout_marginRight="8dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:text="@string/bookmark"
|
android:text="@string/bookmark"
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
android:title="@string/action_settings"
|
android:title="@string/action_settings"
|
||||||
android:titleCondensed="@string/action_settings"
|
android:titleCondensed="@string/action_settings"
|
||||||
android:visible="false"
|
android:visible="false"
|
||||||
app:showAsAction="always" />
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_dms"
|
android:id="@+id/action_dms"
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<item>Inglés</item>
|
<item>Inglés</item>
|
||||||
<item>Francés [Gracias a @kernoeb (Telegram)]</item>
|
<item>Francés [Gracias a @kernoeb (Telegram)]</item>
|
||||||
<item>Español [Gracias a @sguinetti (GitLab)]</item>
|
<item>Español [Gracias a @sguinetti (GitLab)]</item>
|
||||||
<item>Chino Simplificado [Gracias a @laiboonsing (GitLab)]</item>
|
<item>Chino Simplificado</item>
|
||||||
<item>Indonesio [Gracias a @Galang23 (GitLab)]</item>
|
<item>Indonesio [Gracias a @Galang23 (GitLab)]</item>
|
||||||
<item>Italiano [Gracias a @RAR_Ramar (Telegram)]</item>
|
<item>Italiano [Gracias a @RAR_Ramar (Telegram)]</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
@ -129,7 +129,6 @@
|
|||||||
<string name="comment_view_mention_user_search">¿Quieres buscar el nombre de usuario?</string>
|
<string name="comment_view_mention_user_search">¿Quieres buscar el nombre de usuario?</string>
|
||||||
<string name="comment_view_mention_hash_search">¿Quieres buscar el hashtag?</string>
|
<string name="comment_view_mention_hash_search">¿Quieres buscar el hashtag?</string>
|
||||||
|
|
||||||
<string name="followers_open_in_insta">Abrir en Instagram</string>
|
|
||||||
<string name="followers_type_followers">Seguidores</string>
|
<string name="followers_type_followers">Seguidores</string>
|
||||||
<string name="followers_type_following">Siguiendo</string>
|
<string name="followers_type_following">Siguiendo</string>
|
||||||
<string name="followers_compare">Comparar seguidores & siguiendo</string>
|
<string name="followers_compare">Comparar seguidores & siguiendo</string>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<item>Anglais</item>
|
<item>Anglais</item>
|
||||||
<item>Français [Merci à @kernoeb (Telegram)]</item>
|
<item>Français [Merci à @kernoeb (Telegram)]</item>
|
||||||
<item>Espagnol [Merci à @sguinetti (GitLab)]</item>
|
<item>Espagnol [Merci à @sguinetti (GitLab)]</item>
|
||||||
<item>Chinois Simplifié [Merci à @laiboonsing (GitLab)]</item>
|
<item>Chinois Simplifié</item>
|
||||||
<item>Indonésien [Merci à @Galang23 (GitLab)]</item>
|
<item>Indonésien [Merci à @Galang23 (GitLab)]</item>
|
||||||
<item>Italien [Merci à @RAR_Ramar (Telegram)]</item>
|
<item>Italien [Merci à @RAR_Ramar (Telegram)]</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
@ -129,7 +129,6 @@
|
|||||||
<string name="comment_view_mention_user_search">Souhaitez-vous faire une recherche sur le nom d\'utilisateur ?</string>
|
<string name="comment_view_mention_user_search">Souhaitez-vous faire une recherche sur le nom d\'utilisateur ?</string>
|
||||||
<string name="comment_view_mention_hash_search">Souhaitez-vous faire une recherch sur le hashtag ?</string>
|
<string name="comment_view_mention_hash_search">Souhaitez-vous faire une recherch sur le hashtag ?</string>
|
||||||
|
|
||||||
<string name="followers_open_in_insta">Ouvrir dans Instagram</string>
|
|
||||||
<string name="followers_type_followers">Abonnés</string>
|
<string name="followers_type_followers">Abonnés</string>
|
||||||
<string name="followers_type_following">Abonnements</string>
|
<string name="followers_type_following">Abonnements</string>
|
||||||
<string name="followers_compare">Comparer les abonnés et abonnements</string>
|
<string name="followers_compare">Comparer les abonnés et abonnements</string>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<item>Inggris</item>
|
<item>Inggris</item>
|
||||||
<item>Prancis [Terima kasih @kernoeb (Telegram)]</item>
|
<item>Prancis [Terima kasih @kernoeb (Telegram)]</item>
|
||||||
<item>Spanyol [Terima kasih @sguinetti (GitLab)]</item>
|
<item>Spanyol [Terima kasih @sguinetti (GitLab)]</item>
|
||||||
<item>Tiongkok Sederhana [Terima kasih @laiboonsing (GitLab)]</item>
|
<item>Tiongkok Sederhana</item>
|
||||||
<item>Bahasa Indonesia [Terima kasih @Galang23 (GitLab)]</item>
|
<item>Bahasa Indonesia [Terima kasih @Galang23 (GitLab)]</item>
|
||||||
<item>Italia [Terima kasih @RAR_Ramar (Telegram)]</item>
|
<item>Italia [Terima kasih @RAR_Ramar (Telegram)]</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
@ -129,7 +129,6 @@
|
|||||||
<string name="comment_view_mention_user_search">Apakah anda ingin mencari nama pengguna ini?</string>
|
<string name="comment_view_mention_user_search">Apakah anda ingin mencari nama pengguna ini?</string>
|
||||||
<string name="comment_view_mention_hash_search">Apakah anda ingin mencari hashtag ini?</string>
|
<string name="comment_view_mention_hash_search">Apakah anda ingin mencari hashtag ini?</string>
|
||||||
|
|
||||||
<string name="followers_open_in_insta">Buka di Instagram</string>
|
|
||||||
<string name="followers_type_followers">Pengikut</string>
|
<string name="followers_type_followers">Pengikut</string>
|
||||||
<string name="followers_type_following">Diikuti</string>
|
<string name="followers_type_following">Diikuti</string>
|
||||||
<string name="followers_compare">Membandingkan pengikut & yang diikuti</string>
|
<string name="followers_compare">Membandingkan pengikut & yang diikuti</string>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<item>Inglese</item>
|
<item>Inglese</item>
|
||||||
<item>Francese [Grazie a @kernoeb (Telegram)]</item>
|
<item>Francese [Grazie a @kernoeb (Telegram)]</item>
|
||||||
<item>Spagnolo [Grazie a @sguinetti (GitLab)]</item>
|
<item>Spagnolo [Grazie a @sguinetti (GitLab)]</item>
|
||||||
<item>Cinese Semplificato [Grazie a @laiboonsing (GitLab)]</item>
|
<item>Cinese Semplificato</item>
|
||||||
<item>Indonesiano [Grazie a @Galang23 (GitLab)]</item>
|
<item>Indonesiano [Grazie a @Galang23 (GitLab)]</item>
|
||||||
<item>Italiano [Grazie a @RAR_Ramar (Telegram)]</item>
|
<item>Italiano [Grazie a @RAR_Ramar (Telegram)]</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
@ -129,7 +129,6 @@
|
|||||||
<string name="comment_view_mention_user_search">Vuoi cercare il nome utente?</string>
|
<string name="comment_view_mention_user_search">Vuoi cercare il nome utente?</string>
|
||||||
<string name="comment_view_mention_hash_search">Vuoi cercare l\'hashtag?</string>
|
<string name="comment_view_mention_hash_search">Vuoi cercare l\'hashtag?</string>
|
||||||
|
|
||||||
<string name="followers_open_in_insta">Apri in Instagram</string>
|
|
||||||
<string name="followers_type_followers">Followers</string>
|
<string name="followers_type_followers">Followers</string>
|
||||||
<string name="followers_type_following">Following</string>
|
<string name="followers_type_following">Following</string>
|
||||||
<string name="followers_compare">Confronto followers & following</string>
|
<string name="followers_compare">Confronto followers & following</string>
|
||||||
|
@ -5,9 +5,9 @@
|
|||||||
<item>英文</item>
|
<item>英文</item>
|
||||||
<item>法文 [感谢 @kernoeb (Telegram)]</item>
|
<item>法文 [感谢 @kernoeb (Telegram)]</item>
|
||||||
<item>西班牙文 [感谢 @sguinetti (GitLab)]</item>
|
<item>西班牙文 [感谢 @sguinetti (GitLab)]</item>
|
||||||
<item>简体中文 [感谢 @laiboonsing (GitLab)] </item>
|
<item>简体中文</item>
|
||||||
<item>印度尼西亚 [感谢 @Galang23 (GitLab)]</item>
|
<item>印度尼西亚 [感谢 @Galang23 (GitLab)]</item>
|
||||||
<item>义大利文 [感谢 @RAR_Ramar (Telegram)]</item>
|
<item>意大利文 [感谢 @RAR_Ramar (Telegram)]</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="theme_presets">
|
<string-array name="theme_presets">
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<string name="action_quickaccess">快捷道</string>
|
<string name="action_quickaccess">快捷通道</string>
|
||||||
<string name="action_about">关于</string>
|
<string name="action_about">关于</string>
|
||||||
<string name="action_dms">Direct消息</string>
|
<string name="action_dms">私聊</string>
|
||||||
<string name="action_settings">设定</string>
|
<string name="action_settings">设定</string>
|
||||||
<string name="action_download">下载</string>
|
<string name="action_download">下载</string>
|
||||||
<string name="action_search">搜寻用户名…</string>
|
<string name="action_search">搜索用户名…</string>
|
||||||
<string name="action_compare">比较</string>
|
<string name="action_compare">比较</string>
|
||||||
|
|
||||||
<string name="single_like">次赞</string>
|
<string name="single_like">次赞</string>
|
||||||
<string name="multiple_likes">次赞</string>
|
<string name="multiple_likes">次赞</string>
|
||||||
|
|
||||||
<string name="clipboard_error">复制文字时出错</string>
|
<string name="clipboard_error">复制文字时出错</string>
|
||||||
<string name="clipboard_copied">复制到剪贴板!</string>
|
<string name="clipboard_copied">已复制到剪贴板!</string>
|
||||||
<string name="report">报告</string>
|
<string name="report">报告</string>
|
||||||
<string name="password">密码 (最多32字符)</string>
|
<string name="password">密码 (最多32字符)</string>
|
||||||
<string name="ok">OK</string>
|
<string name="ok">OK</string>
|
||||||
@ -36,7 +36,7 @@
|
|||||||
<string name="bottom_toolbar">底下显示工具栏</string>
|
<string name="bottom_toolbar">底下显示工具栏</string>
|
||||||
<string name="download_user_folder">下载帖子到下载里的用户名文件夹</string>
|
<string name="download_user_folder">下载帖子到下载里的用户名文件夹</string>
|
||||||
<string name="autoload_posts">自动加载用户所有帖子</string>
|
<string name="autoload_posts">自动加载用户所有帖子</string>
|
||||||
<string name="error_loading_profile">载入主页时出错!\n尝试再次登录并搜寻。</string>
|
<string name="error_loading_profile">载入主页时出错!\n请尝试再次登录并搜索。</string>
|
||||||
<string name="error_creating_folders">创建下载文件夹时出错</string>
|
<string name="error_creating_folders">创建下载文件夹时出错</string>
|
||||||
<string name="show_feed">显示用户动态 (只在登录后有效)</string>
|
<string name="show_feed">显示用户动态 (只在登录后有效)</string>
|
||||||
<string name="save_to_folder">保存至自定义文件夹</string>
|
<string name="save_to_folder">保存至自定义文件夹</string>
|
||||||
@ -50,10 +50,10 @@
|
|||||||
<string name="main_posts_followers">%s\n粉丝</string>
|
<string name="main_posts_followers">%s\n粉丝</string>
|
||||||
<string name="main_posts_following">%s\n已关注</string>
|
<string name="main_posts_following">%s\n已关注</string>
|
||||||
|
|
||||||
<string name="post_viewer_video_post">视频贴</string>
|
<string name="post_viewer_video_post">视频帖</string>
|
||||||
<string name="post_viewer_image_post">图片贴</string>
|
<string name="post_viewer_image_post">图片帖</string>
|
||||||
<string name="post_viewer_autoplay_video">自动播放视频</string>
|
<string name="post_viewer_autoplay_video">自动播放视频</string>
|
||||||
<string name="post_viewer_muted_autoplay">总是静音视频</string>
|
<string name="post_viewer_muted_autoplay">视频默认静音</string>
|
||||||
<string name="post_viewer_post_from">%s - %s</string>
|
<string name="post_viewer_post_from">%s - %s</string>
|
||||||
<string name="post_viewer_download_message">注: 当前[时段]直到你的到来都不会显示此对话,且总是下载以显示的帖子片</string>
|
<string name="post_viewer_download_message">注: 当前[时段]直到你的到来都不会显示此对话,且总是下载以显示的帖子片</string>
|
||||||
<string name="post_viewer_download_dialog_title">选择要下载的</string>
|
<string name="post_viewer_download_dialog_title">选择要下载的</string>
|
||||||
@ -69,7 +69,7 @@
|
|||||||
<string name="read_more">阅读更多…</string>
|
<string name="read_more">阅读更多…</string>
|
||||||
|
|
||||||
<string name="login">登录</string>
|
<string name="login">登录</string>
|
||||||
<string name="send_logs">发送日志[出了什么差错的话]</string>
|
<string name="send_logs">发送调试日志</string>
|
||||||
<string name="time_settings">发帖时间设定</string>
|
<string name="time_settings">发帖时间设定</string>
|
||||||
<string name="project_link">参观项目页面</string>
|
<string name="project_link">参观项目页面</string>
|
||||||
<string name="telegram_link">加入 Telegram 群组</string>
|
<string name="telegram_link">加入 Telegram 群组</string>
|
||||||
@ -89,8 +89,8 @@
|
|||||||
<string name="dialog_export_err_password_empty">密码为空! 密码不能是空的,笨蛋!</string>
|
<string name="dialog_export_err_password_empty">密码为空! 密码不能是空的,笨蛋!</string>
|
||||||
|
|
||||||
<string name="refresh">刷新</string>
|
<string name="refresh">刷新</string>
|
||||||
<string name="get_cookies">获得 cookies</string>
|
<string name="get_cookies">获取 cookies</string>
|
||||||
<string name="desktop_2fa">桌面版\n用于 2FA</string>
|
<string name="desktop_2fa">桌面版</string>
|
||||||
|
|
||||||
<string name="time_settings_title_custom">自定义格式</string>
|
<string name="time_settings_title_custom">自定义格式</string>
|
||||||
<string name="time_settings_title_separator">分界</string>
|
<string name="time_settings_title_separator">分界</string>
|
||||||
@ -99,15 +99,15 @@
|
|||||||
<string name="time_settings_title_preview">预览</string>
|
<string name="time_settings_title_preview">预览</string>
|
||||||
<string name="time_settings_swap_time">时间和日期\n位置交换</string>
|
<string name="time_settings_swap_time">时间和日期\n位置交换</string>
|
||||||
|
|
||||||
<string name="quick_access_info_dialog">最爱面板是用来添加你最爱的标签和/或用户。\n\n而快捷道是用来迅速切换账户的。\n\n注1: 确保登录各个账户 [设定 > 登录] 让账户写进列表!\n\n注2: 登出当前账户才登录另一个账户。\n如果多账户对你没用你我都做不了什么</string>
|
<string name="quick_access_info_dialog">最爱面板让您添加您最爱的标签和用户。\n\n而快捷通道是用来迅速切换账户的。\n\n注1: 请确保各个账户已登录 [设定 > 登录] 来添加账户!\n\n注2: 登出当前账户之后再登录另一个账户。</string>
|
||||||
<string name="quick_access_cannot_delete_curr">无法删除正在使用的账户</string>
|
<string name="quick_access_cannot_delete_curr">无法删除正在使用的账户</string>
|
||||||
<string name="quick_access_confirm_delete">你真的要删除 %s?</string>
|
<string name="quick_access_confirm_delete">你真的要删除 %s?</string>
|
||||||
|
|
||||||
<string name="profile_viewer_imageinfo">宽: %d\n高: %d</string>
|
<string name="profile_viewer_imageinfo">宽: %d\n高: %d</string>
|
||||||
<string name="profile_viewer_colordepth_prefix">\n色深:</string>
|
<string name="profile_viewer_colordepth_prefix">\n色深:</string>
|
||||||
<string name="profile_endpoint">选择大头照终点</string>
|
<string name="profile_endpoint">选择头像服务</string>
|
||||||
<string name="open_profile">打开主页</string>
|
<string name="open_profile">打开主页</string>
|
||||||
<string name="view_pfp">看大头照</string>
|
<string name="view_pfp">查看头像</string>
|
||||||
|
|
||||||
<string name="direct_download">直接下载</string>
|
<string name="direct_download">直接下载</string>
|
||||||
<string name="direct_download_desc">直接下载至手机!</string>
|
<string name="direct_download_desc">直接下载至手机!</string>
|
||||||
@ -125,21 +125,33 @@
|
|||||||
<string name="downloader_error_download_file">下载文件时出错</string>
|
<string name="downloader_error_download_file">下载文件时出错</string>
|
||||||
|
|
||||||
<string name="comment_viewer_copy_user">复制用户名</string>
|
<string name="comment_viewer_copy_user">复制用户名</string>
|
||||||
<string name="comment_viewer_copy_comment">复制留言</string>
|
<string name="comment_viewer_copy_comment">复制评论</string>
|
||||||
<string name="comment_view_mention_user_search">你要搜寻用户名吗?</string>
|
<string name="comment_view_mention_user_search">要搜索用户名吗?</string>
|
||||||
<string name="comment_view_mention_hash_search">你要搜寻标签吗?</string>
|
<string name="comment_view_mention_hash_search">要搜索标签吗?</string>
|
||||||
|
|
||||||
<string name="followers_open_in_insta">于 Instagram 打开</string>
|
|
||||||
<string name="followers_type_followers">粉丝</string>
|
<string name="followers_type_followers">粉丝</string>
|
||||||
<string name="followers_type_following">关注</string>
|
<string name="followers_type_following">关注</string>
|
||||||
<string name="followers_compare">比较粉丝 & 关注</string>
|
<string name="followers_compare">比较粉丝和关注</string>
|
||||||
<string name="followers_both_following">互粉</string>
|
<string name="followers_both_following">互粉</string>
|
||||||
<string name="followers_not_following">没关注 %s</string>
|
<string name="followers_not_following">未关注 %s</string>
|
||||||
<string name="followers_not_follower">%s 不是粉丝</string>
|
<string name="followers_not_follower">%s 未关注</string>
|
||||||
|
|
||||||
<string name="login_error_loading_cookies">载入 cookies 时出错</string>
|
<string name="login_error_loading_cookies">载入 cookies 时出错</string>
|
||||||
<string name="login_success_loading_cookies">成功载入 cookies!\n若你仍不能查看私密 页面/帖子,重新登录!</string>
|
<string name="login_success_loading_cookies">成功载入 cookies!\n若你仍不能查看私密页面/帖子,重新登录!</string>
|
||||||
|
|
||||||
<string name="crash_title">应用崩溃</string>
|
<string name="crash_title">应用崩溃了</string>
|
||||||
<string name="crash_descr">糟糕..应用崩溃了,不过别担心,你可以向开发者发送错误报告来帮助他修复问题。 (:</string>
|
<string name="crash_descr">糟糕..应用崩溃了,不过别担心,你可以向开发者发送错误报告来帮助他修复问题。 (:</string>
|
||||||
|
<string name="update_available">检测到有新版本… 请点击下载来打开浏览器。</string>
|
||||||
|
<string name="updated">感谢阁下更新InstaGrabber!</string>
|
||||||
|
<string name="downloader_downloading_media">媒体下载中</string>
|
||||||
|
<string name="matrix_link">加入 Matrix 群组</string>
|
||||||
|
<string name="like">赞</string>
|
||||||
|
<string name="unlike">取消赞</string>
|
||||||
|
<string name="bookmark">加入收藏</string>
|
||||||
|
<string name="unbookmark">解除收藏</string>
|
||||||
|
<string name="logout">退出</string>
|
||||||
|
<string name="no_more_stories">到底啦!</string>
|
||||||
|
<string name="description">原作者 AWAiS 将 InstaGrabber 做成了一个小巧玲珑的 Instagram 帖子下载 [写作下载读作剽窃] 程序,不过他跳槽了,所以我(Austin Huang)就把它接了下来。 [希望此举有所值得。] 不管怎样,InstaGrabber 完全开源,无广告,无跟踪 [Instagram 原生跟踪除外],998都不要,你还等啥???\n有问题 [或者只是想谈谈心] ?请联系 instagrabber@austinhuang.me 或点击下方各按钮。</string>
|
||||||
|
<string name="direct_messages_you">你</string>
|
||||||
|
<string name="direct_messages_sent_link">分享了</string>
|
||||||
</resources>
|
</resources>
|
@ -5,7 +5,7 @@
|
|||||||
<item>English</item>
|
<item>English</item>
|
||||||
<item>French [Thanks to @kernoeb (Telegram)]</item>
|
<item>French [Thanks to @kernoeb (Telegram)]</item>
|
||||||
<item>Spanish [Thanks to @sguinetti (GitLab)]</item>
|
<item>Spanish [Thanks to @sguinetti (GitLab)]</item>
|
||||||
<item>Chinese Simplified [Thanks to @laiboonsing (GitLab)]</item>
|
<item>Chinese Simplified</item>
|
||||||
<item>Indonesian [Thanks to @Galang23 (GitLab)]</item>
|
<item>Indonesian [Thanks to @Galang23 (GitLab)]</item>
|
||||||
<item>Italian [Thanks to @RAR_Ramar (Telegram)]</item>
|
<item>Italian [Thanks to @RAR_Ramar (Telegram)]</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
@ -17,10 +17,11 @@
|
|||||||
<color name="btn_red_background">#E62323</color>
|
<color name="btn_red_background">#E62323</color>
|
||||||
<color name="btn_red_text_color">@color/text_color_dark</color>
|
<color name="btn_red_text_color">@color/text_color_dark</color>
|
||||||
|
|
||||||
|
<color name="btn_purple_background">#909090</color>
|
||||||
<color name="btn_pink_background">#FF69B4</color>
|
<color name="btn_pink_background">#FF69B4</color>
|
||||||
<color name="btn_pink_text_color">#FFFFFFFF</color>
|
<color name="btn_pink_text_color">@color/text_color_dark</color>
|
||||||
<color name="btn_lightpink_background">#FFB6C1</color>
|
<color name="btn_lightpink_background">#FFB6C1</color>
|
||||||
<color name="btn_lightpink_text_color">#FF000000</color>
|
<color name="btn_lightpink_text_color">@color/text_color_light</color>
|
||||||
|
|
||||||
<color name="btn_orange_background">#FF5500</color>
|
<color name="btn_orange_background">#FF5500</color>
|
||||||
<color name="btn_orange_text_color">#FFFFFFFF</color>
|
<color name="btn_orange_text_color">#FFFFFFFF</color>
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
<string name="action_quickaccess">Quick Access</string>
|
<string name="action_quickaccess">Quick Access</string>
|
||||||
<string name="action_about">About</string>
|
<string name="action_about">About</string>
|
||||||
<string name="action_dms">Direct Messages</string>
|
<string name="action_dms">Direct Messages</string>
|
||||||
|
<string name="action_setting">Settings (v%s)</string>
|
||||||
<string name="action_settings">Settings</string>
|
<string name="action_settings">Settings</string>
|
||||||
<string name="action_download">Download</string>
|
<string name="action_download">Download</string>
|
||||||
<string name="action_search">Search username…</string>
|
<string name="action_search">Search username…</string>
|
||||||
@ -67,6 +68,7 @@
|
|||||||
<string name="no_more_stories">No more stories!</string>
|
<string name="no_more_stories">No more stories!</string>
|
||||||
<string name="view_story_post">View Story Post</string>
|
<string name="view_story_post">View Story Post</string>
|
||||||
<string name="priv_acc">This Account is Private</string>
|
<string name="priv_acc">This Account is Private</string>
|
||||||
|
<string name="empty_acc">This Account has No Posts</string>
|
||||||
|
|
||||||
<string name="curr_version">Current version: v%s</string>
|
<string name="curr_version">Current version: v%s</string>
|
||||||
<string name="read_more">read more…</string>
|
<string name="read_more">read more…</string>
|
||||||
@ -84,6 +86,12 @@
|
|||||||
<string name="bookmark">Bookmark</string>
|
<string name="bookmark">Bookmark</string>
|
||||||
<string name="unbookmark">Unbookmark</string>
|
<string name="unbookmark">Unbookmark</string>
|
||||||
|
|
||||||
|
<string name="follow">Follow</string>
|
||||||
|
<string name="unfollow">Unfollow</string>
|
||||||
|
<string name="block">Block</string>
|
||||||
|
<string name="unblock">Unblock</string>
|
||||||
|
<string name="restrict">Restrict</string>
|
||||||
|
<string name="unrestrict">Unrestrict</string>
|
||||||
|
|
||||||
<string name="dialog_export_btn_export">Export</string>
|
<string name="dialog_export_btn_export">Export</string>
|
||||||
<string name="dialog_export_btn_import">Import</string>
|
<string name="dialog_export_btn_import">Import</string>
|
||||||
@ -110,7 +118,7 @@
|
|||||||
<string name="time_settings_title_preview">Preview</string>
|
<string name="time_settings_title_preview">Preview</string>
|
||||||
<string name="time_settings_swap_time">Swap Time and\nDate positions</string>
|
<string name="time_settings_swap_time">Swap Time and\nDate positions</string>
|
||||||
|
|
||||||
<string name="quick_access_info_dialog">Favorites panel is for adding your favorite hashtags and/or usernames.\n\nAnd the Quick Access panel is for quickly switching between accounts.\n\nNote 1: Make sure to Login into each account [Settings > Login] to add account to the list!\n\nNote 2: Log out of the current account and then log into the other account.\nIf multiple accounts don\'t work for you there\'s nothing we both can do!</string>
|
<string name="quick_access_info_dialog">Favorites panel is for adding your favorite hashtags and/or usernames.\n\nAnd the Quick Access panel is for quickly switching between accounts.\n\nNote 1: Make sure to Login into each account [Settings > Login] to add account to the list!\n\nNote 2: Log out of the current account and then log into the other account.</string>
|
||||||
<string name="quick_access_cannot_delete_curr">Cannot delete currently in use account</string>
|
<string name="quick_access_cannot_delete_curr">Cannot delete currently in use account</string>
|
||||||
<string name="quick_access_confirm_delete">Are you sure you want to delete %s?</string>
|
<string name="quick_access_confirm_delete">Are you sure you want to delete %s?</string>
|
||||||
|
|
||||||
@ -163,7 +171,6 @@
|
|||||||
<string name="comment_view_mention_user_search">Do you want to search the username?</string>
|
<string name="comment_view_mention_user_search">Do you want to search the username?</string>
|
||||||
<string name="comment_view_mention_hash_search">Do you want to search the hashtag?</string>
|
<string name="comment_view_mention_hash_search">Do you want to search the hashtag?</string>
|
||||||
|
|
||||||
<string name="followers_open_in_insta">Open in Instagram</string>
|
|
||||||
<string name="followers_type_followers">Followers</string>
|
<string name="followers_type_followers">Followers</string>
|
||||||
<string name="followers_type_following">Following</string>
|
<string name="followers_type_following">Following</string>
|
||||||
<string name="followers_compare">Comparing followers & following</string>
|
<string name="followers_compare">Comparing followers & following</string>
|
||||||
@ -174,7 +181,7 @@
|
|||||||
<string name="login_error_loading_cookies">Error loading cookies</string>
|
<string name="login_error_loading_cookies">Error loading cookies</string>
|
||||||
<string name="login_success_loading_cookies">Successfully loaded cookies!\nIf you still can\'t open private pages/posts, re-login!</string>
|
<string name="login_success_loading_cookies">Successfully loaded cookies!\nIf you still can\'t open private pages/posts, re-login!</string>
|
||||||
|
|
||||||
<string name="update_available">An update is available…\nPress Download to open browser.</string>
|
<string name="update_available">An update is available… Press Download to open browser.</string>
|
||||||
<string name="updated">Thank you for updating InstaGrabber!</string>
|
<string name="updated">Thank you for updating InstaGrabber!</string>
|
||||||
<string name="crash_title">App crashed</string>
|
<string name="crash_title">App crashed</string>
|
||||||
<string name="crash_descr">Oops.. the app crashed, but don\'t worry you can send error report to the developer to help him fix the issue. (:</string>
|
<string name="crash_descr">Oops.. the app crashed, but don\'t worry you can send error report to the developer to help him fix the issue. (:</string>
|
||||||
|
@ -1 +0,0 @@
|
|||||||
Please read https://github.com/austinhuang0131/instagrabber/releases for info.
|
|
7
fastlane/metadata/android/changelogs/31.txt
Executable file
7
fastlane/metadata/android/changelogs/31.txt
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
* You can now (un)follow/restrict/block people
|
||||||
|
* For this reason, "Open in Instagram" for following/follower list is removed
|
||||||
|
* Link in bio is now under bio text (like the actual Instagram app)
|
||||||
|
* Accounts with no posts will be indicated instead of having infinite refresh
|
||||||
|
* When searching, all other buttons will be hidden to expand suggestion width
|
||||||
|
* Remove AWAiS advertisement
|
||||||
|
* Implement LGTM advice to improve stability
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
|||||||
#Mon Mar 16 19:24:49 PKT 2020
|
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
|
distributionSha256Sum=10065868c78f1207afb3a92176f99a37d753a513dff453abb6b5cceda4058cda
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
|
|
||||||
|
51
gradlew
vendored
51
gradlew
vendored
@ -1,5 +1,21 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright 2015 the original author or authors.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
##
|
##
|
||||||
## Gradle start up script for UN*X
|
## Gradle start up script for UN*X
|
||||||
@ -28,7 +44,7 @@ APP_NAME="Gradle"
|
|||||||
APP_BASE_NAME=`basename "$0"`
|
APP_BASE_NAME=`basename "$0"`
|
||||||
|
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
DEFAULT_JVM_OPTS=""
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
MAX_FD="maximum"
|
MAX_FD="maximum"
|
||||||
@ -109,8 +125,8 @@ if $darwin; then
|
|||||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# For Cygwin, switch paths to Windows format before running java
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||||
if $cygwin ; then
|
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||||
@ -138,19 +154,19 @@ if $cygwin ; then
|
|||||||
else
|
else
|
||||||
eval `echo args$i`="\"$arg\""
|
eval `echo args$i`="\"$arg\""
|
||||||
fi
|
fi
|
||||||
i=$((i+1))
|
i=`expr $i + 1`
|
||||||
done
|
done
|
||||||
case $i in
|
case $i in
|
||||||
(0) set -- ;;
|
0) set -- ;;
|
||||||
(1) set -- "$args0" ;;
|
1) set -- "$args0" ;;
|
||||||
(2) set -- "$args0" "$args1" ;;
|
2) set -- "$args0" "$args1" ;;
|
||||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
3) set -- "$args0" "$args1" "$args2" ;;
|
||||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -159,14 +175,9 @@ save () {
|
|||||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||||
echo " "
|
echo " "
|
||||||
}
|
}
|
||||||
APP_ARGS=$(save "$@")
|
APP_ARGS=`save "$@"`
|
||||||
|
|
||||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||||
|
|
||||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
|
||||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
|
||||||
cd "$(dirname "$0")"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec "$JAVACMD" "$@"
|
exec "$JAVACMD" "$@"
|
||||||
|
18
gradlew.bat
vendored
18
gradlew.bat
vendored
@ -1,3 +1,19 @@
|
|||||||
|
@rem
|
||||||
|
@rem Copyright 2015 the original author or authors.
|
||||||
|
@rem
|
||||||
|
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@rem you may not use this file except in compliance with the License.
|
||||||
|
@rem You may obtain a copy of the License at
|
||||||
|
@rem
|
||||||
|
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@rem
|
||||||
|
@rem Unless required by applicable law or agreed to in writing, software
|
||||||
|
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@rem See the License for the specific language governing permissions and
|
||||||
|
@rem limitations under the License.
|
||||||
|
@rem
|
||||||
|
|
||||||
@if "%DEBUG%" == "" @echo off
|
@if "%DEBUG%" == "" @echo off
|
||||||
@rem ##########################################################################
|
@rem ##########################################################################
|
||||||
@rem
|
@rem
|
||||||
@ -14,7 +30,7 @@ set APP_BASE_NAME=%~n0
|
|||||||
set APP_HOME=%DIRNAME%
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
set DEFAULT_JVM_OPTS=
|
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||||
|
|
||||||
@rem Find java.exe
|
@rem Find java.exe
|
||||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
Loading…
Reference in New Issue
Block a user