From f26c9e61a76e712ee077d88f35fc90cf864e5792 Mon Sep 17 00:00:00 2001 From: Ali Kabiri Date: Wed, 5 Oct 2022 16:21:06 +0200 Subject: [PATCH 01/10] update AGP and target/compile sdk version --- .idea/deploymentTargetDropDown.xml | 17 +++++++++++++++ .idea/misc.xml | 3 ++- .idea/runConfigurations.xml | 12 ----------- app/.gitignore | 1 + app/build.gradle | 27 ++++++++++++++++++++++-- app/src/main/AndroidManifest.xml | 6 +++--- build.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 8 files changed, 51 insertions(+), 21 deletions(-) create mode 100644 .idea/deploymentTargetDropDown.xml delete mode 100644 .idea/runConfigurations.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 00000000..47812ed0 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 33782299..2dd336d9 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,7 +5,8 @@ - + + diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460d..00000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore index 796b96d1..31bed51d 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ /build +keystore.properties \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index e876ce33..05366433 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ repositories { } android { - compileSdkVersion 30 + compileSdkVersion 33 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -16,12 +16,25 @@ android { defaultConfig { applicationId "org.kabiri.android.usbterminal" minSdkVersion 23 - targetSdkVersion 30 + targetSdkVersion 33 versionCode 9 versionName "0.7.9" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + signingConfigs { + // read release credentials from keystore.properties file + def ksProp = new Properties() + // load keys inside the ksProp file + loadKeyStore(ksProp) + release { + keyAlias ksProp.getProperty("release.keyAlias") + keyPassword ksProp.getProperty("release.keyPassword") + storeFile file(ksProp.getProperty("release.file")) + storePassword ksProp.getProperty("release.storePassword") + } + } + buildTypes { release { minifyEnabled false @@ -32,9 +45,19 @@ android { buildFeatures { viewBinding true } + namespace 'org.kabiri.android.usbterminal' } +private void loadKeyStore(Properties ksProp) { + def ksPropFile = file("keystore.properties") + if (ksPropFile.exists()) { + ksProp.load(new FileInputStream(ksPropFile)) + } else { + println 'ERROR: local keystore file not found' + } +} + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f89a8e95..ea93ead7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + @@ -19,7 +18,8 @@ - + diff --git a/build.gradle b/build.gradle index 0005aef7..522180ce 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,14 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.21' + ext.kotlin_version = '1.5.21' ext.koin_version = '2.2.0' repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.2' + classpath 'com.android.tools.build:gradle:7.3.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.koin:koin-gradle-plugin:$koin_version" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 94d93d58..3d95cee8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip From 4c5b4aa78b3b05b784d662de8f7bec21790fb268 Mon Sep 17 00:00:00 2001 From: Ali Kabiri Date: Wed, 5 Oct 2022 16:59:57 +0200 Subject: [PATCH 02/10] migrate from koin to hilt; update kotlin --- .idea/deploymentTargetDropDown.xml | 2 +- app/build.gradle | 43 ++++++++++++------- app/src/main/AndroidManifest.xml | 1 - .../android/usbterminal/MainActivity.kt | 7 +-- .../android/usbterminal/MainApplication.kt | 14 +----- .../usbterminal/arduino/ArduinoHelper.kt | 11 +++-- .../android/usbterminal/di/AppModule.kt | 43 +++++++++++++++++++ .../android/usbterminal/koin/AppModule.kt | 20 --------- .../viewmodel/MainActivityViewModel.kt | 8 +++- build.gradle | 12 +++--- 10 files changed, 99 insertions(+), 62 deletions(-) create mode 100644 app/src/main/java/org/kabiri/android/usbterminal/di/AppModule.kt delete mode 100644 app/src/main/java/org/kabiri/android/usbterminal/koin/AppModule.kt diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 47812ed0..d4c1d0ab 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -12,6 +12,6 @@ - + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 05366433..59c16bc7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,9 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'koin' +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' + id 'kotlin-kapt' + id 'dagger.hilt.android.plugin' +} repositories { } @@ -61,30 +64,38 @@ private void loadKeyStore(Properties ksProp) { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'androidx.core:core-ktx:1.3.2' - implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'androidx.core:core-ktx:1.9.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' // Sentry Tracking - implementation 'io.sentry:sentry-android-core:2.0.2' + implementation 'io.sentry:sentry-android-core:6.4.1' - // Koin for Android - ViewModel features - implementation "org.koin:koin-android-viewmodel:$koin_version" + // Dependency Injection + implementation "com.google.dagger:hilt-android:$hilt_version" + kapt "com.google.dagger:hilt-compiler:$hilt_version" // Coroutines - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' + implementation 'androidx.activity:activity-compose:1.6.0' + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' // testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.0-RC2' + // hilt testing + // more info: + // https://developer.android.com/training/dependency-injection/hilt-testing + androidTestImplementation "com.google.dagger:hilt-android-testing:$hilt_version" + kaptAndroidTest "com.google.dagger:hilt-android-compiler:$hilt_version" + // unit test libs - testImplementation 'junit:junit:4.13.1' - testImplementation "com.google.truth:truth:1.1.2" + testImplementation 'junit:junit:4.13.2' + testImplementation "com.google.truth:truth:1.1.3" // instrumented test libs - androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' // Espresso androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' // Hamcrest for view matching diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ea93ead7..c87c749d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,7 +8,6 @@ () private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/org/kabiri/android/usbterminal/MainApplication.kt b/app/src/main/java/org/kabiri/android/usbterminal/MainApplication.kt index 7db4bd13..b7feac7d 100644 --- a/app/src/main/java/org/kabiri/android/usbterminal/MainApplication.kt +++ b/app/src/main/java/org/kabiri/android/usbterminal/MainApplication.kt @@ -1,25 +1,15 @@ package org.kabiri.android.usbterminal import android.app.Application -import org.kabiri.android.usbterminal.koin.appModule -import org.koin.android.ext.koin.androidContext -import org.koin.android.ext.koin.androidLogger -import org.koin.core.context.startKoin -import org.koin.core.logger.Level +import dagger.hilt.android.HiltAndroidApp /** * Created by Ali Kabiri on 13.04.20. */ +@HiltAndroidApp class MainApplication: Application() { override fun onCreate() { super.onCreate() - - // start Koin context. - startKoin{ - androidContext(this@MainApplication) - androidLogger(Level.DEBUG) - modules(appModule) - } } } \ No newline at end of file diff --git a/app/src/main/java/org/kabiri/android/usbterminal/arduino/ArduinoHelper.kt b/app/src/main/java/org/kabiri/android/usbterminal/arduino/ArduinoHelper.kt index 08e8dfeb..aa1b5b68 100644 --- a/app/src/main/java/org/kabiri/android/usbterminal/arduino/ArduinoHelper.kt +++ b/app/src/main/java/org/kabiri/android/usbterminal/arduino/ArduinoHelper.kt @@ -15,6 +15,7 @@ import com.felhr.usbserial.UsbSerialDevice import com.felhr.usbserial.UsbSerialInterface import org.kabiri.android.usbterminal.Constants import org.kabiri.android.usbterminal.R +import javax.inject.Inject /** @@ -24,9 +25,13 @@ import org.kabiri.android.usbterminal.R * Info: The `askForConnectionPermission()` method * registers the Arduino Permission Broadcast Receiver. */ -class ArduinoHelper(private val context: Context, - private val arduinoPermReceiver: ArduinoPermissionBroadcastReceiver, - private val arduinoSerialReceiver: ArduinoSerialReceiver) { + +class ArduinoHelper +@Inject constructor( + private val context: Context, + private val arduinoPermReceiver: ArduinoPermissionBroadcastReceiver, + private val arduinoSerialReceiver: ArduinoSerialReceiver +) { companion object { private const val TAG = "ArduinoHelper" diff --git a/app/src/main/java/org/kabiri/android/usbterminal/di/AppModule.kt b/app/src/main/java/org/kabiri/android/usbterminal/di/AppModule.kt new file mode 100644 index 00000000..1b17095d --- /dev/null +++ b/app/src/main/java/org/kabiri/android/usbterminal/di/AppModule.kt @@ -0,0 +1,43 @@ +package org.kabiri.android.usbterminal.di + +import android.app.Application +import android.content.Context +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import org.kabiri.android.usbterminal.arduino.ArduinoHelper +import org.kabiri.android.usbterminal.arduino.ArduinoPermissionBroadcastReceiver +import org.kabiri.android.usbterminal.arduino.ArduinoSerialReceiver + +/** + * Created by Ali Kabiri on 13.04.20. + */ +@Module +@InstallIn(SingletonComponent::class) +class AppModule { + + @Provides + fun provideContext( + app: Application + ): Context = app.applicationContext + + @Provides + fun provideArduinoPermissionBroadcastReceiver() = ArduinoPermissionBroadcastReceiver() + + @Provides + fun providesArduinoSerialReceiver() = ArduinoSerialReceiver() + + @Provides + fun providesArduinoHelper( + context: Context, + arduinoPermReceiver: ArduinoPermissionBroadcastReceiver, + arduinoSerialReceiver: ArduinoSerialReceiver, + ): ArduinoHelper { + return ArduinoHelper( + context = context, + arduinoPermReceiver = arduinoPermReceiver, + arduinoSerialReceiver = arduinoSerialReceiver, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/kabiri/android/usbterminal/koin/AppModule.kt b/app/src/main/java/org/kabiri/android/usbterminal/koin/AppModule.kt deleted file mode 100644 index efdd484c..00000000 --- a/app/src/main/java/org/kabiri/android/usbterminal/koin/AppModule.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.kabiri.android.usbterminal.koin - -import org.kabiri.android.usbterminal.arduino.ArduinoHelper -import org.kabiri.android.usbterminal.arduino.ArduinoPermissionBroadcastReceiver -import org.kabiri.android.usbterminal.arduino.ArduinoSerialReceiver -import org.kabiri.android.usbterminal.viewmodel.MainActivityViewModel -import org.koin.android.viewmodel.dsl.viewModel -import org.koin.dsl.module - -/** - * Created by Ali Kabiri on 13.04.20. - */ -val appModule = module { - - single { ArduinoPermissionBroadcastReceiver() } - single { ArduinoSerialReceiver() } - single { ArduinoHelper(get(), get(), get()) } - - viewModel { MainActivityViewModel(get()) } -} \ No newline at end of file diff --git a/app/src/main/java/org/kabiri/android/usbterminal/viewmodel/MainActivityViewModel.kt b/app/src/main/java/org/kabiri/android/usbterminal/viewmodel/MainActivityViewModel.kt index 0addf183..0f19c77d 100644 --- a/app/src/main/java/org/kabiri/android/usbterminal/viewmodel/MainActivityViewModel.kt +++ b/app/src/main/java/org/kabiri/android/usbterminal/viewmodel/MainActivityViewModel.kt @@ -2,14 +2,20 @@ package org.kabiri.android.usbterminal.viewmodel import android.hardware.usb.UsbDevice import androidx.lifecycle.* +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import org.kabiri.android.usbterminal.arduino.ArduinoHelper import org.kabiri.android.usbterminal.model.OutputText +import javax.inject.Inject /** * Created by Ali Kabiri on 12.04.20. */ -class MainActivityViewModel(private val arduinoHelper: ArduinoHelper): ViewModel() { +@HiltViewModel +class MainActivityViewModel +@Inject constructor( + private val arduinoHelper: ArduinoHelper, +): ViewModel() { fun askForConnectionPermission() = arduinoHelper.askForConnectionPermission() fun getGrantedDevice() = arduinoHelper.getGrantedDevice() diff --git a/build.gradle b/build.gradle index 522180ce..359dcc5f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,16 +1,18 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.5.21' - ext.koin_version = '2.2.0' + ext { + kotlin_version = '1.7.0' + hilt_version = '2.43.2' + } repositories { google() - jcenter() + mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:7.3.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "org.koin:koin-gradle-plugin:$koin_version" + classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -20,7 +22,7 @@ buildscript { allprojects { repositories { google() - jcenter() + mavenCentral() maven { url "https://jitpack.io" } } } From 39901dd9905b610785c1da5a3925d1b7637c4034 Mon Sep 17 00:00:00 2001 From: Ali Kabiri Date: Thu, 6 Oct 2022 21:11:19 +0200 Subject: [PATCH 03/10] update kotlin; disable jettifier; disable viewBinding; overall cleanup; add disconnect button --- .idea/deploymentTargetDropDown.xml | 2 +- .idea/misc.xml | 7 +++ app/build.gradle | 12 +--- .../android/usbterminal/MainActivity.kt | 43 +++++++++----- .../usbterminal/arduino/ArduinoHelper.kt | 58 ++++++++++++------- .../viewmodel/MainActivityViewModel.kt | 13 ++++- .../res/drawable/ic_usb_off_white_24dp.xml | 9 +++ app/src/main/res/layout/activity_main.xml | 6 +- app/src/main/res/menu/activity_main_menu.xml | 1 + app/src/main/res/values/strings.xml | 11 +++- build.gradle | 2 +- gradle.properties | 2 +- 12 files changed, 114 insertions(+), 52 deletions(-) create mode 100644 app/src/main/res/drawable/ic_usb_off_white_24dp.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index d4c1d0ab..1a47aa74 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -12,6 +12,6 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 2dd336d9..669e0711 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -12,4 +12,11 @@ + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 59c16bc7..9416237c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,8 +20,8 @@ android { applicationId "org.kabiri.android.usbterminal" minSdkVersion 23 targetSdkVersion 33 - versionCode 9 - versionName "0.7.9" + versionCode 10 + versionName "0.8.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -40,14 +40,12 @@ android { buildTypes { release { + signingConfig signingConfigs.release minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } - buildFeatures { - viewBinding true - } namespace 'org.kabiri.android.usbterminal' } @@ -68,9 +66,6 @@ dependencies { implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - // Sentry Tracking - implementation 'io.sentry:sentry-android-core:6.4.1' - // Dependency Injection implementation "com.google.dagger:hilt-android:$hilt_version" kapt "com.google.dagger:hilt-compiler:$hilt_version" @@ -82,7 +77,6 @@ dependencies { implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' -// testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.0-RC2' // hilt testing // more info: diff --git a/app/src/main/java/org/kabiri/android/usbterminal/MainActivity.kt b/app/src/main/java/org/kabiri/android/usbterminal/MainActivity.kt index f1356313..cb0cd4d0 100644 --- a/app/src/main/java/org/kabiri/android/usbterminal/MainActivity.kt +++ b/app/src/main/java/org/kabiri/android/usbterminal/MainActivity.kt @@ -1,16 +1,18 @@ package org.kabiri.android.usbterminal import android.os.Bundle -import androidx.activity.viewModels import android.text.SpannableString import android.text.method.ScrollingMovementMethod import android.util.Log import android.view.Menu import android.view.MenuInflater import android.view.MenuItem +import android.widget.Button +import android.widget.EditText +import android.widget.TextView +import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import dagger.hilt.android.AndroidEntryPoint -import org.kabiri.android.usbterminal.databinding.ActivityMainBinding import org.kabiri.android.usbterminal.viewmodel.MainActivityViewModel @AndroidEntryPoint @@ -21,36 +23,43 @@ class MainActivity : AppCompatActivity() { } private val viewModel by viewModels() - private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - binding = ActivityMainBinding.inflate(layoutInflater) + + val etInput = findViewById(R.id.etInput) + val tvOutput = findViewById(R.id.tvOutput) + val btEnter = findViewById