Closed
Bug 876485
Opened 10 years ago
Closed 10 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•10 years ago
|
||
Hi there, can I work on this one?
Updated•10 years ago
|
Assignee: nobody → fedepaol
Reporter | ||
Comment 2•10 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•10 years ago
|
||
If this is ok, I will proceed with refactoring the name of the methods.
Attachment #756942 -
Flags: feedback?(cpeterson)
Reporter | ||
Comment 4•10 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•10 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•10 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•10 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•10 years ago
|
||
Added the last changes you suggested.
Attachment #758055 -
Attachment is obsolete: true
Attachment #758802 -
Flags: review?(cpeterson)
Reporter | ||
Comment 9•10 years ago
|
||
green try build: https://tbpl.mozilla.org/?tree=Try&rev=7b57a51eed28
Reporter | ||
Comment 10•10 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•10 years ago
|
||
https://hg.mozilla.org/mozilla-central/rev/33a3d0e4bc18
Status: ASSIGNED → RESOLVED
Closed: 10 years ago
Resolution: --- → FIXED
Target Milestone: --- → Firefox 24
Reporter | ||
Updated•10 years ago
|
Attachment #758802 -
Flags: review?(cpeterson) → review+
Updated•2 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
•