Commit 22f1e08c authored by Tommy Steimel's avatar Tommy Steimel Committed by Commit Bot

[Media Intent Handler] Use file display name as title for content URIs

This CL changes NavigationEntryImpl::GetTitleForDisplay for content
URIs to use the file's display name if determinable. This affects HTML,
audio, and video files opened with Chrome on Android. This does not
affect image files since ImageDocument already has a built-in title.

Bug: 800880
Change-Id: I0ad03d2dc13d4895f6789a6a7a6ea1199e19745b
Reviewed-on: https://chromium-review.googlesource.com/1165790Reviewed-by: default avatarJochen Eisinger <jochen@chromium.org>
Reviewed-by: default avataragrieve <agrieve@chromium.org>
Reviewed-by: default avatarBernhard Bauer <bauerb@chromium.org>
Reviewed-by: default avatarMounir Lamouri <mlamouri@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Commit-Queue: Tommy Steimel <steimel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#582664}
parent ae401595
...@@ -42,4 +42,22 @@ std::string GetContentUriMimeType(const FilePath& content_uri) { ...@@ -42,4 +42,22 @@ std::string GetContentUriMimeType(const FilePath& content_uri) {
return base::android::ConvertJavaStringToUTF8(env, j_mime.obj()); return base::android::ConvertJavaStringToUTF8(env, j_mime.obj());
} }
bool MaybeGetFileDisplayName(const FilePath& content_uri,
base::string16* file_display_name) {
DCHECK(content_uri.IsContentUri());
DCHECK(file_display_name);
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jstring> j_uri =
ConvertUTF8ToJavaString(env, content_uri.value());
ScopedJavaLocalRef<jstring> j_display_name =
Java_ContentUriUtils_maybeGetDisplayName(env, j_uri);
if (j_display_name.is_null())
return false;
*file_display_name = base::android::ConvertJavaStringToUTF16(j_display_name);
return true;
}
} // namespace base } // namespace base
...@@ -24,6 +24,10 @@ BASE_EXPORT bool ContentUriExists(const FilePath& content_uri); ...@@ -24,6 +24,10 @@ BASE_EXPORT bool ContentUriExists(const FilePath& content_uri);
// invalid. // invalid.
BASE_EXPORT std::string GetContentUriMimeType(const FilePath& content_uri); BASE_EXPORT std::string GetContentUriMimeType(const FilePath& content_uri);
// Gets the display name from a content URI. Returns true if the name was found.
BASE_EXPORT bool MaybeGetFileDisplayName(const FilePath& content_uri,
base::string16* file_display_name);
} // namespace base } // namespace base
#endif // BASE_ANDROID_CONTENT_URI_UTILS_H_ #endif // BASE_ANDROID_CONTENT_URI_UTILS_H_
...@@ -12,6 +12,9 @@ import android.net.Uri; ...@@ -12,6 +12,9 @@ import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.provider.DocumentsContract; import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.webkit.MimeTypeMap; import android.webkit.MimeTypeMap;
...@@ -208,6 +211,22 @@ public abstract class ContentUriUtils { ...@@ -208,6 +211,22 @@ public abstract class ContentUriUtils {
return ""; return "";
} }
/**
* Method to resolve the display name of a content URI if possible.
*
* @param uriString the content URI to look up.
* @return the display name of the uri if present in the database or null otherwise.
*/
@Nullable
@CalledByNative
public static String maybeGetDisplayName(String uriString) {
Uri uri = Uri.parse(uriString);
String displayName = getDisplayName(
uri, ContextUtils.getApplicationContext(), MediaStore.MediaColumns.DISPLAY_NAME);
return TextUtils.isEmpty(displayName) ? null : displayName;
}
/** /**
* Checks whether the passed Uri represents a virtual document. * Checks whether the passed Uri represents a virtual document.
* *
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <utility> #include <utility>
#include "base/containers/queue.h" #include "base/containers/queue.h"
#include "base/files/file_path.h"
#include "base/i18n/rtl.h" #include "base/i18n/rtl.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
...@@ -28,6 +29,10 @@ ...@@ -28,6 +29,10 @@
#include "content/public/common/url_constants.h" #include "content/public/common/url_constants.h"
#include "ui/gfx/text_elider.h" #include "ui/gfx/text_elider.h"
#if defined(OS_ANDROID)
#include "base/android/content_uri_utils.h"
#endif
using base::UTF16ToUTF8; using base::UTF16ToUTF8;
namespace content { namespace content {
...@@ -457,6 +462,16 @@ const base::string16& NavigationEntryImpl::GetTitleForDisplay() const { ...@@ -457,6 +462,16 @@ const base::string16& NavigationEntryImpl::GetTitleForDisplay() const {
base::i18n::WrapStringWithLTRFormatting(&title); base::i18n::WrapStringWithLTRFormatting(&title);
} }
#if defined(OS_ANDROID)
if (GetURL().SchemeIs(url::kContentScheme)) {
base::string16 file_display_name;
if (base::MaybeGetFileDisplayName(base::FilePath(GetURL().spec()),
&file_display_name)) {
title = file_display_name;
}
}
#endif
gfx::ElideString(title, kMaxTitleChars, &cached_display_title_); gfx::ElideString(title, kMaxTitleChars, &cached_display_title_);
return cached_display_title_; return cached_display_title_;
} }
......
...@@ -2,12 +2,15 @@ ...@@ -2,12 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "content/browser/frame_host/navigation_entry_impl.h"
#include "base/path_service.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/test/test_file_util.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "content/browser/frame_host/navigation_entry_impl.h"
#include "content/browser/site_instance_impl.h" #include "content/browser/site_instance_impl.h"
#include "content/public/browser/ssl_status.h" #include "content/public/browser/ssl_status.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -328,4 +331,22 @@ TEST_F(NavigationEntryTest, NavigationEntryExtraData) { ...@@ -328,4 +331,22 @@ TEST_F(NavigationEntryTest, NavigationEntryExtraData) {
EXPECT_EQ(ASCIIToUTF16(""), output2); EXPECT_EQ(ASCIIToUTF16(""), output2);
} }
#if defined(OS_ANDROID)
// Test that content URIs correctly show the file display name as the title.
TEST_F(NavigationEntryTest, NavigationEntryContentUri) {
base::FilePath image_path;
EXPECT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &image_path));
image_path = image_path.Append(FILE_PATH_LITERAL("content"));
image_path = image_path.Append(FILE_PATH_LITERAL("test"));
image_path = image_path.Append(FILE_PATH_LITERAL("data"));
image_path = image_path.Append(FILE_PATH_LITERAL("blank.jpg"));
EXPECT_TRUE(base::PathExists(image_path));
base::FilePath content_uri = base::InsertImageIntoMediaStore(image_path);
entry1_->SetURL(GURL(content_uri.value()));
EXPECT_EQ(ASCIIToUTF16("blank.jpg"), entry1_->GetTitleForDisplay());
}
#endif
} // namespace content } // namespace content
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment