diff --git a/mastodon/build.gradle b/mastodon/build.gradle index 66296c4cf..d7adcd9be 100644 --- a/mastodon/build.gradle +++ b/mastodon/build.gradle @@ -12,6 +12,10 @@ android { versionCode 43 versionName "1.1.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + resConfigs "en", "ar-rSA", "bs-rBA", "ca-rES", "cs-rCZ", "de-rDE", "el-rGR", "es-rES", + "eu-rES", "fi-rFI", "fr-rFR", "gl-rES", "hr-rHR", "hy-rAM", "it-rIT", "iw-rIL", + "ja-rJP", "kab", "ko-rKR", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ru-rRU", + "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW" } buildTypes { diff --git a/mastodon/src/main/AndroidManifest.xml b/mastodon/src/main/AndroidManifest.xml index 23694aa2f..897069a9d 100644 --- a/mastodon/src/main/AndroidManifest.xml +++ b/mastodon/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ android:allowBackup="true" android:label="@string/app_name" android:supportsRtl="true" + android:localeConfig="@xml/locales_config" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:theme="@style/Theme.Mastodon.AutoLightDark" diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/ResizedImageRequestBody.java b/mastodon/src/main/java/org/joinmastodon/android/api/ResizedImageRequestBody.java index 1bc671781..674f5dc4b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/ResizedImageRequestBody.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/ResizedImageRequestBody.java @@ -12,6 +12,7 @@ import android.media.ExifInterface; import android.net.Uri; import android.os.Build; import android.provider.OpenableColumns; +import android.text.TextUtils; import org.joinmastodon.android.MastodonApp; import org.joinmastodon.android.ui.utils.UiUtils; @@ -48,6 +49,8 @@ public class ResizedImageRequestBody extends CountingRequestBody{ } contentType=MastodonApp.context.getContentResolver().getType(uri); } + if(TextUtils.isEmpty(contentType)) + contentType="image/jpeg"; if(needResize(opts.outWidth, opts.outHeight) || needCrop(opts.outWidth, opts.outHeight)){ Bitmap bitmap; if(Build.VERSION.SDK_INT>=28){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/events/StatusCountersUpdatedEvent.java b/mastodon/src/main/java/org/joinmastodon/android/events/StatusCountersUpdatedEvent.java index 1b006b09c..926f0bf67 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/events/StatusCountersUpdatedEvent.java +++ b/mastodon/src/main/java/org/joinmastodon/android/events/StatusCountersUpdatedEvent.java @@ -4,7 +4,7 @@ import org.joinmastodon.android.model.Status; public class StatusCountersUpdatedEvent{ public String id; - public int favorites, reblogs, replies; + public long favorites, reblogs, replies; public boolean favorited, reblogged; public StatusCountersUpdatedEvent(Status s){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index 288eb2d92..be33b4393 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -346,6 +346,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr spoilerEdit.setVisibility(View.VISIBLE); spoilerBtn.setSelected(true); }else if(editingStatus!=null && !TextUtils.isEmpty(editingStatus.spoilerText)){ + hasSpoiler=true; spoilerEdit.setVisibility(View.VISIBLE); spoilerEdit.setText(getArguments().getString("sourceSpoiler", editingStatus.spoilerText)); spoilerBtn.setSelected(true); @@ -365,6 +366,10 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr attachmentsView.addView(createMediaAttachmentView(att)); } } + + if(editingStatus!=null && editingStatus.visibility!=null) { + statusVisibility=editingStatus.visibility; + } updateVisibilityIcon(); autocompleteViewController=new ComposeAutocompleteViewController(getActivity(), accountID); @@ -389,16 +394,16 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr outState.putStringArrayList("pollOptions", opts); outState.putInt("pollDuration", pollDuration); outState.putString("pollDurationStr", pollDurationStr); - outState.putBoolean("hasSpoiler", hasSpoiler); - if(!attachments.isEmpty()){ - ArrayList serializedAttachments=new ArrayList<>(attachments.size()); - for(DraftMediaAttachment att:attachments){ - serializedAttachments.add(Parcels.wrap(att)); - } - outState.putParcelableArrayList("attachments", serializedAttachments); - } - outState.putSerializable("visibility", statusVisibility); } + outState.putBoolean("hasSpoiler", hasSpoiler); + if(!attachments.isEmpty()){ + ArrayList serializedAttachments=new ArrayList<>(attachments.size()); + for(DraftMediaAttachment att:attachments){ + serializedAttachments.add(Parcels.wrap(att)); + } + outState.putParcelableArrayList("attachments", serializedAttachments); + } + outState.putSerializable("visibility", statusVisibility); } @Override @@ -523,6 +528,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr da.serverAttachment=att; da.description=att.description; da.uri=Uri.parse(att.previewUrl); + da.state=AttachmentUploadState.DONE; attachmentsView.addView(createMediaAttachmentView(da)); attachments.add(da); } @@ -548,6 +554,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr if(editingStatus!=null){ updateCharCounter(); + visibilityBtn.setEnabled(false); } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java index b3f4d9fe0..5040c2f8b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -408,7 +408,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList private void bindHeaderView(){ setTitle(account.displayName); - setSubtitle(getResources().getQuantityString(R.plurals.x_posts, account.statusesCount, account.statusesCount)); + setSubtitle(getResources().getQuantityString(R.plurals.x_posts, (int)(account.statusesCount%1000), account.statusesCount)); ViewImageLoader.load(avatar, null, new UrlImageLoaderRequest(GlobalUserPreferences.playGifs ? account.avatar : account.avatarStatic, V.dp(100), V.dp(100))); ViewImageLoader.load(cover, null, new UrlImageLoaderRequest(GlobalUserPreferences.playGifs ? account.header : account.headerStatic, 1000, 1000)); SpannableStringBuilder ssb=new SpannableStringBuilder(account.displayName); @@ -445,9 +445,9 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList followersCount.setText(UiUtils.abbreviateNumber(account.followersCount)); followingCount.setText(UiUtils.abbreviateNumber(account.followingCount)); postsCount.setText(UiUtils.abbreviateNumber(account.statusesCount)); - followersLabel.setText(getResources().getQuantityString(R.plurals.followers, Math.min(999, account.followersCount))); - followingLabel.setText(getResources().getQuantityString(R.plurals.following, Math.min(999, account.followingCount))); - postsLabel.setText(getResources().getQuantityString(R.plurals.posts, Math.min(999, account.statusesCount))); + followersLabel.setText(getResources().getQuantityString(R.plurals.followers, (int)Math.min(999, account.followersCount))); + followingLabel.setText(getResources().getQuantityString(R.plurals.following, (int)Math.min(999, account.followingCount))); + postsLabel.setText(getResources().getQuantityString(R.plurals.posts, (int)Math.min(999, account.statusesCount))); UiUtils.loadCustomEmojiInTextView(name); UiUtils.loadCustomEmojiInTextView(bio); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/FollowerListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/FollowerListFragment.java index 3642fbacb..1a7b3c8e2 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/FollowerListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/FollowerListFragment.java @@ -12,7 +12,7 @@ public class FollowerListFragment extends AccountRelatedAccountListFragment{ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); - setSubtitle(getResources().getQuantityString(R.plurals.x_followers, account.followersCount, account.followersCount)); + setSubtitle(getResources().getQuantityString(R.plurals.x_followers, (int)(account.followersCount%1000), account.followersCount)); } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/FollowingListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/FollowingListFragment.java index d1daf9992..83351e751 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/FollowingListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/FollowingListFragment.java @@ -12,7 +12,7 @@ public class FollowingListFragment extends AccountRelatedAccountListFragment{ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); - setSubtitle(getResources().getQuantityString(R.plurals.x_following, account.followingCount, account.followingCount)); + setSubtitle(getResources().getQuantityString(R.plurals.x_following, (int)(account.followingCount%1000), account.followingCount)); } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/StatusFavoritesListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/StatusFavoritesListFragment.java index 50a71d62f..f62e40ac5 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/StatusFavoritesListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/StatusFavoritesListFragment.java @@ -11,7 +11,7 @@ public class StatusFavoritesListFragment extends StatusRelatedAccountListFragmen @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); - setTitle(getResources().getQuantityString(R.plurals.x_favorites, status.favouritesCount, status.favouritesCount)); + setTitle(getResources().getQuantityString(R.plurals.x_favorites, (int)(status.favouritesCount%1000), status.favouritesCount)); } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/StatusReblogsListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/StatusReblogsListFragment.java index e2cb0c0ad..6d494e198 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/StatusReblogsListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/StatusReblogsListFragment.java @@ -11,7 +11,7 @@ public class StatusReblogsListFragment extends StatusRelatedAccountListFragment{ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); - setTitle(getResources().getQuantityString(R.plurals.x_reblogs, status.reblogsCount, status.reblogsCount)); + setTitle(getResources().getQuantityString(R.plurals.x_reblogs, (int)(status.reblogsCount%1000), status.reblogsCount)); } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverAccountsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverAccountsFragment.java index 9216cf545..fb95db010 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverAccountsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverAccountsFragment.java @@ -220,9 +220,9 @@ public class DiscoverAccountsFragment extends BaseRecyclerFragment{ @Override public void onItemClick(String id){ SearchResult res=getResultByID(id); + if(res==null) + return; switch(res.type){ case ACCOUNT -> { Bundle args=new Bundle(); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/SignupFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/SignupFragment.java index f336d644e..041627c06 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/SignupFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/SignupFragment.java @@ -200,7 +200,6 @@ public class SignupFragment extends AppKitFragment{ @Override public void onSuccess(Token result){ progressDialog.dismiss(); - progressDialog=null; Account fakeAccount=new Account(); fakeAccount.acct=fakeAccount.username=username; fakeAccount.id="tmp"+System.currentTimeMillis(); @@ -238,7 +237,6 @@ public class SignupFragment extends AppKitFragment{ error.showToast(getActivity()); } progressDialog.dismiss(); - progressDialog=null; } }) .exec(instance.uri, apiToken); @@ -255,9 +253,11 @@ public class SignupFragment extends AppKitFragment{ } private void showProgressDialog(){ - progressDialog=new ProgressDialog(getActivity()); - progressDialog.setMessage(getString(R.string.loading)); - progressDialog.setCancelable(false); + if(progressDialog==null){ + progressDialog=new ProgressDialog(getActivity()); + progressDialog.setMessage(getString(R.string.loading)); + progressDialog.setCancelable(false); + } progressDialog.show(); } @@ -280,7 +280,6 @@ public class SignupFragment extends AppKitFragment{ if(submitAfterGettingToken){ submitAfterGettingToken=false; progressDialog.dismiss(); - progressDialog=null; error.showToast(getActivity()); } } @@ -307,7 +306,6 @@ public class SignupFragment extends AppKitFragment{ if(submitAfterGettingToken){ submitAfterGettingToken=false; progressDialog.dismiss(); - progressDialog=null; error.showToast(getActivity()); } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Account.java b/mastodon/src/main/java/org/joinmastodon/android/model/Account.java index e510d717f..47d99bc3c 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Account.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Account.java @@ -96,15 +96,15 @@ public class Account extends BaseModel{ /** * How many statuses are attached to this account. */ - public int statusesCount; + public long statusesCount; /** * The reported followers of this profile. */ - public int followersCount; + public long followersCount; /** * The reported follows of this profile. */ - public int followingCount; + public long followingCount; // Optional attributes diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java index a531baa0f..47eeb641f 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java @@ -34,9 +34,9 @@ public class Status extends BaseModel implements DisplayItemsParent{ public List tags; @RequiredField public List emojis; - public int reblogsCount; - public int favouritesCount; - public int repliesCount; + public long reblogsCount; + public long favouritesCount; + public long repliesCount; public Instant editedAt; public String url; diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/AccountCardStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/AccountCardStatusDisplayItem.java index 196aa51af..9fb35ddeb 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/AccountCardStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/AccountCardStatusDisplayItem.java @@ -115,9 +115,9 @@ public class AccountCardStatusDisplayItem extends StatusDisplayItem{ followersCount.setText(UiUtils.abbreviateNumber(item.account.followersCount)); followingCount.setText(UiUtils.abbreviateNumber(item.account.followingCount)); postsCount.setText(UiUtils.abbreviateNumber(item.account.statusesCount)); - followersLabel.setText(item.parentFragment.getResources().getQuantityString(R.plurals.followers, Math.min(999, item.account.followersCount))); - followingLabel.setText(item.parentFragment.getResources().getQuantityString(R.plurals.following, Math.min(999, item.account.followingCount))); - postsLabel.setText(item.parentFragment.getResources().getQuantityString(R.plurals.posts, Math.min(999, item.account.statusesCount))); + followersLabel.setText(item.parentFragment.getResources().getQuantityString(R.plurals.followers, (int)Math.min(999, item.account.followersCount))); + followingLabel.setText(item.parentFragment.getResources().getQuantityString(R.plurals.following, (int)Math.min(999, item.account.followingCount))); + postsLabel.setText(item.parentFragment.getResources().getQuantityString(R.plurals.posts, (int)Math.min(999, item.account.statusesCount))); relationship=item.parentFragment.getRelationship(item.account.id); if(relationship==null){ actionWrap.setVisibility(View.GONE); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FooterStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FooterStatusDisplayItem.java index 776585cd7..7fb6c4a3a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FooterStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FooterStatusDisplayItem.java @@ -91,7 +91,7 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{ || (item.status.visibility==StatusPrivacy.PRIVATE && item.status.account.id.equals(AccountSessionManager.getInstance().getAccount(item.accountID).self.id))); } - private void bindButton(TextView btn, int count){ + private void bindButton(TextView btn, long count){ if(count>0 && !item.hideCounts){ btn.setText(DecimalFormat.getIntegerInstance().format(count)); btn.setCompoundDrawablePadding(V.dp(8)); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index 2d77b18fa..8a0a02469 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -182,6 +182,15 @@ public class UiUtils{ } } + @SuppressLint("DefaultLocale") + public static String abbreviateNumber(long n){ + if(n<1_000_000_000L) + return abbreviateNumber((int)n); + + double a=n/1_000_000_000.0; + return a>99f ? String.format("%,dB", (int)Math.floor(a)) : String.format("%,.1fB", n/1_000_000_000.0); + } + /** * Android 6.0 has a bug where start and end compound drawables don't get tinted. * This works around it by setting the tint colors directly to the drawables. diff --git a/mastodon/src/main/res/xml/locales_config.xml b/mastodon/src/main/res/xml/locales_config.xml new file mode 100644 index 000000000..67b222e06 --- /dev/null +++ b/mastodon/src/main/res/xml/locales_config.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file