|
46 | 46 | import com.google.android.material.card.MaterialCardView; |
47 | 47 | import com.google.android.material.dialog.MaterialAlertDialogBuilder; |
48 | 48 | import com.google.android.material.materialswitch.MaterialSwitch; |
| 49 | +import androidx.appcompat.app.AppCompatDelegate; |
49 | 50 | import com.google.android.material.slider.Slider; |
50 | 51 | import com.google.android.material.textfield.TextInputLayout; |
51 | 52 | import com.google.android.material.transition.MaterialSharedAxis; |
|
62 | 63 | public class SettingFrag extends Fragment { |
63 | 64 | private static final String TAG = "SettingFrag"; |
64 | 65 | private Context context; |
65 | | - private MaterialSwitch mSwitchAutoEditor, mSwitchRandomizeDelay; |
| 66 | + private MaterialSwitch mSwitchAutoEditor, mSwitchRandomizeDelay, mSwitchSensitiveWord; |
66 | 67 | private MaterialCardView mCardClearCache; |
67 | | - private View mRowExportLog, mRowAboutApp, mRowLanguage, mRowCheckUpdate; |
68 | | - private TextView mTvCache, mTvDelayValue, mTvSmsRateValue, mTvLanguage; |
| 68 | + private View mRowExportLog, mRowAboutApp, mRowLanguage, mRowCheckUpdate, mRowDarkMode; |
| 69 | + private TextView mTvCache, mTvDelayValue, mTvSmsRateValue, mTvLanguage, mTvDarkModeSummary; |
69 | 70 | private LinearLayout mCardSmsRate; |
70 | 71 | private boolean isUpdatingUI = false; |
71 | 72 | private Slider mSliderDelay; |
@@ -100,6 +101,9 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat |
100 | 101 | mRowLanguage = view.findViewById(R.id.row_language); |
101 | 102 | mTvLanguage = view.findViewById(R.id.tv_language); |
102 | 103 | mRowCheckUpdate = view.findViewById(R.id.row_check_update); |
| 104 | + mRowDarkMode = view.findViewById(R.id.row_dark_mode); |
| 105 | + mTvDarkModeSummary = view.findViewById(R.id.tv_dark_mode_summary); |
| 106 | + mSwitchSensitiveWord = view.findViewById(R.id.switch_sensitive_word); |
103 | 107 |
|
104 | 108 | mSliderDelay = view.findViewById(R.id.slider_delay); |
105 | 109 | mSliderDelay.setValueFrom(Settings.SEND_DELAY_MIN); |
@@ -138,6 +142,56 @@ private void setupListeners() { |
138 | 142 | return String.format(Locale.getDefault(), "%.1fs", seconds); |
139 | 143 | }); |
140 | 144 |
|
| 145 | + // Sensitive Word Filter |
| 146 | + mSwitchSensitiveWord.setOnCheckedChangeListener((buttonView, isChecked) -> { |
| 147 | + if (isUpdatingUI) return; |
| 148 | + if (!isChecked) { |
| 149 | + // 如果用户试图关闭,弹窗警告 |
| 150 | + new MaterialAlertDialogBuilder(context) |
| 151 | + .setTitle(getString(R.string.sensitive_word_filter_dev_title)) |
| 152 | + .setMessage(getString(R.string.sensitive_word_filter_dev_msg)) |
| 153 | + .setPositiveButton(getString(R.string.disable), (dialog, which) -> { |
| 154 | + SettingManager.setSensitiveWordFilterEnabled(false); |
| 155 | + showInfo(); |
| 156 | + }) |
| 157 | + .setNegativeButton(getString(R.string.cancel), (dialog, which) -> { |
| 158 | + // 还原开关状态 |
| 159 | + isUpdatingUI = true; |
| 160 | + mSwitchSensitiveWord.setChecked(true); |
| 161 | + isUpdatingUI = false; |
| 162 | + }) |
| 163 | + .setCancelable(false) |
| 164 | + .show(); |
| 165 | + } else { |
| 166 | + SettingManager.setSensitiveWordFilterEnabled(true); |
| 167 | + showInfo(); |
| 168 | + } |
| 169 | + }); |
| 170 | + |
| 171 | + // Dark Mode |
| 172 | + mRowDarkMode.setOnClickListener(v -> { |
| 173 | + String[] options = { |
| 174 | + getString(R.string.dark_mode_option_system), |
| 175 | + getString(R.string.dark_mode_option_off), |
| 176 | + getString(R.string.dark_mode_option_on) |
| 177 | + }; |
| 178 | + int checkedItem = SettingManager.getDarkMode(); |
| 179 | + new MaterialAlertDialogBuilder(context) |
| 180 | + .setTitle(getString(R.string.dark_mode)) |
| 181 | + .setSingleChoiceItems(options, checkedItem, (dialog, which) -> { |
| 182 | + SettingManager.setDarkMode(which); |
| 183 | + int mode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM; |
| 184 | + if (which == SettingManager.DARK_MODE_LIGHT) mode = AppCompatDelegate.MODE_NIGHT_NO; |
| 185 | + else if (which == SettingManager.DARK_MODE_DARK) mode = AppCompatDelegate.MODE_NIGHT_YES; |
| 186 | + AppCompatDelegate.setDefaultNightMode(mode); |
| 187 | +// getActivity().recreate(); |
| 188 | + dialog.dismiss(); |
| 189 | + showInfo(); |
| 190 | + }) |
| 191 | + .setNegativeButton(getString(R.string.cancel), null) |
| 192 | + .show(); |
| 193 | + }); |
| 194 | + |
141 | 195 | // SMS Rate |
142 | 196 | mCardSmsRate.setOnClickListener(v -> { |
143 | 197 | View dialogView = LayoutInflater.from(context).inflate(R.layout.dialog_edit_text, null); |
@@ -304,6 +358,17 @@ public void showInfo() { |
304 | 358 | // Set switches |
305 | 359 | mSwitchAutoEditor.setChecked(SettingManager.autoEnterEditor()); |
306 | 360 | mSwitchRandomizeDelay.setChecked(SettingManager.isRandomizeDelay()); |
| 361 | + mSwitchSensitiveWord.setChecked(SettingManager.isSensitiveWordFilterEnabled()); |
| 362 | + |
| 363 | + // Display dark mode summary |
| 364 | + int darkMode = SettingManager.getDarkMode(); |
| 365 | + if (darkMode == SettingManager.DARK_MODE_LIGHT) { |
| 366 | + mTvDarkModeSummary.setText(getString(R.string.dark_mode_summary_off)); |
| 367 | + } else if (darkMode == SettingManager.DARK_MODE_DARK) { |
| 368 | + mTvDarkModeSummary.setText(getString(R.string.dark_mode_summary_on)); |
| 369 | + } else { |
| 370 | + mTvDarkModeSummary.setText(getString(R.string.dark_mode_summary_system)); |
| 371 | + } |
307 | 372 |
|
308 | 373 | // Display number column |
309 | 374 | // mTvNumberColumn.setText(TextUtils.isEmpty(numberColumn) ? "未选择" : numberColumn); |
|
0 commit comments