diff --git a/app/build.gradle b/app/build.gradle index 9583e6d9..e4b289bb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -255,6 +255,9 @@ dependencies { implementation rootProject.ext.generalDependencies.goldfinger implementation rootProject.ext.generalDependencies.goldfingerRX + // Lottie + implementation rootProject.ext.generalDependencies.lottie + //ThreeTen : Alternative to Android Calendar API implementation rootProject.ext.generalDependencies.threeten diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 06c15209..d9cbfe2a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -372,6 +372,12 @@ android:parentActivityName=".ui.mainactivity.MainActivity" android:screenOrientation="portrait" tools:ignore="LockedOrientationActivity" /> + + diff --git a/app/src/main/java/com/riders/thelab/core/utils/UIManager.kt b/app/src/main/java/com/riders/thelab/core/utils/UIManager.kt index 6b57606a..1953e9cf 100644 --- a/app/src/main/java/com/riders/thelab/core/utils/UIManager.kt +++ b/app/src/main/java/com/riders/thelab/core/utils/UIManager.kt @@ -312,6 +312,12 @@ class UIManager private constructor() { menu.setGroupVisible(R.id.menu_main_group, true) } + fun getBitmapFromDrawable(context: Context, drawableResId: Int): Bitmap? { + if (0 == drawableResId) + return null + return drawableToBitmap(ContextCompat.getDrawable(context, drawableResId)!!) + } + /** * Hide menu buttons when collapse toolbar is expanded */ @@ -329,5 +335,10 @@ class UIManager private constructor() { fun setBackgroundColor(context: Context, targetView: View, colorResID: Int) { targetView.setBackgroundColor(ContextCompat.getColor(context, colorResID)) } + + fun updateToolbarIcon(activity: Activity, menu: Menu, actionId: Int, drawableResId: Int) { + menu.findItem(actionId)?.icon = ContextCompat.getDrawable(activity, drawableResId) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/riders/thelab/ui/lottie/LottieActivity.kt b/app/src/main/java/com/riders/thelab/ui/lottie/LottieActivity.kt new file mode 100644 index 00000000..4d3e646e --- /dev/null +++ b/app/src/main/java/com/riders/thelab/ui/lottie/LottieActivity.kt @@ -0,0 +1,111 @@ +package com.riders.thelab.ui.lottie + +import android.animation.Animator +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.doOnPreDraw +import com.riders.thelab.databinding.ActivityLottieBinding +import timber.log.Timber +import kotlin.random.Random + +class LottieActivity : AppCompatActivity() { + + private var _viewBinding: ActivityLottieBinding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _viewBinding!! + + private var isConnected: Boolean = false + + companion object { + val lottieUrls = mutableListOf( + // Android + "https://assets1.lottiefiles.com/datafiles/8rza4J0CdJeJ8Pb3v9INOKI0vcekEpVccKVF2lNQ/android.json", + // Search + "https://assets4.lottiefiles.com/packages/lf20_83et0zjc.json", + // Loading + "https://assets1.lottiefiles.com/private_files/lf30_bn5winlb.json", + "https://assets5.lottiefiles.com/private_files/lf30_qsg7wqkv.json", + // Fluid loader + "https://assets2.lottiefiles.com/packages/lf20_kk62um5v.json", + // Swinging + "https://assets6.lottiefiles.com/packages/lf20_97iupqly.json", + // Scanning files + "https://assets5.lottiefiles.com/private_files/lf30_jasmilgh.json", + + // Backgrounds + // IT + "https://assets10.lottiefiles.com/packages/lf20_k5dcqzxm.json", + // Abstract + "https://assets7.lottiefiles.com/packages/lf20_ym8w5cx4.json", + ) + } + + ///////////////////////////////////// + // + // OVERRIDE + // + ///////////////////////////////////// + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + _viewBinding = ActivityLottieBinding.inflate(layoutInflater) + setContentView(binding.root) + + postponeEnterTransition() + binding.root.doOnPreDraw { startPostponedEnterTransition() } + + binding.lottieAnimationView.enableMergePathsForKitKatAndAbove(true) + binding.lottieAnimationView.setOutlineMasksAndMattes(true) + + binding.lottieAnimationView.setAnimationFromUrl(lottieUrls[6]) + } + + override fun onPause() { + super.onPause() + Timber.e("onPause()") + } + + override fun onResume() { + super.onResume() + Timber.d("onResume()") + } + + + override fun onDestroy() { + Timber.e("onDestroy()") + _viewBinding = null + super.onDestroy() + } + + private fun startRandomPlay() { + + binding.lottieAnimationView.setAnimationFromUrl(lottieUrls[3]) + binding.lottieAnimationView.addAnimatorListener(object : Animator.AnimatorListener { + override fun onAnimationStart(animation: Animator?) { + Timber.d("onAnimationStart()") + } + + override fun onAnimationEnd(animation: Animator?) { + Timber.e("onAnimationEnd()") + } + + override fun onAnimationCancel(animation: Animator?) { + Timber.e("onAnimationCancel()") + } + + override fun onAnimationRepeat(animation: Animator?) { + Timber.d("onAnimationRepeat()") + binding.lottieAnimationView.setAnimationFromUrl( + lottieUrls[Random.nextInt( + 0, + lottieUrls.size + )] + ) + binding.lottieAnimationView.playAnimation() + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/riders/thelab/ui/mainactivity/MainActivity.kt b/app/src/main/java/com/riders/thelab/ui/mainactivity/MainActivity.kt index 763f4b9f..b55d84e4 100644 --- a/app/src/main/java/com/riders/thelab/ui/mainactivity/MainActivity.kt +++ b/app/src/main/java/com/riders/thelab/ui/mainactivity/MainActivity.kt @@ -16,7 +16,6 @@ import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.net.NetworkRequest import android.net.wifi.WifiManager -import android.os.Build import android.os.Bundle import android.provider.Settings import android.view.Menu @@ -203,7 +202,8 @@ class MainActivity : AppCompatActivity(), mConnectivityManager!!.registerNetworkCallback(request, networkManager) - val labLocationManager = LabLocationManager(this@MainActivity, this@MainActivity, this) + val labLocationManager = + LabLocationManager(this@MainActivity, this@MainActivity, this) if (!labLocationManager.canGetLocation()) { Timber.e("Cannot get location please enable position") @@ -429,9 +429,14 @@ class MainActivity : AppCompatActivity(), this, { locationStatus -> Timber.d("getLocationData().observe : $locationStatus") - menu?.findItem(R.id.action_location_settings)?.setIcon( + + UIManager.updateToolbarIcon( + this@MainActivity, + menu!!, + R.id.action_location_settings, if (!locationStatus) R.drawable.ic_location_off else R.drawable.ic_location_on ) + }) mViewModel.getWeather().observe( @@ -613,7 +618,7 @@ class MainActivity : AppCompatActivity(), private fun applyRecycler() { Timber.d("applyRecycler()") - var layoutManager: RecyclerView.LayoutManager? + val layoutManager: RecyclerView.LayoutManager? if (!LabCompatibilityManager.isTablet(this)) { @@ -707,9 +712,10 @@ class MainActivity : AppCompatActivity(), if (!isGPS) mGpsUtils.turnGPSOn(this) } + @SuppressLint("InlinedApi") private fun toggleWifi() { Timber.d("toggleWifi()") - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + if (LabCompatibilityManager.isAndroid10()) { val panelIntent = Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY) startActivityForResult(panelIntent, 0) } else { @@ -720,15 +726,27 @@ class MainActivity : AppCompatActivity(), if (!isWifiEnabled) { Timber.d("(this.applicationContext.getSystemService(Context.WIFI_SERVICE) as? WifiManager) $isWifiEnabled") Timber.d("This should activate wifi") + isWifiEnabled = true - menu?.findItem(R.id.action_connection_settings)?.icon = - ContextCompat.getDrawable(this@MainActivity, R.drawable.ic_wifi) + + UIManager.updateToolbarIcon( + this@MainActivity, + menu!!, + R.id.action_connection_settings, + R.drawable.ic_wifi + ) } else { Timber.d("(this.applicationContext.getSystemService(Context.WIFI_SERVICE) as? WifiManager) $isWifiEnabled") Timber.d("This should disable wifi") + isWifiEnabled = false - menu?.findItem(R.id.action_connection_settings)?.icon = - ContextCompat.getDrawable(this@MainActivity, R.drawable.ic_wifi_off) + + UIManager.updateToolbarIcon( + this@MainActivity, + menu!!, + R.id.action_connection_settings, + R.drawable.ic_wifi_off + ) } this.isWifiEnabled = !isWifiEnabled } @@ -920,10 +938,15 @@ class MainActivity : AppCompatActivity(), private fun updateToolbarConnectionIcon(isConnected: Boolean) { Timber.e("updateToolbarConnectionIcon, is connected : %s", isConnected) if (!LabCompatibilityManager.isTablet(this)) - menu?.findItem(R.id.action_connection_settings)?.icon = ContextCompat.getDrawable( - this@MainActivity, - if (isConnected) R.drawable.ic_wifi else R.drawable.ic_wifi_off - ) + + runOnUiThread { + UIManager.updateToolbarIcon( + this@MainActivity, + menu!!, + R.id.action_connection_settings, + if (isConnected) R.drawable.ic_wifi else R.drawable.ic_wifi_off + ) + } } override fun gpsStatus(isGPSEnable: Boolean) { @@ -931,8 +954,14 @@ class MainActivity : AppCompatActivity(), Timber.d("turn on/off GPS - isGPSEnable : $isGPSEnable") isGPS = isGPSEnable - if (isGPS) menu?.findItem(R.id.action_location_settings)?.icon = - ContextCompat.getDrawable(this@MainActivity, R.drawable.ic_location_on) + if (isGPS) { + UIManager.updateToolbarIcon( + this@MainActivity, + menu!!, + R.id.action_location_settings, + R.drawable.ic_location_on + ) + } } override fun onLocationChanged(location: Location) { diff --git a/app/src/main/java/com/riders/thelab/utils/AppBuilderUtils.kt b/app/src/main/java/com/riders/thelab/utils/AppBuilderUtils.kt index 80ca0085..312d9ba0 100644 --- a/app/src/main/java/com/riders/thelab/utils/AppBuilderUtils.kt +++ b/app/src/main/java/com/riders/thelab/utils/AppBuilderUtils.kt @@ -20,6 +20,7 @@ import com.riders.thelab.ui.googledrive.GoogleDriveActivity import com.riders.thelab.ui.googlesignin.GoogleSignInActivity import com.riders.thelab.ui.kat.KatActivity import com.riders.thelab.ui.locationonmaps.LocationOnMapsActivity +import com.riders.thelab.ui.lottie.LottieActivity import com.riders.thelab.ui.multipane.MultipaneActivity import com.riders.thelab.ui.palette.PaletteActivity import com.riders.thelab.ui.recycler.RecyclerViewActivity @@ -403,6 +404,22 @@ class AppBuilderUtils { .build() list.add(download) + // lottie + val lottie = + AppBuilder + .withId(26L) + .withActivityTitle("Lottie") + .withActivityDescription("Lottie is a mobile library for Android and iOS that parses Adobe After Effects animations and renders them natively on mobile!...") + .withActivityIcon( + getDrawableFromIntResource( + context, + R.drawable.ic_lottie_icon + ) + ) + .withActivityClass(LottieActivity::class.java) + .build() + list.add(lottie) + // Wip val wip = AppBuilder diff --git a/app/src/main/res/drawable-mdpi/ic_lottie_icon.xml b/app/src/main/res/drawable-mdpi/ic_lottie_icon.xml new file mode 100644 index 00000000..1fcedeec --- /dev/null +++ b/app/src/main/res/drawable-mdpi/ic_lottie_icon.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_lottie.xml b/app/src/main/res/layout/activity_lottie.xml new file mode 100644 index 00000000..153f2361 --- /dev/null +++ b/app/src/main/res/layout/activity_lottie.xml @@ -0,0 +1,25 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 81e50cd2..23a67c32 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -373,4 +373,7 @@ Download + + Lottie + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 65c7179c..f7b85358 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ ext { // version information versionMajor = 10 versionMinor = 6 - versionPatch = 0 + versionPatch = 1 versionName = "${versionMajor}.${versionMinor}.${versionPatch}" // Kotlin @@ -92,6 +92,8 @@ ext { // GoldFinger goldfingerVersion = '2.0.1' + lottieVersion = '4.1.0' + threetenVersion = '1.3.1' timberVersion = '5.0.1' @@ -107,7 +109,7 @@ ext { kotlinCoroutines : "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion", kotlinCoroutinesAndroid : "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion", kotlinParcelize : "org.jetbrains.kotlin:kotlin-parcelize-runtime:$kotlinVersion", - kotlinPlaySevices : "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$kotlinPlayServices", + kotlinPlaySevices : "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$kotlinPlayServices", // KTX framework activityKTX : "androidx.activity:activity-ktx:$activityKtxVersion", @@ -228,6 +230,9 @@ ext { goldfinger : "co.infinum:goldfinger:$goldfingerVersion", goldfingerRX : "co.infinum:goldfinger-rx:$goldfingerVersion", + // Lottie + lottie : "com.airbnb.android:lottie:$lottieVersion", + // Timber : Logging library timber : "com.jakewharton.timber:timber:$timberVersion" ]