From eb276ba87471ed444b78e0269ebb610a83cd29d2 Mon Sep 17 00:00:00 2001 From: 0xd9a <0xd9a@noreply.codeberg.org> Date: Sat, 5 Apr 2025 03:27:18 +0530 Subject: [PATCH] Update navigation drawer header - proxy setting moved to Network preferences page - 'Instance information' is now a nav drawer item - A 'Manage accounts' button to open accounts list --- .../app/fedilab/android/BaseMainActivity.java | 70 +++--- .../settings/FragmentNetworkSettings.java | 60 ++++++ .../settings/FragmentSettingsCategories.java | 9 + .../activities/PeertubeMainActivity.java | 16 +- .../layouts/mastodon/drawable/ic_accounts.xml | 10 + .../layouts/mastodon/drawable/ic_logout.xml | 14 ++ .../mastodon/drawable/ic_network_prefs.xml | 10 + .../layouts/mastodon/drawable/ic_proxy.xml | 10 + .../mastodon/layout/nav_header_main.xml | 203 +++++++----------- .../mastodon/menu/activity_main_drawer.xml | 5 + .../res/navigation/nav_graph_settings.xml | 13 ++ app/src/main/res/values/strings.xml | 5 + app/src/main/res/xml/pref_categories.xml | 7 + app/src/main/res/xml/pref_network.xml | 12 ++ 14 files changed, 272 insertions(+), 172 deletions(-) create mode 100644 app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentNetworkSettings.java create mode 100644 app/src/main/res/layouts/mastodon/drawable/ic_accounts.xml create mode 100644 app/src/main/res/layouts/mastodon/drawable/ic_logout.xml create mode 100644 app/src/main/res/layouts/mastodon/drawable/ic_network_prefs.xml create mode 100644 app/src/main/res/layouts/mastodon/drawable/ic_proxy.xml create mode 100644 app/src/main/res/xml/pref_network.xml diff --git a/app/src/main/java/app/fedilab/android/BaseMainActivity.java b/app/src/main/java/app/fedilab/android/BaseMainActivity.java index 41ff2a0a..27ac9895 100644 --- a/app/src/main/java/app/fedilab/android/BaseMainActivity.java +++ b/app/src/main/java/app/fedilab/android/BaseMainActivity.java @@ -72,6 +72,7 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.PopupMenu; import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; +import androidx.appcompat.widget.TooltipCompat; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.core.view.GravityCompat; @@ -461,7 +462,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt public static void manageDrawerMenu(Activity activity, NavigationView navigationView, NavHeaderMainBinding headerMainBinding) { SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(activity); if (headerMenuOpen) { - headerMainBinding.ownerAccounts.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24); + headerMainBinding.ownerAccounts.setIconResource(R.drawable.ic_baseline_arrow_drop_up_24); new Thread(() -> { try { List accounts = new Account(activity).getOtherAccounts(); @@ -592,7 +593,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt Intent mainActivity = new Intent(activity, MainActivity.class); activity.startActivity(mainActivity); activity.finish(); - headerMainBinding.ownerAccounts.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24); + headerMainBinding.ownerAccounts.setIconResource(R.drawable.ic_accounts); return true; } return false; @@ -624,47 +625,32 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt } else if (Helper.getCurrentAccount(activity).peertube_account != null) { navigationView.inflateMenu(R.menu.activity_main_drawer_peertube); } - headerMainBinding.ownerAccounts.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24); + headerMainBinding.ownerAccounts.setIconResource(R.drawable.ic_accounts); headerMenuOpen = false; } } - public static void headerOptionInfoClick(Activity activity, NavHeaderMainBinding headerMainBinding, FragmentManager fragmentManager) { - PopupMenu popup = new PopupMenu(activity, headerMainBinding.headerOptionInfo); - popup.getMenuInflater() - .inflate(R.menu.main, popup.getMenu()); - - popup.setOnMenuItemClickListener(item -> { - int itemId = item.getItemId(); - if (itemId == R.id.action_logout_account) { - AlertDialog.Builder alt_bld = new MaterialAlertDialogBuilder(activity); - alt_bld.setTitle(R.string.action_logout); - if (Helper.getCurrentAccount(activity).mastodon_account != null && Helper.getCurrentAccount(activity).instance != null) { - alt_bld.setMessage(activity.getString(R.string.logout_account_confirmation, Helper.getCurrentAccount(activity).mastodon_account.username, Helper.getCurrentAccount(activity).instance)); - } else if (Helper.getCurrentAccount(activity).peertube_account != null && Helper.getCurrentAccount(activity).instance != null) { - alt_bld.setMessage(activity.getString(R.string.logout_account_confirmation, Helper.getCurrentAccount(activity).peertube_account.getUsername(), Helper.getCurrentAccount(activity).instance)); - } else { - alt_bld.setMessage(activity.getString(R.string.logout_account_confirmation, "", "")); - } - alt_bld.setPositiveButton(R.string.action_logout, (dialog, id) -> { - dialog.dismiss(); - try { - Helper.removeAccount(activity); - } catch (DBException e) { - e.printStackTrace(); - } - }); - alt_bld.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss()); - AlertDialog alert = alt_bld.create(); - alert.show(); - return true; - } else if (itemId == R.id.action_proxy) { - (new ProxyActivity()).show(fragmentManager, null); - return true; + public static void headerLogoutClick(Activity activity, NavHeaderMainBinding headerMainBinding, FragmentManager fragmentManager) { + AlertDialog.Builder alt_bld = new MaterialAlertDialogBuilder(activity); + alt_bld.setTitle(R.string.action_logout); + if (Helper.getCurrentAccount(activity).mastodon_account != null && Helper.getCurrentAccount(activity).instance != null) { + alt_bld.setMessage(activity.getString(R.string.logout_account_confirmation, Helper.getCurrentAccount(activity).mastodon_account.username, Helper.getCurrentAccount(activity).instance)); + } else if (Helper.getCurrentAccount(activity).peertube_account != null && Helper.getCurrentAccount(activity).instance != null) { + alt_bld.setMessage(activity.getString(R.string.logout_account_confirmation, Helper.getCurrentAccount(activity).peertube_account.getUsername(), Helper.getCurrentAccount(activity).instance)); + } else { + alt_bld.setMessage(activity.getString(R.string.logout_account_confirmation, "", "")); + } + alt_bld.setPositiveButton(R.string.action_logout, (dialog, id) -> { + dialog.dismiss(); + try { + Helper.removeAccount(activity); + } catch (DBException e) { + e.printStackTrace(); } - return true; }); - popup.show(); + alt_bld.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss()); + AlertDialog alert = alt_bld.create(); + alert.show(); } /** @@ -1464,12 +1450,13 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt startActivity(intent); } else if (id == R.id.nav_about_instance) { (new InstanceActivity()).show(getSupportFragmentManager(), null); + } else if (id == R.id.nav_instance_info) { + (new InstanceHealthActivity()).show(getSupportFragmentManager(), null); } binding.drawerLayout.close(); return false; }); - headerMainBinding.instanceInfo.setOnClickListener(v -> (new InstanceHealthActivity()).show(getSupportFragmentManager(), null)); headerMainBinding.accountProfilePicture.setOnClickListener(v -> { Intent intent = new Intent(BaseMainActivity.this, ProfileActivity.class); Bundle args = new Bundle(); @@ -1483,13 +1470,14 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt }); - headerMainBinding.accountAcc.setOnClickListener(v -> headerMainBinding.changeAccount.callOnClick()); - headerMainBinding.changeAccount.setOnClickListener(v -> { + TooltipCompat.setTooltipText(headerMainBinding.ownerAccounts, getString(R.string.manage_accounts)); + headerMainBinding.ownerAccounts.setOnClickListener(v -> { headerMenuOpen = !headerMenuOpen; manageDrawerMenu(BaseMainActivity.this, binding.navView, headerMainBinding); }); - headerMainBinding.headerOptionInfo.setOnClickListener(v -> headerOptionInfoClick(BaseMainActivity.this, headerMainBinding, getSupportFragmentManager())); + TooltipCompat.setTooltipText(headerMainBinding.headerLogout,getString(R.string.action_logout)); + headerMainBinding.headerLogout.setOnClickListener(v -> headerLogoutClick(BaseMainActivity.this, headerMainBinding, getSupportFragmentManager())); //Toolbar search binding.toolbarSearch.setOnQueryTextListener(new SearchView.OnQueryTextListener() { diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentNetworkSettings.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentNetworkSettings.java new file mode 100644 index 00000000..0c3bcb84 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentNetworkSettings.java @@ -0,0 +1,60 @@ +package app.fedilab.android.mastodon.ui.fragment.settings; +/* Copyright 2022 Thomas Schneider + * + * This file is a part of Fedilab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Fedilab; if not, + * see . */ + +import android.Manifest; +import android.app.Activity; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Bundle; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; + +import java.io.IOException; + +import app.fedilab.android.R; +import app.fedilab.android.mastodon.activities.ProxyActivity; +import app.fedilab.android.mastodon.helper.Helper; +import app.fedilab.android.mastodon.helper.ZipHelper; +import es.dmoral.toasty.Toasty; + +public class FragmentNetworkSettings extends PreferenceFragmentCompat { + + @Override + public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) { + addPreferencesFromResource(R.xml.pref_network); + + + Preference pref_proxy = findPreference(getString(R.string.pref_key_proxy)); + if (pref_proxy != null) { + pref_proxy.setOnPreferenceClickListener(preference -> { + (new ProxyActivity()).show(getParentFragmentManager(), null); + return false; + }); + } + + } + +} diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentSettingsCategories.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentSettingsCategories.java index b628431b..b1d1d656 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentSettingsCategories.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/settings/FragmentSettingsCategories.java @@ -138,6 +138,15 @@ public class FragmentSettingsCategories extends PreferenceFragmentCompat { }); } + Preference pref_category_key_network = findPreference(getString(R.string.pref_category_key_network)); + if (pref_category_key_network != null) { + pref_category_key_network.setOnPreferenceClickListener(preference -> { + NavController navController = Navigation.findNavController(requireActivity(), R.id.fragment_container); + navController.navigate(FragmentSettingsCategoriesDirections.Companion.categoriesToNetwork()); + return false; + }); + } + Preference pref_category_key_extra_features = findPreference(getString(R.string.pref_category_key_extra_features)); if (pref_category_key_extra_features != null) { pref_category_key_extra_features.setOnPreferenceClickListener(preference -> { diff --git a/app/src/main/java/app/fedilab/android/peertube/activities/PeertubeMainActivity.java b/app/src/main/java/app/fedilab/android/peertube/activities/PeertubeMainActivity.java index 3e0fdf63..66c45235 100644 --- a/app/src/main/java/app/fedilab/android/peertube/activities/PeertubeMainActivity.java +++ b/app/src/main/java/app/fedilab/android/peertube/activities/PeertubeMainActivity.java @@ -20,7 +20,7 @@ import static app.fedilab.android.BaseMainActivity.currentToken; import static app.fedilab.android.BaseMainActivity.currentUserID; import static app.fedilab.android.BaseMainActivity.fetchRecentAccounts; import static app.fedilab.android.BaseMainActivity.headerMenuOpen; -import static app.fedilab.android.BaseMainActivity.headerOptionInfoClick; +import static app.fedilab.android.BaseMainActivity.headerLogoutClick; import static app.fedilab.android.BaseMainActivity.mamageNewIntent; import static app.fedilab.android.BaseMainActivity.manageDrawerMenu; import static app.fedilab.android.mastodon.helper.Helper.PREF_USER_ID; @@ -328,8 +328,8 @@ public class PeertubeMainActivity extends PeertubeBaseMainActivity { headerMainBinding.accountAcc.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18 * 1.1f / scale); app.fedilab.android.mastodon.helper.Helper.loadPP(PeertubeMainActivity.this, headerMainBinding.accountProfilePicture, app.fedilab.android.mastodon.helper.Helper.getCurrentAccount(PeertubeMainActivity.this), false); headerMainBinding.backgroundImage.setAlpha(0.5f); - headerMainBinding.accountAcc.setOnClickListener(v -> headerMainBinding.changeAccount.callOnClick()); - headerMainBinding.changeAccount.setOnClickListener(v -> { + TooltipCompat.setTooltipText(headerMainBinding.ownerAccounts, getString(R.string.manage_accounts)); + headerMainBinding.ownerAccounts.setOnClickListener(v -> { headerMenuOpen = !headerMenuOpen; manageDrawerMenu(PeertubeMainActivity.this, binding.drawerNavView, headerMainBinding); @@ -345,9 +345,7 @@ public class PeertubeMainActivity extends PeertubeBaseMainActivity { headerMainBinding.accountAcc.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18 * 1.1f / scale); app.fedilab.android.mastodon.helper.Helper.loadPP(PeertubeMainActivity.this, headerMainBinding.accountProfilePicture, app.fedilab.android.mastodon.helper.Helper.getCurrentAccount(PeertubeMainActivity.this), false); headerMainBinding.backgroundImage.setAlpha(0.5f); - headerMainBinding.accountAcc.setOnClickListener(v -> headerMainBinding.changeAccount.callOnClick()); - headerMainBinding.changeAccount.setOnClickListener(v -> { - + headerMainBinding.ownerAccounts.setOnClickListener(v -> { headerMenuOpen = !headerMenuOpen; manageDrawerMenu(PeertubeMainActivity.this, binding.drawerNavView, headerMainBinding); }); @@ -358,7 +356,8 @@ public class PeertubeMainActivity extends PeertubeBaseMainActivity { }; mainHandler.post(myRunnable); }).start(); - headerMainBinding.instanceInfo.setVisibility(View.GONE); + View navInstanceInfo = binding.drawerNavView.findViewById(R.id.nav_instance_info); + binding.drawerNavView.removeView(navInstanceInfo); binding.drawerNavView.addHeaderView(headerMainBinding.getRoot()); binding.drawerNavView.setNavigationItemSelectedListener(item -> { if (item.getItemId() == R.id.action_settings) { @@ -414,7 +413,8 @@ public class PeertubeMainActivity extends PeertubeBaseMainActivity { binding.drawerLayout.close(); return false; }); - headerMainBinding.headerOptionInfo.setOnClickListener(v -> headerOptionInfoClick(PeertubeMainActivity.this, headerMainBinding, getSupportFragmentManager())); + TooltipCompat.setTooltipText(headerMainBinding.headerLogout, getString(R.string.action_logout)); + headerMainBinding.headerLogout.setOnClickListener(v -> headerLogoutClick(PeertubeMainActivity.this, headerMainBinding, getSupportFragmentManager())); fetchRecentAccounts(PeertubeMainActivity.this, headerMainBinding); } else { new Thread(() -> { diff --git a/app/src/main/res/layouts/mastodon/drawable/ic_accounts.xml b/app/src/main/res/layouts/mastodon/drawable/ic_accounts.xml new file mode 100644 index 00000000..c2d0f8f6 --- /dev/null +++ b/app/src/main/res/layouts/mastodon/drawable/ic_accounts.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layouts/mastodon/drawable/ic_logout.xml b/app/src/main/res/layouts/mastodon/drawable/ic_logout.xml new file mode 100644 index 00000000..5dc221b4 --- /dev/null +++ b/app/src/main/res/layouts/mastodon/drawable/ic_logout.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layouts/mastodon/drawable/ic_network_prefs.xml b/app/src/main/res/layouts/mastodon/drawable/ic_network_prefs.xml new file mode 100644 index 00000000..c167dfb6 --- /dev/null +++ b/app/src/main/res/layouts/mastodon/drawable/ic_network_prefs.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layouts/mastodon/drawable/ic_proxy.xml b/app/src/main/res/layouts/mastodon/drawable/ic_proxy.xml new file mode 100644 index 00000000..dc93ade8 --- /dev/null +++ b/app/src/main/res/layouts/mastodon/drawable/ic_proxy.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layouts/mastodon/layout/nav_header_main.xml b/app/src/main/res/layouts/mastodon/layout/nav_header_main.xml index 61b6daae..70f6ae93 100644 --- a/app/src/main/res/layouts/mastodon/layout/nav_header_main.xml +++ b/app/src/main/res/layouts/mastodon/layout/nav_header_main.xml @@ -1,11 +1,10 @@ - - + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/app/src/main/res/menus/mastodon/menu/activity_main_drawer.xml b/app/src/main/res/menus/mastodon/menu/activity_main_drawer.xml index 12cbc541..eeb6be63 100644 --- a/app/src/main/res/menus/mastodon/menu/activity_main_drawer.xml +++ b/app/src/main/res/menus/mastodon/menu/activity_main_drawer.xml @@ -73,6 +73,11 @@ android:icon="@drawable/ic_info_outline_white_24dp" android:title="@string/action_about_instance" android:visible="true" /> + diff --git a/app/src/main/res/navigation/nav_graph_settings.xml b/app/src/main/res/navigation/nav_graph_settings.xml index bc89c544..4e364c76 100644 --- a/app/src/main/res/navigation/nav_graph_settings.xml +++ b/app/src/main/res/navigation/nav_graph_settings.xml @@ -76,6 +76,14 @@ app:popEnterAnim="@anim/pop_enter" app:popExitAnim="@anim/pop_exit" /> + + + + Peertube instance Use Emoji One Information + Instance information Display previews in all messages The account id has been copied in the clipboard! Change the language @@ -627,6 +628,7 @@ Export the theme Tap here to export the current theme An error occurred when selecting the theme file + Network User count Status count Instance count @@ -1792,10 +1794,13 @@ pref_category_key_pixelfed pref_category_key_home_cache pref_category_theming + pref_category_network pref_category_administration pref_category_languages pref_category_key_extra_features + pref_key_proxy + pref_export_settings pref_import_settings Export settings diff --git a/app/src/main/res/xml/pref_categories.xml b/app/src/main/res/xml/pref_categories.xml index cd88e770..70dc5780 100644 --- a/app/src/main/res/xml/pref_categories.xml +++ b/app/src/main/res/xml/pref_categories.xml @@ -67,6 +67,13 @@ app:icon="@drawable/ic_theming" app:key="@string/pref_category_key_theming" /> + +