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

Side by Side Diff: mobile/android/thirdparty/org/adblockplus/browser/MoreSubscriptionsPreferenceGroup.java

Issue 29322610: Issue 2720 - [Adblocking settings] Add the other filter lists category (Closed)
Patch Set: Last naming nit Created July 31, 2015, 9:36 a.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-2015 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
18 package org.adblockplus.browser;
19
20 import java.util.HashMap;
21 import java.util.HashSet;
22 import java.util.Map.Entry;
23 import java.util.concurrent.Semaphore;
24
25 import org.mozilla.gecko.R;
26 import org.mozilla.gecko.util.NativeJSObject;
27 import org.mozilla.gecko.util.ThreadUtils;
28
29 import android.app.ProgressDialog;
30 import android.content.Context;
31 import android.os.Build;
32 import android.preference.CheckBoxPreference;
33 import android.preference.Preference;
34 import android.preference.PreferenceGroup;
35 import android.util.AttributeSet;
36 import android.util.Log;
37 import android.view.View;
38 import android.view.ViewGroup;
39
40 public class MoreSubscriptionsPreferenceGroup extends PreferenceGroup implements
41 UrlInputDialog.UrlReadyCallback
42 {
43 private static final String TAG = "AdblockBrowser.OtherPreferenceGroup";
44 private static final HashMap<String, Integer> BUILTIN_URL_TO_INDEX = new HashM ap<String, Integer>();
45 private static final HashSet<String> IGNORED_URLS = new HashSet<String>();
46 private static SubscriptionContainer recommendedSubscriptions = null;
47
48 private final CheckBoxChangeListener checkBoxChangeListener = new CheckBoxChan geListener();
49 private final ActiveSubscriptionContainer activeSubscriptions = new ActiveSubs criptionContainer();
50 private ProgressDialog progressDialog;
51
52 private static final int[] BUILTIN_TITLES =
53 {
54 R.string.abb_subscription_disable_tracking,
55 R.string.abb_subscription_disable_malware,
56 R.string.abb_subscription_disable_anti_adblock,
57 R.string.abb_subscription_disable_social_media
58 };
59
60 private static final String[] BUILTIN_LISTS =
61 {
62 "EasyPrivacy",
63 "https://easylist-downloads.adblockplus.org/easyprivacy.txt",
64 "Malware Domains",
65 "https://easylist-downloads.adblockplus.org/malwaredomains_full.txt",
66 "Adblock Warning Removal List",
67 "https://easylist-downloads.adblockplus.org/antiadblockfilters.txt",
68 "Fanboy's Social Blocking List",
69 "https://easylist-downloads.adblockplus.org/fanboy-social.txt"
70 };
71
72 static
73 {
74 for (int i = 0; i < BUILTIN_TITLES.length; i++)
75 {
76 BUILTIN_URL_TO_INDEX.put(BUILTIN_LISTS[i * 2 + 1], Integer.valueOf(i));
77 }
78
79 IGNORED_URLS.add("https://easylist-downloads.adblockplus.org/exceptionrules. txt");
80 }
81
82 private synchronized static void initRecommendedSubscriptions()
83 {
84 if (recommendedSubscriptions == null)
85 {
86 recommendedSubscriptions = SubscriptionContainer.create(false);
87
88 for (SubscriptionContainer.Subscription s : recommendedSubscriptions.getSu bscriptions(false))
89 {
90 IGNORED_URLS.add(s.url);
91 }
92 }
93 }
94
95 public MoreSubscriptionsPreferenceGroup(final Context context, final Attribute Set attrs)
96 {
97 super(context, attrs);
98 }
99
100 public MoreSubscriptionsPreferenceGroup(final Context context, final Attribute Set attrs,
101 final int defStyleAttr)
102 {
103 super(context, attrs, defStyleAttr);
104 }
105
106 @Override
107 protected View onCreateView(final ViewGroup parent)
108 {
109 this.setLayoutResource(R.layout.abb_minimal_widget);
110 return super.onCreateView(parent);
111 }
112
113 public static Preference createCheckBoxOrSwitch(final Context context)
114 {
115 if (Build.VERSION.SDK_INT < 14)
116 {
117 return new CheckBoxPreference(context);
118 }
119 try
120 {
121 return (Preference) Class.forName("android.preference.SwitchPreference")
122 .getConstructor(Context.class)
123 .newInstance(context);
124 }
125 catch (Exception e)
126 {
127 Log.e(TAG, "Failed to create SwitchPreference, falling back to CheckBoxPre ference", e);
128 return new CheckBoxPreference(context);
129 }
130 }
131
132 @Override
133 protected void onAttachedToActivity()
134 {
135 this.setEnabled(false);
136 this.setShouldDisableView(true);
137
138 super.onAttachedToActivity();
139
140 this.progressDialog = new ProgressDialog(this.getContext());
141 this.progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
142 this.progressDialog.setMessage(this.getContext().getString(R.string.abb_adbl ocking_waiting));
143 this.progressDialog.show();
144
145 UrlInputOpenerPreference.setRedirectUrlReadyCallback(this);
146
147 AddOnBridge.postToHandler(new Runnable()
148 {
149 @Override
150 public void run()
151 {
152 initRecommendedSubscriptions();
153 MoreSubscriptionsPreferenceGroup.this.activeSubscriptions.refresh();
154
155 ThreadUtils.postToUiThread(new Runnable()
156 {
157 @Override
158 public void run()
159 {
160 MoreSubscriptionsPreferenceGroup.this.initEntries();
161 }
162 });
163 }
164 });
165 }
166
167 private void initEntries()
168 {
169 this.removeAll();
170 int i = 0;
171 for (; i < BUILTIN_TITLES.length; i++)
172 {
173 final CheckBoxPreference cbp = new CheckBoxPreference(this.getContext());
174 final String url = BUILTIN_LISTS[i * 2 + 1];
175 cbp.setOrder(i);
176 cbp.setTitle(BUILTIN_TITLES[i]);
177 cbp.setKey(url);
178 cbp.setChecked(this.activeSubscriptions.enabledSubscriptions.containsKey(u rl));
179 cbp.setOnPreferenceChangeListener(this.checkBoxChangeListener);
180 cbp.setPersistent(false);
181 this.addPreference(cbp);
182 }
183
184 for (Entry<String, String> e : this.activeSubscriptions.enabledSubscriptions .entrySet())
185 {
186 if (!BUILTIN_URL_TO_INDEX.containsKey(e.getKey()))
187 {
188 final CheckBoxPreference cbp = new CheckBoxPreference(this.getContext()) ;
189 cbp.setOrder(i++);
190 cbp.setTitle(e.getValue());
191 cbp.setKey(e.getKey());
192 cbp.setChecked(true);
193 cbp.setOnPreferenceChangeListener(this.checkBoxChangeListener);
194 cbp.setPersistent(false);
195 this.addPreference(cbp);
196 }
197 }
198
199 this.setEnabled(true);
200 this.setShouldDisableView(false);
201 if (this.progressDialog != null)
202 {
203 this.progressDialog.dismiss();
204 this.progressDialog = null;
205 }
206 }
207
208 private void addNewSubscription(final String url)
209 {
210 this.progressDialog = new ProgressDialog(this.getContext());
211 this.progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
212 this.progressDialog
213 .setMessage(this.getContext().getString(R.string.abb_add_subscription_ad ding));
214 this.progressDialog.show();
215
216 AddOnBridge.postToHandler(new Runnable()
217 {
218 @Override
219 public void run()
220 {
221 try
222 {
223 final Semaphore finished = new Semaphore(0);
224
225 AddOnBridge.addSubscription(new AdblockPlusApiCallback()
226 {
227 @Override
228 public void onApiRequestSucceeded(NativeJSObject jsObject)
229 {
230 finished.release();
231 }
232
233 @Override
234 public void onApiRequestFailed(String errorMessage)
235 {
236 finished.release();
237 }
238 }, url, null);
239
240 finished.acquireUninterruptibly();
241
242 MoreSubscriptionsPreferenceGroup.this.activeSubscriptions.refresh();
243
244 ThreadUtils.postToUiThread(new Runnable()
245 {
246 @Override
247 public void run()
248 {
249 MoreSubscriptionsPreferenceGroup.this.initEntries();
250 }
251 });
252 }
253 catch (Throwable t)
254 {
255 if (MoreSubscriptionsPreferenceGroup.this.progressDialog != null)
256 {
257 MoreSubscriptionsPreferenceGroup.this.progressDialog.dismiss();
258 MoreSubscriptionsPreferenceGroup.this.progressDialog = null;
259 }
260 }
261 }
262 });
263 }
264
265 @Override
266 public void callback(final String url)
267 {
268 if (url == null)
269 {
270 return;
271 }
272
273 Log.d(TAG, "Adding: " + url);
274 this.addNewSubscription(url);
275 }
276
277 private static class ActiveSubscriptionContainer implements AdblockPlusApiCall back
278 {
279 public final HashMap<String, String> enabledSubscriptions = new HashMap<Stri ng, String>();
280 private final Semaphore entriesReady = new Semaphore(0);
281
282 public void refresh()
283 {
284 AddOnBridge.queryActiveSubscriptions(this);
285 this.entriesReady.acquireUninterruptibly();
286 }
287
288 @Override
289 public void onApiRequestSucceeded(NativeJSObject jsObject)
290 {
291 try
292 {
293 this.enabledSubscriptions.clear();
294 if (jsObject.getBoolean("success"))
295 {
296 NativeJSObject[] subs = jsObject.getObjectArray("value");
297 for (int i = 0; i < subs.length; i++)
298 {
299 final String url = subs[i].getString("url");
300 final String title = subs[i].has("title") ? subs[i].getString("title ") : url;
301 if (!IGNORED_URLS.contains(url))
302 {
303 Log.d(TAG, "Adding: " + url + ", " + title);
304 this.enabledSubscriptions.put(url, title);
305 }
306 }
307 }
308 }
309 finally
310 {
311 this.entriesReady.release();
312 }
313 }
314
315 @Override
316 public void onApiRequestFailed(String errorMessage)
317 {
318 this.entriesReady.release();
319 }
320 }
321
322 private static class CheckBoxChangeListener implements OnPreferenceChangeListe ner,
323 AdblockPlusApiCallback
324 {
325 @Override
326 public boolean onPreferenceChange(Preference preference, Object newValue)
327 {
328 if (preference instanceof CheckBoxPreference && newValue instanceof Boolea n)
329 {
330 final CheckBoxPreference cbp = (CheckBoxPreference) preference;
331 final boolean enable = ((Boolean) newValue).booleanValue();
332
333 if (enable)
334 {
335 AddOnBridge.addSubscription(this, cbp.getKey(), null);
336 }
337 else
338 {
339 AddOnBridge.removeSubscription(this, cbp.getKey());
340 }
341 }
342 return true;
343 }
344
345 @Override
346 public void onApiRequestSucceeded(NativeJSObject jsObject)
347 {
348 // ignored
349 }
350
351 @Override
352 public void onApiRequestFailed(String errorMessage)
353 {
354 // ignored
355 }
356 }
357 }
OLDNEW

Powered by Google App Engine
This is Rietveld