PopupMenuActivity.java revision 1c61830acebd4233b170dc0f30f1d652fe9cb3af
199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov/*
299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * Copyright (C) 2016 The Android Open Source Project
399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov *
499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License");
599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * you may not use this file except in compliance with the License.
699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * You may obtain a copy of the License at
799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov *
899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov *      http://www.apache.org/licenses/LICENSE-2.0
999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov *
1099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * Unless required by applicable law or agreed to in writing, software
1199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS,
1299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * See the License for the specific language governing permissions and
1499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov * limitations under the License.
1599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov */
1699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
1799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovpackage com.example.android.supportv7.widget;
1899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
1999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.os.Bundle;
201c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheevimport android.support.v4.view.MenuCompat;
217ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheevimport android.support.v4.view.MenuItemCompat;
2299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.support.v7.app.AppCompatActivity;
2399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.support.v7.widget.PopupMenu;
24e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikovimport android.support.v7.widget.SwitchCompat;
251c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheevimport android.view.ContextMenu;
26e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikovimport android.view.Gravity;
271c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheevimport android.view.Menu;
2899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.view.MenuInflater;
2999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.view.MenuItem;
3099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.view.View;
3199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.view.ViewGroup;
3299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.widget.Button;
3399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.widget.TextView;
34e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov
3599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport com.example.android.supportv7.R;
3699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
3799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport java.text.SimpleDateFormat;
3899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport java.util.Date;
3999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
4099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovpublic class PopupMenuActivity extends AppCompatActivity {
4199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    private TextView mLog;
4299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
4399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    private SimpleDateFormat mDateFormat;
4499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
4599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    @Override
4699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    protected void onCreate(Bundle savedInstanceState) {
4799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov        super.onCreate(savedInstanceState);
4899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
4999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov        setContentView(R.layout.popup_menu_activity);
5099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
5199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov        mDateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
5299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
53fa2e2acf79d791a90410025daad438968550d18cAlan Viverette        final ViewGroup container = findViewById(R.id.container);
54e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov        mLog = (TextView) container.findViewById(R.id.log);
5599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
56e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov        final SwitchCompat elevationToggle = (SwitchCompat) container.findViewById(
57e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                R.id.elevation_toggle);
58e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov        final Button button = (Button) container.findViewById(R.id.test_button);
59e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov        button.setOnClickListener(new View.OnClickListener() {
6099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov            @Override
6199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov            public void onClick(View v) {
62e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                // Do we need to use a custom style that removes elevation?
63e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                boolean useDefaultElevation = elevationToggle.isChecked();
64e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov
65e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                PopupMenu popupMenu = null;
66e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                if (useDefaultElevation) {
67e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                    popupMenu = new PopupMenu(container.getContext(), button);
68e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                } else {
69e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                    popupMenu = new PopupMenu(container.getContext(), button, Gravity.NO_GRAVITY,
70e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                            0, R.style.CustomPopupNoElevation);
71e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                }
72d62480d95d027a2fb473fd68039ab73c6fbf8c7eKirill Grouchnikov
73e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                final MenuInflater menuInflater = popupMenu.getMenuInflater();
741c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev                populateMenu(menuInflater, popupMenu.getMenu());
75d62480d95d027a2fb473fd68039ab73c6fbf8c7eKirill Grouchnikov                final MenuItem editItem = popupMenu.getMenu().findItem(R.id.action_edit);
767ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheev                MenuItemCompat.setContentDescription(editItem,
777ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheev                        getString(R.string.popup_menu_edit_description));
787ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheev                MenuItemCompat.setTooltipText(editItem,
797ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheev                        getString(R.string.popup_menu_edit_tooltip));
8099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
8199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                // Register a listener to be notified when a menu item in our popup menu has
8299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                // been clicked.
83e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
8499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                    @Override
8599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                    public boolean onMenuItemClick(MenuItem item) {
8699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                        addToLog("Item '"+ item.getTitle() + "' clicked");
8799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                        return true;
8899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                    }
8999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                });
9099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
9199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                // Register a listener to be notified when our popup menu is dismissed.
92e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() {
9399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                    @Override
9499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                    public void onDismiss(PopupMenu menu) {
9599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                        addToLog("Popup menu dismissed");
9699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                    }
9799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                });
9899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
9999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                // Show the popup menu
100e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                popupMenu.show();
10199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov            }
10299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov        });
1031c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev        // Long tap will show a context menu which is always a platform (not support) menu.
1041c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev        registerForContextMenu(button);
1051c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev    }
1061c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev
1071c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev    @Override
1081c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev    public void onCreateContextMenu(ContextMenu menu, View v,
1091c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev            ContextMenu.ContextMenuInfo menuInfo) {
1101c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev        populateMenu(getMenuInflater(), menu);
1111c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev    }
1121c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev
1131c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev    private void populateMenu(MenuInflater menuInflater, Menu menu) {
1141c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev        SwitchCompat dividersToggle = findViewById(R.id.dividers_toggle);
1151c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev        menuInflater.inflate(R.menu.popup_menu, menu);
1161c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev        MenuCompat.setGroupDividerEnabled(menu, dividersToggle.isChecked());
11799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    }
11899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
11999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    private void addToLog(String toLog) {
12099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov        String toPrepend = mDateFormat.format(new Date()) + " " + toLog + "\n";
12199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov        mLog.setText(toPrepend + mLog.getText());
12299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    }
12399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov}
124