diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt index 25e6d2d65..9aa25a49a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt @@ -18,9 +18,11 @@ import android.content.Context import android.content.res.Resources import android.os.Bundle import android.os.Handler +import android.os.Looper import android.view.KeyEvent import android.view.View import androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode +import androidx.core.graphics.ColorUtils import androidx.core.os.ConfigurationCompat import code.name.monkey.appthemehelper.common.ATHToolbarActivity import code.name.monkey.appthemehelper.util.VersionUtils @@ -28,12 +30,13 @@ import code.name.monkey.retromusic.LanguageContextWrapper import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.* import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.util.theme.ThemeManager +import code.name.monkey.retromusic.util.theme.getNightMode +import code.name.monkey.retromusic.util.theme.getThemeResValue import java.util.* abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { - private val handler = Handler() + private val handler = Handler(Looper.getMainLooper()) override fun onCreate(savedInstanceState: Bundle?) { updateTheme() @@ -50,9 +53,9 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { } private fun updateTheme() { - setTheme(ThemeManager.getThemeResValue()) + setTheme(getThemeResValue()) if (PreferenceUtil.materialYou) { - setDefaultNightMode(ThemeManager.getNightMode()) + setDefaultNightMode(getNightMode()) } if (PreferenceUtil.isCustomFont) { diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetCard.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetCard.kt index ee3e1c990..a6e6524b9 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetCard.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetCard.kt @@ -206,7 +206,7 @@ class AppWidgetCard : BaseAppWidget() { ) ) - val image = getAlbumArtDrawable(service.resources, bitmap) + val image = getAlbumArtDrawable(service, bitmap) val roundedBitmap = createRoundedBitmap( image, imageSize, imageSize, cardRadius, 0F, cardRadius, 0F ) diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetClassic.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetClassic.kt index 87cacc283..e6db7985a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetClassic.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetClassic.kt @@ -190,7 +190,7 @@ class AppWidgetClassic : BaseAppWidget() { ) ) - val image = getAlbumArtDrawable(service.resources, bitmap) + val image = getAlbumArtDrawable(service, bitmap) val roundedBitmap = createRoundedBitmap( image, diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetMD3.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetMD3.kt index 0ce4ebf28..9be2d108d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetMD3.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetMD3.kt @@ -207,7 +207,7 @@ class AppWidgetMD3 : BaseAppWidget() { ) ) - val image = getAlbumArtDrawable(service.resources, bitmap) + val image = getAlbumArtDrawable(service, bitmap) val roundedBitmap = createRoundedBitmap( image, imageSize, diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetSmall.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetSmall.kt index 3a92daa1e..42677486e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetSmall.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetSmall.kt @@ -182,7 +182,7 @@ class AppWidgetSmall : BaseAppWidget() { ) ) - val image = getAlbumArtDrawable(service.resources, bitmap) + val image = getAlbumArtDrawable(service, bitmap) val roundedBitmap = createRoundedBitmap( image, imageSize, imageSize, cardRadius, 0f, 0f, 0f ) diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetText.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetText.kt index 76bbc77c5..c8005768d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetText.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetText.kt @@ -22,7 +22,6 @@ import android.view.View import android.widget.RemoteViews import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.util.VersionUtils -import code.name.monkey.retromusic.App import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.MainActivity import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget @@ -134,8 +133,8 @@ class AppWidgetText : BaseAppWidget() { appWidgetView.setImageViewBitmap( R.id.button_toggle_play_pause, createBitmap( RetroUtil.getTintedVectorDrawable( - App.getContext(), playPauseRes, ContextCompat.getColor( - App.getContext(), R.color.md_white_1000 + service, playPauseRes, ContextCompat.getColor( + service, R.color.md_white_1000 ) ), 1f ) @@ -143,10 +142,11 @@ class AppWidgetText : BaseAppWidget() { appWidgetView.setImageViewBitmap( R.id.button_next, createBitmap( RetroUtil.getTintedVectorDrawable( - App.getContext(), + service, R.drawable.ic_skip_next, ContextCompat.getColor( - App.getContext(), R.color.md_white_1000 + service, + R.color.md_white_1000 ) ), 1f ) @@ -154,10 +154,10 @@ class AppWidgetText : BaseAppWidget() { appWidgetView.setImageViewBitmap( R.id.button_prev, createBitmap( RetroUtil.getTintedVectorDrawable( - App.getContext(), + service, R.drawable.ic_skip_previous, ContextCompat.getColor( - App.getContext(), R.color.md_white_1000 + service, R.color.md_white_1000 ) ), 1f ) diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/base/BaseAppWidget.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/base/BaseAppWidget.kt index a95c35a7e..bd5ee4aad 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/base/BaseAppWidget.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/base/BaseAppWidget.kt @@ -20,7 +20,6 @@ import android.appwidget.AppWidgetProvider import android.content.ComponentName import android.content.Context import android.content.Intent -import android.content.res.Resources import android.graphics.* import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable @@ -116,11 +115,11 @@ abstract class BaseAppWidget : AppWidgetProvider() { abstract fun performUpdate(service: MusicService, appWidgetIds: IntArray?) - protected fun getAlbumArtDrawable(resources: Resources, bitmap: Bitmap?): Drawable { + protected fun getAlbumArtDrawable(context: Context, bitmap: Bitmap?): Drawable { return if (bitmap == null) { - ContextCompat.getDrawable(App.getContext(), R.drawable.default_audio_art)!! + ContextCompat.getDrawable(context, R.drawable.default_audio_art)!! } else { - BitmapDrawable(resources, bitmap) + BitmapDrawable(context.resources, bitmap) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/backup/RestoreActivity.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/backup/RestoreActivity.kt index 73983765b..c5e554533 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/backup/RestoreActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/backup/RestoreActivity.kt @@ -10,12 +10,17 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.core.view.updateLayoutParams import androidx.lifecycle.lifecycleScope +import code.name.monkey.retromusic.R import code.name.monkey.retromusic.databinding.ActivityRestoreBinding +import code.name.monkey.retromusic.extensions.accentColor +import code.name.monkey.retromusic.extensions.accentOutlineColor +import code.name.monkey.retromusic.extensions.addAccentColor import code.name.monkey.retromusic.helper.BackupContent import code.name.monkey.retromusic.helper.BackupContent.* import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.util.theme.ThemeManager +import code.name.monkey.retromusic.util.theme.getNightMode import com.google.android.material.color.DynamicColors +import com.google.android.material.color.DynamicColorsOptions import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -33,15 +38,21 @@ class RestoreActivity : AppCompatActivity() { setWidth() val backupUri = intent?.data binding.backupName.setText(getFileName(backupUri)) + binding.cancelButton.accentOutlineColor() binding.cancelButton.setOnClickListener { finish() } + binding.restoreButton.accentColor() + binding.checkArtistImages.addAccentColor() + binding.checkDatabases.addAccentColor() + binding.checkSettings.addAccentColor() + binding.checkUserImages.addAccentColor() binding.restoreButton.setOnClickListener { val backupContents = mutableListOf() - if (binding.checkSettings.isChecked) backupContents.add(SETTINGS) if (binding.checkDatabases.isChecked) backupContents.add(PLAYLISTS) if (binding.checkArtistImages.isChecked) backupContents.add(CUSTOM_ARTIST_IMAGES) - if (binding.checkUserImages.isChecked) backupContents.add(USER_IMAGES) + if (binding.checkSettings.isChecked) backupContents.add(SETTINGS) + if (binding.checkUserImages.isChecked) backupContents.add(SETTINGS) lifecycleScope.launch(Dispatchers.IO) { if (backupUri != null) { contentResolver.openInputStream(backupUri)?.use { @@ -53,13 +64,15 @@ class RestoreActivity : AppCompatActivity() { } private fun updateTheme() { - AppCompatDelegate.setDefaultNightMode(ThemeManager.getNightMode()) + AppCompatDelegate.setDefaultNightMode(getNightMode()) // Apply dynamic colors to activity if enabled if (PreferenceUtil.materialYou) { - DynamicColors.applyIfAvailable( + DynamicColors.applyToActivityIfAvailable( this, - com.google.android.material.R.style.ThemeOverlay_Material3_DynamicColors_DayNight + DynamicColorsOptions.Builder() + .setThemeOverlay(R.style.ThemeOverlay_Material3_DynamicColors_DayNight) + .build() ) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt index 63d3848ae..2eb564a6f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt @@ -205,7 +205,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder), return@setOnMenuItemClickListener true } R.id.action_add_to_blacklist -> { - BlacklistStore.getInstance(App.getContext()).addPath(file) + BlacklistStore.getInstance(requireContext()).addPath(file) return@setOnMenuItemClickListener true } R.id.action_set_as_start_directory -> { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt index c8794f149..5f4043521 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt @@ -49,6 +49,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.IScrollHelper import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtil.userName import com.google.android.gms.cast.framework.CastButtonFactory import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.transition.MaterialFadeThrough @@ -67,7 +68,7 @@ class HomeFragment : mainActivity.setSupportActionBar(binding.toolbar) mainActivity.supportActionBar?.title = null setupListeners() - binding.titleWelcome.text = String.format("%s", PreferenceUtil.userName) + binding.titleWelcome.text = String.format("%s", userName) enterTransition = MaterialFadeThrough().addTarget(binding.contentContainer) reenterTransition = MaterialFadeThrough().addTarget(binding.contentContainer) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt index 7844a9ab4..3a486df02 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt @@ -15,7 +15,6 @@ package code.name.monkey.retromusic.fragments.other import android.app.Activity -import android.content.Intent import android.graphics.Bitmap import android.graphics.Color import android.net.Uri @@ -24,6 +23,8 @@ import android.view.LayoutInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts import androidx.core.view.doOnPreDraw import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment @@ -40,7 +41,7 @@ import code.name.monkey.retromusic.fragments.LibraryViewModel import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension import code.name.monkey.retromusic.util.ImageUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtil.userName import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.DiskCacheStrategy @@ -83,7 +84,7 @@ class UserInfoFragment : Fragment() { binding.nameContainer.accentColor() binding.next.accentColor() - binding.name.setText(PreferenceUtil.userName) + binding.name.setText(userName) binding.userImage.setOnClickListener { showUserImageOptions() @@ -99,7 +100,7 @@ class UserInfoFragment : Fragment() { showToast("Your name can't be empty!") return@setOnClickListener } - PreferenceUtil.userName = nameString + userName = nameString findNavController().navigateUp() } @@ -178,7 +179,9 @@ class UserInfoFragment : Fragment() { .compress(1440) .provider(ImageProvider.GALLERY) .crop(16f, 9f) - .start(PICK_BANNER_REQUEST) + .createIntent { + startForBannerImageResult.launch(it) + } } private fun pickNewPhoto() { @@ -186,21 +189,40 @@ class UserInfoFragment : Fragment() { .provider(ImageProvider.GALLERY) .cropSquare() .compress(1440) - .start(PICK_IMAGE_REQUEST) + .createIntent { + startForProfileImageResult.launch(it) + } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK && requestCode == PICK_IMAGE_REQUEST) { - val fileUri = data?.data - fileUri?.let { setAndSaveUserImage(it) } - } else if (resultCode == Activity.RESULT_OK && requestCode == PICK_BANNER_REQUEST) { - val fileUri = data?.data - fileUri?.let { setAndSaveBannerImage(it) } - } else if (resultCode == ImagePicker.RESULT_ERROR) { - showToast(ImagePicker.getError(data)) - } else { - showToast("Task Cancelled") + private val startForProfileImageResult = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + saveImage(result) { fileUri -> + setAndSaveUserImage(fileUri) + } + } + + private val startForBannerImageResult = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + saveImage(result) { fileUri -> + setAndSaveBannerImage(fileUri) + } + } + + private fun saveImage(result: ActivityResult, doIfResultOk: (uri: Uri) -> Unit) { + val resultCode = result.resultCode + val data = result.data + when (resultCode) { + Activity.RESULT_OK -> { + data?.data?.let { uri -> + doIfResultOk(uri) + } + } + ImagePicker.RESULT_ERROR -> { + showToast(ImagePicker.getError(data)) + } + else -> { + showToast("Task Cancelled") + } } } @@ -288,6 +310,7 @@ class UserInfoFragment : Fragment() { _binding = null } + companion object { private const val PICK_IMAGE_REQUEST = 9002 private const val PICK_BANNER_REQUEST = 9004 diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt index 26dfe7a8c..7c1d48847 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt @@ -124,7 +124,7 @@ object SongMenuHelper : KoinComponent { return true } R.id.action_add_to_blacklist -> { - BlacklistStore.getInstance(App.getContext()).addPath(File(song.data)) + BlacklistStore.getInstance(activity).addPath(File(song.data)) libraryViewModel.forceReload(ReloadType.Songs) return true } diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt index 6c47487e5..c3283be21 100644 --- a/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt @@ -24,7 +24,6 @@ import androidx.core.graphics.BlendModeCompat.SRC_IN import androidx.core.text.parseAsHtml import androidx.fragment.app.DialogFragment import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEDialogPreference -import code.name.monkey.retromusic.App import code.name.monkey.retromusic.R import code.name.monkey.retromusic.dialogs.BlacklistFolderChooserDialog import code.name.monkey.retromusic.extensions.accentTextColor @@ -90,7 +89,7 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog ).parseAsHtml() ) .setPositiveButton(R.string.remove_action) { _, _ -> - BlacklistStore.getInstance(App.getContext()) + BlacklistStore.getInstance(requireContext()) .removePath(File(paths[which])) refreshBlacklistData() } @@ -119,13 +118,13 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog private lateinit var paths: ArrayList private fun refreshBlacklistData() { - this.paths = BlacklistStore.getInstance(App.getContext()).paths + this.paths = BlacklistStore.getInstance(requireContext()).paths val dialog = dialog as MaterialAlertDialogBuilder? dialog?.setItems(paths.toTypedArray(), null) } override fun onFolderSelection(dialog: BlacklistFolderChooserDialog, folder: File) { - BlacklistStore.getInstance(App.getContext()).addPath(folder) + BlacklistStore.getInstance(requireContext()).addPath(folder) refreshBlacklistData() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt index 326384006..614a2f519 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt @@ -6,6 +6,7 @@ import android.net.ConnectivityManager import androidx.core.content.edit import androidx.core.content.getSystemService import androidx.core.content.res.use +import androidx.fragment.app.Fragment import androidx.preference.PreferenceManager import androidx.viewpager.widget.ViewPager import code.name.monkey.appthemehelper.util.VersionUtils @@ -98,10 +99,10 @@ object PreferenceUtil { val languageCode: String get() = sharedPreferences.getString(LANGUAGE_NAME, "auto") ?: "auto" - var userName + var Fragment.userName get() = sharedPreferences.getString( USER_NAME, - App.getContext().getString(R.string.user_name) + getString(R.string.user_name) ) set(value) = sharedPreferences.edit { putString(USER_NAME, value) diff --git a/app/src/main/java/code/name/monkey/retromusic/util/theme/ThemeManager.kt b/app/src/main/java/code/name/monkey/retromusic/util/theme/ThemeManager.kt index 1f69fbc4f..39da2f4c2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/theme/ThemeManager.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/theme/ThemeManager.kt @@ -1,31 +1,28 @@ package code.name.monkey.retromusic.util.theme +import android.content.Context import androidx.annotation.StyleRes import androidx.appcompat.app.AppCompatDelegate -import code.name.monkey.retromusic.App import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.generalThemeValue import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.theme.ThemeMode.* -object ThemeManager { - - @StyleRes - fun getThemeResValue(): Int = - if (PreferenceUtil.materialYou) { - R.style.Theme_RetroMusic_MD3 - } else { - when (App.getContext().generalThemeValue) { - LIGHT -> R.style.Theme_RetroMusic_Light - DARK -> R.style.Theme_RetroMusic_Base - BLACK -> R.style.Theme_RetroMusic_Black - AUTO -> R.style.Theme_RetroMusic_FollowSystem - } +@StyleRes +fun Context.getThemeResValue(): Int = + if (PreferenceUtil.materialYou) { + R.style.Theme_RetroMusic_MD3 + } else { + when (generalThemeValue) { + LIGHT -> R.style.Theme_RetroMusic_Light + DARK -> R.style.Theme_RetroMusic_Base + BLACK -> R.style.Theme_RetroMusic_Black + AUTO -> R.style.Theme_RetroMusic_FollowSystem } - - fun getNightMode(): Int = when (App.getContext().generalThemeValue) { - LIGHT -> AppCompatDelegate.MODE_NIGHT_NO - DARK -> AppCompatDelegate.MODE_NIGHT_YES - else -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM } + +fun Context.getNightMode(): Int = when (generalThemeValue) { + LIGHT -> AppCompatDelegate.MODE_NIGHT_NO + DARK -> AppCompatDelegate.MODE_NIGHT_YES + else -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM } \ No newline at end of file