Bug 1241810 - Add EnrollAction for finding bookmarks of known sites to subscribe to. r=mcomella draft
authorSebastian Kaspari <s.kaspari@gmail.com>
Wed, 24 Feb 2016 15:12:58 -0800
changeset 343929 635a7f01362259068364c557a5d28c0458fd3979
parent 343928 37323b32c2a148c2ed82a52685f2c1cec754e077
child 343930 eb197ba31b16ad1a1319d3a6978176bd6326c35a
push id13713
push users.kaspari@gmail.com
push dateWed, 23 Mar 2016 15:10:41 +0000
reviewersmcomella
bugs1241810
milestone48.0a1
Bug 1241810 - Add EnrollAction for finding bookmarks of known sites to subscribe to. r=mcomella MozReview-Commit-ID: LS59SRlAjH0
mobile/android/base/java/org/mozilla/gecko/db/BrowserDB.java
mobile/android/base/java/org/mozilla/gecko/db/LocalBrowserDB.java
mobile/android/base/java/org/mozilla/gecko/db/StubBrowserDB.java
mobile/android/base/java/org/mozilla/gecko/feeds/FeedService.java
mobile/android/base/java/org/mozilla/gecko/feeds/action/EnrollAction.java
mobile/android/base/moz.build
--- a/mobile/android/base/java/org/mozilla/gecko/db/BrowserDB.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/BrowserDB.java
@@ -105,16 +105,17 @@ public interface BrowserDB {
     public abstract void clearHistory(ContentResolver cr, boolean clearSearchHistory);
 
 
     public abstract String getUrlForKeyword(ContentResolver cr, String keyword);
 
     public abstract boolean isBookmark(ContentResolver cr, String uri);
     public abstract boolean addBookmark(ContentResolver cr, String title, String uri);
     public abstract Cursor getBookmarkForUrl(ContentResolver cr, String url);
+    public abstract Cursor getBookmarksForPartialUrl(ContentResolver cr, String partialUrl);
     public abstract void removeBookmarksWithURL(ContentResolver cr, String uri);
     public abstract void registerBookmarkObserver(ContentResolver cr, ContentObserver observer);
     public abstract void updateBookmark(ContentResolver cr, int id, String uri, String title, String keyword);
 
     /**
      * Can return <code>null</code>.
      */
     public abstract Cursor getBookmarksInFolder(ContentResolver cr, long folderId);
--- a/mobile/android/base/java/org/mozilla/gecko/db/LocalBrowserDB.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/LocalBrowserDB.java
@@ -1577,16 +1577,32 @@ public class LocalBrowserDB implements B
             c.close();
             c = null;
         }
 
         return c;
     }
 
     @Override
+    public Cursor getBookmarksForPartialUrl(ContentResolver cr, String partialUrl) {
+        Cursor c = cr.query(mBookmarksUriWithProfile,
+                new String[] { Bookmarks.GUID, Bookmarks._ID, Bookmarks.URL },
+                Bookmarks.URL + " LIKE '%" + partialUrl + "%'", // TODO: Escaping!
+                null,
+                null);
+
+        if (c != null && c.getCount() == 0) {
+            c.close();
+            c = null;
+        }
+
+        return c;
+    }
+
+    @Override
     public void setSuggestedSites(SuggestedSites suggestedSites) {
         mSuggestedSites = suggestedSites;
     }
 
     @Override
     public SuggestedSites getSuggestedSites() {
         return mSuggestedSites;
     }
--- a/mobile/android/base/java/org/mozilla/gecko/db/StubBrowserDB.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/StubBrowserDB.java
@@ -369,16 +369,21 @@ public class StubBrowserDB implements Br
     public void unpinSite(ContentResolver cr, int position) {
     }
 
     @RobocopTarget
     public Cursor getBookmarkForUrl(ContentResolver cr, String url) {
         return null;
     }
 
+    @Override
+    public Cursor getBookmarksForPartialUrl(ContentResolver cr, String partialUrl) {
+        return null;
+    }
+
     public void setSuggestedSites(SuggestedSites suggestedSites) {
         this.suggestedSites = suggestedSites;
     }
 
     public SuggestedSites getSuggestedSites() {
         return suggestedSites;
     }
 
--- a/mobile/android/base/java/org/mozilla/gecko/feeds/FeedService.java
+++ b/mobile/android/base/java/org/mozilla/gecko/feeds/FeedService.java
@@ -1,35 +1,46 @@
 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.feeds;
 
 import android.app.IntentService;
+import android.content.Context;
 import android.content.Intent;
 import android.util.Log;
 
 import com.keepsafe.switchboard.SwitchBoard;
 
 import org.mozilla.gecko.AppConstants;
 import org.mozilla.gecko.feeds.action.CheckAction;
+import org.mozilla.gecko.feeds.action.EnrollAction;
 import org.mozilla.gecko.feeds.action.SubscribeAction;
 import org.mozilla.gecko.feeds.subscriptions.SubscriptionStorage;
 import org.mozilla.gecko.util.Experiments;
 
 /**
  * Background service for subscribing to and checking website feeds to notify the user about updates.
  */
 public class FeedService extends IntentService {
     private static final String LOGTAG = "GeckoFeedService";
 
     public static final String ACTION_SUBSCRIBE = AppConstants.ANDROID_PACKAGE_NAME + ".FEEDS.SUBSCRIBE";
     public static final String ACTION_CHECK = AppConstants.ANDROID_PACKAGE_NAME + ".FEEDS.CHECK";
+    public static final String ACTION_ENROLL = AppConstants.ANDROID_PACKAGE_NAME + ".FEEDS.ENROLL";
+
+    public static void subscribe(Context context, String guid, String feedUrl) {
+        Intent intent = new Intent(context, FeedService.class);
+        intent.setAction(ACTION_SUBSCRIBE);
+        intent.putExtra(SubscribeAction.EXTRA_GUID, guid);
+        intent.putExtra(SubscribeAction.EXTRA_FEED_URL, feedUrl);
+        context.startService(intent);
+    }
 
     private SubscriptionStorage storage;
 
     public FeedService() {
         super(LOGTAG);
     }
 
     @Override
@@ -54,15 +65,19 @@ public class FeedService extends IntentS
             case ACTION_SUBSCRIBE:
                 new SubscribeAction(storage).perform(intent);
                 break;
 
             case ACTION_CHECK:
                 new CheckAction(this, storage).perform();
                 break;
 
+            case ACTION_ENROLL:
+                new EnrollAction(this).perform();
+                break;
+
             default:
                 Log.e(LOGTAG, "Unknown action: " + intent.getAction());
         }
 
         storage.persistChanges();
     }
 }
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/feeds/action/EnrollAction.java
@@ -0,0 +1,73 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.feeds.action;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.text.TextUtils;
+import android.util.Log;
+
+import org.mozilla.gecko.GeckoProfile;
+import org.mozilla.gecko.db.BrowserContract;
+import org.mozilla.gecko.db.BrowserDB;
+import org.mozilla.gecko.feeds.FeedService;
+import org.mozilla.gecko.feeds.knownsites.KnownSiteBlogger;
+import org.mozilla.gecko.feeds.knownsites.KnownSite;
+import org.mozilla.gecko.feeds.knownsites.KnownSiteMedium;
+
+/**
+ * EnrollAction: Search for bookmarks of known sites we can subscribe to.
+ */
+public class EnrollAction {
+    private static final String LOGTAG = "FeedEnrollAction";
+
+    private static final KnownSite[] knownSites = {
+        new KnownSiteMedium(),
+        new KnownSiteBlogger(),
+    };
+
+    private Context context;
+
+    public EnrollAction(Context context) {
+        this.context = context;
+    }
+
+    public void perform() {
+        Log.i(LOGTAG, "Searching for bookmarks to enroll in updates");
+
+        BrowserDB db = GeckoProfile.get(context).getDB();
+
+        for (KnownSite knownSite : knownSites) {
+            searchFor(db, knownSite);
+        }
+    }
+
+    private void searchFor(BrowserDB db, KnownSite knownSite) {
+        Cursor cursor = db.getBookmarksForPartialUrl(context.getContentResolver(), "://" + knownSite.getURLSearchString() + "/");
+        if (cursor == null) {
+            Log.d(LOGTAG, "Nothing found");
+            return;
+        }
+
+        try {
+            Log.d(LOGTAG, "Found " + cursor.getCount() + " websites");
+
+            while (cursor.moveToNext()) {
+                final String guid = cursor.getString(cursor.getColumnIndex(BrowserContract.Bookmarks.GUID));
+                final String url = cursor.getString(cursor.getColumnIndex(BrowserContract.Bookmarks.URL));
+
+                Log.d(LOGTAG, " (" + guid + ") " + url);
+
+                String feedUrl = knownSite.getFeedFromURL(url);
+                if (!TextUtils.isEmpty(feedUrl)) {
+                    FeedService.subscribe(context, guid, feedUrl);
+                }
+            }
+        } finally {
+            cursor.close();
+        }
+    }
+}
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -269,16 +269,17 @@ gbjar.sources += ['java/org/mozilla/geck
     'favicons/decoders/ICODecoder.java',
     'favicons/decoders/IconDirectoryEntry.java',
     'favicons/decoders/LoadFaviconResult.java',
     'favicons/Favicons.java',
     'favicons/LoadFaviconTask.java',
     'favicons/OnFaviconLoadedListener.java',
     'favicons/RemoteFavicon.java',
     'feeds/action/CheckAction.java',
+    'feeds/action/EnrollAction.java',
     'feeds/action/SubscribeAction.java',
     'feeds/FeedFetcher.java',
     'feeds/FeedService.java',
     'feeds/knownsites/KnownSite.java',
     'feeds/knownsites/KnownSiteBlogger.java',
     'feeds/knownsites/KnownSiteMedium.java',
     'feeds/parser/Feed.java',
     'feeds/parser/Item.java',