Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: libadblockplus-android/src/org/adblockplus/libadblockplus/android/AndroidWebRequestResourceWrapper.java

Issue 29389555: Issue 5010 - Allow to preload subscription files (Closed)
Patch Set: force downloading actually Created March 30, 2017, 10:12 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2016 Eyeo GmbH
4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation.
8 *
9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
16 */
17 package org.adblockplus.libadblockplus.android;
18
19 import android.content.Context;
20 import android.content.SharedPreferences;
21 import android.util.Log;
22
23 import org.adblockplus.libadblockplus.HeaderEntry;
24 import org.adblockplus.libadblockplus.ServerResponse;
25 import org.adblockplus.libadblockplus.WebRequest;
26
27 import java.io.BufferedReader;
28 import java.io.IOException;
29 import java.io.InputStream;
30 import java.io.InputStreamReader;
31 import java.util.Collections;
32 import java.util.HashSet;
33 import java.util.List;
34 import java.util.Map;
35 import java.util.Set;
36
37 /**
38 * WebRequest wrapper to return request response from android resources for sele cted URLs
39 */
40 public class AndroidWebRequestResourceWrapper extends WebRequest
41 {
42 private static final String TAG = Utils.getTag(AndroidWebRequestResourceWrappe r.class);
43
44 public static final String EASYLIST =
45 "https://easylist-downloads.adblockplus.org/easylist.txt";
46 public static final String EASYLIST_INDONESIAN =
47 "https://easylist-downloads.adblockplus.org/abpindo+easylist.txt";
48 public static final String EASYLIST_BULGARIAN =
49 "https://easylist-downloads.adblockplus.org/bulgarian_list+easylist.txt";
50 public static final String EASYLIST_CHINESE =
51 "https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt";
52 public static final String EASYLIST_CZECH_SLOVAK =
53 "https://easylist-downloads.adblockplus.org/easylistczechslovak+easylist.txt ";
54 public static final String EASYLIST_DUTCH =
55 "https://easylist-downloads.adblockplus.org/easylistdutch+easylist.txt";
56 public static final String EASYLIST_GERMAN =
57 "https://easylist-downloads.adblockplus.org/easylistgermany+easylist.txt";
58 public static final String EASYLIST_ISRAELI =
59 "https://easylist-downloads.adblockplus.org/israellist+easylist.txt";
60 public static final String EASYLIST_ITALIAN =
61 "https://easylist-downloads.adblockplus.org/easylistitaly+easylist.txt";
62 public static final String EASYLIST_LITHUANIAN =
63 "https://easylist-downloads.adblockplus.org/easylistlithuania+easylist.txt";
64 public static final String EASYLIST_LATVIAN =
65 "https://easylist-downloads.adblockplus.org/latvianlist+easylist.txt";
66 public static final String EASYLIST_ARABIAN_FRENCH =
67 "https://easylist-downloads.adblockplus.org/liste_ar+liste_fr+easylist.txt";
68 public static final String EASYLIST_FRENCH =
69 "https://easylist-downloads.adblockplus.org/liste_fr+easylist.txt";
70 public static final String EASYLIST_ROMANIAN =
71 "https://easylist-downloads.adblockplus.org/rolist+easylist.txt";
72 public static final String EASYLIST_RUSSIAN =
73 "https://easylist-downloads.adblockplus.org/ruadlist+easylist.txt";
74 public static final String ACCEPTABLE_ADS =
75 "https://easylist-downloads.adblockplus.org/exceptionrules.txt";
76
77 private Context context;
78 private WebRequest request;
79 private Map<String, Integer> urlToResourceIdMap;
80 private Storage storage;
81 private Listener listener;
82
83 /**
84 * Constructor
85 * @param context android context
86 * @param request wrapped request to perform the request if it's not preloaded subscription requested
87 * @param urlToResourceIdMap map URL -> android resource id for preloaded subs criptions
88 * See AndroidWebRequestResourceWrapper.EASYLIST_... constants
89 * @param storage Storage impl to remember served interceptions
90 */
91 public AndroidWebRequestResourceWrapper(Context context, WebRequest request,
92 Map<String, Integer> urlToResourceIdMa p,
93 Storage storage)
94 {
95 this.context = context;
96 this.request = request;
97 this.urlToResourceIdMap = Collections.synchronizedMap(urlToResourceIdMap);
98 this.storage = storage;
99 }
100
101 public Listener getListener()
102 {
103 return listener;
104 }
105
106 public void setListener(Listener listener)
107 {
108 this.listener = listener;
109 }
110
111 @Override
112 public ServerResponse httpGET(String url, List<HeaderEntry> headers)
113 {
114 // since parameters may vary we need to ignore them
115 String urlWithoutParams = url.substring(0, url.indexOf("?"));
116 Integer resourceId = urlToResourceIdMap.get(urlWithoutParams);
117
118 if (resourceId != null)
119 {
120 if (!storage.contains(urlWithoutParams))
121 {
122 Log.w(TAG, "Intercepting request for " + url + " with resource #" + reso urceId.intValue());
123 ServerResponse response = buildResourceContentResponse(resourceId);
124 storage.put(urlWithoutParams);
125
126 if (listener != null)
127 {
128 listener.onIntercepted(url, resourceId);
129 }
130
131 return response;
132 }
133 else
134 {
135 Log.d(TAG, "Skip intercepting");
136 }
137 }
138
139 // delegate to wrapper request
140 return request.httpGET(url, headers);
141 }
142
143 protected String readResourceContent(int resourceId) throws IOException
144 {
145 Log.d(TAG, "Reading from resource ...");
146
147 InputStream is = null;
148
149 try
150 {
151 is = context.getResources().openRawResource(resourceId);
152 BufferedReader br = new BufferedReader(new InputStreamReader(is));
153 StringBuilder sb = new StringBuilder();
154 String line;
155 boolean firstLine = true;
156 while ((line = br.readLine()) != null)
157 {
158 if (firstLine)
159 {
160 firstLine = false;
161 }
162 else
163 {
164 sb.append("\r\n");
165 }
166 sb.append(line);
167 }
168
169 Log.d(TAG, "Resource read (" + sb.length() + " bytes)");
170 return sb.toString();
171 }
172 finally
173 {
174 if (is != null)
175 {
176 is.close();
177 }
178 }
179 }
180
181 protected ServerResponse buildResourceContentResponse(int resourceId)
182 {
183 ServerResponse response = new ServerResponse();
184 try
185 {
186 response.setResponse(readResourceContent(resourceId));
187 response.setResponseStatus(200);
188 response.setStatus(ServerResponse.NsStatus.OK);
189 }
190 catch (IOException e)
191 {
192 Log.e(TAG, "Error injecting response", e);
193 response.setStatus(ServerResponse.NsStatus.ERROR_FAILURE);
194 }
195
196 return response;
197 }
198
199 @Override
200 public void dispose()
201 {
202 request.dispose();
203 super.dispose();
204 }
205
206 /**
207 * Listener for events
208 */
209 public interface Listener
210 {
211 void onIntercepted(String url, int resourceId);
212 }
213
214 /**
215 * Interface to remember intercepted subscription requests
216 */
217 public interface Storage
218 {
219 void put(String url);
220 boolean contains(String url);
221 }
222
223 /**
224 * Storage impl in Shared Preferences
225 */
226 public static class SharedPrefsStorage implements Storage
227 {
228 private static final String URLS = "urls";
229
230 private SharedPreferences prefs;
231 private Set<String> urls;
232
233 public SharedPrefsStorage(SharedPreferences prefs)
234 {
235 this.prefs = prefs;
236 this.urls = prefs.getStringSet(URLS, new HashSet<String>());
237 }
238
239 @Override
240 public synchronized void put(String url)
241 {
242 urls.add(url);
243
244 prefs
245 .edit()
246 .putStringSet(URLS, urls)
247 .commit();
248 }
249
250 @Override
251 public synchronized boolean contains(String url)
252 {
253 return urls.contains(url);
254 }
255 }
256 }
OLDNEW

Powered by Google App Engine
This is Rietveld