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