diff options
| author | Android (Google) Code Review <android-gerrit@google.com> | 2009-07-09 10:59:22 -0700 | 
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-07-09 10:59:22 -0700 | 
| commit | 3bb692338fed7f34f010398fe8b831d0de22c6e8 (patch) | |
| tree | 2bee450fa412e5895a97aab86efbfa0820b49f7f /core/java/android | |
| parent | 313ea433d18e7fd5438b94c0606c496fcc7a2f88 (diff) | |
| parent | 215a23654ad6dfcc231793e5fab21e9f71ca374d (diff) | |
| download | frameworks_base-3bb692338fed7f34f010398fe8b831d0de22c6e8.zip frameworks_base-3bb692338fed7f34f010398fe8b831d0de22c6e8.tar.gz frameworks_base-3bb692338fed7f34f010398fe8b831d0de22c6e8.tar.bz2 | |
Merge change 6620 into donut
* changes:
  Keep Gears permissions in sync with system location settings.
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/webkit/WebSettings.java | 170 | 
1 files changed, 170 insertions, 0 deletions
| diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java index ec671d5..9f01923 100644 --- a/core/java/android/webkit/WebSettings.java +++ b/core/java/android/webkit/WebSettings.java @@ -16,15 +16,27 @@  package android.webkit; +import android.content.ContentValues;  import android.content.Context; +import android.content.SharedPreferences;  import android.os.Build;  import android.os.Handler;  import android.os.Message; +import android.preference.PreferenceManager;  import android.provider.Checkin; +import android.provider.Settings; +import android.util.Log; +import java.io.File;  import java.lang.SecurityException; + +import android.content.SharedPreferences.Editor;  import android.content.pm.PackageManager; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteException; +import android.database.sqlite.SQLiteStatement; +import java.util.HashSet;  import java.util.Locale;  /** @@ -176,6 +188,43 @@ public class WebSettings {      private boolean         mBuiltInZoomControls = false;      private boolean         mAllowFileAccess = true; +    // Donut-specific hack to keep Gears permissions in sync with the +    // system location setting. +    // TODO: Make sure this hack is removed in  Eclair, when Gears +    // is also removed. +    // Used to remember if we checked the Gears permissions already. +    static boolean mCheckedGearsPermissions = false; +    // The Gears permissions database directory. +    private final static String GEARS_DATABASE_DIR = "gears"; +    // The Gears permissions database file name. +    private final static String GEARS_DATABASE_FILE = "permissions.db"; +    // The Gears location permissions table. +    private final static String GEARS_LOCATION_ACCESS_TABLE_NAME =  +        "LocationAccess"; +    // The Gears storage access permissions table. +    private final static String GEARS_STORAGE_ACCESS_TABLE_NAME = "Access"; +    // The Gears permissions db schema version table. +    private final static String GEARS_SCHEMA_VERSION_TABLE_NAME = +        "VersionInfo"; +    // The shared pref name. +    private static final String LAST_KNOWN_LOCATION_SETTING = +        "lastKnownLocationSystemSetting"; +    // The Browser package name. +    private static final String BROWSER_PACKAGE_NAME = "com.android.browser"; +    // The Google URLs whitelisted for Gears location access. +    private static HashSet<String> sGearsWhiteList; + +    static { +        sGearsWhiteList = new HashSet<String>(); +        // NOTE: DO NOT ADD A "/" AT THE END! +        sGearsWhiteList.add("http://www.google.com"); +        sGearsWhiteList.add("http://www.google.co.uk"); +    } + +    private static final String LOGTAG = "webcore"; +    static final boolean DEBUG = false; +    static final boolean LOGV_ENABLED = DEBUG; +      // Class to handle messages before WebCore is ready.      private class EventHandler {          // Message id for syncing @@ -196,6 +245,7 @@ public class WebSettings {                      switch (msg.what) {                          case SYNC:                              synchronized (WebSettings.this) { +                                checkGearsPermissions();                                  if (mBrowserFrame.mNativeFrame != 0) {                                      nativeSync(mBrowserFrame.mNativeFrame);                                  } @@ -1163,6 +1213,126 @@ public class WebSettings {          return size;      } +    private void checkGearsPermissions() { +        // Did we already check the permissions? +        if (mCheckedGearsPermissions) { +            return; +        } +        // Are we running in the browser? +        if (!BROWSER_PACKAGE_NAME.equals(mContext.getPackageName())) { +            return; +        } +        // Is the pluginsPath sane? +        if (mPluginsPath == null || mPluginsPath.length() == 0) { +            // We don't yet have a meaningful plugin path, so +            // we can't do anything about the Gears permissions. +            return; +        } +        // Remember we checked the Gears permissions. +        mCheckedGearsPermissions = true; +        // Get the current system settings. +        int setting = Settings.Secure.getInt(mContext.getContentResolver(), +                Settings.Secure.USE_LOCATION_FOR_SERVICES, -1); +        // Check if we need to set the Gears permissions. +        if (setting != -1 && locationSystemSettingChanged(setting)) { +            setGearsPermissionForGoogleDomains(setting); +        } +    } + +    private boolean locationSystemSettingChanged(int newSetting) { +        SharedPreferences prefs = +            PreferenceManager.getDefaultSharedPreferences(mContext); +        int oldSetting = 0; +        oldSetting = prefs.getInt(LAST_KNOWN_LOCATION_SETTING, oldSetting); +        if (oldSetting == newSetting) { +            return false; +        } +        Editor ed = prefs.edit(); +        ed.putInt(LAST_KNOWN_LOCATION_SETTING, newSetting); +        ed.commit(); +        return true; +    } + +    private void setGearsPermissionForGoogleDomains(int systemPermission) { +        // Transform the system permission into a Gears permission +        int gearsPermission = (systemPermission == 1 ? 1 : 2); +        // Build the path to the Gears library. + +        File file = new File(mPluginsPath).getParentFile(); +        if (file == null) { +            return; +        } +        // Build the Gears database file name. +        file = new File(file.getAbsolutePath() + File.separator  +                + GEARS_DATABASE_DIR + File.separator + GEARS_DATABASE_FILE); +        // Remember whether or not we need to create the LocationAccess table. +        boolean needToCreateTables = !file.exists(); +        // Try opening the Gears database. +        SQLiteDatabase permissions; +        try { +            permissions = SQLiteDatabase.openOrCreateDatabase(file, null); +        } catch (SQLiteException e) { +            if (LOGV_ENABLED) { +                Log.v(LOGTAG, "Could not open Gears permission DB: " + +                        e.getMessage()); +            } +            // Just bail out. +            return; +        } +        // We now have a database open. Begin a transaction. +        permissions.beginTransaction(); +        try { +            if (needToCreateTables) { +                // Create the tables. Note that this creates the +                // Gears tables for the permissions DB schema version 2. +                // The Gears schema upgrade process will take care of the rest. +                // First, the storage access table. +                SQLiteStatement statement = permissions.compileStatement( +                        "CREATE TABLE IF NOT EXISTS " + +                        GEARS_STORAGE_ACCESS_TABLE_NAME + +                        " (Name TEXT UNIQUE, Value)"); +                statement.execute(); +                // Next the location access table. +                statement = permissions.compileStatement( +                        "CREATE TABLE IF NOT EXISTS " + +                        GEARS_LOCATION_ACCESS_TABLE_NAME + +                        " (Name TEXT UNIQUE, Value)"); +                statement.execute(); +                // Finally, the schema version table. +                statement = permissions.compileStatement( +                        "CREATE TABLE IF NOT EXISTS " + +                        GEARS_SCHEMA_VERSION_TABLE_NAME + +                        " (Name TEXT UNIQUE, Value)"); +                statement.execute(); +                // Set the schema version to 2. +                ContentValues schema = new ContentValues(); +                schema.put("Name", "Version"); +                schema.put("Value", 2); +                permissions.insert(GEARS_SCHEMA_VERSION_TABLE_NAME, null, +                        schema); +            } + +            ContentValues permissionValues = new ContentValues(); + +            for (String url : sGearsWhiteList) { +                permissionValues.put("Name", url); +                permissionValues.put("Value", gearsPermission); +                permissions.replace(GEARS_LOCATION_ACCESS_TABLE_NAME, null, +                        permissionValues); +                permissionValues.clear(); +            } +            // Commit the transaction. +            permissions.setTransactionSuccessful(); +        } catch (SQLiteException e) { +            if (LOGV_ENABLED) { +                Log.v(LOGTAG, "Could not set the Gears permissions: " + +                        e.getMessage()); +            } +        } finally { +            permissions.endTransaction(); +            permissions.close(); +        } +    }      /* Post a SYNC message to handle syncing the native settings. */      private synchronized void postSync() {          // Only post if a sync is not pending | 
