Skip to content

Commit 89b62ff

Browse files
committed
add button to open app from universal widget
1 parent a573ebf commit 89b62ff

File tree

32 files changed

+149
-51
lines changed

32 files changed

+149
-51
lines changed

data_local/src/main/java/com/example/util/simpletimetracker/data_local/prefs/PrefsRepoImpl.kt

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.example.util.simpletimetracker.domain.prefs.repo.PrefsRepo
1111
import java.util.Calendar
1212
import javax.inject.Inject
1313
import javax.inject.Singleton
14+
import androidx.core.content.edit
1415

1516
@Singleton
1617
class PrefsRepoImpl @Inject constructor(
@@ -405,13 +406,13 @@ class PrefsRepoImpl @Inject constructor(
405406
)
406407

407408
override var statisticsDetailStreakType: Int by prefs.delegate(
408-
KEY_STATISTICS_DETAIL_STREAK_TYPE, 0
409+
KEY_STATISTICS_DETAIL_STREAK_TYPE, 0,
409410
)
410411

411412
override fun setWidget(widgetId: Int, recordType: Long) {
412413
val key = KEY_WIDGET + widgetId
413414
logPrefsDataAccess("set $key")
414-
prefs.edit().putLong(key, recordType).apply()
415+
prefs.edit { putLong(key, recordType) }
415416
}
416417

417418
override fun getWidget(widgetId: Int): Long {
@@ -423,7 +424,7 @@ class PrefsRepoImpl @Inject constructor(
423424
override fun removeWidget(widgetId: Int) {
424425
val key = KEY_WIDGET + widgetId
425426
logPrefsDataAccess("remove $key")
426-
prefs.edit().remove(key).apply()
427+
prefs.edit { remove(key) }
427428
}
428429

429430
override fun setStatisticsWidget(widgetId: Int, data: StatisticsWidgetData) {
@@ -451,19 +452,17 @@ class PrefsRepoImpl @Inject constructor(
451452
StatisticsWidgetData.FilterType.SELECT -> 1
452453
}
453454

454-
prefs.edit()
455-
.putInt(KEY_STATISTICS_WIDGET_FILTER_TYPE + widgetId, filterTypeData)
456-
.putInt(KEY_STATISTICS_WIDGET_RANGE + widgetId, rangeData)
457-
.apply {
458-
if (rangeDataLastDays != null) {
459-
putInt(KEY_STATISTICS_WIDGET_RANGE_LAST_DAYS + widgetId, rangeDataLastDays)
460-
}
455+
prefs.edit {
456+
putInt(KEY_STATISTICS_WIDGET_FILTER_TYPE + widgetId, filterTypeData)
457+
putInt(KEY_STATISTICS_WIDGET_RANGE + widgetId, rangeData)
458+
if (rangeDataLastDays != null) {
459+
putInt(KEY_STATISTICS_WIDGET_RANGE_LAST_DAYS + widgetId, rangeDataLastDays)
461460
}
462-
.putStringSet(KEY_STATISTICS_WIDGET_FILTERED_TYPES + widgetId, filteredTypesData)
463-
.putStringSet(KEY_STATISTICS_WIDGET_FILTERED_CATEGORIES + widgetId, filteredCategoriesData)
464-
.putStringSet(KEY_STATISTICS_WIDGET_FILTERED_TAGS + widgetId, filteredTagsData)
465-
.putInt(KEY_STATISTICS_WIDGET_FILTERING_TYPE + widgetId, filteringType)
466-
.apply()
461+
putStringSet(KEY_STATISTICS_WIDGET_FILTERED_TYPES + widgetId, filteredTypesData)
462+
putStringSet(KEY_STATISTICS_WIDGET_FILTERED_CATEGORIES + widgetId, filteredCategoriesData)
463+
putStringSet(KEY_STATISTICS_WIDGET_FILTERED_TAGS + widgetId, filteredTagsData)
464+
putInt(KEY_STATISTICS_WIDGET_FILTERING_TYPE + widgetId, filteringType)
465+
}
467466
}
468467

469468
override fun getStatisticsWidget(widgetId: Int): StatisticsWidgetData {
@@ -519,14 +518,14 @@ class PrefsRepoImpl @Inject constructor(
519518

520519
override fun removeStatisticsWidget(widgetId: Int) {
521520
logPrefsDataAccess("removeStatisticsWidget $widgetId")
522-
prefs.edit()
523-
.remove(KEY_STATISTICS_WIDGET_FILTER_TYPE + widgetId)
524-
.remove(KEY_STATISTICS_WIDGET_RANGE + widgetId)
525-
.remove(KEY_STATISTICS_WIDGET_RANGE_LAST_DAYS + widgetId)
526-
.remove(KEY_STATISTICS_WIDGET_FILTERED_TYPES + widgetId)
527-
.remove(KEY_STATISTICS_WIDGET_FILTERED_CATEGORIES + widgetId)
528-
.remove(KEY_STATISTICS_WIDGET_FILTERED_TAGS + widgetId)
529-
.apply()
521+
prefs.edit {
522+
remove(KEY_STATISTICS_WIDGET_FILTER_TYPE + widgetId)
523+
remove(KEY_STATISTICS_WIDGET_RANGE + widgetId)
524+
remove(KEY_STATISTICS_WIDGET_RANGE_LAST_DAYS + widgetId)
525+
remove(KEY_STATISTICS_WIDGET_FILTERED_TYPES + widgetId)
526+
remove(KEY_STATISTICS_WIDGET_FILTERED_CATEGORIES + widgetId)
527+
remove(KEY_STATISTICS_WIDGET_FILTERED_TAGS + widgetId)
528+
}
530529
}
531530

532531
override fun setQuickSettingsWidget(widgetId: Int, data: QuickSettingsWidgetType) {
@@ -536,7 +535,7 @@ class PrefsRepoImpl @Inject constructor(
536535
is QuickSettingsWidgetType.AllowMultitasking -> 0L
537536
is QuickSettingsWidgetType.ShowRecordTagSelection -> 1L
538537
}
539-
prefs.edit().putLong(key, type).apply()
538+
prefs.edit { putLong(key, type) }
540539
}
541540

542541
override fun getQuickSettingsWidget(widgetId: Int): QuickSettingsWidgetType {
@@ -552,30 +551,32 @@ class PrefsRepoImpl @Inject constructor(
552551
override fun removeQuickSettingsWidget(widgetId: Int) {
553552
val key = KEY_QUICK_SETTINGS_WIDGET_TYPE + widgetId
554553
logPrefsDataAccess("remove $key")
555-
prefs.edit().remove(key).apply()
554+
prefs.edit { remove(key) }
556555
}
557556

558557
override fun clear() {
559-
prefs.edit().clear().apply()
558+
prefs.edit { clear() }
560559
}
561560

562561
override fun clearDefaultTypesHidden() {
563-
prefs.edit().remove(KEY_DEFAULT_TYPES_HIDDEN).apply()
562+
prefs.edit { remove(KEY_DEFAULT_TYPES_HIDDEN) }
564563
}
565564

566565
override fun clearRetroactiveMultitaskingHidden() {
567-
prefs.edit().remove(KEY_RETROACTIVE_MULTITASKING_HINT_WAS_HIDDEN).apply()
566+
prefs.edit { remove(KEY_RETROACTIVE_MULTITASKING_HINT_WAS_HIDDEN) }
568567
}
569568

570569
override fun clearPomodoroSettingsClick() {
571-
prefs.edit().remove(KEY_POMODORO_FOCUS_TIME).apply()
572-
prefs.edit().remove(KEY_POMODORO_BREAK_TIME).apply()
573-
prefs.edit().remove(KEY_POMODORO_LONG_BREAK_TIME).apply()
574-
prefs.edit().remove(KEY_POMODORO_PERIODS_UNTIL_LONG_BREAK).apply()
570+
prefs.edit {
571+
remove(KEY_POMODORO_FOCUS_TIME)
572+
remove(KEY_POMODORO_BREAK_TIME)
573+
remove(KEY_POMODORO_LONG_BREAK_TIME)
574+
remove(KEY_POMODORO_PERIODS_UNTIL_LONG_BREAK)
575+
}
575576
}
576577

577578
override fun clearDurationSuggestionsPrepopulated() {
578-
prefs.edit().remove(KEY_DURATION_SUGGESTIONS_WAS_PREPOPULATED).apply()
579+
prefs.edit { remove(KEY_DURATION_SUGGESTIONS_WAS_PREPOPULATED) }
579580
}
580581

581582
override fun hasValueSaved(key: String): Boolean {

features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/mapper/WidgetUniversalViewDataMapper.kt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@ import com.example.util.simpletimetracker.domain.record.model.Record
88
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
99
import com.example.util.simpletimetracker.domain.record.model.RunningRecord
1010
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
11+
import com.example.util.simpletimetracker.feature_base_adapter.button.ButtonViewData
12+
import com.example.util.simpletimetracker.feature_base_adapter.emptySpace.EmptySpaceViewData
1113
import com.example.util.simpletimetracker.feature_base_adapter.hint.HintViewData
1214
import com.example.util.simpletimetracker.feature_views.viewData.RecordTypeIcon
1315
import com.example.util.simpletimetracker.feature_widget.R
1416
import com.example.util.simpletimetracker.feature_widget.universal.customView.IconStackData
1517
import com.example.util.simpletimetracker.feature_widget.universal.customView.WidgetUniversalViewData
18+
import com.example.util.simpletimetracker.feature_widget.universal.viewData.WidgetUniversalButtonViewData
1619
import javax.inject.Inject
1720

1821
class WidgetUniversalViewDataMapper @Inject constructor(
@@ -100,4 +103,30 @@ class WidgetUniversalViewDataMapper @Inject constructor(
100103
}.let(resourceRepo::getString)
101104
return HintViewData(text = text)
102105
}
106+
107+
fun mapOpenInAppButton(
108+
isDarkTheme: Boolean,
109+
): List<ViewHolderType> {
110+
val result = mutableListOf<ViewHolderType>()
111+
112+
result += EmptySpaceViewData(
113+
id = "openInAppButtonViewData".hashCode().toLong(),
114+
width = EmptySpaceViewData.ViewDimension.MatchParent,
115+
height = EmptySpaceViewData.ViewDimension.ExactSizeDp(24),
116+
)
117+
result += ButtonViewData(
118+
id = WidgetUniversalButtonViewData,
119+
text = resourceRepo.getString(R.string.widget_universal_open_app),
120+
icon = ButtonViewData.Icon.Present(
121+
icon = R.drawable.app_ic_launcher_monochrome,
122+
iconColor = resourceRepo.getThemedAttr(R.attr.appLightTextColor, isDarkTheme),
123+
iconBackgroundColor = resourceRepo.getThemedAttr(R.attr.appInactiveColor, isDarkTheme),
124+
),
125+
backgroundColor = resourceRepo.getThemedAttr(R.attr.appActiveColor, isDarkTheme),
126+
isEnabled = true,
127+
marginHorizontalDp = 4,
128+
)
129+
130+
return result
131+
}
103132
}

features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/activity/view/WidgetUniversalActivity.kt renamed to features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/view/WidgetUniversalActivity.kt

File renamed without changes.

features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/activity/view/WidgetUniversalFragment.kt renamed to features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/view/WidgetUniversalFragment.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,23 @@ import androidx.fragment.app.viewModels
99
import com.example.util.simpletimetracker.core.base.BaseFragment
1010
import com.example.util.simpletimetracker.core.dialog.OnTagSelectedListener
1111
import com.example.util.simpletimetracker.core.utils.InsetConfiguration
12+
import com.example.util.simpletimetracker.core.utils.doOnApplyWindowInsetsListener
13+
import com.example.util.simpletimetracker.core.utils.getNavBarInsets
1214
import com.example.util.simpletimetracker.core.viewData.RecordTypeSuggestionType
1315
import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter
1416
import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.createActivityFilterAdapterDelegate
1517
import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.createActivityFilterAddAdapterDelegate
18+
import com.example.util.simpletimetracker.feature_base_adapter.button.createButtonAdapterDelegate
1619
import com.example.util.simpletimetracker.feature_base_adapter.divider.createDividerAdapterDelegate
1720
import com.example.util.simpletimetracker.feature_base_adapter.empty.createEmptyAdapterDelegate
21+
import com.example.util.simpletimetracker.feature_base_adapter.emptySpace.createEmptySpaceAdapterDelegate
1822
import com.example.util.simpletimetracker.feature_base_adapter.hint.createHintAdapterDelegate
1923
import com.example.util.simpletimetracker.feature_base_adapter.loader.createLoaderAdapterDelegate
2024
import com.example.util.simpletimetracker.feature_base_adapter.recordType.createRecordTypeAdapterDelegate
2125
import com.example.util.simpletimetracker.feature_base_adapter.recordTypeSpecial.createRunningRecordTypeSpecialAdapterDelegate
2226
import com.example.util.simpletimetracker.feature_base_adapter.recordTypeSuggestion.createRecordTypeSuggestionAdapterDelegate
23-
import com.example.util.simpletimetracker.feature_widget.universal.activity.viewModel.WidgetUniversalViewModel
27+
import com.example.util.simpletimetracker.feature_views.extension.pxToDp
28+
import com.example.util.simpletimetracker.feature_widget.universal.viewModel.WidgetUniversalViewModel
2429
import com.google.android.flexbox.FlexDirection
2530
import com.google.android.flexbox.FlexWrap
2631
import com.google.android.flexbox.FlexboxLayoutManager
@@ -36,7 +41,7 @@ class WidgetUniversalFragment :
3641
Binding::inflate
3742

3843
override var insetConfiguration: InsetConfiguration =
39-
InsetConfiguration.ApplyToView { binding.rvWidgetUniversalRecordType }
44+
InsetConfiguration.DoNotApply
4045

4146
private val viewModel: WidgetUniversalViewModel by viewModels()
4247

@@ -47,6 +52,8 @@ class WidgetUniversalFragment :
4752
createRecordTypeAdapterDelegate(viewModel::onRecordTypeClick),
4853
createRecordTypeSuggestionAdapterDelegate(RecordTypeSuggestionType, viewModel::onRecordTypeClick),
4954
createRunningRecordTypeSpecialAdapterDelegate(viewModel::onSpecialRecordTypeClick),
55+
createButtonAdapterDelegate(viewModel::onButtonClick),
56+
createEmptySpaceAdapterDelegate(),
5057
createDividerAdapterDelegate(),
5158
createEmptyAdapterDelegate(),
5259
createLoaderAdapterDelegate(),
@@ -63,6 +70,10 @@ class WidgetUniversalFragment :
6370
}
6471
adapter = typesAdapter
6572
}
73+
74+
view?.doOnApplyWindowInsetsListener {
75+
viewModel.onChangeInsets(navBarHeight = it.getNavBarInsets().bottom.pxToDp())
76+
}
6677
}
6778

6879
override fun initViewModel(): Unit = with(viewModel) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.example.util.simpletimetracker.feature_widget.universal.viewData
2+
3+
import com.example.util.simpletimetracker.feature_base_adapter.button.ButtonViewData
4+
5+
object WidgetUniversalButtonViewData : ButtonViewData.Id

features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/activity/viewModel/WidgetUniversalViewModel.kt renamed to features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/viewModel/WidgetUniversalViewModel.kt

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.example.util.simpletimetracker.feature_widget.universal.activity.viewModel
1+
package com.example.util.simpletimetracker.feature_widget.universal.viewModel
22

33
import androidx.lifecycle.LiveData
44
import androidx.lifecycle.MutableLiveData
@@ -13,25 +13,28 @@ import com.example.util.simpletimetracker.core.interactor.FilterGoalsByDayOfWeek
1313
import com.example.util.simpletimetracker.core.interactor.GetCurrentRecordsDurationInteractor
1414
import com.example.util.simpletimetracker.core.interactor.RecordRepeatInteractor
1515
import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper
16-
import com.example.util.simpletimetracker.domain.extension.orZero
17-
import com.example.util.simpletimetracker.domain.record.interactor.AddRunningRecordMediator
1816
import com.example.util.simpletimetracker.domain.activityFilter.interactor.ChangeSelectedActivityFilterMediator
17+
import com.example.util.simpletimetracker.domain.extension.orZero
1918
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
20-
import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeGoalInteractor
21-
import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeInteractor
19+
import com.example.util.simpletimetracker.domain.record.interactor.AddRunningRecordMediator
2220
import com.example.util.simpletimetracker.domain.record.interactor.RemoveRunningRecordMediator
2321
import com.example.util.simpletimetracker.domain.record.interactor.RunningRecordInteractor
2422
import com.example.util.simpletimetracker.domain.record.model.RecordDataSelectionDialogResult
25-
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
2623
import com.example.util.simpletimetracker.domain.record.model.RunningRecord
24+
import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeGoalInteractor
25+
import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeInteractor
26+
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
2727
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
2828
import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.ActivityFilterAddViewData
2929
import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.ActivityFilterViewData
30+
import com.example.util.simpletimetracker.feature_base_adapter.button.ButtonViewData
3031
import com.example.util.simpletimetracker.feature_base_adapter.divider.DividerViewData
32+
import com.example.util.simpletimetracker.feature_base_adapter.emptySpace.EmptySpaceViewData
3133
import com.example.util.simpletimetracker.feature_base_adapter.loader.LoaderViewData
3234
import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData
3335
import com.example.util.simpletimetracker.feature_base_adapter.recordTypeSpecial.RunningRecordTypeSpecialViewData
3436
import com.example.util.simpletimetracker.feature_widget.universal.mapper.WidgetUniversalViewDataMapper
37+
import com.example.util.simpletimetracker.feature_widget.universal.viewData.WidgetUniversalButtonViewData
3538
import com.example.util.simpletimetracker.navigation.Router
3639
import com.example.util.simpletimetracker.navigation.params.screen.RecordTagSelectionParams
3740
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -73,6 +76,14 @@ class WidgetUniversalViewModel @Inject constructor(
7376

7477
private var completeTypeJob: Job? = null
7578
private var completeTypeIds: Set<Long> = emptySet()
79+
private var navBarHeightDp: Int = 0
80+
81+
fun onChangeInsets(navBarHeight: Int) {
82+
if (navBarHeightDp != navBarHeight) {
83+
navBarHeightDp = navBarHeight
84+
updateRecordTypesViewData()
85+
}
86+
}
7687

7788
fun onRecordTypeClick(item: RecordTypeViewData) {
7889
viewModelScope.launch {
@@ -135,6 +146,11 @@ class WidgetUniversalViewModel @Inject constructor(
135146
}
136147
}
137148

149+
fun onButtonClick(data: ButtonViewData) {
150+
if (data.id !is WidgetUniversalButtonViewData) return
151+
router.startApp()
152+
}
153+
138154
fun onTagSelected() {
139155
updateRecordTypesViewData()
140156
exit.set(Unit)
@@ -232,18 +248,28 @@ class WidgetUniversalViewModel @Inject constructor(
232248
numberOfCards = numberOfCards,
233249
isDarkTheme = isDarkTheme,
234250
)
251+
val openInAppButtonViewData = widgetUniversalViewDataMapper.mapOpenInAppButton(
252+
isDarkTheme = isDarkTheme,
253+
)
254+
val bottomSpace = EmptySpaceViewData(
255+
id = "widgets_universal_nav_bar_space".hashCode().toLong(),
256+
height = EmptySpaceViewData.ViewDimension.ExactSizeDp(navBarHeightDp),
257+
wrapBefore = true,
258+
)
235259

236-
return mutableListOf<ViewHolderType>().apply {
237-
filtersViewData.let(::addAll)
238-
suggestionsViewData.let(::addAll)
239-
if (recordTypesViewData.isEmpty()) {
240-
recordTypeViewDataMapper.mapToEmpty().let(::addAll)
241-
} else {
242-
recordTypesViewData.let(::addAll)
243-
repeatViewData.let(::add)
244-
widgetUniversalViewDataMapper.mapToHint(retroactiveTrackingMode).let(::add)
245-
}
260+
val result = mutableListOf<ViewHolderType>()
261+
result += filtersViewData
262+
result += suggestionsViewData
263+
if (recordTypesViewData.isEmpty()) {
264+
result += recordTypeViewDataMapper.mapToEmpty()
265+
} else {
266+
result += recordTypesViewData
267+
result += repeatViewData
268+
result += widgetUniversalViewDataMapper.mapToHint(retroactiveTrackingMode)
246269
}
270+
result += openInAppButtonViewData
271+
result += bottomSpace
272+
return result
247273
}
248274

249275
companion object {

resources/src/main/res/values-ar/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,7 @@
527527
<string name="widget_quick_settings_name">إعدادات سريعة</string>
528528
<string name="widget_load_error">غير موجود</string>
529529
<string name="widget_statistics_ignore_new_items">تجاهل العناصر الجديدة التي أُضيفت لاحقًا</string>
530+
<string name="widget_universal_open_app">افتح التطبيق</string>
530531

531532
<!-- Notification -->
532533
<string name="notification_inactivity_title">مذكر الخمول</string>

resources/src/main/res/values-ca/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,7 @@ Exemple:<br/>
527527
<string name="widget_quick_settings_name">Configuració ràpida</string>
528528
<string name="widget_load_error">No trobat</string>
529529
<string name="widget_statistics_ignore_new_items">Ignora els elements nous afegits més tard</string>
530+
<string name="widget_universal_open_app">Obre l\'aplicació</string>
530531

531532
<!-- Notification -->
532533
<string name="notification_inactivity_title">Recordatori d\'inactivitat</string>

resources/src/main/res/values-de/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,7 @@ Beispiel:<br/>
527527
<string name="widget_quick_settings_name">Schnelleinstellungen</string>
528528
<string name="widget_load_error">Nicht gefunden</string>
529529
<string name="widget_statistics_ignore_new_items">Neue später hinzugefügte Elemente ignorieren</string>
530+
<string name="widget_universal_open_app">App öffnen</string>
530531

531532
<!-- Notification -->
532533
<string name="notification_inactivity_title">Inaktivitätserinnerung</string>

resources/src/main/res/values-es/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,7 @@ Ejemplo:<br/>
527527
<string name="widget_quick_settings_name">Ajustes rápidos</string>
528528
<string name="widget_load_error">No encontrado</string>
529529
<string name="widget_statistics_ignore_new_items">Ignorar los elementos nuevos añadidos después</string>
530+
<string name="widget_universal_open_app">Abrir aplicación</string>
530531

531532
<!-- Notification -->
532533
<string name="notification_inactivity_title">Recordatorio de inactividad</string>

0 commit comments

Comments
 (0)