An Android module for authenticating your app with the Fitbit Web API.
- In your projects root build.gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- In the project's build.gradle
dependencies {
implementation 'com.github.codeCasa:Android-Fitbit-Authentication-Manager:Tag'
}
- Add repo
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
- Add dependency
<dependency>
<groupId>com.github.codeCasa</groupId>
<artifactId>Android-Fitbit-Authentication-Manager</artifactId>
<version>Tag</version>
</dependency>
- Log into Fitbit Developer portal
- Register Your application
- Filled out application
- Submit your application
- Save your client secret and client id in safe place
<uses-permission android:name="android.permission.INTERNET"/>
<application
...
<activity
android:name="com.coding.casa.fitbit_authentication.ui.LoginActivity"
android:exported="true"
android:theme="@style/Theme.Fitbit.Teal">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="fitbit"
android:scheme="strongfoundation" />
</intent-filter>
</activity>
</application>
class MainActivity : AppCompatActivity() {
private lateinit var loginBtn: Button
private lateinit var authenticationManager: AuthenticationManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
authenticationManager = FitbitAuthenticationManager(this, "SOME_SECRET_KEY", "PREF_NAME", "strongfoundation://fitbit")
authenticationManager.configure(generateAuthenticationConfiguration(), 12)
loginBtn = findViewById(R.id.loginBtn)
loginBtn.setOnClickListener {
if(!authenticationManager.isLoggedIn) {
authenticationManager.login(this)
}else {
authenticationManager.logout(this, {
Snackbar.make(loginBtn, "Successfully logged out", Snackbar.LENGTH_SHORT).show()}, {
Snackbar.make(loginBtn, "Failed to logout, please try again", Snackbar.LENGTH_SHORT).show()
})
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
authenticationManager.onActivityResult(requestCode, resultCode, data) {
when(it.status) {
AuthenticationResult.Status.Successful -> {
Snackbar.make(loginBtn, "Successfully logged in", Snackbar.LENGTH_SHORT).show()
loginBtn.text = "Logout"
}
AuthenticationResult.Status.Dismissed -> {
}
AuthenticationResult.Status.Error -> {
Snackbar.make(loginBtn, "Failed to login, please try again", Snackbar.LENGTH_SHORT).show()
}
AuthenticationResult.Status.MissingRequiredScopes -> {
Snackbar.make(loginBtn, "Failed to logout, missing required scopes, please try again", Snackbar.LENGTH_SHORT).show()
}
null -> {
}
}
}
}
private fun generateAuthenticationConfiguration(): AuthenticationConfiguration {
val clientId = ""
val redirectUrl = ""
val clientSecret = ""
val clientCredentials = ClientCredentials(
clientId,
clientSecret,
redirectUrl
)
return AuthenticationConfigurationBuilder()
.setClientCredentials(clientCredentials)
.setTokenExpiresIn(31536000L) // 365 days
.setBeforeLoginActivity(Intent(this, MainActivity::class.java))
.addRequiredScopes(
Scope.profile,
Scope.activity,
Scope.nutrition,
Scope.weight,
Scope.heartrate
)
.setLogoutOnAuthFailure(true)
.build()
}
}