1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package android.support.v7.internal.view;
17
18import android.content.Context;
19import android.support.v4.view.MenuItemCompat;
20import android.support.v7.internal.view.menu.MenuBuilder;
21import android.support.v7.internal.view.menu.MenuPopupHelper;
22import android.support.v7.internal.view.menu.SubMenuBuilder;
23import android.support.v7.internal.widget.ActionBarContextView;
24import android.support.v7.view.ActionMode;
25import android.view.Menu;
26import android.view.MenuInflater;
27import android.view.MenuItem;
28import android.view.View;
29import android.view.accessibility.AccessibilityEvent;
30
31import java.lang.ref.WeakReference;
32
33/**
34 * @hide
35 */
36public class StandaloneActionMode extends ActionMode implements MenuBuilder.Callback {
37    private Context mContext;
38    private ActionBarContextView mContextView;
39    private ActionMode.Callback mCallback;
40    private WeakReference<View> mCustomView;
41    private boolean mFinished;
42    private boolean mFocusable;
43
44    private MenuBuilder mMenu;
45
46    public StandaloneActionMode(Context context, ActionBarContextView view,
47            ActionMode.Callback callback, boolean isFocusable) {
48        mContext = context;
49        mContextView = view;
50        mCallback = callback;
51
52        mMenu = new MenuBuilder(view.getContext()).setDefaultShowAsAction(
53                MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
54        mMenu.setCallback(this);
55        mFocusable = isFocusable;
56    }
57
58    @Override
59    public void setTitle(CharSequence title) {
60        mContextView.setTitle(title);
61    }
62
63    @Override
64    public void setSubtitle(CharSequence subtitle) {
65        mContextView.setSubtitle(subtitle);
66    }
67
68    @Override
69    public void setTitle(int resId) {
70        setTitle(mContext.getString(resId));
71    }
72
73    @Override
74    public void setSubtitle(int resId) {
75        setSubtitle(mContext.getString(resId));
76    }
77
78    @Override
79    public void setTitleOptionalHint(boolean titleOptional) {
80        super.setTitleOptionalHint(titleOptional);
81        mContextView.setTitleOptional(titleOptional);
82    }
83
84    @Override
85    public boolean isTitleOptional() {
86        return mContextView.isTitleOptional();
87    }
88
89    @Override
90    public void setCustomView(View view) {
91        mContextView.setCustomView(view);
92        mCustomView = view != null ? new WeakReference<View>(view) : null;
93    }
94
95    @Override
96    public void invalidate() {
97        mCallback.onPrepareActionMode(this, mMenu);
98    }
99
100    @Override
101    public void finish() {
102        if (mFinished) {
103            return;
104        }
105        mFinished = true;
106
107        mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
108        mCallback.onDestroyActionMode(this);
109    }
110
111    @Override
112    public Menu getMenu() {
113        return mMenu;
114    }
115
116    @Override
117    public CharSequence getTitle() {
118        return mContextView.getTitle();
119    }
120
121    @Override
122    public CharSequence getSubtitle() {
123        return mContextView.getSubtitle();
124    }
125
126    @Override
127    public View getCustomView() {
128        return mCustomView != null ? mCustomView.get() : null;
129    }
130
131    @Override
132    public MenuInflater getMenuInflater() {
133        return new MenuInflater(mContextView.getContext());
134    }
135
136    public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
137        return mCallback.onActionItemClicked(this, item);
138    }
139
140    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
141    }
142
143    public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
144        if (!subMenu.hasVisibleItems()) {
145            return true;
146        }
147
148        new MenuPopupHelper(mContextView.getContext(), subMenu).show();
149        return true;
150    }
151
152    public void onCloseSubMenu(SubMenuBuilder menu) {
153    }
154
155    public void onMenuModeChange(MenuBuilder menu) {
156        invalidate();
157        mContextView.showOverflowMenu();
158    }
159
160    public boolean isUiFocusable() {
161        return mFocusable;
162    }
163}
164