Merge branch '0xd9a-drawer_header' into develop

This commit is contained in:
Thomas 2025-04-05 09:05:20 +02:00
commit a2e23ae14a
23 changed files with 367 additions and 202 deletions

View file

@ -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<BaseAccount> 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() {

View file

@ -34,6 +34,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.Cursor;
@ -99,6 +100,7 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.load.resource.gif.GifDrawable;
import com.bumptech.glide.request.RequestOptions;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@ -1461,6 +1463,24 @@ public class Helper {
imageView.setColorFilter(color);
}
/**
* change color of a drawable
*
* @param materialButton {@link MaterialButton}
* @param hexaColor example 0xffff00
*/
public static void changeDrawableColor(Context context, MaterialButton materialButton, int hexaColor) {
if (materialButton == null)
return;
int color;
try {
color = context.getResources().getColor(hexaColor);
} catch (Resources.NotFoundException e) {
color = hexaColor;
}
materialButton.setIconTint(ColorStateList.valueOf(color));
}
/**
* change color of a drawable
*

View file

@ -1697,9 +1697,11 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
if (holder.binding.contentSpoiler.getVisibility() == View.VISIBLE) {
statusDraft.spoilerChecked = false;
holder.binding.contentSpoiler.setVisibility(View.GONE);
holder.binding.buttonSensitive.setContentDescription(context.getString(R.string.add_content_warning));
} else {
holder.binding.contentSpoiler.setVisibility(View.VISIBLE);
statusDraft.spoilerChecked = true;
holder.binding.buttonSensitive.setContentDescription(context.getString(R.string.remove_content_warning));
}
});
//Last compose drawer

View file

@ -1279,8 +1279,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
holder.binding.actionButtonReply.getLayoutParams().height = (int) (normalSize * scaleIcon);
holder.binding.actionButtonReply.requestLayout();
holder.binding.actionButtonTranslate.getLayoutParams().width = (int) (normalSize * scaleIcon);
holder.binding.actionButtonTranslate.getLayoutParams().height = (int) (normalSize * scaleIcon);
holder.binding.actionButtonTranslate.setIconSize((int) (normalSize * scaleIcon));
holder.binding.actionButtonTranslate.requestLayout();
holder.binding.actionButtonBoost.setImageSize((int) (normalSize * scaleIcon));
@ -1292,8 +1291,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
holder.binding.statusAddCustomEmoji.getLayoutParams().height = (int) (normalSize * scaleIcon);
holder.binding.statusAddCustomEmoji.requestLayout();
holder.binding.actionButtonQuote.getLayoutParams().width = (int) (normalSize * scaleIcon);
holder.binding.actionButtonQuote.getLayoutParams().height = (int) (normalSize * scaleIcon);
holder.binding.actionButtonQuote.setIconSize((int) (normalSize * scaleIcon));
holder.binding.actionButtonQuote.requestLayout();
holder.binding.statusEmoji.getLayoutParams().width = (int) (normalSize * scaleIcon);

View file

@ -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 <http://www.gnu.org/licenses>. */
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;
});
}
}
}

View file

@ -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 -> {

View file

@ -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(() -> {

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5s-3,1.34 -3,3 1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,18c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1v-1.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 0.02,0.01 0.03,0.03 0.04,0.04 1.14,0.83 1.93,1.94 1.93,3.41L17,18c0,0.35 -0.07,0.69 -0.18,1L22,19c0.55,0 1,-0.45 1,-1v-1.5c0,-2.33 -4.67,-3.5 -7,-3.5z" />
</vector>

View file

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:tint="?colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M5,5h6c0.55,0 1,-0.45 1,-1v0c0,-0.55 -0.45,-1 -1,-1H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h6c0.55,0 1,-0.45 1,-1v0c0,-0.55 -0.45,-1 -1,-1H5V5z" />
<path
android:fillColor="@android:color/white"
android:pathData="M20.65,11.65l-2.79,-2.79C17.54,8.54 17,8.76 17,9.21V11h-7c-0.55,0 -1,0.45 -1,1v0c0,0.55 0.45,1 1,1h7v1.79c0,0.45 0.54,0.67 0.85,0.35l2.79,-2.79C20.84,12.16 20.84,11.84 20.65,11.65z" />
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M2.06,10.06c0.51,0.51 1.32,0.56 1.87,0.1 4.67,-3.84 11.45,-3.84 16.13,-0.01 0.56,0.46 1.38,0.42 1.89,-0.09 0.59,-0.59 0.55,-1.57 -0.1,-2.1 -5.71,-4.67 -13.97,-4.67 -19.69,0 -0.65,0.52 -0.7,1.5 -0.1,2.1zM9.82,17.82l1.47,1.47c0.39,0.39 1.02,0.39 1.41,0l1.47,-1.47c0.47,-0.47 0.37,-1.28 -0.23,-1.59 -1.22,-0.63 -2.68,-0.63 -3.91,0 -0.57,0.31 -0.68,1.12 -0.21,1.59zM6.09,14.09c0.49,0.49 1.26,0.54 1.83,0.13 2.44,-1.73 5.72,-1.73 8.16,0 0.57,0.4 1.34,0.36 1.83,-0.13l0.01,-0.01c0.6,-0.6 0.56,-1.62 -0.13,-2.11 -3.44,-2.49 -8.13,-2.49 -11.58,0 -0.69,0.5 -0.73,1.51 -0.12,2.12z" />
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M12.65,10C11.7,7.31 8.9,5.5 5.77,6.12c-2.29,0.46 -4.15,2.29 -4.63,4.58C0.32,14.57 3.26,18 7,18c2.61,0 4.83,-1.67 5.65,-4H17v2c0,1.1 0.9,2 2,2s2,-0.9 2,-2v-2c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2h-8.35zM7,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z" />
</vector>

View file

@ -707,7 +707,7 @@
android:layout_height="48dp"
android:adjustViewBounds="true"
android:layout_gravity="center"
android:contentDescription="@string/reblog_add"
android:contentDescription="@string/action_reblog"
app:activeImage="@drawable/ic_round_repeat_active_24"
app:iconSize="28dp"
app:inactiveImage="@drawable/ic_round_repeat_24"
@ -726,23 +726,20 @@
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.AppCompatImageView
<com.google.android.material.button.MaterialButton
android:id="@+id/action_button_quote"
android:layout_width="28dp"
android:layout_height="28dp"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:background="@color/transparent"
android:clickable="true"
android:contentDescription="@string/translate"
android:focusable="true"
android:src="@drawable/ic_baseline_format_quote_24"
android:visibility="gone"
style="@style/Widget.Material3.Button.IconButton"
android:layout_width="48dp"
android:layout_height="48dp"
android:contentDescription="@string/action_quote"
app:icon="@drawable/ic_baseline_format_quote_24"
app:iconGravity="textStart"
app:iconSize="28dp"
app:iconTint="?colorControlNormal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/action_button_favorite_container"
app:layout_constraintStart_toEndOf="@+id/action_button_boost_container"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/action_button_favorite_container"
@ -760,7 +757,7 @@
android:layout_height="48dp"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:contentDescription="@string/favourite_add"
android:contentDescription="@string/action_favourite"
app:activeImage="@drawable/ic_round_star_24"
app:animationSpeed="1.5"
app:inactiveImage="@drawable/ic_round_star_border_24"
@ -797,18 +794,17 @@
sparkbutton:iconSize="28dp" />
<androidx.appcompat.widget.AppCompatImageView
<com.google.android.material.button.MaterialButton
android:id="@+id/action_button_translate"
android:layout_width="28dp"
android:layout_height="28dp"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:background="@color/transparent"
android:clickable="true"
style="@style/Widget.Material3.Button.IconButton"
android:layout_width="48dp"
android:layout_height="48dp"
android:contentDescription="@string/translate"
android:focusable="true"
android:src="@drawable/ic_baseline_translate_24"
android:visibility="gone"
app:icon="@drawable/ic_baseline_translate_24"
app:iconGravity="textStart"
app:iconSize="28dp"
app:iconTint="?colorControlNormal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/action_button_maths"
app:layout_constraintStart_toEndOf="@+id/action_button_bookmark"

View file

@ -179,6 +179,7 @@
android:layout_height="wrap_content"
android:layout_marginVertical="6dp"
android:layout_marginStart="6dp"
android:contentDescription="@string/open_new_attachment_panel"
app:icon="@drawable/ic_compose_attach"
app:layout_constraintBottom_toBottomOf="@id/action_buttons_barrier"
app:layout_constraintStart_toStartOf="parent"
@ -191,6 +192,7 @@
android:layout_height="wrap_content"
android:layout_marginVertical="6dp"
android:checkable="true"
android:contentDescription="@string/add_content_warning"
app:icon="@drawable/ic_compose_sensitive"
app:layout_constraintBottom_toBottomOf="@id/action_buttons_barrier"
app:layout_constraintStart_toEndOf="@id/button_attach"
@ -203,6 +205,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="6dp"
android:contentDescription="@string/change_visibility"
app:icon="@drawable/ic_compose_visibility_public"
app:iconGravity="textStart"
app:iconPadding="0dp"
@ -216,6 +219,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="6dp"
android:contentDescription="@string/set_language"
android:fontFamily="monospace"
android:minWidth="72dp"
app:layout_constraintBottom_toBottomOf="@id/action_buttons_barrier"
@ -253,6 +257,7 @@
android:layout_height="wrap_content"
android:layout_marginVertical="6dp"
android:layout_marginEnd="6dp"
android:contentDescription="@string/action_publish"
app:icon="@drawable/ic_compose_post"
app:layout_constraintBottom_toBottomOf="@id/action_buttons_barrier"
app:layout_constraintEnd_toEndOf="parent"
@ -276,6 +281,7 @@
style="@style/Widget.Material3.Button.IconButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/attach_images"
app:icon="@drawable/ic_compose_attach_image" />
<com.google.android.material.button.MaterialButton
@ -283,6 +289,7 @@
style="@style/Widget.Material3.Button.IconButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/attach_audio"
app:icon="@drawable/ic_compose_attach_audio" />
<com.google.android.material.button.MaterialButton
@ -290,6 +297,7 @@
style="@style/Widget.Material3.Button.IconButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/attach_videos"
app:icon="@drawable/ic_compose_attach_video" />
<com.google.android.material.button.MaterialButton
@ -297,6 +305,7 @@
style="@style/Widget.Material3.Button.IconButton.Outlined"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/close_new_attachment_panel"
app:icon="@drawable/ic_baseline_close_24" />
<com.google.android.material.button.MaterialButton
@ -304,6 +313,7 @@
style="@style/Widget.Material3.Button.IconButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/add_poll"
app:icon="@drawable/ic_compose_poll" />
<com.google.android.material.button.MaterialButton
@ -311,6 +321,7 @@
style="@style/Widget.Material3.Button.IconButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/attach_files"
app:icon="@drawable/ic_compose_attach_more" />
<androidx.appcompat.widget.LinearLayoutCompat

View file

@ -27,6 +27,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_more"
android:contentDescription="@string/more_options"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />

View file

@ -36,11 +36,11 @@
<com.google.android.material.button.MaterialButton
android:id="@+id/settings"
style="@style/Widget.Material3.Button.OutlinedButton.Icon"
style="@style/Widget.Material3.Button.IconButton.Outlined"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_gravity="center"
android:minWidth="48dp"
android:contentDescription="@string/more_options"
app:icon="@drawable/ic_more" />
</androidx.appcompat.widget.LinearLayoutCompat>

View file

@ -1,11 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/background_image"
android:layout_width="match_parent"
@ -13,135 +12,93 @@
android:minHeight="@dimen/nav_header_height"
android:scaleType="centerCrop"
tools:src="@tools:sample/backgrounds/scenic" />
<com.google.android.material.button.MaterialButton
android:id="@+id/header_option_info"
style="@style/Widget.Material3.Button.Icon"
android:layout_width="36dp"
android:layout_height="36dp"
android:id="@+id/header_logout"
style="@style/Widget.Material3.Button.IconButton.Filled"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_marginEnd="16dp"
android:layout_margin="12dp"
android:contentDescription="@string/action_logout"
app:icon="@drawable/ic_logout"
app:iconGravity="textStart"
app:iconPadding="0dp"
android:padding="0dp"
android:contentDescription="@string/information"
app:icon="@drawable/ic_baseline_more_vert_24" />
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/account_profile_picture"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_margin="12dp"
android:contentDescription="@string/profile_picture"
android:scaleType="fitCenter"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@tools:sample/avatars" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="180dp"
android:background="@color/transparent"
android:gravity="bottom"
android:orientation="vertical"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingTop="5dp"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="5dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/other_account1"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginStart="12dp"
android:scaleType="fitCenter"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@id/account_profile_picture"
app:layout_constraintTop_toTopOf="@id/account_profile_picture"
tools:src="@tools:sample/avatars"
tools:visibility="visible" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/other_account2"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginStart="12dp"
android:scaleType="fitCenter"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@id/other_account1"
app:layout_constraintTop_toTopOf="@id/account_profile_picture"
tools:src="@tools:sample/avatars"
tools:visibility="visible" />
<ImageView
android:id="@+id/account_profile_picture"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center_vertical"
android:contentDescription="@string/profile_picture"
android:paddingTop="@dimen/nav_header_vertical_spacing"
android:scaleType="fitCenter"
tools:src="@tools:sample/avatars" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/account_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginTop="12dp"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.Material3.BodyMedium"
app:layout_constraintEnd_toStartOf="@id/owner_accounts"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/account_profile_picture"
tools:text="@tools:sample/full_names" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/account_acc"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.Material3.BodySmall"
app:layout_constraintEnd_toStartOf="@id/owner_accounts"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/account_name"
tools:text="@tools:sample/full_names" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/other_account1"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="bottom|end"
android:scaleType="fitCenter"
android:visibility="gone"
tools:src="@tools:sample/avatars"
tools:visibility="visible" />
<com.google.android.material.button.MaterialButton
style="@style/Widget.Material3.Button.IconButton"
android:id="@+id/owner_accounts"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:contentDescription="@string/manage_accounts"
app:layout_constraintTop_toTopOf="@id/account_name"
app:layout_constraintBottom_toBottomOf="@id/account_acc"
app:layout_constraintEnd_toEndOf="parent"
app:icon="@drawable/ic_accounts" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/other_account2"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="bottom|end"
android:layout_marginStart="20dp"
android:scaleType="fitCenter"
android:visibility="gone"
tools:src="@tools:sample/avatars"
tools:visibility="visible" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/change_account"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginTop="10dp"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/account_name"
style="@style/TextAppearance.Material3.TitleSmall"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:paddingTop="@dimen/nav_header_vertical_spacing"
android:singleLine="true"
tools:text="@tools:sample/full_names" />
<ImageView
android:id="@+id/owner_accounts"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:contentDescription="@string/open_menu"
android:gravity="center_vertical"
android:src="@drawable/ic_baseline_arrow_drop_down_24"
app:tint="?colorControlNormal" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/instance_info_container"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginTop="10dp"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/account_acc"
style="@style/TextAppearance.Material3.TitleSmall"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:gravity="center_vertical"
android:singleLine="true"
android:textSize="16sp"
tools:text="@tools:sample/full_names" />
<ImageView
android:id="@+id/instance_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:contentDescription="@string/information"
android:src="@drawable/ic_baseline_info_24"
app:tint="?colorControlNormal" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -73,6 +73,11 @@
android:icon="@drawable/ic_info_outline_white_24dp"
android:title="@string/action_about_instance"
android:visible="true" />
<item
android:id="@+id/nav_instance_info"
android:icon="@drawable/ic_info_outline_white_24dp"
android:title="@string/instance_information"
android:visible="true" />
</group>
</menu>

View file

@ -76,6 +76,14 @@
app:popEnterAnim="@anim/pop_enter"
app:popExitAnim="@anim/pop_exit" />
<action
android:id="@+id/categories_to_network"
app:destination="@id/FragmentNetworkSettings"
app:enterAnim="@anim/enter"
app:exitAnim="@anim/exit"
app:popEnterAnim="@anim/pop_enter"
app:popExitAnim="@anim/pop_exit" />
<action
android:id="@+id/categories_to_language"
app:destination="@id/FragmentLanguageSettings"
@ -133,6 +141,11 @@
android:name="app.fedilab.android.mastodon.ui.fragment.settings.FragmentThemingSettings"
android:label="@string/theming" />
<fragment
android:id="@+id/FragmentNetworkSettings"
android:name="app.fedilab.android.mastodon.ui.fragment.settings.FragmentNetworkSettings"
android:label="@string/network" />
<fragment
android:id="@+id/FragmentLanguageSettings"
android:name="app.fedilab.android.mastodon.ui.fragment.settings.FragmentLanguageSettings"

View file

@ -1089,4 +1089,11 @@
<string name="pronouns_support">Podpora zájmen</string>
<string name="qr_code_generator">Generátor QR kódů</string>
<string name="toast_error_internet">Není k dispozici internetové připojení!</string>
<string name="toast_fail_authenticate">Aplikaci se nepovedlo ověřit účet!</string>
<string name="toast_error_token_empty">Token nemůže být prázdný!</string>
<string name="use_token">Použít token</string>
<string name="instance_token">Váš token</string>
<string name="set_pixelfed_full_media">Média přes celý displej</string>
<string name="set_pixelfed_full_media_indication">Média se budou zobrazovat přes celou šířku displeje a u výšky se bude respektovat poměr stran.</string>
<string name="twitter_tags">Tagy Twitteru (přes Nitter)</string>
</resources>

View file

@ -57,6 +57,7 @@
<string name="show_privates">Show direct messages</string>
<string name="action_open_in_web">Open in browser</string>
<string name="translate">Translate</string>
<string name="more_options">More options</string>
<!--- Menu -->
<string name="home_menu">Home</string>
<string name="local_menu">Local timeline</string>
@ -77,6 +78,9 @@
<string name="favourite_add">Add this message to your favourites?</string>
<string name="favourite_remove">Remove this message from your favourites?</string>
<string name="reblog_add">Boost this message?</string>
<string name="action_favourite">Favorite</string>
<string name="action_reblog">Boost</string>
<string name="action_quote">Quote</string>
<string name="warn_boost_no_media_description">Warn if message has no media description before boosting</string>
<string name="reblog_missing_description">This message has missing media description. Are you sure to boost it?</string>
<string name="reblog_remove">Unboost this message?</string>
@ -110,6 +114,21 @@
<string name="bookmark_remove">Remove bookmark</string>
<string name="status_bookmarked">Status has been added to bookmarks!</string>
<string name="status_unbookmarked">Status was removed from bookmarks!</string>
<!-- Compose -->
<string name="add_content_warning">Add content warning</string>
<string name="remove_content_warning">Remove content warning</string>
<string name="change_visibility">Change visibility</string>
<string name="set_language">Set language</string>
<string name="action_publish">Publish</string>
<string name="open_new_attachment_panel">Open new attachment panel</string>
<string name="close_new_attachment_panel">Close new attachment panel</string>
<string name="attach_images">Attach images</string>
<string name="attach_audio">Attach audio</string>
<string name="attach_videos">Attach videos</string>
<string name="attach_files">Attach files</string>
<string name="add_poll">Add a poll</string>
<!-- Date -->
<string name="date_seconds">%d s</string>
<string name="date_minutes">%d m</string>
@ -350,6 +369,7 @@
<string name="peertube_instance">Peertube instance</string>
<string name="set_display_emoji">Use Emoji One</string>
<string name="information">Information</string>
<string name="instance_information">Instance information</string>
<string name="set_display_card">Display previews in all messages</string>
<string name="account_id_clipbloard">The account id has been copied in the clipboard!</string>
<string name="set_change_locale">Change the language</string>
@ -608,6 +628,7 @@
<string name="export_theme">Export the theme</string>
<string name="export_theme_title">Tap here to export the current theme</string>
<string name="theme_file_error">An error occurred when selecting the theme file</string>
<string name="network">Network</string>
<string name="user_count">User count</string>
<string name="status_count">Status count</string>
<string name="instance_count">Instance count</string>
@ -1773,10 +1794,13 @@
<string name="pref_category_key_pixelfed" translatable="false">pref_category_key_pixelfed</string>
<string name="pref_category_key_home_cache" translatable="false">pref_category_key_home_cache</string>
<string name="pref_category_key_theming" translatable="false">pref_category_theming</string>
<string name="pref_category_key_network" translatable="false">pref_category_network</string>
<string name="pref_category_key_administration" translatable="false">pref_category_administration</string>
<string name="pref_category_key_languages" translatable="false">pref_category_languages</string>
<string name="pref_category_key_extra_features" translatable="false">pref_category_key_extra_features</string>
<string name="pref_key_proxy" translatable="false">pref_key_proxy</string>
<string name="pref_export_settings" translatable="false">pref_export_settings</string>
<string name="pref_import_settings" translatable="false">pref_import_settings</string>
<string name="export_settings">Export settings</string>

View file

@ -67,6 +67,13 @@
app:icon="@drawable/ic_theming"
app:key="@string/pref_category_key_theming" />
<Preference
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:title="@string/network"
app:icon="@drawable/ic_network_prefs"
app:key="@string/pref_category_key_network" />
<!--
<Preference
android:layout_width="match_parent"

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<Preference
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:title="@string/proxy_set"
app:icon="@drawable/ic_proxy"
app:key="@string/pref_key_proxy" />
</PreferenceScreen>

View file

@ -0,0 +1,11 @@
Додано:
- Додано нові іконки запуску (Налаштування > Інтерфейс)
Змінено:
- Зроблено кнопку виходу/проксі більш помітною в головному меню
- Видалено дозвіл FOREGROUND_SERVICE
- Трохи покращено макет медіа з перекладами
Виправлено:
- Виправлено іконки рядка стану, які не видно у світлій темі зі спеціальним кольором акценту
- Кнопки реакції не натискалися в деяких випадках