diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 12c4db4..9b15933 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt index a9ba5a3..bf574f4 100755 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt @@ -121,6 +121,7 @@ object Preferences : KotprefModel() { var mediaPlayerAlbum by stringPref(default = "") var mediaPlayerArtist by stringPref(default = "") var mediaPlayerPackage by stringPref(default = "") + var musicPlayersFilter by stringPref(default = "") // Integrations var installedIntegrations by intPref(default = 0) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/MediaPlayerHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/MediaPlayerHelper.kt index e8d25af..d749e9f 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/MediaPlayerHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/MediaPlayerHelper.kt @@ -38,6 +38,8 @@ object MediaPlayerHelper { ) } catch (ex: Exception) { emptyList() + }.filter { + Preferences.musicPlayersFilter == "" || isMusicPlayerAccepted(it.packageName) } if (list.isNotEmpty()) { @@ -89,4 +91,14 @@ object MediaPlayerHelper { remove(Preferences::mediaPlayerPackage) } } + + fun isMusicPlayerAccepted(appPkg: String): Boolean = Preferences.musicPlayersFilter.contains(appPkg) + + fun toggleMusicPlayerFilter(appPkg: String) { + if (Preferences.musicPlayersFilter == "" || !Preferences.musicPlayersFilter.contains(appPkg)) { + Preferences.musicPlayersFilter = Preferences.musicPlayersFilter.split(",").union(listOf(appPkg)).joinToString(separator = ",") + } else { + Preferences.musicPlayersFilter = Preferences.musicPlayersFilter.split(",").filter { it != appPkg }.joinToString(separator = ",") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarJob.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarJob.kt index d69f6b7..18b7b21 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarJob.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarJob.kt @@ -120,7 +120,7 @@ class UpdateCalendarJob : JobIntentService() { event.startDate.compareTo(event1.startDate) } }) - + eventRepository.saveEvents( eventList ) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/MusicPlayersFilterActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/MusicPlayersFilterActivity.kt new file mode 100644 index 0000000..4b6fab2 --- /dev/null +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/MusicPlayersFilterActivity.kt @@ -0,0 +1,141 @@ +package com.tommasoberlose.anotherwidget.ui.activities + +import android.app.Activity +import android.os.Bundle +import com.tommasoberlose.anotherwidget.R +import android.content.Intent +import android.content.pm.ApplicationInfo +import android.content.pm.ResolveInfo +import android.util.Log +import android.view.View +import android.widget.ImageView +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager +import com.bumptech.glide.Glide +import com.tommasoberlose.anotherwidget.databinding.ActivityChooseApplicationBinding +import com.tommasoberlose.anotherwidget.databinding.ActivityMusicPlayersFilterBinding +import com.tommasoberlose.anotherwidget.global.Constants +import com.tommasoberlose.anotherwidget.global.Preferences +import com.tommasoberlose.anotherwidget.helpers.MediaPlayerHelper +import com.tommasoberlose.anotherwidget.ui.viewmodels.ChooseApplicationViewModel +import com.tommasoberlose.anotherwidget.ui.viewmodels.MusicPlayersFilterViewModel +import kotlinx.android.synthetic.main.activity_choose_application.* +import kotlinx.android.synthetic.main.activity_choose_application.list_view +import kotlinx.coroutines.* +import net.idik.lib.slimadapter.SlimAdapter +import kotlin.Comparator as Comparator1 + + +class MusicPlayersFilterActivity : AppCompatActivity() { + + private lateinit var adapter: SlimAdapter + private lateinit var viewModel: MusicPlayersFilterViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + viewModel = ViewModelProvider(this).get(MusicPlayersFilterViewModel::class.java) + val binding = DataBindingUtil.setContentView(this, R.layout.activity_music_players_filter) + + list_view.setHasFixedSize(true) + val mLayoutManager = LinearLayoutManager(this) + list_view.layoutManager = mLayoutManager + + adapter = SlimAdapter.create() + adapter + .register(R.layout.application_info_layout) { item, injector -> + injector + .text(R.id.text, item.loadLabel(viewModel.pm)) + .with(R.id.icon) { + Glide + .with(this) + .load(item.loadIcon(viewModel.pm)) + .centerCrop() + .into(it) + } + .visible(R.id.checkBox) + .clicked(R.id.item) { + toggleApp(item) + adapter.notifyItemRangeChanged(0, adapter.data.size) + } + .clicked(R.id.checkBox) { + toggleApp(item) + adapter.notifyItemRangeChanged(0, adapter.data.size) + } + .checked(R.id.checkBox, MediaPlayerHelper.isMusicPlayerAccepted(item.activityInfo.packageName)) + } + .attachTo(list_view) + + setupListener() + subscribeUi(binding, viewModel) + + search.requestFocus() + } + + private var filterJob: Job? = null + + private fun subscribeUi(binding: ActivityMusicPlayersFilterBinding, viewModel: MusicPlayersFilterViewModel) { + binding.viewModel = viewModel + + viewModel.appList.observe(this, Observer { + updateList(list = it) + loader.visibility = View.INVISIBLE + }) + + viewModel.searchInput.observe(this, Observer { search -> + updateList(search = search) + }) + + viewModel.musicPlayersFilter.observe(this, { + updateList() + }) + } + + private fun updateList(list: List? = viewModel.appList.value, search: String? = viewModel.searchInput.value) { + loader.visibility = View.VISIBLE + filterJob?.cancel() + filterJob = lifecycleScope.launch(Dispatchers.IO) { + if (list != null && list.isNotEmpty()) { + delay(200) + val filteredList: List = if (search == null || search == "") { + list + } else { + list.filter { + it.loadLabel(viewModel.pm).contains(search, true) + } + }.sortedWith { app1, app2 -> + if (MediaPlayerHelper.isMusicPlayerAccepted(app1.activityInfo.packageName) && MediaPlayerHelper.isMusicPlayerAccepted(app2.activityInfo.packageName)) { + app1.loadLabel(viewModel.pm).toString().compareTo(app2.loadLabel(viewModel.pm).toString(), ignoreCase = true) + } else if (MediaPlayerHelper.isMusicPlayerAccepted(app1.activityInfo.packageName)) { + -1 + } else if (MediaPlayerHelper.isMusicPlayerAccepted(app2.activityInfo.packageName)) { + 1 + } else { + app1.loadLabel(viewModel.pm).toString().compareTo(app2.loadLabel(viewModel.pm).toString(), ignoreCase = true) + } + } + + + withContext(Dispatchers.Main) { + adapter.updateData(filteredList) + loader.visibility = View.INVISIBLE + } + } + } + } + + private fun setupListener() { + action_back.setOnClickListener { + onBackPressed() + } + } + + private fun toggleApp(app: ResolveInfo) { + MediaPlayerHelper.toggleMusicPlayerFilter(app.activityInfo.packageName) + } +} diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GlanceTabFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GlanceTabFragment.kt index c8902e1..df8053a 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GlanceTabFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GlanceTabFragment.kt @@ -44,6 +44,7 @@ import com.tommasoberlose.anotherwidget.helpers.MediaPlayerHelper import com.tommasoberlose.anotherwidget.receivers.ActivityDetectionReceiver import com.tommasoberlose.anotherwidget.receivers.ActivityDetectionReceiver.Companion.FITNESS_OPTIONS import com.tommasoberlose.anotherwidget.ui.activities.MainActivity +import com.tommasoberlose.anotherwidget.ui.activities.MusicPlayersFilterActivity import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission import com.tommasoberlose.anotherwidget.utils.checkIfFitInstalled @@ -136,6 +137,9 @@ class GlanceTabFragment : Fragment() { } }) + viewModel.musicPlayersFilter.observe(viewLifecycleOwner, Observer { + + }) } private fun setupListener() { @@ -242,6 +246,10 @@ class GlanceTabFragment : Fragment() { CustomNotesDialog(requireContext()).show() } } + + action_filter_music_players.setOnClickListener { + startActivity(Intent(requireContext(), MusicPlayersFilterActivity::class.java)) + } } private fun updateNextAlarmWarningUi() { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MainViewModel.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MainViewModel.kt index c6b7354..b9c18ff 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MainViewModel.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MainViewModel.kt @@ -75,6 +75,7 @@ class MainViewModel : ViewModel() { val showBatteryCharging = Preferences.asLiveData(Preferences::showBatteryCharging) val showDailySteps = Preferences.asLiveData(Preferences::showDailySteps) val customInfo = Preferences.asLiveData(Preferences::customNotes) + val musicPlayersFilter = Preferences.asLiveData(Preferences::musicPlayersFilter) // Advanced Settings val darkThemePreference = Preferences.asLiveData(Preferences::darkThemePreference) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MusicPlayersFilterViewModel.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MusicPlayersFilterViewModel.kt new file mode 100644 index 0000000..0719c39 --- /dev/null +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MusicPlayersFilterViewModel.kt @@ -0,0 +1,38 @@ +package com.tommasoberlose.anotherwidget.ui.viewmodels + +import android.app.Application +import android.content.Intent +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager +import android.content.pm.ResolveInfo +import android.util.Log +import androidx.lifecycle.* +import com.chibatching.kotpref.livedata.asLiveData +import com.tommasoberlose.anotherwidget.global.Preferences +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class MusicPlayersFilterViewModel(application: Application) : AndroidViewModel(application) { + + val pm: PackageManager by lazy { application.packageManager } + val appList: MutableLiveData> = MutableLiveData() + val searchInput: MutableLiveData = MutableLiveData("") + var musicPlayersFilter = Preferences.asLiveData(Preferences::musicPlayersFilter) + + init { + viewModelScope.launch(Dispatchers.IO) { + val mainIntent = Intent(Intent.ACTION_MAIN, null).apply { + addCategory(Intent.CATEGORY_LAUNCHER) + } + + val app = application.packageManager.queryIntentActivities(mainIntent, 0) + val sortedApp = app.sortedWith(Comparator { app1: ResolveInfo, app2: ResolveInfo -> + app1.loadLabel(pm).toString().compareTo(app2.loadLabel(pm).toString()) + }) + withContext(Dispatchers.Main) { + appList.postValue(sortedApp) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/round_radio.png b/app/src/main/res/drawable-hdpi/round_radio.png new file mode 100644 index 0000000..84a680c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_radio.png differ diff --git a/app/src/main/res/drawable-hdpi/round_radio_white_18.png b/app/src/main/res/drawable-hdpi/round_radio_white_18.png new file mode 100644 index 0000000..65505e8 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_radio_white_18.png differ diff --git a/app/src/main/res/drawable-hdpi/round_radio_white_36.png b/app/src/main/res/drawable-hdpi/round_radio_white_36.png new file mode 100644 index 0000000..cec12ec Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_radio_white_36.png differ diff --git a/app/src/main/res/drawable-hdpi/round_radio_white_48.png b/app/src/main/res/drawable-hdpi/round_radio_white_48.png new file mode 100644 index 0000000..70a6814 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_radio_white_48.png differ diff --git a/app/src/main/res/drawable-mdpi/round_radio.png b/app/src/main/res/drawable-mdpi/round_radio.png new file mode 100644 index 0000000..30261c2 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_radio.png differ diff --git a/app/src/main/res/drawable-mdpi/round_radio_white_18.png b/app/src/main/res/drawable-mdpi/round_radio_white_18.png new file mode 100644 index 0000000..98dccb9 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_radio_white_18.png differ diff --git a/app/src/main/res/drawable-mdpi/round_radio_white_36.png b/app/src/main/res/drawable-mdpi/round_radio_white_36.png new file mode 100644 index 0000000..84a680c Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_radio_white_36.png differ diff --git a/app/src/main/res/drawable-mdpi/round_radio_white_48.png b/app/src/main/res/drawable-mdpi/round_radio_white_48.png new file mode 100644 index 0000000..4fa8c35 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_radio_white_48.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_radio.png b/app/src/main/res/drawable-xhdpi/round_radio.png new file mode 100644 index 0000000..4fa8c35 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_radio.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_radio_white_18.png b/app/src/main/res/drawable-xhdpi/round_radio_white_18.png new file mode 100644 index 0000000..84a680c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_radio_white_18.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_radio_white_36.png b/app/src/main/res/drawable-xhdpi/round_radio_white_36.png new file mode 100644 index 0000000..70a6814 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_radio_white_36.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_radio_white_48.png b/app/src/main/res/drawable-xhdpi/round_radio_white_48.png new file mode 100644 index 0000000..8f3db1c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_radio_white_48.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_radio.png b/app/src/main/res/drawable-xxhdpi/round_radio.png new file mode 100644 index 0000000..70a6814 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_radio.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_radio_white_18.png b/app/src/main/res/drawable-xxhdpi/round_radio_white_18.png new file mode 100644 index 0000000..cec12ec Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_radio_white_18.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_radio_white_36.png b/app/src/main/res/drawable-xxhdpi/round_radio_white_36.png new file mode 100644 index 0000000..5eb5aee Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_radio_white_36.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_radio_white_48.png b/app/src/main/res/drawable-xxhdpi/round_radio_white_48.png new file mode 100644 index 0000000..8cb97fa Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_radio_white_48.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_radio.png b/app/src/main/res/drawable-xxxhdpi/round_radio.png new file mode 100644 index 0000000..8f3db1c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_radio.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_radio_white_18.png b/app/src/main/res/drawable-xxxhdpi/round_radio_white_18.png new file mode 100644 index 0000000..70a6814 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_radio_white_18.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_radio_white_36.png b/app/src/main/res/drawable-xxxhdpi/round_radio_white_36.png new file mode 100644 index 0000000..8cb97fa Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_radio_white_36.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_radio_white_48.png b/app/src/main/res/drawable-xxxhdpi/round_radio_white_48.png new file mode 100644 index 0000000..14879bb Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_radio_white_48.png differ diff --git a/app/src/main/res/drawable/round_radio_24.xml b/app/src/main/res/drawable/round_radio_24.xml new file mode 100644 index 0000000..fa61e45 --- /dev/null +++ b/app/src/main/res/drawable/round_radio_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_music_players_filter.xml b/app/src/main/res/layout/activity_music_players_filter.xml new file mode 100644 index 0000000..a2efa61 --- /dev/null +++ b/app/src/main/res/layout/activity_music_players_filter.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/application_info_layout.xml b/app/src/main/res/layout/application_info_layout.xml index d3a49d6..4f40ae8 100644 --- a/app/src/main/res/layout/application_info_layout.xml +++ b/app/src/main/res/layout/application_info_layout.xml @@ -26,7 +26,8 @@ tools:ignore="HardcodedText" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_glance_settings.xml b/app/src/main/res/layout/fragment_glance_settings.xml index ac90ac8..b06f702 100644 --- a/app/src/main/res/layout/fragment_glance_settings.xml +++ b/app/src/main/res/layout/fragment_glance_settings.xml @@ -338,7 +338,7 @@ + + + + + + + Carica Providers Glance info will show up only when there are no events displayed and only when a few conditions are verified. + Player Musica + Scegli i player musical che ti interessano Condividi diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1a51a4f..518efcd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -157,6 +157,8 @@ Charged Providers Glance info will show up only when there are no events displayed and only when a few conditions are verified. + Music Players + Choose your relevant music players Share