diff options
author | Luca Zanolin <zano@google.com> | 2013-02-14 14:18:26 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-02-20 11:35:19 +0000 |
commit | 8cd8135b95da5b471804604b06084eecbe1cc23b (patch) | |
tree | 4c2bc2ba891f16b32bfff70f5994ab1ecfc56a1a /core/java/android/widget | |
parent | 8983d11c4069bc136f496987f11df7dcd5771188 (diff) | |
download | frameworks_base-8cd8135b95da5b471804604b06084eecbe1cc23b.zip frameworks_base-8cd8135b95da5b471804604b06084eecbe1cc23b.tar.gz frameworks_base-8cd8135b95da5b471804604b06084eecbe1cc23b.tar.bz2 |
Enable correction/deleting notification via EasyEditSpan.
When the "delete" pop-up is clicked (and the wrapped text removed), the
creator of the span will receive a notification of the action.
Similarly, if the user modifies (i.e., add/remove a char), the creator of
the span will receive a notification too. The notification will not contain any
information about how the text has been modified.
Bug: 6905960
Change-Id: Ic227b8fd50066699915f69a54f225fb5330867c4
Diffstat (limited to 'core/java/android/widget')
-rw-r--r-- | core/java/android/widget/Editor.java | 73 |
1 files changed, 63 insertions, 10 deletions
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 862e2c8..dc305a5 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -20,6 +20,8 @@ import com.android.internal.util.ArrayUtils; import com.android.internal.widget.EditableInputConnection; import android.R; +import android.app.PendingIntent; +import android.app.PendingIntent.CanceledException; import android.content.ClipData; import android.content.ClipData.Item; import android.content.Context; @@ -1890,10 +1892,23 @@ public class Editor { // Make sure there is only at most one EasyEditSpan in the text if (mPopupWindow.mEasyEditSpan != null) { - text.removeSpan(mPopupWindow.mEasyEditSpan); + mPopupWindow.mEasyEditSpan.setDeleteEnabled(false); } mPopupWindow.setEasyEditSpan((EasyEditSpan) span); + mPopupWindow.setOnDeleteListener(new EasyEditDeleteListener() { + @Override + public void onDeleteClick(EasyEditSpan span) { + Editable editable = (Editable) mTextView.getText(); + int start = editable.getSpanStart(span); + int end = editable.getSpanEnd(span); + if (start >= 0 && end >= 0) { + sendNotification(EasyEditSpan.TEXT_DELETED, span); + mTextView.deleteText_internal(start, end); + } + editable.removeSpan(span); + } + }); if (mTextView.getWindowVisibility() != View.VISIBLE) { // The window is not visible yet, ignore the text change. @@ -1927,8 +1942,10 @@ public class Editor { @Override public void onSpanChanged(Spannable text, Object span, int previousStart, int previousEnd, int newStart, int newEnd) { - if (mPopupWindow != null && span == mPopupWindow.mEasyEditSpan) { - text.removeSpan(mPopupWindow.mEasyEditSpan); + if (mPopupWindow != null && span instanceof EasyEditSpan) { + EasyEditSpan easyEditSpan = (EasyEditSpan) span; + sendNotification(EasyEditSpan.TEXT_MODIFIED, easyEditSpan); + text.removeSpan(easyEditSpan); } } @@ -1938,6 +1955,31 @@ public class Editor { mTextView.removeCallbacks(mHidePopup); } } + + private void sendNotification(int textChangedType, EasyEditSpan span) { + try { + PendingIntent pendingIntent = span.getPendingIntent(); + if (pendingIntent != null) { + Intent intent = new Intent(); + intent.putExtra(EasyEditSpan.EXTRA_TEXT_CHANGED_TYPE, textChangedType); + pendingIntent.send(mTextView.getContext(), 0, intent); + } + } catch (CanceledException e) { + // This should not happen, as we should try to send the intent only once. + Log.w(TAG, "PendingIntent for notification cannot be sent", e); + } + } + } + + /** + * Listens for the delete event triggered by {@link EasyEditPopupWindow}. + */ + private interface EasyEditDeleteListener { + + /** + * Clicks the delete pop-up. + */ + void onDeleteClick(EasyEditSpan span); } /** @@ -1950,6 +1992,7 @@ public class Editor { com.android.internal.R.layout.text_edit_action_popup_text; private TextView mDeleteTextView; private EasyEditSpan mEasyEditSpan; + private EasyEditDeleteListener mOnDeleteListener; @Override protected void createPopupWindow() { @@ -1984,19 +2027,29 @@ public class Editor { mEasyEditSpan = easyEditSpan; } + private void setOnDeleteListener(EasyEditDeleteListener listener) { + mOnDeleteListener = listener; + } + @Override public void onClick(View view) { - if (view == mDeleteTextView) { - Editable editable = (Editable) mTextView.getText(); - int start = editable.getSpanStart(mEasyEditSpan); - int end = editable.getSpanEnd(mEasyEditSpan); - if (start >= 0 && end >= 0) { - mTextView.deleteText_internal(start, end); - } + if (view == mDeleteTextView + && mEasyEditSpan != null && mEasyEditSpan.isDeleteEnabled() + && mOnDeleteListener != null) { + mOnDeleteListener.onDeleteClick(mEasyEditSpan); } } @Override + public void hide() { + if (mEasyEditSpan != null) { + mEasyEditSpan.setDeleteEnabled(false); + } + mOnDeleteListener = null; + super.hide(); + } + + @Override protected int getTextOffset() { // Place the pop-up at the end of the span Editable editable = (Editable) mTextView.getText(); |