10436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa/*
20436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa * Copyright (C) 2016 The Android Open Source Project
30436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa *
40436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa * Licensed under the Apache License, Version 2.0 (the "License");
50436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa * you may not use this file except in compliance with the License.
60436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa * You may obtain a copy of the License at
70436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa *
80436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa *      http://www.apache.org/licenses/LICENSE-2.0
90436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa *
100436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa * Unless required by applicable law or agreed to in writing, software
110436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa * distributed under the License is distributed on an "AS IS" BASIS,
120436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa * See the License for the specific language governing permissions and
140436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa * limitations under the License.
150436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa */
160436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
170436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwapackage com.android.documentsui.dirlist;
180436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
190436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwaimport android.content.Context;
200436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwaimport android.database.Cursor;
210436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwaimport android.graphics.Rect;
220436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwaimport android.os.SystemClock;
230436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwaimport android.test.AndroidTestCase;
240436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwaimport android.test.suitebuilder.annotation.SmallTest;
256792489dc490eb029469f73490a560c76e84dc98Ben Kwaimport android.view.KeyEvent;
260436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwaimport android.view.LayoutInflater;
270436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwaimport android.view.MotionEvent;
280436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwaimport android.view.MotionEvent.PointerCoords;
290436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwaimport android.view.MotionEvent.PointerProperties;
300436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
310436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwaimport com.android.documentsui.R;
320436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwaimport com.android.documentsui.State;
330436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
340436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa@SmallTest
350436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwapublic class DocumentHolderTest extends AndroidTestCase {
360436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
370436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    DocumentHolder mHolder;
380436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    TestListener mListener;
390436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
400436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    public void setUp() throws Exception {
410436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        Context context = getContext();
420436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        LayoutInflater inflater = LayoutInflater.from(context);
430436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        mHolder = new DocumentHolder(getContext(), inflater.inflate(R.layout.item_doc_list, null)) {
440436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa            @Override
450436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa            public void bind(Cursor cursor, String modelId, State state) {}
460436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        };
470436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
480436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        mListener = new TestListener();
490436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        mHolder.addEventListener(mListener);
500436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
510436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        mHolder.itemView.requestLayout();
520436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        mHolder.itemView.invalidate();
530436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    }
540436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
550436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    public void testClickActivates() {
560436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        click();
570436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        mListener.assertSelected();
580436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    }
590436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
600436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    public void testTapActivates() {
610436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        tap();
620436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        mListener.assertActivated();
630436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    }
640436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
650436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    public void click() {
660436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        mHolder.onSingleTapUp(createEvent(MotionEvent.TOOL_TYPE_MOUSE));
670436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    }
680436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
690436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    public void tap() {
700436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        mHolder.onSingleTapUp(createEvent(MotionEvent.TOOL_TYPE_FINGER));
710436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    }
720436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
730436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    public MotionEvent createEvent(int tooltype) {
740436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        long time = SystemClock.uptimeMillis();
750436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
760436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        PointerProperties properties[] = new PointerProperties[] {
770436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                new PointerProperties()
780436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        };
790436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        properties[0].toolType = tooltype;
800436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
810436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        PointerCoords coords[] = new PointerCoords[] {
820436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                new PointerCoords()
830436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        };
840436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
850436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        Rect rect = new Rect();
860436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        mHolder.itemView.getHitRect(rect);
870436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        coords[0].x = rect.left;
880436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        coords[0].y = rect.top;
890436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
900436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        return MotionEvent.obtain(
910436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                time, // down time
920436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                time, // event time
930436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                MotionEvent.ACTION_UP, // action
940436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                1, // pointer count
950436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                properties, // pointer properties
960436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                coords, // pointer coords
970436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                0, // metastate
980436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                0, // button state
990436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                0, // xprecision
1000436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                0, // yprecision
1010436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                0, // deviceid
1020436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                0, // edgeflags
1030436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                0, // source
1040436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                0 // flags
1050436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa                );
1060436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    }
1070436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
1080436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    private class TestListener implements DocumentHolder.EventListener {
1090436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        private boolean mActivated = false;
1100436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        private boolean mSelected = false;
1110436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
1120436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        public void assertActivated() {
1130436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa            assertTrue(mActivated);
1140436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa            assertFalse(mSelected);
1150436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        }
1160436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
1170436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        public void assertSelected() {
1180436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa            assertTrue(mSelected);
1190436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa            assertFalse(mActivated);
1200436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        }
1210436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
1220436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        @Override
1230436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        public boolean onActivate(DocumentHolder doc) {
1240436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa            mActivated = true;
1250436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa            return true;
1260436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        }
1270436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
1280436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        @Override
1290436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        public boolean onSelect(DocumentHolder doc) {
1300436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa            mSelected = true;
1310436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa            return true;
1320436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa        }
1330436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa
1346792489dc490eb029469f73490a560c76e84dc98Ben Kwa        @Override
1356792489dc490eb029469f73490a560c76e84dc98Ben Kwa        public boolean onKey(DocumentHolder doc, int keyCode, KeyEvent event) {
1366792489dc490eb029469f73490a560c76e84dc98Ben Kwa            return false;
1376792489dc490eb029469f73490a560c76e84dc98Ben Kwa        }
1386792489dc490eb029469f73490a560c76e84dc98Ben Kwa
1390436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa    }
1400436a757211bd5b485ba5e484ee37082c59e1c47Ben Kwa}
141