Bug 1348716 - Long click to copy URL in custom tabs
If user long click text area of ActionBar(URL or Title), then copy
current URL to clipboard.
MozReview-Commit-ID: EdVoMiX0Gt3
--- a/mobile/android/base/java/org/mozilla/gecko/customtabs/ActionBarPresenter.java
+++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/ActionBarPresenter.java
@@ -120,16 +120,25 @@ public class ActionBarPresenter {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(ColorUtil.darken(color, 0.25));
}
}
}
/**
+ * To assign a long-click-listener to text area of ActionBar
+ * @param listener then callback to trigger
+ */
+ public void setTextLongClickListener(View.OnLongClickListener listener) {
+ mTitleView.setOnLongClickListener(listener);
+ mUrlView.setOnLongClickListener(listener);
+ }
+
+ /**
* To get primary color of Title of ActionBar
*
* @return color code of primary color
*/
@ColorInt
public int getTextPrimaryColor() {
return mTextPrimaryColor;
}
--- a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
@@ -14,16 +14,17 @@ import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.StyleRes;
import android.support.annotation.VisibleForTesting;
+import android.support.design.widget.Snackbar;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.util.SparseArrayCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
@@ -31,22 +32,24 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import org.mozilla.gecko.GeckoApp;
import org.mozilla.gecko.R;
+import org.mozilla.gecko.SnackbarBuilder;
import org.mozilla.gecko.Tab;
import org.mozilla.gecko.Tabs;
+import org.mozilla.gecko.Telemetry;
+import org.mozilla.gecko.TelemetryContract;
import org.mozilla.gecko.menu.GeckoMenu;
import org.mozilla.gecko.menu.GeckoMenuInflater;
-import org.mozilla.gecko.Telemetry;
-import org.mozilla.gecko.TelemetryContract;
+import org.mozilla.gecko.util.Clipboard;
import org.mozilla.gecko.util.ColorUtil;
import org.mozilla.gecko.widget.GeckoPopupMenu;
import java.util.List;
import static android.support.customtabs.CustomTabsIntent.EXTRA_TOOLBAR_COLOR;
public class CustomTabsActivity extends GeckoApp implements Tabs.OnTabsChangedListener {
@@ -86,16 +89,17 @@ public class CustomTabsActivity extends
final Toolbar toolbar = (Toolbar) findViewById(R.id.actionbar);
setSupportActionBar(toolbar);
final ActionBar actionBar = getSupportActionBar();
bindNavigationCallback(toolbar);
actionBarPresenter = new ActionBarPresenter(actionBar);
actionBarPresenter.displayUrlOnly(getIntent().getDataString());
actionBarPresenter.setBackgroundColor(toolbarColor, getWindow());
+ actionBarPresenter.setTextLongClickListener(new UrlCopyListener());
actionBar.setDisplayHomeAsUpEnabled(true);
Tabs.registerOnTabsChangedListener(this);
}
private void setThemeFromToolbarColor() {
@StyleRes
int styleRes = (ColorUtil.getReadableTextColor(toolbarColor) == Color.BLACK)
@@ -447,9 +451,27 @@ public class CustomTabsActivity extends
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, url);
Intent chooserIntent = Intent.createChooser(shareIntent, getString(R.string.share_title));
chooserIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(chooserIntent);
}
}
+
+ /**
+ * Listener when user long-click ActionBar to copy URL.
+ */
+ private class UrlCopyListener implements View.OnLongClickListener {
+ @Override
+ public boolean onLongClick(View v) {
+ final String url = Tabs.getInstance().getSelectedTab().getURL();
+ if (!TextUtils.isEmpty(url)) {
+ Clipboard.setText(url);
+ SnackbarBuilder.builder(CustomTabsActivity.this)
+ .message(R.string.custom_tabs_hint_url_copy)
+ .duration(Snackbar.LENGTH_SHORT)
+ .buildAndShow();
+ }
+ return true;
+ }
+ }
}
--- a/mobile/android/base/locales/en-US/android_strings.dtd
+++ b/mobile/android/base/locales/en-US/android_strings.dtd
@@ -281,16 +281,18 @@
Instead of switching to the browser it appears as if the user stays in the third-party app.
For more see: https://developer.chrome.com/multidevice/android/customtabs -->
<!ENTITY pref_custom_tabs "Custom Tabs">
<!ENTITY pref_custom_tabs_summary3 "Allow apps to open websites using a customized version of &brandShortName;">
<!-- Localization note (custom_tabs_menu_item_open_in): The variable is replaced by the name of
default browser from user's preference, such as "Open in Firefox" -->
<!ENTITY custom_tabs_menu_item_open_in "Open in &formatS;">
<!ENTITY custom_tabs_menu_footer "Powered by &brandShortName;">
+<!-- Long-click title of CustomTabsActivity will copy URL to clipboard and display this hint -->
+<!ENTITY custom_tabs_hint_url_copy "URL copied">
<!-- Localization note (pref_activity_stream): Experimental feature, see https://testpilot.firefox.com/experiments/activity-stream -->
<!ENTITY pref_activity_stream "Activity Stream">
<!ENTITY pref_activity_stream_summary "A rich visual history feed and a reimagined home page make it easier than ever to find exactly what you\'re looking for in &brandShortName;.">
<!ENTITY tracking_protection_prompt_title "Now with Tracking Protection">
<!ENTITY tracking_protection_prompt_text "Actively block tracking elements so you don\'t have to worry.">
<!ENTITY tracking_protection_prompt_tip_text "Visit Privacy settings to learn more">
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -236,16 +236,17 @@
<string name="pref_whats_new_notification_summary">&pref_whats_new_notification_summary;</string>
<string name="pref_category_experimental">&pref_category_experimental;</string>
<string name="pref_custom_tabs">&pref_custom_tabs;</string>
<string name="pref_custom_tabs_summary">&pref_custom_tabs_summary3;</string>
<string name="custom_tabs_menu_item_open_in">&custom_tabs_menu_item_open_in;</string>
<string name="custom_tabs_menu_footer">&custom_tabs_menu_footer;</string>
+ <string name="custom_tabs_hint_url_copy">&custom_tabs_hint_url_copy;</string>
<string name="pref_activity_stream">&pref_activity_stream;</string>
<string name="pref_activity_stream_summary">&pref_activity_stream_summary;</string>
<string name="pref_char_encoding">&pref_char_encoding;</string>
<string name="pref_char_encoding_on">&pref_char_encoding_on;</string>
<string name="pref_char_encoding_off">&pref_char_encoding_off;</string>
<string name="pref_clear_private_data_now">&pref_clear_private_data2;</string>