diff --git a/TODO.txt b/TODO.txt index 6ac1555..7239efe 100644 --- a/TODO.txt +++ b/TODO.txt @@ -21,3 +21,9 @@ And MULF should be COMBOX for E series if I understand right FullBrightness: --Mcu toString-----[ cmdType:6C - data:01-64 ] LowestBrightness: --Mcu toString-----[ cmdType:6C - data:01-00 ] + +MediaButtons Yes: cmdType: 0x70, data: 0x0e-0x00 +MediaButtons No: cmdType: 0x70, data: 0x0e-0x01 +echo -en \\xf2\\x0\\x70\\x2\\xe\\x0\\x7F > /dev/ttyMSM1 +echo -en \\xf2\\x0\\x70\\x2\\xe\\x1\\x7E > /dev/ttyMSM1 + diff --git a/app/build.gradle b/app/build.gradle index c14e4b8..e26582e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,11 +8,11 @@ android { buildToolsVersion "30.0.3" defaultConfig { - applicationId "com.snaggly.ksw_toolkit" + applicationId "com.snaggly.wits.ksw_toolkit.service" minSdkVersion 28 - targetSdkVersion 29 + targetSdkVersion 30 versionCode 1 - versionName "0.7.0" + versionName "0.8S" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -35,18 +35,18 @@ android { dependencies { implementation 'com.google.code.gson:gson:2.8.6' - implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.21" - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.3.0' - implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation "org.jetbrains.kotlin:kotlin-stdlib:1.5.10" + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.0' implementation 'androidx.preference:preference-ktx:1.1.1' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0' - implementation "androidx.recyclerview:recyclerview:1.1.0" + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1' + implementation "androidx.recyclerview:recyclerview:1.2.1" implementation "androidx.recyclerview:recyclerview-selection:1.1.0" implementation project(path: ':McuCommunicator:library') - testImplementation 'junit:junit:4.13.1' - androidTestImplementation 'androidx.test.ext:junit:1.1.2' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.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/app/proguard-rules.pro b/app/proguard-rules.pro index f00253f..4a9f7d2 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -25,8 +25,8 @@ -keep class com.snaggly.ksw_toolkit.core.config.beans.** {*;} -keep class com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes {*;} -keep class com.snaggly.ksw_toolkit.util.list.eventtype.EventMode {*;} --keep class com.snaggly.ksw_toolkit.util.list.keyevent.KeyCode {*;} --keep class com.snaggly.ksw_toolkit.util.list.mcu.McuCommandsList {*;} +-keep class com.snaggly.ksw_toolkit.IKSWToolKitService {*;} +-keep class com.snaggly.ksw_toolkit.IMcuListener {*;} -keep class com.wits.pms.* {*;} -keep class com.wits.pms.statuscontrol.* {*;} -keep class projekt.auto.mcu.** {*;} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a825080..de06d43 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,47 +1,53 @@ + package="com.snaggly.ksw_toolkit" + android:sharedUserId="android.uid.system"> - - - - - + + - - + - + android:roundIcon="@mipmap/ic_launcher_round"> + + + + android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > + - - - - - - \ No newline at end of file diff --git a/app/src/main/aidl/com/snaggly/ksw_toolkit/IKSWToolKitService.aidl b/app/src/main/aidl/com/snaggly/ksw_toolkit/IKSWToolKitService.aidl new file mode 100644 index 0000000..360ce21 --- /dev/null +++ b/app/src/main/aidl/com/snaggly/ksw_toolkit/IKSWToolKitService.aidl @@ -0,0 +1,18 @@ +// IKSWToolKitService.aidl +package com.snaggly.ksw_toolkit; + +import com.snaggly.ksw_toolkit.IMcuListener; + +interface IKSWToolKitService { + boolean sendMcuCommand(int cmdType, in byte[] data); + boolean changeBtnConfig(int btnType, int cmdType, String cmdValue); + void setDefaultBtnLayout(); + String getConfig(); + boolean setOptions(in boolean[] allSettings); + String[] getSettingsTypes(); + boolean setMcuPath(String path); + boolean registerMcuListener(IMcuListener listener); + boolean unregisterMcuListener(IMcuListener listener); + int getNightBrightnessSetting(); + void setNightBrightnessSetting(int value); +} \ No newline at end of file diff --git a/app/src/main/aidl/com/snaggly/ksw_toolkit/IMcuListener.aidl b/app/src/main/aidl/com/snaggly/ksw_toolkit/IMcuListener.aidl new file mode 100644 index 0000000..b604a3b --- /dev/null +++ b/app/src/main/aidl/com/snaggly/ksw_toolkit/IMcuListener.aidl @@ -0,0 +1,6 @@ +// IMcuListener.aidl +package com.snaggly.ksw_toolkit; + +interface IMcuListener { + void updateMcu(String eventName, int cmdType, in byte[] data); +} \ No newline at end of file diff --git a/app/src/main/aidl/com/wits/pms/IPowerManagerAppService.aidl b/app/src/main/aidl/com/wits/pms/IPowerManagerAppService.aidl index b140daf..d82c031 100644 --- a/app/src/main/aidl/com/wits/pms/IPowerManagerAppService.aidl +++ b/app/src/main/aidl/com/wits/pms/IPowerManagerAppService.aidl @@ -1,22 +1,22 @@ package com.wits.pms; interface IPowerManagerAppService { -/*1*/ boolean sendCommand(String str); -/*2*/ boolean sendStatus(String str); -/*3*/ void registerCmdListener(com.wits.pms.ICmdListener iCmdListener); -/*4*/ void unregisterCmdListener(com.wits.pms.ICmdListener iCmdListener); -/*5*/ void registerObserver(String str, com.wits.pms.IContentObserver iContentObserver); -/*6*/ void unregisterObserver(com.wits.pms.IContentObserver iContentObserver); -/*7*/ boolean getStatusBoolean(String str); -/*8*/ int getStatusInt(String str); -/*9*/ String getStatusString(String str); -/*10*/ int getSettingsInt(String str); -/*11*/ String getSettingsString(String str); -/*12*/ void setSettingsInt(String str, int i); -/*13*/ void setSettingsString(String str, String str2); -/*14*/ void addIntStatus(String str, int i); -/*15*/ void addBooleanStatus(String str, boolean z); -/*16*/ void addStringStatus(String str, String str2); -/*17*/ void saveJsonConfig(String str, String str2); -/*18*/ String getJsonConfig(String str); -} \ No newline at end of file + boolean sendCommand(String str); + boolean sendStatus(String str); + void registerCmdListener(com.wits.pms.ICmdListener iCmdListener); + void unregisterCmdListener(com.wits.pms.ICmdListener iCmdListener); + void registerObserver(String str, com.wits.pms.IContentObserver iContentObserver); + void unregisterObserver(com.wits.pms.IContentObserver iContentObserver); + boolean getStatusBoolean(String str); + int getStatusInt(String str); + String getStatusString(String str); + int getSettingsInt(String str); + String getSettingsString(String str); + void setSettingsInt(String str, int i); + void setSettingsString(String str, String str2); + void addIntStatus(String str, int i); + void addBooleanStatus(String str, boolean z); + void addStringStatus(String str, String str2); + void saveJsonConfig(String str, String str2); + String getJsonConfig(String str); +} diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/boot/BootReceiver.kt b/app/src/main/java/com/snaggly/ksw_toolkit/boot/BootReceiver.kt index c8accde..c2f19f6 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/boot/BootReceiver.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/boot/BootReceiver.kt @@ -6,30 +6,28 @@ import android.content.Intent import android.media.AudioManager import android.widget.Toast import com.snaggly.ksw_toolkit.core.config.ConfigManager -import com.snaggly.ksw_toolkit.core.service.CoreService +import com.snaggly.ksw_toolkit.core.service.adb.AdbServiceConnection import com.wits.pms.statuscontrol.PowerManagerApp - class BootReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { if (Intent.ACTION_BOOT_COMPLETED == intent!!.action) { - try { - val armMediaVol = PowerManagerApp.getManager().getSettingsInt("Android_media_vol") - val armPhoneVol = PowerManagerApp.getManager().getSettingsInt("Android_phone_vol") - val carPhoneVol = PowerManagerApp.getManager().getSettingsInt("Car_phone_vol") - val carNaviVol = PowerManagerApp.getManager().getSettingsInt("Car_navi_vol") - - PowerManagerApp.getManager().setSettingsInt("Android_media_vol", armPhoneVol) - PowerManagerApp.getManager().setSettingsInt("Android_phone_vol", armMediaVol) - PowerManagerApp.getManager().setSettingsInt("Car_phone_vol", carPhoneVol) - PowerManagerApp.getManager().setSettingsInt("Car_navi_vol", carNaviVol) - } catch (ex : Exception) { - Toast.makeText(context, "Unable to connect to Wits!", Toast.LENGTH_LONG).show() - } - val config = ConfigManager.getConfig(context?.filesDir!!.absolutePath) - if (config.systemTweaks.maxVolume.data) { + if (config.systemOptions.maxVolume!!) { + try { + val armMediaVol = PowerManagerApp.getManager().getSettingsInt("Android_media_vol") + val armPhoneVol = PowerManagerApp.getManager().getSettingsInt("Android_phone_vol") + val carPhoneVol = PowerManagerApp.getManager().getSettingsInt("Car_phone_vol") + val carNaviVol = PowerManagerApp.getManager().getSettingsInt("Car_navi_vol") + + PowerManagerApp.getManager().setSettingsInt("Android_media_vol", armPhoneVol) + PowerManagerApp.getManager().setSettingsInt("Android_phone_vol", armMediaVol) + PowerManagerApp.getManager().setSettingsInt("Car_phone_vol", carPhoneVol) + PowerManagerApp.getManager().setSettingsInt("Car_navi_vol", carNaviVol) + } catch (ex: Exception) { + Toast.makeText(context, "Unable to connect to Wits!", Toast.LENGTH_LONG).show() + } val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0) audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, audioManager.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION), 0) @@ -41,8 +39,8 @@ class BootReceiver : BroadcastReceiver() { audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), 0) } - if (config.systemTweaks.startAtBoot.data) { - context.startForegroundService(Intent(context, CoreService::class.java)) + if (config.systemOptions.startAtBoot!!) { + AdbServiceConnection.startThisService(context) } } } diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/ConfigData.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/ConfigData.kt index 5e916b1..ed08bcc 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/ConfigData.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/ConfigData.kt @@ -1,10 +1,10 @@ package com.snaggly.ksw_toolkit.core.config import com.snaggly.ksw_toolkit.core.config.beans.EventManager -import com.snaggly.ksw_toolkit.core.config.beans.SystemTweaks +import com.snaggly.ksw_toolkit.core.config.beans.SystemOptions import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes data class ConfigData( - var systemTweaks: SystemTweaks, - var eventManagers : HashMap + var systemOptions: SystemOptions, + var eventManagers : HashMap ) diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/ConfigManager.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/ConfigManager.kt index 9f1e04f..a4d818f 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/ConfigManager.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/ConfigManager.kt @@ -2,52 +2,47 @@ package com.snaggly.ksw_toolkit.core.config import com.google.gson.Gson import com.snaggly.ksw_toolkit.core.config.beans.* -import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes import java.io.* -class ConfigManager private constructor() : IConfigBean { +class ConfigManager private constructor() { private var configFile: File? = null - lateinit var systemTweaks: SystemTweaks private set - var eventManagers = HashMap() - val gson = Gson() + var systemOptions = SystemOptions.initSystemTweaks() + var eventManagers = EventManager.initialButtons() + var json : String? = null + private val gson = Gson() - fun initBeans() { - systemTweaks = SystemTweaks.initSystemTweaks() - for (type in EventManagerTypes.values()) { - eventManagers[type] = EventManager.initEventManager() - } - } - - override fun saveConfig() { - val json = gson.toJson(ConfigData(systemTweaks, eventManagers)) + fun saveConfig() { + json = gson.toJson(ConfigData(systemOptions, eventManagers)) val fileWriter = FileWriter(configFile!!) fileWriter.write(json) fileWriter.close() } - override fun readConfig() { + fun readConfig() { val fileReader = FileReader(configFile!!) - val json = fileReader.readText() + json = fileReader.readText() fileReader.close() val configData = gson.fromJson(json, ConfigData::class.java) - configData.systemTweaks.startAtBoot?.let { systemTweaks.startAtBoot = it } - configData.systemTweaks.kswService?.let { systemTweaks.kswService = it } - configData.systemTweaks.carDataLogging?.let { systemTweaks.carDataLogging = it } - configData.systemTweaks.autoVolume?.let { systemTweaks.autoVolume = it } - configData.systemTweaks.maxVolume?.let { systemTweaks.maxVolume = it } - configData.systemTweaks.hideTopBar?.let { systemTweaks.hideTopBar = it } - configData.systemTweaks.shrinkTopBar?.let { systemTweaks.shrinkTopBar = it } - configData.systemTweaks.dpi?.let { systemTweaks.dpi = it } - configData.systemTweaks.logMcuEvent?.let { systemTweaks.logMcuEvent = it } - configData.systemTweaks.interceptMcuCommand?.let { systemTweaks.interceptMcuCommand = it } + configData.systemOptions.startAtBoot?.let { systemOptions.startAtBoot = it } + configData.systemOptions.hijackCS?.let { systemOptions.hijackCS = it } + configData.systemOptions.soundRestorer?.let { systemOptions.soundRestorer = it } + configData.systemOptions.autoTheme?.let { systemOptions.autoTheme = it } + configData.systemOptions.autoVolume?.let { systemOptions.autoVolume = it } + configData.systemOptions.maxVolume?.let { systemOptions.maxVolume = it } + configData.systemOptions.logMcuEvent?.let { systemOptions.logMcuEvent = it } + configData.systemOptions.interceptMcuCommand?.let { systemOptions.interceptMcuCommand = it } + configData.systemOptions.extraMediaButtonHandle?.let { systemOptions.extraMediaButtonHandle = it } + configData.systemOptions.nightBrightness?.let { systemOptions.nightBrightness = it } + configData.systemOptions.nightBrightnessLevel?.let { systemOptions.nightBrightnessLevel = it } + configData.systemOptions.mcuPath?.let { systemOptions.mcuPath = it } for (type in configData.eventManagers) { - configData.eventManagers[type.key]!!.eventMode?.let { eventManagers[type.key]?.eventMode = it } - configData.eventManagers[type.key]!!.mcuCommandMode?.let { eventManagers[type.key]?.mcuCommandMode = it } - configData.eventManagers[type.key]!!.appName?.let { eventManagers[type.key]?.appName = it } - configData.eventManagers[type.key]!!.keyCode?.let { eventManagers[type.key]?.keyCode = it } + configData.eventManagers[type.key]?.eventMode!!.let { eventManagers[type.key]?.eventMode = it } + configData.eventManagers[type.key]?.mcuCommandMode!!.let { eventManagers[type.key]?.mcuCommandMode = it } + configData.eventManagers[type.key]?.appName!!.let { eventManagers[type.key]?.appName = it } + configData.eventManagers[type.key]?.keyCode!!.let { eventManagers[type.key]?.keyCode = it } } } @@ -60,31 +55,12 @@ class ConfigManager private constructor() : IConfigBean { return config } config.configFile = File("$filePath/$fileName") - if (!config.configFile!!.isFile) + if (!config.configFile!!.isFile) { config.configFile!!.createNewFile() - config.initBeans() - try { - config.readConfig() + config.saveConfig() } - catch (ioe: Exception) { - config.initBeans() - } - IConfigBean.configManager = config + config.readConfig() return config } - - @Throws(UnsupportedEncodingException::class) - fun importConfig(applicationFilePath: String, toImportFilePath: String) : ConfigManager { - val inputFile = File(toImportFilePath) - inputFile.copyTo(File("$applicationFilePath/$fileName"), true) - config.configFile = null - getConfig(applicationFilePath) - return config - } - - fun exportConfig(filePath: String) { - val outputFile = File(filePath) - config.configFile!!.copyTo(outputFile, true) - } } } \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/IConfigBean.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/IConfigBean.kt deleted file mode 100644 index 4ecd5e4..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/IConfigBean.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.snaggly.ksw_toolkit.core.config - -interface IConfigBean { - fun saveConfig() - fun readConfig() - - companion object { - var configManager : IConfigBean? = null - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/beans/EventManager.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/beans/EventManager.kt index 3e9569e..57cae76 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/beans/EventManager.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/beans/EventManager.kt @@ -1,19 +1,184 @@ package com.snaggly.ksw_toolkit.core.config.beans -import com.snaggly.ksw_toolkit.core.config.custom.IntegerSetting -import com.snaggly.ksw_toolkit.core.config.custom.StringSetting +import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes import com.snaggly.ksw_toolkit.util.list.eventtype.EventMode +import com.snaggly.ksw_toolkit.util.list.keyevent.KeyCode +import com.snaggly.ksw_toolkit.util.list.mcu.McuCommandsEnum -class EventManager(eventMode: EventMode, keyCode: Int, appName: String, mcuCommandMode: Int){ - - var eventMode = eventMode - var keyCode = IntegerSetting(keyCode) - var appName = StringSetting(appName) - var mcuCommandMode = IntegerSetting(mcuCommandMode) +class EventManager(var eventMode: EventMode?, var keyCode: Int?, var appName: String?, + var mcuCommandMode: Int? +){ companion object { - fun initEventManager() : EventManager{ - return EventManager(EventMode.NoAssignment, -1, "", -1) + + fun initialButtons(): HashMap { + val result = hashMapOf() + for (type in EventManagerTypes.values()) { + result[type] = EventManager(EventMode.NoAssignment, -1, "", -1) + } + + return result + } + + fun initStandardButtons(): HashMap { + return hashMapOf( + EventManagerTypes.KnobPress to EventManager( + EventMode.KeyEvent, + KeyCode.ENTER.keycode, + "", + -1 + ), + EventManagerTypes.KnobTiltDown to EventManager( + EventMode.KeyEvent, + KeyCode.DPAD_DOWN.keycode, + "", + -1 + ), + EventManagerTypes.KnobTiltUp to EventManager( + EventMode.KeyEvent, + KeyCode.DPAD_UP.keycode, + "", + -1 + ), + EventManagerTypes.KnobTiltLeft to EventManager( + EventMode.KeyEvent, + KeyCode.DPAD_LEFT.keycode, + "", + -1 + ), + EventManagerTypes.KnobTiltRight to EventManager( + EventMode.KeyEvent, + KeyCode.DPAD_RIGHT.keycode, + "", + -1 + ), + EventManagerTypes.KnobTurnLeft to EventManager( + EventMode.KeyEvent, + KeyCode.DPAD_UP.keycode, + "", + -1 + ), + EventManagerTypes.KnobTurnRight to EventManager( + EventMode.KeyEvent, + KeyCode.DPAD_DOWN.keycode, + "", + -1 + ), + EventManagerTypes.BackButton to EventManager( + EventMode.KeyEvent, + KeyCode.BACK.keycode, + "", + -1 + ), + EventManagerTypes.MenuButton to EventManager( + EventMode.KeyEvent, + KeyCode.HOME.keycode, + "", + -1 + ), + EventManagerTypes.OptionsButton to EventManager( + EventMode.McuCommand, + -1, + "", + McuCommandsEnum.CarInfo.ordinal + ), + EventManagerTypes.NavigationButton to EventManager( + EventMode.StartApp, + -1, + "com.google.android.apps.maps", + -1 + ), + EventManagerTypes.ModeButton to EventManager( + EventMode.StartApp, + -1, + "com.spotify.music", + -1 + ), + EventManagerTypes.MediaNext to EventManager( + EventMode.KeyEvent, + KeyCode.MEDIA_NEXT.keycode, + "", + -1 + ), + EventManagerTypes.MediaPrevious to EventManager( + EventMode.KeyEvent, + KeyCode.MEDIA_PREVIOUS.keycode, + "", + -1 + ), + EventManagerTypes.MediaPlayPause to EventManager( + EventMode.KeyEvent, + KeyCode.MEDIA_PLAY_PAUSE.keycode, + "", + -1 + ), + EventManagerTypes.VoiceCommandButton to EventManager( + EventMode.KeyEvent, + KeyCode.VOICE_ASSIST.keycode, + "", + -1 + ), + EventManagerTypes.TelephoneButton to EventManager( + EventMode.StartApp, + -1, + "com.zjinnova.zlink", + -1 + ), + EventManagerTypes.VolumeDecrease to EventManager( + EventMode.KeyEvent, + KeyCode.VOLUME_DOWN.keycode, + "", + -1 + ), + EventManagerTypes.VolumeIncrease to EventManager( + EventMode.KeyEvent, + KeyCode.VOLUME_UP.keycode, + "", + -1 + ), + EventManagerTypes.TelephoneButtonLongPress to EventManager( + EventMode.NoAssignment, + -1, + "", + -1 + ), + EventManagerTypes.TelephoneButtonHangUp to EventManager( + EventMode.NoAssignment, + -1, + "", + -1 + ), + EventManagerTypes.Idle to EventManager( + EventMode.NoAssignment, + -1, + "", + -1 + ), + EventManagerTypes.ScreenSwitch to EventManager( + EventMode.NoAssignment, + -1, + "", + -1 + ), + EventManagerTypes.Dummy to EventManager( + EventMode.NoAssignment, + -1, + "", + -1 + ), + EventManagerTypes.CarData to EventManager( + EventMode.NoAssignment, + -1, + "", + -1 + ), + EventManagerTypes.BenzData to EventManager( + EventMode.NoAssignment, + -1, + "", + -1 + ) + ) } } } diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/beans/SystemOptions.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/beans/SystemOptions.kt new file mode 100644 index 0000000..32da430 --- /dev/null +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/beans/SystemOptions.kt @@ -0,0 +1,37 @@ +package com.snaggly.ksw_toolkit.core.config.beans + +import com.wits.pms.statuscontrol.PowerManagerApp + +class SystemOptions( + var startAtBoot: Boolean?, + var hijackCS: Boolean?, + var soundRestorer: Boolean?, + var autoTheme: Boolean?, + var autoVolume: Boolean?, + var maxVolume: Boolean?, + var logMcuEvent: Boolean?, + var interceptMcuCommand: Boolean?, + var extraMediaButtonHandle: Boolean?, + var nightBrightness: Boolean?, + var nightBrightnessLevel: Int?, + var mcuPath: String? +) { + companion object { + fun initSystemTweaks() : SystemOptions { + return SystemOptions( + startAtBoot = false, + hijackCS = false, + soundRestorer = false, + autoTheme = false, + autoVolume = false, + maxVolume = true, + logMcuEvent = true, + interceptMcuCommand = true, + extraMediaButtonHandle = PowerManagerApp.getSettingsInt("CarDisplay") == 0, + nightBrightness = false, + nightBrightnessLevel = 65, + mcuPath = "" + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/beans/SystemTweaks.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/beans/SystemTweaks.kt deleted file mode 100644 index ec92cbc..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/beans/SystemTweaks.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.snaggly.ksw_toolkit.core.config.beans - -import com.snaggly.ksw_toolkit.core.config.custom.BooleanSetting -import com.snaggly.ksw_toolkit.core.config.custom.IntegerSetting - -class SystemTweaks(startAtBoot: Boolean, - kswService: Boolean, - carDataLogging: Boolean, - autoVolume: Boolean, - maxVolume: Boolean, - hideTopBar: Boolean, - shrinkTopBar: Boolean, - dpi: Int, - logMcuEvent: Boolean, - interceptMcuCommand: Boolean) { - var startAtBoot = BooleanSetting(startAtBoot) - var kswService = BooleanSetting(kswService) - var carDataLogging = BooleanSetting(carDataLogging) - var autoVolume = BooleanSetting(autoVolume) - var maxVolume = BooleanSetting(maxVolume) - var hideTopBar = BooleanSetting(hideTopBar) - var shrinkTopBar = BooleanSetting(shrinkTopBar) - var dpi = IntegerSetting(dpi) - var logMcuEvent = BooleanSetting(logMcuEvent) - var interceptMcuCommand = BooleanSetting(interceptMcuCommand) - - companion object { - fun initSystemTweaks() : SystemTweaks { - return SystemTweaks( - startAtBoot = true, - kswService = true, - carDataLogging = false, - autoVolume = false, - maxVolume = false, - hideTopBar = false, - shrinkTopBar = false, - dpi = 160, - logMcuEvent = false, - interceptMcuCommand = false - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/custom/BooleanSetting.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/custom/BooleanSetting.kt deleted file mode 100644 index bf18333..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/custom/BooleanSetting.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.snaggly.ksw_toolkit.core.config.custom - -import com.snaggly.ksw_toolkit.core.config.IConfigBean - -class BooleanSetting(value: Boolean) { - var data = value - set(value) { - field = value - IConfigBean.configManager?.saveConfig() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/custom/IntegerSetting.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/custom/IntegerSetting.kt deleted file mode 100644 index 5f64190..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/custom/IntegerSetting.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.snaggly.ksw_toolkit.core.config.custom - -import com.snaggly.ksw_toolkit.core.config.IConfigBean - -class IntegerSetting(value: Int) { - var data = value - set(value) { - field = value - IConfigBean.configManager?.saveConfig() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/custom/StringSetting.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/config/custom/StringSetting.kt deleted file mode 100644 index 48e2f79..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/config/custom/StringSetting.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.snaggly.ksw_toolkit.core.config.custom - -import com.snaggly.ksw_toolkit.core.config.IConfigBean - -class StringSetting(string: String) { - var data = string - set(value) { - field = value - IConfigBean.configManager?.saveConfig() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/CoreService.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/CoreService.kt index 9d75583..e75f826 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/CoreService.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/CoreService.kt @@ -1,102 +1,86 @@ package com.snaggly.ksw_toolkit.core.service -import android.app.* -import android.content.Context +import android.app.AlertDialog +import android.app.Service import android.content.Intent -import android.content.pm.PackageManager -import android.graphics.Color -import android.os.Binder -import android.os.Build import android.os.IBinder import android.view.WindowManager -import androidx.annotation.RequiresApi -import androidx.core.app.NotificationCompat -import com.snaggly.ksw_toolkit.BuildConfig +import android.widget.Toast import com.snaggly.ksw_toolkit.R import com.snaggly.ksw_toolkit.core.service.adb.AdbServiceConnection import com.snaggly.ksw_toolkit.core.service.mcu.McuLogic import com.snaggly.ksw_toolkit.core.service.mcu.McuReaderHandler -import java.util.* +import com.snaggly.ksw_toolkit.core.service.remote.KSWToolKitService +import com.snaggly.ksw_toolkit.core.service.remote.ServiceValidation class CoreService : Service() { - @RequiresApi(api = Build.VERSION_CODES.O) - private fun startMyOwnForeground() { - val notificationChannelId = BuildConfig.APPLICATION_ID - val channelName = "McuListenerService" - val chan = NotificationChannel(notificationChannelId, channelName, NotificationManager.IMPORTANCE_NONE) - chan.lightColor = Color.BLACK - chan.lockscreenVisibility = Notification.VISIBILITY_PRIVATE - val manager = (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager) - manager.createNotificationChannel(chan) - val notificationBuilder = NotificationCompat.Builder(this, notificationChannelId) - val notification: Notification = notificationBuilder.setOngoing(true) - .setSmallIcon(R.drawable.ic_stat_name) - .setContentTitle("KSW-Toolkit running in background...") - .setPriority(NotificationManager.IMPORTANCE_MIN) - .setCategory(Notification.CATEGORY_SERVICE) - .build() - startForeground(2, notification) + override fun onBind(intent: Intent): IBinder? { + try { + ServiceValidation.signature = intent.getByteArrayExtra("Authentication") + } + catch (e : Exception) {} + ServiceValidation.hasAuthenticated = false + return kswToolKitService } - inner class McuServiceBinder : Binder() { - fun getService(): CoreService = this@CoreService + override fun onRebind(intent: Intent?) { + if (intent != null) { + try { + ServiceValidation.signature = intent.getByteArrayExtra("Authentication") + } + catch (e : Exception) {} + } + else + ServiceValidation.signature = null + ServiceValidation.hasAuthenticated = false + super.onRebind(intent) } - private val binder = McuServiceBinder() - override fun onBind(intent: Intent): IBinder { - return binder + override fun onUnbind(intent: Intent?): Boolean { + ServiceValidation.signature = null + ServiceValidation.hasAuthenticated = false + return super.onUnbind(intent) } - val adbConnection = AdbServiceConnection val mcuLogic = McuLogic - var mcuReaderHandler : McuReaderHandler? = null - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - startMyOwnForeground() + private var mcuReaderHandler : McuReaderHandler? = null + private var kswToolKitService : KSWToolKitService? = null + override fun onCreate() { try { mcuReaderHandler = McuReaderHandler(applicationContext) + if (mcuReaderHandler == null) + throw Exception("Unable to initiate McuReaderHandler") + mcuReaderHandler!!.startMcuReader() + kswToolKitService = KSWToolKitService(this, mcuReaderHandler!!) } catch (e: Exception) { - return crashOut("Could not start McuReader!\n\n${e.localizedMessage}") + crashOut("Could not start McuReader!\n\n${e.stackTrace}") } - return START_STICKY - } - - override fun onCreate() { - super.onCreate() - - try { - adbConnection.connect(applicationContext) - checkPermission() - } catch (e: Exception) { - crashOut("Could not connect to Adb!\n\n${e.localizedMessage}") - } + "KSW-ToolKit-Service started".showMessage() } override fun onDestroy() { - super.onDestroy() - adbConnection.startKsw() + kswToolKitService = null + showAlertMessage("KSW-ToolKit-Service stopped") + AdbServiceConnection.startKsw(applicationContext) mcuReaderHandler?.stopReader() - adbConnection.disconnect() + super.onDestroy() } - private fun checkPermission() { - if (applicationContext.checkSelfPermission("android.permission.READ_LOGS") != PackageManager.PERMISSION_GRANTED) { - adbConnection.sendCommand("pm grant ${BuildConfig.APPLICATION_ID} android.permission.READ_LOGS") - adbConnection.sendCommand("pm grant ${BuildConfig.APPLICATION_ID} android.permission.INJECT_EVENTS") - val alert = AlertDialog.Builder(this, R.style.alertDialogNight).setTitle("KSW-ToolKit-McuService").setMessage("Granted system permissions.\nPlease restart the app for effects to take in place").create() - alert.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alert.show() - } + private fun String.showMessage() { + Toast.makeText(this@CoreService, this, Toast.LENGTH_SHORT).show() } - private fun crashOut(message: String) : Int { + private fun showAlertMessage(message: String) { val alert = AlertDialog.Builder(this, R.style.alertDialogNight).setTitle("KSW-ToolKit-CoreService").setMessage(message).create() alert.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) alert.show() + } + + private fun crashOut(message: String) { + showAlertMessage(message) stopSelf() - return START_NOT_STICKY } } diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/adb/AdbServiceConnection.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/adb/AdbServiceConnection.kt index ed50ca5..f34f00f 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/adb/AdbServiceConnection.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/adb/AdbServiceConnection.kt @@ -1,49 +1,21 @@ package com.snaggly.ksw_toolkit.core.service.adb import android.content.Context +import com.snaggly.ksw_toolkit.BuildConfig +import com.snaggly.ksw_toolkit.core.service.CoreService import com.snaggly.ksw_toolkit.util.adb.AdbManager object AdbServiceConnection { - private val adbShellListeners = ArrayList() - - fun connect(context: Context) { - AdbManager.connect(context, "shell:", object : AdbManager.OnAdbShellDataReceived { - override fun onDataReceived(text: String) { - for (listener in adbShellListeners) - listener.update(text) - } - }) - } - - fun disconnect() { - AdbManager.disconnect() - } - - fun sendCommand(command: String) { - AdbManager.sendCommand(command) - } - - fun stopKsw() { - sendCommand("am stopservice --user 0 com.wits.pms/com.wits.pms.mcu.McuService\nappops set com.wits.pms SYSTEM_ALERT_WINDOW deny") - } - - fun startKsw() { - sendCommand("am startservice --user 0 com.wits.pms/com.wits.pms.mcu.McuService\nappops set com.wits.pms SYSTEM_ALERT_WINDOW allow") + fun stopKsw(context: Context) { + AdbManager.sendCommand("am stopservice --user 0 com.wits.pms/com.wits.pms.mcu.McuService\nappops set com.wits.pms SYSTEM_ALERT_WINDOW deny", context) } - fun sendKeyEvent(code: Int) { - sendCommand("input keyevent $code") + fun startKsw(context: Context) { + AdbManager.sendCommand("am startservice --user 0 com.wits.pms/com.wits.pms.mcu.McuService\nappops set com.wits.pms SYSTEM_ALERT_WINDOW allow", context) } - fun startApp(appId: String) { - sendCommand("monkey -p $appId -c android.intent.category.LAUNCHER 1") + fun startThisService(context: Context) { + AdbManager.sendCommand("am startservice --user 0 ${BuildConfig.APPLICATION_ID}/${CoreService::class.java.name}", context) } - fun registerShellListener(listener: ShellObserver) { - adbShellListeners.add(listener) - } - - fun unregisterShellListener(listener: ShellObserver) { - adbShellListeners.remove(listener) - } } \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/adb/ShellObserver.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/adb/ShellObserver.kt deleted file mode 100644 index 04bb791..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/adb/ShellObserver.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.snaggly.ksw_toolkit.core.service.adb - -interface ShellObserver { - fun update(newLine: String) -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/helper/CoreServiceClient.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/helper/CoreServiceClient.kt deleted file mode 100644 index 1222c00..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/helper/CoreServiceClient.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.snaggly.ksw_toolkit.core.service.helper - -import androidx.lifecycle.ViewModel -import com.snaggly.ksw_toolkit.core.service.CoreService - -abstract class CoreServiceClient : ViewModel() { - companion object { - var coreService: CoreService? = null - } - - val coreService: CoreService? - get() = CoreServiceClient.coreService -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/helper/CoreServiceConnector.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/helper/CoreServiceConnector.kt deleted file mode 100644 index 71026e6..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/helper/CoreServiceConnector.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.snaggly.ksw_toolkit.core.service.helper - -import android.content.ComponentName -import android.content.Context -import android.content.Intent -import android.content.ServiceConnection -import android.os.IBinder -import com.snaggly.ksw_toolkit.core.service.CoreService - -class CoreServiceConnector(private val context: Context) { - - private val serviceConnector = object: ServiceConnection { - override fun onServiceConnected(name: ComponentName?, service: IBinder?) { - CoreServiceClient.coreService = (service as CoreService.McuServiceBinder).getService() - } - - override fun onServiceDisconnected(name: ComponentName?) { - CoreServiceClient.coreService = null - } - } - - fun connectToService() { - Intent(context, CoreService::class.java).also { intent -> - context.bindService(intent, serviceConnector, Context.BIND_AUTO_CREATE) - } - } - - fun disconnectFromService() { - context.unbindService(serviceConnector) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/McuEventObserver.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/McuEventObserver.kt deleted file mode 100644 index b158aa2..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/McuEventObserver.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.snaggly.ksw_toolkit.core.service.mcu - -import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes - -interface McuEventObserver { - fun update(eventType: EventManagerTypes?, cmdType: Int, data: ByteArray) -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/McuLogic.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/McuLogic.kt index 6a10c84..55811df 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/McuLogic.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/McuLogic.kt @@ -1,7 +1,6 @@ package com.snaggly.ksw_toolkit.core.service.mcu import android.media.AudioManager -import com.snaggly.ksw_toolkit.core.service.view.BackTapper import com.wits.pms.statuscontrol.WitsStatus import projekt.auto.mcu.ksw.model.McuStatus import projekt.auto.mcu.ksw.serial.McuCommunicator @@ -14,12 +13,12 @@ object McuLogic { //Intern private var autoVolume = false - var senderInterval: Long = 1000 - var backTapper : BackTapper? = null + private var senderInterval: Long = 1000 //Param - var speedMaxVolume = 80 - var minVolume = 0.75f + private var speedMaxVolume = 80 + private var minVolume = 0.75f + var actionLock = false init { try{ diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/McuReaderHandler.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/McuReaderHandler.kt index 7738eb3..2302176 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/McuReaderHandler.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/McuReaderHandler.kt @@ -1,51 +1,117 @@ package com.snaggly.ksw_toolkit.core.service.mcu +import android.app.UiModeManager import android.content.Context import android.media.AudioManager +import android.os.Build +import com.snaggly.ksw_toolkit.IMcuListener import com.snaggly.ksw_toolkit.core.config.ConfigManager import com.snaggly.ksw_toolkit.core.service.adb.AdbServiceConnection import com.snaggly.ksw_toolkit.core.service.mcu.action.EventAction import com.snaggly.ksw_toolkit.core.service.mcu.action.EventActionLogger import com.snaggly.ksw_toolkit.core.service.mcu.parser.* import com.snaggly.ksw_toolkit.core.service.sys_observers.BrightnessObserver -import com.snaggly.ksw_toolkit.core.service.view.BackTapper import com.wits.pms.statuscontrol.PowerManagerApp import projekt.auto.mcu.ksw.serial.reader.LogcatReader import projekt.auto.mcu.ksw.serial.McuCommunicator +import projekt.auto.mcu.ksw.serial.collection.McuCommands import projekt.auto.mcu.ksw.serial.reader.SerialReader +import projekt.auto.mcu.ksw.serial.writer.SerialWriter class McuReaderHandler(private val context: Context) { - private val mcuEventListeners = ArrayList() - private val config = ConfigManager.getConfig(context.filesDir.absolutePath) + private var mcuEventListeners = ArrayList() private val brightnessObserver = BrightnessObserver(context) - private val sendingInterceptor = McuSenderInterceptor() + private val sendingInterceptor = McuSenderInterceptor(100) private lateinit var eventAction : EventAction - private var parseMcuEvent = McuEvent(ScreenSwitchEvent, CarDataEvent, BenzDataEvent) + private var parseMcuEvent = McuEvent(context) private var hasSerialInit = false + val config = ConfigManager.getConfig(context.filesDir.absolutePath) + init { - McuLogic.mcuCommunicator = McuCommunicator.getInstance() + when { + config.systemOptions.mcuPath != "" -> { + McuLogic.mcuCommunicator = McuCommunicator(SerialWriter(config.systemOptions.mcuPath), LogcatReader()) + } + Build.VERSION.RELEASE.contains("11") -> { + McuLogic.mcuCommunicator = McuCommunicator(SerialWriter("/dev/ttyHS1"), LogcatReader()) + } + Build.DISPLAY.contains("8937") -> { + McuLogic.mcuCommunicator = McuCommunicator(SerialWriter("/dev/ttyHSL1"), LogcatReader()) + } + else -> { + McuLogic.mcuCommunicator = McuCommunicator.getInstance() + } + } } private val initialSerialStartAction = McuCommunicator.McuAction { cmdType, data -> if (!hasSerialInit) { - if (cmdType == 0x1C && data[0] == 0x1.toByte()) { + //Only set up serial reader when in Sysmode 1 + if (data.isNotEmpty() && (cmdType == 0x1C && data[0] == 0x1.toByte())) { hasSerialInit = true McuLogic.mcuCommunicator!!.mcuReader.stopReading() - AdbServiceConnection.stopKsw() + AdbServiceConnection.stopKsw(context) + + //Initialize SerialReader + when { + config.systemOptions.mcuPath != "" -> { + McuLogic.mcuCommunicator!!.mcuReader = SerialReader(config.systemOptions.mcuPath) + } + Build.VERSION.RELEASE.contains("11") -> { + McuLogic.mcuCommunicator!!.mcuReader = SerialReader("/dev/ttyHS1") + } + Build.DISPLAY.contains("8937") -> { + McuLogic.mcuCommunicator!!.mcuReader = SerialReader("/dev/ttyHSL1") + } + else -> { + McuLogic.mcuCommunicator!!.mcuReader = SerialReader() + } + } - if (config.systemTweaks.logMcuEvent.data) - eventAction = EventActionLogger(context) + //Check if Service should handle extra Media Buttons + if (PowerManagerApp.getSettingsInt("CarDisplay") == 0) { + parseMcuEvent.screenSwitchEvent = ScreenSwitchEventNoOEMScreen + } else { + val dataBytes : ByteArray + if (config.systemOptions.extraMediaButtonHandle!!) { + parseMcuEvent.screenSwitchEvent = ScreenSwitchMediaHack + dataBytes = byteArrayOf(0x0e, 0x00) + } else { + parseMcuEvent.screenSwitchEvent = ScreenSwitchEvent + dataBytes = byteArrayOf(0x0e, 0x01) + } + McuLogic.mcuCommunicator?.sendCommand(0x70, dataBytes, false) + } - if (config.systemTweaks.carDataLogging.data) { - parseMcuEvent.carDataEvent = CarDataEventLogger - parseMcuEvent.benzDataEvent = BenzDataEventLogger + //Is AutoTheme on? This service will be able to toggle global Android Dark/Light Theme + if (config.systemOptions.autoTheme!!) { + parseMcuEvent.carDataEvent.lightEvent = LightEventSwitch.apply { + uiModeManager = context.getSystemService(UiModeManager::class.java) + } + } else { + parseMcuEvent.carDataEvent.lightEvent = LightEvent + } + + //Is NightBrightness on? This once Headlights turn on, the screen will dim to a given level. + parseMcuEvent.carDataEvent.lightEvent.hasNightBrightness = config.systemOptions.nightBrightness!! + if (config.systemOptions.nightBrightness!!) { + McuLogic.mcuCommunicator?.sendCommand(McuCommands.Set_Backlight_Control_On) + parseMcuEvent.carDataEvent.lightEvent.nightBrightnessLevel = config.systemOptions.nightBrightnessLevel!! + } else { + if (PowerManagerApp.getSettingsInt("Backlight_auto_set") == 0) { + McuLogic.mcuCommunicator?.sendCommand(McuCommands.Set_Backlight_Control_Off) + } } - McuLogic.mcuCommunicator!!.mcuReader = SerialReader() + //Is McuLogging on? Useful for Tasker to get Mcu Data from Logcat. Replicates CenterService procedure. + if (config.systemOptions.logMcuEvent!!) + eventAction = EventActionLogger(context) + McuLogic.mcuCommunicator!!.mcuReader.startReading(onMcuEventAction) - if (config.systemTweaks.interceptMcuCommand.data) { + //Should this service intercept what CenterService tries to send to Mcu? Replicated core CenterService commands. + if (config.systemOptions.interceptMcuCommand!!) { sendingInterceptor.startReading(fun(cmdType: Int, data: ByteArray) { McuLogic.mcuCommunicator?.sendCommand(cmdType, data, false) }) @@ -54,50 +120,63 @@ class McuReaderHandler(private val context: Context) { brightnessObserver.startObservingBrightness() } - McuLogic.backTapper = BackTapper(context) + parseMcuEvent.idleEvent.armBackTapper() + + //Get current CarData + McuLogic.mcuCommunicator!!.sendCommand(104, byteArrayOf(5, 0), false) } } } private val onMcuEventAction = McuCommunicator.McuAction { cmdType, data -> Thread { - val event = parseMcuEvent.getMcuEvent(cmdType, data) - eventAction.processAction(cmdType, data, event, config) - - for (mcuEventListener in mcuEventListeners) - mcuEventListener.update(event, cmdType, data) + if (cmdType != 0 || data.isNotEmpty()) { + val event = parseMcuEvent.getMcuEvent(cmdType, data) + eventAction.processAction(cmdType, data, event, config) + + for (i in mcuEventListeners.indices) { + try { + mcuEventListeners[i].updateMcu(event.toString(), cmdType, data) + } catch (e: Exception) { + unregisterMcuEventListener(mcuEventListeners[i]) + } + } + } }.start() } fun startMcuReader() { eventAction = EventAction(context) - parseMcuEvent.carDataEvent = CarDataEvent - parseMcuEvent.benzDataEvent = BenzDataEvent - parseMcuEvent.screenSwitchEvent = if (PowerManagerApp.getSettingsInt("CarDisplay") == 0) { - ScreenSwitchEventNoOEMScreen - } else { - ScreenSwitchEvent - } - AdbServiceConnection.startKsw() + //Start CenterService-McuService. If CenterService has to be hijacked, I need to wait until it's ready. + AdbServiceConnection.startKsw(context) + McuLogic.mcuCommunicator!!.mcuReader?.stopReading() McuLogic.mcuCommunicator!!.mcuReader = LogcatReader() - if (config.systemTweaks.kswService.data) { - McuLogic.mcuCommunicator!!.mcuReader.startReading(onMcuEventAction) - } else { + if (config.systemOptions.hijackCS!!) { McuLogic.mcuCommunicator!!.mcuReader.startReading(initialSerialStartAction) + } else { + McuLogic.mcuCommunicator!!.mcuReader.startReading(onMcuEventAction) } - if (config.systemTweaks.autoVolume.data) { + //Is AutoVolume on? Start on it on its separate thread. This only works when CarData get parsed! + if (config.systemOptions.autoVolume!!) { McuLogic.startAutoVolume(context.getSystemService(Context.AUDIO_SERVICE) as AudioManager) } } fun stopReader() { brightnessObserver.stopObservingBrightness() - McuLogic.backTapper = null + parseMcuEvent.idleEvent.clearBackTapper() McuLogic.stopAutoVolume() McuLogic.mcuCommunicator?.stopBeat() sendingInterceptor.stopReading() + if (PowerManagerApp.getSettingsInt("Backlight_auto_set") == 0) { + McuLogic.mcuCommunicator?.sendCommand(McuCommands.Set_Backlight_Control_Off) + } + if (config.systemOptions.extraMediaButtonHandle!! && PowerManagerApp.getSettingsInt("CarDisplay") == 0) { + val dataBytes = byteArrayOf(0x0e, 0x01) + McuLogic.mcuCommunicator?.sendCommand(0x70, dataBytes, false) + } McuLogic.mcuCommunicator?.mcuReader?.stopReading() hasSerialInit = false } @@ -107,11 +186,11 @@ class McuReaderHandler(private val context: Context) { startMcuReader() } - fun registerMcuEventListener(listener: McuEventObserver) { + fun registerMcuEventListener(listener: IMcuListener) { mcuEventListeners.add(listener) } - fun unregisterMcuEventListener(listener: McuEventObserver) { + fun unregisterMcuEventListener(listener: IMcuListener) { mcuEventListeners.remove(listener) } } \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/action/EventAction.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/action/EventAction.kt index 1fa8b4f..6ab07d3 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/action/EventAction.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/action/EventAction.kt @@ -8,6 +8,7 @@ import com.snaggly.ksw_toolkit.util.commander.KeyInjector import com.snaggly.ksw_toolkit.util.commander.McuCommander import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes import com.snaggly.ksw_toolkit.util.list.eventtype.EventMode +import com.snaggly.ksw_toolkit.util.list.keyevent.KeyCode import com.snaggly.ksw_toolkit.util.list.mcu.McuCommandsEnum open class EventAction(private val context: Context) { @@ -16,13 +17,14 @@ open class EventAction(private val context: Context) { val eventConfig = config.eventManagers[event] when (eventConfig?.eventMode) { EventMode.KeyEvent -> { - KeyInjector.sendKey(eventConfig.keyCode.data) + if (!(McuLogic.actionLock && eventConfig.keyCode == KeyCode.HOME.keycode)) + KeyInjector.sendKey(eventConfig.keyCode!!) } EventMode.StartApp -> { - AppStarter.launchAppById(eventConfig.appName.data, context) + AppStarter.launchAppById(eventConfig.appName!!, context) } EventMode.McuCommand -> { - McuCommander.executeCommand(McuCommandsEnum.values[eventConfig.mcuCommandMode.data], McuLogic.mcuCommunicator, context) + McuCommander.executeCommand(McuCommandsEnum.values[eventConfig.mcuCommandMode!!], McuLogic.mcuCommunicator, context) } else -> {} } diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/BenzDataEvent.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/BenzDataEvent.kt deleted file mode 100644 index ab93c7c..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/BenzDataEvent.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.snaggly.ksw_toolkit.core.service.mcu.parser - -import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes - -object BenzDataEvent : IBenzDataEvent { - override fun getBenzDataEvent(data: ByteArray): EventManagerTypes { - return EventManagerTypes.BenzData - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/CarDataEvent.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/CarDataEvent.kt deleted file mode 100644 index dc149ad..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/CarDataEvent.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.snaggly.ksw_toolkit.core.service.mcu.parser - -import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes - -object CarDataEvent : ICarDataEvent { - override fun getCarDataEvent(data: ByteArray): EventManagerTypes { - return EventManagerTypes.CarData - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/CarDataEventLogger.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/CarDataEventLogger.kt index 4b4ce41..0862e9b 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/CarDataEventLogger.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/CarDataEventLogger.kt @@ -3,13 +3,14 @@ package com.snaggly.ksw_toolkit.core.service.mcu.parser import com.snaggly.ksw_toolkit.core.service.mcu.McuLogic import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes -object CarDataEventLogger : ICarDataEvent { +object CarDataEventLogger : ICarDataEvent() { override fun getCarDataEvent(data: ByteArray): EventManagerTypes { when { data[0] == 0x19.toByte() -> { McuLogic.mcuStat.carData.parseFromCarDataEvent(data) } data[0] == 0x10.toByte() -> { + lightEvent.getCarDataEvent(data) McuLogic.mcuStat.carData.parseFromBrakeBeltEvent(data) } data[0] == 0x12.toByte() -> { diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ICarDataEvent.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ICarDataEvent.kt index 9105790..bb4ee8f 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ICarDataEvent.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ICarDataEvent.kt @@ -2,6 +2,7 @@ package com.snaggly.ksw_toolkit.core.service.mcu.parser import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes -interface ICarDataEvent { - fun getCarDataEvent(data: ByteArray) : EventManagerTypes +abstract class ICarDataEvent { + companion object var lightEvent : ILightEvent = LightEvent + abstract fun getCarDataEvent(data: ByteArray) : EventManagerTypes } \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ILightEvent.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ILightEvent.kt new file mode 100644 index 0000000..43022dc --- /dev/null +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ILightEvent.kt @@ -0,0 +1,9 @@ +package com.snaggly.ksw_toolkit.core.service.mcu.parser + +import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes + +interface ILightEvent { + fun getCarDataEvent(data: ByteArray) : EventManagerTypes + var hasNightBrightness : Boolean + var nightBrightnessLevel : Int +} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/IMcuEvent.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/IMcuEvent.kt index 125e986..e851eb0 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/IMcuEvent.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/IMcuEvent.kt @@ -1,9 +1,13 @@ package com.snaggly.ksw_toolkit.core.service.mcu.parser +import android.content.Context import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes -abstract class IMcuEvent(var screenSwitchEvent: IScreenSwitchEvent, var carDataEvent: ICarDataEvent, var benzDataEvent: IBenzDataEvent) { +abstract class IMcuEvent(context: Context) { + var benzDataEvent: IBenzDataEvent = BenzDataEventLogger + var carDataEvent: ICarDataEvent = CarDataEventLogger + var screenSwitchEvent: IScreenSwitchEvent = ScreenSwitchEvent val buttonClickEvent = ButtonClickEvent - val idleEvent = IdleEvent + val idleEvent = IdleEvent(context) abstract fun getMcuEvent(cmdType: Int, data: ByteArray): EventManagerTypes? } \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/IScreenSwitchEvent.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/IScreenSwitchEvent.kt index 5c40611..8861c76 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/IScreenSwitchEvent.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/IScreenSwitchEvent.kt @@ -4,4 +4,6 @@ import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes interface IScreenSwitchEvent { fun getScreenSwitch(data: ByteArray) : EventManagerTypes + + var hasSoundRestorer : Boolean } \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/IdleEvent.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/IdleEvent.kt index fa3912c..264a81b 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/IdleEvent.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/IdleEvent.kt @@ -1,14 +1,40 @@ package com.snaggly.ksw_toolkit.core.service.mcu.parser +import android.content.Context import com.snaggly.ksw_toolkit.core.service.mcu.McuLogic +import com.snaggly.ksw_toolkit.core.service.view.BackTapper import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes -object IdleEvent { +class IdleEvent(val context: Context) { + private var backTapper: BackTapper? = null + private var ticks = 0 + private var wasInSys2 = false + + fun armBackTapper() { + backTapper = BackTapper(context) + } + + fun clearBackTapper() { + backTapper?.removeBackWindow() + backTapper = null + } + fun getIdleEvent(data: ByteArray) : EventManagerTypes { if (data[0] == 0x1.toByte()) { - McuLogic.backTapper?.removeBackWindow() + backTapper?.removeBackWindow() + if (wasInSys2) { + if (ticks >= 1) { + McuLogic.actionLock = false + wasInSys2 = false + ticks = 0 + } else { + ticks++ + } + } } else { - McuLogic.backTapper?.drawBackWindow(McuLogic.mcuCommunicator!!) + backTapper?.drawBackWindow(McuLogic.mcuCommunicator!!) + McuLogic.actionLock = true + wasInSys2 = true } return EventManagerTypes.Idle } diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/LightEvent.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/LightEvent.kt new file mode 100644 index 0000000..2cd9dcb --- /dev/null +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/LightEvent.kt @@ -0,0 +1,30 @@ +package com.snaggly.ksw_toolkit.core.service.mcu.parser + +import com.snaggly.ksw_toolkit.core.service.mcu.McuLogic +import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes +import projekt.auto.mcu.ksw.serial.collection.McuCommands +import kotlin.experimental.and + +object LightEvent : ILightEvent { + override fun getCarDataEvent(data: ByteArray): EventManagerTypes { + if (thisHasNightBrightness) { + if (data[1].and(7) == 0x05.toByte()) { + McuLogic.mcuCommunicator?.sendCommand(McuCommands.SetBrightnessLevel(thisNightBrightnessLevel.toByte())) + } else { + McuLogic.mcuCommunicator?.sendCommand(McuCommands.SetBrightnessLevel(100.toByte())) + } + } + + return EventManagerTypes.CarData + } + + override var hasNightBrightness: Boolean + get() = thisHasNightBrightness + set(value) {thisHasNightBrightness = value} + override var nightBrightnessLevel: Int + get() = thisNightBrightnessLevel + set(value) {thisNightBrightnessLevel = value} + + private var thisHasNightBrightness : Boolean = false + private var thisNightBrightnessLevel : Int = 0 +} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/LightEventSwitch.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/LightEventSwitch.kt new file mode 100644 index 0000000..dc5f74c --- /dev/null +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/LightEventSwitch.kt @@ -0,0 +1,37 @@ +package com.snaggly.ksw_toolkit.core.service.mcu.parser + +import android.app.UiModeManager +import com.snaggly.ksw_toolkit.core.service.mcu.McuLogic +import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes +import projekt.auto.mcu.ksw.serial.collection.McuCommands +import kotlin.experimental.and + +object LightEventSwitch : ILightEvent { + + var uiModeManager : UiModeManager? = null + + override fun getCarDataEvent(data: ByteArray): EventManagerTypes { + if (data[1].and(7) > 1) { + uiModeManager?.nightMode = UiModeManager.MODE_NIGHT_YES + if(hasNightBrightness) { + McuLogic.mcuCommunicator?.sendCommand(McuCommands.SetBrightnessLevel(thisNightBrightnessLevel.toByte())) + } + } else { + uiModeManager?.nightMode = UiModeManager.MODE_NIGHT_NO + if(hasNightBrightness) { + McuLogic.mcuCommunicator?.sendCommand(McuCommands.SetBrightnessLevel(100.toByte())) + } + } + return EventManagerTypes.CarData + } + + override var hasNightBrightness: Boolean + get() = thisHasNightBrightness + set(value) {thisHasNightBrightness = value} + override var nightBrightnessLevel: Int + get() = thisNightBrightnessLevel + set(value) {thisNightBrightnessLevel = value} + + private var thisHasNightBrightness : Boolean = false + private var thisNightBrightnessLevel : Int = 0 +} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/McuEvent.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/McuEvent.kt index 0d21807..7a01ae3 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/McuEvent.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/McuEvent.kt @@ -1,9 +1,9 @@ package com.snaggly.ksw_toolkit.core.service.mcu.parser -import com.snaggly.ksw_toolkit.core.service.mcu.McuLogic +import android.content.Context import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes -class McuEvent(screenSwitchEvent: IScreenSwitchEvent, carDataEvent: ICarDataEvent, benzDataEvent: IBenzDataEvent) : IMcuEvent(screenSwitchEvent, carDataEvent, benzDataEvent) { +class McuEvent(context: Context) : IMcuEvent(context) { override fun getMcuEvent(cmdType: Int, data: ByteArray): EventManagerTypes? { when (cmdType) { 0xA1 -> { @@ -11,8 +11,10 @@ class McuEvent(screenSwitchEvent: IScreenSwitchEvent, carDataEvent: ICarDataEven return buttonClickEvent.getClickEvent(data) } else if (data[0] == 0x1A.toByte() && data.size > 1) { return screenSwitchEvent.getScreenSwitch(data) + } else if (data.size > 1) { + return carDataEvent.getCarDataEvent(data) } - return carDataEvent.getCarDataEvent(data) + return EventManagerTypes.CarData } 0x1D -> return benzDataEvent.getBenzDataEvent(data) 0x1C -> return idleEvent.getIdleEvent(data) diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ScreenSwitchEvent.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ScreenSwitchEvent.kt index 61c1ad0..4e3f244 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ScreenSwitchEvent.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ScreenSwitchEvent.kt @@ -3,9 +3,22 @@ package com.snaggly.ksw_toolkit.core.service.mcu.parser import com.snaggly.ksw_toolkit.core.service.mcu.McuLogic import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes import projekt.auto.mcu.ksw.serial.collection.McuCommands +import projekt.auto.mcu.ksw.serial.enums.SOUND_SRC_TYPE object ScreenSwitchEvent : IScreenSwitchEvent { override fun getScreenSwitch(data: ByteArray): EventManagerTypes { + if (data[1] == 0x1.toByte()) { + if (thisHasSoundRestorer) { + McuLogic.mcuCommunicator!!.sendCommand(McuCommands.SetMusicSource(SOUND_SRC_TYPE.SRC_ATSL_AIRCONSOLE)) + } + } + return EventManagerTypes.ScreenSwitch } + + override var hasSoundRestorer: Boolean + get() = thisHasSoundRestorer + set(value) {thisHasSoundRestorer = value} + + private var thisHasSoundRestorer : Boolean = false } \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ScreenSwitchEventNoOEMScreen.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ScreenSwitchEventNoOEMScreen.kt index 9d6cdc2..560326f 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ScreenSwitchEventNoOEMScreen.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ScreenSwitchEventNoOEMScreen.kt @@ -3,15 +3,25 @@ package com.snaggly.ksw_toolkit.core.service.mcu.parser import com.snaggly.ksw_toolkit.core.service.mcu.McuLogic import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes import projekt.auto.mcu.ksw.serial.collection.McuCommands +import projekt.auto.mcu.ksw.serial.enums.SOUND_SRC_TYPE object ScreenSwitchEventNoOEMScreen : IScreenSwitchEvent { override fun getScreenSwitch(data: ByteArray): EventManagerTypes { if (data[1] == 0x1.toByte()) { McuLogic.mcuCommunicator!!.sendCommand(McuCommands.SYS_SCREEN_ON) + if (thisHasSoundRestorer) { + McuLogic.mcuCommunicator!!.sendCommand(McuCommands.SetMusicSource(SOUND_SRC_TYPE.SRC_ATSL_AIRCONSOLE)) + } } else if (data[1] == 0x2.toByte()) { McuLogic.mcuCommunicator!!.sendCommand(McuCommands.SYS_SCREEN_OFF) } return EventManagerTypes.ScreenSwitch } + + override var hasSoundRestorer: Boolean + get() = thisHasSoundRestorer + set(value) {thisHasSoundRestorer = value} + + private var thisHasSoundRestorer : Boolean = false } \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ScreenSwitchMediaHack.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ScreenSwitchMediaHack.kt new file mode 100644 index 0000000..ead5e1c --- /dev/null +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/mcu/parser/ScreenSwitchMediaHack.kt @@ -0,0 +1,32 @@ +package com.snaggly.ksw_toolkit.core.service.mcu.parser + +import com.snaggly.ksw_toolkit.core.service.mcu.McuLogic +import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes +import projekt.auto.mcu.ksw.serial.collection.McuCommands +import projekt.auto.mcu.ksw.serial.enums.SOUND_SRC_TYPE + +object ScreenSwitchMediaHack : IScreenSwitchEvent { + private val enableOEM = byteArrayOf(0x0e, 0x01) + private val disableOEM = byteArrayOf(0x0e, 0x00) + private var switchLock = false + + override fun getScreenSwitch(data: ByteArray): EventManagerTypes { + if (data[1] == 0x1.toByte()) { + switchLock = false + McuLogic.mcuCommunicator!!.sendCommand(0x70, disableOEM, false) + McuLogic.mcuCommunicator!!.sendCommand(McuCommands.SetMusicSource(SOUND_SRC_TYPE.SRC_ATSL_AIRCONSOLE)) + } else if (data[1] == 0x2.toByte() && !switchLock) { + switchLock = true + McuLogic.mcuCommunicator!!.sendCommand(0x70, enableOEM, false) + McuLogic.mcuCommunicator!!.sendCommand(McuCommands.SWITCH_TO_OEM) + } + + return EventManagerTypes.ScreenSwitch + } + + override var hasSoundRestorer: Boolean + get() = thisHasSoundRestorer + set(value) {thisHasSoundRestorer = value} + + private var thisHasSoundRestorer : Boolean = false +} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/remote/KSWToolKitService.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/remote/KSWToolKitService.kt new file mode 100644 index 0000000..be13dc7 --- /dev/null +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/remote/KSWToolKitService.kt @@ -0,0 +1,180 @@ +package com.snaggly.ksw_toolkit.core.service.remote + +import android.content.Context +import android.content.Intent +import com.snaggly.ksw_toolkit.IKSWToolKitService +import com.snaggly.ksw_toolkit.IMcuListener +import com.snaggly.ksw_toolkit.core.config.beans.EventManager +import com.snaggly.ksw_toolkit.core.service.CoreService +import com.snaggly.ksw_toolkit.core.service.mcu.McuLogic +import com.snaggly.ksw_toolkit.core.service.mcu.McuReaderHandler +import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes +import com.snaggly.ksw_toolkit.util.list.eventtype.EventMode + +class KSWToolKitService(private val serviceContext: Context, private val coreReaderHandler: McuReaderHandler) : IKSWToolKitService.Stub() { + + private val configManager = coreReaderHandler.config + + override fun sendMcuCommand(cmdType: Int, data: ByteArray?): Boolean { + if (!authenticate()) + return false + + return if (McuLogic.mcuCommunicator == null) + false + else { + McuLogic.mcuCommunicator!!.sendCommand(cmdType, data, false) + true + } + } + + override fun changeBtnConfig(btnType: Int, cmdType: Int, cmdValue: String?): Boolean { + if (!authenticate()) + return false + + val eventConfig = configManager.eventManagers[EventManagerTypes.values()[btnType]] + if (eventConfig == null) + return false + else { + eventConfig.eventMode = EventMode.values()[cmdType] + when (eventConfig.eventMode) { + EventMode.NoAssignment -> { + eventConfig.appName = "" + eventConfig.keyCode = -1 + eventConfig.mcuCommandMode = -1 + } + EventMode.KeyEvent -> { + try { + val cmdValueInt = cmdValue!!.toInt() + eventConfig.appName = "" + eventConfig.keyCode = cmdValueInt + eventConfig.mcuCommandMode = -1 + } catch (e: Exception) { + eventConfig.eventMode = EventMode.NoAssignment + return false + } + } + EventMode.StartApp -> { + try { + eventConfig.appName = cmdValue!! + eventConfig.keyCode = -1 + eventConfig.mcuCommandMode = -1 + } catch (e: Exception) { + eventConfig.eventMode = EventMode.NoAssignment + return false + } + } + EventMode.McuCommand -> { + try { + val cmdValueInt = cmdValue!!.toInt() + eventConfig.appName = "" + eventConfig.keyCode = -1 + eventConfig.mcuCommandMode = cmdValueInt + } catch (e: Exception) { + eventConfig.eventMode = EventMode.NoAssignment + return false + } + } + } + } + configManager.saveConfig() + return true + } + + override fun setDefaultBtnLayout() { + configManager.eventManagers = EventManager.initStandardButtons() + configManager.saveConfig() + } + + override fun getConfig(): String? { + return configManager.json + } + + override fun setOptions(allSettings: BooleanArray?): Boolean { + if (!authenticate()) + return false + if (allSettings == null) + return false + if (allSettings.size < 10) { + return false + } + + configManager.systemOptions.startAtBoot = allSettings[0] + configManager.systemOptions.hijackCS = allSettings[1] + configManager.systemOptions.soundRestorer = allSettings[2] + configManager.systemOptions.autoTheme = allSettings[3] + configManager.systemOptions.autoVolume = allSettings[4] + configManager.systemOptions.maxVolume = allSettings[5] + configManager.systemOptions.logMcuEvent = allSettings[6] + configManager.systemOptions.interceptMcuCommand = allSettings[7] + configManager.systemOptions.extraMediaButtonHandle = allSettings[8] + configManager.systemOptions.nightBrightness = allSettings[9] + + configManager.saveConfig() + + coreReaderHandler.restartReader() + return true + } + + override fun getSettingsTypes(): Array? { + return arrayOf( + "Enabled", + "HijackCenterService", + "SoundRestorer", + "AutoTheme", + "AutoVolume", + "MaxVolumeAtBoot", + "LogMcuEvents", + "InterceptMcuCommands", + "EnableExtendedIDrive", + "NightBrightness" + ) + } + + override fun setMcuPath(path: String?) : Boolean { + return if (path != null) { + configManager.systemOptions.mcuPath = path + coreReaderHandler.restartReader() + true + } else { + false + } + } + + override fun registerMcuListener(listener: IMcuListener?): Boolean { + if (!authenticate()) + return false + return if (listener != null) { + coreReaderHandler.registerMcuEventListener(listener) + true + } else false + } + + override fun unregisterMcuListener(listener: IMcuListener?): Boolean { + return if (listener != null) { + coreReaderHandler.unregisterMcuEventListener(listener) + true + } else false + } + + override fun getNightBrightnessSetting(): Int { + return configManager.systemOptions.nightBrightnessLevel!! + } + + override fun setNightBrightnessSetting(value: Int) { + configManager.systemOptions.nightBrightnessLevel = value + configManager.saveConfig() + coreReaderHandler.restartReader() + } + + private fun authenticate() : Boolean { + if (!ServiceValidation.hasAuthenticated) { + return if (ServiceValidation.validate(serviceContext)) { + true + } else { + serviceContext.stopService(Intent(serviceContext, CoreService::class.java)) + false + } + } + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/remote/ServiceValidation.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/remote/ServiceValidation.kt new file mode 100644 index 0000000..d2a9f2c --- /dev/null +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/remote/ServiceValidation.kt @@ -0,0 +1,72 @@ +package com.snaggly.ksw_toolkit.core.service.remote + +import android.app.ActivityManager +import android.app.Service +import android.content.Context +import android.os.Binder +import projekt.auto.mcu.encryption.Base64 +import java.security.KeyFactory +import java.security.PublicKey +import java.security.Signature +import java.security.spec.X509EncodedKeySpec + +object ServiceValidation { + var hasAuthenticated = false + var signature : ByteArray? = null + + fun validate(context: Context) : Boolean { + hasAuthenticated = false + if (signature==null) return false + val packageName = context.packageManager.getNameForUid(Binder.getCallingUid()) ?: return false + if (packageName in allowedPackages) + return true + val s = Signature.getInstance("SHA256withRSA/PSS").apply { + initVerify(getPublicKey()) + update(packageName.toByteArray()) + } + + if (s.verify(signature)) { + hasAuthenticated = true + return true + } + + return false + } + + + + private fun getPackageNames(context: Context, pid: Int): Array? { + val am = context.getSystemService(Service.ACTIVITY_SERVICE) as ActivityManager + val infos = am.runningAppProcesses + if (infos != null && infos.size > 0) { + for (info in infos) { + if (info.pid == pid) { + return info.pkgList + } + } + } + return null + } + + private fun getPublicKey() : PublicKey { + return KeyFactory.getInstance("RSA") + .generatePublic( + X509EncodedKeySpec( + Base64.decode(publicKeyBase64, Base64.DEFAULT) + ) + ) + } + + private val allowedPackages : Array = arrayOf( + "com.snaggly.wits.ksw_toolkit.client" + ) + + private const val publicKeyBase64 = + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3EJuFxL6kgtGpXRmt20e" + + "qUfiBQTZiMZyWMhzhwgtHpkcX6RXKiVaqLy0iTvRL7QxfyJcgLAaxYh7e1iS3SHm" + + "4cbMCpmF3CvcfAmaCmVmoocUE3GwXzdSifUcia8XNXiEN8V0polYKMGV6lvbqVFg" + + "qpZtZOsznidlJ6clbDJlSV8EJBoRFw0LsFSvN9BB4LRL0Q+uFEQek5qkJt2VpoBu" + + "syHc09+BIr0X/rFpxZPdkBnI5Uy8+0g0aJmEFPwhlP2jSiC4yHq/zzXusiDlqT1/" + + "iRQN1XXaJAhgHdFD3HA37fVIAuSUKshcW/0T9xrxp+PDCXZPj1aCFekKnXzaqsgM" + + "RwIDAQAB" +} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/sys_observers/NaviAppObserver.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/sys_observers/NaviAppObserver.kt deleted file mode 100644 index 203d8cd..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/sys_observers/NaviAppObserver.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.snaggly.ksw_toolkit.core.service.sys_observers - -import android.content.Context -import android.database.ContentObserver -import android.os.Handler -import android.provider.Settings -import com.snaggly.ksw_toolkit.core.service.mcu.McuLogic -import projekt.auto.mcu.ksw.serial.collection.McuCommands - -class NaviAppObserver(private val context: Context) { - - private val naviObserver = object : ContentObserver(Handler(context.mainLooper)) { - override fun onChange(selfChanged: Boolean) { - val isUsingNavi = Settings.System.getInt(context.contentResolver, "usingNavi") == 1 - if (isUsingNavi){ - McuLogic.mcuCommunicator?.sendCommand(McuCommands.Start_Voice) - } - else { - McuLogic.mcuCommunicator?.sendCommand(McuCommands.Stop_Voice) - } - } - } - - fun startHandlingNaviCallouts() { - context.contentResolver.registerContentObserver(Settings.System.getUriFor("usingNavi"), true, naviObserver) - } - - fun stopHandlingNaviCallouts() { - context.contentResolver.unregisterContentObserver(naviObserver) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/view/BackTapper.kt b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/view/BackTapper.kt index f579364..7ac02e6 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/core/service/view/BackTapper.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/core/service/view/BackTapper.kt @@ -24,7 +24,7 @@ class BackTapper(val context: Context) { handler.post { val windowParam = WindowManager.LayoutParams() windowParam.apply { - type = 2010 + type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR flags = windowParam.flags.or(1024).or(262144).or(524288) height = -1 width = -1 diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/AdbShell.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/AdbShell.kt deleted file mode 100644 index 768032e..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/AdbShell.kt +++ /dev/null @@ -1,82 +0,0 @@ -package com.snaggly.ksw_toolkit.gui - -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ArrayAdapter -import android.widget.Button -import android.widget.ListView -import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import com.google.android.material.textfield.TextInputEditText -import com.snaggly.ksw_toolkit.R -import com.snaggly.ksw_toolkit.core.service.CoreService -import com.snaggly.ksw_toolkit.core.service.adb.ShellObserver -import com.snaggly.ksw_toolkit.gui.viewmodels.AdbShellViewModel - -class AdbShell : Fragment() { - - private val adbShellObserver = object : ShellObserver { - override fun update(newLine: String) { - requireActivity().runOnUiThread { - adbLines[0] += newLine - listAdapter.notifyDataSetChanged() - } - } - } - - companion object { - fun newInstance() = AdbShell() - } - - private lateinit var viewModel: AdbShellViewModel - private lateinit var shellListView: ListView - private lateinit var textInput: TextInputEditText - private lateinit var sendButton: Button - private lateinit var listAdapter: ArrayAdapter - private val adbLines : ArrayList = arrayListOf("") - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.adb_shell_fragment, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - viewModel = ViewModelProvider(this).get(AdbShellViewModel::class.java) - initElements() - initClickEvent() - } - - override fun onStart() { - super.onStart() - sendButton.requestFocus() - initList() - viewModel.coreService?.adbConnection!!.registerShellListener(adbShellObserver) - } - - override fun onStop() { - super.onStop() - viewModel.coreService?.adbConnection!!.unregisterShellListener(adbShellObserver) - } - - private fun initElements() { - shellListView = requireView().findViewById(R.id.adbShellStdoutListView) - textInput = requireView().findViewById(R.id.adbEditText) - sendButton = requireView().findViewById(R.id.adbSend) - } - - private fun initList() { - listAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, adbLines) - shellListView.adapter = listAdapter - } - - private fun initClickEvent() { - sendButton.setOnClickListener { - viewModel.coreService?.adbConnection!!.sendCommand(textInput.text.toString()) - textInput.setText("") - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/ConfigImportExport.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/ConfigImportExport.kt deleted file mode 100644 index d5ad3be..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/ConfigImportExport.kt +++ /dev/null @@ -1,80 +0,0 @@ -package com.snaggly.ksw_toolkit.gui - -import android.app.AlertDialog -import androidx.lifecycle.ViewModelProvider -import android.os.Bundle -import android.os.Environment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.WindowManager -import android.widget.Button -import android.widget.Toast -import androidx.fragment.app.Fragment -import com.snaggly.ksw_toolkit.R -import com.snaggly.ksw_toolkit.core.config.ConfigManager -import com.snaggly.ksw_toolkit.gui.viewmodels.ConfigImportExportViewModel - -class ConfigImportExport : Fragment() { - - companion object { - fun newInstance() = ConfigImportExport() - } - - private lateinit var importExportViewModel: ConfigImportExportViewModel - private lateinit var importConfigBtn: Button - private lateinit var exportConfigBtn: Button - private lateinit var restartBtn: Button - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.config_fragment, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - importExportViewModel = ViewModelProvider(this).get(ConfigImportExportViewModel::class.java) - initBtns() - initBtnClicks() - } - - private fun initBtns() { - importConfigBtn = requireView().findViewById(R.id.importConfigBtn) - exportConfigBtn = requireView().findViewById(R.id.exportConfigBtn) - restartBtn = requireView().findViewById(R.id.restartSystemBtn) - } - - private fun initBtnClicks() { - importConfigBtn.setOnClickListener { - try { - Toast.makeText(requireContext(), "Imported from: ${importExportViewModel.importConfig(requireContext())}", Toast.LENGTH_LONG).show() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-Config") - .setMessage("Unable to import!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - exportConfigBtn.setOnClickListener { - try { - Toast.makeText(requireContext(), "Exported to: ${importExportViewModel.exportConfig(requireContext())}", Toast.LENGTH_LONG).show() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-Config") - .setMessage("Unable to export!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - restartBtn.setOnClickListener { - try { - importExportViewModel.restartSystem() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-Config") - .setMessage("Unable to restart!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/EventManager.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/EventManager.kt deleted file mode 100644 index 98479bf..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/EventManager.kt +++ /dev/null @@ -1,148 +0,0 @@ -package com.snaggly.ksw_toolkit.gui - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import com.snaggly.ksw_toolkit.R -import com.snaggly.ksw_toolkit.gui.viewmodels.EventManagerViewModel -import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes -import com.snaggly.ksw_toolkit.util.list.eventtype.EventMode - -class EventManager : Fragment() { - private var previousBtn : Button? = null - private var previousTypes: EventManagerTypes? = null - - private lateinit var telephoneBtn : Button - private lateinit var telephoneHangUpBtn : Button - private lateinit var telephoneLongBtn : Button - private lateinit var voiceBtn : Button - private lateinit var mediaPreviousBtn : Button - private lateinit var mediaNextBtn : Button - private lateinit var mediaPauseBtn : Button - private lateinit var volumeDecBtn : Button - private lateinit var volumeIncBtn : Button - private lateinit var modeBtn : Button - private lateinit var knobPressBtn : Button - private lateinit var knobTiltUpBtn : Button - private lateinit var knobTiltDownBtn : Button - private lateinit var knobTiltLeftBtn : Button - private lateinit var knobTiltRightBtn : Button - private lateinit var knobTurnLeftBtn : Button - private lateinit var knobTurnRightBtn : Button - private lateinit var menuBtn : Button - private lateinit var backBtn : Button - private lateinit var optionsBtn : Button - private lateinit var naviBtn : Button - - private lateinit var activeFragment: EventManagerSelectAction - private lateinit var mViewModel: EventManagerViewModel - - private var hasOpenedSelectAction = false - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.event_manager_fragment, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - mViewModel = ViewModelProvider(this).get(EventManagerViewModel::class.java) - initBtns() - initBtnClick() - voiceBtn.requestFocus() - } - - private fun initBtns() { - telephoneBtn = requireView().findViewById(R.id.telefonBtn) - telephoneHangUpBtn = requireView().findViewById(R.id.telefonHangUpBtn) - telephoneLongBtn = requireView().findViewById(R.id.telefonLongPressBtn) - voiceBtn = requireView().findViewById(R.id.voiceBtn) - mediaPreviousBtn = requireView().findViewById(R.id.mediaPreviousBtn) - mediaNextBtn = requireView().findViewById(R.id.mediaNextBtn) - mediaPauseBtn = requireView().findViewById(R.id.mediaPauseBtn) - volumeDecBtn = requireView().findViewById(R.id.volumeDecBtn) - volumeIncBtn = requireView().findViewById(R.id.volumeIncBtn) - modeBtn = requireView().findViewById(R.id.modeBtn) - knobPressBtn = requireView().findViewById(R.id.knobPressBtn) - knobTiltUpBtn = requireView().findViewById(R.id.knobTiltUpBtn) - knobTiltDownBtn = requireView().findViewById(R.id.knobTiltDownBtn) - knobTiltLeftBtn = requireView().findViewById(R.id.knobTiltLeftBtn) - knobTiltRightBtn = requireView().findViewById(R.id.knobTiltRightBtn) - knobTurnLeftBtn = requireView().findViewById(R.id.knobTurnLeftBtn) - knobTurnRightBtn = requireView().findViewById(R.id.knobTurnRightBtn) - menuBtn = requireView().findViewById(R.id.menuButtonBtn) - backBtn = requireView().findViewById(R.id.backButtonBtn) - optionsBtn = requireView().findViewById(R.id.optionsButtonBtn) - naviBtn = requireView().findViewById(R.id.navigationButtonBtn) - } - - private fun initBtnClick() { - setOnClickEvent(telephoneBtn, EventManagerTypes.TelephoneButton) - setOnClickEvent(telephoneHangUpBtn, EventManagerTypes.TelephoneButtonHangUp) - setOnClickEvent(telephoneLongBtn, EventManagerTypes.TelephoneButtonLongPress) - setOnClickEvent(voiceBtn, EventManagerTypes.VoiceCommandButton) - setOnClickEvent(mediaPreviousBtn, EventManagerTypes.MediaPrevious) - setOnClickEvent(mediaNextBtn, EventManagerTypes.MediaNext) - setOnClickEvent(mediaPauseBtn, EventManagerTypes.MediaPlayPause) - setOnClickEvent(volumeDecBtn, EventManagerTypes.VolumeDecrease) - setOnClickEvent(volumeIncBtn, EventManagerTypes.VolumeIncrease) - setOnClickEvent(modeBtn, EventManagerTypes.ModeButton) - setOnClickEvent(knobPressBtn, EventManagerTypes.KnobPress) - setOnClickEvent(knobTiltUpBtn, EventManagerTypes.KnobTiltUp) - setOnClickEvent(knobTiltDownBtn, EventManagerTypes.KnobTiltDown) - setOnClickEvent(knobTiltLeftBtn, EventManagerTypes.KnobTiltLeft) - setOnClickEvent(knobTiltRightBtn, EventManagerTypes.KnobTiltRight) - setOnClickEvent(knobTurnLeftBtn, EventManagerTypes.KnobTurnLeft) - setOnClickEvent(knobTurnRightBtn, EventManagerTypes.KnobTurnRight) - setOnClickEvent(menuBtn, EventManagerTypes.MenuButton) - setOnClickEvent(backBtn, EventManagerTypes.BackButton) - setOnClickEvent(optionsBtn, EventManagerTypes.OptionsButton) - setOnClickEvent(naviBtn, EventManagerTypes.NavigationButton) - } - - private fun setBtnLabel(button: Button, eventManagerTypes: EventManagerTypes) { - if (mViewModel.getConfig(requireContext())[eventManagerTypes]?.eventMode != EventMode.NoAssignment) - button.text = getString(R.string.assigned) - else - button.text = getString(R.string.unassigned) - } - - private fun setOnClickEvent(button: Button, types: EventManagerTypes) { - setBtnLabel(button, types) - button.setOnClickListener { - if (hasOpenedSelectAction) - previousBtn?.let { setBtnLabel(it, previousTypes!!) } - previousBtn = button - previousTypes = types - hasOpenedSelectAction = true - activeFragment = EventManagerSelectAction(types, object : OnActionResult { - override fun notifyView() { - setBtnLabel(button, types) - childFragmentManager.beginTransaction() - .setCustomAnimations(R.anim.slide_enter_right_left, R.anim.slide_exit_right_left) - .remove(activeFragment) - .commit() - button.requestFocus() - hasOpenedSelectAction = false - } - }) - button.text = "..." - childFragmentManager.beginTransaction() - .setCustomAnimations(R.anim.slide_enter_right_left, R.anim.slide_exit_right_left) - .replace(R.id.eventManagerSelectActionFrame, activeFragment) - .commit() - } - } - - companion object { - fun newInstance() = EventManager() - } - - interface OnActionResult{ - fun notifyView() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/EventManagerSelectAction.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/EventManagerSelectAction.kt deleted file mode 100644 index ac5ec93..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/EventManagerSelectAction.kt +++ /dev/null @@ -1,219 +0,0 @@ -package com.snaggly.ksw_toolkit.gui - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.animation.Animation -import android.view.animation.AnimationUtils -import android.widget.CompoundButton -import android.widget.RadioButton -import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.snaggly.ksw_toolkit.R -import com.snaggly.ksw_toolkit.gui.viewmodels.EventManagerSelectActionViewModel -import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes -import com.snaggly.ksw_toolkit.util.list.eventtype.EventMode - -class EventManagerSelectAction(private val type: EventManagerTypes, private val actionEvent: EventManager.OnActionResult) : Fragment() { - private lateinit var mViewModel: EventManagerSelectActionViewModel - private lateinit var listKeyEvents: RecyclerView - private lateinit var listApps: RecyclerView - private lateinit var listMcuCommands: RecyclerView - - private lateinit var doNothingButton: RadioButton - private lateinit var invokeKeyButton: RadioButton - private lateinit var startAppButton: RadioButton - private lateinit var mcuCommandsButton: RadioButton - - private lateinit var leaveToTopAnimation : Animation - private lateinit var leaveToButtomAnimation : Animation - private lateinit var enterFromTopAnimation : Animation - private lateinit var enterFromButtomAnimation : Animation - - private var mode: ActionMode = ActionMode.DoNothing - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.event_manager_select_action_fragment, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - mViewModel = ViewModelProvider(this).get(EventManagerSelectActionViewModel::class.java) - mViewModel.eventCurType = type - mViewModel.actionEvent = actionEvent - initRadioBtns() - initLists() - loadAnimations(300) - doButtonEvents() - preselectEvent() - doNothingButton.requestFocus() - } - - private fun initRadioBtns() { - doNothingButton = requireView().findViewById(R.id.unnassignBtn) - invokeKeyButton = requireView().findViewById(R.id.invokeKeyeventRadioButton) - startAppButton = requireView().findViewById(R.id.startAppRadioButton) - mcuCommandsButton = requireView().findViewById(R.id.sendMcuCommandBtn) - } - - private fun initLists() { - listKeyEvents = requireView().findViewById(R.id.availableKeyEventsListView) - listApps = requireView().findViewById(R.id.availableAppsListView) - listMcuCommands = requireView().findViewById(R.id.mcuCommandsListView) - initRecyclerViews(listKeyEvents, context?.let { mViewModel.getListKeyEventsAdapter(it) }!!) - initRecyclerViews(listApps, context?.let { mViewModel.getAvailableAppsAdapter(it) }!!) - initRecyclerViews(listMcuCommands, context?.let { mViewModel.getMcuCommandsAdapter(it) }!!) - } - - private fun loadAnimations(duration: Long) { - leaveToTopAnimation = AnimationUtils.loadAnimation(context, R.anim.leave_to_top) - leaveToTopAnimation.duration = duration - leaveToButtomAnimation = AnimationUtils.loadAnimation(context, R.anim.leave_to_buttom) - leaveToButtomAnimation.duration = duration - enterFromTopAnimation = AnimationUtils.loadAnimation(context, R.anim.enter_from_top) - enterFromTopAnimation.duration = duration - enterFromButtomAnimation = AnimationUtils.loadAnimation(context, R.anim.enter_from_buttom) - enterFromButtomAnimation.duration = duration - } - - private fun initRecyclerViews(rv : RecyclerView, rvAdapterView: RecyclerView.Adapter) { - rv.setHasFixedSize(true) - rv.layoutManager = LinearLayoutManager(context) - rv.adapter = rvAdapterView - } - - private fun doButtonEvents() { - doNothingButton.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> - if (isChecked) { - when (mode) { - ActionMode.InvokeKeyEvent -> { - invokeKeyButton.isChecked = false - listKeyEvents.clearAnimation() - listKeyEvents.startAnimation(leaveToTopAnimation) - listKeyEvents.visibility = View.GONE - } - ActionMode.StartApp -> { - startAppButton.isChecked = false - listApps.clearAnimation() - listApps.startAnimation((leaveToTopAnimation)) - listApps.visibility = View.GONE - } - ActionMode.SendMcuCommand -> { - mcuCommandsButton.isChecked = false - listMcuCommands.clearAnimation() - listMcuCommands.startAnimation((leaveToTopAnimation)) - listMcuCommands.visibility = View.GONE - } - else -> {} - } - mode = ActionMode.DoNothing - mViewModel.resetEvent() - actionEvent.notifyView() - } - } - invokeKeyButton.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> - if (isChecked) { - listKeyEvents.visibility = View.VISIBLE - listKeyEvents.startAnimation(enterFromTopAnimation) - - when (mode) { - ActionMode.StartApp -> { - startAppButton.isChecked = false - listApps.clearAnimation() - listApps.visibility = View.GONE - listApps.startAnimation(leaveToButtomAnimation) - } - ActionMode.SendMcuCommand -> { - mcuCommandsButton.isChecked = false - listMcuCommands.clearAnimation() - listMcuCommands.visibility = View.GONE - listMcuCommands.startAnimation(leaveToButtomAnimation) - } - else -> doNothingButton.isChecked = false - } - - listKeyEvents.requestFocus() - mode = ActionMode.InvokeKeyEvent - } - } - startAppButton.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> - if (isChecked) { - listApps.visibility = View.VISIBLE - listApps.requestFocus() - when (mode) { - ActionMode.InvokeKeyEvent -> { - invokeKeyButton.isChecked = false - listKeyEvents.clearAnimation() - listKeyEvents.startAnimation(leaveToTopAnimation) - listKeyEvents.visibility = View.GONE - listApps.startAnimation(enterFromButtomAnimation) - } - ActionMode.SendMcuCommand -> { - mcuCommandsButton.isChecked = false - listMcuCommands.clearAnimation() - listMcuCommands.startAnimation(leaveToButtomAnimation) - listMcuCommands.visibility = View.GONE - listApps.startAnimation(enterFromTopAnimation) - } - else -> { - doNothingButton.isChecked = false - listApps.startAnimation(enterFromTopAnimation) - } - } - - listApps.requestFocus() - mode = ActionMode.StartApp - } - } - mcuCommandsButton.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> - if (isChecked) { - listMcuCommands.visibility = View.VISIBLE - listMcuCommands.requestFocus() - when (mode) { - ActionMode.InvokeKeyEvent -> { - invokeKeyButton.isChecked = false - listKeyEvents.clearAnimation() - listKeyEvents.startAnimation(leaveToTopAnimation) - listKeyEvents.visibility = View.GONE - listMcuCommands.startAnimation(enterFromButtomAnimation) - } - ActionMode.StartApp -> { - startAppButton.isChecked = false - listApps.clearAnimation() - listApps.startAnimation(leaveToTopAnimation) - listApps.visibility = View.GONE - listMcuCommands.startAnimation(enterFromButtomAnimation) - } - else -> { - doNothingButton.isChecked = false - listMcuCommands.startAnimation(enterFromTopAnimation) - } - } - - listMcuCommands.requestFocus() - mode = ActionMode.SendMcuCommand - } - } - } - - private fun preselectEvent() { - when(mViewModel.config?.eventMode){ - EventMode.KeyEvent -> invokeKeyButton.isChecked = true - EventMode.StartApp -> startAppButton.isChecked = true - EventMode.McuCommand -> mcuCommandsButton.isChecked = true - else -> doNothingButton.isChecked = true - } - } - - companion object { - fun newInstance(type: EventManagerTypes, actionEvent: EventManager.OnActionResult): EventManagerSelectAction? { - return EventManagerSelectAction(type, actionEvent) - } - } - - enum class ActionMode {DoNothing, InvokeKeyEvent, StartApp, SendMcuCommand} -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/MainActivity.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/MainActivity.kt deleted file mode 100644 index 0507482..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/MainActivity.kt +++ /dev/null @@ -1,134 +0,0 @@ -package com.snaggly.ksw_toolkit.gui - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.provider.Settings -import android.widget.Button -import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.lifecycle.ViewModelProvider -import com.snaggly.ksw_toolkit.R -import com.snaggly.ksw_toolkit.gui.viewmodels.MainActivityViewModel - -class MainActivity : AppCompatActivity() { - private lateinit var mainViewModel: MainActivityViewModel - private lateinit var soundRestorerFragment: Fragment - private var eventManagerFragment: Fragment? = null - private var systemTweaksFragment: Fragment? = null - private var adbShellFragment: Fragment? = null - private var mcuListenerFragment: Fragment? = null - private var configFragment: Fragment? = null - private lateinit var mFragManager: FragmentManager - private lateinit var toolKitPane: Button - private lateinit var eventManagerPane: Button - private lateinit var systemTweaksPane: Button - private lateinit var adbShellPane: Button - private lateinit var mcuListenerPane: Button - private lateinit var configImportExportPane: Button - private lateinit var previousCallingButton: Button - private var tabFragmentId = 0 - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - mainViewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java) - if (!checkPermissions()) - finish() - else { - startService() - startApp() - } - } - - override fun onStart() { - super.onStart() - } - - override fun onResume() { - super.onResume() - mainViewModel.bindToMcuService() - } - - override fun onStop() { - super.onStop() - //mainViewModel.unbindFromMcuService() - } - - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - checkPermissions() - } - - private fun checkPermissions(): Boolean { - if (!Settings.canDrawOverlays(this)) { - startActivityForResult(Intent("android.settings.action.MANAGE_OVERLAY_PERMISSION", Uri.parse("package:$packageName")), 5469) - return false - } - return true - } - - private fun startService() { - mainViewModel.startService() - } - - private fun startApp() { - setContentView(R.layout.activity_main) - mFragManager = supportFragmentManager - initViewElements() - setBtnClicks() - initPaneFragment() - } - - private fun initViewElements() { - toolKitPane = findViewById(R.id.soundRestorerPaneBtn) - eventManagerPane = findViewById(R.id.eventManagerPaneBtn) - systemTweaksPane = findViewById(R.id.systemTweaksPaneBtn) - adbShellPane = findViewById(R.id.adbShellPaneBtn) - mcuListenerPane = findViewById(R.id.mcuListenerPaneBtn) - configImportExportPane = findViewById(R.id.configPaneBtn) - tabFragmentId = R.id.tabFragment - } - - private fun setBtnClicks() { - toolKitPane.setOnClickListener { switchFragment(mFragManager, toolKitPane, soundRestorerFragment) } - eventManagerPane.setOnClickListener { - if (eventManagerFragment == null) - eventManagerFragment = EventManager() - switchFragment(mFragManager, eventManagerPane, eventManagerFragment!!) - } - systemTweaksPane.setOnClickListener { - if (systemTweaksFragment == null) - systemTweaksFragment = SystemTwaks() - switchFragment(mFragManager, systemTweaksPane, systemTweaksFragment!!) - } - adbShellPane.setOnClickListener { - if (adbShellFragment == null) - adbShellFragment = AdbShell() - switchFragment(mFragManager, adbShellPane, adbShellFragment!!) - } - mcuListenerPane.setOnClickListener { - if (mcuListenerFragment == null) - mcuListenerFragment = McuListener() - switchFragment(mFragManager, mcuListenerPane, mcuListenerFragment!!) - } - configImportExportPane.setOnClickListener { - if (configFragment == null) - configFragment = ConfigImportExport() - switchFragment(mFragManager, configImportExportPane, configFragment!!) - } - } - - private fun initPaneFragment() { - soundRestorerFragment = ToolKit() - previousCallingButton = toolKitPane - switchFragment(mFragManager, toolKitPane, soundRestorerFragment) - toolKitPane.requestFocus() - } - - private fun switchFragment(manager: FragmentManager, callingButton: Button, fragment: Fragment) { - previousCallingButton.setBackgroundResource(R.drawable.btn_selector) - callingButton.setBackgroundResource(R.drawable.ksw_id7_itme_select_bg_focused) - previousCallingButton = callingButton - manager.beginTransaction().replace(tabFragmentId, fragment).commit() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/McuListener.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/McuListener.kt deleted file mode 100644 index 5de1ba0..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/McuListener.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.snaggly.ksw_toolkit.gui - -import androidx.lifecycle.ViewModelProvider -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.snaggly.ksw_toolkit.R -import com.snaggly.ksw_toolkit.gui.viewmodels.McuListenerViewModel - -class McuListener : Fragment() { - - companion object { - fun newInstance() = McuListener() - } - - private lateinit var viewModel: McuListenerViewModel - private lateinit var mcuEventRV: RecyclerView - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.mcu_listener_fragment, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - viewModel = ViewModelProvider(this).get(McuListenerViewModel::class.java) - initElements() - } - - override fun onStart() { - super.onStart() - viewModel.parentActivity = requireActivity() - viewModel.coreService?.mcuReaderHandler?.registerMcuEventListener(viewModel.mcuObserver) - } - - override fun onStop() { - super.onStop() - viewModel.coreService?.mcuReaderHandler?.unregisterMcuEventListener(viewModel.mcuObserver) - } - - private fun initElements() { - mcuEventRV = requireView().findViewById(R.id.McuEventsRV); - mcuEventRV.layoutManager = LinearLayoutManager(context) - mcuEventRV.adapter = viewModel.getMcuEventAdapter() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/SystemTwaks.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/SystemTwaks.kt deleted file mode 100644 index 5e34d84..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/SystemTwaks.kt +++ /dev/null @@ -1,251 +0,0 @@ -package com.snaggly.ksw_toolkit.gui - -import android.app.AlertDialog -import android.graphics.Color -import androidx.lifecycle.ViewModelProvider -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.WindowManager -import android.widget.Button -import androidx.appcompat.widget.SwitchCompat -import androidx.fragment.app.Fragment -import com.google.android.material.textfield.TextInputEditText -import com.snaggly.ksw_toolkit.R -import com.snaggly.ksw_toolkit.gui.viewmodels.SystemTwaksViewModel - -class SystemTwaks : Fragment() { - - companion object { - fun newInstance() = SystemTwaks() - } - - private lateinit var viewModel: SystemTwaksViewModel - private lateinit var startAtBoot: SwitchCompat - private lateinit var stopKswServiceSwitch: SwitchCompat - private lateinit var hideTopBarSwitch: SwitchCompat - private lateinit var shrinkTopBarSwitch: SwitchCompat - private lateinit var autoVolumeSwitch: SwitchCompat - private lateinit var maxVolumeOnBootSwitch: SwitchCompat - private lateinit var changeDPIButton: Button - private lateinit var giveTaskerLogcatPermBtn: Button - private lateinit var dpiInputField: TextInputEditText - private lateinit var logCarDataToggle: SwitchCompat - private lateinit var logMcuEventsToggle: SwitchCompat - private lateinit var interceptMcuCommandToggle: SwitchCompat - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.system_twaks_fragment, container, false) - } - - override fun onStart() { - super.onStart() - initElements() - initButtonClickEvents() - startAtBoot.requestFocus() - } - - override fun onResume() { - super.onResume() - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - viewModel = ViewModelProvider(this).get(SystemTwaksViewModel::class.java) - } - - private fun initElements() { - startAtBoot = requireView().findViewById(R.id.startAppAtBootTgl) - stopKswServiceSwitch = requireView().findViewById(R.id.startStopKSWServiceSwitch) - autoVolumeSwitch = requireView().findViewById(R.id.autoVolumeToggle) - maxVolumeOnBootSwitch = requireView().findViewById(R.id.maxVolumeAtBootToggle) - hideTopBarSwitch = requireView().findViewById(R.id.hideTopBarToggle) - shrinkTopBarSwitch = requireView().findViewById(R.id.shrinkTopBarToggle) - changeDPIButton = requireView().findViewById(R.id.changeDpiBtn) - giveTaskerLogcatPermBtn = requireView().findViewById(R.id.giveTaskerLogcat) - dpiInputField = requireView().findViewById(R.id.dpiTxtInput) - logCarDataToggle = requireView().findViewById(R.id.logCarDataToggle) - logMcuEventsToggle = requireView().findViewById(R.id.logMcuEventsToggle) - interceptMcuCommandToggle = requireView().findViewById(R.id.interceptMcuCommandsToggle) - - startAtBoot.isChecked = viewModel.getConfig(requireContext()).startAtBoot.data - stopKswServiceSwitch.isChecked = viewModel.getConfig(requireContext()).kswService.data - autoVolumeSwitch.isChecked = viewModel.getConfig(requireContext()).autoVolume.data - maxVolumeOnBootSwitch.isChecked = viewModel.getConfig(requireContext()).maxVolume.data - hideTopBarSwitch.isChecked = viewModel.getConfig(requireContext()).hideTopBar.data - shrinkTopBarSwitch.isChecked = viewModel.getConfig(requireContext()).shrinkTopBar.data - val actualDpi = requireView().resources.displayMetrics.densityDpi - viewModel.getConfig(requireContext()).dpi.data = actualDpi - dpiInputField.setText(actualDpi.toString()) - logCarDataToggle.isChecked = viewModel.getConfig(requireContext()).carDataLogging.data - logMcuEventsToggle.isChecked = viewModel.getConfig(requireContext()).logMcuEvent.data - interceptMcuCommandToggle.isChecked = viewModel.getConfig(requireContext()).interceptMcuCommand.data - if (!viewModel.getConfig(requireContext()).kswService.data) { - logCarDataToggle.isEnabled = true - logMcuEventsToggle.isEnabled = true - interceptMcuCommandToggle.isEnabled = true - } - } - - private fun initButtonClickEvents() { - startAtBoot.setOnCheckedChangeListener { _, isChecked -> - viewModel.getConfig(requireContext()).startAtBoot.data = isChecked - } - - autoVolumeSwitch.setOnCheckedChangeListener { _, isChecked -> - viewModel.getConfig(requireContext()).autoVolume.data = isChecked - try { - viewModel.restartMcuReader() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-SystemTweaks") - .setMessage("Could not restart McuReader!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - - maxVolumeOnBootSwitch.setOnCheckedChangeListener { _, isChecked -> - viewModel.getConfig(requireContext()).maxVolume.data = isChecked - } - - stopKswServiceSwitch.setOnCheckedChangeListener { _, isChecked -> - viewModel.getConfig(requireContext()).kswService.data = isChecked - - if (!isChecked) { - val alert = AlertDialog.Builder(requireContext(), R.style.alertDialogNight).setTitle("KSW-ToolKit-SystemTweaks") - .setMessage("You are about to shut down the built in KSW McuService. This could lead to unaccounted issues. Are you sure you still want to proceed?").create() - alert.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alert.setButton(AlertDialog.BUTTON_POSITIVE, "Yes!") { _, _ -> - logCarDataToggle.isEnabled = true - logMcuEventsToggle.isEnabled = true - interceptMcuCommandToggle.isEnabled = true - try { - viewModel.restartMcuReader() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-SystemTweaks") - .setMessage("Could not restart McuReader!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - alert.setButton(AlertDialog.BUTTON_NEGATIVE, "No") { _, _ -> - stopKswServiceSwitch.isChecked = true - } - alert.show() - } else { - logCarDataToggle.isChecked = false - logMcuEventsToggle.isChecked = false - interceptMcuCommandToggle.isChecked = false - logCarDataToggle.isEnabled = false - logMcuEventsToggle.isEnabled = false - interceptMcuCommandToggle.isEnabled = false - try { - viewModel.restartMcuReader() - } catch (exception: Exception) { - val alert = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-SystemTweaks") - .setMessage("Could not restart McuReader!\n\n${exception.localizedMessage}").create() - alert.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alert.show() - } - } - - } - - hideTopBarSwitch.setOnCheckedChangeListener { _, isChecked -> - try { - if (isChecked) { - shrinkTopBarSwitch.isChecked = false - viewModel.hideTopBar() - } else { - viewModel.showTopBar() - } - viewModel.getConfig(requireContext()).hideTopBar.data = isChecked - } catch (exception: Exception) { - val alert = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-SystemTweaks") - .setMessage("Unable to mess with TopBar!\n\n${exception.localizedMessage}").create() - alert.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alert.show() - } - } - - shrinkTopBarSwitch.setOnCheckedChangeListener { _, isChecked -> - try { - if (isChecked) { - hideTopBarSwitch.isChecked = false - viewModel.shrinkTopBar() - } else { - viewModel.restoreTopBar() - } - viewModel.getConfig(requireContext()).shrinkTopBar.data = isChecked - } catch (exception: Exception) { - val alert = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-SystemTweaks") - .setMessage("Unable to mess with TopBar!\n\n${exception.localizedMessage}").create() - alert.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alert.show() - } - } - - changeDPIButton.setOnClickListener { - try { - val newDPI = Integer.parseInt(dpiInputField.text.toString()) - viewModel.getConfig(requireContext()).dpi.data = newDPI - viewModel.changeDPI(newDPI) - } catch (exception: Exception) { - val alert = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-SystemTweaks") - .setMessage("Exception Saving DPI!\n\n${exception.localizedMessage}").create() - alert.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alert.show() - } - } - - giveTaskerLogcatPermBtn.setOnClickListener { - try { - viewModel.coreService?.adbConnection!!.sendCommand("pm grant net.dinglisch.android.taskerm android.permission.READ_LOGS") - } catch (exception: Exception) { - val alert = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-SystemTweaks") - .setMessage("Unable to give Tasker Logcat Permission!\n\n${exception.localizedMessage}").create() - alert.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alert.show() - } - } - - logCarDataToggle.setOnCheckedChangeListener { _, isChecked -> - viewModel.getConfig(requireContext()).carDataLogging.data = isChecked - try { - viewModel.restartMcuReader() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-SystemTweaks") - .setMessage("Could not restart McuReader!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - - logMcuEventsToggle.setOnCheckedChangeListener { _, isChecked -> - viewModel.getConfig(requireContext()).logMcuEvent.data = isChecked - try { - viewModel.restartMcuReader() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-SystemTweaks") - .setMessage("Could not restart McuReader!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - - interceptMcuCommandToggle.setOnCheckedChangeListener { _, isChecked -> - viewModel.getConfig(requireContext()).interceptMcuCommand.data = isChecked - - try { - viewModel.restartMcuReader() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit-SystemTweaks") - .setMessage("Could not restart McuReader!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/ToolKit.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/ToolKit.kt deleted file mode 100644 index 2341a67..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/ToolKit.kt +++ /dev/null @@ -1,169 +0,0 @@ -package com.snaggly.ksw_toolkit.gui - -import android.app.AlertDialog -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.WindowManager -import android.widget.Button -import android.widget.LinearLayout -import android.widget.SeekBar -import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import com.snaggly.ksw_toolkit.R -import com.snaggly.ksw_toolkit.gui.viewmodels.ToolKitViewModel - -class ToolKit : Fragment() { - - private lateinit var mViewModel: ToolKitViewModel - private lateinit var carInfo: LinearLayout - private lateinit var radio: LinearLayout - private lateinit var frontCam: LinearLayout - private lateinit var aux: LinearLayout - private lateinit var dvr: LinearLayout - private lateinit var dvd: LinearLayout - private lateinit var dtv: LinearLayout - private lateinit var brightnessBar: SeekBar - private lateinit var screenOffBtn: Button - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.toolkit_fragment, container, false) - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - mViewModel = ViewModelProvider(this).get(ToolKitViewModel::class.java) - initViews() - initClickEvents() - } - - private fun initViews() { - carInfo = requireView().findViewById(R.id.carInfoBtn) - radio = requireView().findViewById(R.id.radioBtn) - frontCam = requireView().findViewById(R.id.frontCamBtn) - aux = requireView().findViewById(R.id.auxBtn) - dvr = requireView().findViewById(R.id.dvrBtn) - dvd = requireView().findViewById(R.id.dvdBtn) - dtv = requireView().findViewById(R.id.dtvBtn) - brightnessBar = requireView().findViewById(R.id.brightnessSeekBar) - brightnessBar.progress = mViewModel.getBrightness(requireContext()) - screenOffBtn = requireView().findViewById(R.id.screenOffBtn) - carInfo.requestFocus() - } - - private fun initClickEvents() { - brightnessBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { - try { - mViewModel.setBrightness(requireContext(), progress) - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit") - .setMessage("Unable to change System Brightness!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - - override fun onStartTrackingTouch(seekBar: SeekBar?) { - } - - override fun onStopTrackingTouch(seekBar: SeekBar?) { - } - - }) - - carInfo.setOnClickListener { - try { - mViewModel.openOEMScreen() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit") - .setMessage("Unable to open OEM Screen!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - - radio.setOnClickListener { - try { - mViewModel.openRadioScreen() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit") - .setMessage("Unable to open Radio Screen!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - - frontCam.setOnClickListener { - try { - mViewModel.openFCamScreen() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit") - .setMessage("Unable to open F_CAM Screen!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - - aux.setOnClickListener { - try { - mViewModel.openAuxScreen() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit") - .setMessage("Unable to open AUX Screen!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - - dvr.setOnClickListener { - try { - mViewModel.openDvrScreen() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit") - .setMessage("Unable to open DVR Screen!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - - dvd.setOnClickListener { - try { - mViewModel.openDvdScreen() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit") - .setMessage("Unable to open DVD Screen!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - - dtv.setOnClickListener { - try { - mViewModel.openDtvScreen() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit") - .setMessage("Unable to open DTV Screen!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - - screenOffBtn.setOnClickListener { - try { - mViewModel.closeScreen() - } catch (exception: Exception) { - val alertExc = AlertDialog.Builder(context, R.style.alertDialogNight).setTitle("KSW-ToolKit") - .setMessage("Unable to close screen!\n\n${exception.localizedMessage}").create() - alertExc.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - alertExc.show() - } - } - } - - companion object { - fun newInstance() = ToolKit() - } -} diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/AdbShellViewModel.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/AdbShellViewModel.kt deleted file mode 100644 index ba84879..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/AdbShellViewModel.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.snaggly.ksw_toolkit.gui.viewmodels - -import com.snaggly.ksw_toolkit.core.service.helper.CoreServiceClient - -class AdbShellViewModel : CoreServiceClient() \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/ConfigImportExportViewModel.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/ConfigImportExportViewModel.kt deleted file mode 100644 index bf3ae8d..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/ConfigImportExportViewModel.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.snaggly.ksw_toolkit.gui.viewmodels - -import android.content.Context -import com.snaggly.ksw_toolkit.core.config.ConfigManager -import com.snaggly.ksw_toolkit.core.service.helper.CoreServiceClient - -class ConfigImportExportViewModel : CoreServiceClient() { - fun importConfig(context: Context) : String { - val storagePath = "${context.getExternalFilesDir(null)?.absolutePath}/KSW-Config.json" - storagePath.let { ConfigManager.importConfig(context.filesDir.absolutePath, it) } - return storagePath - } - - fun exportConfig(context: Context) : String { - val storagePath = "${context.getExternalFilesDir(null)?.absolutePath}/KSW-Config.json" - storagePath.let { ConfigManager.exportConfig(it) } - return storagePath - } - - fun restartSystem() { - coreService?.adbConnection!!.sendCommand("reboot") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/EventManagerSelectActionViewModel.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/EventManagerSelectActionViewModel.kt deleted file mode 100644 index 3560728..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/EventManagerSelectActionViewModel.kt +++ /dev/null @@ -1,121 +0,0 @@ -package com.snaggly.ksw_toolkit.gui.viewmodels - -import android.content.Context -import androidx.lifecycle.ViewModel -import androidx.recyclerview.widget.RecyclerView -import com.snaggly.ksw_toolkit.core.config.ConfigManager -import com.snaggly.ksw_toolkit.core.config.beans.EventManager -import com.snaggly.ksw_toolkit.util.adapters.ListTypeAdapter -import com.snaggly.ksw_toolkit.util.list.app.AppInfo -import com.snaggly.ksw_toolkit.util.list.app.AppsLister -import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes -import com.snaggly.ksw_toolkit.util.list.eventtype.EventMode -import com.snaggly.ksw_toolkit.util.list.keyevent.KeyEvent -import com.snaggly.ksw_toolkit.util.list.mcu.McuCommandsList - -class EventManagerSelectActionViewModel : ViewModel() { - private var listKeyEventsAdapter : RecyclerView.Adapter? = null - private var availableAppsAdapter : RecyclerView.Adapter? = null - private var mcuCommandsListAdapter : RecyclerView.Adapter? = null - - private var keyEvents: ArrayList? = null - private var appsList: ArrayList? = null - private var mcuCommandsList: ArrayList? = null - var config : EventManager? = null - - var eventCurType : EventManagerTypes = EventManagerTypes.Dummy - - lateinit var actionEvent: com.snaggly.ksw_toolkit.gui.EventManager.OnActionResult - - private fun initConfig(context: Context) { - if (config == null) - config = ConfigManager.getConfig(context.filesDir.absolutePath).eventManagers[eventCurType] - } - - private fun findKeyCodeFromList(keyCode: Int) : Int{ - for (i in 0 until keyEvents?.size!!) { - if (keyCode == keyEvents!![i].code) - return i - } - return -1 - } - - private fun findAppFromList(name: String) : Int{ - for (i in 0 until appsList?.size!!) { - if (name == appsList!![i].packageName) - return i - } - return -1 - } - - private fun initKeyEventsAdapter(context: Context) { - initConfig(context) - keyEvents = KeyEvent.getKeyEventList(context) - listKeyEventsAdapter = ListTypeAdapter(keyEvents!!, findKeyCodeFromList(config?.keyCode!!.data), onKeyCodeClickListener) - } - - private fun initAvailableAppsAdapter(context: Context) { - appsList = AppsLister(context).getAppsList() - availableAppsAdapter = ListTypeAdapter(appsList!!, findAppFromList(config?.appName!!.data), onAppClickListener) - } - - private fun initMcuCommandsListAdapter(context: Context) { - mcuCommandsList = McuCommandsList.getMcuCommandsList(context) - mcuCommandsListAdapter = ListTypeAdapter(mcuCommandsList!!, config?.mcuCommandMode!!.data, onMcuCommandClickListener) - } - - fun getListKeyEventsAdapter(context: Context): RecyclerView.Adapter { - if (listKeyEventsAdapter == null) - initKeyEventsAdapter(context) - return listKeyEventsAdapter!! - } - - fun getAvailableAppsAdapter(context: Context) : RecyclerView.Adapter { - if (availableAppsAdapter == null) - initAvailableAppsAdapter(context) - return availableAppsAdapter!! - } - - fun getMcuCommandsAdapter(context: Context) : RecyclerView.Adapter { - if (mcuCommandsListAdapter == null) - initMcuCommandsListAdapter(context) - return mcuCommandsListAdapter!! - } - - fun resetEvent() { - config?.eventMode = EventMode.NoAssignment - config?.keyCode!!.data = -1 - config?.appName!!.data = "" - config?.mcuCommandMode!!.data = -1 - } - - private val onKeyCodeClickListener = object : ListTypeAdapter.OnAppClickListener { - override fun onAppClick(position: Int) { - config?.eventMode = EventMode.KeyEvent - config?.keyCode!!.data = keyEvents?.get(position)!!.code - config?.appName!!.data = "" - config?.mcuCommandMode!!.data = -1 - actionEvent.notifyView() - } - } - - private val onAppClickListener = object : ListTypeAdapter.OnAppClickListener { - override fun onAppClick(position: Int) { - config?.eventMode = EventMode.StartApp - config?.keyCode!!.data = -1 - config?.appName!!.data = appsList?.get(position)!!.packageName - config?.mcuCommandMode!!.data = -1 - actionEvent.notifyView() - } - } - - private val onMcuCommandClickListener = object : ListTypeAdapter.OnAppClickListener { - override fun onAppClick(position: Int) { - config?.eventMode = EventMode.McuCommand - config?.keyCode!!.data = -1 - config?.appName!!.data = "" - config?.mcuCommandMode!!.data = position - actionEvent.notifyView() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/EventManagerViewModel.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/EventManagerViewModel.kt deleted file mode 100644 index 13d62ba..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/EventManagerViewModel.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.snaggly.ksw_toolkit.gui.viewmodels - -import android.content.Context -import androidx.lifecycle.ViewModel -import com.snaggly.ksw_toolkit.core.config.ConfigManager -import com.snaggly.ksw_toolkit.core.config.beans.EventManager -import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes - -class EventManagerViewModel : ViewModel() { - private var config : HashMap? = null - - fun getConfig(context: Context) : HashMap { - if (config == null) - config = ConfigManager.getConfig(context.filesDir.absolutePath).eventManagers - return config!! - } - - -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/MainActivityViewModel.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/MainActivityViewModel.kt deleted file mode 100644 index bbafec1..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/MainActivityViewModel.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.snaggly.ksw_toolkit.gui.viewmodels - -import android.app.Application -import android.content.Context -import android.content.Intent -import androidx.lifecycle.AndroidViewModel -import com.snaggly.ksw_toolkit.core.service.CoreService -import com.snaggly.ksw_toolkit.core.service.helper.CoreServiceConnector - -class MainActivityViewModel(application: Application) : AndroidViewModel(application) { - private var mcuServiceIntent: Intent? = null - private var context: Context = getApplication().applicationContext - private var connector = CoreServiceConnector(context) - - fun startService() { - mcuServiceIntent = Intent(context, CoreService::class.java) - context.startForegroundService(mcuServiceIntent) - } - - fun stopService() { - context.stopService(mcuServiceIntent) - } - - fun bindToMcuService() { - connector.connectToService() - } - - fun unbindFromMcuService() { - connector.disconnectFromService() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/McuListenerViewModel.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/McuListenerViewModel.kt deleted file mode 100644 index 0220471..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/McuListenerViewModel.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.snaggly.ksw_toolkit.gui.viewmodels - -import android.app.Activity -import androidx.recyclerview.widget.RecyclerView -import com.snaggly.ksw_toolkit.core.service.helper.CoreServiceClient -import com.snaggly.ksw_toolkit.core.service.mcu.McuEventObserver -import com.snaggly.ksw_toolkit.util.adapters.McuEventRVAdapter -import com.snaggly.ksw_toolkit.util.list.eventtype.EventManagerTypes - -class McuListenerViewModel : CoreServiceClient() { - - private var mcuEventRVAdapter: McuEventRVAdapter = McuEventRVAdapter() - - fun getMcuEventAdapter(): RecyclerView.Adapter { - return mcuEventRVAdapter - } - - private fun addEntryToAdapter(eventName: String, dataString: String) { - mcuEventRVAdapter.addNewEntry(eventName, dataString) - } - - fun dataBytesToString(data: ByteArray): String { - var result = "" - for (i in 0..data.size - 2) { - result += data[i].toString(16) + "-" - } - result += data[data.size - 1].toString(16) - - return result - } - - var parentActivity: Activity? = null - - val mcuObserver = object : McuEventObserver { - override fun update(eventType: EventManagerTypes?, cmdType: Int, data: ByteArray) { - if (data.size > 2) - if (cmdType == 0xA1 && data[0] == 0x17.toByte() && data[2] == 0x0.toByte()) - return - val eventName = eventType?.name ?: "Unknown Event" - parentActivity?.runOnUiThread { - addEntryToAdapter("$eventName - $cmdType", dataBytesToString(data)) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/SystemTwaksViewModel.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/SystemTwaksViewModel.kt deleted file mode 100644 index fdc6171..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/SystemTwaksViewModel.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.snaggly.ksw_toolkit.gui.viewmodels - -import android.content.Context -import com.snaggly.ksw_toolkit.core.config.ConfigManager -import com.snaggly.ksw_toolkit.core.config.beans.SystemTweaks -import com.snaggly.ksw_toolkit.core.service.helper.CoreServiceClient - -class SystemTwaksViewModel : CoreServiceClient() { - - private var config: SystemTweaks? = null - - fun getConfig(context: Context) : SystemTweaks { - if (config == null) - config = ConfigManager.getConfig(context.filesDir.absolutePath).systemTweaks - return config!! - } - - fun restartMcuReader() { - coreService?.mcuReaderHandler?.restartReader() - } - - fun changeDPI(dpi: Int) { - coreService?.adbConnection!!.sendCommand("wm density $dpi") - } - - fun shrinkTopBar() { - coreService?.adbConnection!!.sendCommand("wm overscan 0,-9,0,0\nwm density ${config?.dpi!!.data-2}") - } - - fun restoreTopBar() { - coreService?.adbConnection!!.sendCommand("wm overscan 0,0,0,0\nwm density ${config?.dpi!!.data}") - } - - fun showTopBar() { - coreService?.adbConnection!!.sendCommand("settings put global policy_control null*") - } - - fun hideTopBar() { - coreService?.adbConnection!!.sendCommand("settings put global policy_control immersive.full=*") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/ToolKitViewModel.kt b/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/ToolKitViewModel.kt deleted file mode 100644 index 23a064a..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/gui/viewmodels/ToolKitViewModel.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.snaggly.ksw_toolkit.gui.viewmodels - -import android.content.Context -import android.provider.Settings -import com.snaggly.ksw_toolkit.core.service.helper.CoreServiceClient -import projekt.auto.mcu.ksw.serial.collection.McuCommands -import projekt.auto.mcu.ksw.serial.enums.SOUND_SRC_TYPE - -class ToolKitViewModel : CoreServiceClient() { - - fun getBrightness(context: Context) : Int { - return (Settings.System.getInt(context.contentResolver, Settings.System.SCREEN_BRIGHTNESS, 255)* 100) / 255 - } - - fun setBrightness(context: Context, brightness: Int) { - Settings.System.putInt(context.contentResolver, Settings.System.SCREEN_BRIGHTNESS, brightness*255/100) - coreService?.mcuLogic?.mcuCommunicator!!.sendCommand(McuCommands.SetBrightnessLevel(brightness.toByte())) - } - - fun openOEMScreen() { - coreService?.mcuLogic?.mcuCommunicator!!.sendCommand(McuCommands.SWITCH_TO_OEM) - } - - fun openRadioScreen() { - coreService?.mcuLogic?.mcuCommunicator!!.sendCommand(McuCommands.SetMusicSource(SOUND_SRC_TYPE.SRC_RADIO)) - } - - fun openFCamScreen() { - coreService?.mcuLogic?.mcuCommunicator!!.sendCommand(McuCommands.SetMusicSource(SOUND_SRC_TYPE.SRC_FRONTCAM)) - } - - fun openAuxScreen() { - coreService?.mcuLogic?.mcuCommunicator!!.sendCommand(McuCommands.SetMusicSource(SOUND_SRC_TYPE.SRC_AUX)) - } - - fun openDvrScreen() { - coreService?.mcuLogic?.mcuCommunicator!!.sendCommand(McuCommands.SetMusicSource(SOUND_SRC_TYPE.SRC_DVR)) - } - - fun openDvdScreen() { - coreService?.mcuLogic?.mcuCommunicator!!.sendCommand(McuCommands.SetMusicSource(SOUND_SRC_TYPE.SRC_DVD)) - } - - fun openDtvScreen() { - coreService?.mcuLogic?.mcuCommunicator!!.sendCommand(McuCommands.SetMusicSource(SOUND_SRC_TYPE.SRC_DTV)) - } - - fun closeScreen() { - coreService?.mcuLogic?.mcuCommunicator!!.sendCommand(McuCommands.SYS_SCREEN_OFF) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/adapters/ListTypeAdapter.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/adapters/ListTypeAdapter.kt deleted file mode 100644 index c6dcf76..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/adapters/ListTypeAdapter.kt +++ /dev/null @@ -1,74 +0,0 @@ -package com.snaggly.ksw_toolkit.util.adapters - -import android.content.res.ColorStateList -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.RadioButton -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.snaggly.ksw_toolkit.R -import com.snaggly.ksw_toolkit.util.list.ListType - -class ListTypeAdapter(private val appsList: ArrayList, - private var selectedApp : Int, - private val onAppClickListener: OnAppClickListener) - : RecyclerView.Adapter() { - - private lateinit var purple200 : ColorStateList - private lateinit var purple500 : ColorStateList - private var previousSelection : AppsListViewHolder? = null - - interface OnAppClickListener { fun onAppClick(position: Int)} - - inner class AppsListViewHolder(itemView: View, private val onClickListener: OnAppClickListener) - : RecyclerView.ViewHolder(itemView), View.OnClickListener, View.OnFocusChangeListener { - val appIconView : ImageView = itemView.findViewById(R.id.apps_list_icon) - val appNameView : TextView = itemView.findViewById(R.id.apps_list_text) - val appRadioButtonView : RadioButton = itemView.findViewById(R.id.apps_list_radioBtn) - - init { - itemView.setOnClickListener(this) - itemView.onFocusChangeListener = this - } - - override fun onClick(v: View?) { - previousSelection?.appRadioButtonView?.isChecked = false - appRadioButtonView.isChecked = true - previousSelection = this - selectedApp = adapterPosition - onClickListener.onAppClick(adapterPosition) - } - - override fun onFocusChange(v: View?, hasFocus: Boolean) { - if (hasFocus) - appRadioButtonView.buttonTintList = purple200 - else - appRadioButtonView.buttonTintList = purple500 - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AppsListViewHolder { - purple200 = ColorStateList.valueOf(parent.context.getColor(R.color.purple_200)) - purple500 = ColorStateList.valueOf(parent.context.getColor(R.color.purple_500)) - return AppsListViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.apps_view_list, parent, false), onAppClickListener) - } - - override fun onBindViewHolder(holder: AppsListViewHolder, position: Int) { - val currentApp = appsList[position] - holder.appIconView.setImageDrawable(currentApp.icon) - holder.appNameView.text = currentApp.name - if (position == selectedApp) { - holder.appRadioButtonView.isChecked = true - previousSelection = holder - } - else { - holder.appRadioButtonView.isChecked = false - } - } - - override fun getItemCount(): Int { - return appsList.size - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/adapters/McuEventRVAdapter.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/adapters/McuEventRVAdapter.kt deleted file mode 100644 index c9cb1f8..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/adapters/McuEventRVAdapter.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.snaggly.ksw_toolkit.util.adapters - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.snaggly.ksw_toolkit.R - -class McuEventRVAdapter : RecyclerView.Adapter() { - private var names = ArrayList(arrayListOf("")) - private var datas = ArrayList(arrayListOf("")) - - inner class McuEventViewHolder (itemView: View) : RecyclerView.ViewHolder(itemView) { - val eventName : TextView = itemView.findViewById(R.id.mcuEventName) - val dataString : TextView = itemView.findViewById(R.id.mcuDataString) - } - - override fun getItemViewType(position: Int): Int { - return if (position > 0) 1 - else 0 - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): McuEventViewHolder { - return when (viewType) { - 1 -> McuEventViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.mcu_event, parent, false)) - else -> McuEventViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.dummy_list, parent, false)) - } - } - - override fun onBindViewHolder(holder: McuEventViewHolder, position: Int) { - holder.eventName.text = names[position] - holder.dataString.text = datas[position] - } - - override fun getItemCount(): Int { - return names.size; - } - - fun addNewEntry(name: String, dataString: String) { - names.add(1, name) - datas.add(1, dataString) - notifyItemInserted(1) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/adapters/McuSourceAdapter.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/adapters/McuSourceAdapter.kt deleted file mode 100644 index a4bbe3d..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/adapters/McuSourceAdapter.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.snaggly.ksw_toolkit.util.adapters - -import android.content.Context -import com.snaggly.ksw_toolkit.R - -class McuSourceAdapter(context: Context) { - private val mcuSourcesList = context.resources.getStringArray(R.array.mcuSourcesList) - - fun getSourceString(sourceInt: Int) : String{ - return mcuSourcesList[sourceInt] - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/adb/AdbManager.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/adb/AdbManager.kt index 166e6e9..df5583c 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/adb/AdbManager.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/util/adb/AdbManager.kt @@ -13,18 +13,13 @@ import java.net.Socket import java.security.NoSuchAlgorithmException object AdbManager { - private lateinit var socket : Socket private var isConnected = false - private lateinit var adbConnection: AdbConnection - private lateinit var shellStream: AdbStream - private var previousShellText = "" - - interface OnAdbShellDataReceived { - fun onDataReceived(text: String) - } + private var socket : Socket? = null + private var adbConnection: AdbConnection? = null + private var shellStream: AdbStream? = null @Throws(AdbConnectionException::class) - fun connect(context: Context, destination: String, callback: OnAdbShellDataReceived) { + private fun connect(context: Context) { if (isConnected) disconnect() var outerException: Exception? = null @@ -33,10 +28,10 @@ object AdbManager { TrafficStats.setThreadStatsTag(Thread.currentThread().id.toInt()) val adbCrypto = setupCrypto(context.filesDir) socket = Socket() - socket.connect(InetSocketAddress("localhost", 5555), 5000) + socket!!.connect(InetSocketAddress("localhost", 5555), 5000) adbConnection = AdbConnection.create(socket, adbCrypto) - adbConnection.connect() - shellStream = adbConnection.open(destination) + adbConnection!!.connect() + shellStream = adbConnection!!.open("shell:") } catch (e: Exception) { outerException = e } @@ -47,40 +42,43 @@ object AdbManager { if (outerException != null) { throw AdbConnectionException(outerException!!) } - - Thread { - while (!shellStream.isClosed) { - try { - Thread.sleep(100) - var shellText = String(shellStream.read(), Charsets.US_ASCII) - if (shellText != previousShellText) { - previousShellText = shellText - callback.onDataReceived(shellText) - } - } - catch (e : Exception) { - isConnected = false - e.printStackTrace() - } - } - }.start() - isConnected = true + isConnected = shellStream != null } - fun disconnect() { - if (isConnected) { - shellStream.close() - adbConnection.close() - socket.close() + private fun disconnect() { + val disconnecter = Thread { + shellStream?.close() + adbConnection?.close() + socket?.close() } + disconnecter.start() + disconnecter.join() + isConnected = false } - fun sendCommand(command: String) { + private fun writeCommand(command: String) { + val writer = Thread { + try { + shellStream?.write(" $command\n") + } + catch (e : Exception) { + isConnected = false + } + } + writer.start() + writer.join() + } + + fun sendCommand(command: String, context: Context) { if (isConnected) { - Thread { - shellStream.write(" $command\n") - }.start() + writeCommand(command) + } else { + connect(context) + if (isConnected) { + writeCommand(command) + } + disconnect() } } @@ -111,4 +109,5 @@ object AdbManager { return outerException.stackTrace } } + } \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/animation/ResizeAnimation.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/animation/ResizeAnimation.kt deleted file mode 100644 index 791ceef..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/animation/ResizeAnimation.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.snaggly.ksw_toolkit.util.animation - -import android.view.View -import android.view.animation.Animation -import android.view.animation.Transformation - -class ResizeAnimation(private val view: View?, private val startWidth: Int, endW: Int, startH: Int, endH: Int) : Animation() { - private val deltaWidth : Int = endW - startWidth // distance between start and end height - private val startHeight: Int = startH - private val deltaHeight: Int = endH - startH - private val originalWidth: Int = view!!.width - private val originalHeight: Int = view!!.height - private var fillEnabled = false - override fun setFillEnabled(enabled: Boolean) { - fillEnabled = enabled - super.setFillEnabled(enabled) - } - - override fun applyTransformation(interpolatedTime: Float, t: Transformation?) { - if (interpolatedTime.toDouble() == 1.0 && !fillEnabled) { - view!!.layoutParams.height = originalHeight - view.layoutParams.width = originalWidth - } else { - if (deltaHeight != 0) view!!.layoutParams.height = (startHeight + deltaHeight * interpolatedTime).toInt() - if (deltaWidth != 0) view!!.layoutParams.width = (startWidth + deltaWidth * interpolatedTime).toInt() - } - view!!.requestLayout() - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/commander/McuCommander.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/commander/McuCommander.kt index ee3fac2..5d351f0 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/commander/McuCommander.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/util/commander/McuCommander.kt @@ -15,21 +15,19 @@ object McuCommander { } McuCommandsEnum.BrightnessInc -> { - var currentBrightness = (Settings.System.getInt(context.contentResolver, Settings.System.SCREEN_BRIGHTNESS, 255) * 100) / 255 - currentBrightness += 10 - if (currentBrightness > 100) - currentBrightness = 100 - Settings.System.putInt(context.contentResolver, Settings.System.SCREEN_BRIGHTNESS, currentBrightness * 255 / 100) - mcuCommunicator?.sendCommand(McuCommands.SetBrightnessLevel(currentBrightness.toByte())) + var currentBrightness = Settings.System.getInt(context.contentResolver, Settings.System.SCREEN_BRIGHTNESS, 0xFF) + currentBrightness = (currentBrightness * 1.5).toInt() + if (currentBrightness > 0xFF) + currentBrightness = 0xFF + Settings.System.putInt(context.contentResolver, Settings.System.SCREEN_BRIGHTNESS, currentBrightness) } McuCommandsEnum.BrightnessDec -> { - var currentBrightness = (Settings.System.getInt(context.contentResolver, Settings.System.SCREEN_BRIGHTNESS, 255) * 100) / 255 - currentBrightness -= 10 - if (currentBrightness < 0) - currentBrightness = 0 - Settings.System.putInt(context.contentResolver, Settings.System.SCREEN_BRIGHTNESS, currentBrightness * 255 / 100) - mcuCommunicator?.sendCommand(McuCommands.SetBrightnessLevel(currentBrightness.toByte())) + var currentBrightness = Settings.System.getInt(context.contentResolver, Settings.System.SCREEN_BRIGHTNESS, 0xFF) + currentBrightness = (currentBrightness / 1.5).toInt() + if (currentBrightness < 10) + currentBrightness = 10 + Settings.System.putInt(context.contentResolver, Settings.System.SCREEN_BRIGHTNESS, currentBrightness) } McuCommandsEnum.CarInfo -> mcuCommunicator?.sendCommand(McuCommands.SWITCH_TO_OEM) diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/ListType.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/list/ListType.kt deleted file mode 100644 index fe9454b..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/ListType.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.snaggly.ksw_toolkit.util.list - -import android.graphics.drawable.Drawable - -open class ListType(val name: String, val icon: Drawable) {} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/app/AppInfo.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/list/app/AppInfo.kt deleted file mode 100644 index 92ac550..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/app/AppInfo.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.snaggly.ksw_toolkit.util.list.app - -import android.graphics.drawable.Drawable -import com.snaggly.ksw_toolkit.util.list.ListType - -class AppInfo(appName: String, val packageName: String, appIcon: Drawable) : ListType(appName, appIcon) \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/app/AppsLister.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/list/app/AppsLister.kt deleted file mode 100644 index 86e7f2c..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/app/AppsLister.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.snaggly.ksw_toolkit.util.list.app - -import android.annotation.SuppressLint -import android.content.Context - -@SuppressLint("QueryPermissionsNeeded") -class AppsLister (context: Context) { - private val appsList = ArrayList() - - init { - val apps = context.packageManager.getInstalledPackages(0) - - for (packageInfo in apps){ - if (context.packageManager.getLaunchIntentForPackage(packageInfo.packageName) == null) { - continue; - } - var thisAppInfo = AppInfo( - packageInfo.applicationInfo.loadLabel(context.packageManager) as String, - packageInfo.packageName, - packageInfo.applicationInfo.loadIcon(context.packageManager) - ) - - appsList.add(thisAppInfo) - } - } - - fun getNumOfApps() : Int{ - return appsList.size - } - - fun getAppsList() : ArrayList { - return appsList - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/eventtype/EventManagerTypes.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/list/eventtype/EventManagerTypes.kt index e7d773d..478f9a1 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/eventtype/EventManagerTypes.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/util/list/eventtype/EventManagerTypes.kt @@ -28,8 +28,5 @@ enum class EventManagerTypes { ScreenSwitch, Dummy; - companion object { - private val types = EventManagerTypes.values().associateBy { it.name } - fun findByName(value: String) = types[value] - } + companion object } \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/eventtype/EventMode.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/list/eventtype/EventMode.kt index 27d87ba..f3b22cc 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/eventtype/EventMode.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/util/list/eventtype/EventMode.kt @@ -6,8 +6,5 @@ enum class EventMode(val value: Int) { StartApp(2), McuCommand(3); - companion object { - private val types = values().associateBy { it.value } - fun findByValue(value: Int) = types[value] - } + companion object } \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/keyevent/KeyCode.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/list/keyevent/KeyCode.kt index 5f2c7df..ba4f725 100644 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/keyevent/KeyCode.kt +++ b/app/src/main/java/com/snaggly/ksw_toolkit/util/list/keyevent/KeyCode.kt @@ -1,31 +1,17 @@ package com.snaggly.ksw_toolkit.util.list.keyevent enum class KeyCode(val keycode : Int) { - ASSIST(219), BACK(4), - CALCULATOR( 210), - CALENDAR( 208), - CONTACTS( 207), - DPAD_CENTER( 23), DPAD_DOWN( 20), DPAD_LEFT( 21), DPAD_RIGHT(22), DPAD_UP(19), ENTER(66), - ENVELOPE( 65), - EXPLORER(64), HOME(3), MEDIA_NEXT(87), MEDIA_PLAY_PAUSE(85), MEDIA_PREVIOUS(88), - MEDIA_STOP(86), - MUSIC(209), - MUTE(91), - SETTINGS(176), VOICE_ASSIST(231), VOLUME_DOWN(25), - VOLUME_MUTE(164), VOLUME_UP(24), - KEYCODE_1(8), - KEYCODE_2(9); } \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/keyevent/KeyEvent.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/list/keyevent/KeyEvent.kt deleted file mode 100644 index 9bf5cfb..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/keyevent/KeyEvent.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.snaggly.ksw_toolkit.util.list.keyevent - -import android.content.Context -import android.graphics.drawable.Drawable -import androidx.core.content.ContextCompat -import com.snaggly.ksw_toolkit.R -import com.snaggly.ksw_toolkit.util.list.ListType - -class KeyEvent(name: String, icon: Drawable, val code: Int) : ListType(name, icon) { - - companion object { - fun getKeyEventList(context: Context) : ArrayList { - val result = ArrayList() - result.add(KeyEvent(KeyCode.BACK.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_keyboard_backspace_36)!!, KeyCode.BACK.keycode)) - result.add(KeyEvent(KeyCode.CALCULATOR.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_calculate_36)!!, KeyCode.CALCULATOR.keycode)) - result.add(KeyEvent(KeyCode.CALENDAR.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_calendar_today_36)!!, KeyCode.CALENDAR.keycode)) - result.add(KeyEvent(KeyCode.CONTACTS.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_contacts_36)!!, KeyCode.CONTACTS.keycode)) - result.add(KeyEvent(KeyCode.DPAD_CENTER.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_center_focus_weak_36)!!, KeyCode.DPAD_CENTER.keycode)) - result.add(KeyEvent(KeyCode.DPAD_DOWN.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_keyboard_arrow_down_36)!!, KeyCode.DPAD_DOWN.keycode)) - result.add(KeyEvent(KeyCode.DPAD_LEFT.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_keyboard_arrow_left_36)!!, KeyCode.DPAD_LEFT.keycode)) - result.add(KeyEvent(KeyCode.DPAD_RIGHT.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_keyboard_arrow_right_36)!!, KeyCode.DPAD_RIGHT.keycode)) - result.add(KeyEvent(KeyCode.DPAD_UP.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_keyboard_arrow_up_36)!!, KeyCode.DPAD_UP.keycode)) - result.add(KeyEvent(KeyCode.ENTER.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_filter_center_focus_24)!!, KeyCode.ENTER.keycode)) - result.add(KeyEvent(KeyCode.ENVELOPE.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_email_36)!!, KeyCode.ENVELOPE.keycode)) - result.add(KeyEvent(KeyCode.EXPLORER.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_file_copy_36)!!, KeyCode.EXPLORER.keycode)) - result.add(KeyEvent(KeyCode.HOME.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_home_24)!!, KeyCode.HOME.keycode)) - result.add(KeyEvent(KeyCode.MEDIA_NEXT.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_skip_next_36)!!, KeyCode.MEDIA_NEXT.keycode)) - result.add(KeyEvent(KeyCode.MEDIA_PLAY_PAUSE.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_play_arrow_36)!!, KeyCode.MEDIA_PLAY_PAUSE.keycode)) - result.add(KeyEvent(KeyCode.MEDIA_PREVIOUS.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_skip_previous_36)!!, KeyCode.MEDIA_PREVIOUS.keycode)) - result.add(KeyEvent(KeyCode.MEDIA_STOP.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_stop_36)!!, KeyCode.MEDIA_STOP.keycode)) - result.add(KeyEvent(KeyCode.MUSIC.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_library_music_36)!!, KeyCode.MUSIC.keycode)) - result.add(KeyEvent(KeyCode.SETTINGS.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_settings_24)!!, KeyCode.SETTINGS.keycode)) - result.add(KeyEvent(KeyCode.VOICE_ASSIST.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_record_voice_over_36)!!, KeyCode.VOICE_ASSIST.keycode)) - result.add(KeyEvent(KeyCode.VOLUME_DOWN.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_volume_down_36)!!, KeyCode.VOLUME_DOWN.keycode)) - result.add(KeyEvent(KeyCode.VOLUME_MUTE.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_volume_off_36)!!, KeyCode.VOLUME_MUTE.keycode)) - result.add(KeyEvent(KeyCode.VOLUME_UP.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_volume_up_36)!!, KeyCode.VOLUME_UP.keycode)) - result.add(KeyEvent(KeyCode.KEYCODE_1.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_code_36)!!, KeyCode.KEYCODE_1.keycode)) - result.add(KeyEvent(KeyCode.KEYCODE_2.name, ContextCompat.getDrawable(context, R.drawable.ic_baseline_code_36)!!, KeyCode.KEYCODE_2.keycode)) - - return result - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/mcu/McuCommandsList.kt b/app/src/main/java/com/snaggly/ksw_toolkit/util/list/mcu/McuCommandsList.kt deleted file mode 100644 index 57647e0..0000000 --- a/app/src/main/java/com/snaggly/ksw_toolkit/util/list/mcu/McuCommandsList.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.snaggly.ksw_toolkit.util.list.mcu - -import android.content.Context -import android.graphics.drawable.Drawable -import androidx.core.content.ContextCompat -import com.snaggly.ksw_toolkit.R -import com.snaggly.ksw_toolkit.util.list.ListType - -class McuCommandsList(name: String, icon: Drawable, command: McuCommandsEnum) : ListType(name, icon) { - companion object { - fun getMcuCommandsList(context: Context) : ArrayList { - val result = ArrayList() - - result.add(McuCommandsList("Turn Screen Off", ContextCompat.getDrawable(context,R.drawable.ic_baseline_web_asset_off_64)!!, McuCommandsEnum.ScreenOff)) - result.add(McuCommandsList("Increase Brightness", ContextCompat.getDrawable(context,R.drawable.ic_baseline_brightness_high_64)!!, McuCommandsEnum.BrightnessInc)) - result.add(McuCommandsList("Decrease Brightness", ContextCompat.getDrawable(context,R.drawable.ic_baseline_brightness_low_64)!!, McuCommandsEnum.BrightnessDec)) - result.add(McuCommandsList("Switch to OEM", ContextCompat.getDrawable(context,R.drawable.nbt_src_icon_carinfo)!!, McuCommandsEnum.CarInfo)) - result.add(McuCommandsList("Open Radio", ContextCompat.getDrawable(context,R.drawable.ic_baseline_radio_64)!!, McuCommandsEnum.Radio)) - result.add(McuCommandsList("Open Front Cam", ContextCompat.getDrawable(context,R.drawable.ic_baseline_camera_alt_64)!!, McuCommandsEnum.F_CAM)) - result.add(McuCommandsList("Open AUX", ContextCompat.getDrawable(context,R.drawable.ic_baseline_cable_64)!!, McuCommandsEnum.AUX)) - result.add(McuCommandsList("Open DVR", ContextCompat.getDrawable(context,R.drawable.ic_baseline_videocam_64)!!, McuCommandsEnum.DVR)) - result.add(McuCommandsList("Open DVD", ContextCompat.getDrawable(context,R.drawable.ic_baseline_settings_input_component_64)!!, McuCommandsEnum.DVD)) - result.add(McuCommandsList("Open DTV", ContextCompat.getDrawable(context,R.drawable.ic_baseline_live_tv_64)!!, McuCommandsEnum.DTV)) - - return result - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/wits/pms/statuscontrol/PowerManagerApp.java b/app/src/main/java/com/wits/pms/statuscontrol/PowerManagerApp.java index decbb2d..ecee808 100644 --- a/app/src/main/java/com/wits/pms/statuscontrol/PowerManagerApp.java +++ b/app/src/main/java/com/wits/pms/statuscontrol/PowerManagerApp.java @@ -13,6 +13,7 @@ import com.wits.pms.IContentObserver; import com.wits.pms.IPowerManagerAppService; import java.util.HashMap; +import java.util.Objects; public class PowerManagerApp { private static ICmdListener cmdListener; @@ -26,7 +27,7 @@ public void onChange(boolean selfChange) { PowerManagerApp.registerICmdListener(PowerManagerApp.cmdListener); } for (String key : PowerManagerApp.maps.keySet()) { - PowerManagerApp.registerIContentObserver(key, (IContentObserver) PowerManagerApp.maps.get(key)); + PowerManagerApp.registerIContentObserver(key, Objects.requireNonNull(PowerManagerApp.maps.get(key))); } } }); @@ -42,7 +43,7 @@ public static void registerICmdListener(ICmdListener listener) { if (getManager() != null) { getManager().registerCmdListener(listener); } - } catch (RemoteException e) { + } catch (RemoteException ignored) { } } @@ -53,7 +54,7 @@ public static void registerIContentObserver(String key, IContentObserver content if (getManager() != null) { getManager().registerObserver(key, contentObserver); } - } catch (RemoteException e) { + } catch (RemoteException ignored) { } } @@ -67,7 +68,7 @@ public static void unRegisterIContentObserver(IContentObserver contentObserver) if (getManager() != null) { getManager().unregisterObserver(contentObserver); } - } catch (RemoteException e) { + } catch (RemoteException ignored) { } } @@ -95,8 +96,8 @@ public static boolean sendCommand(String jsonMsg) { public static void sendStatus(WitsStatus witsStatus) { if (getManager() != null) { try { - getManager().sendStatus(new Gson().toJson((Object) witsStatus)); - } catch (RemoteException e) { + getManager().sendStatus(new Gson().toJson(witsStatus)); + } catch (RemoteException ignored) { } } } diff --git a/app/src/main/res/anim/enter_from_buttom.xml b/app/src/main/res/anim/enter_from_buttom.xml deleted file mode 100644 index 37dd622..0000000 --- a/app/src/main/res/anim/enter_from_buttom.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/anim/enter_from_top.xml b/app/src/main/res/anim/enter_from_top.xml deleted file mode 100644 index b0403fe..0000000 --- a/app/src/main/res/anim/enter_from_top.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/leave_to_buttom.xml b/app/src/main/res/anim/leave_to_buttom.xml deleted file mode 100644 index f51fe2a..0000000 --- a/app/src/main/res/anim/leave_to_buttom.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/leave_to_top.xml b/app/src/main/res/anim/leave_to_top.xml deleted file mode 100644 index cc32dd2..0000000 --- a/app/src/main/res/anim/leave_to_top.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/anim/slide_enter_right_left.xml b/app/src/main/res/anim/slide_enter_right_left.xml deleted file mode 100644 index 6082d6f..0000000 --- a/app/src/main/res/anim/slide_enter_right_left.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/slide_exit_right_left.xml b/app/src/main/res/anim/slide_exit_right_left.xml deleted file mode 100644 index 879595a..0000000 --- a/app/src/main/res/anim/slide_exit_right_left.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/color/radio_selector.xml b/app/src/main/res/color/radio_selector.xml deleted file mode 100644 index 0431a7f..0000000 --- a/app/src/main/res/color/radio_selector.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/spinner_color.xml b/app/src/main/res/color/spinner_color.xml deleted file mode 100644 index 06f08fb..0000000 --- a/app/src/main/res/color/spinner_color.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/spinner_dropdown_color.xml b/app/src/main/res/color/spinner_dropdown_color.xml deleted file mode 100644 index e8453cd..0000000 --- a/app/src/main/res/color/spinner_dropdown_color.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/switch_selector.xml b/app/src/main/res/color/switch_selector.xml deleted file mode 100644 index c996184..0000000 --- a/app/src/main/res/color/switch_selector.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-anydpi/ic_stat_name.xml b/app/src/main/res/drawable-anydpi/ic_stat_name.xml deleted file mode 100644 index 87a230c..0000000 --- a/app/src/main/res/drawable-anydpi/ic_stat_name.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable-hdpi/ic_stat_name.png b/app/src/main/res/drawable-hdpi/ic_stat_name.png deleted file mode 100644 index 4ae8387..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_stat_name.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_stat_name.png b/app/src/main/res/drawable-mdpi/ic_stat_name.png deleted file mode 100644 index 1740a6b..0000000 Binary files a/app/src/main/res/drawable-mdpi/ic_stat_name.png and /dev/null differ diff --git a/app/src/main/res/drawable-v24/ic_aux.png b/app/src/main/res/drawable-v24/ic_aux.png deleted file mode 100644 index 3494985..0000000 Binary files a/app/src/main/res/drawable-v24/ic_aux.png and /dev/null differ diff --git a/app/src/main/res/drawable-v24/ic_dtv.png b/app/src/main/res/drawable-v24/ic_dtv.png deleted file mode 100644 index 5cf7165..0000000 Binary files a/app/src/main/res/drawable-v24/ic_dtv.png and /dev/null differ diff --git a/app/src/main/res/drawable-v24/ic_dvr.png b/app/src/main/res/drawable-v24/ic_dvr.png deleted file mode 100644 index 5e7201c..0000000 Binary files a/app/src/main/res/drawable-v24/ic_dvr.png and /dev/null differ diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 80dc465..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable-v24/icon_fcam.png b/app/src/main/res/drawable-v24/icon_fcam.png deleted file mode 100644 index 50b44fa..0000000 Binary files a/app/src/main/res/drawable-v24/icon_fcam.png and /dev/null differ diff --git a/app/src/main/res/drawable-v24/id7_sys_factory_bg.png b/app/src/main/res/drawable-v24/id7_sys_factory_bg.png deleted file mode 100644 index 4f56bdf..0000000 Binary files a/app/src/main/res/drawable-v24/id7_sys_factory_bg.png and /dev/null differ diff --git a/app/src/main/res/drawable-v24/nbt_src_icon_carinfo.png b/app/src/main/res/drawable-v24/nbt_src_icon_carinfo.png deleted file mode 100644 index 7c43de9..0000000 Binary files a/app/src/main/res/drawable-v24/nbt_src_icon_carinfo.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_stat_name.png b/app/src/main/res/drawable-xhdpi/ic_stat_name.png deleted file mode 100644 index 2c296e5..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_stat_name.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_stat_name.png b/app/src/main/res/drawable-xxhdpi/ic_stat_name.png deleted file mode 100644 index 1a129b0..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_stat_name.png and /dev/null differ diff --git a/app/src/main/res/drawable/border.xml b/app/src/main/res/drawable/border.xml deleted file mode 100644 index 5e1de44..0000000 --- a/app/src/main/res/drawable/border.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/border_focused.xml b/app/src/main/res/drawable/border_focused.xml deleted file mode 100644 index 8ea3abe..0000000 --- a/app/src/main/res/drawable/border_focused.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/border_pressed.xml b/app/src/main/res/drawable/border_pressed.xml deleted file mode 100644 index be5bd97..0000000 --- a/app/src/main/res/drawable/border_pressed.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/border_selector.xml b/app/src/main/res/drawable/border_selector.xml deleted file mode 100644 index 25cafff..0000000 --- a/app/src/main/res/drawable/border_selector.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_selector.xml b/app/src/main/res/drawable/btn_selector.xml deleted file mode 100644 index b8d2291..0000000 --- a/app/src/main/res/drawable/btn_selector.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_brightness_high_64.xml b/app/src/main/res/drawable/ic_baseline_brightness_high_64.xml deleted file mode 100644 index 2954147..0000000 --- a/app/src/main/res/drawable/ic_baseline_brightness_high_64.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_brightness_low_64.xml b/app/src/main/res/drawable/ic_baseline_brightness_low_64.xml deleted file mode 100644 index 68f5886..0000000 --- a/app/src/main/res/drawable/ic_baseline_brightness_low_64.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_cable_64.xml b/app/src/main/res/drawable/ic_baseline_cable_64.xml deleted file mode 100644 index d96e9c3..0000000 --- a/app/src/main/res/drawable/ic_baseline_cable_64.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_calculate_36.xml b/app/src/main/res/drawable/ic_baseline_calculate_36.xml deleted file mode 100644 index 7f9952e..0000000 --- a/app/src/main/res/drawable/ic_baseline_calculate_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_calendar_today_36.xml b/app/src/main/res/drawable/ic_baseline_calendar_today_36.xml deleted file mode 100644 index 1af7a0e..0000000 --- a/app/src/main/res/drawable/ic_baseline_calendar_today_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_camera_alt_64.xml b/app/src/main/res/drawable/ic_baseline_camera_alt_64.xml deleted file mode 100644 index 30bf2bf..0000000 --- a/app/src/main/res/drawable/ic_baseline_camera_alt_64.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_baseline_center_focus_weak_36.xml b/app/src/main/res/drawable/ic_baseline_center_focus_weak_36.xml deleted file mode 100644 index fb5f1f0..0000000 --- a/app/src/main/res/drawable/ic_baseline_center_focus_weak_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_cloud_download_24.xml b/app/src/main/res/drawable/ic_baseline_cloud_download_24.xml deleted file mode 100644 index 7697c99..0000000 --- a/app/src/main/res/drawable/ic_baseline_cloud_download_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_cloud_upload_24.xml b/app/src/main/res/drawable/ic_baseline_cloud_upload_24.xml deleted file mode 100644 index 0640d07..0000000 --- a/app/src/main/res/drawable/ic_baseline_cloud_upload_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_code_36.xml b/app/src/main/res/drawable/ic_baseline_code_36.xml deleted file mode 100644 index 8ea5697..0000000 --- a/app/src/main/res/drawable/ic_baseline_code_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_contacts_36.xml b/app/src/main/res/drawable/ic_baseline_contacts_36.xml deleted file mode 100644 index d0c8a9c..0000000 --- a/app/src/main/res/drawable/ic_baseline_contacts_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_email_36.xml b/app/src/main/res/drawable/ic_baseline_email_36.xml deleted file mode 100644 index 0b20138..0000000 --- a/app/src/main/res/drawable/ic_baseline_email_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_file_copy_36.xml b/app/src/main/res/drawable/ic_baseline_file_copy_36.xml deleted file mode 100644 index 4f463b9..0000000 --- a/app/src/main/res/drawable/ic_baseline_file_copy_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_filter_center_focus_24.xml b/app/src/main/res/drawable/ic_baseline_filter_center_focus_24.xml deleted file mode 100644 index fc3c98e..0000000 --- a/app/src/main/res/drawable/ic_baseline_filter_center_focus_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_home_24.xml b/app/src/main/res/drawable/ic_baseline_home_24.xml deleted file mode 100644 index 56ed169..0000000 --- a/app/src/main/res/drawable/ic_baseline_home_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_36.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_36.xml deleted file mode 100644 index b6726b1..0000000 --- a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_left_36.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_left_36.xml deleted file mode 100644 index e2cda64..0000000 --- a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_left_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_36.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_36.xml deleted file mode 100644 index 29c56dc..0000000 --- a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_up_36.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_up_36.xml deleted file mode 100644 index 1c54558..0000000 --- a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_up_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_backspace_36.xml b/app/src/main/res/drawable/ic_baseline_keyboard_backspace_36.xml deleted file mode 100644 index 9516871..0000000 --- a/app/src/main/res/drawable/ic_baseline_keyboard_backspace_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_library_music_36.xml b/app/src/main/res/drawable/ic_baseline_library_music_36.xml deleted file mode 100644 index 90ef5bc..0000000 --- a/app/src/main/res/drawable/ic_baseline_library_music_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_live_tv_64.xml b/app/src/main/res/drawable/ic_baseline_live_tv_64.xml deleted file mode 100644 index e6a2819..0000000 --- a/app/src/main/res/drawable/ic_baseline_live_tv_64.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_play_arrow_36.xml b/app/src/main/res/drawable/ic_baseline_play_arrow_36.xml deleted file mode 100644 index eb522cb..0000000 --- a/app/src/main/res/drawable/ic_baseline_play_arrow_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_radio_64.xml b/app/src/main/res/drawable/ic_baseline_radio_64.xml deleted file mode 100644 index 794ccc5..0000000 --- a/app/src/main/res/drawable/ic_baseline_radio_64.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_radio_button_checked_24.xml b/app/src/main/res/drawable/ic_baseline_radio_button_checked_24.xml deleted file mode 100644 index 972cac3..0000000 --- a/app/src/main/res/drawable/ic_baseline_radio_button_checked_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_radio_button_checked_highlighted_24.xml b/app/src/main/res/drawable/ic_baseline_radio_button_checked_highlighted_24.xml deleted file mode 100644 index d328a0e..0000000 --- a/app/src/main/res/drawable/ic_baseline_radio_button_checked_highlighted_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_radio_button_unchecked_24.xml b/app/src/main/res/drawable/ic_baseline_radio_button_unchecked_24.xml deleted file mode 100644 index a87a9d3..0000000 --- a/app/src/main/res/drawable/ic_baseline_radio_button_unchecked_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_radio_button_unchecked_highlighted_24.xml b/app/src/main/res/drawable/ic_baseline_radio_button_unchecked_highlighted_24.xml deleted file mode 100644 index 471af35..0000000 --- a/app/src/main/res/drawable/ic_baseline_radio_button_unchecked_highlighted_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_record_voice_over_36.xml b/app/src/main/res/drawable/ic_baseline_record_voice_over_36.xml deleted file mode 100644 index 4844be4..0000000 --- a/app/src/main/res/drawable/ic_baseline_record_voice_over_36.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_baseline_settings_24.xml b/app/src/main/res/drawable/ic_baseline_settings_24.xml deleted file mode 100644 index eaed177..0000000 --- a/app/src/main/res/drawable/ic_baseline_settings_24.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_settings_input_component_64.xml b/app/src/main/res/drawable/ic_baseline_settings_input_component_64.xml deleted file mode 100644 index 5337ebb..0000000 --- a/app/src/main/res/drawable/ic_baseline_settings_input_component_64.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_skip_next_36.xml b/app/src/main/res/drawable/ic_baseline_skip_next_36.xml deleted file mode 100644 index b435fc3..0000000 --- a/app/src/main/res/drawable/ic_baseline_skip_next_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_skip_previous_36.xml b/app/src/main/res/drawable/ic_baseline_skip_previous_36.xml deleted file mode 100644 index b7f80bf..0000000 --- a/app/src/main/res/drawable/ic_baseline_skip_previous_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_stop_36.xml b/app/src/main/res/drawable/ic_baseline_stop_36.xml deleted file mode 100644 index cd5f67f..0000000 --- a/app/src/main/res/drawable/ic_baseline_stop_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_videocam_64.xml b/app/src/main/res/drawable/ic_baseline_videocam_64.xml deleted file mode 100644 index 0cb20e3..0000000 --- a/app/src/main/res/drawable/ic_baseline_videocam_64.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_volume_down_36.xml b/app/src/main/res/drawable/ic_baseline_volume_down_36.xml deleted file mode 100644 index ea13f51..0000000 --- a/app/src/main/res/drawable/ic_baseline_volume_down_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_volume_mute_36.xml b/app/src/main/res/drawable/ic_baseline_volume_mute_36.xml deleted file mode 100644 index 86eac51..0000000 --- a/app/src/main/res/drawable/ic_baseline_volume_mute_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_volume_off_36.xml b/app/src/main/res/drawable/ic_baseline_volume_off_36.xml deleted file mode 100644 index a55a0d6..0000000 --- a/app/src/main/res/drawable/ic_baseline_volume_off_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_volume_up_36.xml b/app/src/main/res/drawable/ic_baseline_volume_up_36.xml deleted file mode 100644 index f7f6824..0000000 --- a/app/src/main/res/drawable/ic_baseline_volume_up_36.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_web_asset_off_64.xml b/app/src/main/res/drawable/ic_baseline_web_asset_off_64.xml deleted file mode 100644 index d1ce234..0000000 --- a/app/src/main/res/drawable/ic_baseline_web_asset_off_64.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ksw_id7_btn_pressed.png b/app/src/main/res/drawable/ksw_id7_btn_pressed.png deleted file mode 100644 index 4385724..0000000 Binary files a/app/src/main/res/drawable/ksw_id7_btn_pressed.png and /dev/null differ diff --git a/app/src/main/res/drawable/ksw_id7_itme_select_bg_focused.png b/app/src/main/res/drawable/ksw_id7_itme_select_bg_focused.png deleted file mode 100644 index 1d5ed1d..0000000 Binary files a/app/src/main/res/drawable/ksw_id7_itme_select_bg_focused.png and /dev/null differ diff --git a/app/src/main/res/drawable/ksw_id7_itme_select_bg_normal.png b/app/src/main/res/drawable/ksw_id7_itme_select_bg_normal.png deleted file mode 100644 index 9ed8355..0000000 Binary files a/app/src/main/res/drawable/ksw_id7_itme_select_bg_normal.png and /dev/null differ diff --git a/app/src/main/res/drawable/ksw_id7_itme_select_bg_pressed.png b/app/src/main/res/drawable/ksw_id7_itme_select_bg_pressed.png deleted file mode 100644 index 9ed8355..0000000 Binary files a/app/src/main/res/drawable/ksw_id7_itme_select_bg_pressed.png and /dev/null differ diff --git a/app/src/main/res/drawable/radio_selector.xml b/app/src/main/res/drawable/radio_selector.xml deleted file mode 100644 index d39a109..0000000 --- a/app/src/main/res/drawable/radio_selector.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 021efac..0000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - -