summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas <tschneider.ac@gmail.com>2023-07-29 11:44:13 +0200
committerThomas <tschneider.ac@gmail.com>2023-07-29 11:44:13 +0200
commitfcef89f0c9b1af0d447e82dacc5801ccaa93e639 (patch)
tree41160eb363962a8e8162724714f1cda42e539cf3
parentbf447d823eae7701df9d872568697e435f831acc (diff)
Display icon when changing logo
-rw-r--r--app/src/main/java/app/fedilab/android/mastodon/helper/ImageListPreference.java209
-rw-r--r--app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentInterfaceSettings.java11
-rw-r--r--app/src/main/res/layouts/mastodon/layout/imagelistpreference_item.xml39
-rw-r--r--app/src/main/res/layouts/mastodon/layout/imagelistpreference_item_card.xml51
-rw-r--r--app/src/main/res/values/attrs_icon.xml13
-rw-r--r--app/src/main/res/values/strings.xml8
-rw-r--r--app/src/main/res/xml/pref_interface.xml3
7 files changed, 328 insertions, 6 deletions
diff --git a/app/src/main/java/app/fedilab/android/mastodon/helper/ImageListPreference.java b/app/src/main/java/app/fedilab/android/mastodon/helper/ImageListPreference.java
new file mode 100644
index 000000000..42408ce32
--- /dev/null
+++ b/app/src/main/java/app/fedilab/android/mastodon/helper/ImageListPreference.java
@@ -0,0 +1,209 @@
+package app.fedilab.android.mastodon.helper;
+/* Copyright 2023 Thomas Schneider
+ *
+ * This file is a part of Fedilab
+ *
+ * This program is free software; you can redistribute it and/or modify it under the terms of the
+ * GNU General Public License as published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with Fedilab; if not,
+ * see <http://www.gnu.org/licenses>. */
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.res.TypedArray;
+import android.preference.PreferenceManager;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.ListAdapter;
+import android.widget.RadioButton;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.ListPreference;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import app.fedilab.android.R;
+
+public class ImageListPreference extends ListPreference {
+
+ private static final int DEFAULT_TINT = 0;
+ private static final int DEFAULT_BACKGROUND_TINT = 0xFFFFFFFF;
+ private final List<Integer> mImages;
+ private int mErrorResource;
+ private int mTintColor;
+ private int mBackgroundColor;
+ private boolean mUseCard;
+ private int mCustomItemLayout;
+
+ public ImageListPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ mImages = new ArrayList<>();
+
+ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
+
+ TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ImageListPreference);
+
+ try {
+ int entryImagesArrayResource = array.getResourceId(R.styleable.ImageListPreference_ilp_entryImages, 0);
+ String tintKey = array.getNonResourceString(R.styleable.ImageListPreference_ilp_tintKey);
+ String backgroundKey = array.getNonResourceString(R.styleable.ImageListPreference_ilp_backgroundTint);
+
+ mTintColor = array.getColor(R.styleable.ImageListPreference_ilp_tint, DEFAULT_TINT);
+ mBackgroundColor = array.getColor(R.styleable.ImageListPreference_ilp_backgroundTint, 0);
+ mErrorResource = array.getResourceId(R.styleable.ImageListPreference_ilp_errorImage, 0);
+ mUseCard = array.getBoolean(R.styleable.ImageListPreference_ilp_useCard, false);
+ mCustomItemLayout = array.getResourceId(R.styleable.ImageListPreference_ilp_itemLayout, 0);
+
+ if (tintKey != null) {
+ mTintColor = sharedPreferences.getInt(tintKey, mTintColor);
+ }
+ if (backgroundKey != null) {
+ mBackgroundColor = sharedPreferences.getInt(backgroundKey, mBackgroundColor);
+ }
+
+ TypedArray images = context.getResources().obtainTypedArray(entryImagesArrayResource);
+
+ for (int i = 0; i < images.length(); i++) {
+ mImages.add(images.getResourceId(i, 0));
+ }
+
+ images.recycle();
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ array.recycle();
+ }
+ }
+
+ @Override
+ protected void onClick() {
+ List<ImageListItem> items = new ArrayList<>();
+ SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
+ String launcher = sharedpreferences.getString(getContext().getString(R.string.SET_LOGO_LAUNCHER), "Bubbles");
+ AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
+ int length = getEntries().length;
+ for (int i = 0; i < length; i++) {
+ int resource = 0;
+ if (mImages.size() > i) {
+ resource = mImages.get(i);
+ }
+ items.add(new ImageListItem(getEntries()[i], resource, getEntryValues()[i].equals(launcher)));
+ }
+
+ int layout = R.layout.imagelistpreference_item;
+ if (mUseCard) {
+ layout = R.layout.imagelistpreference_item_card;
+ }
+ if (mCustomItemLayout != 0) {
+ layout = mCustomItemLayout;
+ }
+
+ ListAdapter adapter = new ImageListPreferenceAdapter(getContext(), layout, items);
+ builder.setAdapter(adapter, (dialogInterface, which) -> {
+ SharedPreferences.Editor editor = sharedpreferences.edit();
+ editor.putString(getContext().getString(R.string.SET_LOGO_LAUNCHER), String.valueOf(getEntryValues()[which]));
+ editor.commit();
+ });
+ builder.create().show();
+
+ }
+
+ private static class ImageListItem {
+ private final int resource;
+ private final boolean isChecked;
+ private final String name;
+
+ ImageListItem(CharSequence name, int resource, boolean isChecked) {
+ this(name.toString(), resource, isChecked);
+ }
+
+ ImageListItem(String name, int resource, boolean isChecked) {
+ this.name = name;
+ this.resource = resource;
+ this.isChecked = isChecked;
+ }
+ }
+
+ private static class ViewHolder {
+ ImageView iconImage;
+ TextView iconName;
+ RadioButton radioButton;
+ }
+
+ private class ImageListPreferenceAdapter extends ArrayAdapter<ImageListItem> {
+ private final List<ImageListItem> mItems;
+ private final int mLayoutResource;
+
+ ImageListPreferenceAdapter(Context context, int layoutResource, List<ImageListItem> items) {
+ super(context, layoutResource, items);
+ mLayoutResource = layoutResource;
+ mItems = items;
+ }
+
+ @Override
+ public @NonNull
+ View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
+
+ ViewHolder holder;
+ if (convertView == null) {
+ LayoutInflater inflater = (LayoutInflater) getContext().
+ getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ try {
+ assert inflater != null;
+ convertView = inflater.inflate(mLayoutResource, parent, false);
+
+ holder = new ViewHolder();
+ holder.iconName = convertView.findViewById(R.id.imagelistpreference_text);
+ holder.iconImage = convertView.findViewById(R.id.imagelistpreference_image);
+ holder.radioButton = convertView.findViewById(R.id.imagelistpreference_radio);
+ convertView.setTag(holder);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return super.getView(position, null, parent);
+ }
+ } else {
+ holder = (ViewHolder) convertView.getTag();
+ }
+
+ if (holder == null) {
+ return super.getView(position, convertView, parent);
+ }
+
+ ImageListItem item = mItems.get(position);
+
+ holder.iconName.setText(item.name);
+
+ if (item.resource != 0) {
+ holder.iconImage.setImageResource(item.resource);
+ } else {
+ holder.iconImage.setImageResource(mErrorResource);
+ }
+
+ if (mTintColor != 0) {
+ holder.iconImage.setColorFilter(mTintColor);
+ }
+ if (mBackgroundColor != 0) {
+ holder.iconImage.setBackgroundColor(mBackgroundColor);
+ }
+
+ holder.radioButton.setChecked(item.isChecked);
+
+ return convertView;
+ }
+ }
+} \ No newline at end of file
diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentInterfaceSettings.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentInterfaceSettings.java
index cc1ff8f6b..043227f5e 100644
--- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentInterfaceSettings.java
+++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentInterfaceSettings.java
@@ -111,12 +111,13 @@ public class FragmentInterfaceSettings extends PreferenceFragmentCompat implemen
}
if (key.compareToIgnoreCase(getString(R.string.SET_LOGO_LAUNCHER)) == 0) {
ListPreference SET_LOGO_LAUNCHER = findPreference(getString(R.string.SET_LOGO_LAUNCHER));
- if (SET_LOGO_LAUNCHER != null) {
+ String newLauncher = sharedpreferences.getString(getString(R.string.SET_LOGO_LAUNCHER), "Bubbles");
+ if (Character.isUpperCase(newLauncher.codePointAt(0))) {
hideAllIcons(requireActivity());
- setIcon(requireActivity(), SET_LOGO_LAUNCHER.getValue());
- SET_LOGO_LAUNCHER.setIcon(LogoHelper.getDrawable(SET_LOGO_LAUNCHER.getValue()));
- setDrawable(SET_LOGO_LAUNCHER.getValue());
- editor.putString(getString(R.string.SET_LOGO_LAUNCHER), SET_LOGO_LAUNCHER.getValue());
+ setIcon(requireActivity(), newLauncher);
+ SET_LOGO_LAUNCHER.setIcon(LogoHelper.getDrawable(newLauncher));
+ setDrawable(newLauncher);
+ editor.putString(getString(R.string.SET_LOGO_LAUNCHER), newLauncher);
}
}
editor.apply();
diff --git a/app/src/main/res/layouts/mastodon/layout/imagelistpreference_item.xml b/app/src/main/res/layouts/mastodon/layout/imagelistpreference_item.xml
new file mode 100644
index 000000000..5c1fc649e
--- /dev/null
+++ b/app/src/main/res/layouts/mastodon/layout/imagelistpreference_item.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingStart="16dp"
+ android:paddingLeft="16dp"
+ android:paddingTop="8dp"
+ android:paddingEnd="16dp"
+ android:paddingRight="16dp"
+ android:paddingBottom="8dp">
+
+ <TextView
+ android:id="@+id/imagelistpreference_text"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_marginStart="8dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginRight="8dp"
+ android:layout_toStartOf="@+id/imagelistpreference_image"
+ android:layout_toEndOf="@+id/imagelistpreference_radio" />
+
+ <RadioButton
+ android:id="@+id/imagelistpreference_radio"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:clickable="false"
+ android:focusable="false" />
+
+ <ImageView
+ android:id="@+id/imagelistpreference_image"
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:layout_alignParentEnd="true"
+ android:layout_margin="5dp"
+ android:layout_marginEnd="4dp" />
+</RelativeLayout> \ No newline at end of file
diff --git a/app/src/main/res/layouts/mastodon/layout/imagelistpreference_item_card.xml b/app/src/main/res/layouts/mastodon/layout/imagelistpreference_item_card.xml
new file mode 100644
index 000000000..c3a133f6f
--- /dev/null
+++ b/app/src/main/res/layouts/mastodon/layout/imagelistpreference_item_card.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingStart="16dp"
+ android:paddingLeft="16dp"
+ android:paddingTop="8dp"
+ android:paddingEnd="16dp"
+ android:paddingRight="16dp"
+ android:paddingBottom="8dp">
+
+ <TextView
+ android:id="@+id/imagelistpreference_text"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_marginStart="8dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginRight="8dp"
+ android:layout_toStartOf="@+id/imagelistpreference_card"
+ android:layout_toEndOf="@+id/imagelistpreference_radio" />
+
+ <RadioButton
+ android:id="@+id/imagelistpreference_radio"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:clickable="false"
+ android:focusable="false" />
+
+ <androidx.cardview.widget.CardView
+ android:id="@+id/imagelistpreference_card"
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:layout_alignParentEnd="true"
+ android:layout_margin="5dp"
+ android:layout_marginEnd="4dp"
+ android:elevation="12dp"
+ app:cardCornerRadius="8dp">
+
+ <ImageView
+ android:id="@+id/imagelistpreference_image"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:padding="8dp"
+ tools:src="@drawable/fedilab_logo_hero" />
+ </androidx.cardview.widget.CardView>
+</RelativeLayout> \ No newline at end of file
diff --git a/app/src/main/res/values/attrs_icon.xml b/app/src/main/res/values/attrs_icon.xml
new file mode 100644
index 000000000..37043fbde
--- /dev/null
+++ b/app/src/main/res/values/attrs_icon.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <declare-styleable name="ImageListPreference">
+ <attr name="ilp_entryImages" format="reference" />
+ <attr name="ilp_tintKey" format="string" />
+ <attr name="ilp_backgroundTintKey" format="string" />
+ <attr name="ilp_tint" format="color" />
+ <attr name="ilp_backgroundTint" format="color" />
+ <attr name="ilp_errorImage" format="reference" />
+ <attr name="ilp_useCard" format="boolean" />
+ <attr name="ilp_itemLayout" format="reference" />
+ </declare-styleable>
+</resources> \ 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 fa8a68523..221bd6ffc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -768,6 +768,14 @@
<item>Mastalab</item>
</string-array>
+ <string-array name="SET_LOGO_DRAWABLE" translatable="false">
+ <item>@drawable/ic_launcher_bubbles_foreground</item>
+ <item>@drawable/ic_launcher_fediverse_foreground</item>
+ <item>@drawable/ic_launcher_hero_foreground</item>
+ <item>@drawable/ic_launcher_atom_foreground</item>
+ <item>@drawable/ic_launcher_crash_foreground</item>
+ <item>@drawable/ic_launcher_mastalab_foreground</item>
+ </string-array>
<string-array name="SET_MATHS_FORMAT">
<item>Inline\nNotation that sits inline with other text\n</item>
diff --git a/app/src/main/res/xml/pref_interface.xml b/app/src/main/res/xml/pref_interface.xml
index ab4db2be0..b5b7afbf7 100644
--- a/app/src/main/res/xml/pref_interface.xml
+++ b/app/src/main/res/xml/pref_interface.xml
@@ -155,7 +155,7 @@
app:singleLineTitle="false"
app:title="@string/set_med_desc_timeout" />
- <ListPreference
+ <app.fedilab.android.mastodon.helper.ImageListPreference
app:defaultValue="bubbles"
app:dialogTitle="@string/pickup_logo"
app:entries="@array/set_logo_type_value"
@@ -163,6 +163,7 @@
app:key="@string/SET_LOGO_LAUNCHER"
app:summary="@string/change_logo_description"
app:title="@string/change_logo"
+ app:ilp_entryImages="@array/SET_LOGO_DRAWABLE"
app:useSimpleSummaryProvider="true" />
</PreferenceScreen> \ No newline at end of file