Dbrant has uploaded a new change for review.

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

Change subject: Fix possible memory leak(s) in feed.
......................................................................

Fix possible memory leak(s) in feed.

Observed in API 17, certain Clients that provide feed content seem
to retain a reference to a Context, which in this case is MainActivity.

This patch removes the necessity to pass a Context into feed clients.
Passing a Context was required for eventually accessing the database, so
this patch also removes the requirement to pass a Context to obtain a
database client (the Application context is used automatically).

Change-Id: Ia2603d0ccf57889d84a81d1b90f71cc88f78884d
---
M app/src/main/java/org/wikipedia/WikipediaApp.java
M app/src/main/java/org/wikipedia/database/DatabaseClient.java
M app/src/main/java/org/wikipedia/database/DatabaseTable.java
M app/src/main/java/org/wikipedia/editing/summaries/EditSummaryHandler.java
M app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
M app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
M app/src/main/java/org/wikipedia/feed/FeedFragment.java
M 
app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.java
M app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.java
M 
app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingClient.java
M app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
M app/src/main/java/org/wikipedia/feed/dataclient/DummyClient.java
M app/src/main/java/org/wikipedia/feed/dataclient/FeedClient.java
M app/src/main/java/org/wikipedia/feed/searchbar/SearchClient.java
M app/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
M 
app/src/main/java/org/wikipedia/page/bottomcontent/MainPageReadMoreTopicTask.java
16 files changed, 36 insertions(+), 63 deletions(-)


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

diff --git a/app/src/main/java/org/wikipedia/WikipediaApp.java 
b/app/src/main/java/org/wikipedia/WikipediaApp.java
index 3a19755..1378226 100644
--- a/app/src/main/java/org/wikipedia/WikipediaApp.java
+++ b/app/src/main/java/org/wikipedia/WikipediaApp.java
@@ -339,27 +339,27 @@
         if (!databaseClients.containsKey(cls)) {
             DatabaseClient<?> client;
             if (cls.equals(HistoryEntry.class)) {
-                client = new DatabaseClient<>(this, 
HistoryEntry.DATABASE_TABLE);
+                client = new DatabaseClient<>(HistoryEntry.DATABASE_TABLE);
             } else if (cls.equals(PageImage.class)) {
-                client = new DatabaseClient<>(this, PageImage.DATABASE_TABLE);
+                client = new DatabaseClient<>(PageImage.DATABASE_TABLE);
             } else if (cls.equals(RecentSearch.class)) {
-                client = new DatabaseClient<>(this, 
RecentSearch.DATABASE_TABLE);
+                client = new DatabaseClient<>(RecentSearch.DATABASE_TABLE);
             } else if (cls.equals(SavedPage.class)) {
-                client = new DatabaseClient<>(this, SavedPage.DATABASE_TABLE);
+                client = new DatabaseClient<>(SavedPage.DATABASE_TABLE);
             } else if (cls.equals(EditSummary.class)) {
-                client = new DatabaseClient<>(this, 
EditSummary.DATABASE_TABLE);
+                client = new DatabaseClient<>(EditSummary.DATABASE_TABLE);
             } else if (cls.equals(UserOption.class)) {
-                client = new DatabaseClient<>(this, 
UserOptionRow.DATABASE_TABLE);
+                client = new DatabaseClient<>(UserOptionRow.DATABASE_TABLE);
             } else if (cls.equals(UserOptionRow.class)) {
-                client = new DatabaseClient<>(this, 
UserOptionRow.HTTP_DATABASE_TABLE);
+                client = new 
DatabaseClient<>(UserOptionRow.HTTP_DATABASE_TABLE);
             } else if (cls.equals(ReadingListPageRow.class)) {
-                client = new DatabaseClient<>(this, 
ReadingListPageRow.DATABASE_TABLE);
+                client = new 
DatabaseClient<>(ReadingListPageRow.DATABASE_TABLE);
             } else if (cls.equals(ReadingListPageHttpRow.class)) {
-                client = new DatabaseClient<>(this, 
ReadingListPageRow.HTTP_DATABASE_TABLE);
+                client = new 
DatabaseClient<>(ReadingListPageRow.HTTP_DATABASE_TABLE);
             } else if (cls.equals(ReadingListPageDiskRow.class)) {
-                client = new DatabaseClient<>(this, 
ReadingListPageRow.DISK_DATABASE_TABLE);
+                client = new 
DatabaseClient<>(ReadingListPageRow.DISK_DATABASE_TABLE);
             } else if (cls.equals(ReadingListRow.class)) {
-                client = new DatabaseClient<>(this, 
ReadingListRow.DATABASE_TABLE);
+                client = new DatabaseClient<>(ReadingListRow.DATABASE_TABLE);
             } else {
                 throw new RuntimeException("No persister found for class " + 
cls.getCanonicalName());
             }
diff --git a/app/src/main/java/org/wikipedia/database/DatabaseClient.java 
b/app/src/main/java/org/wikipedia/database/DatabaseClient.java
index a4e7b2b..34628ec 100644
--- a/app/src/main/java/org/wikipedia/database/DatabaseClient.java
+++ b/app/src/main/java/org/wikipedia/database/DatabaseClient.java
@@ -2,7 +2,6 @@
 
 import android.content.ContentProviderClient;
 import android.content.ContentValues;
-import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.RemoteException;
@@ -13,9 +12,8 @@
     @NonNull private final ContentProviderClient client;
     @NonNull private final DatabaseTable<T> databaseTable;
 
-    public DatabaseClient(@NonNull Context context,
-                          @NonNull DatabaseTable<T> databaseTable) {
-        this(databaseTable.acquireClient(context), databaseTable);
+    public DatabaseClient(@NonNull DatabaseTable<T> databaseTable) {
+        this(databaseTable.acquireClient(), databaseTable);
     }
 
     public DatabaseClient(@NonNull ContentProviderClient client,
diff --git a/app/src/main/java/org/wikipedia/database/DatabaseTable.java 
b/app/src/main/java/org/wikipedia/database/DatabaseTable.java
index d65e395..83b71d0 100644
--- a/app/src/main/java/org/wikipedia/database/DatabaseTable.java
+++ b/app/src/main/java/org/wikipedia/database/DatabaseTable.java
@@ -2,13 +2,13 @@
 
 import android.content.ContentProviderClient;
 import android.content.ContentValues;
-import android.content.Context;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.net.Uri;
 import android.support.annotation.NonNull;
 import android.text.TextUtils;
 
+import org.wikipedia.WikipediaApp;
 import org.wikipedia.database.column.Column;
 import org.wikipedia.util.log.L;
 
@@ -39,8 +39,9 @@
         return new Column<?>[0];
     }
 
-    public ContentProviderClient acquireClient(@NonNull Context context) {
-        return 
context.getContentResolver().acquireContentProviderClient(getBaseContentURI());
+    public ContentProviderClient acquireClient() {
+        return WikipediaApp.getInstance().getContentResolver()
+                .acquireContentProviderClient(getBaseContentURI());
     }
 
     /**
diff --git 
a/app/src/main/java/org/wikipedia/editing/summaries/EditSummaryHandler.java 
b/app/src/main/java/org/wikipedia/editing/summaries/EditSummaryHandler.java
index 446c560..869bda8 100644
--- a/app/src/main/java/org/wikipedia/editing/summaries/EditSummaryHandler.java
+++ b/app/src/main/java/org/wikipedia/editing/summaries/EditSummaryHandler.java
@@ -43,7 +43,7 @@
         adapter.setFilterQueryProvider(new FilterQueryProvider() {
             @Override
             public Cursor runQuery(CharSequence charSequence) {
-                ContentProviderClient client = 
EditSummary.DATABASE_TABLE.acquireClient(activity);
+                ContentProviderClient client = 
EditSummary.DATABASE_TABLE.acquireClient();
                 Uri uri = EditHistoryContract.Summary.URI;
                 final String[] projection = null;
                 String selection = 
EditHistoryContract.Summary.SUMMARY.qualifiedName() + " like ?";
diff --git a/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java 
b/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
index 01f34b2..3d561cc 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
@@ -1,8 +1,5 @@
 package org.wikipedia.feed;
 
-import android.content.Context;
-import android.support.annotation.NonNull;
-
 import org.wikipedia.feed.aggregated.AggregatedFeedContentClient;
 import org.wikipedia.feed.becauseyouread.BecauseYouReadClient;
 import org.wikipedia.feed.continuereading.ContinueReadingClient;
@@ -11,10 +8,6 @@
 import org.wikipedia.feed.searchbar.SearchClient;
 
 public class FeedCoordinator extends FeedCoordinatorBase {
-
-    public FeedCoordinator(@NonNull Context context) {
-        super(context);
-    }
 
     @Override
     protected void buildScript(int age) {
diff --git a/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java 
b/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
index 417711e..3d4b63c 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
@@ -1,6 +1,5 @@
 package org.wikipedia.feed;
 
-import android.content.Context;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
@@ -24,7 +23,6 @@
         void update(List<Card> cards);
     }
 
-    @NonNull private Context context;
     @Nullable private WikiSite wiki;
     @Nullable private FeedUpdateListener updateListener;
     @NonNull private final List<Card> cards = new ArrayList<>();
@@ -40,8 +38,7 @@
         }
     });
 
-    public FeedCoordinatorBase(@NonNull Context context) {
-        this.context = context;
+    public FeedCoordinatorBase() {
         hiddenCards.addAll(Prefs.getHiddenCards());
     }
 
@@ -111,7 +108,7 @@
         if (pendingClients.isEmpty()) {
             return;
         }
-        pendingClients.remove(0).request(context, wiki, currentAge, 
exhaustionClientCallback);
+        pendingClients.remove(0).request(wiki, currentAge, 
exhaustionClientCallback);
     }
 
     private class ExhaustionClientCallback implements FeedClient.Callback {
diff --git a/app/src/main/java/org/wikipedia/feed/FeedFragment.java 
b/app/src/main/java/org/wikipedia/feed/FeedFragment.java
index 33ce927..6c0b3c3 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedFragment.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedFragment.java
@@ -83,7 +83,7 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         app = WikipediaApp.getInstance();
-        coordinator = new FeedCoordinator(getContext());
+        coordinator = new FeedCoordinator();
         coordinator.more(app.getWikiSite());
         funnel = new FeedFunnel(app);
     }
diff --git 
a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.java
 
b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.java
index db561fa..339feec 100644
--- 
a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.java
+++ 
b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.java
@@ -1,6 +1,5 @@
 package org.wikipedia.feed.aggregated;
 
-import android.content.Context;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
@@ -34,7 +33,7 @@
     @Nullable private Call<AggregatedFeedContent> call;
 
     @Override
-    public void request(@NonNull Context context, @NonNull WikiSite wiki, int 
age, @NonNull Callback cb) {
+    public void request(@NonNull WikiSite wiki, int age, @NonNull Callback cb) 
{
         cancel();
         UtcDate date = DateUtil.getUtcRequestDateFor(age);
         String endpoint = String.format(Locale.ROOT, 
Prefs.getRestbaseUriFormat(), wiki.scheme(),
diff --git 
a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.java 
b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.java
index f839e3f..daabd2b 100644
--- 
a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.java
+++ 
b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadClient.java
@@ -1,6 +1,5 @@
 package org.wikipedia.feed.becauseyouread;
 
-import android.content.Context;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
@@ -46,10 +45,10 @@
     }
 
     @Override
-    public void request(@NonNull Context context, @NonNull final WikiSite 
wiki, int age,
+    public void request(@NonNull final WikiSite wiki, int age,
                         @NonNull final FeedClient.Callback cb) {
         cancel();
-        readMoreTopicTask = new MainPageReadMoreTopicTask(context, age) {
+        readMoreTopicTask = new MainPageReadMoreTopicTask(age) {
             @Override
             public void onFinish(@Nullable HistoryEntry entry) {
                 if (entry == null) {
diff --git 
a/app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingClient.java
 
b/app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingClient.java
index 245152b..a55a121 100644
--- 
a/app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingClient.java
+++ 
b/app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingClient.java
@@ -1,6 +1,5 @@
 package org.wikipedia.feed.continuereading;
 
-import android.content.Context;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
@@ -19,10 +18,9 @@
     @Nullable private LastPageReadTask lastPageReadTask;
 
     @Override
-    public void request(@NonNull Context context, @NonNull WikiSite wiki, int 
age,
-                        @NonNull final FeedClient.Callback cb) {
+    public void request(@NonNull WikiSite wiki, int age, @NonNull final 
FeedClient.Callback cb) {
         cancel();
-        lastPageReadTask = new LastPageReadTask(context, age, MIN_DAYS_OLD) {
+        lastPageReadTask = new LastPageReadTask(age, MIN_DAYS_OLD) {
             @Override
             public void onFinish(@Nullable HistoryEntry entry) {
                 if (entry == null) {
diff --git 
a/app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java 
b/app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
index 7e5c5bb..d9afdfe 100644
--- a/app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
+++ b/app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
@@ -1,11 +1,9 @@
 package org.wikipedia.feed.continuereading;
 
 import android.content.ContentProviderClient;
-import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.RemoteException;
-import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.text.format.DateUtils;
 
@@ -17,12 +15,10 @@
 import java.util.Date;
 
 public class LastPageReadTask extends SaneAsyncTask<HistoryEntry> {
-    @NonNull private final Context context;
     private final int age;
     private final long earlierThanTime;
 
-    public LastPageReadTask(@NonNull Context context, int age, int minDaysOld) 
{
-        this.context = context;
+    public LastPageReadTask(int age, int minDaysOld) {
         this.age = age;
         earlierThanTime = new Date().getTime() - (minDaysOld * 
DateUtils.DAY_IN_MILLIS);
     }
@@ -46,7 +42,7 @@
     }
 
     @Nullable private Cursor queryLastPage(long earlierThanTime) {
-        ContentProviderClient client = 
HistoryEntry.DATABASE_TABLE.acquireClient(context);
+        ContentProviderClient client = 
HistoryEntry.DATABASE_TABLE.acquireClient();
         try {
             Uri uri = PageHistoryContract.PageWithImage.URI;
             final String[] projection = null;
diff --git a/app/src/main/java/org/wikipedia/feed/dataclient/DummyClient.java 
b/app/src/main/java/org/wikipedia/feed/dataclient/DummyClient.java
index 7806e93..8682674 100644
--- a/app/src/main/java/org/wikipedia/feed/dataclient/DummyClient.java
+++ b/app/src/main/java/org/wikipedia/feed/dataclient/DummyClient.java
@@ -1,6 +1,5 @@
 package org.wikipedia.feed.dataclient;
 
-import android.content.Context;
 import android.support.annotation.NonNull;
 
 import org.wikipedia.dataclient.WikiSite;
@@ -11,8 +10,7 @@
 /** A dummy client for providing static cards (main page, random) on tap to 
the FeedCoordinator. */
 public abstract class DummyClient<T extends Card> implements FeedClient {
     @Override
-    public void request(@NonNull Context context, @NonNull WikiSite wiki, int 
age,
-                        @NonNull final FeedClient.Callback cb) {
+    public void request(@NonNull WikiSite wiki, int age, @NonNull final 
FeedClient.Callback cb) {
         try {
             cb.success(Collections.singletonList(getNewCard(wiki)));
         } catch (Throwable t) {
diff --git a/app/src/main/java/org/wikipedia/feed/dataclient/FeedClient.java 
b/app/src/main/java/org/wikipedia/feed/dataclient/FeedClient.java
index d124fea..1d772bc 100644
--- a/app/src/main/java/org/wikipedia/feed/dataclient/FeedClient.java
+++ b/app/src/main/java/org/wikipedia/feed/dataclient/FeedClient.java
@@ -1,6 +1,5 @@
 package org.wikipedia.feed.dataclient;
 
-import android.content.Context;
 import android.support.annotation.NonNull;
 
 import org.wikipedia.dataclient.WikiSite;
@@ -9,7 +8,7 @@
 import java.util.List;
 
 public interface FeedClient {
-    void request(@NonNull Context context, @NonNull WikiSite wiki, int age, 
@NonNull final Callback cb);
+    void request(@NonNull WikiSite wiki, int age, @NonNull final Callback cb);
     void cancel();
 
     interface Callback {
diff --git a/app/src/main/java/org/wikipedia/feed/searchbar/SearchClient.java 
b/app/src/main/java/org/wikipedia/feed/searchbar/SearchClient.java
index 95a8854..4dcccf0 100644
--- a/app/src/main/java/org/wikipedia/feed/searchbar/SearchClient.java
+++ b/app/src/main/java/org/wikipedia/feed/searchbar/SearchClient.java
@@ -1,6 +1,5 @@
 package org.wikipedia.feed.searchbar;
 
-import android.content.Context;
 import android.support.annotation.NonNull;
 
 import org.wikipedia.dataclient.WikiSite;
@@ -11,8 +10,7 @@
 
 public class SearchClient implements FeedClient {
     @Override
-    public void request(@NonNull Context context, @NonNull WikiSite wiki, int 
age,
-                        @NonNull final FeedClient.Callback cb) {
+    public void request(@NonNull WikiSite wiki, int age, @NonNull final 
FeedClient.Callback cb) {
         cb.success(Collections.singletonList((Card) new SearchCard()));
     }
 
diff --git 
a/app/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java 
b/app/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
index 9bd501e..6e1e42e 100644
--- 
a/app/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
+++ 
b/app/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
@@ -292,7 +292,7 @@
 
     private void preRequestReadMoreItems(final LayoutInflater layoutInflater) {
         if (parentFragment.getPage().isMainPage()) {
-            new MainPageReadMoreTopicTask(parentFragment.getContext()) {
+            new MainPageReadMoreTopicTask() {
                 @Override
                 public void onFinish(HistoryEntry entry) {
                     requestReadMoreItems(layoutInflater, entry);
diff --git 
a/app/src/main/java/org/wikipedia/page/bottomcontent/MainPageReadMoreTopicTask.java
 
b/app/src/main/java/org/wikipedia/page/bottomcontent/MainPageReadMoreTopicTask.java
index eb5217a..598d563 100644
--- 
a/app/src/main/java/org/wikipedia/page/bottomcontent/MainPageReadMoreTopicTask.java
+++ 
b/app/src/main/java/org/wikipedia/page/bottomcontent/MainPageReadMoreTopicTask.java
@@ -1,7 +1,6 @@
 package org.wikipedia.page.bottomcontent;
 
 import android.content.ContentProviderClient;
-import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.RemoteException;
@@ -16,15 +15,13 @@
  * We're looking at the last history entry that is not of source main page or 
random.
  */
 public class MainPageReadMoreTopicTask extends SaneAsyncTask<HistoryEntry> {
-    private final Context context;
     private int age;
 
-    public MainPageReadMoreTopicTask(Context context) {
-        this(context, 0);
+    public MainPageReadMoreTopicTask() {
+        this(0);
     }
 
-    public MainPageReadMoreTopicTask(Context context, int age) {
-        this.context = context;
+    public MainPageReadMoreTopicTask(int age) {
         this.age = age;
     }
 
@@ -44,7 +41,7 @@
     }
 
     private Cursor getInterestedHistoryEntry() {
-        ContentProviderClient client = 
HistoryEntry.DATABASE_TABLE.acquireClient(context);
+        ContentProviderClient client = 
HistoryEntry.DATABASE_TABLE.acquireClient();
         try {
             Uri uri = PageHistoryContract.PageWithImage.URI;
             final String[] projection = null;

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia2603d0ccf57889d84a81d1b90f71cc88f78884d
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