blob: 691d9bc016ba9b56056612c4323f6349a1d4d905 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.android.launcher3.util;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.KeyEvent;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Tests the {@link FocusLogic} class that handles key event based focus handling.
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
public final class FocusLogicTest {
@Test
public void testShouldConsume() {
assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DPAD_LEFT));
assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DPAD_RIGHT));
assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DPAD_UP));
assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_DPAD_DOWN));
assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_MOVE_HOME));
assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_MOVE_END));
assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_PAGE_UP));
assertTrue(FocusLogic.shouldConsume(KeyEvent.KEYCODE_PAGE_DOWN));
}
@Test
public void testCreateSparseMatrix() {
// Either, 1) create a helper method to generate/instantiate all possible cell layout that
// may get created in real world to test this method. OR 2) Move all the matrix
// management routine to celllayout and write tests for them.
}
@Test
public void testMoveFromBottomRightToBottomLeft() {
int[][] map = transpose(new int[][] {
{-1, 0, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1},
{100, 1, -1, -1, -1, -1},
});
int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 100, 1, 2, false);
assertEquals(1, i);
}
@Test
public void testMoveFromBottomRightToTopLeft() {
int[][] map = transpose(new int[][] {
{-1, 0, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1},
{100, -1, -1, -1, -1, -1},
});
int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 100, 1, 2, false);
assertEquals(FocusLogic.NEXT_PAGE_FIRST_ITEM, i);
}
@Test
public void testMoveIntoHotseatWithEqualHotseatAndWorkspaceColumns() {
// Test going from an icon right above the All Apps button to the All Apps button.
int[][] map = transpose(new int[][] {
{-1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1},
{-1, -1, 0, -1, -1},
{ 2, 3, 1, 4, 5},
});
int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
assertEquals(1, i);
// Test going from an icon above and to the right of the All Apps
// button to an icon to the right of the All Apps button.
map = transpose(new int[][] {
{-1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1},
{-1, -1, -1, 0, -1},
{ 2, 3, 1, 4, 5},
});
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
assertEquals(4, i);
}
@Test
public void testMoveIntoHotseatWithExtraColumnForAllApps() {
// Test going from an icon above and to the left
// of the All Apps button to the All Apps button.
int[][] map = transpose(new int[][] {
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, 0,-11, -1, -1, -1},
{-1, -1, -1, 1, 1, -1, -1},
});
int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
assertEquals(1, i);
// Test going from an icon above and to the right
// of the All Apps button to the All Apps button.
map = transpose(new int[][] {
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, 0, -1, -1},
{-1, -1, -1, 1, -1, -1, -1},
});
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
assertEquals(1, i);
// Test going from the All Apps button to an icon
// above and to the right of the All Apps button.
map = transpose(new int[][] {
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, 0, -1, -1},
{-1, -1, -1, 1, -1, -1, -1},
});
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_UP, map, 1, 1, 1, true);
assertEquals(0, i);
// Test going from an icon above and to the left of the
// All Apps button in landscape to the All Apps button.
map = transpose(new int[][] {
{ -1, -1, -1, -1, -1},
{ -1, -1, -1, 0, -1},
{-11,-11,-11,-11, 1},
{ -1, -1, -1, -1, -1},
{ -1, -1, -1, -1, -1},
});
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 0, 1, 1, true);
assertEquals(1, i);
// Test going from the All Apps button in landscape to
// an icon above and to the left of the All Apps button.
map = transpose(new int[][] {
{ -1, -1, -1, -1, -1},
{ -1, -1, -1, 0, -1},
{-11,-11,-11,-11, 1},
{ -1, -1, -1, -1, -1},
{ -1, -1, -1, -1, -1},
});
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT, map, 1, 1, 1, true);
assertEquals(0, i);
// Test that going to the hotseat always goes to the same row as the original icon.
map = transpose(new int[][]{
{ 0, 1, 2,-11, 3, 4, 5},
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, -1, -1, -1},
{-1, -1, -1,-11, -1, -1, -1},
{ 7, 8, 9, 6, 10, 11, 12},
});
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
assertEquals(7, i);
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 1, 1, 1, true);
assertEquals(8, i);
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 2, 1, 1, true);
assertEquals(9, i);
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 3, 1, 1, true);
assertEquals(10, i);
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 4, 1, 1, true);
assertEquals(11, i);
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 5, 1, 1, true);
assertEquals(12, i);
}
@Test
public void testCrossingAllAppsColumn() {
// Test crossing from left to right in portrait.
int[][] map = transpose(new int[][] {
{-1, -1,-11, -1, -1},
{-1, 0,-11, -1, -1},
{-1, -1,-11, 1, -1},
{-1, -1,-11, -1, -1},
{-1, -1, 2, -1, -1},
});
int i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
assertEquals(1, i);
// Test crossing from right to left in portrait.
map = transpose(new int[][] {
{-1, -1,-11, -1, -1},
{-1, -1,-11, 0, -1},
{-1, 1,-11, -1, -1},
{-1, -1,-11, -1, -1},
{-1, -1, 2, -1, -1},
});
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_DOWN, map, 0, 1, 1, true);
assertEquals(1, i);
// Test crossing from left to right in landscape.
map = transpose(new int[][] {
{ -1, -1, -1, -1, -1},
{ -1, -1, -1, 0, -1},
{-11,-11,-11,-11, 2},
{ -1, 1, -1, -1, -1},
{ -1, -1, -1, -1, -1},
});
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT, map, 0, 1, 1, true);
assertEquals(1, i);
// Test crossing from right to left in landscape.
map = transpose(new int[][] {
{ -1, -1, -1, -1, -1},
{ -1, 0, -1, -1, -1},
{-11,-11,-11,-11, 2},
{ -1, -1, 1, -1, -1},
{ -1, -1, -1, -1, -1},
});
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 0, 1, 1, true);
assertEquals(1, i);
// Test NOT crossing it, if the All Apps button is the only suitable candidate.
map = transpose(new int[][]{
{-1, 0, -1, -1, -1},
{-1, 1, -1, -1, -1},
{-11, -11, -11, -11, 4},
{-1, 2, -1, -1, -1},
{-1, 3, -1, -1, -1},
});
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 1, 1, 1, true);
assertEquals(4, i);
i = FocusLogic.handleKeyEvent(KeyEvent.KEYCODE_DPAD_RIGHT, map, 2, 1, 1, true);
assertEquals(4, i);
}
/** Transposes the matrix so that we can write it in human-readable format in the tests. */
private int[][] transpose(int[][] m) {
int[][] t = new int[m[0].length][m.length];
for (int i = 0; i < m.length; i++) {
for (int j = 0; j < m[0].length; j++) {
t[j][i] = m[i][j];
}
}
return t;
}
}