File: arc_locked_fullscreen_manager.cc

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (120 lines) | stat: -rw-r--r-- 4,368 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ash/arc/locked_fullscreen/arc_locked_fullscreen_manager.h"

#include "ash/constants/ash_features.h"
#include "base/check.h"
#include "base/metrics/histogram_functions.h"
#include "chrome/browser/ash/arc/arc_util.h"
#include "chrome/browser/ash/arc/session/arc_session_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
#include "chromeos/ash/components/dbus/concierge/concierge_client.h"
#include "chromeos/ash/components/dbus/vm_concierge/concierge_service.pb.h"
#include "chromeos/ash/experiences/arc/arc_util.h"

namespace arc {
namespace {
constexpr char kMuteAudioWithSuccessHistogram[] = "Arc.MuteAudioSuccess";
constexpr char kUnmuteAudioWithSuccessHistogram[] = "Arc.UnmuteAudioSuccess";
}  // namespace

ArcLockedFullscreenManager::ArcLockedFullscreenManager(Profile* profile)
    : profile_(profile->GetWeakPtr()) {}

ArcLockedFullscreenManager::~ArcLockedFullscreenManager() = default;

void ArcLockedFullscreenManager::UpdateForLockedFullscreenMode(bool locked) {
  if (!profile_) {
    return;
  }

  arc::ArcSessionManager* const arc_session_manager =
      arc::ArcSessionManager::Get();
  if (!arc_session_manager) {
    return;
  }

  // Disable ARC audio when in locked fullscreen mode (or enable them if
  // unlocked) as long as the `BocaOnTaskMuteArcAudio` feature flag is enabled.
  // This eliminates the need for disabling critical ARC apps.
  if (ash::features::IsBocaOnTaskMuteArcAudioEnabled()) {
    mute_audio_requested_ = locked;
    if (arc_session_manager->state() != ArcSessionManager::State::ACTIVE) {
      // ARC is not up, so delay the mute/unmute operation.
      if (!arc_session_manager_observation_.IsObserving()) {
        arc_session_manager_observation_.Observe(arc_session_manager);
      }
      return;
    }
    MuteOrUnmuteArcAudio();
    return;
  }

  // Fall back to the deprecated flow that disables ARC to prepare for locked
  // fullscreen mode otherwise.
  // TODO - crbug.com/400483081: Remove deprecated flow.
  if (locked) {
    // Disable ARC, preserve data.
    arc_session_manager->RequestDisable();
  } else {
    // Re-enable ARC if needed.
    if (arc::IsArcPlayStoreEnabledForProfile(profile_.get())) {
      arc_session_manager->RequestEnable();
    }
  }
}

void ArcLockedFullscreenManager::OnArcStarted() {
  MuteOrUnmuteArcAudio();
}

void ArcLockedFullscreenManager::OnShutdown() {
  arc_session_manager_observation_.Reset();
}

void ArcLockedFullscreenManager::MuteOrUnmuteArcAudio() {
  if (!profile_ || !mute_audio_requested_.has_value()) {
    return;
  }

  vm_tools::concierge::MuteVmAudioRequest request;
  request.set_owner_id(
      ash::BrowserContextHelper::GetUserIdHashFromBrowserContext(
          profile_.get()));
  request.set_name(kArcVmName);
  request.set_muted(mute_audio_requested_.value());
  ash::ConciergeClient::Get()->MuteVmAudio(
      request, base::BindOnce(
                   &ArcLockedFullscreenManager::OnMuteOrUnmuteArcAudioProcessed,
                   weak_ptr_factory_.GetWeakPtr(), request.muted()));
}

void ArcLockedFullscreenManager::OnMuteOrUnmuteArcAudioProcessed(
    bool mute,
    std::optional<vm_tools::concierge::SuccessFailureResponse> response) {
  const char* const histogram_name =
      mute ? kMuteAudioWithSuccessHistogram : kUnmuteAudioWithSuccessHistogram;
  if (!response || !response.has_value() || !response->success()) {
    LOG(ERROR) << "Failed to process ARC audio request with mute value: "
               << mute;
    base::UmaHistogramBoolean(histogram_name, false);
    return;
  }
  base::UmaHistogramBoolean(histogram_name, true);

  // Clear `mute_audio_requested_` only if ARC audio was successfully unmuted
  // and there are no more pending mute audio requests. This ensures that we do
  // not submit ARC unmute audio requests unnecessarily on restart. Mute audio
  // requests are meant to persist across ARC restarts when in locked fullscreen
  // mode.
  if (!mute && mute_audio_requested_.has_value() &&
      !mute_audio_requested_.value()) {
    mute_audio_requested_ = std::nullopt;
    arc_session_manager_observation_.Reset();
  }
}

}  // namespace arc