Dbrant has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/271554

Change subject: Fix memory leaks (for real!), part 1.
......................................................................

Fix memory leaks (for real!), part 1.

My ongoing search has finally yielded some tangible nuggets.
Exhibit A: Adding a TextWatcher to a TextView, but never removing it! (The
TextWatcher holds a reference to the fragment, thereby leaking it)

Change-Id: I497ebd37f3059b420622416a66ee5b87a15a2d0c
---
M app/src/main/java/org/wikipedia/history/HistoryFragment.java
M app/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
2 files changed, 78 insertions(+), 53 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/54/271554/1

diff --git a/app/src/main/java/org/wikipedia/history/HistoryFragment.java 
b/app/src/main/java/org/wikipedia/history/HistoryFragment.java
index d72c2d7..1d218f2 100644
--- a/app/src/main/java/org/wikipedia/history/HistoryFragment.java
+++ b/app/src/main/java/org/wikipedia/history/HistoryFragment.java
@@ -57,6 +57,7 @@
     private WikipediaApp app;
 
     private ActionMode actionMode;
+    private HistorySearchTextWatcher textWatcher = new 
HistorySearchTextWatcher();
 
     private boolean firstRun = true;
 
@@ -89,31 +90,6 @@
         adapter = new HistoryEntryAdapter(getActivity(), null, true);
         historyEntryList.setAdapter(adapter);
         historyEntryList.setEmptyView(historyEmptyContainer);
-
-        entryFilter.addTextChangedListener(
-                new TextWatcher() {
-                    @Override
-                    public void beforeTextChanged(CharSequence charSequence, 
int i, int i2, int i3) {
-                        // Do nothing
-                    }
-
-                    @Override
-                    public void onTextChanged(CharSequence charSequence, int 
i, int i2, int i3) {
-                        // Do nothing
-                    }
-
-                    @Override
-                    public void afterTextChanged(Editable editable) {
-                        
getActivity().getSupportLoaderManager().restartLoader(LOADER_ID, null, 
HistoryFragment.this);
-                        if (editable.length() == 0) {
-                            
historyEmptyTitle.setText(R.string.history_empty_title);
-                            historyEmptyMessage.setVisibility(View.VISIBLE);
-                        } else {
-                            
historyEmptyTitle.setText(getString(R.string.history_search_empty_message, 
editable.toString()));
-                            historyEmptyMessage.setVisibility(View.GONE);
-                        }
-                    }
-                });
 
         historyEntryList.setOnItemClickListener(new 
AdapterView.OnItemClickListener() {
             @Override
@@ -184,6 +160,18 @@
 
         getActivity().getSupportLoaderManager().initLoader(LOADER_ID, null, 
this);
         getActivity().getSupportLoaderManager().restartLoader(LOADER_ID, null, 
this);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        entryFilter.addTextChangedListener(textWatcher);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        entryFilter.removeTextChangedListener(textWatcher);
     }
 
     @Override
@@ -333,4 +321,28 @@
                 return super.onOptionsItemSelected(item);
         }
     }
+
+    private class HistorySearchTextWatcher implements TextWatcher {
+        @Override
+        public void beforeTextChanged(CharSequence charSequence, int i, int 
i2, int i3) {
+            // Do nothing
+        }
+
+        @Override
+        public void onTextChanged(CharSequence charSequence, int i, int i2, 
int i3) {
+            // Do nothing
+        }
+
+        @Override
+        public void afterTextChanged(Editable editable) {
+            getActivity().getSupportLoaderManager().restartLoader(LOADER_ID, 
null, HistoryFragment.this);
+            if (editable.length() == 0) {
+                historyEmptyTitle.setText(R.string.history_empty_title);
+                historyEmptyMessage.setVisibility(View.VISIBLE);
+            } else {
+                
historyEmptyTitle.setText(getString(R.string.history_search_empty_message, 
editable.toString()));
+                historyEmptyMessage.setVisibility(View.GONE);
+            }
+        }
+    }
 }
diff --git a/app/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java 
b/app/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
index 6dcab1b..95c05a1 100644
--- a/app/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
+++ b/app/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
@@ -62,6 +62,7 @@
     private WikipediaApp app;
 
     private ActionMode actionMode;
+    private SavedPageSearchTextWatcher textWatcher = new 
SavedPageSearchTextWatcher();
 
     private boolean firstRun = true;
 
@@ -101,8 +102,9 @@
                     return false;
                 }
                 savedPagesList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
-                actionMode = 
((AppCompatActivity)getActivity()).startSupportActionMode(new 
ActionMode.Callback() {
+                actionMode = ((AppCompatActivity) 
getActivity()).startSupportActionMode(new ActionMode.Callback() {
                     private final String actionModeTag = 
"actionModeSavedPages";
+
                     @Override
                     public boolean onCreateActionMode(ActionMode mode, Menu 
menu) {
                         
mode.getMenuInflater().inflate(R.menu.menu_saved_pages_context, menu);
@@ -168,33 +170,6 @@
             }
         });
 
-        entryFilter.addTextChangedListener(
-                new TextWatcher() {
-                    @Override
-                    public void beforeTextChanged(CharSequence charSequence, 
int i, int i2, int i3) {
-                        // Do nothing
-                    }
-
-                    @Override
-                    public void onTextChanged(CharSequence charSequence, int 
i, int i2, int i3) {
-                        // Do nothing
-                    }
-
-                    @Override
-                    public void afterTextChanged(Editable editable) {
-                        
getActivity().getSupportLoaderManager().restartLoader(LOADER_ID, null, 
SavedPagesFragment.this);
-                        if (editable.length() == 0) {
-                            
savedPagesEmptyTitle.setText(R.string.saved_pages_empty_title);
-                            savedPagesEmptyImage.setVisibility(View.VISIBLE);
-                            savedPagesEmptyMessage.setVisibility(View.VISIBLE);
-                        } else {
-                            
savedPagesEmptyTitle.setText(getString(R.string.saved_pages_search_empty_message,
 editable.toString()));
-                            savedPagesEmptyImage.setVisibility(View.GONE);
-                            savedPagesEmptyMessage.setVisibility(View.GONE);
-                        }
-                    }
-                });
-
         savedPagesList.setOnItemClickListener(new 
AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int 
position, long id) {
@@ -211,6 +186,18 @@
 
         getActivity().getSupportLoaderManager().initLoader(LOADER_ID, null, 
this);
         getActivity().getSupportLoaderManager().restartLoader(LOADER_ID, null, 
this);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        entryFilter.addTextChangedListener(textWatcher);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        entryFilter.removeTextChangedListener(textWatcher);
     }
 
     @Override
@@ -394,4 +381,30 @@
         }
         super.onStop();
     }
+
+    private class SavedPageSearchTextWatcher implements TextWatcher {
+        @Override
+        public void beforeTextChanged(CharSequence charSequence, int i, int 
i2, int i3) {
+            // Do nothing
+        }
+
+        @Override
+        public void onTextChanged(CharSequence charSequence, int i, int i2, 
int i3) {
+            // Do nothing
+        }
+
+        @Override
+        public void afterTextChanged(Editable editable) {
+            getActivity().getSupportLoaderManager().restartLoader(LOADER_ID, 
null, SavedPagesFragment.this);
+            if (editable.length() == 0) {
+                savedPagesEmptyTitle.setText(R.string.saved_pages_empty_title);
+                savedPagesEmptyImage.setVisibility(View.VISIBLE);
+                savedPagesEmptyMessage.setVisibility(View.VISIBLE);
+            } else {
+                
savedPagesEmptyTitle.setText(getString(R.string.saved_pages_search_empty_message,
 editable.toString()));
+                savedPagesEmptyImage.setVisibility(View.GONE);
+                savedPagesEmptyMessage.setVisibility(View.GONE);
+            }
+        }
+    }
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/271554
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I497ebd37f3059b420622416a66ee5b87a15a2d0c
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to