Geolocation fixes
- Dismiss GeolocationPermissionsPrompt when user navigates
away from the page or when the user responds to a prompt
for the same origin on a different tab.
- Geolocation indicator missing in incognito tabs.
Change-Id: If73bc509a83ad543ed02f723c65dd1507f0d7ac1
diff --git a/src/com/android/browser/LocationButton.java b/src/com/android/browser/LocationButton.java
index c80c0e8..1bc3afb 100644
--- a/src/com/android/browser/LocationButton.java
+++ b/src/com/android/browser/LocationButton.java
@@ -31,7 +31,8 @@
package com.android.browser;
import org.codeaurora.swe.GeolocationPermissions;
-import org.codeaurora.swe.GeolocationPermissions.OnGeolocationPolicyModifiedListener;
+import org.codeaurora.swe.GeolocationPermissions.GeolocationPolicyChange;
+import org.codeaurora.swe.GeolocationPermissions.GeolocationPolicyListener;
import org.json.JSONArray;
import android.app.AlertDialog;
@@ -43,8 +44,7 @@
import android.webkit.ValueCallback;
import android.widget.ImageButton;
-public class LocationButton extends ImageButton
- implements OnGeolocationPolicyModifiedListener {
+public class LocationButton extends ImageButton implements GeolocationPolicyListener {
private GeolocationPermissions mGeolocationPermissions;
private long mCurrentTabId;
private String mCurrentOrigin;
@@ -78,7 +78,8 @@
mGeolocationPermissions = mCurrentIncognito ?
GeolocationPermissions.getIncognitoInstance() :
GeolocationPermissions.getInstance();
- mGeolocationPermissions.registerOnGeolocationPolicyModifiedListener(this);
+
+ mGeolocationPermissions.addListener(this);
}
// TODO: Perform this initilalization only after the engine initialization is complete.
@@ -185,18 +186,31 @@
if (mCurrentTabId != tabId) {
mCurrentTabId = tabId;
mCurrentOrigin = origin;
+ // Switch GeolocationPermissions if we went from a regular to an
+ // incognito tab or vice versa
+ if (mCurrentIncognito != incognito) {
+ mCurrentIncognito = incognito;
+ mGeolocationPermissions = mCurrentIncognito ?
+ GeolocationPermissions.getIncognitoInstance() :
+ GeolocationPermissions.getInstance();
+ mGeolocationPermissions.addListener(this);
+ }
update();
}
- // Update icon if we are in the same tab and origin has changed
- else if (!((mCurrentOrigin == null && origin == null) ||
+ // Update icon if we are in the same Tab and origin has changed
+ else if (!((mCurrentOrigin == null && origin == null) ||
(mCurrentOrigin != null && origin != null
- && mCurrentOrigin.equals(origin)))) {
+ && mCurrentOrigin.equals(origin)))) {
mCurrentOrigin = origin;
update();
}
}
- public void update() {
+ /**
+ * This method is called when we navigate away from an origin on the same Tab or
+ * when a new Tab is created.
+ */
+ private void update() {
if (mCurrentOrigin != null) {
updateGeolocationPermissions();
mGeolocationPermissions.hasOrigin(mCurrentOrigin,
@@ -227,25 +241,30 @@
}
}
- @Override
- public void onGeolocationPolicyAdded(String origin, boolean allow) {
- if (mCurrentOrigin != null && mCurrentOrigin.equals(origin)) {
- this.setImageResource(allow ? R.drawable.ic_action_gps_on :
- R.drawable.ic_action_gps_off);
- this.setVisibility(VISIBLE);
+ public void onGeolocationPolicyChanged(GeolocationPolicyChange change) {
+ if (mCurrentOrigin != null) {
+ int action = change.getAction();
+
+ if (action == GeolocationPermissions.ALL_POLICIES_REMOVED) {
+ this.setVisibility(GONE);
+ return;
+ } else if (change.getOrigin() != null && mCurrentOrigin.equals(change.getOrigin())) {
+ switch (action) {
+ case GeolocationPermissions.ORIGIN_ALLOWED:
+ this.setImageResource(R.drawable.ic_action_gps_on);
+ this.setVisibility(VISIBLE);
+ break;
+ case GeolocationPermissions.ORIGIN_DENIED:
+ this.setImageResource(R.drawable.ic_action_gps_off);
+ this.setVisibility(VISIBLE);
+ break;
+ case GeolocationPermissions.ORIGIN_POLICY_REMOVED:
+ this.setVisibility(GONE);
+ break;
+ default:
+ break;
+ }
+ }
}
}
-
- @Override
- public void onGeolocationPolicyCleared(String origin) {
- if (mCurrentOrigin != null && mCurrentOrigin.equals(origin)) {
- this.setVisibility(GONE);
- }
- }
-
- @Override
- public void onGeolocationPolicyClearedAll() {
- this.setVisibility(GONE);
- }
-
}