From ca18647dcd881f18667006c6bceb098f9b54ab87 Mon Sep 17 00:00:00 2001 From: nuclearfog Date: Sun, 3 Dec 2023 13:40:28 +0100 Subject: [PATCH] bug fix, layout fix, code cleanup --- app/build.gradle | 1 + .../twidda/backend/api/mastodon/Mastodon.java | 2 +- .../mastodon/impl/MastodonAnnouncement.java | 19 +++++++ .../api/mastodon/impl/MastodonInstance.java | 2 +- .../twidda/backend/async/AccountAction.java | 2 + .../twidda/backend/async/AccountLoader.java | 2 +- .../backend/async/AnnouncementAction.java | 2 +- .../nuclearfog/twidda/model/Announcement.java | 11 +++- .../twidda/model/lists/Announcements.java | 3 +- .../ui/activities/InstanceActivity.java | 1 - .../recyclerview/AnnouncementAdapter.java | 3 +- .../holder/AnnouncementHolder.java | 12 +++-- .../twidda/ui/dialogs/ColorPickerDialog.java | 52 +++++++++++++++---- .../twidda/ui/dialogs/ConfirmDialog.java | 2 +- .../main/res/layout/dialog_colorpicker.xml | 9 ++-- app/src/main/res/layout/item_announcement.xml | 5 +- app/src/main/res/layout/page_instance.xml | 18 +------ app/src/main/res/menu/instance.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values/dimens.xml | 4 +- app/src/main/res/values/strings.xml | 1 - 21 files changed, 103 insertions(+), 52 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8bb8a7e9..e2023dc5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,6 +64,7 @@ dependencies { implementation 'com.github.duanhong169:checkerboarddrawable:1.0.2' implementation 'com.kyleduo.switchbutton:library:2.1.0' implementation 'com.github.UnifiedPush:android-connector:2.1.1' + //noinspection GradleDependency implementation 'com.google.android.material:material:1.9.0' implementation 'jp.wasabeef:picasso-transformations:2.4.0' implementation 'net.danlew:android.joda:2.12.5' diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/Mastodon.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/Mastodon.java index bf52d78b..440cc260 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/Mastodon.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/Mastodon.java @@ -270,7 +270,7 @@ public class Mastodon implements Connection { ResponseBody body = response.body(); if (response.code() == 200 && body != null) { JSONArray array = new JSONArray(body.string()); - for (int i = 0 ; i < array.length() ; i++) { + for (int i = 0; i < array.length(); i++) { JSONObject json = array.getJSONObject(i); Announcement item = new MastodonAnnouncement(json); if (settings.showAllAnnouncements() || !item.isDismissed()) { diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonAnnouncement.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonAnnouncement.java index 70d71f97..0ab56abf 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonAnnouncement.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonAnnouncement.java @@ -1,5 +1,8 @@ package org.nuclearfog.twidda.backend.api.mastodon.impl; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -89,4 +92,20 @@ public class MastodonAnnouncement implements Announcement { public Reaction[] getReactions() { return reactions; } + + + @Override + public boolean equals(@Nullable Object obj) { + if (!(obj instanceof Announcement)) + return false; + Announcement announcement = (Announcement) obj; + return announcement.getId() == id && announcement.getTimestamp() == getTimestamp(); + } + + + @NonNull + @Override + public String toString() { + return "id=" + getId() + " dismissed=" + isDismissed() + " message=\"" + getMessage() + "\""; + } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonInstance.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonInstance.java index 7cb4213f..e9a17b7d 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonInstance.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonInstance.java @@ -50,7 +50,7 @@ public class MastodonInstance implements Instance { JSONObject translations = configuration.getJSONObject("translation"); JSONArray mediaTypes = media.getJSONArray("supported_mime_types"); JSONArray language = json.getJSONArray("languages"); - JSONObject thumbnail = json.optJSONObject( "thumbnail"); + JSONObject thumbnail = json.optJSONObject("thumbnail"); JSONObject contact = json.optJSONObject("contact"); JSONObject usage = json.optJSONObject("usage"); diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/async/AccountAction.java b/app/src/main/java/org/nuclearfog/twidda/backend/async/AccountAction.java index fe372ef1..1c189091 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/async/AccountAction.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/async/AccountAction.java @@ -10,6 +10,8 @@ import org.nuclearfog.twidda.model.Account; import org.nuclearfog.twidda.model.WebPush; /** + * Async class used to select or remove a login + * * @author nuclearfog */ public class AccountAction extends AsyncExecutor { diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/async/AccountLoader.java b/app/src/main/java/org/nuclearfog/twidda/backend/async/AccountLoader.java index 6ba739d9..ee2627dc 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/async/AccountLoader.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/async/AccountLoader.java @@ -8,7 +8,7 @@ import org.nuclearfog.twidda.database.AppDatabase; import org.nuclearfog.twidda.model.lists.Accounts; /** - * backend loader to get login information of local accounts + * Async loader to get saved login informations * * @author nuclearfog */ diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/async/AnnouncementAction.java b/app/src/main/java/org/nuclearfog/twidda/backend/async/AnnouncementAction.java index 98cb8814..2cb79ece 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/async/AnnouncementAction.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/async/AnnouncementAction.java @@ -10,7 +10,7 @@ import org.nuclearfog.twidda.backend.api.ConnectionException; import org.nuclearfog.twidda.backend.api.ConnectionManager; /** - * asyncloader to modify instance announcements + * Async loader to remove instance announcements * * @author nuclearfog */ diff --git a/app/src/main/java/org/nuclearfog/twidda/model/Announcement.java b/app/src/main/java/org/nuclearfog/twidda/model/Announcement.java index 31bc6f08..9d581ea5 100644 --- a/app/src/main/java/org/nuclearfog/twidda/model/Announcement.java +++ b/app/src/main/java/org/nuclearfog/twidda/model/Announcement.java @@ -7,7 +7,7 @@ import java.io.Serializable; * * @author nuclearfog */ -public interface Announcement extends Serializable { +public interface Announcement extends Serializable, Comparable { /** * @return ID of the announcement @@ -38,4 +38,13 @@ public interface Announcement extends Serializable { * @return user reactions of the announcement */ Reaction[] getReactions(); + + /** + * + */ + default int compareTo(Announcement announcement) { + if (announcement.getTimestamp() != getTimestamp()) + return Long.compare(announcement.getTimestamp(), getTimestamp()); + return Long.compare(announcement.getId(), getId()); + } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/model/lists/Announcements.java b/app/src/main/java/org/nuclearfog/twidda/model/lists/Announcements.java index 84d4c5c3..df91c14d 100644 --- a/app/src/main/java/org/nuclearfog/twidda/model/lists/Announcements.java +++ b/app/src/main/java/org/nuclearfog/twidda/model/lists/Announcements.java @@ -16,7 +16,8 @@ public class Announcements extends LinkedList { /** * */ - public Announcements() {} + public Announcements() { + } /** * diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/InstanceActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/InstanceActivity.java index 98f8ba79..7c193133 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/InstanceActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/InstanceActivity.java @@ -15,7 +15,6 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; - import androidx.appcompat.widget.Toolbar; import androidx.lifecycle.ViewModelProvider; diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/recyclerview/AnnouncementAdapter.java b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/recyclerview/AnnouncementAdapter.java index 8d601ac4..537cd059 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/recyclerview/AnnouncementAdapter.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/recyclerview/AnnouncementAdapter.java @@ -50,8 +50,7 @@ public class AnnouncementAdapter extends Adapter implements @Override public void onItemClick(int position, int type, int... extras) { - - switch(type) { + switch (type) { case ANNOUNCEMENT_DISMISS: listener.onAnnouncementDismiss(items.get(position)); break; diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/recyclerview/holder/AnnouncementHolder.java b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/recyclerview/holder/AnnouncementHolder.java index 9dbc0386..e3754ac8 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/recyclerview/holder/AnnouncementHolder.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/recyclerview/holder/AnnouncementHolder.java @@ -34,6 +34,7 @@ import org.nuclearfog.twidda.ui.adapter.recyclerview.ReactionAdapter.OnReactionS public class AnnouncementHolder extends ViewHolder implements OnClickListener, OnReactionSelected { private TextView time, content; + private View dismissButton; private OnHolderClickListener listener; private GlobalSettings settings; @@ -55,7 +56,7 @@ public class AnnouncementHolder extends ViewHolder implements OnClickListener, O adapter = new ReactionAdapter(this); CardView card = (CardView) itemView; ViewGroup container = itemView.findViewById(R.id.item_announcement_container); - View dismiss = itemView.findViewById(R.id.item_announcement_dismiss); + dismissButton = itemView.findViewById(R.id.item_announcement_dismiss); RecyclerView reactionList = itemView.findViewById(R.id.item_announcement_list_reactions); time = itemView.findViewById(R.id.item_announcement_timestamp); content = itemView.findViewById(R.id.item_announcement_content); @@ -67,7 +68,7 @@ public class AnnouncementHolder extends ViewHolder implements OnClickListener, O AppStyles.setTheme(container, Color.TRANSPARENT); container.setOnClickListener(this); - dismiss.setOnClickListener(this); + dismissButton.setOnClickListener(this); this.listener = listener; } @@ -94,7 +95,7 @@ public class AnnouncementHolder extends ViewHolder implements OnClickListener, O } /** - * + * set holder content */ public void setContent(Announcement announcement) { Spannable textSpan = Tagger.makeTextWithLinks(announcement.getMessage(), settings.getHighlightColor()); @@ -103,6 +104,11 @@ public class AnnouncementHolder extends ViewHolder implements OnClickListener, O emojiLoader.execute(param, textResult); textSpan = EmojiUtils.removeTags(textSpan); } + if (announcement.isDismissed()) { + dismissButton.setVisibility(View.GONE); + } else { + dismissButton.setVisibility(View.VISIBLE); + } content.setText(textSpan); time.setText(StringUtils.formatCreationTime(time.getResources(), announcement.getTimestamp())); adapter.setItems(announcement.getReactions()); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ColorPickerDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ColorPickerDialog.java index e9e15771..0f91929c 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ColorPickerDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ColorPickerDialog.java @@ -2,6 +2,7 @@ package org.nuclearfog.twidda.ui.dialogs; import android.app.Activity; import android.app.Dialog; +import android.graphics.Typeface; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; @@ -15,6 +16,8 @@ import androidx.annotation.NonNull; import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.backend.utils.AppStyles; +import java.util.regex.Pattern; + import top.defaults.colorpicker.ColorObserver; import top.defaults.colorpicker.ColorPickerView; @@ -25,15 +28,27 @@ import top.defaults.colorpicker.ColorPickerView; */ public class ColorPickerDialog extends Dialog implements OnClickListener, ColorObserver, TextWatcher { + /** + * bundle key to save/restore color value + */ private static final String KEY_COLOR = "color"; - private static final String KEY_MODE = "mode"; + + /** + * bundle key to save/restore color type + */ + private static final String KEY_TYPE = "mode"; + + /** + * pattern used to check rgb hex input + */ + private static final Pattern HEX_PATTERN = Pattern.compile("[0123456789ABCDEFabcdef]{1,8}"); private ColorPickerView colorPickerView; private EditText hexCode; private ViewGroup root; private OnColorSelectedListener listener; - private int mode; + private int type; /** * @param listener callback listener to set color @@ -55,18 +70,32 @@ public class ColorPickerDialog extends Dialog implements OnClickListener, ColorO View cancel = findViewById(R.id.dialog_colorpicker_cancel); hexCode.addTextChangedListener(this); - colorPickerView.subscribe(this); confirm.setOnClickListener(this); cancel.setOnClickListener(this); } + @Override + protected void onStart() { + super.onStart(); + colorPickerView.subscribe(this); + } + + + @Override + protected void onStop() { + super.onStop(); + colorPickerView.unsubscribe(this); + } + + @NonNull @Override public Bundle onSaveInstanceState() { Bundle bundle = super.onSaveInstanceState(); - bundle.putInt(KEY_COLOR, colorPickerView.getColor()); - bundle.putInt(KEY_MODE, mode); + int color = colorPickerView.getColor(); + bundle.putInt(KEY_COLOR, color); + bundle.putInt(KEY_TYPE, type); return bundle; } @@ -74,8 +103,9 @@ public class ColorPickerDialog extends Dialog implements OnClickListener, ColorO @Override public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); - mode = savedInstanceState.getInt(KEY_MODE); - colorPickerView.setInitialColor(savedInstanceState.getInt(KEY_COLOR)); + int color = savedInstanceState.getInt(KEY_COLOR); + type = savedInstanceState.getInt(KEY_TYPE); + colorPickerView.setInitialColor(color); } @@ -88,7 +118,7 @@ public class ColorPickerDialog extends Dialog implements OnClickListener, ColorO @Override public void onClick(View v) { if (v.getId() == R.id.dialog_colorpicker_ok) { - listener.onColorSelected(mode, colorPickerView.getColor()); + listener.onColorSelected(type, colorPickerView.getColor()); dismiss(); } else if (v.getId() == R.id.dialog_colorpicker_cancel) { dismiss(); @@ -98,6 +128,7 @@ public class ColorPickerDialog extends Dialog implements OnClickListener, ColorO @Override public void onColor(int color, boolean fromUser, boolean shouldPropagate) { + // only handle user input if (fromUser) { hexCode.setText(String.format("%08X", color)); } @@ -111,11 +142,12 @@ public class ColorPickerDialog extends Dialog implements OnClickListener, ColorO public void show(int color, int type, boolean enableAlpha) { if (!isShowing()) { super.show(); - this.mode = type; + this.type = type; colorPickerView.setInitialColor(color); colorPickerView.setEnabledAlpha(enableAlpha); hexCode.setText(String.format("%08X", color)); AppStyles.setTheme(root); + hexCode.setTypeface(Typeface.MONOSPACE); } } @@ -135,7 +167,7 @@ public class ColorPickerDialog extends Dialog implements OnClickListener, ColorO // only handle user input if (hexCode.hasFocus()) { String hex = s.toString(); - if (hex.matches("[0123456789ABCDEFabcdef]{1,8}")) { + if (HEX_PATTERN.matcher(hex).matches()) { colorPickerView.setInitialColor(Integer.parseUnsignedInt(hex, 16)); } } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ConfirmDialog.java b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ConfirmDialog.java index d5c663a7..de2d7f1b 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ConfirmDialog.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/dialogs/ConfirmDialog.java @@ -155,7 +155,7 @@ public class ConfirmDialog extends Dialog implements OnClickListener { public static final int FOLLOW_REQUEST = 631; /** - * show 'dismiss announcement' dialog + * show 'dismiss announcement' dialog */ public static final int ANNOUNCEMENT_DISMISS = 632; diff --git a/app/src/main/res/layout/dialog_colorpicker.xml b/app/src/main/res/layout/dialog_colorpicker.xml index dd8d09e6..23cd89b7 100644 --- a/app/src/main/res/layout/dialog_colorpicker.xml +++ b/app/src/main/res/layout/dialog_colorpicker.xml @@ -16,12 +16,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:gravity="center_vertical"> + android:gravity="center_vertical" + android:layout_margin="@dimen/dialog_colorpicker_margin_layout"> @@ -39,13 +39,13 @@ android:digits="0123456789ABCDEFabcdef" android:textSize="@dimen/dialog_colorpicker_textsize_textview" android:inputType="textNoSuggestions" - android:importantForAutofill="no"/> + android:importantForAutofill="no" />