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.test.AndroidTestCase;
     20 import android.test.suitebuilder.annotation.SmallTest;
     21 import android.view.KeyEvent;
     22 import android.view.View;
     23 
     24 import com.android.launcher3.util.FocusLogic;
     25 
     26 /**
     27  * Tests the {@link FocusLogic} class that handles key event based focus handling.
     28  */
     29 @SmallTest
     30 public final class FocusLogicTest extends AndroidTestCase {
     31 
     32     @Override
     33     protected void setUp() throws Exception {
     34         super.setUp();
     35         // Nothing to set up as this class only tests static methods.
     36     }
     37 
     38     @Override
     39     protected void tearDown() throws Exception {
     40         // Nothing to tear down as this class only tests static methods.
     41     }
     42 
     43     public void testShouldConsume() {
     44          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DPAD_LEFT));
     45          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DPAD_RIGHT));
     46          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DPAD_UP));
     47          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DPAD_DOWN));
     48          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_MOVE_HOME));
     49          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_MOVE_END));
     50          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_PAGE_UP));
     51          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_PAGE_DOWN));
     52          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DEL));
     53          assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_FORWARD_DEL));
     54     }
     55 
     56     public void testCreateSparseMatrix() {
     57          // Either, 1) create a helper method to generate/instantiate all possible cell layout that
     58          // may get created in real world to test this method. OR 2) Move all the matrix
     59          // management routine to celllayout and write tests for them.
     60     }
     61 
     62     public void testMoveFromBottomRightToBottomLeft() {
     63         int[][] map = transpose(new int[][] {
     64                 {-1, 0, -1, -1, -1, -1},
     65                 {-1, -1, -1, -1, -1, -1},
     66                 {-1, -1, -1, -1, -1, -1},
     67                 {-1, -1, -1, -1, -1, -1},
     68                 {100, 1, -1, -1, -1, -1},
     69         });
     70         int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 100, 1, 2, false);
     71         assertEquals(1, i);
     72     }
     73 
     74     public void testMoveFromBottomRightToTopLeft() {
     75         int[][] map = transpose(new int[][] {
     76                 {-1, 0, -1, -1, -1, -1},
     77                 {-1, -1, -1, -1, -1, -1},
     78                 {-1, -1, -1, -1, -1, -1},
     79                 {-1, -1, -1, -1, -1, -1},
     80                 {100, -1, -1, -1, -1, -1},
     81         });
     82         int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 100, 1, 2, false);
     83         assertEquals(FocusLogic.NEXT_PAGE_FIRST_ITEM, i);
     84     }
     85 
     86     public void testMoveIntoHotseatWithEqualHotseatAndWorkspaceColumns() {
     87         // Test going from an icon right above the All Apps button to the All Apps button.
     88         int[][] map = transpose(new int[][] {
     89                 {-1, -1, -1, -1, -1},
     90                 {-1, -1, -1, -1, -1},
     91                 {-1, -1, -1, -1, -1},
     92                 {-1, -1,  0, -1, -1},
     93                 { 2,  3,  1,  4,  5},
     94         });
     95         int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
     96         assertEquals(1, i);
     97         // Test going from an icon above and to the right of the All Apps
     98         // button to an icon to the right of the All Apps button.
     99         map = transpose(new int[][] {
    100                 {-1, -1, -1, -1, -1},
    101                 {-1, -1, -1, -1, -1},
    102                 {-1, -1, -1, -1, -1},
    103                 {-1, -1, -1,  0, -1},
    104                 { 2,  3,  1,  4,  5},
    105         });
    106         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
    107         assertEquals(4, i);
    108     }
    109 
    110     public void testMoveIntoHotseatWithExtraColumnForAllApps() {
    111         // Test going from an icon above and to the left
    112         // of the All Apps button to the All Apps button.
    113         int[][] map = transpose(new int[][] {
    114                 {-1, -1, -1,-11, -1, -1, -1},
    115                 {-1, -1, -1,-11, -1, -1, -1},
    116                 {-1, -1, -1,-11, -1, -1, -1},
    117                 {-1, -1, -1,-11, -1, -1, -1},
    118                 {-1, -1,  0,-11, -1, -1, -1},
    119                 {-1, -1, -1,  1,  1, -1, -1},
    120         });
    121         int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
    122         assertEquals(1, i);
    123         // Test going from an icon above and to the right
    124         // of the All Apps button to the All Apps button.
    125         map = transpose(new int[][] {
    126                 {-1, -1, -1,-11, -1, -1, -1},
    127                 {-1, -1, -1,-11, -1, -1, -1},
    128                 {-1, -1, -1,-11, -1, -1, -1},
    129                 {-1, -1, -1,-11, -1, -1, -1},
    130                 {-1, -1, -1,-11,  0, -1, -1},
    131                 {-1, -1, -1,  1, -1, -1, -1},
    132         });
    133         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
    134         assertEquals(1, i);
    135         // Test going from the All Apps button to an icon
    136         // above and to the right of the All Apps button.
    137         map = transpose(new int[][] {
    138                 {-1, -1, -1,-11, -1, -1, -1},
    139                 {-1, -1, -1,-11, -1, -1, -1},
    140                 {-1, -1, -1,-11, -1, -1, -1},
    141                 {-1, -1, -1,-11, -1, -1, -1},
    142                 {-1, -1, -1,-11,  0, -1, -1},
    143                 {-1, -1, -1,  1, -1, -1, -1},
    144         });
    145         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_UP, map, 1, 1, 1, true);
    146         assertEquals(0, i);
    147         // Test going from an icon above and to the left of the
    148         // All Apps button in landscape to the All Apps button.
    149         map = transpose(new int[][] {
    150                 { -1, -1, -1, -1, -1},
    151                 { -1, -1, -1,  0, -1},
    152                 {-11,-11,-11,-11,  1},
    153                 { -1, -1, -1, -1, -1},
    154                 { -1, -1, -1, -1, -1},
    155         });
    156         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 0, 1, 1, true);
    157         assertEquals(1, i);
    158         // Test going from the All Apps button in landscape to
    159         // an icon above and to the left of the All Apps button.
    160         map = transpose(new int[][] {
    161                 { -1, -1, -1, -1, -1},
    162                 { -1, -1, -1,  0, -1},
    163                 {-11,-11,-11,-11,  1},
    164                 { -1, -1, -1, -1, -1},
    165                 { -1, -1, -1, -1, -1},
    166         });
    167         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT, map, 1, 1, 1, true);
    168         assertEquals(0, i);
    169         // Test that going to the hotseat always goes to the same row as the original icon.
    170         map = transpose(new int[][]{
    171                 { 0,  1,  2,-11,  3,  4,  5},
    172                 {-1, -1, -1,-11, -1, -1, -1},
    173                 {-1, -1, -1,-11, -1, -1, -1},
    174                 {-1, -1, -1,-11, -1, -1, -1},
    175                 {-1, -1, -1,-11, -1, -1, -1},
    176                 { 7,  8,  9,  6, 10, 11, 12},
    177         });
    178         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
    179         assertEquals(7, i);
    180         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 1, 1, 1, true);
    181         assertEquals(8, i);
    182         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 2, 1, 1, true);
    183         assertEquals(9, i);
    184         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 3, 1, 1, true);
    185         assertEquals(10, i);
    186         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 4, 1, 1, true);
    187         assertEquals(11, i);
    188         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 5, 1, 1, true);
    189         assertEquals(12, i);
    190     }
    191 
    192     public void testCrossingAllAppsColumn() {
    193         // Test crossing from left to right in portrait.
    194         int[][] map = transpose(new int[][] {
    195                 {-1, -1,-11, -1, -1},
    196                 {-1,  0,-11, -1, -1},
    197                 {-1, -1,-11,  1, -1},
    198                 {-1, -1,-11, -1, -1},
    199                 {-1, -1,  2, -1, -1},
    200         });
    201         int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
    202         assertEquals(1, i);
    203         // Test crossing from right to left in portrait.
    204         map = transpose(new int[][] {
    205                 {-1, -1,-11, -1, -1},
    206                 {-1, -1,-11,  0, -1},
    207                 {-1,  1,-11, -1, -1},
    208                 {-1, -1,-11, -1, -1},
    209                 {-1, -1,  2, -1, -1},
    210         });
    211         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
    212         assertEquals(1, i);
    213         // Test crossing from left to right in landscape.
    214         map = transpose(new int[][] {
    215                 { -1, -1, -1, -1, -1},
    216                 { -1, -1, -1,  0, -1},
    217                 {-11,-11,-11,-11,  2},
    218                 { -1,  1, -1, -1, -1},
    219                 { -1, -1, -1, -1, -1},
    220         });
    221         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT, map, 0, 1, 1, true);
    222         assertEquals(1, i);
    223         // Test crossing from right to left in landscape.
    224         map = transpose(new int[][] {
    225                 { -1, -1, -1, -1, -1},
    226                 { -1,  0, -1, -1, -1},
    227                 {-11,-11,-11,-11,  2},
    228                 { -1, -1,  1, -1, -1},
    229                 { -1, -1, -1, -1, -1},
    230         });
    231         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 0, 1, 1, true);
    232         assertEquals(1, i);
    233         // Test NOT crossing it, if the All Apps button is the only suitable candidate.
    234         map = transpose(new int[][]{
    235                 {-1, 0, -1, -1, -1},
    236                 {-1, 1, -1, -1, -1},
    237                 {-11, -11, -11, -11, 4},
    238                 {-1, 2, -1, -1, -1},
    239                 {-1, 3, -1, -1, -1},
    240         });
    241         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 1, 1, 1, true);
    242         assertEquals(4, i);
    243         i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 2, 1, 1, true);
    244         assertEquals(4, i);
    245     }
    246 
    247     /** Transposes the matrix so that we can write it in human-readable format in the tests. */
    248     private int[][] transpose(int[][] m) {
    249         int[][] t = new int[m[0].length][m.length];
    250         for (int i = 0; i < m.length; i++) {
    251             for (int j = 0; j < m[0].length; j++) {
    252                 t[j][i] = m[i][j];
    253             }
    254         }
    255         return t;
    256     }
    257 }
    258