Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/physicalweb/UrlManager.java | 
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/UrlManager.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/UrlManager.java | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..2f8cbfead6e55b0f0e87c45be7712d1a42bf96c8 | 
| --- /dev/null | 
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/UrlManager.java | 
| @@ -0,0 +1,125 @@ | 
| +// Copyright 2015 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +package org.chromium.chrome.browser.physicalweb; | 
| + | 
| +import android.app.Notification; | 
| +import android.content.Context; | 
| +import android.content.SharedPreferences; | 
| +import android.content.res.Resources; | 
| +import android.support.v4.app.NotificationCompat; | 
| +import android.support.v4.app.NotificationManagerCompat; | 
| + | 
| +import org.chromium.chrome.R; | 
| +import org.chromium.chrome.browser.notifications.NotificationConstants; | 
| + | 
| +import java.util.HashSet; | 
| +import java.util.Set; | 
| +import java.util.concurrent.atomic.AtomicReference; | 
| + | 
| +/** | 
| + * This class stores URLs and surfaces notifications to the user. | 
| + */ | 
| +public class UrlManager { | 
| + private static final AtomicReference<UrlManager> sInstance = new AtomicReference<UrlManager>(); | 
| + private static final String TAG = "PhysicalWeb"; | 
| + private static final String PREFS_NAME = "org.chromium.chrome.browser.physicalweb.URL_CACHE"; | 
| + private static final String PREFS_VERSION_KEY = "version"; | 
| + private static final String PREFS_URLS_KEY = "urls"; | 
| + private static final int PREFS_VERSION = 1; | 
| + private final Context mContext; | 
| + private final NotificationManagerCompat mNotificationManager; | 
| + | 
| + /** | 
| + * Construct the UrlManager. | 
| + * @param context An instance of android.content.Context | 
| + */ | 
| + public UrlManager(Context context) { | 
| + mContext = context; | 
| + mNotificationManager = NotificationManagerCompat.from(context); | 
| + } | 
| + | 
| + /** | 
| + * Get a singleton instance of this class. | 
| + * @param context An instance of android.content.Context. | 
| + * @return a singleton instance of this class. | 
| + */ | 
| + public static UrlManager getInstance(Context context) { | 
| + if (sInstance.get() == null) { | 
| + sInstance.compareAndSet(null, new UrlManager(context)); | 
| + } | 
| + return sInstance.get(); | 
| + } | 
| + | 
| + /** | 
| + * Add a URL to the store of URLs. | 
| + * This method additionally updates the Physical Web notification. | 
| + * @param url The URL to add. | 
| + */ | 
| + public void addUrl(String url) { | 
| + Set<String> urls = getCachedUrls(); | 
| + urls.add(url); | 
| + putCachedUrls(urls); | 
| + updateNotification(urls); | 
| + } | 
| + | 
| + /** | 
| + * Remove a URL to the store of URLs. | 
| + * This method additionally updates the Physical Web notification. | 
| + * @param url The URL to remove. | 
| + */ | 
| + public void removeUrl(String url) { | 
| + Set<String> urls = getCachedUrls(); | 
| + urls.remove(url); | 
| + putCachedUrls(urls); | 
| + updateNotification(urls); | 
| + } | 
| + | 
| + private Set<String> getCachedUrls() { | 
| + // Check the version | 
| + SharedPreferences prefs = mContext.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); | 
| + int prefsVersion = prefs.getInt(PREFS_VERSION_KEY, 0); | 
| + if (prefsVersion != PREFS_VERSION) { | 
| + return new HashSet<String>(); | 
| + } | 
| + | 
| + // Restore the cached urls | 
| 
 
jdduke (slow)
2015/09/28 22:38:34
Nit: add periods to comment sentences (a few place
 
cco3
2015/09/28 23:20:24
Done.
 
 | 
| + return prefs.getStringSet(PREFS_URLS_KEY, new HashSet<String>()); | 
| + } | 
| + | 
| + private void putCachedUrls(Set<String> urls) { | 
| + // Write the version | 
| + SharedPreferences prefs = mContext.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); | 
| + SharedPreferences.Editor editor = prefs.edit(); | 
| + editor.putInt(PREFS_VERSION_KEY, PREFS_VERSION); | 
| + | 
| + // Write the urls | 
| + editor.putStringSet(PREFS_URLS_KEY, urls); | 
| + editor.apply(); | 
| + } | 
| + | 
| + private void updateNotification(Set<String> urls) { | 
| + if (urls.isEmpty()) { | 
| + mNotificationManager.cancel(NotificationConstants.NOTIFICATION_ID_PHYSICAL_WEB); | 
| + return; | 
| + } | 
| + | 
| + // Get values to display | 
| + String displayUrl = urls.iterator().next(); | 
| + Resources resources = mContext.getResources(); | 
| + String title = resources.getQuantityString(R.plurals.physical_web_notification_title, | 
| + urls.size(), urls.size()); | 
| + | 
| + // Create the notification | 
| + Notification notification = new NotificationCompat.Builder(mContext) | 
| + .setSmallIcon(R.drawable.ic_physical_web_notification) | 
| + .setContentTitle(title) | 
| + .setContentText(displayUrl) | 
| + .setPriority(NotificationCompat.PRIORITY_MIN) | 
| + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) | 
| + .build(); | 
| + mNotificationManager.notify(NotificationConstants.NOTIFICATION_ID_PHYSICAL_WEB, | 
| + notification); | 
| + } | 
| +} |