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.cloud.diplomaticquarterapp
|
||||||
package com.cloudsolutions.HMGPatientApp
|
package com.ejada.hmg
|
||||||
|
|
||||||
|
|
||||||
import io.flutter.app.FlutterApplication
|
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.os.Build
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.annotation.RequiresApi
|
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.embedding.engine.FlutterEngine
|
||||||
import io.flutter.plugin.common.MethodCall
|
import io.flutter.plugin.common.MethodCall
|
||||||
import com.cloudsolutions.HMGPatientApp.PermissionManager.HostNotificationPermissionManager
|
import com.ejada.hmg.PermissionManager.HostNotificationPermissionManager
|
||||||
import com.cloudsolutions.HMGPatientApp.PermissionManager.HostBgLocationManager
|
import com.ejada.hmg.PermissionManager.HostBgLocationManager
|
||||||
import com.cloudsolutions.HMGPatientApp.PermissionManager.HostGpsStateManager
|
import com.ejada.hmg.PermissionManager.HostGpsStateManager
|
||||||
import io.flutter.plugin.common.MethodChannel
|
import io.flutter.plugin.common.MethodChannel
|
||||||
|
|
||||||
class PenguinInPlatformBridge(
|
class PenguinInPlatformBridge(
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.cloudsolutions.HMGPatientApp.PermissionManager;
|
package com.ejada.hmg.PermissionManager;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.cloudsolutions.HMGPatientApp.PermissionManager;
|
package com.ejada.hmg.PermissionManager;
|
||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.cloudsolutions.HMGPatientApp.PermissionManager;
|
package com.ejada.hmg.PermissionManager;
|
||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.cloudsolutions.HMGPatientApp.PermissionManager;
|
package com.ejada.hmg.PermissionManager;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
@ -1,6 +1,7 @@
|
|||||||
package com.cloudsolutions.HMGPatientApp.PermissionManager
|
package com.ejada.hmg.PermissionManager
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
|
import android.os.Build
|
||||||
|
|
||||||
object PermissionHelper {
|
object PermissionHelper {
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.cloudsolutions.HMGPatientApp.PermissionManager
|
package com.ejada.hmg.PermissionManager
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.cloudsolutions.HMGPatientApp.PermissionManager
|
package com.ejada.hmg.PermissionManager
|
||||||
|
|
||||||
// PermissionResultReceiver.kt
|
// PermissionResultReceiver.kt
|
||||||
import android.content.BroadcastReceiver
|
import android.content.BroadcastReceiver
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.cloudsolutions.HMGPatientApp.penguin
|
package com.ejada.hmg.penguin
|
||||||
|
|
||||||
enum class PenguinMethod {
|
enum class PenguinMethod {
|
||||||
// initializePenguin("initializePenguin"),
|
// 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
|
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
|
||||||
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
|
|
||||||
android.useAndroidX=true
|
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": []
|
|
||||||
}
|
|
||||||