public static Path fromString(String s) { synchronized (Path.class) { String[] segments = split(s); Path current = sRoot; for (int i = 0; i < segments.length; i++) { current = current.getChild(segments[i]); } return current; } }
static void dumpAll(Path p, String prefix1, String prefix2) { synchronized (Path.class) { MediaObject obj = p.getObject(); Log.d( TAG, prefix1 + p.mSegment + ":" + (obj == null ? "null" : obj.getClass().getSimpleName())); if (p.mChildren != null) { ArrayList<String> childrenKeys = p.mChildren.keys(); int i = 0, n = childrenKeys.size(); for (String key : childrenKeys) { Path child = p.mChildren.get(key); if (child == null) { ++i; continue; } Log.d(TAG, prefix2 + "|"); if (++i < n) { dumpAll(child, prefix2 + "+-- ", prefix2 + "| "); } else { dumpAll(child, prefix2 + "+-- ", prefix2 + " "); } } } } }
public static Uri getUriFor(Context context, Path path) { if (sBaseUri == null) { sBaseUri = Uri.parse("content://" + context.getPackageName() + ".provider"); } return sBaseUri .buildUpon() .appendEncodedPath(path.toString().substring(1)) // ignore the leading '/' .build(); }
// TODO: consider concurrent access @Override public String getType(Uri uri) { long token = Binder.clearCallingIdentity(); try { Path path = Path.fromString(uri.getPath()); MediaItem item = (MediaItem) mDataManager.getMediaObject(path); return item != null ? item.getMimeType() : null; } finally { Binder.restoreCallingIdentity(token); } }
// TODO: consider concurrent access @Override public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { long token = Binder.clearCallingIdentity(); try { Path path = Path.fromString(uri.getPath()); MediaObject object = mDataManager.getMediaObject(path); if (object == null) { Log.w(TAG, "cannot find: " + uri); return null; } return null; } finally { Binder.restoreCallingIdentity(token); } }
@Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { long token = Binder.clearCallingIdentity(); try { if (mode.contains("w")) { throw new FileNotFoundException("cannot open file for write"); } Path path = Path.fromString(uri.getPath()); MediaObject object = mDataManager.getMediaObject(path); if (object == null) { throw new FileNotFoundException(uri.toString()); } throw new FileNotFoundException("unspported type: " + object); } finally { Binder.restoreCallingIdentity(token); } }