mirror of
https://github.com/SimpleMobileTools/Simple-Voice-Recorder.git
synced 2025-02-24 15:37:45 +01:00
Merge remote-tracking branch 'origin/master' into lame-license
# Conflicts: # app/build.gradle
This commit is contained in:
commit
9b0d4f474e
@ -62,7 +62,7 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.github.SimpleMobileTools:Simple-Commons:bea5638bd5'
|
implementation 'com.github.SimpleMobileTools:Simple-Commons:d100d21180'
|
||||||
implementation 'org.greenrobot:eventbus:3.3.1'
|
implementation 'org.greenrobot:eventbus:3.3.1'
|
||||||
implementation 'com.github.Armen101:AudioRecordView:1.0.4'
|
implementation 'com.github.Armen101:AudioRecordView:1.0.4'
|
||||||
implementation 'androidx.documentfile:documentfile:1.0.1'
|
implementation 'androidx.documentfile:documentfile:1.0.1'
|
||||||
|
@ -1,16 +1,22 @@
|
|||||||
package com.simplemobiletools.voicerecorder.adapters
|
package com.simplemobiletools.voicerecorder.adapters
|
||||||
|
|
||||||
|
import android.content.ContentUris
|
||||||
|
import android.content.Context
|
||||||
|
import android.net.Uri
|
||||||
import android.provider.MediaStore
|
import android.provider.MediaStore
|
||||||
import android.provider.MediaStore.Audio.Media
|
import android.provider.MediaStore.Audio.Media
|
||||||
import android.view.*
|
import android.view.*
|
||||||
import android.widget.PopupMenu
|
import android.widget.PopupMenu
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
|
import androidx.core.net.toUri
|
||||||
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
|
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
|
||||||
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
||||||
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
|
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||||
import com.simplemobiletools.commons.helpers.isQPlus
|
import com.simplemobiletools.commons.helpers.isQPlus
|
||||||
|
import com.simplemobiletools.commons.helpers.isRPlus
|
||||||
|
import com.simplemobiletools.commons.models.FileDirItem
|
||||||
import com.simplemobiletools.commons.views.MyRecyclerView
|
import com.simplemobiletools.commons.views.MyRecyclerView
|
||||||
import com.simplemobiletools.voicerecorder.BuildConfig
|
import com.simplemobiletools.voicerecorder.BuildConfig
|
||||||
import com.simplemobiletools.voicerecorder.R
|
import com.simplemobiletools.voicerecorder.R
|
||||||
@ -151,19 +157,37 @@ class RecordingsAdapter(
|
|||||||
val recordingsToRemove = recordings.filter { selectedKeys.contains(it.id) } as ArrayList<Recording>
|
val recordingsToRemove = recordings.filter { selectedKeys.contains(it.id) } as ArrayList<Recording>
|
||||||
val positions = getSelectedItemPositions()
|
val positions = getSelectedItemPositions()
|
||||||
|
|
||||||
if (isQPlus()) {
|
when {
|
||||||
|
isRPlus() -> {
|
||||||
|
val fileUris = recordingsToRemove.map { recording ->
|
||||||
|
"${Media.EXTERNAL_CONTENT_URI}/${recording.id.toLong()}".toUri()
|
||||||
|
}
|
||||||
|
|
||||||
|
activity.deleteSDK30Uris(fileUris) { success ->
|
||||||
|
if (success) {
|
||||||
|
doDeleteAnimation(oldRecordingIndex, recordingsToRemove, positions)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isQPlus() -> {
|
||||||
recordingsToRemove.forEach {
|
recordingsToRemove.forEach {
|
||||||
val uri = Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
|
val uri = Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
|
||||||
val selection = "${Media._ID} = ?"
|
val selection = "${Media._ID} = ?"
|
||||||
val selectionArgs = arrayOf(it.id.toString())
|
val selectionArgs = arrayOf(it.id.toString())
|
||||||
activity.contentResolver.delete(uri, selection, selectionArgs)
|
activity.contentResolver.delete(uri, selection, selectionArgs)
|
||||||
}
|
}
|
||||||
} else {
|
doDeleteAnimation(oldRecordingIndex, recordingsToRemove, positions)
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
recordingsToRemove.forEach {
|
recordingsToRemove.forEach {
|
||||||
activity.deleteFile(File(it.path).toFileDirItem(activity))
|
activity.deleteFile(File(it.path).toFileDirItem(activity))
|
||||||
}
|
}
|
||||||
|
doDeleteAnimation(oldRecordingIndex, recordingsToRemove, positions)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun doDeleteAnimation(oldRecordingIndex: Int, recordingsToRemove: ArrayList<Recording>, positions: ArrayList<Int>) {
|
||||||
recordings.removeAll(recordingsToRemove)
|
recordings.removeAll(recordingsToRemove)
|
||||||
activity.runOnUiThread {
|
activity.runOnUiThread {
|
||||||
if (recordings.isEmpty()) {
|
if (recordings.isEmpty()) {
|
||||||
@ -180,6 +204,25 @@ class RecordingsAdapter(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Context.getFileUrisFromFileDirItems2(fileDirItems: List<FileDirItem>): Pair<java.util.ArrayList<String>, java.util.ArrayList<Uri>> {
|
||||||
|
val fileUris = java.util.ArrayList<Uri>()
|
||||||
|
val successfulFilePaths = java.util.ArrayList<String>()
|
||||||
|
val allIds = getMediaStoreIds(this)
|
||||||
|
val filePaths = fileDirItems.map { it.path }
|
||||||
|
filePaths.forEach { path ->
|
||||||
|
for ((filePath, mediaStoreId) in allIds) {
|
||||||
|
if (filePath.lowercase() == path.lowercase()) {
|
||||||
|
val baseUri = getFileUri(filePath)
|
||||||
|
val uri = ContentUris.withAppendedId(baseUri, mediaStoreId)
|
||||||
|
fileUris.add(uri)
|
||||||
|
successfulFilePaths.add(path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Pair(successfulFilePaths, fileUris)
|
||||||
|
}
|
||||||
|
|
||||||
fun updateCurrentRecording(newId: Int) {
|
fun updateCurrentRecording(newId: Int) {
|
||||||
val oldId = currRecordingId
|
val oldId = currRecordingId
|
||||||
currRecordingId = newId
|
currRecordingId = newId
|
||||||
|
@ -8,9 +8,12 @@ import com.simplemobiletools.commons.extensions.*
|
|||||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||||
import com.simplemobiletools.commons.helpers.isQPlus
|
import com.simplemobiletools.commons.helpers.isQPlus
|
||||||
import com.simplemobiletools.voicerecorder.R
|
import com.simplemobiletools.voicerecorder.R
|
||||||
|
import com.simplemobiletools.voicerecorder.extensions.config
|
||||||
import com.simplemobiletools.voicerecorder.helpers.getAudioFileContentUri
|
import com.simplemobiletools.voicerecorder.helpers.getAudioFileContentUri
|
||||||
|
import com.simplemobiletools.voicerecorder.models.Events
|
||||||
import com.simplemobiletools.voicerecorder.models.Recording
|
import com.simplemobiletools.voicerecorder.models.Recording
|
||||||
import kotlinx.android.synthetic.main.dialog_rename_recording.view.*
|
import kotlinx.android.synthetic.main.dialog_rename_recording.view.*
|
||||||
|
import org.greenrobot.eventbus.EventBus
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class RenameRecordingDialog(val activity: BaseSimpleActivity, val recording: Recording, val callback: () -> Unit) {
|
class RenameRecordingDialog(val activity: BaseSimpleActivity, val recording: Recording, val callback: () -> Unit) {
|
||||||
@ -63,12 +66,24 @@ class RenameRecordingDialog(val activity: BaseSimpleActivity, val recording: Rec
|
|||||||
put(Media.DISPLAY_NAME, newDisplayName)
|
put(Media.DISPLAY_NAME, newDisplayName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if the old way of renaming fails, try the new SDK 30 one on Android 11+
|
||||||
try {
|
try {
|
||||||
activity.contentResolver.update(getAudioFileContentUri(recording.id.toLong()), values, null, null)
|
activity.contentResolver.update(getAudioFileContentUri(recording.id.toLong()), values, null, null)
|
||||||
|
} catch (e: SecurityException) {
|
||||||
|
try {
|
||||||
|
val path = "${activity.config.saveRecordingsFolder}/${recording.title}"
|
||||||
|
val newPath = "${path.getParentPath()}/$newDisplayName"
|
||||||
|
activity.handleSAFDialogSdk30(path) {
|
||||||
|
val success = activity.renameDocumentSdk30(path, newPath)
|
||||||
|
if (success) {
|
||||||
|
EventBus.getDefault().post(Events.RecordingCompleted())
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
activity.showErrorToast(e)
|
activity.showErrorToast(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun updateLegacyFilename(recording: Recording, newTitle: String) {
|
private fun updateLegacyFilename(recording: Recording, newTitle: String) {
|
||||||
val oldExtension = recording.title.getFilenameExtension()
|
val oldExtension = recording.title.getFilenameExtension()
|
||||||
|
@ -16,6 +16,7 @@ import android.provider.MediaStore.Audio.Media
|
|||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.widget.SeekBar
|
import android.widget.SeekBar
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
|
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||||
import com.simplemobiletools.commons.helpers.isQPlus
|
import com.simplemobiletools.commons.helpers.isQPlus
|
||||||
import com.simplemobiletools.commons.helpers.isRPlus
|
import com.simplemobiletools.commons.helpers.isRPlus
|
||||||
import com.simplemobiletools.voicerecorder.R
|
import com.simplemobiletools.voicerecorder.R
|
||||||
@ -32,7 +33,6 @@ import org.greenrobot.eventbus.Subscribe
|
|||||||
import org.greenrobot.eventbus.ThreadMode
|
import org.greenrobot.eventbus.ThreadMode
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
import kotlin.math.roundToLong
|
import kotlin.math.roundToLong
|
||||||
|
|
||||||
class PlayerFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), RefreshRecordingsListener {
|
class PlayerFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), RefreshRecordingsListener {
|
||||||
@ -136,8 +136,10 @@ class PlayerFragment(context: Context, attributeSet: AttributeSet) : MyViewPager
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun setupAdapter() {
|
private fun setupAdapter() {
|
||||||
|
ensureBackgroundThread {
|
||||||
val recordings = getRecordings()
|
val recordings = getRecordings()
|
||||||
|
|
||||||
|
Handler(Looper.getMainLooper()).post {
|
||||||
recordings_fastscroller.beVisibleIf(recordings.isNotEmpty())
|
recordings_fastscroller.beVisibleIf(recordings.isNotEmpty())
|
||||||
recordings_placeholder.beVisibleIf(recordings.isEmpty())
|
recordings_placeholder.beVisibleIf(recordings.isEmpty())
|
||||||
if (recordings.isEmpty()) {
|
if (recordings.isEmpty()) {
|
||||||
@ -165,6 +167,8 @@ class PlayerFragment(context: Context, attributeSet: AttributeSet) : MyViewPager
|
|||||||
adapter.updateItems(recordings)
|
adapter.updateItems(recordings)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun getRecordings(): ArrayList<Recording> {
|
private fun getRecordings(): ArrayList<Recording> {
|
||||||
val recordings = ArrayList<Recording>()
|
val recordings = ArrayList<Recording>()
|
||||||
|
@ -13,9 +13,7 @@ import android.provider.MediaStore
|
|||||||
import android.provider.MediaStore.Audio.Media
|
import android.provider.MediaStore.Audio.Media
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
import com.simplemobiletools.commons.helpers.*
|
||||||
import com.simplemobiletools.commons.helpers.isOreoPlus
|
|
||||||
import com.simplemobiletools.commons.helpers.isRPlus
|
|
||||||
import com.simplemobiletools.voicerecorder.R
|
import com.simplemobiletools.voicerecorder.R
|
||||||
import com.simplemobiletools.voicerecorder.activities.SplashActivity
|
import com.simplemobiletools.voicerecorder.activities.SplashActivity
|
||||||
import com.simplemobiletools.voicerecorder.extensions.config
|
import com.simplemobiletools.voicerecorder.extensions.config
|
||||||
|
Loading…
x
Reference in New Issue
Block a user