From 75c4cdd886049a9b39dd0469016e970ccd6099bb Mon Sep 17 00:00:00 2001 From: kyori Date: Tue, 4 Sep 2018 18:34:42 +0900 Subject: [PATCH] [default-tag] Implement default-tag feature --- .../keylesspalace/tusky/ComposeActivity.java | 39 ++++++++++++++++- .../tusky/FavouritesActivity.java | 4 +- .../com/keylesspalace/tusky/MainActivity.java | 3 +- .../tusky/ModalTimelineActivity.kt | 4 +- .../keylesspalace/tusky/ViewTagActivity.java | 4 +- .../keylesspalace/tusky/util/ThemeUtils.java | 7 ++-- .../net/accelf/yuito/QuickTootHelper.java | 42 +++++++++++++++++-- app/src/main/res/layout/activity_compose.xml | 30 ++++++++++++- app/src/main/res/layout/view_quick_toot.xml | 7 ++++ app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 11 files changed, 121 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java b/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java index 0e69cf02c..02721c010 100644 --- a/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/ComposeActivity.java @@ -55,6 +55,7 @@ import android.view.Window; import android.view.WindowManager; import android.webkit.MimeTypeMap; import android.widget.Button; +import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; @@ -90,6 +91,8 @@ import com.google.gson.reflect.TypeToken; import com.keylesspalace.tusky.adapter.ComposeAutoCompleteAdapter; import com.keylesspalace.tusky.adapter.EmojiAdapter; import com.keylesspalace.tusky.adapter.OnEmojiSelectedListener; +import com.keylesspalace.tusky.appstore.EventHub; +import com.keylesspalace.tusky.appstore.PreferenceChangedEvent; import com.keylesspalace.tusky.db.AccountEntity; import com.keylesspalace.tusky.db.AppDatabase; import com.keylesspalace.tusky.db.InstanceEntity; @@ -206,10 +209,15 @@ public final class ComposeActivity public static final String[] CAN_USE_UNLEAKABLE = {"itabashi.0j0.jp", "odakyu.app"}; private static final String[] CAN_USE_QUOTE_ID = {"odakyu.app", "biwakodon.com", "dtp-mstdn.jp", "nitiasa.com"}; + public static final String PREF_DEFAULT_TAG = "default_tag"; + public static final String PREF_USE_DEFAULT_TAG = "use_default_tag"; + @Inject public MastodonApi mastodonApi; @Inject public AppDatabase database; + @Inject + public EventHub eventHub; private TextView replyTextView; private TextView replyContentTextView; @@ -217,6 +225,8 @@ public final class ComposeActivity private LinearLayout mediaPreviewBar; private View contentWarningBar; private EditText contentWarningEditor; + private CheckBox useDefaultTag; + private EditText defaultTagEditText; private TextView charactersLeft; private TootButton tootButton; private ImageButton pickButton; @@ -265,10 +275,12 @@ public final class ComposeActivity private SaveTootHelper saveTootHelper; private Gson gson = new Gson(); + private SharedPreferences preferences; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); + preferences = PreferenceManager.getDefaultSharedPreferences(this); String theme = preferences.getString("appTheme", ThemeUtils.APP_THEME_DEFAULT); if (theme.equals("black")) { setTheme(R.style.TuskyDialogActivityBlackTheme); @@ -282,6 +294,8 @@ public final class ComposeActivity mediaPreviewBar = findViewById(R.id.compose_media_preview_bar); contentWarningBar = findViewById(R.id.composeContentWarningBar); contentWarningEditor = findViewById(R.id.composeContentWarningField); + useDefaultTag = findViewById(R.id.checkbox_use_default_text); + defaultTagEditText = findViewById(R.id.edittext_default_text); charactersLeft = findViewById(R.id.composeCharactersLeftView); tootButton = findViewById(R.id.composeTootButton); pickButton = findViewById(R.id.composeAddMediaButton); @@ -381,6 +395,10 @@ public final class ComposeActivity enableButton(emojiButton, false, false); + restoreDefaultTagStatus(); + useDefaultTag.setOnCheckedChangeListener((compoundButton, b) -> saveDefaultTagStatus()); + defaultTagEditText.setOnFocusChangeListener((view, b) -> saveDefaultTagStatus()); + // Setup the interface buttons. tootButton.setOnClickListener(v -> onSendClicked()); pickButton.setOnClickListener(v -> openPickDialog()); @@ -923,6 +941,20 @@ public final class ComposeActivity } + private void restoreDefaultTagStatus() { + useDefaultTag.setChecked(preferences.getBoolean(PREF_USE_DEFAULT_TAG, false)); + defaultTagEditText.setText(preferences.getString(PREF_DEFAULT_TAG, "")); + } + + private void saveDefaultTagStatus() { + preferences.edit() + .putString(PREF_DEFAULT_TAG, defaultTagEditText.getText().toString()) + .putBoolean(PREF_USE_DEFAULT_TAG, useDefaultTag.isChecked()) + .apply(); + eventHub.dispatch(new PreferenceChangedEvent(PREF_DEFAULT_TAG)); + eventHub.dispatch(new PreferenceChangedEvent(PREF_USE_DEFAULT_TAG)); + } + private void openPickDialog() { if (addMediaBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN || addMediaBehavior.getState() == BottomSheetBehavior.STATE_COLLAPSED) { addMediaBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); @@ -1193,7 +1225,9 @@ public final class ComposeActivity private void onReadySuccess(Status.Visibility visibility, boolean sensitive) { /* Validate the status meets the character limit. */ - String contentText = textEditor.getText().toString(); + saveDefaultTagStatus(); + String contentText = useDefaultTag.isChecked() ? + (textEditor.getText().toString() + " " + defaultTagEditText.getText().toString()) : textEditor.getText().toString(); String spoilerText = ""; if (statusHideText) { spoilerText = contentWarningEditor.getText().toString(); @@ -1783,6 +1817,7 @@ public final class ComposeActivity @Override public void onBackPressed() { + saveDefaultTagStatus(); // Acting like a teen: deliberately ignoring parent. if (composeOptionsBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED || addMediaBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED || diff --git a/app/src/main/java/com/keylesspalace/tusky/FavouritesActivity.java b/app/src/main/java/com/keylesspalace/tusky/FavouritesActivity.java index cfdfbc5e3..56b2238cd 100644 --- a/app/src/main/java/com/keylesspalace/tusky/FavouritesActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/FavouritesActivity.java @@ -16,7 +16,6 @@ package com.keylesspalace.tusky; import android.os.Bundle; -import android.preference.PreferenceManager; import android.view.MenuItem; import androidx.annotation.Nullable; @@ -69,8 +68,7 @@ public class FavouritesActivity extends BottomSheetActivity implements HasAndroi fragmentTransaction.commit(); ConstraintLayout quickTootContainer = findViewById(R.id.quick_toot_container); - QuickTootHelper quickTootHelper = new QuickTootHelper(quickTootContainer, - PreferenceManager.getDefaultSharedPreferences(this), accountManager, eventHub); + QuickTootHelper quickTootHelper = new QuickTootHelper(quickTootContainer, accountManager, eventHub); eventHub.getEvents() .observeOn(AndroidSchedulers.mainThread()) diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java index f188292f2..15e1f47eb 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java @@ -185,8 +185,7 @@ public final class MainActivity extends BottomSheetActivity implements ActionBut viewPager = findViewById(R.id.pager); ConstraintLayout quickTootContainer = findViewById(R.id.quick_toot_container); - QuickTootHelper quickTootHelper = new QuickTootHelper(quickTootContainer, - PreferenceManager.getDefaultSharedPreferences(this), accountManager, eventHub); + QuickTootHelper quickTootHelper = new QuickTootHelper(quickTootContainer, accountManager, eventHub); composeButton.setOnClickListener(v -> quickTootHelper.composeButton()); tabLayout.requestFocus(); diff --git a/app/src/main/java/com/keylesspalace/tusky/ModalTimelineActivity.kt b/app/src/main/java/com/keylesspalace/tusky/ModalTimelineActivity.kt index c48eb0579..e44f2ddbc 100644 --- a/app/src/main/java/com/keylesspalace/tusky/ModalTimelineActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/ModalTimelineActivity.kt @@ -3,7 +3,6 @@ package com.keylesspalace.tusky import android.content.Context import android.content.Intent import android.os.Bundle -import android.preference.PreferenceManager import android.view.MenuItem import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.Lifecycle @@ -64,8 +63,7 @@ class ModalTimelineActivity : BottomSheetActivity(), ActionButtonActivity, HasAn } val quickTootContainer = findViewById(R.id.quick_toot_container) - val quickTootHelper = QuickTootHelper(quickTootContainer, - PreferenceManager.getDefaultSharedPreferences(this), accountManager, eventHub) + val quickTootHelper = QuickTootHelper(quickTootContainer, accountManager, eventHub) eventHub.events .observeOn(AndroidSchedulers.mainThread()) diff --git a/app/src/main/java/com/keylesspalace/tusky/ViewTagActivity.java b/app/src/main/java/com/keylesspalace/tusky/ViewTagActivity.java index e21df2ffd..a23c52bf5 100644 --- a/app/src/main/java/com/keylesspalace/tusky/ViewTagActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/ViewTagActivity.java @@ -18,7 +18,6 @@ package com.keylesspalace.tusky; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.preference.PreferenceManager; import android.view.MenuItem; import androidx.annotation.Nullable; @@ -82,8 +81,7 @@ public class ViewTagActivity extends BottomSheetActivity implements HasAndroidIn fragmentTransaction.commit(); ConstraintLayout quickTootContainer = findViewById(R.id.quick_toot_container); - QuickTootHelper quickTootHelper = new QuickTootHelper(quickTootContainer, - PreferenceManager.getDefaultSharedPreferences(this), accountManager, eventHub); + QuickTootHelper quickTootHelper = new QuickTootHelper(quickTootContainer, accountManager, eventHub); eventHub.getEvents() .observeOn(AndroidSchedulers.mainThread()) diff --git a/app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.java b/app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.java index 93a1b3226..23034701b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.java +++ b/app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.java @@ -19,6 +19,9 @@ import android.content.Context; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; +import android.provider.Settings; +import android.util.TypedValue; + import androidx.annotation.AttrRes; import androidx.annotation.ColorInt; import androidx.annotation.ColorRes; @@ -26,8 +29,6 @@ import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatDelegate; -import android.provider.Settings; -import android.util.TypedValue; import javax.inject.Inject; import javax.inject.Singleton; @@ -45,7 +46,7 @@ public class ThemeUtils { public static final String APP_THEME_DEFAULT = ThemeUtils.THEME_NIGHT; private static final String THEME_NIGHT = "night"; - private static final String THEME_DAY = "day"; + public static final String THEME_DAY = "day"; private static final String THEME_BLACK = "black"; private static final String THEME_AUTO = "auto"; public static final String THEME_SYSTEM = "auto_system"; diff --git a/app/src/main/java/net/accelf/yuito/QuickTootHelper.java b/app/src/main/java/net/accelf/yuito/QuickTootHelper.java index a6bc63a5a..41bd369a2 100644 --- a/app/src/main/java/net/accelf/yuito/QuickTootHelper.java +++ b/app/src/main/java/net/accelf/yuito/QuickTootHelper.java @@ -3,6 +3,8 @@ package net.accelf.yuito; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.graphics.Color; +import android.preference.PreferenceManager; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; @@ -19,15 +21,20 @@ import com.keylesspalace.tusky.appstore.QuickReplyEvent; import com.keylesspalace.tusky.db.AccountEntity; import com.keylesspalace.tusky.db.AccountManager; import com.keylesspalace.tusky.entity.Status; +import com.keylesspalace.tusky.util.ThemeUtils; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.Set; +import static com.keylesspalace.tusky.ComposeActivity.PREF_DEFAULT_TAG; +import static com.keylesspalace.tusky.ComposeActivity.PREF_USE_DEFAULT_TAG; + public class QuickTootHelper { private Context context; private TextView quickReplyInfo; + private TextView defaultTagInfo; private ImageView visibilityButton; private EditText tootEditText; @@ -40,14 +47,16 @@ public class QuickTootHelper { private static final String PREF_CURRENT_VISIBILITY = "current_visibility"; - public QuickTootHelper(ConstraintLayout root, SharedPreferences defPrefs, AccountManager accountManager, EventHub eventHub) { + public QuickTootHelper(ConstraintLayout root, AccountManager accountManager, EventHub eventHub) { context = root.getContext(); quickReplyInfo = root.findViewById(R.id.quick_reply_info); + defaultTagInfo = root.findViewById(R.id.default_tag_info); visibilityButton = root.findViewById(R.id.visibility_button); tootEditText = root.findViewById(R.id.toot_edit_text); Button quickTootButton = root.findViewById(R.id.toot_button); - this.defPrefs = defPrefs; + context = root.getContext(); + this.defPrefs = PreferenceManager.getDefaultSharedPreferences(context); AccountEntity account = accountManager.getActiveAccount(); if (account != null) { domain = account.getDomain(); @@ -57,6 +66,7 @@ public class QuickTootHelper { this.eventHub = eventHub; updateVisibilityButton(); + updateDefaultTagInfo(); visibilityButton.setOnClickListener(v -> setNextVisibility()); quickTootButton.setOnClickListener(v -> quickToot()); } @@ -74,8 +84,16 @@ public class QuickTootHelper { if (event instanceof QuickReplyEvent) { reply(((QuickReplyEvent) event).getStatus()); } else if (event instanceof PreferenceChangedEvent) { - if (PREF_CURRENT_VISIBILITY.equals(((PreferenceChangedEvent) event).getPreferenceKey())) { - updateVisibilityButton(); + switch (((PreferenceChangedEvent) event).getPreferenceKey()) { + case PREF_CURRENT_VISIBILITY: { + updateVisibilityButton(); + break; + } + case PREF_DEFAULT_TAG: + case PREF_USE_DEFAULT_TAG: { + updateDefaultTagInfo(); + break; + } } } } @@ -139,6 +157,22 @@ public class QuickTootHelper { } } + private void updateDefaultTagInfo() { + boolean useDefaultTag = defPrefs.getBoolean(PREF_USE_DEFAULT_TAG, false); + String defaultText = defPrefs.getString(PREF_DEFAULT_TAG, ""); + if (useDefaultTag) { + defaultTagInfo.setText(String.format("%s : %s", context.getString(R.string.hint_default_text), defaultText)); + if (ThemeUtils.THEME_DAY.equals(defPrefs.getString("appTheme", ThemeUtils.APP_THEME_DEFAULT))) { + defaultTagInfo.setTextColor(Color.RED); + } else { + defaultTagInfo.setTextColor(Color.YELLOW); + } + } else { + defaultTagInfo.setText(String.format("%s inactive", context.getString(R.string.hint_default_text))); + defaultTagInfo.setTextColor(Color.GRAY); + } + } + private Status.Visibility getCurrentVisibility() { Status.Visibility visibility = Status.Visibility.byNum(defPrefs.getInt(PREF_CURRENT_VISIBILITY, Status.Visibility.PUBLIC.getNum())); if (!Arrays.asList(ComposeActivity.CAN_USE_UNLEAKABLE) diff --git a/app/src/main/res/layout/activity_compose.xml b/app/src/main/res/layout/activity_compose.xml index 4be024f68..3780cac5f 100644 --- a/app/src/main/res/layout/activity_compose.xml +++ b/app/src/main/res/layout/activity_compose.xml @@ -53,7 +53,7 @@ android:layout_width="match_parent" android:layout_height="@dimen/compose_activity_scrollview_height" android:layout_marginTop="?attr/actionBarSize" - android:layout_marginBottom="52dp"> + android:layout_marginBottom="116dp"> + + + + + + + + + + + 表示名 プロフィール ユーザーを検索… + 実況モード 見つかりませんでした 返信… アイコン diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 07047c957..8908e3ca4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -159,6 +159,7 @@ Bio Search… Quick Toot Area + Default Hashtag No results