1
0
mirror of https://github.com/KokaKiwi/BarInsta synced 2024-09-27 21:27:30 +00:00
Merge branch 'master'
This commit is contained in:
Ammar Githam 2021-05-22 18:03:03 +09:00
commit 0c7fb20b2b
28 changed files with 86 additions and 123 deletions

View File

@ -27,12 +27,12 @@ Version status: ![F-Droid](https://img.shields.io/f-droid/v/me.austinhuang.insta
## Screenshots ## Screenshots
<a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg" alt="Profile" width="15%"/></a> <a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg" alt="Profile" width="15%"/></a>
<a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg" alt="Post" width="15%"/></a> <a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg" alt="Post" width="15%"/></a>
<a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg" alt="Comments" width="15%"/></a> <a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg" alt="Comments" width="15%"/></a>
<a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg" alt="Story" width="15%"/></a> <a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg" alt="Story" width="15%"/></a>
<a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg" alt="Hashtag" width="15%"/></a> <a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg" alt="Hashtag" width="15%"/></a>
<a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg" alt="Discover Topics" width="15%"/></a> <a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg" alt="Discover Topics" width="15%"/></a>
## We need maintainers! ## We need maintainers!

View File

@ -21,8 +21,8 @@ android {
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 29 targetSdkVersion 29
versionCode 62 versionCode 63
versionName '19.2.1' versionName '19.2.2'
multiDexEnabled true multiDexEnabled true

View File

@ -412,6 +412,7 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage
showBottomViewDestinations = currentTabs.stream() showBottomViewDestinations = currentTabs.stream()
.map(Tab::getStartDestinationFragmentId) .map(Tab::getStartDestinationFragmentId)
.collect(Collectors.toList()); .collect(Collectors.toList());
showBottomViewDestinations.add(R.id.postViewFragment);
if (setDefaultTabFromSettings) { if (setDefaultTabFromSettings) {
setSelectedTab(currentTabs); setSelectedTab(currentTabs);
} else { } else {

View File

@ -88,7 +88,7 @@ public final class StoryListViewerFragment extends Fragment implements SwipeRefr
public void onHighlightClick(final HighlightModel model, final int position) { public void onHighlightClick(final HighlightModel model, final int position) {
if (model == null) return; if (model == null) return;
final NavDirections action = StoryListViewerFragmentDirections final NavDirections action = StoryListViewerFragmentDirections
.actionStoryListFragmentToStoryViewerFragment(StoryViewerOptions.forStoryArchive(model.getId())); .actionStoryListFragmentToStoryViewerFragment(StoryViewerOptions.forStoryArchive(position));
NavHostFragment.findNavController(StoryListViewerFragment.this).navigate(action); NavHostFragment.findNavController(StoryListViewerFragment.this).navigate(action);
} }

View File

@ -132,7 +132,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
private HighlightsAdapter highlightsAdapter; private HighlightsAdapter highlightsAdapter;
private HighlightsViewModel highlightsViewModel; private HighlightsViewModel highlightsViewModel;
private MenuItem blockMenuItem, restrictMenuItem, chainingMenuItem; private MenuItem blockMenuItem, restrictMenuItem, chainingMenuItem;
private MenuItem muteStoriesMenuItem, mutePostsMenuItem; private MenuItem muteStoriesMenuItem, mutePostsMenuItem, removeFollowerMenuItem;
private boolean accountIsUpdated = false; private boolean accountIsUpdated = false;
private boolean postsSetupDone = false; private boolean postsSetupDone = false;
private Set<Media> selectedFeedModels; private Set<Media> selectedFeedModels;
@ -141,6 +141,23 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
private long myId; private long myId;
private PostsLayoutPreferences layoutPreferences = Utils.getPostsLayoutPreferences(Constants.PREF_PROFILE_POSTS_LAYOUT); private PostsLayoutPreferences layoutPreferences = Utils.getPostsLayoutPreferences(Constants.PREF_PROFILE_POSTS_LAYOUT);
private final ServiceCallback<FriendshipChangeResponse> changeCb = new ServiceCallback<FriendshipChangeResponse>() {
@Override
public void onSuccess(final FriendshipChangeResponse result) {
if (result.getFriendshipStatus() != null) {
profileModel.setFriendshipStatus(result.getFriendshipStatus());
setProfileDetails();
return;
}
fetchProfileDetails();
}
@Override
public void onFailure(final Throwable t) {
Log.e(TAG, "Error editing relationship", t);
}
};
private final Runnable usernameSettingRunnable = () -> { private final Runnable usernameSettingRunnable = () -> {
final ActionBar actionBar = fragmentActivity.getSupportActionBar(); final ActionBar actionBar = fragmentActivity.getSupportActionBar();
if (actionBar != null && !TextUtils.isEmpty(username)) { if (actionBar != null && !TextUtils.isEmpty(username)) {
@ -374,8 +391,9 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
@Override @Override
public void onCreateOptionsMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) { public void onCreateOptionsMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) {
inflater.inflate(R.menu.profile_menu, menu); inflater.inflate(R.menu.profile_menu, menu);
final boolean isNotMe = profileModel != null && isLoggedIn
&& !Objects.equals(profileModel.getPk(), CookieUtils.getUserIdFromCookie(cookie));
blockMenuItem = menu.findItem(R.id.block); blockMenuItem = menu.findItem(R.id.block);
final boolean isNotMe = profileModel != null && !Objects.equals(profileModel.getPk(), CookieUtils.getUserIdFromCookie(cookie));
if (blockMenuItem != null) { if (blockMenuItem != null) {
if (isNotMe) { if (isNotMe) {
blockMenuItem.setVisible(true); blockMenuItem.setVisible(true);
@ -415,6 +433,10 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
if (chainingMenuItem != null) { if (chainingMenuItem != null) {
chainingMenuItem.setVisible(isNotMe && profileModel.hasChaining()); chainingMenuItem.setVisible(isNotMe && profileModel.hasChaining());
} }
removeFollowerMenuItem = menu.findItem(R.id.remove_follower);
if (removeFollowerMenuItem != null) {
removeFollowerMenuItem.setVisible(isNotMe && profileModel.getFriendshipStatus().isFollowedBy());
}
} }
@Override @Override
@ -445,37 +467,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
} }
if (item.getItemId() == R.id.block) { if (item.getItemId() == R.id.block) {
if (!isLoggedIn) return false; if (!isLoggedIn) return false;
if (profileModel.getFriendshipStatus().isBlocking()) { friendshipService.changeBlock(profileModel.getFriendshipStatus().isBlocking(), profileModel.getPk(), changeCb);
friendshipService.unblock(
profileModel.getPk(),
new ServiceCallback<FriendshipChangeResponse>() {
@Override
public void onSuccess(final FriendshipChangeResponse result) {
Log.d(TAG, "Unblock success: " + result);
fetchProfileDetails();
}
@Override
public void onFailure(final Throwable t) {
Log.e(TAG, "Error unblocking", t);
}
});
return true;
}
friendshipService.block(
profileModel.getPk(),
new ServiceCallback<FriendshipChangeResponse>() {
@Override
public void onSuccess(final FriendshipChangeResponse result) {
Log.d(TAG, "Block success: " + result);
fetchProfileDetails();
}
@Override
public void onFailure(final Throwable t) {
Log.e(TAG, "Error blocking", t);
}
});
return true; return true;
} }
if (item.getItemId() == R.id.chaining) { if (item.getItemId() == R.id.chaining) {
@ -493,18 +485,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
profileModel.getFriendshipStatus().isMutingReel(), profileModel.getFriendshipStatus().isMutingReel(),
profileModel.getPk(), profileModel.getPk(),
true, true,
new ServiceCallback<FriendshipChangeResponse>() { changeCb);
@Override
public void onSuccess(final FriendshipChangeResponse result) {
Log.d(TAG, action + " success: " + result);
fetchProfileDetails();
}
@Override
public void onFailure(final Throwable t) {
Log.e(TAG, "Error while performing " + action, t);
}
});
return true; return true;
} }
if (item.getItemId() == R.id.mute_posts) { if (item.getItemId() == R.id.mute_posts) {
@ -514,18 +495,12 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
profileModel.getFriendshipStatus().isMuting(), profileModel.getFriendshipStatus().isMuting(),
profileModel.getPk(), profileModel.getPk(),
false, false,
new ServiceCallback<FriendshipChangeResponse>() { changeCb);
@Override return true;
public void onSuccess(final FriendshipChangeResponse result) { }
Log.d(TAG, action + " success: " + result); if (item.getItemId() == R.id.remove_follower) {
fetchProfileDetails(); if (!isLoggedIn) return false;
} friendshipService.removeFollower(profileModel.getPk(), changeCb);
@Override
public void onFailure(final Throwable t) {
Log.e(TAG, "Error while performing " + action, t);
}
});
return true; return true;
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
@ -973,6 +948,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
profileDetailsBinding.mainStatus.setText(R.string.status_mutual); profileDetailsBinding.mainStatus.setText(R.string.status_mutual);
} }
} }
else profileDetailsBinding.mainStatus.setVisibility(View.GONE);
if (profileModel.getFriendshipStatus().isFollowing()) { if (profileModel.getFriendshipStatus().isFollowing()) {
profileDetailsBinding.btnFollow.setText(R.string.unfollow); profileDetailsBinding.btnFollow.setText(R.string.unfollow);
profileDetailsBinding.btnFollow.setChipIconResource(R.drawable.ic_outline_person_add_disabled_24); profileDetailsBinding.btnFollow.setChipIconResource(R.drawable.ic_outline_person_add_disabled_24);
@ -1002,6 +978,9 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
if (chainingMenuItem != null) { if (chainingMenuItem != null) {
chainingMenuItem.setVisible(profileModel.hasChaining()); chainingMenuItem.setVisible(profileModel.hasChaining());
} }
if (removeFollowerMenuItem != null) {
removeFollowerMenuItem.setVisible(profileModel.getFriendshipStatus().isFollowedBy());
}
} }
} }
@ -1069,52 +1048,13 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
.setTitle(R.string.priv_acc) .setTitle(R.string.priv_acc)
.setMessage(R.string.priv_acc_confirm) .setMessage(R.string.priv_acc_confirm)
.setPositiveButton(R.string.confirm, (d, w) -> .setPositiveButton(R.string.confirm, (d, w) ->
friendshipService.unfollow( friendshipService.unfollow(profileModel.getPk(), changeCb))
profileModel.getPk(),
new ServiceCallback<FriendshipChangeResponse>() {
@Override
public void onSuccess(final FriendshipChangeResponse result) {
// Log.d(TAG, "Unfollow success: " + result);
fetchProfileDetails();
}
@Override
public void onFailure(final Throwable t) {
Log.e(TAG, "Error unfollowing", t);
}
}))
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.show(); .show();
} else if (profileModel.getFriendshipStatus().isFollowing() || profileModel.getFriendshipStatus().isOutgoingRequest()) { } else if (profileModel.getFriendshipStatus().isFollowing() || profileModel.getFriendshipStatus().isOutgoingRequest()) {
friendshipService.unfollow( friendshipService.unfollow(profileModel.getPk(), changeCb);
profileModel.getPk(),
new ServiceCallback<FriendshipChangeResponse>() {
@Override
public void onSuccess(final FriendshipChangeResponse result) {
// Log.d(TAG, "Unfollow success: " + result);
fetchProfileDetails();
}
@Override
public void onFailure(final Throwable t) {
Log.e(TAG, "Error unfollowing", t);
}
});
} else { } else {
friendshipService.follow( friendshipService.follow(profileModel.getPk(), changeCb);
profileModel.getPk(),
new ServiceCallback<FriendshipChangeResponse>() {
@Override
public void onSuccess(final FriendshipChangeResponse result) {
// Log.d(TAG, "Follow success: " + result);
fetchProfileDetails();
}
@Override
public void onFailure(final Throwable t) {
Log.e(TAG, "Error following", t);
}
});
} }
}); });
profileDetailsBinding.btnSaved.setOnClickListener(v -> { profileDetailsBinding.btnSaved.setOnClickListener(v -> {

View File

@ -1597,7 +1597,7 @@ public final class ThreadManager {
public LiveData<Resource<Object>> blockUser(final User user) { public LiveData<Resource<Object>> blockUser(final User user) {
final MutableLiveData<Resource<Object>> data = new MutableLiveData<>(); final MutableLiveData<Resource<Object>> data = new MutableLiveData<>();
if (user == null) return data; if (user == null) return data;
friendshipService.block(user.getPk(), new ServiceCallback<FriendshipChangeResponse>() { friendshipService.changeBlock(false, user.getPk(), new ServiceCallback<FriendshipChangeResponse>() {
@Override @Override
public void onSuccess(final FriendshipChangeResponse result) { public void onSuccess(final FriendshipChangeResponse result) {
refreshChats(); refreshChats();
@ -1615,7 +1615,7 @@ public final class ThreadManager {
public LiveData<Resource<Object>> unblockUser(final User user) { public LiveData<Resource<Object>> unblockUser(final User user) {
final MutableLiveData<Resource<Object>> data = new MutableLiveData<>(); final MutableLiveData<Resource<Object>> data = new MutableLiveData<>();
if (user == null) return data; if (user == null) return data;
friendshipService.unblock(user.getPk(), new ServiceCallback<FriendshipChangeResponse>() { friendshipService.changeBlock(true, user.getPk(), new ServiceCallback<FriendshipChangeResponse>() {
@Override @Override
public void onSuccess(final FriendshipChangeResponse result) { public void onSuccess(final FriendshipChangeResponse result) {
refreshChats(); refreshChats();

View File

@ -61,6 +61,10 @@ public class StoryViewerOptions implements Serializable {
return new StoryViewerOptions(id, Type.STORY_ARCHIVE); return new StoryViewerOptions(id, Type.STORY_ARCHIVE);
} }
public static StoryViewerOptions forStoryArchive(final int position) {
return new StoryViewerOptions(position, Type.STORY_ARCHIVE);
}
public long getId() { public long getId() {
return id; return id;
} }

View File

@ -82,8 +82,10 @@ public final class LocaleUtils {
case 20: return "ja"; case 20: return "ja";
case 21: return "el"; case 21: return "el";
case 22: return "eu"; case 22: return "eu";
case 23: return "sv";
case 24: return "ko";
} }
return null; return null;
} }
} }

View File

@ -78,14 +78,10 @@ public class FriendshipService extends BaseService {
change("destroy", targetUserId, callback); change("destroy", targetUserId, callback);
} }
public void block(final long targetUserId, public void changeBlock(final boolean unblock,
final ServiceCallback<FriendshipChangeResponse> callback) { final long targetUserId,
change("block", targetUserId, callback); final ServiceCallback<FriendshipChangeResponse> callback) {
} change(unblock ? "unblock" : "block", targetUserId, callback);
public void unblock(final long targetUserId,
final ServiceCallback<FriendshipChangeResponse> callback) {
change("unblock", targetUserId, callback);
} }
public void toggleRestrict(final long targetUserId, public void toggleRestrict(final long targetUserId,
@ -126,6 +122,11 @@ public class FriendshipService extends BaseService {
change("ignore", targetUserId, callback); change("ignore", targetUserId, callback);
} }
public void removeFollower(final long targetUserId,
final ServiceCallback<FriendshipChangeResponse> callback) {
change("remove_follower", targetUserId, callback);
}
private void change(final String action, private void change(final String action,
final long targetUserId, final long targetUserId,
final ServiceCallback<FriendshipChangeResponse> callback) { final ServiceCallback<FriendshipChangeResponse> callback) {

View File

@ -5,6 +5,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?colorSurface" android:background="?colorSurface"
android:paddingBottom="?attr/actionBarSize"
tools:context=".fragments.PostViewV2Fragment"> tools:context=".fragments.PostViewV2Fragment">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout

View File

@ -4,6 +4,7 @@
android:id="@+id/swipeRefreshLayout" android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:paddingBottom="?attr/actionBarSize"
tools:context=".fragments.NotificationsViewerFragment"> tools:context=".fragments.NotificationsViewerFragment">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView

View File

@ -7,6 +7,12 @@
android:title="@string/layout" android:title="@string/layout"
app:showAsAction="never" /> app:showAsAction="never" />
<item
android:id="@+id/chaining"
android:title="@string/action_ayml"
android:visible="false"
app:showAsAction="never" />
<item <item
android:id="@+id/block" android:id="@+id/block"
android:icon="@drawable/ic_block_24" android:icon="@drawable/ic_block_24"
@ -22,8 +28,9 @@
app:showAsAction="never" /> app:showAsAction="never" />
<item <item
android:id="@+id/chaining" android:id="@+id/remove_follower"
android:title="@string/action_ayml" android:icon="@drawable/ic_block_24"
android:title="@string/remove_follower"
android:visible="false" android:visible="false"
app:showAsAction="never" /> app:showAsAction="never" />

View File

@ -24,6 +24,8 @@
<item translatable="false">日本語</item> <item translatable="false">日本語</item>
<item translatable="false">Ελληνικά</item> <item translatable="false">Ελληνικά</item>
<item translatable="false">Euskara</item> <item translatable="false">Euskara</item>
<item translatable="false">Svenska</item>
<item translatable="false">한국어</item>
</string-array> </string-array>
<string-array name="theme_presets"> <string-array name="theme_presets">
<item>Auto / Follow System</item> <item>Auto / Follow System</item>

View File

@ -126,6 +126,7 @@
<string name="mute_posts">Mute posts</string> <string name="mute_posts">Mute posts</string>
<string name="unmute_stories">Unmute stories</string> <string name="unmute_stories">Unmute stories</string>
<string name="unmute_posts">Unmute posts</string> <string name="unmute_posts">Unmute posts</string>
<string name="remove_follower">Remove follower</string>
<string name="bio_copy">Copy bio</string> <string name="bio_copy">Copy bio</string>
<string name="bio_translate">Translate bio</string> <string name="bio_translate">Translate bio</string>
<string name="status_mutual">Mutual</string> <string name="status_mutual">Mutual</string>
@ -504,7 +505,7 @@
<string name="recent">Recent</string> <string name="recent">Recent</string>
<string name="clear">Clear</string> <string name="clear">Clear</string>
<string name="no_external_map_app">No Map app found!</string> <string name="no_external_map_app">No Map app found!</string>
<string name="click_to_show_full">Click to view full count</string> <string name="click_to_show_full">Click to show full like count</string>
<string name="no_profile_pic_found">No profile pic found!</string> <string name="no_profile_pic_found">No profile pic found!</string>
<string name="swipe_up_confirmation">Are you sure you want to open this link?</string> <string name="swipe_up_confirmation">Are you sure you want to open this link?</string>
</resources> </resources>

View File

@ -0,0 +1,3 @@
Search history, new comments/posts layout, and various improvements!
For details see https://github.com/austinhuang0131/barinsta/releases/tag/v19.2.2

View File

@ -1,6 +1,6 @@
If you don't upload posts or stories on Instagram, but can't get rid of it because of people and contents, you now have an alternative: Barinsta is a beautiful client that allows you to browse and interact with Instagram, while giving you more options to control your data. If you don't upload posts or stories on Instagram, but can't get rid of it because of people and contents, you now have an alternative: Barinsta is a beautiful client that allows you to browse and interact with Instagram, while giving you more options to control your data.
* For those not having an account, you can access public profiles/hashtags/locations! * For those not having an account, you can access public profiles/hashtags/locations (depends on availability)!
* For those logged in, Barinsta can achieve most viewing and interaction features, with extra features such as downloading posts/stories/avatars, copying texts, comparing followers/following, and more! * For those logged in, Barinsta can achieve most viewing and interaction features, with extra features such as downloading posts/stories/avatars, copying texts, comparing followers/following, and more!
Extra merits: Extra merits:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 771 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 592 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB