fix wrong thread (DCHECK failed) + request WRITE_EXTERNAL_STORAGE permission
This commit is contained in:
parent
8340b1da10
commit
902961d756
1 changed files with 92 additions and 26 deletions
|
@ -7,29 +7,29 @@ Reduce permissions needed for bookmarks import/export
|
|||
Completely remove contacts picker permission from the file dialog
|
||||
---
|
||||
chrome/android/java/AndroidManifest.xml | 1 -
|
||||
.../res/menu/bookmark_action_bar_menu.xml | 14 ++
|
||||
.../res/menu/bookmark_action_bar_menu.xml | 14 +
|
||||
.../browser/bookmarks/BookmarkActionBar.java | 12 +
|
||||
.../browser/bookmarks/BookmarkActivity.java | 15 ++
|
||||
.../browser/bookmarks/BookmarkBridge.java | 47 ++++
|
||||
.../browser/bookmarks/BookmarkActivity.java | 23 ++
|
||||
.../browser/bookmarks/BookmarkBridge.java | 63 +++++
|
||||
.../browser/bookmarks/BookmarkDelegate.java | 10 +
|
||||
.../browser/bookmarks/BookmarkManager.java | 19 ++
|
||||
.../browser/bookmarks/BookmarkPage.java | 5 +-
|
||||
.../native_page/NativePageFactory.java | 3 +-
|
||||
chrome/browser/BUILD.gn | 6 +-
|
||||
.../android/bookmarks/bookmark_bridge.cc | 217 ++++++++++++++++++
|
||||
.../android/bookmarks/bookmark_bridge.h | 20 +-
|
||||
.../android/bookmarks/bookmark_bridge.cc | 242 ++++++++++++++++++
|
||||
.../android/bookmarks/bookmark_bridge.h | 23 +-
|
||||
chrome/browser/importer/profile_writer.cc | 12 +
|
||||
chrome/browser/importer/profile_writer.h | 6 +
|
||||
.../strings/android_chrome_strings.grd | 6 +
|
||||
chrome/common/BUILD.gn | 3 +
|
||||
chrome/utility/BUILD.gn | 7 +-
|
||||
.../utility/importer/bookmark_html_reader.cc | 27 ++-
|
||||
.../utility/importer/bookmark_html_reader.cc | 27 +-
|
||||
.../utility/importer/bookmark_html_reader.h | 8 +
|
||||
.../chromium/ui/base/SelectFileDialog.java | 18 +-
|
||||
ui/shell_dialogs/select_file_dialog.h | 2 +
|
||||
.../select_file_dialog_android.cc | 6 +
|
||||
ui/shell_dialogs/select_file_dialog_android.h | 2 +
|
||||
23 files changed, 452 insertions(+), 14 deletions(-)
|
||||
23 files changed, 504 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
|
||||
--- a/chrome/android/java/AndroidManifest.xml
|
||||
|
@ -155,22 +155,39 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/Bookm
|
|||
if (requestCode == EDIT_BOOKMARK_REQUEST_CODE && resultCode == RESULT_OK) {
|
||||
BookmarkId bookmarkId = BookmarkId.getBookmarkIdFromString(data.getStringExtra(
|
||||
INTENT_VISIT_BOOKMARK_ID));
|
||||
@@ -61,6 +76,14 @@ public class BookmarkActivity extends SnackbarActivity {
|
||||
}
|
||||
}
|
||||
|
||||
+ @Override
|
||||
+ public void onRequestPermissionsResult(
|
||||
+ int requestCode, String[] permissions, int[] grantResults) {
|
||||
+ if (mWindowAndroid.handlePermissionResult(requestCode, permissions, grantResults))
|
||||
+ return;
|
||||
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
+ }
|
||||
+
|
||||
/**
|
||||
* @return The {@link BookmarkManager} for testing purposes.
|
||||
*/
|
||||
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
|
||||
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
|
||||
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
|
||||
@@ -4,7 +4,11 @@
|
||||
@@ -4,7 +4,13 @@
|
||||
|
||||
package org.chromium.chrome.browser.bookmarks;
|
||||
|
||||
+import android.content.Intent;
|
||||
+import android.content.Context;
|
||||
+import android.content.pm.PackageManager;
|
||||
+import android.net.Uri;
|
||||
import android.os.SystemClock;
|
||||
+import android.provider.Browser;
|
||||
+import android.Manifest.permission;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Pair;
|
||||
|
||||
@@ -26,6 +30,11 @@ import org.chromium.components.url_formatter.SchemeDisplay;
|
||||
@@ -26,6 +32,11 @@ import org.chromium.components.url_formatter.SchemeDisplay;
|
||||
import org.chromium.components.url_formatter.UrlFormatter;
|
||||
import org.chromium.content_public.browser.WebContents;
|
||||
|
||||
|
@ -182,7 +199,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/Bookm
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -584,6 +593,24 @@ public class BookmarkBridge {
|
||||
@@ -584,6 +595,38 @@ public class BookmarkBridge {
|
||||
mNativeBookmarkBridge, BookmarkBridge.this, id.getId(), id.getType());
|
||||
}
|
||||
|
||||
|
@ -199,15 +216,29 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/Bookm
|
|||
+ * Export bookmarks to a path selected by the user.
|
||||
+ * @param window The current window of the bookmarks activity or page.
|
||||
+ */
|
||||
+ public void exportBookmarks() {
|
||||
+ public void exportBookmarks(WindowAndroid window) {
|
||||
+ assert mIsNativeBookmarkModelLoaded;
|
||||
+ // check if we have the correct write permission
|
||||
+ if (window.hasPermission(permission.WRITE_EXTERNAL_STORAGE)) {
|
||||
+ exportBookmarksImpl();
|
||||
+ } else {
|
||||
+ String[] requestPermissions = new String[] {permission.WRITE_EXTERNAL_STORAGE};
|
||||
+ window.requestPermissions(requestPermissions, (permissions, grantResults) -> {
|
||||
+ if (grantResults.length >= 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||
+ exportBookmarksImpl();
|
||||
+ }
|
||||
+ });
|
||||
+ };
|
||||
+ }
|
||||
+
|
||||
+ private void exportBookmarksImpl() {
|
||||
+ BookmarkBridgeJni.get().exportBookmarks(mNativeBookmarkBridge, BookmarkBridge.this);
|
||||
+ }
|
||||
+
|
||||
/**
|
||||
* Synchronously gets a list of bookmarks that match the specified search query.
|
||||
* @param query Keyword used for searching bookmarks.
|
||||
@@ -1006,6 +1033,24 @@ public class BookmarkBridge {
|
||||
@@ -1005,6 +1048,24 @@ public class BookmarkBridge {
|
||||
depthList.add(depth);
|
||||
}
|
||||
|
||||
|
@ -232,7 +263,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/Bookm
|
|||
private static List<Pair<Integer, Integer>> createPairsList(int[] left, int[] right) {
|
||||
List<Pair<Integer, Integer>> pairList = new ArrayList<Pair<Integer, Integer>>();
|
||||
for (int i = 0; i < left.length; i++) {
|
||||
@@ -1073,6 +1118,8 @@ public class BookmarkBridge {
|
||||
@@ -1072,6 +1133,8 @@ public class BookmarkBridge {
|
||||
int getChildCount(long nativeBookmarkBridge, BookmarkBridge caller, long id, int type);
|
||||
void getChildIDs(long nativeBookmarkBridge, BookmarkBridge caller, long id, int type,
|
||||
List<BookmarkId> bookmarksList);
|
||||
|
@ -305,7 +336,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/Bookm
|
|||
+
|
||||
+ @Override
|
||||
+ public void exportBookmarks() {
|
||||
+ mBookmarkModel.exportBookmarks();
|
||||
+ mBookmarkModel.exportBookmarks(mWindowAndroid);
|
||||
+ }
|
||||
+
|
||||
@Override
|
||||
|
@ -391,7 +422,7 @@ diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browse
|
|||
#include "components/dom_distiller/core/url_utils.h"
|
||||
#include "components/prefs/pref_service.h"
|
||||
#include "components/query_parser/query_parser.h"
|
||||
@@ -48,6 +49,21 @@
|
||||
@@ -48,6 +49,24 @@
|
||||
#include "content/public/browser/browser_thread.h"
|
||||
#include "content/public/browser/web_contents.h"
|
||||
|
||||
|
@ -409,11 +440,14 @@ diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browse
|
|||
+#include "components/search_engines/template_url.h"
|
||||
+#include "components/url_formatter/url_fixer.h"
|
||||
+#include "ui/android/window_android.h"
|
||||
+#include "base/task/task_traits.h"
|
||||
+#include "base/task/thread_pool.h"
|
||||
+#include "content/public/browser/browser_task_traits.h"
|
||||
+
|
||||
using base::android::AttachCurrentThread;
|
||||
using base::android::ConvertUTF8ToJavaString;
|
||||
using base::android::ConvertUTF16ToJavaString;
|
||||
@@ -64,6 +80,56 @@ using bookmarks::BookmarkNode;
|
||||
@@ -64,6 +83,56 @@ using bookmarks::BookmarkNode;
|
||||
using bookmarks::BookmarkType;
|
||||
using content::BrowserThread;
|
||||
|
||||
|
@ -470,7 +504,7 @@ diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browse
|
|||
namespace {
|
||||
|
||||
const int kInvalidId = -1;
|
||||
@@ -150,6 +216,10 @@ BookmarkBridge::~BookmarkBridge() {
|
||||
@@ -150,6 +219,10 @@ BookmarkBridge::~BookmarkBridge() {
|
||||
if (partner_bookmarks_shim_)
|
||||
partner_bookmarks_shim_->RemoveObserver(this);
|
||||
reading_list_manager_->RemoveObserver(this);
|
||||
|
@ -481,7 +515,7 @@ diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browse
|
|||
}
|
||||
|
||||
void BookmarkBridge::Destroy(JNIEnv*, const JavaParamRef<jobject>&) {
|
||||
@@ -541,6 +611,153 @@ jint BookmarkBridge::GetTotalBookmarkCount(
|
||||
@@ -541,6 +614,175 @@ jint BookmarkBridge::GetTotalBookmarkCount(
|
||||
return count;
|
||||
}
|
||||
|
||||
|
@ -558,6 +592,17 @@ diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browse
|
|||
+
|
||||
+void BookmarkBridge::FileSelected(const base::FilePath& path, int index,
|
||||
+ void* params) {
|
||||
+ base::ThreadPool::PostTaskAndReplyWithResult(
|
||||
+ FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()},
|
||||
+ base::BindOnce(&BookmarkBridge::FileSelectedImpl,
|
||||
+ base::Unretained(this),
|
||||
+ path),
|
||||
+ base::BindOnce(&BookmarkBridge::FileSelectedImplOnUIThread,
|
||||
+ base::Unretained(this),
|
||||
+ path));
|
||||
+}
|
||||
+
|
||||
+const std::string BookmarkBridge::FileSelectedImpl(const base::FilePath& path) {
|
||||
+ base::File file;
|
||||
+ if (path.IsContentUri()) {
|
||||
+ file = base::OpenContentUriForRead(path);
|
||||
|
@ -566,32 +611,39 @@ diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browse
|
|||
+ }
|
||||
+ if (!file.IsValid()) {
|
||||
+ select_file_dialog_->ShowToast("Cannot open bookmarks file for import");
|
||||
+ return;
|
||||
+ return "";
|
||||
+ }
|
||||
+
|
||||
+ auto fileLength = file.GetLength();
|
||||
+ if (-1 == fileLength) {
|
||||
+ select_file_dialog_->ShowToast("Cannot read bookmarks file length");
|
||||
+ return;
|
||||
+ return "";
|
||||
+ }
|
||||
+
|
||||
+ if (fileLength > 10 * 1024 * 1024) {
|
||||
+ select_file_dialog_->ShowToast("Bookmark file is bigger than 10MB");
|
||||
+ return;
|
||||
+ return "";
|
||||
+ }
|
||||
+
|
||||
+ std::vector<char> buffer(fileLength);
|
||||
+ if (-1 == file.ReadAtCurrentPos(buffer.data(), fileLength)) {
|
||||
+ select_file_dialog_->ShowToast("Could not read bookmarks file");
|
||||
+ return;
|
||||
+ return "";
|
||||
+ }
|
||||
+
|
||||
+ if (buffer.empty()) {
|
||||
+ select_file_dialog_->ShowToast("Empty bookmarks file");
|
||||
+ return;
|
||||
+ return "";
|
||||
+ }
|
||||
+
|
||||
+ std::string contents(buffer.begin(), buffer.end());
|
||||
+ return contents;
|
||||
+}
|
||||
+
|
||||
+void BookmarkBridge::FileSelectedImplOnUIThread(const base::FilePath& path,
|
||||
+ const std::string& contents) {
|
||||
+ if (contents.empty())
|
||||
+ return;
|
||||
+
|
||||
+ // the following import logic comes from BookmarksFileImporter class
|
||||
+ std::vector<ImportedBookmarkEntry> bookmarks;
|
||||
|
@ -623,10 +675,14 @@ diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browse
|
|||
+ writer->AddKeywords(std::move(owned_template_urls), false);
|
||||
+ }
|
||||
+
|
||||
+ select_file_dialog_->ShowToast("Bookmarks import complete");
|
||||
+
|
||||
+ LOG(INFO) << "Imported " << bookmarks.size() << " bookmarks and " <<
|
||||
+ std::stringstream message;
|
||||
+ message << "Imported " << bookmarks.size() << " bookmarks and " <<
|
||||
+ search_engines.size() << " search engines from " << path.MaybeAsASCII();
|
||||
+ auto result = message.str();
|
||||
+
|
||||
+ select_file_dialog_->ShowToast(result);
|
||||
+
|
||||
+ LOG(INFO) << result;
|
||||
+}
|
||||
+
|
||||
+void BookmarkBridge::FileSelectionCanceled(void* params) {
|
||||
|
@ -699,6 +755,16 @@ diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.h b/chrome/browser
|
|||
|
||||
// Information about the Partner bookmarks (must check for IsLoaded()).
|
||||
// This is owned by profile.
|
||||
@@ -328,6 +346,9 @@ class BookmarkBridge : public bookmarks::BaseBookmarkModelObserver,
|
||||
// Observes the profile destruction and creation.
|
||||
ScopedObserver<Profile, ProfileObserver> profile_observer_{this};
|
||||
|
||||
+ const std::string FileSelectedImpl(const base::FilePath& path);
|
||||
+ void FileSelectedImplOnUIThread(const base::FilePath& path,
|
||||
+ const std::string& contents);
|
||||
DISALLOW_COPY_AND_ASSIGN(BookmarkBridge);
|
||||
};
|
||||
|
||||
diff --git a/chrome/browser/importer/profile_writer.cc b/chrome/browser/importer/profile_writer.cc
|
||||
--- a/chrome/browser/importer/profile_writer.cc
|
||||
+++ b/chrome/browser/importer/profile_writer.cc
|
||||
|
|
Loading…
Add table
Reference in a new issue