diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 14c79cf..b141559 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -211,7 +211,10 @@ android:name=".func.level.idetection.LevelIDetectionStationSettingActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:label="i角检测" /> - + \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/MainActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/MainActivity.java index d737b88..cb808e4 100644 --- a/app/src/main/java/com/bingce/controlnetwork/activity/MainActivity.java +++ b/app/src/main/java/com/bingce/controlnetwork/activity/MainActivity.java @@ -5,7 +5,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.graphics.Color; -import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.util.Log; @@ -44,12 +43,10 @@ import com.bingce.controlnetwork.activity.backup.launch.BackupImportHelper; import com.bingce.controlnetwork.activity.user.LoginActivity; import com.bingce.controlnetwork.activity.user.RegisterActivity; import com.bingce.controlnetwork.activity.user.UserInfoActivity; -import com.bingce.controlnetwork.bean.MainUserBean; import com.bingce.controlnetwork.fragment.MainSurveyFragment; import com.bingce.controlnetwork.fragment.ProjectListFragment; import com.bingce.controlnetwork.newui.configfragment.ConfigFragment; import com.bingce.controlnetwork.newui.mefragment.MeFragment; -import com.bingce.controlnetwork.util.CheckControlUpdateUtil; import com.bingce.controlnetwork.viewmodel.MainActivityViewModel; import com.bingce.data.sync.GlobalFlowCenter; import com.bingce.data.sync.utils.LeanCloudConfigLoader; @@ -63,21 +60,15 @@ import com.bingce.surveyor.agentweb.AgentWebActivity; import com.bingce.totalstation.TotalStation; import com.bingce.ui.TabEntity; import com.bingce.utils.ColorUtil; -import com.bingce.utils.CrashCollector; import com.bingce.utils.DateUtils; -import com.bingce.utils.LCDeviceUtil; import com.bingce.utils.SdkUtils; import com.bingce.utils.ServiceDateUtils; import com.bingce.utils.SoundPoolUtil; -import com.bingce.utils.StringUtil; -import com.bingce.utils.ThreadPoolUtil; -import com.bingce.utils.Util; import com.bingce.utils.VipManager; import com.daimajia.numberprogressbar.NumberProgressBar; import com.flyco.tablayout.CommonTabLayout; import com.flyco.tablayout.listener.CustomTabEntity; import com.flyco.tablayout.listener.OnTabSelectListener; -import com.jkyeo.splashview.SplashView; import com.mikepenz.iconics.IconicsDrawable; import com.mikepenz.material_design_iconic_typeface_library.MaterialDesignIconic; import com.tencent.mm.opensdk.openapi.IWXAPI; @@ -98,11 +89,9 @@ import java.util.List; import blankj.utilcode.util.ActivityUtils; import blankj.utilcode.util.ServiceUtils; -import blankj.utilcode.util.StringUtils; import blankj.utilcode.util.ToastUtils; import blankj.utilcode.util.Utils; import cn.leancloud.LCException; -import cn.leancloud.LCFile; import cn.leancloud.LCObject; import cn.leancloud.LCQuery; import cn.leancloud.LCUser; @@ -163,19 +152,6 @@ public class MainActivity extends BaseMainActivity implements Device.IDeviceConn } }); } - - updateHeaderResult(); - - LCDeviceUtil.updateDeviceInfo("controlnetwork", ((App) Utils.getApp()).registerCodeV2, null); - - checkAgreementPermission(); - - //解决某个版本的bug: - //由于升级数据库,导致限差方案丢失,所以启动的时候检测所有project,为没有限差的项目重新添加限差 -// DatabaseFixUtils.changeDefaultTolerance(); - //尝试上传crashLog - ThreadPoolUtil.execute(() -> CrashCollector.tryUploadCrashLogInWorkerThread(this, CrashCollector.APP_LABEL_CONTROL)); - LeanCloudConfigLoader.loadLeanCloudConfig(); } /** @@ -475,14 +451,6 @@ public class MainActivity extends BaseMainActivity implements Device.IDeviceConn //如果是从其他Activity返回到MainActivity时,不显示广告,如果是从后台切换出来,检查并显示广告; //一定放到super.onResume前,否则TopActivity始终是MainActivity,因为App的onActivityResumed在super.onResume内执行 - if (((App) Utils.getApp()).isUserStatusChanged) { - ((App) Utils.getApp()).isUserStatusChanged = false; -// if (drawerLeft != null) -// drawerLeft.openDrawer(); -// if (accountHeader != null) -// accountHeader.toggleSelectionList(MainActivity.this); - updateHeaderResult(); - } //按照设置选项,保持屏幕常亮,放在onResume而不放在onCreate里是因为,用户更改设置后返回主页就要开始常亮了 boolean isWakeLock = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("key_is_wake_lock", false); if (isWakeLock) { @@ -693,240 +661,6 @@ public class MainActivity extends BaseMainActivity implements Device.IDeviceConn } } - /** - * 教程列表 - */ - public void showTutorialListDialog() { - new MaterialDialog.Builder(this) - .title(R.string.video_tutorial) - .items(new String[]{getString(R.string.bilibili) - , getString(R.string.tencent_video) - , getString(R.string.baidudisk) - , getString(R.string.surveyor_home)}) - .itemsCallback(new MaterialDialog.ListCallback() { - @Override - public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) { - switch (which) { - case 0: -// Intent intent1 = new Intent(); -// intent1.setClass(Utils.getApp(), AgentWebActivity.class); -// intent1.putExtra("short_url", "android_url_bilibili_tutorial"); -// startActivity(intent1); - AgentWebActivity.navigation2( - MainActivity.this, "android_url_bilibili_tutorial" - ); - break; - case 1: -// Intent intent2 = new Intent(); -// intent2.setClass(Utils.getApp(), AgentWebActivity.class); -// intent2.putExtra("short_url", "android_url_tencent_video_tutorial"); -// startActivity(intent2); - AgentWebActivity.navigation2( - MainActivity.this, "android_url_tencent_video_tutorial" - ); - break; - case 2: -// Intent intent3 = new Intent(); -// intent3.setClass(Utils.getApp(), AgentWebActivity.class); -// intent3.putExtra("short_url", "android_url_baidu_pan_tutorial"); -// startActivity(intent3); - AgentWebActivity.navigation2( - MainActivity.this, "android_url_baidu_pan_tutorial" - ); - break; - case 3: -// Intent intent4 = new Intent(); -// intent4.setClass(Utils.getApp(), AgentWebActivity.class); -// intent4.putExtra("short_url", "android_url_surveyor_home"); -// startActivity(intent4); - AgentWebActivity.navigation2( - MainActivity.this, "android_url_surveyor_home" - ); - break; - } - } - }).show(); - } - - /** - * 刷新左侧用户信息 - */ - public void updateHeaderResult() { - Log.d("updateHeaderResult", "updateHeaderResult"); -// if (drawerLeft == null || accountHeader == null) -// return; -// for (int i = accountHeader.getProfiles().size() - 1; i >= 0; i--) { -// accountHeader.removeProfile(accountHeader.getProfiles().get(i)); -// } - -// if (LCUser.getCurrentUser() == null || !LCUser.getCurrentUser().isAuthenticated()) { -// accountHeader.addProfiles( -// new ProfileSettingDrawerItem().withName(getString(R.string.log_in)) -// .withIcon(new IconicsDrawable(this).icon(MaterialDesignIconic.Icon.gmi_sign_in).paddingDp(5)) -// .withIdentifier(1000).withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { -// @Override -// public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { -// Intent intent = new Intent(Utils.getApp(), LoginActivity.class); -// intent.putExtra("finishTo", UserInfoActivity.class.getName()); -// startActivity(intent); -// return false; -// } -// })); -// } else { -// accountHeader.addProfiles(new ProfileSettingDrawerItem().withName(getString(R.string.user_info)).withIcon(new IconicsDrawable(this).icon(MaterialDesignIconic.Icon.gmi_account).paddingDp(5)).withIdentifier(1000).withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { -// @Override -// public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { -// startActivity(new Intent(MainActivity.this, UserInfoActivity.class)); -// return false; -// } -// })); -// } - - - updateProfileItem(); - } - - private void updateProfileItem() { - if (LCUser.getCurrentUser() != null) { - String nickname = LCUser.getCurrentUser().getString("nickname"); - LCFile avatarFile = LCUser.getCurrentUser().getLCFile("avatar"); - if (!StringUtils.isEmpty(nickname)) { -// ProfileDrawerItem item = new ProfileDrawerItem().withName(nickname).withEmail(LCUser.getCurrentUser().getUsername()).withIdentifier(1003); -// if (avatarFile == null) { -// item.withIcon(R.drawable.app_logo); -// } else { -// item.withIcon(avatarFile.getUrl()); -// } -// accountHeader.addProfiles(item); - - String avatarUrl = null; - if (avatarFile != null) { - avatarUrl = avatarFile.getUrl(); - } - - mainActivityViewModel.getRefreshLoginUserLiveData().setValue( - new MainUserBean(LCUser.getCurrentUser().getUsername(), - nickname, avatarUrl)); - } else { - LCObject userProfile = LCUser.getCurrentUser().getLCObject("profile"); - if (userProfile != null) { - userProfile.fetchInBackground().subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - - } - - @Override - public void onNext(LCObject avObject) { - if (isFinishing()) return; - String nickname = avObject.getString("nickname"); - LCFile avatarFile = avObject.getLCFile("avatar"); - if (!StringUtils.isEmpty(nickname)) { -// ProfileDrawerItem item = new ProfileDrawerItem().withName(nickname).withEmail(LCUser.getCurrentUser().getUsername()).withIdentifier(1003); -// if (avatarFile == null) { -// item.withIcon(R.drawable.app_logo); -// } else { -// item.withIcon(avatarFile.getUrl()); -// } -// accountHeader.addProfiles(item); - - //保存到_User,下次不再查Profile - LCUser.getCurrentUser().put("nickname", nickname); - - String avatarUrl = null; - if (avatarFile != null) { - LCUser.getCurrentUser().put("avatar", avatarFile); - avatarUrl = avatarFile.getUrl(); - } - LCUser.getCurrentUser().saveInBackground().subscribe(); - - - mainActivityViewModel.getRefreshLoginUserLiveData().setValue( - new MainUserBean(LCUser.getCurrentUser().getUsername(), - nickname, avatarUrl)); - } - } - - @Override - public void onError(Throwable e) { - } - - @Override - public void onComplete() { - - } - }); - } else { - new LCQuery<>("Profile") - .whereEqualTo("creatorId", LCUser.getCurrentUser().getObjectId()) - .findInBackground() - .subscribe(new Observer>() { - @Override - public void onSubscribe(Disposable d) { - - } - - @Override - public void onNext(List list) { - if (isFinishing()) return; - if (list != null && !list.isEmpty()) { - String nickname = list.get(0).getString("nickname"); - LCFile avatarFile = list.get(0).getLCFile("avatar"); - if (!StringUtils.isEmpty(nickname)) { -// ProfileDrawerItem item = new ProfileDrawerItem().withName(nickname).withEmail(LCUser.getCurrentUser().getUsername()).withIdentifier(1003); -// if (avatarFile == null) { -// item.withIcon(R.drawable.app_logo); -// } else { -// item.withIcon(avatarFile.getUrl()); -// } -// accountHeader.addProfiles(item); - - String avatarUrl = null; - - //保存到_User,下次不再查Profile - LCUser.getCurrentUser().put("nickname", nickname); - - if (avatarFile != null) { - LCUser.getCurrentUser().put("avatar", avatarFile); - avatarUrl = avatarFile.getUrl(); - } - LCUser.getCurrentUser().saveInBackground().subscribe(); - - mainActivityViewModel.getRefreshLoginUserLiveData().setValue( - new MainUserBean(LCUser.getCurrentUser().getUsername(), - nickname, avatarUrl)); - } - } - } - - @Override - public void onError(Throwable e) { - - } - - @Override - public void onComplete() { - - } - }); - } - } - } else { -// accountHeader.addProfiles(new ProfileDrawerItem().withEmail(getString(R.string.click_avatar_to_log_in)).withIcon(R.drawable.app_logo).withIdentifier(1003)); - mainActivityViewModel.getRefreshLoginUserLiveData().setValue( - new MainUserBean(null, - null, null)); - } - } - - /** - * 开启左侧菜单 - */ - public void openLeftDrawer() { -// if (drawerLeft != null) -// drawerLeft.openDrawer(); - } - @Override public void onDeviceConnectLost() { mainActivityUtils.onDeviceConnectLost(); diff --git a/app/src/main/java/com/bingce/controlnetwork/activity/ViewRecentCrashActivity.java b/app/src/main/java/com/bingce/controlnetwork/activity/ViewRecentCrashActivity.java new file mode 100644 index 0000000..c36a53a --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/activity/ViewRecentCrashActivity.java @@ -0,0 +1,62 @@ +package com.bingce.controlnetwork.activity; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.MenuItem; +import android.view.WindowManager; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; + +import com.bingce.controlnetwork.R; +import com.bingce.controlnetwork.util.CrashCollectUtils; +import com.bingce.utils.ThreadPoolUtil; + +import org.polaric.colorful.ColorfulActivity; + +public class ViewRecentCrashActivity extends ColorfulActivity { + + @SuppressLint("SourceLockedOrientationActivity") + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_view_recent_crash_log); + Toolbar mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + if (getSupportActionBar() != null) + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + TextView textView = findViewById(R.id.tv_content); + if (textView != null) { + ThreadPoolUtil.execute(() -> { + CrashCollectUtils.collectCrashLogInWorkerThread((cloudTable, appLabelKey, fileNameKey, contentKey, uuidKey, crashContent) -> { + if (!TextUtils.isEmpty(crashContent)) { + runOnUiThread(() -> textView.setText(crashContent)); + } + }); + }); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + break; + } + return super.onOptionsItemSelected(item); + } + + public static void start(Context context) { + Intent intent = new Intent(context, ViewRecentCrashActivity.class); + context.startActivity(intent); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bingce/controlnetwork/newui/configfragment/ConfigFragment.kt b/app/src/main/java/com/bingce/controlnetwork/newui/configfragment/ConfigFragment.kt index 0dda3df..24be276 100644 --- a/app/src/main/java/com/bingce/controlnetwork/newui/configfragment/ConfigFragment.kt +++ b/app/src/main/java/com/bingce/controlnetwork/newui/configfragment/ConfigFragment.kt @@ -30,10 +30,12 @@ class ConfigFragment : BaseFragmentBinding() { //管理 mBinding.ilInstrumentManagement.iv.setImageResource(R.mipmap.icon_ts_connecting) mBinding.ilInstrumentManagement.tv.setText(R.string.total_station_online) + mBinding.ilLevelConnect.iv.setImageResource(R.mipmap.ic_level_connect) + mBinding.ilLevelConnect.tv.text = "水准仪联机" mBinding.ilPrismManagement.iv.setImageResource(R.mipmap.icon_prism_manager) mBinding.ilPrismManagement.tv.setText(R.string.prism_manager) mBinding.ilCustomTolerance.iv.setImageResource(R.mipmap.ic_tolerance_24) - mBinding.ilCustomTolerance.tv.setText("自定义限差") + mBinding.ilCustomTolerance.tv.text = "自定义限差" //三角导线联系测量 mBinding.ilExportMeasure.iv.setImageResource(R.mipmap.ic_export) mBinding.ilExportMeasure.tv.setText(R.string.export) @@ -56,7 +58,11 @@ class ConfigFragment : BaseFragmentBinding() { // val intent = Intent(activity, ConnectTSActivity::class.java) // intent.putExtra("customChannel", AppChannel.customChannel) // startActivity(intent) - SelectDeviceTypeUtil.showDeviceTypeDialog() + SelectDeviceTypeUtil.connectTsActivity() + } + mBinding.ilLevelConnect.root.setOnClickListener { + //水准仪联机 + SelectDeviceTypeUtil.connectLevelActivity() } mBinding.ilPrismManagement.root.setOnClickListener { //棱镜管理 diff --git a/app/src/main/java/com/bingce/controlnetwork/newui/mefragment/MeFragment.kt b/app/src/main/java/com/bingce/controlnetwork/newui/mefragment/MeFragment.kt index 9ec0a21..1971a05 100644 --- a/app/src/main/java/com/bingce/controlnetwork/newui/mefragment/MeFragment.kt +++ b/app/src/main/java/com/bingce/controlnetwork/newui/mefragment/MeFragment.kt @@ -15,6 +15,7 @@ import cn.leancloud.LCUser import com.bingce.controlnetwork.R import com.bingce.controlnetwork.activity.AboutActivity import com.bingce.controlnetwork.activity.SettingsActivity +import com.bingce.controlnetwork.activity.ViewRecentCrashActivity import com.bingce.controlnetwork.activity.backup.BackupExportActivity import com.bingce.controlnetwork.activity.backup.launch.BackupImportHelper import com.bingce.controlnetwork.activity.user.LoginActivity @@ -22,7 +23,6 @@ import com.bingce.controlnetwork.activity.user.UserInfoActivity import com.bingce.controlnetwork.databinding.NewFragmentMeBinding import com.bingce.controlnetwork.newui.base.BaseFragmentBinding import com.bingce.controlnetwork.viewmodel.MainActivityViewModel -import com.bingce.surveyor.agentweb.AgentWebActivity import com.bumptech.glide.Glide /** @@ -84,6 +84,8 @@ class MeFragment : BaseFragmentBinding() { } mBinding.llAbout.setOnClickListener { //关于 + Log.d("hwhw", "ss" + 5 / 0) + startActivity(Intent(requireContext(), AboutActivity::class.java)) } mBinding.llUser.setOnClickListener { @@ -95,6 +97,11 @@ class MeFragment : BaseFragmentBinding() { startActivity(intent) } } + + mBinding.llViewException.setOnClickListener { + //查看异常 + startActivity(Intent(requireContext(), ViewRecentCrashActivity::class.java)) + } } override fun onOptionsItemSelected(item: MenuItem): Boolean { diff --git a/app/src/main/java/com/bingce/controlnetwork/util/CrashCollectUtils.java b/app/src/main/java/com/bingce/controlnetwork/util/CrashCollectUtils.java new file mode 100644 index 0000000..e433601 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/util/CrashCollectUtils.java @@ -0,0 +1,101 @@ +package com.bingce.controlnetwork.util; + +import android.content.Context; + +import com.bingce.utils.FileUtil; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.FileUtils; +import blankj.utilcode.util.Utils; + +public class CrashCollectUtils { + public static File crashLogFolder(Context context) { + File cacheFolder = context.getExternalCacheDir(); + if (!cacheFolder.exists() || cacheFolder.isFile()) { + cacheFolder.mkdir(); + } + File dir = new File(cacheFolder, "crash"); + if (!dir.exists() || dir.isFile()) { + dir.mkdir(); + } + return dir; + } + + //收集崩溃日志,在处理完成后根据结果删除 + public static void collectCrashLogInWorkerThread(ICrashLogCollectListener listener) { + File dir = crashLogFolder(Utils.getApp().getApplicationContext()); + //读取其下面的数据 + if (!dir.exists() || dir.isFile()) { + return; + } + + StringBuilder sb = new StringBuilder(); + + File[] files = dir.listFiles(); + + if (files != null) { + List needMoveFileList = new ArrayList<>(); + File lastFile = null; + for (File file : files) { + if (file == null || !file.isFile()) { + continue; + } + + if (lastFile == null) { + lastFile = file; + } else { + if (file.lastModified() > lastFile.lastModified()) { + lastFile = file; + } + } + + needMoveFileList.add(file); + } + needMoveFileList.remove(lastFile); + + for (File file : needMoveFileList) { + moveToBackedUpFolder(dir, file); + } + + if (lastFile != null) { + FileUtil.ReadFileResult readFileResult = FileUtil.readStringFrom(lastFile); + if (readFileResult.success) { + sb.append(readFileResult.string).append("\n"); + } + } + } + + String CRASH_LOG_TABLE = "CloudCrashLog"; + final String contentKey = "crash_content"; + final String fileNameKey = "file_name"; + final String appLabelKey = "app"; + final String uuidKey = "UUID"; + listener.onCollected(CRASH_LOG_TABLE, appLabelKey, fileNameKey, contentKey, uuidKey, sb.toString()); + } + + private static void moveToBackedUpFolder(File dir, File targetLogFile) { + File repeatedFolder = new File(dir, "BACKED_UP"); + if (!repeatedFolder.exists()) { + repeatedFolder.mkdirs(); + } + FileUtils.move(targetLogFile, new File(repeatedFolder, targetLogFile.getName())); + } + + public interface ICrashLogCollectListener { + void onCollected(String cloudTable, String appLabelKey, String fileNameKey, String contentKey, String uuidKey, + String content); + } + + public static class CrashItem { + public final File file; + public final String content; + + CrashItem(File file, String content) { + this.file = file; + this.content = content; + } + } +} diff --git a/app/src/main/java/com/bingce/controlnetwork/util/SelectDeviceTypeUtil.java b/app/src/main/java/com/bingce/controlnetwork/util/SelectDeviceTypeUtil.java index 32cec2e..4dafc29 100644 --- a/app/src/main/java/com/bingce/controlnetwork/util/SelectDeviceTypeUtil.java +++ b/app/src/main/java/com/bingce/controlnetwork/util/SelectDeviceTypeUtil.java @@ -21,18 +21,27 @@ public class SelectDeviceTypeUtil { public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) { switch (which) { case 0: - Intent intent = new Intent(ActivityUtils.getTopActivity(), ConnectTSActivity.class); - intent.putExtra("customChannel", AppChannel.customChannel); - ActivityUtils.getTopActivity().startActivity(intent); + connectTsActivity(); break; case 1: - Intent intent2 = new Intent(ActivityUtils.getTopActivity(), ConnectLevelActivity.class); - intent2.putExtra("customChannel", AppChannel.customChannel); - ActivityUtils.getTopActivity().startActivity(intent2); + connectLevelActivity(); break; } } }).show(); } + public static void connectTsActivity() { + Intent intent = new Intent(ActivityUtils.getTopActivity(), ConnectTSActivity.class); + intent.putExtra("customChannel", AppChannel.customChannel); + ActivityUtils.getTopActivity().startActivity(intent); + } + + public static void connectLevelActivity() { + Intent intent2 = new Intent(ActivityUtils.getTopActivity(), ConnectLevelActivity.class); + intent2.putExtra("customChannel", AppChannel.customChannel); + ActivityUtils.getTopActivity().startActivity(intent2); + } + + } diff --git a/app/src/main/res/layout/activity_view_recent_crash_log.xml b/app/src/main/res/layout/activity_view_recent_crash_log.xml new file mode 100644 index 0000000..cde4dd2 --- /dev/null +++ b/app/src/main/res/layout/activity_view_recent_crash_log.xml @@ -0,0 +1,21 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/new_fragment_config.xml b/app/src/main/res/layout/new_fragment_config.xml index efe1014..dd02c00 100644 --- a/app/src/main/res/layout/new_fragment_config.xml +++ b/app/src/main/res/layout/new_fragment_config.xml @@ -35,6 +35,14 @@ android:layout_height="wrap_content" android:layout_weight="1" /> + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-xxhdpi/ic_level_connect.png b/app/src/main/res/mipmap-xxhdpi/ic_level_connect.png new file mode 100644 index 0000000..0284389 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_level_connect.png differ