Added color to answers

This commit is contained in:
M66B
2022-01-22 10:16:00 +01:00
parent bcfa1c37a2
commit 84f56a589d
7 changed files with 2799 additions and 12 deletions

View File

@@ -21,6 +21,7 @@ package eu.faircode.email;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.SpannableString;
@@ -70,6 +71,7 @@ public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
private View view;
private View vwColor;
private TextView tvName;
private TextView tvGroup;
private ImageView ivExternal;
@@ -85,6 +87,7 @@ public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder
super(itemView);
view = itemView.findViewById(R.id.clItem);
vwColor = itemView.findViewById(R.id.vwColor);
tvName = itemView.findViewById(R.id.tvName);
tvGroup = itemView.findViewById(R.id.tvGroup);
ivExternal = itemView.findViewById(R.id.ivExternal);
@@ -107,6 +110,7 @@ public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder
private void bindTo(EntityAnswer answer) {
view.setAlpha(answer.hide ? Helper.LOW_LIGHT : 1.0f);
vwColor.setBackgroundColor(answer.color == null ? Color.TRANSPARENT : answer.color);
tvName.setText(answer.name);
tvGroup.setText(answer.group);
tvGroup.setVisibility(TextUtils.isEmpty(answer.group) ? View.GONE : View.VISIBLE);

View File

@@ -71,7 +71,7 @@ import io.requery.android.database.sqlite.SQLiteDatabase;
// https://developer.android.com/topic/libraries/architecture/room.html
@Database(
version = 221,
version = 222,
entities = {
EntityIdentity.class,
EntityAccount.class,
@@ -2245,6 +2245,12 @@ public abstract class DB extends RoomDatabase {
logMigration(startVersion, endVersion);
db.execSQL("ALTER TABLE `message` ADD COLUMN `sensitivity` INTEGER");
}
}).addMigrations(new Migration(221, 222) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase db) {
logMigration(startVersion, endVersion);
db.execSQL("ALTER TABLE `answer` ADD COLUMN `color` INTEGER");
}
}).addMigrations(new Migration(998, 999) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase db) {

View File

@@ -22,6 +22,7 @@ package eu.faircode.email;
import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.text.Html;
import android.text.SpannableStringBuilder;
@@ -84,6 +85,7 @@ public class EntityAnswer implements Serializable {
public Boolean hide;
@NonNull
public Boolean external;
public Integer color;
@NonNull
public String text;
@NonNull
@@ -164,6 +166,8 @@ public class EntityAnswer implements Serializable {
static void fillMenu(Menu main, boolean compose, List<EntityAnswer> answers, Context context) {
boolean grouped = BuildConfig.DEBUG;
int iconSize = context.getResources().getDimensionPixelSize(R.dimen.menu_item_icon_size);
List<EntityAnswer> favorites = new ArrayList<>();
List<String> groups = new ArrayList<>();
for (EntityAnswer answer : answers)
@@ -206,6 +210,16 @@ public class EntityAnswer implements Serializable {
order++;
SpannableStringBuilder name = new SpannableStringBuilder(answer.name);
if (answer.color != null) {
Drawable d = new ColorDrawable(answer.color);
d.setBounds(0, 0, iconSize / 4, iconSize);
ImageSpan imageSpan = new CenteredImageSpan(d);
name.insert(0, "\uFFFC\u2002"); // object replacement character, en space
name.setSpan(imageSpan, 0, 1, 0);
}
if (grouped && answer.applied > 0) {
name.append(" (").append(NF.format(answer.applied)).append(")");
name.setSpan(new RelativeSizeSpan(HtmlHelper.FONT_SMALL),
@@ -282,6 +296,7 @@ public class EntityAnswer implements Serializable {
}
Drawable icon = context.getResources().getDrawable(R.drawable.twotone_star_24);
icon.setBounds(0, 0, iconSize, iconSize);
icon = icon.getConstantState().newDrawable().mutate();
int color = Helper.resolveColor(context, R.attr.colorAccent);
icon.setTint(color);
@@ -289,8 +304,6 @@ public class EntityAnswer implements Serializable {
for (EntityAnswer answer : favorites) {
SpannableStringBuilder ssb = new SpannableStringBuilder(answer.name);
int iconSize = context.getResources().getDimensionPixelSize(R.dimen.menu_item_icon_size);
icon.setBounds(0, 0, iconSize, iconSize);
ImageSpan imageSpan = new CenteredImageSpan(icon);
ssb.insert(0, "\uFFFC\u2002"); // object replacement character, en space
ssb.setSpan(imageSpan, 0, 1, 0);
@@ -313,6 +326,7 @@ public class EntityAnswer implements Serializable {
json.put("favorite", favorite);
json.put("hide", hide);
json.put("external", external);
json.put("color", color);
json.put("text", text);
json.put("applied", applied);
json.put("last_applied", last_applied);
@@ -331,6 +345,8 @@ public class EntityAnswer implements Serializable {
answer.favorite = json.optBoolean("favorite");
answer.hide = json.optBoolean("hide");
answer.external = json.optBoolean("external");
if (json.has("color") && !json.isNull("color"))
answer.color = json.getInt("color");
answer.text = json.getString("text");
answer.applied = json.optInt("applied", 0);
if (json.has("last_applied") && !json.isNull("last_applied"))
@@ -350,6 +366,7 @@ public class EntityAnswer implements Serializable {
this.hide.equals(other.hide) &&
this.external.equals(other.external) &&
this.text.equals(other.text) &&
Objects.equals(this.color, other.color) &&
this.applied.equals(other.applied) &&
Objects.equals(this.last_applied, other.last_applied));
}

View File

@@ -25,6 +25,7 @@ import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
@@ -64,6 +65,7 @@ public class FragmentAnswer extends FragmentBase {
private CheckBox cbFavorite;
private CheckBox cbHide;
private CheckBox cbExternal;
private ViewButtonColor btnColor;
private EditTextCompose etText;
private BottomNavigationView style_bar;
private BottomNavigationView bottom_navigation;
@@ -73,9 +75,10 @@ public class FragmentAnswer extends FragmentBase {
private long id = -1;
private long copy = -1;
private static final int REQUEST_IMAGE = 1;
private static final int REQUEST_LINK = 2;
private final static int REQUEST_DELETE = 3;
private static final int REQUEST_COLOR = 1;
private static final int REQUEST_IMAGE = 2;
private static final int REQUEST_LINK = 3;
private final static int REQUEST_DELETE = 5;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -114,6 +117,7 @@ public class FragmentAnswer extends FragmentBase {
cbFavorite = view.findViewById(R.id.cbFavorite);
cbHide = view.findViewById(R.id.cbHide);
cbExternal = view.findViewById(R.id.cbExternal);
btnColor = view.findViewById(R.id.btnColor);
etText = view.findViewById(R.id.etText);
style_bar = view.findViewById(R.id.style_bar);
@@ -122,6 +126,21 @@ public class FragmentAnswer extends FragmentBase {
pbWait = view.findViewById(R.id.pbWait);
grpReady = view.findViewById(R.id.grpReady);
btnColor.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle args = new Bundle();
args.putInt("color", btnColor.getColor());
args.putString("title", getString(R.string.title_color));
args.putBoolean("reset", true);
FragmentDialogColor fragment = new FragmentDialogColor();
fragment.setArguments(args);
fragment.setTargetFragment(FragmentAnswer.this, REQUEST_COLOR);
fragment.show(getParentFragmentManager(), "account:color");
}
});
etText.setTypeface(StyleHelper.getTypeface(compose_font, context));
float textSize = Helper.getTextSize(context, zoom);
@@ -218,6 +237,7 @@ public class FragmentAnswer extends FragmentBase {
cbFavorite.setChecked(answer == null ? false : answer.favorite);
cbHide.setChecked(answer == null ? false : answer.hide);
cbExternal.setChecked(answer == null ? false : answer.external);
btnColor.setColor(answer == null ? null : answer.color);
String html = (answer == null ? a.getString("html") : answer.text);
if (html == null)
@@ -342,6 +362,7 @@ public class FragmentAnswer extends FragmentBase {
args.putBoolean("favorite", cbFavorite.isChecked());
args.putBoolean("hide", cbHide.isChecked());
args.putBoolean("external", cbExternal.isChecked());
args.putInt("color", btnColor.getColor());
args.putString("html", HtmlHelper.toHtml(etText.getText(), getContext()));
new SimpleTask<Void>() {
@@ -365,12 +386,15 @@ public class FragmentAnswer extends FragmentBase {
boolean favorite = args.getBoolean("favorite");
boolean hide = args.getBoolean("hide");
boolean external = args.getBoolean("external");
Integer color = args.getInt("color");
String html = args.getString("html");
if (TextUtils.isEmpty(name))
throw new IllegalArgumentException(context.getString(R.string.title_no_name));
if (TextUtils.isEmpty(group))
group = null;
if (color == Color.TRANSPARENT)
color = null;
Document document = JsoupEx.parse(html);
@@ -396,6 +420,7 @@ public class FragmentAnswer extends FragmentBase {
answer.favorite = favorite;
answer.hide = hide;
answer.external = external;
answer.color = color;
answer.text = document.body().html();
if (id < 0)
@@ -433,6 +458,12 @@ public class FragmentAnswer extends FragmentBase {
try {
switch (requestCode) {
case REQUEST_COLOR:
if (resultCode == RESULT_OK && data != null) {
Bundle args = data.getBundleExtra("args");
btnColor.setColor(args.getInt("color"));
}
break;
case REQUEST_IMAGE:
if (resultCode == RESULT_OK && data != null)
onImageSelected(data.getData());