diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8d06b..7b4f982 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,8 @@ + - viewModel.deleteImage(image) +// viewModel.deleteImage(image) + + val pendingIntent = MediaStore.createDeleteRequest(contentResolver, arrayListOf(image.contentUri)) + val intentSenderRequest = IntentSenderRequest.Builder(pendingIntent.intentSender).build() + startIntentSenderForResult(pendingIntent.intentSender, 42, null, 0, 0, 0, null) } .setNegativeButton(R.string.delete_dialog_negative) { dialog: DialogInterface, _: Int -> dialog.dismiss() @@ -224,6 +246,28 @@ class HistoryActivity : AppCompatActivity(){ return true } + @OptIn(DelicateCoroutinesApi::class) + private fun deleteAllImages() { + MaterialAlertDialogBuilder(this) + .setTitle(R.string.delete_dialog_title) + .setMessage(getString(R.string.delete_all_dialog_message)) + .setPositiveButton(R.string.delete_dialog_positive) { _: DialogInterface, _: Int -> +// viewModel.deleteImage(image) + GlobalScope.launch { + val list = withContext(Dispatchers.IO){ + getUriList() + } + val pendingIntent = MediaStore.createDeleteRequest(contentResolver, list) + startIntentSenderForResult(pendingIntent.intentSender, 42, null, 0, 0, 0, null) + } +// val intentSenderRequest = IntentSenderRequest.Builder(pendingIntent.intentSender).build() + } + .setNegativeButton(R.string.delete_dialog_negative) { dialog: DialogInterface, _: Int -> + dialog.dismiss() + } + .show() + } + /** * A [ListAdapter] for [MediaStoreImage]s. */ @@ -251,10 +295,10 @@ class HistoryActivity : AppCompatActivity(){ val mediaStoreImage = getItem(position) holder.rootView.tag = mediaStoreImage - val labelView: ImageView = holder.rootView.findViewById(R.id.image_label_horizontal) - if (mediaStoreImage.width > mediaStoreImage.height){ - labelView.visibility = View.VISIBLE + holder.labelView.visibility = View.VISIBLE + }else{ + holder.labelView.visibility = View.INVISIBLE } Glide.with(holder.imageView) @@ -276,6 +320,13 @@ class HistoryActivity : AppCompatActivity(){ } startActivity(intent) } + + private suspend fun getUriList(): ArrayList { + val uriList = ArrayList() + val images = viewModel.queryImages() + for (image in images) uriList.add(image.contentUri) + return uriList + } } /** @@ -285,6 +336,7 @@ private class ImageViewHolder(view: View, onClick: (MediaStoreImage) -> Unit, on RecyclerView.ViewHolder(view) { val rootView = view val imageView: ImageView = view.findViewById(R.id.image) + val labelView: ImageView = view.findViewById(R.id.image_label_horizontal) init { diff --git a/app/src/main/java/com/maary/shareas/HistoryActivityViewModel.kt b/app/src/main/java/com/maary/shareas/HistoryActivityViewModel.kt index 589aca1..fa5d917 100644 --- a/app/src/main/java/com/maary/shareas/HistoryActivityViewModel.kt +++ b/app/src/main/java/com/maary/shareas/HistoryActivityViewModel.kt @@ -1,6 +1,7 @@ package com.maary.shareas import android.annotation.SuppressLint +import android.app.Activity import android.app.Application import android.app.RecoverableSecurityException import android.content.* @@ -21,6 +22,7 @@ import kotlinx.coroutines.withContext import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.TimeUnit +import kotlin.collections.ArrayList class HistoryActivityViewModel(application: Application) : AndroidViewModel(application) { private val _images = MutableLiveData>() @@ -51,6 +53,17 @@ class HistoryActivityViewModel(application: Application) : AndroidViewModel(appl } } + fun getUriList(): ArrayList { + val uriList = ArrayList() + viewModelScope.launch { + val images = queryImages() + + for (image in images) uriList.add(image.contentUri) + + } + return uriList + } + fun deleteImage(image: MediaStoreImage) { viewModelScope.launch { performDeleteImage(image) @@ -64,7 +77,7 @@ class HistoryActivityViewModel(application: Application) : AndroidViewModel(appl } } - private suspend fun queryImages(): List { + suspend fun queryImages(): List { val images = mutableListOf() /** @@ -235,7 +248,9 @@ class HistoryActivityViewModel(application: Application) : AndroidViewModel(appl id ) - val image = MediaStoreImage(id, displayName, dateModified, contentUri, width, height) + val image = MediaStoreImage(id, displayName, dateModified, contentUri, width = width, height = height) + + Log.v("WLAP", width.toString() + " " + height.toString()) images += image // For debugging, we'll output the image objects we create to logcat. @@ -271,11 +286,15 @@ class HistoryActivityViewModel(application: Application) : AndroidViewModel(appl * activity can use to prompt the user to grant permission to the item * so it can be either updated or deleted. */ - getApplication().contentResolver.delete( - image.contentUri, - "${MediaStore.Images.Media._ID} = ?", - arrayOf(image.id.toString()) - ) + + val pendingIntent = MediaStore.createDeleteRequest(getApplication().contentResolver, arrayListOf(image.contentUri)) +// getApplication().startIntentSenderForResult(pendingIntent.intentSender, null, 0, 0, 0) + +// getApplication().contentResolver.delete( +// image.contentUri, +// "${MediaStore.Images.Media._ID} = ?", +// arrayOf(image.id.toString()) +// ) } catch (securityException: SecurityException) { val recoverableSecurityException = securityException as? RecoverableSecurityException diff --git a/app/src/main/java/com/maary/shareas/MainActivity.java b/app/src/main/java/com/maary/shareas/MainActivity.java index f377da3..5f9f63a 100644 --- a/app/src/main/java/com/maary/shareas/MainActivity.java +++ b/app/src/main/java/com/maary/shareas/MainActivity.java @@ -16,10 +16,12 @@ import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.provider.MediaStore; +import android.provider.Settings; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; @@ -36,6 +38,7 @@ import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.view.menu.ActionMenuItemView; @@ -426,6 +429,7 @@ private AlertDialog createSliderDialog(int title){ } //询问是否需要保存壁纸历史记录 + @RequiresApi(api = Build.VERSION_CODES.S) private AlertDialog saveHistoryDialog(){ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this); builder.setMessage(R.string.dialog_wallpaper_history) @@ -441,6 +445,11 @@ private AlertDialog saveHistoryDialog(){ getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE); } + if (ContextCompat.checkSelfPermission( + getApplicationContext(), Manifest.permission.MANAGE_MEDIA) != PackageManager.PERMISSION_GRANTED){ + Intent intent = new Intent(Settings.ACTION_REQUEST_MANAGE_MEDIA); + startActivity(intent); + } } if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { diff --git a/app/src/main/res/layout/activity_history.xml b/app/src/main/res/layout/activity_history.xml index 1d3ccf8..66d2231 100644 --- a/app/src/main/res/layout/activity_history.xml +++ b/app/src/main/res/layout/activity_history.xml @@ -10,40 +10,40 @@ tools:context=".MainActivity"> + android:fitsSystemWindows="true" + android:stateListAnimator="@null" + app:liftOnScroll="true">