Skip to content
Merged
Show file tree
Hide file tree
Changes from 89 commits
Commits
Show all changes
154 commits
Select commit Hold shift + click to select a range
3f0fb45
disable auto focus
Jul 14, 2025
71f2066
resolve
Jul 15, 2025
00a5f1f
change
Jul 15, 2025
4baf983
Merge branch 'develop' into disable-auto-focus
theayushyadav11 Jul 17, 2025
3edd7c9
added check
Jul 17, 2025
3eac6ca
Merge remote-tracking branch 'origin/disable-auto-focus' into disable…
Jul 17, 2025
01cf323
removed tests
Jul 18, 2025
726d53c
working overrides
Jul 18, 2025
38ec177
added debugImpl tests
Jul 21, 2025
055e88b
added fragment test
Jul 22, 2025
4dbee61
Merge remote-tracking branch 'upstream/develop' into platform-paramet…
Jul 22, 2025
af26af3
android lint fix
Jul 22, 2025
451c5e1
added kdoc
Jul 23, 2025
b0113b1
modified tests
Jul 26, 2025
8683623
added integration test
Jul 26, 2025
1652e67
added reset implementation
Jul 27, 2025
1b175ae
added kdoc
Jul 27, 2025
2052972
added debugImpl test
Jul 28, 2025
d1fe959
added UI tests
Jul 28, 2025
b50f6e1
Update PlatformParametersFragmentPresenter.kt
theayushyadav11 Jul 28, 2025
8a3459d
added and arranged tests
Jul 30, 2025
f1083ab
formatting
Jul 30, 2025
6f6b940
fixed bg color
Jul 31, 2025
64a507c
added updateflags and params tests
Jul 31, 2025
a481de8
fix
Aug 1, 2025
5e73d35
fix
Aug 1, 2025
1d7657f
fix
Aug 1, 2025
d80eb41
Merge remote-tracking branch 'upstream/platform-parameter-overridding…
Aug 1, 2025
a2b4ae8
used set
Aug 1, 2025
c13b81b
Merge remote-tracking branch 'upstream/platform-parameter-overridding…
Aug 1, 2025
97bf148
added debugImpl test
Aug 1, 2025
4a371ef
added reset for feature flags
Aug 1, 2025
76cc81e
nits
Aug 4, 2025
1b541b9
changes
Aug 6, 2025
f6aaeea
added test
Aug 6, 2025
53af914
Merge remote-tracking branch 'upstream/platform-parameter-overridding…
Aug 6, 2025
211c3e0
nits
Aug 8, 2025
b2c8c99
nits
Aug 12, 2025
90c8170
Merge branch 'platform-parameter-overridding' into reset-platform-par…
theayushyadav11 Aug 16, 2025
d6d8329
Implementing new UI
Aug 16, 2025
5d76eb4
Merge remote-tracking branch 'upstream/reset-platform-parameters' int…
Aug 16, 2025
f8ea609
added reset implementation
Jul 27, 2025
0c63c0b
added kdoc
Jul 27, 2025
f71bbd5
added debugImpl test
Jul 28, 2025
7d520b5
added debugImpl test
Aug 1, 2025
21ae39e
added reset for feature flags
Aug 1, 2025
7ec0afc
Implementing new UI
Aug 16, 2025
5994654
added night mode color
Aug 16, 2025
a4fab27
Merge remote-tracking branch 'upstream/reset-platform-parameters' int…
Aug 16, 2025
ca1c2a6
Merge branch 'develop' into platform-parameter-overridding
theayushyadav11 Aug 17, 2025
914ed9e
nits
Aug 17, 2025
9328233
nits
Aug 17, 2025
45a190c
Merge branch 'platform-parameter-overridding' into reset-platform-par…
theayushyadav11 Aug 17, 2025
3d96f2b
added reset implementation
Jul 27, 2025
0723cc0
added kdoc
Jul 27, 2025
407e1a7
added debugImpl test
Jul 28, 2025
7b3a2d0
added debugImpl test
Aug 1, 2025
7bfe3c8
added reset for feature flags
Aug 1, 2025
f82f6d9
Implementing new UI
Aug 16, 2025
01afd38
added night mode color
Aug 16, 2025
e79a732
added reset implementation
Jul 27, 2025
8fb710a
added debugImpl test
Jul 28, 2025
1677580
added reset for feature flags
Aug 1, 2025
5c93133
Implementing new UI
Aug 16, 2025
11de7bc
removed binding adapter
Aug 17, 2025
19507f8
updating functionalities
Aug 18, 2025
4e59588
Merge remote-tracking branch 'upstream/reset-platform-parameters' int…
Aug 18, 2025
3ec4a6d
Fix part of #5734: Resolve issues UselessLeaf + ObsoleteSdkInt (#5909)
manas-yu Aug 15, 2025
fad9468
nits
Aug 18, 2025
82189b4
disable auto focus
Jul 14, 2025
a5b12f3
resolve
Jul 15, 2025
f60052a
change
Jul 15, 2025
ae4203e
modified tests
Jul 26, 2025
c101fc1
changes
Aug 6, 2025
0582d31
nits
Aug 8, 2025
1270e60
nits
Aug 18, 2025
a4d925e
fix
Aug 18, 2025
43173b7
Merge remote-tracking branch 'upstream/platform-parameter-overridding…
Aug 18, 2025
edfa8a1
Merge branch 'platform-parameter-overridding' into reset-platform-par…
theayushyadav11 Aug 18, 2025
06a30a4
fix-merging
Aug 18, 2025
2e208a8
added import
Aug 18, 2025
d0d208c
Merge remote-tracking branch 'upstream/reset-platform-parameters' int…
Aug 18, 2025
7689f96
sorting
Aug 18, 2025
8785edd
nits
Aug 18, 2025
db3f6a7
modified FeatureFlagsFragmentTest
Aug 18, 2025
99c39cf
PlatformParametersFragmentTest
Aug 19, 2025
8dffeb9
added icon test
Aug 19, 2025
dc493f5
added exemptions
Aug 19, 2025
66a1081
added sorting logic
Aug 19, 2025
cc823e8
nits
Aug 19, 2025
396114a
Merge branch 'develop' into platform-parameter-overridding
theayushyadav11 Aug 20, 2025
ccf98dc
Update model/src/main/proto/arguments.proto
theayushyadav11 Aug 20, 2025
95d2087
revert
Aug 21, 2025
ff1ebca
lint
Aug 21, 2025
4954c9f
Merge branch 'platform-parameter-overridding' into reset-platform-par…
theayushyadav11 Aug 21, 2025
ba97f35
added save
theayushyadav11 Aug 26, 2025
77d32bb
kdoc
theayushyadav11 Aug 26, 2025
85d5555
Merge branch 'develop' into reset-platform-parameters
theayushyadav11 Aug 26, 2025
bb5a8f0
input field size
theayushyadav11 Aug 26, 2025
5a2669b
pending resets
theayushyadav11 Aug 26, 2025
a72e285
retest
theayushyadav11 Aug 26, 2025
db391c9
setbackground
theayushyadav11 Aug 26, 2025
11ba3eb
nits
theayushyadav11 Aug 26, 2025
f6b276d
focus-change
theayushyadav11 Aug 26, 2025
de0861a
Merge branch 'develop' into reset-platform-parameters
theayushyadav11 Aug 26, 2025
87e5aa8
platform parameters test
theayushyadav11 Aug 27, 2025
9bb0259
feature flag test
theayushyadav11 Aug 27, 2025
bb6513e
proto changes
theayushyadav11 Aug 27, 2025
ee5e4b1
fixed colors
theayushyadav11 Aug 27, 2025
f6addce
removed lint exemptions
theayushyadav11 Aug 27, 2025
332a13d
Merge branch 'develop' into reset-platform-parameters
theayushyadav11 Aug 27, 2025
ce92fb3
lint
theayushyadav11 Aug 27, 2025
da0d05f
check
theayushyadav11 Aug 28, 2025
ffc6555
feature flags screen
theayushyadav11 Aug 29, 2025
fbc453a
Merge branch 'develop' into reset-platform-parameters
theayushyadav11 Aug 29, 2025
ee3a193
platform parameters
theayushyadav11 Aug 29, 2025
01873b4
Merge remote-tracking branch 'upstream/reset-platform-parameters' int…
theayushyadav11 Aug 29, 2025
223589c
optimise
theayushyadav11 Aug 29, 2025
237d8e6
save button UI
theayushyadav11 Aug 29, 2025
a233c50
featureflagfragmenttest
theayushyadav11 Aug 29, 2025
be3dde5
tests
theayushyadav11 Aug 29, 2025
964c39f
revert
theayushyadav11 Aug 30, 2025
86e8ec1
Merge branch 'develop' into reset-platform-parameters
theayushyadav11 Sep 1, 2025
791f88f
review comments
theayushyadav11 Sep 1, 2025
b3d58cd
tests
theayushyadav11 Sep 2, 2025
65c2505
changes
theayushyadav11 Sep 2, 2025
218bf32
Restore executable permission on ktlint_lint_check.sh
theayushyadav11 Sep 2, 2025
5cb5538
review comments
theayushyadav11 Sep 3, 2025
5ea33a8
nits
theayushyadav11 Sep 3, 2025
5c20862
remove tests
theayushyadav11 Sep 3, 2025
403a7bc
Merge branch 'develop' into reset-platform-parameters
theayushyadav11 Sep 3, 2025
bc53948
focus change test
theayushyadav11 Sep 3, 2025
45fc740
Merge branch 'develop' into reset-platform-parameters
theayushyadav11 Sep 3, 2025
aa8f59d
added error test
theayushyadav11 Sep 4, 2025
bbdd464
Merge remote-tracking branch 'upstream/reset-platform-parameters' int…
theayushyadav11 Sep 4, 2025
871bf12
lint
theayushyadav11 Sep 4, 2025
bbadbaa
lint exemptions
theayushyadav11 Sep 4, 2025
7b5cf90
Merge branch 'develop' into reset-platform-parameters
theayushyadav11 Sep 4, 2025
6cf5a92
lint exemptions
theayushyadav11 Sep 4, 2025
53576aa
Merge remote-tracking branch 'upstream/reset-platform-parameters' int…
theayushyadav11 Sep 4, 2025
7c8b293
states provider change
theayushyadav11 Sep 4, 2025
d18ec0f
Merge branch 'develop' into reset-platform-parameters
theayushyadav11 Sep 4, 2025
6559ffe
merge conflicts
theayushyadav11 Sep 4, 2025
517ba06
merge conflict
theayushyadav11 Sep 4, 2025
11d2a39
kdoc
theayushyadav11 Sep 4, 2025
16671bd
Merge branch 'develop' into reset-platform-parameters
theayushyadav11 Sep 4, 2025
7ed90c5
lint exemptions
theayushyadav11 Sep 4, 2025
9cf552e
Merge remote-tracking branch 'upstream/reset-platform-parameters' int…
theayushyadav11 Sep 4, 2025
545b042
Merge branch 'develop' into reset-platform-parameters
theayushyadav11 Sep 5, 2025
0bc242f
nits
theayushyadav11 Sep 5, 2025
c41615a
Merge branch 'develop' into reset-platform-parameters
theayushyadav11 Sep 5, 2025
823d909
nits
theayushyadav11 Sep 5, 2025
f46e5aa
Merge remote-tracking branch 'upstream/reset-platform-parameters' int…
theayushyadav11 Sep 5, 2025
864658d
nits
theayushyadav11 Sep 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,4 @@ public static void setTopBackgroundDrawable(@NonNull View view, @ColorInt int co
GradientDrawable background = (GradientDrawable) view.getBackground();
background.setColor(0xff000000 | colorRgb);
}

/** Used to set a large rounded-rect background drawable with a data-bound color. */
@BindingAdapter("largeRoundedRectDrawableWithColor")
public static void setLargeBorderRadiusBackgroundDrawable(
@NonNull View view,
@ColorInt int colorRgb
) {
view.setBackgroundResource(R.drawable.rounded_rect_large_border_radius);
// The input color needs to have alpha channel prepended to it.
GradientDrawable background = (GradientDrawable) view.getBackground();
background.setColor(0xff000000 | colorRgb);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.oppia.android.app.devoptions.featureflags

import androidx.annotation.ColorInt
import androidx.databinding.ObservableField
import org.oppia.android.app.model.FeatureFlagId
import org.oppia.android.app.model.SyncStatus
Expand All @@ -24,19 +23,38 @@ class FeatureFlagItemViewModel(
val featureFlagDisplayName: ObservableField<String> =
ObservableField(getFeatureFlagDisplayName(featureFlagId))

/** The text representing the sync status of the feature flag. */
val syncStatusDisplayText: ObservableField<String> =
ObservableField(getSyncStatusText())

/**
* Callback to be invoked when the feature flag toggle is changed by the user.
* Passes the [FeatureFlagId] and the new boolean value.
*/
var onFeatureFlagToggleCallback: ((FeatureFlagId, Boolean) -> Unit)? = null

/** The background color associated with the current sync status of the feature flag. */
@ColorInt
val backgroundColor: Int = retrieveBackgroundColor().toInt()
/** Indicates whether the flag is overridden. */
val isFlagOverridden: ObservableField<Boolean> =
ObservableField(syncStatus == SyncStatus.LOCAL_OVERRIDE)

/** Tracks whether the reset button is currently enabled (clickable). */
val isResetButtonActive: ObservableField<Boolean> = ObservableField(true)

/** Message for displaying the sync details of the platform parameter. */
var syncDetails: ObservableField<String> = ObservableField(processSyncDetails())

private fun processSyncDetails(): String {
return when (syncStatus) {
SyncStatus.LOCAL_OVERRIDE ->
resourceHandler.getStringInLocale(R.string.platform_parameter_currently_overridden_message)
SyncStatus.SYNCED_FROM_SERVER -> {
// TODO(#5345): Remove this filler message once the server sync logic is implemented.
resourceHandler.getStringInLocale(R.string.platform_parameter_synced_from_server_message)
}
else ->
resourceHandler.getStringInLocale(R.string.platform_parameter_never_synced_message)
}
}

/** Indicates whether the reset button should be visible for this flag. */
val isResetAvailable: ObservableField<Boolean> =
ObservableField(syncStatus == SyncStatus.LOCAL_OVERRIDE)

/** Called when the feature flag switch is toggled in the UI. */
fun onToggleFeatureFlagSwitch() {
Expand All @@ -57,30 +75,4 @@ class FeatureFlagItemViewModel(
}
}
}

private fun getSyncStatusText(): String {
return when (syncStatus) {
SyncStatus.SYNC_STATUS_UNSPECIFIED ->
resourceHandler.getStringInLocale(R.string.feature_flag_unknown_sync_status)
SyncStatus.NOT_SYNCED_FROM_SERVER ->
resourceHandler.getStringInLocale(R.string.feature_flag_default_sync_status)
SyncStatus.SYNCED_FROM_SERVER ->
resourceHandler.getStringInLocale(R.string.feature_flag_server_sync_status)
SyncStatus.LOCAL_OVERRIDE ->
resourceHandler.getStringInLocale(R.string.feature_flag_overridden_sync_status)
else ->
resourceHandler.getStringInLocale(R.string.feature_flag_unknown_sync_status)
}
}

@ColorInt
private fun retrieveBackgroundColor(): Long {
return when (syncStatus) {
SyncStatus.SYNC_STATUS_UNSPECIFIED -> 0xFF4F4F4F
SyncStatus.NOT_SYNCED_FROM_SERVER -> 0xFFBE563C
SyncStatus.SYNCED_FROM_SERVER -> 0xFF00645C
SyncStatus.LOCAL_OVERRIDE -> 0xFFC2B71B
else -> 0xFF00645C
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class FeatureFlagsFragment : InjectableFragment() {
savedInstanceState: Bundle?
): View {
var featureFlagStates: MutableMap<FeatureFlagId, Boolean> = mutableMapOf()
var resetFlags: MutableMap<FeatureFlagId, Boolean> = mutableMapOf()
if (savedInstanceState != null) {
val args = savedInstanceState.getProto(
FEATURE_FLAGS_FRAGMENT_SAVED_STATE_KEY,
Expand All @@ -46,9 +47,15 @@ class FeatureFlagsFragment : InjectableFragment() {
featureFlagStates = args?.featureFlagStatesList
?.associate { it.id to it.overriddenValue }
?.toMutableMap() ?: mutableMapOf()
resetFlags = args?.resetFeatureFlagsList
?.associate { it.id to it.overriddenValue }
?.toMutableMap() ?: mutableMapOf()
}

return featureFlagsFragmentPresenter.handleCreateView(inflater, container, featureFlagStates)
return featureFlagsFragmentPresenter.handleCreateView(
inflater, container, featureFlagStates,
resetFlags
)
}

override fun onSaveInstanceState(outState: Bundle) {
Expand All @@ -61,9 +68,16 @@ class FeatureFlagsFragment : InjectableFragment() {
.setOverriddenValue(it.value)
.build()
}
val resetFlags = featureFlagsFragmentPresenter.resetFlags.map {
OverriddenFeatureFlag.newBuilder()
.setId(it.key)
.setOverriddenValue(it.value)
.build()
}

val proto = FeatureFlagsFragmentStateBundle.newBuilder()
.addAllFeatureFlagStates(featureFlagStates)
.addAllResetFeatureFlags(resetFlags)
.build()

outState.putProto(FEATURE_FLAGS_FRAGMENT_SAVED_STATE_KEY, proto)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import org.oppia.android.app.fragment.FragmentScope
import org.oppia.android.app.model.FeatureFlagId
import org.oppia.android.app.model.OverriddenFeatureFlag
import org.oppia.android.app.recyclerview.BindableAdapter
import org.oppia.android.app.translation.AppLanguageResourceHandler
import org.oppia.android.app.view.models.R
import org.oppia.android.domain.oppialogger.OppiaLogger
import org.oppia.android.domain.platformparameter.PlatformParameterControllerDebugImpl
import org.oppia.android.util.data.AsyncResult
Expand All @@ -24,23 +26,28 @@ import javax.inject.Inject
class FeatureFlagsFragmentPresenter @Inject constructor(
private val activity: AppCompatActivity,
private val fragment: Fragment,
private val featureFlagsViewModel: FeatureFlagsViewModel,
private val featureFlagsViewModelFactory: FeatureFlagsViewModel.Factory,
private val oppiaLogger: OppiaLogger,
private val resourceHandler: AppLanguageResourceHandler,
private val platformParameterControllerDebugImpl: PlatformParameterControllerDebugImpl,
private val singleTypeBuilderFactory: BindableAdapter.SingleTypeBuilder.Factory
) {
private lateinit var binding: FeatureFlagsFragmentBinding
private lateinit var linearLayoutManager: LinearLayoutManager
private lateinit var bindingAdapter: BindableAdapter<FeatureFlagItemViewModel>

/** List of feature flags that have been reset.. */
var resetFlags: MutableMap<FeatureFlagId, Boolean> = mutableMapOf()

/** List of feature flag switch states to be used in the fragment. */
var featureFlagStates: MutableMap<FeatureFlagId, Boolean> = mutableMapOf()

/** Called when [FeatureFlagsFragment] is created. Handles UI for the fragment. */
fun handleCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
featureFlagStates: Map<FeatureFlagId, Boolean>
featureFlagStates: Map<FeatureFlagId, Boolean>,
resetFlags: Map<FeatureFlagId, Boolean>
): View {
binding = FeatureFlagsFragmentBinding.inflate(
inflater,
Expand All @@ -56,19 +63,19 @@ class FeatureFlagsFragmentPresenter @Inject constructor(
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
onBackNavigation()
// The dispatcher can hold a reference to the host
// so we need to null it out to prevent memory leaks.
this.remove()
}
}
)

if (featureFlagStates.isNotEmpty()) {
this.featureFlagStates = featureFlagStates.toMutableMap()
}
if (resetFlags.isNotEmpty()) {
this.resetFlags = resetFlags.toMutableMap()
}
binding.apply {
this.lifecycleOwner = fragment
this.viewModel = featureFlagsViewModel
this.viewModel = featureFlagsViewModelFactory.create(resetFlags.keys.toList())
}
linearLayoutManager = LinearLayoutManager(activity.applicationContext)

Expand All @@ -91,11 +98,17 @@ class FeatureFlagsFragmentPresenter @Inject constructor(
}

private fun onBackNavigation() {
val overriddenFeatureFlags = featureFlagStates.map { (id, value) ->
OverriddenFeatureFlag.newBuilder()
.setId(id)
.setOverriddenValue(value)
.build()
val overriddenFeatureFlags: MutableList<OverriddenFeatureFlag> = mutableListOf()

featureFlagStates.map { (id, value) ->
if (resetFlags[id] != value) {
overriddenFeatureFlags.add(
OverriddenFeatureFlag.newBuilder()
.setId(id)
.setOverriddenValue(value)
.build()
)
}
}

platformParameterControllerDebugImpl
Expand All @@ -104,15 +117,15 @@ class FeatureFlagsFragmentPresenter @Inject constructor(
is AsyncResult.Success -> (activity as FeatureFlagsActivity).finish()
is AsyncResult.Failure -> {
oppiaLogger.e(
"PlatformParametersFragmentPresenter",
"FeatureFlagsFragmentPresenter",
"Failed to override feature flags: ",
it.error
)
}

is AsyncResult.Pending -> {} // Wait for a result.
}
}
(activity as FeatureFlagsActivity).finish()
}

private fun bindFeatureFlagItem(
Expand All @@ -121,15 +134,52 @@ class FeatureFlagsFragmentPresenter @Inject constructor(
) {
binding.viewModel = model

binding.resetButton.setOnClickListener {
handleResetFeatureFlag(model)
}
if (resetFlags.containsKey(model.featureFlagId)) {
model.isFlagOverridden.set(true)
model.isResetButtonActive.set(false)
}

if (featureFlagStates.containsKey(model.featureFlagId)) {
model.isChecked.set(featureFlagStates[model.featureFlagId])
}
model.onFeatureFlagToggleCallback = { id, value ->
if (model.currentValue == value) {
if (model.currentValue == value && !resetFlags.containsKey(id)) {
featureFlagStates.remove(id)
} else {
featureFlagStates[id] = value
}
}
}

private fun handleResetFeatureFlag(
model: FeatureFlagItemViewModel
) {
platformParameterControllerDebugImpl
.resetFeatureFlag(model.featureFlagId)
.toLiveData()
.observe(fragment) { restoredFlagValue ->
when (restoredFlagValue) {
is AsyncResult.Success -> {
resetFlags[model.featureFlagId] = restoredFlagValue.value
featureFlagStates[model.featureFlagId] = restoredFlagValue.value
model.isChecked.set(restoredFlagValue.value)
model.isResetButtonActive.set(false)
// TODO(#5345): Remove this filler message once the server sync logic is implemented.
model.syncDetails.set(
resourceHandler.getStringInLocale(R.string.platform_parameter_never_synced_message)
)
}
is AsyncResult.Failure -> {
oppiaLogger.e(
"FeatureFlagsFragmentPresenter",
"Failed to reset feature flag: ${model.featureFlagId}", restoredFlagValue.error
)
}
is AsyncResult.Pending -> {} // No action required
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@ package org.oppia.android.app.devoptions.featureflags

import androidx.lifecycle.LiveData
import androidx.lifecycle.Transformations
import org.oppia.android.app.devoptions.platformparameters.PlatformParametersViewModel
import org.oppia.android.app.fragment.FragmentScope
import org.oppia.android.app.model.EphemeralFeatureFlag
import org.oppia.android.app.model.FeatureFlagId
import org.oppia.android.app.model.SyncStatus
import org.oppia.android.app.translation.AppLanguageResourceHandler
import org.oppia.android.app.viewmodel.ObservableViewModel
import org.oppia.android.domain.platformparameter.PlatformParameterControllerDebugImpl
Expand All @@ -17,10 +20,11 @@ import javax.inject.Inject
* [FeatureFlagItemViewModel] which in turn display the available feature flags.
*/
@FragmentScope
class FeatureFlagsViewModel @Inject constructor(
class FeatureFlagsViewModel private constructor(
private val platformParameterControllerDebugImpl: PlatformParameterControllerDebugImpl,
private val machineLocale: OppiaLocale.MachineLocale,
private val resourceHandler: AppLanguageResourceHandler
private val resourceHandler: AppLanguageResourceHandler,
private val resetFlagsList: List<FeatureFlagId>
) : ObservableViewModel() {
private val ephemeralFlagsLiveData: LiveData<List<EphemeralFeatureFlag>> by lazy {
Transformations.map(
Expand All @@ -41,7 +45,13 @@ class FeatureFlagsViewModel @Inject constructor(
result: AsyncResult<List<EphemeralFeatureFlag>>
): List<EphemeralFeatureFlag> {
return when (result) {
is AsyncResult.Success -> result.value
is AsyncResult.Success -> {
result.value.sortedWith(
compareByDescending<EphemeralFeatureFlag> {
it.syncStatus == SyncStatus.LOCAL_OVERRIDE || resetFlagsList.contains(it.id)
}.thenBy { it.id.name }
)
}
else -> emptyList()
}
}
Expand All @@ -58,4 +68,21 @@ class FeatureFlagsViewModel @Inject constructor(
)
}
}

/** Factory for creating instances of [FeatureFlagsViewModel]. */
class Factory @Inject constructor(
private val platformParameterControllerDebugImpl: PlatformParameterControllerDebugImpl,
private val machineLocale: OppiaLocale.MachineLocale,
private val resourceHandler: AppLanguageResourceHandler
) {
/** Creates a new [PlatformParametersViewModel]. */
fun create(resetFlagsList: List<FeatureFlagId>): FeatureFlagsViewModel {
return FeatureFlagsViewModel(
platformParameterControllerDebugImpl,
machineLocale,
resourceHandler,
resetFlagsList
)
}
}
}
Loading
Loading