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.view.ContextMenu;
21e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikovimport android.view.Gravity;
221c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheevimport android.view.Menu;
2399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.view.MenuInflater;
2499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.view.MenuItem;
2599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.view.View;
2699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.view.ViewGroup;
2799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.widget.Button;
2899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport android.widget.TextView;
29e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov
30def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.appcompat.app.AppCompatActivity;
31def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.appcompat.widget.PopupMenu;
32def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.appcompat.widget.SwitchCompat;
33def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.core.view.MenuCompat;
34def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.core.view.MenuItemCompat;
35def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas
3699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport com.example.android.supportv7.R;
3799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
3899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport java.text.SimpleDateFormat;
3999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovimport java.util.Date;
4099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
4199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikovpublic class PopupMenuActivity extends AppCompatActivity {
4299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    private TextView mLog;
4399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
4499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    private SimpleDateFormat mDateFormat;
4599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
4699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    @Override
4799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    protected void onCreate(Bundle savedInstanceState) {
4899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov        super.onCreate(savedInstanceState);
4999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
5099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov        setContentView(R.layout.popup_menu_activity);
5199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
5299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov        mDateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
5399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
54fa2e2acf79d791a90410025daad438968550d18cAlan Viverette        final ViewGroup container = findViewById(R.id.container);
55e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov        mLog = (TextView) container.findViewById(R.id.log);
5699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
57e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov        final SwitchCompat elevationToggle = (SwitchCompat) container.findViewById(
58e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                R.id.elevation_toggle);
59e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov        final Button button = (Button) container.findViewById(R.id.test_button);
60e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov        button.setOnClickListener(new View.OnClickListener() {
6199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov            @Override
6299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov            public void onClick(View v) {
63e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                // Do we need to use a custom style that removes elevation?
64e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                boolean useDefaultElevation = elevationToggle.isChecked();
65e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov
66e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                PopupMenu popupMenu = null;
67e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                if (useDefaultElevation) {
68e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                    popupMenu = new PopupMenu(container.getContext(), button);
69e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                } else {
70e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                    popupMenu = new PopupMenu(container.getContext(), button, Gravity.NO_GRAVITY,
71e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                            0, R.style.CustomPopupNoElevation);
72e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                }
73d62480d95d027a2fb473fd68039ab73c6fbf8c7eKirill Grouchnikov
74e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                final MenuInflater menuInflater = popupMenu.getMenuInflater();
751c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev                populateMenu(menuInflater, popupMenu.getMenu());
76d62480d95d027a2fb473fd68039ab73c6fbf8c7eKirill Grouchnikov                final MenuItem editItem = popupMenu.getMenu().findItem(R.id.action_edit);
777ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheev                MenuItemCompat.setContentDescription(editItem,
787ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheev                        getString(R.string.popup_menu_edit_description));
797ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheev                MenuItemCompat.setTooltipText(editItem,
807ed1d9e48e54df2c98b6405e0996a3e97490b2bdVladislav Kaznacheev                        getString(R.string.popup_menu_edit_tooltip));
8199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
8299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                // Register a listener to be notified when a menu item in our popup menu has
8399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                // been clicked.
84e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
8599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                    @Override
8699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                    public boolean onMenuItemClick(MenuItem item) {
8799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                        addToLog("Item '"+ item.getTitle() + "' clicked");
8899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                        return true;
8999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                    }
9099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                });
9199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
9299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                // Register a listener to be notified when our popup menu is dismissed.
93e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() {
9499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                    @Override
9599046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                    public void onDismiss(PopupMenu menu) {
9699046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                        addToLog("Popup menu dismissed");
9799046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                    }
9899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                });
9999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
10099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov                // Show the popup menu
101e0c620730fe46d16a22133e0121f2fe9936f1685Kirill Grouchnikov                popupMenu.show();
10299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov            }
10399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov        });
1041c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev        // Long tap will show a context menu which is always a platform (not support) menu.
1051c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev        registerForContextMenu(button);
1061c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev    }
1071c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev
1081c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev    @Override
1091c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev    public void onCreateContextMenu(ContextMenu menu, View v,
1101c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev            ContextMenu.ContextMenuInfo menuInfo) {
1111c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev        populateMenu(getMenuInflater(), menu);
1121c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev    }
1131c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev
1141c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev    private void populateMenu(MenuInflater menuInflater, Menu menu) {
1151c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev        SwitchCompat dividersToggle = findViewById(R.id.dividers_toggle);
1161c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev        menuInflater.inflate(R.menu.popup_menu, menu);
1171c61830acebd4233b170dc0f30f1d652fe9cb3afVladislav Kaznacheev        MenuCompat.setGroupDividerEnabled(menu, dividersToggle.isChecked());
11899046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    }
11999046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov
12099046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    private void addToLog(String toLog) {
12199046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov        String toPrepend = mDateFormat.format(new Date()) + " " + toLog + "\n";
12299046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov        mLog.setText(toPrepend + mLog.getText());
12399046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov    }
12499046ceeb27c74a3f650513715dd04049afb306dKirill Grouchnikov}
125