RecentsProviderpublic class RecentsProvider extends android.content.ContentProvider
Fields Summary |
---|
private static final String | TAG | private static final long | MAX_HISTORY_IN_MILLIS | private static final String | AUTHORITY | private static final android.content.UriMatcher | sMatcher | private static final int | URI_RECENT | private static final int | URI_STATE | private static final int | URI_RESUME | public static final String | METHOD_PURGE | public static final String | METHOD_PURGE_PACKAGE | public static final String | TABLE_RECENT | public static final String | TABLE_STATE | public static final String | TABLE_RESUME | private DatabaseHelper | mHelper |
Methods Summary |
---|
public static android.net.Uri | buildRecent()
return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
.authority(AUTHORITY).appendPath("recent").build();
| public static android.net.Uri | buildResume(java.lang.String packageName)
return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
.authority(AUTHORITY).appendPath("resume").appendPath(packageName).build();
| public static android.net.Uri | buildState(java.lang.String authority, java.lang.String rootId, java.lang.String documentId)
return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(AUTHORITY)
.appendPath("state").appendPath(authority).appendPath(rootId).appendPath(documentId)
.build();
| public android.os.Bundle | call(java.lang.String method, java.lang.String arg, android.os.Bundle extras)
if (METHOD_PURGE.equals(method)) {
// Purge references to unknown authorities
final Intent intent = new Intent(DocumentsContract.PROVIDER_INTERFACE);
final Set<String> knownAuth = Sets.newHashSet();
for (ResolveInfo info : getContext()
.getPackageManager().queryIntentContentProviders(intent, 0)) {
knownAuth.add(info.providerInfo.authority);
}
purgeByAuthority(new Predicate<String>() {
@Override
public boolean apply(String authority) {
// Purge unknown authorities
return !knownAuth.contains(authority);
}
});
return null;
} else if (METHOD_PURGE_PACKAGE.equals(method)) {
// Purge references to authorities in given package
final Intent intent = new Intent(DocumentsContract.PROVIDER_INTERFACE);
intent.setPackage(arg);
final Set<String> packageAuth = Sets.newHashSet();
for (ResolveInfo info : getContext()
.getPackageManager().queryIntentContentProviders(intent, 0)) {
packageAuth.add(info.providerInfo.authority);
}
if (!packageAuth.isEmpty()) {
purgeByAuthority(new Predicate<String>() {
@Override
public boolean apply(String authority) {
// Purge authority matches
return packageAuth.contains(authority);
}
});
}
return null;
} else {
return super.call(method, arg, extras);
}
| public int | delete(android.net.Uri uri, java.lang.String selection, java.lang.String[] selectionArgs)
throw new UnsupportedOperationException("Unsupported Uri " + uri);
| public java.lang.String | getType(android.net.Uri uri)
return null;
| public android.net.Uri | insert(android.net.Uri uri, android.content.ContentValues values)
final SQLiteDatabase db = mHelper.getWritableDatabase();
final ContentValues key = new ContentValues();
switch (sMatcher.match(uri)) {
case URI_RECENT:
values.put(RecentColumns.TIMESTAMP, System.currentTimeMillis());
db.insert(TABLE_RECENT, null, values);
final long cutoff = System.currentTimeMillis() - MAX_HISTORY_IN_MILLIS;
db.delete(TABLE_RECENT, RecentColumns.TIMESTAMP + "<" + cutoff, null);
return uri;
case URI_STATE:
final String authority = uri.getPathSegments().get(1);
final String rootId = uri.getPathSegments().get(2);
final String documentId = uri.getPathSegments().get(3);
key.put(StateColumns.AUTHORITY, authority);
key.put(StateColumns.ROOT_ID, rootId);
key.put(StateColumns.DOCUMENT_ID, documentId);
// Ensure that row exists, then update with changed values
db.insertWithOnConflict(TABLE_STATE, null, key, SQLiteDatabase.CONFLICT_IGNORE);
db.update(TABLE_STATE, values, StateColumns.AUTHORITY + "=? AND "
+ StateColumns.ROOT_ID + "=? AND " + StateColumns.DOCUMENT_ID + "=?",
new String[] { authority, rootId, documentId });
return uri;
case URI_RESUME:
values.put(ResumeColumns.TIMESTAMP, System.currentTimeMillis());
final String packageName = uri.getPathSegments().get(1);
key.put(ResumeColumns.PACKAGE_NAME, packageName);
// Ensure that row exists, then update with changed values
db.insertWithOnConflict(TABLE_RESUME, null, key, SQLiteDatabase.CONFLICT_IGNORE);
db.update(TABLE_RESUME, values, ResumeColumns.PACKAGE_NAME + "=?",
new String[] { packageName });
return uri;
default:
throw new UnsupportedOperationException("Unsupported Uri " + uri);
}
| public boolean | onCreate()
mHelper = new DatabaseHelper(getContext());
return true;
| private void | purgeByAuthority(com.android.internal.util.Predicate predicate)Purge all internal data whose authority matches the given
{@link Predicate}.
final SQLiteDatabase db = mHelper.getWritableDatabase();
final DocumentStack stack = new DocumentStack();
Cursor cursor = db.query(TABLE_RECENT, null, null, null, null, null, null);
try {
while (cursor.moveToNext()) {
try {
final byte[] rawStack = cursor.getBlob(
cursor.getColumnIndex(RecentColumns.STACK));
DurableUtils.readFromArray(rawStack, stack);
if (stack.root != null && predicate.apply(stack.root.authority)) {
final String key = getCursorString(cursor, RecentColumns.KEY);
db.delete(TABLE_RECENT, RecentColumns.KEY + "=?", new String[] { key });
}
} catch (IOException ignored) {
}
}
} finally {
IoUtils.closeQuietly(cursor);
}
cursor = db.query(TABLE_STATE, new String[] {
StateColumns.AUTHORITY }, null, null, StateColumns.AUTHORITY, null, null);
try {
while (cursor.moveToNext()) {
final String authority = getCursorString(cursor, StateColumns.AUTHORITY);
if (predicate.apply(authority)) {
db.delete(TABLE_STATE, StateColumns.AUTHORITY + "=?", new String[] {
authority });
Log.d(TAG, "Purged state for " + authority);
}
}
} finally {
IoUtils.closeQuietly(cursor);
}
cursor = db.query(TABLE_RESUME, null, null, null, null, null, null);
try {
while (cursor.moveToNext()) {
try {
final byte[] rawStack = cursor.getBlob(
cursor.getColumnIndex(ResumeColumns.STACK));
DurableUtils.readFromArray(rawStack, stack);
if (stack.root != null && predicate.apply(stack.root.authority)) {
final String packageName = getCursorString(
cursor, ResumeColumns.PACKAGE_NAME);
db.delete(TABLE_RESUME, ResumeColumns.PACKAGE_NAME + "=?",
new String[] { packageName });
}
} catch (IOException ignored) {
}
}
} finally {
IoUtils.closeQuietly(cursor);
}
| public android.database.Cursor | query(android.net.Uri uri, java.lang.String[] projection, java.lang.String selection, java.lang.String[] selectionArgs, java.lang.String sortOrder)
final SQLiteDatabase db = mHelper.getReadableDatabase();
switch (sMatcher.match(uri)) {
case URI_RECENT:
final long cutoff = System.currentTimeMillis() - MAX_HISTORY_IN_MILLIS;
return db.query(TABLE_RECENT, projection, RecentColumns.TIMESTAMP + ">" + cutoff,
null, null, null, sortOrder);
case URI_STATE:
final String authority = uri.getPathSegments().get(1);
final String rootId = uri.getPathSegments().get(2);
final String documentId = uri.getPathSegments().get(3);
return db.query(TABLE_STATE, projection, StateColumns.AUTHORITY + "=? AND "
+ StateColumns.ROOT_ID + "=? AND " + StateColumns.DOCUMENT_ID + "=?",
new String[] { authority, rootId, documentId }, null, null, sortOrder);
case URI_RESUME:
final String packageName = uri.getPathSegments().get(1);
return db.query(TABLE_RESUME, projection, ResumeColumns.PACKAGE_NAME + "=?",
new String[] { packageName }, null, null, sortOrder);
default:
throw new UnsupportedOperationException("Unsupported Uri " + uri);
}
| public int | update(android.net.Uri uri, android.content.ContentValues values, java.lang.String selection, java.lang.String[] selectionArgs)
throw new UnsupportedOperationException("Unsupported Uri " + uri);
|
|