mirror of
				https://github.com/KokaKiwi/BarInsta
				synced 2025-10-30 19:15:35 +00:00 
			
		
		
		
	v16.9 part 1
This commit is contained in:
		
							parent
							
								
									604b147b4d
								
							
						
					
					
						commit
						7af96bf591
					
				| @ -9,11 +9,11 @@ android { | ||||
|         minSdkVersion 16 | ||||
|         targetSdkVersion 29 | ||||
| 
 | ||||
|         // REMEMBER TO CHANGE versionCode as well | ||||
|         // REMEMBER TO CHANGE versionCode AS WELL | ||||
|         // 16.7 is 32 | ||||
| 
 | ||||
|         versionCode 33 | ||||
|         versionName '16.8' | ||||
|         versionCode 34 | ||||
|         versionName '16.9' | ||||
| 
 | ||||
|         multiDexEnabled true | ||||
| 
 | ||||
|  | ||||
| @ -8,15 +8,25 @@ import android.os.Bundle; | ||||
| import android.text.SpannableString; | ||||
| import android.text.Spanned; | ||||
| import android.text.style.RelativeSizeSpan; | ||||
| import android.util.Log; | ||||
| import android.view.inputmethod.InputMethodManager; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import android.view.View; | ||||
| import android.view.WindowManager; | ||||
| import android.widget.ArrayAdapter; | ||||
| import android.widget.Toast; | ||||
| 
 | ||||
| import androidx.annotation.Nullable; | ||||
| import androidx.appcompat.app.AlertDialog; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.appcompat.widget.SearchView; | ||||
| import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; | ||||
| 
 | ||||
| import java.io.DataOutputStream; | ||||
| import java.net.HttpURLConnection; | ||||
| import java.net.URL; | ||||
| import java.net.URLEncoder; | ||||
| 
 | ||||
| import awais.instagrabber.R; | ||||
| import awais.instagrabber.adapters.CommentsAdapter; | ||||
| @ -29,79 +39,71 @@ import awais.instagrabber.models.ProfileModel; | ||||
| import awais.instagrabber.utils.Constants; | ||||
| import awais.instagrabber.utils.Utils; | ||||
| 
 | ||||
| public final class CommentsViewer extends AppCompatActivity { | ||||
| import static awais.instagrabber.utils.Utils.settingsHelper; | ||||
| 
 | ||||
| public final class CommentsViewer extends BaseLanguageActivity implements SwipeRefreshLayout.OnRefreshListener { | ||||
|     private CommentsAdapter commentsAdapter; | ||||
|     private CommentModel commentModel; | ||||
|     private ActivityCommentsBinding commentsBinding; | ||||
|     private ArrayAdapter<String> commmentDialogAdapter; | ||||
|     private String shortCode, postId, userId; | ||||
|     private final String cookie = Utils.settingsHelper.getString(Constants.COOKIE); | ||||
|     private Resources resources; | ||||
| 
 | ||||
|     @Override | ||||
|     protected void onCreate(@Nullable final Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         final ActivityCommentsBinding commentsBinding = ActivityCommentsBinding.inflate(getLayoutInflater()); | ||||
|         commentsBinding = ActivityCommentsBinding.inflate(getLayoutInflater()); | ||||
|         setContentView(commentsBinding.getRoot()); | ||||
|         commentsBinding.swipeRefreshLayout.setOnRefreshListener(this); | ||||
| 
 | ||||
|         final String shortCode; | ||||
|         final Intent intent = getIntent(); | ||||
|         if (intent == null || !intent.hasExtra(Constants.EXTRAS_SHORTCODE) | ||||
|                 || Utils.isEmpty((shortCode = intent.getStringExtra(Constants.EXTRAS_SHORTCODE)))) { | ||||
|                 || Utils.isEmpty((shortCode = intent.getStringExtra(Constants.EXTRAS_SHORTCODE))) | ||||
|                 || !intent.hasExtra(Constants.EXTRAS_POST) | ||||
|                 || Utils.isEmpty((postId = intent.getStringExtra(Constants.EXTRAS_POST))) | ||||
|                 || !intent.hasExtra(Constants.EXTRAS_USER) | ||||
|                 || Utils.isEmpty((userId = intent.getStringExtra(Constants.EXTRAS_USER)))) { | ||||
|             Utils.errorFinish(this); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         commentsBinding.swipeRefreshLayout.setRefreshing(true); | ||||
|         setSupportActionBar(commentsBinding.toolbar.toolbar); | ||||
|         commentsBinding.toolbar.toolbar.setTitle(R.string.title_comments); | ||||
|         commentsBinding.toolbar.toolbar.setSubtitle(shortCode); | ||||
| 
 | ||||
|         final Resources resources = getResources(); | ||||
|         resources = getResources(); | ||||
| 
 | ||||
|         final ArrayAdapter<String> commmentDialogAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, | ||||
|                 new String[]{resources.getString(R.string.open_profile), | ||||
|                         resources.getString(R.string.view_pfp), | ||||
|                         resources.getString(R.string.comment_viewer_copy_user), | ||||
|                         resources.getString(R.string.comment_viewer_copy_comment)}); | ||||
|         final DialogInterface.OnClickListener profileDialogListener = (dialog, which) -> { | ||||
|             final ProfileModel profileModel = commentModel.getProfileModel(); | ||||
|         if (!Utils.isEmpty(cookie)) { | ||||
|             commentsBinding.commentText.setVisibility(View.VISIBLE); | ||||
|             commentsBinding.commentSend.setVisibility(View.VISIBLE); | ||||
| 
 | ||||
|             if (which == 0) { | ||||
|                 searchUsername(profileModel.getUsername()); | ||||
|             } else if (which == 1) { | ||||
|                 startActivity(new Intent(this, ProfileViewer.class).putExtra(Constants.EXTRAS_PROFILE, profileModel)); | ||||
|             } else if (which == 2) { | ||||
|                 Utils.copyText(this, profileModel.getUsername()); | ||||
|             } else if (which == 3) { | ||||
|                 Utils.copyText(this, commentModel.getText().toString()); | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|         final View.OnClickListener clickListener = v -> { | ||||
|             final Object tag = v.getTag(); | ||||
|             if (tag instanceof CommentModel) { | ||||
|                 commentModel = (CommentModel) tag; | ||||
| 
 | ||||
|                 final String username = commentModel.getProfileModel().getUsername(); | ||||
|                 final SpannableString title = new SpannableString(username + ":\n" + commentModel.getText()); | ||||
|                 title.setSpan(new RelativeSizeSpan(1.23f), 0, username.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); | ||||
| 
 | ||||
|                 new AlertDialog.Builder(this).setTitle(title) | ||||
|                         .setAdapter(commmentDialogAdapter, profileDialogListener) | ||||
|                         .setNeutralButton(R.string.cancel, null) | ||||
|                         .show(); | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|         final MentionClickListener mentionClickListener = (view, text, isHashtag) -> | ||||
|                 new AlertDialog.Builder(this).setTitle(text) | ||||
|                         .setMessage(isHashtag ? R.string.comment_view_mention_hash_search : R.string.comment_view_mention_user_search) | ||||
|                         .setNegativeButton(R.string.cancel, null).setPositiveButton(R.string.ok, | ||||
|                         (dialog, which) -> searchUsername(text)).show(); | ||||
|             commentsBinding.commentSend.setOnClickListener(newCommentListener); | ||||
|             commentsBinding.commentCancelParent.setOnClickListener(newCommentListener); | ||||
|         } | ||||
| 
 | ||||
|         new CommentsFetcher(shortCode, new FetchListener<CommentModel[]>() { | ||||
|             @Override | ||||
|             public void doBefore() { | ||||
|                 commentsBinding.toolbar.progressCircular.setVisibility(View.VISIBLE); | ||||
|             } | ||||
|             public void onResult(final CommentModel[] commentModels) { | ||||
|                 commentsBinding.toolbar.progressCircular.setVisibility(View.GONE); | ||||
| 
 | ||||
|                 commentsAdapter = new CommentsAdapter(commentModels, true, clickListener, mentionClickListener); | ||||
| 
 | ||||
|                 commentsBinding.rvComments.setAdapter(commentsAdapter); | ||||
|                 commentsBinding.swipeRefreshLayout.setRefreshing(false); | ||||
|             } | ||||
|         }).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void onRefresh() { | ||||
|         commentsBinding.swipeRefreshLayout.setRefreshing(true); | ||||
|         new CommentsFetcher(shortCode, new FetchListener<CommentModel[]>() { | ||||
|             @Override | ||||
|             public void onResult(final CommentModel[] commentModels) { | ||||
|                 commentsBinding.swipeRefreshLayout.setRefreshing(false); | ||||
| 
 | ||||
|                 commentsBinding.toolbar.progressCircular.setVisibility(View.GONE); | ||||
| 
 | ||||
|                 commentsAdapter = new CommentsAdapter(commentModels, true, clickListener, mentionClickListener); | ||||
| @ -111,6 +113,103 @@ public final class CommentsViewer extends AppCompatActivity { | ||||
|         }).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | ||||
|     } | ||||
| 
 | ||||
|     final DialogInterface.OnClickListener profileDialogListener = (dialog, which) -> { | ||||
|         final ProfileModel profileModel = commentModel.getProfileModel(); | ||||
| 
 | ||||
|         if (which == 0) { | ||||
|             searchUsername(profileModel.getUsername()); | ||||
|         } else if (which == 1) { | ||||
|             startActivity(new Intent(this, ProfileViewer.class).putExtra(Constants.EXTRAS_PROFILE, profileModel)); | ||||
|         } else if (which == 2) { | ||||
|             Utils.copyText(this, profileModel.getUsername()); | ||||
|         } else if (which == 3) { | ||||
|             Utils.copyText(this, commentModel.getText().toString()); | ||||
|         } else if (which == 4) { | ||||
|             commentsBinding.rvComments.findViewWithTag(commentModel).setBackgroundColor(0x80888888); | ||||
|             commentsBinding.commentCancelParent.setVisibility(View.VISIBLE); | ||||
|             String mention = "@"+profileModel.getUsername()+" "; | ||||
|             commentsBinding.commentText.setText(mention); | ||||
|             commentsBinding.commentText.requestFocus(); | ||||
|             commentsBinding.commentText.setSelection(mention.length()); | ||||
|             commentsBinding.commentText.postDelayed(new Runnable(){ | ||||
|                @Override | ||||
|                public void run(){ | ||||
|                    final InputMethodManager imm = (InputMethodManager) getSystemService(getApplicationContext().INPUT_METHOD_SERVICE); | ||||
|                    imm.showSoftInput(commentsBinding.commentText, 0); | ||||
|                } | ||||
|             } | ||||
|             ,200); | ||||
|         } else if (which == 5) { | ||||
|             new CommentAction().execute((commentModel.getLiked() ? "unlike/" : "like/")+commentModel.getId()); | ||||
|         } else if (which == 6) { | ||||
|             new CommentAction().execute("delete/"+commentModel.getId()); | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     private final View.OnClickListener clickListener = v -> { | ||||
|         final Object tag = v.getTag(); | ||||
|         if (tag instanceof CommentModel) { | ||||
|             commentModel = (CommentModel) tag; | ||||
| 
 | ||||
|             final String username = commentModel.getProfileModel().getUsername(); | ||||
|             final SpannableString title = new SpannableString(username + ":\n" + commentModel.getText()); | ||||
|             title.setSpan(new RelativeSizeSpan(1.23f), 0, username.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); | ||||
| 
 | ||||
|             String[] commentDialogList; | ||||
| 
 | ||||
|             if (!Utils.isEmpty(cookie) && | ||||
|                     (Utils.getUserIdFromCookie(cookie).equals(commentModel.getProfileModel().getId()) || | ||||
|                             Utils.getUserIdFromCookie(cookie).equals(userId))) commentDialogList = new String[]{ | ||||
|                     resources.getString(R.string.open_profile), | ||||
|                     resources.getString(R.string.view_pfp), | ||||
|                     resources.getString(R.string.comment_viewer_copy_user), | ||||
|                     resources.getString(R.string.comment_viewer_copy_comment), | ||||
|                     resources.getString(R.string.comment_viewer_reply_comment), | ||||
|                     commentModel.getLiked() ? resources.getString(R.string.comment_viewer_unlike_comment) : resources.getString(R.string.comment_viewer_like_comment), | ||||
|                     resources.getString(R.string.comment_viewer_delete_comment) | ||||
|             }; | ||||
|             else if (!Utils.isEmpty(cookie)) commentDialogList = new String[]{ | ||||
|                     resources.getString(R.string.open_profile), | ||||
|                     resources.getString(R.string.view_pfp), | ||||
|                     resources.getString(R.string.comment_viewer_copy_user), | ||||
|                     resources.getString(R.string.comment_viewer_copy_comment), | ||||
|                     resources.getString(R.string.comment_viewer_reply_comment), | ||||
|                     commentModel.getLiked() ? resources.getString(R.string.comment_viewer_unlike_comment) : resources.getString(R.string.comment_viewer_like_comment), | ||||
|             }; | ||||
|             else commentDialogList = new String[]{ | ||||
|                     resources.getString(R.string.open_profile), | ||||
|                     resources.getString(R.string.view_pfp), | ||||
|                     resources.getString(R.string.comment_viewer_copy_user), | ||||
|                     resources.getString(R.string.comment_viewer_copy_comment) | ||||
|             }; | ||||
| 
 | ||||
|             commmentDialogAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, commentDialogList); | ||||
| 
 | ||||
|             new AlertDialog.Builder(this).setTitle(title) | ||||
|                     .setAdapter(commmentDialogAdapter, profileDialogListener) | ||||
|                     .setNeutralButton(R.string.cancel, null) | ||||
|                     .show(); | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     private final MentionClickListener mentionClickListener = (view, text, isHashtag) -> | ||||
|             new AlertDialog.Builder(this).setTitle(text) | ||||
|                     .setMessage(isHashtag ? R.string.comment_view_mention_hash_search : R.string.comment_view_mention_user_search) | ||||
|                     .setNegativeButton(R.string.cancel, null).setPositiveButton(R.string.ok, | ||||
|                     (dialog, which) -> searchUsername(text)).show(); | ||||
| 
 | ||||
|     private final View.OnClickListener newCommentListener = v -> { | ||||
|         if (Utils.isEmpty(commentsBinding.commentText.getText().toString()) && v == commentsBinding.commentSend) | ||||
|             Toast.makeText(getApplicationContext(), R.string.comment_send_empty_comment, Toast.LENGTH_SHORT).show(); | ||||
|         else if (v == commentsBinding.commentSend) new CommentAction().execute("add"); | ||||
|         else if (v == commentsBinding.commentCancelParent) { | ||||
|             commentsBinding.rvComments.findViewWithTag(commentModel).setBackgroundColor(commentModel.getLiked() ? 0x40FF69B4 : 0x00000000); | ||||
|             commentsBinding.commentCancelParent.setVisibility(View.GONE); | ||||
|             commentsBinding.commentText.setText(""); | ||||
|             commentModel = null; | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     private void searchUsername(final String text) { | ||||
|         if (Main.scanHack != null) { | ||||
|             Main.scanHack.onResult(text); | ||||
| @ -143,4 +242,57 @@ public final class CommentsViewer extends AppCompatActivity { | ||||
| 
 | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     class CommentAction extends AsyncTask<String, Void, Void> { | ||||
|         boolean ok = false; | ||||
| 
 | ||||
|         protected Void doInBackground(String... rawAction) { | ||||
|             final String action = rawAction[0]; | ||||
|             final String url = "https://www.instagram.com/web/comments/"+postId+"/"+action+"/"; | ||||
|             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", cookie.split("csrftoken=")[1].split(";")[0]); | ||||
|                 if (action == "add") { | ||||
|                     // https://stackoverflow.com/questions/14321873/java-url-encoding-urlencoder-vs-uri | ||||
|                     final String commentText = URLEncoder.encode(commentsBinding.commentText.getText().toString(), "UTF-8") | ||||
|                             .replaceAll("\\+", "%20").replaceAll("\\%21", "!").replaceAll("\\%27", "'") | ||||
|                             .replaceAll("\\%28", "(").replaceAll("\\%29", ")").replaceAll("\\%7E", "~"); | ||||
|                     final String urlParameters = "comment_text="+commentText+"&replied_to_comment_id="+ | ||||
|                             (commentModel == null ? "" : commentModel.getId()); | ||||
|                     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(); | ||||
|                 } | ||||
|                 urlConnection.connect(); | ||||
|                 if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { | ||||
|                     ok = true; | ||||
|                     if (action == "add") commentsBinding.commentText.setText(""); | ||||
|                 } | ||||
|                 else Toast.makeText(getApplicationContext(), R.string.downloader_unknown_error, Toast.LENGTH_SHORT).show(); | ||||
|                 urlConnection.disconnect(); | ||||
|             } catch (Throwable ex) { | ||||
|                 Log.e("austin_debug", action+": " + ex); | ||||
|             } | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         protected void onPostExecute(Void result) { | ||||
|             if (ok == true) { | ||||
|                 if (commentModel != null) { | ||||
|                     commentsBinding.rvComments.findViewWithTag(commentModel).setBackgroundColor(commentModel.getLiked() ? 0x40FF69B4 : 0x00000000); | ||||
|                     commentsBinding.commentCancelParent.setVisibility(View.GONE); | ||||
|                 } | ||||
|                 onRefresh(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -316,7 +316,8 @@ public final class Main extends BaseLanguageActivity { | ||||
|         searchView.setQueryHint(getResources().getString(R.string.action_search)); | ||||
|         searchView.setSuggestionsAdapter(suggestionAdapter); | ||||
|         searchView.setOnSearchClickListener(v -> { | ||||
|             searchView.setQuery(userQuery, false); | ||||
|             searchView.setQuery((profileModel != null && profileModel.getId().equals( | ||||
|                     Utils.getUserIdFromCookie(Utils.settingsHelper.getString(Constants.COOKIE))) ? "" : 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); | ||||
|  | ||||
| @ -81,7 +81,7 @@ public final class PostViewer extends BaseLanguageActivity { | ||||
|     private View viewsContainer, viewerCaptionParent; | ||||
|     private GestureDetectorCompat gestureDetector; | ||||
|     private SwipeEvent swipeEvent; | ||||
|     private CharSequence postCaption = null, postShortCode; | ||||
|     private CharSequence postCaption = null, postShortCode, postUserId; | ||||
|     private Resources resources; | ||||
|     private boolean session = false, isFromShare; | ||||
|     private int slidePos = 0, lastSlidePos = 0; | ||||
| @ -153,7 +153,7 @@ public final class PostViewer extends BaseLanguageActivity { | ||||
|                 if (player != null) { | ||||
|                     final float intVol = player.getVolume() == 0f ? 1f : 0f; | ||||
|                     player.setVolume(intVol); | ||||
|                     viewerBinding.bottomPanel.btnMute.setImageResource(intVol == 0f ? R.drawable.vol : R.drawable.mute); | ||||
|                     viewerBinding.bottomPanel.btnMute.setImageResource(intVol == 0f ? R.drawable.mute : R.drawable.vol); | ||||
|                     Utils.sessionVolumeFull = intVol == 1f; | ||||
|                 } | ||||
|             } else if (v == viewerBinding.btnLike) { | ||||
| @ -359,7 +359,9 @@ public final class PostViewer extends BaseLanguageActivity { | ||||
|                 viewerBinding.bottomPanel.btnComments.setOnClickListener(v -> | ||||
|                         startActivityForResult(new Intent(this, CommentsViewer.class) | ||||
|                                 .putExtra(Constants.EXTRAS_END_CURSOR, commentsEndCursor) | ||||
|                                 .putExtra(Constants.EXTRAS_SHORTCODE, postShortCode), 6969)); | ||||
|                                 .putExtra(Constants.EXTRAS_SHORTCODE, postShortCode) | ||||
|                                 .putExtra(Constants.EXTRAS_POST, viewerPostModel.getPostId()) | ||||
|                                 .putExtra(Constants.EXTRAS_USER, postUserId), 6969)); | ||||
|                 viewerBinding.bottomPanel.btnComments.setClickable(true); | ||||
|                 viewerBinding.bottomPanel.btnComments.setEnabled(true); | ||||
|             } else { | ||||
| @ -592,12 +594,12 @@ public final class PostViewer extends BaseLanguageActivity { | ||||
|             postModel.setLike(viewerPostModel.getLike()); | ||||
|             postModel.setBookmark(viewerPostModel.getBookmark()); | ||||
|             if (viewerPostModel.getLike() == true) { | ||||
|                 viewerBinding.btnLike.setText(R.string.unlike); | ||||
|                 viewerBinding.btnLike.setText(resources.getString(R.string.unlike, postModel.getLikes())); | ||||
|                 viewerBinding.btnLike.setBackgroundTintList(ColorStateList.valueOf(resources.getColor( | ||||
|                         R.color.btn_pink_background, null))); | ||||
|             } | ||||
|             else { | ||||
|                 viewerBinding.btnLike.setText(R.string.like); | ||||
|                 viewerBinding.btnLike.setText(resources.getString(R.string.like, postModel.getLikes())); | ||||
|                 viewerBinding.btnLike.setBackgroundTintList(ColorStateList.valueOf(resources.getColor( | ||||
|                         R.color.btn_lightpink_background, null))); | ||||
|             } | ||||
| @ -620,7 +622,7 @@ public final class PostViewer extends BaseLanguageActivity { | ||||
|         url = viewerPostModel.getDisplayUrl(); | ||||
|         releasePlayer(); | ||||
| 
 | ||||
|         viewerBinding.btnDownload.setVisibility(containerLayoutParams.weight == 3.3f ? View.GONE : View.VISIBLE); | ||||
|         viewerBinding.btnDownload.setVisibility(containerLayoutParams.weight == 3.3f ? View.VISIBLE : View.GONE); | ||||
|         if (viewerPostModel.getItemType() == MediaItemType.MEDIA_TYPE_VIDEO) setupVideo(); | ||||
|         else setupImage(); | ||||
|     } | ||||
| @ -645,6 +647,7 @@ public final class PostViewer extends BaseLanguageActivity { | ||||
|                     if (result != null) { | ||||
|                         final String hdProfilePic = result.getHdProfilePic(); | ||||
|                         final String sdProfilePic = result.getSdProfilePic(); | ||||
|                         postUserId = result.getId(); | ||||
| 
 | ||||
|                         final boolean hdPicEmpty = Utils.isEmpty(hdProfilePic); | ||||
|                         glideRequestManager.load(hdPicEmpty ? sdProfilePic : hdProfilePic).listener(new RequestListener<Drawable>() { | ||||
| @ -732,13 +735,13 @@ public final class PostViewer extends BaseLanguageActivity { | ||||
|         @Override | ||||
|         protected void onPostExecute(Void result) { | ||||
|             if (ok == true && action == "likes") { | ||||
|                 viewerPostModel.setLike(postModel.getLike() == true ? false : true); | ||||
|                 postModel.setLike(postModel.getLike() == true ? false : true); | ||||
|                 viewerPostModel.setLike(!postModel.getLike()); | ||||
|                 postModel.setManualLike(!postModel.getLike()); | ||||
|                 refreshPost(); | ||||
|             } | ||||
|             else if (ok == true && action == "save") { | ||||
|                 viewerPostModel.setBookmark(postModel.getBookmark() == true ? false : true); | ||||
|                 postModel.setBookmark(postModel.getBookmark() == true ? false : true); | ||||
|                 viewerPostModel.setBookmark(!postModel.getBookmark()); | ||||
|                 postModel.setBookmark(!postModel.getBookmark()); | ||||
|                 refreshPost(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -121,8 +121,10 @@ public final class StoryViewer extends BaseLanguageActivity { | ||||
| 
 | ||||
|             @Override | ||||
|             public void onSwipe(final boolean isRightSwipe) { | ||||
|                 Log.d("austin_debug", "swipe: "+(isRightSwipe ? "backward " : "forward ") + slidePos + "/" + storiesLen + " " | ||||
|                         + (slidePos == storiesLen - 1 && isRightSwipe == false) + " " + intent.hasExtra(Constants.FEED)); | ||||
|                 if (storyModels != null && storiesLen > 0) { | ||||
|                     if (((slidePos == storiesLen - 1 && isRightSwipe == false) || (slidePos == 0 && isRightSwipe == true)) | ||||
|                     if (((slidePos + 1 >= storiesLen && isRightSwipe == false) || (slidePos == 0 && isRightSwipe == true)) | ||||
|                             && intent.hasExtra(Constants.FEED)) { | ||||
|                         final FeedStoryModel[] storyFeed = (FeedStoryModel[]) intent.getSerializableExtra(Constants.FEED); | ||||
|                         final int index = intent.getIntExtra(Constants.FEED_ORDER, 1738); | ||||
| @ -148,9 +150,8 @@ public final class StoryViewer extends BaseLanguageActivity { | ||||
|                         if (isRightSwipe) { | ||||
|                             if (--slidePos <= 0) slidePos = 0; | ||||
|                         } else if (++slidePos >= storiesLen) slidePos = storiesLen - 1; | ||||
| 
 | ||||
|                         currentStory = storyModels[slidePos]; | ||||
|                         slidePos = currentStory.getPosition(); | ||||
|                         //slidePos = currentStory.getPosition(); | ||||
|                         refreshStory(); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
| @ -107,6 +107,7 @@ public final class CommentsAdapter extends RecyclerView.Adapter<CommentViewHolde | ||||
| 
 | ||||
|             holder.setCommment(commentModel.getText()); | ||||
|             holder.setDate(commentModel.getDateTime()); | ||||
|             holder.setLiked(commentModel.getLiked()); | ||||
| 
 | ||||
|             final long likes = commentModel.getLikes(); | ||||
|             holder.setLikes(String.format(LocaleUtils.getCurrentLocale(), "%d %s", likes, quantityStrings[likes == 1 ? 0 : 1])); | ||||
|  | ||||
| @ -82,7 +82,9 @@ public final class FeedAdapter extends RecyclerView.Adapter<FeedItemViewHolder> | ||||
|                     switch (id) { | ||||
|                         case R.id.btnComments: | ||||
|                             activity.startActivityForResult(new Intent(activity, CommentsViewer.class) | ||||
|                                     .putExtra(Constants.EXTRAS_SHORTCODE, feedModel.getShortCode()), 6969); | ||||
|                                     .putExtra(Constants.EXTRAS_SHORTCODE, feedModel.getShortCode()) | ||||
|                                     .putExtra(Constants.EXTRAS_POST, feedModel.getPostId()) | ||||
|                                     .putExtra(Constants.EXTRAS_USER, feedModel.getProfileModel().getId()), 6969); | ||||
|                             break; | ||||
| 
 | ||||
|                         case R.id.viewStoryPost: | ||||
| @ -305,7 +307,7 @@ public final class FeedAdapter extends RecyclerView.Adapter<FeedItemViewHolder> | ||||
|                                 final SimpleExoPlayer exoPlayer = (SimpleExoPlayer) player; | ||||
|                                 final float intVol = exoPlayer.getVolume() == 0f ? 1f : 0f; | ||||
|                                 exoPlayer.setVolume(intVol); | ||||
|                                 viewHolder.btnMute.setImageResource(intVol == 0f ? R.drawable.vol : R.drawable.mute); | ||||
|                                 viewHolder.btnMute.setImageResource(intVol == 0f ? R.drawable.mute : R.drawable.vol); | ||||
|                                 Utils.sessionVolumeFull = intVol == 1f; | ||||
|                             } | ||||
|                         }; | ||||
|  | ||||
| @ -65,6 +65,10 @@ public final class CommentViewHolder extends RecyclerView.ViewHolder { | ||||
|         if (tvLikes != null) tvLikes.setText(likes); | ||||
|     } | ||||
| 
 | ||||
|     public final void setLiked(final boolean liked) { | ||||
|         if (liked) container.setBackgroundColor(0x40FF69B4); | ||||
|     } | ||||
| 
 | ||||
|     public final void setCommment(final CharSequence commment) { | ||||
|         if (tvComment != null) { | ||||
|             tvComment.setText(commment, commment instanceof Spannable ? TextView.BufferType.SPANNABLE : TextView.BufferType.NORMAL); | ||||
|  | ||||
| @ -123,6 +123,7 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]> | ||||
|                                         childComment.getString("text"), | ||||
|                                         childComment.getLong("created_at"), | ||||
|                                         likedBy != null ? likedBy.optLong("count", 0) : 0, | ||||
|                                         childComment.getBoolean("viewer_has_liked"), | ||||
|                                         profileModel)); | ||||
|                             } | ||||
|                         } | ||||
| @ -201,6 +202,7 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]> | ||||
|                                 comment.getString("text"), | ||||
|                                 comment.getLong("created_at"), | ||||
|                                 likedBy != null ? likedBy.optLong("count", 0) : 0, | ||||
|                                 comment.getBoolean("viewer_has_liked"), | ||||
|                                 profileModel); | ||||
| 
 | ||||
|                         JSONObject tempJsonObject; | ||||
| @ -238,6 +240,7 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]> | ||||
|                                         childComment.getString("text"), | ||||
|                                         childComment.getLong("created_at"), | ||||
|                                         tempJsonObject != null ? tempJsonObject.optLong("count", 0) : 0, | ||||
|                                         childComment.getBoolean("viewer_has_liked"), | ||||
|                                         childProfileModel); | ||||
|                             } | ||||
| 
 | ||||
|  | ||||
| @ -131,7 +131,8 @@ public final class FeedFetcher extends AsyncTask<Void, Void, FeedModel[]> { | ||||
|                             commentsCount, | ||||
|                             feedItem.optLong("taken_at_timestamp", -1), | ||||
|                             feedItem.getBoolean("viewer_has_liked"), | ||||
|                             feedItem.getBoolean("viewer_has_saved")); | ||||
|                             feedItem.getBoolean("viewer_has_saved"), | ||||
|                             feedItem.getJSONObject("edge_media_preview_like").getLong("count")); | ||||
| 
 | ||||
|                     final boolean isSlider = "GraphSidecar".equals(mediaType) && feedItem.has("edge_sidecar_to_children"); | ||||
| 
 | ||||
|  | ||||
| @ -81,6 +81,7 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]> | ||||
|                     endCursor = commentObject.optString("end_cursor"); | ||||
| 
 | ||||
|                 if (mediaItemType != MediaItemType.MEDIA_TYPE_SLIDER) { | ||||
|                     Log.d("austin_debug", "m: "+media); | ||||
|                     final ViewerPostModel postModel = new ViewerPostModel(mediaItemType, | ||||
|                             media.getString(Constants.EXTRAS_ID), | ||||
|                             isVideo ? media.getString("video_url") : Utils.getHighQualityImage(media), | ||||
|  | ||||
| @ -107,7 +107,7 @@ public final class PostsFetcher extends AsyncTask<Void, Void, PostModel[]> { | ||||
|                             mediaNode.getString(Constants.EXTRAS_SHORTCODE), | ||||
|                             captions.length() > 0 ? captions.getJSONObject(0).getJSONObject("node").getString("text") : null, | ||||
|                             mediaNode.getLong("taken_at_timestamp"), mediaNode.optBoolean("viewer_has_liked"), | ||||
|                             mediaNode.optBoolean("viewer_has_saved")); | ||||
|                             mediaNode.optBoolean("viewer_has_saved"), mediaNode.getJSONObject("edge_liked_by").getLong("count")); | ||||
| 
 | ||||
|                     Utils.checkExistence(downloadDir, customDir, username, isSlider, -1, models[i]); | ||||
|                 } | ||||
|  | ||||
| @ -48,7 +48,9 @@ public class VideoAwareRecyclerScroller extends RecyclerView.OnScrollListener { | ||||
|             if (tag instanceof FeedModel && context instanceof Activity) { | ||||
|                 if (player != null) player.setPlayWhenReady(false); | ||||
|                 ((Activity) context).startActivityForResult(new Intent(context, CommentsViewer.class) | ||||
|                         .putExtra(Constants.EXTRAS_SHORTCODE, ((FeedModel) tag).getShortCode()), 6969); | ||||
|                         .putExtra(Constants.EXTRAS_SHORTCODE, ((FeedModel) tag).getShortCode()) | ||||
|                         .putExtra(Constants.EXTRAS_POST, ((FeedModel) tag).getPostId()) | ||||
|                         .putExtra(Constants.EXTRAS_POST, ((FeedModel) tag).getProfileModel().getId()), 6969); | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| @ -56,7 +58,7 @@ public class VideoAwareRecyclerScroller extends RecyclerView.OnScrollListener { | ||||
|         if (player == null) return; | ||||
|         final float intVol = player.getVolume() == 0f ? 1f : 0f; | ||||
|         player.setVolume(intVol); | ||||
|         if (btnMute != null) btnMute.setImageResource(intVol == 0f ? R.drawable.vol : R.drawable.mute); | ||||
|         if (btnMute != null) btnMute.setImageResource(intVol == 0f ? R.drawable.mute : R.drawable.vol); | ||||
|         Utils.sessionVolumeFull = intVol == 1f; | ||||
|     }; | ||||
|     private final VideoChangeCallback videoChangeCallback; | ||||
|  | ||||
| @ -36,6 +36,7 @@ public final class QuickAccessDialog extends BottomSheetDialogFragment implement | ||||
|     private String userQuery; | ||||
|     private View btnFavorite, btnImportExport; | ||||
|     private SimpleAdapter<DataBox.FavoriteModel> favoritesAdapter; | ||||
|     private RecyclerView rvFavorites, rvQuickAccess; | ||||
| 
 | ||||
|     public QuickAccessDialog setQuery(final String userQuery) { | ||||
|         this.userQuery = userQuery; | ||||
| @ -66,8 +67,8 @@ public final class QuickAccessDialog extends BottomSheetDialogFragment implement | ||||
|         btnFavorite.setOnClickListener(this); | ||||
|         btnImportExport.setOnClickListener(this); | ||||
| 
 | ||||
|         final RecyclerView rvFavorites = contentView.findViewById(R.id.rvFavorites); | ||||
|         final RecyclerView rvQuickAccess = contentView.findViewById(R.id.rvQuickAccess); | ||||
|         rvFavorites = contentView.findViewById(R.id.rvFavorites); | ||||
|         rvQuickAccess = contentView.findViewById(R.id.rvQuickAccess); | ||||
| 
 | ||||
|         final DividerItemDecoration itemDecoration = new DividerItemDecoration(activity, DividerItemDecoration.VERTICAL); | ||||
|         rvFavorites.addItemDecoration(itemDecoration); | ||||
| @ -133,9 +134,12 @@ public final class QuickAccessDialog extends BottomSheetDialogFragment implement | ||||
|         if (tag instanceof DataBox.FavoriteModel) { | ||||
|             final DataBox.FavoriteModel favoriteModel = (DataBox.FavoriteModel) tag; | ||||
| 
 | ||||
|             new AlertDialog.Builder(activity).setPositiveButton(R.string.yes, (d, which) -> Utils.dataBox.delFavorite(favoriteModel)) | ||||
|                     .setNegativeButton(R.string.no, null).setMessage(getString(R.string.quick_access_confirm_delete, | ||||
|                     favoriteModel.getQuery())).show(); | ||||
|             new AlertDialog.Builder(activity).setPositiveButton(R.string.yes, (d, which) -> { | ||||
|                 Utils.dataBox.delFavorite(favoriteModel); | ||||
|                 rvFavorites.findViewWithTag(favoriteModel).setVisibility(View.GONE); | ||||
|             }) | ||||
|             .setNegativeButton(R.string.no, null).setMessage(getString(R.string.quick_access_confirm_delete, | ||||
|             favoriteModel.getQuery())).show(); | ||||
| 
 | ||||
|         } else if (tag instanceof DataBox.CookieModel) { | ||||
|             final DataBox.CookieModel cookieModel = (DataBox.CookieModel) tag; | ||||
|  | ||||
| @ -60,7 +60,7 @@ public final class MultiDirectDialog extends BaseLanguageActivity { | ||||
|         for (final ViewerPostModel postModel : postModels) | ||||
|             models.add(new PostModel(postModel.getItemType(), postModel.getPostId(), postModel.getDisplayUrl(), | ||||
|                     postModel.getSliderDisplayUrl(), postModel.getShortCode(), postModel.getPostCaption(), postModel.getTimestamp(), | ||||
|                     postModel.getLike(), postModel.getBookmark())); | ||||
|                     postModel.getLike(), postModel.getBookmark(), postModel.getLikes())); | ||||
| 
 | ||||
|         postsAdapter = new PostsAdapter(models, v -> { | ||||
|             final Object tag = v.getTag(); | ||||
|  | ||||
| @ -19,10 +19,14 @@ public abstract class BasePostModel implements Serializable { | ||||
|     protected long timestamp; | ||||
|     protected int position; | ||||
|     boolean liked, bookmarked; | ||||
|     long likes; | ||||
| 
 | ||||
|     public boolean getLike() { | ||||
|         return liked; | ||||
|     } | ||||
|     public long getLikes() { | ||||
|         return likes; | ||||
|     } | ||||
|     public boolean getBookmark() { | ||||
|         return bookmarked; | ||||
|     } | ||||
| @ -30,6 +34,14 @@ public abstract class BasePostModel implements Serializable { | ||||
|     public boolean setLike(final boolean like) { | ||||
|         liked = like; return liked; | ||||
|     } | ||||
| 
 | ||||
|     // setManualLike means user liked from InstaGrabber | ||||
|     public boolean setManualLike(final boolean like) { | ||||
|         liked = like; | ||||
|         likes = (like) ? (likes + 1) : (likes - 1); | ||||
|         return liked; | ||||
|     } | ||||
| 
 | ||||
|     public boolean setBookmark(final boolean bookmark) { | ||||
|         bookmarked = bookmark; return bookmarked; | ||||
|     } | ||||
|  | ||||
| @ -12,13 +12,15 @@ public final class CommentModel { | ||||
|     private final CharSequence text; | ||||
|     private final long likes, timestamp; | ||||
|     private CommentModel[] childCommentModels; | ||||
|     private boolean hasNextPage; | ||||
|     private boolean hasNextPage, liked; | ||||
|     private String endCursor; | ||||
| 
 | ||||
|     public CommentModel(final String id, final String text, final long timestamp, final long likes, final ProfileModel profileModel) { | ||||
|     public CommentModel(final String id, final String text, final long timestamp, final long likes, final boolean liked, | ||||
|                         final ProfileModel profileModel) { | ||||
|         this.id = id; | ||||
|         this.text = Utils.hasMentions(text) ? Utils.getMentionText(text) : text; | ||||
|         this.likes = likes; | ||||
|         this.liked = liked; | ||||
|         this.timestamp = timestamp; | ||||
|         this.profileModel = profileModel; | ||||
|     } | ||||
| @ -40,6 +42,10 @@ public final class CommentModel { | ||||
|         return likes; | ||||
|     } | ||||
| 
 | ||||
|     public boolean getLiked() { | ||||
|         return liked; | ||||
|     } | ||||
| 
 | ||||
|     public ProfileModel getProfileModel() { | ||||
|         return profileModel; | ||||
|     } | ||||
|  | ||||
| @ -10,8 +10,8 @@ public final class FeedModel extends PostModel { | ||||
| 
 | ||||
|     public FeedModel(final ProfileModel profileModel, final MediaItemType itemType, final long viewCount, final String postId, | ||||
|                      final String displayUrl, final String thumbnailUrl, final String shortCode, final String postCaption, | ||||
|                      final long commentsCount, final long timestamp, boolean liked, boolean bookmarked) { | ||||
|         super(itemType, postId, displayUrl, thumbnailUrl, shortCode, postCaption, timestamp, liked, bookmarked); | ||||
|                      final long commentsCount, final long timestamp, boolean liked, boolean bookmarked, long likes) { | ||||
|         super(itemType, postId, displayUrl, thumbnailUrl, shortCode, postCaption, timestamp, liked, bookmarked, likes); | ||||
|         this.profileModel = profileModel; | ||||
|         this.commentsCount = commentsCount; | ||||
|         this.viewCount = viewCount; | ||||
|  | ||||
| @ -13,7 +13,8 @@ public class PostModel extends BasePostModel { | ||||
|     } | ||||
| 
 | ||||
|     public PostModel(final MediaItemType itemType, final String postId, final String displayUrl, final String thumbnailUrl, | ||||
|                      final String shortCode, final CharSequence postCaption, long timestamp, boolean liked, boolean bookmarked) { | ||||
|                      final String shortCode, final CharSequence postCaption, long timestamp, boolean liked, boolean bookmarked, | ||||
|                      long likes) { | ||||
|         this.itemType = itemType; | ||||
|         this.postId = postId; | ||||
|         this.displayUrl = displayUrl; | ||||
| @ -22,6 +23,7 @@ public class PostModel extends BasePostModel { | ||||
|         this.postCaption = postCaption; | ||||
|         this.timestamp = timestamp; | ||||
|         this.liked = liked; | ||||
|         this.likes = likes; | ||||
|         this.bookmarked = bookmarked; | ||||
|     } | ||||
| 
 | ||||
| @ -33,6 +35,10 @@ public class PostModel extends BasePostModel { | ||||
|         return endCursor; | ||||
|     } | ||||
| 
 | ||||
|     public long getLikes() { | ||||
|         return likes; | ||||
|     } | ||||
| 
 | ||||
|     public boolean hasNextPage() { | ||||
|         return endCursor != null && hasNextPage; | ||||
|     } | ||||
|  | ||||
| @ -30,7 +30,7 @@ public final class FlavorTown { | ||||
|         Resources res = context.getResources(); | ||||
|         new UpdateChecker(version -> { | ||||
|             new AlertDialog.Builder(context) | ||||
|                     .setTitle(res.getString(R.string.update_available) + " (" + version + ")") | ||||
|                     .setTitle(res.getString(R.string.update_available, version)) | ||||
|                     .setMessage(R.string.update_notice) | ||||
|                     .setNeutralButton(R.string.cancel, null) | ||||
|                     .setNegativeButton(R.string.action_github, (dialog, which) -> { | ||||
|  | ||||
| @ -5,21 +5,67 @@ | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     android:orientation="vertical" | ||||
|     tools:context=".activities.CommentsViewer"> | ||||
|     tools:context=".activities.CommentsViewer" | ||||
|     android:weightSum="8"> | ||||
| 
 | ||||
|     <include | ||||
|         android:id="@+id/toolbar" | ||||
|         android:layout_weight="1" | ||||
|         layout="@layout/layout_include_toolbar" /> | ||||
| 
 | ||||
|     <androidx.recyclerview.widget.RecyclerView | ||||
|         android:id="@+id/rvComments" | ||||
|     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout | ||||
|         android:id="@+id/swipeRefreshLayout" | ||||
|         android:layout_weight="8" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="match_parent" | ||||
|         android:clipToPadding="false" | ||||
|         android:paddingStart="8dp" | ||||
|         android:paddingLeft="8dp" | ||||
|         android:paddingEnd="8dp" | ||||
|         android:paddingRight="8dp" | ||||
|         app:layoutManager="LinearLayoutManager" | ||||
|         tools:listitem="@layout/item_comment" /> | ||||
|         android:layout_height="match_parent"> | ||||
|         <androidx.recyclerview.widget.RecyclerView | ||||
|             android:id="@+id/rvComments" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="match_parent" | ||||
|             android:clipToPadding="false" | ||||
|             android:paddingStart="8dp" | ||||
|             android:paddingLeft="8dp" | ||||
|             android:paddingEnd="8dp" | ||||
|             android:paddingRight="8dp" | ||||
|             app:layoutManager="LinearLayoutManager" | ||||
|             tools:listitem="@layout/item_comment" /> | ||||
|     </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> | ||||
| 
 | ||||
|     <LinearLayout android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content"> | ||||
| 
 | ||||
|         <androidx.appcompat.widget.AppCompatImageView | ||||
|             android:id="@+id/commentCancelParent" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:background="?selectableItemBackgroundBorderless" | ||||
|             android:clickable="true" | ||||
|             android:paddingRight="8dp" | ||||
|             android:visibility="gone" | ||||
|             app:srcCompat="@android:drawable/ic_menu_revert" /> | ||||
|         <EditText | ||||
|             android:id="@+id/commentText" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_weight="2" | ||||
|             android:paddingLeft="8dp" | ||||
|             android:gravity="bottom" | ||||
|             android:hint="@string/comment_hint" | ||||
|             android:inputType="textMultiLine" | ||||
|             android:maxLength="2200" | ||||
|             android:maxLines="10" | ||||
|             android:visibility="gone" | ||||
|             android:scrollHorizontally="false" /> | ||||
| 
 | ||||
|         <androidx.appcompat.widget.AppCompatImageView | ||||
|             android:id="@+id/commentSend" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:background="?selectableItemBackgroundBorderless" | ||||
|             android:clickable="true" | ||||
|             android:paddingRight="8dp" | ||||
|             android:visibility="gone" | ||||
|             app:srcCompat="@android:drawable/ic_menu_send" /> | ||||
| 
 | ||||
|     </LinearLayout> | ||||
| </LinearLayout> | ||||
| @ -116,7 +116,7 @@ | ||||
|             android:layout_weight="1" | ||||
|             android:text="@string/like" | ||||
|             android:textColor="@color/btn_lightpink_text_color" | ||||
|             android:textSize="20sp" | ||||
|             android:textSize="18sp" | ||||
|             app:backgroundTint="@color/btn_lightpink_background" /> | ||||
| 
 | ||||
|         <androidx.appcompat.widget.AppCompatButton | ||||
| @ -130,7 +130,7 @@ | ||||
|             android:layout_weight="1" | ||||
|             android:text="@string/bookmark" | ||||
|             android:textColor="@color/btn_lightorange_text_color" | ||||
|             android:textSize="20sp" | ||||
|             android:textSize="18sp" | ||||
|             app:backgroundTint="@color/btn_lightorange_background" /> | ||||
|     </androidx.appcompat.widget.LinearLayoutCompat> | ||||
| </LinearLayout> | ||||
| @ -35,13 +35,9 @@ | ||||
|             android:layout_height="wrap_content" | ||||
|             android:orientation="vertical"> | ||||
| 
 | ||||
|             <LinearLayout | ||||
|                 android:layout_width="match_parent" | ||||
|                 android:layout_height="wrap_content"> | ||||
| 
 | ||||
|                 <androidx.appcompat.widget.AppCompatTextView | ||||
|                     android:id="@+id/tvUsername" | ||||
|                     android:layout_width="0dp" | ||||
|                     android:layout_width="match_parent" | ||||
|                     android:layout_height="wrap_content" | ||||
|                     android:layout_gravity="start" | ||||
|                     android:layout_weight="1.0" | ||||
| @ -56,20 +52,6 @@ | ||||
|                     android:textColor="?android:textColorPrimary" | ||||
|                     android:textStyle="bold" /> | ||||
| 
 | ||||
|                 <androidx.appcompat.widget.AppCompatTextView | ||||
|                     android:id="@+id/tvDate" | ||||
|                     android:layout_width="wrap_content" | ||||
|                     android:layout_height="wrap_content" | ||||
|                     android:layout_gravity="start" | ||||
|                     android:ellipsize="marquee" | ||||
|                     android:paddingStart="4dp" | ||||
|                     android:paddingLeft="4dp" | ||||
|                     android:paddingTop="4dp" | ||||
|                     android:paddingEnd="8dp" | ||||
|                     android:paddingRight="8dp" | ||||
|                     android:singleLine="true" | ||||
|                     android:textStyle="italic" /> | ||||
|             </LinearLayout> | ||||
| 
 | ||||
|             <awais.instagrabber.customviews.RamboTextView | ||||
|                 android:id="@+id/tvComment" | ||||
| @ -86,11 +68,15 @@ | ||||
|                 android:paddingRight="8dp" | ||||
|                 android:paddingBottom="8dp" | ||||
|                 android:textAppearance="@style/TextAppearance.AppCompat" /> | ||||
| 
 | ||||
|             <androidx.appcompat.widget.AppCompatTextView | ||||
|                 android:id="@+id/tvLikes" | ||||
|             <LinearLayout | ||||
|                 android:layout_width="match_parent" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:weightSum="3.5"> | ||||
|             <androidx.appcompat.widget.AppCompatTextView | ||||
|                 android:id="@+id/tvLikes" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_weight="1" | ||||
|                 android:ellipsize="marquee" | ||||
|                 android:paddingStart="4dp" | ||||
|                 android:paddingLeft="4dp" | ||||
| @ -100,6 +86,23 @@ | ||||
|                 android:singleLine="true" | ||||
|                 android:textAppearance="@style/TextAppearance.AppCompat.Small" | ||||
|                 android:textSize="12sp" /> | ||||
| 
 | ||||
|                 <androidx.appcompat.widget.AppCompatTextView | ||||
|                     android:id="@+id/tvDate" | ||||
|                     android:layout_width="0dp" | ||||
|                     android:layout_height="wrap_content" | ||||
|                     android:layout_weight="2.5" | ||||
|                     android:layout_gravity="start" | ||||
|                     android:ellipsize="marquee" | ||||
|                     android:paddingStart="4dp" | ||||
|                     android:paddingLeft="4dp" | ||||
|                     android:paddingTop="4dp" | ||||
|                     android:paddingEnd="8dp" | ||||
|                     android:paddingRight="8dp" | ||||
|                     android:singleLine="true" | ||||
|                     android:textStyle="italic" | ||||
|                     android:gravity="right"/> | ||||
|             </LinearLayout> | ||||
|         </LinearLayout> | ||||
|     </LinearLayout> | ||||
| </LinearLayout> | ||||
| @ -51,13 +51,9 @@ | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="vertical"> | ||||
| 
 | ||||
|         <LinearLayout | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content"> | ||||
| 
 | ||||
|             <androidx.appcompat.widget.AppCompatTextView | ||||
|                 android:id="@+id/tvUsername" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_width="match_parent" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_gravity="start" | ||||
|                 android:layout_weight="1.0" | ||||
| @ -72,22 +68,7 @@ | ||||
|                 android:textColor="?android:textColorPrimary" | ||||
|                 android:textStyle="bold" /> | ||||
| 
 | ||||
|             <androidx.appcompat.widget.AppCompatTextView | ||||
|                 android:id="@+id/tvDate" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_gravity="start" | ||||
|                 android:ellipsize="marquee" | ||||
|                 android:paddingStart="4dp" | ||||
|                 android:paddingLeft="4dp" | ||||
|                 android:paddingTop="4dp" | ||||
|                 android:paddingEnd="8dp" | ||||
|                 android:paddingRight="8dp" | ||||
|                 android:singleLine="true" | ||||
|                 android:textStyle="italic" /> | ||||
|         </LinearLayout> | ||||
| 
 | ||||
|         <LinearLayout | ||||
|             <LinearLayout | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:orientation="horizontal" | ||||
| @ -118,18 +99,40 @@ | ||||
|                 android:textAppearance="@style/TextAppearance.AppCompat" /> | ||||
|         </LinearLayout> | ||||
| 
 | ||||
|         <androidx.appcompat.widget.AppCompatTextView | ||||
|             android:id="@+id/tvLikes" | ||||
|         <LinearLayout | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:ellipsize="marquee" | ||||
|             android:paddingStart="4dp" | ||||
|             android:paddingLeft="4dp" | ||||
|             android:paddingTop="4dp" | ||||
|             android:paddingEnd="8dp" | ||||
|             android:paddingRight="8dp" | ||||
|             android:singleLine="true" | ||||
|             android:textAppearance="@style/TextAppearance.AppCompat.Small" | ||||
|             android:textSize="14sp" /> | ||||
|             android:weightSum="3"> | ||||
|             <androidx.appcompat.widget.AppCompatTextView | ||||
|                 android:id="@+id/tvLikes" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_weight="1" | ||||
|                 android:ellipsize="marquee" | ||||
|                 android:paddingStart="4dp" | ||||
|                 android:paddingLeft="4dp" | ||||
|                 android:paddingTop="4dp" | ||||
|                 android:paddingEnd="8dp" | ||||
|                 android:paddingRight="8dp" | ||||
|                 android:singleLine="true" | ||||
|                 android:textAppearance="@style/TextAppearance.AppCompat.Small" | ||||
|                 android:textSize="14sp" /> | ||||
|             <androidx.appcompat.widget.AppCompatTextView | ||||
|                 android:id="@+id/tvDate" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_weight="2" | ||||
|                 android:layout_gravity="start" | ||||
|                 android:ellipsize="marquee" | ||||
|                 android:paddingStart="4dp" | ||||
|                 android:paddingLeft="4dp" | ||||
|                 android:paddingTop="4dp" | ||||
|                 android:paddingEnd="8dp" | ||||
|                 android:paddingRight="8dp" | ||||
|                 android:singleLine="true" | ||||
|                 android:textStyle="italic" | ||||
|                 android:gravity="right"/> | ||||
|         </LinearLayout> | ||||
| 
 | ||||
|     </LinearLayout> | ||||
| </LinearLayout> | ||||
| @ -157,7 +157,7 @@ | ||||
|     <string name="followers_not_follower">%s 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="update_available">An update is available!</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 InstaGrabber!</string> | ||||
|     <string name="crash_title">App crashed</string> | ||||
|  | ||||
| @ -157,7 +157,7 @@ | ||||
|     <string name="followers_not_follower">%s no está siguiendo</string> | ||||
|     <string name="login_error_loading_cookies">Error al cargar cookies</string> | ||||
|     <string name="login_success_loading_cookies">¡Cookies cargadas con éxito!\nSi aún no puedes abrir páginas/publicaciones privadas, ¡vuelve a ingresar!</string> | ||||
|     <string name="update_available">An update is available!</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 InstaGrabber!</string> | ||||
|     <string name="crash_title">App atascada</string> | ||||
|  | ||||
| @ -157,7 +157,7 @@ | ||||
|     <string name="followers_not_follower">Comptes non suivis par %s </string> | ||||
|     <string name="login_error_loading_cookies">Erreur de chargement des cookies</string> | ||||
|     <string name="login_success_loading_cookies">Cookies chargés avec succès!\nSi vous ne pouvez toujours pas ouvrir de pages/postes privés, reconnectez-vous !</string> | ||||
|     <string name="update_available">An update is available!</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 InstaGrabber!</string> | ||||
|     <string name="crash_title">L\'application a planté</string> | ||||
|  | ||||
| @ -157,7 +157,7 @@ | ||||
|     <string name="followers_not_follower">%s tidak mengikuti</string> | ||||
|     <string name="login_error_loading_cookies">Galat memuat cookies</string> | ||||
|     <string name="login_success_loading_cookies">Berhasil memuat cookies!\nJika anda tetap tidak dapat membuka laman/kiriman pribadi, coba masuk lagi!</string> | ||||
|     <string name="update_available">An update is available!</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 InstaGrabber!</string> | ||||
|     <string name="crash_title">Aplikasi berhenti bekerja…</string> | ||||
|  | ||||
| @ -157,7 +157,7 @@ | ||||
|     <string name="followers_not_follower">%s non segue</string> | ||||
|     <string name="login_error_loading_cookies"> Errore durante il caricamento dei cookie</string> | ||||
|     <string name="login_success_loading_cookies">Cookie caricati correttamente! \nSe non riesci ancora ad aprire pagine / post privati, accedi nuovamente!</string> | ||||
|     <string name="update_available">Un aggiornamento è disponibile!</string> | ||||
|     <string name="update_available">Un aggiornamento è disponibile! (%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">Grazie per aver aggiornato InstaGrabber!</string> | ||||
|     <string name="crash_title">L\'app si è arrestata in modo anomalo</string> | ||||
|  | ||||
| @ -157,7 +157,7 @@ | ||||
|     <string name="followers_not_follower">%s 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="update_available">An update is available!</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 InstaGrabber!</string> | ||||
|     <string name="crash_title">App crashed</string> | ||||
|  | ||||
| @ -157,7 +157,7 @@ | ||||
|     <string name="followers_not_follower">%s 未关注</string> | ||||
|     <string name="login_error_loading_cookies">载入 cookies 时出错</string> | ||||
|     <string name="login_success_loading_cookies">成功载入 cookies!\n若你仍不能查看私密页面/帖子,重新登录!</string> | ||||
|     <string name="update_available">检测到有新版本!</string> | ||||
|     <string name="update_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">感谢阁下更新InstaGrabber!</string> | ||||
|     <string name="crash_title">应用崩溃了</string> | ||||
|  | ||||
| @ -8,6 +8,8 @@ | ||||
|         <item>Chinese Simplified</item> | ||||
|         <item>Indonesian [Thanks to @Galang23 (GitLab)]</item> | ||||
|         <item>Italian [Thanks to @RAR_Ramar (Telegram)]</item> | ||||
|         <item>German [Thanks to @MoaufmKlo (GitHub)]</item> | ||||
|         <item>Polish [Thanks to @Lego8486 (GitHub)]</item> | ||||
|     </string-array> | ||||
| 
 | ||||
|     <string-array name="theme_presets"> | ||||
|  | ||||
| @ -82,8 +82,8 @@ | ||||
|     <string name="telegram_link">Join Telegram Group</string> | ||||
|     <string name="matrix_link">Join Matrix Room</string> | ||||
| 
 | ||||
|     <string name="like">Like</string> | ||||
|     <string name="unlike">Unlike</string> | ||||
|     <string name="like">Like (%s)</string> | ||||
|     <string name="unlike">Unlike (%s)</string> | ||||
|     <string name="bookmark">Bookmark</string> | ||||
|     <string name="unbookmark">Unbookmark</string> | ||||
| 
 | ||||
| @ -173,6 +173,11 @@ | ||||
| 
 | ||||
|     <string name="comment_viewer_copy_user">Copy username</string> | ||||
|     <string name="comment_viewer_copy_comment">Copy comment</string> | ||||
|     <string name="comment_viewer_reply_comment">Reply to comment</string> | ||||
|     <string name="comment_viewer_like_comment">Like comment</string> | ||||
|     <string name="comment_viewer_unlike_comment">Unlike comment</string> | ||||
|     <string name="comment_viewer_delete_comment">Delete comment</string> | ||||
|     <string name="comment_send_empty_comment">No empty comments, dawg!</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> | ||||
| 
 | ||||
| @ -186,7 +191,9 @@ | ||||
|     <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="update_available">An update is available!</string> | ||||
|     <string name="comment_hint">Write a new comment...</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 InstaGrabber!</string> | ||||
|     <string name="crash_title">App crashed</string> | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user