Replace deprecated menu functions with MenuProvider (#3776)

* Squash merge Migrate to MenuProvider (#2974) by @NotWoods

* Merge fixes

* Update sensor detail fragment menu for multiserver

* Menu fixes/additions

 - Add HelpMenuProvider to Android Auto favorites
 - Fix notification history fragment having no view because of missing super call
 - Fix crash in device controls view if a server that is offline is selected

* ktlint

* Simplify some code

 - Undo formatting change in SettingsActivity
 - Don't require each activity to convert the string to URIs if we can do it in one place

* Remove setHasOptionsMenu(false) usage
This commit is contained in:
Joris Pelgröm 2023-08-19 20:34:38 +02:00 committed by GitHub
parent 01326db427
commit f722de9561
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
27 changed files with 490 additions and 560 deletions

View file

@ -5,9 +5,9 @@ import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.net.toUri
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.lifecycle.Lifecycle
@ -19,8 +19,8 @@ import com.google.android.gms.wearable.CapabilityInfo
import com.google.android.gms.wearable.Node
import com.google.android.gms.wearable.NodeClient
import com.google.android.gms.wearable.Wearable
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.databinding.ActivitySettingsWearBinding
import io.homeassistant.companion.android.settings.HelpMenuProvider
import io.homeassistant.companion.android.settings.wear.views.SettingsWearMainView
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
@ -41,19 +41,6 @@ class SettingsWearActivity : AppCompatActivity(), CapabilityClient.OnCapabilityC
private var wearNodesWithApp: Set<Node>? = null
private var allConnectedNodes: List<Node>? = null
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_activity_settings_wear, menu)
return true
}
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
menu?.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/wear-os"))
}
return true
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -70,6 +57,8 @@ class SettingsWearActivity : AppCompatActivity(), CapabilityClient.OnCapabilityC
openPlayStoreOnWearDevicesWithoutApp()
}
addMenuProvider(HelpMenuProvider("https://companion.home-assistant.io/docs/wear-os/wear-os".toUri()))
// Perform the initial update of the UI
updateUI()

View file

@ -0,0 +1,40 @@
package io.homeassistant.companion.android.settings
import android.content.Intent
import android.content.Intent.ACTION_VIEW
import android.net.Uri
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import androidx.core.net.toUri
import androidx.core.view.MenuHost
import androidx.core.view.MenuProvider
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import io.homeassistant.companion.android.R
/**
* Adds a "Get Help" menu option that opens the given [helpLink] in the browser.
*/
class HelpMenuProvider(private val helpLink: Uri) : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.menu_help, menu)
}
override fun onPrepareMenu(menu: Menu) {
menu.findItem(R.id.get_help).apply {
intent = Intent(ACTION_VIEW, helpLink)
}
}
// Don't handle the help item so the intent is automatically launched
override fun onMenuItemSelected(menuItem: MenuItem) = false
}
/**
* Wrapper around [MenuHost.addMenuProvider] to attach a [HelpMenuProvider] to a fragment's parent activity.
*/
fun Fragment.addHelpMenuProvider(helpLink: String) {
val menuHost: MenuHost = requireActivity()
menuHost.addMenuProvider(HelpMenuProvider(helpLink.toUri()), viewLifecycleOwner, Lifecycle.State.RESUMED)
}

View file

@ -4,10 +4,8 @@ import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.ViewGroup
import androidx.appcompat.widget.SearchView
import androidx.biometric.BiometricManager
import androidx.fragment.app.commit
import dagger.hilt.EntryPoint
@ -50,17 +48,6 @@ class SettingsActivity : BaseActivity() {
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_activity_settings, menu)
(menu.findItem(R.id.action_search)?.actionView as SearchView).apply {
queryHint = getString(commonR.string.search_sensors)
maxWidth = Integer.MAX_VALUE
}
return true
}
override fun onCreate(savedInstanceState: Bundle?) {
val entryPoint = EntryPointAccessors.fromActivity(this, SettingsFragmentFactoryEntryPoint::class.java)
supportFragmentManager.fragmentFactory = entryPoint.getSettingsFragmentFactory()
@ -93,6 +80,7 @@ class SettingsActivity : BaseActivity() {
} else {
SettingsFragment::class.java
}
settingsNavigation == "notification_history" -> NotificationHistoryFragment::class.java
settingsNavigation?.startsWith("sensors/") == true -> SensorDetailFragment::class.java
settingsNavigation?.startsWith("tiles/") == true -> ManageTilesFragment::class.java
@ -240,6 +228,7 @@ class SettingsActivity : BaseActivity() {
}
}
/** Used to inject classes before [onCreate] */
@EntryPoint
@InstallIn(ActivityComponent::class)
interface SettingsFragmentFactoryEntryPoint {

View file

@ -1,11 +1,8 @@
package io.homeassistant.companion.android.settings.controls
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import androidx.annotation.RequiresApi
@ -14,9 +11,9 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.google.accompanist.themeadapter.material.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.data.integration.ControlsAuthRequiredSetting
import io.homeassistant.companion.android.common.data.servers.ServerManager
import io.homeassistant.companion.android.settings.addHelpMenuProvider
import io.homeassistant.companion.android.settings.controls.views.ManageControlsView
import javax.inject.Inject
import io.homeassistant.companion.android.common.R as commonR
@ -30,21 +27,6 @@ class ManageControlsSettingsFragment : Fragment() {
val viewModel: ManageControlsViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/integrations/android-device-controls"))
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -69,6 +51,10 @@ class ManageControlsSettingsFragment : Fragment() {
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
addHelpMenuProvider("https://companion.home-assistant.io/docs/integrations/android-device-controls")
}
override fun onResume() {
super.onResume()
activity?.title = getString(commonR.string.controls_setting_title)

View file

@ -87,7 +87,7 @@ fun ManageControlsView(
)
}
}
items(entitiesList[selectedServer]!!.size, key = { "$selectedServer.${entitiesList[selectedServer]?.get(it)?.entityId}" }) { index ->
items(entitiesList[selectedServer]?.size ?: 0, key = { "$selectedServer.${entitiesList[selectedServer]?.get(it)?.entityId}" }) { index ->
val entity = entitiesList[selectedServer]?.get(index) as Entity<Map<String, Any>>
ManageControlsEntity(
entityName = (

View file

@ -8,6 +8,8 @@ import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
@ -16,11 +18,13 @@ import android.widget.ScrollView
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.Toolbar
import androidx.core.content.FileProvider
import androidx.core.view.MenuHost
import androidx.core.view.MenuProvider
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import com.google.android.material.tabs.TabLayout
import dagger.hilt.android.AndroidEntryPoint
@ -49,33 +53,45 @@ class LogFragment : Fragment() {
private var crashLog: String? = null
private var currentLog = ""
@Deprecated("Deprecated in Java")
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.share_log -> {
shareLog()
return true
}
R.id.refresh_log -> {
refreshLog()
}
private var toolbarGroupVisible = false
set(value) {
field = value
activity?.invalidateMenu()
}
return super.onOptionsItemSelected(item)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val menuHost: MenuHost = requireActivity()
menuHost.addMenuProvider(
object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.menu_fragment_log, menu)
}
setHasOptionsMenu(true)
override fun onPrepareMenu(menu: Menu) {
menu.setGroupVisible(R.id.log_toolbar_group, toolbarGroupVisible)
}
override fun onMenuItemSelected(menuItem: MenuItem) = when (menuItem.itemId) {
R.id.share_log -> {
shareLog()
true
}
R.id.refresh_log -> {
refreshLog()
true
}
else -> false
}
},
viewLifecycleOwner,
Lifecycle.State.RESUMED
)
requireView().findViewById<TabLayout>(R.id.logTabLayout)
.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab?) {
showLog()
}
override fun onTabSelected(tab: TabLayout.Tab?) = showLog()
override fun onTabUnselected(tab: TabLayout.Tab?) {
}
override fun onTabUnselected(tab: TabLayout.Tab?) {}
override fun onTabReselected(tab: TabLayout.Tab?) {
(requireView().findViewById<ScrollView>(R.id.logScrollview))?.apply {
@ -95,9 +111,6 @@ class LogFragment : Fragment() {
private fun refreshLog() = lifecycleScope.launch(Dispatchers.Main) {
if (view != null && activity != null) {
val toolbar = requireActivity().findViewById<Toolbar>(R.id.toolbar)
toolbar.menu.setGroupVisible(R.id.log_toolbar_group, false)
showHideLogLoader(true)
// Runs with Dispatcher IO
@ -105,7 +118,6 @@ class LogFragment : Fragment() {
crashLog = getLatestFatalCrash(requireContext(), prefsRepository.isCrashReporting())
showLog()
toolbar.menu.setGroupVisible(R.id.log_toolbar_group, true)
showHideLogLoader(false)
}
}
@ -227,6 +239,7 @@ class LogFragment : Fragment() {
}
private fun showHideLogLoader(show: Boolean) {
toolbarGroupVisible = !show
if (view != null) {
val logLoader = requireView().findViewById<LinearLayout>(R.id.logLoader)
val logContents = requireView().findViewById<LinearLayout>(R.id.logContents)

View file

@ -1,11 +1,8 @@
package io.homeassistant.companion.android.settings.notification
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import androidx.annotation.RequiresApi
@ -14,7 +11,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.google.accompanist.themeadapter.material.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.settings.addHelpMenuProvider
import io.homeassistant.companion.android.settings.notification.views.NotificationChannelView
import io.homeassistant.companion.android.common.R as commonR
@ -23,21 +20,6 @@ class NotificationChannelFragment : Fragment() {
val viewModel: NotificationViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/notifications/notifications-basic#notification-channels"))
}
}
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreateView(
inflater: LayoutInflater,
@ -53,6 +35,10 @@ class NotificationChannelFragment : Fragment() {
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
addHelpMenuProvider("https://companion.home-assistant.io/docs/notifications/notifications-basic#notification-channels")
}
override fun onResume() {
super.onResume()
activity?.title = getString(commonR.string.notification_channels)

View file

@ -1,7 +1,5 @@
package io.homeassistant.companion.android.settings.notification
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
@ -10,7 +8,9 @@ import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
import androidx.core.view.MenuHost
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import com.google.accompanist.themeadapter.material.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
@ -42,28 +42,6 @@ class NotificationDetailFragment : Fragment() {
arguments?.get(ARG_NOTIF) as? NotificationItem
} ?: return
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.setGroupVisible(R.id.notification_toolbar_group, true)
menu.removeItem(R.id.search_notifications)
menu.removeItem(R.id.notification_filter)
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/notifications/notifications-basic"))
}
}
@Deprecated("Deprecated in Java")
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == R.id.action_delete) {
deleteConfirmation()
}
return super.onOptionsItemSelected(item)
}
override fun onCreateView(
@ -80,6 +58,29 @@ class NotificationDetailFragment : Fragment() {
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val menuHost: MenuHost = requireActivity()
menuHost.addMenuProvider(
object : NotificationMenuProvider() {
override fun onPrepareMenu(menu: Menu) {
super.onPrepareMenu(menu)
menu.removeItem(R.id.search_notifications)
menu.removeItem(R.id.notification_filter)
}
override fun onMenuItemSelected(menuItem: MenuItem) = when (menuItem.itemId) {
R.id.action_delete -> {
deleteConfirmation()
true
}
else -> false
}
},
viewLifecycleOwner,
Lifecycle.State.RESUMED
)
}
private fun deleteConfirmation() {
val builder: android.app.AlertDialog.Builder = android.app.AlertDialog.Builder(requireContext())

View file

@ -1,14 +1,15 @@
package io.homeassistant.companion.android.settings.notification
import android.app.AlertDialog
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.appcompat.widget.SearchView
import androidx.core.text.HtmlCompat
import androidx.core.view.MenuHost
import androidx.fragment.app.commit
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import androidx.preference.PreferenceCategory
@ -26,84 +27,83 @@ import io.homeassistant.companion.android.common.R as commonR
@AndroidEntryPoint
class NotificationHistoryFragment : PreferenceFragmentCompat() {
companion object {
private var filterValue = 25
}
private var filterValue = 25
@Inject
lateinit var notificationDao: NotificationDao
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.setGroupVisible(R.id.notification_toolbar_group, true)
val menuHost: MenuHost = requireActivity()
menuHost.addMenuProvider(
object : NotificationMenuProvider() {
override fun onPrepareMenu(menu: Menu) {
super.onPrepareMenu(menu)
menu.findItem(R.id.last25)?.title = getString(commonR.string.last_num_notifications, 25)
menu.findItem(R.id.last50)?.title = getString(commonR.string.last_num_notifications, 50)
menu.findItem(R.id.last100)?.title = getString(commonR.string.last_num_notifications, 100)
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/notifications/notifications-basic"))
}
menu.findItem(R.id.last25)?.title = getString(commonR.string.last_num_notifications, 25)
menu.findItem(R.id.last50)?.title = getString(commonR.string.last_num_notifications, 50)
menu.findItem(R.id.last100)?.title = getString(commonR.string.last_num_notifications, 100)
val prefCategory = findPreference<PreferenceCategory>("list_notifications")
val allNotifications = notificationDao.getAll()
val prefCategory = findPreference<PreferenceCategory>("list_notifications")
val allNotifications = notificationDao.getAll()
if (allNotifications.isNullOrEmpty()) {
menu.removeItem(R.id.search_notifications)
menu.removeItem(R.id.notification_filter)
menu.removeItem(R.id.action_delete)
} else {
val searchViewItem = menu.findItem(R.id.search_notifications)
val searchView: SearchView = searchViewItem.actionView as SearchView
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
searchView.clearFocus()
if (allNotifications.isNullOrEmpty()) {
menu.removeItem(R.id.search_notifications)
menu.removeItem(R.id.notification_filter)
menu.removeItem(R.id.action_delete)
} else {
val searchViewItem = menu.findItem(R.id.search_notifications)
val searchView: SearchView = searchViewItem.actionView as SearchView
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
searchView.clearFocus()
return false
}
override fun onQueryTextChange(query: String?): Boolean {
var searchList: Array<NotificationItem> = emptyArray()
if (!query.isNullOrEmpty()) {
for (item in allNotifications) {
if (item.message.contains(query, true)) {
searchList += item
return false
}
}
prefCategory?.title = getString(commonR.string.search_results)
reloadNotifications(searchList, prefCategory)
} else if (query.isNullOrEmpty()) {
prefCategory?.title = getString(commonR.string.notifications)
filterNotifications(filterValue, notificationDao, prefCategory)
}
return false
}
})
}
}
@Deprecated("Deprecated in Java")
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val prefCategory = findPreference<PreferenceCategory>("list_notifications")
if (item.itemId in listOf(R.id.last25, R.id.last50, R.id.last100)) {
filterValue = when (item.itemId) {
R.id.last25 -> 25
R.id.last50 -> 50
R.id.last100 -> 100
else -> 25
}
item.isChecked = !item.isChecked
filterNotifications(filterValue, notificationDao, prefCategory)
} else if (item.itemId == R.id.action_delete) {
deleteAllConfirmation(notificationDao)
}
return super.onOptionsItemSelected(item)
override fun onQueryTextChange(query: String?): Boolean {
var searchList: Array<NotificationItem> = emptyArray()
if (!query.isNullOrEmpty()) {
for (item in allNotifications) {
if (item.message.contains(query, true)) {
searchList += item
}
}
prefCategory?.title = getString(commonR.string.search_results)
reloadNotifications(searchList, prefCategory)
} else if (query.isNullOrEmpty()) {
prefCategory?.title = getString(commonR.string.notifications)
filterNotifications(filterValue, notificationDao, prefCategory)
}
return false
}
})
}
}
override fun onMenuItemSelected(menuItem: MenuItem) = when (menuItem.itemId) {
R.id.last25, R.id.last50, R.id.last100 -> {
val prefCategory = findPreference<PreferenceCategory>("list_notifications")
filterValue = when (menuItem.itemId) {
R.id.last25 -> 25
R.id.last50 -> 50
R.id.last100 -> 100
else -> 25
}
menuItem.isChecked = !menuItem.isChecked
filterNotifications(filterValue, notificationDao, prefCategory)
true
}
R.id.action_delete -> {
deleteAllConfirmation(notificationDao)
true
}
else -> false
}
},
viewLifecycleOwner,
Lifecycle.State.RESUMED
)
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {

View file

@ -0,0 +1,20 @@
package io.homeassistant.companion.android.settings.notification
import android.content.Intent
import android.view.Menu
import android.view.MenuInflater
import androidx.core.net.toUri
import androidx.core.view.MenuProvider
import io.homeassistant.companion.android.R
abstract class NotificationMenuProvider : MenuProvider {
final override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.menu_fragment_notification, menu)
}
override fun onPrepareMenu(menu: Menu) {
menu.findItem(R.id.get_help).apply {
intent = Intent(Intent.ACTION_VIEW, "https://companion.home-assistant.io/docs/notifications/notifications-basic".toUri())
}
}
}

View file

@ -1,11 +1,8 @@
package io.homeassistant.companion.android.settings.qs
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import androidx.compose.runtime.getValue
@ -18,7 +15,7 @@ import androidx.fragment.app.viewModels
import com.google.accompanist.themeadapter.material.MdcTheme
import com.mikepenz.iconics.typeface.IIcon
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.settings.addHelpMenuProvider
import io.homeassistant.companion.android.settings.qs.views.ManageTilesView
import io.homeassistant.companion.android.util.icondialog.IconDialog
import io.homeassistant.companion.android.common.R as commonR
@ -36,21 +33,6 @@ class ManageTilesFragment : Fragment() {
val viewModel: ManageTilesViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/integrations/android-quick-settings"))
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -82,6 +64,10 @@ class ManageTilesFragment : Fragment() {
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
addHelpMenuProvider("https://companion.home-assistant.io/docs/integrations/android-quick-settings")
}
override fun onResume() {
super.onResume()
activity?.title = getString(commonR.string.tiles)

View file

@ -3,16 +3,19 @@ package io.homeassistant.companion.android.settings.sensor
import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.widget.Toolbar
import androidx.compose.ui.platform.ComposeView
import androidx.core.net.toUri
import androidx.core.view.MenuHost
import androidx.core.view.MenuProvider
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
@ -49,49 +52,18 @@ class SensorDetailFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
launch {
viewModel.serversShowExpand.collect { updateSensorToolbarMenu() }
viewModel.serversShowExpand.collect { activity?.invalidateMenu() }
}
launch {
viewModel.serversDoExpand.collect { updateSensorToolbarMenu() }
viewModel.serversDoExpand.collect { activity?.invalidateMenu() }
}
}
}
}
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.setGroupVisible(R.id.senor_detail_toolbar_group, true)
menu.removeItem(R.id.action_filter)
menu.removeItem(R.id.action_search)
menu.setGroupVisible(R.id.sensor_detail_server_group, true)
menu.findItem(R.id.action_sensor_expand)?.let {
it.setOnMenuItemClickListener {
viewModel.setServersExpanded(true)
true
}
}
menu.findItem(R.id.action_sensor_collapse)?.let {
it.setOnMenuItemClickListener {
viewModel.setServersExpanded(false)
true
}
}
updateSensorToolbarMenu(menu)
menu.findItem(R.id.get_help)?.let {
val docsLink = viewModel.basicSensor?.docsLink ?: viewModel.sensorManager?.docsLink()
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse(docsLink))
it.isVisible = docsLink != null // should always be true
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -114,7 +86,40 @@ class SensorDetailFragment : Fragment() {
@SuppressLint("InlinedApi")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val menuHost: MenuHost = requireActivity()
menuHost.addMenuProvider(
object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.menu_fragment_sensordetail, menu)
}
override fun onPrepareMenu(menu: Menu) {
menu.findItem(R.id.action_sensor_expand)?.let {
it.isVisible = viewModel.serversShowExpand.value && !viewModel.serversDoExpand.value
}
menu.findItem(R.id.action_sensor_collapse)?.let {
it.isVisible = viewModel.serversShowExpand.value && viewModel.serversDoExpand.value
}
menu.findItem(R.id.get_help)?.let {
val docsLink = viewModel.basicSensor?.docsLink ?: viewModel.sensorManager?.docsLink()
it.isVisible = docsLink != null
if (docsLink != null) {
it.intent = Intent(Intent.ACTION_VIEW, docsLink.toUri())
}
}
}
override fun onMenuItemSelected(menuItem: MenuItem) = when (menuItem.itemId) {
R.id.action_sensor_expand, R.id.action_sensor_collapse -> {
viewModel.setServersExpanded(menuItem.itemId == R.id.action_sensor_expand)
true
}
else -> false
}
},
viewLifecycleOwner,
Lifecycle.State.RESUMED
)
viewModel.permissionRequests.observe(viewLifecycleOwner) {
if (it == null || it.permissions.isNullOrEmpty()) return@observe
@ -162,20 +167,4 @@ class SensorDetailFragment : Fragment() {
super.onResume()
activity?.title = null
}
private fun updateSensorToolbarMenu(menu: Menu? = null) {
val group = if (menu != null) {
menu
} else {
if (view == null || activity == null) return
val toolbar = activity?.findViewById<Toolbar>(R.id.toolbar) ?: return
toolbar.menu
}
group.findItem(R.id.action_sensor_expand)?.let {
it.isVisible = viewModel.serversShowExpand.value && !viewModel.serversDoExpand.value
}
group.findItem(R.id.action_sensor_collapse)?.let {
it.isVisible = viewModel.serversShowExpand.value && viewModel.serversDoExpand.value
}
}
}

View file

@ -1,17 +1,22 @@
package io.homeassistant.companion.android.settings.sensor
import android.content.Intent
import android.net.Uri
import android.content.Intent.ACTION_VIEW
import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.SearchView
import androidx.compose.ui.platform.ComposeView
import androidx.core.net.toUri
import androidx.core.view.MenuHost
import androidx.core.view.MenuProvider
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import com.google.accompanist.themeadapter.material.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.R
@ -23,67 +28,6 @@ class SensorSettingsFragment : Fragment() {
val viewModel: SensorSettingsViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.setGroupVisible(R.id.senor_detail_toolbar_group, true)
val searchViewItem = menu.findItem(R.id.action_search)
val searchView: SearchView = searchViewItem.actionView as SearchView
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
searchView.clearFocus()
return false
}
override fun onQueryTextChange(query: String?): Boolean {
viewModel.setSensorsSearchQuery(query)
return false
}
})
if (!viewModel.searchQuery.isNullOrBlank() && !searchViewItem.isActionViewExpanded) {
viewModel.setSensorsSearchQuery(null)
}
when (viewModel.sensorFilter) {
SensorSettingsViewModel.SensorFilter.ALL ->
menu.findItem(R.id.action_show_sensors_all)?.isChecked = true
SensorSettingsViewModel.SensorFilter.ENABLED ->
menu.findItem(R.id.action_show_sensors_enabled)?.isChecked = true
SensorSettingsViewModel.SensorFilter.DISABLED ->
menu.findItem(R.id.action_show_sensors_disabled)?.isChecked = true
}
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/core/sensors#android-sensors"))
}
}
@Deprecated("Deprecated in Java")
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_show_sensors_all, R.id.action_show_sensors_enabled, R.id.action_show_sensors_disabled -> {
item.isChecked = true
viewModel.setSensorFilterChoice(
when (item.itemId) {
R.id.action_show_sensors_enabled -> SensorSettingsViewModel.SensorFilter.ENABLED
R.id.action_show_sensors_disabled -> SensorSettingsViewModel.SensorFilter.DISABLED
else -> SensorSettingsViewModel.SensorFilter.ALL
}
)
return true
}
}
return super.onOptionsItemSelected(item)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -112,6 +56,61 @@ class SensorSettingsFragment : Fragment() {
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val menuHost: MenuHost = requireActivity()
menuHost.addMenuProvider(
object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.menu_fragment_sensor, menu)
val searchViewItem = menu.findItem(R.id.action_search)
val searchView = searchViewItem.actionView as SearchView
searchView.apply {
queryHint = getString(commonR.string.search_sensors)
maxWidth = Integer.MAX_VALUE
}
}
override fun onPrepareMenu(menu: Menu) {
val searchViewItem = menu.findItem(R.id.action_search)
val searchView = searchViewItem.actionView as SearchView
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
searchView.clearFocus()
return false
}
override fun onQueryTextChange(query: String?): Boolean {
viewModel.setSensorsSearchQuery(query)
return false
}
})
if (!viewModel.searchQuery.isNullOrBlank() && !searchViewItem.isActionViewExpanded) {
viewModel.setSensorsSearchQuery(null)
}
menu.findItem(viewModel.sensorFilter.menuItemId)?.isChecked = true
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(ACTION_VIEW, "https://companion.home-assistant.io/docs/core/sensors#android-sensors".toUri())
}
}
override fun onMenuItemSelected(menuItem: MenuItem) = when (menuItem.itemId) {
R.id.action_show_sensors_all, R.id.action_show_sensors_enabled, R.id.action_show_sensors_disabled -> {
menuItem.isChecked = !menuItem.isChecked
viewModel.setSensorFilterChoice(menuItem.itemId)
true
}
else -> false
}
},
viewLifecycleOwner,
Lifecycle.State.RESUMED
)
}
override fun onResume() {
super.onResume()
activity?.title = getString(commonR.string.sensors)

View file

@ -1,12 +1,14 @@
package io.homeassistant.companion.android.settings.sensor
import android.app.Application
import androidx.annotation.IdRes
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.sensors.SensorManager
import io.homeassistant.companion.android.database.sensor.Sensor
import io.homeassistant.companion.android.database.sensor.SensorDao
@ -21,10 +23,14 @@ class SensorSettingsViewModel @Inject constructor(
) :
AndroidViewModel(application) {
enum class SensorFilter {
ALL,
ENABLED,
DISABLED
enum class SensorFilter(@IdRes val menuItemId: Int) {
ALL(R.id.action_show_sensors_all),
ENABLED(R.id.action_show_sensors_enabled),
DISABLED(R.id.action_show_sensors_disabled);
companion object {
val menuItemIdToFilter = values().associateBy { it.menuItemId }
}
}
private var sensorsList = emptyList<Sensor>()
@ -54,9 +60,9 @@ class SensorSettingsViewModel @Inject constructor(
}
}
fun setSensorFilterChoice(filter: SensorFilter) {
fun setSensorFilterChoice(@IdRes filterMenuItemId: Int) {
viewModelScope.launch {
sensorFilter = filter
sensorFilter = SensorFilter.menuItemIdToFilter.getValue(filterMenuItemId)
filterSensorsList()
}
}

View file

@ -1,10 +1,7 @@
package io.homeassistant.companion.android.settings.sensor
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import androidx.compose.runtime.collectAsState
@ -13,8 +10,8 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.google.accompanist.themeadapter.material.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.settings.SettingViewModel
import io.homeassistant.companion.android.settings.addHelpMenuProvider
import io.homeassistant.companion.android.settings.sensor.views.SensorUpdateFrequencyView
import io.homeassistant.companion.android.common.R as commonR
@ -23,21 +20,6 @@ class SensorUpdateFrequencyFragment : Fragment() {
val viewModel: SettingViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/core/sensors#android-sensors"))
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -57,6 +39,10 @@ class SensorUpdateFrequencyFragment : Fragment() {
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
addHelpMenuProvider("https://companion.home-assistant.io/docs/core/sensors#android-sensors")
}
override fun onResume() {
super.onResume()
activity?.title = getString(commonR.string.sensor_update_frequency)

View file

@ -1,12 +1,9 @@
package io.homeassistant.companion.android.settings.shortcuts
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import androidx.annotation.RequiresApi
@ -20,7 +17,7 @@ import androidx.fragment.app.viewModels
import com.google.accompanist.themeadapter.material.MdcTheme
import com.mikepenz.iconics.typeface.IIcon
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.settings.addHelpMenuProvider
import io.homeassistant.companion.android.settings.shortcuts.views.ManageShortcutsView
import io.homeassistant.companion.android.util.icondialog.IconDialog
import io.homeassistant.companion.android.common.R as commonR
@ -37,21 +34,6 @@ class ManageShortcutsSettingsFragment : Fragment() {
val viewModel: ManageShortcutsViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/integrations/android-shortcuts"))
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -77,6 +59,10 @@ class ManageShortcutsSettingsFragment : Fragment() {
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
addHelpMenuProvider("https://companion.home-assistant.io/docs/integrations/android-shortcuts")
}
@RequiresApi(Build.VERSION_CODES.N_MR1)
override fun onResume() {
super.onResume()

View file

@ -1,10 +1,7 @@
package io.homeassistant.companion.android.settings.ssid
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
@ -12,7 +9,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.google.accompanist.themeadapter.material.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.settings.addHelpMenuProvider
import io.homeassistant.companion.android.settings.ssid.views.SsidView
import io.homeassistant.companion.android.common.R as commonR
@ -25,21 +22,6 @@ class SsidFragment : Fragment() {
val viewModel: SsidViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/troubleshooting/networking#setting-up-the-app"))
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -63,6 +45,10 @@ class SsidFragment : Fragment() {
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
addHelpMenuProvider("https://companion.home-assistant.io/docs/troubleshooting/networking#setting-up-the-app")
}
override fun onResume() {
super.onResume()
activity?.title = getString(commonR.string.pref_connection_wifi)

View file

@ -21,11 +21,6 @@ class ExternalUrlFragment : Fragment() {
val viewModel by viewModels<ExternalUrlViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(false)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,

View file

@ -1,12 +1,9 @@
package io.homeassistant.companion.android.settings.vehicle
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import androidx.annotation.RequiresApi
@ -15,8 +12,8 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.google.accompanist.themeadapter.material.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.data.servers.ServerManager
import io.homeassistant.companion.android.settings.addHelpMenuProvider
import io.homeassistant.companion.android.settings.vehicle.views.AndroidAutoFavoritesSettings
import javax.inject.Inject
import io.homeassistant.companion.android.common.R as commonR
@ -29,21 +26,6 @@ class ManageAndroidAutoSettingsFragment : Fragment() {
val viewModel: ManageAndroidAutoViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/android-auto"))
}
}
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreateView(
inflater: LayoutInflater,
@ -63,6 +45,10 @@ class ManageAndroidAutoSettingsFragment : Fragment() {
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
addHelpMenuProvider("https://companion.home-assistant.io/docs/android-auto")
}
override fun onResume() {
super.onResume()
activity?.title =

View file

@ -7,7 +7,6 @@ import android.os.Bundle
import android.os.PowerManager
import android.provider.Settings
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts
@ -21,9 +20,9 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.google.accompanist.themeadapter.material.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.data.wifi.WifiHelper
import io.homeassistant.companion.android.settings.SettingViewModel
import io.homeassistant.companion.android.settings.addHelpMenuProvider
import io.homeassistant.companion.android.settings.websocket.views.WebsocketSettingView
import javax.inject.Inject
import io.homeassistant.companion.android.common.R as commonR
@ -50,22 +49,11 @@ class WebsocketSettingFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
arguments?.let {
serverId = it.getInt(EXTRA_SERVER, serverId)
}
}
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/notifications/notification-local"))
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -97,6 +85,10 @@ class WebsocketSettingFragment : Fragment() {
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
addHelpMenuProvider("https://companion.home-assistant.io/docs/notifications/notification-local")
}
override fun onResume() {
super.onResume()
activity?.title = getString(commonR.string.websocket_setting_name)

View file

@ -1,10 +1,7 @@
package io.homeassistant.companion.android.settings.widgets
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
@ -12,7 +9,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.google.accompanist.themeadapter.material.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.settings.addHelpMenuProvider
import io.homeassistant.companion.android.settings.widgets.views.ManageWidgetsView
import io.homeassistant.companion.android.common.R as commonR
@ -21,21 +18,6 @@ class ManageWidgetsSettingsFragment : Fragment() {
val viewModel: ManageWidgetsViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
@Deprecated("Deprecated in Java")
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.findItem(R.id.get_help)?.let {
it.isVisible = true
it.intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://companion.home-assistant.io/docs/integrations/android-widgets"))
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -50,6 +32,10 @@ class ManageWidgetsSettingsFragment : Fragment() {
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
addHelpMenuProvider("https://companion.home-assistant.io/docs/integrations/android-widgets")
}
override fun onResume() {
super.onResume()
activity?.title = getString(commonR.string.widgets)

View file

@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<group
android:id="@+id/senor_detail_toolbar_group"
android:visible="false">
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_search_toolbar"
android:title="@string/search_sensors"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_filter"
android:icon="@drawable/ic_filter_toolbar"
android:title="@string/filter_sensors"
app:showAsAction="ifRoom">
<menu>
<group
android:id="@+id/filter_toolbar_group"
android:checkableBehavior="single">
<item
android:id="@+id/action_show_sensors_all"
android:title="@string/filter_sensors_all"
android:checked="true" />
<item
android:id="@+id/action_show_sensors_enabled"
android:title="@string/filter_sensors_enabled" />
<item
android:id="@+id/action_show_sensors_disabled"
android:title="@string/filter_sensors_disabled" />
</group>
</menu>
</item>
</group>
<group
android:id="@+id/sensor_detail_server_group"
android:visible="false">
<item
android:id="@+id/action_sensor_expand"
android:icon="@drawable/ic_unfold_more"
android:title="@string/sensor_unfold_more"
android:visible="false"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_sensor_collapse"
android:icon="@drawable/ic_unfold_less"
android:title="@string/sensor_unfold_less"
android:visible="false"
app:showAsAction="ifRoom"/>
</group>
<group
android:id="@+id/log_toolbar_group"
android:visible="false">
<item
android:id="@+id/share_log"
android:icon="@drawable/ic_share_toolbar"
android:title="@string/share_logs"
app:showAsAction="ifRoom" />
<item
android:id="@+id/refresh_log"
android:icon="@drawable/ic_refresh_toolbar"
android:title="@string/refresh_log"
app:showAsAction="ifRoom" />
</group>
<group
android:id="@+id/notification_toolbar_group"
android:visible="false">
<item
android:id="@+id/search_notifications"
android:icon="@drawable/ic_search_toolbar"
android:title="@string/search_notifications"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom" />
<item
android:id="@+id/notification_filter"
android:title="@string/filter_notifications"
android:icon="@drawable/ic_filter_toolbar"
app:showAsAction="ifRoom">
<menu>
<group
android:id="@+id/notification_filter_options"
android:checkableBehavior="single">
<item
android:id="@+id/last25"
android:title="@string/last_num_notifications"
android:checked="true"/>
<item
android:id="@+id/last50"
android:title="@string/last_num_notifications"/>
<item
android:id="@+id/last100"
android:title="@string/last_num_notifications"/>
</group>
</menu>
</item>
<item
android:id="@+id/action_delete"
android:icon="@drawable/ic_delete_toolbar"
android:title="@string/delete_all_notifications"
app:showAsAction="ifRoom" />
</group>
<item
android:id="@+id/get_help"
android:title="@string/get_help"
android:icon="@drawable/ic_question_toolbar"
android:visible="false"
app:showAsAction="always"/>
</menu>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<group android:id="@+id/log_toolbar_group">
<item
android:id="@+id/share_log"
android:icon="@drawable/ic_share_toolbar"
android:title="@string/share_logs"
app:showAsAction="ifRoom" />
<item
android:id="@+id/refresh_log"
android:icon="@drawable/ic_refresh_toolbar"
android:title="@string/refresh_log"
app:showAsAction="ifRoom" />
</group>
<item
android:id="@+id/get_help"
android:title="@string/get_help"
android:icon="@drawable/ic_question_toolbar"
app:showAsAction="always"/>
</menu>

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<group android:id="@+id/notification_toolbar_group">
<item
android:id="@+id/search_notifications"
android:icon="@drawable/ic_search_toolbar"
android:title="@string/search_notifications"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom" />
<item
android:id="@+id/notification_filter"
android:title="@string/filter_notifications"
android:icon="@drawable/ic_filter_toolbar"
app:showAsAction="ifRoom">
<menu>
<group
android:id="@+id/notification_filter_options"
android:checkableBehavior="single">
<item
android:id="@+id/last25"
android:title="@string/last_num_notifications"
android:checked="true"/>
<item
android:id="@+id/last50"
android:title="@string/last_num_notifications"/>
<item
android:id="@+id/last100"
android:title="@string/last_num_notifications"/>
</group>
</menu>
</item>
<item
android:id="@+id/action_delete"
android:icon="@drawable/ic_delete_toolbar"
android:title="@string/delete_all_notifications"
app:showAsAction="ifRoom" />
</group>
<item
android:id="@+id/get_help"
android:title="@string/get_help"
android:icon="@drawable/ic_question_toolbar"
app:showAsAction="always"/>
</menu>

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_search_toolbar"
android:title="@string/search_sensors"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_filter"
android:icon="@drawable/ic_filter_toolbar"
android:title="@string/filter_sensors"
app:showAsAction="ifRoom">
<menu>
<group
android:id="@+id/filter_toolbar_group"
android:checkableBehavior="single">
<item
android:id="@+id/action_show_sensors_all"
android:title="@string/filter_sensors_all"
android:checked="true" />
<item
android:id="@+id/action_show_sensors_enabled"
android:title="@string/filter_sensors_enabled" />
<item
android:id="@+id/action_show_sensors_disabled"
android:title="@string/filter_sensors_disabled" />
</group>
</menu>
</item>
<item
android:id="@+id/get_help"
android:title="@string/get_help"
android:icon="@drawable/ic_question_toolbar"
app:showAsAction="always"/>
</menu>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_sensor_expand"
android:icon="@drawable/ic_unfold_more"
android:title="@string/sensor_unfold_more"
android:visible="false"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_sensor_collapse"
android:icon="@drawable/ic_unfold_less"
android:title="@string/sensor_unfold_less"
android:visible="false"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/get_help"
android:title="@string/get_help"
android:icon="@drawable/ic_question_toolbar"
app:showAsAction="always"/>
</menu>

View file

@ -5,6 +5,5 @@
android:id="@+id/get_help"
android:title="@string/get_help"
android:icon="@drawable/ic_question_toolbar"
android:visible="false"
app:showAsAction="always"/>
</menu>
</menu>