169 lines
6.6 KiB
Java
169 lines
6.6 KiB
Java
/*
|
|
* Copyright (C) 2008 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 android.view;
|
|
|
|
import android.annotation.IntDef;
|
|
import android.media.AudioManager;
|
|
|
|
import com.android.internal.annotations.VisibleForTesting;
|
|
import com.android.internal.annotations.VisibleForTesting.Visibility;
|
|
|
|
import java.lang.annotation.Retention;
|
|
import java.lang.annotation.RetentionPolicy;
|
|
import java.util.Random;
|
|
|
|
/**
|
|
* Constants to be used to play sound effects via {@link View#playSoundEffect(int)}
|
|
*/
|
|
public class SoundEffectConstants {
|
|
|
|
private SoundEffectConstants() {}
|
|
private static final Random NAVIGATION_REPEAT_RANDOMIZER = new Random();
|
|
private static int sLastNavigationRepeatSoundEffectId = -1;
|
|
|
|
public static final int CLICK = 0;
|
|
|
|
/** Effect id for a navigation left */
|
|
public static final int NAVIGATION_LEFT = 1;
|
|
/** Effect id for a navigation up */
|
|
public static final int NAVIGATION_UP = 2;
|
|
/** Effect id for a navigation right */
|
|
public static final int NAVIGATION_RIGHT = 3;
|
|
/** Effect id for a navigation down */
|
|
public static final int NAVIGATION_DOWN = 4;
|
|
/** Effect id for a repeatedly triggered navigation left, e.g. due to long pressing a button */
|
|
public static final int NAVIGATION_REPEAT_LEFT = 5;
|
|
/** Effect id for a repeatedly triggered navigation up, e.g. due to long pressing a button */
|
|
public static final int NAVIGATION_REPEAT_UP = 6;
|
|
/** Effect id for a repeatedly triggered navigation right, e.g. due to long pressing a button */
|
|
public static final int NAVIGATION_REPEAT_RIGHT = 7;
|
|
/** Effect id for a repeatedly triggered navigation down, e.g. due to long pressing a button */
|
|
public static final int NAVIGATION_REPEAT_DOWN = 8;
|
|
|
|
/** @hide */
|
|
@IntDef(value = {
|
|
CLICK,
|
|
NAVIGATION_LEFT,
|
|
NAVIGATION_UP,
|
|
NAVIGATION_RIGHT,
|
|
NAVIGATION_DOWN,
|
|
NAVIGATION_REPEAT_LEFT,
|
|
NAVIGATION_REPEAT_UP,
|
|
NAVIGATION_REPEAT_RIGHT,
|
|
NAVIGATION_REPEAT_DOWN
|
|
})
|
|
@Retention(RetentionPolicy.SOURCE)
|
|
public @interface SoundEffect {}
|
|
|
|
/** @hide */
|
|
@IntDef(prefix = { "NAVIGATION_" }, value = {
|
|
NAVIGATION_LEFT,
|
|
NAVIGATION_UP,
|
|
NAVIGATION_RIGHT,
|
|
NAVIGATION_DOWN,
|
|
NAVIGATION_REPEAT_LEFT,
|
|
NAVIGATION_REPEAT_UP,
|
|
NAVIGATION_REPEAT_RIGHT,
|
|
NAVIGATION_REPEAT_DOWN
|
|
})
|
|
@Retention(RetentionPolicy.SOURCE)
|
|
public @interface NavigationSoundEffect {}
|
|
|
|
/**
|
|
* Get the sonification constant for the focus directions.
|
|
* @param direction The direction of the focus.
|
|
* @return The appropriate sonification constant.
|
|
* @throws {@link IllegalArgumentException} when the passed direction is not one of the
|
|
* documented values.
|
|
*/
|
|
public static int getContantForFocusDirection(@View.FocusDirection int direction) {
|
|
switch (direction) {
|
|
case View.FOCUS_RIGHT:
|
|
return SoundEffectConstants.NAVIGATION_RIGHT;
|
|
case View.FOCUS_FORWARD:
|
|
case View.FOCUS_DOWN:
|
|
return SoundEffectConstants.NAVIGATION_DOWN;
|
|
case View.FOCUS_LEFT:
|
|
return SoundEffectConstants.NAVIGATION_LEFT;
|
|
case View.FOCUS_BACKWARD:
|
|
case View.FOCUS_UP:
|
|
return SoundEffectConstants.NAVIGATION_UP;
|
|
}
|
|
throw new IllegalArgumentException("direction must be one of "
|
|
+ "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT, FOCUS_FORWARD, FOCUS_BACKWARD}.");
|
|
}
|
|
|
|
/**
|
|
* Get the sonification constant for the focus directions
|
|
* @param direction The direction of the focus.
|
|
* @param repeating True if the user long-presses a direction
|
|
* @return The appropriate sonification constant
|
|
* @throws IllegalArgumentException when the passed direction is not one of the
|
|
* documented values.
|
|
*/
|
|
public static @NavigationSoundEffect int getConstantForFocusDirection(
|
|
@View.FocusDirection int direction, boolean repeating) {
|
|
if (repeating) {
|
|
switch (direction) {
|
|
case View.FOCUS_RIGHT:
|
|
return SoundEffectConstants.NAVIGATION_REPEAT_RIGHT;
|
|
case View.FOCUS_FORWARD:
|
|
case View.FOCUS_DOWN:
|
|
return SoundEffectConstants.NAVIGATION_REPEAT_DOWN;
|
|
case View.FOCUS_LEFT:
|
|
return SoundEffectConstants.NAVIGATION_REPEAT_LEFT;
|
|
case View.FOCUS_BACKWARD:
|
|
case View.FOCUS_UP:
|
|
return SoundEffectConstants.NAVIGATION_REPEAT_UP;
|
|
}
|
|
throw new IllegalArgumentException("direction must be one of {FOCUS_UP, FOCUS_DOWN, "
|
|
+ "FOCUS_LEFT, FOCUS_RIGHT, FOCUS_FORWARD, FOCUS_BACKWARD}.");
|
|
} else {
|
|
return getContantForFocusDirection(direction);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param effectId any of the effect ids defined in {@link SoundEffectConstants}
|
|
* @return true if the given effect id is a navigation repeat one
|
|
* @hide
|
|
*/
|
|
@VisibleForTesting(visibility = Visibility.PACKAGE)
|
|
public static boolean isNavigationRepeat(@NavigationSoundEffect int effectId) {
|
|
return effectId == SoundEffectConstants.NAVIGATION_REPEAT_DOWN
|
|
|| effectId == SoundEffectConstants.NAVIGATION_REPEAT_LEFT
|
|
|| effectId == SoundEffectConstants.NAVIGATION_REPEAT_RIGHT
|
|
|| effectId == SoundEffectConstants.NAVIGATION_REPEAT_UP;
|
|
}
|
|
|
|
/**
|
|
* @return The next navigation repeat sound effect id, chosen at random in a non-repeating
|
|
* fashion
|
|
* @hide
|
|
*/
|
|
@VisibleForTesting(visibility = Visibility.PACKAGE)
|
|
public static int nextNavigationRepeatSoundEffectId() {
|
|
int next = NAVIGATION_REPEAT_RANDOMIZER.nextInt(
|
|
AudioManager.NUM_NAVIGATION_REPEAT_SOUND_EFFECTS - 1);
|
|
if (next >= sLastNavigationRepeatSoundEffectId) {
|
|
next++;
|
|
}
|
|
sLastNavigationRepeatSoundEffectId = next;
|
|
return AudioManager.getNthNavigationRepeatSoundEffect(next);
|
|
}
|
|
}
|