Skip to content

Commit

Permalink
Merge pull request #1 from Snaggly/Remote_Service
Browse files Browse the repository at this point in the history
v0.8
  • Loading branch information
Snaggly committed Sep 30, 2021
2 parents edeb367 + e670f9b commit abaab72
Show file tree
Hide file tree
Showing 171 changed files with 1,023 additions and 4,202 deletions.
6 changes: 6 additions & 0 deletions TODO.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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

26 changes: 13 additions & 13 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
Expand All @@ -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'
}
4 changes: 2 additions & 2 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -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.** {*;}
Expand Down
46 changes: 26 additions & 20 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,47 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:sharedUserId="android.uid.system"
package="com.snaggly.ksw_toolkit">
package="com.snaggly.ksw_toolkit"
android:sharedUserId="android.uid.system">

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.READ_LOGS"
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.READ_LOGS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.INJECT_EVENTS"
<uses-permission
android:name="android.permission.INJECT_EVENTS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"
<uses-permission
android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<uses-permission
android:name="android.permission.MODIFY_DAY_NIGHT_MODE"
tools:ignore="ProtectedPermissions" />

<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.KSWToolKit">
<service android:name=".core.service.CoreService" android:enabled="true" android:exported="false" />
android:roundIcon="@mipmap/ic_launcher_round">

<service
android:name=".core.service.CoreService"
android:enabled="true"
android:exported="true"
tools:ignore="ExportedService" />

<receiver
android:name=".boot.BootReceiver"
android:directBootAware="true"
android:enabled="true"
android:exported="false"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<activity android:name=".gui.MainActivity" android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
18 changes: 18 additions & 0 deletions app/src/main/aidl/com/snaggly/ksw_toolkit/IKSWToolKitService.aidl
Original file line number Diff line number Diff line change
@@ -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);
}
6 changes: 6 additions & 0 deletions app/src/main/aidl/com/snaggly/ksw_toolkit/IMcuListener.aidl
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// IMcuListener.aidl
package com.snaggly.ksw_toolkit;

interface IMcuListener {
void updateMcu(String eventName, int cmdType, in byte[] data);
}
38 changes: 19 additions & 19 deletions app/src/main/aidl/com/wits/pms/IPowerManagerAppService.aidl
Original file line number Diff line number Diff line change
@@ -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);
}
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);
}
36 changes: 17 additions & 19 deletions app/src/main/java/com/snaggly/ksw_toolkit/boot/BootReceiver.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<EventManagerTypes, EventManager>
var systemOptions: SystemOptions,
var eventManagers : HashMap<EventManagerTypes, EventManager>
)
Original file line number Diff line number Diff line change
Expand Up @@ -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<EventManagerTypes, EventManager>()
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 }
}
}

Expand All @@ -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)
}
}
}
Loading

0 comments on commit abaab72

Please sign in to comment.