auto import from //depot/cupcake/@135843
diff --git a/src/com/android/browser/GearsPermissions.java b/src/com/android/browser/GearsPermissions.java
new file mode 100644
index 0000000..e48e045
--- /dev/null
+++ b/src/com/android/browser/GearsPermissions.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * The permission mechanism works the following way:
+ *
+ * PermissionType allows to define a type of permission
+ *   (e.g. localStorage/locationData), storing a name and a set of
+ *   resource ids corresponding to the GUI resources.
+ *
+ * Permission defines an actual permission instance, with a type and a value.
+ *
+ * OriginPermissions holds an origin with a set of Permission objects
+ */
+class GearsPermissions {
+
+  private static final String TAG = "GearsPermissions";
+
+  /**
+   * Defines a type of permission
+   *
+   * Store the permission's name (used in the json result)
+   * Graphically, each permission is a label followed by two radio buttons.
+   * We store the resources ids here.
+   */
+  public static class PermissionType {
+    public static final int PERMISSION_NOT_SET = 0;
+    public static final int PERMISSION_ALLOWED = 1;
+    public static final int PERMISSION_DENIED = 2;
+
+    String mName;
+    int mTitleRsc;
+    int mSubtitleOnRsc;
+    int mSubtitleOffRsc;
+
+    PermissionType(String name) {
+      mName = name;
+    }
+
+    public void setResources(int titleRsc,
+        int subtitleOnRsc, int subtitleOffRsc) {
+      mTitleRsc = titleRsc;
+      mSubtitleOnRsc = subtitleOnRsc;
+      mSubtitleOffRsc = subtitleOffRsc;
+    }
+
+    public String getName() {
+      return mName;
+    }
+
+    public int getTitleRsc() {
+      return mTitleRsc;
+    }
+
+    public int getSubtitleOnRsc() {
+      return mSubtitleOnRsc;
+    }
+
+    public int getSubtitleOffRsc() {
+      return mSubtitleOffRsc;
+    }
+
+  }
+
+  /**
+   * Simple class to store an instance of a permission
+   *
+   * i.e. a permission type and a value
+   * Value can be either PERMISSION_NOT_SET,
+   * PERMISSION_ALLOWED or PERMISSION_DENIED
+   * (defined in PermissionType).
+   */
+  public static class Permission {
+    PermissionType mType;
+    int mValue;
+
+    Permission(PermissionType type, int value) {
+      mType = type;
+      mValue = value;
+    }
+
+    Permission(PermissionType type) {
+      mType = type;
+      mValue = 0;
+    }
+
+    public PermissionType getType() {
+      return mType;
+    }
+
+    public void setValue(int value) {
+      mValue = value;
+    }
+
+    public int getValue() {
+      return mValue;
+    }
+  }
+
+  /**
+   * Interface used by the GearsNativeDialog implementation
+   * to listen to changes in the permissions.
+   */
+  public interface PermissionsChangesListener {
+    public boolean setPermission(PermissionType type, int perm);
+  }
+
+  /**
+   * Holds the model for an origin -- each origin has a set of
+   * permissions.
+   */
+  public static class OriginPermissions {
+    HashMap<PermissionType, Permission> mPermissions;
+    String mOrigin;
+    public static PermissionsChangesListener mListener;
+
+    public static void setListener(PermissionsChangesListener listener) {
+      mListener = listener;
+    }
+
+    OriginPermissions(String anOrigin) {
+      mOrigin = anOrigin;
+      mPermissions = new HashMap<PermissionType, Permission>();
+    }
+
+    OriginPermissions(OriginPermissions perms) {
+      mOrigin = perms.getOrigin();
+      mPermissions = new HashMap<PermissionType, Permission>();
+      HashMap<PermissionType, Permission> permissions = perms.getPermissions();
+      Iterator<PermissionType> iterator = permissions.keySet().iterator();
+      while (iterator.hasNext()) {
+        Permission permission = permissions.get(iterator.next());
+        int value = permission.getValue();
+        setPermission(permission.getType(), value);
+      }
+    }
+
+    public String getOrigin() {
+      return mOrigin;
+    }
+
+    public HashMap<PermissionType, Permission> getPermissions() {
+      return mPermissions;
+    }
+
+    public int getPermission(PermissionType type) {
+      return mPermissions.get(type).getValue();
+    }
+
+    public void setPermission(PermissionType type, int perm) {
+      if (mPermissions.get(type) == null) {
+        Permission permission = new Permission(type, perm);
+        mPermissions.put(type, permission);
+        return;
+      }
+
+      if (mListener != null) {
+        mListener.setPermission(type, perm);
+      }
+
+      mPermissions.get(type).setValue(perm);
+    }
+
+    public void print() {
+      Log.v(TAG, "Permissions for " + mOrigin);
+      Iterator<PermissionType> iterator = mPermissions.keySet().iterator();
+      while (iterator.hasNext()) {
+        Permission permission = mPermissions.get(iterator.next());
+        String name = permission.getType().getName();
+        int value = permission.getValue();
+        Log.v(TAG, "  " + name + ": " + value);
+      }
+    }
+  }
+
+}