Dbrant has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/281304

Change subject: [Hackathon] "Edit here" context button.
......................................................................

[Hackathon] "Edit here" context button.

Bug: T119887
Change-Id: I54a2c68741851d81f4aa5ac25f7f91d4be309c31
---
M app/src/main/assets/bundle.js
M app/src/main/java/org/wikipedia/editing/EditHandler.java
M app/src/main/java/org/wikipedia/editing/EditSectionActivity.java
M app/src/main/java/org/wikipedia/page/PageFragment.java
M app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
A app/src/main/res/drawable-hdpi/ic_mode_edit_white_24dp.png
A app/src/main/res/drawable-mdpi/ic_mode_edit_white_24dp.png
A app/src/main/res/drawable-xhdpi/ic_mode_edit_white_24dp.png
A app/src/main/res/drawable-xxhdpi/ic_mode_edit_white_24dp.png
A app/src/main/res/drawable-xxxhdpi/ic_mode_edit_white_24dp.png
M app/src/main/res/layout/activity_edit_section.xml
M app/src/main/res/menu/menu_text_select.xml
M app/src/main/res/values-qq/strings.xml
M app/src/main/res/values/strings.xml
M www/js/sections.js
15 files changed, 97 insertions(+), 12 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/04/281304/1

diff --git a/app/src/main/assets/bundle.js b/app/src/main/assets/bundle.js
index 357e66e..84c289f 100644
--- a/app/src/main/assets/bundle.js
+++ b/app/src/main/assets/bundle.js
@@ -422,7 +422,16 @@
     if (text.length > 250) {
         text = text.substring(0, 249);
     }
-    bridge.sendMessage( "onGetTextSelection", { "purpose" : payload.purpose, 
"text" : text } );
+    if (payload.purpose === "edit_here") {
+        var range = window.getSelection().getRangeAt(0);
+        var newRangeStart = range.startOffset - 20;
+        if (newRangeStart < 0) {
+            newRangeStart = 0;
+        }
+        range.setStart(range.startContainer, newRangeStart);
+        text = range.toString();
+    }
+    bridge.sendMessage( "onGetTextSelection", { "purpose" : payload.purpose, 
"text" : text, "sectionID" : getCurrentSection() } );
 });
 
 bridge.registerListener( "displayLeadSection", function( payload ) {
diff --git a/app/src/main/java/org/wikipedia/editing/EditHandler.java 
b/app/src/main/java/org/wikipedia/editing/EditHandler.java
index e93dab0..985efc5 100644
--- a/app/src/main/java/org/wikipedia/editing/EditHandler.java
+++ b/app/src/main/java/org/wikipedia/editing/EditHandler.java
@@ -32,6 +32,18 @@
         this.funnel = new 
ProtectedEditAttemptFunnel(WikipediaApp.getInstance(), 
page.getTitle().getSite());
     }
 
+    public void startEditingSection(int sectionID, String highlightText) {
+        Section section = currentPage.getSections().get(sectionID);
+        Intent intent = new Intent(fragment.getActivity(), 
EditSectionActivity.class);
+        intent.setAction(EditSectionActivity.ACTION_EDIT_SECTION);
+        intent.putExtra(EditSectionActivity.EXTRA_SECTION_ID, section.getId());
+        intent.putExtra(EditSectionActivity.EXTRA_SECTION_HEADING, 
section.getHeading());
+        intent.putExtra(EditSectionActivity.EXTRA_TITLE, 
currentPage.getTitle());
+        intent.putExtra(EditSectionActivity.EXTRA_PAGE_PROPS, 
currentPage.getPageProperties());
+        intent.putExtra(EditSectionActivity.EXTRA_HIGHLIGHT_TEXT, 
highlightText);
+        fragment.startActivityForResult(intent, 
PageActivity.ACTIVITY_REQUEST_EDIT_SECTION);
+    }
+
     private void showUneditableDialog() {
         new AlertDialog.Builder(fragment.getActivity())
                 .setCancelable(false)
@@ -85,15 +97,7 @@
                 showUneditableDialog();
                 return;
             }
-            int id = messagePayload.optInt("sectionID");
-            Section section = currentPage.getSections().get(id);
-            Intent intent = new Intent(fragment.getActivity(), 
EditSectionActivity.class);
-            intent.setAction(EditSectionActivity.ACTION_EDIT_SECTION);
-            intent.putExtra(EditSectionActivity.EXTRA_SECTION_ID, 
section.getId());
-            intent.putExtra(EditSectionActivity.EXTRA_SECTION_HEADING, 
section.getHeading());
-            intent.putExtra(EditSectionActivity.EXTRA_TITLE, 
currentPage.getTitle());
-            intent.putExtra(EditSectionActivity.EXTRA_PAGE_PROPS, 
currentPage.getPageProperties());
-            fragment.startActivityForResult(intent, 
PageActivity.ACTIVITY_REQUEST_EDIT_SECTION);
+            startEditingSection(messagePayload.optInt("sectionID"), null);
             if (wasRefreshed) {
                 savedPagesFunnel.logEditAfterRefresh();
             }
diff --git a/app/src/main/java/org/wikipedia/editing/EditSectionActivity.java 
b/app/src/main/java/org/wikipedia/editing/EditSectionActivity.java
index f5291c5..6db3650 100644
--- a/app/src/main/java/org/wikipedia/editing/EditSectionActivity.java
+++ b/app/src/main/java/org/wikipedia/editing/EditSectionActivity.java
@@ -22,6 +22,7 @@
 import android.widget.EditText;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
+import android.widget.ScrollView;
 import android.widget.TextView;
 import com.squareup.otto.Bus;
 import org.mediawiki.api.json.Api;
@@ -55,6 +56,7 @@
     public static final String EXTRA_SECTION_ID = 
"org.wikipedia.edit_section.sectionid";
     public static final String EXTRA_SECTION_HEADING = 
"org.wikipedia.edit_section.sectionheading";
     public static final String EXTRA_PAGE_PROPS = 
"org.wikipedia.edit_section.pageprops";
+    public static final String EXTRA_HIGHLIGHT_TEXT = 
"org.wikipedia.edit_section.highlight";
 
     private WikipediaApp app;
     private Bus bus;
@@ -67,6 +69,7 @@
     private int sectionID;
     private String sectionHeading;
     private PageProperties pageProps;
+    private String textToHighlight;
 
     private String sectionWikitext;
     private SyntaxHighlighter syntaxHighlighter;
@@ -111,6 +114,7 @@
         sectionID = getIntent().getIntExtra(EXTRA_SECTION_ID, 0);
         sectionHeading = getIntent().getStringExtra(EXTRA_SECTION_HEADING);
         pageProps = getIntent().getParcelableExtra(EXTRA_PAGE_PROPS);
+        textToHighlight = getIntent().getStringExtra(EXTRA_HIGHLIGHT_TEXT);
 
         progressDialog = new ProgressDialog(this);
         progressDialog.setIndeterminate(true);
@@ -602,6 +606,7 @@
         sectionText.setText(sectionWikitext);
         ViewAnimations.crossFade(sectionProgress, sectionContainer);
         supportInvalidateOptionsMenu();
+        highlightText();
 
         if (pageProps != null && pageProps.getEditProtectionStatus() != null) {
             String message;
@@ -620,6 +625,42 @@
         }
     }
 
+    private void highlightText() {
+        if (TextUtils.isEmpty(textToHighlight)) {
+            return;
+        }
+
+        sectionText.post(new Runnable() {
+            @Override
+            public void run() {
+                ((ScrollView) 
sectionContainer).setSmoothScrollingEnabled(false);
+                ((ScrollView) sectionContainer).fullScroll(View.FOCUS_DOWN);
+                final int scrollDelayMs = 500;
+                sectionText.postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        String[] words = textToHighlight.split("\\s+");
+                        int pos = 0;
+                        for (int i = 0; i < words.length; i++) {
+                            pos = sectionWikitext.indexOf(words[i], pos);
+                            if (pos == -1) {
+                                break;
+                            }
+                        }
+                        if (pos == -1) {
+                            pos = sectionWikitext.indexOf(words[words.length - 
1]);
+                        }
+                        if (pos > 0) {
+                            sectionText.setSelection(pos, pos + 
words[words.length - 1].length());
+                            sectionText.performLongClick();
+                        }
+                    }
+                }, scrollDelayMs);
+            }
+        });
+
+    }
+
     /**
      * Shows the custom edit summary input fragment, where the user may enter 
a summary
      * that's different from the standard summary tags.
diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.java 
b/app/src/main/java/org/wikipedia/page/PageFragment.java
index 719f57d..3b61b30 100755
--- a/app/src/main/java/org/wikipedia/page/PageFragment.java
+++ b/app/src/main/java/org/wikipedia/page/PageFragment.java
@@ -204,6 +204,10 @@
         savedPageCheckComplete = complete;
     }
 
+    public EditHandler getEditHandler() {
+        return editHandler;
+    }
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
diff --git a/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java 
b/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
index e0453f2..4d22620 100755
--- a/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
+++ b/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
@@ -54,6 +54,7 @@
     private static final String PAYLOAD_PURPOSE_KEY = "purpose";
     private static final String PAYLOAD_PURPOSE_SHARE = "share";
     private static final String PAYLOAD_PURPOSE_DEFINE = "define";
+    private static final String PAYLOAD_PURPOSE_EDIT_HERE = "edit_here";
     private static final String PAYLOAD_TEXT_KEY = "text";
 
     @ColorRes private static final int SHARE_TOOL_TIP_COLOR = 
R.color.blue_liberal;
@@ -87,6 +88,9 @@
                     case PAYLOAD_PURPOSE_DEFINE:
                         onDefinePayload(text);
                         break;
+                    case PAYLOAD_PURPOSE_EDIT_HERE:
+                        onEditHerePayload(messagePayload.optInt("sectionID", 
0), text);
+                        break;
                     default:
                         L.d("Unknown purpose=" + purpose);
                 }
@@ -109,6 +113,10 @@
 
     private void onDefinePayload(String text) {
         showWiktionaryDefinition(text.toLowerCase());
+    }
+
+    private void onEditHerePayload(int sectionID, String text) {
+        
activity.getCurPageFragment().getEditHandler().startEditingSection(sectionID, 
text);
     }
 
     private void showCopySnackbar() {
@@ -193,6 +201,8 @@
             defineItem.setVisible(true);
             defineItem.setOnMenuItemClickListener(new 
RequestTextSelectOnMenuItemClickListener(PAYLOAD_PURPOSE_DEFINE));
         }
+        MenuItem editItem = menu.findItem(R.id.menu_text_edit_here);
+        editItem.setOnMenuItemClickListener(new 
RequestTextSelectOnMenuItemClickListener(PAYLOAD_PURPOSE_EDIT_HERE));
 
         createFunnel();
         funnel.logHighlight();
diff --git a/app/src/main/res/drawable-hdpi/ic_mode_edit_white_24dp.png 
b/app/src/main/res/drawable-hdpi/ic_mode_edit_white_24dp.png
new file mode 100644
index 0000000..595ff10
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/ic_mode_edit_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/ic_mode_edit_white_24dp.png 
b/app/src/main/res/drawable-mdpi/ic_mode_edit_white_24dp.png
new file mode 100644
index 0000000..12b09f1
--- /dev/null
+++ b/app/src/main/res/drawable-mdpi/ic_mode_edit_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_mode_edit_white_24dp.png 
b/app/src/main/res/drawable-xhdpi/ic_mode_edit_white_24dp.png
new file mode 100644
index 0000000..5a06bff
--- /dev/null
+++ b/app/src/main/res/drawable-xhdpi/ic_mode_edit_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_mode_edit_white_24dp.png 
b/app/src/main/res/drawable-xxhdpi/ic_mode_edit_white_24dp.png
new file mode 100644
index 0000000..02e19d0
--- /dev/null
+++ b/app/src/main/res/drawable-xxhdpi/ic_mode_edit_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_mode_edit_white_24dp.png 
b/app/src/main/res/drawable-xxxhdpi/ic_mode_edit_white_24dp.png
new file mode 100644
index 0000000..d6668a0
--- /dev/null
+++ b/app/src/main/res/drawable-xxxhdpi/ic_mode_edit_white_24dp.png
Binary files differ
diff --git a/app/src/main/res/layout/activity_edit_section.xml 
b/app/src/main/res/layout/activity_edit_section.xml
index 4ffb171..933e4c4 100644
--- a/app/src/main/res/layout/activity_edit_section.xml
+++ b/app/src/main/res/layout/activity_edit_section.xml
@@ -37,7 +37,8 @@
             android:id="@+id/edit_section_container"
             android:visibility="gone"
             tools:visibility="visible"
-            android:layout_width="match_parent" 
android:layout_height="match_parent">
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
         <org.wikipedia.views.PlainPasteEditText
                 android:id="@+id/edit_section_text"
                 android:layout_width="match_parent"
diff --git a/app/src/main/res/menu/menu_text_select.xml 
b/app/src/main/res/menu/menu_text_select.xml
index 4548566..bfbd284 100644
--- a/app/src/main/res/menu/menu_text_select.xml
+++ b/app/src/main/res/menu/menu_text_select.xml
@@ -12,6 +12,11 @@
           android:icon="?actionModeShareDrawable"
           app:showAsAction="ifRoom" />
 
+    <item android:id="@+id/menu_text_edit_here"
+        android:title="@string/menu_text_select_edit_here"
+        android:icon="@drawable/ic_mode_edit_white_24dp"
+        app:showAsAction="ifRoom" />
+
     <item android:id="@+id/menu_text_select_define"
           android:title="@string/menu_text_select_define"
           android:icon="@drawable/define_light"
diff --git a/app/src/main/res/values-qq/strings.xml 
b/app/src/main/res/values-qq/strings.xml
index d6f5626..a5b8c8c 100644
--- a/app/src/main/res/values-qq/strings.xml
+++ b/app/src/main/res/values-qq/strings.xml
@@ -77,6 +77,7 @@
 {{Identical|Define}}</string>
   <string name="menu_text_select_share">Menu item caption for sharing text and 
images with other apps such as Email and Twitter.
 {{Identical|Share}}</string>
+  <string name="menu_text_select_edit_here">Menu item caption for editing the 
current section at the currently highlighted word.</string>
   <string name="nav_item_nearby">Entry in nav drawer for Nearby feature
 {{Identical|Nearby}}</string>
   <string name="nearby_distance_in_meters">Distance to the place mentioned in 
the nearby page in meters. Please leave the %d as is. It represents an integer 
decimal number up to 999.</string>
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index 1fe8821..21c8044 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -56,6 +56,7 @@
     <string name="menu_text_select_copy">Copy</string>
     <string name="menu_text_select_define">Define</string>
     <string name="menu_text_select_share">Share</string>
+    <string name="menu_text_select_edit_here">Edit here</string>
 
     <!-- Nearby -->
     <string name="nav_item_nearby">Nearby</string>
diff --git a/www/js/sections.js b/www/js/sections.js
index 3214df7..747757b 100644
--- a/www/js/sections.js
+++ b/www/js/sections.js
@@ -50,7 +50,16 @@
     if (text.length > 250) {
         text = text.substring(0, 249);
     }
-    bridge.sendMessage( "onGetTextSelection", { "purpose" : payload.purpose, 
"text" : text } );
+    if (payload.purpose === "edit_here") {
+        var range = window.getSelection().getRangeAt(0);
+        var newRangeStart = range.startOffset - 20;
+        if (newRangeStart < 0) {
+            newRangeStart = 0;
+        }
+        range.setStart(range.startContainer, newRangeStart);
+        text = range.toString();
+    }
+    bridge.sendMessage( "onGetTextSelection", { "purpose" : payload.purpose, 
"text" : text, "sectionID" : getCurrentSection() } );
 });
 
 bridge.registerListener( "displayLeadSection", function( payload ) {

-- 
To view, visit https://gerrit.wikimedia.org/r/281304
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I54a2c68741851d81f4aa5ac25f7f91d4be309c31
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to