diff options
| author | Andrei Stingaceanu <stg@google.com> | 2015-06-11 14:34:50 +0000 |
|---|---|---|
| committer | Andrei Stingaceanu <stg@google.com> | 2015-06-11 14:34:50 +0000 |
| commit | 1036c74784d8f8ca7232aaa26b1b0c3796c29d1d (patch) | |
| tree | 21214e903464e614126ab1556138c07b9cb0d0ca /core/java/android/inputmethodservice/ExtractEditLayout.java | |
| parent | 00245473dbdf5469ad40d1ca6d2f53a87462efcb (diff) | |
Revert "Completely remove ExtractActionMode - master cherrypick"
This reverts commit 00245473dbdf5469ad40d1ca6d2f53a87462efcb.
Change-Id: If078c09fbdfd00d005ff58d543f03601b96eef0a
Diffstat (limited to 'core/java/android/inputmethodservice/ExtractEditLayout.java')
| -rw-r--r-- | core/java/android/inputmethodservice/ExtractEditLayout.java | 172 |
1 files changed, 170 insertions, 2 deletions
diff --git a/core/java/android/inputmethodservice/ExtractEditLayout.java b/core/java/android/inputmethodservice/ExtractEditLayout.java index 37ca4b44a1a1..e902443b16f4 100644 --- a/core/java/android/inputmethodservice/ExtractEditLayout.java +++ b/core/java/android/inputmethodservice/ExtractEditLayout.java @@ -16,19 +16,30 @@ package android.inputmethodservice; +import com.android.internal.view.menu.MenuBuilder; +import com.android.internal.view.menu.MenuPopupHelper; + import android.content.Context; import android.util.AttributeSet; +import android.view.ActionMode; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.accessibility.AccessibilityEvent; import android.widget.Button; import android.widget.LinearLayout; /** - * ExtractEditLayout provides an ActionMode presentation for the limited screen real estate in - * extract mode. + * ExtractEditLayout provides an ActionMode presentation for the + * limited screen real estate in extract mode. * * @hide */ public class ExtractEditLayout extends LinearLayout { + ExtractActionMode mActionMode; Button mExtractActionButton; + Button mEditButton; public ExtractEditLayout(Context context) { super(context); @@ -39,8 +50,165 @@ public class ExtractEditLayout extends LinearLayout { } @Override + public ActionMode startActionModeForChild(View sourceView, ActionMode.Callback cb) { + final ExtractActionMode mode = new ExtractActionMode(cb); + if (mode.dispatchOnCreate()) { + mode.invalidate(); + mExtractActionButton.setVisibility(INVISIBLE); + mEditButton.setVisibility(VISIBLE); + mActionMode = mode; + sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + return mode; + } + return null; + } + + /** + * @return true if an action mode is currently active. + */ + public boolean isActionModeStarted() { + return mActionMode != null; + } + + /** + * Finishes a possibly started action mode. + */ + public void finishActionMode() { + if (mActionMode != null) { + mActionMode.finish(); + } + } + + @Override public void onFinishInflate() { super.onFinishInflate(); mExtractActionButton = (Button) findViewById(com.android.internal.R.id.inputExtractAction); + mEditButton = (Button) findViewById(com.android.internal.R.id.inputExtractEditButton); + mEditButton.setOnClickListener(new OnClickListener() { + public void onClick(View clicked) { + if (mActionMode != null) { + new MenuPopupHelper(getContext(), mActionMode.mMenu, clicked).show(); + } + } + }); + } + + private class ExtractActionMode extends ActionMode implements MenuBuilder.Callback { + private ActionMode.Callback mCallback; + MenuBuilder mMenu; + + public ExtractActionMode(Callback cb) { + mMenu = new MenuBuilder(getContext()); + mMenu.setCallback(this); + mCallback = cb; + } + + @Override + public void setTitle(CharSequence title) { + // Title will not be shown. + } + + @Override + public void setTitle(int resId) { + // Title will not be shown. + } + + @Override + public void setSubtitle(CharSequence subtitle) { + // Subtitle will not be shown. + } + + @Override + public void setSubtitle(int resId) { + // Subtitle will not be shown. + } + + @Override + public boolean isTitleOptional() { + // Not only is it optional, it will *never* be shown. + return true; + } + + @Override + public void setCustomView(View view) { + // Custom view is not supported here. + } + + @Override + public void invalidate() { + mMenu.stopDispatchingItemsChanged(); + try { + mCallback.onPrepareActionMode(this, mMenu); + } finally { + mMenu.startDispatchingItemsChanged(); + } + } + + public boolean dispatchOnCreate() { + mMenu.stopDispatchingItemsChanged(); + try { + return mCallback.onCreateActionMode(this, mMenu); + } finally { + mMenu.startDispatchingItemsChanged(); + } + } + + @Override + public void finish() { + if (mActionMode != this) { + // Not the active action mode - no-op + return; + } + + mCallback.onDestroyActionMode(this); + mCallback = null; + + mMenu.close(); + + mExtractActionButton.setVisibility(VISIBLE); + mEditButton.setVisibility(INVISIBLE); + + sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + + mActionMode = null; + } + + @Override + public Menu getMenu() { + return mMenu; + } + + @Override + public CharSequence getTitle() { + return null; + } + + @Override + public CharSequence getSubtitle() { + return null; + } + + @Override + public View getCustomView() { + return null; + } + + @Override + public MenuInflater getMenuInflater() { + return new MenuInflater(getContext()); + } + + @Override + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + if (mCallback != null) { + return mCallback.onActionItemClicked(this, item); + } + return false; + } + + @Override + public void onMenuModeChange(MenuBuilder menu) { + } + } } |
