Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,6 @@
<activity android:name=".ui.activity.WorkoutDetailActivity" />
<activity android:name=".ui.activity.WorkoutActivity" />

<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />

<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
Expand Down
10 changes: 5 additions & 5 deletions app/src/main/java/at/shockbytes/corey/dagger/BodyModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import at.shockbytes.corey.data.body.bmr.RevisedHarrisBenedictBmrComputation
import at.shockbytes.corey.data.firebase.FirebaseDatabaseAccess
import at.shockbytes.corey.data.goal.FirebaseGoalsRepository
import at.shockbytes.corey.data.goal.GoalsRepository
import at.shockbytes.corey.data.google.CoreyGoogleApiClient
import at.shockbytes.corey.data.google.CoreyGoogleApi
import at.shockbytes.corey.ui.fragment.body.weight.filter.RawWeightLineFilter
import at.shockbytes.corey.ui.fragment.body.weight.filter.RunningAverageWeightLineFilter
import at.shockbytes.corey.ui.fragment.body.weight.filter.WeightLineFilter
Expand All @@ -23,8 +23,8 @@ class BodyModule(private val app: Application) {

@Provides
@Singleton
fun provideCoreyGoogleApiClient(): CoreyGoogleApiClient {
return CoreyGoogleApiClient(app.applicationContext)
fun provideCoreyGoogleApiClient(): CoreyGoogleApi {
return CoreyGoogleApi(app.applicationContext)
}

@Provides
Expand All @@ -35,12 +35,12 @@ class BodyModule(private val app: Application) {
@Provides
@Singleton
fun provideBodyRepository(
coreyGoogleApiClient: CoreyGoogleApiClient,
coreyGoogleApi: CoreyGoogleApi,
preferences: SharedPreferences,
firebase: FirebaseDatabaseAccess,
userSettings: UserSettings
): BodyRepository {
return GoogleFitBodyRepository(coreyGoogleApiClient, preferences, firebase, userSettings)
return GoogleFitBodyRepository(coreyGoogleApi, preferences, firebase, userSettings)
}

@Provides
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/at/shockbytes/corey/dagger/WorkoutModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import at.shockbytes.corey.common.core.location.LocationRepository
import at.shockbytes.corey.common.core.running.DefaultRunningManager
import at.shockbytes.corey.common.core.running.RunningManager
import at.shockbytes.corey.data.firebase.FirebaseDatabaseAccess
import at.shockbytes.corey.data.google.CoreyGoogleApiClient
import at.shockbytes.corey.data.google.CoreyGoogleApi
import at.shockbytes.corey.data.workout.FirebaseWorkoutRepository
import at.shockbytes.corey.data.workout.WorkoutRepository
import at.shockbytes.corey.data.workout.external.DummyExternalWorkoutRepository
Expand Down Expand Up @@ -53,7 +53,7 @@ class WorkoutModule(private val app: Application) {

@Provides
fun provideExternalWorkoutRepository(
coreyGoogleApiClient: CoreyGoogleApiClient
coreyGoogleApi: CoreyGoogleApi
): ExternalWorkoutRepository {
return DummyExternalWorkoutRepository()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ import at.shockbytes.corey.common.core.Gender
import at.shockbytes.corey.common.core.util.UserSettings
import at.shockbytes.corey.common.core.CoreyDate
import at.shockbytes.corey.data.body.model.User
import at.shockbytes.corey.data.body.model.WeightDataPoint
import at.shockbytes.corey.data.firebase.FirebaseDatabaseAccess
import at.shockbytes.corey.data.google.CoreyGoogleApiClient
import at.shockbytes.corey.data.google.CoreyGoogleApi
import at.shockbytes.corey.data.google.GoogleFitUserData
import at.shockbytes.corey.util.fromFirebase
import at.shockbytes.corey.util.updateValue
import io.reactivex.Observable
Expand All @@ -21,7 +23,7 @@ import timber.log.Timber
* Date: 04.08.2016
*/
class GoogleFitBodyRepository(
private val coreyGoogleApiClient: CoreyGoogleApiClient,
private val coreyGoogleApi: CoreyGoogleApi,
private val preferences: SharedPreferences,
private val firebase: FirebaseDatabaseAccess,
private val userSettings: UserSettings
Expand All @@ -34,9 +36,20 @@ class GoogleFitBodyRepository(
private val desiredWeightSubject: BehaviorSubject<Int> = BehaviorSubject
.createDefault(preferences.getInt(PREF_DREAM_WEIGHT, 0))

// TODO Remove this once the OAuth screen is cleared
private val defaultValue = GoogleFitUserData(
height = 182,
weightHistory = listOf(
WeightDataPoint(
timeStamp = System.currentTimeMillis(),
weight = 77.1
)
)
)

init {
setupFirebase()
setupApiClientCallback()
loadFitnessData()
}

private fun setupFirebase() {
Expand Down Expand Up @@ -72,18 +85,16 @@ class GoogleFitBodyRepository(
val activityLevel: ActivityLevel
)

private fun setupApiClientCallback() {
coreyGoogleApiClient.onConnectionEvent()
.filter { isConnected -> isConnected }
.flatMap { loadUserFromGoogleFit() }
private fun loadFitnessData() {
loadUserFromGoogleFit()
.subscribe(userBodySubject::onNext, Timber::e)
.addTo(compositeDisposable)
}

private fun loadUserFromGoogleFit(): Observable<User> {
return Observable
.combineLatest(
coreyGoogleApiClient.loadGoogleFitUserData(),
coreyGoogleApi.loadGoogleFitUserData(defaultValue),
gatherUserMetadata(),
{ weightHeightPair, userMetadata ->
val (weightDataPoints, height) = weightHeightPair
Expand Down
Original file line number Diff line number Diff line change
@@ -1,48 +1,45 @@
package at.shockbytes.corey.data.google

import android.content.Context
import android.os.Bundle
import android.widget.Toast
import at.shockbytes.corey.common.roundDouble
import at.shockbytes.corey.data.body.model.WeightDataPoint
import com.google.android.gms.common.ConnectionResult
import com.google.android.gms.common.Scopes
import com.google.android.gms.common.api.GoogleApiClient
import com.google.android.gms.common.api.Scope
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.android.gms.fitness.Fitness
import com.google.android.gms.fitness.FitnessOptions
import com.google.android.gms.fitness.HistoryClient
import com.google.android.gms.fitness.data.DataSet
import com.google.android.gms.fitness.data.DataType
import com.google.android.gms.fitness.data.HealthDataTypes
import com.google.android.gms.fitness.request.DataReadRequest
import com.google.android.gms.fitness.result.DataReadResult
import com.google.android.gms.fitness.result.DataReadResponse
import io.reactivex.Observable
import io.reactivex.subjects.BehaviorSubject
import org.joda.time.DateTime
import java.util.concurrent.TimeUnit

/**
* Author: Martin Macheiner
* Date: 30.09.2020
*/
class CoreyGoogleApiClient(
private val context: Context
) : GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

private val connectionSubject = BehaviorSubject.createDefault(false)
fun onConnectionEvent(): Observable<Boolean> = connectionSubject

private val apiClient: GoogleApiClient = GoogleApiClient.Builder(context)
.addApi(Fitness.HISTORY_API)
.addApi(Fitness.RECORDING_API)
.addScope(Scope(Scopes.FITNESS_BODY_READ_WRITE))
.addScope(Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE))
.addConnectionCallbacks(this)
.build()

init {
apiClient.connect()
class CoreyGoogleApi(private val context: Context) {

private val signInAccount: GoogleSignInAccount by lazy {
GoogleSignIn.getAccountForExtension(
context,
FitnessOptions.builder()
.addDataType(DataType.TYPE_CALORIES_EXPENDED)
.addDataType(DataType.TYPE_WEIGHT)
.addDataType(DataType.TYPE_HEIGHT)
.addDataType(HealthDataTypes.TYPE_BLOOD_PRESSURE)
.build()
)
}

private data class A(
private val fitnessHistoryClient: HistoryClient by lazy {
Fitness.getHistoryClient(context, signInAccount)
}

private data class IntermediateCalories(
val timestamp: Long,
val calories: Float
)
Expand All @@ -55,7 +52,7 @@ class CoreyGoogleApiClient(
.map { dp ->
val timeStamp = dp.getStartTime(TimeUnit.MILLISECONDS)
val calories = dp.getValue(dp.dataType.fields[0]).asFloat()
A(timeStamp, calories)
IntermediateCalories(timeStamp, calories)
}
.groupBy { a ->
DateTime(a.timestamp).withTimeAtStartOfDay()
Expand Down Expand Up @@ -85,26 +82,31 @@ class CoreyGoogleApiClient(
.build()
}

fun loadGoogleFitUserData(): Observable<GoogleFitUserData> {
fun loadGoogleFitUserData(
defaultValue: GoogleFitUserData = GoogleFitUserData(listOf(), 0)
): Observable<GoogleFitUserData> {
return fitnessHistoryToObservable(buildGoogleFitRequest()) { result ->

val weightHistory = retrieveWeightHistory(result.getDataSet(DataType.TYPE_WEIGHT))
val height = retrieveHeight(result.getDataSet(DataType.TYPE_HEIGHT))

GoogleFitUserData(weightHistory, height)
}
}.onErrorReturnItem(defaultValue)
}

private fun <T> fitnessHistoryToObservable(
readRequest: DataReadRequest,
mapper: (DataReadResult) -> T
mapper: (DataReadResponse) -> T
): Observable<T> {
return Observable.create { emitter ->
Fitness.HistoryApi.readData(apiClient, readRequest)
.setResultCallback { result ->
val transformed = mapper(result)
fitnessHistoryClient.readData(readRequest)
.addOnSuccessListener { response ->
val transformed = mapper(response)
emitter.onNext(transformed)
}
.addOnFailureListener { exception ->
emitter.tryOnError(exception)
}
}
}

Expand Down Expand Up @@ -143,19 +145,4 @@ class CoreyGoogleApiClient(
.toInt()
} else 0
}

override fun onConnected(bundle: Bundle?) {
connectionSubject.onNext(true)
}

override fun onConnectionSuspended(i: Int) {
Toast.makeText(context, "Connection suspended: $i", Toast.LENGTH_LONG).show()
}

override fun onConnectionFailed(connectionResult: ConnectionResult) {
connectionSubject.onNext(false)
Toast.makeText(context,
"Exception while connecting to Google Play Services: ${connectionResult.errorMessage}",
Toast.LENGTH_LONG).show()
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
package at.shockbytes.corey.data.workout.external

import at.shockbytes.corey.data.google.CoreyGoogleApiClient
import at.shockbytes.corey.data.google.CoreyGoogleApi
import at.shockbytes.corey.util.WorkInProgress
import io.reactivex.Observable

@WorkInProgress
class GoogleFitExternalWorkoutRepository(
private val coreyGoogleApiClient: CoreyGoogleApiClient
private val coreyGoogleApi: CoreyGoogleApi
) : ExternalWorkoutRepository {

override fun loadExternalWorkouts(): Observable<List<ExternalWorkout>> {
return coreyGoogleApiClient.onConnectionEvent()
.filter { isConnected -> isConnected }
.flatMap { coreyGoogleApiClient.loadGoogleFitWorkouts() }
return coreyGoogleApi.loadGoogleFitWorkouts()
.map { googleFitWorkouts ->
listOf()
}
Expand Down
6 changes: 0 additions & 6 deletions app/src/main/res/values/google_maps_api.xml

This file was deleted.