blob: 56968398871f82d20e12a938435491c4dc310417 [file] [log] [blame]
/*
* 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.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.
*
* @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;
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;
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) {
}
}
}