Skip to content

Commit bb427d8

Browse files
author
Chenhe
committed
新增日志选项,调整日志文件名格式
1 parent 0b73522 commit bb427d8

File tree

8 files changed

+152
-39
lines changed

8 files changed

+152
-39
lines changed

app/src/main/java/cc/chenhe/qqnotifyevo/MyApplication.kt

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ import android.content.Context
77
import android.os.Build
88
import cc.chenhe.qqnotifyevo.log.CrashHandler
99
import cc.chenhe.qqnotifyevo.log.ReleaseTree
10-
import cc.chenhe.qqnotifyevo.utils.NOTIFY_GROUP_ID
11-
import cc.chenhe.qqnotifyevo.utils.getLogDir
12-
import cc.chenhe.qqnotifyevo.utils.getNotificationChannels
10+
import cc.chenhe.qqnotifyevo.utils.*
1311
import timber.log.Timber
1412

1513

@@ -19,13 +17,19 @@ class MyApplication : Application() {
1917
private const val TAG = "Application"
2018
}
2119

20+
private lateinit var isLog: SpBooleanLiveData
21+
22+
private var debugTree: Timber.DebugTree? = null
23+
private var releaseTree: ReleaseTree? = null
24+
2225
override fun onCreate() {
2326
super.onCreate()
24-
if (BuildConfig.DEBUG) {
25-
Timber.plant(Timber.DebugTree())
26-
} else {
27-
Timber.plant(ReleaseTree(getLogDir(this)))
27+
isLog = fetchLog(this)
28+
setupTimber(isLog.value!!)
29+
isLog.observeForever { log ->
30+
setupTimber(log)
2831
}
32+
2933
Thread.setDefaultUncaughtExceptionHandler(CrashHandler)
3034
Timber.tag(TAG).i("\n\n")
3135
Timber.tag(TAG).i("==================================================")
@@ -34,6 +38,37 @@ class MyApplication : Application() {
3438
registerNotificationChannel()
3539
}
3640

41+
private fun setupTimber(enableLog: Boolean) {
42+
if (BuildConfig.DEBUG) {
43+
if (debugTree == null)
44+
debugTree = Timber.DebugTree()
45+
plantIfNotExist(debugTree!!)
46+
}
47+
if (enableLog) {
48+
if (releaseTree == null)
49+
releaseTree = ReleaseTree(getLogDir(this))
50+
plantIfNotExist(releaseTree!!)
51+
} else {
52+
releaseTree?.also { r ->
53+
Timber.uproot(r)
54+
r.close()
55+
releaseTree = null
56+
}
57+
}
58+
}
59+
60+
private fun plantIfNotExist(tree: Timber.Tree) {
61+
if (!Timber.forest().contains(tree))
62+
Timber.plant(tree)
63+
}
64+
65+
fun deleteLog() {
66+
releaseTree?.close()
67+
releaseTree = null
68+
getLogDir(this).deleteRecursively()
69+
setupTimber(isLog.value!!)
70+
}
71+
3772
private fun registerNotificationChannel() {
3873
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
3974
Timber.tag(TAG).d("Register system notification channels")

app/src/main/java/cc/chenhe/qqnotifyevo/log/LogWriter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class LogWriter(
2929
if (!logDir.isDirectory) {
3030
logDir.mkdirs()
3131
}
32-
val format = SimpleDateFormat("yyyyMMdd", Locale.CHINA)
32+
val format = SimpleDateFormat("yyyyMMdd-HHmmssSSS", Locale.CHINA)
3333
return File(logDir, format.format(Date(time)) + ".log")
3434
}
3535

app/src/main/java/cc/chenhe/qqnotifyevo/log/ReleaseTree.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import java.io.File
66
import java.text.SimpleDateFormat
77
import java.util.*
88

9-
class ReleaseTree(logDir: File) : Timber.Tree() {
9+
class ReleaseTree(logDir: File) : Timber.Tree(), AutoCloseable {
1010

1111
private val format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.CHINA)
1212
private val date = Date()
@@ -32,4 +32,8 @@ class ReleaseTree(logDir: File) : Timber.Tree() {
3232
logWriter.write(s, date.time)
3333
}
3434

35+
override fun close() {
36+
logWriter.close()
37+
}
38+
3539
}

app/src/main/java/cc/chenhe/qqnotifyevo/preference/AdvancedFr.kt

Lines changed: 70 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,50 +3,42 @@ package cc.chenhe.qqnotifyevo.preference
33
import android.content.Intent
44
import android.os.Bundle
55
import android.widget.Toast
6+
import androidx.appcompat.app.AlertDialog
67
import androidx.preference.ListPreference
78
import androidx.preference.Preference
89
import androidx.preference.PreferenceFragmentCompat
10+
import androidx.preference.SwitchPreferenceCompat
11+
import cc.chenhe.qqnotifyevo.MyApplication
912
import cc.chenhe.qqnotifyevo.R
1013
import cc.chenhe.qqnotifyevo.core.AvatarManager
11-
import cc.chenhe.qqnotifyevo.utils.ACTION_DELETE_NEVO_CHANNEL
12-
import cc.chenhe.qqnotifyevo.utils.getAvatarCachePeriod
13-
import cc.chenhe.qqnotifyevo.utils.getAvatarDiskCacheDir
14+
import cc.chenhe.qqnotifyevo.utils.*
1415

1516
class AdvancedFr : PreferenceFragmentCompat() {
1617

18+
private lateinit var deleteLog: Preference
19+
1720
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
1821
setPreferencesFromResource(R.xml.pref_advanced, rootKey)
1922

20-
findPreference<ListPreference>("avatar_cache_period")?.setSummaryProvider { preference ->
21-
if (preference is ListPreference) {
22-
val period: Long = preference.value.toLong() / 1000
23-
val day = (period / (24 * 3600)).toInt()
24-
val hour = ((period / 3600) % 24).toInt()
25-
val min = (period / 60 % 60).toInt()
26-
val sec = (period % 60).toInt()
27-
28-
val builder = StringBuilder(30)
29-
if (day > 0) {
30-
builder.append(day)
31-
builder.append(getString(R.string.day))
32-
}
33-
if (hour > 0) {
34-
builder.append(hour)
35-
builder.append(getString(R.string.hour))
36-
}
37-
if (min > 0) {
38-
builder.append(min)
39-
builder.append(getString(R.string.minute))
40-
}
41-
if (sec > 0) {
42-
builder.append(sec)
43-
builder.append(getString(R.string.second))
44-
}
45-
builder.toString()
23+
findPreference<ListPreference>("avatar_cache_period")!!.summaryProvider = AvatarCachePeriodSummaryProvider()
24+
findPreference<SwitchPreferenceCompat>("log")!!.setOnPreferenceChangeListener { pref, new ->
25+
if (new as Boolean) {
26+
AlertDialog.Builder(requireContext())
27+
.setTitle(R.string.tip)
28+
.setMessage(R.string.pref_log_dialog_message)
29+
.setCancelable(false)
30+
.setPositiveButton(R.string.confirm) { _, _ ->
31+
(pref as SwitchPreferenceCompat).isChecked = true
32+
}
33+
.setNegativeButton(R.string.cancel, null)
34+
.show()
35+
false
4636
} else {
47-
"error"
37+
true
4838
}
4939
}
40+
deleteLog = findPreference("delete_log")!!
41+
refreshLogSize()
5042
}
5143

5244
override fun onPreferenceTreeClick(preference: Preference?): Boolean {
@@ -61,7 +53,55 @@ class AdvancedFr : PreferenceFragmentCompat() {
6153
Toast.makeText(requireContext(), R.string.requested, Toast.LENGTH_SHORT).show()
6254
return true
6355
}
56+
"delete_log" -> {
57+
AlertDialog.Builder(requireContext())
58+
.setTitle(R.string.tip)
59+
.setMessage(R.string.pref_delete_log_dialog_message)
60+
.setPositiveButton(R.string.confirm) { _, _ ->
61+
(requireContext().applicationContext as MyApplication).deleteLog()
62+
Toast.makeText(requireContext(), R.string.done, Toast.LENGTH_SHORT).show()
63+
refreshLogSize()
64+
}
65+
.setNegativeButton(R.string.cancel, null)
66+
.show()
67+
}
6468
}
6569
return super.onPreferenceTreeClick(preference)
6670
}
71+
72+
private fun refreshLogSize() {
73+
val files = getLogDir(requireContext()).listFiles { f -> f.isFile }
74+
val size = files?.sumByDouble { f -> f.length().toDouble() } ?: 0.0
75+
deleteLog.summary = getString(R.string.pref_delete_log_summary,
76+
files?.size ?: 0, describeFileSize(size.toLong()))
77+
}
78+
79+
private inner class AvatarCachePeriodSummaryProvider : Preference.SummaryProvider<ListPreference> {
80+
override fun provideSummary(preference: ListPreference): CharSequence {
81+
val period: Long = preference.value.toLong() / 1000
82+
val day = (period / (24 * 3600)).toInt()
83+
val hour = ((period / 3600) % 24).toInt()
84+
val min = (period / 60 % 60).toInt()
85+
val sec = (period % 60).toInt()
86+
87+
val builder = StringBuilder(30)
88+
if (day > 0) {
89+
builder.append(day)
90+
builder.append(getString(R.string.day))
91+
}
92+
if (hour > 0) {
93+
builder.append(hour)
94+
builder.append(getString(R.string.hour))
95+
}
96+
if (min > 0) {
97+
builder.append(min)
98+
builder.append(getString(R.string.minute))
99+
}
100+
if (sec > 0) {
101+
builder.append(sec)
102+
builder.append(getString(R.string.second))
103+
}
104+
return builder.toString()
105+
}
106+
}
67107
}

app/src/main/java/cc/chenhe/qqnotifyevo/utils/PreferencesUtils.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ fun fetchAvatarCachePeriod(context: Context): LiveData<Long> {
7979
}
8080
}
8181

82+
fun fetchLog(context: Context): SpBooleanLiveData = SpBooleanLiveData(PreferenceManager
83+
.getDefaultSharedPreferences(context), "log", false, init = true)
84+
8285
fun getVersion(context: Context): String {
8386
var versionName = ""
8487
var versionCode = 0L

app/src/main/java/cc/chenhe/qqnotifyevo/utils/Utils.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,15 @@ fun getAvatarDiskCacheDir(context: Context): File {
122122

123123
fun getLogDir(context: Context): File {
124124
return File(getCacheDir(context), "log")
125+
}
126+
127+
128+
fun describeFileSize(size: Long): String {
129+
return if (size < 1000) {
130+
"${size}B"
131+
} else if (size < 1000 * 1000) {
132+
String.format("%.2fKB", size / 1000f)
133+
} else {
134+
String.format("$.2fMB", size / (1000 * 1000f))
135+
}
125136
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
<resources>
22
<string name="confirm">确定</string>
3+
<string name="cancel">取消</string>
34
<string name="requested">已发送请求</string>
45
<string name="done">操作完成</string>
6+
<string name="tip">提示</string>
57

68
<string name="day">天</string>
79
<string name="hour">小时</string>
@@ -95,6 +97,12 @@
9597
</string-array>
9698
<string name="pref_delete_avatar_cache">删除头像缓存</string>
9799
<string name="pref_delete_nevo_channel">删除 Nevo 通知渠道</string>
100+
<string name="pref_cat_debug">调试</string>
101+
<string name="pref_log">记录日志</string>
102+
<string name="pref_log_dialog_message">开启后将记录应用日志并明文保存在本地,其中包含您的通知详情,请注意隐私安全。\n请不要从应用外部删除日志文件以免影响完整性。</string>
103+
<string name="pref_delete_log">删除日志</string>
104+
<string name="pref_delete_log_summary">%1$d个日志 总大小%2$s</string>
105+
<string name="pref_delete_log_dialog_message">删除所有日志?</string>
98106

99107
<!--关于页-->
100108
<string name="pref_cate_about">关于</string>

app/src/main/res/xml/pref_advanced.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,16 @@
1515
<Preference
1616
app:key="delete_nevo_channel"
1717
app:title="@string/pref_delete_nevo_channel" />
18+
19+
<PreferenceCategory app:title="@string/pref_cat_debug">
20+
21+
<SwitchPreferenceCompat
22+
app:defaultValue="false"
23+
app:key="log"
24+
app:title="@string/pref_log" />
25+
26+
<Preference
27+
app:key="delete_log"
28+
app:title="@string/pref_delete_log" />
29+
</PreferenceCategory>
1830
</PreferenceScreen>

0 commit comments

Comments
 (0)