multidevice_feature_opt_in_view.cc 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/system/phonehub/multidevice_feature_opt_in_view.h"
  5. #include <memory>
  6. #include <string>
  7. #include "ash/components/multidevice/logging/logging.h"
  8. #include "ash/components/phonehub/multidevice_feature_access_manager.h"
  9. #include "ash/components/phonehub/util/histogram_util.h"
  10. #include "ash/constants/ash_features.h"
  11. #include "ash/public/cpp/new_window_delegate.h"
  12. #include "ash/strings/grit/ash_strings.h"
  13. #include "ash/style/ash_color_provider.h"
  14. #include "ash/system/phonehub/phone_hub_metrics.h"
  15. #include "ash/system/phonehub/phone_hub_view_ids.h"
  16. #include "ui/base/metadata/metadata_impl_macros.h"
  17. namespace ash {
  18. using ash::phonehub::util::LogPermissionOnboardingPromoAction;
  19. using ash::phonehub::util::LogPermissionOnboardingPromoShown;
  20. using ash::phonehub::util::PermissionsOnboardingScreenEvent;
  21. using ash::phonehub::util::PermissionsOnboardingSetUpMode;
  22. using multidevice_setup::mojom::Feature;
  23. namespace {
  24. // URL of the multidevice settings page with the URL parameter that will
  25. // start up the opt-in-flow.
  26. // TODO: Update this URL once the new access setup dialog has been updated
  27. constexpr char kMultideviceSettingsUrl[] =
  28. "chrome://os-settings/multidevice/"
  29. "features?showPhonePermissionSetupDialog&mode=%d";
  30. PermissionsOnboardingSetUpMode GetPermissionSetupMode(
  31. phonehub::MultideviceFeatureAccessManager*
  32. multidevice_feature_access_manager) {
  33. bool can_request_notification_access =
  34. multidevice_feature_access_manager->GetNotificationAccessStatus() ==
  35. phonehub::MultideviceFeatureAccessManager::AccessStatus::
  36. kAvailableButNotGranted;
  37. bool can_request_apps_acess =
  38. features::IsEcheSWAEnabled() &&
  39. multidevice_feature_access_manager->IsAccessRequestAllowed(
  40. Feature::kEche) &&
  41. multidevice_feature_access_manager->GetAppsAccessStatus() ==
  42. phonehub::MultideviceFeatureAccessManager::AccessStatus::
  43. kAvailableButNotGranted;
  44. bool can_request_camera_roll_access =
  45. features::IsPhoneHubCameraRollEnabled() &&
  46. multidevice_feature_access_manager->IsAccessRequestAllowed(
  47. Feature::kPhoneHubCameraRoll) &&
  48. multidevice_feature_access_manager->GetCameraRollAccessStatus() ==
  49. phonehub::MultideviceFeatureAccessManager::AccessStatus::
  50. kAvailableButNotGranted;
  51. PA_LOG(INFO) << "MultideviceFeatureOptInView can_request_notification_access:"
  52. << can_request_notification_access
  53. << ", can_request_apps_acess:" << can_request_apps_acess
  54. << ", can_request_camera_roll_access:"
  55. << can_request_camera_roll_access;
  56. if (can_request_notification_access && can_request_camera_roll_access &&
  57. can_request_apps_acess) {
  58. return PermissionsOnboardingSetUpMode::kAllPermissions;
  59. } else if (can_request_notification_access && can_request_apps_acess &&
  60. !can_request_camera_roll_access) {
  61. return PermissionsOnboardingSetUpMode::kNotificationAndMessagingApps;
  62. } else if (can_request_apps_acess && can_request_camera_roll_access &&
  63. !can_request_notification_access) {
  64. return PermissionsOnboardingSetUpMode::kMessagingAppsAndCameraRoll;
  65. } else if (can_request_notification_access &&
  66. can_request_camera_roll_access && !can_request_apps_acess) {
  67. return PermissionsOnboardingSetUpMode::kNotificationAndCameraRoll;
  68. } else if (!can_request_notification_access &&
  69. !can_request_camera_roll_access && can_request_apps_acess) {
  70. return PermissionsOnboardingSetUpMode::kMessagingApps;
  71. } else if (!can_request_notification_access && !can_request_apps_acess &&
  72. can_request_camera_roll_access) {
  73. return PermissionsOnboardingSetUpMode::kCameraRoll;
  74. } else if (!can_request_camera_roll_access && !can_request_apps_acess &&
  75. can_request_notification_access) {
  76. return PermissionsOnboardingSetUpMode::kNotification;
  77. }
  78. return PermissionsOnboardingSetUpMode::kNone;
  79. }
  80. int GetDescriptionStringId(phonehub::MultideviceFeatureAccessManager*
  81. multidevice_feature_access_manager) {
  82. PermissionsOnboardingSetUpMode permission_setup_mode =
  83. GetPermissionSetupMode(multidevice_feature_access_manager);
  84. switch (permission_setup_mode) {
  85. case PermissionsOnboardingSetUpMode::kCameraRoll:
  86. return IDS_ASH_PHONE_HUB_CAMERA_ROLL_OPT_IN_DESCRIPTION;
  87. case PermissionsOnboardingSetUpMode::kMessagingApps:
  88. return IDS_ASH_PHONE_HUB_APPS_OPT_IN_DESCRIPTION;
  89. case PermissionsOnboardingSetUpMode::kNotificationAndCameraRoll:
  90. return IDS_ASH_PHONE_HUB_NOTIFICATION_AND_CAMERA_ROLL_OPT_IN_DESCRIPTION;
  91. case PermissionsOnboardingSetUpMode::kNotification:
  92. return IDS_ASH_PHONE_HUB_NOTIFICATION_OPT_IN_DESCRIPTION;
  93. case PermissionsOnboardingSetUpMode::kNotificationAndMessagingApps:
  94. return IDS_ASH_PHONE_HUB_NOTIFICATION_AND_APPS_OPT_IN_DESCRIPTION;
  95. case PermissionsOnboardingSetUpMode::kMessagingAppsAndCameraRoll:
  96. return IDS_ASH_PHONE_HUB_CAMERA_ROLL_AND_APPS_OPT_IN_DESCRIPTION;
  97. case PermissionsOnboardingSetUpMode::kAllPermissions:
  98. return IDS_ASH_PHONE_HUB_ALL_FEATURES_OPT_IN_DESCRIPTION;
  99. case PermissionsOnboardingSetUpMode::kNone:
  100. default:
  101. // Just return the default strings since the MultideviceFeatureOptInView
  102. // will be invisible.
  103. return IDS_ASH_PHONE_HUB_NOTIFICATION_OPT_IN_DESCRIPTION;
  104. }
  105. }
  106. std::string GetMultiDeviceSettingUrl(
  107. PermissionsOnboardingSetUpMode permission_setup_mode) {
  108. return base::StringPrintf(kMultideviceSettingsUrl,
  109. static_cast<int>(permission_setup_mode));
  110. }
  111. } // namespace
  112. MultideviceFeatureOptInView::MultideviceFeatureOptInView(
  113. phonehub::MultideviceFeatureAccessManager*
  114. multidevice_feature_access_manager)
  115. : SubFeatureOptInView(
  116. PhoneHubViewID::kMultideviceFeatureOptInView,
  117. GetDescriptionStringId(multidevice_feature_access_manager),
  118. IDS_ASH_PHONE_HUB_NOTIFICATION_OPT_IN_SET_UP_BUTTON),
  119. multidevice_feature_access_manager_(multidevice_feature_access_manager) {
  120. DCHECK(multidevice_feature_access_manager_);
  121. setup_mode_ = GetPermissionSetupMode(multidevice_feature_access_manager_);
  122. access_manager_observation_.Observe(multidevice_feature_access_manager_);
  123. // Checks and updates its visibility upon creation.
  124. UpdateVisibility();
  125. LogPermissionOnboardingPromoShown(setup_mode_);
  126. }
  127. MultideviceFeatureOptInView::~MultideviceFeatureOptInView() = default;
  128. void MultideviceFeatureOptInView::SetUpButtonPressed() {
  129. // Opens the set up dialog in settings to start the opt in flow.
  130. LogPermissionOnboardingPromoAction(
  131. PermissionsOnboardingScreenEvent::kSetUpOrDone);
  132. // This intentionally uses GetInstance() to open an OS Settings page in ash.
  133. std::string url = GetMultiDeviceSettingUrl(setup_mode_);
  134. PA_LOG(INFO) << "MultideviceFeatureOptInView SetUpButtonPressed target url:"
  135. << url;
  136. NewWindowDelegate::GetInstance()->OpenUrl(
  137. GURL(url), NewWindowDelegate::OpenUrlFrom::kUserInteraction,
  138. NewWindowDelegate::Disposition::kNewForegroundTab);
  139. }
  140. void MultideviceFeatureOptInView::DismissButtonPressed() {
  141. // Dismiss this view if user chose to opt out and update the bubble size.
  142. LogPermissionOnboardingPromoAction(
  143. PermissionsOnboardingScreenEvent::kDismissOrCancel);
  144. SetVisible(false);
  145. multidevice_feature_access_manager_->DismissSetupRequiredUi();
  146. }
  147. void MultideviceFeatureOptInView::OnNotificationAccessChanged() {
  148. UpdateVisibility();
  149. }
  150. void MultideviceFeatureOptInView::OnCameraRollAccessChanged() {
  151. UpdateVisibility();
  152. }
  153. void MultideviceFeatureOptInView::UpdateVisibility() {
  154. DCHECK(multidevice_feature_access_manager_);
  155. // Refresh the permission status if changed
  156. phonehub::util::PermissionsOnboardingSetUpMode current_mode =
  157. GetPermissionSetupMode(multidevice_feature_access_manager_);
  158. if (current_mode != setup_mode_) {
  159. setup_mode_ = current_mode;
  160. RefreshDescription(
  161. GetDescriptionStringId(multidevice_feature_access_manager_));
  162. }
  163. SetVisible(setup_mode_ != PermissionsOnboardingSetUpMode::kNone &&
  164. !multidevice_feature_access_manager_
  165. ->HasMultideviceFeatureSetupUiBeenDismissed());
  166. PreferredSizeChanged();
  167. }
  168. BEGIN_METADATA(MultideviceFeatureOptInView, views::View)
  169. END_METADATA
  170. } // namespace ash