From c944a446efd4f2a53cf643d88c01dfad1e331c98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sylwester=20Zieli=C5=84ski?= Date: Tue, 14 Sep 2021 11:37:40 +0200 Subject: [PATCH] feature: Add new CSC Screen --- app/.gitignore | 123 ---- app/build.gradle | 33 +- app/proguard-rules.pro | 21 - app/src/main/AndroidManifest.xml | 1 + .../android/nrftoolbox/HomeScreen.kt | 86 +++ .../android/nrftoolbox/MainActivity.kt | 25 +- .../nrftoolbox/NrfToolboxApplication.kt | 8 + .../android/nrftoolbox/ui/theme/Color.kt | 8 - app/src/main/res/drawable/ic_csc.xml | 9 + app/src/main/res/values-night/themes.xml | 12 +- app/src/main/res/values/colors.xml | 10 - app/src/main/res/values/strings.xml | 4 +- build.gradle | 8 +- feature_csc/build.gradle | 27 + .../android/csc/ExampleInstrumentedTest.kt | 24 + feature_csc/src/main/AndroidManifest.xml | 16 + .../nordicsemi/android/csc/CscNavigation.kt | 19 + .../android/csc/batery/BatteryManager.kt | 131 ++++ .../csc/batery/CSCMeasurementParser.kt | 69 ++ .../android/csc/batery/LoggableBleManager.kt | 42 ++ .../csc/service/BatteryManagerCallbacks.kt | 6 + .../csc/service/BleProfileService.java | 613 ++++++++++++++++++ .../android/csc/service/CSCManager.kt | 128 ++++ .../csc/service/CSCManagerCallbacks.kt | 26 + .../android/csc/service/CSCService.kt | 189 ++++++ .../android/csc/view/CSCViewConnectedState.kt | 55 ++ .../android/csc/view/CSCViewEvent.kt | 19 + .../nordicsemi/android/csc/view/CscScreen.kt | 135 ++++ .../android/csc/view/CscViewModel.kt | 101 +++ .../android/csc/view/SelectWheelSizeDialog.kt | 48 ++ .../android/csc/view/SensorsReadingView.kt | 55 ++ .../nordicsemi/android/csc/view/SpeedUnit.kt | 7 + .../android/csc/view/SpeedUnitRadioGroup.kt | 49 ++ .../android/csc/view/WheelSizeView.kt | 39 ++ feature_csc/src/main/res/values/strings.xml | 129 ++++ .../nordicsemi/android/csc/ExampleUnitTest.kt | 17 + lib_broadcast/build.gradle | 7 + .../broadcast/ExampleInstrumentedTest.kt | 24 + lib_broadcast/src/main/AndroidManifest.xml | 4 + .../broadcast/BluetoothDataReadBroadcast.kt | 34 + .../android/broadcast/ExampleUnitTest.kt | 17 + lib_events/build.gradle | 3 + .../android/events/ExampleInstrumentedTest.kt | 24 + lib_events/src/main/AndroidManifest.xml | 5 + .../android/events/BluetoothReadDataEvent.kt | 3 + .../android/events/CSCServiceData.kt | 28 + .../java/no/nordicsemi/android/events/Ext.kt | 7 + .../android/events/ExampleUnitTest.kt | 17 + lib_scanner/build.gradle | 14 + .../scanner/ExampleInstrumentedTest.kt | 24 + lib_scanner/src/main/AndroidManifest.xml | 15 + .../nordicsemi/android/scanner/HiltModule.kt | 17 + .../android/scanner/ListOfDevicesScreen.kt | 71 ++ .../android/scanner/NordicBleScanner.kt | 67 ++ .../scanner/NordicBleScannerViewModel.kt | 44 ++ .../android/scanner/ScannerNavigation.kt | 49 ++ .../android/scanner/ScannerStatus.kt | 5 + .../bluetooth/BluetoothNotAvailableScreen.kt | 34 + .../permissions/RequestPermissionScreen.kt | 119 ++++ lib_scanner/src/main/res/values/strings.xml | 15 + .../android/scanner/ExampleUnitTest.kt | 17 + lib_theme/build.gradle | 9 + lib_theme/src/main/AndroidManifest.xml | 5 + .../no/nordicsemi/android/theme/Background.kt | 24 + .../java/no/nordicsemi/android/theme/Color.kt | 26 + .../no/nordicsemi/android}/theme/Shape.kt | 2 +- .../no/nordicsemi/android}/theme/Theme.kt | 33 +- .../java/no/nordicsemi/android}/theme/Type.kt | 2 +- lib_theme/src/main/res/values/colors.xml | 9 + .../src/main/res/values/themes.xml | 14 +- library.gradle | 59 ++ settings.gradle | 37 +- 72 files changed, 2949 insertions(+), 227 deletions(-) delete mode 100644 app/.gitignore delete mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/java/no/nordicsemi/android/nrftoolbox/HomeScreen.kt create mode 100644 app/src/main/java/no/nordicsemi/android/nrftoolbox/NrfToolboxApplication.kt delete mode 100644 app/src/main/java/no/nordicsemi/android/nrftoolbox/ui/theme/Color.kt create mode 100644 app/src/main/res/drawable/ic_csc.xml delete mode 100644 app/src/main/res/values/colors.xml create mode 100644 feature_csc/build.gradle create mode 100644 feature_csc/src/androidTest/java/no/nordicsemi/android/csc/ExampleInstrumentedTest.kt create mode 100644 feature_csc/src/main/AndroidManifest.xml create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/CscNavigation.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/batery/BatteryManager.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/batery/CSCMeasurementParser.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/batery/LoggableBleManager.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/service/BatteryManagerCallbacks.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/service/BleProfileService.java create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/service/CSCManager.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/service/CSCManagerCallbacks.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/service/CSCService.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/view/CSCViewConnectedState.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/view/CSCViewEvent.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/view/CscScreen.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/view/CscViewModel.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/view/SelectWheelSizeDialog.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/view/SensorsReadingView.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/view/SpeedUnit.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/view/SpeedUnitRadioGroup.kt create mode 100644 feature_csc/src/main/java/no/nordicsemi/android/csc/view/WheelSizeView.kt create mode 100644 feature_csc/src/main/res/values/strings.xml create mode 100644 feature_csc/src/test/java/no/nordicsemi/android/csc/ExampleUnitTest.kt create mode 100644 lib_broadcast/build.gradle create mode 100644 lib_broadcast/src/androidTest/java/no/nordicsemi/android/broadcast/ExampleInstrumentedTest.kt create mode 100644 lib_broadcast/src/main/AndroidManifest.xml create mode 100644 lib_broadcast/src/main/java/no/nordicsemi/android/broadcast/BluetoothDataReadBroadcast.kt create mode 100644 lib_broadcast/src/test/java/no/nordicsemi/android/broadcast/ExampleUnitTest.kt create mode 100644 lib_events/build.gradle create mode 100644 lib_events/src/androidTest/java/no/nordicsemi/android/events/ExampleInstrumentedTest.kt create mode 100644 lib_events/src/main/AndroidManifest.xml create mode 100644 lib_events/src/main/java/no/nordicsemi/android/events/BluetoothReadDataEvent.kt create mode 100644 lib_events/src/main/java/no/nordicsemi/android/events/CSCServiceData.kt create mode 100644 lib_events/src/main/java/no/nordicsemi/android/events/Ext.kt create mode 100644 lib_events/src/test/java/no/nordicsemi/android/events/ExampleUnitTest.kt create mode 100644 lib_scanner/build.gradle create mode 100644 lib_scanner/src/androidTest/java/no/nordicsemi/android/scanner/ExampleInstrumentedTest.kt create mode 100644 lib_scanner/src/main/AndroidManifest.xml create mode 100644 lib_scanner/src/main/java/no/nordicsemi/android/scanner/HiltModule.kt create mode 100644 lib_scanner/src/main/java/no/nordicsemi/android/scanner/ListOfDevicesScreen.kt create mode 100644 lib_scanner/src/main/java/no/nordicsemi/android/scanner/NordicBleScanner.kt create mode 100644 lib_scanner/src/main/java/no/nordicsemi/android/scanner/NordicBleScannerViewModel.kt create mode 100644 lib_scanner/src/main/java/no/nordicsemi/android/scanner/ScannerNavigation.kt create mode 100644 lib_scanner/src/main/java/no/nordicsemi/android/scanner/ScannerStatus.kt create mode 100644 lib_scanner/src/main/java/no/nordicsemi/android/scanner/bluetooth/BluetoothNotAvailableScreen.kt create mode 100644 lib_scanner/src/main/java/no/nordicsemi/android/scanner/permissions/RequestPermissionScreen.kt create mode 100644 lib_scanner/src/main/res/values/strings.xml create mode 100644 lib_scanner/src/test/java/no/nordicsemi/android/scanner/ExampleUnitTest.kt create mode 100644 lib_theme/build.gradle create mode 100644 lib_theme/src/main/AndroidManifest.xml create mode 100644 lib_theme/src/main/java/no/nordicsemi/android/theme/Background.kt create mode 100644 lib_theme/src/main/java/no/nordicsemi/android/theme/Color.kt rename {app/src/main/java/no/nordicsemi/android/nrftoolbox/ui => lib_theme/src/main/java/no/nordicsemi/android}/theme/Shape.kt (84%) rename {app/src/main/java/no/nordicsemi/android/nrftoolbox/ui => lib_theme/src/main/java/no/nordicsemi/android}/theme/Theme.kt (56%) rename {app/src/main/java/no/nordicsemi/android/nrftoolbox/ui => lib_theme/src/main/java/no/nordicsemi/android}/theme/Type.kt (93%) create mode 100644 lib_theme/src/main/res/values/colors.xml rename {app => lib_theme}/src/main/res/values/themes.xml (64%) create mode 100644 library.gradle diff --git a/app/.gitignore b/app/.gitignore deleted file mode 100644 index 6ae6c730..00000000 --- a/app/.gitignore +++ /dev/null @@ -1,123 +0,0 @@ - -# Created by https://www.toptal.com/developers/gitignore/api/androidstudio -# Edit at https://www.toptal.com/developers/gitignore?templates=androidstudio - -### AndroidStudio ### -# Covers files to be ignored for android development using Android Studio. - -# Built application files -*.apk -*.ap_ -*.aab - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ - -# Gradle files -.gradle -.gradle/ -build/ - -# Signing files -.signing/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio -/*/build/ -/*/local.properties -/*/out -/*/*/build -/*/*/production -captures/ -.navigation/ -*.ipr -*~ -*.swp - -# Keystore files -*.jks -*.keystore - -# Google Services (e.g. APIs or Firebase) -# google-services.json - -# Android Patch -gen-external-apklibs - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild - -# NDK -obj/ - -# IntelliJ IDEA -*.iml -*.iws -/out/ - -# User-specific configurations -.idea/ - -# OS-specific files -.DS_Store -.DS_Store? -._* -.Spotlight-V100 -.Trashes -ehthumbs.db -Thumbs.db - -# Legacy Eclipse project files -.classpath -.project -.cproject -.settings/ - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.war -*.ear - -# virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml) -hs_err_pid* - -## Plugin-specific files: - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Mongo Explorer plugin -.idea/mongoSettings.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -### AndroidStudio Patch ### - -!/gradle/wrapper/gradle-wrapper.jar - -# End of https://www.toptal.com/developers/gitignore/api/androidstudio diff --git a/app/build.gradle b/app/build.gradle index 7380ed50..0f88e4f5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,17 @@ plugins { id 'com.android.application' id 'kotlin-android' + id 'kotlin-kapt' + id 'dagger.hilt.android.plugin' } android { - compileSdk 31 + compileSdk android_api_version defaultConfig { applicationId "no.nordicsemi.android.nrftoolbox" - minSdk 21 - targetSdk 31 + minSdk android_min_api_version + targetSdk android_api_version versionCode 1 versionName "1.0" @@ -38,21 +40,32 @@ android { } composeOptions { kotlinCompilerExtensionVersion compose_version - kotlinCompilerVersion '1.5.21' + kotlinCompilerVersion kotlin_version } - packagingOptions { - resources { - excludes += '/META-INF/{AL2.0,LGPL2.1}' - } + hilt { + enableExperimentalClasspathAggregation = true } } dependencies { + //Hilt requires to implement every module in the main app module + //https://github.com/google/dagger/issues/2123 + implementation project(":feature_csc") + implementation project(":lib_broadcast") + implementation project(":lib_events") + implementation project(":lib_theme") + implementation project(":lib_scanner") + + implementation libs.nordic.ble.common + + implementation libs.bundles.hilt + kapt libs.bundles.hiltkapt implementation libs.bundles.compose implementation libs.androidx.core implementation libs.material - implementation libs.lifecycle + implementation libs.lifecycle.activity + implementation libs.compose.lifecycle implementation libs.compose.activity testImplementation libs.test.junit @@ -60,4 +73,4 @@ dependencies { androidTestImplementation libs.android.test.espresso androidTestImplementation libs.android.test.compose.ui debugImplementation libs.android.test.compose.tooling -} \ No newline at end of file +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# 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/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0a69ceaf..774fd620 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="no.nordicsemi.android.nrftoolbox"> Unit) { + Button( + modifier = Modifier.fillMaxWidth(), + onClick = { onClick() }, + colors = ButtonDefaults.buttonColors(backgroundColor = Color.Transparent) + ) { + Image( + painter = painterResource(iconId), + contentDescription = stringResource(id = nameId), + contentScale = ContentScale.Crop, + modifier = Modifier + .size(64.dp) + .clip(CircleShape) + .background(Color.White) + ) + Row( + modifier = Modifier + .padding(16.dp) + .fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + Text( + text = stringResource(id = nameId), + modifier = Modifier.padding(16.dp), + ) + } + } +} + +@Preview(showBackground = true) +@Composable +fun DefaultPreview() { + HomeView(rememberNavController()) +} diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/MainActivity.kt b/app/src/main/java/no/nordicsemi/android/nrftoolbox/MainActivity.kt index 651ffcb9..de07cd82 100644 --- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/MainActivity.kt +++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/MainActivity.kt @@ -5,34 +5,21 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.tooling.preview.Preview -import no.nordicsemi.android.nrftoolbox.ui.theme.TestTheme +import dagger.hilt.android.AndroidEntryPoint +import no.nordicsemi.android.theme.TestTheme +@AndroidEntryPoint class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + setContent { TestTheme { - // A surface container using the 'background' color from the theme Surface(color = MaterialTheme.colors.background) { - Greeting("Android") + HomeScreen() } } } } } - -@Composable -fun Greeting(name: String) { - Text(text = "Hello $name!") -} - -@Preview(showBackground = true) -@Composable -fun DefaultPreview() { - TestTheme { - Greeting("Android") - } -} \ No newline at end of file diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/NrfToolboxApplication.kt b/app/src/main/java/no/nordicsemi/android/nrftoolbox/NrfToolboxApplication.kt new file mode 100644 index 00000000..c7090164 --- /dev/null +++ b/app/src/main/java/no/nordicsemi/android/nrftoolbox/NrfToolboxApplication.kt @@ -0,0 +1,8 @@ +package no.nordicsemi.android.nrftoolbox + +import android.app.Application +import dagger.hilt.android.HiltAndroidApp + +@HiltAndroidApp +class NrfToolboxApplication : Application() { +} \ No newline at end of file diff --git a/app/src/main/java/no/nordicsemi/android/nrftoolbox/ui/theme/Color.kt b/app/src/main/java/no/nordicsemi/android/nrftoolbox/ui/theme/Color.kt deleted file mode 100644 index 5fa89076..00000000 --- a/app/src/main/java/no/nordicsemi/android/nrftoolbox/ui/theme/Color.kt +++ /dev/null @@ -1,8 +0,0 @@ -package no.nordicsemi.android.nrftoolbox.ui.theme - -import androidx.compose.ui.graphics.Color - -val Purple200 = Color(0xFFBB86FC) -val Purple500 = Color(0xFF6200EE) -val Purple700 = Color(0xFF3700B3) -val Teal200 = Color(0xFF03DAC5) \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_csc.xml b/app/src/main/res/drawable/ic_csc.xml new file mode 100644 index 00000000..97283930 --- /dev/null +++ b/app/src/main/res/drawable/ic_csc.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index dd8a87e2..140e38df 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -2,13 +2,13 @@