1
0
mirror of https://github.com/KokaKiwi/BarInsta synced 2024-11-22 06:37:30 +00:00

v16.9 part whatever

This commit is contained in:
Austin Huang 2020-07-27 11:29:13 -04:00
parent 86d94d3c97
commit 2f30eec0a3
No known key found for this signature in database
GPG Key ID: 84C23AA04587A91F
20 changed files with 114 additions and 68 deletions

View File

@ -870,7 +870,7 @@ public final class MainHelper implements SwipeRefreshLayout.OnRefreshListener {
main.mainBinding.mainFullName.setSelected(true);
main.mainBinding.mainBiography.setEnabled(true);
if (!profileModel.isPrivate()) {
if (!profileModel.isReallyPrivate()) {
main.mainBinding.mainFollowing.setClickable(true);
main.mainBinding.mainFollowers.setClickable(true);
main.mainBinding.privatePage.setVisibility(View.GONE);

View File

@ -42,7 +42,7 @@ import awais.instagrabber.utils.Utils;
public final class DirectMessagesUserInbox extends AppCompatActivity {
private DirectItemModel directItemModel;
private final ProfileModel myProfileHolder =
new ProfileModel(false, false, null, null, null, null, null, null, null, 0, 0, 0, false, false, false, false);
new ProfileModel(false, false, false, null, null, null, null, null, null, null, 0, 0, 0, false, false, false, false);
private final ArrayList<ProfileModel> users = new ArrayList<>();
private final ArrayList<DirectItemModel> directItemModels = new ArrayList<>();
private final FetchListener<InboxThreadModel> fetchListener = new FetchListener<InboxThreadModel>() {

View File

@ -317,7 +317,7 @@ public final class Main extends BaseLanguageActivity {
searchView.setQueryHint(getResources().getString(R.string.action_search));
searchView.setSuggestionsAdapter(suggestionAdapter);
searchView.setOnSearchClickListener(v -> {
searchView.setQuery(userQuery.equals(cookieModel.getUsername()) ? "" : userQuery, false);
searchView.setQuery((cookieModel != null && userQuery.equals(cookieModel.getUsername())) ? "" : 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);

View File

@ -139,11 +139,14 @@ public final class PostViewer extends BaseLanguageActivity {
iconRes = R.drawable.ic_fullscreen_exit;
topPanelRoot.setVisibility(View.GONE);
viewerBinding.btnDownload.setVisibility(View.VISIBLE);
viewerBinding.bottomPanel.tvPostDate.setVisibility(View.GONE);
} else {
containerLayoutParams.weight = (viewerBinding.mediaList.getVisibility() == View.VISIBLE) ? 1.35f : 1.9f;
containerLayoutParams.weight += (Utils.isEmpty(settingsHelper.getString(Constants.COOKIE))) ? 0.3f : 0;
iconRes = R.drawable.ic_fullscreen;
topPanelRoot.setVisibility(View.VISIBLE);
viewerBinding.btnDownload.setVisibility(View.GONE);
viewerBinding.bottomPanel.tvPostDate.setVisibility(View.VISIBLE);
}
viewerBinding.ivToggleFullScreen.setImageResource(iconRes);
@ -203,7 +206,19 @@ public final class PostViewer extends BaseLanguageActivity {
resources = getResources();
final View viewStoryPost = findViewById(R.id.viewStoryPost);
if (viewStoryPost != null) viewStoryPost.setVisibility(View.GONE);
if (viewStoryPost != null) {
viewStoryPost.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (profileModel.isPrivate())
Toast.makeText(getApplicationContext(), R.string.share_private_post, Toast.LENGTH_LONG).show();
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, "https://instagram.com/p/"+postShortCode);
startActivity(Intent.createChooser(sharingIntent,
(profileModel.isPrivate()) ? getString(R.string.share_private_post) : getString(R.string.share_public_post)));
}
});
}
viewerBinding.topPanel.title.setMovementMethod(new LinkMovementMethod());
viewerBinding.topPanel.title.setMentionClickListener((view, text, isHashtag) ->
@ -218,7 +233,7 @@ public final class PostViewer extends BaseLanguageActivity {
viewerBinding.postActions.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, 0, 0
));
containerLayoutParams.weight = 2.2f;
containerLayoutParams.weight = (containerLayoutParams.weight == 3.3f) ? 3.3f : 2.2f;
viewerBinding.container.setLayoutParams(containerLayoutParams);
}
else {
@ -339,6 +354,21 @@ public final class PostViewer extends BaseLanguageActivity {
viewerBinding.mediaList.setVisibility(View.VISIBLE);
}
final View viewStoryPost = findViewById(R.id.viewStoryPost);
if (viewStoryPost != null) {
viewStoryPost.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (profileModel.isPrivate())
Toast.makeText(getApplicationContext(), R.string.share_private_post, Toast.LENGTH_LONG).show();
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, "https://instagram.com/p/"+postModel.getShortCode());
startActivity(Intent.createChooser(sharingIntent,
(profileModel.isPrivate()) ? getString(R.string.share_private_post) : getString(R.string.share_public_post)));
}
});
}
viewerCaptionParent.setOnTouchListener(gestureTouchListener);
viewerBinding.playerView.setOnTouchListener(gestureTouchListener);
viewerBinding.imageViewer.setOnSingleFlingListener((e1, e2, velocityX, velocityY) -> {
@ -560,10 +590,6 @@ public final class PostViewer extends BaseLanguageActivity {
}
lastSlidePos = slidePos;
containerLayoutParams.weight = (viewerBinding.mediaList.getVisibility() == View.VISIBLE) ? 1.35f : 1.9f;
containerLayoutParams.weight += (Utils.isEmpty(settingsHelper.getString(Constants.COOKIE))) ? 0.3f : 0;
viewerBinding.container.setLayoutParams(containerLayoutParams);
postCaption = viewerPostModel.getPostCaption();
if (Utils.hasMentions(postCaption)) {
@ -588,12 +614,12 @@ public final class PostViewer extends BaseLanguageActivity {
postModel.setLike(viewerPostModel.getLike());
postModel.setBookmark(viewerPostModel.getBookmark());
if (viewerPostModel.getLike() == true) {
viewerBinding.btnLike.setText(resources.getString(R.string.unlike, postModel.getLikes()));
viewerBinding.btnLike.setText(resources.getString(R.string.unlike, viewerPostModel.getLikes()));
viewerBinding.btnLike.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(
R.color.btn_pink_background, null)));
}
else {
viewerBinding.btnLike.setText(resources.getString(R.string.like, postModel.getLikes()));
viewerBinding.btnLike.setText(resources.getString(R.string.like, viewerPostModel.getLikes()));
viewerBinding.btnLike.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(
R.color.btn_lightpink_background, null)));
}
@ -610,7 +636,7 @@ public final class PostViewer extends BaseLanguageActivity {
}
viewerBinding.bottomPanel.tvPostDate.setText(viewerPostModel.getPostDate());
viewerBinding.bottomPanel.tvPostDate.setVisibility(View.VISIBLE);
viewerBinding.bottomPanel.tvPostDate.setVisibility(containerLayoutParams.weight != 3.3f ? View.VISIBLE : View.GONE);
viewerBinding.bottomPanel.tvPostDate.setSelected(true);
url = viewerPostModel.getDisplayUrl();
@ -718,7 +744,7 @@ public final class PostViewer extends BaseLanguageActivity {
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
ok = true;
}
else Toast.makeText(getApplicationContext(), R.string.downloader_unknown_error, Toast.LENGTH_SHORT);
else Toast.makeText(getApplicationContext(), R.string.downloader_unknown_error, Toast.LENGTH_SHORT).show();
urlConnection.disconnect();
} catch (Throwable ex) {
Log.e("austin_debug", action+": " + ex);
@ -729,8 +755,8 @@ public final class PostViewer extends BaseLanguageActivity {
@Override
protected void onPostExecute(Void result) {
if (ok == true && action == "likes") {
viewerPostModel.setLike(!postModel.getLike());
postModel.setManualLike(!postModel.getLike());
postModel.setLike(!postModel.getLike());
viewerPostModel.setManualLike(!postModel.getLike());
refreshPost();
}
else if (ok == true && action == "save") {

View File

@ -46,7 +46,7 @@ import static awais.instagrabber.models.direct_messages.DirectItemModel.RavenExp
public final class MessageItemsAdapter extends RecyclerView.Adapter<TextMessageViewHolder> {
private static final int MESSAGE_INCOMING = 69, MESSAGE_OUTGOING = 420;
private final ProfileModel myProfileHolder =
new ProfileModel(false, false, null, null, null, null, null, null, null, 0, 0, 0, false, false, false, false);
new ProfileModel(false, false, false, null, null, null, null, null, null, null, 0, 0, 0, false, false, false, false);
private final ArrayList<DirectItemModel> directItemModels;
private final ArrayList<ProfileModel> users;
private final View.OnClickListener onClickListener;

View File

@ -109,8 +109,7 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]>
if (childComment != null) {
final JSONObject owner = childComment.getJSONObject("owner");
final ProfileModel profileModel = new ProfileModel(false,
false,
final ProfileModel profileModel = new ProfileModel(false, false, false,
owner.getString(Constants.EXTRAS_ID),
owner.getString(Constants.EXTRAS_USERNAME),
null, null, null,
@ -188,7 +187,7 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]>
final JSONObject comment = comments.getJSONObject(i).getJSONObject("node");
final JSONObject owner = comment.getJSONObject("owner");
final ProfileModel profileModel = new ProfileModel(false,
final ProfileModel profileModel = new ProfileModel(false, false,
owner.optBoolean("is_verified"),
owner.getString(Constants.EXTRAS_ID),
owner.getString(Constants.EXTRAS_USERNAME),
@ -229,6 +228,7 @@ public final class CommentsFetcher extends AsyncTask<Void, Void, CommentModel[]>
tempJsonObject = childComment.getJSONObject("owner");
final ProfileModel childProfileModel = new ProfileModel(false, false,
tempJsonObject.optBoolean("is_verified"),
tempJsonObject.getString(Constants.EXTRAS_ID),
tempJsonObject.getString(Constants.EXTRAS_USERNAME),
null, null, null,

View File

@ -98,6 +98,7 @@ public final class FeedFetcher extends AsyncTask<Void, Void, FeedModel[]> {
if (feedItem.has("owner")) {
final JSONObject owner = feedItem.getJSONObject("owner");
profileModel = new ProfileModel(owner.optBoolean("is_private"),
false, // if you can see it then you def follow
owner.optBoolean("is_verified"),
owner.getString(Constants.EXTRAS_ID),
owner.getString(Constants.EXTRAS_USERNAME),
@ -153,7 +154,8 @@ public final class FeedFetcher extends AsyncTask<Void, Void, FeedModel[]> {
node.getString(Constants.EXTRAS_ID),
isChildVideo ? node.getString("video_url") : Utils.getHighQualityImage(node),
null, null, null,
node.optLong("video_view_count", -1), -1, false, false);
node.optLong("video_view_count", -1), -1, false, false,
feedItem.getJSONObject("edge_media_preview_like").getLong("count"));
sliderItems[j].setSliderDisplayUrl(node.getString("display_url"));
}

View File

@ -56,7 +56,7 @@ public final class FeedStoriesFetcher extends AsyncTask<Void, Void, FeedStoryMod
final JSONObject node = feedStoriesReel.getJSONObject(i).getJSONObject("node");
final JSONObject user = node.getJSONObject(node.has("user") ? "user" : "owner");
final ProfileModel profileModel = new ProfileModel(false, false,
final ProfileModel profileModel = new ProfileModel(false, false, false,
user.getString("id"),
user.getString("username"),
null, null, null,

View File

@ -81,7 +81,6 @@ 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),
@ -89,7 +88,8 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
Utils.isEmpty(postCaption) ? null : postCaption,
username,
isVideo && media.has("video_view_count") ? media.getLong("video_view_count") : -1,
timestamp, media.getBoolean("viewer_has_liked"), media.getBoolean("viewer_has_saved"));
timestamp, media.getBoolean("viewer_has_liked"), media.getBoolean("viewer_has_saved"),
media.getJSONObject("edge_media_preview_like").getLong("count"));
postModel.setCommentsCount(commentsCount);
postModel.setCommentsEndCursor(endCursor);
@ -107,13 +107,14 @@ public final class PostFetcher extends AsyncTask<Void, Void, ViewerPostModel[]>
final boolean isChildVideo = node.getBoolean("is_video");
postModels[i] = new ViewerPostModel(isChildVideo ? MediaItemType.MEDIA_TYPE_VIDEO : MediaItemType.MEDIA_TYPE_IMAGE,
node.getString(Constants.EXTRAS_ID),
media.getString(Constants.EXTRAS_ID),
isChildVideo ? node.getString("video_url") : Utils.getHighQualityImage(node),
node.getString(Constants.EXTRAS_SHORTCODE),
postCaption,
username,
isChildVideo && node.has("video_view_count") ? node.getLong("video_view_count") : -1,
timestamp, media.getBoolean("viewer_has_liked"), media.getBoolean("viewer_has_saved"));
timestamp, media.getBoolean("viewer_has_liked"), media.getBoolean("viewer_has_saved"),
media.getJSONObject("edge_media_preview_like").getLong("count"));
postModels[i].setSliderDisplayUrl(node.getString("display_url"));
Utils.checkExistence(downloadDir, customDir, username, true, i, postModels[i]);

View File

@ -43,16 +43,18 @@ public final class ProfileFetcher extends AsyncTask<Void, Void, ProfileModel> {
final JSONObject user = new JSONObject(Utils.readFromConnection(conn)).getJSONObject("graphql").getJSONObject(Constants.EXTRAS_USER);
boolean isPrivate = user.getBoolean("is_private");
boolean reallyPrivate = isPrivate;
final JSONObject timelineMedia = user.getJSONObject("edge_owner_to_timeline_media");
if (timelineMedia.has("edges")) {
final JSONArray edges = timelineMedia.getJSONArray("edges");
if (edges.length() > 0) isPrivate = false;
if (edges.length() > 0) reallyPrivate = false;
}
String url = user.optString("external_url");
if (Utils.isEmpty(url)) url = null;
result = new ProfileModel(isPrivate,
reallyPrivate,
user.getBoolean("is_verified"),
user.getString(Constants.EXTRAS_ID),
userName,

View File

@ -19,14 +19,11 @@ 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;
}
@ -35,13 +32,6 @@ public abstract class BasePostModel implements Serializable {
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;
}

View File

@ -23,7 +23,6 @@ public class PostModel extends BasePostModel {
this.postCaption = postCaption;
this.timestamp = timestamp;
this.liked = liked;
this.likes = likes;
this.bookmarked = bookmarked;
}
@ -35,10 +34,6 @@ public class PostModel extends BasePostModel {
return endCursor;
}
public long getLikes() {
return likes;
}
public boolean hasNextPage() {
return endCursor != null && hasNextPage;
}

View File

@ -3,15 +3,17 @@ package awais.instagrabber.models;
import java.io.Serializable;
public final class ProfileModel implements Serializable {
private final boolean isPrivate, isVerified, following, restricted, blocked, requested;
private final boolean isPrivate, reallyPrivate, isVerified, following, restricted, blocked, requested;
private final long postCount, followersCount, followingCount;
private final String id, username, name, biography, url, sdProfilePic, hdProfilePic;
public ProfileModel(final boolean isPrivate, final boolean isVerified, final String id, final String username,
final String name, final String biography, final String url, final String sdProfilePic, final String hdProfilePic,
final long postCount, final long followersCount, final long followingCount, final boolean following,
final boolean restricted, final boolean blocked, final boolean requested) {
public ProfileModel(final boolean isPrivate, final boolean reallyPrivate,
final boolean isVerified, final String id, final String username, final String name, final String biography,
final String url, final String sdProfilePic, final String hdProfilePic, final long postCount,
final long followersCount, final long followingCount, final boolean following, final boolean restricted,
final boolean blocked, final boolean requested) {
this.isPrivate = isPrivate;
this.reallyPrivate = reallyPrivate;
this.isVerified = isVerified;
this.id = id;
this.url = url;
@ -33,6 +35,10 @@ public final class ProfileModel implements Serializable {
return isPrivate;
}
public boolean isReallyPrivate() {
return reallyPrivate;
}
public boolean isVerified() {
return isVerified;
}

View File

@ -6,12 +6,12 @@ public final class ViewerPostModel extends BasePostModel {
protected final String username;
protected final long videoViews;
protected String sliderDisplayUrl, commentsEndCursor;
protected long commentsCount;
protected long commentsCount, likes;
private boolean isCurrentSlide = false;
public ViewerPostModel(final MediaItemType itemType, final String postId, final String displayUrl, final String shortCode,
final String postCaption, final String username, final long videoViews, final long timestamp,
boolean liked, boolean bookmarked) {
boolean liked, boolean bookmarked, long likes) {
this.itemType = itemType;
this.postId = postId;
this.displayUrl = displayUrl;
@ -21,6 +21,7 @@ public final class ViewerPostModel extends BasePostModel {
this.videoViews = videoViews;
this.timestamp = timestamp;
this.liked = liked;
this.likes = likes;
this.bookmarked = bookmarked;
}
@ -44,6 +45,17 @@ public final class ViewerPostModel extends BasePostModel {
return videoViews;
}
public long getLikes() {
return likes;
}
// setManualLike means user liked from InstaGrabber
public boolean setManualLike(final boolean like) {
liked = like;
likes = (like) ? (likes + 1) : (likes - 1);
return liked;
}
public void setSliderDisplayUrl(final String sliderDisplayUrl) {
this.sliderDisplayUrl = sliderDisplayUrl;
}

View File

@ -63,6 +63,8 @@ public final class LocaleUtils {
if (appLanguageIndex == 4) return "zh";
if (appLanguageIndex == 5) return "in";
if (appLanguageIndex == 6) return "it";
if (appLanguageIndex == 7) return "de";
if (appLanguageIndex == 8) return "pl";
return null;
}

View File

@ -382,6 +382,7 @@ public final class Utils {
if (userObj != null) {
user = new ProfileModel(
userObj.getBoolean("is_private"),
false, // temporary
userObj.optBoolean("is_verified"),
String.valueOf(userObj.get("pk")),
userObj.getString("username"),
@ -459,6 +460,7 @@ public final class Utils {
for (int j = 0; j < usersLen; ++j) {
final JSONObject userObject = users.getJSONObject(j);
userModels[j] = new ProfileModel(userObject.getBoolean("is_private"),
false,
userObject.optBoolean("is_verified"),
String.valueOf(userObject.get("pk")),
userObject.getString("username"),
@ -608,6 +610,7 @@ public final class Utils {
case PROFILE: {
final JSONObject profile = itemObject.getJSONObject("profile");
profileModel = new ProfileModel(profile.getBoolean("is_private"),
false,
profile.getBoolean("is_verified"),
Long.toString(profile.getLong("pk")),
profile.getString("username"),

View File

@ -8,8 +8,8 @@
<item>简体中文</item>
<item>印尼文 [感谢 @Galang23 (GitLab)]</item>
<item>意大利文 [感谢 @RAR_Ramar (Telegram)]</item>
<item>German [Thanks to @MoaufmKlo (GitHub)]</item>
<item>Polish [Thanks to @Lego8486 (GitHub)]</item>
<item>德文 [感谢 @MoaufmKlo (GitHub)]</item>
<item>波兰文 [感谢 @Lego8486 (GitHub)]</item>
</string-array>
<string-array name="theme_presets">
<item>自动 / 跟随系统</item>

View File

@ -68,16 +68,16 @@
<string name="project_link">参观项目页面</string>
<string name="telegram_link">加入 Telegram 群组</string>
<string name="matrix_link">加入 Matrix 群组</string>
<string name="like">Like (%s)</string>
<string name="unlike">Unlike (%s)</string>
<string name="like"> (%s)</string>
<string name="unlike">取消赞 (%s)</string>
<string name="bookmark">加入收藏</string>
<string name="unbookmark">解除收藏</string>
<string name="follow">关注</string>
<string name="unfollow">脱粉</string>
<string name="favorite">Add to Favorites</string>
<string name="unfavorite">Remove from Favorites</string>
<string name="favorite_short">Favorite</string>
<string name="unfavorite_short">Unfavorite</string>
<string name="favorite">加入收藏</string>
<string name="unfavorite">取消收藏</string>
<string name="favorite_short">加入收藏</string>
<string name="unfavorite_short">取消收藏</string>
<string name="block">拉黑</string>
<string name="unblock">解禁</string>
<string name="restrict">限制</string>
@ -109,7 +109,7 @@
<string name="quick_access_confirm_delete">你真的要删除 %s?</string>
<string name="profile_viewer_imageinfo">宽: %d\n高: %d</string>
<string name="profile_viewer_colordepth_prefix">\n色深:</string>
<string name="profile_endpoint">Select profile picture endpoint\n(Does not affect hashtags)</string>
<string name="profile_endpoint">选择高清头像终端\n不影响标签</string>
<string name="open_profile">打开主页</string>
<string name="view_pfp">查看头像</string>
<string name="direct_messages_you"></string>
@ -147,11 +147,11 @@
<string name="downloader_error_download_file">下载文件时出错</string>
<string name="comment_viewer_copy_user">复制用户名</string>
<string name="comment_viewer_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_viewer_reply_comment">回复评论</string>
<string name="comment_viewer_like_comment">赞评论</string>
<string name="comment_viewer_unlike_comment">取消赞评论</string>
<string name="comment_viewer_delete_comment">删除评论</string>
<string name="comment_send_empty_comment">评论不得为空!</string>
<string name="comment_view_mention_user_search">要搜索用户名吗?</string>
<string name="comment_view_mention_hash_search">要搜索标签吗?</string>
<string name="followers_type_followers">粉丝</string>
@ -164,8 +164,10 @@
<string name="login_success_loading_cookies">成功载入 cookies!\n若你仍不能查看私密页面/帖子,重新登录!</string>
<string name="comment_hint">撰写新评论...</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="update_notice">注意若您下载的是F-Droid版本的那您还得在F-Droid更新GitHub版本也是如此。</string>
<string name="updated">感谢阁下更新InstaGrabber</string>
<string name="crash_title">应用崩溃了</string>
<string name="crash_descr">糟糕.. 应用崩溃了,不过别担心,你可以向开发者发送错误报告来帮助他修复问题。(:</string>
<string name="share_public_post">分享公开帖至…</string>
<string name="share_private_post">这是一个私密帖!请分享给能看到它的人!</string>
</resources>

View File

@ -169,6 +169,9 @@
<string name="comment_hint">Write a new comment...</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="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>

View File

@ -1,6 +1,8 @@
* You can now write comments, and reply/like/delete comments through the menu (by clicking the comment)
* You're actually
* Liked comments are shown with a pink background
* Post like counts are now displayed (The button texts are slightly reduced to accomodate @world_record_egg)
* You can now share posts in the post viewer
* Search field is now empty if you're viewing your own profile while logged in
* Post like counts are now displayed (The button texts are slightly reduced to accomodate @world_record_egg) (logged in only)
* Mute buttons are changed to display the current status (i.e. muted icon when muted, sound icon when not muted)
* Fixed a bug relating to viewing feed stories
* Fixed a bug where scrolling in full screen causes it to quit full screen