提交 d2470e1a 编写于 作者: J jackjintai

Merge remote-tracking branch 'origin/kotlin' into kotlin

package com.didichuxing.doraemonkit.config
import com.didichuxing.doraemonkit.constant.SharedPrefsKey
import com.didichuxing.doraemonkit.util.SharedPrefsUtil
/**
* Created by wangxueying on 2020-06-30.
*/
object CrashCaptureConfig {
var isCrashCaptureOpen: Boolean
get() = SharedPrefsUtil.getBoolean(SharedPrefsKey.CRASH_CAPTURE_OPEN, false)
set(open) = SharedPrefsUtil.putBoolean(SharedPrefsKey.CRASH_CAPTURE_OPEN, open)
}
......@@ -7,6 +7,7 @@ import com.didichuxing.doraemonkit.constant.BundleKey
import com.didichuxing.doraemonkit.constant.FragmentIndex
import com.didichuxing.doraemonkit.kit.blockmonitor.BlockMonitorFragment
import com.didichuxing.doraemonkit.kit.colorpick.ColorPickerSettingFragment
import com.didichuxing.doraemonkit.kit.crash.CrashCaptureMainFragment
import com.didichuxing.doraemonkit.kit.dataclean.DataCleanFragment
import com.didichuxing.doraemonkit.kit.fileexplorer.FileExplorerFragment
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockFragment
......@@ -60,6 +61,7 @@ open class UniversalActivity : BaseActivity() {
FragmentIndex.FRAGMENT_NETWORK_MOCK -> NetWorkMockFragment::class.java
FragmentIndex.FRAGMENT_FILE_EXPLORER -> FileExplorerFragment::class.java
FragmentIndex.FRAGMENT_GPS_MOCK -> GpsMockFragment::class.java
FragmentIndex.FRAGMENT_CRASH -> CrashCaptureMainFragment::class.java
else -> null
}
if (fragmentClass == null) {
......
......@@ -2,6 +2,8 @@ package com.didichuxing.doraemonkit.kit.crash
import android.content.Context
import com.didichuxing.doraemonkit.R
import com.didichuxing.doraemonkit.config.CrashCaptureConfig
import com.didichuxing.doraemonkit.constant.FragmentIndex
import com.didichuxing.doraemonkit.kit.AbstractKit
/**
......@@ -14,17 +16,22 @@ class CrashCaptureKit : AbstractKit() {
override val icon: Int
get() = R.mipmap.dk_crash_catch
override val isInnerKit: Boolean
get() = true
override fun onClick(context: Context?) {
kotlinTip()
startUniversalActivity(context, FragmentIndex.FRAGMENT_CRASH)
}
override fun onAppInit(context: Context?) {
CrashCaptureManager.instance.init(context)
if (CrashCaptureConfig.isCrashCaptureOpen) {
CrashCaptureManager.instance.start()
} else {
CrashCaptureManager.instance.stop()
}
}
override val isInnerKit: Boolean
get() = true
override fun innerKitId(): String {
return "dokit_sdk_comm_ck_crash"
}
......
package com.didichuxing.doraemonkit.kit.crash
import android.os.Bundle
import android.text.format.Formatter
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.didichuxing.doraemonkit.R
import com.didichuxing.doraemonkit.config.CrashCaptureConfig
import com.didichuxing.doraemonkit.constant.BundleKey
import com.didichuxing.doraemonkit.kit.core.BaseFragment
import com.didichuxing.doraemonkit.kit.core.SettingItem
import com.didichuxing.doraemonkit.kit.core.SettingItemAdapter
import com.didichuxing.doraemonkit.kit.fileexplorer.FileExplorerFragment
import com.didichuxing.doraemonkit.util.FileUtil
import com.didichuxing.doraemonkit.widget.titlebar.HomeTitleBar
/**
* Created by wangxueying on 2020-06-30
*/
class CrashCaptureMainFragment : BaseFragment() {
override fun onRequestLayout(): Int {
return R.layout.dk_fragment_crash_capture_main
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initview()
}
private fun initview() {
val titleBar = findViewById<HomeTitleBar>(R.id.title_bar)
titleBar.setListener(object : HomeTitleBar.OnTitleBarClickListener {
override fun onRightClick() {
finish()
}
})
val settingList = findViewById<RecyclerView>(R.id.setting_list)
settingList.layoutManager = LinearLayoutManager(context)
val mSettingItemAdapter = SettingItemAdapter(context)
mSettingItemAdapter.append(
SettingItem(R.string.dk_crash_capture_switch, CrashCaptureConfig.isCrashCaptureOpen))
mSettingItemAdapter.append(SettingItem(R.string.dk_crash_capture_look, R.mipmap.dk_more_icon, false))
val item = SettingItem(R.string.dk_crash_capture_clean_data)
item.rightDesc = Formatter.formatFileSize(context, FileUtil
.getDirectorySize(CrashCaptureManager.instance.crashCacheDir))
mSettingItemAdapter.append(item)
mSettingItemAdapter.setOnSettingItemSwitchListener(object : SettingItemAdapter.OnSettingItemSwitchListener {
override fun onSettingItemSwitch(view: View, data: SettingItem, on: Boolean) {
if (data.desc == R.string.dk_crash_capture_switch) {
CrashCaptureConfig.isCrashCaptureOpen = on
if (on) {
CrashCaptureManager.instance.start()
} else {
CrashCaptureManager.instance.stop()
}
}
}
})
mSettingItemAdapter.setOnSettingItemClickListener(object : SettingItemAdapter.OnSettingItemClickListener {
override fun onSettingItemClick(view: View, data: SettingItem) {
if (data.desc == R.string.dk_crash_capture_look) {
val bundle = Bundle()
bundle.putSerializable(BundleKey.DIR_KEY, CrashCaptureManager.instance.crashCacheDir)
showContent(FileExplorerFragment::class.java, bundle)
} else if (data.desc == R.string.dk_crash_capture_clean_data) {
CrashCaptureManager.instance.clearCacheHistory()
data.rightDesc = Formatter.formatFileSize(context, FileUtil
.getDirectorySize(CrashCaptureManager.instance.crashCacheDir))
mSettingItemAdapter.notifyDataSetChanged()
showToast(R.string.dk_crash_capture_clean_data)
}
}
})
settingList.adapter = mSettingItemAdapter
}
}
package com.didichuxing.doraemonkit.kit.crash
import android.content.Context
import android.os.Handler
import android.os.HandlerThread
import android.util.Log
import android.widget.Toast
import com.didichuxing.doraemonkit.R
import com.didichuxing.doraemonkit.constant.CachesKey
import com.didichuxing.doraemonkit.util.CacheUtils
import com.didichuxing.doraemonkit.util.FileUtil
import java.io.File
import java.io.Serializable
import java.util.Date
/**
* Created by wangxueying on 2020-06-30
*/
class CrashCaptureManager private constructor() : Thread.UncaughtExceptionHandler {
companion object {
private val TAG = "CrashCaptureManager"
val instance: CrashCaptureManager = CrashCaptureManager()
}
private val mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler()
private val mHandler: Handler
private var mContext: Context? = null
val crashCacheDir: File
get() {
val dir = File(mContext!!.cacheDir.toString() + File.separator + CachesKey.CRASH_HISTORY)
if (!dir.exists()) {
dir.mkdir()
}
return dir
}
private val crashCacheFile: File
get() {
val fileName = Date().toString()
return File(crashCacheDir.toString() + File.separator + fileName)
}
init {
val handlerThread = HandlerThread(TAG)
handlerThread.start()
mHandler = Handler(handlerThread.looper)
}
fun init(context: Context?) {
mContext = context?.applicationContext
}
fun start() {
Thread.setDefaultUncaughtExceptionHandler(this)
}
fun stop() {
Thread.setDefaultUncaughtExceptionHandler(mDefaultHandler)
}
override fun uncaughtException(t: Thread, e: Throwable) {
//保存崩溃信息
CacheUtils.saveObject(Log.getStackTraceString(e) as Serializable, crashCacheFile)
//保存埋点数据
//DataPickManager.getInstance().saveData2Local() TODO("功能待实现")
post(Runnable {
Toast.makeText(mContext, mContext!!.getString(R.string.dk_crash_capture_tips), Toast.LENGTH_SHORT).show()
})
postDelay(Runnable {
mDefaultHandler?.uncaughtException(t, e)
}, 2000)
}
private fun post(r: Runnable) {
mHandler.post(r)
}
private fun postDelay(r: Runnable, delayMillis: Long) {
mHandler.postDelayed(r, delayMillis)
}
fun clearCacheHistory() {
FileUtil.deleteDirectory(crashCacheDir)
}
}
\ No newline at end of file
package com.didichuxing.doraemonkit.kit.crash
import java.io.Serializable
/**
* Created by wangxueying on 2020-06-30
*/
class CrashInfo : Serializable {
var tr: Throwable? = null
var time: Long? = null
}
\ No newline at end of file
package com.didichuxing.doraemonkit.util
import java.util.Date
/**
* Created by wangxueying on 2020-06-30.
*/
object FormatUtil {
fun format(time: Long): String {
return Date(time).toString()
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/dk_color_FFFFFF"
android:orientation="vertical">
<com.didichuxing.doraemonkit.widget.titlebar.HomeTitleBar
android:id="@+id/title_bar"
android:layout_width="match_parent"
android:layout_height="89dp"
app:dkIcon="@mipmap/dk_close_icon_big"
app:dkTitle="@string/dk_kit_crash"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/setting_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册