From a5593cd5172e41750f4c5f986f1467ef0a499594 Mon Sep 17 00:00:00 2001 From: stom79 Date: Sun, 3 Dec 2017 11:14:52 +0100 Subject: [PATCH] Deals with translations --- .../mastodon/activities/TootActivity.java | 2 +- .../mastodon/client/Entities/Status.java | 54 +++++++++----- .../drawers/NotificationsListAdapter.java | 15 ++-- .../mastodon/drawers/StatusListAdapter.java | 72 +++++++++++-------- 4 files changed, 88 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java index af64ac9f3..da5d82726 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java @@ -1581,7 +1581,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc } @Override - public void onRetrieveEmoji(Status status, SpannableString spannableString, Boolean error) { + public void onRetrieveEmoji(Status status) { } 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 2bb6b4fe9..60fd2e84e 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 @@ -443,7 +443,7 @@ public class Status implements Parcelable { public void makeClickable(Context context){ - SpannableString spannableStringContent, spannableStringCW, spannableStringTranslated; + SpannableString spannableStringContent, spannableStringCW; 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)); else @@ -455,22 +455,31 @@ public class Status implements Parcelable { //noinspection deprecation spannableStringCW = new SpannableString(Html.fromHtml(status.getReblog() != null ?status.getReblog().getSpoiler_text():status.getSpoiler_text())); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContent_translated(), Html.FROM_HTML_MODE_LEGACY)); - else - //noinspection deprecation - spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContent_translated())); - status.setContentSpan(treatment(context, spannableStringContent)); status.setContentSpanCW(treatment(context, spannableStringCW)); - status.setContentSpanTranslated(treatment(context, spannableStringTranslated)); isClickable = true; } + public void makeClickableTranslation(Context context){ + + SpannableString spannableStringTranslated; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) + spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContent_translated(), Html.FROM_HTML_MODE_LEGACY)); + else + //noinspection deprecation + spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContent_translated())); + + status.setContentSpanTranslated(treatment(context, spannableStringTranslated)); + } + + + public void makeEmojis(final Context context, final OnRetrieveEmojiInterface listener){ - final SpannableString spannableStringContent, spannableStringCW, spannableStringTranslated; + final SpannableString spannableStringContent; + final SpannableString spannableStringCW; + SpannableString spannableStringTranslated = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) @@ -478,22 +487,27 @@ public class Status implements Parcelable { 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)); else //noinspection deprecation spannableStringCW = new SpannableString(Html.fromHtml(status.getReblog() != null ?status.getReblog().getSpoiler_text():status.getSpoiler_text())); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContent_translated(), Html.FROM_HTML_MODE_LEGACY)); - else - //noinspection deprecation - spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContent_translated())); + if( status.getContent_translated() != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) + spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContent_translated(), Html.FROM_HTML_MODE_LEGACY)); + else + //noinspection deprecation + spannableStringTranslated = new SpannableString(Html.fromHtml(status.getContent_translated())); + } final List emojis = status.getReblog() != null ? status.getReblog().getEmojis() : status.getEmojis(); if( emojis != null && emojis.size() > 0 ) { final int[] i = {0}; for (final Emojis emoji : emojis) { + final SpannableString finalSpannableStringTranslated = spannableStringTranslated; Glide.with(context) .asBitmap() .load(emoji.getUrl()) @@ -509,7 +523,8 @@ public class Status implements Parcelable { if( i[0] == (emojis.size())) { status.setContentSpan(spannableStringContent); status.setContentSpanCW(spannableStringCW); - status.setContentSpanTranslated(spannableStringTranslated); + if( finalSpannableStringTranslated != null) + status.setContentSpanTranslated(finalSpannableStringTranslated); listener.onRetrieveEmoji(status); } return false; @@ -541,11 +556,11 @@ public class Status implements Parcelable { endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); } } - if (spannableStringTranslated.toString().contains(targetedEmoji)) { + if (finalSpannableStringTranslated != null && finalSpannableStringTranslated.toString().contains(targetedEmoji)) { //emojis can be used several times so we have to loop - for (int startPosition = -1; (startPosition = spannableStringTranslated.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { + for (int startPosition = -1; (startPosition = finalSpannableStringTranslated.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { final int endPosition = startPosition + targetedEmoji.length(); - spannableStringTranslated.setSpan( + finalSpannableStringTranslated.setSpan( new ImageSpan(context, Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(20, context), (int) Helper.convertDpToPixel(20, context), false)), startPosition, @@ -556,7 +571,8 @@ public class Status implements Parcelable { if( i[0] == (emojis.size())) { status.setContentSpan(spannableStringContent); status.setContentSpanCW(spannableStringCW); - status.setContentSpanTranslated(spannableStringTranslated); + if( finalSpannableStringTranslated != null) + status.setContentSpanTranslated(finalSpannableStringTranslated); listener.onRetrieveEmoji(status); } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java index b3a845939..dd8e4a416 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java @@ -248,7 +248,12 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On holder.notification_status_content.setTypeface(tf); String content; - if( status.getContents() != null){ + if( !status.isClickable()) + status.makeClickable(context); + if( !status.isEmojiFound()) + status.makeEmojis(context, NotificationsListAdapter.this); + + /*if( status.getContents() != null){ holder.notification_status_content.setText(status.getContents(), TextView.BufferType.SPANNABLE); }else { content = status.getContent(); @@ -267,8 +272,9 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On position, true, NotificationsListAdapter.this);*/ - holder.notification_status_content.setText(spannableString, TextView.BufferType.SPANNABLE); - } + // holder.notification_status_content.setText(spannableString, TextView.BufferType.SPANNABLE); + //} + holder.notification_status_content.setMovementMethod(null); holder.notification_status_content.setMovementMethod(LinkMovementMethod.getInstance()); holder.status_favorite_count.setText(String.valueOf(status.getFavourites_count())); @@ -900,8 +906,7 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On @Override - public void onRetrieveEmoji(Status status, SpannableString spannableString, Boolean error) { - status.setContents(spannableString); + public void onRetrieveEmoji(Status status) { if( !status.isEmojiFound()) { for (int i = 0; i < notificationsListAdapter.getItemCount(); i++) { if (notificationsListAdapter.getItemAt(i) != null && notificationsListAdapter.getItemAt(i).getStatus() != null && notificationsListAdapter.getItemAt(i).getStatus().getId().equals(status.getId())) { 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 dae6750ce..970ba655d 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 @@ -468,6 +468,43 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_spoiler.setText(status.getContentSpanCW()); + //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() ){ + myTransL.translate(status.getContent(), myTransL.getLocale(), new Results() { + @Override + public void onSuccess(Translate translate) { + if( translate.getTranslatedContent() != null) { + status.setTranslated(true); + status.setTranslationShown(true); + status.setContent_translated(translate.getTranslatedContent()); + status.makeClickableTranslation(context); + holder.status_content_translated.setMovementMethod(LinkMovementMethod.getInstance()); + statusListAdapter.notifyDataSetChanged(); + }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()); + statusListAdapter.notifyDataSetChanged(); + } + } + }); + //-------- END -> Manages translations + + + //Displays name & emoji in toot header final String displayName; final String username; @@ -743,8 +780,11 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct imgReply = ContextCompat.getDrawable(context, R.drawable.ic_reply); + assert imgFav != null; imgFav.setBounds(0,0,(int) (20 * iconSizePercent/100 * scale + 0.5f),(int) (20 * iconSizePercent/100 * scale + 0.5f)); + assert imgReblog != null; imgReblog.setBounds(0,0,(int) (20 * iconSizePercent/100 * scale + 0.5f),(int) (20 * iconSizePercent/100 * scale + 0.5f)); + assert imgReply != null; imgReply.setBounds(0,0,(int) (20 * iconSizePercent/100 * scale + 0.5f),(int) (20 * iconSizePercent/100 * scale + 0.5f)); holder.status_favorite_count.setCompoundDrawables(imgFav, null, null, null); @@ -767,6 +807,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct changeDrawableColor(context, R.drawable.ic_pin_drop,R.color.black); imgPin = ContextCompat.getDrawable(context, R.drawable.ic_pin_drop); } + assert imgPin != null; imgPin.setBounds(0,0,(int) (20 * iconSizePercent/100 * scale + 0.5f),(int) (20 * iconSizePercent/100 * scale + 0.5f)); holder.status_pin.setImageDrawable(imgPin); @@ -884,36 +925,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct return false; } }); - 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() ){ - myTransL.translate(status.getContent(), myTransL.getLocale(), new Results() { - @Override - public void onSuccess(Translate translate) { - if( translate.getTranslatedContent() != null) { - status.setTranslated(true); - status.setTranslationShown(true); - status.setContent_translated(translate.getTranslatedContent()); - statusListAdapter.notifyDataSetChanged(); - }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()); - statusListAdapter.notifyDataSetChanged(); - } - } - }); + holder.yandex_translate.setOnClickListener(new View.OnClickListener() { @Override