diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a63fd47..08a7a95 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -28,7 +28,10 @@ android { isShrinkResources = false isDebuggable = true applicationIdSuffix = ".debug" - proguardFiles (getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) resValue("string", "app_name", "Easy Launcher (Debug)") resValue("string", "settings_backups_file", "autoBackup.debug.ini") } @@ -36,7 +39,10 @@ android { getByName("release") { isMinifyEnabled = true isShrinkResources = true - proguardFiles (getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) resValue("string", "app_name", "Easy Launcher") resValue("string", "settings_backups_file", "autoBackup.ini") } @@ -89,11 +95,11 @@ dependencies { implementation(libs.lifecycle.viewmodel.ktx) implementation(libs.work.runtime.ktx) implementation(libs.recyclerview) - implementation(libs.viewpager2) implementation(libs.preference) implementation(libs.biometric.ktx) implementation(libs.room.ktx) implementation(libs.room.runtime) + //noinspection KaptUsageInsteadOfKsp kapt(libs.room.compiler) implementation(libs.dagger.hilt.android) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6e4dfa9..c08fa85 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,7 +27,7 @@ (androidx.appcompat.R.id.search_src_text).apply { - textSize = 28f isCursorVisible = false } val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/helper/AppHelper.kt b/app/src/main/java/com/github/droidworksstudio/launcher/helper/AppHelper.kt index e712d49..88a272b 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/helper/AppHelper.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/helper/AppHelper.kt @@ -24,11 +24,14 @@ import android.view.WindowManager import android.widget.TextView import android.widget.Toast import androidx.appcompat.widget.LinearLayoutCompat +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.github.droidworksstudio.launcher.Constants import com.github.droidworksstudio.launcher.R import com.github.droidworksstudio.launcher.accessibility.MyAccessibilityService import com.github.droidworksstudio.launcher.data.entities.AppInfo +import com.github.droidworksstudio.launcher.listener.OnSwipeTouchListener import com.github.droidworksstudio.launcher.ui.activities.FakeHomeActivity import java.util.Calendar import java.util.Date diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnItemClickedListener.kt b/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnItemClickedListener.kt index 4477bd7..e4c482a 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnItemClickedListener.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnItemClickedListener.kt @@ -5,18 +5,18 @@ import com.github.droidworksstudio.launcher.data.entities.AppInfo class OnItemClickedListener { interface OnAppsClickedListener{ - fun onAppClicked(appInfo: AppInfo) + fun onAppClicked(appInfo: AppInfo) {} } interface OnAppLongClickedListener{ - fun onAppLongClicked(appInfo: AppInfo) + fun onAppLongClicked(appInfo: AppInfo) {} } interface BottomSheetDismissListener { - fun onBottomSheetDismissed() + fun onBottomSheetDismissed() {} } interface OnAppStateClickListener{ - fun onAppStateClicked(appInfo: AppInfo) + fun onAppStateClicked(appInfo: AppInfo) {} } } \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnItemMoveListener.kt b/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnItemMoveListener.kt index d2cd5d1..c38b62a 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnItemMoveListener.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnItemMoveListener.kt @@ -3,6 +3,6 @@ package com.github.droidworksstudio.launcher.listener class OnItemMoveListener { interface OnItemActionListener { fun onViewMoved(oldPosition: Int, newPosition: Int): Boolean - fun onViewSwiped(position: Int) + fun onViewSwiped(position: Int) {} } } \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnSwipeTouchListener.kt b/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnSwipeTouchListener.kt index eab93dd..f4938f2 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnSwipeTouchListener.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/listener/OnSwipeTouchListener.kt @@ -3,15 +3,23 @@ package com.github.droidworksstudio.launcher.listener import android.annotation.SuppressLint import android.content.Context import android.view.GestureDetector +import android.view.GestureDetector.SimpleOnGestureListener import android.view.MotionEvent import android.view.View -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch +import android.view.View.OnTouchListener +import com.github.droidworksstudio.launcher.Constants +import java.util.* +import kotlin.concurrent.schedule +import kotlin.math.abs -internal open class OnSwipeTouchListener(c: Context?) : View.OnTouchListener { +/* +Swipe, double tap and long press touch listener for a view +Source: https://www.tutorialspoint.com/how-to-handle-swipe-gestures-in-kotlin +*/ + +internal open class OnSwipeTouchListener(c: Context?) : OnTouchListener { private var longPressOn = false - + private var doubleTapOn = false private val gestureDetector: GestureDetector @SuppressLint("ClickableViewAccessibility") @@ -21,7 +29,7 @@ internal open class OnSwipeTouchListener(c: Context?) : View.OnTouchListener { return gestureDetector.onTouchEvent(motionEvent) } - private inner class GestureListener : GestureDetector.SimpleOnGestureListener() { + private inner class GestureListener : SimpleOnGestureListener() { private val swipeThreshold: Int = 100 private val swipeVelocityThreshold: Int = 100 @@ -29,37 +37,48 @@ internal open class OnSwipeTouchListener(c: Context?) : View.OnTouchListener { return true } + override fun onSingleTapUp(e: MotionEvent): Boolean { + if (doubleTapOn) { + doubleTapOn = false + onTripleClick() + } + return super.onSingleTapUp(e) + } + override fun onDoubleTap(e: MotionEvent): Boolean { - onDoubleClick() + doubleTapOn = true + Timer().schedule(Constants.TRIPLE_TAP_DELAY_MS.toLong()) { + if (doubleTapOn) { + doubleTapOn = false + onDoubleClick() + } + } return super.onDoubleTap(e) } override fun onLongPress(e: MotionEvent) { longPressOn = true - val scope = CoroutineScope(Dispatchers.Main) - scope.launch { - if (longPressOn) { - onLongClick() - } + Timer().schedule(Constants.LONG_PRESS_DELAY_MS.toLong()) { + if (longPressOn) onLongClick() } super.onLongPress(e) } override fun onFling( - e1: MotionEvent?, - event1: MotionEvent, + event1: MotionEvent?, + event2: MotionEvent, velocityX: Float, velocityY: Float ): Boolean { try { - val diffY = event1.y - event1.y - val diffX = event1.x - event1.x - if (kotlin.math.abs(diffX) > kotlin.math.abs(diffY)) { - if (kotlin.math.abs(diffX) > swipeThreshold && kotlin.math.abs(velocityX) > swipeVelocityThreshold) { + val diffY = event2.y - event1!!.y + val diffX = event2.x - event1.x + if (abs(diffX) > abs(diffY)) { + if (abs(diffX) > swipeThreshold && abs(velocityX) > swipeVelocityThreshold) { if (diffX > 0) onSwipeRight() else onSwipeLeft() } } else { - if (kotlin.math.abs(diffY) > swipeThreshold && kotlin.math.abs(velocityY) > swipeVelocityThreshold) { + if (abs(diffY) > swipeThreshold && abs(velocityY) > swipeVelocityThreshold) { if (diffY < 0) onSwipeUp() else onSwipeDown() } } @@ -76,7 +95,7 @@ internal open class OnSwipeTouchListener(c: Context?) : View.OnTouchListener { open fun onSwipeDown() {} open fun onLongClick() {} open fun onDoubleClick() {} - + open fun onTripleClick() {} init { gestureDetector = GestureDetector(c, GestureListener()) } diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/listener/ScrollEventListener.kt b/app/src/main/java/com/github/droidworksstudio/launcher/listener/ScrollEventListener.kt index bfc4c36..307a0ac 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/listener/ScrollEventListener.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/listener/ScrollEventListener.kt @@ -1,7 +1,5 @@ package com.github.droidworksstudio.launcher.listener interface ScrollEventListener { - fun onTopReached() - fun onBottomReached() - fun onScroll(isTopReached: Boolean, isBottomReached: Boolean) + fun onScroll(isTopReached: Boolean, isBottomReached: Boolean) {} } \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt index 08582eb..cc87fe0 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/activities/MainActivity.kt @@ -4,7 +4,6 @@ import android.annotation.SuppressLint import android.content.pm.ActivityInfo import android.os.Build import android.os.Bundle -import android.util.Log import android.view.Menu import android.view.MenuItem import android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS @@ -20,8 +19,6 @@ import com.github.droidworksstudio.launcher.R import com.github.droidworksstudio.launcher.databinding.ActivityMainBinding import com.github.droidworksstudio.launcher.helper.AppHelper import com.github.droidworksstudio.launcher.helper.PreferenceHelper -import com.github.droidworksstudio.launcher.ui.drawer.DrawFragment -import com.github.droidworksstudio.launcher.ui.viewpager.ViewPagerAdapter import com.github.droidworksstudio.launcher.viewmodel.AppViewModel import com.github.droidworksstudio.launcher.viewmodel.PreferenceViewModel import dagger.hilt.android.AndroidEntryPoint @@ -46,8 +43,6 @@ class MainActivity : AppCompatActivity() { @Inject lateinit var appHelper: AppHelper - private val viewPagerAdapter: ViewPagerAdapter by lazy { ViewPagerAdapter(supportFragmentManager, lifecycle) } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -56,7 +51,6 @@ class MainActivity : AppCompatActivity() { initializeDependencies() setupNavController() - setupViewPagerAdapter() setupOrientation() } @@ -73,12 +67,10 @@ class MainActivity : AppCompatActivity() { lifecycleScope.launch { viewModel.initializeInstalledAppInfo(this@MainActivity) } - //GlobalScope.launch { } preferenceHelper.firstLaunch = false } private fun observeUI() { - binding.pager.currentItem = 1 preferenceViewModel.setShowStatusBar(preferenceHelper.showStatusBar) preferenceViewModel.showStatusBarLiveData.observe(this) { if (it) appHelper.showStatusBar(this.window) @@ -94,12 +86,6 @@ class MainActivity : AppCompatActivity() { appBarConfiguration = AppBarConfiguration(navController.graph) } - private fun setupViewPagerAdapter() { - binding.pager.apply { - adapter = viewPagerAdapter - offscreenPageLimit = 1 - } - } @SuppressLint("SourceLockedOrientationActivity") private fun setupOrientation() { if (appHelper.isTablet(this)) return @@ -143,18 +129,10 @@ class MainActivity : AppCompatActivity() { @Deprecated("Deprecated in Java") override fun onBackPressed() { - val currentItem = binding.pager.currentItem - Log.d("currentItem","$currentItem") - val navHostFragment = - supportFragmentManager.findFragmentById(R.id.nav_host_fragment_content_main) as NavHostFragment - val currentFragment = navHostFragment.childFragmentManager.fragments[0] - - if (currentFragment is DrawFragment) { - @Suppress("DEPRECATION") + navController = findNavController(R.id.nav_host_fragment_content_main) + @Suppress("DEPRECATION") + if (navController.currentDestination?.id != R.id.HomeFragment) super.onBackPressed() - } else { - binding.pager.currentItem = currentItem - 1 - } } private fun backToHomeScreen() { diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt index e9f3512..3a5d46d 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/drawer/DrawFragment.kt @@ -13,6 +13,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.coroutineScope import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.github.droidworksstudio.launcher.R import com.github.droidworksstudio.launcher.data.entities.AppInfo @@ -26,6 +27,8 @@ import com.github.droidworksstudio.launcher.helper.searchCustomSearchEngine import com.github.droidworksstudio.launcher.helper.searchOnPlayStore import com.github.droidworksstudio.launcher.helper.showKeyboard import com.github.droidworksstudio.launcher.listener.OnItemClickedListener +import com.github.droidworksstudio.launcher.listener.OnSwipeTouchListener +import com.github.droidworksstudio.launcher.listener.ScrollEventListener import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.AppInfoBottomSheetFragment import com.github.droidworksstudio.launcher.viewmodel.AppViewModel import dagger.hilt.android.AndroidEntryPoint @@ -40,7 +43,7 @@ class DrawFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, OnItemClickedListener.OnAppLongClickedListener, OnItemClickedListener.BottomSheetDismissListener, OnItemClickedListener.OnAppStateClickListener, - FingerprintHelper.Callback { + FingerprintHelper.Callback, ScrollEventListener { private var _binding: FragmentDrawBinding? = null private val binding get() = _binding!! @@ -78,6 +81,7 @@ class DrawFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, setupRecyclerView() setupSearch() observeClickListener() + observeSwipeTouchListener() } private fun setupRecyclerView() { @@ -94,7 +98,7 @@ class DrawFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, @Suppress("DEPRECATION") viewLifecycleOwner.lifecycleScope.launchWhenCreated { - viewModel.drawApps.collect{ + viewModel.drawApps.collect { drawAdapter.submitList(it) drawAdapter.updateDataWithStateFlow(it) } @@ -121,6 +125,7 @@ class DrawFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, } return true } + override fun onQueryTextChange(newText: String?): Boolean { searchApp(newText.toString()) return true @@ -129,12 +134,33 @@ class DrawFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, } - private fun observeClickListener(){ + @SuppressLint("ClickableViewAccessibility") + private fun observeClickListener() { binding.drawSearchButton.setOnClickListener { binding.searchViewText.showKeyboard() } } + @SuppressLint("ClickableViewAccessibility") + private fun observeSwipeTouchListener() { + binding.touchArea.setOnTouchListener(getSwipeGestureListener(context)) + } + + private fun getSwipeGestureListener(context: Context): View.OnTouchListener { + return object : OnSwipeTouchListener(context) { + override fun onSwipeLeft() { + super.onSwipeLeft() + findNavController().popBackStack() + } + + override fun onSwipeRight() { + super.onSwipeRight() + findNavController().popBackStack() + } + } + } + + private fun searchApp(query: String) { val searchQuery = "%$query%" @Suppress("DEPRECATION") @@ -202,9 +228,6 @@ class DrawFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, showSelectedApp(appInfo) } - override fun onBottomSheetDismissed() { - } - override fun onAppStateClicked(appInfo: AppInfo) { viewModel.update(appInfo) Log.d("Tag", "${appInfo.appName} : Draw Favorite: ${appInfo.favorite}") @@ -214,7 +237,7 @@ class DrawFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, if (!appInfo.lock) { appHelper.launchApp(context, appInfo) } else { - fingerHelper.startFingerprintAuth(appInfo,this) + fingerHelper.startFingerprintAuth(appInfo, this) } } diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/favorite/FavoriteFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/favorite/FavoriteFragment.kt index 90bae46..765bf47 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/favorite/FavoriteFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/favorite/FavoriteFragment.kt @@ -13,6 +13,7 @@ import androidx.annotation.RequiresApi import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.StaggeredGridLayoutManager @@ -24,6 +25,7 @@ import com.github.droidworksstudio.launcher.helper.FingerprintHelper import com.github.droidworksstudio.launcher.helper.PreferenceHelper import com.github.droidworksstudio.launcher.listener.OnItemClickedListener import com.github.droidworksstudio.launcher.listener.OnItemMoveListener +import com.github.droidworksstudio.launcher.listener.OnSwipeTouchListener import com.github.droidworksstudio.launcher.viewmodel.AppViewModel import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch @@ -75,6 +77,7 @@ class FavoriteFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener context = requireContext() setupRecyclerView() + observeSwipeTouchListener() observeFavorite() observeHomeAppOrder() } @@ -88,6 +91,20 @@ class FavoriteFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener } } + @SuppressLint("ClickableViewAccessibility") + private fun observeSwipeTouchListener() { + binding.touchArea.setOnTouchListener(getSwipeGestureListener(context)) + } + + private fun getSwipeGestureListener(context: Context): View.OnTouchListener { + return object : OnSwipeTouchListener(context) { + override fun onSwipeLeft() { + super.onSwipeLeft() + findNavController().popBackStack() + } + } + } + private fun handleDragAndDrop(oldPosition: Int, newPosition: Int) { val items = favoriteAdapter.currentList.toMutableList() Collections.swap(items, oldPosition, newPosition) @@ -106,7 +123,7 @@ class FavoriteFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener binding.favoriteAdapter.adapter = favoriteAdapter val listener: OnItemMoveListener.OnItemActionListener = favoriteAdapter - val simpleItemTouchCallback = object : ItemTouchHelper.Callback() { + val simpleItemTouchCallback = object : ItemTouchHelper.Callback() { override fun onChildDraw( canvas: Canvas, recyclerView: RecyclerView, diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/hidden/HiddenFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/hidden/HiddenFragment.kt index 29767a0..73b6b20 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/hidden/HiddenFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/hidden/HiddenFragment.kt @@ -12,6 +12,7 @@ import androidx.annotation.RequiresApi import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.github.droidworksstudio.launcher.R import com.github.droidworksstudio.launcher.data.entities.AppInfo @@ -19,6 +20,7 @@ import com.github.droidworksstudio.launcher.databinding.FragmentHiddenBinding import com.github.droidworksstudio.launcher.helper.AppHelper import com.github.droidworksstudio.launcher.helper.FingerprintHelper import com.github.droidworksstudio.launcher.listener.OnItemClickedListener +import com.github.droidworksstudio.launcher.listener.OnSwipeTouchListener import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.AppInfoBottomSheetFragment import com.github.droidworksstudio.launcher.viewmodel.AppViewModel import dagger.hilt.android.AndroidEntryPoint @@ -64,6 +66,7 @@ class HiddenFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, context = requireContext() setupRecyclerView() + observeSwipeTouchListener() observeHiddenApps() } @@ -76,6 +79,20 @@ class HiddenFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, } + @SuppressLint("ClickableViewAccessibility") + private fun observeSwipeTouchListener() { + binding.touchArea.setOnTouchListener(getSwipeGestureListener(context)) + } + + private fun getSwipeGestureListener(context: Context): View.OnTouchListener { + return object : OnSwipeTouchListener(context) { + override fun onSwipeLeft() { + super.onSwipeLeft() + findNavController().popBackStack() + } + } + } + private fun observeHiddenApps() { viewModel.compareInstalledAppInfo() @Suppress("DEPRECATION") @@ -90,7 +107,7 @@ class HiddenFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, if (!appInfo.lock) { appHelper.launchApp(context, appInfo) } else { - fingerHelper.startFingerprintAuth(appInfo,this) + fingerHelper.startFingerprintAuth(appInfo, this) } } diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt index db8b2d3..af89d4b 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeFragment.kt @@ -17,6 +17,7 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.github.droidworksstudio.launcher.R import com.github.droidworksstudio.launcher.accessibility.MyAccessibilityService @@ -90,10 +91,10 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, super.onViewCreated(view, savedInstanceState) initializeInjectedDependencies() + initSwipeTouchListener() setupBattery() setupRecyclerView() observeUserInterfaceSettings() - } @SuppressLint("ClickableViewAccessibility") @@ -108,8 +109,11 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, preferenceViewModel.setShowTime(preferenceHelper.showTime) preferenceViewModel.setShowDate(preferenceHelper.showDate) preferenceViewModel.setShowDailyWord(preferenceHelper.showDailyWord) + } - binding.mainView.setOnTouchListener(getSwipeGestureListener(context)) + @SuppressLint("ClickableViewAccessibility") + private fun initSwipeTouchListener() { + binding.touchArea.setOnTouchListener(getSwipeGestureListener(context)) binding.clock.setOnClickListener { appHelper.launchClock(context) } binding.date.setOnClickListener { appHelper.launchCalendar(context) } @@ -134,7 +138,8 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, private fun setupRecyclerView() { val marginTopInPixels = 128 - val params: ViewGroup.MarginLayoutParams = binding.appListAdapter.layoutParams as ViewGroup.MarginLayoutParams + val params: ViewGroup.MarginLayoutParams = + binding.appListAdapter.layoutParams as ViewGroup.MarginLayoutParams params.topMargin = marginTopInPixels binding.appListAdapter.apply { @@ -168,7 +173,8 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, preferenceViewModel.showTimeLiveData.observe(viewLifecycleOwner) { Log.d("Tag", "ShowTime Home: $it") - appHelper.updateUI(binding.clock, + appHelper.updateUI( + binding.clock, preferenceHelper.homeTimeAlignment, preferenceHelper.timeColor, preferenceHelper.timeTextSize, @@ -177,15 +183,17 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, } preferenceViewModel.showDateLiveData.observe(viewLifecycleOwner) { - appHelper.updateUI(binding.date, + appHelper.updateUI( + binding.date, preferenceHelper.homeDateAlignment, preferenceHelper.dateColor, preferenceHelper.dateTextSize, preferenceHelper.showDate ) } - preferenceViewModel.showBatteryLiveData.observe(viewLifecycleOwner){ - appHelper.updateUI(binding.battery, + preferenceViewModel.showBatteryLiveData.observe(viewLifecycleOwner) { + appHelper.updateUI( + binding.battery, Gravity.END, preferenceHelper.batteryColor, preferenceHelper.batteryTextSize, @@ -194,7 +202,8 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, } preferenceViewModel.showDailyWordLiveData.observe(viewLifecycleOwner) { - appHelper.updateUI(binding.word, + appHelper.updateUI( + binding.word, preferenceHelper.homeDailyWordAlignment, preferenceHelper.dailyWordColor, preferenceHelper.dailyWordTextSize, @@ -217,7 +226,10 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, } private fun observeBioAuthCheck(appInfo: AppInfo) { - if (!appInfo.lock) appHelper.launchApp(context, appInfo) else fingerHelper.startFingerprintAuth(appInfo, this) + if (!appInfo.lock) appHelper.launchApp( + context, + appInfo + ) else fingerHelper.startFingerprintAuth(appInfo, this) } private fun showSelectedApp(appInfo: AppInfo) { @@ -239,13 +251,34 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, @RequiresApi(Build.VERSION_CODES.P) override fun onDoubleClick() { super.onDoubleClick() - if(preferenceHelper.tapLockScreen) { + if (preferenceHelper.tapLockScreen) { MyAccessibilityService.runAccessibilityMode(context) MyAccessibilityService.instance()?.lockScreen() } else { return } } + + override fun onSwipeLeft() { + super.onSwipeLeft() + findNavController().navigate(R.id.action_HomeFragment_to_DrawFragment) + } + + override fun onSwipeRight() { + super.onSwipeRight() + findNavController().navigate(R.id.action_HomeFragment_to_FavoriteFragment) + + } + + override fun onSwipeDown() { + super.onSwipeDown() + if (preferenceHelper.swipeNotification) appHelper.expandNotificationDrawer(context) + } + + override fun onSwipeUp() { + super.onSwipeUp() + if (preferenceHelper.swipeSearch) appHelper.searchView(context) + } } } @@ -275,7 +308,7 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, } override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { - fingerHelper.sendToTargetActivity(SettingsActivity::class.java) + findNavController().navigate(R.id.action_HomeFragment_to_SettingsFragment) } override fun onAuthenticationFailed() { @@ -289,7 +322,7 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, if (preferenceHelper.settingsLock) { fingerHelper.startFingerprintSettingsAuth(SettingsActivity::class.java) } else { - fingerHelper.sendToTargetActivity(SettingsActivity::class.java) + findNavController().navigate(R.id.action_HomeFragment_to_SettingsFragment) } } } @@ -321,9 +354,6 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, Log.d("Tag", "Home LiveData Favorite : ${appInfo.favorite}") } - override fun onBottomSheetDismissed() { - } - override fun onAppStateClicked(appInfo: AppInfo) { viewModel.update(appInfo) Log.d("Tag", "${appInfo.appName} : Home Favorite: ${appInfo.favorite}") @@ -340,20 +370,15 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, override fun onAuthenticationError(errorCode: Int, errorMessage: CharSequence?) { when (errorCode) { - BiometricPrompt.ERROR_USER_CANCELED -> appHelper.showToast(requireContext(), getString(R.string.authentication_cancel)) - else -> appHelper.showToast(requireContext(), getString(R.string.authentication_error).format(errorMessage, errorCode)) + BiometricPrompt.ERROR_USER_CANCELED -> appHelper.showToast( + requireContext(), + getString(R.string.authentication_cancel) + ) + + else -> appHelper.showToast( + requireContext(), + getString(R.string.authentication_error).format(errorMessage, errorCode) + ) } } - - override fun onTopReached() { - if (preferenceHelper.swipeNotification) appHelper.expandNotificationDrawer(context) - } - - override fun onBottomReached() { - if (preferenceHelper.swipeSearch) appHelper.searchView(context) - } - - override fun onScroll(isTopReached: Boolean, isBottomReached: Boolean) { - Log.d("Tag", "onScroll") - } } \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/settings/SettingsFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/settings/SettingsFragment.kt index 6f85f53..142bf50 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/settings/SettingsFragment.kt @@ -202,16 +202,4 @@ class SettingsFragment : Fragment(), ScrollEventListener { preferenceViewModel.setLockSettings(isChecked) } } - - override fun onTopReached() { - requireActivity().onBackPressedDispatcher.onBackPressed() - } - - override fun onBottomReached() { - Log.d("Tag", "onBottomReached") - } - - override fun onScroll(isTopReached: Boolean, isBottomReached: Boolean) { - Log.d("Tag", "onScroll") - } } \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/viewpager/ViewPagerAdapter.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/viewpager/ViewPagerAdapter.kt deleted file mode 100644 index 8d36ccf..0000000 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/viewpager/ViewPagerAdapter.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.droidworksstudio.launcher.ui.viewpager - -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.lifecycle.Lifecycle -import androidx.viewpager2.adapter.FragmentStateAdapter -import com.github.droidworksstudio.launcher.ui.drawer.DrawFragment -import com.github.droidworksstudio.launcher.ui.home.HomeFragment -import com.github.droidworksstudio.launcher.ui.widgetmanager.WidgetManagerFragment - - -class ViewPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) : - FragmentStateAdapter(fragmentManager, lifecycle) { - - private val fragments: ArrayList = arrayListOf( - WidgetManagerFragment(), - HomeFragment(), - DrawFragment(), - ) - - override fun getItemCount(): Int { - return fragments.size - } - - override fun createFragment(position: Int): Fragment { - return fragments[position] - } -} diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/view/GestureNestedScrollView.kt b/app/src/main/java/com/github/droidworksstudio/launcher/view/GestureNestedScrollView.kt index 15c112e..554b507 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/view/GestureNestedScrollView.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/view/GestureNestedScrollView.kt @@ -1,24 +1,13 @@ package com.github.droidworksstudio.launcher.view -import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet -import android.view.MotionEvent -import android.view.ViewConfiguration import androidx.core.widget.NestedScrollView import androidx.recyclerview.widget.RecyclerView import com.github.droidworksstudio.launcher.listener.ScrollEventListener class GestureNestedScrollView(context: Context, attrs: AttributeSet) : NestedScrollView(context, attrs){ - private var startY: Float = 0f - private var startTouchY: Float = 0f - private var isTopReached: Boolean = false - private var isBottomReached: Boolean = false - private var isScrollingUp: Boolean = false - private var isPullingDown: Boolean = false - private var isPullingUp: Boolean = false - var scrollEventListener: ScrollEventListener? = null @@ -26,73 +15,12 @@ class GestureNestedScrollView(context: Context, attrs: AttributeSet) : NestedScr isNestedScrollingEnabled = true } - override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { - when (ev.action) { - MotionEvent.ACTION_DOWN -> { - startY = ev.y - startTouchY = ev.y - isScrollingUp = false - isPullingDown = false - isPullingUp = false - } - MotionEvent.ACTION_MOVE -> { - val deltaY = ev.y - startY - isTopReached = !canScrollVertically(-1) - isBottomReached = !canScrollVertically(1) - isScrollingUp = deltaY < 0 && isTopReached - - val distanceY = ev.y - startTouchY - val threshold = ViewConfiguration.get(context).scaledTouchSlop.toFloat() - isPullingDown = distanceY > threshold && isTopReached - isPullingUp = distanceY < -threshold && isBottomReached - } - } - return super.onInterceptTouchEvent(ev) - } - - @SuppressLint("ClickableViewAccessibility") - override fun onTouchEvent(ev: MotionEvent): Boolean { - when (ev.action) { - MotionEvent.ACTION_DOWN -> { - startY = ev.y - startTouchY = ev.y - isScrollingUp = false - isPullingDown = false - isPullingUp = false - } - MotionEvent.ACTION_MOVE -> { - val deltaY = ev.y - startY - isTopReached = !canScrollVertically(-1) - isBottomReached = !canScrollVertically(1) - isScrollingUp = deltaY < 0 && isTopReached - - val distanceY = ev.y - startTouchY - val threshold = 200 - isPullingDown = distanceY > threshold && isTopReached - isPullingUp = distanceY < -threshold && isBottomReached - } - MotionEvent.ACTION_UP -> { - startY = 0f - if (isPullingDown) { - scrollEventListener?.onTopReached() - return true - } else if (isPullingUp) { - scrollEventListener?.onBottomReached() - return true - } - } - } - return super.onTouchEvent(ev) - } - fun isTopReached(): Boolean { return !canScrollVertically(-1) -// return isTopReached && isScrollingUp } fun isBottomReached(): Boolean { return !canScrollVertically(1) -// return isBottomReached && !isScrollingUp } fun registerRecyclerView(recyclerView: RecyclerView, eventListener: ScrollEventListener) { diff --git a/app/src/main/res/anim/slide_in_bottom.xml b/app/src/main/res/anim/slide_in_bottom.xml new file mode 100644 index 0000000..b793a77 --- /dev/null +++ b/app/src/main/res/anim/slide_in_bottom.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/anim/slide_in_left.xml b/app/src/main/res/anim/slide_in_left.xml new file mode 100644 index 0000000..ab4e761 --- /dev/null +++ b/app/src/main/res/anim/slide_in_left.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/anim/slide_in_right.xml b/app/src/main/res/anim/slide_in_right.xml new file mode 100644 index 0000000..4433578 --- /dev/null +++ b/app/src/main/res/anim/slide_in_right.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/anim/slide_in_top.xml b/app/src/main/res/anim/slide_in_top.xml new file mode 100644 index 0000000..b3a3e57 --- /dev/null +++ b/app/src/main/res/anim/slide_in_top.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/anim/slide_out_bottom.xml b/app/src/main/res/anim/slide_out_bottom.xml new file mode 100644 index 0000000..f546ff4 --- /dev/null +++ b/app/src/main/res/anim/slide_out_bottom.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/anim/slide_out_left.xml b/app/src/main/res/anim/slide_out_left.xml new file mode 100644 index 0000000..5e53253 --- /dev/null +++ b/app/src/main/res/anim/slide_out_left.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/anim/slide_out_right.xml b/app/src/main/res/anim/slide_out_right.xml new file mode 100644 index 0000000..6e97111 --- /dev/null +++ b/app/src/main/res/anim/slide_out_right.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/anim/slide_out_top.xml b/app/src/main/res/anim/slide_out_top.xml new file mode 100644 index 0000000..42f7521 --- /dev/null +++ b/app/src/main/res/anim/slide_out_top.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index abf773a..5bd5d26 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,32 +1,19 @@ - + android:animateLayoutChanges="true"> - - - - - - - \ No newline at end of file + app:defaultNavHost="true" + app:navGraph="@navigation/nav_graph" + tools:ignore="FragmentTagUsage" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_draw.xml b/app/src/main/res/layout/fragment_draw.xml index f2c3129..7894f61 100644 --- a/app/src/main/res/layout/fragment_draw.xml +++ b/app/src/main/res/layout/fragment_draw.xml @@ -8,6 +8,7 @@ tools:context=".ui.drawer.DrawFragment"> + + - - + + + app:layout_constraintEnd_toEndOf="parent" + style="@style/TextDefaultStyle" /> - + + - - - - - - \ No newline at end of file + + diff --git a/app/src/main/res/layout/fragment_hidden.xml b/app/src/main/res/layout/fragment_hidden.xml index efc1afa..da33aa4 100644 --- a/app/src/main/res/layout/fragment_hidden.xml +++ b/app/src/main/res/layout/fragment_hidden.xml @@ -1,12 +1,11 @@ - + tools:context=".ui.hidden.HiddenFragment"> - + app:layout_constraintTop_toBottomOf="@id/topTextView" /> - - \ No newline at end of file + + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index f9c98da..df19ea4 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -92,4 +92,11 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 073df8e..eaeedc3 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -777,4 +777,11 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_widget_manager.xml b/app/src/main/res/layout/fragment_widget_manager.xml index e017890..840bed8 100644 --- a/app/src/main/res/layout/fragment_widget_manager.xml +++ b/app/src/main/res/layout/fragment_widget_manager.xml @@ -19,8 +19,15 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="16dp"/> + android:padding="16dp" /> + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 68c7e49..64f6cca 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -12,21 +12,57 @@ - + app:destination="@id/DrawFragment" + app:enterAnim="@anim/slide_in_right" + app:exitAnim="@anim/slide_out_left" + app:popEnterAnim="@anim/slide_in_left" + app:popExitAnim="@anim/slide_out_right" /> + app:destination="@id/SettingsFragment" + app:enterAnim="@anim/slide_in_top" + app:exitAnim="@anim/slide_out_top" + app:popEnterAnim="@anim/slide_in_bottom" + app:popExitAnim="@anim/slide_out_bottom" /> + app:destination="@id/FavoriteFragment" + app:enterAnim="@anim/slide_in_left" + app:exitAnim="@anim/slide_out_right" + app:popEnterAnim="@anim/slide_in_right" + app:popExitAnim="@anim/slide_out_left" /> + + + + + + - + tools:layout="@layout/fragment_draw" /> + + \ No newline at end of file diff --git a/app/src/main/res/navigation/settings_graph.xml b/app/src/main/res/navigation/settings_graph.xml index 4913c8d..dfcb206 100644 --- a/app/src/main/res/navigation/settings_graph.xml +++ b/app/src/main/res/navigation/settings_graph.xml @@ -9,30 +9,32 @@ android:name="com.github.droidworksstudio.launcher.ui.settings.SettingsFragment" android:label="@string/home_fragment_label" tools:layout="@layout/fragment_settings"> - - + app:destination="@id/FavoriteFragment" + app:enterAnim="@anim/slide_in_right" + app:exitAnim="@anim/slide_out_left" + app:popEnterAnim="@anim/slide_in_left" + app:popExitAnim="@anim/slide_out_right" /> + app:destination="@id/HiddenFragment" + app:enterAnim="@anim/slide_in_right" + app:exitAnim="@anim/slide_out_left" + app:popEnterAnim="@anim/slide_in_left" + app:popExitAnim="@anim/slide_out_right" /> - - + android:label="@string/favorite_fragment_label" + tools:layout="@layout/fragment_favorite" /> - - + android:label="@string/hidden_fragment_label" + tools:layout="@layout/fragment_favorite" /> \ 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 9dfbae2..9178015 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,567 +1,571 @@ - Settings - Set as default launcher - - Home Fragment - Draw Fragment + Settings + Set as default launcher + + Home Fragment + Draw Fragment + Favorite Fragment + Hidden Fragment + Settings Fragment + Widgets Fragment - %s%% - Search + %s%% + Search - Rename - Add to Home Screen - Order Home Apps - Remove from Home Screen - Hidden App - Remove Hidden App - Lock App - Unlock App - App Info - Uninstall App + Rename + Add to Home Screen + Order Home Apps + Remove from Home Screen + Hidden App + Remove Hidden App + Lock App + Unlock App + App Info + Uninstall App - Launcher Settings - %s Version: %s - Home + Launcher Settings + %s Version: %s + Home - Display - Behavior - Appearance - Date Style - Time Style - App Manage - Gestures - Backups - Others + Display + Behavior + Appearance + Date Style + Time Style + App Manage + Gestures + Backups + Others - Show Status Bar - Show Date - Show Time - Show Battery - Show Daily Word - Show App Icons - Auto Show Keyboard - Auto Open Last App - Lock Settings + Show Status Bar + Show Date + Show Time + Show Battery + Show Daily Word + Show App Icons + Auto Show Keyboard + Auto Open Last App + Lock Settings - Size - Color - Alignment - Padding - Custom Wallpaper + Size + Color + Alignment + Padding + Custom Wallpaper - Date Alignment - Time Alignment - Home App Alignment + Date Alignment + Time Alignment + Home App Alignment - Size - Color - Alignment - Padding - Date\u0020:\u0020 - Time\u0020:\u0020 - App\u0020:\u0020 - Word\u0020:\u0020 - Battery\u0020:\u0020 + Size + Color + Alignment + Padding + Date\u0020:\u0020 + Time\u0020:\u0020 + App\u0020:\u0020 + Word\u0020:\u0020 + Battery\u0020:\u0020 - Favorite Apps - Hidden Apps + Favorite Apps + Hidden Apps - Select Wallpaper - Double tap to lock - Swipe down expand notification - Swipe up open search view + Select Wallpaper + Double tap to lock + Swipe down expand notification + Swipe up open search view - Share - Feedback - Github + Share + Feedback + Github - Backup Preferences - Restore Preferences + Backup Preferences + Restore Preferences - Preferences backed up. - Preferences restored. Restarting. + Preferences backed up. + Preferences restored. Restarting. - Authentication - Log in using your biometric credentials. - Authentication Cancel - Authentication Succeeded - Authentication Failed - Authentication Error: %1$s(code %2$d) + Authentication + Log in using your biometric credentials. + Authentication Cancel + Authentication Succeeded + Authentication Failed + Authentication Error: %1$s(code %2$d) - Star - Center - End + Star + Center + End - Accessibility Settings - Enable - Disable + Accessibility Settings + Enable + Disable - Please turn on accessibility service to use double tap to lock feature in Easy Launcher.\n\nThis permission is used only to turn off your screen.Our accessibility service does not collect or share any data. - Easy launcher promises to use lock screen permission responsibly. Easy launcher does not collect or share any data. + Please turn on accessibility service to use double tap to lock feature in Easy Launcher.\n\nThis permission is used only to turn off your screen.Our accessibility service does not collect or share any data. + Easy launcher promises to use lock screen permission responsibly. Easy launcher does not collect or share any data. - - Stay resilient! - You got this! - Shine bright! - Create destiny. - Embrace journey. - Strength within. - Keep pushing! - You\'re amazing! - Trust, never give. - Limitless potential. - Progress over perfection. - Challenges = growth. - Worthy of success. - Chase your dreams. - Overcome all! - Determination wins. - Every step counts. - Stay positive! - Resilience rocks. - Strength in you. - Celebrate progress. - Hard work pays. - Trust, have faith. - Unique journey. - Eyes on prize. - Achieve anything! - Take bold steps. - Passion fuels you. - Focus on goals. - Persevere, win. - Self-belief key. - Deserving of good. - Reach for dreams. - Brave, strong, smart. - Positive attitude. - Trust the journey. - Unwavering determination. - Setbacks = comeback. - Turn dreams reality. - Commit to goals. - Strength, no bounds. - Head up, breakthrough. - Your potential shines. - Dreams within reach. - You\'re unstoppable! - Believe, achieve. - Push past limits. - Perseverance pays. - Stay fearless! - Rise above challenges. - Keep dreaming big. - Live with purpose. - Focus on the good. - Strength from within. - Believe in magic. - Smile, you\'ve got this. - Never lose hope. - Embrace every moment. - Be your own hero. - You\'re enough. - Conquer your fears. - Seize the day! - Love yourself first. - Stay positive, always. - You\'re a warrior. - Believe in yourself. - Embrace possibilities. - Live with passion. - Keep moving forward. - You\'re unstoppable! - Stay true to you. - Live boldly. - Keep the faith. - Strength in adversity. - Every day, grow. - Perseverance, victory. - Chase your passions. - Find joy in journey. - Take risks, thrive. - Stay strong, brave. - Trust inner wisdom. - Keep shining bright. - Dream, believe, achieve. - Be unstoppable. - Own your greatness. - Embrace the unknown. - Keep pushing forward. - Trust in yourself. - Spread kindness always. - Believe in your dreams. - Stay focused, determined. - Embrace your journey. - Keep your head up. - Never give up hope. - Strength from within. - Stay resilient, strong. - You\'re unstoppable! - Embrace the challenge. - Keep the fire burning. - Focus on what\'s possible. - Dream big, work hard. - Keep your eyes on prize. - Trust the process. - Stay true to yourself. - Believe, achieve, succeed. - Stay inspired always. - Be fearless in pursuit. - Stay grounded, rise. - Find strength in struggle. - Embrace every challenge. - Stay bold, stay bright. - You\'re capable of greatness. - Trust your journey. - Keep fighting, keep rising. - Believe in the impossible. - Stay resilient, never give. - You\'re stronger than you know. - Live with passion and purpose. - Find joy in every journey. - Dream, believe, achieve! - Stay positive, stay strong. - Every day is a new chance. - Embrace every opportunity. - Keep pushing past limits. - Trust your inner strength. - You\'re destined for greatness. - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - Stay fearless, stay strong. - You\'re destined for greatness! - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - Stay fearless, stay strong. - You\'re destined for greatness! - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - Stay fearless, stay strong. - You\'re destined for greatness! - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - Stay fearless, stay strong. - You\'re destined for greatness! - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - Stay fearless, stay strong. - You\'re destined for greatness! - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - Stay fearless, stay strong. - You\'re destined for greatness! - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - Stay fearless, stay strong. - You\'re destined for greatness! - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - Stay fearless, stay strong. - You\'re destined for greatness! - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - Stay fearless, stay strong. - You\'re destined for greatness! - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - Stay fearless, stay strong. - You\'re destined for greatness! - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - Stay fearless, stay strong. - You\'re destined for greatness! - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - Stay fearless, stay strong. - You\'re destined for greatness! - Believe in your dreams! - Stay determined, succeed. - Keep moving towards your goals. - Chase your dreams relentlessly. - Strength comes from within. - Stay focused on your goals. - You\'re capable of anything. - Stay fearless, stay strong. - Believe, achieve, succeed! - Trust in your journey. - Stay resilient, rise above. - You have the power within you. - Dream big, work hard, achieve. - Stay focused, stay strong. - You\'re stronger than you think! - Believe in yourself, always. - Stay determined, stay strong. - Embrace every opportunity. - You\'re capable of greatness! - Stay true to yourself. - Trust in your journey. - Keep pushing forward. - Dream, believe, achieve! - - - Left - Center - Right - + + Stay resilient! + You got this! + Shine bright! + Create destiny. + Embrace journey. + Strength within. + Keep pushing! + You\'re amazing! + Trust, never give. + Limitless potential. + Progress over perfection. + Challenges = growth. + Worthy of success. + Chase your dreams. + Overcome all! + Determination wins. + Every step counts. + Stay positive! + Resilience rocks. + Strength in you. + Celebrate progress. + Hard work pays. + Trust, have faith. + Unique journey. + Eyes on prize. + Achieve anything! + Take bold steps. + Passion fuels you. + Focus on goals. + Persevere, win. + Self-belief key. + Deserving of good. + Reach for dreams. + Brave, strong, smart. + Positive attitude. + Trust the journey. + Unwavering determination. + Setbacks = comeback. + Turn dreams reality. + Commit to goals. + Strength, no bounds. + Head up, breakthrough. + Your potential shines. + Dreams within reach. + You\'re unstoppable! + Believe, achieve. + Push past limits. + Perseverance pays. + Stay fearless! + Rise above challenges. + Keep dreaming big. + Live with purpose. + Focus on the good. + Strength from within. + Believe in magic. + Smile, you\'ve got this. + Never lose hope. + Embrace every moment. + Be your own hero. + You\'re enough. + Conquer your fears. + Seize the day! + Love yourself first. + Stay positive, always. + You\'re a warrior. + Believe in yourself. + Embrace possibilities. + Live with passion. + Keep moving forward. + You\'re unstoppable! + Stay true to you. + Live boldly. + Keep the faith. + Strength in adversity. + Every day, grow. + Perseverance, victory. + Chase your passions. + Find joy in journey. + Take risks, thrive. + Stay strong, brave. + Trust inner wisdom. + Keep shining bright. + Dream, believe, achieve. + Be unstoppable. + Own your greatness. + Embrace the unknown. + Keep pushing forward. + Trust in yourself. + Spread kindness always. + Believe in your dreams. + Stay focused, determined. + Embrace your journey. + Keep your head up. + Never give up hope. + Strength from within. + Stay resilient, strong. + You\'re unstoppable! + Embrace the challenge. + Keep the fire burning. + Focus on what\'s possible. + Dream big, work hard. + Keep your eyes on prize. + Trust the process. + Stay true to yourself. + Believe, achieve, succeed. + Stay inspired always. + Be fearless in pursuit. + Stay grounded, rise. + Find strength in struggle. + Embrace every challenge. + Stay bold, stay bright. + You\'re capable of greatness. + Trust your journey. + Keep fighting, keep rising. + Believe in the impossible. + Stay resilient, never give. + You\'re stronger than you know. + Live with passion and purpose. + Find joy in every journey. + Dream, believe, achieve! + Stay positive, stay strong. + Every day is a new chance. + Embrace every opportunity. + Keep pushing past limits. + Trust your inner strength. + You\'re destined for greatness. + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + Stay fearless, stay strong. + You\'re destined for greatness! + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + Stay fearless, stay strong. + You\'re destined for greatness! + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + Stay fearless, stay strong. + You\'re destined for greatness! + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + Stay fearless, stay strong. + You\'re destined for greatness! + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + Stay fearless, stay strong. + You\'re destined for greatness! + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + Stay fearless, stay strong. + You\'re destined for greatness! + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + Stay fearless, stay strong. + You\'re destined for greatness! + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + Stay fearless, stay strong. + You\'re destined for greatness! + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + Stay fearless, stay strong. + You\'re destined for greatness! + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + Stay fearless, stay strong. + You\'re destined for greatness! + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + Stay fearless, stay strong. + You\'re destined for greatness! + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + Stay fearless, stay strong. + You\'re destined for greatness! + Believe in your dreams! + Stay determined, succeed. + Keep moving towards your goals. + Chase your dreams relentlessly. + Strength comes from within. + Stay focused on your goals. + You\'re capable of anything. + Stay fearless, stay strong. + Believe, achieve, succeed! + Trust in your journey. + Stay resilient, rise above. + You have the power within you. + Dream big, work hard, achieve. + Stay focused, stay strong. + You\'re stronger than you think! + Believe in yourself, always. + Stay determined, stay strong. + Embrace every opportunity. + You\'re capable of greatness! + Stay true to yourself. + Trust in your journey. + Keep pushing forward. + Dream, believe, achieve! + + + Left + Center + Right + - Search Engine - Google - Yahoo - DuckDuckGo - Bing - Brave - SwissCows + Search Engine + Google + Yahoo + DuckDuckGo + Bing + Brave + SwissCows \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2275fe1..3aac47b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,6 @@ lifecycle = "2.8.0" dagger = "2.51.1" work = "2.9.0" recyclerview = "1.3.2" -viewpager2 = "1.1.0" preference = "1.2.1" room = "2.6.1" biometric = "1.2.0-alpha05" @@ -31,7 +30,6 @@ lifecycle-process = { group = "androidx.lifecycle", name = "lifecycle-process", lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" } work-runtime-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "work" } recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" } -viewpager2 = { group = "androidx.viewpager2", name = "viewpager2", version.ref = "viewpager2" } preference = { group = "androidx.preference", name = "preference-ktx", version.ref = "preference" } biometric-ktx = { group = "androidx.biometric", name = "biometric-ktx", version.ref = "biometric" } color-chooser = { group = "net.mm2d.color-chooser", name = "color-chooser", version.ref = "color-chooser" }