Closed
Bug 876485
Opened 13 years ago
Closed 13 years ago
Refactor GeckoAppShell's Clipboard code into a new util/Clipboard.java file
Categories
(Firefox for Android Graveyard :: General, defect)
Tracking
(firefox23 wontfix, firefox24 fixed)
RESOLVED
FIXED
Firefox 24
People
(Reporter: cpeterson, Assigned: fedepaol)
References
Details
(Whiteboard: [mentor=cpeterson] [lang=java] [lang=c++])
Attachments
(1 file, 2 obsolete files)
|
26.65 KB,
patch
|
cpeterson
:
review+
|
Details | Diff | Splinter Review |
GeckoAppShell.java is a huge class and its Clipboard code is getting increasingly complicated by version-specific and device-specific workarounds. We should extract those methods into a new class.
The current Clipboard code is here:
https://hg.mozilla.org/mozilla-central/file/2ca0856eb5ee/mobile/android/base/GeckoAppShell.java#l1218
That code should move into a util/Clipboard.java file that is a static singleton, like the other util/*Utils.java classes. We should move the existing code as-is, the in a second patch simplify the method names to something like:
Clipboard.getText()
Clipboard.setText()
Clipboard.clearText() // which would just call setText("")
!!! An important reminder: Fennec's widget code calls the Clipboard code from C++/JNI and must be updated with the new class and method names:
https://hg.mozilla.org/mozilla-central/file/2ca0856eb5ee/widget/android/AndroidBridge.cpp#l123
| Assignee | ||
Comment 1•13 years ago
|
||
Hi there, can I work on this one?
Updated•13 years ago
|
Assignee: nobody → fedepaol
| Reporter | ||
Comment 2•13 years ago
|
||
hi Federico, thanks for your help!
Have you compiled and installed Firefox for Android before? Here are the build instructions:
https://wiki.mozilla.org/Mobile/Fennec/Android#Building_Fennec
If you have any questions, the #mobile IRC channel on irc.mozilla.com is the best way to get quick answers to your questions. You can also email me directly at cpeterson at mozilla dot com.
Status: NEW → ASSIGNED
| Assignee | ||
Comment 3•13 years ago
|
||
If this is ok, I will proceed with refactoring the name of the methods.
Attachment #756942 -
Flags: feedback?(cpeterson)
| Reporter | ||
Comment 4•13 years ago
|
||
Comment on attachment 756942 [details] [diff] [review]
First submission of the patch
Review of attachment 756942 [details] [diff] [review]:
-----------------------------------------------------------------
Looks good! If you post a revised patch with the following small fixes, I'll r+ and check it in.
::: mobile/android/base/GeckoApplication.java
@@ -10,4 @@
> import org.mozilla.gecko.util.HardwareUtils;
> import org.mozilla.gecko.util.ThreadUtils;
>
> -import android.app.Application;
You can leave this `import android...` line here. Our Java coding style, we order our imports by blocks separated by empty line: org.mozilla.*, com.*, net.*, org.*, android.*, then java.*.
https://developer.mozilla.org/en-US/docs/Developer_Guide/Coding_Style#Java_practices
::: mobile/android/base/util/Clipboard.java
@@ +1,1 @@
> +package org.mozilla.gecko.util;
Please add this MPLv2 comment block to the top of this new file:
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
@@ +8,5 @@
> +
> +public class Clipboard {
> + private static Context mContext;
> + private final static String LOG_TAG = "Clipboard";
> +
Please add a private Clipboard constructor (that does nothing) and mark the class as `final`. Since Clipboard is a singleton utility class, we don't want anyone to allocate a Clipboard instance or subclass it.
@@ +9,5 @@
> +public class Clipboard {
> + private static Context mContext;
> + private final static String LOG_TAG = "Clipboard";
> +
> + public static void init(Context c) {
I think we should add a new Context parameter to the getClipboardText() and setClipboardText() methods. I'm a little nervous about holding a static reference to our Context. Note that adding a new parameter will require the C++ JNI code to be updated.
Attachment #756942 -
Flags: feedback?(cpeterson) → feedback+
| Reporter | ||
Comment 5•13 years ago
|
||
Comment on attachment 756942 [details] [diff] [review]
First submission of the patch
Review of attachment 756942 [details] [diff] [review]:
-----------------------------------------------------------------
Here are some suggestions for additional code cleanup you might want to make in your patch to rename the Clipboard methods.
::: mobile/android/base/GeckoInputConnection.java
@@ +270,5 @@
> case R.id.cut:
> // If selection is empty, we'll select everything
> if (selStart == selEnd) {
> // Fill the clipboard
> + Clipboard.setClipboardText(editable.toString());
`setClipboardText(editable.toString())` can be streamlined to `setText(editable)` with my CharSequence suggestion below.
::: mobile/android/base/util/Clipboard.java
@@ +21,5 @@
> + /* On some devices, access to the clipboard service needs to happen
> + * on a thread with a looper, so this function requires a looper is
> + * present on the thread. */
> + @SuppressWarnings("deprecation")
> + private static String getClipboardTextImpl() {
Let's move getClipboardTextImpl() to the bottom of the class definition since it's a private method.
@@ +22,5 @@
> + * on a thread with a looper, so this function requires a looper is
> + * present on the thread. */
> + @SuppressWarnings("deprecation")
> + private static String getClipboardTextImpl() {
> + if (android.os.Build.VERSION.SDK_INT >= 11) {
Let's import android.os.Build at the top of the file and just use Build.VERSION.SDK_INT here.
@@ +32,5 @@
> + return item.coerceToText(mContext).toString();
> + }
> + }
> + } else {
> + android.text.ClipboardManager cm = (android.text.ClipboardManager)mContext.getSystemService(Context.CLIPBOARD_SERVICE);
These getSystemService(Context.CLIPBOARD_SERVICE) lines are really long and repeated in two methods. Can we split these lines into private helper methods like these?
android.text.ClipboardManager getClipboardManager(Context context) {
return (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
}
android.content.ClipboardManager getClipboardManager11(Context context) {
// In API Level 11 and above, CLIPBOARD_SERVICE returns android.content.ClipboardManager,
// which is a subclass of android.text.ClipboardManager.
return (android.content.ClipboardManager) getClipboardManager(context);
}
@@ +40,5 @@
> + }
> + return null;
> + }
> +
> + private static SynchronousQueue<String> sClipboardQueue = new SynchronousQueue<String>();
Even though sClipboardQueue's declaration was in the middle of GeckoAppShell class, let's move it to the top of the Clipboard class, our usual Java coding style. We can make it `final`, too.
@@ +67,5 @@
> + return "";
> + }
> + }
> +
> + public static void setClipboardText(final String text) {
Let's change set[Clipboard]Text() to take a CharSequence instead of a String. Android's ClipboardManager classes take CharSequences. This will allow us to streamline GeckoInputConnection.java's `setClipboardText(editable.toString())` call to `setText(editable)` (because Editable implements the CharSequence interface). But I think get[Clipboard]Text() should still return a regular String.
@@ +72,5 @@
> + ThreadUtils.postToBackgroundThread(new Runnable() {
> + @Override
> + @SuppressWarnings("deprecation")
> + public void run() {
> + if (android.os.Build.VERSION.SDK_INT >= 11) {
Just use Build.VERSION.SDK_INT here, too.
| Assignee | ||
Comment 6•13 years ago
|
||
I also had to change the jclass called from jni from geckoappshell to this new clipboardclass, which I did not change in the previous version. Hoping everything is fine..
Attachment #756942 -
Attachment is obsolete: true
Attachment #758055 -
Flags: review?(cpeterson)
| Reporter | ||
Comment 7•13 years ago
|
||
Comment on attachment 758055 [details] [diff] [review]
Second attempt
Review of attachment 758055 [details] [diff] [review]:
-----------------------------------------------------------------
Looks great! If you post a revised patch with the suggestions below, I can r+ your patch and land in on mozilla-central.
::: mobile/android/base/util/Clipboard.java
@@ +60,5 @@
> + @SuppressWarnings("deprecation")
> + public void run() {
> + if (Build.VERSION.SDK_INT >= 11) {
> + android.content.ClipboardManager cm = getClipboardManager11(mContext);
> + cm.setPrimaryClip(ClipData.newPlainText("Text", text));
I think your copy of the mozilla-central code is a little out of date. Can you please add the following bug fix from GeckoAppShell.java's setClipboardText() to Clipboard.java's setText()?
https://hg.mozilla.org/mozilla-central/rev/1ad0d609ccd1
@@ +85,5 @@
> + * present on the thread. */
> + @SuppressWarnings("deprecation")
> + private static String getClipboardTextImpl() {
> + if (Build.VERSION.SDK_INT >= 11) {
> + android.content.ClipboardManager cm = (android.content.ClipboardManager)mContext.getSystemService(Context.CLIPBOARD_SERVICE);
Can you please use the new getClipboardManager() and getClipboardManager11() helper functions in getClipboardTextImpl(), too?
Attachment #758055 -
Flags: review?(cpeterson) → feedback+
| Assignee | ||
Comment 8•13 years ago
|
||
Added the last changes you suggested.
Attachment #758055 -
Attachment is obsolete: true
Attachment #758802 -
Flags: review?(cpeterson)
| Reporter | ||
Comment 9•13 years ago
|
||
green try build:
https://tbpl.mozilla.org/?tree=Try&rev=7b57a51eed28
| Reporter | ||
Comment 10•13 years ago
|
||
https://hg.mozilla.org/integration/mozilla-inbound/rev/33a3d0e4bc18
Thanks for fixing this bug, Federico! :)
status-firefox23:
--- → wontfix
status-firefox24:
--- → fixed
Comment 11•13 years ago
|
||
Status: ASSIGNED → RESOLVED
Closed: 13 years ago
Resolution: --- → FIXED
Target Milestone: --- → Firefox 24
| Reporter | ||
Updated•13 years ago
|
Attachment #758802 -
Flags: review?(cpeterson) → review+
Updated•5 years ago
|
Product: Firefox for Android → Firefox for Android Graveyard
You need to log in
before you can comment on or make changes to this bug.
Description
•