From 69541254bf2722dad9fb6f64f4838baa6274551a Mon Sep 17 00:00:00 2001 From: Jim Chen Date: Thu, 14 Sep 2017 17:50:58 -0400 Subject: [PATCH] Bug 1367079 - 5. Add TextSelection support in custom tabs and PWA; r=snorp Add TextSelection support in custom tabs and PWA. MozReview-Commit-ID: AcHjMfJ8onU --- .../gecko/customtabs/CustomTabsActivity.java | 27 +++++++++++++++- .../mozilla/gecko/webapps/WebAppActivity.java | 31 +++++++++++++++++-- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java index 005aad0f3441..02ce0bdf3e62 100644 --- a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java +++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java @@ -22,6 +22,7 @@ import android.support.design.widget.Snackbar; import android.support.v4.util.SparseArrayCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; +import android.support.v7.view.ActionMode; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.Log; @@ -50,6 +51,7 @@ import org.mozilla.gecko.permissions.Permissions; import org.mozilla.gecko.prompts.Prompt; import org.mozilla.gecko.prompts.PromptListItem; import org.mozilla.gecko.prompts.PromptService; +import org.mozilla.gecko.text.TextSelection; import org.mozilla.gecko.util.ActivityUtils; import org.mozilla.gecko.util.Clipboard; import org.mozilla.gecko.util.ColorUtil; @@ -57,12 +59,14 @@ import org.mozilla.gecko.util.GeckoBundle; import org.mozilla.gecko.util.IntentUtils; import org.mozilla.gecko.util.PackageUtil; import org.mozilla.gecko.util.ThreadUtils; +import org.mozilla.gecko.widget.ActionModePresenter; import org.mozilla.gecko.widget.GeckoPopupMenu; import java.util.List; public class CustomTabsActivity extends AppCompatActivity - implements GeckoMenu.Callback, + implements ActionModePresenter, + GeckoMenu.Callback, GeckoView.ContentListener, GeckoView.NavigationListener, GeckoView.ProgressListener { @@ -84,6 +88,9 @@ public class CustomTabsActivity extends AppCompatActivity private DoorHangerPopup mDoorHangerPopup; private FormAssistPopup mFormAssistPopup; + private ActionMode mActionMode; + private TextSelection mTextSelection; + private boolean mCanGoBack = false; private boolean mCanGoForward = false; private boolean mCanStop = false; @@ -125,6 +132,9 @@ public class CustomTabsActivity extends AppCompatActivity mFormAssistPopup = (FormAssistPopup) findViewById(R.id.form_assist_popup); mFormAssistPopup.create(mGeckoView); + mTextSelection = TextSelection.Factory.create(mGeckoView, this); + mTextSelection.create(); + final GeckoViewSettings settings = mGeckoView.getSettings(); settings.setBoolean(GeckoViewSettings.USE_MULTIPROCESS, false); @@ -138,6 +148,7 @@ public class CustomTabsActivity extends AppCompatActivity @Override public void onDestroy() { + mTextSelection.destroy(); mFormAssistPopup.destroy(); mDoorHangerPopup.destroy(); mPromptService.destroy(); @@ -670,4 +681,18 @@ public class CustomTabsActivity extends AppCompatActivity return null; } } + + @Override // ActionModePresenter + public void startActionMode(final ActionMode.Callback callback) { + endActionMode(); + mActionMode = startSupportActionMode(callback); + } + + @Override // ActionModePresenter + public void endActionMode() { + if (mActionMode != null) { + mActionMode.finish(); + mActionMode = null; + } + } } diff --git a/mobile/android/base/java/org/mozilla/gecko/webapps/WebAppActivity.java b/mobile/android/base/java/org/mozilla/gecko/webapps/WebAppActivity.java index c65d270551ae..e38852eb0379 100644 --- a/mobile/android/base/java/org/mozilla/gecko/webapps/WebAppActivity.java +++ b/mobile/android/base/java/org/mozilla/gecko/webapps/WebAppActivity.java @@ -20,6 +20,7 @@ import android.os.Bundle; import android.support.customtabs.CustomTabsIntent; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; +import android.support.v7.view.ActionMode; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; @@ -29,19 +30,22 @@ import android.widget.TextView; import org.mozilla.gecko.ActivityHandlerHelper; import org.mozilla.gecko.AppConstants; -import org.mozilla.gecko.customtabs.CustomTabsActivity; import org.mozilla.gecko.DoorHangerPopup; import org.mozilla.gecko.GeckoScreenOrientation; import org.mozilla.gecko.GeckoView; import org.mozilla.gecko.GeckoViewSettings; +import org.mozilla.gecko.R; +import org.mozilla.gecko.customtabs.CustomTabsActivity; import org.mozilla.gecko.permissions.Permissions; import org.mozilla.gecko.prompts.PromptService; -import org.mozilla.gecko.R; +import org.mozilla.gecko.text.TextSelection; import org.mozilla.gecko.util.ActivityUtils; import org.mozilla.gecko.util.ColorUtil; +import org.mozilla.gecko.widget.ActionModePresenter; public class WebAppActivity extends AppCompatActivity - implements GeckoView.NavigationListener { + implements ActionModePresenter, + GeckoView.NavigationListener { private static final String LOGTAG = "WebAppActivity"; public static final String MANIFEST_PATH = "MANIFEST_PATH"; @@ -52,6 +56,9 @@ public class WebAppActivity extends AppCompatActivity private PromptService mPromptService; private DoorHangerPopup mDoorHangerPopup; + private ActionMode mActionMode; + private TextSelection mTextSelection; + private boolean mIsFullScreenMode; private boolean mIsFullScreenContent; private boolean mCanGoBack; @@ -93,6 +100,9 @@ public class WebAppActivity extends AppCompatActivity mPromptService = new PromptService(this, mGeckoView.getEventDispatcher()); mDoorHangerPopup = new DoorHangerPopup(this, mGeckoView.getEventDispatcher()); + mTextSelection = TextSelection.Factory.create(mGeckoView, this); + mTextSelection.create(); + final GeckoViewSettings settings = mGeckoView.getSettings(); settings.setBoolean(GeckoViewSettings.USE_MULTIPROCESS, false); @@ -108,6 +118,7 @@ public class WebAppActivity extends AppCompatActivity @Override public void onDestroy() { + mTextSelection.destroy(); mDoorHangerPopup.destroy(); mPromptService.destroy(); @@ -284,4 +295,18 @@ public class WebAppActivity extends AppCompatActivity mIsFullScreenMode = fullScreen; updateFullScreen(); } + + @Override // ActionModePresenter + public void startActionMode(final ActionMode.Callback callback) { + endActionMode(); + mActionMode = startSupportActionMode(callback); + } + + @Override // ActionModePresenter + public void endActionMode() { + if (mActionMode != null) { + mActionMode.finish(); + mActionMode = null; + } + } }