Loading core/java/android/inputmethodservice/ExtractButton.java +1 −1 Original line number Diff line number Diff line Loading @@ -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; } } core/java/android/inputmethodservice/ExtractEditLayout.java 0 → 100644 +183 −0 Original line number Diff line number Diff line /* * 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) { } } } core/java/com/android/internal/app/ActionBarImpl.java +16 −4 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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(); } } Loading core/res/res/layout/input_method_extract_view.xml +11 −4 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ */ --> <LinearLayout <android.inputmethodservice.ExtractEditLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal"> Loading @@ -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" > Loading @@ -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> core/res/res/values/strings.xml +3 −0 Original line number Diff line number Diff line Loading @@ -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> Loading
core/java/android/inputmethodservice/ExtractButton.java +1 −1 Original line number Diff line number Diff line Loading @@ -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; } }
core/java/android/inputmethodservice/ExtractEditLayout.java 0 → 100644 +183 −0 Original line number Diff line number Diff line /* * 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) { } } }
core/java/com/android/internal/app/ActionBarImpl.java +16 −4 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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(); } } Loading
core/res/res/layout/input_method_extract_view.xml +11 −4 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ */ --> <LinearLayout <android.inputmethodservice.ExtractEditLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal"> Loading @@ -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" > Loading @@ -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>
core/res/res/values/strings.xml +3 −0 Original line number Diff line number Diff line Loading @@ -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>