diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java index 92d4cf87a..5e208ffad 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java @@ -451,13 +451,21 @@ public class Status implements Parcelable{ if( (status.getReblog() != null && status.getReblog().getContent() == null) || (status.getReblog() == null && status.getContent() == null)) return; + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + boolean isCompactMode = sharedpreferences.getBoolean(Helper.SET_COMPACT_MODE, false); + int mode; + if( isCompactMode) + mode = Html.FROM_HTML_MODE_COMPACT; + else + mode = Html.FROM_HTML_MODE_LEGACY; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - spannableStringContent = new SpannableString(Html.fromHtml(status.getReblog() != null ?status.getReblog().getContent():status.getContent(), Html.FROM_HTML_MODE_LEGACY)); + spannableStringContent = new SpannableString(Html.fromHtml(status.getReblog() != null ?status.getReblog().getContent():status.getContent(), mode)); else //noinspection deprecation spannableStringContent = new SpannableString(Html.fromHtml(status.getReblog() != null ?status.getReblog().getContent():status.getContent())); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - spannableStringCW = new SpannableString(Html.fromHtml(status.getReblog() != null ?status.getReblog().getSpoiler_text():status.getSpoiler_text(), Html.FROM_HTML_MODE_LEGACY)); + spannableStringCW = new SpannableString(Html.fromHtml(status.getReblog() != null ?status.getReblog().getSpoiler_text():status.getSpoiler_text(), mode)); else //noinspection deprecation spannableStringCW = new SpannableString(Html.fromHtml(status.getReblog() != null ?status.getReblog().getSpoiler_text():status.getSpoiler_text())); @@ -474,9 +482,16 @@ public class Status implements Parcelable{ return; if( (status.getReblog() != null && status.getReblog().getContent() == null) || (status.getReblog() == null && status.getContent() == null)) return; + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + boolean isCompactMode = sharedpreferences.getBoolean(Helper.SET_COMPACT_MODE, false); + int mode; + if( isCompactMode) + mode = Html.FROM_HTML_MODE_COMPACT; + else + mode = Html.FROM_HTML_MODE_LEGACY; SpannableString spannableStringTranslated; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContentTranslated(), Html.FROM_HTML_MODE_LEGACY)); + spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContentTranslated(), mode)); else //noinspection deprecation spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContentTranslated())); @@ -558,10 +573,16 @@ public class Status implements Parcelable{ if( ((Activity)context).isFinishing() ) return; SpannableString spannableStringTranslated = null; - + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + boolean isCompactMode = sharedpreferences.getBoolean(Helper.SET_COMPACT_MODE, false); + int mode; + if( isCompactMode) + mode = Html.FROM_HTML_MODE_COMPACT; + else + mode = Html.FROM_HTML_MODE_LEGACY; if( status.getContentTranslated() != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContentTranslated(), Html.FROM_HTML_MODE_LEGACY)); + spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContentTranslated(), mode)); else //noinspection deprecation spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContentTranslated())); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java index 85109fad1..57e63ff23 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java @@ -140,6 +140,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct private String targetedId; private final int DISPLAYED_STATUS = 1; private final int FOCUSED_STATUS = 2; + private final int COMPACT_STATUS = 3; private int conversationPosition; private List timedMute; @@ -224,7 +225,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { super.onViewAttachedToWindow(holder); - if( holder.getItemViewType() == DISPLAYED_STATUS) { + if( holder.getItemViewType() == DISPLAYED_STATUS || holder.getItemViewType() == COMPACT_STATUS) { final ViewHolder viewHolder = (ViewHolder) holder; // Bug workaround for losing text selection ability, see: // https://code.google.com/p/android/issues/detail?id=208169 @@ -374,10 +375,11 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct Status status = statuses.get(position); SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + boolean isCompactMode = sharedpreferences.getBoolean(Helper.SET_COMPACT_MODE, false); int HIDDEN_STATUS = 0; String filter; if( type == RetrieveFeedsAsyncTask.Type.CACHE_BOOKMARKS) - return DISPLAYED_STATUS; + return isCompactMode?COMPACT_STATUS:DISPLAYED_STATUS; else if( type == RetrieveFeedsAsyncTask.Type.CONTEXT && position == conversationPosition) return FOCUSED_STATUS; else if( type == RetrieveFeedsAsyncTask.Type.HOME) @@ -410,9 +412,9 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if (timedMute.contains(status.getAccount().getId())) return HIDDEN_STATUS; else - return DISPLAYED_STATUS; + return isCompactMode?COMPACT_STATUS:DISPLAYED_STATUS; }else { - return DISPLAYED_STATUS; + return isCompactMode?COMPACT_STATUS:DISPLAYED_STATUS; } } }else { @@ -422,9 +424,9 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct else if( status.getIn_reply_to_id() != null && !status.getIn_reply_to_id().equals("null") && !((ShowAccountActivity)context).showReplies()) return HIDDEN_STATUS; else - return DISPLAYED_STATUS; + return isCompactMode?COMPACT_STATUS:DISPLAYED_STATUS; }else - return DISPLAYED_STATUS; + return isCompactMode?COMPACT_STATUS:DISPLAYED_STATUS; } } @@ -433,6 +435,8 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if( viewType == DISPLAYED_STATUS) return new ViewHolder(layoutInflater.inflate(R.layout.drawer_status, parent, false)); + else if(viewType == COMPACT_STATUS) + return new ViewHolder(layoutInflater.inflate(R.layout.drawer_status_compact, parent, false)); else if(viewType == FOCUSED_STATUS) return new ViewHolder(layoutInflater.inflate(R.layout.drawer_status_focused, parent, false)); else @@ -444,7 +448,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct @Override public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int position) { - if( viewHolder.getItemViewType() == DISPLAYED_STATUS || viewHolder.getItemViewType() == FOCUSED_STATUS){ + if( viewHolder.getItemViewType() == DISPLAYED_STATUS || viewHolder.getItemViewType() == FOCUSED_STATUS || viewHolder.getItemViewType() == COMPACT_STATUS){ final ViewHolder holder = (ViewHolder) viewHolder; final Status status = statuses.get(position); @@ -463,7 +467,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct boolean displayBookmarkButton = sharedpreferences.getBoolean(Helper.SET_SHOW_BOOKMARK, true); boolean fullAttachement = sharedpreferences.getBoolean(Helper.SET_FULL_PREVIEW, false); - if( displayBookmarkButton) + if( getItemViewType(position) != COMPACT_STATUS && displayBookmarkButton) holder.status_bookmark.setVisibility(View.VISIBLE); else holder.status_bookmark.setVisibility(View.GONE); @@ -568,6 +572,11 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct else changeDrawableColor(context, R.drawable.ic_fiber_new,R.color.mastodonC4); + if( getItemViewType(position) == COMPACT_STATUS ) + holder.status_privacy.setVisibility(View.GONE); + else + holder.status_privacy.setVisibility(View.VISIBLE); + boolean expand_cw = sharedpreferences.getBoolean(Helper.SET_EXPAND_CW, false); if( theme == Helper.THEME_DARK || theme == Helper.THEME_BLACK){ changeDrawableColor(context, R.drawable.ic_reply,R.color.dark_icon); @@ -625,44 +634,11 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_spoiler.setText(status.getContentSpanCW(), TextView.BufferType.SPANNABLE); holder.status_content.setMovementMethod(LinkMovementMethod.getInstance()); holder.status_spoiler.setMovementMethod(LinkMovementMethod.getInstance()); - //Manages translations - final MyTransL myTransL = MyTransL.getInstance(MyTransL.translatorEngine.YANDEX); - myTransL.setObfuscation(true); - myTransL.setYandexAPIKey(Helper.YANDEX_KEY); + holder.status_translate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if( !status.isTranslated() ){ - String statusToTranslate; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - statusToTranslate = Html.fromHtml(status.getReblog() != null ?status.getReblog().getContent():status.getContent(), Html.FROM_HTML_MODE_LEGACY).toString(); - else - //noinspection deprecation - statusToTranslate = Html.fromHtml(status.getReblog() != null ?status.getReblog().getContent():status.getContent()).toString(); - //TODO: removes the replaceAll once fixed with the lib - myTransL.translate(statusToTranslate, myTransL.getLocale(), new Results() { - @Override - public void onSuccess(Translate translate) { - if( translate.getTranslatedContent() != null) { - status.setTranslated(true); - status.setTranslationShown(true); - status.setContentTranslated(translate.getTranslatedContent()); - status.makeClickableTranslation(context); - status.makeEmojisTranslation(context, StatusListAdapter.this); - notifyStatusChanged(status); - }else { - Toast.makeText(context, R.string.toast_error_translate, Toast.LENGTH_LONG).show(); - } - } - @Override - public void onFail(HttpsConnectionException e) { - Toast.makeText(context, R.string.toast_error_translate, Toast.LENGTH_LONG).show(); - } - }); - }else { - status.setTranslationShown(!status.isTranslationShown()); - notifyStatusChanged(status); - } + translateToot(status); } }); @@ -763,7 +739,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_mention_spoiler.setMovementMethod(LinkMovementMethod.getInstance()); boolean displayBoost = sharedpreferences.getBoolean(Helper.SET_DISPLAY_BOOST_COUNT, true); - if( displayBoost) { + if( getItemViewType(position) != COMPACT_STATUS && displayBoost) { if( status.getReblog() == null) holder.status_favorite_count.setText(String.valueOf(status.getFavourites_count())); else @@ -795,7 +771,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_account_profile.setVisibility(View.VISIBLE); } holder.status_action_container.setVisibility(View.VISIBLE); - if( trans_forced || (translator != Helper.TRANS_NONE && currentLocale != null && status.getLanguage() != null && !status.getLanguage().trim().equals(currentLocale))){ + if( ( getItemViewType(position) != COMPACT_STATUS ) && (trans_forced || (translator != Helper.TRANS_NONE && currentLocale != null && status.getLanguage() != null && !status.getLanguage().trim().equals(currentLocale)))){ holder.status_translate.setVisibility(View.VISIBLE); }else { holder.status_translate.setVisibility(View.GONE); @@ -1418,6 +1394,9 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct builderInner.setTitle(stringArrayConf[1]); doAction = API.StatusAction.BLOCK; break; + case R.id.action_translate: + translateToot(status); + return true; case R.id.action_report: builderInner = new AlertDialog.Builder(context); builderInner.setTitle(stringArrayConf[2]); @@ -1584,6 +1563,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if( status.getApplication() != null && getItemViewType(position) == FOCUSED_STATUS){ Application application = status.getApplication(); holder.status_toot_app.setText(application.getName()); + holder.status_toot_app.setVisibility(View.VISIBLE); if( application.getWebsite() != null && !application.getWebsite().trim().equals("null")) holder.status_toot_app.setOnClickListener(new View.OnClickListener() { @Override @@ -1591,6 +1571,8 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct Helper.openBrowser(context, application.getWebsite()); } }); + }else { + holder.status_toot_app.setVisibility(View.GONE); } } } @@ -1968,4 +1950,42 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } + + private void translateToot(Status status){ + //Manages translations + final MyTransL myTransL = MyTransL.getInstance(MyTransL.translatorEngine.YANDEX); + myTransL.setObfuscation(true); + myTransL.setYandexAPIKey(Helper.YANDEX_KEY); + if( !status.isTranslated() ){ + String statusToTranslate; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) + statusToTranslate = Html.fromHtml(status.getReblog() != null ?status.getReblog().getContent():status.getContent(), Html.FROM_HTML_MODE_LEGACY).toString(); + else + //noinspection deprecation + statusToTranslate = Html.fromHtml(status.getReblog() != null ?status.getReblog().getContent():status.getContent()).toString(); + //TODO: removes the replaceAll once fixed with the lib + myTransL.translate(statusToTranslate, myTransL.getLocale(), new Results() { + @Override + public void onSuccess(Translate translate) { + if( translate.getTranslatedContent() != null) { + status.setTranslated(true); + status.setTranslationShown(true); + status.setContentTranslated(translate.getTranslatedContent()); + status.makeClickableTranslation(context); + status.makeEmojisTranslation(context, StatusListAdapter.this); + notifyStatusChanged(status); + }else { + Toast.makeText(context, R.string.toast_error_translate, Toast.LENGTH_LONG).show(); + } + } + @Override + public void onFail(HttpsConnectionException e) { + Toast.makeText(context, R.string.toast_error_translate, Toast.LENGTH_LONG).show(); + } + }); + }else { + status.setTranslationShown(!status.isTranslationShown()); + notifyStatusChanged(status); + } + } } \ No newline at end of file diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/SettingsFragment.java b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/SettingsFragment.java index 798fd91fd..3ad7efb62 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/SettingsFragment.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/SettingsFragment.java @@ -225,6 +225,19 @@ public class SettingsFragment extends Fragment { } }); + boolean compact_mode = sharedpreferences.getBoolean(Helper.SET_COMPACT_MODE, false); + final CheckBox set_compact_mode = rootView.findViewById(R.id.set_compact_mode); + set_compact_mode.setChecked(compact_mode); + + set_compact_mode.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putBoolean(Helper.SET_COMPACT_MODE, set_compact_mode.isChecked()); + editor.apply(); + } + }); + boolean multiaccount_actions = sharedpreferences.getBoolean(Helper.SET_ALLOW_CROSS_ACTIONS, true); final CheckBox set_multiaccount_actions = rootView.findViewById(R.id.set_multiaccount_actions); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java index e4992e3f1..ca0c93862 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java @@ -242,6 +242,7 @@ public class Helper { public static final String SET_PICTURE_RESIZE = "set_picture_resize"; public static final String SET_SHOW_BOOKMARK = "set_show_bookmark"; public static final String SET_FULL_PREVIEW = "set_full_preview"; + public static final String SET_COMPACT_MODE = "set_compact_mode"; public static final int S_512KO = 1; public static final int S_1MO = 2; public static final int S_2MO = 3; diff --git a/app/src/main/res/layout-sw600dp/fragment_settings.xml b/app/src/main/res/layout-sw600dp/fragment_settings.xml index 8bda1cb0e..9b33d6571 100644 --- a/app/src/main/res/layout-sw600dp/fragment_settings.xml +++ b/app/src/main/res/layout-sw600dp/fragment_settings.xml @@ -164,6 +164,14 @@ android:text="@string/set_fit_preview" android:layout_height="wrap_content" /> + + + + + + + + + + + + + + + + + + + + + + + + +