Skip to content

Commit 47a78a0

Browse files
committed
allow specifying date time format
1 parent bf7bfc7 commit 47a78a0

File tree

11 files changed

+58
-38
lines changed

11 files changed

+58
-38
lines changed

app/src/main/java/com/raival/compose/file/explorer/common/Utils.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,8 @@ fun Int.isMultipleOf100(): Boolean {
652652
}
653653

654654
@SuppressLint("SimpleDateFormat")
655-
fun Long.toFormattedDate(): String = SimpleDateFormat("MMM dd, hh:mm a").format(this)
655+
fun Long.toFormattedDate(): String =
656+
SimpleDateFormat(globalClass.preferencesManager.appearancePrefs.dateTimeFormat).format(this)
656657

657658
fun Long.toFormattedSize(): String {
658659
if (this <= 0) return "0 B"

app/src/main/java/com/raival/compose/file/explorer/screen/main/tab/apps/ui/AppInfoBottomSheet.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ import androidx.compose.ui.unit.dp
6161
import coil3.compose.AsyncImage
6262
import com.raival.compose.file.explorer.App.Companion.globalClass
6363
import com.raival.compose.file.explorer.R
64+
import com.raival.compose.file.explorer.common.toFormattedDate
6465
import com.raival.compose.file.explorer.common.toFormattedSize
6566
import com.raival.compose.file.explorer.common.ui.BottomSheetDialog
6667
import com.raival.compose.file.explorer.common.ui.Space
@@ -69,8 +70,6 @@ import com.raival.compose.file.explorer.screen.main.tab.files.holder.LocalFileHo
6970
import com.raival.compose.file.explorer.screen.main.tab.files.task.CopyTask
7071
import kotlinx.coroutines.launch
7172
import java.io.File
72-
import java.text.SimpleDateFormat
73-
import java.util.Locale
7473

7574
@OptIn(ExperimentalMaterial3Api::class)
7675
@Composable
@@ -79,7 +78,6 @@ fun AppInfoBottomSheet(
7978
onDismiss: () -> Unit
8079
) {
8180
var selectedTab by remember { mutableIntStateOf(0) }
82-
val dateFormat = SimpleDateFormat("MMM dd, yyyy", Locale.getDefault())
8381

8482
BottomSheetDialog(onDismissRequest = onDismiss) {
8583
Column(
@@ -245,14 +243,14 @@ fun AppInfoBottomSheet(
245243
item {
246244
InfoCard(
247245
title = stringResource(R.string.install_date),
248-
value = dateFormat.format(app.installDate),
246+
value = app.installDate.time.toFormattedDate(),
249247
icon = Icons.Rounded.CalendarMonth
250248
)
251249
}
252250
item {
253251
InfoCard(
254252
title = stringResource(R.string.last_update),
255-
value = dateFormat.format(app.lastUpdateDate),
253+
value = app.lastUpdateDate.time.toFormattedDate(),
256254
icon = Icons.Rounded.Update
257255
)
258256
}

app/src/main/java/com/raival/compose/file/explorer/screen/main/tab/files/provider/ContentPropertiesProvider.kt

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package com.raival.compose.file.explorer.screen.main.tab.files.provider
33
import com.raival.compose.file.explorer.App.Companion.globalClass
44
import com.raival.compose.file.explorer.R
55
import com.raival.compose.file.explorer.common.emptyString
6+
import com.raival.compose.file.explorer.common.toFormattedDate
7+
import com.raival.compose.file.explorer.common.toFormattedSize
68
import com.raival.compose.file.explorer.screen.main.tab.files.holder.ContentHolder
79
import com.raival.compose.file.explorer.screen.main.tab.files.holder.LocalFileHolder
810
import kotlinx.coroutines.CoroutineScope
@@ -23,9 +25,6 @@ import java.io.FileInputStream
2325
import java.math.BigInteger
2426
import java.nio.file.Files
2527
import java.security.MessageDigest
26-
import java.text.SimpleDateFormat
27-
import java.util.Date
28-
import java.util.Locale
2928

3029
data class CalculationProgress(
3130
val isCalculating: Boolean = false,
@@ -114,10 +113,8 @@ class ContentPropertiesProvider(private val contentHolders: List<ContentHolder>)
114113
name = file.displayName.ifEmpty { globalClass.getString(R.string.root) },
115114
path = file.getParent()?.uniquePath ?: File.separator,
116115
type = determineFileType(file),
117-
lastModified = formatTimestamp(file.lastModified),
118-
size = if (file.isFolder) globalClass.getString(R.string.calculating) else formatFileSize(
119-
file.size
120-
),
116+
lastModified = file.lastModified.toFormattedDate(),
117+
size = if (file.isFolder) globalClass.getString(R.string.calculating) else file.size.toFormattedSize(),
121118
permissions = getPermissions(file),
122119
owner = getOwner(file),
123120
contentCount = contentCountFlow,
@@ -149,7 +146,7 @@ class ContentPropertiesProvider(private val contentHolders: List<ContentHolder>)
149146
state.details as? PropertiesState.SingleContentProperties
150147
currentDetails?.let {
151148
state.copy(
152-
details = it.copy(size = formatFileSize(totalSize))
149+
details = it.copy(size = totalSize.toFormattedSize())
153150
)
154151
} ?: state
155152
}
@@ -265,7 +262,7 @@ class ContentPropertiesProvider(private val contentHolders: List<ContentHolder>)
265262
totalFiles,
266263
totalFolders
267264
)
268-
totalSizeFlow.value = formatFileSize(totalSize)
265+
totalSizeFlow.value = totalSize.toFormattedSize()
269266

270267
yield() // Allow cancellation
271268
}
@@ -289,22 +286,6 @@ class ContentPropertiesProvider(private val contentHolders: List<ContentHolder>)
289286
}
290287
}
291288

292-
private fun formatTimestamp(millis: Long): String {
293-
val sdf = SimpleDateFormat("MMM dd, yyyy • hh:mm:ss a", Locale.getDefault())
294-
return sdf.format(Date(millis))
295-
}
296-
297-
private fun formatFileSize(bytes: Long): String {
298-
if (bytes < 1024) return "$bytes B"
299-
val z = (63 - java.lang.Long.numberOfLeadingZeros(bytes)) / 10
300-
return String.format(
301-
Locale.US,
302-
"%.1f %sB",
303-
bytes.toDouble() / (1L shl (z * 10)),
304-
" KMGTPE"[z]
305-
)
306-
}
307-
308289
private fun getPermissions(file: ContentHolder): String {
309290
if (file is LocalFileHolder) {
310291
return buildString {

app/src/main/java/com/raival/compose/file/explorer/screen/main/tab/files/ui/dialog/ApkPreviewDialog.kt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,12 @@ import coil3.compose.AsyncImage
7070
import com.raival.compose.file.explorer.App.Companion.globalClass
7171
import com.raival.compose.file.explorer.App.Companion.logger
7272
import com.raival.compose.file.explorer.R
73+
import com.raival.compose.file.explorer.common.toFormattedDate
7374
import com.raival.compose.file.explorer.common.toFormattedSize
7475
import com.raival.compose.file.explorer.common.ui.BottomSheetDialog
7576
import com.raival.compose.file.explorer.common.ui.Space
7677
import com.raival.compose.file.explorer.screen.main.tab.files.FilesTab
7778
import com.raival.compose.file.explorer.screen.main.tab.files.misc.ApkInfo
78-
import java.text.SimpleDateFormat
79-
import java.util.Date
80-
import java.util.Locale
8179

8280
@OptIn(ExperimentalMaterial3Api::class)
8381
@Composable
@@ -119,10 +117,8 @@ fun ApkPreviewDialog(tab: FilesTab) {
119117
packageManager.getPackageInfo(archiveInfo.packageName, 0)
120118
isInstalled = true
121119
installedVersion = installedInfo.versionName
122-
installTime = SimpleDateFormat("MMM dd, yyyy", Locale.getDefault())
123-
.format(Date(installedInfo.firstInstallTime))
124-
lastUpdateTime = SimpleDateFormat("MMM dd, yyyy", Locale.getDefault())
125-
.format(Date(installedInfo.lastUpdateTime))
120+
installTime = installedInfo.firstInstallTime.toFormattedDate()
121+
lastUpdateTime = installedInfo.lastUpdateTime.toFormattedDate()
126122
} catch (_: PackageManager.NameNotFoundException) {
127123
// App not installed
128124
}

app/src/main/java/com/raival/compose/file/explorer/screen/preferences/PreferencesManager.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ class PreferencesManager {
5858
defaultValue = StartupTabs.default().toJson(),
5959
getPreferencesKey = { stringPreferencesKey(it) }
6060
)
61+
62+
var dateTimeFormat by prefMutableState(
63+
keyName = "dateTimeFormat",
64+
defaultValue = "yyyy-MM-dd HH:mm:ss",
65+
getPreferencesKey = { stringPreferencesKey(it) }
66+
)
6167
}
6268

6369
class FileListPrefs {

app/src/main/java/com/raival/compose/file/explorer/screen/preferences/ui/AppearanceContainer.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.raival.compose.file.explorer.screen.preferences.ui
22

33
import androidx.compose.material.icons.Icons
44
import androidx.compose.material.icons.automirrored.rounded.Label
5+
import androidx.compose.material.icons.rounded.CalendarToday
56
import androidx.compose.material.icons.rounded.Nightlight
67
import androidx.compose.material3.HorizontalDivider
78
import androidx.compose.material3.MaterialTheme
@@ -54,5 +55,32 @@ fun AppearanceContainer() {
5455
switchState = appearancePrefs.showBottomBarLabels,
5556
onSwitchChange = { appearancePrefs.showBottomBarLabels = it }
5657
)
58+
59+
HorizontalDivider(
60+
color = MaterialTheme.colorScheme.surfaceContainerLow,
61+
thickness = 3.dp
62+
)
63+
64+
val commonDateFormat = arrayListOf(
65+
"yyyy-MM-dd HH:mm:ss",
66+
"yyyy-MM-dd",
67+
"dd-MM-yyyy HH:mm:ss",
68+
"dd-MM-yyyy",
69+
)
70+
71+
PreferenceItem(
72+
label = stringResource(R.string.date_time_format),
73+
supportingText = appearancePrefs.dateTimeFormat,
74+
icon = Icons.Rounded.CalendarToday,
75+
onClick = {
76+
manager.singleChoiceDialog.show(
77+
title = globalClass.getString(R.string.date_time_format),
78+
description = globalClass.getString(R.string.select_date_format),
79+
choices = commonDateFormat,
80+
selectedChoice = commonDateFormat.indexOf(appearancePrefs.dateTimeFormat),
81+
onSelect = { appearancePrefs.dateTimeFormat = commonDateFormat[it] }
82+
)
83+
}
84+
)
5785
}
5886
}

app/src/main/res/values-fa/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,4 +358,6 @@
358358
<string name="disabled">غیرفعال</string>
359359
<string name="update_date">تاریخ به روز رسانی</string>
360360
<string name="extract">استخراج</string>
361+
<string name="date_time_format">فرمت تاریخ و زمان</string>
362+
<string name="select_date_format">انتخاب فرمت تاریخ</string>
361363
</resources>

app/src/main/res/values-pt-rBR/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,4 +358,6 @@
358358
<string name="disabled">Desativado</string>
359359
<string name="update_date">Data de Atualização</string>
360360
<string name="extract">Extrair</string>
361+
<string name="date_time_format">Formato de data e hora</string>
362+
<string name="select_date_format">Selecionar formato de data</string>
361363
</resources>

app/src/main/res/values-ru/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,4 +358,6 @@
358358
<string name="disabled">Отключено</string>
359359
<string name="update_date">Дата обновления</string>
360360
<string name="extract">Извлечь</string>
361+
<string name="date_time_format">Формат даты и времени</string>
362+
<string name="select_date_format">Выберите формат даты</string>
361363
</resources>

app/src/main/res/values-zh/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,4 +358,6 @@
358358
<string name="disabled">已禁用</string>
359359
<string name="update_date">更新日期</string>
360360
<string name="extract">提取</string>
361+
<string name="date_time_format">日期时间格式</string>
362+
<string name="select_date_format">选择日期格式</string>
361363
</resources>

0 commit comments

Comments
 (0)