Skip to content

Commit bbdd644

Browse files
committed
Show a dialog if the storage is low
Closes #667 This denies installation, so no crashes
1 parent ef13dc9 commit bbdd644

File tree

4 files changed

+35
-7
lines changed

4 files changed

+35
-7
lines changed

app/src/main/kotlin/com/looker/droidify/ui/MessageDialog.kt

+9
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,12 @@ class MessageDialog() : DialogFragment() {
187187
dialog.setMessage(stringRes.incompatible_signature_DESC)
188188
dialog.setPositiveButton(stringRes.ok, null)
189189
}
190+
191+
is Message.InsufficientStorage -> {
192+
dialog.setTitle(stringRes.insufficient_storage)
193+
dialog.setMessage(stringRes.insufficient_storage_DESC)
194+
dialog.setPositiveButton(stringRes.ok, null)
195+
}
190196
}::class
191197
return dialog.create()
192198
}
@@ -220,6 +226,9 @@ sealed interface Message : Parcelable {
220226

221227
@Parcelize
222228
data object ReleaseSignatureMismatch : Message
229+
230+
@Parcelize
231+
data object InsufficientStorage : Message
223232
}
224233

225234
class ReleaseIncompatibilityParceler : Parceler<Release.Incompatibility> {

app/src/main/kotlin/com/looker/droidify/ui/appDetail/AppDetailFragment.kt

+17-7
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,20 @@ import androidx.recyclerview.widget.RecyclerView
2222
import androidx.recyclerview.widget.SimpleItemAnimator
2323
import coil.load
2424
import com.google.android.material.dialog.MaterialAlertDialogBuilder
25+
import com.looker.core.common.cache.Cache
2526
import com.looker.core.common.extension.getLauncherActivities
2627
import com.looker.core.common.extension.getMutatedIcon
2728
import com.looker.core.common.extension.isFirstItemVisible
2829
import com.looker.core.common.extension.isSystemApplication
2930
import com.looker.core.common.extension.systemBarsPadding
3031
import com.looker.core.common.extension.updateAsMutable
32+
import com.looker.droidify.content.ProductPreferences
3133
import com.looker.droidify.model.InstalledItem
3234
import com.looker.droidify.model.Product
3335
import com.looker.droidify.model.ProductPreference
3436
import com.looker.droidify.model.Release
3537
import com.looker.droidify.model.Repository
3638
import com.looker.droidify.model.findSuggested
37-
import com.looker.droidify.content.ProductPreferences
3839
import com.looker.droidify.service.Connection
3940
import com.looker.droidify.service.DownloadService
4041
import com.looker.droidify.ui.Message
@@ -341,12 +342,17 @@ class AppDetailFragment() : ScreenFragment(), AppDetailAdapter.Callbacks {
341342
override fun onActionClick(action: AppDetailAdapter.Action) {
342343
when (action) {
343344
AppDetailAdapter.Action.INSTALL,
344-
AppDetailAdapter.Action.UPDATE
345-
-> downloadConnection.startUpdate(
346-
viewModel.packageName,
347-
installed?.installedItem,
348-
products
349-
)
345+
AppDetailAdapter.Action.UPDATE -> {
346+
if (Cache.getEmptySpace(requireContext()) < products.first().first.releases.first().size) {
347+
MessageDialog(Message.InsufficientStorage).show(childFragmentManager)
348+
return
349+
}
350+
downloadConnection.startUpdate(
351+
viewModel.packageName,
352+
installed?.installedItem,
353+
products
354+
)
355+
}
350356

351357
AppDetailAdapter.Action.LAUNCH -> {
352358
val launcherActivities = installed?.launcherActivities.orEmpty()
@@ -461,6 +467,10 @@ class AppDetailFragment() : ScreenFragment(), AppDetailAdapter.Callbacks {
461467
).show(childFragmentManager)
462468
}
463469

470+
Cache.getEmptySpace(requireContext()) < release.size -> {
471+
MessageDialog(Message.InsufficientStorage).show(childFragmentManager)
472+
}
473+
464474
installedItem != null && installedItem.versionCode > release.versionCode -> {
465475
MessageDialog(Message.ReleaseOlder).show(childFragmentManager)
466476
}

core/common/src/main/java/com/looker/core/common/cache/Cache.kt

+7
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ import android.database.MatrixCursor
99
import android.net.Uri
1010
import android.os.Build
1111
import android.os.ParcelFileDescriptor
12+
import android.os.storage.StorageManager
1213
import android.provider.OpenableColumns
1314
import android.system.Os
1415
import com.looker.core.common.SdkCheck
1516
import com.looker.core.common.sdkAbove
1617
import java.io.File
1718
import java.util.UUID
1819
import kotlin.concurrent.thread
20+
import kotlin.math.min
1921
import kotlin.time.Duration
2022
import kotlin.time.Duration.Companion.days
2123
import kotlin.time.Duration.Companion.hours
@@ -50,6 +52,11 @@ object Cache {
5052
return filePath.substring(dirPath.length)
5153
}
5254

55+
fun getEmptySpace(context: Context): Long {
56+
val dir = context.cacheDir
57+
return min(dir.usableSpace, dir.freeSpace)
58+
}
59+
5360
fun getImagesDir(context: Context): File {
5461
return ensureCacheDir(context, IMAGES_DIR)
5562
}

core/common/src/main/res/values/strings.xml

+2
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@
9898
<string name="install">Install</string>
9999
<string name="install_types">Installation Types</string>
100100
<string name="installer">Installer</string>
101+
<string name="insufficient_storage">Insufficient Space</string>
102+
<string name="insufficient_storage_DESC">There is not enough free space on the device to install this application. Try clearing some space</string>
101103
<string name="legacy_installer">Legacy Installer</string>
102104
<string name="session_installer">Session Installer</string>
103105
<string name="root_installer">Root Installer</string>

0 commit comments

Comments
 (0)