Merge branch 'dev' of https://gitlab.com/sminnovations/hpos into dev
This commit is contained in:
3
.idea/gradle.xml
generated
3
.idea/gradle.xml
generated
@@ -4,9 +4,8 @@
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="testRunner" value="GRADLE" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="gradleJvm" value="jbr-17" />
|
||||
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
|
||||
@@ -19,8 +19,8 @@ android {
|
||||
applicationId "in.sminnovations.hpostesting.dev"
|
||||
minSdk 21
|
||||
targetSdk 34
|
||||
versionCode 112
|
||||
versionName "2.1.112"
|
||||
versionCode 114
|
||||
versionName "2.1.114"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
android:screenOrientation="portrait"
|
||||
android:stateNotNeeded="true"
|
||||
tools:replace="android:screenOrientation" />
|
||||
|
||||
<!-- ${applicationId}-->
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${applicationId}.fileprovider"
|
||||
|
||||
@@ -5,7 +5,7 @@ object Constants {
|
||||
const val HEMOCUBE_USB_PERMISSION = "shanmukha.in.sickle_cell_homocube.USB_PERMISSION"
|
||||
|
||||
const val BASE_URL = "www.google.com"
|
||||
|
||||
const val DOCUMENT_ID_FOR_UPDATE ="2o71vBKLqdgEKYtFG8Lb"
|
||||
const val ABHA_APP_PACKAGE = "in.ndhm.phr"
|
||||
|
||||
const val MOLBIO_INTEGRATION = false
|
||||
|
||||
@@ -29,4 +29,8 @@ interface HemoCubeDao {
|
||||
|
||||
@Query("UPDATE hemo_cube_test_table SET isCSVCreated = :newValue WHERE _id = :id")
|
||||
suspend fun updateCSVFieldById(id: String, newValue: Boolean)
|
||||
|
||||
@Query("SELECT * from hemo_cube_test_table WHERE molbioFlag = :status")
|
||||
suspend fun getPendingUser(status: Boolean): List<HemoCubeTestData>
|
||||
|
||||
}
|
||||
@@ -26,4 +26,14 @@ data class DeviceData(
|
||||
var natsToken: String = "",
|
||||
@get:PropertyName("natsTokenExpiry") @set:PropertyName("natsTokenExpiry")
|
||||
var natsTokenExpiry: String = "",
|
||||
@get:PropertyName("deviceUpdateAvailable") @set:PropertyName("deviceUpdateAvailable")
|
||||
var deviceUpdateAvailable: Boolean = false,
|
||||
@get:PropertyName("updatePath") @set:PropertyName("updatePath")
|
||||
var updatePath: String = "",
|
||||
@get:PropertyName("deviceVersion") @set:PropertyName("deviceVersion")
|
||||
var deviceVersion: String = "",
|
||||
@get:PropertyName("globalUpdateDone") @set:PropertyName("globalUpdateDone")
|
||||
var globalUpdateDone: Boolean = false,
|
||||
@get:PropertyName("globalUpdateIgnore") @set:PropertyName("globalUpdateIgnore")
|
||||
var globalUpdateIgnore: Boolean = false,
|
||||
)
|
||||
@@ -125,13 +125,8 @@ class NatsManager(datacollector: DashboardActivity) {
|
||||
|
||||
if (nc?.status == Connection.Status.CONNECTED) {
|
||||
Log.d("NATSCONNECTION", "NATS is successfully connected.")
|
||||
|
||||
val d = nc?.createDispatcher { msg: Message? ->
|
||||
println("Nats dispatcher $msg")
|
||||
}
|
||||
|
||||
nc?.subscribe("device.hpos.${deviceId}.ping")
|
||||
|
||||
// Log.d(TAG, "Nats subscribed with ping-"+d)
|
||||
nc?.publish(
|
||||
"server.hpos.${deviceId}.ping",
|
||||
"ALIVE".toByteArray(StandardCharsets.UTF_8)
|
||||
@@ -140,7 +135,10 @@ class NatsManager(datacollector: DashboardActivity) {
|
||||
"server.hpos.${deviceId}.health",
|
||||
"ALIVE".toByteArray(StandardCharsets.UTF_8)
|
||||
)
|
||||
|
||||
val d = nc?.createDispatcher { msg: Message? ->
|
||||
println("Nats dispatcher $msg")
|
||||
Log.d(TAG, "Nats dispatcher--$msg")
|
||||
}
|
||||
d?.subscribe("device.hpos.${deviceId}.ping") { msg ->
|
||||
val response = String(msg.data, StandardCharsets.UTF_8)
|
||||
datacollector.setResponse(response)
|
||||
@@ -172,10 +170,11 @@ class NatsManager(datacollector: DashboardActivity) {
|
||||
println("Message received (up to 100 times): $response")
|
||||
}
|
||||
|
||||
d?.subscribe("device.hpos.${deviceId}.checkupdate") { msg ->
|
||||
d?.subscribe("device.hpos.${deviceId}.checkUpdate") { msg ->
|
||||
val response = String(msg.data, StandardCharsets.UTF_8)
|
||||
datacollector.setResponse(response)
|
||||
println("Message received (up to 100 times): $response")
|
||||
println("Message received (up to 100 times) on topic checkupdate: $response")
|
||||
Log.d(TAG, "subscribed msg ${msg} on topic checkupdate")
|
||||
}
|
||||
} else {
|
||||
Log.d("NATSCONNECTION", "NATS is not connected. Current status: ${nc?.status}")
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.app.DownloadManager
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.content.SharedPreferences
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
@@ -23,6 +24,7 @@ import androidx.navigation.ui.setupWithNavController
|
||||
import com.example.hpostesting.data.Result
|
||||
import com.example.hpostesting.data.constant.Constants
|
||||
import com.example.hpostesting.data.constant.LanguageManager
|
||||
import com.example.hpostesting.data.model.patient.DeviceData
|
||||
import com.example.hpostesting.presentation.NatsManager
|
||||
import com.example.hpostesting.presentation.hemocube.HemoCubeViewModel
|
||||
import com.example.hpostesting.presentation.jig.JigActivity
|
||||
@@ -30,6 +32,8 @@ import com.google.android.material.navigation.NavigationView
|
||||
import com.google.firebase.appdistribution.FirebaseAppDistribution
|
||||
import com.google.firebase.appdistribution.FirebaseAppDistributionException
|
||||
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
||||
import com.google.firebase.firestore.ktx.firestore
|
||||
import com.google.firebase.ktx.Firebase
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import `in`.sminnovations.hpostesting.R
|
||||
import `in`.sminnovations.hpostesting.databinding.ActivityDashboardBinding
|
||||
@@ -66,6 +70,7 @@ class DashboardActivity : AppCompatActivity(), IDataCollector {
|
||||
|
||||
override fun onMessageReceived(topic: String, message: String) {
|
||||
// Handle incoming messages from NATS
|
||||
|
||||
Log.d(TAG, "Received message on topic $topic: $message")
|
||||
}
|
||||
|
||||
@@ -116,6 +121,7 @@ class DashboardActivity : AppCompatActivity(), IDataCollector {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
val drawerLayout: DrawerLayout = binding.drawerLayout
|
||||
val navView: NavigationView = binding.navView
|
||||
val navController = findNavController(R.id.nav_host_fragment_content_dashboard)
|
||||
@@ -134,6 +140,8 @@ class DashboardActivity : AppCompatActivity(), IDataCollector {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||
// Inflate the menu; this adds items to the action bar if it is present.
|
||||
menuInflater.inflate(R.menu.dashboard, menu)
|
||||
@@ -145,8 +153,8 @@ class DashboardActivity : AppCompatActivity(), IDataCollector {
|
||||
return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
|
||||
}
|
||||
|
||||
private fun initiateUpdate(responseBody: String) {
|
||||
val apkUrl = responseBody
|
||||
private fun initiateUpdate(url: String) {
|
||||
val apkUrl = url
|
||||
if (!isValidHttpUrl(apkUrl)) {
|
||||
return
|
||||
}
|
||||
@@ -161,8 +169,8 @@ class DashboardActivity : AppCompatActivity(), IDataCollector {
|
||||
downloadId = downloadManager.enqueue(request)
|
||||
|
||||
// Register a BroadcastReceiver to receive the download complete event
|
||||
// val filter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
|
||||
// registerReceiver(downloadReceiver, filter)
|
||||
val filter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
|
||||
registerReceiver(downloadReceiver, filter)
|
||||
}
|
||||
private fun extractApkUrl(responseBody: ResponseBody): String {
|
||||
return responseBody.string()
|
||||
@@ -186,7 +194,7 @@ class DashboardActivity : AppCompatActivity(), IDataCollector {
|
||||
val pInfo = baseContext.packageManager.getPackageInfo(baseContext.packageName, 0)
|
||||
val uri: Uri = FileProvider.getUriForFile(
|
||||
this,
|
||||
"${pInfo}.fileprovider",
|
||||
"in.sminnovations.hpostesting.dev.fileprovider",
|
||||
file
|
||||
)
|
||||
|
||||
@@ -207,7 +215,7 @@ class DashboardActivity : AppCompatActivity(), IDataCollector {
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
// unregisterReceiver(downloadReceiver)
|
||||
unregisterReceiver(downloadReceiver)
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
@@ -257,8 +265,8 @@ class DashboardActivity : AppCompatActivity(), IDataCollector {
|
||||
}
|
||||
|
||||
override fun setResponse(response: String) {
|
||||
|
||||
responses = responses+response+"\n"
|
||||
println(responses)
|
||||
Log.d("DashBoardActResponse",response)
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,16 @@
|
||||
package com.example.hpostesting.presentation.dashboard
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.AlertDialog
|
||||
import android.app.DownloadManager
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Context.BATTERY_SERVICE
|
||||
import android.content.DialogInterface
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.content.SharedPreferences
|
||||
import android.net.Uri
|
||||
import android.os.BatteryManager
|
||||
import android.os.Bundle
|
||||
import android.util.Base64
|
||||
@@ -14,6 +19,7 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.Toast
|
||||
import androidx.core.content.FileProvider
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.navigation.fragment.findNavController
|
||||
@@ -47,6 +53,7 @@ import com.google.firebase.perf.ktx.performance
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import `in`.sminnovations.hpostesting.R
|
||||
import `in`.sminnovations.hpostesting.databinding.FragmentHomeBinding
|
||||
import kotlinx.coroutines.tasks.await
|
||||
import okhttp3.ResponseBody
|
||||
import org.json.JSONObject
|
||||
import java.io.BufferedOutputStream
|
||||
@@ -63,6 +70,7 @@ import java.util.zip.ZipInputStream
|
||||
|
||||
@AndroidEntryPoint
|
||||
class HomeFragment : Fragment() {
|
||||
private var downloadId: Long = 0
|
||||
private lateinit var binding: FragmentHomeBinding
|
||||
private val viewModel: TestRightViewModel by activityViewModels()
|
||||
private val hemoCubeViewModel: HemoCubeViewModel by activityViewModels()
|
||||
@@ -95,8 +103,10 @@ class HomeFragment : Fragment() {
|
||||
binding.labelQuickCapture.visibility = View.VISIBLE
|
||||
binding.btnQuickCapture.visibility = View.VISIBLE
|
||||
}
|
||||
|
||||
getDeviceId()
|
||||
checkUnprocessedCSVData()
|
||||
checkForUpdate()
|
||||
viewModel.allUserData.observe(viewLifecycleOwner) { userData ->
|
||||
deleteIncompleteRegistrations(userData)
|
||||
}
|
||||
@@ -1040,5 +1050,158 @@ class HomeFragment : Fragment() {
|
||||
val matchResult = regex.find(receivedData)
|
||||
return matchResult?.groups?.get(1)?.value ?: ""
|
||||
}
|
||||
@SuppressLint("SuspiciousIndentation")
|
||||
private fun checkForUpdate() {
|
||||
try {
|
||||
val db = Firebase.firestore
|
||||
|
||||
val deviceId="HHH-AAA-ZZZ"
|
||||
val deviceRef = db.collection("deviceUpdate").document(Constants.DOCUMENT_ID_FOR_UPDATE)
|
||||
|
||||
deviceRef.get().addOnSuccessListener { documentSnapshot ->
|
||||
if (documentSnapshot.exists()) {
|
||||
|
||||
val deviceData =
|
||||
documentSnapshot.toObject(DeviceData::class.java)
|
||||
|
||||
// deviceData?.let { data ->
|
||||
|
||||
val deviceVersion = deviceData!!.deviceVersion
|
||||
val deviceUpdateAvailableGlobal= deviceData.deviceUpdateAvailable
|
||||
val updatePathGlobal= deviceData.updatePath
|
||||
|
||||
// if(deviceUpdateAvailableGlobal){
|
||||
db.collection("devices").whereEqualTo("deviceId", deviceId).get().addOnSuccessListener { documentSnapshotNew ->
|
||||
if (documentSnapshotNew.documents.isNotEmpty()) {
|
||||
documentSnapshotNew.documents.forEach{
|
||||
val documentIn = it.toObject(DeviceData::class.java)
|
||||
|
||||
val globalUpdateIgnore = documentIn!!.globalUpdateIgnore
|
||||
val deviceUpdateAvailable = documentIn.deviceUpdateAvailable
|
||||
val globalUpdateDone = documentIn.globalUpdateDone
|
||||
val updatePath = documentIn.updatePath
|
||||
if(globalUpdateIgnore){
|
||||
if(deviceUpdateAvailable){
|
||||
val update = db.collection("devices").document(it.id).update("deviceUpdateAvailable",false)
|
||||
update.addOnSuccessListener {
|
||||
Log.d("HomeFragmentUpdate","Device local update done")
|
||||
|
||||
initiateUpdate(updatePath)
|
||||
}.addOnFailureListener{
|
||||
Log.e("fetchDeviceUpdate", "update fail.")
|
||||
}
|
||||
}else{
|
||||
Log.d("HomeFragmentUpdate","Device update not available")
|
||||
}
|
||||
}else{
|
||||
if(!globalUpdateDone){
|
||||
val update = db.collection("devices").document(it.id).update("globalUpdateDone",true)
|
||||
update.addOnSuccessListener {
|
||||
Log.d("HomeFragmentUpdate","Device global update done")
|
||||
|
||||
initiateUpdate(updatePathGlobal)
|
||||
}.addOnFailureListener{
|
||||
Log.e("fetchDeviceUpdate", "update fail.")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
Log.e("fetchDeviceUpdate", "Document does not exist.")
|
||||
}
|
||||
}.addOnFailureListener { exception ->
|
||||
Log.e("fetchDeviceUpdate", "Error fetching device data", exception)
|
||||
}
|
||||
|
||||
|
||||
// Toast.makeText(requireActivity()," true -version."+deviceVersion+"updatePath.."+updatePath,Toast.LENGTH_LONG).show()
|
||||
|
||||
|
||||
// Log for debugging
|
||||
Log.d(
|
||||
"fetchDeviceCredentials",
|
||||
"deviceVersion: $deviceVersion, Password: $deviceUpdateAvailableGlobal, updatePath: $updatePathGlobal"
|
||||
)
|
||||
|
||||
// } ?: Log.e("fetchDeviceUpdate", "Failed to parse device data.")
|
||||
} else {
|
||||
Log.e("fetchDeviceUpdate", "Document does not exist.")
|
||||
}
|
||||
}
|
||||
.addOnFailureListener { exception ->
|
||||
Log.e("fetchDeviceUpdate", "Error fetching device data", exception)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e("fetchDeviceUpdate", "Error in fetchDeviceUpdate", e)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private fun initiateUpdate(url: String) {
|
||||
val apkUrl = url
|
||||
if (!isValidHttpUrl(apkUrl)) {
|
||||
return
|
||||
}
|
||||
|
||||
val request = DownloadManager.Request(Uri.parse(apkUrl))
|
||||
request.setTitle("App Update")
|
||||
request.setDescription("Downloading update...")
|
||||
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
|
||||
request.setDestinationInExternalFilesDir(requireActivity(), "Updates", "update.apk")
|
||||
|
||||
val downloadManager = requireActivity().getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
|
||||
downloadId = downloadManager.enqueue(request)
|
||||
|
||||
// Register a BroadcastReceiver to receive the download complete event
|
||||
val filter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
|
||||
requireActivity().registerReceiver(downloadReceiver, filter)
|
||||
}
|
||||
private fun extractApkUrl(responseBody: ResponseBody): String {
|
||||
return responseBody.string()
|
||||
}
|
||||
private fun isValidHttpUrl(url: String): Boolean {
|
||||
return url.startsWith("http://") || url.startsWith("https://")
|
||||
}
|
||||
private val downloadReceiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
val id = intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)
|
||||
if (id == downloadId) {
|
||||
installApk()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun installApk() {
|
||||
val file = File(requireActivity().getExternalFilesDir("Updates"), "update.apk")
|
||||
file.setReadable(true, false) // Ensure the file is readable
|
||||
|
||||
val pInfo = requireActivity().baseContext.packageManager.getPackageInfo(requireActivity().baseContext.packageName, 0)
|
||||
Log.d("HomeFragmentShowInfo",pInfo.packageName.toString())
|
||||
val uri: Uri = FileProvider.getUriForFile(
|
||||
requireActivity(),
|
||||
"${pInfo.packageName}.fileprovider",
|
||||
file
|
||||
)
|
||||
|
||||
// Create an intent to install the APK
|
||||
val installIntent = Intent(Intent.ACTION_INSTALL_PACKAGE)
|
||||
installIntent.data = uri
|
||||
installIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or
|
||||
Intent.FLAG_ACTIVITY_NEW_TASK or
|
||||
Intent.FLAG_ACTIVITY_CLEAR_TOP
|
||||
installIntent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
|
||||
|
||||
// Start the installation
|
||||
startActivity(installIntent)
|
||||
|
||||
Log.d("InstallApk", "Install Intent URI: $uri")
|
||||
Log.d("InstallApk", "Package Name: ${requireActivity().packageName}")
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
requireActivity().unregisterReceiver(downloadReceiver)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -587,8 +587,7 @@ class HemoCubeFragment : Fragment() {
|
||||
led1Gain4 = resultLines[5].split(' ')[1].trim().toDoubleOrNull()!!
|
||||
led2Gain4 = resultLines[6].split(' ')[1].trim().toDoubleOrNull()!!
|
||||
led3Gain4 = resultLines[7].split(' ')[1].trim().toDoubleOrNull()!!
|
||||
led4Gain4 =
|
||||
resultLines[8].split(' ')[1].split('\r')[0].trim().toDoubleOrNull()!!
|
||||
led4Gain4 = resultLines[8].split(' ')[1].split('\r')[0].trim().toDoubleOrNull()!!
|
||||
}
|
||||
|
||||
finishReading()
|
||||
|
||||
@@ -88,6 +88,7 @@ class HemoCubeViewModel @Inject constructor(
|
||||
|
||||
private val _networkStatusLiveData = NetworkStatusLiveData(context)
|
||||
val allUserData = hemoCubeDao.getAll()
|
||||
val allPendingUserToUpload = MutableLiveData<List<HemoCubeTestData>>()
|
||||
val allKitTestData = hemoCubeBufferDao.getAll()
|
||||
val deviceData = MutableLiveData<DeviceData?>()
|
||||
|
||||
@@ -186,6 +187,9 @@ class HemoCubeViewModel @Inject constructor(
|
||||
}
|
||||
}
|
||||
}
|
||||
fun uploadPendingUser() = viewModelScope.launch {
|
||||
allPendingUserToUpload.postValue(hemoCubeDao.getPendingUser(false))
|
||||
}
|
||||
|
||||
fun uploadHemoCubeResultToDatabaseForBufferCheck(
|
||||
isOnline: Boolean,
|
||||
@@ -408,6 +412,8 @@ class HemoCubeViewModel @Inject constructor(
|
||||
Log.e("Testdb", "Error uploading data to Firestore: $response")
|
||||
fireBaseUpload.postValue("Error")
|
||||
}
|
||||
|
||||
else -> {}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e("Testdb", "Exception during data upload: ${e.message}")
|
||||
|
||||
@@ -17,4 +17,4 @@
|
||||
android:icon="@drawable/baseline_settings_24"
|
||||
android:title="@string/menu_settings" />
|
||||
</group>
|
||||
</menu>
|
||||
</menu>
|
||||
|
||||
@@ -3,7 +3,7 @@ buildscript {
|
||||
kotlin_version = '1.8.21'
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.1.1'
|
||||
classpath 'com.android.tools.build:gradle:8.2.2'
|
||||
classpath 'com.google.gms:google-services:4.4.0'
|
||||
classpath 'com.google.firebase:firebase-appdistribution-gradle:4.0.1'
|
||||
}
|
||||
|
||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
||||
#Mon Jun 12 17:07:47 IST 2023
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
Reference in New Issue
Block a user