diff -r 000000000000 -r 6474c204b198 mobile/android/base/GeckoProfilesProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobile/android/base/GeckoProfilesProvider.java Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,156 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko; + +import java.io.File; +import java.util.Map; +import java.util.Map.Entry; + +import org.mozilla.gecko.GeckoProfileDirectories.NoMozillaDirectoryException; +import org.mozilla.gecko.db.BrowserContract; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.MatrixCursor; +import android.net.Uri; +import android.util.Log; + +/** + * This is not a per-profile provider. This provider allows read-only, + * restricted access to certain attributes of Fennec profiles. + */ +public class GeckoProfilesProvider extends ContentProvider { + private static final String LOG_TAG = "GeckoProfilesProvider"; + + private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); + + private static final int PROFILES = 100; + private static final int PROFILES_NAME = 101; + private static final int PROFILES_DEFAULT = 200; + + private static final String[] DEFAULT_ARGS = { + BrowserContract.Profiles.NAME, + BrowserContract.Profiles.PATH, + }; + + static { + URI_MATCHER.addURI(BrowserContract.PROFILES_AUTHORITY, "profiles", PROFILES); + URI_MATCHER.addURI(BrowserContract.PROFILES_AUTHORITY, "profiles/*", PROFILES_NAME); + URI_MATCHER.addURI(BrowserContract.PROFILES_AUTHORITY, "default", PROFILES_DEFAULT); + } + + @Override + public String getType(Uri uri) { + return null; + } + + @Override + public boolean onCreate() { + // Successfully loaded. + return true; + } + + private String[] profileValues(final String name, final String path, int len, int nameIndex, int pathIndex) { + final String[] values = new String[len]; + if (nameIndex >= 0) { + values[nameIndex] = name; + } + if (pathIndex >= 0) { + values[pathIndex] = path; + } + return values; + } + + protected void addRowForProfile(final MatrixCursor cursor, final int len, final int nameIndex, final int pathIndex, final String name, final String path) { + if (path == null || name == null) { + return; + } + + String[] values = new String[len]; + if (nameIndex >= 0) { + values[nameIndex] = name; + } + if (pathIndex >= 0) { + values[pathIndex] = path; + } + cursor.addRow(profileValues(name, path, len, nameIndex, pathIndex)); + } + + protected Cursor getCursorForProfiles(final String[] args, Map profiles) { + // Compute the projection. + int nameIndex = -1; + int pathIndex = -1; + for (int i = 0; i < args.length; ++i) { + if (BrowserContract.Profiles.NAME.equals(args[i])) { + nameIndex = i; + } else if (BrowserContract.Profiles.PATH.equals(args[i])) { + pathIndex = i; + } + } + + final MatrixCursor cursor = new MatrixCursor(args); + for (Entry entry : profiles.entrySet()) { + addRowForProfile(cursor, args.length, nameIndex, pathIndex, entry.getKey(), entry.getValue()); + } + return cursor; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, + String[] selectionArgs, String sortOrder) { + + final String[] args = (projection == null) ? DEFAULT_ARGS : projection; + + final File mozillaDir; + try { + mozillaDir = GeckoProfileDirectories.getMozillaDirectory(getContext()); + } catch (NoMozillaDirectoryException e) { + Log.d(LOG_TAG, "No Mozilla directory; cannot query for profiles. Assuming there are none."); + return new MatrixCursor(projection); + } + + final Map matchingProfiles; + + final int match = URI_MATCHER.match(uri); + switch (match) { + case PROFILES: + // Return all profiles. + matchingProfiles = GeckoProfileDirectories.getAllProfiles(mozillaDir); + break; + case PROFILES_NAME: + // Return data about the specified profile. + final String name = uri.getLastPathSegment(); + matchingProfiles = GeckoProfileDirectories.getProfilesNamed(mozillaDir, + name); + break; + case PROFILES_DEFAULT: + matchingProfiles = GeckoProfileDirectories.getDefaultProfile(mozillaDir); + break; + default: + throw new UnsupportedOperationException("Unknown query URI " + uri); + } + + return getCursorForProfiles(args, matchingProfiles); + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + throw new IllegalStateException("Inserts not supported."); + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + throw new IllegalStateException("Deletes not supported."); + } + + @Override + public int update(Uri uri, ContentValues values, String selection, + String[] selectionArgs) { + throw new IllegalStateException("Updates not supported."); + } + +}