Safely reference parent fragment from adapters

pull/157/head
M66B 6 years ago
parent 0d5b1e2bac
commit 72db63e979

@ -40,7 +40,11 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.widget.PopupMenu; import androidx.appcompat.widget.PopupMenu;
import androidx.constraintlayout.widget.Group; import androidx.constraintlayout.widget.Group;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.ListUpdateCallback;
@ -53,9 +57,11 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class AdapterAccount extends RecyclerView.Adapter<AdapterAccount.ViewHolder> { public class AdapterAccount extends RecyclerView.Adapter<AdapterAccount.ViewHolder> {
private Fragment parentFragment;
private boolean settings;
private Context context; private Context context;
private LifecycleOwner owner; private LifecycleOwner owner;
private boolean settings;
private LayoutInflater inflater; private LayoutInflater inflater;
private int colorUnread; private int colorUnread;
@ -270,16 +276,28 @@ public class AdapterAccount extends RecyclerView.Adapter<AdapterAccount.ViewHold
} }
} }
AdapterAccount(Context context, LifecycleOwner owner, boolean settings) { AdapterAccount(final Fragment parentFragment, boolean settings) {
this.context = context; this.parentFragment = parentFragment;
this.owner = owner;
this.settings = settings; this.settings = settings;
this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.inflater = LayoutInflater.from(context); this.inflater = LayoutInflater.from(context);
this.colorUnread = Helper.resolveColor(context, R.attr.colorUnread); this.colorUnread = Helper.resolveColor(context, R.attr.colorUnread);
this.textColorSecondary = Helper.resolveColor(context, android.R.attr.textColorSecondary); this.textColorSecondary = Helper.resolveColor(context, android.R.attr.textColorSecondary);
setHasStableIds(true); setHasStableIds(true);
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterAccount.this + " parent destroyed");
AdapterAccount.this.parentFragment = null;
AdapterAccount.this.context = null;
AdapterAccount.this.owner = null;
}
});
} }
public void set(@NonNull List<TupleAccountEx> accounts) { public void set(@NonNull List<TupleAccountEx> accounts) {

@ -31,7 +31,11 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.widget.PopupMenu; import androidx.appcompat.widget.PopupMenu;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.ListUpdateCallback;
@ -41,6 +45,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder> { public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder> {
private Fragment parentFragment;
private Context context; private Context context;
private LifecycleOwner owner; private LifecycleOwner owner;
private LayoutInflater inflater; private LayoutInflater inflater;
@ -160,12 +166,25 @@ public class AdapterAnswer extends RecyclerView.Adapter<AdapterAnswer.ViewHolder
} }
} }
AdapterAnswer(Context context, LifecycleOwner owner) { AdapterAnswer(Fragment parentFragment) {
this.context = context; this.parentFragment = parentFragment;
this.owner = owner;
this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.inflater = LayoutInflater.from(context); this.inflater = LayoutInflater.from(context);
setHasStableIds(true); setHasStableIds(true);
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterAnswer.this + " parent destroyed");
AdapterAnswer.this.parentFragment = null;
AdapterAnswer.this.context = null;
AdapterAnswer.this.owner = null;
}
});
new SimpleTask<Boolean>() { new SimpleTask<Boolean>() {
@Override @Override
protected Boolean onExecute(Context context, Bundle args) { protected Boolean onExecute(Context context, Bundle args) {

@ -38,7 +38,11 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.FileProvider; import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
@ -55,9 +59,11 @@ import java.util.Comparator;
import java.util.List; import java.util.List;
public class AdapterAttachment extends RecyclerView.Adapter<AdapterAttachment.ViewHolder> { public class AdapterAttachment extends RecyclerView.Adapter<AdapterAttachment.ViewHolder> {
private Fragment parentFragment;
private Context context; private Context context;
private LayoutInflater inflater;
private LifecycleOwner owner; private LifecycleOwner owner;
private LayoutInflater inflater;
private boolean readonly; private boolean readonly;
private boolean debug; private boolean debug;
@ -277,14 +283,28 @@ public class AdapterAttachment extends RecyclerView.Adapter<AdapterAttachment.Vi
} }
} }
AdapterAttachment(Context context, LifecycleOwner owner, boolean readonly) { AdapterAttachment(Fragment parentFragment, boolean readonly) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); this.parentFragment = parentFragment;
this.context = context;
this.inflater = LayoutInflater.from(context);
this.owner = owner;
this.readonly = readonly; this.readonly = readonly;
this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.inflater = LayoutInflater.from(context);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
this.debug = prefs.getBoolean("debug", false); this.debug = prefs.getBoolean("debug", false);
setHasStableIds(true); setHasStableIds(true);
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterAttachment.this + " parent destroyed");
AdapterAttachment.this.parentFragment = null;
AdapterAttachment.this.context = null;
AdapterAttachment.this.owner = null;
}
});
} }
public void set(@NonNull List<EntityAttachment> attachments) { public void set(@NonNull List<EntityAttachment> attachments) {

@ -33,7 +33,11 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.ListUpdateCallback;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -43,6 +47,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class AdapterContact extends RecyclerView.Adapter<AdapterContact.ViewHolder> { public class AdapterContact extends RecyclerView.Adapter<AdapterContact.ViewHolder> {
private Fragment parentFragment;
private Context context; private Context context;
private LifecycleOwner owner; private LifecycleOwner owner;
private LayoutInflater inflater; private LayoutInflater inflater;
@ -225,14 +231,28 @@ public class AdapterContact extends RecyclerView.Adapter<AdapterContact.ViewHold
} }
} }
AdapterContact(Context context, LifecycleOwner owner) { AdapterContact(Fragment parentFragment) {
this.context = context; this.parentFragment = parentFragment;
this.owner = owner;
this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.inflater = LayoutInflater.from(context); this.inflater = LayoutInflater.from(context);
this.contacts = Helper.hasPermission(context, Manifest.permission.READ_CONTACTS); this.contacts = Helper.hasPermission(context, Manifest.permission.READ_CONTACTS);
this.colorAccent = Helper.resolveColor(context, R.attr.colorAccent); this.colorAccent = Helper.resolveColor(context, R.attr.colorAccent);
this.textColorSecondary = Helper.resolveColor(context, android.R.attr.textColorSecondary); this.textColorSecondary = Helper.resolveColor(context, android.R.attr.textColorSecondary);
setHasStableIds(true); setHasStableIds(true);
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterContact.this + " parent destroyed");
AdapterContact.this.parentFragment = null;
AdapterContact.this.context = null;
AdapterContact.this.owner = null;
}
});
} }
public void set(@NonNull List<TupleContactEx> contacts) { public void set(@NonNull List<TupleContactEx> contacts) {

@ -44,7 +44,10 @@ import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import androidx.appcompat.widget.PopupMenu; import androidx.appcompat.widget.PopupMenu;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
@ -63,15 +66,15 @@ import java.util.Map;
import static android.app.Activity.RESULT_OK; import static android.app.Activity.RESULT_OK;
public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder> { public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder> {
private Context context;
private LayoutInflater inflater;
private LifecycleOwner owner;
private Fragment parentFragment; private Fragment parentFragment;
private boolean show_hidden;
private long account; private long account;
private boolean show_hidden;
private IFolderSelectedListener listener; private IFolderSelectedListener listener;
private Context context;
private LifecycleOwner owner;
private LayoutInflater inflater;
private boolean subscriptions; private boolean subscriptions;
private boolean debug; private boolean debug;
private int dp12; private int dp12;
@ -599,16 +602,16 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
} }
} }
AdapterFolder(Context context, LifecycleOwner owner, Fragment parentFragment, AdapterFolder(Fragment parentFragment, long account, boolean show_hidden, IFolderSelectedListener listener) {
long account, boolean show_hidden, IFolderSelectedListener listener) {
this.context = context;
this.inflater = LayoutInflater.from(context);
this.owner = owner;
this.parentFragment = parentFragment; this.parentFragment = parentFragment;
this.show_hidden = show_hidden;
this.account = account; this.account = account;
this.show_hidden = show_hidden;
this.listener = listener; this.listener = listener;
this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.inflater = LayoutInflater.from(context);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean compact = prefs.getBoolean("compact", false); boolean compact = prefs.getBoolean("compact", false);
int zoom = prefs.getInt("zoom", compact ? 0 : 1); int zoom = prefs.getInt("zoom", compact ? 0 : 1);
@ -624,6 +627,16 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
this.textColorSecondary = Helper.resolveColor(context, android.R.attr.textColorSecondary); this.textColorSecondary = Helper.resolveColor(context, android.R.attr.textColorSecondary);
setHasStableIds(true); setHasStableIds(true);
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterFolder.this + " parent destroyed");
AdapterFolder.this.parentFragment = null;
AdapterFolder.this.context = null;
AdapterFolder.this.owner = null;
}
});
} }
void setShowHidden(boolean show_hidden) { void setShowHidden(boolean show_hidden) {

@ -33,7 +33,11 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.widget.PopupMenu; import androidx.appcompat.widget.PopupMenu;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.ListUpdateCallback;
@ -49,6 +53,7 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
public class AdapterIdentity extends RecyclerView.Adapter<AdapterIdentity.ViewHolder> { public class AdapterIdentity extends RecyclerView.Adapter<AdapterIdentity.ViewHolder> {
private Fragment parentFragment;
private Context context; private Context context;
private LifecycleOwner owner; private LifecycleOwner owner;
private LayoutInflater inflater; private LayoutInflater inflater;
@ -206,11 +211,23 @@ public class AdapterIdentity extends RecyclerView.Adapter<AdapterIdentity.ViewHo
} }
} }
AdapterIdentity(Context context, LifecycleOwner owner) { AdapterIdentity(Fragment parentFragment) {
this.context = context; this.parentFragment = parentFragment;
this.owner = owner; this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.inflater = LayoutInflater.from(context); this.inflater = LayoutInflater.from(context);
setHasStableIds(true); setHasStableIds(true);
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterIdentity.this + " parent destroyed");
AdapterIdentity.this.parentFragment = null;
AdapterIdentity.this.context = null;
AdapterIdentity.this.owner = null;
}
});
} }
public void set(@NonNull List<TupleIdentityEx> identities) { public void set(@NonNull List<TupleIdentityEx> identities) {

@ -35,7 +35,11 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.FileProvider; import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.ListUpdateCallback;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -49,10 +53,10 @@ import java.util.Comparator;
import java.util.List; import java.util.List;
public class AdapterImage extends RecyclerView.Adapter<AdapterImage.ViewHolder> { public class AdapterImage extends RecyclerView.Adapter<AdapterImage.ViewHolder> {
private Fragment parentFragment;
private Context context; private Context context;
private LayoutInflater inflater; private LayoutInflater inflater;
private LifecycleOwner owner; private LifecycleOwner owner;
private View parentView;
private List<EntityAttachment> items = new ArrayList<>(); private List<EntityAttachment> items = new ArrayList<>();
@ -132,7 +136,7 @@ public class AdapterImage extends RecyclerView.Adapter<AdapterImage.ViewHolder>
// Check if viewer available // Check if viewer available
if (ris.size() == 0) { if (ris.size() == 0) {
Snackbar.make( Snackbar.make(
parentView, parentFragment.getView(),
context.getString(R.string.title_no_viewer, attachment.type), context.getString(R.string.title_no_viewer, attachment.type),
Snackbar.LENGTH_LONG).show(); Snackbar.LENGTH_LONG).show();
return; return;
@ -178,12 +182,23 @@ public class AdapterImage extends RecyclerView.Adapter<AdapterImage.ViewHolder>
} }
} }
AdapterImage(Context context, LifecycleOwner owner, View parentView) { AdapterImage(Fragment parentFragment) {
this.context = context; this.parentFragment = parentFragment;
this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.inflater = LayoutInflater.from(context); this.inflater = LayoutInflater.from(context);
this.owner = owner;
this.parentView = parentView;
setHasStableIds(true); setHasStableIds(true);
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterImage.this + " parent destroyed");
AdapterImage.this.parentFragment = null;
AdapterImage.this.context = null;
AdapterImage.this.owner = null;
}
});
} }
public void set(@NonNull List<EntityAttachment> attachments) { public void set(@NonNull List<EntityAttachment> attachments) {

@ -26,6 +26,11 @@ import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.ListUpdateCallback;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -36,7 +41,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class AdapterLog extends RecyclerView.Adapter<AdapterLog.ViewHolder> { public class AdapterLog extends RecyclerView.Adapter<AdapterLog.ViewHolder> {
private Fragment parentFragment;
private Context context; private Context context;
private LifecycleOwner owner;
private LayoutInflater inflater; private LayoutInflater inflater;
private List<EntityLog> items = new ArrayList<>(); private List<EntityLog> items = new ArrayList<>();
@ -61,10 +68,23 @@ public class AdapterLog extends RecyclerView.Adapter<AdapterLog.ViewHolder> {
} }
AdapterLog(Context context) { AdapterLog(Fragment parentFragment) {
this.context = context; this.parentFragment = parentFragment;
this.inflater = LayoutInflater.from(context); this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.inflater = LayoutInflater.from(parentFragment.getContext());
setHasStableIds(true); setHasStableIds(true);
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterLog.this + " parent destroyed");
AdapterLog.this.parentFragment = null;
AdapterLog.this.context = null;
AdapterLog.this.owner = null;
}
});
} }
public void set(@NonNull List<EntityLog> logs) { public void set(@NonNull List<EntityLog> logs) {

@ -145,19 +145,19 @@ import biweekly.util.ICalDate;
import static android.app.Activity.RESULT_OK; import static android.app.Activity.RESULT_OK;
public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHolder> { public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHolder> {
private Context context;
private LayoutInflater inflater;
private LifecycleOwner owner;
private Fragment parentFragment; private Fragment parentFragment;
private ViewType viewType; private ViewType viewType;
private boolean compact; private boolean compact;
private int zoom; private int zoom;
private String sort; private String sort;
private boolean filter_duplicates; private boolean filter_duplicates;
private boolean suitable;
private int answers = -1;
private IProperties properties; private IProperties properties;
private Context context;
private LifecycleOwner owner;
private LayoutInflater inflater;
private boolean suitable;
private int dp36; private int dp36;
private int colorPrimary; private int colorPrimary;
private int colorAccent; private int colorAccent;
@ -182,6 +182,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
private boolean authentication; private boolean authentication;
private static boolean debug; private static boolean debug;
private int answers = -1;
private boolean gotoTop = false; private boolean gotoTop = false;
private AsyncPagedListDiffer<TupleMessageEx> differ; private AsyncPagedListDiffer<TupleMessageEx> differ;
private SelectionTracker<Long> selectionTracker = null; private SelectionTracker<Long> selectionTracker = null;
@ -389,7 +390,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
rvAttachment.setLayoutManager(llm); rvAttachment.setLayoutManager(llm);
rvAttachment.setItemAnimator(null); rvAttachment.setItemAnimator(null);
adapterAttachment = new AdapterAttachment(context, owner, true); adapterAttachment = new AdapterAttachment(parentFragment, true);
rvAttachment.setAdapter(adapterAttachment); rvAttachment.setAdapter(adapterAttachment);
cbInline = attachments.findViewById(R.id.cbInline); cbInline = attachments.findViewById(R.id.cbInline);
@ -416,7 +417,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
StaggeredGridLayoutManager sglm = StaggeredGridLayoutManager sglm =
new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
rvImage.setLayoutManager(sglm); rvImage.setLayoutManager(sglm);
adapterImage = new AdapterImage(context, owner, parentFragment.getView()); adapterImage = new AdapterImage(parentFragment);
rvImage.setAdapter(adapterImage); rvImage.setAdapter(adapterImage);
grpAddresses = vsBody.findViewById(R.id.grpAddresses); grpAddresses = vsBody.findViewById(R.id.grpAddresses);
@ -2998,24 +2999,23 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
} }
} }
AdapterMessage(Context context, LifecycleOwner owner, Fragment parentFragment, AdapterMessage(Fragment parentFragment,
ViewType viewType, boolean compact, int zoom, String sort, boolean filter_duplicates, final IProperties properties) { ViewType viewType, boolean compact, int zoom, String sort, boolean filter_duplicates,
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); final IProperties properties) {
this.TF = Helper.getTimeInstance(context, SimpleDateFormat.SHORT);
this.context = context;
this.owner = owner;
this.inflater = LayoutInflater.from(context);
this.parentFragment = parentFragment; this.parentFragment = parentFragment;
this.viewType = viewType; this.viewType = viewType;
this.compact = compact; this.compact = compact;
this.zoom = zoom; this.zoom = zoom;
this.sort = sort; this.sort = sort;
this.filter_duplicates = filter_duplicates; this.filter_duplicates = filter_duplicates;
this.suitable = ConnectionHelper.getNetworkState(context).isSuitable();
this.properties = properties; this.properties = properties;
this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.suitable = ConnectionHelper.getNetworkState(context).isSuitable();
this.inflater = LayoutInflater.from(context);
this.TF = Helper.getTimeInstance(context, SimpleDateFormat.SHORT);
this.dp36 = Helper.dp2pixels(context, 36); this.dp36 = Helper.dp2pixels(context, 36);
this.colorPrimary = Helper.resolveColor(context, R.attr.colorPrimary); this.colorPrimary = Helper.resolveColor(context, R.attr.colorPrimary);
this.colorAccent = Helper.resolveColor(context, R.attr.colorAccent); this.colorAccent = Helper.resolveColor(context, R.attr.colorAccent);
@ -3027,6 +3027,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
this.contacts = Helper.hasPermission(context, Manifest.permission.READ_CONTACTS); this.contacts = Helper.hasPermission(context, Manifest.permission.READ_CONTACTS);
this.textSize = Helper.getTextSize(context, zoom); this.textSize = Helper.getTextSize(context, zoom);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
this.date = prefs.getBoolean("date", true); this.date = prefs.getBoolean("date", true);
this.threading = prefs.getBoolean("threading", true); this.threading = prefs.getBoolean("threading", true);
this.avatars = (prefs.getBoolean("avatars", true) || this.avatars = (prefs.getBoolean("avatars", true) ||
@ -3053,6 +3054,16 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
} }
} }
}); });
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterMessage.this + " parent destroyed");
AdapterMessage.this.parentFragment = null;
AdapterMessage.this.context = null;
AdapterMessage.this.owner = null;
}
});
} }
void gotoTop() { void gotoTop() {

@ -30,7 +30,11 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
@ -44,9 +48,10 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class AdapterOperation extends RecyclerView.Adapter<AdapterOperation.ViewHolder> { public class AdapterOperation extends RecyclerView.Adapter<AdapterOperation.ViewHolder> {
private Fragment parentFragment;
private Context context; private Context context;
private LayoutInflater inflater;
private LifecycleOwner owner; private LifecycleOwner owner;
private LayoutInflater inflater;
private boolean debug; private boolean debug;
@ -207,15 +212,26 @@ public class AdapterOperation extends RecyclerView.Adapter<AdapterOperation.View
} }
} }
AdapterOperation(Context context, LifecycleOwner owner) { AdapterOperation(Fragment parentFragment) {
this.context = context; this.parentFragment = parentFragment;
this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.inflater = LayoutInflater.from(context); this.inflater = LayoutInflater.from(context);
this.owner = owner;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
this.debug = prefs.getBoolean("debug", false); this.debug = prefs.getBoolean("debug", false);
setHasStableIds(true); setHasStableIds(true);
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterOperation.this + " parent destroyed");
AdapterOperation.this.parentFragment = null;
AdapterOperation.this.context = null;
AdapterOperation.this.owner = null;
}
});
} }
public void set(@NonNull List<TupleOperationEx> operations) { public void set(@NonNull List<TupleOperationEx> operations) {

@ -26,7 +26,11 @@ import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.ListUpdateCallback;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -37,6 +41,7 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
public class AdapterOrder extends RecyclerView.Adapter<AdapterOrder.ViewHolder> { public class AdapterOrder extends RecyclerView.Adapter<AdapterOrder.ViewHolder> {
private Fragment parentFragment;
private Context context; private Context context;
private LifecycleOwner owner; private LifecycleOwner owner;
private LayoutInflater inflater; private LayoutInflater inflater;
@ -63,11 +68,23 @@ public class AdapterOrder extends RecyclerView.Adapter<AdapterOrder.ViewHolder>
} }
} }
AdapterOrder(Context context, LifecycleOwner owner) { AdapterOrder(Fragment parentFragment) {
this.context = context; this.parentFragment = parentFragment;
this.owner = owner; this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.inflater = LayoutInflater.from(context); this.inflater = LayoutInflater.from(context);
setHasStableIds(true); setHasStableIds(true);
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterOrder.this + " parent destroyed");
AdapterOrder.this.parentFragment = null;
AdapterOrder.this.context = null;
AdapterOrder.this.owner = null;
}
});
} }
public void set(@NonNull List<EntityOrder> items) { public void set(@NonNull List<EntityOrder> items) {

@ -33,7 +33,11 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.widget.PopupMenu; import androidx.appcompat.widget.PopupMenu;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.ListUpdateCallback;
@ -51,10 +55,10 @@ import java.util.List;
import javax.mail.MessagingException; import javax.mail.MessagingException;
public class AdapterRule extends RecyclerView.Adapter<AdapterRule.ViewHolder> { public class AdapterRule extends RecyclerView.Adapter<AdapterRule.ViewHolder> {
private Fragment parentFragment;
private Context context; private Context context;
private LifecycleOwner owner; private LifecycleOwner owner;
private LayoutInflater inflater; private LayoutInflater inflater;
private View parentView;
private List<TupleRuleEx> items = new ArrayList<>(); private List<TupleRuleEx> items = new ArrayList<>();
@ -262,7 +266,7 @@ public class AdapterRule extends RecyclerView.Adapter<AdapterRule.ViewHolder> {
@Override @Override
protected void onExecuted(Bundle args, Integer applied) { protected void onExecuted(Bundle args, Integer applied) {
Snackbar.make( Snackbar.make(
parentView, parentFragment.getView(),
context.getString(R.string.title_rule_applied, applied), context.getString(R.string.title_rule_applied, applied),
Snackbar.LENGTH_LONG).show(); Snackbar.LENGTH_LONG).show();
} }
@ -281,12 +285,23 @@ public class AdapterRule extends RecyclerView.Adapter<AdapterRule.ViewHolder> {
} }
} }
AdapterRule(Context context, LifecycleOwner owner, View parentView) { AdapterRule(Fragment parentFragment) {
this.context = context; this.parentFragment = parentFragment;
this.owner = owner; this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.inflater = LayoutInflater.from(context); this.inflater = LayoutInflater.from(context);
this.parentView = parentView;
setHasStableIds(true); setHasStableIds(true);
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterRule.this + " parent destroyed");
AdapterRule.this.parentFragment = null;
AdapterRule.this.context = null;
AdapterRule.this.owner = null;
}
});
} }
public void set(@NonNull List<TupleRuleEx> rules) { public void set(@NonNull List<TupleRuleEx> rules) {

@ -26,7 +26,11 @@ import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.ListUpdateCallback;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -37,6 +41,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class AdapterRuleMatch extends RecyclerView.Adapter<AdapterRuleMatch.ViewHolder> { public class AdapterRuleMatch extends RecyclerView.Adapter<AdapterRuleMatch.ViewHolder> {
private Fragment parentFragment;
private Context context; private Context context;
private LifecycleOwner owner; private LifecycleOwner owner;
private LayoutInflater inflater; private LayoutInflater inflater;
@ -70,11 +75,23 @@ public class AdapterRuleMatch extends RecyclerView.Adapter<AdapterRuleMatch.View
} }
} }
AdapterRuleMatch(Context context, LifecycleOwner owner) { AdapterRuleMatch(Fragment parentFragment) {
this.context = context; this.parentFragment = parentFragment;
this.owner = owner; this.context = parentFragment.getContext();
this.owner = parentFragment.getViewLifecycleOwner();
this.inflater = LayoutInflater.from(context); this.inflater = LayoutInflater.from(context);
setHasStableIds(true); setHasStableIds(true);
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
Log.i(AdapterRuleMatch.this + " parent destroyed");
AdapterRuleMatch.this.parentFragment = null;
AdapterRuleMatch.this.context = null;
AdapterRuleMatch.this.owner = null;
}
});
} }
public void set(@NonNull List<EntityMessage> messages) { public void set(@NonNull List<EntityMessage> messages) {

@ -92,7 +92,7 @@ public class FragmentAccounts extends FragmentBase {
itemDecorator.setDrawable(getContext().getDrawable(R.drawable.divider)); itemDecorator.setDrawable(getContext().getDrawable(R.drawable.divider));
rvAccount.addItemDecoration(itemDecorator); rvAccount.addItemDecoration(itemDecorator);
adapter = new AdapterAccount(getContext(), getViewLifecycleOwner(), settings); adapter = new AdapterAccount(this, settings);
rvAccount.setAdapter(adapter); rvAccount.setAdapter(adapter);
fab.setOnClickListener(new View.OnClickListener() { fab.setOnClickListener(new View.OnClickListener() {

@ -70,7 +70,7 @@ public class FragmentAnswers extends FragmentBase {
itemDecorator.setDrawable(getContext().getDrawable(R.drawable.divider)); itemDecorator.setDrawable(getContext().getDrawable(R.drawable.divider));
rvAnswer.addItemDecoration(itemDecorator); rvAnswer.addItemDecoration(itemDecorator);
adapter = new AdapterAnswer(getContext(), getViewLifecycleOwner()); adapter = new AdapterAnswer(this);
rvAnswer.setAdapter(adapter); rvAnswer.setAdapter(adapter);
fab.setOnClickListener(new View.OnClickListener() { fab.setOnClickListener(new View.OnClickListener() {

@ -529,7 +529,7 @@ public class FragmentCompose extends FragmentBase {
rvAttachment.setLayoutManager(llm); rvAttachment.setLayoutManager(llm);
rvAttachment.setItemAnimator(null); rvAttachment.setItemAnimator(null);
adapter = new AdapterAttachment(getContext(), getViewLifecycleOwner(), false); adapter = new AdapterAttachment(this, false);
rvAttachment.setAdapter(adapter); rvAttachment.setAdapter(adapter);
tvNoInternetAttachments.setVisibility(View.GONE); tvNoInternetAttachments.setVisibility(View.GONE);

@ -75,7 +75,7 @@ public class FragmentContacts extends FragmentBase {
LinearLayoutManager llm = new LinearLayoutManager(getContext()); LinearLayoutManager llm = new LinearLayoutManager(getContext());
rvContacts.setLayoutManager(llm); rvContacts.setLayoutManager(llm);
adapter = new AdapterContact(getContext(), getViewLifecycleOwner()); adapter = new AdapterContact(this);
rvContacts.setAdapter(adapter); rvContacts.setAdapter(adapter);
// Initialize // Initialize

@ -77,7 +77,7 @@ public class FragmentDialogFolder extends DialogFragment {
long account = args.getLong("account"); long account = args.getLong("account");
AdapterFolder adapter = new AdapterFolder( AdapterFolder adapter = new AdapterFolder(
getContext(), getActivity(), FragmentDialogFolder.this, FragmentDialogFolder.this,
account, false, new AdapterFolder.IFolderSelectedListener() { account, false, new AdapterFolder.IFolderSelectedListener() {
@Override @Override
public void onFolderSelected(TupleFolderEx folder) { public void onFolderSelected(TupleFolderEx folder) {

@ -150,9 +150,7 @@ public class FragmentFolders extends FragmentBase {
itemDecorator.setDrawable(getContext().getDrawable(R.drawable.divider)); itemDecorator.setDrawable(getContext().getDrawable(R.drawable.divider));
rvFolder.addItemDecoration(itemDecorator); rvFolder.addItemDecoration(itemDecorator);
adapter = new AdapterFolder( adapter = new AdapterFolder(this, account, show_hidden, null);
getContext(), getViewLifecycleOwner(), this,
account, show_hidden, null);
rvFolder.setAdapter(adapter); rvFolder.setAdapter(adapter);
fab.setOnClickListener(new View.OnClickListener() { fab.setOnClickListener(new View.OnClickListener() {

@ -72,7 +72,7 @@ public class FragmentIdentities extends FragmentBase {
itemDecorator.setDrawable(getContext().getDrawable(R.drawable.divider)); itemDecorator.setDrawable(getContext().getDrawable(R.drawable.divider));
rvIdentity.addItemDecoration(itemDecorator); rvIdentity.addItemDecoration(itemDecorator);
adapter = new AdapterIdentity(getContext(), getViewLifecycleOwner()); adapter = new AdapterIdentity(this);
rvIdentity.setAdapter(adapter); rvIdentity.setAdapter(adapter);
fab.setOnClickListener(new View.OnClickListener() { fab.setOnClickListener(new View.OnClickListener() {

@ -65,7 +65,7 @@ public class FragmentLogs extends FragmentBase {
LinearLayoutManager llm = new LinearLayoutManager(getContext()); LinearLayoutManager llm = new LinearLayoutManager(getContext());
rvLog.setLayoutManager(llm); rvLog.setLayoutManager(llm);
adapter = new AdapterLog(getContext()); adapter = new AdapterLog(this);
rvLog.setAdapter(adapter); rvLog.setAdapter(adapter);
// Initialize // Initialize

@ -529,9 +529,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
String sort = prefs.getString("sort", "time"); String sort = prefs.getString("sort", "time");
boolean filter_duplicates = prefs.getBoolean("filter_duplicates", false); boolean filter_duplicates = prefs.getBoolean("filter_duplicates", false);
adapter = new AdapterMessage( adapter = new AdapterMessage(this, viewType, compact, zoom, sort, filter_duplicates, iProperties);
getContext(), getViewLifecycleOwner(), this,
viewType, compact, zoom, sort, filter_duplicates, iProperties);
rvMessage.setAdapter(adapter); rvMessage.setAdapter(adapter);
seekBar.setOnTouchListener(new View.OnTouchListener() { seekBar.setOnTouchListener(new View.OnTouchListener() {

@ -74,7 +74,7 @@ public class FragmentOperations extends FragmentBase {
LinearLayoutManager llm = new LinearLayoutManager(getContext()); LinearLayoutManager llm = new LinearLayoutManager(getContext());
rvOperation.setLayoutManager(llm); rvOperation.setLayoutManager(llm);
adapter = new AdapterOperation(getContext(), getViewLifecycleOwner()); adapter = new AdapterOperation(this);
rvOperation.setAdapter(adapter); rvOperation.setAdapter(adapter);
// Initialize // Initialize

@ -78,7 +78,7 @@ public class FragmentOrder extends FragmentBase {
LinearLayoutManager llm = new LinearLayoutManager(getContext()); LinearLayoutManager llm = new LinearLayoutManager(getContext());
rvOrder.setLayoutManager(llm); rvOrder.setLayoutManager(llm);
adapter = new AdapterOrder(getContext(), getViewLifecycleOwner()); adapter = new AdapterOrder(this);
rvOrder.setAdapter(adapter); rvOrder.setAdapter(adapter);
new ItemTouchHelper(touchHelper).attachToRecyclerView(rvOrder); new ItemTouchHelper(touchHelper).attachToRecyclerView(rvOrder);

@ -638,7 +638,7 @@ public class FragmentRule extends FragmentBase {
LinearLayoutManager llm = new LinearLayoutManager(getContext()); LinearLayoutManager llm = new LinearLayoutManager(getContext());
rvMessage.setLayoutManager(llm); rvMessage.setLayoutManager(llm);
final AdapterRuleMatch adapter = new AdapterRuleMatch(getContext(), getViewLifecycleOwner()); final AdapterRuleMatch adapter = new AdapterRuleMatch(this);
rvMessage.setAdapter(adapter); rvMessage.setAdapter(adapter);
tvNoMessages.setVisibility(View.GONE); tvNoMessages.setVisibility(View.GONE);

@ -78,7 +78,7 @@ public class FragmentRules extends FragmentBase {
LinearLayoutManager llm = new LinearLayoutManager(getContext()); LinearLayoutManager llm = new LinearLayoutManager(getContext());
rvRule.setLayoutManager(llm); rvRule.setLayoutManager(llm);
adapter = new AdapterRule(getContext(), getViewLifecycleOwner(), view); adapter = new AdapterRule(this);
rvRule.setAdapter(adapter); rvRule.setAdapter(adapter);
DividerItemDecoration itemDecorator = new DividerItemDecoration(getContext(), llm.getOrientation()); DividerItemDecoration itemDecorator = new DividerItemDecoration(getContext(), llm.getOrientation());

Loading…
Cancel
Save