Skip to content

Commit

Permalink
Merge tag 'android-4.2.1_r1' into jb.2
Browse files Browse the repository at this point in the history
Android 4.2.1 release 1

Conflicts:
	core/java/android/widget/NumberPicker.java
	core/res/res/values/config.xml

Change-Id: I8e487a1b75cb00f8f9211451c08bae8fd7771df4
  • Loading branch information
imnuts committed Nov 28, 2012
2 parents 1eeae87 + b361b30 commit 1864c53
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 18 deletions.
26 changes: 16 additions & 10 deletions core/java/android/widget/NumberPicker.java
Original file line number Diff line number Diff line change
Expand Up @@ -1284,7 +1284,12 @@ public int getMinValue() {
/**
* Sets the min value of the picker.
*
* @param minValue The min value.
* @param minValue The min value inclusive.
*
* <strong>Note:</strong> The length of the displayed values array
* set via {@link #setDisplayedValues(String[])} must be equal to the
* range of selectable numbers which is equal to
* {@link #getMaxValue()} - {@link #getMinValue()} + 1.
*/
public void setMinValue(int minValue) {
if (mMinValue == minValue) {
Expand Down Expand Up @@ -1317,7 +1322,12 @@ public int getMaxValue() {
/**
* Sets the max value of the picker.
*
* @param maxValue The max value.
* @param maxValue The max value inclusive.
*
* <strong>Note:</strong> The length of the displayed values array
* set via {@link #setDisplayedValues(String[])} must be equal to the
* range of selectable numbers which is equal to
* {@link #getMaxValue()} - {@link #getMinValue()} + 1.
*/
public void setMaxValue(int maxValue) {
if (mMaxValue == maxValue) {
Expand Down Expand Up @@ -1351,6 +1361,10 @@ public String[] getDisplayedValues() {
* Sets the values to be displayed.
*
* @param displayedValues The displayed values.
*
* <strong>Note:</strong> The length of the displayed values array
* must be equal to the range of selectable numbers which is equal to
* {@link #getMaxValue()} - {@link #getMinValue()} + 1.
*/
public void setDisplayedValues(String[] displayedValues) {
if (mDisplayedValues == displayedValues) {
Expand All @@ -1361,14 +1375,6 @@ public void setDisplayedValues(String[] displayedValues) {
// Allow text entry rather than strictly numeric entry.
mInputText.setRawInputType(InputType.TYPE_CLASS_TEXT
| InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
// Make sure the min, max, respect the size of the displayed
// values. This will take care of the current value as well.
if (getMinValue() >= displayedValues.length) {
setMinValue(0);
}
if (getMaxValue() >= displayedValues.length) {
setMaxValue(displayedValues.length);
}
} else {
mInputText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
}
Expand Down
21 changes: 21 additions & 0 deletions core/res/res/values/config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1003,6 +1003,27 @@
where if the preferred is used we don't try the others. -->
<bool name="config_dontPreferApn">false</bool>

<!-- Vibrator pattern to be used as the default for notifications
that specify DEFAULT_VIBRATE.
-->
<integer-array name="config_defaultNotificationVibePattern">
<item>0</item>
<item>250</item>
<item>250</item>
<item>250</item>
</integer-array>

<!-- Vibrator pattern to be used as the default for notifications
that do not specify vibration but vibrate anyway because the device
is in vibrate mode.
-->
<integer-array name="config_notificationFallbackVibePattern">
<item>0</item>
<item>250</item>
<item>250</item>
<item>250</item>
</integer-array>

<!-- Workaround for devices with broken keyboards -->
<bool name="config_forceDisableHardwareKeyboard">false</bool>
</resources>
2 changes: 2 additions & 0 deletions core/res/res/values/symbols.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1525,6 +1525,8 @@
<java-symbol type="array" name="radioAttributes" />
<java-symbol type="array" name="config_oemUsbModeOverride" />
<java-symbol type="array" name="config_locationProviderPackageNames" />
<java-symbol type="array" name="config_defaultNotificationVibePattern" />
<java-symbol type="array" name="config_notificationFallbackVibePattern" />
<java-symbol type="bool" name="config_animateScreenLights" />
<java-symbol type="bool" name="config_automatic_brightness_available" />
<java-symbol type="bool" name="config_sf_limitedAlpha" />
Expand Down
59 changes: 51 additions & 8 deletions services/java/com/android/server/NotificationManagerService.java
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ public class NotificationManagerService extends INotificationManager.Stub
private static final int SHORT_DELAY = 2000; // 2 seconds

private static final long[] DEFAULT_VIBRATE_PATTERN = {0, 250, 250, 250};
private static final int VIBRATE_PATTERN_MAXLEN = 8 * 2 + 1; // up to eight bumps

private static final int DEFAULT_STREAM_TYPE = AudioManager.STREAM_NOTIFICATION;
private static final boolean SCORE_ONGOING_HIGHER = false;
Expand All @@ -125,6 +126,9 @@ public class NotificationManagerService extends INotificationManager.Stub
private int mDefaultNotificationLedOn;
private int mDefaultNotificationLedOff;

private long[] mDefaultVibrationPattern;
private long[] mFallbackVibrationPattern;

private boolean mSystemReady;
private int mDisabledNotifications;

Expand Down Expand Up @@ -596,6 +600,19 @@ public void update() {
}
}

static long[] getLongArray(Resources r, int resid, int maxlen, long[] def) {
int[] ar = r.getIntArray(resid);
if (ar == null) {
return def;
}
final int len = ar.length > maxlen ? maxlen : ar.length;
long[] out = new long[len];
for (int i=0; i<len; i++) {
out[i] = ar[i];
}
return out;
}

NotificationManagerService(Context context, StatusBarManagerService statusBar,
LightsService lights)
{
Expand All @@ -622,6 +639,16 @@ public void update() {
mDefaultNotificationLedOff = resources.getInteger(
com.android.internal.R.integer.config_defaultNotificationLedOff);

mDefaultVibrationPattern = getLongArray(resources,
com.android.internal.R.array.config_defaultNotificationVibePattern,
VIBRATE_PATTERN_MAXLEN,
DEFAULT_VIBRATE_PATTERN);

mFallbackVibrationPattern = getLongArray(resources,
com.android.internal.R.array.config_notificationFallbackVibePattern,
VIBRATE_PATTERN_MAXLEN,
DEFAULT_VIBRATE_PATTERN);

// Don't start allowing notifications until the setup wizard has run once.
// After that, including subsequent boots, init with notifications turned on.
// This works on the first boot because the setup wizard will toggle this
Expand Down Expand Up @@ -1086,24 +1113,40 @@ public void enqueueNotificationInternal(String pkg, int callingUid, int callingP
}

// vibrate
// Does the notification want to specify its own vibration?
final boolean hasCustomVibrate = notification.vibrate != null;

// new in 4.2: if there was supposed to be a sound and we're in vibrate mode,
// we always vibrate, even if no vibration was specified
// and no other vibration is specified, we apply the default vibration anyway
final boolean convertSoundToVibration =
notification.vibrate == null
!hasCustomVibrate
&& (useDefaultSound || notification.sound != null)
&& (audioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE);

// The DEFAULT_VIBRATE flag trumps any custom vibration.
final boolean useDefaultVibrate =
(notification.defaults & Notification.DEFAULT_VIBRATE) != 0
|| convertSoundToVibration;
(notification.defaults & Notification.DEFAULT_VIBRATE) != 0;

if ((useDefaultVibrate || notification.vibrate != null)
if ((useDefaultVibrate || convertSoundToVibration || hasCustomVibrate)
&& !(audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT)) {
mVibrateNotification = r;

mVibrator.vibrate(useDefaultVibrate ? DEFAULT_VIBRATE_PATTERN
: notification.vibrate,
((notification.flags & Notification.FLAG_INSISTENT) != 0) ? 0: -1);
if (useDefaultVibrate || convertSoundToVibration) {
// Escalate privileges so we can use the vibrator even if the notifying app
// does not have the VIBRATE permission.
long identity = Binder.clearCallingIdentity();
try {
mVibrator.vibrate(convertSoundToVibration ? mFallbackVibrationPattern
: mDefaultVibrationPattern,
((notification.flags & Notification.FLAG_INSISTENT) != 0) ? 0: -1);
} finally {
Binder.restoreCallingIdentity(identity);
}
} else if (notification.vibrate.length > 1) {
// If you want your own vibration pattern, you need the VIBRATE permission
mVibrator.vibrate(notification.vibrate,
((notification.flags & Notification.FLAG_INSISTENT) != 0) ? 0: -1);
}
}
}

Expand Down

0 comments on commit 1864c53

Please sign in to comment.