Skip to content

Commit

Permalink
add delete all function
Browse files Browse the repository at this point in the history
  • Loading branch information
Steve-Mr committed Jan 21, 2023
1 parent 19289b3 commit 15e3d00
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 28 deletions.
2 changes: 2 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_MEDIA"
tools:ignore="ProtectedPermissions" />

<application
android:allowBackup="true"
Expand Down
60 changes: 56 additions & 4 deletions app/src/main/java/com/maary/shareas/HistoryActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,19 @@ import android.content.pm.PackageManager
import android.content.res.Configuration
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.provider.Settings
import android.provider.Settings.Global
import android.util.Log
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowInsets
import android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
import android.widget.Button
import android.widget.ImageView
import androidx.activity.result.IntentSenderRequest
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
Expand All @@ -23,12 +28,14 @@ import androidx.core.content.ContextCompat
import androidx.core.view.*
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.Observer
import androidx.lifecycle.viewModelScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.maary.shareas.databinding.ActivityHistoryBinding
import kotlinx.coroutines.*


/** The request code for requesting [Manifest.permission.READ_EXTERNAL_STORAGE] permission. */
Expand Down Expand Up @@ -110,6 +117,17 @@ class HistoryActivity : AppCompatActivity(){
}
})

binding.appBarContainer.elevation = 8.0f

binding.closeActivity.setOnClickListener {
finish()
}

binding.buttonClearAll.setOnClickListener {
deleteAllImages()

}

if (!haveStoragePermission()) {
// binding.welcomeView.visibility = View.VISIBLE
requestPermission()
Expand Down Expand Up @@ -215,7 +233,11 @@ class HistoryActivity : AppCompatActivity(){
.setTitle(R.string.delete_dialog_title)
.setMessage(getString(R.string.delete_dialog_message, image.displayName))
.setPositiveButton(R.string.delete_dialog_positive) { _: DialogInterface, _: Int ->
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()
Expand All @@ -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.
*/
Expand Down Expand Up @@ -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)
Expand All @@ -276,6 +320,13 @@ class HistoryActivity : AppCompatActivity(){
}
startActivity(intent)
}

private suspend fun getUriList(): ArrayList<Uri> {
val uriList = ArrayList<Uri>()
val images = viewModel.queryImages()
for (image in images) uriList.add(image.contentUri)
return uriList
}
}

/**
Expand All @@ -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 {

Expand Down
33 changes: 26 additions & 7 deletions app/src/main/java/com/maary/shareas/HistoryActivityViewModel.kt
Original file line number Diff line number Diff line change
@@ -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.*
Expand All @@ -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<List<MediaStoreImage>>()
Expand Down Expand Up @@ -51,6 +53,17 @@ class HistoryActivityViewModel(application: Application) : AndroidViewModel(appl
}
}

fun getUriList(): ArrayList<Uri> {
val uriList = ArrayList<Uri>()
viewModelScope.launch {
val images = queryImages()

for (image in images) uriList.add(image.contentUri)

}
return uriList
}

fun deleteImage(image: MediaStoreImage) {
viewModelScope.launch {
performDeleteImage(image)
Expand All @@ -64,7 +77,7 @@ class HistoryActivityViewModel(application: Application) : AndroidViewModel(appl
}
}

private suspend fun queryImages(): List<MediaStoreImage> {
suspend fun queryImages(): List<MediaStoreImage> {
val images = mutableListOf<MediaStoreImage>()

/**
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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<Application>().contentResolver.delete(
image.contentUri,
"${MediaStore.Images.Media._ID} = ?",
arrayOf(image.id.toString())
)

val pendingIntent = MediaStore.createDeleteRequest(getApplication<Application>().contentResolver, arrayListOf(image.contentUri))
// getApplication<Activity>().startIntentSenderForResult(pendingIntent.intentSender, null, 0, 0, 0)

// getApplication<Application>().contentResolver.delete(
// image.contentUri,
// "${MediaStore.Images.Media._ID} = ?",
// arrayOf(image.id.toString())
// )
} catch (securityException: SecurityException) {
val recoverableSecurityException =
securityException as? RecoverableSecurityException
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/java/com/maary/shareas/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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)
Expand All @@ -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) {
Expand Down
32 changes: 16 additions & 16 deletions app/src/main/res/layout/activity_history.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,40 +10,40 @@
tools:context=".MainActivity">

<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:liftOnScroll="true"
android:fitsSystemWindows="true"
android:background="@android:color/transparent"
android:id="@+id/appBarContainer">
android:fitsSystemWindows="true"
android:stateListAnimator="@null"
app:liftOnScroll="true">

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/virtual_app_bar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:id="@+id/virtual_app_bar"
android:paddingTop="8dp"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="16dp">

<Button
android:id="@+id/button_clear_all"
style="@style/Widget.Material3.Button.TonalButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.Material3.Button.TonalButton"
android:id="@+id/button_clear_all"
android:text="@string/delete_all"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/close_activity"
style="@style/Widget.Material3.Button.TonalButton.Icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:id="@+id/close_activity"
android:text="@string/history_activity"
style="@style/Widget.Material3.Button.TonalButton.Icon"
app:icon="@drawable/ic_action_close"/>

app:icon="@drawable/ic_action_close"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Expand All @@ -53,9 +53,9 @@
android:id="@+id/gallery"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?attr/actionBarSize"
android:clipChildren="false"
android:clipToPadding="false"/>
android:clipToPadding="false"
android:paddingTop="?attr/actionBarSize" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout>
3 changes: 2 additions & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@
<string name="device_height">device_height</string>
<string name="device_width">device_width</string>
<string name="preference_file_key">tunnel_preferences</string>
<string name="history_activity">Used Wallpaper</string>
<string name="history_activity">Used Wallpapers</string>
<string name="delete_all">Delete All</string>
<string name="delete_all_used_images">Delete all used wallpapers listed here.</string>
<string name="delete_all_dialog_message">Delete all used wallpapers?</string>
</resources>

0 comments on commit 15e3d00

Please sign in to comment.