From 6147c4b0db4ea3e56fda9417507584cc93aa2bda Mon Sep 17 00:00:00 2001 From: ottoptj Date: Wed, 22 May 2024 03:19:15 +0300 Subject: [PATCH] Pretty much functional in one view now and implemented animations --- .../eu/ottop/yamlauncher/AppMenuAdapter.kt | 7 +- .../java/eu/ottop/yamlauncher/MainActivity.kt | 146 ++++++++++++++++-- app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/values/colors.xml | 4 + 4 files changed, 138 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/eu/ottop/yamlauncher/AppMenuAdapter.kt b/app/src/main/java/eu/ottop/yamlauncher/AppMenuAdapter.kt index bb4df52..a0001cb 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/AppMenuAdapter.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/AppMenuAdapter.kt @@ -22,12 +22,13 @@ class AppMenuAdapter( var apps: MutableList>>, private val itemClickListener: OnItemClickListener, private val shortcutListener: OnShortcutListener, - private val itemLongClickListener: OnItemLongClickListener, - private val menuMode: String = "app", - private val shortcutTextView: TextView? = null + private val itemLongClickListener: OnItemLongClickListener ) : RecyclerView.Adapter() { + var menuMode: String = "app" + var shortcutTextView: TextView? = null + private val sharedPreferenceManager = SharedPreferenceManager() interface OnItemClickListener { diff --git a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt index c650fd9..39f80a1 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt @@ -1,8 +1,13 @@ package eu.ottop.yamlauncher +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.ArgbEvaluator +import android.animation.ObjectAnimator import android.content.Context import android.content.pm.LauncherActivityInfo import android.content.pm.LauncherApps +import android.graphics.Color import android.os.Bundle import android.os.UserHandle import android.text.Editable @@ -11,6 +16,7 @@ import android.util.Log import android.view.GestureDetector import android.view.MotionEvent import android.view.View +import android.view.WindowManager import android.view.inputmethod.InputMethodManager import android.widget.EditText import android.widget.LinearLayout @@ -18,6 +24,7 @@ import android.widget.TextView import android.widget.Toast import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import androidx.core.view.children import androidx.recyclerview.widget.RecyclerView @@ -30,6 +37,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlin.math.abs + class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, AppMenuAdapter.OnShortcutListener, AppMenuAdapter.OnItemLongClickListener { private lateinit var binding: ActivityMainBinding @@ -88,13 +96,11 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap } i.setOnLongClickListener { - binding.homeView.visibility = View.GONE + binding.homeView.FadeOut() + adapter.menuMode = "shortcut" + adapter.shortcutTextView = i + binding.appView.slideInFromBottom() - val newApps = mutableListOf>>() - newApps.addAll(installedApps) - adapter = AppMenuAdapter(this@MainActivity, newApps, this@MainActivity, this@MainActivity, this@MainActivity, "shortcut", i) - recyclerView.adapter = adapter - binding.appView.visibility = View.VISIBLE return@setOnLongClickListener true }} @@ -108,7 +114,14 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap installedApps = appUtils.getInstalledApps(this@MainActivity) recyclerView = findViewById(R.id.recycler_view) - recyclerView.scrollToPosition(0) + val newApps = mutableListOf>>() + newApps.addAll(installedApps) + adapter = AppMenuAdapter(this@MainActivity, newApps, this@MainActivity, this@MainActivity, this@MainActivity) + withContext(Dispatchers.Main) { + recyclerView.adapter = adapter + recyclerView.scrollToPosition(0) + } + searchView = findViewById(R.id.searchView) setupSearch() @@ -116,8 +129,8 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { - binding.appView.visibility = View.GONE - binding.homeView.visibility = View.VISIBLE + binding.appView.slideOutToBottom() + binding.homeView.FadeIn() } }) @@ -242,15 +255,114 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap private const val SWIPE_VELOCITY_THRESHOLD = 100 } + private fun View.slideInFromBottom(duration: Long = 100) { + if (visibility != View.VISIBLE) { + translationY = height.toFloat() + alpha = 0f + visibility = View.VISIBLE + animate() + .translationY(0f) + .alpha(1f) + .setDuration(duration) + .setListener(null) + val originalColor = ContextCompat.getColor(this@MainActivity, R.color.original_color) + val newColor = ContextCompat.getColor(this@MainActivity, R.color.new_color) + + val backgroundColorAnimator: ObjectAnimator = ObjectAnimator.ofObject( + binding.root, + "backgroundColor", + ArgbEvaluator(), + originalColor, + newColor + ) + + backgroundColorAnimator.setDuration(100); + + val window = window + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) + + val statusBarColorAnimator = ObjectAnimator.ofArgb( + window, + "statusBarColor", + originalColor, + newColor + ) + statusBarColorAnimator.setDuration(100) + backgroundColorAnimator.start(); + statusBarColorAnimator.start(); + } + + } + + fun View.slideOutToBottom(duration: Long = 100) { + if (visibility == View.VISIBLE) { + animate() + .translationY(height.toFloat()) + .alpha(0f) + .setDuration(duration) + .setListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + visibility = View.INVISIBLE + } + })} + } + + private fun View.FadeIn(duration: Long = 100) { + if (visibility != View.VISIBLE) { + alpha = 0f + visibility = View.VISIBLE + animate() + .alpha(1f) + .setDuration(duration) + .setListener(null) + val originalColor = ContextCompat.getColor(this@MainActivity, R.color.new_color) + val newColor = ContextCompat.getColor(this@MainActivity, R.color.original_color) + + val backgroundColorAnimator: ObjectAnimator = ObjectAnimator.ofObject( + binding.root, + "backgroundColor", + ArgbEvaluator(), + originalColor, + newColor + ) + + backgroundColorAnimator.setDuration(100); + + val window = window + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) + + val statusBarColorAnimator = ObjectAnimator.ofArgb( + window, + "statusBarColor", + originalColor, + newColor + ) + statusBarColorAnimator.setDuration(100) + backgroundColorAnimator.start(); + statusBarColorAnimator.start(); + } + } + + fun View.FadeOut(duration: Long = 100) { + if (visibility == View.VISIBLE) { + animate() + .alpha(0f) + .setDuration(duration) + .setListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + visibility = View.INVISIBLE + } + })} + } + fun openAppMenuActivity() { //AppMenuActivity.start(this, installedApps) { //} - binding.homeView.visibility = View.GONE - val newApps = mutableListOf>>() - newApps.addAll(installedApps) - adapter = AppMenuAdapter(this@MainActivity, newApps, this@MainActivity, this@MainActivity, this@MainActivity, "app") - recyclerView.adapter = adapter - binding.appView.visibility = View.VISIBLE + + binding.homeView.FadeOut() + binding.appView.slideInFromBottom() + window.statusBarColor = Color.parseColor("#6E000000") + } override fun onItemClick(appInfo: LauncherActivityInfo, userHandle: UserHandle) { @@ -285,8 +397,8 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap } } sharedPreferenceManager.setShortcut(this, shortcutView, appInfo.applicationInfo.packageName, userProfile) - binding.appView.visibility = View.GONE - binding.homeView.visibility = View.VISIBLE + binding.appView.slideOutToBottom() + binding.homeView.slideInFromBottom() } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 43fa827..49b81a0 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -16,7 +16,7 @@ android:layout_height="match_parent" android:gravity="bottom" android:orientation="vertical" - android:visibility="gone"> + android:visibility="invisible"> #FF000000 #FFFFFFFF + + #00000000 + #3F000000 + \ No newline at end of file