tauri-plugin-healthkit 0.1.3

A Tauri plugin for accessing HealthKit (iOS) and Health Connect (Android)
package life.thephage.healthkit

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.health.connect.client.PermissionController

class HealthConnectActivity : AppCompatActivity() {
    companion object {
        const val PERMISSIONS_EXTRA = "permissions"
        const val RESULT_EXTRA_PREFIX = "health_connect."
        const val RESULT_GRANTED_PERMISSIONS = "granted_permissions"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Intentから権限リストを取得
        val permissions = intent.getStringArrayExtra(PERMISSIONS_EXTRA)?.toSet() ?: emptySet()

        if (permissions.isEmpty()) {
            // 権限リストが空の場合は何もせずに終了
            finishWithResult(emptySet())
            return
        }

        // 権限リクエストを実行
        val contract = PermissionController.createRequestPermissionResultContract()
        val launcher = registerForActivityResult(contract) { grantedPermissions ->
            // 結果を返してActivityを終了
            finishWithResult(grantedPermissions)
        }

        // Activityが再生成された場合は再度launchしない(結果は自動的にコールバックに届く)
        if (savedInstanceState == null) {
            launcher.launch(permissions)
        }
    }

    private fun finishWithResult(grantedPermissions: Set<String>) {
        val intent = Intent()
        val prefix = RESULT_EXTRA_PREFIX
        
        // 短い識別子のリストに変換
        val shortNames = HealthPermissionUtil.toShortNames(grantedPermissions)
        
        // 結果をIntentに格納
        intent.putExtra(prefix + RESULT_GRANTED_PERMISSIONS, shortNames.toTypedArray())
        
        // 結果を設定して終了
        setResult(Activity.RESULT_OK, intent)
        finish()
    }
}