From db922c3b4a742eec97e8336a32374e7b173cfac0 Mon Sep 17 00:00:00 2001 From: HeCodes2Much Date: Wed, 8 May 2024 16:17:54 +0100 Subject: [PATCH] Added a few extra features --- README.md | 20 +- app/build.gradle.kts | 8 +- app/src/main/AndroidManifest.xml | 7 +- .../droidworksstudio/launcher/Constants.kt | 6 +- .../launcher/helper/AppHelper.kt | 78 ++- .../launcher/helper/PreferenceHelper.kt | 15 +- .../launcher/ui/activities/MainActivity.kt | 2 + .../AlignmentBottomSheetDialogFragment.kt | 24 + .../ColorBottomSheetDialogFragment.kt | 14 +- .../PaddingBottomSheetDialogFragment.kt | 75 +++ .../TextBottomSheetDialogFragment.kt | 4 + .../launcher/ui/home/HomeFragment.kt | 27 +- .../launcher/ui/home/HomeViewHolder.kt | 11 +- .../launcher/ui/settings/SettingsFragment.kt | 17 +- .../launcher/viewmodel/PreferenceViewModel.kt | 18 + .../bottomsheetdialog_alignment_settings.xml | 52 +- .../bottomsheetdialog_color_settings.xml | 62 ++- .../bottomsheetdialog_padding_settings.xml | 66 +++ .../bottomsheetdialog_text_settings.xml | 78 ++- app/src/main/res/layout/fragment_draw.xml | 4 +- app/src/main/res/layout/fragment_home.xml | 11 +- app/src/main/res/layout/fragment_settings.xml | 132 ++++- app/src/main/res/layout/item_home.xml | 11 +- app/src/main/res/values/strings.xml | 461 +++++++++++++++++- 24 files changed, 1082 insertions(+), 121 deletions(-) create mode 100644 app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/PaddingBottomSheetDialogFragment.kt create mode 100644 app/src/main/res/layout/bottomsheetdialog_padding_settings.xml diff --git a/README.md b/README.md index 0309ef8a..1ea7d5f6 100644 --- a/README.md +++ b/README.md @@ -22,21 +22,11 @@ ------------ **Easy Launcher - the minimalist productivity launcher for focus, productivity, keep your focus on what really counts.** ------------ -[GitHub Releases](https://github.com/DroidWorksStudio/EasyLauncher/releases) -[F-Droid Releases](https://f-droid.org/en/packages/com.github.droidworksstuido.easylauncher/) -[Playstore](https://play.google.com/store/apps/details?id=com.github.droidworksstyido.easulauncher) -[Licenses](https://www.gnu.org/licenses/gpl-3.0) -[Download from GitHub](https://github.com/DroidWorksStudio/EasyLauncher/releases) +[GitHub Releases](https://github.com/DroidWorksStudio/EasyLauncher/releases) +[F-Droid Releases](https://f-droid.org/en/packages/com.github.droidworksstuido.easylauncher/) +[Playstore](https://play.google.com/store/apps/details?id=com.github.droidworksstyido.easulauncher) +[Licenses](https://www.gnu.org/licenses/gpl-3.0) +[Download from GitHub](https://github.com/DroidWorksStudio/EasyLauncher/releases) **Features** ------------ diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e0ba9c5a..c6ef06b5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -29,14 +29,14 @@ android { isDebuggable = true applicationIdSuffix = ".debug" proguardFiles (getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - resValue("string", "app_name", "EasyLauncher Debug") + resValue("string", "app_name", "Easy Launcher (Debug)") } getByName("release") { - isMinifyEnabled = false - isShrinkResources = false + isMinifyEnabled = true + isShrinkResources = true proguardFiles (getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") - resValue("string", "app_name", "EasyLauncher") + resValue("string", "app_name", "Easy Launcher") } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0af068a3..3532599e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,8 +4,7 @@ - + - @@ -30,8 +28,7 @@ android:icon="@drawable/app_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/Theme.Launcher" - tools:targetApi="31"> + android:theme="@style/Theme.Launcher"> diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/Constants.kt b/app/src/main/java/com/github/droidworksstudio/launcher/Constants.kt index 7ce4c840..92702d4b 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/Constants.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/Constants.kt @@ -3,7 +3,7 @@ package com.github.droidworksstudio.launcher object Constants { const val PACKAGE_NAME = "com.github.droidworksstudio.launcher" - const val PREFS_FILENAME = "droidworksstudioLauncher.pref" + const val PREFS_FILENAME = "EasyLauncher.pref" const val FIRST_LAUNCH = "FIRST_LAUNCH" const val SHOW_DATE = "SHOW_DATE" const val SHOW_TIME = "SHOW_TIME" @@ -18,9 +18,13 @@ object Constants { const val DAILY_WORD_COLOR = "DAILY_WORD_COLOR" const val APP_COLOR = "APP_COLOR" + const val BATTERY_TEXT_SIZE = "BATTERY_TEXT_SIZE" const val DATE_TEXT_SIZE = "DATE_TEXT_SIZE" const val TIME_TEXT_SIZE = "TIME_TEXT_SIZE" const val APP_TEXT_SIZE = "APP_TEXT_SIZE" + const val DAILY_WORD_TEXT_SIZE = "DAILY_WORD_TEXT_SIZE" + + const val APP_TEXT_PADDING = "APP_TEXT_PADDING" const val SHOW_APP_ICON = "SHOW_APP_ICON" 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 66725603..2c30e308 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 @@ -2,11 +2,13 @@ package com.github.droidworksstudio.launcher.helper import android.annotation.SuppressLint import android.app.SearchManager +import android.content.ActivityNotFoundException import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.content.res.Configuration +import android.content.res.Resources import android.net.Uri import android.os.Build import android.provider.AlarmClock @@ -27,6 +29,8 @@ 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.ui.activities.FakeHomeActivity +import java.util.Calendar +import java.util.Date import javax.inject.Inject class AppHelper @Inject constructor() { @@ -92,11 +96,11 @@ class AppHelper @Inject constructor() { fun dayNightMod(context: Context, view: View) { when (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { Configuration.UI_MODE_NIGHT_YES -> { - view.setBackgroundColor(context.resources.getColor(R.color.whiteTrans25)) + view.setBackgroundColor(context.resources.getColor(R.color.blackTrans50, context.theme)) } Configuration.UI_MODE_NIGHT_NO -> { - view.setBackgroundColor(context.resources.getColor(R.color.blackTrans50)) + view.setBackgroundColor(context.resources.getColor(R.color.whiteTrans50, context.theme)) } } } @@ -132,21 +136,53 @@ class AppHelper @Inject constructor() { } fun launchCalendar(context: Context) { - val intent = Intent(Intent.ACTION_VIEW) - intent.data = CalendarContract.CONTENT_URI try { - context.startActivity(intent) + val cal: Calendar = Calendar.getInstance() + cal.time = Date() + val time = cal.time.time + val builder: Uri.Builder = CalendarContract.CONTENT_URI.buildUpon() + builder.appendPath("time") + builder.appendPath(time.toString()) + context.startActivity(Intent(Intent.ACTION_VIEW, builder.build())) } catch (e: Exception) { - val pickerIntent = Intent(Intent.ACTION_MAIN) - pickerIntent.addCategory(Intent.CATEGORY_APP_CALENDAR) try { - context.startActivity(pickerIntent) + val intent = Intent(Intent.ACTION_MAIN) + intent.addCategory(Intent.CATEGORY_APP_CALENDAR) + context.startActivity(intent) } catch (e: Exception) { - e.printStackTrace() + Log.d("openCalendar", e.toString()) } } } + fun openDigitalWellbeing(context: Context) { + try { + val packageName = "com.google.android.apps.wellbeing" + val className = "com.google.android.apps.wellbeing.settings.TopLevelSettingsActivity" + + val intent = Intent() + intent.component = ComponentName(packageName, className) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + context.startActivity(intent) + } catch (e: ActivityNotFoundException) { + // Digital Wellbeing app is not installed or cannot be opened + // Handle this case as needed + showToast(context,"Digital Wellbeing is not available on this device.") + } + } + + fun openBatteryManager(context: Context) { + try { + val intent = Intent(Intent.ACTION_POWER_USAGE_SUMMARY) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + context.startActivity(intent) + } catch (e: ActivityNotFoundException) { + // Battery manager settings cannot be opened + // Handle this case as needed + showToast(context, "Battery manager settings are not available on this device.") + } + } + fun unInstallApp(context: Context, appInfo: AppInfo) { val intent = Intent(Intent.ACTION_DELETE) intent.data = Uri.parse("package:${appInfo.packageName}") @@ -215,6 +251,14 @@ class AppHelper @Inject constructor() { } } + fun View.showSoftKeyboard() { + if (this.requestFocus()) { + val inputMethodManager: InputMethodManager = + context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) + } + } + fun hideKeyboard(context: Context, view: View) { val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(view.windowToken, 0) @@ -224,13 +268,21 @@ class AppHelper @Inject constructor() { val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(this.windowToken, 0) } + + fun wordOfTheDay(resources: Resources): String { + val dailyWordsArray = resources.getStringArray(R.array.settings_appearance_daily_word_default) + val dayOfYear = Calendar.getInstance().get(Calendar.DAY_OF_YEAR) + val wordIndex = (dayOfYear - 1) % dailyWordsArray.size // Subtracting 1 to align with array indexing + return dailyWordsArray[wordIndex] + } + fun enableAppAsAccessibilityService(context: Context, accessibilityState: Boolean) { val myAccessibilityService = MyAccessibilityService.instance() val state: String = if (myAccessibilityService != null) { context.getString(R.string.accessibility_settings_disable) - }else{ + } else { context.getString(R.string.accessibility_settings_enable) } @@ -242,8 +294,10 @@ class AppHelper @Inject constructor() { val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS) context.startActivity(intent) } - .setNegativeButton(android.R.string.cancel) { dialog, _ -> dialog.dismiss() } - .show() + builder.setNegativeButton(android.R.string.cancel) { dialog, _ -> + dialog.dismiss() + } + builder.show() } } \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/helper/PreferenceHelper.kt b/app/src/main/java/com/github/droidworksstudio/launcher/helper/PreferenceHelper.kt index 881acf76..13be789f 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/helper/PreferenceHelper.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/helper/PreferenceHelper.kt @@ -31,7 +31,7 @@ class PreferenceHelper @Inject constructor(@ApplicationContext context: Context) set(value) = prefs.edit().putBoolean(Constants.SHOW_BATTERY, value).apply() var showDailyWord: Boolean - get() = prefs.getBoolean(Constants.SHOW_DAILY_WORD, true) + get() = prefs.getBoolean(Constants.SHOW_DAILY_WORD, false) set(value) = prefs.edit().putBoolean(Constants.SHOW_DAILY_WORD, value).apply() var dateColor: Int @@ -45,6 +45,7 @@ class PreferenceHelper @Inject constructor(@ApplicationContext context: Context) var batteryColor: Int get() = prefs.getInt(Constants.BATTERY_COLOR, 0xFFFFFFFF.toInt()) set(value) = prefs.edit().putInt(Constants.BATTERY_COLOR, value).apply() + var dailyWordColor: Int get() = prefs.getInt(Constants.DAILY_WORD_COLOR, 0xFFFFFFFF.toInt()) set(value) = prefs.edit().putInt(Constants.DAILY_WORD_COLOR, value).apply() @@ -69,6 +70,10 @@ class PreferenceHelper @Inject constructor(@ApplicationContext context: Context) get() = prefs.getInt(Constants.HOME_APP_ALIGNMENT, Gravity.START) set(value) = prefs.edit().putInt(Constants.HOME_APP_ALIGNMENT, value).apply() + var homeAppPadding: Float + get() = prefs.getFloat(Constants.APP_TEXT_PADDING, 10f) + set(value) = prefs.edit().putFloat(Constants.APP_TEXT_PADDING, value).apply() + var homeDateAlignment: Int get() = prefs.getInt(Constants.HOME_DATE_ALIGNMENT, Gravity.START) set(value) = prefs.edit().putInt(Constants.HOME_DATE_ALIGNMENT, value).apply() @@ -81,6 +86,10 @@ class PreferenceHelper @Inject constructor(@ApplicationContext context: Context) get() = prefs.getInt(Constants.HOME_DAILY_WORD_ALIGNMENT, Gravity.START) set(value) = prefs.edit().putInt(Constants.HOME_DAILY_WORD_ALIGNMENT,value).apply() + var batteryTextSize: Float + get() = prefs.getFloat(Constants.BATTERY_TEXT_SIZE, 12f) + set(value) = prefs.edit().putFloat(Constants.BATTERY_TEXT_SIZE, value).apply() + var dateTextSize: Float get() = prefs.getFloat(Constants.DATE_TEXT_SIZE, 32f) set(value) = prefs.edit().putFloat(Constants.DATE_TEXT_SIZE, value).apply() @@ -93,6 +102,10 @@ class PreferenceHelper @Inject constructor(@ApplicationContext context: Context) get() = prefs.getFloat(Constants.APP_TEXT_SIZE, 24f) set(value) = prefs.edit().putFloat(Constants.APP_TEXT_SIZE, value).apply() + var dailyWordTextSize: Float + get() = prefs.getFloat(Constants.DAILY_WORD_TEXT_SIZE, 18f) + set(value) = prefs.edit().putFloat(Constants.DAILY_WORD_TEXT_SIZE, value).apply() + var tapLockScreen: Boolean get() = prefs.getBoolean(Constants.DOUBLE_TAP_LOCK, false) set(value) = prefs.edit().putBoolean(Constants.DOUBLE_TAP_LOCK, value).apply() 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 2ca3cca3..97fba24f 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 @@ -10,6 +10,7 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.fragment.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.navigateUp import com.github.droidworksstudio.launcher.R @@ -145,6 +146,7 @@ class MainActivity : AppCompatActivity() { } private fun backToHomeScreen() { + navController = findNavController(R.id.nav_host_fragment_content_main) if (navController.currentDestination?.id != R.id.HomeFragment) navController.popBackStack(R.id.HomeFragment, false) } diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/AlignmentBottomSheetDialogFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/AlignmentBottomSheetDialogFragment.kt index 3d99fe73..2c7af197 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/AlignmentBottomSheetDialogFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/AlignmentBottomSheetDialogFragment.kt @@ -70,6 +70,10 @@ class AlignmentBottomSheetDialogFragment(context: Context) : BottomSheetDialogFr binding.selectAppTextSize.apply { text = appHelper.gravityToString(preferenceHelper.homeAppAlignment) } + + binding.selectWordTextSize.apply { + text = appHelper.gravityToString(preferenceHelper.homeDailyWordAlignment) + } } private fun observeClickListener(){ @@ -87,6 +91,11 @@ class AlignmentBottomSheetDialogFragment(context: Context) : BottomSheetDialogFr selectedAlignment = REQUEST_KEY_APP_ALIGNMENT showListDialog(selectedAlignment) } + + binding.bottomAlignmentWordView.setOnClickListener { + selectedAlignment = REQUEST_KEY_WORD_ALIGNMENT + showListDialog(selectedAlignment) + } } @@ -127,6 +136,15 @@ class AlignmentBottomSheetDialogFragment(context: Context) : BottomSheetDialogFr binding.selectDateTextSize ) } + + REQUEST_KEY_WORD_ALIGNMENT -> { + setAlignment( + selectedAlignment, + selectedItem, + gravity, + binding.selectWordTextSize + ) + } } } dialog.show() @@ -157,6 +175,11 @@ class AlignmentBottomSheetDialogFragment(context: Context) : BottomSheetDialogFr alignmentGetter = { preferenceHelper.homeDateAlignment } } + REQUEST_KEY_WORD_ALIGNMENT -> { + alignmentPreference = { preferenceViewModel.setHomeDailyWordAppAlignment(it) } + alignmentGetter = { preferenceHelper.homeDailyWordAlignment } + } + else -> return } @@ -169,5 +192,6 @@ class AlignmentBottomSheetDialogFragment(context: Context) : BottomSheetDialogFr private const val REQUEST_KEY_DATE_ALIGNMENT = "REQUEST_KEY_DATE_ALIGNMENT" private const val REQUEST_KEY_TIME_ALIGNMENT = "REQUEST_KEY_TIME_ALIGNMENT" private const val REQUEST_KEY_APP_ALIGNMENT = "REQUEST_KEY_APP_ALIGNMENT" + private const val REQUEST_KEY_WORD_ALIGNMENT = "REQUEST_KEY_WORD_ALIGNMENT" } } \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/ColorBottomSheetDialogFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/ColorBottomSheetDialogFragment.kt index 038b31e8..3bdcf670 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/ColorBottomSheetDialogFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/ColorBottomSheetDialogFragment.kt @@ -75,6 +75,11 @@ class ColorBottomSheetDialogFragment(context: Context) : BottomSheetDialogFragme text = bottomDialogHelper.getColorText(preferenceHelper.batteryColor) setTextColor(preferenceHelper.batteryColor) } + + binding.selectWordTextColor.apply { + text = bottomDialogHelper.getColorText(preferenceHelper.dailyWordColor) + setTextColor(preferenceHelper.dailyWordColor) + } } @@ -110,6 +115,14 @@ class ColorBottomSheetDialogFragment(context: Context) : BottomSheetDialogFragme preferenceHelper.batteryColor ) } + + binding.bottomColorWordView.setOnClickListener { + showColorPickerDialog( + binding.selectWordTextColor, + REQUEST_KEY_DAILY_WORD_COLOR, + preferenceHelper.dailyWordColor + ) + } } private fun showColorPickerDialog(view: View, requestCode: String, color: Int) { @@ -123,7 +136,6 @@ class ColorBottomSheetDialogFragment(context: Context) : BottomSheetDialogFragme ColorChooserDialog.registerListener(this, requestCode, { pickedColor -> this.color = pickedColor (view as TextView).apply { - //text = getColorText(pickedColor) text = bottomDialogHelper.getColorText(pickedColor) setTextColor(pickedColor) } diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/PaddingBottomSheetDialogFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/PaddingBottomSheetDialogFragment.kt new file mode 100644 index 00000000..a85ef4ae --- /dev/null +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/PaddingBottomSheetDialogFragment.kt @@ -0,0 +1,75 @@ +package com.github.droidworksstudio.launcher.ui.bottomsheetdialog + +import android.content.Context +import android.content.DialogInterface +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.RequiresApi +import androidx.fragment.app.viewModels +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.github.droidworksstudio.launcher.databinding.BottomsheetdialogPaddingSettingsBinding +import com.github.droidworksstudio.launcher.helper.BottomDialogHelper +import com.github.droidworksstudio.launcher.helper.PreferenceHelper +import com.github.droidworksstudio.launcher.viewmodel.PreferenceViewModel +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject +@AndroidEntryPoint +class PaddingBottomSheetDialogFragment(context: Context) : BottomSheetDialogFragment() { + + private var _binding: BottomsheetdialogPaddingSettingsBinding? = null + private val binding get() = _binding!! + + @Inject + lateinit var preferenceHelper: PreferenceHelper + + @Inject + lateinit var bottomDialogHelper: BottomDialogHelper + + private val preferenceViewModel: PreferenceViewModel by viewModels() + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = BottomsheetdialogPaddingSettingsBinding.inflate(inflater, container, false) + return binding.root + } + + @RequiresApi(Build.VERSION_CODES.O) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + initView() + } + + private fun initView(){ + bottomDialogHelper.setupDialogStyle(dialog) + + binding.selectAppPaddingSize.setText(preferenceHelper.homeAppPadding.toString()) + } + + private fun observeValueChange(){ + val appValue = binding.selectAppPaddingSize.text.toString() + + val appFloatValue = parseFloatValue(appValue, preferenceHelper.homeAppPadding) + dismiss() + + preferenceViewModel.setAppPaddingSize(appFloatValue) + } + + private fun parseFloatValue(text: String, defaultValue: Float): Float { + if (text.isEmpty() || text == "0") { + return defaultValue + } + return text.toFloat() + } + + override fun onDismiss(dialog: DialogInterface) { + super.onDismiss(dialog) + + observeValueChange() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/TextBottomSheetDialogFragment.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/TextBottomSheetDialogFragment.kt index 1e481afe..1f542b01 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/TextBottomSheetDialogFragment.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/bottomsheetdialog/TextBottomSheetDialogFragment.kt @@ -51,21 +51,25 @@ class TextBottomSheetDialogFragment(context: Context) : BottomSheetDialogFragmen binding.selectDateTextSize.setText(preferenceHelper.dateTextSize.toString()) binding.selectTimeTextSize.setText(preferenceHelper.timeTextSize.toString()) binding.selectAppTextSize.setText(preferenceHelper.appTextSize.toString()) + binding.selectBatteryTextSize.setText(preferenceHelper.batteryTextSize.toString()) } private fun observeValueChange(){ val dateValue = binding.selectDateTextSize.text.toString() val timeValue = binding.selectTimeTextSize.text.toString() val appValue = binding.selectAppTextSize.text.toString() + val batteryValue = binding.selectBatteryTextSize.text.toString() val dateFloatValue = parseFloatValue(dateValue, preferenceHelper.dateTextSize) val timeFloatValue = parseFloatValue(timeValue, preferenceHelper.timeTextSize) val appFloatValue = parseFloatValue(appValue, preferenceHelper.appTextSize) + val batteryFloatValue = parseFloatValue(batteryValue, preferenceHelper.batteryTextSize) dismiss() preferenceViewModel.setDateTextSize(dateFloatValue) preferenceViewModel.setTimeTextSize(timeFloatValue) preferenceViewModel.setAppTextSize(appFloatValue) + preferenceViewModel.setBatteryTextSize(batteryFloatValue) } private fun parseFloatValue(text: String, defaultValue: Float): Float { 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 08849bd2..079a80a7 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 @@ -107,6 +107,7 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, binding.clock.setOnClickListener { appHelper.launchClock(context) } binding.date.setOnClickListener { appHelper.launchCalendar(context) } + binding.battery.setOnClickListener { appHelper.openBatteryManager(context) } } private fun setupBattery() { @@ -129,13 +130,12 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, val marginTopInPixels = 128 val params: ViewGroup.MarginLayoutParams = binding.appListAdapter.layoutParams as ViewGroup.MarginLayoutParams params.topMargin = marginTopInPixels - binding.appListAdapter.layoutParams = params binding.appListAdapter.apply { adapter = homeAdapter + layoutParams = params setHasFixedSize(false) layoutManager = StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL) - //itemAnimator = false isNestedScrollingEnabled = false } } @@ -143,6 +143,7 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, private fun observeFavoriteAppList() { viewModel.compareInstalledAppInfo() + @Suppress("DEPRECATION") viewLifecycleOwner.lifecycleScope.launchWhenCreated { viewModel.favoriteApps.flowOn(Dispatchers.Main).collect { homeAdapter.submitList(it) @@ -176,17 +177,21 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, ) } preferenceViewModel.showBatteryLiveData.observe(viewLifecycleOwner){ - //binding.battery.setTextColor(preferenceHelper.batteryColor) - appHelper.updateUI(binding.battery, Gravity.END, + appHelper.updateUI(binding.battery, + Gravity.END, preferenceHelper.batteryColor, - preferenceHelper.timeTextSize, + preferenceHelper.batteryTextSize, preferenceHelper.showBattery ) } preferenceViewModel.showDailyWordLiveData.observe(viewLifecycleOwner) { -// updateViewVisibility(binding.word, showDailyWord) -// appHelper.updateUI(binding.word, preferenceHelper.homeDailyWordAlignment, preferenceHelper.dailyWordColor, preferenceHelper.showDailyWord) + appHelper.updateUI(binding.word, + preferenceHelper.homeDailyWordAlignment, + preferenceHelper.dailyWordColor, + preferenceHelper.dailyWordTextSize, + preferenceHelper.showDailyWord + ) } val is24HourFormat = DateFormat.is24HourFormat(requireContext()) val localLocale = Locale.getDefault() @@ -199,6 +204,8 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, val datePattern = DateFormat.getBestDateTimePattern(localLocale, "eeeddMMM") binding.date.format12Hour = datePattern binding.date.format24Hour = datePattern + + binding.word.text = appHelper.wordOfTheDay(resources) } private fun observeBioAuthCheck(appInfo: AppInfo) { @@ -225,7 +232,11 @@ class HomeFragment : Fragment(), OnItemClickedListener.OnAppsClickedListener, @RequiresApi(Build.VERSION_CODES.P) override fun onDoubleClick() { super.onDoubleClick() - if(preferenceHelper.tapLockScreen) { MyAccessibilityService.instance()?.lockScreen() } else { return } + if(preferenceHelper.tapLockScreen) { + MyAccessibilityService.instance()?.lockScreen() + } else { + return + } } } } diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeViewHolder.kt b/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeViewHolder.kt index 8f4fd2f6..e52d4689 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeViewHolder.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/ui/home/HomeViewHolder.kt @@ -1,5 +1,6 @@ package com.github.droidworksstudio.launcher.ui.home +import android.content.Context import android.util.Log import android.view.View import androidx.appcompat.widget.LinearLayoutCompat @@ -15,16 +16,17 @@ class HomeViewHolder @Inject constructor( private val binding: ItemHomeBinding, private val onAppClickedListener: OnItemClickedListener.OnAppsClickedListener, private val onAppLongClickedListener: OnItemClickedListener.OnAppLongClickedListener, - private val preferenceHelper: PreferenceHelper + private val preferenceHelper: PreferenceHelper, ) : RecyclerView.ViewHolder(binding.root) { fun bind(appInfo: AppInfo) { - binding.apply { val layoutParams = LinearLayoutCompat.LayoutParams( LinearLayoutCompat.LayoutParams.WRAP_CONTENT, LinearLayoutCompat.LayoutParams.WRAP_CONTENT ).apply { gravity = preferenceHelper.homeAppAlignment + topMargin = preferenceHelper.homeAppPadding.toInt() + bottomMargin = preferenceHelper.homeAppPadding.toInt() } appHomeName.layoutParams = layoutParams @@ -32,6 +34,11 @@ class HomeViewHolder @Inject constructor( appHomeName.setTextColor(preferenceHelper.appColor) appHomeName.textSize = preferenceHelper.appTextSize Log.d("Tag", "Home Adapter Color: ${preferenceHelper.appColor}") + + val appIcon = binding.root.context.packageManager.getApplicationIcon(appInfo.packageName) + appHomeIcon.setImageDrawable(appIcon) + appHomeIcon.layoutParams.width = preferenceHelper.appTextSize.toInt() * 3 + appHomeIcon.layoutParams.height = preferenceHelper.appTextSize.toInt() * 3 appHomeIcon.visibility = View.GONE } 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 799a3345..fa5af15f 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 @@ -1,5 +1,6 @@ package com.github.droidworksstudio.launcher.ui.settings +import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle import android.util.Log @@ -17,6 +18,7 @@ import com.github.droidworksstudio.launcher.helper.PreferenceHelper import com.github.droidworksstudio.launcher.listener.ScrollEventListener import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.AlignmentBottomSheetDialogFragment import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.ColorBottomSheetDialogFragment +import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.PaddingBottomSheetDialogFragment import com.github.droidworksstudio.launcher.ui.bottomsheetdialog.TextBottomSheetDialogFragment import com.github.droidworksstudio.launcher.viewmodel.PreferenceViewModel import dagger.hilt.android.AndroidEntryPoint @@ -52,6 +54,7 @@ class SettingsFragment : Fragment(), ScrollEventListener { // Called after the fragment view is created override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + navController = findNavController() // Set according to the system theme mode appHelper.dayNightMod(requireContext(), binding.nestScrollView) super.onViewCreated(view, savedInstanceState) @@ -60,8 +63,8 @@ class SettingsFragment : Fragment(), ScrollEventListener { observeClickListener() } + @SuppressLint("SetTextI18n") private fun initializeInjectedDependencies() { - navController = findNavController() binding.nestScrollView.scrollEventListener = this // Set initial values and listeners for switches @@ -69,6 +72,7 @@ class SettingsFragment : Fragment(), ScrollEventListener { binding.timeSwitchCompat.isChecked = preferenceHelper.showTime binding.dateSwitchCompat.isChecked = preferenceHelper.showDate binding.batterySwitchCompat.isChecked = preferenceHelper.showBattery + binding.dailyWordSwitchCompat.isChecked = preferenceHelper.showDailyWord binding.gesturesLockSwitchCompat1.isChecked = preferenceHelper.tapLockScreen } @@ -103,6 +107,11 @@ class SettingsFragment : Fragment(), ScrollEventListener { bottomSheetFragment.show(parentFragmentManager, "BottomSheetDialog") } + binding.selectAppearancePadding.setOnClickListener { + val bottomSheetFragment = PaddingBottomSheetDialogFragment(this.requireContext()) + bottomSheetFragment.show(parentFragmentManager, "BottomSheetDialog") + } + binding.selectAppearanceColor.setOnClickListener { val bottomSheetFragment = ColorBottomSheetDialogFragment(this.requireContext()) bottomSheetFragment.show(parentFragmentManager, "BottomSheetDialog") @@ -121,9 +130,15 @@ class SettingsFragment : Fragment(), ScrollEventListener { binding.dateSwitchCompat.setOnCheckedChangeListener { _, isChecked -> preferenceViewModel.setShowDate(isChecked) } + binding.batterySwitchCompat.setOnCheckedChangeListener { _, isChecked -> preferenceViewModel.setShowBattery(isChecked) } + + binding.dailyWordSwitchCompat.setOnCheckedChangeListener { _, isChecked -> + preferenceViewModel.setShowDailyWord(isChecked) + } + binding.gesturesLockSwitchCompat1.setOnCheckedChangeListener { _, isChecked -> appHelper.enableAppAsAccessibilityService(requireContext(), preferenceHelper.tapLockScreen) preferenceViewModel.setDoubleTapLock(isChecked) diff --git a/app/src/main/java/com/github/droidworksstudio/launcher/viewmodel/PreferenceViewModel.kt b/app/src/main/java/com/github/droidworksstudio/launcher/viewmodel/PreferenceViewModel.kt index f763b0aa..580ec2f2 100644 --- a/app/src/main/java/com/github/droidworksstudio/launcher/viewmodel/PreferenceViewModel.kt +++ b/app/src/main/java/com/github/droidworksstudio/launcher/viewmodel/PreferenceViewModel.kt @@ -20,6 +20,7 @@ class PreferenceViewModel @Inject constructor( val homeAppAlignmentLiveData: MutableLiveData = MutableLiveData() val homeDateAlignmentLiveData: MutableLiveData = MutableLiveData() val homeTimeAlignmentLiveData: MutableLiveData = MutableLiveData() + val homeDailyWordAlignmentLiveData: MutableLiveData = MutableLiveData() val dateColorLiveData: MutableLiveData = MutableLiveData() val timeColorLiveData: MutableLiveData = MutableLiveData() val batteryColorLiveData: MutableLiveData = MutableLiveData() @@ -28,7 +29,9 @@ class PreferenceViewModel @Inject constructor( val dateTextSizeLiveData: MutableLiveData = MutableLiveData() val timeTextSizeLiveData: MutableLiveData = MutableLiveData() val appTextSizeLiveData: MutableLiveData = MutableLiveData() + val batteryTextSizeLiveData: MutableLiveData = MutableLiveData() val tapLockScreenLiveData: MutableLiveData = MutableLiveData() + val appPaddingSizeLiveData: MutableLiveData = MutableLiveData() fun setFirstLaunch(firstLaunch: Boolean) { preferenceHelper.firstLaunch = firstLaunch @@ -100,6 +103,11 @@ class PreferenceViewModel @Inject constructor( homeTimeAlignmentLiveData.postValue(preferenceHelper.homeTimeAlignment) } + fun setHomeDailyWordAppAlignment(homeDailyWordAlignment: Int) { + preferenceHelper.homeDailyWordAlignment = homeDailyWordAlignment + homeDailyWordAlignmentLiveData.postValue(preferenceHelper.homeDailyWordAlignment) + } + fun setDateTextSize(dateTextSize: Float) { preferenceHelper.dateTextSize = dateTextSize dateTextSizeLiveData.postValue(preferenceHelper.dateTextSize) @@ -115,6 +123,16 @@ class PreferenceViewModel @Inject constructor( appTextSizeLiveData.postValue(preferenceHelper.appTextSize) } + fun setBatteryTextSize(batteryTextSize: Float) { + preferenceHelper.batteryTextSize = batteryTextSize + batteryTextSizeLiveData.postValue(preferenceHelper.batteryTextSize) + } + + fun setAppPaddingSize(appPaddingSize: Float) { + preferenceHelper.homeAppPadding = appPaddingSize + appPaddingSizeLiveData.postValue(preferenceHelper.homeAppPadding) + } + fun setDoubleTapLock(tapLockScreen: Boolean){ preferenceHelper.tapLockScreen = tapLockScreen tapLockScreenLiveData.postValue((preferenceHelper.tapLockScreen)) diff --git a/app/src/main/res/layout/bottomsheetdialog_alignment_settings.xml b/app/src/main/res/layout/bottomsheetdialog_alignment_settings.xml index 9143dd8f..fc3c324d 100644 --- a/app/src/main/res/layout/bottomsheetdialog_alignment_settings.xml +++ b/app/src/main/res/layout/bottomsheetdialog_alignment_settings.xml @@ -32,6 +32,7 @@ + tools:ignore="RtlHardcoded,TouchTargetSizeCheck" /> + tools:ignore="RtlHardcoded,TouchTargetSizeCheck" /> + + + + + + + + + tools:ignore="RtlHardcoded,TouchTargetSizeCheck" /> + tools:ignore="RtlHardcoded,TouchTargetSizeCheck" /> + tools:ignore="RtlHardcoded,TouchTargetSizeCheck" /> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bottomsheetdialog_text_settings.xml b/app/src/main/res/layout/bottomsheetdialog_text_settings.xml index cfd739c6..23376d19 100644 --- a/app/src/main/res/layout/bottomsheetdialog_text_settings.xml +++ b/app/src/main/res/layout/bottomsheetdialog_text_settings.xml @@ -32,6 +32,7 @@ + tools:ignore="RtlHardcoded,TouchTargetSizeCheck" /> + tools:ignore="RtlHardcoded,SpeakableTextPresentCheck,TouchTargetSizeCheck,VisualLintTextFieldSize" /> @@ -70,32 +70,32 @@ + tools:ignore="RtlHardcoded,TouchTargetSizeCheck" /> + tools:ignore="RtlHardcoded,SpeakableTextPresentCheck,TouchTargetSizeCheck,VisualLintTextFieldSize" /> @@ -106,36 +106,70 @@ + tools:ignore="RtlHardcoded,TouchTargetSizeCheck" /> + tools:ignore="RtlHardcoded,SpeakableTextPresentCheck,TouchTargetSizeCheck,VisualLintTextFieldSize" /> + + + + + + diff --git a/app/src/main/res/layout/fragment_draw.xml b/app/src/main/res/layout/fragment_draw.xml index 77b45e97..362b66f1 100644 --- a/app/src/main/res/layout/fragment_draw.xml +++ b/app/src/main/res/layout/fragment_draw.xml @@ -37,11 +37,11 @@ - + android:visibility="gone"/> diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index c6bc7cf5..f9c98da4 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -43,7 +43,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" - android:text="Battery" + android:text="@string/battery_level" android:textSize="16sp" style="@style/TextDefaultStyle"/> @@ -52,7 +52,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="start" - android:layout_marginVertical="16dp" + android:layout_marginVertical="8dp" android:fontFamily="sans-serif-light" android:format12Hour="h:mm" android:textSize="48sp" @@ -64,7 +64,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" - android:layout_marginBottom="8dp" android:format12Hour="EEE, dd MMM" android:format24Hour="EEE, dd MMM" android:gravity="start" @@ -73,15 +72,13 @@ tools:text="Thu, 30 Dec" style="@style/TextDefaultStyle"/> - + android:visibility="gone" /> diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index d7d2d2d9..a34e99bf 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -44,7 +44,6 @@ android:textSize="@dimen/text_large" style="@style/TextDefaultStyle"/> - + + + + + + + + + + + + + + + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + tools:ignore="MissingConstraints"> + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_home.xml b/app/src/main/res/layout/item_home.xml index 99923186..b88b76dd 100644 --- a/app/src/main/res/layout/item_home.xml +++ b/app/src/main/res/layout/item_home.xml @@ -21,25 +21,16 @@ - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d9257dc9..e25372b3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,6 +20,7 @@ Uninstall App Launcher Settings + Version Home Display @@ -36,11 +37,10 @@ Show Battery Show Daily Word - Keep Going - - Color Size + Color Alignment + Padding Select Date Color Select Time Color @@ -54,9 +54,11 @@ Size Color Alignment + Padding Date\u0020:\u0020 Time\u0020:\u0020 App\u0020:\u0020 + Word\u0020:\u0020 Battery\u0020:\u0020 Custom Wallpaper @@ -94,10 +96,461 @@ Allows to lock the screen Aster launcher promises to use lock screen permission responsibly.Aster 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 - \ No newline at end of file