Lifecycle aware popup menu

This commit is contained in:
M66B 2019-05-03 18:59:27 +02:00
parent 9bb6bd0378
commit 4777d24057
6 changed files with 62 additions and 11 deletions

View File

@ -78,6 +78,8 @@ public class AdapterAccount extends RecyclerView.Adapter<AdapterAccount.ViewHold
private TextView tvError;
private Group grpSettings;
private TwoStateOwner powner = new TwoStateOwner(owner, "AccountPopup");
ViewHolder(View itemView) {
super(itemView);
@ -183,7 +185,7 @@ public class AdapterAccount extends RecyclerView.Adapter<AdapterAccount.ViewHold
if (account.tbd != null)
return false;
PopupMenu popupMenu = new PopupMenu(context, view);
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(context, powner, view);
popupMenu.getMenu().add(Menu.NONE, 1, 1, R.string.title_advanced_enabled)
.setCheckable(true).setChecked(account.synchronize);
@ -338,4 +340,9 @@ public class AdapterAccount extends RecyclerView.Adapter<AdapterAccount.ViewHold
holder.wire();
}
@Override
public void onViewRecycled(@NonNull ViewHolder holder) {
holder.powner.recreate();
}
}

View File

@ -107,7 +107,9 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
private RecyclerView rvChilds;
private AdapterFolder childs;
private TwoStateOwner cowner = new TwoStateOwner(owner, "AdapterFolder");
private TwoStateOwner cowner = new TwoStateOwner(owner, "FolderChilds");
private TwoStateOwner powner = new TwoStateOwner(owner, "FolderPopup");
private final static int action_synchronize_now = 1;
private final static int action_synchronize = 2;
@ -380,7 +382,7 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
if (folder.tbd != null)
return false;
PopupMenu popupMenu = new PopupMenu(context, vwRipple);
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(context, powner, vwRipple);
popupMenu.getMenu().add(Menu.NONE, action_synchronize_now, 1, R.string.title_synchronize_now);
@ -788,6 +790,7 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
@Override
public void onViewRecycled(@NonNull ViewHolder holder) {
holder.cowner.stop();
holder.powner.recreate();
}
@Override

View File

@ -70,6 +70,8 @@ public class AdapterIdentity extends RecyclerView.Adapter<AdapterIdentity.ViewHo
private TextView tvLast;
private TextView tvError;
private TwoStateOwner powner = new TwoStateOwner(owner, "IdentityPopup");
ViewHolder(View itemView) {
super(itemView);
@ -149,7 +151,7 @@ public class AdapterIdentity extends RecyclerView.Adapter<AdapterIdentity.ViewHo
if (identity.tbd != null)
return false;
PopupMenu popupMenu = new PopupMenu(context, view);
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(context, powner, view);
popupMenu.getMenu().add(Menu.NONE, 1, 1, R.string.title_advanced_enabled)
.setCheckable(true).setChecked(identity.synchronize);
@ -310,4 +312,9 @@ public class AdapterIdentity extends RecyclerView.Adapter<AdapterIdentity.ViewHo
holder.wire();
}
@Override
public void onViewRecycled(@NonNull ViewHolder holder) {
holder.powner.recreate();
}
}

View File

@ -261,7 +261,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
private AdapterAttachment adapterAttachment;
private AdapterImage adapterImage;
private TwoStateOwner cowner = new TwoStateOwner(owner, "AdapterMessage");
private TwoStateOwner cowner = new TwoStateOwner(owner, "MessageAttachments");
private TwoStateOwner powner = new TwoStateOwner(owner, "MessagePopup");
ViewHolder(final View itemView) {
super(itemView);
@ -2247,7 +2249,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
return;
View anchor = bnvActions.findViewById(R.id.action_more);
PopupMenu popupMenu = new PopupMenu(context, anchor);
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(context, powner, anchor);
int order = 0;
for (EntityFolder folder : folders)
@ -2727,7 +2729,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
boolean show_headers = properties.getValue("headers", data.message.id);
View anchor = bnvActions.findViewById(R.id.action_more);
PopupMenu popupMenu = new PopupMenu(context, anchor);
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(context, powner, anchor);
popupMenu.inflate(R.menu.menu_message);
popupMenu.getMenu().findItem(R.id.menu_forward).setEnabled(data.message.content);
@ -2946,7 +2948,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
return;
View anchor = bnvActions.findViewById(R.id.action_move);
PopupMenu popupMenu = new PopupMenu(context, anchor);
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(context, powner, anchor);
int order = 0;
for (EntityFolder folder : folders)
@ -2996,7 +2998,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
private void onActionReplyMenu(final ActionData data) {
View anchor = bnvActions.findViewById(R.id.action_reply);
PopupMenu popupMenu = new PopupMenu(context, anchor);
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(context, powner, anchor);
popupMenu.inflate(R.menu.menu_reply);
popupMenu.getMenu().findItem(R.id.menu_reply_list).setVisible(data.message.list_post != null);
popupMenu.getMenu().findItem(R.id.menu_reply_receipt).setVisible(data.message.receipt_to != null);
@ -3096,7 +3098,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
snackbar.show();
} else {
View anchor = bnvActions.findViewById(R.id.action_reply);
PopupMenu popupMenu = new PopupMenu(context, anchor);
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(context, powner, anchor);
int order = 0;
for (EntityAnswer answer : answers)
@ -3290,6 +3292,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
@Override
public void onViewRecycled(@NonNull ViewHolder holder) {
holder.cowner.stop();
holder.powner.recreate();
}
void setSelectionTracker(SelectionTracker<Long> selectionTracker) {

View File

@ -1160,7 +1160,7 @@ public class FragmentMessages extends FragmentBase {
@Override
protected void onExecuted(Bundle args, final MoreResult result) {
PopupMenu popupMenu = new PopupMenu(getContext(), fabMore);
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(getContext(), getViewLifecycleOwner(), fabMore);
if (result.unseen) // Unseen, not draft
popupMenu.getMenu().add(Menu.NONE, action_seen, 1, R.string.title_seen);

View File

@ -0,0 +1,31 @@
package eu.faircode.email;
import android.content.Context;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.PopupMenu;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
public class PopupMenuLifecycle extends PopupMenu implements LifecycleObserver {
private LifecycleOwner owner;
public PopupMenuLifecycle(@NonNull Context context, LifecycleOwner owner, @NonNull View anchor) {
super(context, anchor);
this.owner = owner;
}
@Override
public void show() {
super.show();
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
this.dismiss();
owner = null;
}
}