mirror of
https://github.com/KokaKiwi/BarInsta
synced 2024-11-22 22:57:29 +00:00
Fix audio recording in dm
This commit is contained in:
parent
8030c7f220
commit
bca38a2645
@ -20,7 +20,6 @@
|
|||||||
android:fullBackupContent="@xml/backup_descriptor"
|
android:fullBackupContent="@xml/backup_descriptor"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:requestLegacyExternalStorage="true"
|
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/AppTheme.Launcher"
|
android:theme="@style/AppTheme.Launcher"
|
||||||
tools:ignore="UnusedAttribute">
|
tools:ignore="UnusedAttribute">
|
||||||
|
@ -26,7 +26,6 @@ import awais.instagrabber.R;
|
|||||||
import awais.instagrabber.adapters.MediaItemsAdapter;
|
import awais.instagrabber.adapters.MediaItemsAdapter;
|
||||||
import awais.instagrabber.databinding.LayoutMediaPickerBinding;
|
import awais.instagrabber.databinding.LayoutMediaPickerBinding;
|
||||||
import awais.instagrabber.utils.MediaController;
|
import awais.instagrabber.utils.MediaController;
|
||||||
import awais.instagrabber.utils.PermissionUtils;
|
|
||||||
import awais.instagrabber.utils.TextUtils;
|
import awais.instagrabber.utils.TextUtils;
|
||||||
import awais.instagrabber.viewmodels.MediaPickerViewModel;
|
import awais.instagrabber.viewmodels.MediaPickerViewModel;
|
||||||
|
|
||||||
@ -121,10 +120,10 @@ public class MediaPickerBottomDialogFragment extends BottomSheetDialogFragment {
|
|||||||
if (requestCode == ATTACH_MEDIA_REQUEST_CODE) {
|
if (requestCode == ATTACH_MEDIA_REQUEST_CODE) {
|
||||||
final Context context = getContext();
|
final Context context = getContext();
|
||||||
if (context == null) return;
|
if (context == null) return;
|
||||||
final boolean hasAttachMediaPerms = PermissionUtils.hasAttachMediaPerms(context);
|
// final boolean hasAttachMediaPerms = PermissionUtils.hasAttachMediaPerms(context);
|
||||||
if (hasAttachMediaPerms) {
|
// if (hasAttachMediaPerms) {
|
||||||
viewModel.loadMedia(context);
|
viewModel.loadMedia(context);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,10 +132,10 @@ public class MediaPickerBottomDialogFragment extends BottomSheetDialogFragment {
|
|||||||
setupAlbumPicker();
|
setupAlbumPicker();
|
||||||
final Context context = getContext();
|
final Context context = getContext();
|
||||||
if (context == null) return;
|
if (context == null) return;
|
||||||
if (!PermissionUtils.hasAttachMediaPerms(context)) {
|
// if (!PermissionUtils.hasAttachMediaPerms(context)) {
|
||||||
PermissionUtils.requestAttachMediaPerms(this, ATTACH_MEDIA_REQUEST_CODE);
|
// PermissionUtils.requestAttachMediaPerms(this, ATTACH_MEDIA_REQUEST_CODE);
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
viewModel.loadMedia(context);
|
viewModel.loadMedia(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ public final class DownloadUtils {
|
|||||||
private static final String DIR_DOWNLOADS = "Downloads";
|
private static final String DIR_DOWNLOADS = "Downloads";
|
||||||
private static final String DIR_CAMERA = "Camera";
|
private static final String DIR_CAMERA = "Camera";
|
||||||
private static final String DIR_EDIT = "Edit";
|
private static final String DIR_EDIT = "Edit";
|
||||||
private static final String DIR_RECORDINGS = "Recordings";
|
private static final String DIR_RECORDINGS = "Sent Recordings";
|
||||||
private static final String DIR_TEMP = "Temp";
|
private static final String DIR_TEMP = "Temp";
|
||||||
private static final String DIR_BACKUPS = "Backups";
|
private static final String DIR_BACKUPS = "Backups";
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ public final class DownloadUtils {
|
|||||||
throw new ReselectDocumentTreeException(uri);
|
throw new ReselectDocumentTreeException(uri);
|
||||||
}
|
}
|
||||||
root = DocumentFile.fromTreeUri(context, uri);
|
root = DocumentFile.fromTreeUri(context, uri);
|
||||||
Log.d(TAG, "init: " + root);
|
// Log.d(TAG, "init: " + root);
|
||||||
// final File parent = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
|
// final File parent = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
|
||||||
// final DocumentFile documentFile = DocumentFile.fromFile(parent);
|
// final DocumentFile documentFile = DocumentFile.fromFile(parent);
|
||||||
// Log.d(TAG, "init: " + documentFile);
|
// Log.d(TAG, "init: " + documentFile);
|
||||||
@ -111,9 +111,8 @@ public final class DownloadUtils {
|
|||||||
if (dirs != null) {
|
if (dirs != null) {
|
||||||
for (final String dir : dirs) {
|
for (final String dir : dirs) {
|
||||||
final DocumentFile subDirFile = subDir.findFile(dir);
|
final DocumentFile subDirFile = subDir.findFile(dir);
|
||||||
if (subDirFile == null) {
|
final boolean exists = subDirFile != null && subDirFile.exists();
|
||||||
subDir = subDir.createDirectory(dir);
|
subDir = exists ? subDirFile : subDir.createDirectory(dir);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return subDir;
|
return subDir;
|
||||||
|
@ -87,83 +87,83 @@ public class MediaController {
|
|||||||
|
|
||||||
Cursor cursor = null;
|
Cursor cursor = null;
|
||||||
try {
|
try {
|
||||||
if (PermissionUtils.hasAttachMediaPerms(context)) {
|
// if (PermissionUtils.hasAttachMediaPerms(context)) {
|
||||||
cursor = MediaStore.Images.Media.query(context.getContentResolver(),
|
cursor = MediaStore.Images.Media.query(context.getContentResolver(),
|
||||||
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
|
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
|
||||||
PROJECTION_PHOTOS,
|
PROJECTION_PHOTOS,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
(Build.VERSION.SDK_INT > 28
|
(Build.VERSION.SDK_INT > 28
|
||||||
? MediaStore.Images.Media.DATE_TAKEN
|
? MediaStore.Images.Media.DATE_TAKEN
|
||||||
: MediaStore.Images.Media.DATE_MODIFIED) + " DESC");
|
: MediaStore.Images.Media.DATE_MODIFIED) + " DESC");
|
||||||
if (cursor != null) {
|
if (cursor != null) {
|
||||||
int imageIdColumn = cursor.getColumnIndex(MediaStore.Images.Media._ID);
|
int imageIdColumn = cursor.getColumnIndex(MediaStore.Images.Media._ID);
|
||||||
int bucketIdColumn = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID);
|
int bucketIdColumn = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID);
|
||||||
int bucketNameColumn = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
|
int bucketNameColumn = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
|
||||||
int dataColumn = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
|
int dataColumn = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
|
||||||
int dateColumn = cursor.getColumnIndex(Build.VERSION.SDK_INT > 28 ? MediaStore.Images.Media.DATE_TAKEN
|
int dateColumn = cursor.getColumnIndex(Build.VERSION.SDK_INT > 28 ? MediaStore.Images.Media.DATE_TAKEN
|
||||||
: MediaStore.Images.Media.DATE_MODIFIED);
|
: MediaStore.Images.Media.DATE_MODIFIED);
|
||||||
int orientationColumn = cursor.getColumnIndex(MediaStore.Images.Media.ORIENTATION);
|
int orientationColumn = cursor.getColumnIndex(MediaStore.Images.Media.ORIENTATION);
|
||||||
int widthColumn = cursor.getColumnIndex(MediaStore.Images.Media.WIDTH);
|
int widthColumn = cursor.getColumnIndex(MediaStore.Images.Media.WIDTH);
|
||||||
int heightColumn = cursor.getColumnIndex(MediaStore.Images.Media.HEIGHT);
|
int heightColumn = cursor.getColumnIndex(MediaStore.Images.Media.HEIGHT);
|
||||||
int sizeColumn = cursor.getColumnIndex(MediaStore.Images.Media.SIZE);
|
int sizeColumn = cursor.getColumnIndex(MediaStore.Images.Media.SIZE);
|
||||||
|
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
String path = cursor.getString(dataColumn);
|
String path = cursor.getString(dataColumn);
|
||||||
if (TextUtils.isEmpty(path)) {
|
if (TextUtils.isEmpty(path)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
int imageId = cursor.getInt(imageIdColumn);
|
|
||||||
int bucketId = cursor.getInt(bucketIdColumn);
|
|
||||||
String bucketName = cursor.getString(bucketNameColumn);
|
|
||||||
long dateTaken = cursor.getLong(dateColumn);
|
|
||||||
int orientation = cursor.getInt(orientationColumn);
|
|
||||||
int width = cursor.getInt(widthColumn);
|
|
||||||
int height = cursor.getInt(heightColumn);
|
|
||||||
long size = cursor.getLong(sizeColumn);
|
|
||||||
|
|
||||||
MediaEntry mediaEntry = new MediaEntry(bucketId, imageId, dateTaken, path, orientation, -1, false, width, height, size);
|
|
||||||
|
|
||||||
if (allPhotosAlbum == null) {
|
|
||||||
allPhotosAlbum = new AlbumEntry(0, context.getString(R.string.all_photos), mediaEntry);
|
|
||||||
photoAlbumsSorted.add(0, allPhotosAlbum);
|
|
||||||
}
|
|
||||||
if (allMediaAlbum == null) {
|
|
||||||
allMediaAlbum = new AlbumEntry(0, context.getString(R.string.all_media), mediaEntry);
|
|
||||||
mediaAlbumsSorted.add(0, allMediaAlbum);
|
|
||||||
}
|
|
||||||
allPhotosAlbum.addPhoto(mediaEntry);
|
|
||||||
allMediaAlbum.addPhoto(mediaEntry);
|
|
||||||
|
|
||||||
AlbumEntry albumEntry = mediaAlbums.get(bucketId);
|
|
||||||
if (albumEntry == null) {
|
|
||||||
albumEntry = new AlbumEntry(bucketId, bucketName, mediaEntry);
|
|
||||||
mediaAlbums.put(bucketId, albumEntry);
|
|
||||||
if (mediaCameraAlbumId == null && cameraFolder != null && path.startsWith(cameraFolder)) {
|
|
||||||
mediaAlbumsSorted.add(0, albumEntry);
|
|
||||||
mediaCameraAlbumId = bucketId;
|
|
||||||
} else {
|
|
||||||
mediaAlbumsSorted.add(albumEntry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
albumEntry.addPhoto(mediaEntry);
|
|
||||||
|
|
||||||
albumEntry = photoAlbums.get(bucketId);
|
|
||||||
if (albumEntry == null) {
|
|
||||||
albumEntry = new AlbumEntry(bucketId, bucketName, mediaEntry);
|
|
||||||
photoAlbums.put(bucketId, albumEntry);
|
|
||||||
if (photoCameraAlbumId == null && cameraFolder != null && path.startsWith(cameraFolder)) {
|
|
||||||
photoAlbumsSorted.add(0, albumEntry);
|
|
||||||
photoCameraAlbumId = bucketId;
|
|
||||||
} else {
|
|
||||||
photoAlbumsSorted.add(albumEntry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
albumEntry.addPhoto(mediaEntry);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int imageId = cursor.getInt(imageIdColumn);
|
||||||
|
int bucketId = cursor.getInt(bucketIdColumn);
|
||||||
|
String bucketName = cursor.getString(bucketNameColumn);
|
||||||
|
long dateTaken = cursor.getLong(dateColumn);
|
||||||
|
int orientation = cursor.getInt(orientationColumn);
|
||||||
|
int width = cursor.getInt(widthColumn);
|
||||||
|
int height = cursor.getInt(heightColumn);
|
||||||
|
long size = cursor.getLong(sizeColumn);
|
||||||
|
|
||||||
|
MediaEntry mediaEntry = new MediaEntry(bucketId, imageId, dateTaken, path, orientation, -1, false, width, height, size);
|
||||||
|
|
||||||
|
if (allPhotosAlbum == null) {
|
||||||
|
allPhotosAlbum = new AlbumEntry(0, context.getString(R.string.all_photos), mediaEntry);
|
||||||
|
photoAlbumsSorted.add(0, allPhotosAlbum);
|
||||||
|
}
|
||||||
|
if (allMediaAlbum == null) {
|
||||||
|
allMediaAlbum = new AlbumEntry(0, context.getString(R.string.all_media), mediaEntry);
|
||||||
|
mediaAlbumsSorted.add(0, allMediaAlbum);
|
||||||
|
}
|
||||||
|
allPhotosAlbum.addPhoto(mediaEntry);
|
||||||
|
allMediaAlbum.addPhoto(mediaEntry);
|
||||||
|
|
||||||
|
AlbumEntry albumEntry = mediaAlbums.get(bucketId);
|
||||||
|
if (albumEntry == null) {
|
||||||
|
albumEntry = new AlbumEntry(bucketId, bucketName, mediaEntry);
|
||||||
|
mediaAlbums.put(bucketId, albumEntry);
|
||||||
|
if (mediaCameraAlbumId == null && cameraFolder != null && path.startsWith(cameraFolder)) {
|
||||||
|
mediaAlbumsSorted.add(0, albumEntry);
|
||||||
|
mediaCameraAlbumId = bucketId;
|
||||||
|
} else {
|
||||||
|
mediaAlbumsSorted.add(albumEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
albumEntry.addPhoto(mediaEntry);
|
||||||
|
|
||||||
|
albumEntry = photoAlbums.get(bucketId);
|
||||||
|
if (albumEntry == null) {
|
||||||
|
albumEntry = new AlbumEntry(bucketId, bucketName, mediaEntry);
|
||||||
|
photoAlbums.put(bucketId, albumEntry);
|
||||||
|
if (photoCameraAlbumId == null && cameraFolder != null && path.startsWith(cameraFolder)) {
|
||||||
|
photoAlbumsSorted.add(0, albumEntry);
|
||||||
|
photoCameraAlbumId = bucketId;
|
||||||
|
} else {
|
||||||
|
photoAlbumsSorted.add(albumEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
albumEntry.addPhoto(mediaEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// }
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Log.e(TAG, "loadGalleryAlbums: ", e);
|
Log.e(TAG, "loadGalleryAlbums: ", e);
|
||||||
} finally {
|
} finally {
|
||||||
@ -177,79 +177,79 @@ public class MediaController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (PermissionUtils.hasAttachMediaPerms(context)) {
|
// if (PermissionUtils.hasAttachMediaPerms(context)) {
|
||||||
cursor = MediaStore.Images.Media.query(context.getContentResolver(),
|
cursor = MediaStore.Images.Media.query(context.getContentResolver(),
|
||||||
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
|
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
|
||||||
PROJECTION_VIDEO,
|
PROJECTION_VIDEO,
|
||||||
MediaStore.Video.Media.MIME_TYPE + "=?",
|
MediaStore.Video.Media.MIME_TYPE + "=?",
|
||||||
new String[]{"video/mp4"},
|
new String[]{"video/mp4"},
|
||||||
(Build.VERSION.SDK_INT > 28
|
(Build.VERSION.SDK_INT > 28
|
||||||
? MediaStore.Video.Media.DATE_TAKEN
|
? MediaStore.Video.Media.DATE_TAKEN
|
||||||
: MediaStore.Video.Media.DATE_MODIFIED) + " DESC");
|
: MediaStore.Video.Media.DATE_MODIFIED) + " DESC");
|
||||||
if (cursor != null) {
|
if (cursor != null) {
|
||||||
int imageIdColumn = cursor.getColumnIndex(MediaStore.Video.Media._ID);
|
int imageIdColumn = cursor.getColumnIndex(MediaStore.Video.Media._ID);
|
||||||
int bucketIdColumn = cursor.getColumnIndex(MediaStore.Video.Media.BUCKET_ID);
|
int bucketIdColumn = cursor.getColumnIndex(MediaStore.Video.Media.BUCKET_ID);
|
||||||
int bucketNameColumn = cursor.getColumnIndex(MediaStore.Video.Media.BUCKET_DISPLAY_NAME);
|
int bucketNameColumn = cursor.getColumnIndex(MediaStore.Video.Media.BUCKET_DISPLAY_NAME);
|
||||||
int dataColumn = cursor.getColumnIndex(MediaStore.Video.Media.DATA);
|
int dataColumn = cursor.getColumnIndex(MediaStore.Video.Media.DATA);
|
||||||
int dateColumn = cursor.getColumnIndex(Build.VERSION.SDK_INT > 28 ? MediaStore.Video.Media.DATE_TAKEN
|
int dateColumn = cursor.getColumnIndex(Build.VERSION.SDK_INT > 28 ? MediaStore.Video.Media.DATE_TAKEN
|
||||||
: MediaStore.Video.Media.DATE_MODIFIED);
|
: MediaStore.Video.Media.DATE_MODIFIED);
|
||||||
int durationColumn = cursor.getColumnIndex(MediaStore.Video.Media.DURATION);
|
int durationColumn = cursor.getColumnIndex(MediaStore.Video.Media.DURATION);
|
||||||
int widthColumn = cursor.getColumnIndex(MediaStore.Video.Media.WIDTH);
|
int widthColumn = cursor.getColumnIndex(MediaStore.Video.Media.WIDTH);
|
||||||
int heightColumn = cursor.getColumnIndex(MediaStore.Video.Media.HEIGHT);
|
int heightColumn = cursor.getColumnIndex(MediaStore.Video.Media.HEIGHT);
|
||||||
int sizeColumn = cursor.getColumnIndex(MediaStore.Video.Media.SIZE);
|
int sizeColumn = cursor.getColumnIndex(MediaStore.Video.Media.SIZE);
|
||||||
|
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
String path = cursor.getString(dataColumn);
|
String path = cursor.getString(dataColumn);
|
||||||
if (TextUtils.isEmpty(path)) {
|
if (TextUtils.isEmpty(path)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
int imageId = cursor.getInt(imageIdColumn);
|
|
||||||
int bucketId = cursor.getInt(bucketIdColumn);
|
|
||||||
String bucketName = cursor.getString(bucketNameColumn);
|
|
||||||
long dateTaken = cursor.getLong(dateColumn);
|
|
||||||
long duration = cursor.getLong(durationColumn);
|
|
||||||
int width = cursor.getInt(widthColumn);
|
|
||||||
int height = cursor.getInt(heightColumn);
|
|
||||||
long size = cursor.getLong(sizeColumn);
|
|
||||||
|
|
||||||
MediaEntry mediaEntry = new MediaEntry(bucketId, imageId, dateTaken, path, -1, duration, true, width, height, size);
|
|
||||||
|
|
||||||
if (allVideosAlbum == null) {
|
|
||||||
allVideosAlbum = new AlbumEntry(0, context.getString(R.string.all_videos), mediaEntry);
|
|
||||||
allVideosAlbum.videoOnly = true;
|
|
||||||
int index = 0;
|
|
||||||
if (allMediaAlbum != null) {
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
if (allPhotosAlbum != null) {
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
mediaAlbumsSorted.add(index, allVideosAlbum);
|
|
||||||
}
|
|
||||||
if (allMediaAlbum == null) {
|
|
||||||
allMediaAlbum = new AlbumEntry(0, context.getString(R.string.all_media), mediaEntry);
|
|
||||||
mediaAlbumsSorted.add(0, allMediaAlbum);
|
|
||||||
}
|
|
||||||
allVideosAlbum.addPhoto(mediaEntry);
|
|
||||||
allMediaAlbum.addPhoto(mediaEntry);
|
|
||||||
|
|
||||||
AlbumEntry albumEntry = mediaAlbums.get(bucketId);
|
|
||||||
if (albumEntry == null) {
|
|
||||||
albumEntry = new AlbumEntry(bucketId, bucketName, mediaEntry);
|
|
||||||
mediaAlbums.put(bucketId, albumEntry);
|
|
||||||
if (mediaCameraAlbumId == null && cameraFolder != null && path.startsWith(cameraFolder)) {
|
|
||||||
mediaAlbumsSorted.add(0, albumEntry);
|
|
||||||
mediaCameraAlbumId = bucketId;
|
|
||||||
} else {
|
|
||||||
mediaAlbumsSorted.add(albumEntry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
albumEntry.addPhoto(mediaEntry);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int imageId = cursor.getInt(imageIdColumn);
|
||||||
|
int bucketId = cursor.getInt(bucketIdColumn);
|
||||||
|
String bucketName = cursor.getString(bucketNameColumn);
|
||||||
|
long dateTaken = cursor.getLong(dateColumn);
|
||||||
|
long duration = cursor.getLong(durationColumn);
|
||||||
|
int width = cursor.getInt(widthColumn);
|
||||||
|
int height = cursor.getInt(heightColumn);
|
||||||
|
long size = cursor.getLong(sizeColumn);
|
||||||
|
|
||||||
|
MediaEntry mediaEntry = new MediaEntry(bucketId, imageId, dateTaken, path, -1, duration, true, width, height, size);
|
||||||
|
|
||||||
|
if (allVideosAlbum == null) {
|
||||||
|
allVideosAlbum = new AlbumEntry(0, context.getString(R.string.all_videos), mediaEntry);
|
||||||
|
allVideosAlbum.videoOnly = true;
|
||||||
|
int index = 0;
|
||||||
|
if (allMediaAlbum != null) {
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
if (allPhotosAlbum != null) {
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
mediaAlbumsSorted.add(index, allVideosAlbum);
|
||||||
|
}
|
||||||
|
if (allMediaAlbum == null) {
|
||||||
|
allMediaAlbum = new AlbumEntry(0, context.getString(R.string.all_media), mediaEntry);
|
||||||
|
mediaAlbumsSorted.add(0, allMediaAlbum);
|
||||||
|
}
|
||||||
|
allVideosAlbum.addPhoto(mediaEntry);
|
||||||
|
allMediaAlbum.addPhoto(mediaEntry);
|
||||||
|
|
||||||
|
AlbumEntry albumEntry = mediaAlbums.get(bucketId);
|
||||||
|
if (albumEntry == null) {
|
||||||
|
albumEntry = new AlbumEntry(bucketId, bucketName, mediaEntry);
|
||||||
|
mediaAlbums.put(bucketId, albumEntry);
|
||||||
|
if (mediaCameraAlbumId == null && cameraFolder != null && path.startsWith(cameraFolder)) {
|
||||||
|
mediaAlbumsSorted.add(0, albumEntry);
|
||||||
|
mediaCameraAlbumId = bucketId;
|
||||||
|
} else {
|
||||||
|
mediaAlbumsSorted.add(albumEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
albumEntry.addPhoto(mediaEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// }
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Log.e(TAG, "loadGalleryAlbums: ", e);
|
Log.e(TAG, "loadGalleryAlbums: ", e);
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -2,13 +2,17 @@ package awais.instagrabber.utils;
|
|||||||
|
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
|
import android.media.MediaMetadataRetriever;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.ParcelFileDescriptor;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import java.io.FileDescriptor;
|
||||||
|
|
||||||
public final class MediaUtils {
|
public final class MediaUtils {
|
||||||
private static final String TAG = MediaUtils.class.getSimpleName();
|
private static final String TAG = MediaUtils.class.getSimpleName();
|
||||||
private static final String[] PROJECTION_VIDEO = {
|
private static final String[] PROJECTION_VIDEO = {
|
||||||
@ -64,34 +68,24 @@ public final class MediaUtils {
|
|||||||
@NonNull final Uri uri,
|
@NonNull final Uri uri,
|
||||||
@NonNull final OnInfoLoadListener<VideoInfo> listener) {
|
@NonNull final OnInfoLoadListener<VideoInfo> listener) {
|
||||||
AppExecutors.getInstance().tasksThread().submit(() -> {
|
AppExecutors.getInstance().tasksThread().submit(() -> {
|
||||||
try (Cursor cursor = MediaStore.Video.query(contentResolver, uri, PROJECTION_AUDIO)) {
|
try (ParcelFileDescriptor parcelFileDescriptor = contentResolver.openFileDescriptor(uri, "r")) {
|
||||||
if (cursor == null) {
|
final FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
|
||||||
if (listener != null) {
|
final MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
|
||||||
listener.onLoad(null);
|
mediaMetadataRetriever.setDataSource(fileDescriptor);
|
||||||
}
|
final String duration = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
|
||||||
return;
|
if (listener != null) {
|
||||||
}
|
listener.onLoad(new VideoInfo(
|
||||||
int durationColumn = cursor.getColumnIndex(MediaStore.Audio.Media.DURATION);
|
Long.parseLong(duration),
|
||||||
int sizeColumn = cursor.getColumnIndex(MediaStore.Audio.Media.SIZE);
|
0,
|
||||||
if (cursor.moveToNext()) {
|
0,
|
||||||
if (listener != null) {
|
0
|
||||||
listener.onLoad(new VideoInfo(
|
));
|
||||||
cursor.getLong(durationColumn),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
cursor.getLong(sizeColumn)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.e(TAG, "getVoiceInfo: ", e);
|
Log.e(TAG, "getVoiceInfo: ", e);
|
||||||
if (listener != null) {
|
if (listener != null) {
|
||||||
listener.onFailure(e);
|
listener.onFailure(e);
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (listener != null) {
|
|
||||||
listener.onLoad(null);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -11,32 +11,31 @@ import androidx.core.content.PermissionChecker;
|
|||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
import static android.Manifest.permission.CAMERA;
|
import static android.Manifest.permission.CAMERA;
|
||||||
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
|
|
||||||
import static android.Manifest.permission.RECORD_AUDIO;
|
import static android.Manifest.permission.RECORD_AUDIO;
|
||||||
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
|
|
||||||
import static androidx.core.content.PermissionChecker.checkSelfPermission;
|
import static androidx.core.content.PermissionChecker.checkSelfPermission;
|
||||||
|
|
||||||
public class PermissionUtils {
|
public class PermissionUtils {
|
||||||
public static final String[] AUDIO_RECORD_PERMS = new String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO};
|
public static final String[] AUDIO_RECORD_PERMS = new String[]{RECORD_AUDIO};
|
||||||
public static final String[] ATTACH_MEDIA_PERMS = new String[]{READ_EXTERNAL_STORAGE};
|
// public static final String[] ATTACH_MEDIA_PERMS = new String[]{READ_EXTERNAL_STORAGE};
|
||||||
public static final String[] CAMERA_PERMS = new String[]{CAMERA};
|
public static final String[] CAMERA_PERMS = new String[]{CAMERA};
|
||||||
|
|
||||||
public static boolean hasAudioRecordPerms(@NonNull final Context context) {
|
public static boolean hasAudioRecordPerms(@NonNull final Context context) {
|
||||||
return checkSelfPermission(context, WRITE_EXTERNAL_STORAGE) == PermissionChecker.PERMISSION_GRANTED
|
return // checkSelfPermission(context, WRITE_EXTERNAL_STORAGE) == PermissionChecker.PERMISSION_GRANTED
|
||||||
&& checkSelfPermission(context, RECORD_AUDIO) == PermissionChecker.PERMISSION_GRANTED;
|
// &&
|
||||||
|
checkSelfPermission(context, RECORD_AUDIO) == PermissionChecker.PERMISSION_GRANTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void requestAudioRecordPerms(final Fragment fragment, final int requestCode) {
|
public static void requestAudioRecordPerms(final Fragment fragment, final int requestCode) {
|
||||||
fragment.requestPermissions(AUDIO_RECORD_PERMS, requestCode);
|
fragment.requestPermissions(AUDIO_RECORD_PERMS, requestCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean hasAttachMediaPerms(@NonNull final Context context) {
|
// public static boolean hasAttachMediaPerms(@NonNull final Context context) {
|
||||||
return checkSelfPermission(context, READ_EXTERNAL_STORAGE) == PermissionChecker.PERMISSION_GRANTED;
|
// return checkSelfPermission(context, READ_EXTERNAL_STORAGE) == PermissionChecker.PERMISSION_GRANTED;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public static void requestAttachMediaPerms(final Fragment fragment, final int requestCode) {
|
// public static void requestAttachMediaPerms(final Fragment fragment, final int requestCode) {
|
||||||
fragment.requestPermissions(ATTACH_MEDIA_PERMS, requestCode);
|
// fragment.requestPermissions(ATTACH_MEDIA_PERMS, requestCode);
|
||||||
}
|
// }
|
||||||
|
|
||||||
public static boolean hasCameraPerms(final Context context) {
|
public static boolean hasCameraPerms(final Context context) {
|
||||||
return ContextCompat.checkSelfPermission(context, CAMERA) == PackageManager.PERMISSION_GRANTED;
|
return ContextCompat.checkSelfPermission(context, CAMERA) == PackageManager.PERMISSION_GRANTED;
|
||||||
|
@ -509,7 +509,11 @@ public final class Utils {
|
|||||||
public static void scanDocumentFile(@NonNull final Context context,
|
public static void scanDocumentFile(@NonNull final Context context,
|
||||||
@NonNull final DocumentFile documentFile,
|
@NonNull final DocumentFile documentFile,
|
||||||
@NonNull final OnScanCompletedListener callback) {
|
@NonNull final OnScanCompletedListener callback) {
|
||||||
if (!documentFile.isFile()) return;
|
if (!documentFile.isFile() || !documentFile.exists()) {
|
||||||
|
Log.d(TAG, "scanDocumentFile: " + documentFile);
|
||||||
|
callback.onScanCompleted(null, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
File file = null;
|
File file = null;
|
||||||
try {
|
try {
|
||||||
file = getDocumentFileRealPath(context, documentFile);
|
file = getDocumentFileRealPath(context, documentFile);
|
||||||
@ -532,6 +536,8 @@ public final class Utils {
|
|||||||
|
|
||||||
if (type.equalsIgnoreCase("primary")) {
|
if (type.equalsIgnoreCase("primary")) {
|
||||||
return new File(Environment.getExternalStorageDirectory(), split[1]);
|
return new File(Environment.getExternalStorageDirectory(), split[1]);
|
||||||
|
} else if (type.equalsIgnoreCase("raw")) {
|
||||||
|
return new File(split[1]);
|
||||||
} else {
|
} else {
|
||||||
if (volumes == null) {
|
if (volumes == null) {
|
||||||
final StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
|
final StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
|
||||||
|
@ -11,6 +11,7 @@ import android.webkit.MimeTypeMap;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.documentfile.provider.DocumentFile;
|
import androidx.documentfile.provider.DocumentFile;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -44,13 +45,14 @@ public class VoiceRecorder {
|
|||||||
|
|
||||||
public void startRecording(final Application application) {
|
public void startRecording(final Application application) {
|
||||||
stopped = false;
|
stopped = false;
|
||||||
|
ParcelFileDescriptor parcelFileDescriptor = null;
|
||||||
try {
|
try {
|
||||||
recorder = new MediaRecorder();
|
recorder = new MediaRecorder();
|
||||||
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
|
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
|
||||||
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
|
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
|
||||||
deleteTempAudioFile();
|
deleteTempAudioFile();
|
||||||
audioTempFile = getAudioRecordFile();
|
audioTempFile = getAudioRecordFile();
|
||||||
final ParcelFileDescriptor parcelFileDescriptor = application.getContentResolver().openFileDescriptor(audioTempFile.getUri(), "rwt");
|
parcelFileDescriptor = application.getContentResolver().openFileDescriptor(audioTempFile.getUri(), "rwt");
|
||||||
recorder.setOutputFile(parcelFileDescriptor.getFileDescriptor());
|
recorder.setOutputFile(parcelFileDescriptor.getFileDescriptor());
|
||||||
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
|
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
|
||||||
recorder.setAudioEncodingBitRate(AUDIO_BIT_RATE);
|
recorder.setAudioEncodingBitRate(AUDIO_BIT_RATE);
|
||||||
@ -66,6 +68,12 @@ public class VoiceRecorder {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.e(TAG, "Audio recording failed", e);
|
Log.e(TAG, "Audio recording failed", e);
|
||||||
deleteTempAudioFile();
|
deleteTempAudioFile();
|
||||||
|
} finally {
|
||||||
|
if (parcelFileDescriptor != null) {
|
||||||
|
try {
|
||||||
|
parcelFileDescriptor.close();
|
||||||
|
} catch (IOException ignored) {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,7 +153,11 @@ public class VoiceRecorder {
|
|||||||
@NonNull
|
@NonNull
|
||||||
private DocumentFile getAudioRecordFile() {
|
private DocumentFile getAudioRecordFile() {
|
||||||
final String name = String.format("%s-%s.%s", FILE_PREFIX, SIMPLE_DATE_FORMAT.format(new Date()), EXTENSION);
|
final String name = String.format("%s-%s.%s", FILE_PREFIX, SIMPLE_DATE_FORMAT.format(new Date()), EXTENSION);
|
||||||
return recordingsDir.createFile(MIME_TYPE, name);
|
DocumentFile file = recordingsDir.findFile(name);
|
||||||
|
if (file == null || !file.exists()) {
|
||||||
|
file = recordingsDir.createFile(MIME_TYPE, name);
|
||||||
|
}
|
||||||
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deleteTempAudioFile() {
|
private void deleteTempAudioFile() {
|
||||||
|
@ -174,16 +174,16 @@ public class DirectThreadViewModel extends AndroidViewModel {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Log.d(TAG, "onComplete: scan complete");
|
Log.d(TAG, "onComplete: scan complete");
|
||||||
MediaUtils.getVoiceInfo(contentResolver, uri, new MediaUtils.OnInfoLoadListener<MediaUtils.VideoInfo>() {
|
MediaUtils.getVoiceInfo(contentResolver, result.getFile().getUri(), new MediaUtils.OnInfoLoadListener<MediaUtils.VideoInfo>() {
|
||||||
@Override
|
@Override
|
||||||
public void onLoad(@Nullable final MediaUtils.VideoInfo videoInfo) {
|
public void onLoad(@Nullable final MediaUtils.VideoInfo videoInfo) {
|
||||||
if (videoInfo == null) return;
|
if (videoInfo == null) return;
|
||||||
threadManager.sendVoice(data,
|
threadManager.sendVoice(data,
|
||||||
uri,
|
result.getFile().getUri(),
|
||||||
result.getWaveform(),
|
result.getWaveform(),
|
||||||
result.getSamplingFreq(),
|
result.getSamplingFreq(),
|
||||||
videoInfo == null ? 0 : videoInfo.duration,
|
videoInfo == null ? 0 : videoInfo.duration,
|
||||||
videoInfo == null ? 0 : videoInfo.size);
|
result.getFile().length());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Loading…
Reference in New Issue
Block a user