diff options
| -rw-r--r-- | core/java/android/inputmethodservice/ExtractButton.java | 2 | ||||
| -rw-r--r-- | core/java/android/inputmethodservice/ExtractEditLayout.java | 183 | ||||
| -rw-r--r-- | core/java/com/android/internal/app/ActionBarImpl.java | 20 | ||||
| -rw-r--r-- | core/res/res/layout/input_method_extract_view.xml | 15 | ||||
| -rwxr-xr-x | core/res/res/values/strings.xml | 3 |
5 files changed, 214 insertions, 9 deletions
diff --git a/core/java/android/inputmethodservice/ExtractButton.java b/core/java/android/inputmethodservice/ExtractButton.java index f91cd4ec4dc1..b6b759501db6 100644 --- a/core/java/android/inputmethodservice/ExtractButton.java +++ b/core/java/android/inputmethodservice/ExtractButton.java @@ -41,6 +41,6 @@ class ExtractButton extends Button { * highlight when selected. */ @Override public boolean hasWindowFocus() { - return this.isEnabled() ? true : false; + return isEnabled() && getVisibility() == VISIBLE ? true : false; } } diff --git a/core/java/android/inputmethodservice/ExtractEditLayout.java b/core/java/android/inputmethodservice/ExtractEditLayout.java new file mode 100644 index 000000000000..eafff49528f5 --- /dev/null +++ b/core/java/android/inputmethodservice/ExtractEditLayout.java @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +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.widget.Button; +import android.widget.LinearLayout; + +/** + * 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); + } + + public ExtractEditLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @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; + return mode; + } + return null; + } + + @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 nor 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 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; + + mExtractActionButton.setVisibility(VISIBLE); + mEditButton.setVisibility(INVISIBLE); + + 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) { + return mCallback.onActionItemClicked(this, item); + } + + @Override + public void onMenuModeChange(MenuBuilder menu) { + } + + } +} diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java index 6cfeb87ed26e..dda3be6f1105 100644 --- a/core/java/com/android/internal/app/ActionBarImpl.java +++ b/core/java/com/android/internal/app/ActionBarImpl.java @@ -362,8 +362,8 @@ public class ActionBarImpl extends ActionBar { } mContextView.killMode(); - ActionMode mode = new ActionModeImpl(callback); - if (callback.onCreateActionMode(mode, mode.getMenu())) { + ActionModeImpl mode = new ActionModeImpl(callback); + if (mode.dispatchOnCreate()) { mWasHiddenBeforeMode = !isShowing(); mode.invalidate(); mContextView.initForMode(mode); @@ -633,8 +633,20 @@ public class ActionBarImpl extends ActionBar { @Override public void invalidate() { - if (mCallback.onPrepareActionMode(this, mMenu)) { - // Refresh content in both context views + mMenu.stopDispatchingItemsChanged(); + try { + mCallback.onPrepareActionMode(this, mMenu); + } finally { + mMenu.startDispatchingItemsChanged(); + } + } + + public boolean dispatchOnCreate() { + mMenu.stopDispatchingItemsChanged(); + try { + return mCallback.onCreateActionMode(this, mMenu); + } finally { + mMenu.startDispatchingItemsChanged(); } } diff --git a/core/res/res/layout/input_method_extract_view.xml b/core/res/res/layout/input_method_extract_view.xml index 7d59d02dc9d6..60bc24c246ab 100644 --- a/core/res/res/layout/input_method_extract_view.xml +++ b/core/res/res/layout/input_method_extract_view.xml @@ -18,7 +18,7 @@ */ --> -<LinearLayout +<android.inputmethodservice.ExtractEditLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal"> @@ -38,8 +38,8 @@ android:id="@+id/inputExtractAccessories" android:layout_width="wrap_content" android:layout_height="match_parent" - android:paddingLeft="10dip" - android:paddingRight="10dip" + android:paddingLeft="8dip" + android:paddingRight="8dip" android:background="@android:drawable/keyboard_accessory_bg_landscape" > @@ -48,7 +48,14 @@ android:layout_height="wrap_content" android:layout_gravity="center" /> + <android.inputmethodservice.ExtractButton android:id="@+id/inputExtractEditButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:text="@string/extract_edit_menu_button" + android:visibility="invisible" + /> </FrameLayout> -</LinearLayout> +</android.inputmethodservice.ExtractEditLayout> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 31924bc60cd9..a277c74c6200 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -2860,4 +2860,7 @@ <!-- Storage description for USB storage. [CHAR LIMIT=NONE] --> <string name="storage_usb">USB storage</string> + + <!-- Button text for the edit menu in input method extract mode. [CHAR LIMIT=16] --> + <string name="extract_edit_menu_button">Edit...</string> </resources> |