Precompute text

This commit is contained in:
M66B 2020-02-10 14:16:11 +01:00
parent fea6abfc54
commit f5fd230877
2 changed files with 41 additions and 8 deletions

View File

@ -103,6 +103,8 @@ import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Group;
import androidx.core.content.FileProvider;
import androidx.core.graphics.ColorUtils;
import androidx.core.text.PrecomputedTextCompat;
import androidx.core.widget.TextViewCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
@ -1810,7 +1812,16 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
s, e, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
}
return builder;
try {
return PrecomputedTextCompat.getTextFuture(
builder,
TextViewCompat.getTextMetricsParams(tvBody),
executor)
.get();
} catch (Throwable ex) {
Log.w(ex);
return builder;
}
}
}
@ -1828,7 +1839,12 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
boolean has_images = args.getBoolean("has_images");
if (result instanceof Spanned) {
if (result instanceof PrecomputedTextCompat) {
TextViewCompat.setPrecomputedText(tvBody, (PrecomputedTextCompat) result);
tvBody.setTextIsSelectable(false);
tvBody.setTextIsSelectable(true);
tvBody.setMovementMethod(new TouchHandler(message));
} else if (result instanceof Spanned) {
tvBody.setText((Spanned) result);
tvBody.setTextIsSelectable(false);
tvBody.setTextIsSelectable(true);

View File

@ -90,6 +90,8 @@ import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.PopupMenu;
import androidx.constraintlayout.widget.Group;
import androidx.core.content.FileProvider;
import androidx.core.text.PrecomputedTextCompat;
import androidx.core.widget.TextViewCompat;
import androidx.cursoradapter.widget.SimpleCursorAdapter;
import androidx.documentfile.provider.DocumentFile;
import androidx.fragment.app.Fragment;
@ -4005,7 +4007,7 @@ public class FragmentCompose extends FragmentBase {
args.putLong("id", draft.id);
args.putBoolean("show_images", show_images);
new SimpleTask<Spanned[]>() {
new SimpleTask<Object[]>() {
@Override
protected void onPreExecute(Bundle args) {
// Needed to get width for images
@ -4029,7 +4031,7 @@ public class FragmentCompose extends FragmentBase {
}
@Override
protected Spanned[] onExecute(final Context context, Bundle args) throws Throwable {
protected Object[] onExecute(final Context context, Bundle args) throws Throwable {
final long id = args.getLong("id");
final boolean show_images = args.getBoolean("show_images", false);
@ -4094,12 +4096,24 @@ public class FragmentCompose extends FragmentBase {
args.putBoolean("ref_has_images", spannedRef != null &&
spannedRef.getSpans(0, spannedRef.length(), ImageSpan.class).length > 0);
return new Spanned[]{spannedBody, spannedRef};
PrecomputedTextCompat precomputed = null;
if (spannedRef != null)
try {
precomputed = PrecomputedTextCompat.getTextFuture(
spannedRef,
TextViewCompat.getTextMetricsParams(tvReference),
null)
.get();
} catch (Throwable ex) {
Log.w(ex);
}
return new Spanned[]{spannedBody, precomputed == null ? spannedRef : precomputed};
}
@Override
protected void onExecuted(Bundle args, Spanned[] text) {
etBody.setText(text[0]);
protected void onExecuted(Bundle args, Object[] text) {
etBody.setText((Spanned) text[0]);
etBody.setSelection(0);
grpBody.setVisibility(View.VISIBLE);
@ -4111,7 +4125,10 @@ public class FragmentCompose extends FragmentBase {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
boolean ref_hint = prefs.getBoolean("compose_reference", true);
tvReference.setText(text[1]);
if (text[1] instanceof PrecomputedTextCompat)
TextViewCompat.setPrecomputedText(tvReference, (PrecomputedTextCompat) text[1]);
else
tvReference.setText((Spanned) text[1]);
tvReference.setVisibility(text[1] == null ? View.GONE : View.VISIBLE);
grpReferenceHint.setVisibility(text[1] == null || !ref_hint ? View.GONE : View.VISIBLE);
ibReferenceEdit.setVisibility(text[1] == null ? View.GONE : View.VISIBLE);