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