package com.seafile.seadroid2.cameraupload;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import com.seafile.seadroid2.data.StorageManager;
import java.util.ArrayList;
import java.util.List;
/**
* Helper class to fetch the list of buckets (Gallery folders) from the
* media content providers.
*/
public class GalleryBucketUtils {
private static final String DEBUG_TAG = "GalleryBucketUtils";
/**
* Per default we will upload images/videos from these buckets
*
* - https://en.wikipedia.org/wiki/Design_rule_for_Camera_File_system
* - https://stackoverflow.com/questions/6248887/android-device-specific-camera-path-issue
*/
public static final String[] CAMERA_BUCKET_NAMES = {"Camera", "100ANDRO", "100MEDIA"};
public static class Bucket {
public String id;
public String name;
public int image_id = -1;
public boolean isCameraBucket;
}
/**
* Fetch the list of buckets.
*
* Image and Video buckets are merged into one list. Duplicates are removed.
*
* @param context
* @return the list of buckets.
*/
public static List<Bucket> getMediaBuckets(Context context) {
List<Bucket> video = getVideoBuckets(context);
List<Bucket> image = getImageBuckets(context);
List<Bucket> merged = image;
VIDEO: for (Bucket v: video) {
for (Bucket i: image) {
if (v.id.equals(i.id))
continue VIDEO;
}
merged.add(v);
}
return merged;
}
private static List<Bucket> getVideoBuckets(Context context) {
Uri images = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String[] projection = new String[]{
MediaStore.Video.Media.BUCKET_ID,
MediaStore.Video.Media.BUCKET_DISPLAY_NAME,
MediaStore.Video.Media.DATA
};
String BUCKET_ORDER_BY = MediaStore.Video.Media.BUCKET_DISPLAY_NAME + " ASC";
String BUCKET_GROUP_BY = "1) GROUP BY 1,(2";
Cursor cursor = context.getContentResolver().query(images,
projection, // Which columns to return
BUCKET_GROUP_BY, // Which rows to return (all rows)
null, // Selection arguments (none)
BUCKET_ORDER_BY // Ordering
);
List<Bucket> buckets = new ArrayList<Bucket>();
if (cursor == null) {
return buckets;
}
while (cursor.moveToNext()) {
int bucketIdColumnIndex = cursor.getColumnIndex(MediaStore.Video.Media.BUCKET_ID);
int bucketColumnIndex = cursor.getColumnIndex(MediaStore.Video.Media.BUCKET_DISPLAY_NAME);
int dataColumnIndex = cursor.getColumnIndex(MediaStore.Video.Media.DATA);
Bucket b = new Bucket();
b.id = cursor.getString(bucketIdColumnIndex);
b.name = cursor.getString(bucketColumnIndex);
b.isCameraBucket = false;
for (String name: CAMERA_BUCKET_NAMES) {
if (b.name.equalsIgnoreCase(name)) {
b.isCameraBucket = true;
}
}
// ignore buckets created by Seadroid
String file = cursor.getString(dataColumnIndex);
if (file == null || !file.startsWith(StorageManager.getInstance().getMediaDir().getAbsolutePath()))
buckets.add(b);
}
cursor.close();
return buckets;
}
private static List<Bucket> getImageBuckets(Context context) {
Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = new String[]{
MediaStore.Images.Media.BUCKET_ID,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Video.Media.DATA,
MediaStore.Images.Media._ID
};
String BUCKET_ORDER_BY = MediaStore.Images.Media.BUCKET_DISPLAY_NAME + " ASC";
String BUCKET_GROUP_BY = "1) GROUP BY 1,(2";
Cursor cursor = context.getContentResolver().query(images,
projection, // Which columns to return
BUCKET_GROUP_BY, // Which rows to return (all rows)
null, // Selection arguments (none)
BUCKET_ORDER_BY // Ordering
);
List<Bucket> buckets = new ArrayList<Bucket>();
if (cursor == null) {
return buckets;
}
while (cursor.moveToNext()) {
int bucketIdColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID);
int bucketColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
int dataColumnIndex = cursor.getColumnIndex(MediaStore.Video.Media.DATA);
int idColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID);
Bucket b = new Bucket();
b.id = cursor.getString(bucketIdColumnIndex);
b.name = cursor.getString(bucketColumnIndex);
b.image_id = cursor.getInt(idColumnIndex);
b.isCameraBucket = false;
for (String name: CAMERA_BUCKET_NAMES) {
if (b.name.equalsIgnoreCase(name)) {
b.isCameraBucket = true;
}
}
// ignore buckets created by Seadroid
String file = cursor.getString(dataColumnIndex);
if (file == null || !file.startsWith(StorageManager.getInstance().getMediaDir().getAbsolutePath()))
buckets.add(b);
}
cursor.close();
return buckets;
}
}