115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/* 215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2010 The Android Open Source Project 315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License. 615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at 715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * http://www.apache.org/licenses/LICENSE-2.0 915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software 1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and 1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License. 1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */ 1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root 17192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunnepackage android.widget.expandablelistview; 18192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne 19192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunneimport android.view.ContextMenu; 20192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunneimport android.view.View; 21192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunneimport android.view.ContextMenu.ContextMenuInfo; 22192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunneimport android.view.View.OnCreateContextMenuListener; 23192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunneimport android.widget.ExpandableListView; 24e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunneimport android.widget.AdapterView.AdapterContextMenuInfo; 25192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne 26192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunnepublic class PositionTesterContextMenuListener implements OnCreateContextMenuListener { 27192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne 28192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne private int groupPosition, childPosition; 29192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne 30e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne // Fake constant to store in testType a test type specific to headers and footers 31e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne private static final int ADAPTER_TYPE = -1; 32192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne private int testType; // as returned by getPackedPositionType 33192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne 3413c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne // Will be set to null by each call to onCreateContextMenu, unless an error occurred. 3513c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne private String errorMessage; 3613c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne 37192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne public void expectGroupContextMenu(int groupPosition) { 38192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne this.groupPosition = groupPosition; 39192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne testType = ExpandableListView.PACKED_POSITION_TYPE_GROUP; 40192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne } 41192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne 42192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne public void expectChildContextMenu(int groupPosition, int childPosition) { 43192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne this.groupPosition = groupPosition; 44192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne this.childPosition = childPosition; 45192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne testType = ExpandableListView.PACKED_POSITION_TYPE_CHILD; 46192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne } 47192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne 48e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne public void expectAdapterContextMenu(int flatPosition) { 49e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne this.groupPosition = flatPosition; 50e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne testType = ADAPTER_TYPE; 51e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne } 52192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne 53e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 5413c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne errorMessage = null; 55e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne if (testType == ADAPTER_TYPE) { 5613c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne if (!isTrue("MenuInfo is not an AdapterContextMenuInfo", 5713c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne menuInfo instanceof AdapterContextMenuInfo)) { 5813c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne return; 5913c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne } 60e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne AdapterContextMenuInfo adapterContextMenuInfo = (AdapterContextMenuInfo) menuInfo; 6113c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne if (!areEqual("Wrong flat position", groupPosition, adapterContextMenuInfo.position)) { 6213c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne return; 6313c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne } 64e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne } else { 6513c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne if (!isTrue("MenuInfo is not an ExpandableListContextMenuInfo", 6613c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne menuInfo instanceof ExpandableListView.ExpandableListContextMenuInfo)) { 6713c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne return; 6813c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne } 69e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne ExpandableListView.ExpandableListContextMenuInfo elvMenuInfo = 70e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne (ExpandableListView.ExpandableListContextMenuInfo) menuInfo; 71e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne long packedPosition = elvMenuInfo.packedPosition; 72e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne 73e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne int packedPositionType = ExpandableListView.getPackedPositionType(packedPosition); 7413c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne if (!areEqual("Wrong packed position type", testType, packedPositionType)) { 7513c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne return; 7613c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne } 77e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne 78e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne int packedPositionGroup = ExpandableListView.getPackedPositionGroup(packedPosition); 7913c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne if (!areEqual("Wrong group position", groupPosition, packedPositionGroup)) { 8013c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne return; 8113c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne } 82e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne 83e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne if (testType == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { 8413c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne int packedPositionChild = ExpandableListView.getPackedPositionChild(packedPosition); 8513c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne if (!areEqual("Wrong child position", childPosition, packedPositionChild)) { 8613c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne return; 8713c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne } 88e26bad0aecc6526d8a4d9e3b80cbdc9505f1c33dGilles Debunne } 89192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne } 90192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne } 9113c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne 9213c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne private boolean areEqual(String message, int expected, int actual) { 9313c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne if (expected != actual) { 9413c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne errorMessage = String.format(message + " (%d vs %d", expected, actual); 9513c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne return false; 9613c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne } 9713c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne return true; 9813c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne } 9913c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne 10013c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne private boolean isTrue(String message, boolean value) { 10113c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne if (!value) { 10213c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne errorMessage = message; 10313c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne return false; 10413c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne } 10513c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne return true; 10613c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne } 10713c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne 10813c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne public String getErrorMessage() { 10913c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne return errorMessage; 11013c9a1f4901d921f84501893bf5f0b637297132fGilles Debunne } 111192ab903887bbb8e7c7b6da5c581573850e30f46Gilles Debunne} 112