| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2016 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 |
| 5 #include "chrome/browser/android/offline_pages/evaluation/offline_page_evaluatio
n_bridge.h" |
| 6 |
| 7 #include "base/android/callback_android.h" |
| 8 #include "base/android/jni_android.h" |
| 9 #include "base/android/jni_string.h" |
| 10 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" |
| 11 #include "chrome/browser/android/offline_pages/request_coordinator_factory.h" |
| 12 #include "chrome/browser/profiles/profile.h" |
| 13 #include "chrome/browser/profiles/profile_android.h" |
| 14 #include "components/offline_pages/background/request_coordinator.h" |
| 15 #include "components/offline_pages/background/request_notifier.h" |
| 16 #include "components/offline_pages/background/save_page_request.h" |
| 17 #include "components/offline_pages/offline_page_item.h" |
| 18 #include "components/offline_pages/offline_page_model.h" |
| 19 #include "content/public/browser/browser_context.h" |
| 20 #include "jni/OfflinePageEvaluationBridge_jni.h" |
| 21 #include "jni/SavePageRequest_jni.h" |
| 22 |
| 23 using base::android::ConvertJavaStringToUTF8; |
| 24 using base::android::ConvertUTF8ToJavaString; |
| 25 using base::android::JavaParamRef; |
| 26 using base::android::ScopedJavaGlobalRef; |
| 27 using base::android::ScopedJavaLocalRef; |
| 28 |
| 29 namespace offline_pages { |
| 30 namespace android { |
| 31 |
| 32 namespace { |
| 33 |
| 34 void ToJavaOfflinePageList(JNIEnv* env, |
| 35 jobject j_result_obj, |
| 36 const std::vector<OfflinePageItem>& offline_pages) { |
| 37 for (const OfflinePageItem& offline_page : offline_pages) { |
| 38 Java_OfflinePageEvaluationBridge_createOfflinePageAndAddToList( |
| 39 env, j_result_obj, |
| 40 ConvertUTF8ToJavaString(env, offline_page.url.spec()), |
| 41 offline_page.offline_id, |
| 42 ConvertUTF8ToJavaString(env, offline_page.client_id.name_space), |
| 43 ConvertUTF8ToJavaString(env, offline_page.client_id.id), |
| 44 ConvertUTF8ToJavaString(env, offline_page.file_path.value()), |
| 45 offline_page.file_size, offline_page.creation_time.ToJavaTime(), |
| 46 offline_page.access_count, offline_page.last_access_time.ToJavaTime()); |
| 47 } |
| 48 } |
| 49 |
| 50 ScopedJavaLocalRef<jobject> ToJavaSavePageRequest( |
| 51 JNIEnv* env, |
| 52 const SavePageRequest& request) { |
| 53 return Java_SavePageRequest_create( |
| 54 env, static_cast<int>(request.request_state()), request.request_id(), |
| 55 ConvertUTF8ToJavaString(env, request.url().spec()), |
| 56 ConvertUTF8ToJavaString(env, request.client_id().name_space), |
| 57 ConvertUTF8ToJavaString(env, request.client_id().id)); |
| 58 } |
| 59 |
| 60 void GetAllPagesCallback( |
| 61 const ScopedJavaGlobalRef<jobject>& j_result_obj, |
| 62 const ScopedJavaGlobalRef<jobject>& j_callback_obj, |
| 63 const OfflinePageModel::MultipleOfflinePageItemResult& result) { |
| 64 JNIEnv* env = base::android::AttachCurrentThread(); |
| 65 ToJavaOfflinePageList(env, j_result_obj.obj(), result); |
| 66 base::android::RunCallbackAndroid(j_callback_obj, j_result_obj); |
| 67 } |
| 68 |
| 69 void OnPushRequestsDone(const ScopedJavaGlobalRef<jobject>& j_callback_obj, |
| 70 bool result) { |
| 71 base::android::RunCallbackAndroid(j_callback_obj, result); |
| 72 } |
| 73 |
| 74 } // namespace |
| 75 |
| 76 static ScopedJavaLocalRef<jobject> GetBridgeForProfile( |
| 77 JNIEnv* env, |
| 78 const JavaParamRef<jclass>& jcaller, |
| 79 const JavaParamRef<jobject>& j_profile) { |
| 80 Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); |
| 81 |
| 82 OfflinePageModel* offline_page_model = |
| 83 OfflinePageModelFactory::GetForBrowserContext(profile); |
| 84 |
| 85 RequestCoordinator* request_coordinator = |
| 86 RequestCoordinatorFactory::GetForBrowserContext(profile); |
| 87 |
| 88 if (offline_page_model == nullptr || request_coordinator == nullptr) |
| 89 return ScopedJavaLocalRef<jobject>(); |
| 90 |
| 91 OfflinePageEvaluationBridge* bridge = new OfflinePageEvaluationBridge( |
| 92 env, profile, offline_page_model, request_coordinator); |
| 93 |
| 94 return ScopedJavaLocalRef<jobject>(bridge->java_ref()); |
| 95 } |
| 96 |
| 97 // static |
| 98 bool OfflinePageEvaluationBridge::Register(JNIEnv* env) { |
| 99 return RegisterNativesImpl(env); |
| 100 } |
| 101 |
| 102 OfflinePageEvaluationBridge::OfflinePageEvaluationBridge( |
| 103 JNIEnv* env, |
| 104 content::BrowserContext* browser_context, |
| 105 OfflinePageModel* offline_page_model, |
| 106 RequestCoordinator* request_coordinator) |
| 107 : browser_context_(browser_context), |
| 108 offline_page_model_(offline_page_model), |
| 109 request_coordinator_(request_coordinator) { |
| 110 java_ref_.Reset(Java_OfflinePageEvaluationBridge_create( |
| 111 env, reinterpret_cast<jlong>(this))); |
| 112 |
| 113 NotifyIfDoneLoading(); |
| 114 offline_page_model_->AddObserver(this); |
| 115 request_coordinator_->AddObserver(this); |
| 116 } |
| 117 |
| 118 OfflinePageEvaluationBridge::~OfflinePageEvaluationBridge() { |
| 119 JNIEnv* env = base::android::AttachCurrentThread(); |
| 120 Java_OfflinePageEvaluationBridge_offlinePageEvaluationBridgeDestroyed( |
| 121 env, java_ref_); |
| 122 } |
| 123 |
| 124 // Implement OfflinePageModel::Observer |
| 125 void OfflinePageEvaluationBridge::OfflinePageModelLoaded( |
| 126 OfflinePageModel* model) { |
| 127 DCHECK_EQ(offline_page_model_, model); |
| 128 NotifyIfDoneLoading(); |
| 129 } |
| 130 |
| 131 void OfflinePageEvaluationBridge::OfflinePageModelChanged( |
| 132 OfflinePageModel* model) {} |
| 133 |
| 134 void OfflinePageEvaluationBridge::OfflinePageDeleted( |
| 135 int64_t offline_id, |
| 136 const ClientId& client_id) {} |
| 137 |
| 138 // Implement RequestCoordinator::Observer |
| 139 void OfflinePageEvaluationBridge::OnAdded(const SavePageRequest& request) { |
| 140 JNIEnv* env = base::android::AttachCurrentThread(); |
| 141 Java_OfflinePageEvaluationBridge_savePageRequestAdded( |
| 142 env, java_ref_, ToJavaSavePageRequest(env, request)); |
| 143 } |
| 144 |
| 145 void OfflinePageEvaluationBridge::OnCompleted( |
| 146 const SavePageRequest& request, |
| 147 RequestNotifier::BackgroundSavePageResult status) { |
| 148 JNIEnv* env = base::android::AttachCurrentThread(); |
| 149 Java_OfflinePageEvaluationBridge_savePageRequestCompleted( |
| 150 env, java_ref_, ToJavaSavePageRequest(env, request), |
| 151 static_cast<int>(status)); |
| 152 } |
| 153 |
| 154 void OfflinePageEvaluationBridge::OnChanged(const SavePageRequest& request) { |
| 155 JNIEnv* env = base::android::AttachCurrentThread(); |
| 156 Java_OfflinePageEvaluationBridge_savePageRequestChanged( |
| 157 env, java_ref_, ToJavaSavePageRequest(env, request)); |
| 158 } |
| 159 |
| 160 void OfflinePageEvaluationBridge::GetAllPages( |
| 161 JNIEnv* env, |
| 162 const JavaParamRef<jobject>& obj, |
| 163 const JavaParamRef<jobject>& j_result_obj, |
| 164 const JavaParamRef<jobject>& j_callback_obj) { |
| 165 DCHECK(j_result_obj); |
| 166 DCHECK(j_callback_obj); |
| 167 |
| 168 ScopedJavaGlobalRef<jobject> j_result_ref(j_result_obj); |
| 169 ScopedJavaGlobalRef<jobject> j_callback_ref(j_callback_obj); |
| 170 |
| 171 offline_page_model_->GetAllPages( |
| 172 base::Bind(&GetAllPagesCallback, j_result_ref, j_callback_ref)); |
| 173 } |
| 174 |
| 175 void OfflinePageEvaluationBridge::PushRequestProcessing( |
| 176 JNIEnv* env, |
| 177 const JavaParamRef<jobject>& obj, |
| 178 const JavaParamRef<jobject>& j_callback_obj) { |
| 179 ScopedJavaGlobalRef<jobject> j_callback_ref(j_callback_obj); |
| 180 DCHECK(request_coordinator_); |
| 181 base::android::RunCallbackAndroid(j_callback_obj, false); |
| 182 |
| 183 net::NetworkChangeNotifier::ConnectionType connection = |
| 184 net::NetworkChangeNotifier::GetConnectionType(); |
| 185 DeviceConditions device_conditions(false, 0, connection); |
| 186 request_coordinator_->StartProcessing( |
| 187 device_conditions, base::Bind(&OnPushRequestsDone, j_callback_ref)); |
| 188 } |
| 189 |
| 190 void OfflinePageEvaluationBridge::SavePageLater( |
| 191 JNIEnv* env, |
| 192 const JavaParamRef<jobject>& obj, |
| 193 const JavaParamRef<jstring>& j_url, |
| 194 const JavaParamRef<jstring>& j_namespace, |
| 195 const JavaParamRef<jstring>& j_client_id, |
| 196 jboolean user_requested) { |
| 197 offline_pages::ClientId client_id; |
| 198 client_id.name_space = ConvertJavaStringToUTF8(env, j_namespace); |
| 199 client_id.id = ConvertJavaStringToUTF8(env, j_client_id); |
| 200 |
| 201 request_coordinator_->SavePageLater( |
| 202 GURL(ConvertJavaStringToUTF8(env, j_url)), client_id, |
| 203 static_cast<bool>(user_requested), |
| 204 RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER); |
| 205 } |
| 206 |
| 207 void OfflinePageEvaluationBridge::NotifyIfDoneLoading() const { |
| 208 if (!offline_page_model_->is_loaded()) |
| 209 return; |
| 210 JNIEnv* env = base::android::AttachCurrentThread(); |
| 211 Java_OfflinePageEvaluationBridge_offlinePageModelLoaded(env, java_ref_); |
| 212 } |
| 213 |
| 214 } // namespace android |
| 215 } // namespace offline_pages |
| OLD | NEW |