diff --git a/src/fake_data/provide_hass.ts b/src/fake_data/provide_hass.ts
index 039ed4085e..c5d015b14f 100644
--- a/src/fake_data/provide_hass.ts
+++ b/src/fake_data/provide_hass.ts
@@ -203,6 +203,7 @@ export const provideHass = (
translationMetadata: translationMetadata as any,
dockedSidebar: "auto",
vibrate: true,
+ suspendWhenHidden: false,
moreInfoEntityId: null as any,
// @ts-ignore
async callService(domain, service, data) {
diff --git a/src/layouts/home-assistant.ts b/src/layouts/home-assistant.ts
index 667af80170..d4ea24beab 100644
--- a/src/layouts/home-assistant.ts
+++ b/src/layouts/home-assistant.ts
@@ -11,6 +11,7 @@ import {
} from "../util/register-service-worker";
import "./ha-init-page";
import "./home-assistant-main";
+import { storeState } from "../util/ha-pref-storage";
@customElement("home-assistant")
export class HomeAssistantAppEl extends HassElement {
@@ -55,6 +56,10 @@ export class HomeAssistantAppEl extends HassElement {
import(
/* webpackChunkName: "polyfill-web-animations-next" */ "web-animations-js/web-animations-next-lite.min"
);
+ this.addEventListener("hass-suspend-when-hidden", (ev) => {
+ this._updateHass({ suspendWhenHidden: ev.detail.suspend });
+ storeState(this.hass!);
+ });
}
protected updated(changedProps: PropertyValues): void {
@@ -76,8 +81,6 @@ export class HomeAssistantAppEl extends HassElement {
// @ts-ignore
this._loadHassTranslations(this.hass!.language, "state");
- this.addEventListener("unsuspend-app", () => this._onVisible(), false);
-
document.addEventListener(
"visibilitychange",
() => this._checkVisibility(),
@@ -170,15 +173,17 @@ export class HomeAssistantAppEl extends HassElement {
this._visiblePromiseResolve = resolve;
})
);
- // We close the connection to Home Assistant after being hidden for 5 minutes
- this._hiddenTimeout = window.setTimeout(() => {
- this._hiddenTimeout = undefined;
- // setTimeout can be delayed in the background and only fire
- // when we switch to the tab or app again (Hey Android!)
- if (!document.hidden) {
- this._suspendApp();
- }
- }, 300000);
+ if (this.hass!.suspendWhenHidden !== false) {
+ // We close the connection to Home Assistant after being hidden for 5 minutes
+ this._hiddenTimeout = window.setTimeout(() => {
+ this._hiddenTimeout = undefined;
+ // setTimeout can be delayed in the background and only fire
+ // when we switch to the tab or app again (Hey Android!)
+ if (!document.hidden) {
+ this._suspendApp();
+ }
+ }, 300000);
+ }
window.addEventListener("focus", () => this._onVisible(), { once: true });
}
diff --git a/src/layouts/partial-panel-resolver.ts b/src/layouts/partial-panel-resolver.ts
index a2db064c91..0d9838cb19 100644
--- a/src/layouts/partial-panel-resolver.ts
+++ b/src/layouts/partial-panel-resolver.ts
@@ -162,6 +162,10 @@ class PartialPanelResolver extends HassRouterPage {
}
private _checkVisibility() {
+ if (this.hass.suspendWhenHidden === false) {
+ return;
+ }
+
if (document.hidden) {
this._onHidden();
} else {
diff --git a/src/panels/profile/ha-panel-profile.ts b/src/panels/profile/ha-panel-profile.ts
index 4f8d07e584..e5837150f4 100644
--- a/src/panels/profile/ha-panel-profile.ts
+++ b/src/panels/profile/ha-panel-profile.ts
@@ -35,6 +35,7 @@ import "./ha-pick-theme-row";
import "./ha-push-notifications-row";
import "./ha-refresh-tokens-card";
import "./ha-set-vibrate-row";
+import "./ha-set-suspend-row";
class HaPanelProfile extends LitElement {
@property() public hass!: HomeAssistant;
@@ -137,6 +138,10 @@ class HaPanelProfile extends LitElement {
>
`
: ""}
+