Merge remote-tracking branch 'origin/new-posts-grid' into new-posts-grid

This commit is contained in:
Ammar Githam 2020-11-03 17:30:24 +09:00
commit 3393166b51
30 changed files with 137 additions and 444 deletions

View File

@ -1,7 +1,8 @@
## WARNING
* All forks must respect [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html). Please report violations in Issues or [confidentially](https://austinhuang.me/#hey-you-look-cool).
* Although publishing a fork is allowed by license, it is strongly discouraged to do so as it divides the effort and creates confusion. It is, therefore, recommended to send a pull request back to us, so that the larger community can enjoy your improvement. (This does not apply if you're adapting this app for a different platform other than Instagram.)
* Some people have asked me about publishing a "commercial" fork that serves ads. However, if you do properly comply with GPLv3, users would realize that the original non-commercial version exists and, in turn, abandon your fork. And if you don't comply, you get copystriked.
* Although publishing a fork is allowed by license, it is strongly discouraged to do so as it divides the effort and creates confusion (as well as for the reason above). It is, therefore, recommended to send a pull request back to us, so that the larger community can enjoy your improvement. (This does not apply if you're adapting this app for a different platform other than Instagram.)
## Contributing
@ -35,11 +36,11 @@ If you have questions, don't be afraid to ask for help from any current maintain
## I found a bug!
**Please read [FAQ](https://instagrabber.austinhuang.me/faq) first.**
**Please read [FAQ](https://barinsta.austinhuang.me/en/latest/faq/) first.**
Bugs are inevitable during active development, as nobody can cover all the possible test cases.
You can either email your crash dump to `instagrabber@austinhuang.me` (The crash reporter will fill in this address for you) or create a GitHub issue. If you're on GitHub, please follow the template. If you're reporting by email, your email address will be published in the GitHub issue. You can contact me [privately](https://austinhuang.me/#hey-you-look-cool) or [through support channels](https://instagrabber.austinhuang.me/#what-can-i-do) to remove it.
You can either email your crash dump to `barinsta@austinhuang.me` (The crash reporter will fill in this address for you) or create a GitHub issue. If you're on GitHub, please follow the template. If you're reporting by email, your email address will be published in the GitHub issue. You can contact me [privately](https://austinhuang.me/#hey-you-look-cool) or [through support channels](https://barinsta.austinhuang.me/en/latest/#contact-us) to remove it.
Generally, reporting bugs directly in support channels is not recommended, as they can be difficult to find.

View File

@ -82,4 +82,8 @@ dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5'
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.0'
// temporary
implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.4.10'
implementation 'org.jetbrains:annotations:13.0'
}

View File

@ -142,10 +142,12 @@ public final class CommentsAdapter extends ListAdapter<CommentModel, RecyclerVie
flatList.add(parent);
positionTypeMap.put(lastCommentIndex, TYPE_PARENT);
final List<CommentModel> children = parent.getChildCommentModels();
for (final CommentModel child : children) {
lastCommentIndex++;
flatList.add(child);
positionTypeMap.put(lastCommentIndex, TYPE_CHILD);
if (children != null) {
for (final CommentModel child : children) {
lastCommentIndex++;
flatList.add(child);
positionTypeMap.put(lastCommentIndex, TYPE_CHILD);
}
}
}
return flatList;

View File

@ -1,5 +1,7 @@
package awais.instagrabber.adapters.viewholder.comments;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
@ -77,6 +79,7 @@ public final class ChildCommentViewHolder extends RecyclerView.ViewHolder {
if (profileModel == null) return;
binding.tvUsername.setText(profileModel.getUsername());
binding.ivProfilePic.setImageURI(profileModel.getSdProfilePic());
binding.isVerified.setVisibility(profileModel.isVerified() ? View.VISIBLE : View.GONE);
}
private void setLikes(final int likes) {

View File

@ -1,5 +1,7 @@
package awais.instagrabber.adapters.viewholder.comments;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
@ -77,6 +79,7 @@ public final class ParentCommentViewHolder extends RecyclerView.ViewHolder {
if (profileModel == null) return;
binding.tvUsername.setText(profileModel.getUsername());
binding.ivProfilePic.setImageURI(profileModel.getSdProfilePic());
binding.isVerified.setVisibility(profileModel.isVerified() ? View.VISIBLE : View.GONE);
}
private void setLikes(final int likes) {

View File

@ -269,8 +269,8 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, List<CommentMod
}
childCommentModels.get(childCommentsLen - 1).setPageCursor(hasNextPage, childEndCursor);
commentModel.setChildCommentModels(childCommentModels);
commentModels.add(commentModel);
}
commentModels.add(commentModel);
}
}

View File

@ -1,340 +0,0 @@
// package awais.instagrabber.fragments;
//
// import android.content.Context;
// import android.content.DialogInterface;
// import android.content.pm.PackageManager;
// import android.os.AsyncTask;
// import android.os.Bundle;
// import android.util.Log;
// import android.view.LayoutInflater;
// import android.view.View;
// import android.view.ViewGroup;
//
// import androidx.annotation.NonNull;
// import androidx.annotation.Nullable;
// import androidx.appcompat.app.AlertDialog;
// import androidx.fragment.app.Fragment;
// import androidx.fragment.app.FragmentActivity;
// import androidx.lifecycle.ViewModelProvider;
// import androidx.navigation.NavDirections;
// import androidx.navigation.fragment.NavHostFragment;
// import androidx.viewpager2.widget.ViewPager2;
//
// import java.util.ArrayList;
// import java.util.Arrays;
// import java.util.Collections;
// import java.util.List;
//
// import awais.instagrabber.R;
// import awais.instagrabber.adapters.PostViewAdapter;
// import awais.instagrabber.adapters.PostViewAdapter.OnPostViewChildViewClickListener;
// import awais.instagrabber.asyncs.PostFetcher;
// import awais.instagrabber.asyncs.i.iPostFetcher;
// import awais.instagrabber.databinding.FragmentPostViewBinding;
// import awais.instagrabber.interfaces.FetchListener;
// import awais.instagrabber.interfaces.MentionClickListener;
// import awais.instagrabber.models.FeedModel;
// import awais.instagrabber.models.ViewerPostModel;
// import awais.instagrabber.models.ViewerPostModelWrapper;
// import awais.instagrabber.models.enums.DownloadMethod;
// import awais.instagrabber.utils.Constants;
// import awais.instagrabber.utils.CookieUtils;
// import awais.instagrabber.utils.DownloadUtils;
// import awais.instagrabber.utils.Utils;
// import awais.instagrabber.viewmodels.ViewerPostViewModel;
// import awais.instagrabber.webservices.MediaService;
// import awais.instagrabber.webservices.ServiceCallback;
//
// import static androidx.core.content.ContextCompat.checkSelfPermission;
// import static awais.instagrabber.utils.Utils.settingsHelper;
//
// public class PostViewFragment extends Fragment {
// private static final String TAG = "PostViewFragment";
// private static final String COOKIE = settingsHelper.getString(Constants.COOKIE);
//
// private FragmentActivity fragmentActivity;
// private FragmentPostViewBinding binding;
// private ViewPager2 root;
// private boolean shouldRefresh = true;
// private ViewerPostViewModel viewerPostViewModel;
// private boolean isId;
// private int currentPostIndex;
// private List<String> idOrCodeList;
// private boolean hasInitialResult = false;
// private PostViewAdapter adapter;
// private boolean session;
// private MediaService mediaService;
//
// private FetchListener<FeedModel> pfl = result -> {
// if (result == null) return;
// final List<ViewerPostModelWrapper> viewerPostModels = viewerPostViewModel.getList().getValue();
// final List<ViewerPostModelWrapper> temp = viewerPostModels == null ? new ArrayList<>(idOrCodeList.size())
// : new ArrayList<>(viewerPostModels);
// String idOrCode = isId ? result.getPostId() : result.getShortCode();
// if (idOrCode == null) return;
// if (isId) {
// // the post id is appended with `_` in the result
// idOrCode = idOrCode.substring(0, idOrCode.indexOf('_'));
// }
// final int index = idOrCodeList.indexOf(idOrCode);
// if (index < 0) return;
// final ViewerPostModelWrapper viewerPostModelWrapper = temp.get(index);
// viewerPostModelWrapper.setViewerPostModels(result.getSliderItems() == null ? Collections.emptyList() : result.getSliderItems());
// temp.set(index, viewerPostModelWrapper);
// viewerPostViewModel.getList().setValue(temp);
// adapter.notifyItemChanged(index);
// if (!hasInitialResult) {
// Log.d(TAG, "setting delayed position to: " + currentPostIndex);
// binding.getRoot()
// .postDelayed(() -> binding.getRoot().setCurrentItem(currentPostIndex), 200);
// }
// hasInitialResult = true;
// };
// private MentionClickListener mentionListener = (view, text, isHashtag, isLocation) -> {
// if (isHashtag) {
// final NavDirections action = PostViewFragmentDirections
// .actionGlobalHashTagFragment(text);
// NavHostFragment.findNavController(this).navigate(action);
// return;
// }
// if (isLocation) {
// final NavDirections action = PostViewFragmentDirections
// .actionGlobalLocationFragment(text);
// NavHostFragment.findNavController(this).navigate(action);
// return;
// }
// final NavDirections action = PostViewFragmentDirections
// .actionGlobalProfileFragment("@" + text);
// NavHostFragment.findNavController(this).navigate(action);
// };
// private OnPostViewChildViewClickListener clickListener = (v, wrapper, postPosition, childPosition) -> {
// final ViewerPostModel postModel = wrapper.getViewerPostModels().get(0);
// final String username = postModel.getProfileModel().getUsername();
// final int id = v.getId();
// switch (id) {
// case R.id.viewerCaption:
// break;
// case R.id.btnComments:
// String postId = postModel.getPostId();
// if (postId.contains("_")) postId = postId.substring(0, postId.indexOf("_"));
// final NavDirections commentsAction = PostViewFragmentDirections.actionGlobalCommentsViewerFragment(
// postModel.getShortCode(),
// postId,
// postModel.getProfileModel().getId()
// );
// NavHostFragment.findNavController(this).navigate(commentsAction);
// break;
// case R.id.btnDownload:
// final Context context = getContext();
// if (context == null) return;
// if (checkSelfPermission(context,
// DownloadUtils.PERMS[0]) == PackageManager.PERMISSION_GRANTED) {
// showDownloadDialog(wrapper.getViewerPostModels(),
// childPosition,
// username);
// return;
// }
// requestPermissions(DownloadUtils.PERMS, 8020);
// break;
// case R.id.ivProfilePic:
// case R.id.title:
// mentionListener.onClick(null, username, false, false);
// break;
// case R.id.btnLike:
// if (mediaService != null) {
// final String userId = CookieUtils.getUserIdFromCookie(COOKIE);
// final String csrfToken = CookieUtils.getCsrfTokenFromCookie(COOKIE);
// v.setEnabled(false);
// final ServiceCallback<Boolean> likeCallback = new ServiceCallback<Boolean>() {
// @Override
// public void onSuccess(final Boolean result) {
// v.setEnabled(true);
// if (result) {
// postModel.setManualLike(!postModel.getLike());
// adapter.notifyItemChanged(postPosition);
// return;
// }
// Log.e(TAG, "like/unlike unsuccessful!");
// }
//
// @Override
// public void onFailure(final Throwable t) {
// v.setEnabled(true);
// Log.e(TAG, "Error during like/unlike", t);
// }
// };
// if (!postModel.getLike()) {
// mediaService.like(postModel.getPostId(), userId, csrfToken, likeCallback);
// } else {
// mediaService.unlike(postModel.getPostId(), userId, csrfToken, likeCallback);
// }
// }
// break;
// case R.id.btnBookmark:
// if (mediaService != null) {
// final String userId = CookieUtils.getUserIdFromCookie(COOKIE);
// final String csrfToken = CookieUtils.getCsrfTokenFromCookie(COOKIE);
// v.setEnabled(false);
// final ServiceCallback<Boolean> saveCallback = new ServiceCallback<Boolean>() {
// @Override
// public void onSuccess(final Boolean result) {
// v.setEnabled(true);
// if (result) {
// // postModel.setBookmarked(!postModel.isSaved());
// adapter.notifyItemChanged(postPosition);
// return;
// }
// Log.e(TAG, "save/unsave unsuccessful!");
// }
//
// @Override
// public void onFailure(final Throwable t) {
// v.setEnabled(true);
// Log.e(TAG, "Error during save/unsave", t);
// }
// };
// if (!postModel.isSaved()) {
// mediaService.save(postModel.getPostId(), userId, csrfToken, saveCallback);
// } else {
// mediaService.unsave(postModel.getPostId(), userId, csrfToken, saveCallback);
// }
// }
// break;
// }
// };
// private PostViewAdapter.OnPostCaptionLongClickListener captionLongClickListener = text -> {
// final Context context = getContext();
// if (context == null) return;
// Utils.copyText(context, text);
// };
//
// @Override
// public void onCreate(@Nullable final Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// fragmentActivity = getActivity();
// mediaService = MediaService.getInstance();
// }
//
// @Nullable
// @Override
// public View onCreateView(@NonNull final LayoutInflater inflater,
// @Nullable final ViewGroup container,
// @Nullable final Bundle savedInstanceState) {
// if (root != null) {
// shouldRefresh = false;
// return root;
// }
// binding = FragmentPostViewBinding.inflate(inflater, container, false);
// root = binding.getRoot();
// setupViewPager();
// return root;
// }
//
// @Override
// public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {
// if (!shouldRefresh) return;
// init();
// shouldRefresh = false;
// }
//
// private void setupViewPager() {
// viewerPostViewModel = new ViewModelProvider(fragmentActivity)
// .get(ViewerPostViewModel.class);
// adapter = new PostViewAdapter(clickListener, captionLongClickListener, mentionListener);
// root.setAdapter(adapter);
// root.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
//
// @Override
// public void onPageSelected(final int position) {
// // Log.d(TAG, "onPageSelected: " + position + ", hasInitialResult: " + hasInitialResult);
// if (!hasInitialResult) {
// return;
// }
// currentPostIndex = position;
// fetchPost();
// }
// });
// viewerPostViewModel.getList().observe(fragmentActivity, list -> adapter.submitList(list));
// }
//
// private void init() {
// if (getArguments() == null) return;
// final PostViewFragmentArgs fragmentArgs = PostViewFragmentArgs.fromBundle(getArguments());
// final String[] idOrCodeArray = fragmentArgs.getIdOrCodeArray();
// if (idOrCodeArray.length == 0) return;
// currentPostIndex = fragmentArgs.getIndex();
// if (currentPostIndex < 0) return;
// if (currentPostIndex >= idOrCodeArray.length) return;
// idOrCodeList = Arrays.asList(idOrCodeArray);
// viewerPostViewModel.getList().setValue(createPlaceholderModels(idOrCodeArray.length));
// isId = fragmentArgs.getIsId();
// fetchPost();
// }
//
// private List<ViewerPostModelWrapper> createPlaceholderModels(final int size) {
// final List<ViewerPostModelWrapper> viewerPostModels = new ArrayList<>(size);
// for (int i = 0; i < size; i++) {
// // viewerPostModels.add(new ViewerPostModel[]{ViewerPostModel.getDefaultModel(-i, "")});
// viewerPostModels.add(new ViewerPostModelWrapper(i, null));
// }
// return viewerPostModels;
// }
//
// private void fetchPost() {
// // Log.d(TAG, "fetchPost, currentPostIndex: " + currentPostIndex);
// final List<ViewerPostModelWrapper> list = viewerPostViewModel.getList().getValue();
// if (list != null) {
// final ViewerPostModelWrapper viewerPostModels = list.get(currentPostIndex);
// if (viewerPostModels != null && viewerPostModels
// .getViewerPostModels() != null && viewerPostModels
// .getViewerPostModels().size() > 0) {
// Log.d(TAG, "returning without fetching");
// return;
// }
// }
// if (currentPostIndex >= idOrCodeList.size() || currentPostIndex < 0) return;
// final String idOrShortCode = idOrCodeList.get(currentPostIndex);
// if (isId) {
// new iPostFetcher(idOrShortCode, pfl).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
// return;
// }
// new PostFetcher(idOrShortCode, pfl).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
// }
//
// private void showDownloadDialog(final List<ViewerPostModel> postModels,
// final int childPosition,
// final String username) {
// final List<ViewerPostModel> postModelsToDownload = new ArrayList<>();
// final Context context = getContext();
// if (context == null) return;
// if (!session && postModels.size() > 1) {
// final DialogInterface.OnClickListener clickListener = (dialog, which) -> {
// if (which == DialogInterface.BUTTON_NEGATIVE) {
// postModelsToDownload.addAll(postModels);
// } else if (which == DialogInterface.BUTTON_POSITIVE) {
// postModelsToDownload.add(postModels.get(childPosition));
// } else {
// session = true;
// postModelsToDownload.add(postModels.get(childPosition));
// }
// if (postModelsToDownload.size() > 0) {
// DownloadUtils.batchDownload(context,
// username,
// DownloadMethod.DOWNLOAD_POST_VIEWER,
// postModelsToDownload);
// }
// };
// new AlertDialog.Builder(context)
// .setTitle(R.string.post_viewer_download_dialog_title)
// .setMessage(R.string.post_viewer_download_message)
// .setNeutralButton(R.string.post_viewer_download_session, clickListener)
// .setPositiveButton(R.string.post_viewer_download_current, clickListener)
// .setNegativeButton(R.string.post_viewer_download_album, clickListener).show();
// } else {
// DownloadUtils.batchDownload(context,
// username,
// DownloadMethod.DOWNLOAD_POST_VIEWER,
// Collections.singletonList(postModels.get(childPosition)));
// }
// }
// }

View File

@ -764,6 +764,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment {
private void setupTitles() {
binding.title.setText(feedModel.getProfileModel().getUsername());
binding.righttitle.setText(feedModel.getProfileModel().getName());
binding.isVerified.setVisibility(feedModel.getProfileModel().isVerified() ? View.VISIBLE : View.GONE);
binding.title.setOnClickListener(v -> navigateToProfile("@" + feedModel.getProfileModel().getUsername()));
binding.righttitle.setOnClickListener(v -> navigateToProfile("@" + feedModel.getProfileModel().getUsername()));
final String locationName = feedModel.getLocationName();

View File

@ -72,6 +72,7 @@ public final class LocaleUtils {
if (appLanguageIndex == 11) return "fa";
if (appLanguageIndex == 12) return "mk";
if (appLanguageIndex == 13) return "vi";
if (appLanguageIndex == 14) return "hi";
return null;
}

View File

@ -5,6 +5,7 @@ import androidx.annotation.NonNull;
import java.io.IOException;
import awais.instagrabber.utils.Constants;
import awais.instagrabber.utils.LocaleUtils;
import awais.instagrabber.utils.Utils;
import okhttp3.Interceptor;
import okhttp3.Request;
@ -22,6 +23,10 @@ public class AddCookiesInterceptor implements Interceptor {
if (request.header(userAgentHeader) == null) {
builder.addHeader(userAgentHeader, Constants.I_USER_AGENT);
}
final String languageHeader = "Accept-Language";
if (request.header(languageHeader) == null) {
builder.addHeader(languageHeader, LocaleUtils.getCurrentLocale().getLanguage() + ",en-US;q=0.8");
}
final Request updatedRequest = builder.build();
return chain.proceed(updatedRequest);
}

View File

@ -172,7 +172,7 @@ public class ProfileService extends BaseService {
} else {
resourceUrl = mediaNode.has("display_resources") ? ResponseBodyUtils.getHighQualityImage(mediaNode) : displayUrl;
}
JSONObject tempJsonObject = mediaNode.optJSONObject("edge_media_preview_comment");
JSONObject tempJsonObject = mediaNode.optJSONObject("edge_media_to_comment");
final long commentsCount = tempJsonObject != null ? tempJsonObject.optLong("count") : 0;
tempJsonObject = mediaNode.optJSONObject("edge_media_preview_like");
final long likesCount = tempJsonObject != null ? tempJsonObject.optLong("count") : 0;

View File

@ -65,29 +65,42 @@
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
android:ellipsize="marquee"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
android:textColor="@color/white"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@id/subtitle"
app:layout_constraintEnd_toEndOf="@id/righttitle"
app:layout_constraintEnd_toStartOf="@id/isVerified"
app:layout_constraintStart_toEndOf="@id/profile_pic"
app:layout_constraintTop_toTopOf="@id/profile_pic"
tools:text="Username Username Username" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/isVerified"
android:layout_width="20dp"
android:layout_height="0dp"
android:scaleType="fitCenter"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/title"
app:layout_constraintStart_toEndOf="@id/title"
app:layout_constraintTop_toTopOf="@id/title"
app:srcCompat="@drawable/verified"
tools:visibility="visible" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/righttitle"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginStart="4dp"
android:ellipsize="marquee"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
android:textColor="@color/grey_600"
app:layout_constraintBottom_toBottomOf="@id/title"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/title"
app:layout_constraintStart_toEndOf="@id/isVerified"
app:layout_constraintTop_toTopOf="@id/title"
tools:text="Full name Full name Full name Full name Full name Full name Full name " />

View File

@ -24,7 +24,7 @@
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tvUsername"
android:layout_width="0dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:paddingStart="4dp"
@ -36,11 +36,23 @@
android:textColor="?android:textColorPrimary"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@id/tvComment"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/ivProfilePic"
app:layout_constraintTop_toTopOf="parent"
tools:text="username" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/isVerified"
android:layout_width="0dp"
android:layout_height="0dp"
android:scaleType="fitStart"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/tvUsername"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/tvUsername"
app:layout_constraintTop_toTopOf="@id/tvUsername"
app:srcCompat="@drawable/verified"
tools:visibility="visible" />
<awais.instagrabber.customviews.RamboTextViewV2
android:id="@+id/tvComment"
android:layout_width="0dp"

View File

@ -35,11 +35,23 @@
android:textColor="?android:textColorPrimary"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@id/tvComment"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/ivProfilePic"
app:layout_constraintTop_toTopOf="parent"
tools:text="username" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/isVerified"
android:layout_width="0dp"
android:layout_height="0dp"
android:scaleType="fitStart"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/tvUsername"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/tvUsername"
app:layout_constraintTop_toTopOf="@id/tvUsername"
app:srcCompat="@drawable/verified"
tools:visibility="visible" />
<awais.instagrabber.customviews.RamboTextViewV2
android:id="@+id/tvComment"
android:layout_width="0dp"

View File

@ -6,8 +6,6 @@
<string name="action_download">Herunterladen</string>
<string name="action_search">Benutzernamen suchen…</string>
<string name="action_compare">Vergleichen</string>
<string name="single_like">Like</string>
<string name="multiple_likes">Likes</string>
<string name="clipboard_error">Fehler beim Kopieren des Textes</string>
<string name="clipboard_copied">In die Zwischenablage kopiert!</string>
<string name="report">Melden</string>

View File

@ -6,8 +6,6 @@
<string name="action_download">Descarga</string>
<string name="action_search">Buscar usuario…</string>
<string name="action_compare">Comparar</string>
<string name="single_like">me gusta</string>
<string name="multiple_likes">me gustas</string>
<string name="clipboard_error">Error al copiar texto</string>
<string name="clipboard_copied">¡Copiar al portapapeles!</string>
<string name="report">Reportar</string>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="languages">
<item>پیش فرض سیستم</item>
<item>پیشگزیده سامانه</item>
<item>انگلیسی</item>
<item>فرانسوی [ با سپاس از kernoeb@ ]</item>
<item>اسپانیایی [ با سپاس از sguinetti@ ]</item>
@ -32,7 +32,7 @@
<string-array name="theme_presets">
<item>خودکار / پیروی از سیستم</item>
<item>خودکار / پیروی از باتری</item>
<item>تاریک</item>
<item>تیره</item>
<item>روشن</item>
</string-array>
<string-array name="theme_presets_values">

View File

@ -6,8 +6,6 @@
<string name="action_download">دانلود</string>
<string name="action_search">جستجوی نام کاربری…</string>
<string name="action_compare">مقایسه</string>
<string name="single_like">پسندیدن</string>
<string name="multiple_likes">پسند</string>
<string name="clipboard_error">خطا هنگام کپی متن</string>
<string name="clipboard_copied">به کلیپ بورد کپی شد!</string>
<string name="report">گزارش</string>

View File

@ -6,8 +6,6 @@
<string name="action_download">Téléchargement</string>
<string name="action_search">Rechercher par nom d\'utilisateur…</string>
<string name="action_compare">Comparer</string>
<string name="single_like">j\'aime</string>
<string name="multiple_likes">j\'aimes</string>
<string name="clipboard_error">Erreur lors de la copie des éléments</string>
<string name="clipboard_copied">Copié dans le presse-papier !</string>
<string name="report">Reporter</string>

View File

@ -6,8 +6,6 @@
<string name="action_download">डाउनलोड करें</string>
<string name="action_search">ब्यबहारकारीयों के ब्यबहृत नाम ढुंढे...</string>
<string name="action_compare">तुलना करें</string>
<string name="single_like">पसंद करें</string>
<string name="multiple_likes">पसन्दित</string>
<string name="clipboard_error">लेखा उतारने में त्रुटि</string>
<string name="clipboard_copied">क्लिपबोर्ड पर नक़ल किया</string>
<string name="report">रिपोर्ट करें</string>
@ -213,27 +211,27 @@
<string name="followers_type_followers">अनुयायी</string>
<string name="followers_type_following">फ़ॉलो कर रहे हैं</string>
<string name="followers_compare">फलोअर्स &amp; फलोइंग के तुलना</string>
<string name="followers_both_following">Both following each other</string>
<string name="followers_not_following">not following %s</string>
<string name="followers_not_follower">%s is not following</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="comment_hint">Write a new comment...</string>
<string name="dm_hint">Write a new message...</string>
<string name="liked_notif">Liked your post</string>
<string name="comment_notif">Commented on your post:</string>
<string name="follow_notif">Started following you</string>
<string name="mention_notif">Mentioned you:</string>
<string name="request_notif">Requested following you</string>
<string name="request_approve">Approve request</string>
<string name="request_reject">Reject request</string>
<string name="share_public_post">Share this public post to...</string>
<string name="share_private_post">This is a private post! Share to those who can view them!</string>
<string name="discover_empty">This category is somehow empty...</string>
<string name="update_available">An update is available! (%s)</string>
<string name="update_notice">Reminder: If you downloaded from F-Droid, you must update from it! Same applies for GitHub.</string>
<string name="updated">Thank you for updating Barinsta!</string>
<string name="crash_title">App crashed</string>
<string name="followers_both_following">एक दुसरे को फोलो कर रहें हैं</string>
<string name="followers_not_following">फोलो नहीं कर रहा %s</string>
<string name="followers_not_follower">%s फोलो नहीं कर रहा है</string>
<string name="login_error_loading_cookies">कुकीज लोड करने में त्रुटि</string>
<string name="login_success_loading_cookies">कुकीज सफलतापूर्बक लोड हुआ!\nअगर आप अभी तक गोपन पेज या पोस्ट खुल नहीं पा रहे हैं, फिर से लग इन करें!</string>
<string name="comment_hint">नया कमेंट करें...</string>
<string name="dm_hint">एक नया संदेश लिखो...</string>
<string name="liked_notif">आपकी पोस्ट को पसंद किया</string>
<string name="comment_notif">आपके पोस्ट पर कमेंट किया है:</string>
<string name="follow_notif">आपको फॉलो करना शुरू किया</string>
<string name="mention_notif">आपका उल्लेख किया:</string>
<string name="request_notif">आपको फॉलो करने का निवेदन किया</string>
<string name="request_approve">निवेदन को ग्रहण करें</string>
<string name="request_reject">अनुरोध प्रत्याख्यान करें</string>
<string name="share_public_post">इसी सार्वजनिक पोस्ट को भेजें...</string>
<string name="share_private_post">यह एक गुप्त पोस्ट है! उन लोगों को बांटना जो उन्हें देख सकते हैं!</string>
<string name="discover_empty">यह वर्ग रिक्त है...</string>
<string name="update_available">नया अद्यतन उपलब्ध! (%s)</string>
<string name="update_notice">याद रखें: अगर आप f-droid से डाउनलोड किया है तो उसी से ही अपडेट करें! Github के लिये भी बही।</string>
<string name="updated">बारइनष्टा को अद्दतन करने के लिए धन्यबाद!</string>
<string name="crash_title">एप में त्रुटि हुयी।</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="use_amoled_dark_theme">Use AMOLED mode for Dark theme</string>
<string name="action_notif">Activity</string>

View File

@ -6,8 +6,6 @@
<string name="action_download">Unduh</string>
<string name="action_search">Cari Pengguna…</string>
<string name="action_compare">Bandingkan</string>
<string name="single_like">suka</string>
<string name="multiple_likes">suka</string>
<string name="clipboard_error">Galat menyalin tulisan</string>
<string name="clipboard_copied">Tersalin!</string>
<string name="report">Laporkan</string>

View File

@ -6,8 +6,6 @@
<string name="action_download">Scarica</string>
<string name="action_search">Cerca utente…</string>
<string name="action_compare">Compara</string>
<string name="single_like">hai messo un Like</string>
<string name="multiple_likes">likes</string>
<string name="clipboard_error">Errore durante la copia del testo</string>
<string name="clipboard_copied">Copiato negli appunti!</string>
<string name="report">Segnala</string>

View File

@ -6,8 +6,6 @@
<string name="action_download">Превземи</string>
<string name="action_search">Пребарај username…</string>
<string name="action_compare">Спореди</string>
<string name="single_like">лајкни</string>
<string name="multiple_likes">лајкови</string>
<string name="clipboard_error">Грешка при копрање текст</string>
<string name="clipboard_copied">Копрано во clipboard!</string>
<string name="report">Пријави</string>

View File

@ -6,8 +6,6 @@
<string name="action_download">Pobierz</string>
<string name="action_search">Szukaj użytkownika…</string>
<string name="action_compare">Porównaj</string>
<string name="single_like">polubienie</string>
<string name="multiple_likes">polubienia</string>
<string name="clipboard_error">Wystąpił błąd podczas kopiowania tekstu</string>
<string name="clipboard_copied">Skopiowano do schowka!</string>
<string name="report">Zgłoś</string>

View File

@ -6,9 +6,7 @@
<string name="action_download">Baixar</string>
<string name="action_search">Pesquisar nome de usuário…</string>
<string name="action_compare">Comparar</string>
<string name="single_like">like</string>
<string name="multiple_likes">likes</string>
<string name="clipboard_error">Erro ao copiar texto</string>
<string name="clipboard_error">Falha ao copiar texto</string>
<string name="clipboard_copied">Copiado para a área de transferência!</string>
<string name="report">Reportar</string>
<string name="password">Senha (máx. 32 caracteres)</string>
@ -31,15 +29,15 @@
<string name="title_changelog">Histórico de atualizações</string>
<string name="bottom_toolbar">Mostrar barra de ferramentas na parte inferior</string>
<string name="update_check">Verificar se há atualizações ao iniciar</string>
<string name="download_user_folder">Baixar postagens para pastas com o nome de usuário</string>
<string name="autoload_posts">Carregar automaticamente todas as postagens do usuário</string>
<string name="download_user_folder">Baixar publicações para pastas com o nome de usuário</string>
<string name="autoload_posts">Carregar automaticamente todas as publicações do usuário</string>
<string name="mark_as_seen_setting">Marcar stories como vistos após a visualização</string>
<string name="mark_as_seen_setting_summary">O autor do story saberá que você viu</string>
<string name="dm_mark_as_seen_setting">Marcar DM como vista após a visualização</string>
<string name="dm_mark_as_seen_setting_summary">Outros membros saberão que você viu</string>
<string name="activity_setting">Ativar notificações de atividade</string>
<string name="error_loading_profile">Erro ao carregar o perfil!\nTente fazer login e pesquise novamente.</string>
<string name="error_creating_folders">Erro ao criar pasta(s) de download.</string>
<string name="error_loading_profile">Falha ao carregar o perfil!\nTente fazer login e pesquisar novamente.</string>
<string name="error_creating_folders">Falha ao criar pasta(s) de download.</string>
<string name="show_feed">Mostrar feed do usuário (funciona apenas quando o usuário está logado)</string>
<string name="save_to_folder">Salvar em pasta personalizada</string>
<string name="select_folder">Selecione uma pasta</string>
@ -53,25 +51,25 @@
<string name="import_export">Importar/Exportar</string>
<string name="select_language">Idioma</string>
<string name="what_to_do_dialog">O que fazer?</string>
<string name="main_posts_count">%s\n Postagens</string>
<string name="main_posts_count_inline">%s Postagens</string>
<string name="main_posts_count">%s\nPublicações</string>
<string name="main_posts_count_inline">%s Publicações</string>
<string name="main_posts_followers">%s\nSeguidores</string>
<string name="main_posts_following">%s\nSeguindo</string>
<string name="post_viewer_video_post">Postagem de vídeo</string>
<string name="post_viewer_image_post">Postagem de imagem</string>
<string name="post_viewer_video_post">Publicação de vídeo</string>
<string name="post_viewer_image_post">Publicação de imagem</string>
<string name="post_viewer_autoplay_video">Reprodução automática de vídeos</string>
<string name="post_viewer_muted_autoplay">Sempre silenciar vídeos</string>
<string name="post_viewer_post_from">%s - %s</string>
<string name="post_viewer_download_message" comment="post_viewer_download_message&#10;&#10;[Session] is NOT a variable, please translate it and ignore warnings">Nota: A [Sessão] atual não mostrará esta caixa de diálogo até que você esteja aqui e sempre fará o download do slide de postagem mostrado.</string>
<string name="post_viewer_download_message" comment="post_viewer_download_message&#10;&#10;[Session] is NOT a variable, please translate it and ignore warnings">Obs: A [Sessão] atual não mostrará esta mensagem até que você esteja aqui e sempre baixará o slide de publicação mostrado.</string>
<string name="post_viewer_download_dialog_title">Selecione o que baixar</string>
<string name="post_viewer_download_session" comment="post_viewer_download_session&#10;&#10;[Session] is NOT a variable, please translate it and ignore warnings">[Sessão] Atual</string>
<string name="post_viewer_download_current">Atual</string>
<string name="post_viewer_download_album">Álbum inteiro</string>
<string name="show_stories">Mostrar stories</string>
<string name="no_more_stories">Sem mais stories!</string>
<string name="be_patient">Seja paciente!</string>
<string name="view_story_post">Ver postagem</string>
<string name="view_post">Ver postagem</string>
<string name="be_patient">Tenha paciência!</string>
<string name="view_story_post">Ver Publicação</string>
<string name="view_post">Ver Publicação</string>
<string name="spotify">Spotify</string>
<string name="stories_notloggedin">Não é possível interagir se você não estiver logado!</string>
<string name="vote_story_poll">Votar</string>
@ -79,7 +77,7 @@
<string name="voted_story_poll">Você já votou!</string>
<string name="respond_story">Responder</string>
<string name="answer_hint">Responder...</string>
<string name="answered_story">Resposta bem-sucedida!</string>
<string name="answered_story">Resposta enviada!</string>
<string name="reply_story">Responder o story</string>
<string name="reply_hint">Responder...</string>
<string name="story_quiz">Quiz</string>
@ -89,8 +87,8 @@
<string name="priv_acc_confirm">Você não será capaz de acessar as publicações após deixar de seguir! Tem certeza?</string>
<string name="no_acc">Você pode fazer login em Mais -&gt; Conta no canto inferior direito ou você pode ver as contas públicas sem fazer login!</string>
<string name="no_acc_logged_in">Você pode deslizar para a esquerda/direita para explorar/feed ou pesquisar algo abaixo!</string>
<string name="empty_acc">Esta conta não tem postagens</string>
<string name="empty_list">Não há essas postagens!</string>
<string name="empty_acc">Esta conta não tem publicações</string>
<string name="empty_list">Não há publicações!</string>
<string name="curr_version">Versão atual: v%s</string>
<string name="read_more">ler mais…</string>
<string name="login">Logar</string>
@ -167,7 +165,7 @@
<string name="dms_inbox_unlike">Descurtir mensagem</string>
<string name="dms_inbox_unsend">Cancelar envio</string>
<string name="dms_inbox_author">Ver perfil do autor</string>
<string name="dms_inbox_media_shared_from">Postagem compartilhada de %s</string>
<string name="dms_inbox_media_shared_from">Publicação compartilhada de %s</string>
<string name="dms_inbox_raven_media_unknown"><i>Tipo de mídia desconhecido</i></string>
<string name="dms_inbox_raven_media_expired">Mídia expirada!</string>
<string name="dms_inbox_raven_media_delivered">Entregue</string>
@ -185,19 +183,19 @@
<string name="dms_action_kick">Expulsar</string>
<string name="dms_left_users">Usuários que saíram</string>
<string name="direct_download">Baixar diretamente</string>
<string name="direct_download_desc">Baixar as postagens diretamente no telefone!</string>
<string name="direct_download_loading">Buscando postagem(s)</string>
<string name="direct_download_desc">Baixar as publicações diretamente no telefone!</string>
<string name="direct_download_loading">Buscando publicação(ões)</string>
<string name="direct_download_perms_ask">Por favor, conceda as permissões e tente baixar novamente!</string>
<string name="downloader_started">Download iniciado</string>
<string name="downloader_complete">Download concluído</string>
<string name="downloader_downloading_post">Baixando postagem</string>
<string name="downloader_downloading_post">Baixando publicação</string>
<string name="downloader_downloading_media">Baixando mídia</string>
<string name="downloader_downloading_pfp">Baixando foto do perfil</string>
<string name="downloader_downloaded_in_folder">Arquivo baixado na pasta Downloads!</string>
<string name="downloader_unknown_error">Ocorreu um erro desconhecido!!!</string>
<string name="downloader_error_creating_folder">Erro ao criar pasta!</string>
<string name="downloader_error_download_file">Erro ao baixar o arquivo</string>
<string name="downloader_too_many">Você só pode baixar 100 postagens por vez. Não seja tão ganancioso!</string>
<string name="downloader_error_creating_folder">Falha ao criar pasta!</string>
<string name="downloader_error_download_file">Falha ao baixar arquivo</string>
<string name="downloader_too_many">Você só pode baixar 100 publicações por vez. Não seja tão ganancioso!</string>
<string name="comment_viewer_copy_user">Copiar nome de usuário</string>
<string name="comment_viewer_copy_comment">Copiar comentário</string>
<string name="comment_viewer_reply_comment">Responder comentário</string>
@ -214,19 +212,19 @@
<string name="followers_both_following">Ambos se seguem</string>
<string name="followers_not_following">não segue %s</string>
<string name="followers_not_follower">%s não segue</string>
<string name="login_error_loading_cookies">Erro ao carregar cookies</string>
<string name="login_success_loading_cookies">Cookies carregados com sucesso!\nSe você ainda não consegue abrir páginas/postagens privadas, faça o login novamente!</string>
<string name="login_error_loading_cookies">Falha ao carregar cookies</string>
<string name="login_success_loading_cookies">Cookies carregados com sucesso!\nSe você ainda não consegue abrir páginas/publicações privadas, faça o login novamente!</string>
<string name="comment_hint">Escrever um novo comentário...</string>
<string name="dm_hint">Escrever uma nova mensagem...</string>
<string name="liked_notif">Curtiu sua postagem</string>
<string name="comment_notif">Comentou em sua postagem:</string>
<string name="liked_notif">Curtiu sua publicação</string>
<string name="comment_notif">Comentou em sua publicação:</string>
<string name="follow_notif">Começou a seguir você</string>
<string name="mention_notif">Mencionou você:</string>
<string name="request_notif">Pediu para seguir você</string>
<string name="request_approve">Aprovar pedido</string>
<string name="request_reject">Rejeitar pedido</string>
<string name="share_public_post">Compartilhar esta postagem pública com...</string>
<string name="share_private_post">Esta é uma postagem privada! Compartilhe com quem pode visualizá-la!</string>
<string name="share_public_post">Compartilhar esta publicação pública com...</string>
<string name="share_private_post">Esta é uma publicação privada! Compartilhe com quem pode visualizá-la!</string>
<string name="discover_empty">Esta categoria está vazia...</string>
<string name="update_available">Uma atualização está disponível! (%s)</string>
<string name="update_notice">Lembrete: se você baixou do F-Droid, você deve atualizar a partir dele! O mesmo se aplica ao GitHub.</string>
@ -242,7 +240,7 @@
<string name="activity_count_comments">%d comentários</string>
<string name="activity_count_commentlikes">%d comentários curtidos</string>
<string name="activity_count_usertags">%d marcações</string>
<string name="activity_count_likes">%d likes</string>
<string name="activity_count_likes">%d curtidas</string>
<string name="activity_notloggedin">Você deslogou antes de clicar nessa notificação?!</string>
<string name="feed">Feed</string>
<string name="profile">Perfil</string>
@ -287,10 +285,10 @@
<string name="locations">Localizações</string>
<string name="unknown">Desconhecido</string>
<string name="removed_from_favs">Removido dos Favoritos</string>
<string name="backup_and_restore">Backup &amp; Restauração</string>
<string name="backup_and_restore">Becape &amp; Restauração</string>
<string name="create_backup">Criar</string>
<string name="restore_backup">Restaurar</string>
<string name="file_chosen_label">Arquivo:</string>
<string name="enter_password">Digite a senha</string>
<string name="select_backup_file">Selecione um arquivo de backup (.zaai/.backup)</string>
<string name="select_backup_file">Selecione um arquivo de becape (.zaai/.backup)</string>
</resources>

View File

@ -6,8 +6,6 @@
<string name="action_download">İndir</string>
<string name="action_search">Kullanıcı adı ara…</string>
<string name="action_compare">Karşılaştır</string>
<string name="single_like">beğeni</string>
<string name="multiple_likes">beğeni</string>
<string name="clipboard_error">Metin kopyalanamadı</string>
<string name="clipboard_copied">Panoya kopyalandı!</string>
<string name="report">Bildir</string>

View File

@ -6,8 +6,6 @@
<string name="action_download">Tải xuống</string>
<string name="action_search">Tìm tên người dùng…</string>
<string name="action_compare">So sánh</string>
<string name="single_like">thích</string>
<string name="multiple_likes">thích</string>
<string name="clipboard_error">Lỗi khi sao chép</string>
<string name="clipboard_copied">Đã sao chép vào clipboard!</string>
<string name="report">Báo cáo</string>

View File

@ -6,8 +6,6 @@
<string name="action_download">下载</string>
<string name="action_search">搜索用户名…</string>
<string name="action_compare">比较</string>
<string name="single_like">次赞</string>
<string name="multiple_likes">次赞</string>
<string name="clipboard_error">复制文字时出错</string>
<string name="clipboard_copied">已复制到剪贴板!</string>
<string name="report">报告</string>

View File

@ -306,11 +306,11 @@
<string name="player_timeline_desc">Video player timeline</string>
<string name="one_x" translatable="false">1x</string>
<string name="two_x" translatable="false">2x</string>
<string name="pt_two_five_x">0.25x</string>
<string name="pt_five_x">0.5x</string>
<string name="pt_seven_five_x">0.75x</string>
<string name="one_pt_two_five_x">1.25x</string>
<string name="one_pt_five_x">1.5x</string>
<string name="pt_two_five_x" translatable="false">0.25x</string>
<string name="pt_five_x" translatable="false">0.5x</string>
<string name="pt_seven_five_x" translatable="false">0.75x</string>
<string name="one_pt_two_five_x" translatable="false">1.25x</string>
<string name="one_pt_five_x" translatable="false">1.5x</string>
<string name="liking">Liking…</string>
<string name="like_unsuccessful">Like unsuccessful</string>
<string name="unlike_unsuccessful">Unlike unsuccessful</string>

View File

@ -1,6 +1,8 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=5252d2f1a984e5518e604678b3964bb0227c4573fcc880b92548bc687c851704
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-rc-5-all.zip
distributionSha256Sum=0080de8491f0918e4f529a6db6820fa0b9e818ee2386117f4394f95feb1d5583
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
# https://gradle.org/releases/
# https://gradle.org/release-checksums/
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists