Move appearance to bottom sheet

This commit is contained in:
M M Arif
2025-06-26 12:41:31 +05:00
parent 67b5bd2d02
commit 30003d3787
8 changed files with 906 additions and 874 deletions

View File

@@ -127,9 +127,6 @@
android:name=".activities.CommitDetailActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|keyboard|keyboardHidden|navigation"
android:theme="@android:style/Theme.NoTitleBar"/>
<activity
android:name=".activities.SettingsAppearanceActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|keyboard|keyboardHidden|navigation"/>
<activity
android:name=".activities.ProfileActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|keyboard|keyboardHidden|navigation"/>

View File

@@ -1,463 +0,0 @@
package org.mian.gitnex.activities;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.timepicker.MaterialTimePicker;
import java.util.LinkedHashMap;
import java.util.Locale;
import org.mian.gitnex.R;
import org.mian.gitnex.databinding.ActivitySettingsAppearanceBinding;
import org.mian.gitnex.fragments.SettingsFragment;
import org.mian.gitnex.helpers.AppDatabaseSettings;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.FontsOverride;
import org.mian.gitnex.helpers.SnackBar;
/**
* @author M M Arif
*/
public class SettingsAppearanceActivity extends BaseActivity {
private static String[] customFontList;
private static int customFontSelectedChoice;
private static String[] themeList;
private static int themeSelectedChoice;
private static int langSelectedChoice;
private static String[] fragmentTabsAnimationList;
private static int fragmentTabsAnimationSelectedChoice;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivitySettingsAppearanceBinding activitySettingsAppearanceBinding =
ActivitySettingsAppearanceBinding.inflate(getLayoutInflater());
setContentView(activitySettingsAppearanceBinding.getRoot());
LinkedHashMap<String, String> lang = new LinkedHashMap<>();
lang.put("sys", getString(R.string.settingsLanguageSystem));
for (String langCode : getResources().getStringArray(R.array.languages)) {
lang.put(langCode, getLanguageDisplayName(langCode));
}
customFontList = getResources().getStringArray(R.array.fonts);
fragmentTabsAnimationList = getResources().getStringArray(R.array.fragmentTabsAnimation);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S || "S".equals(Build.VERSION.CODENAME)) {
themeList = getResources().getStringArray(R.array.themesAndroid12);
} else {
themeList = getResources().getStringArray(R.array.themes);
}
activitySettingsAppearanceBinding.topAppBar.setNavigationOnClickListener(v -> finish());
String lightMinute =
String.valueOf(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_THEME_AUTO_LIGHT_MIN_KEY));
String lightHour =
String.valueOf(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_THEME_AUTO_LIGHT_HOUR_KEY));
if (lightMinute.length() == 1) {
lightMinute = "0" + lightMinute;
}
if (lightHour.length() == 1) {
lightHour = "0" + lightHour;
}
String darkMinute =
String.valueOf(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_THEME_AUTO_DARK_MIN_KEY));
String darkHour =
String.valueOf(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_THEME_AUTO_DARK_HOUR_KEY));
if (darkMinute.length() == 1) {
darkMinute = "0" + darkMinute;
}
if (darkHour.length() == 1) {
darkHour = "0" + darkHour;
}
fragmentTabsAnimationSelectedChoice =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_TABS_ANIMATION_KEY));
customFontSelectedChoice =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_FONT_KEY));
themeSelectedChoice =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_THEME_KEY));
activitySettingsAppearanceBinding.lightThemeSelectedTime.setText(
ctx.getResources()
.getString(R.string.settingsThemeTimeSelectedHint, lightHour, lightMinute));
activitySettingsAppearanceBinding.darkThemeSelectedTime.setText(
ctx.getResources()
.getString(R.string.settingsThemeTimeSelectedHint, darkHour, darkMinute));
activitySettingsAppearanceBinding.customFontSelected.setText(
customFontList[customFontSelectedChoice]);
activitySettingsAppearanceBinding.themeSelected.setText(themeList[themeSelectedChoice]);
activitySettingsAppearanceBinding.fragmentTabsAnimationFrameSelected.setText(
fragmentTabsAnimationList[fragmentTabsAnimationSelectedChoice]);
if (themeList[themeSelectedChoice].startsWith("Auto")) {
activitySettingsAppearanceBinding.darkThemeTimeSelectionFrame.setVisibility(
View.VISIBLE);
activitySettingsAppearanceBinding.lightThemeTimeSelectionFrame.setVisibility(
View.VISIBLE);
} else {
activitySettingsAppearanceBinding.darkThemeTimeSelectionFrame.setVisibility(View.GONE);
activitySettingsAppearanceBinding.lightThemeTimeSelectionFrame.setVisibility(View.GONE);
}
activitySettingsAppearanceBinding.switchCounterBadge.setChecked(
Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_COUNTER_KEY)));
// counter badge switcher
activitySettingsAppearanceBinding.switchCounterBadge.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
AppDatabaseSettings.updateSettingsValue(
ctx, String.valueOf(isChecked), AppDatabaseSettings.APP_COUNTER_KEY);
SnackBar.success(
ctx,
findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
activitySettingsAppearanceBinding.counterBadgeFrame.setOnClickListener(
v ->
activitySettingsAppearanceBinding.switchCounterBadge.setChecked(
!activitySettingsAppearanceBinding.switchCounterBadge.isChecked()));
// hide email and language in user profile screen switcher
activitySettingsAppearanceBinding.switchHideEmailLangInProfile.setChecked(
Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
ctx,
AppDatabaseSettings.APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_KEY)));
activitySettingsAppearanceBinding.switchHideEmailLangInProfile.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
AppDatabaseSettings.updateSettingsValue(
ctx,
String.valueOf(isChecked),
AppDatabaseSettings.APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_KEY);
SnackBar.success(
ctx,
findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
activitySettingsAppearanceBinding.hideEmailLangInProfileFrame.setOnClickListener(
v ->
activitySettingsAppearanceBinding.switchHideEmailLangInProfile.setChecked(
!activitySettingsAppearanceBinding.switchHideEmailLangInProfile
.isChecked()));
// hide email in app navigation drawer switcher
activitySettingsAppearanceBinding.switchHideEmailNavDrawer.setChecked(
Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_USER_HIDE_EMAIL_IN_NAV_KEY)));
activitySettingsAppearanceBinding.switchHideEmailNavDrawer.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
AppDatabaseSettings.updateSettingsValue(
ctx,
String.valueOf(isChecked),
AppDatabaseSettings.APP_USER_HIDE_EMAIL_IN_NAV_KEY);
SnackBar.success(
ctx,
findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
activitySettingsAppearanceBinding.hideEmailNavDrawerFrame.setOnClickListener(
v ->
activitySettingsAppearanceBinding.switchHideEmailNavDrawer.setChecked(
!activitySettingsAppearanceBinding.switchHideEmailNavDrawer
.isChecked()));
// show labels in lists(issues, pr) - default is color dots
activitySettingsAppearanceBinding.switchLabelsInListBadge.setChecked(
Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_LABELS_IN_LIST_KEY)));
activitySettingsAppearanceBinding.switchLabelsInListBadge.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
AppDatabaseSettings.updateSettingsValue(
ctx,
String.valueOf(isChecked),
AppDatabaseSettings.APP_LABELS_IN_LIST_KEY);
SnackBar.success(
ctx,
findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
activitySettingsAppearanceBinding.labelsInListFrame.setOnClickListener(
v ->
activitySettingsAppearanceBinding.switchLabelsInListBadge.setChecked(
!activitySettingsAppearanceBinding.switchLabelsInListBadge
.isChecked()));
// theme selection dialog
activitySettingsAppearanceBinding.themeSelectionFrame.setOnClickListener(
view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.themeSelectorDialogTitle)
.setSingleChoiceItems(
themeList,
themeSelectedChoice,
(dialogInterfaceTheme, i) -> {
themeSelectedChoice = i;
activitySettingsAppearanceBinding.themeSelected
.setText(themeList[i]);
AppDatabaseSettings.updateSettingsValue(
ctx,
String.valueOf(i),
AppDatabaseSettings.APP_THEME_KEY);
SettingsFragment.refreshParent = true;
this.recreate();
this.overridePendingTransition(0, 0);
dialogInterfaceTheme.dismiss();
SnackBar.success(
ctx,
findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
materialAlertDialogBuilder.create().show();
});
activitySettingsAppearanceBinding.lightThemeTimeSelectionFrame.setOnClickListener(
view -> lightTimePicker());
activitySettingsAppearanceBinding.darkThemeTimeSelectionFrame.setOnClickListener(
view -> darkTimePicker());
// custom font dialog
activitySettingsAppearanceBinding.customFontFrame.setOnClickListener(
view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.settingsCustomFontSelectorDialogTitle)
.setCancelable(customFontSelectedChoice != -1)
.setSingleChoiceItems(
customFontList,
customFontSelectedChoice,
(dialogInterfaceCustomFont, i) -> {
customFontSelectedChoice = i;
activitySettingsAppearanceBinding.customFontSelected
.setText(customFontList[i]);
AppDatabaseSettings.updateSettingsValue(
ctx,
String.valueOf(i),
AppDatabaseSettings.APP_FONT_KEY);
new Handler()
.postDelayed(
() -> {
AppUtil.typeface =
null; // reset typeface
FontsOverride.setDefaultFont(
this);
SettingsFragment.refreshParent =
true;
this.recreate();
this.overridePendingTransition(
0, 0);
},
1000);
dialogInterfaceCustomFont.dismiss();
SnackBar.success(
ctx,
findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
materialAlertDialogBuilder.create().show();
});
// fragment tabs animation dialog
activitySettingsAppearanceBinding.fragmentTabsAnimationFrame.setOnClickListener(
view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.fragmentTabsAnimationHeader)
.setCancelable(fragmentTabsAnimationSelectedChoice != -1)
.setSingleChoiceItems(
fragmentTabsAnimationList,
fragmentTabsAnimationSelectedChoice,
(dialogInterfaceTabsAnimation, i) -> {
fragmentTabsAnimationSelectedChoice = i;
activitySettingsAppearanceBinding
.fragmentTabsAnimationFrameSelected.setText(
fragmentTabsAnimationList[i]);
AppDatabaseSettings.updateSettingsValue(
ctx,
String.valueOf(i),
AppDatabaseSettings.APP_TABS_ANIMATION_KEY);
SettingsFragment.refreshParent = true;
this.recreate();
this.overridePendingTransition(0, 0);
dialogInterfaceTabsAnimation.dismiss();
SnackBar.success(
ctx,
findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
materialAlertDialogBuilder.create().show();
});
// language selector dialog
activitySettingsAppearanceBinding.helpTranslate.setOnClickListener(
v12 ->
AppUtil.openUrlInBrowser(
this, getResources().getString(R.string.crowdInLink)));
String[] locale =
AppDatabaseSettings.getSettingsValue(ctx, AppDatabaseSettings.APP_LOCALE_KEY)
.split("\\|");
langSelectedChoice = Integer.parseInt(locale[0]);
activitySettingsAppearanceBinding.tvLanguageSelected.setText(
lang.get(lang.keySet().toArray(new String[0])[langSelectedChoice]));
// language dialog
activitySettingsAppearanceBinding.langFrame.setOnClickListener(
view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.settingsLanguageSelectorDialogTitle)
.setCancelable(langSelectedChoice != -1)
.setNeutralButton(getString(R.string.cancelButton), null)
.setSingleChoiceItems(
lang.values().toArray(new String[0]),
langSelectedChoice,
(dialogInterface, i) -> {
String selectedLanguage =
lang.keySet().toArray(new String[0])[i];
AppDatabaseSettings.updateSettingsValue(
ctx,
i + "|" + selectedLanguage,
AppDatabaseSettings.APP_LOCALE_KEY);
SettingsFragment.refreshParent = true;
this.overridePendingTransition(0, 0);
dialogInterface.dismiss();
SnackBar.success(
ctx,
findViewById(android.R.id.content),
getString(R.string.settingsSave));
this.recreate();
});
materialAlertDialogBuilder.create().show();
});
}
public void lightTimePicker() {
int hour =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_THEME_AUTO_LIGHT_HOUR_KEY));
int minute =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_THEME_AUTO_LIGHT_MIN_KEY));
MaterialTimePicker materialTimePicker =
new MaterialTimePicker.Builder().setHour(hour).setMinute(minute).build();
materialTimePicker.addOnPositiveButtonClickListener(
selection -> {
AppDatabaseSettings.updateSettingsValue(
ctx,
String.valueOf(materialTimePicker.getHour()),
AppDatabaseSettings.APP_THEME_AUTO_LIGHT_HOUR_KEY);
AppDatabaseSettings.updateSettingsValue(
ctx,
String.valueOf(materialTimePicker.getMinute()),
AppDatabaseSettings.APP_THEME_AUTO_LIGHT_MIN_KEY);
SettingsFragment.refreshParent = true;
overridePendingTransition(0, 0);
SnackBar.success(
ctx,
findViewById(android.R.id.content),
getString(R.string.settingsSave));
recreate();
});
materialTimePicker.show(getSupportFragmentManager(), "fragmentManager");
}
public void darkTimePicker() {
int hour =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_THEME_AUTO_DARK_HOUR_KEY));
int minute =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_THEME_AUTO_DARK_MIN_KEY));
MaterialTimePicker materialTimePicker =
new MaterialTimePicker.Builder().setHour(hour).setMinute(minute).build();
materialTimePicker.addOnPositiveButtonClickListener(
selection -> {
AppDatabaseSettings.updateSettingsValue(
ctx,
String.valueOf(materialTimePicker.getHour()),
AppDatabaseSettings.APP_THEME_AUTO_DARK_HOUR_KEY);
AppDatabaseSettings.updateSettingsValue(
ctx,
String.valueOf(materialTimePicker.getMinute()),
AppDatabaseSettings.APP_THEME_AUTO_DARK_MIN_KEY);
SettingsFragment.refreshParent = true;
overridePendingTransition(0, 0);
SnackBar.success(
ctx,
findViewById(android.R.id.content),
getString(R.string.settingsSave));
recreate();
});
materialTimePicker.show(getSupportFragmentManager(), "fragmentManager");
}
private static String getLanguageDisplayName(String langCode) {
Locale english = new Locale("en");
String[] multiCodeLang = langCode.split("-");
String countryCode;
if (langCode.contains("-")) {
langCode = multiCodeLang[0];
countryCode = multiCodeLang[1];
} else {
countryCode = "";
}
Locale translated = new Locale(langCode, countryCode);
return String.format(
"%s (%s)",
translated.getDisplayName(translated), translated.getDisplayName(english));
}
}

View File

@@ -0,0 +1,492 @@
package org.mian.gitnex.fragments;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.google.android.material.chip.Chip;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.timepicker.MaterialTimePicker;
import java.util.LinkedHashMap;
import java.util.Locale;
import org.mian.gitnex.R;
import org.mian.gitnex.databinding.BottomSheetSettingsAppearanceBinding;
import org.mian.gitnex.helpers.AppDatabaseSettings;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.FontsOverride;
import org.mian.gitnex.helpers.SnackBar;
/**
* @author mmarif
*/
public class BottomSheetSettingsAppearanceFragment extends BottomSheetDialogFragment {
private static final String TAG = "BottomSheetSettingsAppearance";
private BottomSheetSettingsAppearanceBinding binding;
private static int customFontSelectedChoice;
private static String[] themeList;
private static int themeSelectedChoice;
private static int langSelectedChoice;
private static int fragmentTabsAnimationSelectedChoice;
private LinkedHashMap<String, String> lang;
@Nullable @Override
public View onCreateView(
@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
binding = BottomSheetSettingsAppearanceBinding.inflate(inflater, container, false);
lang = new LinkedHashMap<>();
lang.put("sys", getString(R.string.settingsLanguageSystem));
for (String langCode : getResources().getStringArray(R.array.languages)) {
lang.put(langCode, getLanguageDisplayName(langCode));
}
String[] customFontList = getResources().getStringArray(R.array.fonts);
String[] fragmentTabsAnimationList =
getResources().getStringArray(R.array.fragmentTabsAnimation);
themeList =
Build.VERSION.SDK_INT >= Build.VERSION_CODES.S || "S".equals(Build.VERSION.CODENAME)
? getResources().getStringArray(R.array.themesAndroid12)
: getResources().getStringArray(R.array.themes);
customFontSelectedChoice =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
requireContext(), AppDatabaseSettings.APP_FONT_KEY));
themeSelectedChoice =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
requireContext(), AppDatabaseSettings.APP_THEME_KEY));
fragmentTabsAnimationSelectedChoice =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
requireContext(), AppDatabaseSettings.APP_TABS_ANIMATION_KEY));
String[] locale =
AppDatabaseSettings.getSettingsValue(
requireContext(), AppDatabaseSettings.APP_LOCALE_KEY)
.split("\\|");
langSelectedChoice = Integer.parseInt(locale[0]);
String lightMinute =
String.valueOf(
AppDatabaseSettings.getSettingsValue(
requireContext(),
AppDatabaseSettings.APP_THEME_AUTO_LIGHT_MIN_KEY));
String lightHour =
String.valueOf(
AppDatabaseSettings.getSettingsValue(
requireContext(),
AppDatabaseSettings.APP_THEME_AUTO_LIGHT_HOUR_KEY));
lightMinute = lightMinute.length() == 1 ? "0" + lightMinute : lightMinute;
lightHour = lightHour.length() == 1 ? "0" + lightHour : lightHour;
String darkMinute =
String.valueOf(
AppDatabaseSettings.getSettingsValue(
requireContext(), AppDatabaseSettings.APP_THEME_AUTO_DARK_MIN_KEY));
String darkHour =
String.valueOf(
AppDatabaseSettings.getSettingsValue(
requireContext(),
AppDatabaseSettings.APP_THEME_AUTO_DARK_HOUR_KEY));
darkMinute = darkMinute.length() == 1 ? "0" + darkMinute : darkMinute;
darkHour = darkHour.length() == 1 ? "0" + darkHour : darkHour;
for (int i = 0; i < themeList.length; i++) {
Chip chip = (Chip) inflater.inflate(R.layout.chip_item, binding.themeChipGroup, false);
chip.setId(View.generateViewId());
chip.setText(themeList[i]);
chip.setCheckable(true);
chip.setClickable(true);
chip.setFocusable(true);
if (i == themeSelectedChoice) chip.setChecked(true);
binding.themeChipGroup.addView(chip);
}
for (int i = 0; i < customFontList.length; i++) {
Chip chip =
(Chip) inflater.inflate(R.layout.chip_item, binding.customFontChipGroup, false);
chip.setId(View.generateViewId());
chip.setText(customFontList[i]);
chip.setCheckable(true);
chip.setClickable(true);
chip.setFocusable(true);
if (i == customFontSelectedChoice) chip.setChecked(true);
binding.customFontChipGroup.addView(chip);
}
for (int i = 0; i < fragmentTabsAnimationList.length; i++) {
Chip chip =
(Chip)
inflater.inflate(
R.layout.chip_item,
binding.fragmentTabsAnimationChipGroup,
false);
chip.setId(View.generateViewId());
chip.setText(fragmentTabsAnimationList[i]);
chip.setCheckable(true);
chip.setClickable(true);
chip.setFocusable(true);
if (i == fragmentTabsAnimationSelectedChoice) chip.setChecked(true);
binding.fragmentTabsAnimationChipGroup.addView(chip);
}
binding.lightThemeSelectedTime.setText(
getResources()
.getString(R.string.settingsThemeTimeSelectedHint, lightHour, lightMinute));
binding.darkThemeSelectedTime.setText(
getResources()
.getString(R.string.settingsThemeTimeSelectedHint, darkHour, darkMinute));
binding.tvLanguageSelected.setText(
lang.get(lang.keySet().toArray(new String[0])[langSelectedChoice]));
binding.switchCounterBadge.setChecked(
Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
requireContext(), AppDatabaseSettings.APP_COUNTER_KEY)));
binding.switchHideEmailLangInProfile.setChecked(
Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
requireContext(),
AppDatabaseSettings.APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_KEY)));
binding.switchHideEmailNavDrawer.setChecked(
Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
requireContext(),
AppDatabaseSettings.APP_USER_HIDE_EMAIL_IN_NAV_KEY)));
binding.switchLabelsInListBadge.setChecked(
Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
requireContext(), AppDatabaseSettings.APP_LABELS_IN_LIST_KEY)));
binding.lightThemeTimeSelectionFrame.setVisibility(
themeList[themeSelectedChoice].startsWith("Auto") ? View.VISIBLE : View.GONE);
binding.darkThemeTimeSelectionFrame.setVisibility(
themeList[themeSelectedChoice].startsWith("Auto") ? View.VISIBLE : View.GONE);
binding.themeChipGroup.setOnCheckedStateChangeListener(
(group, checkedIds) -> {
Log.d(TAG, "Theme chip checked: " + checkedIds);
if (checkedIds.size() == 1) {
int newSelection = getThemeChipPosition(checkedIds.get(0));
Log.d(TAG, "Theme new selection: " + newSelection);
if (newSelection != themeSelectedChoice) {
themeSelectedChoice = newSelection;
AppDatabaseSettings.updateSettingsValue(
requireContext(),
String.valueOf(newSelection),
AppDatabaseSettings.APP_THEME_KEY);
binding.lightThemeTimeSelectionFrame.setVisibility(
themeList[newSelection].startsWith("Auto")
? View.VISIBLE
: View.GONE);
binding.darkThemeTimeSelectionFrame.setVisibility(
themeList[newSelection].startsWith("Auto")
? View.VISIBLE
: View.GONE);
SettingsFragment.refreshParent = true;
requireActivity().recreate();
SnackBar.success(
requireContext(),
requireActivity().findViewById(android.R.id.content),
getString(R.string.settingsSave));
}
}
});
binding.lightThemeTimeSelectionFrame.setOnClickListener(v -> lightTimePicker());
binding.darkThemeTimeSelectionFrame.setOnClickListener(v -> darkTimePicker());
binding.customFontChipGroup.setOnCheckedStateChangeListener(
(group, checkedIds) -> {
Log.d(TAG, "Font chip checked: " + checkedIds);
if (checkedIds.size() == 1) {
int newSelection = getCustomFontChipPosition(checkedIds.get(0));
Log.d(TAG, "Font new selection: " + newSelection);
if (newSelection != customFontSelectedChoice) {
customFontSelectedChoice = newSelection;
AppDatabaseSettings.updateSettingsValue(
requireContext(),
String.valueOf(newSelection),
AppDatabaseSettings.APP_FONT_KEY);
new Handler()
.postDelayed(
() -> {
AppUtil.typeface = null; // reset typeface
FontsOverride.setDefaultFont(requireContext());
SettingsFragment.refreshParent = true;
requireActivity().recreate();
},
1000);
SnackBar.success(
requireContext(),
requireActivity().findViewById(android.R.id.content),
getString(R.string.settingsSave));
}
}
});
binding.fragmentTabsAnimationChipGroup.setOnCheckedStateChangeListener(
(group, checkedIds) -> {
Log.d(TAG, "Tabs animation chip checked: " + checkedIds);
if (checkedIds.size() == 1) {
int newSelection = getFragmentTabsAnimationChipPosition(checkedIds.get(0));
Log.d(TAG, "Tabs animation new selection: " + newSelection);
if (newSelection != fragmentTabsAnimationSelectedChoice) {
fragmentTabsAnimationSelectedChoice = newSelection;
AppDatabaseSettings.updateSettingsValue(
requireContext(),
String.valueOf(newSelection),
AppDatabaseSettings.APP_TABS_ANIMATION_KEY);
SettingsFragment.refreshParent = true;
requireActivity().recreate();
SnackBar.success(
requireContext(),
requireActivity().findViewById(android.R.id.content),
getString(R.string.settingsSave));
}
}
});
binding.counterBadgeFrame.setOnClickListener(
v ->
binding.switchCounterBadge.setChecked(
!binding.switchCounterBadge.isChecked()));
binding.switchCounterBadge.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
AppDatabaseSettings.updateSettingsValue(
requireContext(),
String.valueOf(isChecked),
AppDatabaseSettings.APP_COUNTER_KEY);
SnackBar.success(
requireContext(),
requireActivity().findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
binding.hideEmailLangInProfileFrame.setOnClickListener(
v ->
binding.switchHideEmailLangInProfile.setChecked(
!binding.switchHideEmailLangInProfile.isChecked()));
binding.switchHideEmailLangInProfile.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
AppDatabaseSettings.updateSettingsValue(
requireContext(),
String.valueOf(isChecked),
AppDatabaseSettings.APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_KEY);
SnackBar.success(
requireContext(),
requireActivity().findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
binding.hideEmailNavDrawerFrame.setOnClickListener(
v ->
binding.switchHideEmailNavDrawer.setChecked(
!binding.switchHideEmailNavDrawer.isChecked()));
binding.switchHideEmailNavDrawer.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
AppDatabaseSettings.updateSettingsValue(
requireContext(),
String.valueOf(isChecked),
AppDatabaseSettings.APP_USER_HIDE_EMAIL_IN_NAV_KEY);
SnackBar.success(
requireContext(),
requireActivity().findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
binding.labelsInListFrame.setOnClickListener(
v ->
binding.switchLabelsInListBadge.setChecked(
!binding.switchLabelsInListBadge.isChecked()));
binding.switchLabelsInListBadge.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
AppDatabaseSettings.updateSettingsValue(
requireContext(),
String.valueOf(isChecked),
AppDatabaseSettings.APP_LABELS_IN_LIST_KEY);
SnackBar.success(
requireContext(),
requireActivity().findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
binding.langFrame.setOnClickListener(
v -> {
MaterialAlertDialogBuilder builder =
new MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.settingsLanguageSelectorDialogTitle)
.setCancelable(langSelectedChoice != -1)
.setNeutralButton(R.string.cancelButton, null)
.setSingleChoiceItems(
lang.values().toArray(new String[0]),
langSelectedChoice,
(dialog, i) -> {
String selectedLanguage =
lang.keySet().toArray(new String[0])[i];
AppDatabaseSettings.updateSettingsValue(
requireContext(),
i + "|" + selectedLanguage,
AppDatabaseSettings.APP_LOCALE_KEY);
SettingsFragment.refreshParent = true;
requireActivity().recreate();
dialog.dismiss();
SnackBar.success(
requireContext(),
requireActivity()
.findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
builder.create().show();
});
binding.helpTranslate.setOnClickListener(
v ->
AppUtil.openUrlInBrowser(
requireContext(), getResources().getString(R.string.crowdInLink)));
return binding.getRoot();
}
private void lightTimePicker() {
int hour =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
requireContext(),
AppDatabaseSettings.APP_THEME_AUTO_LIGHT_HOUR_KEY));
int minute =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
requireContext(),
AppDatabaseSettings.APP_THEME_AUTO_LIGHT_MIN_KEY));
MaterialTimePicker picker =
new MaterialTimePicker.Builder().setHour(hour).setMinute(minute).build();
picker.addOnPositiveButtonClickListener(
v -> {
AppDatabaseSettings.updateSettingsValue(
requireContext(),
String.valueOf(picker.getHour()),
AppDatabaseSettings.APP_THEME_AUTO_LIGHT_HOUR_KEY);
AppDatabaseSettings.updateSettingsValue(
requireContext(),
String.valueOf(picker.getMinute()),
AppDatabaseSettings.APP_THEME_AUTO_LIGHT_MIN_KEY);
SettingsFragment.refreshParent = true;
requireActivity().recreate();
String minuteStr =
picker.getMinute() < 10
? "0" + picker.getMinute()
: String.valueOf(picker.getMinute());
String hourStr =
picker.getHour() < 10
? "0" + picker.getHour()
: String.valueOf(picker.getHour());
binding.lightThemeSelectedTime.setText(
getResources()
.getString(
R.string.settingsThemeTimeSelectedHint,
hourStr,
minuteStr));
SnackBar.success(
requireContext(),
requireActivity().findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
picker.show(getParentFragmentManager(), "lightTimePicker");
}
private void darkTimePicker() {
int hour =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
requireContext(),
AppDatabaseSettings.APP_THEME_AUTO_DARK_HOUR_KEY));
int minute =
Integer.parseInt(
AppDatabaseSettings.getSettingsValue(
requireContext(), AppDatabaseSettings.APP_THEME_AUTO_DARK_MIN_KEY));
MaterialTimePicker picker =
new MaterialTimePicker.Builder().setHour(hour).setMinute(minute).build();
picker.addOnPositiveButtonClickListener(
v -> {
AppDatabaseSettings.updateSettingsValue(
requireContext(),
String.valueOf(picker.getHour()),
AppDatabaseSettings.APP_THEME_AUTO_DARK_HOUR_KEY);
AppDatabaseSettings.updateSettingsValue(
requireContext(),
String.valueOf(picker.getMinute()),
AppDatabaseSettings.APP_THEME_AUTO_DARK_MIN_KEY);
SettingsFragment.refreshParent = true;
requireActivity().recreate();
String minuteStr =
picker.getMinute() < 10
? "0" + picker.getMinute()
: String.valueOf(picker.getMinute());
String hourStr =
picker.getHour() < 10
? "0" + picker.getHour()
: String.valueOf(picker.getHour());
binding.darkThemeSelectedTime.setText(
getResources()
.getString(
R.string.settingsThemeTimeSelectedHint,
hourStr,
minuteStr));
SnackBar.success(
requireContext(),
requireActivity().findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
picker.show(getParentFragmentManager(), "darkTimePicker");
}
private int getThemeChipPosition(int checkedId) {
for (int i = 0; i < binding.themeChipGroup.getChildCount(); i++) {
Chip chip = (Chip) binding.themeChipGroup.getChildAt(i);
if (chip.getId() == checkedId) return i;
}
return themeSelectedChoice;
}
private int getCustomFontChipPosition(int checkedId) {
for (int i = 0; i < binding.customFontChipGroup.getChildCount(); i++) {
Chip chip = (Chip) binding.customFontChipGroup.getChildAt(i);
if (chip.getId() == checkedId) return i;
}
return customFontSelectedChoice;
}
private int getFragmentTabsAnimationChipPosition(int checkedId) {
for (int i = 0; i < binding.fragmentTabsAnimationChipGroup.getChildCount(); i++) {
Chip chip = (Chip) binding.fragmentTabsAnimationChipGroup.getChildAt(i);
if (chip.getId() == checkedId) return i;
}
return fragmentTabsAnimationSelectedChoice;
}
private String getLanguageDisplayName(String langCode) {
Locale english = new Locale("en");
String[] multiCodeLang = langCode.split("-");
String countryCode = langCode.contains("-") ? multiCodeLang[1] : "";
langCode = multiCodeLang[0];
Locale translated = new Locale(langCode, countryCode);
return String.format(
"%s (%s)",
translated.getDisplayName(translated), translated.getDisplayName(english));
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}

View File

@@ -12,7 +12,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.SettingsAppearanceActivity;
import org.mian.gitnex.databinding.FragmentSettingsBinding;
/**
@@ -43,7 +42,9 @@ public class SettingsFragment extends Fragment {
.show(getChildFragmentManager(), "BottomSheetSettingsGeneral"));
fragmentSettingsBinding.appearanceFrame.setOnClickListener(
v1 -> startActivity(new Intent(ctx, SettingsAppearanceActivity.class)));
v1 ->
new BottomSheetSettingsAppearanceFragment()
.show(getChildFragmentManager(), "BottomSheetSettingsAppearance"));
fragmentSettingsBinding.codeEditorFrame.setOnClickListener(
v1 ->

View File

@@ -1,405 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/primaryBackgroundColor"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/primaryBackgroundColor">
<com.google.android.material.appbar.CollapsingToolbarLayout
style="?attr/collapsingToolbarLayoutLargeStyle"
android:layout_width="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
android:background="?attr/primaryBackgroundColor"
app:contentScrim="?attr/primaryBackgroundColor"
android:layout_height="?attr/collapsingToolbarLayoutLargeSize">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/topAppBar"
android:layout_width="match_parent"
android:elevation="0dp"
android:layout_height="?attr/actionBarSize"
app:title="@string/settingsAppearanceHeader"
app:layout_collapseMode="pin"
app:navigationIcon="@drawable/ic_close" />
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/dimen16dp">
<LinearLayout
android:id="@+id/themeSelectionFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:layout_marginTop="@dimen/dimen8dp"
android:orientation="vertical">
<TextView
android:id="@+id/themeHeaderSelector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/themeSelectionHeaderText"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp" />
<TextView
android:id="@+id/themeSelected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/themeSelectionSelectedText"
android:textColor="?attr/selectedTextColor"
android:textSize="@dimen/dimen16sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/lightThemeTimeSelectionFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:clickable="true"
android:focusable="true"
android:orientation="vertical">
<TextView
android:id="@+id/lightThemeTimeHeaderSelector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsLightThemeTimeSelectorHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp" />
<TextView
android:id="@+id/lightThemeSelectedTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsThemeTimeSelectedHint"
android:textColor="?attr/selectedTextColor"
android:textSize="@dimen/dimen16sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/darkThemeTimeSelectionFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:clickable="true"
android:focusable="true"
android:orientation="vertical">
<TextView
android:id="@+id/darkThemeTimeHeaderSelector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsDarkThemeTimeSelectorHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp" />
<TextView
android:id="@+id/darkThemeSelectedTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsThemeTimeSelectedHint"
android:textColor="?attr/selectedTextColor"
android:textSize="@dimen/dimen16sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/customFontFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:clickable="true"
android:focusable="true"
android:orientation="vertical">
<TextView
android:id="@+id/customFontHeaderSelector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsCustomFontHeaderText"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp" />
<TextView
android:id="@+id/customFontSelected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsCustomFontDefault"
android:textColor="?attr/selectedTextColor"
android:textSize="@dimen/dimen16sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/fragmentTabsAnimationFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:clickable="true"
android:focusable="true"
android:orientation="vertical">
<TextView
android:id="@+id/fragmentTabsAnimationFrameHeaderSelector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/fragmentTabsAnimationHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp" />
<TextView
android:id="@+id/fragmentTabsAnimationFrameSelected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/fadeOut"
android:textColor="?attr/selectedTextColor"
android:textSize="@dimen/dimen16sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/counterBadgeFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tvCounterBadgeHeader"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/settingsCounterBadges"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switchCounterBadge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/settingsCounterBadges" />
</LinearLayout>
<LinearLayout
android:id="@+id/labelsInListFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvLabelsInListHeader"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingEnd="@dimen/dimen16dp"
android:paddingStart="@dimen/dimen0dp"
android:text="@string/settingsLabelsInListHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/switchLabelsInListBadge"
app:layout_constraintBaseline_toBaselineOf="@id/switchLabelsInListBadge"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switchLabelsInListBadge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/settingsLabelsInListHeader"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dimen96dp"
android:text="@string/settingsLabelsInListHint"
android:textColor="?attr/hintColor"
android:textSize="@dimen/dimen12sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/hideEmailLangInProfileFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvHideEmailLangInProfileHeader"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingEnd="@dimen/dimen16dp"
android:paddingStart="@dimen/dimen0dp"
android:text="@string/hideEmailLangInProfileHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/switchHideEmailLangInProfile"
app:layout_constraintBaseline_toBaselineOf="@id/switchHideEmailLangInProfile"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switchHideEmailLangInProfile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/hideEmailLangInProfileHeader"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dimen96dp"
android:text="@string/hideEmailLangInProfileHint"
android:textColor="?attr/hintColor"
android:textSize="@dimen/dimen12sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/hideEmailNavDrawerFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvHideEmailNavDrawerHeader"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingEnd="@dimen/dimen16dp"
android:paddingStart="@dimen/dimen0dp"
android:text="@string/hideEmailNavDrawerHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/switchHideEmailNavDrawer"
app:layout_constraintBaseline_toBaselineOf="@id/switchHideEmailNavDrawer"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switchHideEmailNavDrawer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/hideEmailNavDrawerHeader"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dimen96dp"
android:text="@string/hideEmailNavDrawerHint"
android:textColor="?attr/hintColor"
android:textSize="@dimen/dimen12sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/langFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:clickable="true"
android:focusable="true"
android:orientation="vertical">
<TextView
android:id="@+id/tvLanguageHeaderSelector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsLanguageSelectorHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp" />
<TextView
android:id="@+id/tvLanguageSelected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsLanguageSelectedHeaderDefault"
android:textColor="?attr/selectedTextColor"
android:textSize="@dimen/dimen16sp" />
</LinearLayout>
<TextView
android:id="@+id/helpTranslate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web"
android:background="?android:attr/selectableItemBackground"
android:paddingTop="@dimen/dimen12dp"
android:text="@string/settingsHelpTranslateText"
android:textColor="@color/lightBlue"
android:textSize="@dimen/dimen16sp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -0,0 +1,402 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/primaryBackgroundColor">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="@dimen/dimen6dp"
android:paddingBottom="@dimen/dimen12dp">
<View
android:layout_width="@dimen/dimen32dp"
android:layout_height="@dimen/dimen6dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="@dimen/dimen8dp"
android:background="@drawable/bottom_sheet_handle"
android:backgroundTint="?attr/primaryTextColor" />
<LinearLayout
android:id="@+id/headerFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/dimen8dp">
<TextView
android:id="@+id/bottomSheetHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/settingsAppearanceHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp"/>
<com.google.android.material.card.MaterialCardView
style="?attr/materialCardViewFilledStyle"
android:layout_width="@dimen/dimen28dp"
android:layout_height="@dimen/dimen4dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/dimen8dp"
android:layout_marginBottom="@dimen/dimen16dp"
app:cardCornerRadius="@dimen/dimen24dp"
app:cardElevation="@dimen/dimen0dp">
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/fabColor" />
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
<LinearLayout
android:id="@+id/themeSelectionFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen24dp"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
android:orientation="vertical">
<TextView
android:id="@+id/themeHeaderSelector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/themeSelectionHeaderText"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/themeChipGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen8dp"
app:singleSelection="true"
app:selectionRequired="true" />
</LinearLayout>
<LinearLayout
android:id="@+id/lightThemeTimeSelectionFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen24dp"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/lightThemeTimeHeaderSelector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsLightThemeTimeSelectorHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/lightThemeSelectedTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen4dp"
android:text="@string/settingsThemeTimeSelectedHint"
android:textColor="?attr/selectedTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/darkThemeTimeSelectionFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen24dp"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/darkThemeTimeHeaderSelector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsDarkThemeTimeSelectorHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/darkThemeSelectedTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen4dp"
android:text="@string/settingsThemeTimeSelectedHint"
android:textColor="?attr/selectedTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/customFontFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen24dp"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
android:orientation="vertical">
<TextView
android:id="@+id/customFontHeaderSelector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsCustomFontHeaderText"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/customFontChipGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen8dp"
app:singleSelection="true"
app:selectionRequired="true" />
</LinearLayout>
<LinearLayout
android:id="@+id/fragmentTabsAnimationFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen24dp"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
android:orientation="vertical">
<TextView
android:id="@+id/fragmentTabsAnimationFrameHeaderSelector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/fragmentTabsAnimationHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/fragmentTabsAnimationChipGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen8dp"
app:singleSelection="true"
app:selectionRequired="true" />
</LinearLayout>
<LinearLayout
android:id="@+id/counterBadgeFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen24dp"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tvCounterBadgeHeader"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.90"
android:text="@string/settingsCounterBadges"
android:textColor="?attr/primaryTextColor"
android:layout_marginTop="@dimen/dimen4dp"
android:textSize="@dimen/dimen16sp" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switchCounterBadge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/settingsCounterBadges"
style="@style/m3SwitchStyle"
android:layout_weight="0.10" />
</LinearLayout>
<LinearLayout
android:id="@+id/labelsInListFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen24dp"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tvLabelsInListHeader"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.90"
android:text="@string/settingsLabelsInListHeader"
android:textColor="?attr/primaryTextColor"
android:layout_marginTop="@dimen/dimen4dp"
android:textSize="@dimen/dimen16sp" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switchLabelsInListBadge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/settingsLabelsInListHeader"
style="@style/m3SwitchStyle"
android:layout_weight="0.10" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen4dp"
android:text="@string/settingsLabelsInListHint"
android:textColor="?attr/hintColor"
android:textSize="@dimen/dimen12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/hideEmailLangInProfileFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen24dp"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tvHideEmailLangInProfileHeader"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.90"
android:text="@string/hideEmailLangInProfileHeader"
android:textColor="?attr/primaryTextColor"
android:layout_marginTop="@dimen/dimen4dp"
android:textSize="@dimen/dimen16sp" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switchHideEmailLangInProfile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/hideEmailLangInProfileHeader"
style="@style/m3SwitchStyle"
android:layout_weight="0.10" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen4dp"
android:text="@string/hideEmailLangInProfileHint"
android:textColor="?attr/hintColor"
android:textSize="@dimen/dimen12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/hideEmailNavDrawerFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen24dp"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tvHideEmailNavDrawerHeader"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.90"
android:text="@string/hideEmailNavDrawerHeader"
android:textColor="?attr/primaryTextColor"
android:layout_marginTop="@dimen/dimen4dp"
android:textSize="@dimen/dimen16sp" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switchHideEmailNavDrawer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/hideEmailNavDrawerHeader"
style="@style/m3SwitchStyle"
android:layout_weight="0.10" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen4dp"
android:text="@string/hideEmailNavDrawerHint"
android:textColor="?attr/hintColor"
android:textSize="@dimen/dimen12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/langFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen24dp"
android:paddingStart="@dimen/dimen16dp"
android:paddingEnd="@dimen/dimen16dp"
android:orientation="vertical">
<TextView
android:id="@+id/tvLanguageHeaderSelector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsLanguageSelectorHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/tvLanguageSelected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen4dp"
android:text="@string/settingsLanguageSelectedHeaderDefault"
android:textColor="?attr/selectedTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
<TextView
android:id="@+id/helpTranslate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen24dp"
android:layout_marginBottom="@dimen/dimen16dp"
android:layout_marginStart="@dimen/dimen16dp"
android:layout_marginEnd="@dimen/dimen16dp"
android:background="?android:attr/selectableItemBackground"
android:text="@string/settingsHelpTranslateText"
android:textColor="@color/lightBlue"
android:textSize="@dimen/dimen16sp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.chip.Chip
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/CustomChipFilter"
android:checkable="true"
android:clickable="true"
android:focusable="true" />

View File

@@ -39,7 +39,6 @@
<item>Pitch Black</item>
<item>@string/followSystem</item>
<item>@string/followSystemBlack</item>
</string-array>
<string-array name="themesAndroid12">