Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadOverwriteInfoBar.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadOverwriteInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadOverwriteInfoBar.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..20c9ac50dd090f162b162e37790fa044bc4c2a86 |
| --- /dev/null |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadOverwriteInfoBar.java |
| @@ -0,0 +1,150 @@ |
| +// Copyright 2015 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.content.pm.PackageManager; |
| +import android.content.pm.ResolveInfo; |
| +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 org.chromium.chrome.R; |
| + |
| +import java.util.List; |
| + |
| +/** |
| + * An infobar to ask whether to overwrite an existing file with a new download. |
| + */ |
| +public class DownloadOverwriteInfoBar extends InfoBar { |
| + private static final String TAG = "DownloadOverwriteInfoBar"; |
| + |
| + /** |
| + * Java-side callback that can be used when this infobar was created by Java component. |
| + */ |
| + public interface DownloadOverwriteCallback { |
|
Ted C
2015/02/26 00:57:55
is this used anymore?
Changwan Ryu
2015/03/02 14:46:36
Removed
|
| + /** |
| + * Called when close button is clicked. |
| + */ |
| + void onCloseButtonClicked(DownloadOverwriteInfoBar infoBar); |
| + /** |
| + * Called when a button is clicked. |
| + * @param action Action type defined in {@link InfoBar}. |
| + */ |
| + void onAction(DownloadOverwriteInfoBar infoBar, int action); |
| + } |
| + |
| + private final DownloadOverwriteCallback mCallback; |
| + private final String mFileName; |
| + private final String mDirName; |
| + private final String mDirFullPath; |
| + |
| + /** |
| + * Constructs DownloadOverwriteInfoBar. |
| + * @param nativeInfoBarPtr Pointer value of the native infobar. 0 if there is no native |
| + * counterpart. |
| + * @param callback Java-side callback. Null if it was created from native side. |
| + * @param fileName The file name. ex) example.jpg |
| + * @param dirName The dir name. ex) Downloads |
| + * @param dirFullPath The full dir path. ex) sdcards/Downloads |
| + */ |
| + public DownloadOverwriteInfoBar(long nativeInfoBarPtr, DownloadOverwriteCallback callback, |
| + String fileName, String dirName, String dirFullPath) { |
| + super(null, R.drawable.infobar_downloading, null, null); |
| + mCallback = callback; |
| + mFileName = fileName; |
| + mDirName = dirName; |
| + mDirFullPath = dirFullPath; |
| + setNativeInfoBar(nativeInfoBarPtr); |
| + } |
| + |
| + @Override |
| + public void onCloseButtonClicked() { |
| + if (mNativeInfoBarPtr != 0) nativeOnCloseButtonClicked(mNativeInfoBarPtr); |
|
Ted C
2015/02/26 00:57:55
Isn't it always a native info bar, so these checks
Changwan Ryu
2015/03/02 14:46:36
Removed
|
| + if (mCallback != null) mCallback.onCloseButtonClicked(this); |
| + } |
| + |
| + @Override |
| + public void onButtonClicked(boolean isPrimaryButton) { |
| + int action = isPrimaryButton ? InfoBar.ACTION_TYPE_OVERWRITE |
| + : InfoBar.ACTION_TYPE_CREATE_NEW_FILE; |
| + if (mNativeInfoBarPtr != 0) nativeOnButtonClicked(mNativeInfoBarPtr, action, ""); |
| + if (mCallback != null) mCallback.onAction(this, action); |
| + } |
| + |
| + private CharSequence getMessageText(Context context) { |
| + String template = context.getString(R.string.download_overwrite_infobar_text); |
| + Intent intent = getIntentForDirectoryLaunch(mDirFullPath); |
| + return formatInfoBarMessage(context, template, mFileName, mDirName, intent); |
| + } |
| + |
| + /** |
| + * @param dirFullPath The full path of the directory to be launched. |
| + * @return An Android intent that can launch the directory. |
| + */ |
| + private static Intent getIntentForDirectoryLaunch(String dirFullPath) { |
| + Intent intent = new Intent(Intent.ACTION_GET_CONTENT); |
| + Uri uri = Uri.parse(dirFullPath); |
| + if (uri == null) { |
| + return null; |
| + } |
| + intent.setDataAndType(uri, "*/*"); |
| + return intent; |
| + } |
| + |
| + @Override |
| + public void createContent(InfoBarLayout layout) { |
| + Context context = layout.getContext(); |
| + layout.setMessage(getMessageText(context)); |
| + layout.setButtons( |
| + context.getString(R.string.download_overwrite_infobar_replace_file_button), |
| + context.getString(R.string.download_overwrite_infobar_create_new_file_button)); |
| + } |
| + |
| + /** |
| + * Create infobar message in the form of CharSequence. |
| + * |
| + * @param context The context. |
| + * @param template The template CharSequence. |
| + * @param fileName The file name. |
| + * @param dirName The directory name. |
| + * @param dirNameIntent The intent to be launched when user touches the directory name link. |
| + * @return CharSequence formatted message for InfoBar. |
| + */ |
| + private static CharSequence formatInfoBarMessage(final Context context, String template, |
| + String fileName, String dirName, final Intent dirNameIntent) { |
| + SpannableString formattedFileName = new SpannableString(fileName); |
| + formattedFileName.setSpan(new StyleSpan(Typeface.BOLD), 0, fileName.length(), |
| + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); |
| + |
| + SpannableString formattedDirName = new SpannableString(dirName); |
| + if (canResolveIntent(context, dirNameIntent)) { |
| + formattedDirName.setSpan(new ClickableSpan() { |
| + @Override |
| + public void onClick(View view) { |
| + context.startActivity(dirNameIntent); |
| + } |
| + }, 0, dirName.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); |
| + } |
| + |
| + return TextUtils.expandTemplate(template, formattedFileName, formattedDirName); |
| + } |
| + |
| + private static boolean canResolveIntent(Context context, Intent intent) { |
| + if (context == null || intent == null) { |
| + return false; |
| + } |
| + final PackageManager packageManager = context.getPackageManager(); |
| + List<ResolveInfo> resolveInfoList = |
| + packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); |
| + return resolveInfoList.size() > 0; |
| + } |
| +} |