Change music fragment to at a glance

This commit is contained in:
Tommaso Berlose 2020-05-08 18:55:08 +02:00
parent f8f8a8f051
commit d08ad6171e
19 changed files with 113 additions and 185 deletions

Binary file not shown.

View File

@ -18,8 +18,8 @@ android {
applicationId "com.tommasoberlose.anotherwidget" applicationId "com.tommasoberlose.anotherwidget"
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 29 targetSdkVersion 29
versionCode 78 versionCode 80
versionName "2.0.5" versionName "2.0.6"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }

View File

@ -15,7 +15,7 @@ class ViewPagerAdapter(fragmentActivity: FragmentActivity) :
1 -> CalendarTabFragment.newInstance() 1 -> CalendarTabFragment.newInstance()
2 -> WeatherTabFragment.newInstance() 2 -> WeatherTabFragment.newInstance()
3 -> ClockTabFragment.newInstance() 3 -> ClockTabFragment.newInstance()
4 -> MusicTabFragment.newInstance() 4 -> AtAGlanceTabFragment.newInstance()
else -> GeneralTabFragment.newInstance() else -> GeneralTabFragment.newInstance()
} }
} }

View File

@ -1,52 +1,40 @@
package com.tommasoberlose.anotherwidget.ui.fragments package com.tommasoberlose.anotherwidget.ui.fragments
import android.Manifest import android.app.AlarmManager
import android.app.Activity import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build import android.content.IntentFilter
import android.content.pm.PackageManager
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.chibatching.kotpref.bulk
import com.karumi.dexter.Dexter
import com.karumi.dexter.MultiplePermissionsReport
import com.karumi.dexter.PermissionToken
import com.karumi.dexter.listener.PermissionRequest
import com.karumi.dexter.listener.multi.MultiplePermissionsListener
import com.tommasoberlose.anotherwidget.R import com.tommasoberlose.anotherwidget.R
import com.tommasoberlose.anotherwidget.components.BottomSheetMenu import com.tommasoberlose.anotherwidget.components.BottomSheetMenu
import com.tommasoberlose.anotherwidget.databinding.FragmentMusicSettingsBinding import com.tommasoberlose.anotherwidget.databinding.FragmentAtAGlanceSettingsBinding
import com.tommasoberlose.anotherwidget.databinding.FragmentWeatherSettingsBinding
import com.tommasoberlose.anotherwidget.global.Constants
import com.tommasoberlose.anotherwidget.global.Preferences import com.tommasoberlose.anotherwidget.global.Preferences
import com.tommasoberlose.anotherwidget.global.RequestCode import com.tommasoberlose.anotherwidget.helpers.AlarmHelper
import com.tommasoberlose.anotherwidget.helpers.MediaPlayerHelper import com.tommasoberlose.anotherwidget.helpers.MediaPlayerHelper
import com.tommasoberlose.anotherwidget.helpers.SettingsStringHelper
import com.tommasoberlose.anotherwidget.receivers.WeatherReceiver
import com.tommasoberlose.anotherwidget.ui.activities.ChooseApplicationActivity
import com.tommasoberlose.anotherwidget.ui.activities.CustomLocationActivity
import com.tommasoberlose.anotherwidget.ui.activities.MainActivity import com.tommasoberlose.anotherwidget.ui.activities.MainActivity
import com.tommasoberlose.anotherwidget.ui.activities.WeatherProviderActivity
import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget import kotlinx.android.synthetic.main.fragment_at_a_glance_settings.*
import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission import kotlinx.android.synthetic.main.fragment_at_a_glance_settings.scrollView
import kotlinx.android.synthetic.main.fragment_music_settings.*
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.lang.Exception
class MusicTabFragment : Fragment() { class AtAGlanceTabFragment : Fragment() {
companion object { companion object {
fun newInstance() = MusicTabFragment() fun newInstance() = AtAGlanceTabFragment()
} }
private lateinit var viewModel: MainViewModel private lateinit var viewModel: MainViewModel
@ -61,7 +49,7 @@ class MusicTabFragment : Fragment() {
): View { ): View {
viewModel = ViewModelProvider(activity as MainActivity).get(MainViewModel::class.java) viewModel = ViewModelProvider(activity as MainActivity).get(MainViewModel::class.java)
val binding = DataBindingUtil.inflate<FragmentMusicSettingsBinding>(inflater, R.layout.fragment_music_settings, container, false) val binding = DataBindingUtil.inflate<FragmentAtAGlanceSettingsBinding>(inflater, R.layout.fragment_at_a_glance_settings, container, false)
subscribeUi(binding, viewModel) subscribeUi(binding, viewModel)
@ -75,23 +63,20 @@ class MusicTabFragment : Fragment() {
super.onActivityCreated(savedInstanceState) super.onActivityCreated(savedInstanceState)
setupListener() setupListener()
updateNextAlarmWarningUi()
} }
private fun subscribeUi( private fun subscribeUi(
binding: FragmentMusicSettingsBinding, binding: FragmentAtAGlanceSettingsBinding,
viewModel: MainViewModel viewModel: MainViewModel
) { ) {
viewModel.showMusic.observe(viewLifecycleOwner, Observer { viewModel.showMusic.observe(viewLifecycleOwner, Observer {
binding.isMusicVisible = Preferences.showMusic
checkNotificationPermission() checkNotificationPermission()
}) })
viewModel.mediaInfoFormat.observe(viewLifecycleOwner, Observer { viewModel.showNextAlarm.observe(viewLifecycleOwner, Observer {
maintainScrollPosition { updateNextAlarmWarningUi()
label_music_info_format?.text =
if (it != "") it else getString(R.string.default_weather_app)
}
}) })
} }
@ -100,15 +85,51 @@ class MusicTabFragment : Fragment() {
Preferences.showMusic = !Preferences.showMusic Preferences.showMusic = !Preferences.showMusic
} }
action_music_info_format.setOnClickListener { action_show_next_alarm.setOnClickListener {
if (Preferences.showMusic) { BottomSheetMenu<Boolean>(requireContext(), header = getString(R.string.settings_show_next_alarm_title)).setSelectedValue(Preferences.showNextAlarm)
// startActivityForResult( .addItem(getString(R.string.settings_visible), true)
// Intent(requireContext(), WeatherProviderActivity::class.java), .addItem(getString(R.string.settings_not_visible), false)
// RequestCode.WEATHER_PROVIDER_REQUEST_CODE.code .addOnSelectItemListener { value ->
// ) Preferences.showNextAlarm = value
}.show()
}
}
private fun updateNextAlarmWarningUi() {
with(requireContext().getSystemService(Context.ALARM_SERVICE) as AlarmManager) {
val alarm = nextAlarmClock
if (AlarmHelper.isAlarmProbablyWrong(requireContext()) && alarm != null && alarm.showIntent != null) {
val pm = requireContext().packageManager as PackageManager
val appNameOrPackage = try {
pm.getApplicationLabel(pm.getApplicationInfo(alarm.showIntent?.creatorPackage ?: "", 0))
} catch (e: Exception) {
alarm.showIntent?.creatorPackage ?: ""
}
show_next_alarm_warning.text = getString(R.string.next_alarm_warning).format(appNameOrPackage)
} else {
maintainScrollPosition {
show_next_alarm_label?.text = if (Preferences.showNextAlarm) getString(R.string.settings_visible) else getString(
R.string.settings_not_visible)
}
}
} }
} }
private val nextAlarmChangeBroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
updateNextAlarmWarningUi()
}
}
override fun onStart() {
super.onStart()
activity?.registerReceiver(nextAlarmChangeBroadcastReceiver, IntentFilter(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED))
}
override fun onStop() {
activity?.unregisterReceiver(nextAlarmChangeBroadcastReceiver)
super.onStop()
} }
private fun checkNotificationPermission() { private fun checkNotificationPermission() {

View File

@ -79,7 +79,6 @@ class ClockTabFragment : Fragment() {
} }
} }
setupListener() setupListener()
updateNextAlarmWarningUi()
} }
private fun subscribeUi( private fun subscribeUi(
@ -138,10 +137,6 @@ class ClockTabFragment : Fragment() {
} }
}) })
viewModel.showNextAlarm.observe(viewLifecycleOwner, Observer {
updateNextAlarmWarningUi()
})
viewModel.clockAppName.observe(viewLifecycleOwner, Observer { viewModel.clockAppName.observe(viewLifecycleOwner, Observer {
maintainScrollPosition { maintainScrollPosition {
clock_app_label?.text = clock_app_label?.text =
@ -204,50 +199,6 @@ class ClockTabFragment : Fragment() {
) )
} }
} }
action_show_next_alarm.setOnClickListener {
BottomSheetMenu<Boolean>(requireContext(), header = getString(R.string.settings_show_next_alarm_title)).setSelectedValue(Preferences.showNextAlarm)
.addItem(getString(R.string.settings_visible), true)
.addItem(getString(R.string.settings_not_visible), false)
.addOnSelectItemListener { value ->
Preferences.showNextAlarm = value
}.show()
}
}
private fun updateNextAlarmWarningUi() {
with(requireContext().getSystemService(Context.ALARM_SERVICE) as AlarmManager) {
val alarm = nextAlarmClock
if (AlarmHelper.isAlarmProbablyWrong(requireContext()) && alarm != null && alarm.showIntent != null) {
val pm = requireContext().packageManager as PackageManager
val appNameOrPackage = try {
pm.getApplicationLabel(pm.getApplicationInfo(alarm.showIntent?.creatorPackage ?: "", 0))
} catch (e: Exception) {
alarm.showIntent?.creatorPackage ?: ""
}
show_next_alarm_warning.text = getString(R.string.next_alarm_warning).format(appNameOrPackage)
} else {
maintainScrollPosition {
show_next_alarm_label?.text = if (Preferences.showNextAlarm) getString(R.string.settings_visible) else getString(R.string.settings_not_visible)
}
}
}
}
private val nextAlarmChangeBroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
updateNextAlarmWarningUi()
}
}
override fun onStart() {
super.onStart()
activity?.registerReceiver(nextAlarmChangeBroadcastReceiver, IntentFilter(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED))
}
override fun onStop() {
activity?.unregisterReceiver(nextAlarmChangeBroadcastReceiver)
super.onStop()
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

View File

@ -85,7 +85,7 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList
1 -> getString(R.string.settings_calendar_title) 1 -> getString(R.string.settings_calendar_title)
2 -> getString(R.string.settings_weather_title) 2 -> getString(R.string.settings_weather_title)
3 -> getString(R.string.settings_clock_title) 3 -> getString(R.string.settings_clock_title)
4 -> getString(R.string.settings_music_title) 4 -> getString(R.string.settings_at_a_glance_title)
else -> "" else -> ""
} }
}.attach() }.attach()

View File

@ -4,9 +4,6 @@
<variable <variable
name="viewModel" name="viewModel"
type="com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel" /> type="com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel" />
<variable
name="isMusicVisible"
type="Boolean" />
</data> </data>
<ScrollView <ScrollView
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
@ -75,12 +72,6 @@
android:text="@string/action_grant_permission"/> android:text="@string/action_grant_permission"/>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/weather_settings"
android:alpha="@{isMusicVisible ? 1f : 0.2f, default=1}"
android:orientation="vertical">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -92,17 +83,16 @@
android:focusable="true" android:focusable="true"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical" android:gravity="center_vertical"
android:id="@+id/action_music_info_format" android:id="@+id/action_show_next_alarm"
android:orientation="horizontal"> android:orientation="horizontal">
<ImageView <ImageView
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp" android:layout_height="48dp"
android:padding="12dp" android:padding="12dp"
android:src="@drawable/round_queue_music" android:src="@drawable/round_alarm"
android:tint="@color/colorPrimaryText"/> android:tint="@color/colorPrimaryText"/>
<LinearLayout <LinearLayout
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="8dp" android:paddingLeft="8dp"
android:paddingRight="8dp" android:paddingRight="8dp"
@ -111,13 +101,20 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title" style="@style/AnotherWidget.Settings.Title"
android:text="@string/settings_song_info_format_title"/> android:text="@string/settings_show_next_alarm_title"/>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/label_music_info_format" android:id="@+id/show_next_alarm_label"
style="@style/AnotherWidget.Settings.Subtitle"/> style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title"
android:textSize="14sp"
android:visibility="gone"
android:id="@+id/show_next_alarm_warning"
android:textColor="@color/warningColorText" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -253,51 +253,6 @@
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_show_next_alarm"
android:orientation="horizontal">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:src="@drawable/round_alarm"
android:tint="@color/colorPrimaryText"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title"
android:text="@string/settings_show_next_alarm_title"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/show_next_alarm_label"
style="@style/AnotherWidget.Settings.Subtitle"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title"
android:textSize="14sp"
android:visibility="gone"
android:id="@+id/show_next_alarm_warning"
android:textColor="@color/warningColorText" />
</LinearLayout>
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@ -214,4 +214,5 @@
<string name="settings_show_music_disabled_subtitle">Playing song info hidden</string> <string name="settings_show_music_disabled_subtitle">Playing song info hidden</string>
<string name="settings_song_info_format_title">Song info format</string> <string name="settings_song_info_format_title">Song info format</string>
<string name="settings_request_notification_access">We need the notification access permission to check the current playing song.</string> <string name="settings_request_notification_access">We need the notification access permission to check the current playing song.</string>
<string name="settings_at_a_glance_title">At a Glance</string>
</resources> </resources>

View File

@ -194,4 +194,5 @@
<string name="settings_show_music_disabled_subtitle">Playing song info hidden</string> <string name="settings_show_music_disabled_subtitle">Playing song info hidden</string>
<string name="settings_song_info_format_title">Song info format</string> <string name="settings_song_info_format_title">Song info format</string>
<string name="settings_request_notification_access">We need the notification access permission to check the current playing song.</string> <string name="settings_request_notification_access">We need the notification access permission to check the current playing song.</string>
<string name="settings_at_a_glance_title">At a Glance</string>
</resources> </resources>

View File

@ -193,4 +193,5 @@
<string name="settings_show_music_disabled_subtitle">Non visibile</string> <string name="settings_show_music_disabled_subtitle">Non visibile</string>
<string name="settings_song_info_format_title">Formato informazioni brano</string> <string name="settings_song_info_format_title">Formato informazioni brano</string>
<string name="settings_request_notification_access">Concedi all\'app il permesso di monitorare le notifiche, è necessario per poter mostrare il brano in riproduzione.</string> <string name="settings_request_notification_access">Concedi all\'app il permesso di monitorare le notifiche, è necessario per poter mostrare il brano in riproduzione.</string>
<string name="settings_at_a_glance_title">At a Glance</string>
</resources> </resources>

View File

@ -199,6 +199,7 @@
<string name="next_alarm_warning">The next alarm clock seems to be wrong.\nIt has been set by %s.</string> <string name="next_alarm_warning">The next alarm clock seems to be wrong.\nIt has been set by %s.</string>
<string name="settings_title">Settings</string> <string name="settings_title">Settings</string>
<string name="settings_clock_text_color_title">Clock text color</string> <string name="settings_clock_text_color_title">Clock text color</string>
<string name="settings_at_a_glance_title">At a Glance</string>
<string name="settings_music_title">Music</string> <string name="settings_music_title">Music</string>
<string name="settings_show_music_title">Show current playing song</string> <string name="settings_show_music_title">Show current playing song</string>
<string name="settings_show_music_enabled_subtitle">Playing song info visible</string> <string name="settings_show_music_enabled_subtitle">Playing song info visible</string>

View File

@ -3,8 +3,8 @@
xmlns:dist="http://schemas.android.com/apk/distribution" xmlns:dist="http://schemas.android.com/apk/distribution"
featureSplit="tasksintegration" featureSplit="tasksintegration"
package="com.tommasoberlose.anotherwidget" package="com.tommasoberlose.anotherwidget"
android:versionCode="78" android:versionCode="80"
android:versionName="2.0.5" > android:versionName="2.0.6" >
<uses-sdk <uses-sdk
android:minSdkVersion="23" android:minSdkVersion="23"

View File

@ -1,4 +1,4 @@
#Fri May 08 15:14:56 CEST 2020 #Fri May 08 18:14:21 CEST 2020
base.0=/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/build/intermediates/dex/debug/mergeProjectDexDebug/out/classes.dex base.0=/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/build/intermediates/dex/debug/mergeProjectDexDebug/out/classes.dex
path.0=classes.dex path.0=classes.dex
renamed.0=classes.dex renamed.0=classes.dex

View File

@ -4,8 +4,8 @@
featureSplit="tasksintegration" featureSplit="tasksintegration"
package="com.tommasoberlose.anotherwidget" package="com.tommasoberlose.anotherwidget"
android:targetSandboxVersion="2" android:targetSandboxVersion="2"
android:versionCode="78" android:versionCode="80"
android:versionName="2.0.5" > android:versionName="2.0.6" >
<uses-sdk <uses-sdk
android:minSdkVersion="23" android:minSdkVersion="23"

View File

@ -3,8 +3,8 @@
3 xmlns:dist="http://schemas.android.com/apk/distribution" 3 xmlns:dist="http://schemas.android.com/apk/distribution"
4 featureSplit="tasksintegration" 4 featureSplit="tasksintegration"
5 package="com.tommasoberlose.anotherwidget" 5 package="com.tommasoberlose.anotherwidget"
6 android:versionCode="78" 6 android:versionCode="80"
7 android:versionName="2.0.5" > 7 android:versionName="2.0.6" >
8 8
9 <uses-sdk 9 <uses-sdk
10 android:minSdkVersion="23" 10 android:minSdkVersion="23"

View File

@ -3,8 +3,8 @@
xmlns:dist="http://schemas.android.com/apk/distribution" xmlns:dist="http://schemas.android.com/apk/distribution"
featureSplit="tasksintegration" featureSplit="tasksintegration"
package="com.tommasoberlose.anotherwidget" package="com.tommasoberlose.anotherwidget"
android:versionCode="78" android:versionCode="80"
android:versionName="2.0.5" > android:versionName="2.0.6" >
<uses-sdk <uses-sdk
android:minSdkVersion="23" android:minSdkVersion="23"

View File

@ -3,8 +3,8 @@
xmlns:dist="http://schemas.android.com/apk/distribution" xmlns:dist="http://schemas.android.com/apk/distribution"
featureSplit="tasksintegration" featureSplit="tasksintegration"
package="com.tommasoberlose.anotherwidget" package="com.tommasoberlose.anotherwidget"
android:versionCode="78" android:versionCode="80"
android:versionName="2.0.5" > android:versionName="2.0.6" >
<uses-sdk android:targetSdkVersion="29" /> <uses-sdk android:targetSdkVersion="29" />