Skip to content

Commit a299686

Browse files
committed
Squashed 'libs/editor/' changes from 57802bf..2b066be
2b066be Merge pull request #306 from wordpress-mobile/issue/268-link-dialog-field-text 56b5dfa Prepend http scheme if there is no URI in the link text f5f5aa3 Replacing inline String with getSimpleName to future-proof name changes 4e51cf8 Select all text in Link dialog URL field for quick deletion e6366e6 Editor passes clipboard URL to Link dialog when able 6082015 Adding utility method (with tests) to get URL text from the clipboard d6d5868 Showing soft keyboard when entering Link dialog 4d13977 Removing default URL text from Link dialog field e9d2bc2 Creating fields for Link dialog arguments git-subtree-dir: libs/editor git-subtree-split: 2b066be2de3a0d2b142ffc25c1450efd084faba5
1 parent a03a146 commit a299686

File tree

5 files changed

+98
-14
lines changed

5 files changed

+98
-14
lines changed

WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import android.content.DialogInterface;
88
import android.content.Intent;
99
import android.content.res.Configuration;
10+
import android.net.Uri;
1011
import android.os.Build;
1112
import android.os.Bundle;
1213
import android.os.Looper;
@@ -16,6 +17,7 @@
1617
import android.text.Editable;
1718
import android.text.SpannableString;
1819
import android.text.Spanned;
20+
import android.text.TextUtils;
1921
import android.view.LayoutInflater;
2022
import android.view.Menu;
2123
import android.view.MenuInflater;
@@ -485,29 +487,35 @@ public void onClick(View v) {
485487

486488
Bundle dialogBundle = new Bundle();
487489

490+
// Pass potential URL from user clipboard
491+
String clipboardUri = Utils.getUrlFromClipboard(getActivity());
492+
if (clipboardUri != null) {
493+
dialogBundle.putString(LinkDialogFragment.LINK_DIALOG_ARG_URL, clipboardUri);
494+
}
495+
488496
// Pass selected text to dialog
489497
if (mSourceView.getVisibility() == View.VISIBLE) {
490498
// HTML mode
491499
mSelectionStart = mSourceViewContent.getSelectionStart();
492500
mSelectionEnd = mSourceViewContent.getSelectionEnd();
493501

494502
String selectedText = mSourceViewContent.getText().toString().substring(mSelectionStart, mSelectionEnd);
495-
dialogBundle.putString("linkText", selectedText);
503+
dialogBundle.putString(LinkDialogFragment.LINK_DIALOG_ARG_TEXT, selectedText);
496504
} else {
497505
// Visual mode
498506
mGetSelectedTextCountDownLatch = new CountDownLatch(1);
499507
mWebView.execJavaScriptFromString("ZSSEditor.execFunctionForResult('getSelectedText');");
500508
try {
501509
if (mGetSelectedTextCountDownLatch.await(1, TimeUnit.SECONDS)) {
502-
dialogBundle.putString("linkText", mJavaScriptResult);
510+
dialogBundle.putString(LinkDialogFragment.LINK_DIALOG_ARG_TEXT, mJavaScriptResult);
503511
}
504512
} catch (InterruptedException e) {
505513
AppLog.d(T.EDITOR, "Failed to obtain selected text from JS editor.");
506514
}
507515
}
508516

509517
linkDialogFragment.setArguments(dialogBundle);
510-
linkDialogFragment.show(getFragmentManager(), "LinkDialogFragment");
518+
linkDialogFragment.show(getFragmentManager(), LinkDialogFragment.class.getSimpleName());
511519
} else {
512520
if (v instanceof ToggleButton) {
513521
onFormattingButtonClicked((ToggleButton) v);
@@ -561,13 +569,15 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
561569
return;
562570
}
563571

564-
String linkUrl = extras.getString("linkURL");
565-
String linkText = extras.getString("linkText");
572+
String linkUrl = extras.getString(LinkDialogFragment.LINK_DIALOG_ARG_URL);
573+
String linkText = extras.getString(LinkDialogFragment.LINK_DIALOG_ARG_TEXT);
566574

567575
if (linkText == null || linkText.equals("")) {
568576
linkText = linkUrl;
569577
}
570578

579+
if (TextUtils.isEmpty(Uri.parse(linkUrl).getScheme())) linkUrl = "http://" + linkUrl;
580+
571581
if (mSourceView.getVisibility() == View.VISIBLE) {
572582
Editable content = mSourceViewContent.getText();
573583
if (content == null) {
@@ -1174,8 +1184,8 @@ public void onLinkTapped(String url, String title) {
11741184

11751185
Bundle dialogBundle = new Bundle();
11761186

1177-
dialogBundle.putString("linkURL", url);
1178-
dialogBundle.putString("linkText", title);
1187+
dialogBundle.putString(LinkDialogFragment.LINK_DIALOG_ARG_URL, url);
1188+
dialogBundle.putString(LinkDialogFragment.LINK_DIALOG_ARG_TEXT, title);
11791189

11801190
linkDialogFragment.setArguments(dialogBundle);
11811191
linkDialogFragment.show(getFragmentManager(), "LinkDialogFragment");

WordPressEditor/src/main/java/org/wordpress/android/editor/LinkDialogFragment.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.os.Bundle;
99
import android.view.LayoutInflater;
1010
import android.view.View;
11+
import android.view.WindowManager;
1112
import android.widget.EditText;
1213

1314
public class LinkDialogFragment extends DialogFragment {
@@ -16,6 +17,9 @@ public class LinkDialogFragment extends DialogFragment {
1617
public static final int LINK_DIALOG_REQUEST_CODE_UPDATE = 2;
1718
public static final int LINK_DIALOG_REQUEST_CODE_DELETE = 3;
1819

20+
public static final String LINK_DIALOG_ARG_URL = "linkURL";
21+
public static final String LINK_DIALOG_ARG_TEXT = "linkText";
22+
1923
@Override
2024
public Dialog onCreateDialog(Bundle savedInstanceState) {
2125
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
@@ -31,8 +35,8 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
3135
@Override
3236
public void onClick(DialogInterface dialog, int id) {
3337
Intent intent = new Intent();
34-
intent.putExtra("linkURL", urlEditText.getText().toString());
35-
intent.putExtra("linkText", linkEditText.getText().toString());
38+
intent.putExtra(LINK_DIALOG_ARG_URL, urlEditText.getText().toString());
39+
intent.putExtra(LINK_DIALOG_ARG_TEXT, linkEditText.getText().toString());
3640
getTargetFragment().onActivityResult(getTargetRequestCode(), getTargetRequestCode(), intent);
3741
}
3842
})
@@ -55,15 +59,18 @@ public void onClick(DialogInterface dialog, int which) {
5559
// Prepare initial state of EditTexts
5660
Bundle bundle = getArguments();
5761
if (bundle != null) {
58-
linkEditText.setText(bundle.getString("linkText"));
62+
linkEditText.setText(bundle.getString(LINK_DIALOG_ARG_TEXT));
5963

60-
String url = bundle.getString("linkURL");
64+
String url = bundle.getString(LINK_DIALOG_ARG_URL);
6165
if (url != null) {
6266
urlEditText.setText(url);
6367
}
64-
urlEditText.setSelection(urlEditText.length());
68+
urlEditText.selectAll();
6569
}
6670

67-
return builder.create();
71+
AlertDialog dialog = builder.create();
72+
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
73+
74+
return dialog;
6875
}
6976
}

WordPressEditor/src/main/java/org/wordpress/android/editor/Utils.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package org.wordpress.android.editor;
22

33
import android.app.Activity;
4+
import android.content.ClipData;
5+
import android.content.ClipboardManager;
46
import android.content.Context;
57
import android.content.res.AssetManager;
68
import android.net.Uri;
9+
import android.util.Patterns;
710

811
import org.wordpress.android.util.AppLog;
912
import org.wordpress.android.util.HTTPUtils;
@@ -222,4 +225,18 @@ public static Uri downloadExternalMedia(Context context, Uri imageUri, Map<Strin
222225
return null;
223226
}
224227
}
228+
229+
/**
230+
* Checks the Clipboard for text that matches the {@link Patterns#WEB_URL} pattern.
231+
*
232+
* @return the URL text in the clipboard, if it exists; otherwise null
233+
*/
234+
public static String getUrlFromClipboard(Context context) {
235+
if (context == null) return null;
236+
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
237+
ClipData data = clipboard != null ? clipboard.getPrimaryClip() : null;
238+
if (data == null || data.getItemCount() <= 0) return null;
239+
String clipText = String.valueOf(data.getItemAt(0).getText());
240+
return Patterns.WEB_URL.matcher(clipText).matches() ? clipText : null;
241+
}
225242
}

WordPressEditor/src/main/res/layout/dialog_link.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
android:layout_marginRight="@dimen/link_dialog_margin_outer"
1616
android:layout_marginBottom="@dimen/link_dialog_margin_inner"
1717
android:hint="@string/link_enter_url"
18-
android:text="http://"
1918
android:imeOptions="actionNext"
2019
tools:ignore="HardcodedText"/>
2120

WordPressEditor/src/test/java/org/wordpress/android/editor/UtilsTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package org.wordpress.android.editor;
22

3+
import android.content.ClipData;
4+
import android.content.ClipboardManager;
5+
import android.content.Context;
6+
37
import org.junit.Test;
48
import org.junit.runner.RunWith;
59
import org.robolectric.RobolectricTestRunner;
@@ -14,12 +18,16 @@
1418
import java.util.Set;
1519

1620
import static org.junit.Assert.assertEquals;
21+
import static org.junit.Assert.assertNull;
22+
import static org.mockito.Mockito.mock;
23+
import static org.mockito.Mockito.when;
1724
import static org.wordpress.android.editor.Utils.buildMapFromKeyValuePairs;
1825
import static org.wordpress.android.editor.Utils.decodeHtml;
1926
import static org.wordpress.android.editor.Utils.escapeHtml;
2027
import static org.wordpress.android.editor.Utils.getChangeMapFromSets;
2128
import static org.wordpress.android.editor.Utils.splitDelimitedString;
2229
import static org.wordpress.android.editor.Utils.splitValuePairDelimitedString;
30+
import static org.wordpress.android.editor.Utils.getUrlFromClipboard;
2331

2432
@Config(sdk = 18)
2533
@RunWith(RobolectricTestRunner.class)
@@ -161,4 +169,47 @@ public void testGetChangeMapFromSets() {
161169
// Test empty sets
162170
assertEquals(Collections.emptyMap(), getChangeMapFromSets(Collections.emptySet(), Collections.emptySet()));
163171
}
172+
173+
@Test
174+
public void testClipboardUrlWithNullContext() {
175+
assertNull(getUrlFromClipboard(null));
176+
}
177+
178+
@Test
179+
public void testClipboardUrlWithNoClipData() {
180+
assertNull(getClipboardUrlHelper(0, null));
181+
}
182+
183+
@Test
184+
public void testClipboardUrlWithNonUriData() {
185+
assertNull(getClipboardUrlHelper(1, "not a URL"));
186+
}
187+
188+
@Test
189+
public void testClipboardUrlWithLocalUriData() {
190+
assertNull(getClipboardUrlHelper(1, "file://test.png"));
191+
}
192+
193+
@Test
194+
public void testClipboardWithUrlData() {
195+
String testUrl = "google.com";
196+
assertEquals(testUrl, getClipboardUrlHelper(1, testUrl));
197+
}
198+
199+
private String getClipboardUrlHelper(int itemCount, String clipText) {
200+
ClipData.Item mockItem = mock(ClipData.Item.class);
201+
when(mockItem.getText()).thenReturn(clipText);
202+
203+
ClipData mockPrimary = mock(ClipData.class);
204+
when(mockPrimary.getItemCount()).thenReturn(itemCount);
205+
when(mockPrimary.getItemAt(0)).thenReturn(mockItem);
206+
207+
ClipboardManager mockManager = mock(ClipboardManager.class);
208+
when(mockManager.getPrimaryClip()).thenReturn(mockPrimary);
209+
210+
Context mockContext = mock(Context.class);
211+
when(mockContext.getSystemService(Context.CLIPBOARD_SERVICE)).thenReturn(mockManager);
212+
213+
return getUrlFromClipboard(mockContext);
214+
}
164215
}

0 commit comments

Comments
 (0)