1818#include < jni.h>
1919#include " app/src/include/firebase/app.h"
2020#include " app/src/include/firebase/future.h"
21+ #include " app/src/include/firebase/log.h"
2122#include " app/src/reference_counted_future_impl.h"
2223#include " app/src/util_android.h"
2324#include " database/database_resources.h"
@@ -35,6 +36,19 @@ namespace internal {
3536
3637const char kApiIdentifier [] = " Database" ;
3738
39+ // clang-format off
40+ #define LOGGER_LEVEL_METHODS (X ) \
41+ X (ValueOf, " valueOf" , \
42+ " (Ljava/lang/String;)Lcom/google/firebase/database/Logger$Level;" , \
43+ util::kMethodTypeStatic )
44+ // clang-format on
45+ METHOD_LOOKUP_DECLARATION (logger_level, LOGGER_LEVEL_METHODS)
46+
47+ METHOD_LOOKUP_DEFINITION (
48+ logger_level,
49+ PROGUARD_KEEP_CLASS " com/google/firebase/database/Logger$Level" ,
50+ LOGGER_LEVEL_METHODS)
51+
3852// clang-format off
3953#define FIREBASE_DATABASE_METHODS (X ) \
4054 X (GetInstance, " getInstance" , \
@@ -147,7 +161,7 @@ Mutex DatabaseInternal::init_mutex_; // NOLINT
147161int DatabaseInternal::initialize_count_ = 0 ;
148162std::map<jint, Error>* DatabaseInternal::java_error_to_cpp_ = nullptr ;
149163
150- DatabaseInternal::DatabaseInternal (App* app) {
164+ DatabaseInternal::DatabaseInternal (App* app) : log_level_( kLogLevelInfo ) {
151165 app_ = nullptr ;
152166 if (!Initialize (app)) return ;
153167 app_ = app;
@@ -170,7 +184,7 @@ DatabaseInternal::DatabaseInternal(App* app) {
170184}
171185
172186DatabaseInternal::DatabaseInternal (App* app, const char * url)
173- : constructor_url_(url) {
187+ : constructor_url_(url), log_level_( kLogLevelInfo ) {
174188 app_ = nullptr ;
175189 if (!Initialize (app)) return ;
176190 app_ = app;
@@ -213,12 +227,23 @@ static const struct {
213227 {database_error::kFieldCount , kErrorNone }, // sentinel value for end
214228};
215229
230+ // C++ log levels mapped to Logger.Level enum value names.
231+ const char * kCppLogLevelToLoggerLevelName [] = {
232+ " DEBUG" , // kLogLevelVerbose --> Logger.Level.DEBUG
233+ " DEBUG" , // kLogLevelDebug --> Logger.Level.DEBUG
234+ " INFO" , // kLogLevelInfo --> Logger.Level.INFO
235+ " WARN" , // kLogLevelWarning --> Logger.Level.WARN
236+ " ERROR" , // kLogLevelError --> Logger.Level.ERROR
237+ " NONE" , // kLogLevelAssert --> Logger.Level.NONE
238+ };
239+
216240bool DatabaseInternal::Initialize (App* app) {
217241 MutexLock init_lock (init_mutex_);
218242 if (initialize_count_ == 0 ) {
219243 JNIEnv* env = app->GetJNIEnv ();
220244 jobject activity = app->activity ();
221245 if (!(firebase_database::CacheMethodIds (env, activity) &&
246+ logger_level::CacheMethodIds (env, activity) &&
222247 database_error::CacheMethodIds (env, activity) &&
223248 database_error::CacheFieldIds (env, activity) &&
224249 // Call Initialize on all other RTDB internal classes.
@@ -332,6 +357,7 @@ bool DatabaseInternal::InitializeEmbeddedClasses(App* app) {
332357void DatabaseInternal::ReleaseClasses (App* app) {
333358 JNIEnv* env = app->GetJNIEnv ();
334359 firebase_database::ReleaseClass (env);
360+ logger_level::ReleaseClass (env);
335361 database_error::ReleaseClass (env);
336362
337363 // Call Terminate on all other RTDB internal classes.
@@ -493,6 +519,33 @@ void DatabaseInternal::SetPersistenceEnabled(bool enabled) const {
493519 util::CheckAndClearJniExceptions (env);
494520}
495521
522+ void DatabaseInternal::set_log_level (LogLevel log_level) {
523+ FIREBASE_ASSERT_RETURN_VOID (log_level <
524+ (sizeof (kCppLogLevelToLoggerLevelName ) /
525+ sizeof (kCppLogLevelToLoggerLevelName [0 ])));
526+ JNIEnv* env = app_->GetJNIEnv ();
527+ jstring enum_name = env->NewStringUTF (
528+ kCppLogLevelToLoggerLevelName [log_level]);
529+ if (!util::CheckAndClearJniExceptions (env)) {
530+ jobject log_level_enum_obj = env->CallStaticObjectMethod (
531+ logger_level::GetClass (),
532+ logger_level::GetMethodId (logger_level::kValueOf ), enum_name);
533+ if (!util::CheckAndClearJniExceptions (env)) {
534+ env->CallVoidMethod (
535+ obj_,
536+ firebase_database::GetMethodId (firebase_database::kSetLogLevel ),
537+ log_level_enum_obj);
538+ if (!util::CheckAndClearJniExceptions (env)) {
539+ log_level_ = log_level;
540+ }
541+ env->DeleteLocalRef (log_level_enum_obj);
542+ }
543+ env->DeleteLocalRef (enum_name);
544+ }
545+ }
546+
547+ LogLevel DatabaseInternal::log_level () const { return log_level_; }
548+
496549Error DatabaseInternal::ErrorFromResultAndErrorCode (
497550 util::FutureResult result_code, jint error_code) const {
498551 switch (result_code) {
0 commit comments