8b0a647a11
Change-Id: Ib1065e26fff3c193d12531c8bca944693ea6137c
256 lines
10 KiB
Java
256 lines
10 KiB
Java
/*
|
|
* 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;
|
|
}
|
|
}
|