diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a058775..df696df 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -231,4 +231,14 @@ dependencies { implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-gson:2.9.0") implementation("com.squareup.okhttp3:logging-interceptor:4.10.0") + + // Google Fit + implementation("com.google.android.gms:play-services-fitness:21.1.0") + implementation("com.google.android.gms:play-services-auth:20.4.1") + + // Google Health Connect + implementation("androidx.health.connect:connect-client:1.0.0-alpha11") + + // Samsung Health + implementation(files("libs/samsung-health-data-1.5.0.aar")) } diff --git a/app/libs/samsung-health-data-1.5.0.aar b/app/libs/samsung-health-data-1.5.0.aar new file mode 100644 index 0000000..e4f8cf6 Binary files /dev/null and b/app/libs/samsung-health-data-1.5.0.aar differ diff --git a/app/src/main/java/com/dzeio/openhealth/extensions/ExtensionsFragment.kt b/app/src/main/java/com/dzeio/openhealth/extensions/ExtensionsFragment.kt deleted file mode 100644 index 8186e99..0000000 --- a/app/src/main/java/com/dzeio/openhealth/extensions/ExtensionsFragment.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.dzeio.openhealth.ui.extensions - -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.findNavController -import androidx.recyclerview.widget.LinearLayoutManager -import com.dzeio.openhealth.adapters.ExtensionAdapter -import com.dzeio.openhealth.core.BaseFragment -import com.dzeio.openhealth.databinding.FragmentExtensionsBinding -import com.dzeio.openhealth.extensions.Extension -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch - -@AndroidEntryPoint -class ExtensionsFragment : - BaseFragment(ExtensionsViewModel::class.java) { - - companion object { - const val TAG = "ExtensionsFragment" - } - - override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> FragmentExtensionsBinding = - FragmentExtensionsBinding::inflate - - private lateinit var activeExtension: Extension - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - val recycler = binding.list - - val manager = LinearLayoutManager(requireContext()) - recycler.layoutManager = manager - - val adapter = ExtensionAdapter(viewModel.config) - adapter.onItemClick = { - activeExtension = it - activeExtension.enable(this) - Log.d(TAG, "${it.id}: ${it.name}") - - lifecycleScope.launch { - extensionIsConnected(it) - } - } - recycler.adapter = adapter - - val list = viewModel.extensions - list.forEach { - it.enable(this) - } - - adapter.set(list) - } - - private suspend fun extensionIsConnected(it: Extension) { - // check if it is connected - if (it.isConnected()) { - gotoExtension(it) - return - } - - val ld = it.connect() - if (ld) { - gotoExtension(it) - } - // handle if extension can't be connected - } - - private fun gotoExtension(it: Extension) { - findNavController().navigate( - ExtensionsFragmentDirections.actionNavExtensionsToNavExtension(it.id) - ) - } -} diff --git a/app/src/main/java/com/dzeio/openhealth/extensions/ExtensionsViewModel.kt b/app/src/main/java/com/dzeio/openhealth/extensions/ExtensionsViewModel.kt deleted file mode 100644 index 646e69e..0000000 --- a/app/src/main/java/com/dzeio/openhealth/extensions/ExtensionsViewModel.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.dzeio.openhealth.ui.extensions - -import com.dzeio.openhealth.core.BaseViewModel -import com.dzeio.openhealth.extensions.ExtensionFactory -import com.dzeio.openhealth.utils.Configuration -import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject - -@HiltViewModel -class ExtensionsViewModel @Inject internal constructor( - val config: Configuration -) : BaseViewModel() { - - val extensions = ExtensionFactory.getAll() - -} diff --git a/app/src/main/java/com/dzeio/openhealth/extensions/HealthConnectExtension.kt b/app/src/main/java/com/dzeio/openhealth/extensions/HealthConnectExtension.kt index 808764e..386fee9 100644 --- a/app/src/main/java/com/dzeio/openhealth/extensions/HealthConnectExtension.kt +++ b/app/src/main/java/com/dzeio/openhealth/extensions/HealthConnectExtension.kt @@ -15,10 +15,10 @@ import androidx.health.connect.client.request.ReadRecordsRequest import androidx.health.connect.client.time.TimeRangeFilter import com.dzeio.openhealth.core.Observable import com.dzeio.openhealth.data.weight.Weight +import java.time.Instant import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow import kotlinx.coroutines.runBlocking -import java.time.Instant @RequiresApi(Build.VERSION_CODES.P) class HealthConnectExtension : Extension { @@ -29,13 +29,12 @@ class HealthConnectExtension : Extension { // build a set of permissions for required data types val PERMISSIONS = setOf( - HealthPermission.createReadPermission(HeartRateRecord::class), - HealthPermission.createWritePermission(HeartRateRecord::class), - HealthPermission.createReadPermission(StepsRecord::class), - HealthPermission.createWritePermission(StepsRecord::class) + HealthPermission.getReadPermission(HeartRateRecord::class), + HealthPermission.getWritePermission(HeartRateRecord::class), + HealthPermission.getReadPermission(StepsRecord::class), + HealthPermission.getWritePermission(StepsRecord::class) ) - override val id = "HealthConnect" override val name = "Health Connect" @@ -51,15 +50,13 @@ class HealthConnectExtension : Extension { override suspend fun isConnected(): Boolean = true - - private val connectionStatus = Observable(false) private lateinit var fragment: Fragment private lateinit var client: HealthConnectClient override fun isAvailable(): Boolean { - return HealthConnectClient.isAvailable(fragment.requireContext()) + return HealthConnectClient.isProviderAvailable(fragment.requireContext()) } override fun enable(fragment: Fragment): Boolean { @@ -116,7 +113,6 @@ class HealthConnectExtension : Extension { ) ) } - } override suspend fun exportWeights(weight: Array): Flow> { @@ -128,10 +124,10 @@ class HealthConnectExtension : Extension { // signIn(Data.values()[requestCode]) } - override val contract: ActivityResultContract, Set> + override val contract: ActivityResultContract, Set> get() = PermissionController.createRequestPermissionResultContract() override suspend fun permissionsGranted(): Boolean { - return this.client.permissionController.getGrantedPermissions(this.PERMISSIONS).containsAll(this.PERMISSIONS) + return this.client.permissionController.getGrantedPermissions().containsAll(this.PERMISSIONS) } } diff --git a/app/src/main/java/com/dzeio/openhealth/ui/extension/ExtensionFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/extension/ExtensionFragment.kt index c383d8d..983feda 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/extension/ExtensionFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/extension/ExtensionFragment.kt @@ -38,9 +38,9 @@ class ExtensionFragment : override fun onAttach(context: Context) { if (this.extension.contract != null) { this.request = - registerForActivityResult(this.extension.contract!! as ActivityResultContract) { - this.extension.onActivityResult(it as Any) - } + registerForActivityResult(this.extension.contract!! as ActivityResultContract) { + this.extension.onActivityResult(it as Any) + } } super.onAttach(context) } diff --git a/app/src/main/java/com/dzeio/openhealth/ui/extensions/ExtensionsFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/extensions/ExtensionsFragment.kt index 2f2a661..592e968 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/extensions/ExtensionsFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/extensions/ExtensionsFragment.kt @@ -8,6 +8,7 @@ import android.view.ViewGroup import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager +import com.dzeio.openhealth.adapters.ItemAdapter import com.dzeio.openhealth.core.BaseFragment import com.dzeio.openhealth.databinding.FragmentExtensionsBinding import com.dzeio.openhealth.extensions.Extension @@ -35,21 +36,23 @@ class ExtensionsFragment : val manager = LinearLayoutManager(requireContext()) recycler.layoutManager = manager - val adapter = ExtensionAdapter(viewModel.config) + val adapter = ItemAdapter() adapter.onItemClick = { - activeExtension = it + activeExtension = it.value activeExtension.enable(this) - Log.d(TAG, "${it.id}: ${it.name}") + Log.d(TAG, "${activeExtension.id}: ${activeExtension.name}") lifecycleScope.launch { - extensionIsConnected(it) + extensionIsConnected(activeExtension) } } recycler.adapter = adapter - val list = viewModel.extensions - list.forEach { - it.enable(this) + val list = viewModel.extensions.map { + ItemAdapter.Item( + it, + it.name + ) } adapter.set(list) @@ -71,7 +74,7 @@ class ExtensionsFragment : private fun gotoExtension(it: Extension) { findNavController().navigate( - ExtensionsFragmentDirections.actionNavExtensionsToNavExtension(it.id) + ExtensionsFragmentDirections.actionExtensionsFragmentToExtensionFragment(it.id) ) } } diff --git a/app/src/main/res/layout/fragment_extension.xml b/app/src/main/res/layout/fragment_extension.xml new file mode 100644 index 0000000..552cc27 --- /dev/null +++ b/app/src/main/res/layout/fragment_extension.xml @@ -0,0 +1,39 @@ + + + + + +