From 5217146bddc5d6115dcddf1e90f221ac9a1705a6 Mon Sep 17 00:00:00 2001 From: Fankesyooni Date: Tue, 10 May 2022 15:35:44 +0800 Subject: [PATCH] Created AppErrorsDemo demo-app --- demo-app/.gitignore | 1 + demo-app/build.gradle | 77 ++++++++ demo-app/consumer-rules.pro | 0 demo-app/proguard-rules.pro | 21 +++ .../demo_app/ExampleInstrumentedTest.kt | 24 +++ demo-app/src/main/AndroidManifest.xml | 25 +++ demo-app/src/main/cpp/CMakeLists.txt | 48 +++++ demo-app/src/main/cpp/demo_app.cpp | 7 + .../application/DemoApplication.kt | 34 ++++ .../fankes/apperrorsdemo/native/Channel.kt | 47 +++++ .../apperrorsdemo/ui/activity/MainActivity.kt | 38 ++++ .../ui/activity/base/BaseActivity.kt | 69 +++++++ .../utils/factory/FunctionFactory.kt | 37 ++++ .../res/drawable-night/bg_permotion_round.xml | 6 + .../src/main/res/drawable/bg_button_round.xml | 10 ++ .../main/res/drawable/bg_permotion_round.xml | 6 + .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++++ .../res/drawable/ic_launcher_foreground.xml | 15 ++ .../src/main/res/layout/activity_main.xml | 132 ++++++++++++++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1259 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3084 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1067 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2066 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 1838 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 4468 bytes .../src/main/res/mipmap-xxhdpi/ic_back.png | Bin 0 -> 3633 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 2730 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 6998 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 3861 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 10335 bytes demo-app/src/main/res/values-night/color.xml | 6 + demo-app/src/main/res/values-night/themes.xml | 16 ++ .../src/main/res/values-zh-rCN/strings.xml | 11 ++ demo-app/src/main/res/values/color.xml | 6 + demo-app/src/main/res/values/colors.xml | 11 ++ .../res/values/ic_launcher_background.xml | 4 + demo-app/src/main/res/values/strings.xml | 10 ++ demo-app/src/main/res/values/themes.xml | 16 ++ .../demo_app/ExampleUnitTest.kt | 17 ++ settings.gradle | 3 +- 40 files changed, 866 insertions(+), 1 deletion(-) create mode 100644 demo-app/.gitignore create mode 100644 demo-app/build.gradle create mode 100644 demo-app/consumer-rules.pro create mode 100644 demo-app/proguard-rules.pro create mode 100644 demo-app/src/androidTest/java/com/fankes/apperrorstracking/demo_app/ExampleInstrumentedTest.kt create mode 100644 demo-app/src/main/AndroidManifest.xml create mode 100644 demo-app/src/main/cpp/CMakeLists.txt create mode 100644 demo-app/src/main/cpp/demo_app.cpp create mode 100644 demo-app/src/main/java/com/fankes/apperrorsdemo/application/DemoApplication.kt create mode 100644 demo-app/src/main/java/com/fankes/apperrorsdemo/native/Channel.kt create mode 100644 demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/MainActivity.kt create mode 100644 demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/base/BaseActivity.kt create mode 100644 demo-app/src/main/java/com/fankes/apperrorsdemo/utils/factory/FunctionFactory.kt create mode 100644 demo-app/src/main/res/drawable-night/bg_permotion_round.xml create mode 100644 demo-app/src/main/res/drawable/bg_button_round.xml create mode 100644 demo-app/src/main/res/drawable/bg_permotion_round.xml create mode 100644 demo-app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 demo-app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 demo-app/src/main/res/layout/activity_main.xml create mode 100644 demo-app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 demo-app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 demo-app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 demo-app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 demo-app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 demo-app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 demo-app/src/main/res/mipmap-xxhdpi/ic_back.png create mode 100644 demo-app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 demo-app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 demo-app/src/main/res/values-night/color.xml create mode 100644 demo-app/src/main/res/values-night/themes.xml create mode 100644 demo-app/src/main/res/values-zh-rCN/strings.xml create mode 100644 demo-app/src/main/res/values/color.xml create mode 100644 demo-app/src/main/res/values/colors.xml create mode 100644 demo-app/src/main/res/values/ic_launcher_background.xml create mode 100644 demo-app/src/main/res/values/strings.xml create mode 100644 demo-app/src/main/res/values/themes.xml create mode 100644 demo-app/src/test/java/com/fankes/apperrorstracking/demo_app/ExampleUnitTest.kt diff --git a/demo-app/.gitignore b/demo-app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/demo-app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/demo-app/build.gradle b/demo-app/build.gradle new file mode 100644 index 0000000..6cb6ce9 --- /dev/null +++ b/demo-app/build.gradle @@ -0,0 +1,77 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +android { + namespace 'com.fankes.apperrorsdemo' + compileSdk 31 + + signingConfigs { + debug { + storeFile file('../keystore/public') + storePassword '123456' + keyAlias 'public' + keyPassword '123456' + v1SigningEnabled true + v2SigningEnabled true + } + } + + defaultConfig { + minSdk 21 + targetSdk 31 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + externalNativeBuild { + cmake { + cppFlags "" + } + } + } + + buildTypes { + release { + minifyEnabled false + signingConfig signingConfigs.debug + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + externalNativeBuild { + cmake { + path "src/main/cpp/CMakeLists.txt" + version "3.22.1" + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = '11' + freeCompilerArgs = [ + '-Xno-param-assertions', + '-Xno-call-assertions', + '-Xno-receiver-assertions' + ] + } + buildFeatures { + viewBinding true + } + lintOptions { + checkReleaseBuilds false + } +} + +dependencies { + implementation 'com.highcapable.yukihookapi:api:1.0.87' + implementation 'com.geyifeng.immersionbar:immersionbar:3.2.0' + implementation 'com.geyifeng.immersionbar:immersionbar-ktx:3.2.0' + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'com.google.android.material:material:1.6.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} \ No newline at end of file diff --git a/demo-app/consumer-rules.pro b/demo-app/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/demo-app/proguard-rules.pro b/demo-app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/demo-app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/demo-app/src/androidTest/java/com/fankes/apperrorstracking/demo_app/ExampleInstrumentedTest.kt b/demo-app/src/androidTest/java/com/fankes/apperrorstracking/demo_app/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..b85fcc4 --- /dev/null +++ b/demo-app/src/androidTest/java/com/fankes/apperrorstracking/demo_app/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.fankes.apperrorstracking.demo_app + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.fankes.apperrorstracking.demo_app.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/demo-app/src/main/AndroidManifest.xml b/demo-app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7d39d34 --- /dev/null +++ b/demo-app/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demo-app/src/main/cpp/CMakeLists.txt b/demo-app/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..24d218b --- /dev/null +++ b/demo-app/src/main/cpp/CMakeLists.txt @@ -0,0 +1,48 @@ +# For more information about using CMake with Android Studio, read the +# documentation: https://d.android.com/studio/projects/add-native-code.html + +# Sets the minimum version of CMake required to build the native library. + +cmake_minimum_required(VERSION 3.22.1) + +# Declares and names the project. + +project("demo_app") + +# Creates and names a library, sets it as either STATIC +# or SHARED, and provides the relative paths to its source code. +# You can define multiple libraries, and CMake builds them for you. +# Gradle automatically packages shared libraries with your APK. + +add_library( # Sets the name of the library. + demo_app + + # Sets the library as a shared library. + SHARED + + # Provides a relative path to your source file(s). + demo_app.cpp) + +# Searches for a specified prebuilt library and stores the path as a +# variable. Because CMake includes system libraries in the search path by +# default, you only need to specify the name of the public NDK library +# you want to add. CMake verifies that the library exists before +# completing its build. + +find_library( # Sets the name of the path variable. + log-lib + + # Specifies the name of the NDK library that + # you want CMake to locate. + log) + +# Specifies libraries CMake should link to your target library. You +# can link multiple libraries, such as libraries you define in this +# build script, prebuilt third-party libraries, or system libraries. + +target_link_libraries( # Specifies the target library. + demo_app + + # Links the target library to the log library + # included in the NDK. + ${log-lib}) \ No newline at end of file diff --git a/demo-app/src/main/cpp/demo_app.cpp b/demo-app/src/main/cpp/demo_app.cpp new file mode 100644 index 0000000..38aaa92 --- /dev/null +++ b/demo-app/src/main/cpp/demo_app.cpp @@ -0,0 +1,7 @@ +#include +#include + +extern "C" JNIEXPORT void JNICALL +Java_com_fankes_apperrorsdemo_native_Channel_throwNativeException(JNIEnv *env, jobject) { + throw std::exception(); +} \ No newline at end of file diff --git a/demo-app/src/main/java/com/fankes/apperrorsdemo/application/DemoApplication.kt b/demo-app/src/main/java/com/fankes/apperrorsdemo/application/DemoApplication.kt new file mode 100644 index 0000000..89d37dd --- /dev/null +++ b/demo-app/src/main/java/com/fankes/apperrorsdemo/application/DemoApplication.kt @@ -0,0 +1,34 @@ +/* + * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer. + * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com) + * https://github.com/KitsunePie/AppErrorsTracking + * + * This software is non-free but opensource software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * and eula along with this software. If not, see + * + * + * This file is Created by fankes on 2022/5/10. + */ +package com.fankes.apperrorsdemo.application + +import android.app.Application +import androidx.appcompat.app.AppCompatDelegate + +class DemoApplication : Application() { + + override fun onCreate() { + super.onCreate() + /** 跟随系统夜间模式 */ + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + } +} \ No newline at end of file diff --git a/demo-app/src/main/java/com/fankes/apperrorsdemo/native/Channel.kt b/demo-app/src/main/java/com/fankes/apperrorsdemo/native/Channel.kt new file mode 100644 index 0000000..cafd623 --- /dev/null +++ b/demo-app/src/main/java/com/fankes/apperrorsdemo/native/Channel.kt @@ -0,0 +1,47 @@ +/* + * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer. + * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com) + * https://github.com/KitsunePie/AppErrorsTracking + * + * This software is non-free but opensource software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * and eula along with this software. If not, see + * + * + * This file is Created by fankes on 2022/5/10. + */ +package com.fankes.apperrorsdemo.native + +object Channel { + + init { + System.loadLibrary("demo_app") + } + + fun throwRuntimeException() { + throw RuntimeException("Exception test") + } + + fun throwIllegalStateException() { + throw IllegalStateException("Exception test") + } + + fun throwNullPointerException() { + throw NullPointerException("Exception test") + } + + fun throwException() { + throw Exception() + } + + external fun throwNativeException() +} \ No newline at end of file diff --git a/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/MainActivity.kt b/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/MainActivity.kt new file mode 100644 index 0000000..3b2719f --- /dev/null +++ b/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/MainActivity.kt @@ -0,0 +1,38 @@ +/* + * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer. + * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com) + * https://github.com/KitsunePie/AppErrorsTracking + * + * This software is non-free but opensource software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * and eula along with this software. If not, see + * + * + * This file is Created by fankes on 2022/5/10. + */ +package com.fankes.apperrorsdemo.ui.activity + +import com.fankes.apperrorsdemo.databinding.ActivityMainBinding +import com.fankes.apperrorsdemo.native.Channel +import com.fankes.apperrorsdemo.ui.activity.base.BaseActivity + +class MainActivity : BaseActivity() { + + override fun onCreate() { + binding.titleBackIcon.setOnClickListener { onBackPressed() } + binding.throwRuntimeButton.setOnClickListener { Channel.throwRuntimeException() } + binding.throwIllegalStateButton.setOnClickListener { Channel.throwIllegalStateException() } + binding.throwNullPointerButton.setOnClickListener { Channel.throwNullPointerException() } + binding.throwExceptionButton.setOnClickListener { Channel.throwException() } + binding.throwNativeErrorButton.setOnClickListener { Channel.throwNativeException() } + } +} \ No newline at end of file diff --git a/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/base/BaseActivity.kt b/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/base/BaseActivity.kt new file mode 100644 index 0000000..b53b4d1 --- /dev/null +++ b/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/base/BaseActivity.kt @@ -0,0 +1,69 @@ +/* + * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer. + * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com) + * https://github.com/KitsunePie/AppErrorsTracking + * + * This software is non-free but opensource software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * and eula along with this software. If not, see + * + * + * This file is Created by fankes on 2022/5/10. + */ +@file:Suppress("UNCHECKED_CAST") + +package com.fankes.apperrorsdemo.ui.activity.base + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding +import com.fankes.apperrorsdemo.R +import com.fankes.apperrorsdemo.utils.factory.isNotSystemInDarkMode +import com.gyf.immersionbar.ktx.immersionBar +import com.highcapable.yukihookapi.hook.factory.method +import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass +import java.lang.reflect.ParameterizedType + +abstract class BaseActivity : AppCompatActivity() { + + /** 获取绑定布局对象 */ + lateinit var binding: VB + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + javaClass.genericSuperclass.also { type -> + if (type is ParameterizedType) { + binding = (type.actualTypeArguments[0] as Class).method { + name = "inflate" + param(LayoutInflaterClass) + }.get().invoke(layoutInflater) ?: error("binding failed") + setContentView(binding.root) + } else error("binding but got wrong type") + } + /** 隐藏系统的标题栏 */ + supportActionBar?.hide() + /** 初始化沉浸状态栏 */ + immersionBar { + statusBarColor(R.color.colorThemeBackground) + autoDarkModeEnable(true) + statusBarDarkFont(isNotSystemInDarkMode) + navigationBarColor(R.color.colorThemeBackground) + navigationBarDarkIcon(isNotSystemInDarkMode) + fitsSystemWindows(true) + } + /** 装载子类 */ + onCreate() + } + + /** 回调 [onCreate] 方法 */ + abstract fun onCreate() +} \ No newline at end of file diff --git a/demo-app/src/main/java/com/fankes/apperrorsdemo/utils/factory/FunctionFactory.kt b/demo-app/src/main/java/com/fankes/apperrorsdemo/utils/factory/FunctionFactory.kt new file mode 100644 index 0000000..52f6474 --- /dev/null +++ b/demo-app/src/main/java/com/fankes/apperrorsdemo/utils/factory/FunctionFactory.kt @@ -0,0 +1,37 @@ +/* + * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer. + * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com) + * https://github.com/KitsunePie/AppErrorsTracking + * + * This software is non-free but opensource software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * and eula along with this software. If not, see + * + * + * This file is Created by fankes on 2022/5/10. + */ +package com.fankes.apperrorsdemo.utils.factory + +import android.content.Context +import android.content.res.Configuration + +/** + * 系统深色模式是否开启 + * @return [Boolean] 是否开启 + */ +val Context.isSystemInDarkMode get() = (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES + +/** + * 系统深色模式是否没开启 + * @return [Boolean] 是否开启 + */ +inline val Context.isNotSystemInDarkMode get() = !isSystemInDarkMode \ No newline at end of file diff --git a/demo-app/src/main/res/drawable-night/bg_permotion_round.xml b/demo-app/src/main/res/drawable-night/bg_permotion_round.xml new file mode 100644 index 0000000..09cbc15 --- /dev/null +++ b/demo-app/src/main/res/drawable-night/bg_permotion_round.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/drawable/bg_button_round.xml b/demo-app/src/main/res/drawable/bg_button_round.xml new file mode 100644 index 0000000..c7bf8cb --- /dev/null +++ b/demo-app/src/main/res/drawable/bg_button_round.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/drawable/bg_permotion_round.xml b/demo-app/src/main/res/drawable/bg_permotion_round.xml new file mode 100644 index 0000000..b7d8b2b --- /dev/null +++ b/demo-app/src/main/res/drawable/bg_permotion_round.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/drawable/ic_launcher_background.xml b/demo-app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/demo-app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo-app/src/main/res/drawable/ic_launcher_foreground.xml b/demo-app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..4e096a3 --- /dev/null +++ b/demo-app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/layout/activity_main.xml b/demo-app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..6953bd0 --- /dev/null +++ b/demo-app/src/main/res/layout/activity_main.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/mipmap-hdpi/ic_launcher.png b/demo-app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8870dd239a3ec691167963b8f90dcd32d3787966 GIT binary patch literal 1259 zcmViSWpPXu-?(8(e}E{BGDjAqm&AY!2hJ6LW&GYi(1$}IVJi5 z*$=CKA`DVD>5r(ktSxCKg<%rLDwhjWx6{-4?(VevKIgUb-uo)|2j_tg_rCW$=X>7o zclVyb#wGIQ%a<=-*)Ark;Udk*721>Z8LN0b)yivmsj9t&1$Z$n;V#;sd67Hm1^u}@ zQ{X$}yTgO_QqE(fG86UfSg%F<{^=qHsx$jcdFeZ@y@kD2T;b0 zeX1=6H$s#>37Z&>Cp&4W2}k}EvX1sOexieT|3bPm?75QgT1CscF9Qc47_<$UwI-qq+Sl!iVUq2J*#TgR)j+5bY?#p=GRgD~!&7l3nI!5Lna9>hSla zAss%z>X#o`{c$t^=eQOQ2Xio2>cu6s0fEPE4)zpd-UWIeU2N-ALuvzB*}!UFZ|U9P z0=)yfg1J&JE~yM?=`2>mU)ljw3g$vX>c$~;0d>`~+WCq$8sW~d&~rc98fZ!Vs3acH z7ay}4Ia12$lVwat$~s)IY>O9m)Ek|@q9qvyS6C< zHeS;w`M(Xl_nqlJtR>fXk$6C1HmtM_8emZN8!#sO4Nu=;_eUXB0X=iKZLr#apeg&K z-~)1yctC!WcHjeY-~)27X%(xUhXZ!MX`3>9-8f-o$Eb)HYoym*<_%j(EMRwu^nU~mm%=s~ZX zUoEK*$gupm}3ykL#m6Ug0XvrStWnK{J2zyxMg;ucPgIo9Tl+ z1$wWqncff6dwuD-{9I|zxzLhFy24iE4GPw=*&kuE589j$5#4RoPCUaq-HbB*TO zi~|qwGP`LuT|`kIt#VZ$npv!)y28a&-!zLZ%QEmV>4hR}$`J}_=K){7eEG^m{R^Ql Vbh7 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%0Au&y%;ZZT#doJd9N&>5t_d?BZ zY^T>AapeF(d%O`~oekB;#zbTnFYqij$NkUqk@K@U=L$gK#brNtH9_IH| zpbdqrC}21;_LfFF>2>*WNa;UMX0eK#{opNzMwHQCjEgnulgcXzW#=L9a?sTv2J{iY z%Fs%)0~+=j;q&MB`uGiZ%Ew$wXhSimYFqhHqWqo3cwRtM=)J5*TKQcQ=*hVl7o;Ww zmPwq_V`N&N^*j2dPabAs0lq$=uy-5HK&=sSMr!*o8p9uch2$6yuPlPrg?fiyWc?RR=t||kh zlR+r$D&6FgxXUf$0V9FU?fN>F{Z7#Iea#7w`^?M$afE|b5UC^pCa6c7Mf_XtboDXB zBF_q2wuA?g^1Wdl>Y&e-&QtC6e;{Y%aY3iAUK4t5jhotcnc-2>jJsJHbCqX>{}j2n zH0>a#^R_017aTDjZ_;@YYC||yFI5TGC$u&Q8rjMP4Ei$~?-1QIf=C`|unuk7BCrTd zA9K`Y6skN_e102LaYuH#22^ob0`YdX`x?>xN=@CDkHR&6@Ys+fJ?I1t7lukIIyH{Y=EeV!%5rHI8{#4h0eI@q=DrHpmcmjhd0OdWHFl<1Q9ycy1vrXM! zmtE!UfZ6c4*ro}FC&&Q$01%FdlnRwctvL2fbno<1hIeYYsv#*N%zuhbpoYUr3&#s2 z+gyuT4ykUEcvb(w(Me4A^Ic+FVq3O-=a$ehh_XUS_{%$eeSOiYC3m{4{K3*A3czIU zCj$z$!4T7%rwJu%B&YFrNp38SHTw1EpGv^yZ%^DTR$`9_^O)6(BF@utG#J5BV8WE8 zZ@0y`k^sNKofR4VbQa{9Zt;NpEvr{6Ldxz3_p7MTgSp*mU0L~d@`lh3a@xeaNjGz! z3Ub5Hkf3IqJ(vnsCffTW0kUo~_Ba5PM$6Jw-?GaV*EGYDIEU#kj(rwmA4aLllot?| z)w3ka4(*5TpTEU`|7Vgc(ZFWMCnJjl^9}`LBxf#Q1t2KiP++w961O}x z(~#4n$8ox^MA!+K=@jQ&Y(pu(v!bwLom*A$pWwvZ@;gquai_Byxtee_`0wk#CAS*M zWv4{h(sF8cRQ=mF@qZIKq7m|I23*im0Nk*vE#aEr~Jy*3Dcu!&Gj zObbcg$o3u)F14bcddqiz2k4d9uTm# Lbi~w}`=tFBNqyK~ literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..457cdf289bfcf6772fb538f4ae5536be9758b4ce GIT binary patch literal 2730 zcmaJ@dpHw%AD_uETTYrw5z0;`iZnwk6KXq&RgPP7U4$aaEtf2sV~$dJ#hGzL zORKu!G}7_Ga8cR^`*kdo4)sn$9Zq+J(w|=N-o93e{Hn(DnKXeSEB`3@*@yO9rL4^n z35mBKD!6lF--Z?@o!%mNF`|v31VbU24(2HulcYj za6mFzSI5Dg9|5Pmkt%NAkRxel^amARN3y*P+zqZ8;ABKvl=rD7K3Ki(6vpn9d2wP+ zD?{^qsuASl2oeXaaS9$i`J}P%in~CM%f#BQJZ>wsAX#1T49|HCP*03F*4lb~v0if& zb(d708FD1{t=FgnyqK$m)2n*^)kDf+ruuZo3Nwk$PT%mQU-Wt$mOE#2VD2cq}&sDuPV4JI7 zOg3@1_Vo`Q&OM(|Y28#Q7ib-n4SlQo2FWnerZBNmNZiGwHpom@a93(%;ensew<0q- zvO<=^t|mJX_8TM|PGf$QM&aIfdT)$>?myP@;m=k}!u}42YfR===|Et1#TO)&_$*b~ zjw&sO{kC36F>GCk3wR#mM4UwZ(SDmfUxeYst8;6D+t9bmD-L$s?+R4kx6-4PZ9#k{ zUyJco?}#8&KeYh$g=M}rCKhCAWa6olP1@WX-1}rpjh`gXzX$RzQ74~9V-{h*#gc$2 zSiGu?B-s3rDG>`t{1m@S>`)371DApQW`6JAMH_I(8Q&l;nr(je7Y_ko#66&*3?~uT z+*mcJlqEg?k#kNGhS0h)7C6^Dwk7{IvB|l$08+eA;@G|O&t$MO}%wmjQ$3TA5x!CcMpwQRorz)M~ zQ^H<#h#0uBa@>2d^O0k|(4y!Y+L7)o<9x_in$t2REZ=Z-{;Tb{3<-E&P+dO+Uu*HB ze|z2TF^wJtIq54?V0-WhUi|t$0BIWtZ>O5urAwuzGX|3%c>dz(yNz2 zW>e5uFS0C%-K9*^pG{4g=vLPBMBoql`5c+&^PD$i2A?p%I?1*f{Xx%_! z#T_qSd^EzN|YkjQR<=W%Z&RHW?gK*mcoiVu3k_bR9MUeQYZUos{4Ub&>A!~|0@0#Ihb6v;p(QS$hQVDH5*(_Jl*9*Hl$&+KTH z_WL;=|Hpgxe~;ncMe|`G+R)5XF)R>Pa?((Z3v8q3Bcv$aT0r_&iX*f1GxyMm2gYYL z@Ik|p6}~k}m(iwU2fMXTs>ik4W?~=kdt6MMn)96C;q$e(M!VupGYUtslB5{bR|pp8Dha{3*IlVOsp756IJlm1-uBA=6# zX6o6$GACf1j3XiNzq%cB2_r83k%&5%64c6|;XrDaHK!76n)7BrInyr#LxWktS^GBM;uzq4)ei0=2XZm?*P+V&sw17jlO%7x_+WwhTHopM9*LLO#$O8I zko7?R;DI?yYXdBH3=WBg1 zp(yZF=ofUj=*T60m4bK-H1$ZxzwK!3AWy)f5c1o6CS4RQD2Mk|^o9 z`xs`V^1?{=+&N?qmr&Pmr^ve^?B(&uEbkn+_>N1mv^eaCYL#&K`54)*z6t1uQ3BDjOI}@#kPZ%GpH?ft+Ea$A6E2TjlMA7X$oaxgu}6|2 z6fs>>RDnThN{frLhkcp|^4#w&9cq=sd2}`j$9VaJu}hh}`|N~7D7d|!v*SSlI14ND JveT~j{sA5RHpBn` literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/demo-app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..8c0275c9dce51cd565baaed39a786c533d970b83 GIT binary patch literal 6998 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 literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/demo-app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..07849073f3cf0b463d65b023bb6cfbd770fe4567 GIT binary patch literal 3861 zcmb_fc{G&o+keK4u?(gVW5}M8ma&B>L|H?Tgv!26mSh=(v1chuW#1ywcMQtTV1|%2 zVvMDHM;KXRkR?lgQ+?m}_t*QL-+Rt`&T~D_Irn{EpL2aa_kCZ_b;X((>2R_m*#Q9H z)YH|z&iE3487q|WzW(VR3jlC^($m&7!`%6n6OhD9KH3>t$#Nu_?<3R@|f^cMcj1>3rnfE zOx@>5h@aoz&4iWjRUGC1Y2S+cX}()qRvWL!>}eY-O1t}hEtDYzao)?<{)5N&?CF$2 ze!co!=_7#zvlL!1oCxdSsWIj*%AQ~E8*eE*@%3qrT}mreP@TS>;r-I%*)@)Tb-X22WjgLM|BO$|iau{RG}do2Tg0YyZYiF@NCMYLmGA z)(reCSq}(Lpf2)5YO6+I8UZzW!qnjyZ8k!r>i~?$Q9vzqD^s;wB&A{-e-E8J=N%LZ z#cD&CDtb;uD;X#AKkkIKqT|(C>cv7=4h$oN(Cj~zn37a$C-meaBbil)&aKzYDvX8b z;1j|rsdWmRmKQB|GGe+XA7%HCK!-aY)psY@Ks z0mQPa16Ef7zPuC8B(y(g8i<}d+n(|sPQ+GEJ0igv1;r>}D_3-mh&Eytz1vG9Pdl9d zGwM(262iC-4%Sy{8bR_;iC{I272k6($X>MtmP?;Ln5upVWGf%(29hqe{{Uvt)W$@eQGle|c{U=I;bH;a1|fQZq-HEg^mX+A*}Rfd z6U@_uUXhpLs4H>IHII=d@%xPs5>N-_sP%ec?&&_X&>v952C9j5FN6-KP!FMiveiEM z>K$q@{@F*jxfsjO8^`cY&zbWmH*Ks&rG6p6+}`G;9YO$Ubv5_PS07&d`5xgNLaz^I zu8DHz8^LCpWbJ=~5P>?N7%|#2PTLyWP{%Jfif=cRkj_<{4%!W2HL-6k*5c53y*jt| zv+9+M4RN;x`7qebW~q$nYXp*~M#=`zXG{2=V~nnz&dDD;Us!%=fM`&|$U+xOwVNj_6EEWp zv(G+y68?l@O1DfnJhInPe*>oy5kB3{3nemNd{AO;d|FY=1)fI)Hs{bVtD z=Z0ldgC?%FCNp5C@sDf&nrcTk_um zmL|bj9x5DQDw37dFgrB@31%+7koeiT*sx1M-3G9Rh*_-b*3Fv?6Zd46jjDctz|@m- zA_ZiF#fXkmd>=A5TE}jX8n~fgs`wmyZ~?A9;zsGumyKuU>q?xQC)-idL=ga`uIdWz zap-+}u>{wF4hBOXvx@#m#(qKi$6A`()5{|tgbJ2w)p&e&t6aPaaA0M6@npA&;(X9; zQ1y!|jlUx&M(MazyIvjeDGNhh!`%)|um$uv%Wwe?^#<;hyyTs+0(*Te>S=Z0N?(4LHH%`QUt=Dk70_-c%UA78wNE{2BeckvG=Bc@ zlNjXC;(06@^oZTMC1Rasdt$bTi-p~-c6Uq!len~ne}@9Dt=1mVe3}$Y`tPMsn*$W^ zq8*TAgNjxmu#zMok`J6DiNFrn0VxphAxjR86dT}@%tere-&6A}iVu9b7pr<|w1c%r zM>X7ji!Z@3QH1aN_q7M4H|})du@$RWTcCi+U%zeNuL10D@#M?h0Fq(d<=6`$7AR=P z+fFzv@RH}|_BpP}t4}~Dr0Rr#yhr0uc9SwJrw#CjSks`tOk zvC5`lyv)H*&Y^nyJN7_3;aAUn$y{1Jjd89Uh%*Mx;3x}=&OXLwITfZ;<}Tln>4@^SlL;7-z)PSpncgaZ%s9^qH%Q z1r7ESVc6fvdC`!S0~`Nv8H3La63+}(8?vf!AI4fP?QlbW#TO`fj&kmjzSsfeB4)(7b?m{)p{l9gx+X14d#I)#J+j+ zIPxKpY>L1thcznqir~mAD;q`z!tXB$l(!=gFnhauK|#`3&?AXagS#j*9IiNEG1A%G zt=hfPTy;{m!(;K?lKbQeT}X|;oP?IW(#^O(92(rpjruqkuDW4H8Q-j|k3&1TRC_&P zY3}$yS5;&AP<=Pg4gsXN{eRn+BUnCHdqDS@vIrI(-2<#EZ?DSAeNGQm`c+bu7;*73lo{M?k}H%M3Zd^4iAfz3{$sgMPvwoUU&1FY4h3tMhV+-$Ylh;Tp5+rMEN8YBP`tHtFA&eXznKAJ|pWyOI#o z(P|K2Z2Ookk%Trng$)jtTq!vOn$at|c;UM=pzMRoh1XphZfYd=MiWnNLEM6%>4_ zl84K*c>ScW1;8%e@Kez{o|bsR3ScxdbO-^INR**-5Ww)+CWtY~%4m5%c=jUCp%v8g zT?Y#S)UEF?M<3s!Y|9HM{&3TM)S>J10b+BU)5%Z_b8c4Ro0sp~f5srKQ19k(Wpdnu$sw8^n?R}Rv*VERc zGZ8esHR-*qHZYw@4dh9bpzAMf?%ZbM9)A#POz|!3fiYOu7(%lHsT}!hx(jg_?Al)b>UD8N*gTxY&Qqs8}KJWYG z_5E?jb=@<+Gjr}Uab`}Wnu;tIIypK30Kk%$lY0OB?D}^>P@eDaSL{&%047FxDRE6N zqa#C9H_d^Tr;{ovzIJqA0Y-ehm?1->bE|M zKyY2NCGa{d*W1jLC};l97kw5hJhFKubRCV?gX#+M>f-*`3nmNitE-juqx9b;hSUor zv&ffs@M)DZqgu)ZSvyNw!JR=-|m<)FINeQZ5*x zydewdMVwOqAj$29F7eDBek++*jFQkd7!_zMM1F*55{#&Pey$$wJKY($AkGKzn- z9Z)_XY-|EF3&uyx!Fhxw$vrwvYY{`+YQt%UuA_|EMoCAg z8;+tC)BXd?8e_R{S*yCzbh&zLw?9O;87WpQ0kxb+vk$@*g=dN7Q;9CgD9;1T!3fiqL% zy6xx}L%LxFE+D8}RDK<|h*SdU;OCDx%9`MD>W`zE+5>`Vg0(^I31coN%pnd?+aLRD zeHgGLFVWdUii;1(t9|~*nhSBuJT6T`VpYeUJ|PD(VK|f_QDkuwzNUlmd*8Kt?#e-T z$1=NNnb@g@*1jJ2A;AmF3a!CdD}u@oGC>&P7a4y#-A8%uI_l!wec>Psu0vImkjqwy z2fgR-Knb|t?%u@0)PVbArFKYaop)cZ)a%rC4WDTa9fmQuv7miixB%Gr>OqF_KQW{CeGMr7QRwFkO zy!)QNC>C_+b4NZ!aBQ0Y9vro?D-uYXA;15=jPmZV4M)NL^y$py4K`ocasm4;=kUY$ zeuZnC+$Pta?z#i+05iMHpG&z9$c8kIEDh2owY@hrVe)QqIhXB7;gE_0g;vj4H{%8f zJ=cHYRPxS{flP2aTZ5)wv>j>E2_Ee z>sLjPbRoCoNI1U8lbp+oZxBkZPIY}168$Tre7BN;fp{|dM*OTBZ%RKB^W5*uL8rIk zPZ&J61gP)910#EVv1YA=lyc2oI*FYq6Mb&>Fq^-xP>LY2sZ&!E{pabl&Qi2P0To&O zwJM91L%HdJkW=sG=qr0N*--eW6Y0F|TT$Ze1)x(fD9D-B=N*57$f}OizDn%PxW%_~ zH8gkAPXV$?#z^t>i$V!&em5~-4KN8(UmnnkWDis>GBf%WrW`>m+J2b zgAV0uw%&@OHt_B3`Pp3Tq@2#_i7daC%sk1<3sji&MyzKg+p4a-DB<=l2r`349*KF+ z-{9VyTygZ$jevja)+>)~OGEr)^hG%M_Kdr65_?k4iyb&iPrb+&gxzT@_7WZom8M0? zI6|IHKo&e~Sg*!Ii>H1!v>BBBvfgx@=|BNDXd&3lf3*8*9ey|HC|rghNf1tv%borpMysVe+%$tVc=m zulZ+h13%<_X+I`aHD(>%GTt<0arP00>y&_4(ld?}7ohKHFPt2MG7sk=fkLp*MxvQ@ z`D2{sC89*#+$18m7B@fN%axoV`PAEA%q-_=8Y|Mgv&ilet7@{Bh&ANhaibmdc4IM7 zaFanMQDW6Z4*J1QtB1-CS3gE%*7F>j)Q=b6Evc97GCC3Jdp>&TWf%vaTJvMe%I~P- zB&x2irWQ{*VRJ2 zPDd=O6(b-$+t?Vab!T-Iei#^y9;}d}i6#D7tX=B|-s{_!lPL8+QIB!8fLWxEW$E*e z_Waq%#|?WmHXGr{D#=rEzC8B`H?zks&i8@o%KO+G%Tw{jAP4cx*~5=GUX*POnU$dO z^F7h7c7ejOl;II84uSi(WYSbRKi5(+a@kX^sM(H8Gpa=$G8!84Ed&YRX$<@^rN4sg zHohQ+cby+;&FHWc7a-0V&M6b{GLD0k|d5rUb zik9vUv#QRHr(k&F$QEGXJG!r$)QQTz;{a%^6+I%mxeKq;(!Xb8SUk1m%3bE0Oa*u` z+wX#S#P^_+)pZFYwdKrV0BU07*#F~eC>%1k8aH@}pqA%!r@Lx;oXrl!uY>rt%vnyp*T!;cF>-nGUNsk){ ze5J{rXi-fpij)Ko!Z*^W!~b%0j&n-7N0&<6IHw^MD=)QDTh(0_3z!SnDZVuWi0fCHe9z;BSGy{FSawcV^FXqhm zxiMFK>tAz8NC3o%A2#(VKAzg$@!U8-1}7gjO7=V=Gs)!=o~}^OR((!UycFC>Fv8Z! z6`O)Hm5DKCcb=JJwa(1&& zVN?doX7*v>17)VCT<%)Z9|^)AXbFRjDVf#ecX_jfO*8C_QaFvu2pF@=mvR+SgU%W{#Nh;)+%UO@tTE@!Asc>WXnw;_ zL6dYm@#<%Cn%eQi&sA2}pTfN7ZA@DPub&yH9MpdO=8Je2bTo=}ch2+%ReS3IC339# z1+o2uX0zzv!;R3rs|xdo?~|j@&$7f3=6|+brytrlVca!Sthy1n(nHybWDxTU*pkun zXlm_Vo3-;&>bR5BB)44~?e~Y3N69v2TOmJi|A?MN$o$TEA)YYBi)M;U`Rm$8q8lVXr$k*C`>L#gH@!$8_9Hi@V?1^Q@0SkL zK8phC%yu8UcW#P?-ds>I*ywAuk8^!fUtP`*>%b)TWz{-LyU+v(A9zU|wv4DM?KXO<1aldYGPoy8?;D9yWkL04MI6rdXRlZ+uut?+gV2L=k~# zr+;Hb@^14h7W+TJ89?zAW;8@oQ{l4HEpV7Q$aG89W;U$7@yVrUzgmd1Jst?E2W;Y0 zL&PkCzcV~cu(VQBcJQU-Vtsytn+me7^AUdh)Fx^~Cz^+h8{j1cpeJxc&&X@heXy|3 zltF_JNS5*VIQYQmR~a4xoSH?u<|J9q1K6T5orDPl7i-L}swGDviJD9FR4Tk~&n8{S zL3f%*P!fp}3FjA^a~v07ewJp+Y=BF|0N^MtdD=AxJ+ScSxo0RogH|BBtw0TELGzj4 zx=k;3fDWwY^PJWc3)BNBi49^602)WL#-}X^xgINZ(4HbtY2QBM*L?W1E?&|AYoR+a){(=qdZ)y7H96xkxk7uG zz!xzc^t`bwrC|$_@*4o>c?WuB{wj+WTYgefnSQr+STXh2PpxW(44WRSOoec>Cs^+d|E4 z9=@V~n+HYU>j7BNUjrIJvnzbbn~lnbLBhldjNoeupiBC!^cJQ2p9Kwo z0ppIA;-?is+++qh)MMzh$fpJdW@FLl#Q44adHi&A_T*}4PJk=X#p&K+bjGH{yo`yzulFl+%FScrQK>jnWm)Pl+1-Z z{|N8_v63`Uke5&zFDLdja+)lj=sIx<0GHcM)WCKfw-7lV{%qrYbwNtPFFdDo{3Vre zV7f3tdZ0-Yi;X7EliTX?J>zs;P8);LKX;H0z)nrPbm1LC4M$FMj#HEp>NWs)(Np>y zHP(Id#{t3%Y)z|v9;NB+{7oB=Zm8DXNs!DBp<-^VKxbvvf`9pEBM!1OWtO2x|7BTg zgq=Ph-GGUr(k|0~{~Grp=+QmNP?V{bCi?K}K!FsxAMv0kG-%sgy@Q4BFaz@`aHUG4 zP3;v-4|X5jkIX)2#M{a;QAiU(1VFw~1nU7h2m)VIM_)Q~WVecDKT%QUm{kL&&`ez3 z<{%$DXbLJ@eA`^d`ty~a7T+3pqY5x1@iM3L^U){wL#1SEcy<0P0#hv?w%{XEXqfhg z$#H6w&ECC)Un6-A3;1Eu(*wIek`Yc}bl7{YWyz@!;LYKNj)o5x zzCGrD8HI?cLuZAjwJvq2udv|zJg4YD@5yT5CQX!Yz3%gDyaaucRxN=l*&wH!>i!1zD$$pEFa)1Lf}iupir+b3B<`) zD4DdThZ*GM>1-`vBvb6iFuFtkt;3Jq5b2nBasMIW8c^g6jM!^AjQPsl`YlW3%#!xu zuX%o71d$OQV7V%FOMQ^agfdt^Lsp3GQ2r;}vHp1wuQ%K&UW{d2lIuvt7hj;D4Ocz= zolq)<-a6&e#WQ1L>Sv$Y#WUw(hWv~$gZrO237JOh%F_0qa)}{ztrFfV>G!=>vk@j5 zp49W5(#duB=~fEe3>0Fk8%;T9=-t)-=gve72>$;->l`^1ONDzJFfAC#(rDTHyy<6Y ziU{0ItJ`-hXNZ(cd2%9sw&Z9$?0E=b+(>OU2pU zzrS*>?gRd_@DXGHf+kMNI2HPbzv)#B5|knnnAneGdZWhjd9UC9xXBLG4v%EO`$rpv zOp9dV%Q~&7+b_{S2ZUFgA_}nsi_gT;^OeVSXS3T&Dn?87Yet)&OtSt(Lo;CdU%(1~ zEj9J{IpVds;3A~s%eYd%ue`Amq ziYEzSJTtL|#fWt#V3!wVSJ9_O0Mnb87ICL$5vp&`k*`@3!1>sc+ah{CK*~%eiyBfM zTo-eNC_dv4%s;~Qk>76;PV?`^aCa5d{0IFNpp@{mVx%-LxqsmU(}WTE==`G|;ukwc zEqV}+QHV=vd(b!k7kQh|#r`~14f9SQQ_20e|u1F z%A~Namt5$|e>`0%D1IsT9sgs70}I`+$Nix!giJQTVX%l|maXvJrCIeONpwC9!ye2* z;UdT8YK%Ijdo4RvSD!)wP>tju@oV-<2K`^+!-`dNdnt~m>xolr9GqFWtliSrqM*orMxoBC` zIMW+1o2$J`v95Bcm==_TNu{x)m{x+FkS&>au`gd_r@y+5Qt$Be$|?uY33N< z#PKIkV5|l@i0RK>eI)I9{JJENQz1|o!`Ceh!(Rc*B5QBG0g$c}n(xJ1p_1FgMdy`w zuomhWSAkN(EY~>ZIB|}!UZ!XR{vuAKJ^q7{{zw<>jvRKojSwu=z%MZvL1>poSyP^Z_$MwD*9 zUVpb6Or3HudSpjiQp=M!Vxz*;;nutq_3`72)vjlV5-IbaOGBw2Pux>=4T%&un?UaE zhk9+twm!nx0{5N9);e`4GnH_7e4{U?2TG?hJwV5heN>?rZOR{W|JP@mmmvISUAl_$ zEY|{(EU6a>6nL9}?ox*8&;}~%@T|w0v&;95XVhD3abvu+H-ov3lBg=;soW}AkM`#B)&1`T`nY#X_=w~4OIS>RxogE}aOr@1E+ zStdnUZ?035r`??Q9pv;e!Cp57n)NWj-3rW7ta*o9B(l|U?!#EF7%34{alw7%dUqgv zhuT;|2QaP%by@6~ufKQ9I9#hA{c@mY#>=C|I4nb@M$+Iff&@NY;;*%Wl2!-V!L!mI zv%gMQ5d>m}WtVrs4>k6)CKRo4k`IQtB$R;`da!;J3*jpVCiN|>e@%fBoI2q*Sx|rC z-=z0!C-P~5cEf+xx4Wxt$CH@|7uy3U$oq`K-wu}CUn$o+rGLG&6Qjf?ac>ySRjwV? z&iOvNYOG^5cc%82m$;d@D$=eHGr2hR#5fC-#!HfLDJB@OHgW1-d0PXupzCgDRQ2Pv z7}v?u;PWvyf$drhFB{06P&XLTA*d1}zzdjl=cjK)9W#WQxIByTfLtOW&t;2e)UT;q zu7eCXW;2H&Dnk#7)u^5g@31ZWzpP$+elbAa_C)tgD(^B3*>u?7IEY88YIsV)U za*47&ug!KpVAxvrpWilphvs`W!llSHViHv#Xiu_ABQp{ldWj%k)aGnrU)Vj1?xKW! zGq)oL#iCX5=&vD^7`1_a`rMDqoRlz?Q%W-Hyo zHFtR*f|~flQT`X3zf43v^jqcZg;3aZLvCy#0Y75`yDnW!I;~;uRy3E>F8K$p={*@( zq_Ztk^Gkk|sur`WG{%{Nzs?7KtxYASf84jDbc0a8`@90j^FQiG!A5SXlD@zTKbdDkqyPqe^L+ROMH&m&7&L@GyK{8a&%c#Dw>-#YoaWjnpURHNl+MyxM zTviqC1o{U2J@fs1!|2DQi$5eUE#{hUmkP+oP;R4_uvqr|?2FDo{GclKaZIo$INadm zu8grx;vpR@=~NTR5lnX&Q&SIF|E+26lxTzZg3YUcx6sUg*i~RlhL^v<-m78Iv`J@d zAKi2YG-0c{&$byvN0o$;wlnQ*@3xo6?;Mmzg45{jUteQ0sVn~y9tMXz_`~{JHh#Yb zb`?RkBh{&KiWWOo%Z82QQDUMHO>E(n2AB^j9f*qn>FtVRoZY z76N63_pkXZ#=XQu%>2YUwUWDyxJs{aR17m@+v*|sNVK9VD5Dd+9>zLr}?7z{oMa(a*QE?Yd%o&tF!|&?h*V^oO&(%1O@CS_McfLClyjKRl_`Hbv zjp9XPR8ZT;eLHud0XE}#I*y6?-AF!YcuI z?2pjYvmsCW+yHKh^C?oFZr}vem%af;FE(r!zZXCCay9XdF_q$B0=1B?qi4=?4f%2S z%7&$AZjUl+z!*0#p}Vpms`(0E28|2Fi+-cT^>eaZxv>oDpTvBKd9pC^_CAHlCWrS^ zD=c~sbcg&|RDX{cNc_-0e#eqET4Uy}DCLT_eC?3bZ))$eOpyITw4a(%j`Xi$(!Tl! zusesii_71|rHqS(m{5xi!mq?Zo`Anw9E|0Eu?`aw`bF7ONi{gSyN}d|PNLkP^~5S* zVa7cdJ@67vEM%pDcb)%uk$uKF2!rnU9Nx`V`!UKjhQJdWYbBhcPv%a?yJ_X+96g!=JVA8{dd&6H@g<(`i^@vKd{Y1IPlFw8OENq%3s-- z+ZGLx#~ZAZ7^X{V*VloMT$v?VRyiLOIvro_%m$`GAG$`wu3Kl$-lK?LRwAy5UpsZ%kETg-u(EB9#lEF=yzPv+`#5 zAeB^pVp9Ixl|d%~KsHWnld>-viZ2IB9@9)CUB4aW@z^@12U|c!FFxZ^6y?Ts^l=GJ zHNB1F@IW}~!0G09Z)0_7UaRc?HHl`|8dr*A3}C>@4#Q4%2F4C6q*>Dn)JmmCj_(s? z{k@R$HvO36OvtxxKG_GbrIUihuZjECg*`q9xN@uy^Tdh>PNxgCKu_rf4hv5>P|R40 zMnX6epE|}b`nqSE0V8i*hUCiWdf7iIa}_S)M~ipcvR~cJ!aE;XM|5fh*US351?j-; z^bZ(JebvZk8@ttmT;FnsxKmXWu~cN&3*x30_FOO8Ns*$F`@!agkB^M(b1xIWzTdTF zuTW$rU(LBKcn@j9L?6BJNv-*UmXBgw9pWmjLO0mOmXME6GX#D?r1hJOXCjt&ev}mV z=IaZQJ7T}+4q`txs9(nBESoApCLt(Qd)JoMJfzzmEYtPY!6^z*E`j~&)S%?->aXus z-@I9ZAd%_|IVp}ZM{Eq3DqV3T!^p_rXo7$t_EfaZT{%xwzt0`gG*KNgxk6CC>`i+{ zj3)A~lfIbQK@pP$JjW?H3r2P?Gu#0cRV{s*)z zRJrNQ&!-6j_jwT&e6G=tadGTB#%aUnx9Mk=9;nCIv7BA2;{QD%?+%;d^9!?UfbShR zH9p0Vu#DMYN=o~xsX|EHFpM6=yx~(Vy8W^zgrtlhtD5{Bw}fWWA1o2Omc=)|yWLZqTb-)wh8i7u9;DW! zW^hwwq+XQgNcO-nVz;w~F9Zy66U%eZ!bEgz+vI5zvZOzV*MDM4u06E!68C=c%o>tq zL@f$PYS^DBjFxV~L3{9!xP}uB*yqM{h~?%vNzvq2PeK!K_7pE(-)TX;3~ayY7om$+ zL4;*YNY^@uV#4AMA?f0uYb>K_xloaVrGOp>S+&`XojL(rs2 z-)Pc@huo2&{wai)YL|F_8W;{OJ))a59yt&WsHmZGxS8wfqOx2KUYBnS(NpoQ&uCg5 zKcG!}>*u>0y^edvb8Bc1#Rom;fL#WSam+}=Xsh3?6tbJi9mZ>ZW<{)*qEcIw_e#Xu z>gJrW##%Di1yi`=io<H5z|`v+%2AvoT((ze+~Q>o7KwHAph10fCqB`pi>$^1D)Q z`0*2cu*X!WSJJ=Op@#oT*NSTs8-O?b;U`qk!N7q z!{x3cs?ljtAfTqaaH_Zb$O%cqVCN6(@P_mcH1aqPm(_(a#piV~l}^9O@8`EE2E=7n z2!m+}Hu>47h#{bfZ!W*G(VNKOp12ee!JW@VzhjaPT~ubAzOWD0hC$B0ubJ(-NzIx6 z?HAIRHG)N@R&}UcUv8*-)&m{zie!0Z$FHopmSaW4o=>?<@_o4x;ramK)Jfgf*!>px z;6aYY!5$s&`2O1C$|{~#YZV>Xb7_;rP3<^y;UAO<#l{|Og?hm^WMxqhK}$EGEaq6Q zg}mk-{#*k$W;U@kNtLv1+S_D4+P^98(|sCnMBhRK%mdb2BHDL9Tp2Y^+xI}BP;w^` zUd|g&gCxWIg&9<^W0+9ya2A}l?ZuCynYvcN6^ffnmFdEm@g<`YE=yQ>+z9Z(S&N#8m{90kMKhxQ&#r0~&0Ug8U0eNMU+Z5dsUFJ# zlkb;Mo#6B2@Vy2<&&!X-Hz=ctFg#q+9#xgXnP50G*nlxiiIM<-cK<@dvD0Iyh1Tj7 zF99R)TPnfFy|cHsbtd{#rGUkKm)BMnkrcnW$viSyF+V#+NYVQj>G{9W@v;9R5?2DVrhdDt z%kbC!7cpZEtUxW4?k63vMB cmk>zw*oD^{zt`rU4-Nw4rB$S=Bus+;2OG`0mjD0& literal 0 HcmV?d00001 diff --git a/demo-app/src/main/res/values-night/color.xml b/demo-app/src/main/res/values-night/color.xml new file mode 100644 index 0000000..809ab40 --- /dev/null +++ b/demo-app/src/main/res/values-night/color.xml @@ -0,0 +1,6 @@ + + + #FF2D2D2D + #FFCFCFCF + #FFD3D3D3 + \ No newline at end of file diff --git a/demo-app/src/main/res/values-night/themes.xml b/demo-app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..c521579 --- /dev/null +++ b/demo-app/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/demo-app/src/main/res/values-zh-rCN/strings.xml b/demo-app/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000..c56be28 --- /dev/null +++ b/demo-app/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,11 @@ + + + 异常示例 + 返回 + 这里提供了常见场景下的业务异常逻辑,激活 Xposed 模块后,可在此测试异常是否能够被捕获,为了验证 Xposed 模块生效情况,当前 APP 无任何手动处理异常的逻辑代码。 + 抛出 RuntimeException + 抛出 IllegalStateException + 抛出 NullPointerException + 抛出 Exception + 抛出原生层异常 + \ No newline at end of file diff --git a/demo-app/src/main/res/values/color.xml b/demo-app/src/main/res/values/color.xml new file mode 100644 index 0000000..24917f9 --- /dev/null +++ b/demo-app/src/main/res/values/color.xml @@ -0,0 +1,6 @@ + + + #FFFFFFFF + #FF777777 + #FF323B42 + \ No newline at end of file diff --git a/demo-app/src/main/res/values/colors.xml b/demo-app/src/main/res/values/colors.xml new file mode 100644 index 0000000..0df5e08 --- /dev/null +++ b/demo-app/src/main/res/values/colors.xml @@ -0,0 +1,11 @@ + + + #656565 + #656565 + #656565 + #656565 + #656565 + #FF000000 + #FFFFFFFF + #00000000 + \ No newline at end of file diff --git a/demo-app/src/main/res/values/ic_launcher_background.xml b/demo-app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..a35b997 --- /dev/null +++ b/demo-app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FF4400 + \ No newline at end of file diff --git a/demo-app/src/main/res/values/strings.xml b/demo-app/src/main/res/values/strings.xml new file mode 100644 index 0000000..2e88dbb --- /dev/null +++ b/demo-app/src/main/res/values/strings.xml @@ -0,0 +1,10 @@ + + AppErrorsDemo + Back + The business exception logic in common scenarios is provided here. After activating the Xposed module, you can test whether the exception can be caught here. In order to verify the effectiveness of the Xposed module, the current App does not have any logic code for manually handling exceptions. + throw RuntimeException + throw IllegalStateException + throw NullPointerException + throw Exception + throw Native Error + \ No newline at end of file diff --git a/demo-app/src/main/res/values/themes.xml b/demo-app/src/main/res/values/themes.xml new file mode 100644 index 0000000..d113275 --- /dev/null +++ b/demo-app/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/demo-app/src/test/java/com/fankes/apperrorstracking/demo_app/ExampleUnitTest.kt b/demo-app/src/test/java/com/fankes/apperrorstracking/demo_app/ExampleUnitTest.kt new file mode 100644 index 0000000..435cb7f --- /dev/null +++ b/demo-app/src/test/java/com/fankes/apperrorstracking/demo_app/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.fankes.apperrorstracking.demo_app + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index f648633..1d204d0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -16,4 +16,5 @@ dependencyResolutionManagement { } } rootProject.name = "AppErrorsTracking" -include ':app' \ No newline at end of file +include ':app' +include ':demo-app' \ No newline at end of file