Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
      5  * use this file except in compliance with the License. You may obtain a copy of
      6  * the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     13  * License for the specific language governing permissions and limitations under
     14  * the License.
     15  */
     16 
     17 package com.android.launcher3.util;
     18 
     19 import android.support.test.filters.SmallTest;
     20 import android.support.test.runner.AndroidJUnit4;
     21 import android.view.KeyEvent;
     22 
     23 import org.junit.Test;
     24 import org.junit.runner.RunWith;
     25 
     26 import static org.junit.Assert.assertEquals;
     27 import static org.junit.Assert.assertTrue;
     28 
     29 /**
     30  * Tests the {@link FocusLogic} class that handles key event based focus handling.
     31  */
     32 @SmallTest
     33 @RunWith(AndroidJUnit4.class)
     34 public final class FocusLogicTest {
     35 
     36     @Test
     37     public void testShouldConsume() {
     38          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DPAD_LEFT));
     39          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DPAD_RIGHT));
     40          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DPAD_UP));
     41          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DPAD_DOWN));
     42          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_MOVE_HOME));
     43          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_MOVE_END));
     44          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_PAGE_UP));
     45          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_PAGE_DOWN));
     46     }
     47 
     48     @Test
     49     public void testCreateSparseMatrix() {
     50          // Either, 1) create a helper method to generate/instantiate all possible cell layout that
     51          // may get created in real world to test this method. OR 2) Move all the matrix
     52          // management routine to celllayout and write tests for them.
     53     }
     54 
     55     @Test
     56     public void testMoveFromBottomRightToBottomLeft() {
     57         int[][] map = transpose(new int[][] {
     58                 {-1, 0, -1, -1, -1, -1},
     59                 {-1, -1, -1, -1, -1, -1},
     60                 {-1, -1, -1, -1, -1, -1},
     61                 {-1, -1, -1, -1, -1, -1},
     62                 {100, 1, -1, -1, -1, -1},
     63         });
     64         int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 100, 1, 2, false);
     65         assertEquals(1, i);
     66     }
     67 
     68     @Test
     69     public void testMoveFromBottomRightToTopLeft() {
     70         int[][] map = transpose(new int[][] {
     71                 {-1, 0, -1, -1, -1, -1},
     72                 {-1, -1, -1, -1, -1, -1},
     73                 {-1, -1, -1, -1, -1, -1},
     74                 {-1, -1, -1, -1, -1, -1},
     75                 {100, -1, -1, -1, -1, -1},
     76         });
     77         int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 100, 1, 2, false);
     78         assertEquals(FocusLogic.NEXT_PAGE_FIRST_ITEM, i);
     79     }
     80 
     81     @Test
     82     public void testMoveIntoHotseatWithEqualHotseatAndWorkspaceColumns() {
     83         // Test going from an icon right above the All Apps button to the All Apps button.
     84         int[][] map = transpose(new int[][] {
     85                 {-1, -1, -1, -1, -1},
     86                 {-1, -1, -1, -1, -1},
     87                 {-1, -1, -1, -1, -1},
     88                 {-1, -1,  0, -1, -1},
     89                 { 2,  3,  1,  4,  5},
     90         });
     91         int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
     92         assertEquals(1, i);
     93         // Test going from an icon above and to the right of the All Apps
     94         // button to an icon to the right of the All Apps button.
     95         map = transpose(new int[][] {
     96                 {-1, -1, -1, -1, -1},
     97                 {-1, -1, -1, -1, -1},
     98                 {-1, -1, -1, -1, -1},
     99                 {-1, -1, -1,  0, -1},
    100                 { 2,  3,  1,  4,  5},
    101         });
    102         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
    103         assertEquals(4, i);
    104     }
    105 
    106     @Test
    107     public void testMoveIntoHotseatWithExtraColumnForAllApps() {
    108         // Test going from an icon above and to the left
    109         // of the All Apps button to the All Apps button.
    110         int[][] map = transpose(new int[][] {
    111                 {-1, -1, -1,-11, -1, -1, -1},
    112                 {-1, -1, -1,-11, -1, -1, -1},
    113                 {-1, -1, -1,-11, -1, -1, -1},
    114                 {-1, -1, -1,-11, -1, -1, -1},
    115                 {-1, -1,  0,-11, -1, -1, -1},
    116                 {-1, -1, -1,  1,  1, -1, -1},
    117         });
    118         int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
    119         assertEquals(1, i);
    120         // Test going from an icon above and to the right
    121         // of the All Apps button to the All Apps button.
    122         map = transpose(new int[][] {
    123                 {-1, -1, -1,-11, -1, -1, -1},
    124                 {-1, -1, -1,-11, -1, -1, -1},
    125                 {-1, -1, -1,-11, -1, -1, -1},
    126                 {-1, -1, -1,-11, -1, -1, -1},
    127                 {-1, -1, -1,-11,  0, -1, -1},
    128                 {-1, -1, -1,  1, -1, -1, -1},
    129         });
    130         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
    131         assertEquals(1, i);
    132         // Test going from the All Apps button to an icon
    133         // above and to the right of the All Apps button.
    134         map = transpose(new int[][] {
    135                 {-1, -1, -1,-11, -1, -1, -1},
    136                 {-1, -1, -1,-11, -1, -1, -1},
    137                 {-1, -1, -1,-11, -1, -1, -1},
    138                 {-1, -1, -1,-11, -1, -1, -1},
    139                 {-1, -1, -1,-11,  0, -1, -1},
    140                 {-1, -1, -1,  1, -1, -1, -1},
    141         });
    142         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_UP, map, 1, 1, 1, true);
    143         assertEquals(0, i);
    144         // Test going from an icon above and to the left of the
    145         // All Apps button in landscape to the All Apps button.
    146         map = transpose(new int[][] {
    147                 { -1, -1, -1, -1, -1},
    148                 { -1, -1, -1,  0, -1},
    149                 {-11,-11,-11,-11,  1},
    150                 { -1, -1, -1, -1, -1},
    151                 { -1, -1, -1, -1, -1},
    152         });
    153         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 0, 1, 1, true);
    154         assertEquals(1, i);
    155         // Test going from the All Apps button in landscape to
    156         // an icon above and to the left of the All Apps button.
    157         map = transpose(new int[][] {
    158                 { -1, -1, -1, -1, -1},
    159                 { -1, -1, -1,  0, -1},
    160                 {-11,-11,-11,-11,  1},
    161                 { -1, -1, -1, -1, -1},
    162                 { -1, -1, -1, -1, -1},
    163         });
    164         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT, map, 1, 1, 1, true);
    165         assertEquals(0, i);
    166         // Test that going to the hotseat always goes to the same row as the original icon.
    167         map = transpose(new int[][]{
    168                 { 0,  1,  2,-11,  3,  4,  5},
    169                 {-1, -1, -1,-11, -1, -1, -1},
    170                 {-1, -1, -1,-11, -1, -1, -1},
    171                 {-1, -1, -1,-11, -1, -1, -1},
    172                 {-1, -1, -1,-11, -1, -1, -1},
    173                 { 7,  8,  9,  6, 10, 11, 12},
    174         });
    175         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
    176         assertEquals(7, i);
    177         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 1, 1, 1, true);
    178         assertEquals(8, i);
    179         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 2, 1, 1, true);
    180         assertEquals(9, i);
    181         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 3, 1, 1, true);
    182         assertEquals(10, i);
    183         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 4, 1, 1, true);
    184         assertEquals(11, i);
    185         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 5, 1, 1, true);
    186         assertEquals(12, i);
    187     }
    188 
    189     @Test
    190     public void testCrossingAllAppsColumn() {
    191         // Test crossing from left to right in portrait.
    192         int[][] map = transpose(new int[][] {
    193                 {-1, -1,-11, -1, -1},
    194                 {-1,  0,-11, -1, -1},
    195                 {-1, -1,-11,  1, -1},
    196                 {-1, -1,-11, -1, -1},
    197                 {-1, -1,  2, -1, -1},
    198         });
    199         int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
    200         assertEquals(1, i);
    201         // Test crossing from right to left in portrait.
    202         map = transpose(new int[][] {
    203                 {-1, -1,-11, -1, -1},
    204                 {-1, -1,-11,  0, -1},
    205                 {-1,  1,-11, -1, -1},
    206                 {-1, -1,-11, -1, -1},
    207                 {-1, -1,  2, -1, -1},
    208         });
    209         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
    210         assertEquals(1, i);
    211         // Test crossing from left to right in landscape.
    212         map = transpose(new int[][] {
    213                 { -1, -1, -1, -1, -1},
    214                 { -1, -1, -1,  0, -1},
    215                 {-11,-11,-11,-11,  2},
    216                 { -1,  1, -1, -1, -1},
    217                 { -1, -1, -1, -1, -1},
    218         });
    219         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT, map, 0, 1, 1, true);
    220         assertEquals(1, i);
    221         // Test crossing from right to left in landscape.
    222         map = transpose(new int[][] {
    223                 { -1, -1, -1, -1, -1},
    224                 { -1,  0, -1, -1, -1},
    225                 {-11,-11,-11,-11,  2},
    226                 { -1, -1,  1, -1, -1},
    227                 { -1, -1, -1, -1, -1},
    228         });
    229         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 0, 1, 1, true);
    230         assertEquals(1, i);
    231         // Test NOT crossing it, if the All Apps button is the only suitable candidate.
    232         map = transpose(new int[][]{
    233                 {-1, 0, -1, -1, -1},
    234                 {-1, 1, -1, -1, -1},
    235                 {-11, -11, -11, -11, 4},
    236                 {-1, 2, -1, -1, -1},
    237                 {-1, 3, -1, -1, -1},
    238         });
    239         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 1, 1, 1, true);
    240         assertEquals(4, i);
    241         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 2, 1, 1, true);
    242         assertEquals(4, i);
    243     }
    244 
    245     /** Transposes the matrix so that we can write it in human-readable format in the tests. */
    246     private int[][] transpose(int[][] m) {
    247         int[][] t = new int[m[0].length][m.length];
    248         for (int i = 0; i < m.length; i++) {
    249             for (int j = 0; j < m[0].length; j++) {
    250                 t[j][i] = m[i][j];
    251             }
    252         }
    253         return t;
    254     }
    255 }
    256