diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonMedia.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonMedia.java index e6de0b36..48be9085 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonMedia.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonMedia.java @@ -44,11 +44,13 @@ public class MastodonMedia implements Media { private String description = ""; private String blur; private int type = UNDEFINED; + private Meta meta; /** * @param json Mastodon status JSON format */ public MastodonMedia(JSONObject json) throws JSONException { + JSONObject metaJson = json.optJSONObject("meta"); String typeStr = json.getString("type"); String url = json.getString("url"); String preview = json.optString("preview_url", ""); @@ -83,6 +85,9 @@ public class MastodonMedia implements Media { if (json.has("description") && !json.isNull("description")) { description = json.getString("description"); } + if (metaJson != null) { + meta = new MastodonMeta(metaJson); + } } @@ -122,6 +127,13 @@ public class MastodonMedia implements Media { } + @Nullable + @Override + public Meta getMeta() { + return meta; + } + + @Override public boolean equals(@Nullable Object obj) { if (!(obj instanceof Media)) @@ -154,4 +166,90 @@ public class MastodonMedia implements Media { } return tostring + " url=\"" + getUrl() + "\""; } + + /** + * + */ + private static final class MastodonMeta implements Meta { + + private static final long serialVersionUID = 5103849502754551661L; + + private double duration; + private int previewWidth; + private int previewHeight; + private int originalWidth; + private int originalHeight; + private int bitrate; + private float framerate; + + /** + * + */ + public MastodonMeta(JSONObject json) { + JSONObject original = json.optJSONObject("original"); + JSONObject small = json.optJSONObject("small"); + if (small != null) { + previewWidth = small.optInt("width", 1); + previewHeight = small.optInt("height", 1); + } + if (original != null) { + String framerateStr = original.optString("frame_rate"); + originalWidth = original.optInt("width", 1); + originalHeight = original.optInt("height", 1); + bitrate = original.optInt("bitrate", 0) / 1024; + duration = original.optDouble("duration", 0.0); + // calculate framerate if any + int split = framerateStr.indexOf("/"); + if (split > 0) { + String upper = framerateStr.substring(0, split); + String down = framerateStr.substring(split + 1); + if (upper.matches("\\d+") && down.matches("\\d+") && !down.equals("0")) { + framerate = (float) (Integer.parseInt(upper) / Integer.parseInt(down)); + } + } + } + } + + + @Override + public double getDuration() { + return duration; + } + + + @Override + public int getWidthPreview() { + return previewWidth; + } + + + @Override + public int getHeightPreview() { + return previewHeight; + } + + + @Override + public int getWidth() { + return originalWidth; + } + + + @Override + public int getHeight() { + return originalHeight; + } + + + @Override + public int getBitrate() { + return bitrate; + } + + + @Override + public float getFrameRate() { + return framerate; + } + } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/impl/MediaV1.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/impl/MediaV1.java index 86972371..6e57553e 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/impl/MediaV1.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v1/impl/MediaV1.java @@ -139,6 +139,13 @@ public class MediaV1 implements Media { } + @Nullable + @Override + public Meta getMeta() { + return null; + } + + @Override public boolean equals(@Nullable Object obj) { if (!(obj instanceof Media)) diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/impl/MediaV2.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/impl/MediaV2.java index 8b1cd339..ca943f00 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/impl/MediaV2.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/impl/MediaV2.java @@ -145,6 +145,13 @@ public class MediaV2 implements Media { } + @Nullable + @Override + public Meta getMeta() { + return null; + } + + @Override public boolean equals(@Nullable Object obj) { if (!(obj instanceof Media)) diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/async/AsyncExecutor.java b/app/src/main/java/org/nuclearfog/twidda/backend/async/AsyncExecutor.java index da34f9db..6a207024 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/async/AsyncExecutor.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/async/AsyncExecutor.java @@ -9,7 +9,6 @@ import androidx.annotation.WorkerThread; import org.nuclearfog.twidda.BuildConfig; -import java.io.InterruptedIOException; import java.lang.ref.WeakReference; import java.util.Queue; import java.util.concurrent.ExecutorService; @@ -64,7 +63,7 @@ public abstract class AsyncExecutor { try { Result result = doInBackground(parameter); onPostExecute(result, callbackReference); - } catch (InterruptedException | InterruptedIOException e) { + } catch (InterruptedException e) { // caused by user interaction. No need to handle exception. } catch (Exception e) { if (BuildConfig.DEBUG) { @@ -121,7 +120,7 @@ public abstract class AsyncExecutor { * @return result of the background task */ @WorkerThread - protected abstract Result doInBackground(@NonNull Parameter param) throws InterruptedException, InterruptedIOException; + protected abstract Result doInBackground(@NonNull Parameter param) throws InterruptedException; /** * Callback used to send task result to main thread diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/utils/BlurHashDecoder.java b/app/src/main/java/org/nuclearfog/twidda/backend/utils/BlurHashDecoder.java index 7753d7a0..e0d9b992 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/utils/BlurHashDecoder.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/utils/BlurHashDecoder.java @@ -11,6 +11,15 @@ import android.util.SparseArray; */ public class BlurHashDecoder { + /** + * use in memory cache for the calculated math, reused by images with same size. + * if the cache does not exist yet it will be created and populated with new calculations. + * By default it is true. + */ + private static final boolean USE_CACHE = true; + + private static final int DEFAULT_SIZE = 16; + // cache Math.cos() calculations to improve performance. // The number of calculations can be huge for many bitmaps: width * height * numCompX * numCompY * 2 * nBitmaps // the cache is enabled by default, it is recommended to disable it only when just a few images are displayed @@ -36,20 +45,40 @@ public class BlurHashDecoder { } /** + * create blurred bitmap using hash string * + * @param blurHash hash string + * @return blurred bitmap */ public static Bitmap decode(String blurHash) { - return decode(blurHash, 16, 16, 1f, true); + return decode(blurHash, DEFAULT_SIZE, DEFAULT_SIZE, 1f); } /** - * Decode a blur hash into a new bitmap. + * create scaled bitmap using hash string * - * @param useCache use in memory cache for the calculated math, reused by images with same size. - * if the cache does not exist yet it will be created and populated with new calculations. - * By default it is true. + * @param blurHash hash string + * @param ratio ratio ob the bitmap to generate + * @return blurred bitmap */ - public static Bitmap decode(String blurHash, int width, int height, float punch, boolean useCache) { + public static Bitmap decode(String blurHash, float ratio) { + if (ratio > 1.0f) { + return decode(blurHash, DEFAULT_SIZE, (int) (DEFAULT_SIZE / ratio), 1f); + } else if (ratio < 1.0f && ratio > 0.0f) { + return decode(blurHash, (int) (DEFAULT_SIZE * ratio), DEFAULT_SIZE, 1f); + } + return decode(blurHash, DEFAULT_SIZE, DEFAULT_SIZE, 1f); + } + + /** + * create blurred bitmap with custom size + * + * @param blurHash hash string + * @param width bitmap width + * @param height bitmap height + * @return blurred bitmap + */ + public static Bitmap decode(String blurHash, int width, int height, float punch) { if (blurHash == null || blurHash.length() < 6) return null; int numCompEnc = decode83(blurHash, 0, 1); @@ -66,7 +95,7 @@ public class BlurHashDecoder { int colorEnc = decode83(blurHash, from, from + 2); colors[i] = decodeAc(colorEnc, maxAc * punch); } - return composeBitmap(width, height, numCompX, numCompY, colors, useCache); + return composeBitmap(width, height, numCompX, numCompY, colors); } /** @@ -120,12 +149,12 @@ public class BlurHashDecoder { /** * */ - private static Bitmap composeBitmap(int width, int height, int numCompX, int numCompY, float[][] colors, boolean useCache) { + private static Bitmap composeBitmap(int width, int height, int numCompX, int numCompY, float[][] colors) { // use an array for better performance when writing pixel colors int[] imageArray = new int[width * height]; - boolean calculateCosX = !useCache || cacheCosinesX.get(width * numCompX) == null; + boolean calculateCosX = !USE_CACHE || cacheCosinesX.get(width * numCompX) == null; double[] cosinesX = getArrayForCosinesX(calculateCosX, width, numCompX); - boolean calculateCosY = !useCache || cacheCosinesY.get(height * numCompY) == null; + boolean calculateCosY = !USE_CACHE || cacheCosinesY.get(height * numCompY) == null; double[] cosinesY = getArrayForCosinesY(calculateCosY, height, numCompY); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { diff --git a/app/src/main/java/org/nuclearfog/twidda/database/impl/DatabaseMedia.java b/app/src/main/java/org/nuclearfog/twidda/database/impl/DatabaseMedia.java index 7ed18d3f..8a46fc13 100644 --- a/app/src/main/java/org/nuclearfog/twidda/database/impl/DatabaseMedia.java +++ b/app/src/main/java/org/nuclearfog/twidda/database/impl/DatabaseMedia.java @@ -89,6 +89,13 @@ public class DatabaseMedia implements Media, MediaTable { } + @Nullable + @Override + public Meta getMeta() { + return null; // todo implement this + } + + @Override public boolean equals(@Nullable Object obj) { if (!(obj instanceof Media)) diff --git a/app/src/main/java/org/nuclearfog/twidda/model/Media.java b/app/src/main/java/org/nuclearfog/twidda/model/Media.java index d8d81361..ab8f6e3b 100644 --- a/app/src/main/java/org/nuclearfog/twidda/model/Media.java +++ b/app/src/main/java/org/nuclearfog/twidda/model/Media.java @@ -1,5 +1,7 @@ package org.nuclearfog.twidda.model; +import androidx.annotation.Nullable; + import java.io.Serializable; /** @@ -64,9 +66,62 @@ public interface Media extends Serializable, Comparable { */ String getBlurHash(); + /** + * @return media information + */ + @Nullable + Meta getMeta(); + @Override default int compareTo(Media o) { return String.CASE_INSENSITIVE_ORDER.compare(getKey(), o.getKey()); } + + /** + * Media information + */ + interface Meta extends Serializable { + + /** + * get duration if video + * + * @return video duration in seconds + */ + double getDuration(); + + /** + * @return image width of the thumbnail + */ + int getWidthPreview(); + + /** + * @return image height of the thumbnail + */ + int getHeightPreview(); + + /** + * @return image/video with + */ + int getWidth(); + + /** + * @return image/video height + */ + int getHeight(); + + /** + * get audio/video if any + * + * @return bitrate in kbit/s + */ + int getBitrate(); + + /** + * get video framerate if any + * + * @return frame rate + */ + float getFrameRate(); + } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/ImageViewer.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/ImageViewer.java index 78692ca3..e3bfc4a4 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/ImageViewer.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/ImageViewer.java @@ -29,6 +29,7 @@ import org.nuclearfog.twidda.config.GlobalSettings; import org.nuclearfog.twidda.model.Media; import org.nuclearfog.twidda.ui.dialogs.DescriptionDialog; import org.nuclearfog.twidda.ui.dialogs.DescriptionDialog.DescriptionCallback; +import org.nuclearfog.twidda.ui.dialogs.MetaDialog; import org.nuclearfog.twidda.ui.views.AnimatedImageView; import org.nuclearfog.twidda.ui.views.DescriptionView; import org.nuclearfog.zoomview.ZoomView; @@ -65,6 +66,7 @@ public class ImageViewer extends MediaActivity implements AsyncCallback keys = new ArrayList<>(); + private List values = new ArrayList<>(); + + private Context context; + private GlobalSettings settings; + + /** + * + */ + public MetaAdapter(Context context) { + this.context = context; + settings = GlobalSettings.get(context); + } + + + @Override + public int getCount() { + return Math.min(keys.size(), values.size()); + } + + + @Override + public Object getItem(int position) { + return new String[] {keys.get(position), values.get(position)}; + } + + + @Override + public long getItemId(int position) { + return keys.get(position).hashCode(); + } + + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + TextView key_text; + TextView value_text; + if (convertView == null) { + convertView = LayoutInflater.from(context).inflate(R.layout.item_meta_field, parent, false); + key_text = convertView.findViewById(R.id.item_meta_field_key); + value_text = convertView.findViewById(R.id.item_meta_field_value); + key_text.setTextColor(settings.getTextColor()); + value_text.setTextColor(settings.getTextColor()); + } else { + key_text = convertView.findViewById(R.id.item_meta_field_key); + value_text = convertView.findViewById(R.id.item_meta_field_value); + } + key_text.setText(keys.get(position)); + value_text.setText(values.get(position)); + return convertView; + } + + /** + * set adapter items + * + * @param meta media meta information + */ + public void setItems(Media.Meta meta) { + if (meta.getWidth() > 1 && meta.getHeight() > 1) { + keys.add(context.getString(R.string.dialog_meta_width)); + values.add(StringUtils.NUMBER_FORMAT.format(meta.getWidth())); + keys.add(context.getString(R.string.dialog_meta_height)); + values.add(StringUtils.NUMBER_FORMAT.format(meta.getHeight())); + } + if (meta.getBitrate() > 0) { + keys.add(context.getString(R.string.dialog_meta_bitrate)); + values.add(StringUtils.NUMBER_FORMAT.format(meta.getBitrate()) + " kbit/s"); + } + if (meta.getFrameRate() > 0) { + keys.add(context.getString(R.string.dialog_meta_framerate)); + values.add(StringUtils.NUMBER_FORMAT.format(meta.getFrameRate()) + " fps"); + } + if (meta.getDuration() > 0) { + StringBuilder durationValue = new StringBuilder(); + keys.add(context.getString(R.string.dialog_meta_duration)); + long hours = Math.round(meta.getDuration() / 3600); + long mins = Math.round(meta.getDuration() / 60) % 60L; + long sec = Math.round(meta.getDuration() % 60.0); + if (hours > 0) { + if (hours < 10) + durationValue.append('0'); + durationValue.append(hours).append(':'); + } + if (mins < 10) + durationValue.append('0'); + durationValue.append(mins).append(':'); + if (sec < 10) + durationValue.append('0'); + durationValue.append(sec).append('\n'); + values.add(durationValue.toString()); + } + notifyDataSetChanged(); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/FilterDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/FilterDialog.java index 312c416f..9df56e98 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/FilterDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/FilterDialog.java @@ -28,7 +28,7 @@ import org.nuclearfog.twidda.backend.helper.update.FilterUpdate; import org.nuclearfog.twidda.backend.utils.AppStyles; import org.nuclearfog.twidda.backend.utils.ErrorUtils; import org.nuclearfog.twidda.model.Filter; -import org.nuclearfog.twidda.ui.adapter.recyclerview.DropdownAdapter; +import org.nuclearfog.twidda.ui.adapter.listview.DropdownAdapter; import java.io.Serializable; diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/MetaDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/MetaDialog.java new file mode 100644 index 00000000..02a268fb --- /dev/null +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/MetaDialog.java @@ -0,0 +1,68 @@ +package org.nuclearfog.twidda.ui.dialogs; + +import android.app.Activity; +import android.app.Dialog; +import android.os.Bundle; +import android.view.ViewGroup; +import android.widget.ListView; + +import androidx.annotation.NonNull; + +import org.nuclearfog.twidda.R; +import org.nuclearfog.twidda.backend.utils.AppStyles; +import org.nuclearfog.twidda.model.Media.Meta; +import org.nuclearfog.twidda.ui.adapter.listview.MetaAdapter; + +/** + * Dialog to show media information + * + * @author nuclearfog + */ +public class MetaDialog extends Dialog { + + private MetaAdapter adapter; + + /** + * + */ + public MetaDialog(Activity activity) { + super(activity, R.style.MetaDialog); + adapter = new MetaAdapter(activity.getApplicationContext()); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_meta); + ViewGroup root = findViewById(R.id.dialog_meta_root); + ListView list = findViewById(R.id.dialog_meta_list); + + list.setAdapter(adapter); + AppStyles.setTheme(root); + } + + + @Override + public void show() { + // using show(Meta) instead + } + + + @Override + public void dismiss() { + if (isShowing()) { + super.dismiss(); + } + } + + /** + * + */ + public void show(@NonNull Meta meta) { + if (!isShowing()) { + super.show(); + adapter.setItems(meta); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/PollDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/PollDialog.java index 387993ae..12ca35ad 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/PollDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/PollDialog.java @@ -21,7 +21,7 @@ import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.backend.helper.update.PollUpdate; import org.nuclearfog.twidda.backend.utils.AppStyles; import org.nuclearfog.twidda.model.Instance; -import org.nuclearfog.twidda.ui.adapter.recyclerview.DropdownAdapter; +import org.nuclearfog.twidda.ui.adapter.listview.DropdownAdapter; import org.nuclearfog.twidda.ui.adapter.recyclerview.EditOptionsAdapter; import java.io.Serializable; diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ReportDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ReportDialog.java index b6f09efc..7886e41e 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ReportDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ReportDialog.java @@ -22,7 +22,7 @@ import org.nuclearfog.twidda.backend.async.ReportUpdater.ReportResult; import org.nuclearfog.twidda.backend.helper.update.ReportUpdate; import org.nuclearfog.twidda.backend.utils.AppStyles; import org.nuclearfog.twidda.backend.utils.ErrorUtils; -import org.nuclearfog.twidda.ui.adapter.recyclerview.DropdownAdapter; +import org.nuclearfog.twidda.ui.adapter.listview.DropdownAdapter; import java.io.Serializable; diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/StatusPreferenceDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/StatusPreferenceDialog.java index 7719edfc..7092a7b7 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/StatusPreferenceDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/StatusPreferenceDialog.java @@ -18,7 +18,7 @@ import org.nuclearfog.twidda.backend.helper.update.StatusUpdate; import org.nuclearfog.twidda.backend.utils.AppStyles; import org.nuclearfog.twidda.config.GlobalSettings; import org.nuclearfog.twidda.model.Status; -import org.nuclearfog.twidda.ui.adapter.recyclerview.DropdownAdapter; +import org.nuclearfog.twidda.ui.adapter.listview.DropdownAdapter; import java.util.Locale; import java.util.Map; diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/WebPushDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/WebPushDialog.java index 919fd74f..d26a03d9 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/WebPushDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/WebPushDialog.java @@ -27,7 +27,7 @@ import org.nuclearfog.twidda.backend.utils.AppStyles; import org.nuclearfog.twidda.backend.utils.ErrorUtils; import org.nuclearfog.twidda.config.GlobalSettings; import org.nuclearfog.twidda.model.WebPush; -import org.nuclearfog.twidda.ui.adapter.recyclerview.DropdownAdapter; +import org.nuclearfog.twidda.ui.adapter.listview.DropdownAdapter; import java.io.Serializable; diff --git a/app/src/main/res/layout/dialog_meta.xml b/app/src/main/res/layout/dialog_meta.xml new file mode 100644 index 00000000..5dddb797 --- /dev/null +++ b/app/src/main/res/layout/dialog_meta.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_meta_field.xml b/app/src/main/res/layout/item_meta_field.xml new file mode 100644 index 00000000..1783ba76 --- /dev/null +++ b/app/src/main/res/layout/item_meta_field.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/image.xml b/app/src/main/res/menu/image.xml index 9101bd13..46717bb9 100644 --- a/app/src/main/res/menu/image.xml +++ b/app/src/main/res/menu/image.xml @@ -3,9 +3,13 @@ + + + + Status %1$s ausgewählt Beschreibung hinzufügen + zeige Medieninformationen Nachricht schreiben Antwort Statusmetriken @@ -334,6 +335,12 @@ Meldegrund Status melden melden + Medieninformationen + Breite + Höhe + Bitrate + Framerate + Dauer aktiviere Push-Benachrichtigung\n(ntfy-App erforderlich) %1$s hat einen Status favorisiert %1$s hat einen Status geteilt diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0688d5bf..13c084cf 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -373,4 +373,11 @@ 10sp 18sp + + 22sp + 5dp + + + 5dp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b825f901..d396120f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -192,6 +192,7 @@ Follow requests Blocklists add description + show metadata write message Link preview image svg icons from: @@ -358,6 +359,12 @@ what to report report status report + Media information + width + height + bitrate + framerate + duration enable push notification\n(requires ntfy app) %1$s favorited your status %1$s reposted your status diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 01cf1516..58dbc807 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -23,6 +23,10 @@ false + +