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