1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/android/radio_utils.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include <optional> 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker #include "base/base_jni/RadioUtils_jni.h" 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker namespace base { 12*6777b538SAndroid Build Coastguard Worker namespace android { 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker namespace { 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker RadioUtils::OverrideForTesting* g_overrider_for_tests = nullptr; 17*6777b538SAndroid Build Coastguard Worker InitializeIsSupported()18*6777b538SAndroid Build Coastguard Workerbool InitializeIsSupported() { 19*6777b538SAndroid Build Coastguard Worker JNIEnv* env = AttachCurrentThread(); 20*6777b538SAndroid Build Coastguard Worker return Java_RadioUtils_isSupported(env); 21*6777b538SAndroid Build Coastguard Worker } 22*6777b538SAndroid Build Coastguard Worker } // namespace 23*6777b538SAndroid Build Coastguard Worker OverrideForTesting()24*6777b538SAndroid Build Coastguard WorkerRadioUtils::OverrideForTesting::OverrideForTesting() { 25*6777b538SAndroid Build Coastguard Worker DCHECK(!g_overrider_for_tests); 26*6777b538SAndroid Build Coastguard Worker g_overrider_for_tests = this; 27*6777b538SAndroid Build Coastguard Worker } 28*6777b538SAndroid Build Coastguard Worker ~OverrideForTesting()29*6777b538SAndroid Build Coastguard WorkerRadioUtils::OverrideForTesting::~OverrideForTesting() { 30*6777b538SAndroid Build Coastguard Worker DCHECK(g_overrider_for_tests); 31*6777b538SAndroid Build Coastguard Worker g_overrider_for_tests = nullptr; 32*6777b538SAndroid Build Coastguard Worker } 33*6777b538SAndroid Build Coastguard Worker IsSupported()34*6777b538SAndroid Build Coastguard Workerbool RadioUtils::IsSupported() { 35*6777b538SAndroid Build Coastguard Worker static const bool kIsSupported = InitializeIsSupported(); 36*6777b538SAndroid Build Coastguard Worker return kIsSupported; 37*6777b538SAndroid Build Coastguard Worker } 38*6777b538SAndroid Build Coastguard Worker GetConnectionType()39*6777b538SAndroid Build Coastguard WorkerRadioConnectionType RadioUtils::GetConnectionType() { 40*6777b538SAndroid Build Coastguard Worker if (g_overrider_for_tests) { 41*6777b538SAndroid Build Coastguard Worker // If GetConnectionType is being used in tests 42*6777b538SAndroid Build Coastguard Worker return g_overrider_for_tests->GetConnectionType(); 43*6777b538SAndroid Build Coastguard Worker } 44*6777b538SAndroid Build Coastguard Worker if (!IsSupported()) 45*6777b538SAndroid Build Coastguard Worker return RadioConnectionType::kUnknown; 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker JNIEnv* env = AttachCurrentThread(); 48*6777b538SAndroid Build Coastguard Worker if (Java_RadioUtils_isWifiConnected(env)) { 49*6777b538SAndroid Build Coastguard Worker return RadioConnectionType::kWifi; 50*6777b538SAndroid Build Coastguard Worker } else { 51*6777b538SAndroid Build Coastguard Worker return RadioConnectionType::kCell; 52*6777b538SAndroid Build Coastguard Worker } 53*6777b538SAndroid Build Coastguard Worker } 54*6777b538SAndroid Build Coastguard Worker GetCellSignalLevel()55*6777b538SAndroid Build Coastguard Workerstd::optional<RadioSignalLevel> RadioUtils::GetCellSignalLevel() { 56*6777b538SAndroid Build Coastguard Worker if (!IsSupported()) 57*6777b538SAndroid Build Coastguard Worker return std::nullopt; 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker JNIEnv* env = AttachCurrentThread(); 60*6777b538SAndroid Build Coastguard Worker int signal_level = Java_RadioUtils_getCellSignalLevel(env); 61*6777b538SAndroid Build Coastguard Worker if (signal_level < 0) { 62*6777b538SAndroid Build Coastguard Worker return std::nullopt; 63*6777b538SAndroid Build Coastguard Worker } else { 64*6777b538SAndroid Build Coastguard Worker return static_cast<RadioSignalLevel>(signal_level); 65*6777b538SAndroid Build Coastguard Worker } 66*6777b538SAndroid Build Coastguard Worker } 67*6777b538SAndroid Build Coastguard Worker GetCellDataActivity()68*6777b538SAndroid Build Coastguard Workerstd::optional<RadioDataActivity> RadioUtils::GetCellDataActivity() { 69*6777b538SAndroid Build Coastguard Worker if (!IsSupported()) 70*6777b538SAndroid Build Coastguard Worker return std::nullopt; 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker JNIEnv* env = AttachCurrentThread(); 73*6777b538SAndroid Build Coastguard Worker return static_cast<RadioDataActivity>( 74*6777b538SAndroid Build Coastguard Worker Java_RadioUtils_getCellDataActivity(env)); 75*6777b538SAndroid Build Coastguard Worker } 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker } // namespace android 78*6777b538SAndroid Build Coastguard Worker } // namespace base 79