mirror of
https://github.com/M66B/FairEmail.git
synced 2026-04-14 04:53:22 +02:00
Move edit folder to menu, use close button for hints
This commit is contained in:
@@ -51,78 +51,51 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder> {
|
||||
private Context context;
|
||||
private LifecycleOwner owner;
|
||||
private String accountState = null;
|
||||
|
||||
private List<TupleFolderEx> all = new ArrayList<>();
|
||||
private List<TupleFolderEx> filtered = new ArrayList<>();
|
||||
|
||||
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
|
||||
View itemView;
|
||||
ImageView ivEdit;
|
||||
ImageView ivState;
|
||||
TextView tvName;
|
||||
TextView tvMessages;
|
||||
TextView tvType;
|
||||
ImageView ivUnified;
|
||||
TextView tvType;
|
||||
TextView tvAfter;
|
||||
ImageView ivSync;
|
||||
ImageView ivState;
|
||||
TextView tvError;
|
||||
|
||||
private final static int action_synchronize = 1;
|
||||
private final static int action_delete_local = 2;
|
||||
private final static int action_edit = 1;
|
||||
private final static int action_sync = 2;
|
||||
private final static int action_delete = 3;
|
||||
|
||||
ViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
|
||||
this.itemView = itemView;
|
||||
ivEdit = itemView.findViewById(R.id.ivEdit);
|
||||
ivState = itemView.findViewById(R.id.ivState);
|
||||
tvName = itemView.findViewById(R.id.tvName);
|
||||
tvMessages = itemView.findViewById(R.id.tvMessages);
|
||||
tvType = itemView.findViewById(R.id.tvType);
|
||||
ivUnified = itemView.findViewById(R.id.ivUnified);
|
||||
tvType = itemView.findViewById(R.id.tvType);
|
||||
tvAfter = itemView.findViewById(R.id.tvAfter);
|
||||
ivSync = itemView.findViewById(R.id.ivSync);
|
||||
tvError = itemView.findViewById(R.id.tvError);
|
||||
ivState = itemView.findViewById(R.id.ivState);
|
||||
}
|
||||
|
||||
private void wire(boolean properties) {
|
||||
private void wire() {
|
||||
itemView.setOnClickListener(this);
|
||||
itemView.setOnLongClickListener(this);
|
||||
if (properties)
|
||||
ivEdit.setOnClickListener(this);
|
||||
}
|
||||
|
||||
private void unwire() {
|
||||
itemView.setOnClickListener(null);
|
||||
itemView.setOnLongClickListener(null);
|
||||
ivEdit.setOnClickListener(null);
|
||||
}
|
||||
|
||||
private void bindTo(TupleFolderEx folder) {
|
||||
boolean outbox = EntityFolder.OUTBOX.equals(folder.type);
|
||||
ivEdit.setVisibility(outbox ? View.INVISIBLE : View.VISIBLE);
|
||||
|
||||
String name = Helper.localizeFolderName(context, folder.name);
|
||||
if (folder.unseen > 0)
|
||||
tvName.setText(context.getString(R.string.title_folder_unseen, name, folder.unseen));
|
||||
else
|
||||
tvName.setText(name);
|
||||
tvName.setTypeface(null, folder.unseen > 0 ? Typeface.BOLD : Typeface.NORMAL);
|
||||
tvName.setTextColor(Helper.resolveColor(context, folder.unseen > 0 ? R.attr.colorUnread : android.R.attr.textColorSecondary));
|
||||
|
||||
tvMessages.setText(Integer.toString(folder.messages));
|
||||
|
||||
int resid = context.getResources().getIdentifier(
|
||||
"title_folder_" + folder.type.toLowerCase(),
|
||||
"string",
|
||||
context.getPackageName());
|
||||
tvType.setText(resid > 0 ? context.getString(resid) : folder.type);
|
||||
|
||||
ivUnified.setVisibility(folder.unified ? View.VISIBLE : View.GONE);
|
||||
|
||||
tvAfter.setText(Integer.toString(folder.after));
|
||||
ivSync.setVisibility(folder.synchronize ? View.VISIBLE : View.INVISIBLE);
|
||||
|
||||
if ("connected".equals(folder.state))
|
||||
ivState.setImageResource(R.drawable.baseline_cloud_24);
|
||||
else if ("connecting".equals(folder.state))
|
||||
@@ -135,6 +108,33 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
ivState.setImageResource(R.drawable.baseline_cloud_off_24);
|
||||
ivState.setVisibility(folder.synchronize || folder.state != null ? View.VISIBLE : View.INVISIBLE);
|
||||
|
||||
String name = Helper.localizeFolderName(context, folder.name);
|
||||
if (folder.unseen > 0)
|
||||
tvName.setText(context.getString(R.string.title_folder_unseen, name, folder.unseen));
|
||||
else
|
||||
tvName.setText(name);
|
||||
tvName.setTypeface(null, folder.unseen > 0 ? Typeface.BOLD : Typeface.NORMAL);
|
||||
tvName.setTextColor(Helper.resolveColor(context, folder.unseen > 0 ? R.attr.colorUnread : android.R.attr.textColorSecondary));
|
||||
|
||||
tvMessages.setText(Integer.toString(folder.messages));
|
||||
|
||||
ivUnified.setVisibility(folder.unified ? View.VISIBLE : View.INVISIBLE);
|
||||
|
||||
int resid = context.getResources().getIdentifier(
|
||||
"title_folder_" + folder.type.toLowerCase(),
|
||||
"string",
|
||||
context.getPackageName());
|
||||
tvType.setText(resid > 0 ? context.getString(resid) : folder.type);
|
||||
|
||||
if (folder.account == null) {
|
||||
tvAfter.setText(null);
|
||||
ivSync.setVisibility(View.GONE);
|
||||
} else {
|
||||
tvAfter.setText(Integer.toString(folder.after));
|
||||
ivSync.setImageResource(folder.synchronize ? R.drawable.baseline_sync_24 : R.drawable.baseline_sync_disabled_24);
|
||||
ivSync.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
tvError.setText(folder.error);
|
||||
tvError.setVisibility(folder.error == null ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
@@ -147,19 +147,10 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
|
||||
TupleFolderEx folder = filtered.get(pos);
|
||||
|
||||
if (view.getId() == R.id.ivEdit) {
|
||||
if (!EntityFolder.OUTBOX.equals(folder.type)) {
|
||||
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
|
||||
lbm.sendBroadcast(
|
||||
new Intent(ActivityView.ACTION_EDIT_FOLDER)
|
||||
.putExtra("id", folder.id));
|
||||
}
|
||||
} else {
|
||||
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
|
||||
lbm.sendBroadcast(
|
||||
new Intent(ActivityView.ACTION_VIEW_MESSAGES)
|
||||
.putExtra("folder", folder.id));
|
||||
}
|
||||
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
|
||||
lbm.sendBroadcast(
|
||||
new Intent(ActivityView.ACTION_VIEW_MESSAGES)
|
||||
.putExtra("folder", folder.id));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -171,21 +162,34 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
final TupleFolderEx folder = filtered.get(pos);
|
||||
|
||||
PopupMenu popupMenu = new PopupMenu(context, itemView);
|
||||
popupMenu.getMenu().add(Menu.NONE, action_synchronize, 1, R.string.title_synchronize_now);
|
||||
popupMenu.getMenu().add(Menu.NONE, action_delete_local, 2, R.string.title_delete_local);
|
||||
|
||||
popupMenu.getMenu().add(Menu.NONE, action_sync, 1, R.string.title_synchronize_now);
|
||||
popupMenu.getMenu().findItem(action_sync).setEnabled("connected".equals(accountState));
|
||||
|
||||
if (folder.account != null) {
|
||||
popupMenu.getMenu().add(Menu.NONE, action_delete, 2, R.string.title_delete_local);
|
||||
popupMenu.getMenu().add(Menu.NONE, action_edit, 3, R.string.title_edit_properties);
|
||||
}
|
||||
|
||||
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem target) {
|
||||
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
|
||||
switch (target.getItemId()) {
|
||||
case action_synchronize:
|
||||
case action_edit:
|
||||
lbm.sendBroadcast(
|
||||
new Intent(ActivityView.ACTION_EDIT_FOLDER)
|
||||
.putExtra("id", folder.id));
|
||||
break;
|
||||
case action_sync:
|
||||
Log.i(Helper.TAG, folder.name + " requesting sync");
|
||||
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
|
||||
lbm.sendBroadcast(new Intent(ServiceSynchronize.ACTION_SYNCHRONIZE_FOLDER)
|
||||
.setType("account/" + (folder.account == null ? "outbox" : Long.toString(folder.account)))
|
||||
.putExtra("folder", folder.id));
|
||||
lbm.sendBroadcast(
|
||||
new Intent(ServiceSynchronize.ACTION_SYNCHRONIZE_FOLDER)
|
||||
.setType("account/" + (folder.account == null ? "outbox" : Long.toString(folder.account)))
|
||||
.putExtra("folder", folder.id));
|
||||
break;
|
||||
|
||||
case action_delete_local:
|
||||
case action_delete:
|
||||
Bundle args = new Bundle();
|
||||
args.putLong("id", folder.id);
|
||||
|
||||
@@ -276,6 +280,10 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
diff.dispatchUpdatesTo(this);
|
||||
}
|
||||
|
||||
public void setAccountState(String state) {
|
||||
this.accountState = state;
|
||||
}
|
||||
|
||||
private class MessageDiffCallback extends DiffUtil.Callback {
|
||||
private List<TupleFolderEx> prev;
|
||||
private List<TupleFolderEx> next;
|
||||
@@ -333,6 +341,6 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
TupleFolderEx folder = filtered.get(position);
|
||||
holder.bindTo(folder);
|
||||
|
||||
holder.wire(folder.account != null);
|
||||
holder.wire();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,10 +20,13 @@ package eu.faircode.email;
|
||||
*/
|
||||
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.ProgressBar;
|
||||
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
@@ -38,8 +41,10 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
public class FragmentFolders extends FragmentEx {
|
||||
private ImageButton ibHintActions;
|
||||
private RecyclerView rvFolder;
|
||||
private ProgressBar pbWait;
|
||||
private Group grpHintActions;
|
||||
private Group grpReady;
|
||||
private FloatingActionButton fab;
|
||||
|
||||
@@ -61,13 +66,24 @@ public class FragmentFolders extends FragmentEx {
|
||||
View view = inflater.inflate(R.layout.fragment_folders, container, false);
|
||||
|
||||
// Get controls
|
||||
ibHintActions = view.findViewById(R.id.ibHintActions);
|
||||
rvFolder = view.findViewById(R.id.rvFolder);
|
||||
pbWait = view.findViewById(R.id.pbWait);
|
||||
grpHintActions = view.findViewById(R.id.grpHintActions);
|
||||
grpReady = view.findViewById(R.id.grpReady);
|
||||
fab = view.findViewById(R.id.fab);
|
||||
|
||||
// Wire controls
|
||||
|
||||
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||
ibHintActions.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
prefs.edit().putBoolean("folder_actions", true).apply();
|
||||
grpHintActions.setVisibility(View.GONE);
|
||||
}
|
||||
});
|
||||
|
||||
rvFolder.setHasFixedSize(false);
|
||||
LinearLayoutManager llm = new LinearLayoutManager(getContext());
|
||||
rvFolder.setLayoutManager(llm);
|
||||
@@ -99,6 +115,9 @@ public class FragmentFolders extends FragmentEx {
|
||||
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||
grpHintActions.setVisibility(prefs.getBoolean("folder_actions", false) ? View.GONE : View.VISIBLE);
|
||||
|
||||
DB db = DB.getInstance(getContext());
|
||||
|
||||
// Observe account
|
||||
@@ -106,6 +125,7 @@ public class FragmentFolders extends FragmentEx {
|
||||
@Override
|
||||
public void onChanged(@Nullable EntityAccount account) {
|
||||
setSubtitle(account == null ? null : account.name);
|
||||
adapter.setAccountState(account.state);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
@@ -60,11 +60,11 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
public class FragmentMessages extends FragmentEx {
|
||||
private ViewGroup view;
|
||||
private Button btnHintActions;
|
||||
private ImageButton ibHintActions;
|
||||
private RecyclerView rvMessage;
|
||||
private TextView tvNoEmail;
|
||||
private ProgressBar pbWait;
|
||||
private Group grpHintSwipe;
|
||||
private Group grpHintActions;
|
||||
private Group grpReady;
|
||||
private FloatingActionButton fab;
|
||||
|
||||
@@ -104,22 +104,22 @@ public class FragmentMessages extends FragmentEx {
|
||||
setHasOptionsMenu(true);
|
||||
|
||||
// Get controls
|
||||
btnHintActions = view.findViewById(R.id.btnHintActions);
|
||||
ibHintActions = view.findViewById(R.id.ibHintActions);
|
||||
rvMessage = view.findViewById(R.id.rvFolder);
|
||||
tvNoEmail = view.findViewById(R.id.tvNoEmail);
|
||||
pbWait = view.findViewById(R.id.pbWait);
|
||||
grpReady = view.findViewById(R.id.grpReady);
|
||||
grpHintSwipe = view.findViewById(R.id.grpHintSwipe);
|
||||
grpHintActions = view.findViewById(R.id.grpHintActions);
|
||||
fab = view.findViewById(R.id.fab);
|
||||
|
||||
// Wire controls
|
||||
|
||||
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||
btnHintActions.setOnClickListener(new View.OnClickListener() {
|
||||
ibHintActions.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
prefs.edit().putBoolean("understood_actions", true).apply();
|
||||
grpHintSwipe.setVisibility(View.GONE);
|
||||
prefs.edit().putBoolean("message_actions", true).apply();
|
||||
grpHintActions.setVisibility(View.GONE);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -283,8 +283,7 @@ public class FragmentMessages extends FragmentEx {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||
|
||||
grpHintSwipe.setVisibility(prefs.getBoolean("understood_actions", false) ? View.GONE : View.VISIBLE);
|
||||
grpHintActions.setVisibility(prefs.getBoolean("message_actions", false) ? View.GONE : View.VISIBLE);
|
||||
|
||||
final DB db = DB.getInstance(getContext());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user