diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogSelectUnifiedFolder.java b/app/src/main/java/eu/faircode/email/FragmentDialogSelectUnifiedFolder.java new file mode 100644 index 0000000000..3a6da201d9 --- /dev/null +++ b/app/src/main/java/eu/faircode/email/FragmentDialogSelectUnifiedFolder.java @@ -0,0 +1,204 @@ +package eu.faircode.email; + +/* + This file is part of FairEmail. + + FairEmail 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. + + FairEmail 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 FairEmail. If not, see . + + Copyright 2018-2023 by Marcel Bokhorst (M66B) +*/ + +import static android.app.Activity.RESULT_OK; + +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.constraintlayout.widget.Group; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class FragmentDialogSelectUnifiedFolder extends FragmentDialogBase { + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + final Context context = getContext(); + + final View dview = LayoutInflater.from(context).inflate(R.layout.dialog_account_select, null); + RecyclerView rvSelect = dview.findViewById(R.id.rvSelect); + final ContentLoadingProgressBar pbWait = dview.findViewById(R.id.pbWait); + final Group grpReady = dview.findViewById(R.id.grpReady); + + rvSelect.setHasFixedSize(false); + rvSelect.setLayoutManager(new LinearLayoutManager(context)); + + Dialog dialog = new AlertDialog.Builder(context) + .setIcon(R.drawable.twotone_folder_open_24) + .setTitle(R.string.title_folders_unified) + .setView(dview) + .setNegativeButton(android.R.string.cancel, null) + .create(); + + new SimpleTask>() { + @Override + protected void onPreExecute(Bundle args) { + pbWait.setVisibility(View.VISIBLE); + grpReady.setVisibility(View.GONE); + } + + @Override + protected void onPostExecute(Bundle args) { + pbWait.setVisibility(View.GONE); + grpReady.setVisibility(View.VISIBLE); + } + + @Override + protected List onExecute(Context context, Bundle args) { + DB db = DB.getInstance(context); + return db.folder().getUnified(null); + } + + @Override + protected void onExecuted(Bundle args, List folders) { + if (folders == null) + folders = new ArrayList<>(); + else if (folders.size() > 0) + Collections.sort(folders, folders.get(0).getComparator(context)); + + AdapterFolder adapter = new AdapterFolder(context, folders, new AdapterFolder.IListener() { + @Override + public void onSelected(TupleFolderEx folder) { + LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context); + lbm.sendBroadcast( + new Intent(ActivityView.ACTION_VIEW_MESSAGES) + .putExtra("account", folder.account) + .putExtra("folder", folder.id) + .putExtra("type", folder.type)); + sendResult(RESULT_OK); + dialog.dismiss(); + } + }); + + rvSelect.setAdapter(adapter); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(getParentFragmentManager(), ex); + } + }.execute(this, new Bundle(), "select:folder"); + + return dialog; + } + + public static class AdapterFolder extends RecyclerView.Adapter { + private Context context; + private LayoutInflater inflater; + + private int dp6; + private int dp12; + private List items; + private IListener listener; + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + private View vwColor; + private TextView tv; + + ViewHolder(View itemView) { + super(itemView); + vwColor = itemView.findViewById(R.id.vwColor); + tv = itemView.findViewById(android.R.id.text1); + } + + private void wire() { + itemView.setOnClickListener(this); + } + + private void unwire() { + itemView.setOnClickListener(null); + } + + private void bindTo(TupleFolderEx folder) { + int vpad = (getItemCount() > 10 ? dp6 : dp12); + tv.setPadding(0, vpad, 0, vpad); + + vwColor.setBackgroundColor(folder.color == null ? Color.TRANSPARENT : folder.color); + tv.setText(folder.accountName + "/" + folder.getDisplayName(context)); + } + + @Override + public void onClick(View v) { + int pos = getAdapterPosition(); + if (pos == RecyclerView.NO_POSITION) + return; + + TupleFolderEx folder = items.get(pos); + listener.onSelected(folder); + } + } + + AdapterFolder(Context context, List folders, IListener listener) { + this.context = context; + this.inflater = LayoutInflater.from(context); + this.dp6 = Helper.dp2pixels(context, 6); + this.dp12 = Helper.dp2pixels(context, 12); + + setHasStableIds(true); + this.items = folders; + this.listener = listener; + } + + @Override + public long getItemId(int position) { + return items.get(position).id; + } + + @Override + public int getItemCount() { + return items.size(); + } + + @Override + @NonNull + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(inflater.inflate(R.layout.item_account_select, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + holder.unwire(); + TupleFolderEx folder = items.get(position); + holder.bindTo(folder); + holder.wire(); + } + + public interface IListener { + void onSelected(TupleFolderEx folder); + } + } +} diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 6a2bbef633..7e7ecfca64 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -558,53 +558,8 @@ public class FragmentMessages extends FragmentBase setActionBarListener(getViewLifecycleOwner(), new View.OnClickListener() { @Override public void onClick(View v) { - new SimpleTask>() { - @Override - protected List onExecute(Context context, Bundle args) { - DB db = DB.getInstance(context); - return db.folder().getUnified(null); - } - - @Override - protected void onExecuted(Bundle args, final List folders) { - if (folders == null) - return; - - final Context context = getContext(); - if (context == null) - return; - - Collections.sort(folders, folders.get(0).getComparator(context)); - - List items = new ArrayList<>(); - for (TupleFolderEx folder : folders) - items.add(folder.accountName + "/" + folder.getDisplayName(context)); - - new AlertDialog.Builder(context) - .setIcon(R.drawable.twotone_folder_open_24) - .setTitle(R.string.title_folders_unified) - .setItems(items.toArray(new CharSequence[0]), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - TupleFolderEx folder = folders.get(which); - - LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context); - lbm.sendBroadcast( - new Intent(ActivityView.ACTION_VIEW_MESSAGES) - .putExtra("account", folder.account) - .putExtra("folder", folder.id) - .putExtra("type", folder.type)); - } - }) - .setPositiveButton(android.R.string.cancel, null) - .show(); - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Log.unexpectedError(getParentFragment(), ex); - } - }.execute(FragmentMessages.this, new Bundle(), "unified"); + FragmentDialogSelectUnifiedFolder fragment = new FragmentDialogSelectUnifiedFolder(); + fragment.show(getParentFragmentManager(), "unified:select"); } });