| Index: chrome/android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..01b5b76d109f02210a384c27fed1995ebadfbc70
|
| --- /dev/null
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java
|
| @@ -0,0 +1,142 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.chrome.browser.infobar;
|
| +
|
| +import android.content.Context;
|
| +import android.content.Intent;
|
| +import android.graphics.Typeface;
|
| +import android.net.Uri;
|
| +import android.text.Spannable;
|
| +import android.text.SpannableString;
|
| +import android.text.TextUtils;
|
| +import android.text.style.ClickableSpan;
|
| +import android.text.style.StyleSpan;
|
| +import android.view.View;
|
| +import android.webkit.MimeTypeMap;
|
| +
|
| +import org.chromium.base.ContextUtils;
|
| +import org.chromium.base.annotations.CalledByNative;
|
| +import org.chromium.chrome.R;
|
| +import org.chromium.chrome.browser.download.DownloadUtils;
|
| +
|
| +import java.io.File;
|
| +
|
| +/**
|
| + * An infobar to ask whether to proceed downloading a file that already exists locally.
|
| + */
|
| +public class DuplicateDownloadInfoBar extends ConfirmInfoBar {
|
| + private static final String TAG = "DuplicateDownloadInfoBar";
|
| + private final String mFilePath;
|
| + private final boolean mIsOfflinePage;
|
| + private final String mPageUrl;
|
| + private final boolean mIsIncognito;
|
| +
|
| + @CalledByNative
|
| + private static InfoBar createInfoBar(
|
| + String filePath, boolean isOfflinePage, String pageUrl, boolean isIncognito) {
|
| + return new DuplicateDownloadInfoBar(
|
| + ContextUtils.getApplicationContext(), filePath, isOfflinePage, pageUrl,
|
| + isIncognito);
|
| + }
|
| +
|
| + /**
|
| + * Constructs DuplicateDownloadInfoBar.
|
| + * @param context Application context.
|
| + * @param filePath The file path.
|
| + * @param isOfflinePage Whether the download is for offline page.
|
| + * @param pageUrl Url of the page, ignored if this is a regular download.
|
| + * @param isIncognito Whether download is Incognito.
|
| + */
|
| + private DuplicateDownloadInfoBar(
|
| + Context context, String filePath, boolean isOfflinePage, String pageUrl,
|
| + boolean isIncognito) {
|
| + super(R.drawable.infobar_downloading, null, null, null,
|
| + context.getString(R.string.duplicate_download_infobar_download_button),
|
| + context.getString(R.string.cancel));
|
| + mFilePath = filePath;
|
| + mIsOfflinePage = isOfflinePage;
|
| + mPageUrl = pageUrl;
|
| + mIsIncognito = isIncognito;
|
| + }
|
| +
|
| + /**
|
| + * Gets the infobar text for regular downloads.
|
| + * @param context Context to be used.
|
| + * @param template Template of the text to be displayed.
|
| + */
|
| + private CharSequence getDownloadMessageText(final Context context, final String template) {
|
| + final File file = new File(mFilePath);
|
| + final Uri fileUri = Uri.fromFile(file);
|
| + final String mimeType = getMimeTypeFromUri(fileUri);
|
| + final String filename = file.getName();
|
| + return getMessageText(template, filename, new ClickableSpan() {
|
| + @Override
|
| + public void onClick(View view) {
|
| + DownloadUtils.openFile(file, mimeType, mIsIncognito);
|
| + }
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * Gets the infobar text for offline page downloads.
|
| + * @param context Context to be used.
|
| + * @param template Template of the text to be displayed.
|
| + */
|
| + private CharSequence getOfflinePageMessageText(final Context context, final String template) {
|
| + return getMessageText(template, mFilePath, new ClickableSpan() {
|
| + @Override
|
| + public void onClick(View view) {
|
| + // TODO(qinmin): open the offline page on local storage instead of opening the url.
|
| + // However, there could be multiple stored offline pages for the same url, need to
|
| + // figure out which one to use.
|
| + Intent intent = new Intent(Intent.ACTION_VIEW);
|
| + intent.setData(Uri.parse(mPageUrl));
|
| + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
| + intent.setPackage(context.getPackageName());
|
| + context.startActivity(intent);
|
| + }
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * Helper method to get the text to be displayed on the infobar.
|
| + * @param template Message template.
|
| + * @param fileName Name of the file.
|
| + * @param clickableSpan Action to perform when clicking on the file name.
|
| + * @return message to be displayed on the infobar.
|
| + */
|
| + private CharSequence getMessageText(final String template, final String fileName,
|
| + final ClickableSpan clickableSpan) {
|
| + final SpannableString formattedFilePath = new SpannableString(fileName);
|
| + formattedFilePath.setSpan(new StyleSpan(Typeface.BOLD), 0, fileName.length(),
|
| + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
| + formattedFilePath.setSpan(clickableSpan, 0, fileName.length(),
|
| + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
| + return TextUtils.expandTemplate(template, formattedFilePath);
|
| + }
|
| +
|
| + /**
|
| + * Retrieve the mime type based on the given file URI.
|
| + * @param fileUri URI of the file
|
| + * @return Possible mime type of the file.
|
| + */
|
| + private static String getMimeTypeFromUri(Uri fileUri) {
|
| + String extension = MimeTypeMap.getSingleton().getFileExtensionFromUrl(fileUri.toString());
|
| + return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
|
| + }
|
| +
|
| + @Override
|
| + public void createContent(InfoBarLayout layout) {
|
| + super.createContent(layout);
|
| + Context context = layout.getContext();
|
| + if (mIsOfflinePage) {
|
| + layout.setMessage(getOfflinePageMessageText(
|
| + context, context.getString(R.string.duplicate_download_infobar_text)));
|
| + } else {
|
| + layout.setMessage(getDownloadMessageText(
|
| + context, context.getString(R.string.duplicate_download_infobar_text)));
|
| + }
|
| + }
|
| +}
|
|
|