Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(444)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java

Issue 2506193003: Hide location permission if a search engine is non-Google or its location permission is unset. (Closed)
Patch Set: Update based on Peter's suggestion. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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.preferences; 5 package org.chromium.chrome.browser.preferences;
6 6
7 import android.content.Context; 7 import android.content.Context;
8 import android.content.Intent; 8 import android.content.Intent;
9 import android.content.SharedPreferences; 9 import android.content.SharedPreferences;
10 import android.content.res.Resources; 10 import android.content.res.Resources;
11 import android.os.Build; 11 import android.os.Build;
12 import android.os.Bundle; 12 import android.os.Bundle;
13 import android.support.annotation.IntDef;
13 import android.text.SpannableString; 14 import android.text.SpannableString;
14 import android.text.style.ForegroundColorSpan; 15 import android.text.style.ForegroundColorSpan;
15 import android.view.LayoutInflater; 16 import android.view.LayoutInflater;
16 import android.view.View; 17 import android.view.View;
17 import android.view.View.AccessibilityDelegate; 18 import android.view.View.AccessibilityDelegate;
18 import android.view.View.OnClickListener; 19 import android.view.View.OnClickListener;
19 import android.view.ViewGroup; 20 import android.view.ViewGroup;
20 import android.view.accessibility.AccessibilityEvent; 21 import android.view.accessibility.AccessibilityEvent;
21 import android.view.accessibility.AccessibilityNodeInfo; 22 import android.view.accessibility.AccessibilityNodeInfo;
22 import android.widget.BaseAdapter; 23 import android.widget.BaseAdapter;
23 import android.widget.RadioButton; 24 import android.widget.RadioButton;
24 import android.widget.TextView; 25 import android.widget.TextView;
25 26
26 import org.chromium.base.ApiCompatibilityUtils; 27 import org.chromium.base.ApiCompatibilityUtils;
27 import org.chromium.base.ContextUtils; 28 import org.chromium.base.ContextUtils;
28 import org.chromium.chrome.R; 29 import org.chromium.chrome.R;
29 import org.chromium.chrome.browser.omnibox.geo.GeolocationHeader; 30 import org.chromium.chrome.browser.omnibox.geo.GeolocationHeader;
30 import org.chromium.chrome.browser.preferences.website.ContentSetting; 31 import org.chromium.chrome.browser.preferences.website.ContentSetting;
31 import org.chromium.chrome.browser.preferences.website.GeolocationInfo; 32 import org.chromium.chrome.browser.preferences.website.GeolocationInfo;
32 import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences; 33 import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences;
33 import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge; 34 import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge;
34 import org.chromium.chrome.browser.search_engines.TemplateUrlService; 35 import org.chromium.chrome.browser.search_engines.TemplateUrlService;
35 import org.chromium.chrome.browser.search_engines.TemplateUrlService.LoadListene r; 36 import org.chromium.chrome.browser.search_engines.TemplateUrlService.LoadListene r;
36 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl ; 37 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl ;
37 import org.chromium.components.location.LocationUtils; 38 import org.chromium.components.location.LocationUtils;
38 import org.chromium.ui.text.SpanApplier; 39 import org.chromium.ui.text.SpanApplier;
39 import org.chromium.ui.text.SpanApplier.SpanInfo; 40 import org.chromium.ui.text.SpanApplier.SpanInfo;
40 41
42 import java.lang.annotation.Retention;
43 import java.lang.annotation.RetentionPolicy;
41 import java.util.List; 44 import java.util.List;
42 45
43 /** 46 /**
44 * A custom adapter for listing search engines. 47 * A custom adapter for listing search engines.
45 */ 48 */
46 public class SearchEngineAdapter extends BaseAdapter implements LoadListener, On ClickListener { 49 public class SearchEngineAdapter extends BaseAdapter implements LoadListener, On ClickListener {
47 /** 50 /**
48 * A callback for reporting progress to the owner. 51 * A callback for reporting progress to the owner.
49 */ 52 */
50 public interface SelectSearchEngineCallback { 53 public interface SelectSearchEngineCallback {
51 /** 54 /**
52 * Called when the search engine data has loaded and we've determined th e currently active 55 * Called when the search engine data has loaded and we've determined th e currently active
53 * one. 56 * one.
54 * @param name Provides the name of it (with a simplified URL in parenth esis). 57 * @param name Provides the name of it (with a simplified URL in parenth esis).
55 */ 58 */
56 void currentSearchEngineDetermined(int selectedIndex); 59 void currentSearchEngineDetermined(int selectedIndex);
57 } 60 }
58 61
62 private static final int TYPE_LOCATION_ALLOW = 0;
63 private static final int TYPE_LOCATION_BLOCK = 1;
64 private static final int TYPE_LOCATION_ASK = 2;
65 @IntDef({TYPE_LOCATION_ALLOW, TYPE_LOCATION_BLOCK, TYPE_LOCATION_ASK})
66 @Retention(RetentionPolicy.SOURCE)
67 private @interface LocationType {}
Peter Kasting 2016/11/18 20:25:43 Can you just return the ContentSetting directly?
ltian 2016/11/18 23:10:51 Done.
68
59 // The current context. 69 // The current context.
60 private Context mContext; 70 private Context mContext;
61 71
62 // The layout inflater to use for the custom views. 72 // The layout inflater to use for the custom views.
63 private LayoutInflater mLayoutInflater; 73 private LayoutInflater mLayoutInflater;
64 74
65 // The callback to use for notifying caller of progress. 75 // The callback to use for notifying caller of progress.
66 private SelectSearchEngineCallback mCallback; 76 private SelectSearchEngineCallback mCallback;
67 77
68 // The list of available search engines. 78 // The list of available search engines.
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 public void onInitializeAccessibilityNodeInfo(View host, Accessibili tyNodeInfo info) { 208 public void onInitializeAccessibilityNodeInfo(View host, Accessibili tyNodeInfo info) {
199 super.onInitializeAccessibilityNodeInfo(host, info); 209 super.onInitializeAccessibilityNodeInfo(host, info);
200 info.setCheckable(true); 210 info.setCheckable(true);
201 info.setChecked(selected); 211 info.setChecked(selected);
202 } 212 }
203 }); 213 });
204 214
205 TextView link = (TextView) view.findViewById(R.id.link); 215 TextView link = (TextView) view.findViewById(R.id.link);
206 link.setVisibility(selected ? View.VISIBLE : View.GONE); 216 link.setVisibility(selected ? View.VISIBLE : View.GONE);
207 if (selected) { 217 if (selected) {
208 ForegroundColorSpan linkSpan = new ForegroundColorSpan( 218 if (shouldShowLocationInfo(position)) {
209 ApiCompatibilityUtils.getColor(resources, R.color.pref_accen t_color)); 219 ForegroundColorSpan linkSpan = new ForegroundColorSpan(
210 if (LocationUtils.getInstance().isSystemLocationSettingEnabled()) { 220 ApiCompatibilityUtils.getColor(resources, R.color.pref_a ccent_color));
211 String message = mContext.getString( 221 if (LocationUtils.getInstance().isSystemLocationSettingEnabled() ) {
212 locationEnabled(position, true) 222 String message = mContext.getString(
213 ? R.string.search_engine_location_allowed 223 locationEnabled(position, true)
214 : R.string.search_engine_location_blocked); 224 ? R.string.search_engine_location_allowed
215 SpannableString messageWithLink = new SpannableString(message); 225 : R.string.search_engine_location_blocked);
216 messageWithLink.setSpan(linkSpan, 0, messageWithLink.length(), 0 ); 226 SpannableString messageWithLink = new SpannableString(messag e);
217 link.setText(messageWithLink); 227 messageWithLink.setSpan(linkSpan, 0, messageWithLink.length( ), 0);
228 link.setText(messageWithLink);
229 } else {
230 link.setText(SpanApplier.applySpans(
231 mContext.getString(R.string.android_location_off),
232 new SpanInfo("<link>", "</link>", linkSpan)));
233 }
234
235 link.setOnClickListener(this);
218 } else { 236 } else {
219 link.setText(SpanApplier.applySpans( 237 link.setVisibility(View.GONE);
220 mContext.getString(R.string.android_location_off),
221 new SpanInfo("<link>", "</link>", linkSpan)));
222 } 238 }
223
224 link.setOnClickListener(this);
225 } 239 }
226 240
227 return view; 241 return view;
228 } 242 }
229 243
230 // TemplateUrlService.LoadListener 244 // TemplateUrlService.LoadListener
231 245
232 @Override 246 @Override
233 public void onTemplateUrlServiceLoaded() { 247 public void onTemplateUrlServiceLoaded() {
234 TemplateUrlService.getInstance().unregisterLoadListener(this); 248 TemplateUrlService.getInstance().unregisterLoadListener(this);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 String url = TemplateUrlService.getInstance().getSearchEngineUrlFrom TemplateUrl( 294 String url = TemplateUrlService.getInstance().getSearchEngineUrlFrom TemplateUrl(
281 toIndex(mSelectedSearchEnginePosition)); 295 toIndex(mSelectedSearchEnginePosition));
282 Bundle fragmentArgs = SingleWebsitePreferences.createFragmentArgsFor Site(url); 296 Bundle fragmentArgs = SingleWebsitePreferences.createFragmentArgsFor Site(url);
283 fragmentArgs.putBoolean(SingleWebsitePreferences.EXTRA_LOCATION, 297 fragmentArgs.putBoolean(SingleWebsitePreferences.EXTRA_LOCATION,
284 locationEnabled(mSelectedSearchEnginePosition, true)); 298 locationEnabled(mSelectedSearchEnginePosition, true));
285 settingsIntent.putExtra(Preferences.EXTRA_SHOW_FRAGMENT_ARGUMENTS, f ragmentArgs); 299 settingsIntent.putExtra(Preferences.EXTRA_SHOW_FRAGMENT_ARGUMENTS, f ragmentArgs);
286 mContext.startActivity(settingsIntent); 300 mContext.startActivity(settingsIntent);
287 } 301 }
288 } 302 }
289 303
290 private boolean locationEnabled(int position, boolean checkGeoHeader) { 304 @LocationType private int getLocationPermissionType(int position, boolean ch eckGeoHeader) {
291 if (position == -1) return false; 305 if (position == -1) {
306 return TYPE_LOCATION_BLOCK;
307 }
292 308
293 String url = TemplateUrlService.getInstance().getSearchEngineUrlFromTemp lateUrl( 309 String url = TemplateUrlService.getInstance().getSearchEngineUrlFromTemp lateUrl(
294 toIndex(position)); 310 toIndex(position));
295 GeolocationInfo locationSettings = new GeolocationInfo(url, null, false) ; 311 GeolocationInfo locationSettings = new GeolocationInfo(url, null, false) ;
296 ContentSetting locationPermission = locationSettings.getContentSetting() ; 312 ContentSetting locationPermission = locationSettings.getContentSetting() ;
297 // Handle the case where the geoHeader being sent when no permission has been specified. 313 if (locationPermission == ContentSetting.ASK) {
298 if (locationPermission == ContentSetting.ASK && checkGeoHeader) { 314 // Handle the case where the geoHeader being sent when no permission has been specified.
299 return GeolocationHeader.isGeoHeaderEnabledForUrl(mContext, url, fal se); 315 if (checkGeoHeader && GeolocationHeader.isGeoHeaderEnabledForUrl(
Peter Kasting 2016/11/18 20:25:43 Nit: Simpler: if (checkGeoHeader && ...) lo
ltian 2016/11/18 23:10:51 Done.
316 mContext, url, false)) {
317 return TYPE_LOCATION_ALLOW;
318 } else {
319 return TYPE_LOCATION_ASK;
320 }
321 } else if (locationPermission == ContentSetting.ALLOW) {
322 return TYPE_LOCATION_ALLOW;
323 } else {
324 return TYPE_LOCATION_BLOCK;
300 } 325 }
301 return locationPermission == ContentSetting.ALLOW; 326 }
327
328 private boolean locationEnabled(int position, boolean checkGeoHeader) {
329 return getLocationPermissionType(position, checkGeoHeader) == TYPE_LOCAT ION_ALLOW;
330 }
331
332 // For Google search engine, if location permission is granted for the whole app,
333 // even its own location permission is unset, location permission is still g ranted for it.
Peter Kasting 2016/11/18 20:25:43 Nit: This comment no longer seems relevant.
ltian 2016/11/18 23:10:51 Done.
334 private boolean shouldShowLocationInfo(int position) {
335 return getLocationPermissionType(position, true) != TYPE_LOCATION_ASK;
Peter Kasting 2016/11/18 20:25:43 Nit: Could just inline this into the lone caller,
ltian 2016/11/18 23:10:51 Done.
302 } 336 }
303 } 337 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698