Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2395)

Unified Diff: chrome/browser/android/download/chrome_download_delegate.cc

Issue 580043002: [Android] Prompt with infobar on filename conflict (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: avoided Java-only infobar Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/android/download/chrome_download_delegate.cc
diff --git a/chrome/browser/android/download/chrome_download_delegate.cc b/chrome/browser/android/download/chrome_download_delegate.cc
index 96382979204d6b734040d2aa7980d67d80ed6d4c..804f65d05fa8df9edf9010df7437b42304ac5af7 100644
--- a/chrome/browser/android/download/chrome_download_delegate.cc
+++ b/chrome/browser/android/download/chrome_download_delegate.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <chrome/browser/android/download/download_overwrite_infobar_delegate_java_initiated.h>
Peter Kasting 2015/02/25 06:24:57 Both the location of this include and its use of a
Changwan Ryu 2015/03/02 14:46:36 Must be the result of eclipse auto refactoring. Do
#include "chrome/browser/android/download/chrome_download_delegate.h"
#include <jni.h>
@@ -9,18 +10,19 @@
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
+#include "base/bind.h"
+#include "base/callback.h"
#include "base/files/file_path.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/android/download/download_overwrite_info.h"
#include "chrome/browser/android/tab_android.h"
#include "chrome/browser/download/download_extensions.h"
+#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/grit/generated_resources.h"
#include "content/public/browser/android/download_controller_android.h"
#include "jni/ChromeDownloadDelegate_jni.h"
#include "ui/base/l10n/l10n_util.h"
-bool RegisterChromeDownloadDeleagte(JNIEnv* env) {
- return RegisterNativesImpl(env);
-}
-
// Gets the download warning text for the given file name.
static jstring GetDownloadWarningText(
JNIEnv* env, jclass clazz, jstring filename) {
@@ -45,3 +47,97 @@ static void DangerousDownloadValidated(
content::DownloadControllerAndroid::Get()->DangerousDownloadValidated(
tab_android->web_contents(), download_id, accept);
}
+
+// A class for keeping track of Java ChromeDownloadDelegate object and handling
+// PromptUserDone callback.
+class PromptUserDoneCB {
+ public:
+ PromptUserDoneCB(JNIEnv* env, jobject obj) : weak_java_obj_(env, obj) {}
+
+ ~PromptUserDoneCB() {}
+
+ void PromptUserDone(
+ const chrome::android::DownloadOverwriteInfo& download_overwrite_info) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> jobj = weak_java_obj_.get(env);
+ if (!jobj.obj())
+ return;
+
+ if (download_overwrite_info.dismissed)
+ return;
+
+ ScopedJavaLocalRef<jstring> jfile_name =
+ base::android::ConvertUTF8ToJavaString(
+ env, download_overwrite_info.file_name);
+ ScopedJavaLocalRef<jstring> jurl = base::android::ConvertUTF8ToJavaString(
+ env, download_overwrite_info.url);
+ ScopedJavaLocalRef<jstring> juser_agent =
+ base::android::ConvertUTF8ToJavaString(
+ env, download_overwrite_info.user_agent);
+ ScopedJavaLocalRef<jstring> jcontent_disposition =
+ base::android::ConvertUTF8ToJavaString(
+ env, download_overwrite_info.content_disposition);
+ ScopedJavaLocalRef<jstring> jmime_type =
+ base::android::ConvertUTF8ToJavaString(
+ env, download_overwrite_info.mime_type);
+ ScopedJavaLocalRef<jstring> jcookie =
+ base::android::ConvertUTF8ToJavaString(env,
+ download_overwrite_info.cookie);
+ ScopedJavaLocalRef<jstring> jreferer =
+ base::android::ConvertUTF8ToJavaString(env,
+ download_overwrite_info.referer);
+ Java_ChromeDownloadDelegate_enqueueDownloadManagerRequestFromNative(
Ted C 2015/02/26 00:57:55 and any reason the delegate of the new class can't
Changwan Ryu 2015/03/02 14:46:36 Hmm... I thought I needed it to keep reference to
+ env, jobj.obj(), download_overwrite_info.overwrite, jfile_name.obj(),
+ jurl.obj(), juser_agent.obj(), jcontent_disposition.obj(),
+ jmime_type.obj(), jcookie.obj(), jreferer.obj(),
+ download_overwrite_info.has_user_gesture,
+ download_overwrite_info.content_length,
+ download_overwrite_info.is_GET_request);
+ }
+
+ private:
+ JavaObjectWeakGlobalRef weak_java_obj_;
+ DISALLOW_COPY_AND_ASSIGN(PromptUserDoneCB);
+};
+
+// Called when we need to interrupt download and ask users whether to overwrite
+// an existing file.
+static void LaunchDownloadOverwriteInfoBar(JNIEnv* env,
+ jclass clazz,
+ jobject obj,
+ jobject tab,
+ jstring file_name,
+ jstring dir_name,
+ jstring dir_full_path,
+ jstring url,
+ jstring user_agent,
+ jstring content_disposition,
+ jstring mime_type,
+ jstring cookie,
+ jstring referer,
+ jboolean has_user_gesture,
+ jlong content_length,
+ jboolean is_GET_request) {
+ chrome::android::DownloadOverwriteInfo download_overwrite_info(
Ted C 2015/02/26 00:57:55 Any reason we don't just pass down the DownloadInf
Changwan Ryu 2015/03/02 14:46:36 Done. We can pass downloadinfo by wrapping it insi
+ base::android::ConvertJavaStringToUTF8(env, file_name),
+ base::android::ConvertJavaStringToUTF8(env, dir_name),
+ base::android::ConvertJavaStringToUTF8(env, dir_full_path),
+ base::android::ConvertJavaStringToUTF8(env, url),
+ base::android::ConvertJavaStringToUTF8(env, content_disposition),
+ base::android::ConvertJavaStringToUTF8(env, user_agent),
+ base::android::ConvertJavaStringToUTF8(env, cookie),
+ base::android::ConvertJavaStringToUTF8(env, referer), has_user_gesture,
+ base::android::ConvertJavaStringToUTF8(env, mime_type), content_length,
+ is_GET_request);
+ PromptUserDoneCB* ref = new PromptUserDoneCB(env, obj);
+
+ TabAndroid* tab_android = TabAndroid::GetNativeTab(env, tab);
+ chrome::android::DownloadOverwriteInfoBarDelegateJavaInitiated::Create(
+ InfoBarService::FromWebContents(tab_android->web_contents()),
+ download_overwrite_info,
+ base::Bind(&PromptUserDoneCB::PromptUserDone, base::Owned(ref)));
+}
+
+bool RegisterChromeDownloadDelegate(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}

Powered by Google App Engine
This is Rietveld 408576698