diff --git a/core/src/main/java/com/example/core/Util.kt b/core/src/main/java/com/example/core/Util.kt new file mode 100644 index 0000000..39df87d --- /dev/null +++ b/core/src/main/java/com/example/core/Util.kt @@ -0,0 +1,24 @@ +package com.example.core + +import android.annotation.SuppressLint +import android.content.Context +import android.os.Build +import android.provider.Settings + +fun getDeviceName(): String { + val manufacturer = Build.MANUFACTURER + val model = Build.MODEL + + return if (model.startsWith(manufacturer, ignoreCase = true)) { + model + } else { + "$manufacturer $model" + } +} + +@SuppressLint("HardwareIds") +fun getAndroidId(context: Context): String { + return Settings + .Secure + .getString(context.contentResolver, Settings.Secure.ANDROID_ID) +} \ No newline at end of file diff --git a/core/src/main/java/com/example/core/data/AppConfigImpl.kt b/core/src/main/java/com/example/core/data/AppConfigImpl.kt deleted file mode 100644 index 1e97763..0000000 --- a/core/src/main/java/com/example/core/data/AppConfigImpl.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.core.data - -import com.example.core.domain.AppConfig - -class AppConfigImpl : AppConfig{ - override fun androidId(id: String): String { - return "window.WebV.onUUID($id);" - } -} \ No newline at end of file diff --git a/core/src/main/java/com/example/core/di/CoreModule.kt b/core/src/main/java/com/example/core/di/CoreModule.kt index c7fc873..b4bd9f3 100644 --- a/core/src/main/java/com/example/core/di/CoreModule.kt +++ b/core/src/main/java/com/example/core/di/CoreModule.kt @@ -1,8 +1,6 @@ package com.example.core.di -import com.example.core.data.AppConfigImpl import com.example.core.data.PaymentResultImpl -import com.example.core.domain.AppConfig import com.example.core.domain.PaymentResult import com.google.gson.Gson import dagger.Module @@ -25,9 +23,4 @@ class CoreModule { ): PaymentResult = PaymentResultImpl( gson = gson ) - - @Provides - fun provideAppConfig( - gson: Gson - ): AppConfig = AppConfigImpl() } \ No newline at end of file diff --git a/core/src/main/java/com/example/core/domain/AppConfig.kt b/core/src/main/java/com/example/core/domain/AppConfig.kt deleted file mode 100644 index 10df710..0000000 --- a/core/src/main/java/com/example/core/domain/AppConfig.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.example.core.domain - -import com.example.core.model.PaymentResultEntity - -interface AppConfig { - fun androidId(id : String) : String -} \ No newline at end of file diff --git a/core/src/main/java/com/example/core/model/DeviceInfo.kt b/core/src/main/java/com/example/core/model/DeviceInfo.kt new file mode 100644 index 0000000..2aad11a --- /dev/null +++ b/core/src/main/java/com/example/core/model/DeviceInfo.kt @@ -0,0 +1,6 @@ +package com.example.core.model + +data class DeviceInfo( + val androidId: String, + val deviceName: String +) diff --git a/design_system/src/main/java/com/example/design_system/WebViewScreen.kt b/design_system/src/main/java/com/example/design_system/WebViewScreen.kt index 51d41c2..8fb75cd 100644 --- a/design_system/src/main/java/com/example/design_system/WebViewScreen.kt +++ b/design_system/src/main/java/com/example/design_system/WebViewScreen.kt @@ -3,8 +3,6 @@ package com.example.design_system import android.annotation.SuppressLint import android.app.Activity import android.view.ViewGroup -import android.webkit.WebResourceError -import android.webkit.WebResourceRequest import android.webkit.WebSettings import android.webkit.WebView import android.webkit.WebViewClient @@ -36,7 +34,7 @@ fun PspWebView( modifier: Modifier = Modifier, onWebView: (WebView) -> Unit, onPayClick: (amount: Long, id: String?) -> Unit, - onUUID: () -> Unit, + onDeviceInfo: () -> String, onPrintClick: (printEntities: List) -> Unit, ) { @@ -49,13 +47,13 @@ fun PspWebView( // Use rememberUpdatedState to ensure the bridge always calls the latest callbacks val currentOnPayClick by rememberUpdatedState(onPayClick) val currentOnPrintClick by rememberUpdatedState(onPrintClick) - val currentOnUUID by rememberUpdatedState(onUUID) + val currentOnDeviceInfo by rememberUpdatedState(onDeviceInfo) val bridge = remember { PspJavaScriptInterface( onPayClick = { amount, id -> currentOnPayClick(amount, id) }, onPrintClick = { entities -> currentOnPrintClick(entities) }, - onUUID = { currentOnUUID() } + onDeviceInfo = { currentOnDeviceInfo() } ) } diff --git a/design_system/src/main/java/com/example/design_system/util/PspJavaScriptInterface.kt b/design_system/src/main/java/com/example/design_system/util/PspJavaScriptInterface.kt index 00d37a4..92b263c 100644 --- a/design_system/src/main/java/com/example/design_system/util/PspJavaScriptInterface.kt +++ b/design_system/src/main/java/com/example/design_system/util/PspJavaScriptInterface.kt @@ -11,7 +11,7 @@ import com.google.gson.reflect.TypeToken class PspJavaScriptInterface( private val onPayClick: (Long, String?) -> Unit, private val onPrintClick: (List) -> Unit, - private val onUUID: () -> Unit, + private val onDeviceInfo: () -> String, ) { @JavascriptInterface @@ -40,12 +40,13 @@ class PspJavaScriptInterface( @JavascriptInterface @Keep - fun uuid() { + fun deviceInfo(): String { Log.d("PspBridge", "uuid called") - try { - onUUID() + return try { + onDeviceInfo() } catch (e: Exception) { Log.e("PspBridge", "Error in uuid callback", e) + "" } } } diff --git a/ps4/src/main/java/com/example/ps4/P3Printer.kt b/ps4/src/main/java/com/example/ps4/P4Printer.kt similarity index 71% rename from ps4/src/main/java/com/example/ps4/P3Printer.kt rename to ps4/src/main/java/com/example/ps4/P4Printer.kt index ac5e62c..8438e12 100644 --- a/ps4/src/main/java/com/example/ps4/P3Printer.kt +++ b/ps4/src/main/java/com/example/ps4/P4Printer.kt @@ -1,15 +1,12 @@ package com.example.ps4 -import android.content.Context import androidx.annotation.DrawableRes import com.example.core.domain.Printer import com.example.core.model.PrintEntity import javax.inject.Inject -class P4Printer @Inject constructor( - private val context: Context, -) : Printer { +class P4Printer @Inject constructor() : Printer { override fun print( diff --git a/stage_app/build.gradle.kts b/stage_app/build.gradle.kts index e349cde..dd91a36 100644 --- a/stage_app/build.gradle.kts +++ b/stage_app/build.gradle.kts @@ -2,10 +2,12 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.compose) alias(libs.plugins.ksp) - alias(libs.plugins.hilt)} + alias(libs.plugins.hilt) +} android { namespace = "com.example.stage_app" + compileSdk { version = release(36) { minorApiLevel = 1 @@ -16,22 +18,33 @@ android { applicationId = "com.example.stage_app" minSdk = 24 targetSdk = 36 - versionCode = 1 - versionName = "1.0" - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } flavorDimensions.add("module") productFlavors { create("p3") { + versionCode = 1 + versionName = "1.0" dimension = "module" + applicationId = "com.example.stage_app_p3" + manifestPlaceholders["appName"] = "TisP3" + } create("ps4") { + versionCode = 1 + versionName = "2.0" dimension = "module" + applicationId = "com.example.stage_app_p4" + manifestPlaceholders["appName"] = "TisP4" } create("standard") { + versionCode = 1 + versionName = "1.0" dimension = "module" + applicationId = "com.example.stage_app" + manifestPlaceholders["appName"] = "Tis" + } } @@ -74,6 +87,7 @@ dependencies { implementation(libs.androidx.compose.ui.tooling.preview) implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.retrofit.converter.gson) implementation("androidx.hilt:hilt-navigation-compose:1.2.0") testImplementation(libs.junit) androidTestImplementation(platform(libs.androidx.compose.bom)) diff --git a/stage_app/src/main/AndroidManifest.xml b/stage_app/src/main/AndroidManifest.xml index 3128154..066dcfd 100644 --- a/stage_app/src/main/AndroidManifest.xml +++ b/stage_app/src/main/AndroidManifest.xml @@ -20,7 +20,7 @@ android:name=".PspApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" - android:label="@string/app_name" + android:label="${appName}" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.PSP" diff --git a/stage_app/src/main/java/com/example/stage_app/screen/StageWebViewScreen.kt b/stage_app/src/main/java/com/example/stage_app/screen/StageWebViewScreen.kt index cd9602f..e2bb71f 100644 --- a/stage_app/src/main/java/com/example/stage_app/screen/StageWebViewScreen.kt +++ b/stage_app/src/main/java/com/example/stage_app/screen/StageWebViewScreen.kt @@ -1,6 +1,5 @@ package com.example.stage_app.screen -import android.provider.Settings import android.webkit.WebView import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts @@ -13,6 +12,8 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.hilt.navigation.compose.hiltViewModel +import com.example.core.getAndroidId +import com.example.core.getDeviceName import com.example.design_system.PspWebView import com.example.stage_app.viewmodel.StageViewModel @@ -60,13 +61,10 @@ fun StageWebViewScreen( viewModel.print(printEntities) }, - onUUID = { - val androidId = Settings - .Secure - .getString(context.contentResolver, Settings.Secure.ANDROID_ID) - - viewModel.sendAndroidId( - androidId + onDeviceInfo = { + viewModel.deviceInfoJson( + androidId = getAndroidId(context), + getDeviceName() ) } ) diff --git a/stage_app/src/main/java/com/example/stage_app/viewmodel/StageViewModel.kt b/stage_app/src/main/java/com/example/stage_app/viewmodel/StageViewModel.kt index 45d5a4d..05e380c 100644 --- a/stage_app/src/main/java/com/example/stage_app/viewmodel/StageViewModel.kt +++ b/stage_app/src/main/java/com/example/stage_app/viewmodel/StageViewModel.kt @@ -3,12 +3,13 @@ package com.example.stage_app.viewmodel import android.content.Intent import androidx.activity.result.ActivityResult import androidx.lifecycle.ViewModel -import com.example.core.domain.AppConfig import com.example.core.domain.PaymentResult import com.example.core.domain.Printer import com.example.core.domain.PspService +import com.example.core.model.DeviceInfo import com.example.core.model.PaymentResultEntity import com.example.core.model.PrintEntity +import com.google.gson.Gson import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -17,7 +18,7 @@ class StageViewModel @Inject constructor( private val pspService: PspService, private val paymentResult: PaymentResult, private val printer: Printer, - private val appConfig: AppConfig + private val gson: Gson ) : ViewModel() { @@ -66,7 +67,12 @@ class StageViewModel @Inject constructor( ) } - fun sendAndroidId(id: String) { - appConfig.androidId(id) + fun deviceInfoJson(androidId: String, deviceName: String): String { + return gson.toJson( + DeviceInfo( + androidId = androidId, + deviceName = deviceName + ) + ) } } diff --git a/stage_app/src/ps4/java/com/example/tis_sep/di/PspModule.kt b/stage_app/src/ps4/java/com/example/tis_sep/di/PspModule.kt index eece775..66de413 100644 --- a/stage_app/src/ps4/java/com/example/tis_sep/di/PspModule.kt +++ b/stage_app/src/ps4/java/com/example/tis_sep/di/PspModule.kt @@ -1,8 +1,9 @@ package com.example.tis_sep.di -import com.example.core.PspService -import com.example.ps4.Ps4Service +import com.example.core.domain.Printer +import com.example.core.domain.PspService import com.example.ps4.P4Printer +import com.example.ps4.Ps4Service import dagger.Binds import dagger.Module import dagger.hilt.InstallIn diff --git a/tis_app/build.gradle.kts b/tis_app/build.gradle.kts index 03c343a..1036c70 100644 --- a/tis_app/build.gradle.kts +++ b/tis_app/build.gradle.kts @@ -17,23 +17,30 @@ android { applicationId = "com.example.tis_app" minSdk = 24 targetSdk = 36 - versionCode = 1 - versionName = "1.0" - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } flavorDimensions.add("module") productFlavors { create("p3") { + versionCode = 1 + versionName = "1.0" dimension = "module" + applicationId = "com.example.tis_app_p3" + manifestPlaceholders["appName"] = "تیس" } create("ps4") { + versionCode = 1 + versionName = "1.0" dimension = "module" - } + applicationId = "com.example.tis_app_p4" + manifestPlaceholders["appName"] = "تیس" } create("standard") { + versionCode = 1 + versionName = "1.0" dimension = "module" - } + applicationId = "com.example.tis_app" + manifestPlaceholders["appName"] = "تیس" } } buildTypes { @@ -72,6 +79,7 @@ dependencies { implementation(libs.androidx.compose.ui.graphics) implementation(libs.androidx.compose.ui.tooling.preview) implementation(libs.androidx.core.ktx) + implementation(libs.retrofit.converter.gson) implementation(libs.androidx.lifecycle.runtime.ktx) implementation("androidx.hilt:hilt-navigation-compose:1.2.0") testImplementation(libs.junit) diff --git a/tis_app/src/main/java/com/example/tis_app/screen/TisWebViewScreen.kt b/tis_app/src/main/java/com/example/tis_app/screen/TisWebViewScreen.kt index f7cff35..e64eef0 100644 --- a/tis_app/src/main/java/com/example/tis_app/screen/TisWebViewScreen.kt +++ b/tis_app/src/main/java/com/example/tis_app/screen/TisWebViewScreen.kt @@ -1,6 +1,5 @@ package com.example.tis_app.screen -import android.provider.Settings import android.webkit.WebView import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts @@ -13,9 +12,13 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.hilt.navigation.compose.hiltViewModel +import com.example.core.getAndroidId +import com.example.core.getDeviceName import com.example.design_system.PspWebView import com.example.tis_app.viewmodel.WebViewModel + private const val tisIp = "194.59.214.243:8090" + @Composable fun TisWebViewScreen( modifier: Modifier = Modifier, @@ -58,13 +61,10 @@ fun TisWebViewScreen( viewModel.print(printEntities) }, - onUUID = { - val androidId = Settings - .Secure - .getString(context.contentResolver, Settings.Secure.ANDROID_ID) - - viewModel.sendAndroidId( - androidId + onDeviceInfo = { + viewModel.deviceInfoJson( + androidId = getAndroidId(context), + getDeviceName() ) } ) diff --git a/tis_app/src/main/java/com/example/tis_app/viewmodel/WebViewModel.kt b/tis_app/src/main/java/com/example/tis_app/viewmodel/WebViewModel.kt index 4cb37df..4cd3a3a 100644 --- a/tis_app/src/main/java/com/example/tis_app/viewmodel/WebViewModel.kt +++ b/tis_app/src/main/java/com/example/tis_app/viewmodel/WebViewModel.kt @@ -3,13 +3,14 @@ package com.example.tis_app.viewmodel import android.content.Intent import androidx.activity.result.ActivityResult import androidx.lifecycle.ViewModel -import com.example.core.domain.AppConfig import com.example.core.domain.PaymentResult import com.example.core.domain.Printer import com.example.core.domain.PspService +import com.example.core.model.DeviceInfo import com.example.core.model.PaymentResultEntity import com.example.core.model.PrintEntity import com.example.tis_app.R +import com.google.gson.Gson import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -18,7 +19,7 @@ class WebViewModel @Inject constructor( private val pspService: PspService, private val paymentResult: PaymentResult, private val printer: Printer, - private val appConfig: AppConfig + private val gson: Gson ) : ViewModel() { @@ -37,14 +38,20 @@ class WebViewModel @Inject constructor( activityResult = activityResult ) } - fun print(printEntities : List) { + + fun print(printEntities: List) { printer.print( printEntities = printEntities, icon = R.drawable.tis_icon ) } - fun sendAndroidId(id : String) { - appConfig.androidId(id) + fun deviceInfoJson(androidId: String, deviceName: String): String { + return gson.toJson( + DeviceInfo( + androidId = androidId, + deviceName = deviceName + ) + ) } }