Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser.webapps; | 5 package org.chromium.chrome.browser.webapps; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 import android.content.SharedPreferences; | 8 import android.content.SharedPreferences; |
| 9 import android.graphics.Bitmap; | 9 import android.graphics.Bitmap; |
| 10 import android.os.AsyncTask; | 10 import android.os.AsyncTask; |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 24 * (1) UPDATING/RETRIEVING THE ICON (web app MUST have been registered in Webapp Registry) | 24 * (1) UPDATING/RETRIEVING THE ICON (web app MUST have been registered in Webapp Registry) |
| 25 * WebappDataStorage storage = WebappDataStorage.open(context, id); | 25 * WebappDataStorage storage = WebappDataStorage.open(context, id); |
| 26 * storage.updateSplashScreenImage(bitmap); | 26 * storage.updateSplashScreenImage(bitmap); |
| 27 * storage.getSplashScreenImage(callback); | 27 * storage.getSplashScreenImage(callback); |
| 28 */ | 28 */ |
| 29 public class WebappDataStorage { | 29 public class WebappDataStorage { |
| 30 | 30 |
| 31 static final String SHARED_PREFS_FILE_PREFIX = "webapp_"; | 31 static final String SHARED_PREFS_FILE_PREFIX = "webapp_"; |
| 32 static final String KEY_SPLASH_ICON = "splash_icon"; | 32 static final String KEY_SPLASH_ICON = "splash_icon"; |
| 33 static final String KEY_LAST_USED = "last_used"; | 33 static final String KEY_LAST_USED = "last_used"; |
| 34 static final String KEY_ORIGIN_URL = "origin_url"; | |
| 35 | |
| 36 // Null/invalid constants for last used times and origins. 0 is used as the null last used time | |
| 37 // as WebappRegistry assumes that this is always a valid timestamp. | |
| 38 static final long NULL_LAST_USED = 0; | |
| 34 static final long INVALID_LAST_USED = -1; | 39 static final long INVALID_LAST_USED = -1; |
| 40 static final String INVALID_ORIGIN_URL = ""; | |
| 35 | 41 |
| 36 private static Factory sFactory = new Factory(); | 42 private static Factory sFactory = new Factory(); |
| 37 | 43 |
| 38 private final SharedPreferences mPreferences; | 44 private final SharedPreferences mPreferences; |
| 39 | 45 |
| 40 /** | 46 /** |
| 41 * Opens an instance of WebappDataStorage for the web app specified. | 47 * Opens an instance of WebappDataStorage for the web app specified. |
| 42 * @param context The context to open the SharedPreferences. | 48 * @param context The context to open the SharedPreferences. |
| 43 * @param webappId The ID of the web app which is being opened. | 49 * @param webappId The ID of the web app which is being opened. |
| 44 */ | 50 */ |
| 45 public static WebappDataStorage open(final Context context, final String web appId) { | 51 public static WebappDataStorage open(final Context context, final String web appId) { |
| 46 final WebappDataStorage storage = sFactory.create(context, webappId); | 52 final WebappDataStorage storage = sFactory.create(context, webappId); |
| 47 new AsyncTask<Void, Void, Void>() { | 53 new AsyncTask<Void, Void, Void>() { |
| 48 @Override | 54 @Override |
| 49 protected final Void doInBackground(Void... nothing) { | 55 protected final Void doInBackground(Void... nothing) { |
| 50 if (storage.getLastUsedTime() == INVALID_LAST_USED) { | 56 // The last used time may be invalid if the user has cleared the ir history. |
|
gone
2016/03/08 22:40:39
Given that you're using two different values for I
| |
| 51 // If the last used time is invalid then assert that there i s no data | 57 // The next time the webapp is opened, set it to a valid value a gain. |
| 52 // in the WebappDataStorage which needs to be cleaned up. | 58 storage.updateLastUsedTime(System.currentTimeMillis()); |
| 53 assert storage.getAllData().isEmpty(); | |
| 54 } else { | |
| 55 storage.updateLastUsedTime(); | |
| 56 } | |
| 57 return null; | 59 return null; |
| 58 } | 60 } |
| 59 }.execute(); | 61 }.execute(); |
| 60 return storage; | 62 return storage; |
| 61 } | 63 } |
| 62 | 64 |
| 63 /** | 65 /** |
| 64 * Asynchronously retrieves the time which this WebappDataStorage was last | 66 * Asynchronously retrieves the time which this WebappDataStorage was last |
| 65 * opened using {@link WebappDataStorage#open(Context, String)}. | 67 * opened using {@link WebappDataStorage#open(Context, String)}. |
| 66 * @param context The context to read the SharedPreferences file. | 68 * @param context The context to read the SharedPreferences file. |
| 67 * @param webappId The ID of the web app the used time is being read for. | 69 * @param webappId The ID of the web app the used time is being read for. |
| 68 * @param callback Called when the last used time has been retrieved. | 70 * @param callback Called when the last used time has been retrieved. |
| 69 */ | 71 */ |
| 72 @VisibleForTesting | |
| 70 public static void getLastUsedTime(final Context context, final String webap pId, | 73 public static void getLastUsedTime(final Context context, final String webap pId, |
| 71 final FetchCallback<Long> callback) { | 74 final FetchCallback<Long> callback) { |
| 72 new AsyncTask<Void, Void, Long>() { | 75 new AsyncTask<Void, Void, Long>() { |
| 73 @Override | 76 @Override |
| 74 protected final Long doInBackground(Void... nothing) { | 77 protected final Long doInBackground(Void... nothing) { |
| 75 long lastUsed = new WebappDataStorage(context.getApplicationCont ext(), webappId) | 78 long lastUsed = new WebappDataStorage(context.getApplicationCont ext(), webappId) |
| 76 .getLastUsedTime(); | 79 .getLastUsedTime(); |
| 77 assert lastUsed != INVALID_LAST_USED; | 80 assert lastUsed != INVALID_LAST_USED; |
| 78 return lastUsed; | 81 return lastUsed; |
| 79 } | 82 } |
| 80 | 83 |
| 81 @Override | 84 @Override |
| 82 protected final void onPostExecute(Long lastUsed) { | 85 protected final void onPostExecute(Long lastUsed) { |
| 83 callback.onDataRetrieved(lastUsed); | 86 callback.onDataRetrieved(lastUsed); |
| 84 } | 87 } |
| 85 }.execute(); | 88 }.execute(); |
| 86 } | 89 } |
| 87 | 90 |
| 88 /** | 91 /** |
| 92 * Asynchronously retrieves the origin URL stored in this WebappDataStorage. | |
| 93 * @param context The context to read the SharedPreferences file. | |
| 94 * @param webappId The ID of the web app the used time is being read for. | |
| 95 * @param callback Called when the origin has been retrieved. | |
| 96 */ | |
| 97 @VisibleForTesting | |
|
gone
2016/03/08 22:40:39
Venting, no action items here:
For the record, thi
dominickn
2016/03/09 08:18:32
Definitely, definitely agreed.
| |
| 98 public static void getOriginUrl(final Context context, final String webappId , | |
| 99 final FetchCallback<String> callback) { | |
| 100 new AsyncTask<Void, Void, String>() { | |
| 101 @Override | |
| 102 protected final String doInBackground(Void... nothing) { | |
| 103 String originUrl = new WebappDataStorage(context.getApplicationC ontext(), webappId) | |
| 104 .getOriginUrl(); | |
| 105 return originUrl; | |
| 106 } | |
| 107 | |
| 108 @Override | |
| 109 protected final void onPostExecute(String originUrl) { | |
| 110 callback.onDataRetrieved(originUrl); | |
| 111 } | |
| 112 }.execute(); | |
| 113 } | |
| 114 | |
| 115 /** | |
| 116 * Asynchronously updates the origin URL stored in this WebappDataStorage. | |
| 117 * @param context The context to read the SharedPreferences file. | |
| 118 * @param webappId The ID of the web app the used time is being read for. | |
| 119 * @param origin The origin to set for the web app. | |
| 120 */ | |
| 121 public static void updateOriginUrl(final Context context, final String webap pId, | |
| 122 final String originUrl) { | |
| 123 new AsyncTask<Void, Void, Void>() { | |
| 124 @Override | |
| 125 protected final Void doInBackground(Void... nothing) { | |
| 126 new WebappDataStorage(context.getApplicationContext(), webappId) | |
| 127 .updateOriginUrl(originUrl); | |
| 128 return null; | |
| 129 } | |
| 130 }.execute(); | |
| 131 } | |
| 132 | |
| 133 /** | |
| 89 * Deletes the data for a web app by clearing all the information inside the SharedPreferences | 134 * Deletes the data for a web app by clearing all the information inside the SharedPreferences |
| 90 * file. This does NOT delete the file itself but the file is left empty. | 135 * file. This does NOT delete the file itself but the file is left empty. |
| 91 * @param context The context to read the SharedPreferences file. | 136 * @param context The context to read the SharedPreferences file. |
| 92 * @param webappId The ID of the web app being deleted. | 137 * @param webappId The ID of the web app being deleted. |
| 93 */ | 138 */ |
| 94 static void deleteDataForWebapp(final Context context, final String webappId ) { | 139 static void deleteDataForWebapp(final Context context, final String webappId ) { |
| 95 assert !ThreadUtils.runningOnUiThread(); | 140 assert !ThreadUtils.runningOnUiThread(); |
| 96 openSharedPreferences(context, webappId).edit().clear().apply(); | 141 openSharedPreferences(context, webappId).edit().clear().apply(); |
| 97 } | 142 } |
| 98 | 143 |
| 99 /** | 144 /** |
| 145 * Deletes the origin URL and sets last used time to 0 this web app in Share dPreferences. | |
| 146 * This does not remove the stored splash screen image (if any) for the app. | |
| 147 * @param context The context to read the SharedPreferences file. | |
| 148 * @param webappId The ID of the web app being deleted. | |
| 149 */ | |
| 150 static void clearHistory(final Context context, final String webappId) { | |
| 151 // The last used time is set to 0 to ensure that a valid value is always present. | |
| 152 // If the webapp is not launched prior to the next cleanup, then its rem aining data will be | |
| 153 // removed. Otherwise, the next launch will update the last used time. | |
| 154 assert !ThreadUtils.runningOnUiThread(); | |
| 155 openSharedPreferences(context, webappId) | |
| 156 .edit().putLong(KEY_LAST_USED, NULL_LAST_USED).remove(KEY_ORIGIN_URL ).apply(); | |
|
gone
2016/03/08 22:40:39
nit: indent by 8
dominickn
2016/03/09 08:18:32
Done.
| |
| 157 } | |
| 158 | |
| 159 /** | |
| 100 * Sets the factory used to generate WebappDataStorage objects. | 160 * Sets the factory used to generate WebappDataStorage objects. |
| 101 */ | 161 */ |
| 102 @VisibleForTesting | 162 @VisibleForTesting |
| 103 public static void setFactoryForTests(Factory factory) { | 163 public static void setFactoryForTests(Factory factory) { |
| 104 sFactory = factory; | 164 sFactory = factory; |
| 105 } | 165 } |
| 106 | 166 |
| 107 private static SharedPreferences openSharedPreferences(Context context, Stri ng webappId) { | 167 private static SharedPreferences openSharedPreferences(Context context, Stri ng webappId) { |
| 108 return context.getApplicationContext().getSharedPreferences( | 168 return context.getApplicationContext().getSharedPreferences( |
| 109 SHARED_PREFS_FILE_PREFIX + webappId, Context.MODE_PRIVATE); | 169 SHARED_PREFS_FILE_PREFIX + webappId, Context.MODE_PRIVATE); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 124 } | 184 } |
| 125 | 185 |
| 126 /* | 186 /* |
| 127 * Update the information associated with the web app with the specified dat a. | 187 * Update the information associated with the web app with the specified dat a. |
| 128 * @param splashScreenImage The image which should be shown on the splash sc reen of the web app. | 188 * @param splashScreenImage The image which should be shown on the splash sc reen of the web app. |
| 129 */ | 189 */ |
| 130 public void updateSplashScreenImage(Bitmap splashScreenImage) { | 190 public void updateSplashScreenImage(Bitmap splashScreenImage) { |
| 131 new UpdateTask(splashScreenImage).execute(); | 191 new UpdateTask(splashScreenImage).execute(); |
| 132 } | 192 } |
| 133 | 193 |
| 134 void updateLastUsedTime() { | 194 void updateOriginUrl(String originUrl) { |
|
gone
2016/03/08 22:40:39
Add javadocs to these
dominickn
2016/03/09 08:18:32
Done.
| |
| 135 assert !ThreadUtils.runningOnUiThread(); | 195 assert !ThreadUtils.runningOnUiThread(); |
| 136 mPreferences.edit().putLong(KEY_LAST_USED, System.currentTimeMillis()).a pply(); | 196 mPreferences.edit().putString(KEY_ORIGIN_URL, originUrl).apply(); |
| 197 } | |
| 198 | |
| 199 String getOriginUrl() { | |
| 200 assert !ThreadUtils.runningOnUiThread(); | |
| 201 return mPreferences.getString(KEY_ORIGIN_URL, INVALID_ORIGIN_URL); | |
| 202 } | |
| 203 | |
| 204 void updateLastUsedTime(long lastUsedTime) { | |
| 205 assert !ThreadUtils.runningOnUiThread(); | |
| 206 mPreferences.edit().putLong(KEY_LAST_USED, lastUsedTime).apply(); | |
| 137 } | 207 } |
| 138 | 208 |
| 139 long getLastUsedTime() { | 209 long getLastUsedTime() { |
| 140 assert !ThreadUtils.runningOnUiThread(); | 210 assert !ThreadUtils.runningOnUiThread(); |
| 141 return mPreferences.getLong(KEY_LAST_USED, INVALID_LAST_USED); | 211 return mPreferences.getLong(KEY_LAST_USED, INVALID_LAST_USED); |
| 142 } | 212 } |
| 143 | 213 |
| 144 private Map<String, ?> getAllData() { | 214 private Map<String, ?> getAllData() { |
| 145 return mPreferences.getAll(); | 215 return mPreferences.getAll(); |
| 146 } | 216 } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 160 public static class Factory { | 230 public static class Factory { |
| 161 | 231 |
| 162 /** | 232 /** |
| 163 * Generates a WebappDataStorage class for a specified web app. | 233 * Generates a WebappDataStorage class for a specified web app. |
| 164 */ | 234 */ |
| 165 public WebappDataStorage create(final Context context, final String weba ppId) { | 235 public WebappDataStorage create(final Context context, final String weba ppId) { |
| 166 return new WebappDataStorage(context, webappId); | 236 return new WebappDataStorage(context, webappId); |
| 167 } | 237 } |
| 168 } | 238 } |
| 169 | 239 |
| 170 private final class BitmapFetchTask extends AsyncTask<Void, Void, Bitmap> { | 240 private final class BitmapFetchTask extends AsyncTask<Void, Void, Bitmap> { |
|
gone
2016/03/10 23:27:21
So much \o/.
dominickn
2016/03/11 05:14:42
\o/ \o/
| |
| 171 | 241 |
| 172 private final String mKey; | 242 private final String mKey; |
| 173 private final FetchCallback<Bitmap> mCallback; | 243 private final FetchCallback<Bitmap> mCallback; |
| 174 | 244 |
| 175 public BitmapFetchTask(String key, FetchCallback<Bitmap> callback) { | 245 public BitmapFetchTask(String key, FetchCallback<Bitmap> callback) { |
| 176 mKey = key; | 246 mKey = key; |
| 177 mCallback = callback; | 247 mCallback = callback; |
| 178 } | 248 } |
| 179 | 249 |
| 180 @Override | 250 @Override |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 197 } | 267 } |
| 198 | 268 |
| 199 @Override | 269 @Override |
| 200 protected Void doInBackground(Void... nothing) { | 270 protected Void doInBackground(Void... nothing) { |
| 201 mPreferences.edit() | 271 mPreferences.edit() |
| 202 .putString(KEY_SPLASH_ICON, ShortcutHelper.encodeBitmapAsStr ing(mSplashImage)) | 272 .putString(KEY_SPLASH_ICON, ShortcutHelper.encodeBitmapAsStr ing(mSplashImage)) |
| 203 .apply(); | 273 .apply(); |
| 204 return null; | 274 return null; |
| 205 } | 275 } |
| 206 } | 276 } |
| 207 } | 277 } |
| OLD | NEW |