Commit 63c7a50f authored by wanglei's avatar wanglei

...

parent ea161f3e
......@@ -5,8 +5,6 @@ import android.content.Intent
import android.graphics.Color
import androidx.activity.OnBackPressedCallback
import androidx.core.view.updatePadding
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.activity.junkclean.ScanJunkActivity
import com.base.filerecoveryrecyclebin.activity.privacyspace.PrivacyPinOneActivity
import com.base.filerecoveryrecyclebin.activity.privacyspace.PrivacySpaceActivity
import com.base.filerecoveryrecyclebin.activity.recovery.FileScanResultActivity
......@@ -14,8 +12,6 @@ import com.base.filerecoveryrecyclebin.activity.repeat.RepeatAnimationActivity
import com.base.filerecoveryrecyclebin.activity.screenshot.ScreenShotAnimationActivity
import com.base.filerecoveryrecyclebin.adapter.AppFunctionAdapter
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import com.base.filerecoveryrecyclebin.bean.ConstObject.JUNK_CLEANER
import com.base.filerecoveryrecyclebin.bean.ConstObject.PRIVACY_SPACE
import com.base.filerecoveryrecyclebin.bean.ConstObject.RECOVERY_DOCUMENTS
......
......@@ -10,7 +10,6 @@ import android.text.style.UnderlineSpan
import android.view.View
import androidx.lifecycle.lifecycleScope
import com.base.filerecoveryrecyclebin.MyApplication
import com.base.filerecoveryrecyclebin.activity.junkclean.ScanJunkActivity
import com.base.filerecoveryrecyclebin.activity.privacyspace.PrivacyPinOneActivity
import com.base.filerecoveryrecyclebin.activity.privacyspace.PrivacySpaceActivity
import com.base.filerecoveryrecyclebin.activity.recovery.FileScanResultActivity
......@@ -19,7 +18,6 @@ import com.base.filerecoveryrecyclebin.activity.screenshot.ScreenShotActivity
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import com.base.filerecoveryrecyclebin.ads.admob.AdmobOpenUtils
import com.base.filerecoveryrecyclebin.ads.max.AdMaxInterstitialUtils
import com.base.filerecoveryrecyclebin.ads.max.AdMaxOpenUtils
import com.base.filerecoveryrecyclebin.bean.ConstObject
......
package com.base.filerecoveryrecyclebin.activity.junkclean
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.Toast
import androidx.activity.addCallback
import androidx.core.view.updatePadding
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils
import androidx.lifecycle.lifecycleScope
import com.base.filerecoveryrecyclebin.databinding.ActivityLayoutScanJunkBinding
import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.help.PermissionHelp.checkStorePermission
import com.base.filerecoveryrecyclebin.help.PermissionHelp.requestStorePermission
import com.base.filerecoveryrecyclebin.utils.BarUtils
import com.base.filerecoveryrecyclebin.view.DialogViews.showGerPermission
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
/**
* 清理动画页面
*/
class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
private val TAG = "ScanJunkActivity"
override val binding: ActivityLayoutScanJunkBinding by lazy {
ActivityLayoutScanJunkBinding.inflate(layoutInflater)
}
private var job: Job? = null
override fun initView() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
if (checkStorePermission()) {
playLottie()
} else {
if (!checkStorePermission()) {
showGerPermission(tittle = "Storage Permission Required",
desc = "This feature requires access to your storage to scan your files and clean up junk files and unused APK files. We will not transmit your data to any third-party service. Please grant permission so that we can provide you with better service.",
deny = { finishToMain() },
allow = {
requestStorePermission(launcher, result = {
if (it) {
playLottie(false)
} else {
finishToMain()
}
})
})
}
}
override fun initListener() {
onBackPressedDispatcher.addCallback {
......@@ -55,13 +59,13 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
}
}
private var isPause = false
override fun onResume() {
super.onResume()
if (isPause) {
binding.idJunkScan.resumeAnimation()
if (checkStorePermission()) {
resumeLottie()
job = waitJob()
}
isPause = false
}
override fun onDestroy() {
......@@ -69,21 +73,23 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
animator1?.cancel()
animator2?.cancel()
animator3?.cancel()
binding.idJunkScan.cancelAnimation()
binding.lottie.cancelAnimation()
}
override fun onPause() {
super.onPause()
isPause = true
animator1?.pause()
animator2?.pause()
animator3?.pause()
binding.idJunkScan.pauseAnimation()
binding.lottie.pauseAnimation()
job?.cancel()
}
private fun playLottie(showAd: Boolean = true) {
val a1 = ValueAnimator.ofFloat(0f, 360f)
a1.run {
@SuppressLint("SetTextI18n")
private fun resumeLottie() {
if (animator1 == null) {
animator1 = ValueAnimator.ofFloat(0f, 360f)
animator1?.run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
......@@ -91,10 +97,12 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
addUpdateListener {
binding.idView1.rotation = it.animatedValue as Float
}
start()
}
val a2 = ValueAnimator.ofFloat(0f, 360f)
a2.run {
}
animator1?.start()
if (animator2 == null) {
animator2 = ValueAnimator.ofFloat(0f, 360f)
animator2?.run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
......@@ -102,10 +110,12 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
addUpdateListener {
binding.idView2.rotation = it.animatedValue as Float
}
start()
}
val a3 = ValueAnimator.ofFloat(0f, 360f)
a3.run {
}
animator2?.start()
if (animator3 == null) {
animator3 = ValueAnimator.ofFloat(0f, 360f)
animator3?.run {
duration = 1000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
......@@ -113,32 +123,31 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
addUpdateListener {
binding.idView3.rotation = it.animatedValue as Float
}
start()
}
binding.idJunkScan.imageAssetsFolder = "junk_scan/images/"
binding.idJunkScan.setAnimation("junk_scan/data.json")
binding.idJunkScan.playAnimation()
binding.root.postDelayed({
if (showAd) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this) {
a1.cancel()
a2.cancel()
a3.cancel()
startActivity(Intent(this, CleanJunkActivity::class.java))
finish()
}
} else {
a1.cancel()
a2.cancel()
a3.cancel()
startActivity(Intent(this, CleanJunkActivity::class.java))
animator3?.start()
binding.lottie.imageAssetsFolder = "junk_scan/images/"
binding.lottie.setAnimation("junk_scan/data.json")
binding.lottie.playAnimation()
}
private fun waitJob() = lifecycleScope.launch(Dispatchers.Main) {
delay(5000)
binding.lottie.visibility = View.GONE
binding.lottieCompleted.visibility = View.VISIBLE
binding.lottieCompleted.playAnimation()
binding.tv.text = "Completed!"
animator1?.cancel()
animator2?.cancel()
animator3?.cancel()
delay(1000)
admobMaxShowInterstitialAd(this@ScanJunkActivity) {
startActivity(Intent(this@ScanJunkActivity, CleanJunkActivity::class.java))
finish()
}
}, 5000)
}
private var animator1: ValueAnimator? = null
private var animator2: ValueAnimator? = null
private var animator3: ValueAnimator? = null
......
......@@ -7,6 +7,7 @@ import android.database.Cursor
import android.net.Uri
import android.os.Handler
import android.provider.MediaStore
import com.base.filerecoveryrecyclebin.activity.recyclebin.RecycleBinFileEx.getRecycleBinDir
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean
import com.base.filerecoveryrecyclebin.utils.LogEx
import com.google.gson.Gson
......@@ -74,32 +75,16 @@ class MediaContentObserver(val context: Context, val handler: Handler? = null) :
recycleBinDir.mkdirs()
}
val recycleBinFile = File(recycleBinDir, ".$name")
src.copyTo(recycleBinFile, true)
LogEx.logDebug(TAG, "size=${src.length()}")
if (src.length() > 0L) {
val recycleBinFile = File(getRecycleBinDir(), ".$name")
src.copyTo(recycleBinFile, true)
val binBean = RecycleBinBean(src.path, 0, src.length(), mimeType)
val binFile = File(recycleBinDir, ".$name.bin")
binFile.createNewFile()
binFile.writeText(Gson().toJson(binBean))
LogEx.logDebug(TAG, "回收站备份成功")
LogEx.logDebug(TAG, "RecycleBin backup")
handler?.sendEmptyMessage(99)
// if (!recycleBinFile.exists()) {
// recycleBinFile.createNewFile()
// } else {
// if (recycleBinFile.length()==0L){
// src.copyTo(recycleBinFile, true)
// LogEx.logDebug(TAG, "size=${src.length()}")
// val binBean = RecycleBinBean(src.path, 0, src.length(), mimeType)
// val binFile = File(recycleBinDir, ".$name.bin")
// binFile.createNewFile()
// binFile.writeText(Gson().toJson(binBean))
// LogEx.logDebug(TAG, "回收站备份成功")
// handler?.sendEmptyMessage(99)
// }
// }
}
}
}
package com.base.filerecoveryrecyclebin.activity.recyclebin
import android.annotation.SuppressLint
import android.os.Build
import android.os.FileObserver
import android.os.Handler
import androidx.annotation.RequiresApi
import com.base.filerecoveryrecyclebin.activity.recyclebin.RecycleBinFileEx.findRecycleBinFile
import com.base.filerecoveryrecyclebin.activity.recyclebin.RecycleBinFileEx.findRecycleBinJsonFile
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean
import com.base.filerecoveryrecyclebin.help.BaseApplication
import com.base.filerecoveryrecyclebin.utils.LogEx
import com.google.gson.Gson
import java.io.File
......@@ -79,23 +81,4 @@ class MyFileObserver(val handler: Handler? = null, files: List<File>) : FileObse
}
companion object {
fun getRecycleBinDir(): File {
val file = BaseApplication.context.filesDir
val recycleBinDir = File(file, "RecycleBin")
if (!recycleBinDir.exists()) {
recycleBinDir.mkdirs()
}
return recycleBinDir
}
fun findRecycleBinFile(namePath: String): File? {
return getRecycleBinDir().listFiles()?.find { it.name.contains(namePath) }
}
fun findRecycleBinJsonFile(namePath: String): File? {
return getRecycleBinDir().listFiles()?.find { it.name.contains(".$namePath.bin") }
}
}
}
\ No newline at end of file
......@@ -5,8 +5,8 @@ import android.graphics.Color
import android.os.Build
import androidx.annotation.RequiresApi
import com.base.filerecoveryrecyclebin.activity.ResultActivity
import com.base.filerecoveryrecyclebin.activity.recyclebin.MyFileObserver.Companion.findRecycleBinFile
import com.base.filerecoveryrecyclebin.activity.recyclebin.MyFileObserver.Companion.findRecycleBinJsonFile
import com.base.filerecoveryrecyclebin.activity.recyclebin.RecycleBinFileEx.findRecycleBinFile
import com.base.filerecoveryrecyclebin.activity.recyclebin.RecycleBinFileEx.findRecycleBinJsonFile
import com.base.filerecoveryrecyclebin.bean.ConstObject.RECYCLE_BIN
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean
import com.base.filerecoveryrecyclebin.databinding.ActivityRecycleBinDetailBinding
......
package com.base.filerecoveryrecyclebin.activity.recyclebin
import com.base.filerecoveryrecyclebin.help.BaseApplication
import java.io.File
object RecycleBinFileEx {
fun getRecycleBinDir(): File {
val file = BaseApplication.context.filesDir
val recycleBinDir = File(file, "RecycleBin")
if (!recycleBinDir.exists()) {
recycleBinDir.mkdirs()
}
return recycleBinDir
}
fun findRecycleBinFile(namePath: String): File? {
return getRecycleBinDir().listFiles()?.find { it.name.contains(namePath) }
}
fun findRecycleBinJsonFile(namePath: String): File? {
return getRecycleBinDir().listFiles()?.find { it.name.contains(".$namePath.bin") }
}
}
\ No newline at end of file
......@@ -8,7 +8,7 @@ import androidx.annotation.RequiresApi
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.activity.recyclebin.MyFileObserver.Companion.findRecycleBinFile
import com.base.filerecoveryrecyclebin.activity.recyclebin.RecycleBinFileEx.findRecycleBinFile
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean
import com.base.filerecoveryrecyclebin.databinding.ItemRecyclebinFileBinding
import com.base.filerecoveryrecyclebin.help.KotlinExt.toFormatSize
......
......@@ -12,7 +12,7 @@ import com.base.filerecoveryrecyclebin.ads.max.AdMaxOpenUtils
import com.base.filerecoveryrecyclebin.help.ConfigHelper
object AdmobMaxHelper {
private val TAG = ""
private val TAG = "AdmobMaxHelper"
fun admobMaxShowInterstitialAd(activity: Activity, onHidden: (() -> Unit)? = null) {
if (ConfigHelper.admobTrueMaxFlase) {
......
......@@ -89,6 +89,7 @@ object AdMaxInterstitialUtils {
EventUtils.event("ad_show_error", ext = obj2)
}
})
interstitialAd?.setRevenueListener(AdMaxEvent.EventOnPaidEventListener())
}
}
......@@ -121,7 +122,7 @@ object AdMaxInterstitialUtils {
}
AdMaxInterstitialUtils.onHidden = onHidden
interstitialAd?.setRevenueListener(AdMaxEvent.EventOnPaidEventListener())
if (interstitialAd?.isReady == true) {
LogEx.logDebug(TAG, "isReady=true")
interstitialAd?.showAd()
......
......@@ -72,9 +72,7 @@ object AdMaxOpenUtils {
}
})
appOpenAd?.setRevenueListener { ad ->
}
appOpenAd?.setRevenueListener(AdMaxEvent.EventOnPaidEventListener())
}
}
......@@ -113,7 +111,6 @@ object AdMaxOpenUtils {
if (appOpenAd?.isReady == true) {
LogEx.logDebug(TAG, "isReady=false")
appOpenAd?.setRevenueListener(AdMaxEvent.EventOnPaidEventListener())
appOpenAd?.showAd()
} else {
appOpenAd?.loadAd()
......
package com.base.filerecoveryrecyclebin.fragment
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.content.Intent
import android.view.View
import android.view.animation.AccelerateDecelerateInterpolator
import com.base.filerecoveryrecyclebin.activity.SettingActivity
import com.base.filerecoveryrecyclebin.activity.junkclean.ScanJunkActivity
import com.base.filerecoveryrecyclebin.activity.privacyspace.PrivacyPinOneActivity
import com.base.filerecoveryrecyclebin.activity.privacyspace.PrivacySpaceActivity
import com.base.filerecoveryrecyclebin.activity.recovery.FileScanResultActivity
import com.base.filerecoveryrecyclebin.activity.repeat.RepeatAnimationActivity
import com.base.filerecoveryrecyclebin.activity.screenshot.ScreenShotAnimationActivity
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.ads.admob.AdmobNativeUtils
import com.base.filerecoveryrecyclebin.ads.max.AdMaxNativeUtils
import com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_AUDIOS
import com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_DOCUMENTS
import com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_PHOTOS
import com.base.filerecoveryrecyclebin.bean.ConstObject.SCAN_VIDEOS
import com.base.filerecoveryrecyclebin.bean.ConstObject.privacyPinPassword
import com.base.filerecoveryrecyclebin.databinding.FragmentHome3Binding
import com.base.filerecoveryrecyclebin.databinding.FragmentHomeBinding
import com.base.filerecoveryrecyclebin.help.BaseFragment
import com.base.filerecoveryrecyclebin.help.ConfigHelper
class HomeFragment : BaseFragment<FragmentHome3Binding>() {
......
......@@ -7,8 +7,8 @@ import androidx.annotation.RequiresApi
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.base.filerecoveryrecyclebin.activity.MainActivity
import com.base.filerecoveryrecyclebin.activity.recyclebin.MyFileObserver.Companion.getRecycleBinDir
import com.base.filerecoveryrecyclebin.activity.recyclebin.RecycleBinDetailActivity
import com.base.filerecoveryrecyclebin.activity.recyclebin.RecycleBinFileEx.getRecycleBinDir
import com.base.filerecoveryrecyclebin.adapter.RecycleBinAdapter
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean
import com.base.filerecoveryrecyclebin.databinding.FragmentRecycleBinBinding
......@@ -22,7 +22,6 @@ import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
class RecycleBinFragment : BaseFragment<FragmentRecycleBinBinding>() {
......
......@@ -15,14 +15,12 @@ import android.os.Environment
import android.os.Handler
import android.os.IBinder
import android.provider.MediaStore
import android.util.Log
import android.widget.RemoteViews
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat
import androidx.core.graphics.drawable.IconCompat
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.activity.MainActivity
import com.base.filerecoveryrecyclebin.activity.junkclean.ScanJunkActivity
import com.base.filerecoveryrecyclebin.activity.recovery.FileScanResultActivity
import com.base.filerecoveryrecyclebin.activity.recyclebin.MediaContentObserver
import com.base.filerecoveryrecyclebin.activity.recyclebin.MyFileObserver
......
......@@ -14,7 +14,6 @@ import android.view.View
import android.view.WindowManager
import androidx.lifecycle.LifecycleCoroutineScope
import com.base.filerecoveryrecyclebin.R
import com.base.filerecoveryrecyclebin.activity.junkclean.ScanJunkActivity
import com.base.filerecoveryrecyclebin.ads.admob.AdmobInterstitialUtils.showInterAdSp
import com.base.filerecoveryrecyclebin.bean.RecycleBinBean
import com.base.filerecoveryrecyclebin.databinding.DialogCameraSettingBinding
......
......@@ -27,7 +27,7 @@
</RelativeLayout>
<com.base.filerecoveryrecyclebin.view.XmlLottieAnimationView
<FrameLayout
android:id="@+id/id_junk_scan"
android:layout_width="300dp"
android:layout_height="300dp"
......@@ -38,8 +38,28 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:lottie_autoPlay="true"
app:lottie_loop="true">
<com.base.filerecoveryrecyclebin.view.XmlLottieAnimationView
android:id="@+id/lottie"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
app:lottie_autoPlay="true"
app:lottie_loop="true" />
<com.base.filerecoveryrecyclebin.view.XmlLottieAnimationView
android:id="@+id/lottie_completed"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_gravity="center"
android:visibility="gone"
app:lottie_autoPlay="false"
app:lottie_rawRes="@raw/loading_completed" />
</FrameLayout>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
......
{"nm":"Success Animation","ddd":0,"h":400,"w":400,"meta":{"g":"@lottiefiles/toolkit-js 0.33.2"},"layers":[{"ty":4,"nm":"Success_Tick","sr":1,"st":4.00000016292334,"op":154.000006272549,"ip":4.00000016292334,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[29,-36,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[205.75,194.75,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Shape 1","ix":1,"cix":2,"np":3,"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":[[-48,-34],[2,16],[94.5,-77.5]]},"ix":2}},{"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":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.146,"y":1},"s":[15],"t":4},{"s":[30],"t":25.0000010182709}],"ix":5},"c":{"a":0,"k":[0,0.3922,0.7882],"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}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.113,"y":1},"s":[0],"t":4},{"s":[100],"t":25.0000010182709}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":0,"k":0,"ix":1},"m":1}],"ind":1},{"ty":4,"nm":"Circle","sr":1,"st":0,"op":150.000006109625,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[30.765,23.931,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[200,200,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[{"ty":22,"mn":"ADBE Stroke","nm":"Stroke","ix":1,"en":1,"ef":[{"ty":10,"mn":"ADBE Stroke-0001","nm":"Path","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"mn":"ADBE Stroke-0010","nm":"All Masks","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":7,"mn":"ADBE Stroke-0011","nm":"Stroke Sequentially","ix":3,"v":{"a":0,"k":1,"ix":3}},{"ty":2,"mn":"ADBE Stroke-0002","nm":"Color","ix":4,"v":{"a":0,"k":[1,1,1],"ix":4}},{"ty":0,"mn":"ADBE Stroke-0003","nm":"Brush Size","ix":5,"v":{"a":0,"k":2,"ix":5}},{"ty":0,"mn":"ADBE Stroke-0004","nm":"Brush Hardness","ix":6,"v":{"a":0,"k":0.75,"ix":6}},{"ty":0,"mn":"ADBE Stroke-0005","nm":"Opacity","ix":7,"v":{"a":0,"k":1,"ix":7}},{"ty":0,"mn":"ADBE Stroke-0008","nm":"Start","ix":8,"v":{"a":0,"k":0,"ix":8}},{"ty":0,"mn":"ADBE Stroke-0009","nm":"End","ix":9,"v":{"a":0,"k":100,"ix":9}},{"ty":7,"mn":"ADBE Stroke-0006","nm":"Spacing","ix":10,"v":{"a":0,"k":15,"ix":10}},{"ty":7,"mn":"ADBE Stroke-0007","nm":"Paint Style","ix":11,"v":{"a":0,"k":1,"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":[318.933,318.933],"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.188,"y":1},"s":[50],"t":0},{"s":[20],"t":20.0000008146167}],"ix":5},"c":{"a":0,"k":[0,0.3922,0.7882],"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":[30.765,23.931],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.096,"y":1},"s":[100],"t":0},{"s":[0],"t":20.0000008146167}],"ix":1},"m":1}],"ind":2}],"v":"5.7.4","fr":29.9700012207031,"op":30.0000012219251,"ip":0,"assets":[]}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment