提交 bddea70c 编写于 作者: 糕冷羊's avatar 糕冷羊

update crash记录支持分享

上级 52a34174
......@@ -6,6 +6,7 @@ package com.didichuxing.doraemonkit.constant;
public interface BundleKey {
String FILE_KEY = "file_key";
String DIR_KEY = "dir_key";
String FRAGMENT_INDEX = "fragment_index";
String ACCESSIBILITY_DATA = "accessibility_data";
String PERFORMANCE_TYPE = "performance_type";
......
......@@ -7,4 +7,5 @@ package com.didichuxing.doraemonkit.constant;
public interface CachesKey {
String WEB_DOOR_HISTORY = "web_door_history";
String CRASH_HISTORY = "crash";
String MOCK_LOCATION = "mock_location";
}
\ No newline at end of file
package com.didichuxing.doraemonkit.kit.crash;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.ui.base.BaseFragment;
import com.didichuxing.doraemonkit.ui.crash.CrashHistoryAdapter;
import com.didichuxing.doraemonkit.ui.widget.titlebar.TitleBar;
import java.util.List;
public class CrashCaptureDetailFragment extends BaseFragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView();
}
@Override
protected int onRequestLayout() {
return R.layout.dk_fragment_crash_capture_detail;
}
private void initView() {
TitleBar mTitleBar = findViewById(R.id.title_bar);
mTitleBar.setOnTitleBarClickListener(new TitleBar.OnTitleBarClickListener() {
@Override
public void onLeftClick() {
finish();
}
@Override
public void onRightClick() {
}
});
TextView noRecordHint = findViewById(R.id.no_record_hint);
RecyclerView crashList = findViewById(R.id.crash_list);
List<CrashInfo> caches = CrashCaptureManager.getInstance().getCrashCaches();
if (caches.isEmpty()) {
noRecordHint.setVisibility(View.VISIBLE);
crashList.setVisibility(View.GONE);
} else {
noRecordHint.setVisibility(View.GONE);
crashList.setVisibility(View.VISIBLE);
crashList.setLayoutManager(new LinearLayoutManager(getContext()));
CrashHistoryAdapter adapter = new CrashHistoryAdapter(getContext());
adapter.append(caches);
crashList.setAdapter(adapter);
}
}
}
......@@ -10,6 +10,8 @@ import android.view.View;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.config.CrashCaptureConfig;
import com.didichuxing.doraemonkit.constant.BundleKey;
import com.didichuxing.doraemonkit.kit.fileexplorer.FileExplorerFragment;
import com.didichuxing.doraemonkit.ui.base.BaseFragment;
import com.didichuxing.doraemonkit.ui.setting.SettingItem;
import com.didichuxing.doraemonkit.ui.setting.SettingItemAdapter;
......@@ -61,7 +63,9 @@ public class CrashCaptureMainFragment extends BaseFragment {
@Override
public void onSettingItemClick(View view, SettingItem data) {
if (data.desc == R.string.dk_crash_capture_look) {
showContent(CrashCaptureDetailFragment.class);
Bundle bundle = new Bundle();
bundle.putSerializable(BundleKey.DIR_KEY, CrashCaptureManager.getInstance().getCrashCacheDir());
showContent(FileExplorerFragment.class, bundle);
} else if (data.desc == R.string.dk_crash_capture_clean_data) {
CrashCaptureManager.getInstance().clearCacheHistory();
showToast(R.string.dk_crash_capture_clean_data);
......
......@@ -57,9 +57,7 @@ public class CrashCaptureManager implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(final Thread t, final Throwable e) {
LogHelper.d(TAG, t.toString());
LogHelper.d(TAG, Log.getStackTraceString(e));
CacheUtils.saveObject(e, getCrashCacheFile());
CacheUtils.saveObject(Log.getStackTraceString(e), getCrashCacheFile());
post(new Runnable() {
@Override
public void run() {
......@@ -100,20 +98,4 @@ public class CrashCaptureManager implements Thread.UncaughtExceptionHandler {
public void clearCacheHistory() {
FileUtil.deleteDirectory(getCrashCacheDir());
}
public List<CrashInfo> getCrashCaches() {
File[] caches = getCrashCacheDir().listFiles();
List<CrashInfo> result = new ArrayList<>();
if (caches == null) {
return result;
}
for (File cache : caches) {
Serializable serializable = CacheUtils.readObject(cache);
if (serializable instanceof Throwable) {
CrashInfo info = new CrashInfo((Throwable) serializable, cache.lastModified());
result.add(info);
}
}
return result;
}
}
\ No newline at end of file
package com.didichuxing.doraemonkit.kit.crash;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.TextView;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.constant.BundleKey;
import com.didichuxing.doraemonkit.ui.base.BaseFragment;
import com.didichuxing.doraemonkit.ui.widget.titlebar.TitleBar;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class CrashDetailFragment extends BaseFragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView();
}
@Override
protected int onRequestLayout() {
return R.layout.dk_fragment_crash_detail_info;
}
private void initView() {
TitleBar mTitleBar = findViewById(R.id.title_bar);
mTitleBar.setOnTitleBarClickListener(new TitleBar.OnTitleBarClickListener() {
@Override
public void onLeftClick() {
getActivity().onBackPressed();
}
@Override
public void onRightClick() {
}
});
Bundle bundle = getArguments();
if (bundle != null) {
try {
File file = (File) bundle.getSerializable(BundleKey.FILE_KEY);
FileInputStream fin = new FileInputStream(file);
if (fin != null) {
InputStreamReader inputStreamReader = new InputStreamReader(fin);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
stringBuilder.append("\n");
}
inputStreamReader.close();
((TextView) findViewById(R.id.tv_crash_detail)).setText(stringBuilder.toString());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
......@@ -19,6 +19,7 @@ import com.didichuxing.doraemonkit.util.FileUtil;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
......@@ -132,7 +133,7 @@ public class FileExplorerFragment extends BaseFragment {
@Override
protected boolean onBackPressed() {
if (mCurDir == null) {
getActivity().finish();
finish();
return true;
}
if (isRootFile(getContext(), mCurDir)) {
......@@ -158,6 +159,28 @@ public class FileExplorerFragment extends BaseFragment {
}
private List<FileInfo> initRootFileInfos(Context context) {
List<File> rootFiles = getRootFiles();
if (rootFiles != null) {
List<FileInfo> fileInfos = new ArrayList<>();
for (File file : rootFiles) {
fileInfos.add(new FileInfo(file));
}
return fileInfos;
}
return initDefaultRootFileInfos(context);
}
private List<File> getRootFiles() {
if (getArguments() != null) {
File dir = (File) getArguments().getSerializable(BundleKey.DIR_KEY);
if (dir != null && dir.exists()) {
return Arrays.asList(dir.listFiles());
}
}
return null;
}
private List<FileInfo> initDefaultRootFileInfos(Context context) {
List<FileInfo> fileInfos = new ArrayList<>();
fileInfos.add(new FileInfo(context.getFilesDir().getParentFile()));
fileInfos.add(new FileInfo(context.getExternalCacheDir()));
......@@ -169,6 +192,12 @@ public class FileExplorerFragment extends BaseFragment {
if (file == null) {
return false;
}
List<File> rootFiles = getRootFiles();
if (rootFiles != null) {
for (File rootFile : rootFiles) {
return file.equals(rootFile);
}
}
return file.equals(context.getExternalCacheDir())
|| file.equals(context.getExternalFilesDir(null))
|| file.equals(context.getFilesDir().getParentFile());
......
......@@ -14,19 +14,7 @@ import java.util.Locale;
*/
public class FileUtil {
private static final String DATA_TYPE_ALL = "*/*";
private static final String DATA_TYPE_APK = "application/vnd.android.package-archive";
private static final String DATA_TYPE_VIDEO = "video/*";
private static final String DATA_TYPE_AUDIO = "audio/*";
private static final String DATA_TYPE_HTML = "text/html";
private static final String DATA_TYPE_IMAGE = "image/*";
private static final String DATA_TYPE_PPT = "application/vnd.ms-powerpoint";
private static final String DATA_TYPE_EXCEL = "application/vnd.ms-excel";
private static final String DATA_TYPE_WORD = "application/msword";
private static final String DATA_TYPE_CHM = "application/x-chm";
private static final String DATA_TYPE_TXT = "text/plain";
private static final String DATA_TYPE_PDF = "application/pdf";
private static final String DATA_TYPE_RTF = "application/rtf";
private static final String TAG = "FileUtil";
public static final String TXT = "txt";
public static final String JPG = "jpg";
......@@ -57,110 +45,22 @@ public class FileUtil {
if (file == null || !file.exists()) {
return;
}
String suffix = getSuffix(file);
String type;
switch (suffix) {
case "doc":
case "docx":
type = DATA_TYPE_WORD;
break;
case "pdf":
type = DATA_TYPE_PDF;
break;
case "ppt":
case "pptx":
type = DATA_TYPE_PPT;
break;
case "xls":
case "xlsx":
type = DATA_TYPE_EXCEL;
break;
case "rtf":
type = DATA_TYPE_RTF;
break;
case "mpg":
case "mpeg":
case "3gp":
case "mp4":
type = DATA_TYPE_VIDEO;
break;
case "m4a":
case "mp3":
case "mid":
case "xmf":
case "ogg":
case "wav":
type = DATA_TYPE_AUDIO;
break;
case "gif":
case "jpg":
case "jpeg":
case "png":
case "bmp":
type = DATA_TYPE_IMAGE;
break;
case "txt":
case "sh":
type = DATA_TYPE_TXT;
break;
case "html":
type = DATA_TYPE_HTML;
break;
case "xml":
case "rss":
type = "application/rss+xml";
break;
case "js":
type = "application/javascript";
break;
case "chm":
type = DATA_TYPE_CHM;
break;
case "json":
type = "application/json";
break;
case "class":
type = "application/java-vm";
break;
case "jar":
type = "application/java-archive";
break;
case "gtar":
type = "application/x-gtar";
break;
case "tar":
type = "application/x-tar";
break;
case "css":
type = "text/css";
break;
case "7z":
type = "application/x-7z-compressed";
break;
case "swf":
type = "application/x-7z-compressed";
break;
case "zip":
type = "application/zip";
break;
case "csv":
type = "text/csv";
break;
case "apk":
type = DATA_TYPE_APK;
break;
default:
type = DATA_TYPE_ALL;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri;
uri = FileProvider.getUriForFile(context, context.getPackageName() + ".debugfileprovider", file);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(uri, type);
if (intent.resolveActivity(context.getPackageManager()) == null) {
intent.setDataAndType(uri, DATA_TYPE_ALL);
Uri uri;
try {
uri = FileProvider.getUriForFile(context, context.getPackageName() + ".debugfileprovider", file);
String type = context.getContentResolver().getType(uri);
intent.setDataAndType(uri, type);
intent.putExtra(Intent.EXTRA_STREAM, uri);
if (intent.resolveActivity(context.getPackageManager()) == null) {
intent.setDataAndType(uri, "*/*");
}
context.startActivity(intent);
} catch (IllegalArgumentException e) {
LogHelper.e(TAG,
"The selected file can't be shared: " + file.toString());
}
context.startActivity(intent);
}
public static boolean isImage(File file) {
......@@ -195,15 +95,6 @@ public class FileUtil {
return false;
}
public static boolean isTxt(File file) {
if (file == null) {
return false;
}
String suffix = getSuffix(file);
return TXT.equals(suffix);
}
/**
* @param file
*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册