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.view;
17
18import android.content.Context;
19import android.support.annotation.RestrictTo;
20import android.support.v4.view.MenuItemCompat;
21import android.support.v7.view.menu.MenuBuilder;
22import android.support.v7.view.menu.MenuPopupHelper;
23import android.support.v7.view.menu.SubMenuBuilder;
24import android.support.v7.widget.ActionBarContextView;
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
33import static android.support.annotation.RestrictTo.Scope.GROUP_ID;
34
35/**
36 * @hide
37 */
38@RestrictTo(GROUP_ID)
39public class StandaloneActionMode extends ActionMode implements MenuBuilder.Callback {
40    private Context mContext;
41    private ActionBarContextView mContextView;
42    private ActionMode.Callback mCallback;
43    private WeakReference<View> mCustomView;
44    private boolean mFinished;
45    private boolean mFocusable;
46
47    private MenuBuilder mMenu;
48
49    public StandaloneActionMode(Context context, ActionBarContextView view,
50            ActionMode.Callback callback, boolean isFocusable) {
51        mContext = context;
52        mContextView = view;
53        mCallback = callback;
54
55        mMenu = new MenuBuilder(view.getContext()).setDefaultShowAsAction(
56                MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
57        mMenu.setCallback(this);
58        mFocusable = isFocusable;
59    }
60
61    @Override
62    public void setTitle(CharSequence title) {
63        mContextView.setTitle(title);
64    }
65
66    @Override
67    public void setSubtitle(CharSequence subtitle) {
68        mContextView.setSubtitle(subtitle);
69    }
70
71    @Override
72    public void setTitle(int resId) {
73        setTitle(mContext.getString(resId));
74    }
75
76    @Override
77    public void setSubtitle(int resId) {
78        setSubtitle(mContext.getString(resId));
79    }
80
81    @Override
82    public void setTitleOptionalHint(boolean titleOptional) {
83        super.setTitleOptionalHint(titleOptional);
84        mContextView.setTitleOptional(titleOptional);
85    }
86
87    @Override
88    public boolean isTitleOptional() {
89        return mContextView.isTitleOptional();
90    }
91
92    @Override
93    public void setCustomView(View view) {
94        mContextView.setCustomView(view);
95        mCustomView = view != null ? new WeakReference<View>(view) : null;
96    }
97
98    @Override
99    public void invalidate() {
100        mCallback.onPrepareActionMode(this, mMenu);
101    }
102
103    @Override
104    public void finish() {
105        if (mFinished) {
106            return;
107        }
108        mFinished = true;
109
110        mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
111        mCallback.onDestroyActionMode(this);
112    }
113
114    @Override
115    public Menu getMenu() {
116        return mMenu;
117    }
118
119    @Override
120    public CharSequence getTitle() {
121        return mContextView.getTitle();
122    }
123
124    @Override
125    public CharSequence getSubtitle() {
126        return mContextView.getSubtitle();
127    }
128
129    @Override
130    public View getCustomView() {
131        return mCustomView != null ? mCustomView.get() : null;
132    }
133
134    @Override
135    public MenuInflater getMenuInflater() {
136        return new SupportMenuInflater(mContextView.getContext());
137    }
138
139    public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
140        return mCallback.onActionItemClicked(this, item);
141    }
142
143    public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
144    }
145
146    public boolean onSubMenuSelected(SubMenuBuilder subMenu) {
147        if (!subMenu.hasVisibleItems()) {
148            return true;
149        }
150
151        new MenuPopupHelper(mContextView.getContext(), subMenu).show();
152        return true;
153    }
154
155    public void onCloseSubMenu(SubMenuBuilder menu) {
156    }
157
158    public void onMenuModeChange(MenuBuilder menu) {
159        invalidate();
160        mContextView.showOverflowMenu();
161    }
162
163    public boolean isUiFocusable() {
164        return mFocusable;
165    }
166}
167