Skip to content

Commit d27012d

Browse files
Feat: Added motivational word of the day to homescreen
1 parent d8c43dd commit d27012d

File tree

16 files changed

+322
-9
lines changed

16 files changed

+322
-9
lines changed

app/src/main/java/com/github/droidworksstudio/mlauncher/MainViewModel.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
3535
val showDate = MutableLiveData(prefs.showDate)
3636
val showClock = MutableLiveData(prefs.showClock)
3737
val showAlarm = MutableLiveData(prefs.showAlarm)
38+
val showDailyWord = MutableLiveData(prefs.showDailyWord)
3839
val clockAlignment = MutableLiveData(prefs.clockAlignment)
3940
val dateAlignment = MutableLiveData(prefs.dateAlignment)
4041
val alarmAlignment = MutableLiveData(prefs.alarmAlignment)
42+
val dailyWordAlignment = MutableLiveData(prefs.dailyWordAlignment)
4143
val homeAppsAlignment = MutableLiveData(Pair(prefs.homeAlignment, prefs.homeAlignmentBottom))
4244
val homeAppsNum = MutableLiveData(prefs.homeAppsNum)
4345
val homePagesNum = MutableLiveData(prefs.homePagesNum)
@@ -86,6 +88,10 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
8688
showAlarm.value = visibility
8789
}
8890

91+
fun setShowDailyWord(visibility: Boolean) {
92+
showDailyWord.value = visibility
93+
}
94+
8995
private fun launchApp(appListItem: AppListItem) {
9096
val packageName = appListItem.activityPackage
9197
val appActivityName = appListItem.activityClass
@@ -164,6 +170,10 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
164170
alarmAlignment.value = gravity
165171
}
166172

173+
fun updateDailyWordAlignment(gravity: Constants.Gravity) {
174+
dailyWordAlignment.value = gravity
175+
}
176+
167177
fun updateHomeAppsAlignment(gravity: Constants.Gravity, onBottom: Boolean) {
168178
homeAppsAlignment.value = Pair(gravity, onBottom)
169179
}

app/src/main/java/com/github/droidworksstudio/mlauncher/data/Constants.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ object Constants {
3939
const val MIN_ALARM_SIZE = 10
4040
const val MAX_ALARM_SIZE = 120
4141

42+
const val MIN_DAILY_WORD_SIZE = 10
43+
const val MAX_DAILY_WORD_SIZE = 120
44+
4245
const val MIN_BATTERY_SIZE = 10
4346
const val MAX_BATTERY_SIZE = 75
4447

app/src/main/java/com/github/droidworksstudio/mlauncher/data/Prefs.kt

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ private const val DRAWER_ALIGNMENT = "DRAWER_ALIGNMENT"
3333
private const val CLOCK_ALIGNMENT = "CLOCK_ALIGNMENT"
3434
private const val DATE_ALIGNMENT = "DATE_ALIGNMENT"
3535
private const val ALARM_ALIGNMENT = "ALARM_ALIGNMENT"
36+
private const val DAILY_WORD_ALIGNMENT = "DAILY_WORD_ALIGNMENT"
3637
private const val STATUS_BAR = "STATUS_BAR"
3738
private const val SHOW_BATTERY = "SHOW_BATTERY"
3839
private const val SHOW_BATTERY_ICON = "SHOW_BATTERY_ICON"
@@ -42,6 +43,7 @@ private const val SETTINGS_LOCKED = "SETTINGS_LOCKED"
4243
private const val SHOW_CLOCK = "SHOW_CLOCK"
4344
private const val SHOW_CLOCK_FORMAT = "SHOW_CLOCK_FORMAT"
4445
private const val SHOW_ALARM = "SHOW_ALARM"
46+
private const val SHOW_DAILY_WORD = "SHOW_DAILY_WORD"
4547
private const val SEARCH_START = "SEARCH_START"
4648
private const val SWIPE_UP_ACTION = "SWIPE_UP_ACTION"
4749
private const val SWIPE_DOWN_ACTION = "SWIPE_DOWN_ACTION"
@@ -83,17 +85,19 @@ private const val APP_SIZE_TEXT = "APP_SIZE_TEXT"
8385
private const val DATE_SIZE_TEXT = "DATE_SIZE_TEXT"
8486
private const val CLOCK_SIZE_TEXT = "CLOCK_SIZE_TEXT"
8587
private const val ALARM_SIZE_TEXT = "ALARM_SIZE_TEXT"
88+
private const val DAILY_WORD_SIZE_TEXT = "DAILY_WORD_SIZE_TEXT"
8689
private const val BATTERY_SIZE_TEXT = "BATTERY_SIZE_TEXT"
8790
private const val TEXT_SIZE_SETTINGS = "TEXT_SIZE_SETTINGS"
8891
private const val TEXT_PADDING_SIZE = "TEXT_PADDING_SIZE"
8992

9093
private const val BACKGROUND_COLOR = "BACKGROUND_COLOR"
9194
private const val APP_COLOR = "APP_COLOR"
9295
private const val DATE_COLOR = "DATE_COLOR"
96+
private const val ALARM_CLOCK_COLOR = "ALARM_CLOCK_COLOR"
9397
private const val CLOCK_COLOR = "CLOCK_COLOR"
9498
private const val BATTERY_COLOR = "BATTERY_COLOR"
9599
private const val DAILY_WORD_COLOR = "DAILY_WORD_COLOR"
96-
private const val ALARM_CLOCK_COLOR = "ALARM_CLOCK_COLOR"
100+
97101

98102
class Prefs(val context: Context) {
99103

@@ -269,6 +273,16 @@ class Prefs(val context: Context) {
269273
}
270274
set(value) = prefs.edit().putString(ALARM_ALIGNMENT, value.toString()).apply()
271275

276+
var dailyWordAlignment: Gravity
277+
get() {
278+
val string = prefs.getString(
279+
DAILY_WORD_ALIGNMENT,
280+
Gravity.Left.name
281+
).toString()
282+
return Gravity.valueOf(string)
283+
}
284+
set(value) = prefs.edit().putString(DAILY_WORD_ALIGNMENT, value.toString()).apply()
285+
272286
var drawerAlignment: Gravity
273287
get() {
274288
val string = prefs.getString(
@@ -296,9 +310,13 @@ class Prefs(val context: Context) {
296310
set(value) = prefs.edit().putBoolean(SHOW_CLOCK_FORMAT, value).apply()
297311

298312
var showAlarm: Boolean
299-
get() = prefs.getBoolean(SHOW_ALARM, true)
313+
get() = prefs.getBoolean(SHOW_ALARM, false)
300314
set(value) = prefs.edit().putBoolean(SHOW_ALARM, value).apply()
301315

316+
var showDailyWord: Boolean
317+
get() = prefs.getBoolean(SHOW_DAILY_WORD, false)
318+
set(value) = prefs.edit().putBoolean(SHOW_DAILY_WORD, value).apply()
319+
302320
var showBattery: Boolean
303321
get() = prefs.getBoolean(SHOW_BATTERY, true)
304322
set(value) = prefs.edit().putBoolean(SHOW_BATTERY, value).apply()
@@ -576,6 +594,16 @@ class Prefs(val context: Context) {
576594
}
577595
set(value) = prefs.edit().putInt(ALARM_SIZE_TEXT, value).apply()
578596

597+
var dailyWordSize: Int
598+
get() {
599+
return try {
600+
prefs.getInt(DAILY_WORD_SIZE_TEXT, 20)
601+
} catch (_: Exception) {
602+
20
603+
}
604+
}
605+
set(value) = prefs.edit().putInt(DAILY_WORD_SIZE_TEXT, value).apply()
606+
579607

580608
var batterySize: Int
581609
get() {

app/src/main/java/com/github/droidworksstudio/mlauncher/helper/Utils.kt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import android.content.DialogInterface
1212
import android.content.Intent
1313
import android.content.pm.LauncherApps
1414
import android.content.res.Resources
15+
import android.graphics.ColorFilter
16+
import android.graphics.PorterDuff
17+
import android.graphics.PorterDuffColorFilter
1518
import android.net.Uri
1619
import android.os.Build
1720
import android.os.Process
@@ -38,6 +41,7 @@ import com.github.droidworksstudio.mlauncher.data.Prefs
3841
import kotlinx.coroutines.Dispatchers
3942
import kotlinx.coroutines.withContext
4043
import java.text.SimpleDateFormat
44+
import java.util.Calendar
4145
import java.util.Date
4246
import java.util.Locale
4347
import kotlin.math.pow
@@ -213,7 +217,11 @@ fun getNextAlarm(context: Context, prefs: Prefs): CharSequence {
213217
context.resources.displayMetrics
214218
).toInt()
215219

216-
drawable?.setBounds(0, 0, fontSize, fontSize)
220+
drawable?.apply {
221+
setBounds(0, 0, fontSize, fontSize)
222+
val colorFilterColor: ColorFilter = PorterDuffColorFilter(prefs.alarmClockColor, PorterDuff.Mode.SRC_IN)
223+
drawable.colorFilter = colorFilterColor
224+
}
217225

218226
return SpannableStringBuilder(" ").apply {
219227
drawable?.let {
@@ -227,6 +235,15 @@ fun getNextAlarm(context: Context, prefs: Prefs): CharSequence {
227235
}
228236
}
229237

238+
fun wordOfTheDay(resources: Resources): String {
239+
val dailyWordsArray =
240+
resources.getStringArray(R.array.word_of_the_day)
241+
val dayOfYear = Calendar.getInstance().get(Calendar.DAY_OF_YEAR)
242+
val wordIndex =
243+
(dayOfYear - 1) % dailyWordsArray.size // Subtracting 1 to align with array indexing
244+
return dailyWordsArray[wordIndex]
245+
}
246+
230247
fun ismlauncherDefault(context: Context): Boolean {
231248
val launcherPackageName = getDefaultLauncherPackage(context)
232249
return BuildConfig.APPLICATION_ID == launcherPackageName

app/src/main/java/com/github/droidworksstudio/mlauncher/ui/HomeFragment.kt

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ import com.github.droidworksstudio.mlauncher.helper.hideStatusBar
7171
import com.github.droidworksstudio.mlauncher.helper.initActionService
7272
import com.github.droidworksstudio.mlauncher.helper.ismlauncherDefault
7373
import com.github.droidworksstudio.mlauncher.helper.showStatusBar
74+
import com.github.droidworksstudio.mlauncher.helper.wordOfTheDay
7475
import com.github.droidworksstudio.mlauncher.listener.OnSwipeTouchListener
7576
import com.github.droidworksstudio.mlauncher.listener.ViewSwipeTouchListener
7677
import kotlinx.coroutines.Dispatchers
@@ -106,7 +107,6 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
106107
return view
107108
}
108109

109-
110110
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
111111
super.onViewCreated(view, savedInstanceState)
112112

@@ -158,9 +158,12 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
158158
date.format24Hour = datePattern
159159

160160
alarm.text = getNextAlarm(requireContext(), prefs)
161+
dailyWord.text = wordOfTheDay(resources)
161162

162-
clock.textSize = prefs.clockSize.toFloat()
163163
date.textSize = prefs.dateSize.toFloat()
164+
clock.textSize = prefs.clockSize.toFloat()
165+
alarm.textSize = prefs.alarmSize.toFloat()
166+
dailyWord.textSize = prefs.dailyWordSize.toFloat()
164167
battery.textSize = prefs.batterySize.toFloat()
165168
homeScreenPager.textSize = prefs.appSize.toFloat()
166169

@@ -171,6 +174,7 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
171174
date.setTextColor(prefs.dateColor)
172175
clock.setTextColor(prefs.clockColor)
173176
alarm.setTextColor(prefs.alarmClockColor)
177+
dailyWord.setTextColor(prefs.dailyWordColor)
174178
battery.setTextColor(prefs.batteryColor)
175179
totalScreenTime.setTextColor(prefs.appColor)
176180
setDefaultLauncher.setTextColor(prefs.appColor)
@@ -321,6 +325,15 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
321325
}
322326
}
323327

328+
dailyWordAlignment.observe(viewLifecycleOwner) { dailyWordGravity ->
329+
binding.dailyWord.gravity = dailyWordGravity.value()
330+
331+
// Set layout_gravity to align the TextView (alarm) within the parent (LinearLayout)
332+
binding.dailyWord.layoutParams = (binding.dailyWord.layoutParams as LinearLayout.LayoutParams).apply {
333+
gravity = dailyWordGravity.value()
334+
}
335+
}
336+
324337
homeAppsAlignment.observe(viewLifecycleOwner) { (homeAppsGravity, onBottom) ->
325338
val horizontalAlignment = if (onBottom) Gravity.BOTTOM else Gravity.CENTER_VERTICAL
326339
binding.homeAppsLayout.gravity = homeAppsGravity.value() or horizontalAlignment
@@ -345,7 +358,9 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
345358
showAlarm.observe(viewLifecycleOwner) {
346359
binding.alarm.visibility = if (it) View.VISIBLE else View.GONE
347360
}
348-
361+
showDailyWord.observe(viewLifecycleOwner) {
362+
binding.dailyWord.visibility = if (it) View.VISIBLE else View.GONE
363+
}
349364
}
350365
}
351366

@@ -935,8 +950,8 @@ class HomeFragment : Fragment(), View.OnClickListener, View.OnLongClickListener
935950
pageSelectorIcons.forEach { drawableRes ->
936951
val drawable = ContextCompat.getDrawable(requireContext(), drawableRes)?.apply {
937952
setBounds(0, 0, intrinsicWidth, intrinsicHeight)
938-
val colorFilter: ColorFilter = PorterDuffColorFilter(prefs.appColor, PorterDuff.Mode.SRC_IN)
939-
setColorFilter(colorFilter)
953+
val colorFilterColor: ColorFilter = PorterDuffColorFilter(prefs.appColor, PorterDuff.Mode.SRC_IN)
954+
colorFilter = colorFilterColor
940955
}
941956
val imageSpan = drawable?.let { ImageSpan(it, ImageSpan.ALIGN_BASELINE) }
942957

app/src/main/java/com/github/droidworksstudio/mlauncher/ui/settings/FeaturesFragment.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class FeaturesFragment : Fragment() {
9797
var toggledShowClock by remember { mutableStateOf(prefs.showClock) }
9898
var toggledShowClockFormat by remember { mutableStateOf(prefs.showClockFormat) }
9999
var toggledShowAlarm by remember { mutableStateOf(prefs.showAlarm) }
100+
var toggledShowDailyWord by remember { mutableStateOf(prefs.showDailyWord) }
100101
var toggledShowBattery by remember { mutableStateOf(prefs.showBattery) }
101102
var toggledShowBatteryIcon by remember { mutableStateOf(prefs.showBatteryIcon) }
102103

@@ -394,6 +395,17 @@ class FeaturesFragment : Fragment() {
394395
}
395396
)
396397

398+
SettingsSwitch(
399+
text = stringResource(R.string.show_daily_word),
400+
fontSize = titleFontSize,
401+
defaultState = toggledShowDailyWord,
402+
onCheckedChange = {
403+
toggledShowDailyWord = !prefs.showDailyWord
404+
prefs.showDailyWord = toggledShowDailyWord
405+
viewModel.setShowDailyWord(prefs.showDailyWord)
406+
}
407+
)
408+
397409
SettingsSwitch(
398410
text = stringResource(R.string.show_battery),
399411
fontSize = titleFontSize,

app/src/main/java/com/github/droidworksstudio/mlauncher/ui/settings/LookFeelFragment.kt

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ class LookFeelFragment : Fragment() {
8686
var selectedDateSize by remember { mutableIntStateOf(prefs.dateSize) }
8787
var selectedClockSize by remember { mutableIntStateOf(prefs.clockSize) }
8888
var selectedAlarmSize by remember { mutableIntStateOf(prefs.alarmSize) }
89+
var selectedDailyWordSize by remember { mutableIntStateOf(prefs.dailyWordSize) }
8990
var selectedBatterySize by remember { mutableIntStateOf(prefs.batterySize) }
9091

9192
var selectedPaddingSize by remember { mutableIntStateOf(prefs.textPaddingSize) }
@@ -104,13 +105,15 @@ class LookFeelFragment : Fragment() {
104105
var selectedClockAlignment by remember { mutableStateOf(prefs.clockAlignment) }
105106
var selectedDateAlignment by remember { mutableStateOf(prefs.dateAlignment) }
106107
var selectedAlarmAlignment by remember { mutableStateOf(prefs.alarmAlignment) }
108+
var selectedDailyWordAlignment by remember { mutableStateOf(prefs.dailyWordAlignment) }
107109
var selectedDrawAlignment by remember { mutableStateOf(prefs.drawerAlignment) }
108110

109111
var selectedBackgroundColor by remember { mutableIntStateOf(prefs.backgroundColor) }
110112
var selectedAppColor by remember { mutableIntStateOf(prefs.appColor) }
111113
var selectedDateColor by remember { mutableIntStateOf(prefs.dateColor) }
112114
var selectedClockColor by remember { mutableIntStateOf(prefs.clockColor) }
113115
var selectedAlarmColor by remember { mutableIntStateOf(prefs.alarmClockColor) }
116+
var selectedDailyWordColor by remember { mutableIntStateOf(prefs.dailyWordColor) }
114117
var selectedBatteryColor by remember { mutableIntStateOf(prefs.batteryColor) }
115118

116119
val fs = remember { mutableStateOf(fontSize) }
@@ -215,6 +218,25 @@ class LookFeelFragment : Fragment() {
215218
}
216219
)
217220

221+
SettingsSelect(
222+
title = stringResource(R.string.daily_word_text_size),
223+
option = selectedDailyWordSize.toString(),
224+
fontSize = titleFontSize,
225+
onClick = {
226+
dialogBuilder.showSliderDialog(
227+
context = requireContext(),
228+
title = getString(R.string.daily_word_text_size),
229+
minValue = Constants.MIN_DAILY_WORD_SIZE,
230+
maxValue = Constants.MAX_DAILY_WORD_SIZE,
231+
currentValue = prefs.dailyWordSize,
232+
onValueSelected = { newDateSize ->
233+
selectedDailyWordSize = newDateSize // Update state
234+
prefs.dailyWordSize = newDateSize // Persist selection in preferences
235+
}
236+
)
237+
}
238+
)
239+
218240
SettingsSelect(
219241
title = stringResource(R.string.battery_text_size),
220242
option = selectedBatterySize.toString(),
@@ -435,6 +457,24 @@ class LookFeelFragment : Fragment() {
435457
}
436458
)
437459

460+
SettingsSelect(
461+
title = stringResource(R.string.daily_word_alignment),
462+
option = selectedDailyWordAlignment.string(),
463+
fontSize = titleFontSize,
464+
onClick = {
465+
dialogBuilder.showSingleChoiceDialog(
466+
context = requireContext(),
467+
options = Constants.Gravity.entries.toTypedArray(),
468+
titleResId = R.string.daily_word_alignment,
469+
onItemSelected = { newGravity ->
470+
selectedDailyWordAlignment = newGravity // Update state
471+
prefs.dailyWordAlignment = newGravity // Persist selection in preferences
472+
viewModel.updateDailyWordAlignment(newGravity)
473+
}
474+
)
475+
}
476+
)
477+
438478
SettingsSelect(
439479
title = stringResource(R.string.home_alignment),
440480
option = selectedHomeAlignment.string(),
@@ -566,6 +606,24 @@ class LookFeelFragment : Fragment() {
566606
}
567607
)
568608

609+
val hexDailyWordColor = String.format("#%06X", (0xFFFFFF and selectedDailyWordColor))
610+
SettingsSelect(
611+
title = stringResource(R.string.daily_word_color),
612+
option = hexDailyWordColor,
613+
fontSize = titleFontSize,
614+
fontColor = Color(parseColor(hexDailyWordColor)),
615+
onClick = {
616+
dialogBuilder.showColorPickerDialog(
617+
context = requireContext(),
618+
color = selectedDailyWordColor,
619+
titleResId = R.string.daily_word_color,
620+
onItemSelected = { selectedColor ->
621+
selectedDailyWordColor = selectedColor
622+
prefs.dailyWordColor = selectedColor
623+
})
624+
}
625+
)
626+
569627
val hexBatteryColor = String.format("#%06X", (0xFFFFFF and selectedBatteryColor))
570628
SettingsSelect(
571629
title = stringResource(R.string.battery_color),

app/src/main/res/layout/fragment_home.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,13 @@
6565
android:id="@+id/alarm"
6666
android:layout_width="wrap_content"
6767
android:layout_height="wrap_content"
68-
android:layout_gravity="center"
68+
android:textSize="@dimen/alarm_size"
69+
android:visibility="gone" />
70+
71+
<TextView
72+
android:id="@+id/daily_word"
73+
android:layout_width="wrap_content"
74+
android:layout_height="wrap_content"
6975
android:textSize="@dimen/alarm_size"
7076
android:visibility="gone" />
7177
</LinearLayout>

app/src/main/res/values-hdpi/dimens.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
<dimen name="time_size">32sp</dimen>
99
<dimen name="date_size">16sp</dimen>
1010
<dimen name="alarm_size">14sp</dimen>
11+
<dimen name="daily_word_size">14sp</dimen>
1112
</resources>

0 commit comments

Comments
 (0)