From 049fc182979c697bc9097f7a8e89880a0936354b Mon Sep 17 00:00:00 2001 From: Avior Date: Mon, 20 Dec 2021 23:19:13 +0100 Subject: [PATCH] Finally have GoogleFit YaY --- .idea/deploymentTargetDropDown.xml | 17 - .idea/misc.xml | 1 + app/src/main/AndroidManifest.xml | 2 +- app/src/main/ic_launcher-playstore.png | Bin 0 -> 16922 bytes .../java/com/dzeio/openhealth/MainActivity.kt | 3 + .../connectors/ConnectorInterface.kt | 21 + .../dzeio/openhealth/connectors/DataType.kt | 5 + .../dzeio/openhealth/connectors/GoogleFit.kt | 299 +++----------- .../openhealth/connectors/GoogleFit.kt.old | 376 ++++++++++++++++++ .../connectors/samsunghealth/SamsungHealth.kt | 177 ++++----- .../samsunghealth/StepCountReporter.kt | 88 ++++ .../dzeio/openhealth/data/weight/WeightDao.kt | 3 + .../data/weight/WeightRepository.kt | 1 + .../ui/main/import/ImportViewModel.kt | 21 - .../{import => imports}/ImportFragment.kt | 116 +++--- .../ui/main/imports/ImportViewModel.kt | 32 ++ .../ui/main/list_weight/ListWeightFragment.kt | 9 +- .../drawable-v24/ic_launcher_foreground.xml | 65 ++- .../res/drawable/ic_launcher_background.xml | 170 -------- app/src/main/res/drawable/ic_logo_app.xml | 46 +++ .../main/res/drawable/ic_logo_app_white.xml | 35 ++ .../main/res/drawable/ic_logo_background.xml | 21 + app/src/main/res/layout/fragment_import.xml | 2 +- .../res/mipmap-anydpi-v26/ic_launcher.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 4 +- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2269 bytes app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4168 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1480 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2654 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3050 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5946 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4442 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 9046 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5613 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 13253 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 0 bytes .../main/res/navigation/mobile_navigation.xml | 2 +- .../res/values/ic_launcher_background.xml | 4 + 47 files changed, 901 insertions(+), 623 deletions(-) delete mode 100644 .idea/deploymentTargetDropDown.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/com/dzeio/openhealth/connectors/ConnectorInterface.kt create mode 100644 app/src/main/java/com/dzeio/openhealth/connectors/DataType.kt create mode 100644 app/src/main/java/com/dzeio/openhealth/connectors/GoogleFit.kt.old create mode 100644 app/src/main/java/com/dzeio/openhealth/connectors/samsunghealth/StepCountReporter.kt delete mode 100644 app/src/main/java/com/dzeio/openhealth/ui/main/import/ImportViewModel.kt rename app/src/main/java/com/dzeio/openhealth/ui/main/{import => imports}/ImportFragment.kt (60%) create mode 100644 app/src/main/java/com/dzeio/openhealth/ui/main/imports/ImportViewModel.kt delete mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_logo_app.xml create mode 100644 app/src/main/res/drawable/ic_logo_app_white.xml create mode 100644 app/src/main/res/drawable/ic_logo_background.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values/ic_launcher_background.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 7e7f500..0000000 --- a/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index e30b29b..7318686 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -7,6 +7,7 @@ + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 069b7f2..415d8e3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,7 +23,7 @@ + android:value="com.samsung.health.step_count" /> h`u{)vujqlmy;JXmp|(vIo}9@r?hFi^NHFh^ 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 literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/dzeio/openhealth/MainActivity.kt b/app/src/main/java/com/dzeio/openhealth/MainActivity.kt index 6d0f55e..a79d649 100644 --- a/app/src/main/java/com/dzeio/openhealth/MainActivity.kt +++ b/app/src/main/java/com/dzeio/openhealth/MainActivity.kt @@ -65,6 +65,9 @@ class MainActivity : BaseActivity() { ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) Log.d("MainActivity", "Result $requestCode") + for (fragment in supportFragmentManager.primaryNavigationFragment!!.childFragmentManager.fragments) { + fragment.onRequestPermissionsResult(requestCode, permissions, grantResults) + } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/app/src/main/java/com/dzeio/openhealth/connectors/ConnectorInterface.kt b/app/src/main/java/com/dzeio/openhealth/connectors/ConnectorInterface.kt new file mode 100644 index 0000000..ced0e76 --- /dev/null +++ b/app/src/main/java/com/dzeio/openhealth/connectors/ConnectorInterface.kt @@ -0,0 +1,21 @@ +package com.dzeio.openhealth.connectors + +import android.app.Activity +import android.content.Intent +import com.dzeio.openhealth.data.weight.Weight + +interface ConnectorInterface { + + val sourceID: String + + /** + * Same as Activity/Fragment onRequestPermissionResult + * + * But it will only be launched if grantResults[0] == PackageManager.PERMISSION_GRANTED + */ + fun onRequestPermissionResult(requestCode: Int, permission: Array, grantResult: IntArray) + + fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) + + fun importWeight(callback: (weight: Weight, end: Boolean) -> Unit) +} \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/connectors/DataType.kt b/app/src/main/java/com/dzeio/openhealth/connectors/DataType.kt new file mode 100644 index 0000000..7d8f84a --- /dev/null +++ b/app/src/main/java/com/dzeio/openhealth/connectors/DataType.kt @@ -0,0 +1,5 @@ +package com.dzeio.openhealth.connectors + +enum class DataType { + WEIGHT +} \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/connectors/GoogleFit.kt b/app/src/main/java/com/dzeio/openhealth/connectors/GoogleFit.kt index b9f6231..c078755 100644 --- a/app/src/main/java/com/dzeio/openhealth/connectors/GoogleFit.kt +++ b/app/src/main/java/com/dzeio/openhealth/connectors/GoogleFit.kt @@ -2,108 +2,51 @@ package com.dzeio.openhealth.connectors import android.Manifest import android.app.Activity +import android.content.Intent import android.content.pm.PackageManager import android.os.Build import android.util.Log import androidx.annotation.RequiresApi import androidx.core.app.ActivityCompat -import com.dzeio.openhealth.data.AppDatabase import com.dzeio.openhealth.data.weight.Weight import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.android.gms.fitness.Fitness import com.google.android.gms.fitness.FitnessOptions import com.google.android.gms.fitness.data.DataPoint import com.google.android.gms.fitness.data.DataSet -import com.google.android.gms.fitness.data.DataSource import com.google.android.gms.fitness.data.DataType import com.google.android.gms.fitness.request.DataReadRequest -import com.google.android.gms.fitness.request.DataSourcesRequest -import com.google.android.gms.fitness.request.OnDataPointListener -import com.google.android.gms.fitness.request.SensorRequest import java.text.DateFormat import java.text.SimpleDateFormat import java.time.* import java.util.* import java.util.concurrent.TimeUnit -enum class ActionRequestCode { - FIND_DATA_SOURCES -} - class GoogleFit( private val activity: Activity, -) { +) : ConnectorInterface { companion object { const val TAG = "GoogleFitConnector" } -// private val fitnessOptions = FitnessOptions.builder() -// .addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_READ) -// .addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_WRITE) -// -// .addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_READ) -// .addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_WRITE) -// -// .addDataType(DataType.TYPE_HEIGHT, FitnessOptions.ACCESS_READ) -// .addDataType(DataType.TYPE_HEIGHT, FitnessOptions.ACCESS_WRITE) -// -// .addDataType(DataType.TYPE_WEIGHT, FitnessOptions.ACCESS_READ) -// .addDataType(DataType.TYPE_WEIGHT, FitnessOptions.ACCESS_WRITE) -// .build() + + override val sourceID: String = "GoogleFit" private val fitnessOptions = FitnessOptions.builder() -// .addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE) -// .addDataType(DataType.TYPE_ACTIVITY_SEGMENT) -// .addDataType(DataType.TYPE_SLEEP_SEGMENT) -// .addDataType(DataType.TYPE_CALORIES_EXPENDED) -// .addDataType(DataType.TYPE_BASAL_METABOLIC_RATE) -// .addDataType(DataType.TYPE_POWER_SAMPLE) -// .addDataType(DataType.TYPE_HEART_RATE_BPM) -// .addDataType(DataType.TYPE_LOCATION_SAMPLE) .addDataType(DataType.TYPE_WEIGHT) .build() private val runningQOrLater = - android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q - - // [START dataPointListener_variable_reference] - // Need to hold a reference to this listener, as it's passed into the "unregister" - // method in order to stop all sensors from sending data to this listener. - private var dataPointListener: OnDataPointListener? = null + Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q fun import() { - checkPermissionsAndRun(ActionRequestCode.FIND_DATA_SOURCES) + checkPermissionsAndRun() } - private fun checkPermissionsAndRun(actionRequestCode: ActionRequestCode) { + private fun checkPermissionsAndRun() { if (permissionApproved()) { - signIn(actionRequestCode) + signIn(0) } else { - requestRuntimePermissions(actionRequestCode) - } - } - - private fun requestRuntimePermissions(requestCode: ActionRequestCode) { - val shouldProvideRationale = - ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_FINE_LOCATION) - - // Provide an additional rationale to the user. This would happen if the user denied the - // request previously, but didn't check the "Don't ask again" checkbox. - requestCode.let { - if (shouldProvideRationale) { - Log.i(TAG, "Displaying permission rationale to provide additional context.") -// ProgressDialog.show(activity, "Waiting for authorization...", "") - ActivityCompat.requestPermissions(activity, - arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), - requestCode.ordinal) - } else { - Log.i(TAG, "Requesting permission") - // Request permission. It's possible this can be auto answered if device policy - // sets the permission in a given state or the user denied the permission - // previously and checked "Never ask again". - ActivityCompat.requestPermissions(activity, - arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), - requestCode.ordinal) - } + requestRuntimePermissions() } } @@ -118,15 +61,41 @@ class GoogleFit( return approved } - fun signIn(requestCode: ActionRequestCode) { - if (oAuthPermissionsApproved()) { - performActionForRequestCode(requestCode) + private fun requestRuntimePermissions() { + val shouldProvideRationale = + ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_FINE_LOCATION) + + // Provide an additional rationale to the user. This would happen if the user denied the + // request previously, but didn't check the "Don't ask again" checkbox. + if (shouldProvideRationale) { + Log.i(TAG, "Displaying permission rationale to provide additional context.") +// ProgressDialog.show(activity, "Waiting for authorization...", "") + ActivityCompat.requestPermissions(activity, + arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), + 0) } else { + Log.i(TAG, "Requesting permission") + // Request permission. It's possible this can be auto answered if device policy + // sets the permission in a given state or the user denied the permission + // previously and checked "Never ask again". + ActivityCompat.requestPermissions(activity, + arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), + 0) + } + } + + private fun signIn(requestCode: Int) { + if (oAuthPermissionsApproved()) { + Log.d("GoogleFitImporter", "Starting Import") + internalImportWeight() + } else { + Log.d("GoogleFitImporter", "Requesting Permission") requestCode.let { GoogleSignIn.requestPermissions( activity, - it.ordinal, + it, getGoogleAccount(), fitnessOptions) + } } } @@ -141,103 +110,7 @@ class GoogleFit( */ private fun getGoogleAccount() = GoogleSignIn.getAccountForExtension(activity, fitnessOptions) - /** - * Runs the desired method, based on the specified request code. The request code is typically - * passed to the Fit sign-in flow, and returned with the success callback. This allows the - * caller to specify which method, post-sign-in, should be called. - * - * @param requestCode The code corresponding to the action to perform. - */ - fun performActionForRequestCode(requestCode: ActionRequestCode) = when (requestCode) { - ActionRequestCode.FIND_DATA_SOURCES -> findFitnessDataSources() - } - - /** Finds available data sources and attempts to register on a specific [DataType]. */ - private fun findFitnessDataSources() { // [START find_data_sources] - // Note: Fitness.SensorsApi.findDataSources() requires the ACCESS_FINE_LOCATION permission. - Fitness.getSensorsClient(activity, getGoogleAccount()) - .findDataSources( - DataSourcesRequest.Builder() - .setDataTypes(DataType.TYPE_LOCATION_SAMPLE) - .setDataSourceTypes(DataSource.TYPE_RAW) - .build()) - .addOnSuccessListener { dataSources -> - for (dataSource in dataSources) { - Log.i(TAG, "Data source found: $dataSource") - Log.i(TAG, "Data Source type: " + dataSource.dataType.name) - // Let's register a listener to receive Activity data! - if (dataSource.dataType == DataType.TYPE_LOCATION_SAMPLE && dataPointListener == null) { - Log.i(TAG, "Data source for LOCATION_SAMPLE found! Registering.") - registerFitnessDataListener(dataSource, DataType.TYPE_LOCATION_SAMPLE) - } - } - } - .addOnFailureListener { e -> Log.e(TAG, "failed", e) } - // [END find_data_sources] - } - - /** - * Registers a listener with the Sensors API for the provided [DataSource] and [DataType] combo. - */ - private fun registerFitnessDataListener(dataSource: DataSource, dataType: DataType) { - // [START register_data_listener] - dataPointListener = OnDataPointListener { dataPoint -> - for (field in dataPoint.dataType.fields) { - val value = dataPoint.getValue(field) - Log.i(TAG, "Detected DataPoint field: ${field.name}") - Log.i(TAG, "Detected DataPoint value: $value") - } - } - Fitness.getSensorsClient(activity, getGoogleAccount()) - .add( - SensorRequest.Builder() - .setDataSource(dataSource) // Optional but recommended for custom data sets. - .setDataType(dataType) // Can't be omitted. - .setSamplingRate(10, TimeUnit.SECONDS) - .build(), - dataPointListener!! - ) - .addOnCompleteListener { task -> - if (task.isSuccessful) { - Log.i(TAG, "Listener registered!") - } else { - Log.e(TAG, "Listener not registered.", task.exception) - } - } - // [END register_data_listener] - } - - @RequiresApi(Build.VERSION_CODES.O) - fun getHistory() { - - val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")) - val now = Date() - calendar.time = now - val endTime = calendar.timeInMillis - calendar.set(Calendar.YEAR, 2013) // Set year to 2013 to be sure to get data from when Google Fit Started to today - val startTime = calendar.timeInMillis - val readRequest = DataReadRequest.Builder() - .aggregate(DataType.AGGREGATE_CALORIES_EXPENDED) - .bucketByActivityType(1, TimeUnit.SECONDS) - .setTimeRange(startTime, endTime, TimeUnit.SECONDS) - .build() - - Fitness.getHistoryClient(activity, GoogleSignIn.getAccountForExtension(activity, fitnessOptions)) - .readData(readRequest) - .addOnSuccessListener { response -> - // The aggregate query puts datasets into buckets, so flatten into a - // single list of datasets - for (dataSet in response.buckets.flatMap { it.dataSets }) { - dumpDataSet(dataSet) - } - } - .addOnFailureListener { e -> - Log.w(TAG,"There was an error reading data from Google Fit", e) - } - - } - - fun importWeight(callback : () -> Unit) { + private fun internalImportWeight() { val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")) val now = Date() @@ -257,7 +130,7 @@ class GoogleFit( // In this example, it's very unlikely that the request is for several hundred // datapoints each consisting of a few steps and a timestamp. The more likely // scenario is wanting to see how many steps were walked per day, for 7 days. -// .aggregate() +// .aggregate(DataType.AGGREGATE_WEIGHT_SUMMARY) .read(DataType.TYPE_WEIGHT) // Analogous to a "Group By" in SQL, defines how data should be aggregated. @@ -267,110 +140,68 @@ class GoogleFit( // .bucketByActivityType(1, TimeUnit.SECONDS) // .bucketBySession() .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) - .build(), callback) + .build()) } - private fun runRequest(request: DataReadRequest, callback: () -> Unit) { + private fun runRequest(request: DataReadRequest) { Fitness.getHistoryClient(activity, GoogleSignIn.getAccountForExtension(activity, fitnessOptions)) .readData(request) .addOnSuccessListener { response -> // The aggregate query puts datasets into buckets, so flatten into a // single list of datasets - Log.d(TAG, "Received response! ${response.dataSets.size} ${response.buckets.size}") + Log.d(TAG, "Received response! ${response.dataSets.size} ${response.buckets.size} ${response.status}") for (dataSet in response.dataSets) { dumpDataSet(dataSet) } - for (dataSet in response.buckets.flatMap { it.dataSets }) { - dumpDataSet(dataSet) - } - callback.invoke() +// for (dataSet in response.buckets.flatMap { it.dataSets }) { +// dumpDataSet(dataSet) +// } } .addOnFailureListener { e -> Log.w(TAG,"There was an error reading data from Google Fit", e) - callback.invoke() } } private fun dumpDataSet(dataSet: DataSet) { Log.i(TAG, "Data returned for Data type: ${dataSet.dataType.name} ${dataSet.dataPoints.size}") - for (dp in dataSet.dataPoints) { + dataSet.dataPoints.forEachIndexed { index, dp -> val weight = Weight() Log.i(TAG,"Data point:") Log.i(TAG,"\tType: ${dp.dataType.name}") Log.i(TAG,"\tStart: ${dp.getStartTimeString()}") Log.i(TAG,"\tEnd: ${dp.getEndTimeString()}") - weight.timestamp = dp.getStartTime(TimeUnit.SECONDS) + weight.timestamp = dp.getStartTime(TimeUnit.MILLISECONDS) weight.source = "GoogleFit" for (field in dp.dataType.fields) { weight.weight = dp.getValue(field).asFloat() Log.i(TAG,"\tField: ${field.name.toString()} Value: ${dp.getValue(field)}") + callback(weight, (index + 1) == dataSet.dataPoints.size) } - // AppDatabase.getInstance(activity).weightDao().insert(weight) } } - fun DataPoint.getStartTimeString(): String = - SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS", Locale.FRANCE) - .format(Date(this.getStartTime(TimeUnit.SECONDS) * 1000L)) + fun DataPoint.getStartTimeString(): String = Date(this.getStartTime(TimeUnit.SECONDS) * 1000L).toLocaleString() - fun DataPoint.getEndTimeString(): String = - SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS", Locale.FRANCE) - .format(Date(this.getEndTime(TimeUnit.SECONDS) * 1000L)) + fun DataPoint.getEndTimeString(): String = Date(this.getEndTime(TimeUnit.SECONDS) * 1000L).toLocaleString() - - /** Unregisters the listener with the Sensors API. */ - private fun unregisterFitnessDataListener() { - if (dataPointListener == null) { - // This code only activates one listener at a time. If there's no listener, there's - // nothing to unregister. - return - } - // [START unregister_data_listener] - // Waiting isn't actually necessary as the unregister call will complete regardless, - // even if called from within onStop, but a callback can still be added in order to - // inspect the results. - Fitness.getSensorsClient(activity, getGoogleAccount()) - .remove(dataPointListener!!) - .addOnCompleteListener { task -> - if (task.isSuccessful && task.result!!) { - Log.i(TAG, "Listener was removed!") - } else { - Log.i(TAG, "Listener was not removed.") - } - } - // [END unregister_data_listener] + override fun onRequestPermissionResult( + requestCode: Int, + permission: Array, + grantResult: IntArray + ) { + signIn(requestCode) } - /** Returns a [DataReadRequest] for all step count changes in the past week. */ - private fun queryFitnessData(): DataReadRequest { - // [START build_read_data_request] - // Setting a start and end date using a range of 1 week before this moment. - val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")) - val now = Date() - calendar.time = now - val endTime = calendar.timeInMillis - calendar.add(Calendar.YEAR, -1) - val startTime = calendar.timeInMillis + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + signIn(requestCode) + } - val dateFormat = DateFormat.getDateInstance() - Log.i(TAG, "Range Start: ${dateFormat.format(startTime)}") - Log.i(TAG, "Range End: ${dateFormat.format(endTime)}") + private lateinit var callback: (weight: Weight, end: Boolean) -> Unit - return DataReadRequest.Builder() - // The data request can specify multiple data types to return, effectively - // combining multiple data queries into one call. - // In this example, it's very unlikely that the request is for several hundred - // datapoints each consisting of a few steps and a timestamp. The more likely - // scenario is wanting to see how many steps were walked per day, for 7 days. - .aggregate(DataType.TYPE_STEP_COUNT_DELTA) - // Analogous to a "Group By" in SQL, defines how data should be aggregated. - // bucketByTime allows for a time span, whereas bucketBySession would allow - // bucketing by "sessions", which would need to be defined in code. - .bucketByTime(1, TimeUnit.SECONDS) -// .bucketBySession() - .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) - .build() + override fun importWeight(callback: (weight: Weight, end: Boolean) -> Unit) { + this.callback = callback + checkPermissionsAndRun() } } \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/connectors/GoogleFit.kt.old b/app/src/main/java/com/dzeio/openhealth/connectors/GoogleFit.kt.old new file mode 100644 index 0000000..2d5e17c --- /dev/null +++ b/app/src/main/java/com/dzeio/openhealth/connectors/GoogleFit.kt.old @@ -0,0 +1,376 @@ +package com.dzeio.openhealth.connectors + +import android.Manifest +import android.app.Activity +import android.content.pm.PackageManager +import android.os.Build +import android.util.Log +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import com.dzeio.openhealth.data.AppDatabase +import com.dzeio.openhealth.data.weight.Weight +import com.google.android.gms.auth.api.signin.GoogleSignIn +import com.google.android.gms.fitness.Fitness +import com.google.android.gms.fitness.FitnessOptions +import com.google.android.gms.fitness.data.DataPoint +import com.google.android.gms.fitness.data.DataSet +import com.google.android.gms.fitness.data.DataSource +import com.google.android.gms.fitness.data.DataType +import com.google.android.gms.fitness.request.DataReadRequest +import com.google.android.gms.fitness.request.DataSourcesRequest +import com.google.android.gms.fitness.request.OnDataPointListener +import com.google.android.gms.fitness.request.SensorRequest +import java.text.DateFormat +import java.text.SimpleDateFormat +import java.time.* +import java.util.* +import java.util.concurrent.TimeUnit + +enum class ActionRequestCode { + FIND_DATA_SOURCES +} + +class GoogleFit( + private val activity: Activity, +) { + companion object { + const val TAG = "GoogleFitConnector" + } +// private val fitnessOptions = FitnessOptions.builder() +// .addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_READ) +// .addDataType(DataType.TYPE_ACTIVITY_SEGMENT, FitnessOptions.ACCESS_WRITE) +// +// .addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_READ) +// .addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_WRITE) +// +// .addDataType(DataType.TYPE_HEIGHT, FitnessOptions.ACCESS_READ) +// .addDataType(DataType.TYPE_HEIGHT, FitnessOptions.ACCESS_WRITE) +// +// .addDataType(DataType.TYPE_WEIGHT, FitnessOptions.ACCESS_READ) +// .addDataType(DataType.TYPE_WEIGHT, FitnessOptions.ACCESS_WRITE) +// .build() + + private val fitnessOptions = FitnessOptions.builder() +// .addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE) +// .addDataType(DataType.TYPE_ACTIVITY_SEGMENT) +// .addDataType(DataType.TYPE_SLEEP_SEGMENT) +// .addDataType(DataType.TYPE_CALORIES_EXPENDED) +// .addDataType(DataType.TYPE_BASAL_METABOLIC_RATE) +// .addDataType(DataType.TYPE_POWER_SAMPLE) +// .addDataType(DataType.TYPE_HEART_RATE_BPM) +// .addDataType(DataType.TYPE_LOCATION_SAMPLE) + .addDataType(DataType.TYPE_WEIGHT) + .build() + + private val runningQOrLater = + Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q + + // [START dataPointListener_variable_reference] + // Need to hold a reference to this listener, as it's passed into the "unregister" + // method in order to stop all sensors from sending data to this listener. + private var dataPointListener: OnDataPointListener? = null + + fun import() { + checkPermissionsAndRun(ActionRequestCode.FIND_DATA_SOURCES) + } + + private fun checkPermissionsAndRun(actionRequestCode: ActionRequestCode) { + if (permissionApproved()) { + signIn(actionRequestCode) + } else { + requestRuntimePermissions(actionRequestCode) + } + } + + private fun requestRuntimePermissions(requestCode: ActionRequestCode) { + val shouldProvideRationale = + ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_FINE_LOCATION) + + // Provide an additional rationale to the user. This would happen if the user denied the + // request previously, but didn't check the "Don't ask again" checkbox. + requestCode.let { + if (shouldProvideRationale) { + Log.i(TAG, "Displaying permission rationale to provide additional context.") +// ProgressDialog.show(activity, "Waiting for authorization...", "") + ActivityCompat.requestPermissions(activity, + arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), + requestCode.ordinal) + } else { + Log.i(TAG, "Requesting permission") + // Request permission. It's possible this can be auto answered if device policy + // sets the permission in a given state or the user denied the permission + // previously and checked "Never ask again". + ActivityCompat.requestPermissions(activity, + arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), + requestCode.ordinal) + } + } + } + + private fun permissionApproved(): Boolean { + val approved = if (runningQOrLater) { + PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission( + activity, + Manifest.permission.ACCESS_FINE_LOCATION) + } else { + true + } + return approved + } + + fun signIn(requestCode: ActionRequestCode) { + if (oAuthPermissionsApproved()) { + performActionForRequestCode(requestCode) + } else { + requestCode.let { + GoogleSignIn.requestPermissions( + activity, + it.ordinal, + getGoogleAccount(), fitnessOptions) + } + } + } + + private fun oAuthPermissionsApproved() = GoogleSignIn.hasPermissions(getGoogleAccount(), fitnessOptions) + + /** + * Gets a Google account for use in creating the Fitness client. This is achieved by either + * using the last signed-in account, or if necessary, prompting the user to sign in. + * `getAccountForExtension` is recommended over `getLastSignedInAccount` as the latter can + * return `null` if there has been no sign in before. + */ + private fun getGoogleAccount() = GoogleSignIn.getAccountForExtension(activity, fitnessOptions) + + /** + * Runs the desired method, based on the specified request code. The request code is typically + * passed to the Fit sign-in flow, and returned with the success callback. This allows the + * caller to specify which method, post-sign-in, should be called. + * + * @param requestCode The code corresponding to the action to perform. + */ + fun performActionForRequestCode(requestCode: ActionRequestCode) = when (requestCode) { + ActionRequestCode.FIND_DATA_SOURCES -> findFitnessDataSources() + } + + /** Finds available data sources and attempts to register on a specific [DataType]. */ + private fun findFitnessDataSources() { // [START find_data_sources] + // Note: Fitness.SensorsApi.findDataSources() requires the ACCESS_FINE_LOCATION permission. + Fitness.getSensorsClient(activity, getGoogleAccount()) + .findDataSources( + DataSourcesRequest.Builder() + .setDataTypes(DataType.TYPE_LOCATION_SAMPLE) + .setDataSourceTypes(DataSource.TYPE_RAW) + .build()) + .addOnSuccessListener { dataSources -> + for (dataSource in dataSources) { + Log.i(TAG, "Data source found: $dataSource") + Log.i(TAG, "Data Source type: " + dataSource.dataType.name) + // Let's register a listener to receive Activity data! + if (dataSource.dataType == DataType.TYPE_LOCATION_SAMPLE && dataPointListener == null) { + Log.i(TAG, "Data source for LOCATION_SAMPLE found! Registering.") + registerFitnessDataListener(dataSource, DataType.TYPE_LOCATION_SAMPLE) + } + } + } + .addOnFailureListener { e -> Log.e(TAG, "failed", e) } + // [END find_data_sources] + } + + /** + * Registers a listener with the Sensors API for the provided [DataSource] and [DataType] combo. + */ + private fun registerFitnessDataListener(dataSource: DataSource, dataType: DataType) { + // [START register_data_listener] + dataPointListener = OnDataPointListener { dataPoint -> + for (field in dataPoint.dataType.fields) { + val value = dataPoint.getValue(field) + Log.i(TAG, "Detected DataPoint field: ${field.name}") + Log.i(TAG, "Detected DataPoint value: $value") + } + } + Fitness.getSensorsClient(activity, getGoogleAccount()) + .add( + SensorRequest.Builder() + .setDataSource(dataSource) // Optional but recommended for custom data sets. + .setDataType(dataType) // Can't be omitted. + .setSamplingRate(10, TimeUnit.SECONDS) + .build(), + dataPointListener!! + ) + .addOnCompleteListener { task -> + if (task.isSuccessful) { + Log.i(TAG, "Listener registered!") + } else { + Log.e(TAG, "Listener not registered.", task.exception) + } + } + // [END register_data_listener] + } + + @RequiresApi(Build.VERSION_CODES.O) + fun getHistory() { + + val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")) + val now = Date() + calendar.time = now + val endTime = calendar.timeInMillis + calendar.set(Calendar.YEAR, 2013) // Set year to 2013 to be sure to get data from when Google Fit Started to today + val startTime = calendar.timeInMillis + val readRequest = DataReadRequest.Builder() + .aggregate(DataType.AGGREGATE_CALORIES_EXPENDED) + .bucketByActivityType(1, TimeUnit.SECONDS) + .setTimeRange(startTime, endTime, TimeUnit.SECONDS) + .build() + + Fitness.getHistoryClient(activity, GoogleSignIn.getAccountForExtension(activity, fitnessOptions)) + .readData(readRequest) + .addOnSuccessListener { response -> + // The aggregate query puts datasets into buckets, so flatten into a + // single list of datasets + for (dataSet in response.buckets.flatMap { it.dataSets }) { + dumpDataSet(dataSet) + } + } + .addOnFailureListener { e -> + Log.w(TAG,"There was an error reading data from Google Fit", e) + } + + } + + fun importWeight(callback : () -> Unit) { + + val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")) + val now = Date() + calendar.time = now + val endTime = calendar.timeInMillis + calendar.set(Calendar.YEAR, 2013) // Set year to 2013 to be sure to get data from when Google Fit Started to today + val startTime = calendar.timeInMillis + + val dateFormat = DateFormat.getDateInstance() + Log.i(TAG, "Range Start: ${dateFormat.format(startTime)}") + Log.i(TAG, "Range End: ${dateFormat.format(endTime)}") + + + runRequest(DataReadRequest.Builder() + // The data request can specify multiple data types to return, effectively + // combining multiple data queries into one call. + // In this example, it's very unlikely that the request is for several hundred + // datapoints each consisting of a few steps and a timestamp. The more likely + // scenario is wanting to see how many steps were walked per day, for 7 days. +// .aggregate() + .read(DataType.TYPE_WEIGHT) + + // Analogous to a "Group By" in SQL, defines how data should be aggregated. + // bucketByTime allows for a time span, whereas bucketBySession would allow + // bucketing by "sessions", which would need to be defined in code. +// .bucketByTime(1, TimeUnit.MINUTES) +// .bucketByActivityType(1, TimeUnit.SECONDS) +// .bucketBySession() + .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) + .build(), callback) + + } + + private fun runRequest(request: DataReadRequest, callback: () -> Unit) { + Fitness.getHistoryClient(activity, GoogleSignIn.getAccountForExtension(activity, fitnessOptions)) + .readData(request) + .addOnSuccessListener { response -> + // The aggregate query puts datasets into buckets, so flatten into a + // single list of datasets + Log.d(TAG, "Received response! ${response.dataSets.size} ${response.buckets.size}") + for (dataSet in response.dataSets) { + dumpDataSet(dataSet) + } + for (dataSet in response.buckets.flatMap { it.dataSets }) { + dumpDataSet(dataSet) + } + callback.invoke() + } + .addOnFailureListener { e -> + Log.w(TAG,"There was an error reading data from Google Fit", e) + callback.invoke() + } + } + + private fun dumpDataSet(dataSet: DataSet) { + Log.i(TAG, "Data returned for Data type: ${dataSet.dataType.name} ${dataSet.dataPoints.size}") + for (dp in dataSet.dataPoints) { + val weight = Weight() + Log.i(TAG,"Data point:") + Log.i(TAG,"\tType: ${dp.dataType.name}") + Log.i(TAG,"\tStart: ${dp.getStartTimeString()}") + Log.i(TAG,"\tEnd: ${dp.getEndTimeString()}") + weight.timestamp = dp.getStartTime(TimeUnit.SECONDS) + weight.source = "GoogleFit" + for (field in dp.dataType.fields) { + weight.weight = dp.getValue(field).asFloat() + Log.i(TAG,"\tField: ${field.name.toString()} Value: ${dp.getValue(field)}") + } + // AppDatabase.getInstance(activity).weightDao().insert(weight) + } + } + + fun DataPoint.getStartTimeString(): String = + SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS", Locale.FRANCE) + .format(Date(this.getStartTime(TimeUnit.SECONDS) * 1000L)) + + fun DataPoint.getEndTimeString(): String = + SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS", Locale.FRANCE) + .format(Date(this.getEndTime(TimeUnit.SECONDS) * 1000L)) + + + /** Unregisters the listener with the Sensors API. */ + private fun unregisterFitnessDataListener() { + if (dataPointListener == null) { + // This code only activates one listener at a time. If there's no listener, there's + // nothing to unregister. + return + } + // [START unregister_data_listener] + // Waiting isn't actually necessary as the unregister call will complete regardless, + // even if called from within onStop, but a callback can still be added in order to + // inspect the results. + Fitness.getSensorsClient(activity, getGoogleAccount()) + .remove(dataPointListener!!) + .addOnCompleteListener { task -> + if (task.isSuccessful && task.result!!) { + Log.i(TAG, "Listener was removed!") + } else { + Log.i(TAG, "Listener was not removed.") + } + } + // [END unregister_data_listener] + } + + /** Returns a [DataReadRequest] for all step count changes in the past week. */ + private fun queryFitnessData(): DataReadRequest { + // [START build_read_data_request] + // Setting a start and end date using a range of 1 week before this moment. + val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")) + val now = Date() + calendar.time = now + val endTime = calendar.timeInMillis + calendar.add(Calendar.YEAR, -1) + val startTime = calendar.timeInMillis + + val dateFormat = DateFormat.getDateInstance() + Log.i(TAG, "Range Start: ${dateFormat.format(startTime)}") + Log.i(TAG, "Range End: ${dateFormat.format(endTime)}") + + return DataReadRequest.Builder() + // The data request can specify multiple data types to return, effectively + // combining multiple data queries into one call. + // In this example, it's very unlikely that the request is for several hundred + // datapoints each consisting of a few steps and a timestamp. The more likely + // scenario is wanting to see how many steps were walked per day, for 7 days. + .aggregate(DataType.TYPE_STEP_COUNT_DELTA) + // Analogous to a "Group By" in SQL, defines how data should be aggregated. + // bucketByTime allows for a time span, whereas bucketBySession would allow + // bucketing by "sessions", which would need to be defined in code. + .bucketByTime(1, TimeUnit.SECONDS) +// .bucketBySession() + .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) + .build() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/connectors/samsunghealth/SamsungHealth.kt b/app/src/main/java/com/dzeio/openhealth/connectors/samsunghealth/SamsungHealth.kt index a6e080e..01e5501 100644 --- a/app/src/main/java/com/dzeio/openhealth/connectors/samsunghealth/SamsungHealth.kt +++ b/app/src/main/java/com/dzeio/openhealth/connectors/samsunghealth/SamsungHealth.kt @@ -1,134 +1,107 @@ package com.dzeio.openhealth.connectors.samsunghealth import android.app.Activity -import android.app.AlertDialog -import android.content.DialogInterface +import android.content.Intent +import android.os.Handler +import android.os.Looper import android.util.Log +import com.dzeio.openhealth.MainActivity +import com.dzeio.openhealth.connectors.ConnectorInterface +import com.dzeio.openhealth.data.weight.Weight import com.samsung.android.sdk.healthdata.* +import com.samsung.android.sdk.healthdata.HealthConstants.StepCount import com.samsung.android.sdk.healthdata.HealthDataStore.ConnectionListener import com.samsung.android.sdk.healthdata.HealthPermissionManager.* -import com.samsung.android.sdk.healthdata.HealthResultHolder.ResultListener -import java.lang.Boolean -import kotlin.Exception +import java.util.* class SamsungHealth( private val context: Activity -) { +) : ConnectorInterface { + companion object { const val TAG = "SamsungHealthConnector" } - private val store: HealthDataStore get() = _store!! - private var _store: HealthDataStore? = null - private val keySet: HashSet = HashSet() - private val permissionListener: ResultListener = - ResultListener { result -> - Log.d(TAG, "Permission callback is received.") - val resultMap: Map = result!!.resultMap - - if (resultMap.containsValue(Boolean.FALSE)) { - // Requesting permission fails - Log.d(TAG, "Requesting permission fails") - - } else { - // Get the current step count and display it - getStepCount() - } - } - - private val connectionListener: ConnectionListener = object : ConnectionListener { + private val listener = object : ConnectionListener { override fun onConnected() { - Log.d(TAG, "Health data service is connected.") - val pmsManager = HealthPermissionManager(store) - try { - val resultMap = pmsManager.isPermissionAcquired(keySet) - - if (resultMap.containsValue(Boolean.FALSE)) { - // Request the permission for reading step counts if it is not acquired - pmsManager.requestPermissions(keySet, context) - .setResultListener(permissionListener) - } else { - // Get the current step count and display it - getStepCount() - } - } catch (e: Exception) { - Log.e(TAG, e.javaClass.name + " - " + e.message) - Log.e(TAG, "Permission setting fails.") + Log.d(TAG, "Connected!") + if (isPermissionAcquired()) { + reporter.start() + } else { + requestPermission() } } - - override fun onConnectionFailed(error: HealthConnectionErrorResult) { + override fun onConnectionFailed(p0: HealthConnectionErrorResult?) { Log.d(TAG, "Health data service is not available.") - showConnectionFailureDialog(error) } override fun onDisconnected() { Log.d(TAG, "Health data service is disconnected.") } + } - init { - //keySet = HashSet() - keySet.add(PermissionKey(HealthConstants.Weight.HEALTH_DATA_TYPE, PermissionType.READ)) + private val store : HealthDataStore = HealthDataStore(context, listener) - _store = HealthDataStore(context, connectionListener) + private fun isPermissionAcquired(): Boolean { + val permKey = PermissionKey(StepCount.HEALTH_DATA_TYPE, PermissionType.READ) + val pmsManager = HealthPermissionManager(store) + try { + // Check whether the permissions that this application needs are acquired + val resultMap = pmsManager.isPermissionAcquired(setOf(permKey)) + return !resultMap.containsValue(java.lang.Boolean.FALSE) + } catch (e: java.lang.Exception) { + Log.e(TAG, "Permission request fails.", e) + } + return false } - fun test() { + private fun requestPermission() { + val permKey = PermissionKey(StepCount.HEALTH_DATA_TYPE, PermissionType.READ) + val pmsManager = HealthPermissionManager(store) + try { + // Show user permission UI for allowing user to change options + pmsManager.requestPermissions(setOf(permKey), context) + .setResultListener { result: PermissionResult -> + Log.d(TAG, "Permission callback is received.") + val resultMap = + result.resultMap + if (resultMap.containsValue(java.lang.Boolean.FALSE)) { + Log.d(TAG, "No Data???") + } else { + // Get the current step count and display it + reporter.start() + } + } + } catch (e: Exception) { + Log.e(TAG, "Permission setting fails.", e) + } + } + + private val stepCountObserver = object : StepCountReporter.StepCountObserver { + override fun onChanged(count: Int) { + Log.d(TAG, "Step reported : $count") + } + } + + private val reporter = StepCountReporter(store, stepCountObserver, Handler(Looper.getMainLooper())) + + /** + * Connector + */ + + override val sourceID: String = "SamsungHealth" + + override fun onRequestPermissionResult( + requestCode: Int, + permission: Array, + grantResult: IntArray + ) {} + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {} + + override fun importWeight(callback: (weight: Weight, end: Boolean) -> Unit) { store.connectService() } - - private fun getStepCount() { - val resolver = HealthDataResolver(store, null) - val request = HealthDataResolver.ReadRequest.Builder() - .setDataType(HealthConstants.Weight.HEALTH_DATA_TYPE) - .setLocalTimeRange(HealthConstants.Weight.START_TIME, HealthConstants.Weight.TIME_OFFSET, 0, System.currentTimeMillis()) - .build() - - try { - val res = resolver.read(request).await() - - res.use { res1 -> - val iterator = res1.iterator() - if (iterator.hasNext()) { - val data = iterator.next() - val value = data.getFloat(HealthConstants.Weight.WEIGHT) - val time = data.getLong(HealthConstants.Weight.CREATE_TIME) - Log.d(TAG, "Data received! $value $time") - } - } - } catch (e : Exception) { - Log.d(TAG, "Reading failed!") - } - } - - private fun showConnectionFailureDialog(error: HealthConnectionErrorResult) { - val alert: AlertDialog.Builder = AlertDialog.Builder(context) - var message = "Connection with Samsung Health is not available" - if (error.hasResolution()) { - message = when (error.errorCode) { - HealthConnectionErrorResult.PLATFORM_NOT_INSTALLED -> "Please install Samsung Health" - HealthConnectionErrorResult.OLD_VERSION_PLATFORM -> "Please upgrade Samsung Health" - HealthConnectionErrorResult.PLATFORM_DISABLED -> "Please enable Samsung Health" - HealthConnectionErrorResult.USER_AGREEMENT_NEEDED -> "Please agree with Samsung Health policy" - else -> "Please make Samsung Health available" - } - } - alert.setMessage(message) - alert.setPositiveButton("OK", DialogInterface.OnClickListener { dialog, id -> - if (error.hasResolution()) { - error.resolve(context) - } - }) - if (error.hasResolution()) { - alert.setNegativeButton("Cancel", null) - } - alert.show() - } - - - fun destroy() { - store.disconnectService() - } } \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/connectors/samsunghealth/StepCountReporter.kt b/app/src/main/java/com/dzeio/openhealth/connectors/samsunghealth/StepCountReporter.kt new file mode 100644 index 0000000..4545915 --- /dev/null +++ b/app/src/main/java/com/dzeio/openhealth/connectors/samsunghealth/StepCountReporter.kt @@ -0,0 +1,88 @@ +package com.dzeio.openhealth.connectors.samsunghealth + +import android.os.Handler +import android.util.Log +import com.samsung.android.sdk.healthdata.HealthConstants.StepCount +import com.samsung.android.sdk.healthdata.HealthData +import com.samsung.android.sdk.healthdata.HealthDataObserver +import com.samsung.android.sdk.healthdata.HealthDataResolver +import com.samsung.android.sdk.healthdata.HealthDataResolver.AggregateRequest +import com.samsung.android.sdk.healthdata.HealthDataResolver.AggregateRequest.AggregateFunction +import com.samsung.android.sdk.healthdata.HealthDataResolver.AggregateResult +import com.samsung.android.sdk.healthdata.HealthDataStore +import java.util.* +import java.util.concurrent.TimeUnit + +class StepCountReporter( + private val mStore: HealthDataStore, private val mStepCountObserver: StepCountObserver, + resultHandler: Handler? +) { + private val mHealthDataResolver: HealthDataResolver + private val mHealthDataObserver: HealthDataObserver + fun start() { + // Register an observer to listen changes of step count and get today step count + HealthDataObserver.addObserver(mStore, StepCount.HEALTH_DATA_TYPE, mHealthDataObserver) + readTodayStepCount() + } + + fun stop() { + HealthDataObserver.removeObserver(mStore, mHealthDataObserver) + } + + // Read the today's step count on demand + private fun readTodayStepCount() { + // Set time range from start time of today to the current time + val startTime = getUtcStartOfDay(System.currentTimeMillis(), TimeZone.getDefault()) + val endTime = startTime + TimeUnit.DAYS.toMillis(1) + val request = AggregateRequest.Builder() + .setDataType(StepCount.HEALTH_DATA_TYPE) + .addFunction(AggregateFunction.SUM, StepCount.COUNT, "total_step") + .setLocalTimeRange(StepCount.START_TIME, StepCount.TIME_OFFSET, startTime, endTime) + .build() + try { + mHealthDataResolver.aggregate(request) + .setResultListener { aggregateResult: AggregateResult -> + aggregateResult.use { result -> + val iterator: Iterator = result.iterator() + if (iterator.hasNext()) { + mStepCountObserver.onChanged(iterator.next().getInt("total_step")) + } + } + } + } catch (e: Exception) { + Log.e("APP_TAG", "Getting step count fails.", e) + } + } + + private fun getUtcStartOfDay(time: Long, tz: TimeZone): Long { + val cal = Calendar.getInstance(tz) + cal.timeInMillis = time + val year = cal[Calendar.YEAR] + val month = cal[Calendar.MONTH] + val date = cal[Calendar.DATE] + cal.timeZone = TimeZone.getTimeZone("UTC") + cal[Calendar.YEAR] = year + cal[Calendar.MONTH] = month + cal[Calendar.DATE] = date + cal[Calendar.HOUR_OF_DAY] = 0 + cal[Calendar.MINUTE] = 0 + cal[Calendar.SECOND] = 0 + cal[Calendar.MILLISECOND] = 0 + return cal.timeInMillis + } + + interface StepCountObserver { + fun onChanged(count: Int) + } + + init { + mHealthDataResolver = HealthDataResolver(mStore, resultHandler) + mHealthDataObserver = object : HealthDataObserver(resultHandler) { + // Update the step count when a change event is received + override fun onChange(dataTypeName: String) { + Log.d("APP_TAG", "Observer receives a data changed event") + readTodayStepCount() + } + } + } +} diff --git a/app/src/main/java/com/dzeio/openhealth/data/weight/WeightDao.kt b/app/src/main/java/com/dzeio/openhealth/data/weight/WeightDao.kt index 4ec48f7..8809508 100644 --- a/app/src/main/java/com/dzeio/openhealth/data/weight/WeightDao.kt +++ b/app/src/main/java/com/dzeio/openhealth/data/weight/WeightDao.kt @@ -20,4 +20,7 @@ interface WeightDao : BaseDao { @Query("Select * FROM Weight WHERE id=(SELECT max(id) FROM Weight)") fun last(): Flow + + @Query("DELETE FROM Weight where source = :source") + suspend fun deleteFromSource(source: String) } \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/data/weight/WeightRepository.kt b/app/src/main/java/com/dzeio/openhealth/data/weight/WeightRepository.kt index ac68454..f17a720 100644 --- a/app/src/main/java/com/dzeio/openhealth/data/weight/WeightRepository.kt +++ b/app/src/main/java/com/dzeio/openhealth/data/weight/WeightRepository.kt @@ -15,4 +15,5 @@ class WeightRepository @Inject constructor( suspend fun addWeight(weight: Weight) = weightDao.insert(weight) suspend fun deleteWeight(weight: Weight) = weightDao.delete(weight) + suspend fun deleteFromSource(source: String) = weightDao.deleteFromSource(source) } \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/ui/main/import/ImportViewModel.kt b/app/src/main/java/com/dzeio/openhealth/ui/main/import/ImportViewModel.kt deleted file mode 100644 index f66033f..0000000 --- a/app/src/main/java/com/dzeio/openhealth/ui/main/import/ImportViewModel.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.dzeio.openhealth.ui.main.import - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -//import com.dzeio.openhealth.connectors.GoogleFit - -class ImportViewModel : ViewModel() { - - val text = MutableLiveData().apply { - value = "This is slideshow Fragment" - } - val importProgress = MutableLiveData().apply { - value = 0 - } - // If -1 progress is undetermined - // If 0 no progress bar - // Else progress bar - val importProgressTotal = MutableLiveData().apply { - value = 0 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/ui/main/import/ImportFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/main/imports/ImportFragment.kt similarity index 60% rename from app/src/main/java/com/dzeio/openhealth/ui/main/import/ImportFragment.kt rename to app/src/main/java/com/dzeio/openhealth/ui/main/imports/ImportFragment.kt index 6801fa6..813cdd2 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/main/import/ImportFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/main/imports/ImportFragment.kt @@ -1,6 +1,7 @@ -package com.dzeio.openhealth.ui.main.import +package com.dzeio.openhealth.ui.main.imports import android.app.ProgressDialog +import android.content.Intent import android.content.pm.PackageManager import android.os.Build import android.os.Bundle @@ -9,53 +10,38 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.RequiresApi -import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import com.dzeio.openhealth.connectors.ActionRequestCode +import androidx.lifecycle.lifecycleScope +import com.dzeio.openhealth.connectors.ConnectorInterface import com.dzeio.openhealth.connectors.GoogleFit //import com.dzeio.openhealth.connectors.GoogleFit import com.dzeio.openhealth.connectors.samsunghealth.SamsungHealth +import com.dzeio.openhealth.core.BaseFragment import com.dzeio.openhealth.databinding.FragmentImportBinding +import dagger.hilt.android.AndroidEntryPoint -class ImportFragment : Fragment() { +@AndroidEntryPoint +class ImportFragment : BaseFragment(ImportViewModel::class.java) { companion object { const val TAG = "ImportFragment" } - private var _binding: FragmentImportBinding? = null - - // This property is only valid between onCreateView and - // onDestroyView. - private val binding get() = _binding!! - private lateinit var viewModel: ImportViewModel + override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> FragmentImportBinding = FragmentImportBinding::inflate private lateinit var progressDialog: ProgressDialog - private lateinit var fit: GoogleFit + private lateinit var fit: ConnectorInterface - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - viewModel = ViewModelProvider(this).get(ImportViewModel::class.java) - - _binding = FragmentImportBinding.inflate(inflater, container, false) - val root: View = binding.root + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) progressDialog = ProgressDialog(requireContext()) progressDialog.apply { - setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) setCancelable(false) + setTitle("Importing from source...") } - return root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) binding.importGoogleFit.setOnClickListener { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { importFromGoogleFit() @@ -66,29 +52,67 @@ class ImportFragment : Fragment() { } } - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } - - @RequiresApi(Build.VERSION_CODES.O) - fun importFromGoogleFit() { - viewModel.importProgressTotal.postValue(-1) + private fun importFromGoogleFit() { + progressDialog.show() fit = GoogleFit(requireActivity()) - progressDialog.show() - fit.import() - fit.getHistory() -// google.importWeight { -// progressDialog.dismiss() -// } + var imported = 0 + + lifecycleScope.launchWhenStarted { + viewModel.deleteFromSource(fit.sourceID) + }.invokeOnCompletion { + //progressDialog.show() + fit.importWeight { weight, end -> + Log.d("Importer", "Importing $weight") + weight.source = fit.sourceID + progressDialog.setTitle("Importing from source... ${++imported}") + lifecycleScope.launchWhenStarted { + viewModel.importWeight(weight) + } + if (end) { + Log.d("Importer", "Finished Importing") + progressDialog.dismiss() + return@importWeight + } + + } + } + + } fun importFromSamsungHealth() { - SamsungHealth(requireActivity()) - .test() + progressDialog.show() + fit = SamsungHealth(requireActivity()) + + var imported = 0 + + lifecycleScope.launchWhenStarted { + viewModel.deleteFromSource(fit.sourceID) + }.invokeOnCompletion { + //progressDialog.show() + fit.importWeight { weight, end -> + Log.d("Importer", "Importing $weight") + weight.source = fit.sourceID + progressDialog.setTitle("Importing from source... ${++imported}") + lifecycleScope.launchWhenStarted { + viewModel.importWeight(weight) + } + if (end) { + Log.d("Importer", "Finished Importing") + progressDialog.dismiss() + return@importWeight + } + + } + } } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + fit.onActivityResult(requestCode, resultCode, data) + } + + @RequiresApi(Build.VERSION_CODES.O) override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { when { @@ -100,11 +124,7 @@ class ImportFragment : Fragment() { grantResults[0] == PackageManager.PERMISSION_GRANTED -> { Log.d(TAG, "Granted") - // Permission was granted. - val fitActionRequestCode = ActionRequestCode.values()[requestCode] - fitActionRequestCode.let { - fit.signIn(ActionRequestCode.FIND_DATA_SOURCES) - } + fit.onRequestPermissionResult(requestCode, permissions, grantResults) } else -> { // Permission denied. diff --git a/app/src/main/java/com/dzeio/openhealth/ui/main/imports/ImportViewModel.kt b/app/src/main/java/com/dzeio/openhealth/ui/main/imports/ImportViewModel.kt new file mode 100644 index 0000000..ed3651c --- /dev/null +++ b/app/src/main/java/com/dzeio/openhealth/ui/main/imports/ImportViewModel.kt @@ -0,0 +1,32 @@ +package com.dzeio.openhealth.ui.main.imports + +import androidx.lifecycle.MutableLiveData +import com.dzeio.openhealth.core.BaseViewModel +import com.dzeio.openhealth.data.weight.Weight +import com.dzeio.openhealth.data.weight.WeightRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import java.security.CodeSource +import javax.inject.Inject + + +@HiltViewModel +class ImportViewModel @Inject internal constructor( + private val weightRepository: WeightRepository +) : BaseViewModel() { + + val text = MutableLiveData().apply { + value = "This is slideshow Fragment" + } + val importProgress = MutableLiveData().apply { + value = 0 + } + // If -1 progress is undetermined + // If 0 no progress bar + // Else progress bar + val importProgressTotal = MutableLiveData().apply { + value = 0 + } + + suspend fun importWeight(weight: Weight) = weightRepository.addWeight(weight) + suspend fun deleteFromSource(source: String) = weightRepository.deleteFromSource(source) +} \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/ui/main/list_weight/ListWeightFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/main/list_weight/ListWeightFragment.kt index 24ff6d8..3f649d7 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/main/list_weight/ListWeightFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/main/list_weight/ListWeightFragment.kt @@ -10,11 +10,14 @@ import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.dzeio.openhealth.adapters.WeightAdapter import com.dzeio.openhealth.core.BaseFragment +import com.dzeio.openhealth.data.weight.Weight import com.dzeio.openhealth.databinding.FragmentListWeightBinding import com.dzeio.openhealth.ui.dialogs.EditWeightDialog import com.dzeio.openhealth.ui.main.home.HomeViewModel import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.collectLatest +import java.util.* @AndroidEntryPoint class ListWeightFragment : BaseFragment(HomeViewModel::class.java) { @@ -37,8 +40,10 @@ class ListWeightFragment : BaseFragment if (o1.timestamp > o2.timestamp) -1 else 1 } + adapter.set(itt) } } diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml index 2b068d1..a0037ac 100644 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -4,27 +4,48 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - - - - - - - + + + + + + + + - \ No newline at end of file + android:pathData="M284,162H40M162,40V284" + android:strokeAlpha="0.5" + android:strokeLineJoin="round" + android:strokeWidth="76" + android:fillColor="#00000000" + android:strokeColor="#80E27E" + android:strokeLineCap="round"/> + + + + + + + + + + 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/ic_logo_app.xml b/app/src/main/res/drawable/ic_logo_app.xml new file mode 100644 index 0000000..4460be8 --- /dev/null +++ b/app/src/main/res/drawable/ic_logo_app.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_logo_app_white.xml b/app/src/main/res/drawable/ic_logo_app_white.xml new file mode 100644 index 0000000..75a9d57 --- /dev/null +++ b/app/src/main/res/drawable/ic_logo_app_white.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_logo_background.xml b/app/src/main/res/drawable/ic_logo_background.xml new file mode 100644 index 0000000..918db80 --- /dev/null +++ b/app/src/main/res/drawable/ic_logo_background.xml @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_import.xml b/app/src/main/res/layout/fragment_import.xml index 433c21e..65f44b6 100644 --- a/app/src/main/res/layout/fragment_import.xml +++ b/app/src/main/res/layout/fragment_import.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.main.import.ImportFragment"> + tools:context=".ui.main.imports.ImportFragment"> - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index eca70cf..7353dbd 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..28ad9c69c6bb882ad836811ab5ba2fa20d8fda95 GIT binary patch literal 2269 zcmV<32qO21P)9fX!u5ELsJkt(yyL!3PL z;v`j?idMOFHwvNw~V z6l3C=xpvm@!Ru;V(@?)rT(=2XU%Yq$>iP5MF|R-^R=?lBEx6W@2ZEkYF;P1wTv}RM zj3==s0qBM(QN0mD-;>0LxAHnaKmU6bj`n{c)+Op%oSU12$K&}hxaN>X;KN&HXJ=dD z6_C*4vuDrX^Z8D()^Gs5J2Nx$7fu$BfLN0l1oU^-8V;bXlarHwRVUN_fH;r@q$tW6 z)*3FLzj3lS2lNGN4GYlt`1t3X?7IXs`)n5DPscGjH@ZUnJN}#Y^Xn)H$mMeVgS8qC z(Bje}2K`?A`QB;N3{|7dTZ&Ro2}&q;F-%?)+HSYOGvkq;)qejv$k>3CM+&Nksw5aK zoMNR2MXn+gx(ZR@u7EPF=)Qj)WL!Y=OY=B+=j2N`wL>*%zSV^0ktQ?^AH`9jYHt+^ z2MSOi)Z%Nw{NlWBo(N@JK-^>MhwCJqhT$W)_U%4j0?!;_rc^d$;ax%?GrjUs*VjeBj1sa5@!j#GhW?15z4rL2K|Gm9ITXk&WYPC zIxwo5hmPT3|3MTxi{Y8}=;nz~1_$J=kQ;K#t$ncg zOF+IR>9R038y5c$Bw{yctlF0F-ObMPVNSxpnhID1!rXm&-oq_*($w z*m66xqEw$S0t0 zHxnSy)0DYNWfOR8=*@r{y^YA~&Bj4nK9pDoMEmfK=#be2@)(zTq{=Jr8Yuzi^8YTQ zc%WD|fvW-H9hBLVh1}je{O7+H1tbN^!&h>tnsP}gQwknDet@ToPj%~ijiLjHPMgM) z-ir2t9kNL@f$VcCJQeb^;)cvUr(8T%Wv;T9aM%Q%zI$2+MpfIbHe_~ZA)`AJIo-L) z?aq_e>@K03Imo)1jm%D=4)Gc4Mkew)^HFW9Mc+jK+fsn&0AgejiYu4KQ|vi>tW-Ev z?kfCy;(`v0ste;6aL7@C^sWq~-^@T-XF5_l(~#PchLny}9JrB+ttD`AAW`b5?`% z3etI;8aag{?grE=^{8`Eb*LQ>a@L|IplU}AsvOlQ>@Jpo_L}#j!QKe}f?v1pr~zW? zR}%=k>V|8j1J@Q9ZE+1boq71wybo#COpMNcqg!{>05P^uA1mfL+Qn{+%qZ(E$0yhJ z;p3}&asSa*x^+htkh^o{rH z)*E#|Z0B9mF8OMPZyy-2Gec%f$|R6s7xNrO7Ift_p7d6<5A2ZH1Zu&k;+;b{Nditv zyXc_XMJH`dM~XEK2P~B6q%A2(G7DW35QWk$0(@sBY-4s~SPfNtZ^c(LG^5OqDaNGC zab8L|a=LOFPkJia2X@F>Fsk@i@y;Qf^LH;`U~&M?U`;rs9055e2IQ$_D6<-l=)`F} z>8)rVv|v8 zs!sY^1)yXc>aN7p+>~yf2xVMA47r%+FtVU4*Md>SzUt!mMH#|r=U4|B8xX@T<~fWk zv|xgDW9B;UKYe329El7JXv!s%K!#n+a(2P4z?&#)N2N@es zMn|S>0(nyD!7S^{-7_c^#`BcYh9?V8bn`?gBLh-oz|JO+F{u`eDwC~B+J_W#I(!d@ zbn`?g;{y8X@dNqxflVMYHlOrXA=-zv$hd$g+qfO+qC*bFmD6}?zkeNMY(R9{jtK{j*c*{%&CtPN z*u^}Dk;PkFdAKq*AXR*C#aA=jV_xaLOafO4yVgUo0cZoYE`Z|xcQpi{FIa0>fF>s= zO$6k2yTiYO#>U24gwuBQYRCTv_Bwb#aj3)nSQ??XV0F^ zVXb|AeeY>Gym4Up7hJz5^s{^S?m2iXazZhAT!^)>rvCnZm#FaPkX_O`G00000NkvXXu0mjf@y=9U literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78ecd372343283f4157dcfd918ec5165bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..a4b162cb2d4c960ac29d9ee5851e4c636f477009 GIT binary patch literal 4168 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..da66b1b86dc9f6bbcbdfb360f787f95545aa0234 GIT binary patch literal 1480 zcmV;(1vmPMP)i`U4yM=~-rp-=Syt3(V8L&{?_t+Ddk!3FSk7|cGxMFZEa%zte9r!U&-0x< zn>Ia-4IBW%gf@p*VamFm7$WIeO8I`M;(yg6KT*8iCiJ?{YatS^y=}SLmJR<2;`pLa z!J|iy{#jgHoDQXYH59NWd5z14|DOvB3*U)Eh{O#ekH>RHl=jSu0Pt;=+1c5b1;8Ye z#Boj>7sW9o@?Cq5H&fI#RaaN{ioDi<5N~eg(dl%)<@I`Jd;t6m)!oojticE1si>%U zS6*vC_}_Fm9B&H%w?A3=fqF|0V6|Ge%WDk?1;CoWf%%1bJoG+%EdH%LXEl-om`tYk zs1K-1W&k65>SCykB-2sLk4k4>M3#raj z9CxN8y)zwY9cf5vPeMjV1_tjBs&cfXJ3!S$6;e8rQ84^1s$ADl?W&TLKah{amPAyJ zRjP8dq&qC=&oF9VsaO%ccTIY);(x z0HtH4NWPoAEWn{Z4#7HTRpn?&e}K_a9Bn_U0g6^i@ZW1d-G7^<(c8GyobhdK=mUPF7`c!O)KrmDpPwgUmZwcrf=M_yD=Wn9k+q87z#e-PzPNQV_yAm!w8Y%3`C=(8t@kByNU_he zRq}Xk1;Fc5)v%11rS&dph%&-R4H}W%{v|&7c^6JMnEY$^odG9tUQ)3CkhHKCjHtlI{Q;LT#=#oNmsMTqTVey$$UF zC#+t-%&qyyU3wWBGQWcH+vuu(+^w&#e`hV7& zl^!uMeE$sFxpU|C#>U1gQ&Us!nVFe;g5JZUp7LMQ<#M?j8X78h?AXEO!{^p312B9i zY!P}RJUsk^=;-K=3Dyo){4k@w|AsRp_MB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!Ta5MrIJxf2~grGkgF0 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 M07*qoM6N<$f}PIdc>n+a literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp deleted file mode 100644 index 62b611da081676d42f6c3f78a2c91e7bcedddedb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1772 zcmVQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae011fc1c382a2839d8d27331ffbefc496a2ff3 GIT binary patch literal 3050 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a3070fe34c611c42c0d3ad3013a0dce358be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..ead7fc935d18671feb3c4ba58af7554bc13a078e GIT binary patch literal 5946 zcmV-A7scp_P)i_R1-J!da=5f#YPItQhzn1UT zf9uw*Tb&zjxGvYFJz3w2oA&$bA_SvV zkk$Q4gwuCD3H=Cz2_pz21@Io9;k%yN`=qFKuTE zg27<08R~tatYe~V)G<&~Hy;S1Sa03pW$=_|SD#S~3;R@2N z0d<>9l~4rQh_?2z)R!(V7%_zI%HOXNPAkOgY;zZZ91v0wX!CfbA8=p0_S3+`N>#k? zPuQUlFU^d$<6R99v=vQ?WHGV<@BMkNXI zo$6LLU20-=Ep@E2sgk3jsltRxLS1tmYie!M-RD4Xw-rigZf;I4EG+D+a^W(O6;@PK zVB{x)d}o@Ri>(*gfy#Kct!Nty%nM}i<-EsMm}Q}8v5 zEsy2*Xv=XF&{rs-p`jruHa7MSl@q56YjZPiq(+20oBZ7RlWg6YPuYSje>N{`9-Ei> zHhUY$@Z<11F_&X*IxvULA^4^Hv47?Mi{+fp(Us>Y$UfKC*GFvJxKWy7=Xys>@qwxG zubpjns+z0VKXX^H`5@jB`9c9k^5=5$=cLVHzG=S9_qZ=xk+p(VHC5@#br5L$U2Y{s zu$r2hZ8x-eN6uR(NDY%ahB!MK0dWfXjjfGrM^O;-&zf(Ue6x|SCx7L3supK1;^faxHNrp5pA|P0>&kZ^xMxK30n5wFdr{@eVZy`&bK$~;{#4mn zSNQpv=QGX7_s^Wqg3ETZn3|X?Aewz&yn~N?knfY~!+ehUuoE>Wbmcn|#Kk3WLZ+xN zDJf}?%Gp&5GX~dS-#nC+BCnsl;%3X(ri3z2;y1F+#V!6WfxFnR!6`*)Ki%9|Db|^rS@9jDTm`qVs zRn_T`kdWV~9Ck>=%^o!RR|wPN67qqlvPd&;XK|M83h+<&H<9ms#M@;G07wCsnwpx} zsZ*yu0Cyc$fV{D`wst5LS}jJuL0h4-00pS7=Ax`cq<}CT;aYG7kmn=GceMh*5e6$g z1vT;U@ehE*SP{IlON9OMARl*)t4BW&DHI_6{6*wmf?O@(T9_0d$oER|V&UgprvL%@ z6l?&8cFzU!2Aa`_(8#ZJ_2>tn05!a@DDxdV6foaJ{!BucixmK_z*%KwWfjc@zXO*? zjvTRlZ6IxbV`C%VTrn6$SCKOz6(Co*@7SS$`N!v*$Tun=Ojo|M0ot%Q%goID2e`C( zE?^>-5gQwOD;1RKO3z0{WND;Xc;TH4`xGF_pLuv@rzk*jR$N@19S{&8!`AJ`iKOj6 zfByX6#pnl|?)PgEQ5s%n=v&|JD2Wx-=)W8~6w>B#vb)J!Yu7DXVv=bB{(279a$&)94AWnHkw&2&Y$VY_i z)&RP>s52&C39bM^KH@s|DBx{U07gE@pWcZIkS=LyX=(BL_3MX#+nqaiTAvG;F^cCw zKJ5Q?ruhM&05z(K)ve76IQF)Q{OL(hK&Y;KS3osGhYlT@3~p&~o2AK{2{X>r-7a3d z_*rL;ejuVG!bCozn)WEbj}#!u_e`4JX$lZ9G&eWH8`=VH1;=`k=4b5KvE9jTrF6Ce z_LuB8k}sl~2rt;IfTN@UA|B*>CU&j@B!~I=`Kbd34&~&oDpL{3{e8Hc5->d&{edR~%|gmcGnTT5s{J~`wb)-7&K9OF zG?DL_=*d3H{D_4XhO&JUXMuejdnF2hy(~n7J^3LlwIY=j)fcgbmIhsa+k>13%FD}Z zw{PG65IDBDD3b~xzxBTq`w!6-Y7N-K#WtdLC(E8~M3dQ3$VXspRrV?tRUN4#Tnk+D zUgk;@`O^qf6M$)K>MzsSTfaXCm;7yJxgvs%57!fyxO#))4u-9WJ zGtUDv*ru$_th}K@*Y9?~6;M}K$D*U7UkAs6YjctIzq-2m9he{7Xs}}fM)m?W&~4kp zHHH^#C4WxpTo!chJ0029@Lkb%=AG<)W%5D1jpV-`Gnq|{nZ#fH66UdtstjHKuK-NM zd{vy1lClyU>*fL0=AYg~GxnGEu6~h&gVd3ZW-pkLFSZd?^4FeP%c85JbVOSNuKgtE z6Xr!qXd{1GhekdC@+Bt3yw2WDS6)t>y0G&YC78dyW`u-MNo6Q4K0lRna9!A%eikl4Df-C_^ zvhU@rFtho{)zNmq-SJt@XM+3*9NzIhtn^};jt@%!mry`SNlE$p@4r9FngY5-Mn*nB z7u&T4KvpsmWmRwIT2+7~|JBF|%qxBtE4@&v_aETeq5{Ig!p6`I z=jBb>f-C{4;mA-{y`5`W0U#fk8Ru=c0%$Q-PYQV4ngVVN2?=@7&_M;Le*U$nfOR?R zjO0hW#$F+GQ~`m3fqwwk78S5-*RGNFnjoVBmYezc$kWtzz}+Dg0P;Jk0GOcFt5-i_ zRRLdo@x}eEt*v%V!dwBr2AD0fu2ls{@?Y6Mp3Ufh0*Z@^%NHzI@Ss%%`1|`0qIJL- zag%LsXmcGu455Y>K05<9RNo1A#y`_no5+8euqa`P-EQcaGiM5Dtu-86$EvwP%(xKi zHge?1zO)jyZz0y&#E%83;e};c%h>L+pLB~Wdw|6g7ExLv>_uc%1TRm!xUz;&Ey_dL z&Z3>n`=F1B{FlRDWouFcS!0WB3o(QEWq{n=+>9YZh717L+JzY32PWKJTU#4xZzuw1 zvT!U&jqUiQ`RT$7NSNX{KA&eU0N6ms9xk>Kv6F?(6vXopQbtr0fwhi?BDS6Vmc4uY zT{b7lPYEx0@$dr2L0~4EegK%kBc7fIrZdm@>1-NdYMc=hqb8Y=|H}T?*xo$5_89m> zke;3%M;v1%+$|s=z$_HuK_B3exRoY~t@bJa!8n*9U0_WU)l}03)w~^h%S1RDp=g`K(Krx?Gg;ch5jK%8vKQ2CL{mIJ!IOCntSf_O!Sm zBR;(4;K76Ag#rMGu25^hfw*t;zh(2&=G#ub*~r(EFXQ=$YT7agFpqiQ*wsq^)Y2cXbzkXw$8Fy)JUb}YfSaL}N*)`^Wyl zem=9O4S9Q5aNf^m*nJuZZo{cy_7lf$cBJemD?DF#Ra=rpMMX7p=gxf!99w(>giXR1 zcb-3gK1JTFEzniK-mSWsf_Of>6fNOe;2KQ0>c|J_+VWim$>E6;C(?-9yTP&91gr`z zlmCrg`VlK2!y0Vk#*MSUEzJYBXn8k@SRC}2 zFk!;)8yXtUib4$9f?WZmjHr9KwkjaJB8<&S@G+ZkVe_@+y8_bwpFDZ;+;h)8hcI*x z;qF_P=bwKbPeH%@{QMwMNT(#{B3DPvUcer%Eee3AwEXycCi35moyxMRvvlP<8^Zr@ zh53nzi3ui7`wMQbETkd0NOuGW2TwvFqCl6MA)^A?vKO#{Zi@ndy=5Wnhup- zcu{zVyqBwmG(Qy;6>QC#HD2KKiuPZMFhf1>x#yl?WV`bZfOD3XmX>qZU3cNIUe9*Tj}%W&Poz%tJAC-?D)AIRT>2F3 zJ-gQ|ZwIL(?xFxO`VFYZ>n4#MzO`7x=tqDpy!zD$YrkXT`yd5`E zfSi2GUwrY!KY~jiAD{Nkk0Lxrh+YRCJ$iHlegnZ^6kTP`0up1@j5Q=pxq|}4nCF@iO^V|i4!OOCp}7Ku6_!j05x3@8EbB$06zM2a&jtY^#2JQPMI>r zy6=Al@fbI59Ddq;(18O7KE}aggHd#qIs+yJh+IvC7wl00Hc^7|gV?Wizq(8Ta`Yqc z78DfpIk*!X+Bf>8(4&L7pf7nuqY4WPvqdE?Sr>#9gqS7DBD`RW0#Y*CyZp3gSVJ5j1%B=FOYE>g)MGwLnD>ZRHLH z4o0XUWm^@%SHg#8n}wA3ov|yCwnLDnr?|M7tzNzQZE!~9-wqBnoZ2ln4H`5E+i1hc zE&UOu2s=F51~?jA0ZK?2TZpzO0DHLDMpWbZ2q|mJcO-=Axr6~4LISP?XSVtM?TE(< zFT4OBcECdqJ@jaPetw=<8#vVz;aCtSUqm&LB91I&E#X?g_G|ZW5zp6_?c1) znxF*obtI5FqRn2wP8K#(wB8GDQ zz)bJV`2g{oFS0h7o`8;QBVrF1+lbDJ1xfNtOH0|7EnC)r8^Mu&$IAiYL3XW2uU@^7 z*YdlVn3x?{Y(NLp5T}GGa3Bt6vaU$JBwj;4vKMB>`*vgx*CwFP=sRNlyLRpR5uAV< zaTL{IrbjE?h7TW(nH^heqZ1PoBe2_#3CLMWz=61T4+rq4z}D;qyC8)>59^FjCS-5*LxNl9?F5^x|6XR>fC2q#l;I0E_k z$j=0jD2rF53nF6;NmI7w?br)RKA!&Q=;&nPU@W*0oH*R>TM~Yn^5KUczLQ>u^z7Ml zY*JEEqBKWBbPaa|a3%}+m^hh@rxogL|dc0<^FgE;ehxJQp3kAVZh1wUtP#*`C< zXHbX<=U&3YadB~xa$-h9g?n~Q0DX}YE^Pk3efwZ`kY;|bGU>XEd?~2#=24?Y;Xe%F zztBAx8XCH@tgK9WN8C5ocE;Tx`p}9#m6VhqzK;nPKRGZ|^c~?Emy<7rD}g2-Jc4)< zMt}9yS0B-0tpz_+Bv#CB`83E;FXlG<0%FUC4IAKUjz(WapF5R&Dcl_0efQn}-n(~i zC}HHHMT@4=sxS|>(jA`$b=0E|$;ruQ{QUf|$Qp@0qOa()=zEtCu7o~)`t%+`Lhm2A z|Ni@*+`D&g@VRs6@K0}em=;5+D=R{bdbm0KsVyulWIz7+Rze9<5l&mYbp&V&+Jv@Y)T6C5>T?1D z0_LF)=!@u6FVV*?N4_dph}?4Tz4!L-*RS6&djI>ref$35n{U2ZmywZC3Qq}&Ab|of z;5ucF5Tl*m8gP8b_+LD0YmviQx@F6j&(UVI9eqGw&?nJ1w-9cU2)7L#Iuu9q@idHn z>Zzxm+p%NER#HR>Mj7^+xh9PNi-kY^&QyjV-MC_;I#D-1gKLR41qB6tHE!Iv=h0TQ zS+pJdAzjksv?tOe-7;XnfI9~d9*hZk1YykMk3aq_jk2}$m}g>+5G!e^3T|`WLhfZA4qqX0%=O!R^Rb1&zllu@^ng z{b_Q>ngNO!P0RSlmMmG~8yp|ZegxWvHlnSf&2CM+R$xEzDEER*72Xm|(?}xW!4V@y{AuaZ zrGB)~*_M!ya1>burKP2OgBzn2XRJV?d{Qh4zQZ-}y6_8Cu<7OH<%Znc-15Z4#G@!1 zb)YWPiMr7Sv_;r?5RW#xjjiv9NJaF7KTQ}!zO{TRMu8Z@qt8D3>@ZG$5^T$8` z{PXv*Bq=E=sbs59WoKufJAL|eSwTTTC4l#&uygnh*Tlue#qQa&X9t;^sOBgQzQ_jxZPW{U0BB zIk3LxoK0)OK>Tr&*!;9gP20F;TcMIERMb^gC5-kPWi zL9C?*p%+%!$TS!@aNuvm95O%!KErpo2G`;qaWBfaPWV*_NRvtd`0rZWU?f$A{9Ilq c@9Wa?e}E?LGBYHWK>z>%07*qoM6N<$g0z26SO5S3 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3918 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 ZED{;248l*XC~qcI2m^Eddfl5b{{!!gG{yh` literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index 28d4b77f9f036a47549d47db79c16788749dca10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2884 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9287f5083623b375139afb391af71cc533a7dd37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5914 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNL%!oWq+*#9n**;PG@x1bwz;ikWq8td?&RHrCx!xk=~0e{xS=TVE6B)|Eo1f`f=qPRx-5 z?oXVPj14r(Vl0lao$)%O15;isr<`)LSM-D10wl)Cz4zS(k|)WbucT?zYKaFjA#-gU za^?@s|04OyXD5C_2cg2l!(FDMihg>wSEfYwsR2a?LaykPF9QP`NJ~ovy`kMlu%znz z10Egpx#i>Psa(%kEpgS+O_7vMwξPQ(cn*`!|r4Wk_%-x~X<+P%+FKhsX6s-iUU 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 MFt#+RIO`t!U#KCUfdBvi literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index aa7d6427e6fa1074b79ccd52ef67ac15c5637e85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3844 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9126ae37cbc3587421d6889eadd1d91fbf1994d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7778 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 78aaf0d..3ae8231 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -28,7 +28,7 @@ diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file