| // Copyright 2020 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/flags/android/chrome_session_state.h" |
| |
| #include "base/metrics/histogram_macros.h" |
| #include "base/notreached.h" |
| #include "chrome/browser/browser_process.h" |
| #include "components/prefs/pref_registry_simple.h" |
| #include "components/prefs/pref_service.h" |
| #include "services/metrics/public/cpp/ukm_source.h" |
| |
| // Must come after all headers that specialize FromJniType() / ToJniType(). |
| #include "chrome/browser/flags/jni_headers/ChromeSessionState_jni.h" |
| |
| using chrome::android::ActivityType; |
| using chrome::android::DarkModeState; |
| |
| namespace { |
| ActivityType activity_type = ActivityType::kPreFirstTab; |
| bool is_in_multi_window_mode = false; |
| DarkModeState dark_mode_state = DarkModeState::kUnknown; |
| |
| // Name of local state pref to persist the last |chrome::android::ActivityType|. |
| const char kLastActivityTypePref[] = |
| "user_experience_metrics.last_activity_type"; |
| |
| } // namespace |
| |
| namespace chrome { |
| namespace android { |
| |
| CustomTabsVisibilityHistogram GetCustomTabsVisibleValue( |
| ActivityType activity_type) { |
| switch (activity_type) { |
| case ActivityType::kTabbed: |
| case ActivityType::kWebapp: |
| case ActivityType::kWebApk: |
| return VISIBLE_CHROME_TAB; |
| case ActivityType::kCustomTab: |
| case ActivityType::kTrustedWebActivity: |
| case ActivityType::kAuthTab: |
| return VISIBLE_CUSTOM_TAB; |
| case ActivityType::kPreFirstTab: |
| return NO_VISIBLE_TAB; |
| } |
| NOTREACHED(); |
| } |
| |
| ActivityType GetInitialActivityTypeForTesting() { |
| return activity_type; |
| } |
| |
| void SetInitialActivityTypeForTesting(ActivityType type) { |
| activity_type = type; |
| } |
| |
| void SetActivityType(PrefService* local_state, ActivityType type) { |
| DCHECK(local_state); |
| DCHECK_NE(type, ActivityType::kPreFirstTab); |
| |
| ActivityType prev_activity_type = activity_type; |
| activity_type = type; |
| |
| // EmitActivityTypeHistograms on first SetActivityType call. |
| if (prev_activity_type == ActivityType::kPreFirstTab) { |
| EmitActivityTypeHistograms(activity_type); |
| SaveActivityTypeToLocalState(local_state, activity_type); |
| } |
| |
| ukm::UkmSource::SetAndroidActivityTypeState(static_cast<int>(activity_type)); |
| } |
| |
| ActivityType GetActivityType() { |
| return activity_type; |
| } |
| |
| DarkModeState GetDarkModeState() { |
| return dark_mode_state; |
| } |
| |
| bool GetIsInMultiWindowModeValue() { |
| return is_in_multi_window_mode; |
| } |
| |
| void EmitActivityTypeHistograms(ActivityType type) { |
| UMA_STABILITY_HISTOGRAM_ENUMERATION("CustomTabs.Visible", |
| GetCustomTabsVisibleValue(type)); |
| UMA_STABILITY_HISTOGRAM_ENUMERATION("Android.ChromeActivity.Type", type); |
| } |
| |
| void RegisterActivityTypePrefs(PrefRegistrySimple* registry) { |
| DCHECK(registry); |
| // Register with a default value of -1 which is not a valid enum value. |
| registry->RegisterIntegerPref(kLastActivityTypePref, -1); |
| } |
| |
| std::optional<chrome::android::ActivityType> GetActivityTypeFromLocalState( |
| PrefService* local_state) { |
| auto value = local_state->GetInteger(kLastActivityTypePref); |
| if (value >= static_cast<int>(ActivityType::kTabbed) && |
| value <= static_cast<int>(ActivityType::kMaxValue)) { |
| return static_cast<ActivityType>(value); |
| } |
| return std::nullopt; |
| } |
| |
| void SaveActivityTypeToLocalState(PrefService* local_state, |
| chrome::android::ActivityType value) { |
| local_state->SetInteger(kLastActivityTypePref, static_cast<int>(value)); |
| } |
| |
| MultipleUserProfilesState GetMultipleUserProfilesState() { |
| static MultipleUserProfilesState multiple_user_profiles_state = |
| static_cast<MultipleUserProfilesState>( |
| Java_ChromeSessionState_getMultipleUserProfilesState( |
| jni_zero::AttachCurrentThread())); |
| return multiple_user_profiles_state; |
| } |
| |
| } // namespace android |
| } // namespace chrome |
| |
| static void JNI_ChromeSessionState_SetActivityType(JNIEnv* env, jint type) { |
| DCHECK(g_browser_process); |
| DCHECK(g_browser_process->local_state()); |
| chrome::android::SetActivityType(g_browser_process->local_state(), |
| static_cast<ActivityType>(type)); |
| } |
| |
| static void JNI_ChromeSessionState_SetDarkModeState(JNIEnv* env, jint state) { |
| dark_mode_state = static_cast<DarkModeState>(state); |
| } |
| |
| static void JNI_ChromeSessionState_SetIsInMultiWindowMode( |
| JNIEnv* env, |
| jboolean j_is_in_multi_window_mode) { |
| is_in_multi_window_mode = j_is_in_multi_window_mode; |
| } |