1414
1515#include " app_check/src/android/debug_provider_android.h"
1616
17+ #include < string>
18+ #include < vector>
19+
1720#include " app/src/app_common.h"
21+ #include " app/src/embedded_file.h"
1822#include " app/src/util_android.h"
1923#include " app_check/src/android/common_android.h"
2024#include " firebase/app_check/debug_provider.h"
@@ -43,24 +47,45 @@ METHOD_LOOKUP_DEFINITION(
4347 " com/google/firebase/appcheck/debug/DebugAppCheckProviderFactory" ,
4448 DEBUG_PROVIDER_FACTORY_METHODS)
4549
50+ // clang-format off
51+ #define JNI_APP_CHECK_DEBUG_HELPER_METHODS (X ) \
52+ X (SetDebugToken, " SetDebugToken" , \
53+ " (Lcom/google/firebase/FirebaseApp;Ljava/lang/String;)V" , \
54+ util::kMethodTypeStatic )
55+ // clang-format on
56+
57+ METHOD_LOOKUP_DECLARATION (jni_debug_helper, JNI_APP_CHECK_DEBUG_HELPER_METHODS)
58+ METHOD_LOOKUP_DEFINITION (
59+ jni_debug_helper,
60+ " com/google/firebase/appcheck/internal/cpp/JniAppCheckDebugHelper" ,
61+ JNI_APP_CHECK_DEBUG_HELPER_METHODS)
62+
4663static bool g_methods_cached = false ;
4764
4865const char kMethodsNotCachedError [] =
4966 " DebugAppCheckProviderFactory methods were not cached." ;
5067
51- bool CacheDebugProviderMethodIds (JNIEnv* env, jobject activity) {
52- // Cache the DebugProvider classes.
53- g_methods_cached = debug_provider_factory::CacheMethodIds (env, activity);
68+ bool CacheDebugProviderMethodIds (
69+ JNIEnv* env, jobject activity,
70+ const std::vector<firebase::internal::EmbeddedFile>& embedded_files) {
71+ // Cache the DebugProvider and JniAppCheckDebugHelper classes.
72+ g_methods_cached =
73+ debug_provider_factory::CacheMethodIds (env, activity) &&
74+ jni_debug_helper::CacheClassFromFiles (env, activity, &embedded_files) &&
75+ jni_debug_helper::CacheMethodIds (env, activity);
5476 return g_methods_cached;
5577}
5678
5779void ReleaseDebugProviderClasses (JNIEnv* env) {
5880 debug_provider_factory::ReleaseClass (env);
81+ jni_debug_helper::ReleaseClass (env);
5982 g_methods_cached = false ;
6083}
6184
6285DebugAppCheckProviderFactoryInternal::DebugAppCheckProviderFactoryInternal ()
63- : created_providers_(), android_provider_factory_(nullptr ) {}
86+ : created_providers_(),
87+ android_provider_factory_ (nullptr ),
88+ debug_token_() {}
6489
6590DebugAppCheckProviderFactoryInternal::~DebugAppCheckProviderFactoryInternal () {
6691 for (auto it = created_providers_.begin (); it != created_providers_.end ();
@@ -98,6 +123,19 @@ AppCheckProvider* DebugAppCheckProviderFactoryInternal::CreateProvider(
98123 env->DeleteLocalRef (j_provider_factory_local);
99124 }
100125 jobject platform_app = app->GetPlatformApp ();
126+
127+ // Before making the Provider, which is when Android reads the Debug token,
128+ // if we have a token to override it with, use it.
129+ if (!debug_token_.empty ()) {
130+ jstring java_token = env->NewStringUTF (debug_token_.c_str ());
131+ env->CallStaticVoidMethod (
132+ jni_debug_helper::GetClass (),
133+ jni_debug_helper::GetMethodId (jni_debug_helper::kSetDebugToken ),
134+ platform_app, java_token);
135+ FIREBASE_ASSERT (!util::CheckAndClearJniExceptions (env));
136+ env->DeleteLocalRef (java_token);
137+ }
138+
101139 jobject j_android_provider_local = env->CallObjectMethod (
102140 android_provider_factory_,
103141 debug_provider_factory::GetMethodId (debug_provider_factory::kCreate ),
@@ -114,6 +152,12 @@ AppCheckProvider* DebugAppCheckProviderFactoryInternal::CreateProvider(
114152 return cpp_provider;
115153}
116154
155+ void DebugAppCheckProviderFactoryInternal::SetDebugToken (
156+ const std::string& token) {
157+ // The App may not exist yet, so we save the debug token to use later.
158+ debug_token_ = token;
159+ }
160+
117161} // namespace internal
118162} // namespace app_check
119163} // namespace firebase
0 commit comments