Compare commits
4 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
519ce695d6 | 3 months ago |
|
|
7a5b753f63 | 4 months ago |
|
|
a30b9872b2 | 5 months ago |
|
|
8b9e757e61 | 5 months ago |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 949 B |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
@ -1 +0,0 @@
|
||||
{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"}]}
|
||||
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 40 KiB |
@ -1,6 +0,0 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgaPetsOq3tqUlswBN
|
||||
BFUWIIdEg4dcTCGRUKbAEx8ViFygCgYIKoZIzj0DAQehRANCAAS6IKkZ4tCeBlN6
|
||||
DtXiBekCiIbgHxWk8AWppP0H3mJ+I2s8cIEaquL4/yeLDcHzAHf8tHcYhF/TvggT
|
||||
nc30yDLv
|
||||
-----END PRIVATE KEY-----
|
||||
@ -1 +0,0 @@
|
||||
{"agcgw":{"url":"connect-drcn.dbankcloud.cn","backurl":"connect-drcn.hispace.hicloud.com","websocketurl":"connect-ws-drcn.hispace.dbankcloud.cn","websocketbackurl":"connect-ws-drcn.hispace.dbankcloud.com"},"agcgw_all":{"SG":"connect-dra.dbankcloud.cn","SG_back":"connect-dra.hispace.hicloud.com","CN":"connect-drcn.dbankcloud.cn","CN_back":"connect-drcn.hispace.hicloud.com","RU":"connect-drru.hispace.dbankcloud.ru","RU_back":"connect-drru.hispace.dbankcloud.cn","DE":"connect-dre.dbankcloud.cn","DE_back":"connect-dre.hispace.hicloud.com"},"websocketgw_all":{"SG":"connect-ws-dra.hispace.dbankcloud.cn","SG_back":"connect-ws-dra.hispace.dbankcloud.com","CN":"connect-ws-drcn.hispace.dbankcloud.cn","CN_back":"connect-ws-drcn.hispace.dbankcloud.com","RU":"connect-ws-drru.hispace.dbankcloud.ru","RU_back":"connect-ws-drru.hispace.dbankcloud.cn","DE":"connect-ws-dre.hispace.dbankcloud.cn","DE_back":"connect-ws-dre.hispace.dbankcloud.com"},"client":{"cp_id":"2640966000002322881","product_id":"736430079244816567","client_id":"563735388191982656","client_secret":"650C7C799812AFFD53A10C7756CF05FB9F215A7E49032ABA8EBF3E14B77535CF","project_id":"736430079244816567","app_id":"116912301","api_key":"CgB6e3x9DJzMgRCmnT6dyUEkp6UsIfddb6l3w0ZEXzeiRMHEFi3400Z5fJ5qaHneU0OrAI/JRpk+DMGVs3QpUxlI","package_name":"com.cloudsolutions.HMGPatientApp"},"oauth_client":{"client_id":"116912301","client_type":1},"app_info":{"app_id":"116912301","package_name":"com.cloudsolutions.HMGPatientApp"},"service":{"analytics":{"collector_url":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn","collector_url_cn":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn","collector_url_de":"datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn","collector_url_ru":"datacollector-drru.dt.dbankcloud.ru,datacollector-drru.dt.hicloud.com","collector_url_sg":"datacollector-dra.dt.hicloud.com,datacollector-dra.dt.dbankcloud.cn","resource_id":"p1","channel_id":""},"ml":{"mlservice_url":"ml-api-drcn.ai.dbankcloud.com,ml-api-drcn.ai.dbankcloud.cn"},"cloudstorage":{"storage_url":"https://agc-storage-drcn.platform.dbankcloud.cn","storage_url_ru":"https://agc-storage-drru.cloud.huawei.ru","storage_url_sg":"https://ops-dra.agcstorage.link","storage_url_de":"https://ops-dre.agcstorage.link","storage_url_cn":"https://agc-storage-drcn.platform.dbankcloud.cn","storage_url_ru_back":"https://agc-storage-drru.cloud.huawei.ru","storage_url_sg_back":"https://agc-storage-dra.cloud.huawei.asia","storage_url_de_back":"https://agc-storage-dre.cloud.huawei.eu","storage_url_cn_back":"https://agc-storage-drcn.cloud.huawei.com.cn"},"search":{"url":"https://search-drcn.cloud.huawei.com"},"edukit":{"edu_url":"edukit.cloud.huawei.com.cn","dh_url":"edukit.cloud.huawei.com.cn"}},"region":"CN","configuration_version":"3.0","appInfos":[{"package_name":"com.cloudsolutions.HMGPatientApp","client":{"app_id":"116912301"},"app_info":{"package_name":"com.cloudsolutions.HMGPatientApp","app_id":"116912301"},"oauth_client":{"client_type":1,"client_id":"116912301"}},{"package_name":"com.ejada.hmg","client":{"app_id":"102857389"},"app_info":{"package_name":"com.ejada.hmg","app_id":"102857389"},"oauth_client":{"client_type":1,"client_id":"102857389"}}]}
|
||||
@ -1 +1,74 @@
|
||||
{"agcgw":{"url":"connect-drcn.dbankcloud.cn","backurl":"connect-drcn.hispace.hicloud.com","websocketurl":"connect-ws-drcn.hispace.dbankcloud.cn","websocketbackurl":"connect-ws-drcn.hispace.dbankcloud.com"},"agcgw_all":{"SG":"connect-dra.dbankcloud.cn","SG_back":"connect-dra.hispace.hicloud.com","CN":"connect-drcn.dbankcloud.cn","CN_back":"connect-drcn.hispace.hicloud.com","RU":"connect-drru.hispace.dbankcloud.ru","RU_back":"connect-drru.hispace.dbankcloud.cn","DE":"connect-dre.dbankcloud.cn","DE_back":"connect-dre.hispace.hicloud.com"},"websocketgw_all":{"SG":"connect-ws-dra.hispace.dbankcloud.cn","SG_back":"connect-ws-dra.hispace.dbankcloud.com","CN":"connect-ws-drcn.hispace.dbankcloud.cn","CN_back":"connect-ws-drcn.hispace.dbankcloud.com","RU":"connect-ws-drru.hispace.dbankcloud.ru","RU_back":"connect-ws-drru.hispace.dbankcloud.cn","DE":"connect-ws-dre.hispace.dbankcloud.cn","DE_back":"connect-ws-dre.hispace.dbankcloud.com"},"client":{"cp_id":"2640966000002322881","product_id":"736430079244816567","client_id":"563735388191982656","client_secret":"650C7C799812AFFD53A10C7756CF05FB9F215A7E49032ABA8EBF3E14B77535CF","project_id":"736430079244816567","app_id":"116912301","api_key":"CgB6e3x9DJzMgRCmnT6dyUEkp6UsIfddb6l3w0ZEXzeiRMHEFi3400Z5fJ5qaHneU0OrAI/JRpk+DMGVs3QpUxlI","package_name":"com.cloudsolutions.HMGPatientApp"},"oauth_client":{"client_id":"116912301","client_type":1},"app_info":{"app_id":"116912301","package_name":"com.cloudsolutions.HMGPatientApp"},"service":{"analytics":{"collector_url":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn","collector_url_cn":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn","collector_url_de":"datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn","collector_url_ru":"datacollector-drru.dt.dbankcloud.ru,datacollector-drru.dt.hicloud.com","collector_url_sg":"datacollector-dra.dt.hicloud.com,datacollector-dra.dt.dbankcloud.cn","resource_id":"p1","channel_id":""},"ml":{"mlservice_url":"ml-api-drcn.ai.dbankcloud.com,ml-api-drcn.ai.dbankcloud.cn"},"cloudstorage":{"storage_url":"https://agc-storage-drcn.platform.dbankcloud.cn","storage_url_ru":"https://agc-storage-drru.cloud.huawei.ru","storage_url_sg":"https://ops-dra.agcstorage.link","storage_url_de":"https://ops-dre.agcstorage.link","storage_url_cn":"https://agc-storage-drcn.platform.dbankcloud.cn","storage_url_ru_back":"https://agc-storage-drru.cloud.huawei.ru","storage_url_sg_back":"https://agc-storage-dra.cloud.huawei.asia","storage_url_de_back":"https://agc-storage-dre.cloud.huawei.eu","storage_url_cn_back":"https://agc-storage-drcn.cloud.huawei.com.cn"},"search":{"url":"https://search-drcn.cloud.huawei.com"},"edukit":{"edu_url":"edukit.cloud.huawei.com.cn","dh_url":"edukit.cloud.huawei.com.cn"}},"region":"CN","configuration_version":"3.0","appInfos":[{"package_name":"com.cloudsolutions.HMGPatientApp","client":{"app_id":"116912301"},"app_info":{"package_name":"com.cloudsolutions.HMGPatientApp","app_id":"116912301"},"oauth_client":{"client_type":1,"client_id":"116912301"}},{"package_name":"com.ejada.hmg","client":{"app_id":"102857389"},"app_info":{"package_name":"com.ejada.hmg","app_id":"102857389"},"oauth_client":{"client_type":1,"client_id":"102857389"}}]}
|
||||
{
|
||||
"agcgw":{
|
||||
"backurl":"connect-drcn.hispace.hicloud.com",
|
||||
"url":"connect-drcn.dbankcloud.cn",
|
||||
"websocketbackurl":"connect-ws-drcn.hispace.dbankcloud.com",
|
||||
"websocketurl":"connect-ws-drcn.hispace.dbankcloud.cn"
|
||||
},
|
||||
"agcgw_all":{
|
||||
"CN":"connect-drcn.dbankcloud.cn",
|
||||
"CN_back":"connect-drcn.hispace.hicloud.com",
|
||||
"DE":"connect-dre.dbankcloud.cn",
|
||||
"DE_back":"connect-dre.hispace.hicloud.com",
|
||||
"RU":"connect-drru.dbankcloud.cn",
|
||||
"RU_back":"connect-drru.hispace.hicloud.com",
|
||||
"SG":"connect-dra.dbankcloud.cn",
|
||||
"SG_back":"connect-dra.hispace.hicloud.com"
|
||||
},
|
||||
"client":{
|
||||
"cp_id":"2640966000002322881",
|
||||
"product_id":"736430079244816567",
|
||||
"client_id":"563735388191982656",
|
||||
"client_secret":"650C7C799812AFFD53A10C7756CF05FB9F215A7E49032ABA8EBF3E14B77535CF",
|
||||
"project_id":"736430079244816567",
|
||||
"app_id":"102857389",
|
||||
"api_key":"CgB6e3x9DJzMgRCmnT6dyUEkp6UsIfddb6l3w0ZEXzeiRMHEFi3400Z5fJ5qaHneU0OrAI/JRpk+DMGVs3QpUxlI",
|
||||
"package_name":"com.ejada.hmg"
|
||||
},
|
||||
"oauth_client":{
|
||||
"client_id":"102857389",
|
||||
"client_type":1
|
||||
},
|
||||
"app_info":{
|
||||
"app_id":"102857389",
|
||||
"package_name":"com.ejada.hmg"
|
||||
},
|
||||
"service":{
|
||||
"analytics":{
|
||||
"collector_url":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn",
|
||||
"collector_url_ru":"datacollector-drru.dt.hicloud.com,datacollector-drru.dt.dbankcloud.cn",
|
||||
"collector_url_sg":"datacollector-dra.dt.hicloud.com,datacollector-dra.dt.dbankcloud.cn",
|
||||
"collector_url_de":"datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn",
|
||||
"collector_url_cn":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn",
|
||||
"resource_id":"p1",
|
||||
"channel_id":""
|
||||
},
|
||||
"search":{
|
||||
"url":"https://search-drcn.cloud.huawei.com"
|
||||
},
|
||||
"cloudstorage":{
|
||||
"storage_url":"https://agc-storage-drcn.platform.dbankcloud.cn"
|
||||
},
|
||||
"ml":{
|
||||
"mlservice_url":"ml-api-drcn.ai.dbankcloud.com,ml-api-drcn.ai.dbankcloud.cn"
|
||||
}
|
||||
},
|
||||
"region":"CN",
|
||||
"configuration_version":"3.0",
|
||||
"appInfos":[
|
||||
{
|
||||
"package_name":"com.ejada.hmg",
|
||||
"client":{
|
||||
"app_id":"102857389"
|
||||
},
|
||||
"app_info":{
|
||||
"package_name":"com.ejada.hmg",
|
||||
"app_id":"102857389"
|
||||
},
|
||||
"oauth_client":{
|
||||
"client_type":1,
|
||||
"client_id":"102857389"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -1,402 +0,0 @@
|
||||
package com.cloudsolutions.HMGPatientApp.watch.samsung_watch
|
||||
|
||||
|
||||
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.annotation.RequiresApi
|
||||
import com.cloudsolutions.HMGPatientApp.MainActivity
|
||||
import com.cloudsolutions.HMGPatientApp.watch.samsung_watch.model.Vitals
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugin.common.MethodCall
|
||||
import com.samsung.android.sdk.health.data.HealthDataService
|
||||
import com.samsung.android.sdk.health.data.HealthDataStore
|
||||
import com.samsung.android.sdk.health.data.data.AggregatedData
|
||||
import com.samsung.android.sdk.health.data.data.HealthDataPoint
|
||||
import com.samsung.android.sdk.health.data.permission.AccessType
|
||||
import com.samsung.android.sdk.health.data.permission.Permission
|
||||
import com.samsung.android.sdk.health.data.request.DataType
|
||||
import com.samsung.android.sdk.health.data.request.DataTypes
|
||||
import com.samsung.android.sdk.health.data.request.LocalTimeFilter
|
||||
import com.samsung.android.sdk.health.data.request.LocalTimeGroup
|
||||
import com.samsung.android.sdk.health.data.request.LocalTimeGroupUnit
|
||||
import com.samsung.android.sdk.health.data.request.Ordering
|
||||
import com.samsung.android.sdk.health.data.response.DataResponse
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
import kotlinx.coroutines.cancel
|
||||
import kotlinx.coroutines.launch
|
||||
import java.time.LocalDateTime
|
||||
import java.time.LocalTime
|
||||
|
||||
class SamsungWatch(
|
||||
private var flutterEngine: FlutterEngine,
|
||||
private var mainActivity: MainActivity
|
||||
) {
|
||||
|
||||
private lateinit var channel: MethodChannel
|
||||
private lateinit var dataStore: HealthDataStore
|
||||
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
|
||||
private val TAG = "SamsungWatch"
|
||||
|
||||
|
||||
private lateinit var vitals: MutableMap<String, List<Vitals>>
|
||||
companion object {
|
||||
private const val CHANNEL = "samsung_watch"
|
||||
|
||||
}
|
||||
init{
|
||||
create()
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.O)
|
||||
fun create() {
|
||||
Log.d(TAG, "create: is called")
|
||||
// openTok = OpenTok(mainActivity, flutterEngine)
|
||||
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
|
||||
channel.setMethodCallHandler { call: MethodCall, result: MethodChannel.Result ->
|
||||
when (call.method) {
|
||||
"init" -> {
|
||||
Log.d(TAG, "onMethodCall: init called")
|
||||
dataStore = HealthDataService.getStore(mainActivity)
|
||||
vitals = mutableMapOf()
|
||||
result.success("initialized")
|
||||
}
|
||||
|
||||
"getPermission"->{
|
||||
if(!this::dataStore.isInitialized)
|
||||
result.error("DataStoreNotInitialized", "Please call init before requesting permissions", null)
|
||||
val permSet = setOf(
|
||||
Permission.of(DataTypes.HEART_RATE, AccessType.READ),
|
||||
Permission.of(DataTypes.STEPS, AccessType.READ),
|
||||
Permission.of(DataTypes.BLOOD_OXYGEN, AccessType.READ),
|
||||
Permission.of(DataTypes.ACTIVITY_SUMMARY, AccessType.READ),
|
||||
Permission.of(DataTypes.SLEEP, AccessType.READ),
|
||||
Permission.of(DataTypes.BODY_TEMPERATURE, AccessType.READ),
|
||||
Permission.of(DataTypes.EXERCISE, AccessType.READ),
|
||||
// Permission.of(DataTypes.SKIN_TEMPERATURE, AccessType.READ),
|
||||
// Permission.of(DataTypes.NUTRITION, AccessType.READ),
|
||||
|
||||
)
|
||||
scope.launch {
|
||||
try {
|
||||
var granted = dataStore.getGrantedPermissions(permSet)
|
||||
|
||||
if (granted.containsAll(permSet)) {
|
||||
result.success("Permission Granted")
|
||||
return@launch
|
||||
}
|
||||
|
||||
granted = dataStore.requestPermissions(permSet, mainActivity)
|
||||
|
||||
if (granted.containsAll(permSet)) {
|
||||
result.success("Permission Granted") // adapt result as needed
|
||||
return@launch
|
||||
}
|
||||
result.error("PermissionError", "Permission Not Granted", null) // adapt result as needed
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "create: getPermission failed", e)
|
||||
result.error("PermissionError", e.message, null)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"getHeartRate"->{
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val readRequest = DataTypes.HEART_RATE.readDataRequestBuilder
|
||||
.setLocalTimeFilter(localTimeFilter)
|
||||
.setOrdering(Ordering.DESC)
|
||||
.build()
|
||||
|
||||
scope.launch {
|
||||
val heartRateList = dataStore.readData(readRequest).dataList
|
||||
processHeartVital(heartRateList)
|
||||
Log.d("TAG"," the data is ${vitals}")
|
||||
print("the data is ${vitals}")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
"getSleepData" -> {
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val readRequest = DataTypes.SLEEP.readDataRequestBuilder
|
||||
.setLocalTimeFilter(localTimeFilter)
|
||||
.setOrdering(Ordering.ASC)
|
||||
.build()
|
||||
scope.launch {
|
||||
val sleepData = dataStore.readData(readRequest).dataList
|
||||
processSleepVital(sleepData)
|
||||
print("the data is $vitals")
|
||||
Log.d(TAG, "the data is $vitals")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
"steps"->{
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val localTimeGroup = LocalTimeGroup.of(LocalTimeGroupUnit.HOURLY, 1)
|
||||
val aggregateRequest = DataType.StepsType.TOTAL.requestBuilder
|
||||
.setLocalTimeFilterWithGroup(localTimeFilter, localTimeGroup)
|
||||
.setOrdering(Ordering.ASC)
|
||||
.build()
|
||||
|
||||
scope.launch {
|
||||
val steps = dataStore.aggregateData(aggregateRequest)
|
||||
processStepsCount(steps)
|
||||
print("the data is $vitals")
|
||||
Log.d(TAG, "the data is $vitals")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
}
|
||||
|
||||
"activitySummary"->{
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val localTimeGroup = LocalTimeGroup.of(LocalTimeGroupUnit.HOURLY, 1)
|
||||
val readRequest = DataType.ActivitySummaryType.TOTAL_ACTIVE_CALORIES_BURNED
|
||||
.requestBuilder
|
||||
.setLocalTimeFilterWithGroup(localTimeFilter, localTimeGroup)
|
||||
.setOrdering(Ordering.DESC)
|
||||
.build()
|
||||
|
||||
scope.launch {
|
||||
val activityResult = dataStore.aggregateData(readRequest).dataList
|
||||
processActivity(activityResult)
|
||||
Log.d("TAG"," the data is ${vitals}")
|
||||
print("the data is ${vitals}")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
|
||||
// val readRequest = DataTypes.EXERCISE.readDataRequestBuilder
|
||||
// .setLocalTimeFilter(localTimeFilter)
|
||||
// .build()
|
||||
//
|
||||
// scope.launch{
|
||||
// try {
|
||||
// val readResult = dataStore.readData(readRequest)
|
||||
// val dataPoints = readResult.dataList
|
||||
//
|
||||
// processActivity(dataPoints)
|
||||
//
|
||||
//
|
||||
// } catch (e: Exception) {
|
||||
// e.printStackTrace()
|
||||
// }
|
||||
// result.success("Data is obtained")
|
||||
// }
|
||||
}
|
||||
|
||||
"bloodOxygen"->{
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val readRequest = DataTypes.BLOOD_OXYGEN.readDataRequestBuilder
|
||||
.setLocalTimeFilter(localTimeFilter)
|
||||
.setOrdering(Ordering.DESC)
|
||||
.build()
|
||||
|
||||
scope.launch {
|
||||
val bloodOxygenList = dataStore.readData(readRequest).dataList
|
||||
processBloodOxygen(bloodOxygenList)
|
||||
Log.d("TAG"," the data is ${vitals}")
|
||||
print("the data is ${vitals["bloodOxygen"]}")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
"bodyTemperature"->{
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val readRequest = DataTypes.BODY_TEMPERATURE.readDataRequestBuilder
|
||||
.setLocalTimeFilter(localTimeFilter)
|
||||
.setOrdering(Ordering.DESC)
|
||||
.build()
|
||||
|
||||
scope.launch {
|
||||
val bodyTemperatureList = dataStore.readData(readRequest).dataList
|
||||
processBodyTemperature(bodyTemperatureList)
|
||||
Log.d("TAG"," the data is ${vitals}")
|
||||
print("the data is ${vitals["bodyTemperature"]}")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
}
|
||||
|
||||
"distance"->{
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val localTimeGroup = LocalTimeGroup.of(LocalTimeGroupUnit.HOURLY, 1)
|
||||
val readRequest = DataType.ActivitySummaryType.TOTAL_DISTANCE.requestBuilder
|
||||
.setLocalTimeFilterWithGroup(localTimeFilter, localTimeGroup)
|
||||
.setOrdering(Ordering.DESC)
|
||||
.build()
|
||||
|
||||
scope.launch {
|
||||
val activityResult = dataStore.aggregateData(readRequest).dataList
|
||||
processDistance(activityResult)
|
||||
Log.d("TAG"," the data is ${vitals}")
|
||||
print("the data is ${vitals}")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
}
|
||||
|
||||
"retrieveData"->{
|
||||
if(vitals.isEmpty()){
|
||||
result.error("NoDataFound", "No Data was obtained", null)
|
||||
return@setMethodCallHandler
|
||||
}
|
||||
result.success("""
|
||||
{
|
||||
"heartRate": ${vitals["heartRate"]},
|
||||
"steps": ${vitals["steps"]},
|
||||
"sleep": ${vitals["sleep"]},
|
||||
"activity": ${vitals["activity"]},
|
||||
"bloodOxygen": ${vitals["bloodOxygen"]},
|
||||
"bodyTemperature": ${vitals["bodyTemperature"]},
|
||||
"distance": ${vitals["distance"]}
|
||||
}
|
||||
""".trimIndent())
|
||||
}
|
||||
|
||||
|
||||
"closeCoroutineScope"->{
|
||||
destroy()
|
||||
result.success("Coroutine Scope Cancelled")
|
||||
}
|
||||
|
||||
else -> {
|
||||
result.notImplemented()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun CoroutineScope.processDistance(activityResult: List<AggregatedData<Float>>) {
|
||||
vitals["distance"] = mutableListOf()
|
||||
activityResult.forEach { stepData ->
|
||||
val vitalData = Vitals().apply {
|
||||
|
||||
value = stepData.value.toString()
|
||||
timeStamp = stepData.startTime.toString()
|
||||
}
|
||||
(vitals["distance"] as MutableList).add(vitalData)
|
||||
}
|
||||
}
|
||||
|
||||
private fun CoroutineScope.processBodyTemperature( bodyTemperatureList :List<HealthDataPoint>) {
|
||||
vitals["bodyTemperature"] = mutableListOf()
|
||||
bodyTemperatureList.forEach { stepData ->
|
||||
val vitalData = Vitals().apply {
|
||||
value = stepData.getValue(DataType.BodyTemperatureType.BODY_TEMPERATURE).toString()
|
||||
timeStamp = stepData.endTime.toString()
|
||||
}
|
||||
(vitals["bodyTemperature"] as MutableList).add(vitalData)
|
||||
}
|
||||
}
|
||||
|
||||
private fun CoroutineScope.processBloodOxygen( bloodOxygenList :List<HealthDataPoint>) {
|
||||
vitals["bloodOxygen"] = mutableListOf()
|
||||
bloodOxygenList.forEach { stepData ->
|
||||
val vitalData = Vitals().apply {
|
||||
value = stepData.getValue(DataType.BloodOxygenType.OXYGEN_SATURATION).toString()
|
||||
timeStamp = stepData.endTime.toString()
|
||||
}
|
||||
(vitals["bloodOxygen"] as MutableList).add(vitalData)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// private fun CoroutineScope.processActivity(activityResult: List<AggregatedData<Float>>) {
|
||||
//
|
||||
// vitals["activity"] = mutableListOf()
|
||||
// activityResult.forEach { stepData ->
|
||||
// val vitalData = Vitals().apply {
|
||||
//
|
||||
// value = stepData.value.toString()
|
||||
// timeStamp = stepData.startTime.toString()
|
||||
// }
|
||||
// (vitals["activity"] as MutableList).add(vitalData)
|
||||
// }
|
||||
// }
|
||||
private fun CoroutineScope.processActivity(activityResult: List<AggregatedData<Float>>) {
|
||||
|
||||
vitals["activity"] = mutableListOf()
|
||||
activityResult.forEach { stepData ->
|
||||
val vitalData = Vitals().apply {
|
||||
|
||||
value = stepData.value.toString()
|
||||
timeStamp = stepData.startTime.toString()
|
||||
}
|
||||
(vitals["activity"] as MutableList).add(vitalData)
|
||||
}
|
||||
|
||||
// dataPoints.forEach { dataPoint ->
|
||||
// val sessions = dataPoint.getValue(DataType.ExerciseType.SESSIONS)
|
||||
//
|
||||
// sessions?.forEach { session ->
|
||||
//
|
||||
// val exerciseSessionCalories = session.calories
|
||||
// val vitalData = Vitals().apply {
|
||||
// value = exerciseSessionCalories.toString()
|
||||
// timeStamp = session.startTime.toString()
|
||||
// }
|
||||
// (vitals["activity"] as MutableList).add(vitalData)
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
private fun CoroutineScope.processStepsCount(result: DataResponse<AggregatedData<Long>>) {
|
||||
val stepCount = ArrayList<AggregatedData<Long>>()
|
||||
var totalSteps: Long = 0
|
||||
vitals["steps"] = mutableListOf()
|
||||
result.dataList.forEach { stepData ->
|
||||
val vitalData = Vitals().apply {
|
||||
value = (stepData.value as Long).toString()
|
||||
timeStamp = stepData.startTime.toString()
|
||||
}
|
||||
(vitals["steps"] as MutableList).add(vitalData)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun CoroutineScope.processSleepVital(sleepData: List<HealthDataPoint>) {
|
||||
vitals["sleep"] = mutableListOf()
|
||||
sleepData.forEach {
|
||||
(vitals["sleep"] as MutableList).add(
|
||||
Vitals().apply {
|
||||
timeStamp = it.startTime.toString()
|
||||
value = (it.getValue(DataType.SleepType.DURATION)?.toMillis().toString())
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun CoroutineScope.processHeartVital(
|
||||
heartRateList: List<HealthDataPoint>,
|
||||
) {
|
||||
vitals["heartRate"] = mutableListOf()
|
||||
heartRateList.forEach {
|
||||
(vitals["heartRate"] as MutableList).add(processHeartRateData(it))
|
||||
}
|
||||
}
|
||||
|
||||
private fun processHeartRateData(heartRateData: HealthDataPoint) =
|
||||
Vitals().apply {
|
||||
heartRateData.getValue(DataType.HeartRateType.MAX_HEART_RATE)?.let {
|
||||
value = it.toString()
|
||||
}
|
||||
timeStamp = heartRateData.startTime.toString()
|
||||
}
|
||||
|
||||
|
||||
fun destroy() {
|
||||
scope.cancel()
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,13 +0,0 @@
|
||||
package com.cloudsolutions.HMGPatientApp.watch.samsung_watch.model
|
||||
|
||||
data class Vitals(
|
||||
var value : String = "",
|
||||
var timeStamp :String = ""
|
||||
){
|
||||
override fun toString(): String {
|
||||
return """{
|
||||
"value": "$value",
|
||||
"timeStamp": "$timeStamp"}
|
||||
""".trimIndent()
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
//package com.cloud.diplomaticquarterapp
|
||||
package com.cloudsolutions.HMGPatientApp
|
||||
package com.ejada.hmg
|
||||
|
||||
|
||||
import io.flutter.app.FlutterApplication
|
||||
@ -1,14 +1,15 @@
|
||||
package com.cloudsolutions.HMGPatientApp
|
||||
package com.ejada.hmg.penguin
|
||||
|
||||
import com.ejada.hmg.MainActivity
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.annotation.RequiresApi
|
||||
import com.cloudsolutions.HMGPatientApp.penguin.PenguinView
|
||||
import com.ejada.hmg.penguin.PenguinView
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugin.common.MethodCall
|
||||
import com.cloudsolutions.HMGPatientApp.PermissionManager.HostNotificationPermissionManager
|
||||
import com.cloudsolutions.HMGPatientApp.PermissionManager.HostBgLocationManager
|
||||
import com.cloudsolutions.HMGPatientApp.PermissionManager.HostGpsStateManager
|
||||
import com.ejada.hmg.PermissionManager.HostNotificationPermissionManager
|
||||
import com.ejada.hmg.PermissionManager.HostBgLocationManager
|
||||
import com.ejada.hmg.PermissionManager.HostGpsStateManager
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
|
||||
class PenguinInPlatformBridge(
|
||||
@ -1,4 +1,4 @@
|
||||
package com.cloudsolutions.HMGPatientApp.PermissionManager;
|
||||
package com.ejada.hmg.PermissionManager;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
@ -1,4 +1,4 @@
|
||||
package com.cloudsolutions.HMGPatientApp.PermissionManager;
|
||||
package com.ejada.hmg.PermissionManager;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
@ -1,4 +1,4 @@
|
||||
package com.cloudsolutions.HMGPatientApp.PermissionManager;
|
||||
package com.ejada.hmg.PermissionManager;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
@ -1,4 +1,4 @@
|
||||
package com.cloudsolutions.HMGPatientApp.PermissionManager;
|
||||
package com.ejada.hmg.PermissionManager;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.pm.PackageManager;
|
||||
@ -1,6 +1,7 @@
|
||||
package com.cloudsolutions.HMGPatientApp.PermissionManager
|
||||
package com.ejada.hmg.PermissionManager
|
||||
|
||||
import android.Manifest
|
||||
import android.os.Build
|
||||
|
||||
object PermissionHelper {
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
package com.cloudsolutions.HMGPatientApp.PermissionManager
|
||||
package com.ejada.hmg.PermissionManager
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
@ -1,4 +1,4 @@
|
||||
package com.cloudsolutions.HMGPatientApp.PermissionManager
|
||||
package com.ejada.hmg.PermissionManager
|
||||
|
||||
// PermissionResultReceiver.kt
|
||||
import android.content.BroadcastReceiver
|
||||
@ -1,4 +1,4 @@
|
||||
package com.cloudsolutions.HMGPatientApp.penguin
|
||||
package com.ejada.hmg.penguin
|
||||
|
||||
enum class PenguinMethod {
|
||||
// initializePenguin("initializePenguin"),
|
||||
|
Before Width: | Height: | Size: 544 B After Width: | Height: | Size: 544 B |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 442 B After Width: | Height: | Size: 442 B |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 721 B After Width: | Height: | Size: 721 B |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 5.6 KiB |
@ -1,274 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.cloudsolutions.HMGPatientApp">
|
||||
<!--
|
||||
io.flutter.app.FlutterApplication is an android.app.Application that
|
||||
calls FlutterMain.startInitialization(this); in its onCreate method.
|
||||
In most cases you can leave this as-is, but you if you want to provide
|
||||
additional functionality it is fine to subclass or reimplement
|
||||
FlutterApplication and put your custom class here.
|
||||
-->
|
||||
<uses-permission
|
||||
android:name="android.permission.ACTIVITY_RECOGNITION"
|
||||
tools:node="remove" />
|
||||
<uses-permission
|
||||
android:name="android.permission.READ_PHONE_STATE"
|
||||
tools:node="remove" /> <!-- <uses-permission android:name="android.permission.BLUETOOTH" tools:node="remove"/> -->
|
||||
<!-- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" tools:node="remove"/> -->
|
||||
<!-- <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" tools:node="remove"/> -->
|
||||
<!-- <uses-permission android:name="android.permission.BLUETOOTH_SCAN" tools:node="remove"/> -->
|
||||
<uses-permission
|
||||
android:name="android.permission.BROADCAST_STICKY"
|
||||
tools:node="remove" />
|
||||
<uses-permission
|
||||
android:name="com.google.android.gms.permission.AD_ID"
|
||||
tools:node="remove" /> <!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> -->
|
||||
<uses-permission
|
||||
android:name="android.permission.FOREGROUND_SERVICE"
|
||||
tools:node="remove" />
|
||||
<uses-permission
|
||||
android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE"
|
||||
tools:node="remove" />
|
||||
<uses-permission
|
||||
android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION"
|
||||
tools:node="remove" />
|
||||
<uses-permission
|
||||
android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"
|
||||
tools:node="remove" />
|
||||
<uses-permission
|
||||
android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE"
|
||||
tools:node="remove" />
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove" />
|
||||
|
||||
<!-- Added by open_filex -->
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" tools:node="remove" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" tools:node="remove" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" tools:node="remove" />
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" tools:node="remove" />
|
||||
|
||||
<uses-permission
|
||||
android:name="android.permission.ACCESS_BACKGROUND_LOCATION"
|
||||
tools:node="remove" /> <!-- <uses-permission android:name="android.permission.INTERNET" /> -->
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
||||
<uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />
|
||||
|
||||
|
||||
<uses-feature android:name="android.hardware.camera.any" />
|
||||
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||
|
||||
<uses-feature
|
||||
android:name="android.hardware.sensor.stepcounter"
|
||||
android:required="false"
|
||||
tools:node="replace" />
|
||||
<uses-feature
|
||||
android:name="android.hardware.sensor.stepdetector"
|
||||
android:required="false"
|
||||
tools:node="replace" />
|
||||
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
|
||||
<uses-feature android:name="android.hardware.camera.autofocus" />
|
||||
<uses-feature
|
||||
android:name="android.hardware.camera"
|
||||
android:required="true" />
|
||||
|
||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_CALENDAR" />
|
||||
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
|
||||
|
||||
<uses-permission android:name="android.permission.VIDEO_CAPTURE" />
|
||||
<uses-permission android:name="android.permission.AUDIO_CAPTURE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL" />
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
|
||||
|
||||
<uses-feature
|
||||
android:name="android.hardware.location.network"
|
||||
android:required="false" />
|
||||
<uses-feature
|
||||
android:name="android.hardware.location.gps"
|
||||
android:required="false" />
|
||||
|
||||
<uses-permission android:name="com.huawei.appmarket.service.commondata.permission.GET_COMMON_DATA" /> <!-- <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" /> -->
|
||||
<!-- Wifi Permissions -->
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> -->
|
||||
<!-- Detect Reboot Permission -->
|
||||
<!-- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> -->
|
||||
<queries>
|
||||
<intent>
|
||||
<action android:name="android.speech.RecognitionService" />
|
||||
</intent>
|
||||
|
||||
<package android:name="com.whatsapp" />
|
||||
<package android:name="com.whatsapp.w4b" />
|
||||
</queries>
|
||||
|
||||
<application
|
||||
android:foregroundServiceType="mediaPlayback|connectedDevice|dataSync"
|
||||
android:name=".Application"
|
||||
android:allowBackup="false"
|
||||
android:icon="@mipmap/ic_launcher_local"
|
||||
android:label="Dr. Alhabib Beta"
|
||||
android:screenOrientation="sensorPortrait"
|
||||
android:showOnLockScreen="true"
|
||||
android:usesCleartextTraffic="true"
|
||||
tools:replace="android:label">
|
||||
<meta-data
|
||||
android:name="com.huawei.hms.client.appid"
|
||||
android:value="102857389"/>
|
||||
<!-- <activity-->
|
||||
<!-- android:name="com.cloud.hmg_patient_app.whatsapp.WhatsAppCodeActivity"-->
|
||||
<!-- android:exported="true"-->
|
||||
<!-- android:enabled="true"-->
|
||||
<!-- android:launchMode="standard"-->
|
||||
<!-- >-->
|
||||
<!-- <intent-filter>-->
|
||||
<!-- <action android:name="com.whatsapp.otp.OTP_RETRIEVED" />-->
|
||||
<!-- </intent-filter>-->
|
||||
<!-- </activity>-->
|
||||
|
||||
<meta-data
|
||||
android:name="push_kit_auto_init_enabled"
|
||||
android:value="true" />
|
||||
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:enabled="true"
|
||||
android:exported="true"
|
||||
android:hardwareAccelerated="true"
|
||||
android:launchMode="singleTop"
|
||||
android:showOnLockScreen="true"
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:windowSoftInputMode="adjustResize"
|
||||
tools:node="merge">
|
||||
|
||||
<!--
|
||||
Specifies an Android theme to apply to this Activity as soon as
|
||||
the Android process has started. This theme is visible to the user
|
||||
while the Flutter UI initializes. After that, this theme continues
|
||||
to determine the Window background behind the Flutter UI.
|
||||
-->
|
||||
<meta-data
|
||||
android:name="io.flutter.embedding.android.NormalTheme"
|
||||
android:resource="@style/NormalTheme" />
|
||||
<!--
|
||||
Displays an Android View that continues showing the launch screen
|
||||
Drawable until Flutter paints its first frame, then this splash
|
||||
screen fades out. A splash screen is useful to avoid any visual
|
||||
gap between the end of Android's launch screen and the painting of
|
||||
Flutter's first frame.
|
||||
-->
|
||||
<meta-data
|
||||
android:name="io.flutter.embedding.android.SplashScreenDrawable"
|
||||
android:resource="@drawable/launch_background" />
|
||||
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="FLUTTER_NOTIFICATION_CLICK" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</activity> <!-- <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver" android:exported="true"> -->
|
||||
<!-- <intent-filter> -->
|
||||
<!-- <action android:name="android.intent.action.BOOT_COMPLETED"/> -->
|
||||
<!-- <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/> -->
|
||||
<!-- </intent-filter> -->
|
||||
<!-- </receiver> -->
|
||||
<!-- Geofencing -->
|
||||
<!-- <service-->
|
||||
<!-- android:name=".geofence.intent_receivers.GeofenceTransitionsJobIntentService"-->
|
||||
<!-- android:exported="true"-->
|
||||
<!-- android:permission="android.permission.BIND_JOB_SERVICE" />-->
|
||||
|
||||
<!-- <receiver-->
|
||||
<!-- android:name=".geofence.intent_receivers.GeofenceBroadcastReceiver"-->
|
||||
<!-- android:enabled="true"-->
|
||||
<!-- android:exported="false" />-->
|
||||
<!-- <receiver-->
|
||||
<!-- android:name=".geofence.intent_receivers.GeofencingRebootBroadcastReceiver"-->
|
||||
<!-- android:enabled="true"-->
|
||||
<!-- android:exported="false">-->
|
||||
<!-- <intent-filter>-->
|
||||
<!-- <action android:name="android.intent.action.BOOT_COMPLETED" />-->
|
||||
<!-- <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />-->
|
||||
<!-- </intent-filter>-->
|
||||
<!-- </receiver>-->
|
||||
<!-- <receiver-->
|
||||
<!-- android:name=".geofence.intent_receivers.LocationProviderChangeReceiver"-->
|
||||
<!-- android:exported="false">-->
|
||||
<!-- <intent-filter>-->
|
||||
<!-- <action android:name="android.location.PROVIDERS_CHANGED" />-->
|
||||
<!-- </intent-filter>-->
|
||||
<!-- </receiver>-->
|
||||
|
||||
<!-- <service-->
|
||||
<!-- android:name=".geofence.intent_receivers.ReregisterGeofenceJobService"-->
|
||||
<!-- android:exported="true"-->
|
||||
<!-- android:permission="android.permission.BIND_JOB_SERVICE" /> <!– Geofencing –>-->
|
||||
<!--
|
||||
Huawei Push Notifications
|
||||
Set push kit auto enable to true (for obtaining the token on initialize)
|
||||
-->
|
||||
<!-- <meta-data -->
|
||||
<!-- android:name="push_kit_auto_init_enabled" -->
|
||||
<!-- android:value="true" /> -->
|
||||
<!-- These receivers are for sending scheduled local notifications -->
|
||||
<!-- <receiver-->
|
||||
<!-- android:name="com.huawei.hms.flutter.push.receiver.local.HmsLocalNotificationBootEventReceiver"-->
|
||||
<!-- android:exported="false">-->
|
||||
<!-- <intent-filter>-->
|
||||
<!-- <action android:name="android.intent.action.BOOT_COMPLETED" />-->
|
||||
<!-- </intent-filter>-->
|
||||
<!-- </receiver>-->
|
||||
<!-- <receiver-->
|
||||
<!-- android:name="com.huawei.hms.flutter.push.receiver.local.HmsLocalNotificationScheduledPublisher"-->
|
||||
<!-- android:enabled="true"-->
|
||||
<!-- android:exported="false" />-->
|
||||
<!-- <receiver-->
|
||||
<!-- android:name="com.huawei.hms.flutter.push.receiver.BackgroundMessageBroadcastReceiver"-->
|
||||
<!-- android:enabled="true"-->
|
||||
<!-- android:exported="true">-->
|
||||
<!-- <intent-filter>-->
|
||||
<!-- <action android:name="com.huawei.hms.flutter.push.receiver.BACKGROUND_REMOTE_MESSAGE" />-->
|
||||
<!-- </intent-filter>-->
|
||||
<!-- </receiver> <!– Huawei Push Notifications –>-->
|
||||
<meta-data
|
||||
android:name="com.google.android.geo.API_KEY"
|
||||
android:value="AIzaSyB6TERnxIr0yJ3qG4ULBZbu0sAD4tGqtng" />
|
||||
<!--
|
||||
Don't delete the meta-data below.
|
||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java
|
||||
-->
|
||||
<meta-data
|
||||
android:name="flutterEmbedding"
|
||||
android:value="2" />
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@ -1,84 +0,0 @@
|
||||
package com.ejada.hmg
|
||||
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import android.view.WindowManager
|
||||
import androidx.annotation.NonNull
|
||||
import androidx.annotation.Nullable
|
||||
import androidx.annotation.RequiresApi
|
||||
import com.ejada.hmg.penguin.PenguinInPlatformBridge
|
||||
import com.ejada.hmg.watch.huawei.HuaweiWatch
|
||||
import com.ejada.hmg.watch.huawei.samsung_watch.SamsungWatch
|
||||
import com.huawei.hms.hihealth.result.HealthKitAuthResult
|
||||
import com.huawei.hms.support.api.entity.auth.Scope
|
||||
import io.flutter.embedding.android.FlutterFragmentActivity
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugins.GeneratedPluginRegistrant
|
||||
|
||||
|
||||
class MainActivity: FlutterFragmentActivity() {
|
||||
|
||||
private var huaweiWatch : HuaweiWatch? = null
|
||||
@RequiresApi(Build.VERSION_CODES.O)
|
||||
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
|
||||
GeneratedPluginRegistrant.registerWith(flutterEngine);
|
||||
// Create Flutter Platform Bridge
|
||||
this.window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON or WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON)
|
||||
|
||||
PenguinInPlatformBridge(flutterEngine, this).create()
|
||||
SamsungWatch(flutterEngine, this)
|
||||
huaweiWatch = HuaweiWatch(flutterEngine, this)
|
||||
}
|
||||
|
||||
override fun onRequestPermissionsResult(
|
||||
requestCode: Int,
|
||||
permissions: Array<out String>,
|
||||
grantResults: IntArray
|
||||
) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
||||
|
||||
val granted = grantResults.all { it == PackageManager.PERMISSION_GRANTED }
|
||||
val intent = Intent("PERMISSION_RESULT_ACTION").apply {
|
||||
putExtra("PERMISSION_GRANTED", granted)
|
||||
}
|
||||
sendBroadcast(intent)
|
||||
|
||||
// Log the request code and permission results
|
||||
Log.d("PermissionsResult", "Request Code: $requestCode")
|
||||
Log.d("PermissionsResult", "Permissions: ${permissions.joinToString()}")
|
||||
Log.d("PermissionsResult", "Grant Results: ${grantResults.joinToString()}")
|
||||
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
}
|
||||
|
||||
// override fun onActivityResult(requestCode: Int, resultCode: Int, @Nullable data: Intent?) {
|
||||
// super.onActivityResult(requestCode, resultCode, data)
|
||||
//
|
||||
// // Process only the response result of the authorization process.
|
||||
// if (requestCode == 1002) {
|
||||
// // Obtain the authorization response result from the intent.
|
||||
// val result: HealthKitAuthResult? = huaweiWatch?.mSettingController?.parseHealthKitAuthResultFromIntent(data)
|
||||
// if (result == null) {
|
||||
// Log.w(huaweiWatch?.TAG, "authorization fail")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// if (result.isSuccess) {
|
||||
// Log.i(huaweiWatch?.TAG, "authorization success")
|
||||
// if (result.getAuthAccount() != null && result.authAccount.authorizedScopes != null) {
|
||||
// val authorizedScopes: MutableSet<Scope?> = result.authAccount.authorizedScopes
|
||||
// if(authorizedScopes.isNotEmpty()) {
|
||||
// huaweiWatch?.getHealthAppAuthorization()
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// Log.w("MainActivty", "authorization fail, errorCode:" + result.getErrorCode())
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
@ -1,402 +0,0 @@
|
||||
package com.ejada.hmg.watch.huawei.samsung_watch
|
||||
|
||||
|
||||
|
||||
import com.ejada.hmg.MainActivity
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.annotation.RequiresApi
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugin.common.MethodCall
|
||||
import com.ejada.hmg.watch.huawei.samsung_watch.model.Vitals
|
||||
import com.samsung.android.sdk.health.data.HealthDataService
|
||||
import com.samsung.android.sdk.health.data.HealthDataStore
|
||||
import com.samsung.android.sdk.health.data.data.AggregatedData
|
||||
import com.samsung.android.sdk.health.data.data.HealthDataPoint
|
||||
import com.samsung.android.sdk.health.data.permission.AccessType
|
||||
import com.samsung.android.sdk.health.data.permission.Permission
|
||||
import com.samsung.android.sdk.health.data.request.DataType
|
||||
import com.samsung.android.sdk.health.data.request.DataTypes
|
||||
import com.samsung.android.sdk.health.data.request.LocalTimeFilter
|
||||
import com.samsung.android.sdk.health.data.request.LocalTimeGroup
|
||||
import com.samsung.android.sdk.health.data.request.LocalTimeGroupUnit
|
||||
import com.samsung.android.sdk.health.data.request.Ordering
|
||||
import com.samsung.android.sdk.health.data.response.DataResponse
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
import kotlinx.coroutines.cancel
|
||||
import kotlinx.coroutines.launch
|
||||
import java.time.LocalDateTime
|
||||
import java.time.LocalTime
|
||||
|
||||
class SamsungWatch(
|
||||
private var flutterEngine: FlutterEngine,
|
||||
private var mainActivity: MainActivity
|
||||
) {
|
||||
|
||||
private lateinit var channel: MethodChannel
|
||||
private lateinit var dataStore: HealthDataStore
|
||||
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
|
||||
private val TAG = "SamsungWatch"
|
||||
|
||||
|
||||
private lateinit var vitals: MutableMap<String, List<Vitals>>
|
||||
companion object {
|
||||
private const val CHANNEL = "samsung_watch"
|
||||
|
||||
}
|
||||
init{
|
||||
create()
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.O)
|
||||
fun create() {
|
||||
Log.d(TAG, "create: is called")
|
||||
// openTok = OpenTok(mainActivity, flutterEngine)
|
||||
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
|
||||
channel.setMethodCallHandler { call: MethodCall, result: MethodChannel.Result ->
|
||||
when (call.method) {
|
||||
"init" -> {
|
||||
Log.d(TAG, "onMethodCall: init called")
|
||||
dataStore = HealthDataService.getStore(mainActivity)
|
||||
vitals = mutableMapOf()
|
||||
result.success("initialized")
|
||||
}
|
||||
|
||||
"getPermission"->{
|
||||
if(!this::dataStore.isInitialized)
|
||||
result.error("DataStoreNotInitialized", "Please call init before requesting permissions", null)
|
||||
val permSet = setOf(
|
||||
Permission.of(DataTypes.HEART_RATE, AccessType.READ),
|
||||
Permission.of(DataTypes.STEPS, AccessType.READ),
|
||||
Permission.of(DataTypes.BLOOD_OXYGEN, AccessType.READ),
|
||||
Permission.of(DataTypes.ACTIVITY_SUMMARY, AccessType.READ),
|
||||
Permission.of(DataTypes.SLEEP, AccessType.READ),
|
||||
Permission.of(DataTypes.BODY_TEMPERATURE, AccessType.READ),
|
||||
Permission.of(DataTypes.EXERCISE, AccessType.READ),
|
||||
// Permission.of(DataTypes.SKIN_TEMPERATURE, AccessType.READ),
|
||||
// Permission.of(DataTypes.NUTRITION, AccessType.READ),
|
||||
|
||||
)
|
||||
scope.launch {
|
||||
try {
|
||||
var granted = dataStore.getGrantedPermissions(permSet)
|
||||
|
||||
if (granted.containsAll(permSet)) {
|
||||
result.success("Permission Granted")
|
||||
return@launch
|
||||
}
|
||||
|
||||
granted = dataStore.requestPermissions(permSet, mainActivity)
|
||||
|
||||
if (granted.containsAll(permSet)) {
|
||||
result.success("Permission Granted") // adapt result as needed
|
||||
return@launch
|
||||
}
|
||||
result.error("PermissionError", "Permission Not Granted", null) // adapt result as needed
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "create: getPermission failed", e)
|
||||
result.error("PermissionError", e.message, null)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"getHeartRate"->{
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val readRequest = DataTypes.HEART_RATE.readDataRequestBuilder
|
||||
.setLocalTimeFilter(localTimeFilter)
|
||||
.setOrdering(Ordering.DESC)
|
||||
.build()
|
||||
|
||||
scope.launch {
|
||||
val heartRateList = dataStore.readData(readRequest).dataList
|
||||
processHeartVital(heartRateList)
|
||||
Log.d("TAG"," the data is ${vitals}")
|
||||
print("the data is ${vitals}")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
"getSleepData" -> {
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val readRequest = DataTypes.SLEEP.readDataRequestBuilder
|
||||
.setLocalTimeFilter(localTimeFilter)
|
||||
.setOrdering(Ordering.ASC)
|
||||
.build()
|
||||
scope.launch {
|
||||
val sleepData = dataStore.readData(readRequest).dataList
|
||||
processSleepVital(sleepData)
|
||||
print("the data is $vitals")
|
||||
Log.d(TAG, "the data is $vitals")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
"steps"->{
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val localTimeGroup = LocalTimeGroup.of(LocalTimeGroupUnit.HOURLY, 1)
|
||||
val aggregateRequest = DataType.StepsType.TOTAL.requestBuilder
|
||||
.setLocalTimeFilterWithGroup(localTimeFilter, localTimeGroup)
|
||||
.setOrdering(Ordering.ASC)
|
||||
.build()
|
||||
|
||||
scope.launch {
|
||||
val steps = dataStore.aggregateData(aggregateRequest)
|
||||
processStepsCount(steps)
|
||||
print("the data is $vitals")
|
||||
Log.d(TAG, "the data is $vitals")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
}
|
||||
|
||||
"activitySummary"->{
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val localTimeGroup = LocalTimeGroup.of(LocalTimeGroupUnit.HOURLY, 1)
|
||||
val readRequest = DataType.ActivitySummaryType.TOTAL_ACTIVE_CALORIES_BURNED
|
||||
.requestBuilder
|
||||
.setLocalTimeFilterWithGroup(localTimeFilter, localTimeGroup)
|
||||
.setOrdering(Ordering.DESC)
|
||||
.build()
|
||||
|
||||
scope.launch {
|
||||
val activityResult = dataStore.aggregateData(readRequest).dataList
|
||||
processActivity(activityResult)
|
||||
Log.d("TAG"," the data is ${vitals}")
|
||||
print("the data is ${vitals}")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
|
||||
// val readRequest = DataTypes.EXERCISE.readDataRequestBuilder
|
||||
// .setLocalTimeFilter(localTimeFilter)
|
||||
// .build()
|
||||
//
|
||||
// scope.launch{
|
||||
// try {
|
||||
// val readResult = dataStore.readData(readRequest)
|
||||
// val dataPoints = readResult.dataList
|
||||
//
|
||||
// processActivity(dataPoints)
|
||||
//
|
||||
//
|
||||
// } catch (e: Exception) {
|
||||
// e.printStackTrace()
|
||||
// }
|
||||
// result.success("Data is obtained")
|
||||
// }
|
||||
}
|
||||
|
||||
"bloodOxygen"->{
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val readRequest = DataTypes.BLOOD_OXYGEN.readDataRequestBuilder
|
||||
.setLocalTimeFilter(localTimeFilter)
|
||||
.setOrdering(Ordering.DESC)
|
||||
.build()
|
||||
|
||||
scope.launch {
|
||||
val bloodOxygenList = dataStore.readData(readRequest).dataList
|
||||
processBloodOxygen(bloodOxygenList)
|
||||
Log.d("TAG"," the data is ${vitals}")
|
||||
print("the data is ${vitals["bloodOxygen"]}")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
"bodyTemperature"->{
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val readRequest = DataTypes.BODY_TEMPERATURE.readDataRequestBuilder
|
||||
.setLocalTimeFilter(localTimeFilter)
|
||||
.setOrdering(Ordering.DESC)
|
||||
.build()
|
||||
|
||||
scope.launch {
|
||||
val bodyTemperatureList = dataStore.readData(readRequest).dataList
|
||||
processBodyTemperature(bodyTemperatureList)
|
||||
Log.d("TAG"," the data is ${vitals}")
|
||||
print("the data is ${vitals["bodyTemperature"]}")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
}
|
||||
|
||||
"distance"->{
|
||||
val dateTime = LocalDateTime.now().with(LocalTime.MIDNIGHT).minusDays(365)
|
||||
val localTimeFilter = LocalTimeFilter.of(dateTime, LocalDateTime.now())
|
||||
val localTimeGroup = LocalTimeGroup.of(LocalTimeGroupUnit.HOURLY, 1)
|
||||
val readRequest = DataType.ActivitySummaryType.TOTAL_DISTANCE.requestBuilder
|
||||
.setLocalTimeFilterWithGroup(localTimeFilter, localTimeGroup)
|
||||
.setOrdering(Ordering.DESC)
|
||||
.build()
|
||||
|
||||
scope.launch {
|
||||
val activityResult = dataStore.aggregateData(readRequest).dataList
|
||||
processDistance(activityResult)
|
||||
Log.d("TAG"," the data is ${vitals}")
|
||||
print("the data is ${vitals}")
|
||||
result.success("Data is obtained")
|
||||
}
|
||||
}
|
||||
|
||||
"retrieveData"->{
|
||||
if(vitals.isEmpty()){
|
||||
result.error("NoDataFound", "No Data was obtained", null)
|
||||
return@setMethodCallHandler
|
||||
}
|
||||
result.success("""
|
||||
{
|
||||
"heartRate": ${vitals["heartRate"]},
|
||||
"steps": ${vitals["steps"]},
|
||||
"sleep": ${vitals["sleep"]},
|
||||
"activity": ${vitals["activity"]},
|
||||
"bloodOxygen": ${vitals["bloodOxygen"]},
|
||||
"bodyTemperature": ${vitals["bodyTemperature"]},
|
||||
"distance": ${vitals["distance"]}
|
||||
}
|
||||
""".trimIndent())
|
||||
}
|
||||
|
||||
|
||||
"closeCoroutineScope"->{
|
||||
destroy()
|
||||
result.success("Coroutine Scope Cancelled")
|
||||
}
|
||||
|
||||
else -> {
|
||||
result.notImplemented()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun CoroutineScope.processDistance(activityResult: List<AggregatedData<Float>>) {
|
||||
vitals["distance"] = mutableListOf()
|
||||
activityResult.forEach { stepData ->
|
||||
val vitalData = Vitals().apply {
|
||||
|
||||
value = stepData.value.toString()
|
||||
timeStamp = stepData.startTime.toString()
|
||||
}
|
||||
(vitals["distance"] as MutableList).add(vitalData)
|
||||
}
|
||||
}
|
||||
|
||||
private fun CoroutineScope.processBodyTemperature( bodyTemperatureList :List<HealthDataPoint>) {
|
||||
vitals["bodyTemperature"] = mutableListOf()
|
||||
bodyTemperatureList.forEach { stepData ->
|
||||
val vitalData = Vitals().apply {
|
||||
value = stepData.getValue(DataType.BodyTemperatureType.BODY_TEMPERATURE).toString()
|
||||
timeStamp = stepData.endTime.toString()
|
||||
}
|
||||
(vitals["bodyTemperature"] as MutableList).add(vitalData)
|
||||
}
|
||||
}
|
||||
|
||||
private fun CoroutineScope.processBloodOxygen( bloodOxygenList :List<HealthDataPoint>) {
|
||||
vitals["bloodOxygen"] = mutableListOf()
|
||||
bloodOxygenList.forEach { stepData ->
|
||||
val vitalData = Vitals().apply {
|
||||
value = stepData.getValue(DataType.BloodOxygenType.OXYGEN_SATURATION).toString()
|
||||
timeStamp = stepData.endTime.toString()
|
||||
}
|
||||
(vitals["bloodOxygen"] as MutableList).add(vitalData)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// private fun CoroutineScope.processActivity(activityResult: List<AggregatedData<Float>>) {
|
||||
//
|
||||
// vitals["activity"] = mutableListOf()
|
||||
// activityResult.forEach { stepData ->
|
||||
// val vitalData = Vitals().apply {
|
||||
//
|
||||
// value = stepData.value.toString()
|
||||
// timeStamp = stepData.startTime.toString()
|
||||
// }
|
||||
// (vitals["activity"] as MutableList).add(vitalData)
|
||||
// }
|
||||
// }
|
||||
private fun CoroutineScope.processActivity(activityResult: List<AggregatedData<Float>>) {
|
||||
|
||||
vitals["activity"] = mutableListOf()
|
||||
activityResult.forEach { stepData ->
|
||||
val vitalData = Vitals().apply {
|
||||
|
||||
value = stepData.value.toString()
|
||||
timeStamp = stepData.startTime.toString()
|
||||
}
|
||||
(vitals["activity"] as MutableList).add(vitalData)
|
||||
}
|
||||
|
||||
// dataPoints.forEach { dataPoint ->
|
||||
// val sessions = dataPoint.getValue(DataType.ExerciseType.SESSIONS)
|
||||
//
|
||||
// sessions?.forEach { session ->
|
||||
//
|
||||
// val exerciseSessionCalories = session.calories
|
||||
// val vitalData = Vitals().apply {
|
||||
// value = exerciseSessionCalories.toString()
|
||||
// timeStamp = session.startTime.toString()
|
||||
// }
|
||||
// (vitals["activity"] as MutableList).add(vitalData)
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
private fun CoroutineScope.processStepsCount(result: DataResponse<AggregatedData<Long>>) {
|
||||
val stepCount = ArrayList<AggregatedData<Long>>()
|
||||
var totalSteps: Long = 0
|
||||
vitals["steps"] = mutableListOf()
|
||||
result.dataList.forEach { stepData ->
|
||||
val vitalData = Vitals().apply {
|
||||
value = (stepData.value as Long).toString()
|
||||
timeStamp = stepData.startTime.toString()
|
||||
}
|
||||
(vitals["steps"] as MutableList).add(vitalData)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun CoroutineScope.processSleepVital(sleepData: List<HealthDataPoint>) {
|
||||
vitals["sleep"] = mutableListOf()
|
||||
sleepData.forEach {
|
||||
(vitals["sleep"] as MutableList).add(
|
||||
Vitals().apply {
|
||||
timeStamp = it.startTime.toString()
|
||||
value = (it.getValue(DataType.SleepType.DURATION)?.toMillis().toString())
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun CoroutineScope.processHeartVital(
|
||||
heartRateList: List<HealthDataPoint>,
|
||||
) {
|
||||
vitals["heartRate"] = mutableListOf()
|
||||
heartRateList.forEach {
|
||||
(vitals["heartRate"] as MutableList).add(processHeartRateData(it))
|
||||
}
|
||||
}
|
||||
|
||||
private fun processHeartRateData(heartRateData: HealthDataPoint) =
|
||||
Vitals().apply {
|
||||
heartRateData.getValue(DataType.HeartRateType.MAX_HEART_RATE)?.let {
|
||||
value = it.toString()
|
||||
}
|
||||
timeStamp = heartRateData.startTime.toString()
|
||||
}
|
||||
|
||||
|
||||
fun destroy() {
|
||||
scope.cancel()
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,13 +0,0 @@
|
||||
package com.ejada.hmg.watch.huawei.samsung_watch.model
|
||||
|
||||
data class Vitals(
|
||||
var value : String = "",
|
||||
var timeStamp :String = ""
|
||||
){
|
||||
override fun toString(): String {
|
||||
return """{
|
||||
"value": "$value",
|
||||
"timeStamp": "$timeStamp"}
|
||||
""".trimIndent()
|
||||
}
|
||||
}
|
||||
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Modify this file to customize your launch splash screen -->
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="?android:colorBackground" />
|
||||
|
||||
<!-- You can insert your own image assets here -->
|
||||
<!-- <item>
|
||||
<bitmap
|
||||
android:gravity="center"
|
||||
android:src="@mipmap/launch_image" />
|
||||
</item> -->
|
||||
</layer-list>
|
||||
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Modify this file to customize your launch splash screen -->
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@android:color/white" />
|
||||
|
||||
<!-- You can insert your own image assets here -->
|
||||
<!-- <item>
|
||||
<bitmap
|
||||
android:gravity="center"
|
||||
android:src="@mipmap/launch_image" />
|
||||
</item> -->
|
||||
</layer-list>
|
||||
|
Before Width: | Height: | Size: 1021 B |
|
Before Width: | Height: | Size: 180 B |
|
Before Width: | Height: | Size: 1.0 KiB |
@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context="com.cloud.diplomaticquarterapp.whatsapp.WhatsAppCodeActivity">
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@ -1,14 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:layout_gravity="center_horizontal">
|
||||
<FrameLayout
|
||||
android:id="@+id/publisher_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#FF9800" />
|
||||
|
||||
</LinearLayout>
|
||||
@ -1,20 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:layout_gravity="center_horizontal">
|
||||
<FrameLayout
|
||||
android:id="@+id/subscriber_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#3F51B5" />
|
||||
|
||||
<TextView
|
||||
android:text="Remote"
|
||||
android:textColor="#FFFFFF"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
@ -1,3 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:keep="@drawable/*,@raw/slow_spring_board" />
|
||||
@ -1,18 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<!-- Show a splash screen on the activity. Automatically removed when
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||
running.
|
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
</style>
|
||||
</resources>
|
||||
@ -1,3 +0,0 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- <string name="mapbox_access_token" translatable="false" tools:ignore="UnusedResources">sk.eyJ1IjoicndhaWQiLCJhIjoiY2x6NWo0bTMzMWZodzJrcGZpemYzc3Z4dSJ9.uSSZuwNSGCcCdPAiORECmg</string>-->
|
||||
</resources>
|
||||
@ -1,23 +0,0 @@
|
||||
<resources>
|
||||
<string name="app_name">HMG Patient App</string>
|
||||
|
||||
<string name="geofence_unknown_error">
|
||||
Unknown error: the Geofence service is not available now.
|
||||
</string>
|
||||
<string name="geofence_not_available">
|
||||
Geofence service is not available now. Go to Settings>Location>Mode and choose High accuracy.
|
||||
</string>
|
||||
<string name="geofence_too_many_geofences">
|
||||
Your app has registered too many geofences.
|
||||
</string>
|
||||
<string name="geofence_too_many_pending_intents">
|
||||
You have provided too many PendingIntents to the addGeofences() call.
|
||||
</string>
|
||||
<string name="GEOFENCE_INSUFFICIENT_LOCATION_PERMISSION">
|
||||
App do not have permission to access location service.
|
||||
</string>
|
||||
<string name="GEOFENCE_REQUEST_TOO_FREQUENT">
|
||||
Geofence requests happened too frequently.
|
||||
</string>
|
||||
<string name="mapbox_access_token" translatable="false">pk.eyJ1IjoicndhaWQiLCJhIjoiY2x5cGo4aHNjMGNsbTJyc2djempobGQxaSJ9.RCaC6WrUt4A4YnZNfxnONQ</string>
|
||||
</resources>
|
||||
@ -1,18 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Theme applied to the Android Window while the process is starting -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<!-- Show a splash screen on the activity. Automatically removed when
|
||||
Flutter draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||
running.
|
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<item name="android:windowBackground">@android:color/white</item>
|
||||
</style>
|
||||
</resources>
|
||||
@ -1,10 +1,3 @@
|
||||
#org.gradle.jvmargs=-xmx4608m
|
||||
android.enableR8=true
|
||||
android.enableJetifier=true
|
||||
android.useDeprecatedNdk=true
|
||||
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
|
||||
org.gradle.daemon=true
|
||||
org.gradle.parallel=true
|
||||
org.gradle.configureondemand=true
|
||||
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
|
||||
android.useAndroidX=true
|
||||
android.enableImpeller=false
|
||||
android.enableJetifier=true
|
||||
|
||||
@ -1 +1,767 @@
|
||||
{"nm":"Main Scene","ddd":0,"h":512,"w":512,"meta":{"g":"@lottiefiles/creator 1.75.0"},"layers":[{"ty":4,"nm":"check","sr":1,"st":0,"op":240,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[256,256],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Shape 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-82.5,4.5],[-31,55],[73,-52.5]]},"ix":2}},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":1,"y":0.076},"i":{"x":0.667,"y":1},"s":[0],"t":60},{"s":[100],"t":85}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":0,"k":0,"ix":1},"m":1},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"c":{"a":0,"k":[1,1,1],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Shape Layer 2","sr":1,"st":0,"op":240,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.656,"y":0.872},"i":{"x":0,"y":0.98},"s":[0,0,100],"t":20},{"s":[150,150,100],"t":60}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[256,257.86],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0],"ix":3},"s":{"a":0,"k":[236,236],"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.0941,0.7608,0.451],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,-3],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Shape Layer 1","sr":1,"st":0,"op":240,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.477,"y":0.587},"i":{"x":0,"y":0.999},"s":[0,0,100],"t":10},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[150,150,100],"t":50},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[150,150,100],"t":76},{"s":[210,210,100],"t":123}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[256,257.86],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.912,"y":0.073},"i":{"x":0.626,"y":0.729},"s":[100],"t":76},{"s":[0],"t":119}],"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0],"ix":3},"s":{"a":0,"k":[236,236],"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"c":{"a":0,"k":[1,1,1],"ix":3}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.7843,0.9451,0.8784],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,-3],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3}],"v":"5.7.0","fr":60,"op":130,"ip":0,"assets":[]}
|
||||
{
|
||||
"nm": "HDFC Success",
|
||||
"h": 512,
|
||||
"w": 512,
|
||||
"meta": {
|
||||
"g": "LottieFiles AE 1.0.0"
|
||||
},
|
||||
"layers": [
|
||||
{
|
||||
"ty": 4,
|
||||
"nm": "check",
|
||||
"sr": 1,
|
||||
"st": 0,
|
||||
"op": 240,
|
||||
"ip": 0,
|
||||
"hasMask": false,
|
||||
"ao": 0,
|
||||
"ks": {
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
100,
|
||||
100,
|
||||
100
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
256,
|
||||
256,
|
||||
0
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
},
|
||||
"ef": [],
|
||||
"shapes": [
|
||||
{
|
||||
"ty": "gr",
|
||||
"nm": "Shape 1",
|
||||
"it": [
|
||||
{
|
||||
"ty": "sh",
|
||||
"nm": "Path 1",
|
||||
"d": 1,
|
||||
"ks": {
|
||||
"a": 0,
|
||||
"k": {
|
||||
"c": false,
|
||||
"i": [
|
||||
[
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
0,
|
||||
0
|
||||
]
|
||||
],
|
||||
"o": [
|
||||
[
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
0,
|
||||
0
|
||||
]
|
||||
],
|
||||
"v": [
|
||||
[
|
||||
-82.5,
|
||||
4.5
|
||||
],
|
||||
[
|
||||
-31,
|
||||
55
|
||||
],
|
||||
[
|
||||
73,
|
||||
-52.5
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "tm",
|
||||
"nm": "Trim Paths 1",
|
||||
"e": {
|
||||
"a": 1,
|
||||
"k": [
|
||||
{
|
||||
"o": {
|
||||
"x": 1,
|
||||
"y": 0.076
|
||||
},
|
||||
"i": {
|
||||
"x": 0.667,
|
||||
"y": 1
|
||||
},
|
||||
"s": [
|
||||
0
|
||||
],
|
||||
"t": 60
|
||||
},
|
||||
{
|
||||
"s": [
|
||||
100
|
||||
],
|
||||
"t": 85
|
||||
}
|
||||
]
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"m": 1
|
||||
},
|
||||
{
|
||||
"ty": "st",
|
||||
"nm": "Stroke 1",
|
||||
"lc": 2,
|
||||
"lj": 2,
|
||||
"ml": 1,
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
},
|
||||
"w": {
|
||||
"a": 0,
|
||||
"k": 30
|
||||
},
|
||||
"c": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
1,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "tr",
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
100,
|
||||
100
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"ind": 1
|
||||
},
|
||||
{
|
||||
"ty": 4,
|
||||
"nm": "Shape Layer 2",
|
||||
"sr": 1,
|
||||
"st": 0,
|
||||
"op": 240,
|
||||
"ip": 0,
|
||||
"hasMask": false,
|
||||
"ao": 0,
|
||||
"ks": {
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 1,
|
||||
"k": [
|
||||
{
|
||||
"o": {
|
||||
"x": 0.656,
|
||||
"y": 0.872
|
||||
},
|
||||
"i": {
|
||||
"x": 0,
|
||||
"y": 0.98
|
||||
},
|
||||
"s": [
|
||||
0,
|
||||
0,
|
||||
100
|
||||
],
|
||||
"t": 20
|
||||
},
|
||||
{
|
||||
"s": [
|
||||
150,
|
||||
150,
|
||||
100
|
||||
],
|
||||
"t": 60
|
||||
}
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
256,
|
||||
257.86,
|
||||
0
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
},
|
||||
"ef": [],
|
||||
"shapes": [
|
||||
{
|
||||
"ty": "gr",
|
||||
"nm": "Ellipse 1",
|
||||
"it": [
|
||||
{
|
||||
"ty": "el",
|
||||
"nm": "Ellipse Path 1",
|
||||
"d": 1,
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
236,
|
||||
236
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "fl",
|
||||
"nm": "Fill 1",
|
||||
"c": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0.094,
|
||||
0.761,
|
||||
0.451
|
||||
]
|
||||
},
|
||||
"r": 1,
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "tr",
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
100,
|
||||
100
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
-3
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"ind": 2
|
||||
},
|
||||
{
|
||||
"ty": 4,
|
||||
"nm": "Shape Layer 1",
|
||||
"sr": 1,
|
||||
"st": 0,
|
||||
"op": 240,
|
||||
"ip": 0,
|
||||
"hasMask": false,
|
||||
"ao": 0,
|
||||
"ks": {
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 1,
|
||||
"k": [
|
||||
{
|
||||
"o": {
|
||||
"x": 0.477,
|
||||
"y": 0.587
|
||||
},
|
||||
"i": {
|
||||
"x": 0,
|
||||
"y": 0.999
|
||||
},
|
||||
"s": [
|
||||
0,
|
||||
0,
|
||||
100
|
||||
],
|
||||
"t": 10
|
||||
},
|
||||
{
|
||||
"o": {
|
||||
"x": 0.167,
|
||||
"y": 0.167
|
||||
},
|
||||
"i": {
|
||||
"x": 0.833,
|
||||
"y": 0.833
|
||||
},
|
||||
"s": [
|
||||
150,
|
||||
150,
|
||||
100
|
||||
],
|
||||
"t": 50
|
||||
},
|
||||
{
|
||||
"o": {
|
||||
"x": 0.167,
|
||||
"y": 0
|
||||
},
|
||||
"i": {
|
||||
"x": 0.833,
|
||||
"y": 1
|
||||
},
|
||||
"s": [
|
||||
150,
|
||||
150,
|
||||
100
|
||||
],
|
||||
"t": 76
|
||||
},
|
||||
{
|
||||
"s": [
|
||||
210,
|
||||
210,
|
||||
100
|
||||
],
|
||||
"t": 123
|
||||
}
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
256,
|
||||
257.86,
|
||||
0
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 1,
|
||||
"k": [
|
||||
{
|
||||
"o": {
|
||||
"x": 0.912,
|
||||
"y": 0.073
|
||||
},
|
||||
"i": {
|
||||
"x": 0.626,
|
||||
"y": 0.729
|
||||
},
|
||||
"s": [
|
||||
100
|
||||
],
|
||||
"t": 76
|
||||
},
|
||||
{
|
||||
"s": [
|
||||
0
|
||||
],
|
||||
"t": 119
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"ef": [],
|
||||
"shapes": [
|
||||
{
|
||||
"ty": "gr",
|
||||
"nm": "Ellipse 1",
|
||||
"it": [
|
||||
{
|
||||
"ty": "el",
|
||||
"nm": "Ellipse Path 1",
|
||||
"d": 1,
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
236,
|
||||
236
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "st",
|
||||
"nm": "Stroke 1",
|
||||
"lc": 1,
|
||||
"lj": 1,
|
||||
"ml": 4,
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
},
|
||||
"w": {
|
||||
"a": 0,
|
||||
"k": 2
|
||||
},
|
||||
"c": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
1,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "fl",
|
||||
"nm": "Fill 1",
|
||||
"c": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0.784,
|
||||
0.945,
|
||||
0.878
|
||||
]
|
||||
},
|
||||
"r": 1,
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "tr",
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
100,
|
||||
100
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
-3
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"ind": 3
|
||||
},
|
||||
{
|
||||
"ty": 4,
|
||||
"nm": "BG",
|
||||
"sr": 1,
|
||||
"st": 0,
|
||||
"op": 240,
|
||||
"ip": 0,
|
||||
"hasMask": false,
|
||||
"ao": 0,
|
||||
"ks": {
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
100,
|
||||
100,
|
||||
100
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
256,
|
||||
256,
|
||||
0
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
},
|
||||
"ef": [],
|
||||
"shapes": [
|
||||
{
|
||||
"ty": "gr",
|
||||
"nm": "Rectangle 1",
|
||||
"it": [
|
||||
{
|
||||
"ty": "rc",
|
||||
"nm": "Rectangle Path 1",
|
||||
"d": 1,
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
554,
|
||||
556
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "fl",
|
||||
"nm": "Fill 1",
|
||||
"c": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0.972,
|
||||
0.972,
|
||||
0.972
|
||||
]
|
||||
},
|
||||
"r": 1,
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "tr",
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
100,
|
||||
100
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
-1,
|
||||
6
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"ind": 4
|
||||
}
|
||||
],
|
||||
"v": "4.8.0",
|
||||
"fr": 60,
|
||||
"op": 130,
|
||||
"ip": 0,
|
||||
"assets": []
|
||||
}
|
||||
@ -1,767 +0,0 @@
|
||||
{
|
||||
"nm": "HDFC Success",
|
||||
"h": 512,
|
||||
"w": 512,
|
||||
"meta": {
|
||||
"g": "LottieFiles AE 1.0.0"
|
||||
},
|
||||
"layers": [
|
||||
{
|
||||
"ty": 4,
|
||||
"nm": "check",
|
||||
"sr": 1,
|
||||
"st": 0,
|
||||
"op": 240,
|
||||
"ip": 0,
|
||||
"hasMask": false,
|
||||
"ao": 0,
|
||||
"ks": {
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
100,
|
||||
100,
|
||||
100
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
256,
|
||||
256,
|
||||
0
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
},
|
||||
"ef": [],
|
||||
"shapes": [
|
||||
{
|
||||
"ty": "gr",
|
||||
"nm": "Shape 1",
|
||||
"it": [
|
||||
{
|
||||
"ty": "sh",
|
||||
"nm": "Path 1",
|
||||
"d": 1,
|
||||
"ks": {
|
||||
"a": 0,
|
||||
"k": {
|
||||
"c": false,
|
||||
"i": [
|
||||
[
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
0,
|
||||
0
|
||||
]
|
||||
],
|
||||
"o": [
|
||||
[
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
0,
|
||||
0
|
||||
]
|
||||
],
|
||||
"v": [
|
||||
[
|
||||
-82.5,
|
||||
4.5
|
||||
],
|
||||
[
|
||||
-31,
|
||||
55
|
||||
],
|
||||
[
|
||||
73,
|
||||
-52.5
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "tm",
|
||||
"nm": "Trim Paths 1",
|
||||
"e": {
|
||||
"a": 1,
|
||||
"k": [
|
||||
{
|
||||
"o": {
|
||||
"x": 1,
|
||||
"y": 0.076
|
||||
},
|
||||
"i": {
|
||||
"x": 0.667,
|
||||
"y": 1
|
||||
},
|
||||
"s": [
|
||||
0
|
||||
],
|
||||
"t": 60
|
||||
},
|
||||
{
|
||||
"s": [
|
||||
100
|
||||
],
|
||||
"t": 85
|
||||
}
|
||||
]
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"m": 1
|
||||
},
|
||||
{
|
||||
"ty": "st",
|
||||
"nm": "Stroke 1",
|
||||
"lc": 2,
|
||||
"lj": 2,
|
||||
"ml": 1,
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
},
|
||||
"w": {
|
||||
"a": 0,
|
||||
"k": 30
|
||||
},
|
||||
"c": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
1,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "tr",
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
100,
|
||||
100
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"ind": 1
|
||||
},
|
||||
{
|
||||
"ty": 4,
|
||||
"nm": "Shape Layer 2",
|
||||
"sr": 1,
|
||||
"st": 0,
|
||||
"op": 240,
|
||||
"ip": 0,
|
||||
"hasMask": false,
|
||||
"ao": 0,
|
||||
"ks": {
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 1,
|
||||
"k": [
|
||||
{
|
||||
"o": {
|
||||
"x": 0.656,
|
||||
"y": 0.872
|
||||
},
|
||||
"i": {
|
||||
"x": 0,
|
||||
"y": 0.98
|
||||
},
|
||||
"s": [
|
||||
0,
|
||||
0,
|
||||
100
|
||||
],
|
||||
"t": 20
|
||||
},
|
||||
{
|
||||
"s": [
|
||||
150,
|
||||
150,
|
||||
100
|
||||
],
|
||||
"t": 60
|
||||
}
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
256,
|
||||
257.86,
|
||||
0
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
},
|
||||
"ef": [],
|
||||
"shapes": [
|
||||
{
|
||||
"ty": "gr",
|
||||
"nm": "Ellipse 1",
|
||||
"it": [
|
||||
{
|
||||
"ty": "el",
|
||||
"nm": "Ellipse Path 1",
|
||||
"d": 1,
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
236,
|
||||
236
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "fl",
|
||||
"nm": "Fill 1",
|
||||
"c": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0.094,
|
||||
0.761,
|
||||
0.451
|
||||
]
|
||||
},
|
||||
"r": 1,
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "tr",
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
100,
|
||||
100
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
-3
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"ind": 2
|
||||
},
|
||||
{
|
||||
"ty": 4,
|
||||
"nm": "Shape Layer 1",
|
||||
"sr": 1,
|
||||
"st": 0,
|
||||
"op": 240,
|
||||
"ip": 0,
|
||||
"hasMask": false,
|
||||
"ao": 0,
|
||||
"ks": {
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 1,
|
||||
"k": [
|
||||
{
|
||||
"o": {
|
||||
"x": 0.477,
|
||||
"y": 0.587
|
||||
},
|
||||
"i": {
|
||||
"x": 0,
|
||||
"y": 0.999
|
||||
},
|
||||
"s": [
|
||||
0,
|
||||
0,
|
||||
100
|
||||
],
|
||||
"t": 10
|
||||
},
|
||||
{
|
||||
"o": {
|
||||
"x": 0.167,
|
||||
"y": 0.167
|
||||
},
|
||||
"i": {
|
||||
"x": 0.833,
|
||||
"y": 0.833
|
||||
},
|
||||
"s": [
|
||||
150,
|
||||
150,
|
||||
100
|
||||
],
|
||||
"t": 50
|
||||
},
|
||||
{
|
||||
"o": {
|
||||
"x": 0.167,
|
||||
"y": 0
|
||||
},
|
||||
"i": {
|
||||
"x": 0.833,
|
||||
"y": 1
|
||||
},
|
||||
"s": [
|
||||
150,
|
||||
150,
|
||||
100
|
||||
],
|
||||
"t": 76
|
||||
},
|
||||
{
|
||||
"s": [
|
||||
210,
|
||||
210,
|
||||
100
|
||||
],
|
||||
"t": 123
|
||||
}
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
256,
|
||||
257.86,
|
||||
0
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 1,
|
||||
"k": [
|
||||
{
|
||||
"o": {
|
||||
"x": 0.912,
|
||||
"y": 0.073
|
||||
},
|
||||
"i": {
|
||||
"x": 0.626,
|
||||
"y": 0.729
|
||||
},
|
||||
"s": [
|
||||
100
|
||||
],
|
||||
"t": 76
|
||||
},
|
||||
{
|
||||
"s": [
|
||||
0
|
||||
],
|
||||
"t": 119
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"ef": [],
|
||||
"shapes": [
|
||||
{
|
||||
"ty": "gr",
|
||||
"nm": "Ellipse 1",
|
||||
"it": [
|
||||
{
|
||||
"ty": "el",
|
||||
"nm": "Ellipse Path 1",
|
||||
"d": 1,
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
236,
|
||||
236
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "st",
|
||||
"nm": "Stroke 1",
|
||||
"lc": 1,
|
||||
"lj": 1,
|
||||
"ml": 4,
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
},
|
||||
"w": {
|
||||
"a": 0,
|
||||
"k": 2
|
||||
},
|
||||
"c": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
1,
|
||||
1,
|
||||
1
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "fl",
|
||||
"nm": "Fill 1",
|
||||
"c": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0.784,
|
||||
0.945,
|
||||
0.878
|
||||
]
|
||||
},
|
||||
"r": 1,
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "tr",
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
100,
|
||||
100
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
-3
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"ind": 3
|
||||
},
|
||||
{
|
||||
"ty": 4,
|
||||
"nm": "BG",
|
||||
"sr": 1,
|
||||
"st": 0,
|
||||
"op": 240,
|
||||
"ip": 0,
|
||||
"hasMask": false,
|
||||
"ao": 0,
|
||||
"ks": {
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
100,
|
||||
100,
|
||||
100
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
256,
|
||||
256,
|
||||
0
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
},
|
||||
"ef": [],
|
||||
"shapes": [
|
||||
{
|
||||
"ty": "gr",
|
||||
"nm": "Rectangle 1",
|
||||
"it": [
|
||||
{
|
||||
"ty": "rc",
|
||||
"nm": "Rectangle Path 1",
|
||||
"d": 1,
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
554,
|
||||
556
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "fl",
|
||||
"nm": "Fill 1",
|
||||
"c": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0.972,
|
||||
0.972,
|
||||
0.972
|
||||
]
|
||||
},
|
||||
"r": 1,
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
},
|
||||
{
|
||||
"ty": "tr",
|
||||
"a": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"s": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
100,
|
||||
100
|
||||
]
|
||||
},
|
||||
"sk": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"p": {
|
||||
"a": 0,
|
||||
"k": [
|
||||
-1,
|
||||
6
|
||||
]
|
||||
},
|
||||
"r": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"sa": {
|
||||
"a": 0,
|
||||
"k": 0
|
||||
},
|
||||
"o": {
|
||||
"a": 0,
|
||||
"k": 100
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"ind": 4
|
||||
}
|
||||
],
|
||||
"v": "4.8.0",
|
||||
"fr": 60,
|
||||
"op": 130,
|
||||
"ip": 0,
|
||||
"assets": []
|
||||
}
|
||||