From bffc3d1bd33eb2d8e00a9f8b6261d815db503311 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Mon, 7 May 2012 17:43:49 -0700 Subject: Silent and Vibrate mode clean up Clean up related to new Vibration policy. The vibrate behavior is now only derived from: - presence of a vibrator on the device - current ringer mode selected: NORMAL, VIBRATE or SILENT If no vibrator is present the ringer mode can only be NORMAL or SILENT. The control of ringer mode via volume keys when volume keys control the "master" stream type (RING on phones, MUSIC on tablets) is as follows: If a vibrator is present: VOL- and volume equals 1: NORMAL => VIBRATE VOL- and volume equals 0 and not continuous press: VIBRATE => SILENT VOL+ and in SILENT mode: SILENT => VIBRATE VOL+ and in VIBRATE mode: VIBRATE => NORMAL, volume = 1 If no vibrator is present: VOL- and volume equals 0 and not continuous press: NORMAL => SILENT VOL+ and in SILENT mode: SILENT => NORMAL, volume = 0 VIBRATE_ON and VIBRATE_IN_SILENT settings are not stored/retreived any more. AudioService checks and corrects ringer mode and stream volumes if necessary when reading from DB at boot time. Also: Added dump for stream volumes in AudioService. Added device names missing in AudioSystem for USB accessory and USB device. Issue: 6036529 Issue: 6414950 Issue: 6448163 Change-Id: I77fb821ec63e4e566320cac2701b4ac466e86aef --- core/java/android/provider/Settings.java | 5 +- media/java/android/media/AudioService.java | 236 +++++++++++++-------- media/java/android/media/AudioSystem.java | 6 + .../android/providers/settings/DatabaseHelper.java | 24 ++- .../android/providers/settings/SettingsHelper.java | 15 -- .../statusbar/phone/PhoneStatusBarPolicy.java | 6 +- .../statusbar/policy/VolumeController.java | 11 +- .../android/internal/policy/impl/LockScreen.java | 11 +- .../android/server/NotificationManagerService.java | 2 +- 9 files changed, 196 insertions(+), 120 deletions(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 2c49bd2a335f..2f7a9ec9967e 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1557,6 +1557,9 @@ public final class Settings { * will likely be removed in a future release with support for * audio/vibe feedback profiles. * + * Not used anymore. On devices with vibrator, the user explicitly selects + * silent or vibrate mode. + * Kept for use by legacy database upgrade code in DatabaseHelper. * @hide */ public static final String VIBRATE_IN_SILENT = "vibrate_in_silent"; @@ -1983,7 +1986,6 @@ public final class Settings { SCREEN_BRIGHTNESS, SCREEN_BRIGHTNESS_MODE, SCREEN_AUTO_BRIGHTNESS_ADJ, - VIBRATE_ON, VIBRATE_INPUT_DEVICES, MODE_RINGER, MODE_RINGER_STREAMS_AFFECTED, @@ -2002,7 +2004,6 @@ public final class Settings { VOLUME_ALARM + APPEND_FOR_LAST_AUDIBLE, VOLUME_NOTIFICATION + APPEND_FOR_LAST_AUDIBLE, VOLUME_BLUETOOTH_SCO + APPEND_FOR_LAST_AUDIBLE, - VIBRATE_IN_SILENT, TEXT_AUTO_REPLACE, TEXT_AUTO_CAPS, TEXT_AUTO_PUNCTUATE, diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 2174d0653bba..1892fce5dbcb 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -55,6 +55,7 @@ import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; +import android.os.Vibrator; import android.provider.Settings; import android.provider.Settings.System; import android.telephony.PhoneStateListener; @@ -119,19 +120,18 @@ public class AudioService extends IAudioService.Stub implements OnFinished { private static final int MSG_PERSIST_VOLUME = 1; private static final int MSG_PERSIST_MASTER_VOLUME = 2; private static final int MSG_PERSIST_RINGER_MODE = 3; - private static final int MSG_PERSIST_VIBRATE_SETTING = 4; - private static final int MSG_MEDIA_SERVER_DIED = 5; - private static final int MSG_MEDIA_SERVER_STARTED = 6; - private static final int MSG_PLAY_SOUND_EFFECT = 7; - private static final int MSG_BTA2DP_DOCK_TIMEOUT = 8; - private static final int MSG_LOAD_SOUND_EFFECTS = 9; - private static final int MSG_SET_FORCE_USE = 10; - private static final int MSG_PERSIST_MEDIABUTTONRECEIVER = 11; - private static final int MSG_BT_HEADSET_CNCT_FAILED = 12; - private static final int MSG_RCDISPLAY_CLEAR = 13; - private static final int MSG_RCDISPLAY_UPDATE = 14; - private static final int MSG_SET_ALL_VOLUMES = 15; - private static final int MSG_PERSIST_MASTER_VOLUME_MUTE = 16; + private static final int MSG_MEDIA_SERVER_DIED = 4; + private static final int MSG_MEDIA_SERVER_STARTED = 5; + private static final int MSG_PLAY_SOUND_EFFECT = 6; + private static final int MSG_BTA2DP_DOCK_TIMEOUT = 7; + private static final int MSG_LOAD_SOUND_EFFECTS = 8; + private static final int MSG_SET_FORCE_USE = 9; + private static final int MSG_PERSIST_MEDIABUTTONRECEIVER = 10; + private static final int MSG_BT_HEADSET_CNCT_FAILED = 11; + private static final int MSG_RCDISPLAY_CLEAR = 12; + private static final int MSG_RCDISPLAY_UPDATE = 13; + private static final int MSG_SET_ALL_VOLUMES = 14; + private static final int MSG_PERSIST_MASTER_VOLUME_MUTE = 15; // flags for MSG_PERSIST_VOLUME indicating if current and/or last audible volume should be @@ -241,6 +241,20 @@ public class AudioService extends IAudioService.Stub implements OnFinished { }; private int[] mStreamVolumeAlias; + // stream names used by dumpStreamStates() + private final String[] STREAM_NAMES = new String[] { + "STREAM_VOICE_CALL", + "STREAM_SYSTEM", + "STREAM_RING", + "STREAM_MUSIC", + "STREAM_ALARM", + "STREAM_NOTIFICATION", + "STREAM_BLUETOOTH_SCO", + "STREAM_SYSTEM_ENFORCED", + "STREAM_DTMF", + "STREAM_TTS" + }; + private final AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() { public void onError(int error) { switch (error) { @@ -282,14 +296,15 @@ public class AudioService extends IAudioService.Stub implements OnFinished { private int mMuteAffectedStreams; /** - * Has multiple bits per vibrate type to indicate the type's vibrate - * setting. See {@link #setVibrateSetting(int, int)}. - *

- * NOTE: This is not the final decision of whether vibrate is on/off for the - * type since it depends on the ringer mode. See {@link #shouldVibrate(int)}. + * NOTE: setVibrateSetting(), getVibrateSetting(), shouldVibrate() are deprecated. + * mVibrateSetting is just maintained during deprecation period but vibration policy is + * now only controlled by mHasVibrator and mRingerMode */ private int mVibrateSetting; + // Is there a vibrator + private final boolean mHasVibrator; + // Broadcast receiver for device connections intent broadcasts private final BroadcastReceiver mReceiver = new AudioServiceBroadcastReceiver(); @@ -388,6 +403,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished { PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "mediaKeyEvent"); + Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + mHasVibrator = vibrator == null ? false : vibrator.hasVibrator(); + // Intialized volume MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = SystemProperties.getInt( "ro.config.vc_call_vol_steps", @@ -507,6 +525,16 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } } + private void dumpStreamStates(PrintWriter pw) { + pw.println("\nStream volumes (device: index)"); + int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int i = 0; i < numStreamTypes; i++) { + pw.println("- "+STREAM_NAMES[i]+":"); + mStreamStates[i].dump(pw); + pw.println(""); + } + } + private void updateStreamVolumeAlias(boolean updateVolumes) { int dtmfStreamAlias; @@ -538,18 +566,34 @@ public class AudioService extends IAudioService.Stub implements OnFinished { private void readPersistedSettings() { final ContentResolver cr = mContentResolver; - int ringerMode = System.getInt(cr, System.MODE_RINGER, AudioManager.RINGER_MODE_NORMAL); + int ringerModeFromSettings = + System.getInt(cr, System.MODE_RINGER, AudioManager.RINGER_MODE_NORMAL); + int ringerMode = ringerModeFromSettings; // sanity check in case the settings are restored from a device with incompatible // ringer modes if (!AudioManager.isValidRingerMode(ringerMode)) { ringerMode = AudioManager.RINGER_MODE_NORMAL; + } + if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) { + ringerMode = AudioManager.RINGER_MODE_SILENT; + } + if (ringerMode != ringerModeFromSettings) { System.putInt(cr, System.MODE_RINGER, ringerMode); } synchronized(mSettingsLock) { mRingerMode = ringerMode; } - mVibrateSetting = System.getInt(cr, System.VIBRATE_ON, 0); + // System.VIBRATE_ON is not used any more but defaults for mVibrateSetting + // are still needed while setVibrateSetting() and getVibrateSetting() are being deprecated. + mVibrateSetting = getValueForVibrateSetting(0, + AudioManager.VIBRATE_TYPE_NOTIFICATION, + mHasVibrator ? AudioManager.VIBRATE_SETTING_ONLY_SILENT + : AudioManager.VIBRATE_SETTING_OFF); + mVibrateSetting = getValueForVibrateSetting(mVibrateSetting, + AudioManager.VIBRATE_TYPE_RINGER, + mHasVibrator ? AudioManager.VIBRATE_SETTING_ONLY_SILENT + : AudioManager.VIBRATE_SETTING_OFF); // make sure settings for ringer mode are consistent with device type: non voice capable // devices (tablets) include media stream in silent mode whereas phones don't. @@ -639,8 +683,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished { // If either the client forces allowing ringer modes for this adjustment, // or the stream type is one that is affected by ringer modes if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) || - streamTypeAlias == AudioSystem.STREAM_RING || - (!mVoiceCapable && streamTypeAlias == AudioSystem.STREAM_MUSIC)) { + (streamTypeAlias == getMasterStreamType())) { int ringerMode = getRingerMode(); // do not vibrate if already in vibrate mode if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) { @@ -648,7 +691,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } // Check if the ringer mode changes with this volume adjustment. If // it does, it will handle adjusting the volume, so we won't below - adjustVolume = checkForRingerModeChange(oldIndex, direction, streamTypeAlias); + adjustVolume = checkForRingerModeChange(oldIndex, direction); } // If stream is muted, adjust last audible index only @@ -724,9 +767,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished { (mStreamVolumeAlias[streamType] == getMasterStreamType())) { int newRingerMode; if (index == 0) { - newRingerMode = System.getInt(mContentResolver, System.VIBRATE_IN_SILENT, 1) == 1 - ? AudioManager.RINGER_MODE_VIBRATE - : AudioManager.RINGER_MODE_SILENT; + newRingerMode = mHasVibrator ? AudioManager.RINGER_MODE_VIBRATE + : AudioManager.RINGER_MODE_SILENT; setStreamVolumeInt(mStreamVolumeAlias[streamType], index, device, @@ -1070,7 +1112,6 @@ public class AudioService extends IAudioService.Stub implements OnFinished { // on voice capable devices if (mVoiceCapable && mStreamVolumeAlias[streamType] == AudioSystem.STREAM_RING) { - Set set = mStreamStates[streamType].mLastAudibleIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { @@ -1111,6 +1152,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished { /** @see AudioManager#shouldVibrate(int) */ public boolean shouldVibrate(int vibrateType) { + if (!mHasVibrator) return false; switch (getVibrateSetting(vibrateType)) { @@ -1131,21 +1173,20 @@ public class AudioService extends IAudioService.Stub implements OnFinished { /** @see AudioManager#getVibrateSetting(int) */ public int getVibrateSetting(int vibrateType) { + if (!mHasVibrator) return AudioManager.VIBRATE_SETTING_OFF; return (mVibrateSetting >> (vibrateType * 2)) & 3; } /** @see AudioManager#setVibrateSetting(int, int) */ public void setVibrateSetting(int vibrateType, int vibrateSetting) { + if (!mHasVibrator) return; + mVibrateSetting = getValueForVibrateSetting(mVibrateSetting, vibrateType, vibrateSetting); // Broadcast change broadcastVibrateSetting(vibrateType); - // Post message to set ringer mode (it in turn will post a message - // to persist) - sendMsg(mAudioHandler, MSG_PERSIST_VIBRATE_SETTING, SENDMSG_NOOP, 0, 0, - null, 0); } /** @@ -1967,48 +2008,56 @@ public class AudioService extends IAudioService.Stub implements OnFinished { * adjusting volume. If so, this will set the proper ringer mode and volume * indices on the stream states. */ - private boolean checkForRingerModeChange(int oldIndex, int direction, int streamType) { + private boolean checkForRingerModeChange(int oldIndex, int direction) { boolean adjustVolumeIndex = true; int ringerMode = getRingerMode(); - int newRingerMode = ringerMode; int uiIndex = (oldIndex + 5) / 10; - boolean vibeInSilent = System.getInt(mContentResolver, System.VIBRATE_IN_SILENT, 1) == 1; - - if (ringerMode == RINGER_MODE_NORMAL) { - if ((direction == AudioManager.ADJUST_LOWER) && (uiIndex <= 1)) { - // enter silent mode if current index is the last audible one and not repeating a - // volume key down - if (vibeInSilent || mPrevVolDirection != AudioManager.ADJUST_LOWER) { - // "silent mode", but which one? - newRingerMode = vibeInSilent ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT; - } - if (uiIndex == 0 || - (!vibeInSilent && - mPrevVolDirection == AudioManager.ADJUST_LOWER && - mVoiceCapable && streamType == AudioSystem.STREAM_RING)) { - adjustVolumeIndex = false; + + switch (ringerMode) { + case RINGER_MODE_NORMAL: + if (direction == AudioManager.ADJUST_LOWER) { + if (mHasVibrator) { + if (uiIndex == 1) { + ringerMode = RINGER_MODE_VIBRATE; + } + } else { + if (uiIndex == 0 && mPrevVolDirection != AudioManager.ADJUST_LOWER) { + ringerMode = RINGER_MODE_SILENT; + } } } - } else if (ringerMode == RINGER_MODE_VIBRATE) { + break; + case RINGER_MODE_VIBRATE: + if (!mHasVibrator) { + Log.e(TAG, "checkForRingerModeChange() current ringer mode is vibrate" + + "but no vibrator is present"); + break; + } if ((direction == AudioManager.ADJUST_LOWER)) { - // Set it to silent, if it wasn't a long-press if (mPrevVolDirection != AudioManager.ADJUST_LOWER) { - newRingerMode = RINGER_MODE_SILENT; + ringerMode = RINGER_MODE_SILENT; } } else if (direction == AudioManager.ADJUST_RAISE) { - newRingerMode = RINGER_MODE_NORMAL; + ringerMode = RINGER_MODE_NORMAL; } adjustVolumeIndex = false; - } else { + break; + case RINGER_MODE_SILENT: if (direction == AudioManager.ADJUST_RAISE) { - // exiting silent mode - // If VIBRATE_IN_SILENT, then go into vibrate mode - newRingerMode = vibeInSilent ? RINGER_MODE_VIBRATE : RINGER_MODE_NORMAL; + if (mHasVibrator) { + ringerMode = RINGER_MODE_VIBRATE; + } else { + ringerMode = RINGER_MODE_NORMAL; + } } adjustVolumeIndex = false; + break; + default: + Log.e(TAG, "checkForRingerModeChange() wrong ringer mode: "+ringerMode); + break; } - setRingerMode(newRingerMode); + setRingerMode(ringerMode); mPrevVolDirection = direction; @@ -2217,9 +2266,6 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } public void readSettings() { - boolean checkSilentVolume = (mRingerMode == AudioManager.RINGER_MODE_NORMAL) && - isStreamAffectedByRingerMode(mStreamType); - int remainingDevices = AudioSystem.DEVICE_OUT_ALL; for (int i = 0; remainingDevices != 0; i++) { @@ -2248,12 +2294,13 @@ public class AudioService extends IAudioService.Stub implements OnFinished { index : AudioManager.DEFAULT_STREAM_VOLUME[mStreamType]; int lastAudibleIndex = Settings.System.getInt(mContentResolver, name, defaultIndex); - // a last audible index of 0 is never stored, except on non-voice capable devices - // (e.g. tablets) for the music stream type, where the music stream volume can reach - // 0 without the device being in silent mode + // a last audible index of 0 should never be stored for ring and notification + // streams on phones (voice capable devices). + // same for system stream on phones and tablets if ((lastAudibleIndex == 0) && - (mVoiceCapable || - (mStreamVolumeAlias[mStreamType] != AudioSystem.STREAM_MUSIC))) { + ((mVoiceCapable && + (mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_RING)) || + (mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_SYSTEM))) { lastAudibleIndex = AudioManager.DEFAULT_STREAM_VOLUME[mStreamType]; // Correct the data base sendMsg(mAudioHandler, @@ -2265,12 +2312,13 @@ public class AudioService extends IAudioService.Stub implements OnFinished { PERSIST_DELAY); } mLastAudibleIndex.put(device, getValidIndex(10 * lastAudibleIndex)); - // the initial index should never be 0 for a stream affected by ringer mode if not - // in silent or vibrate mode. - // this is permitted on tablets for music stream type. - if (checkSilentVolume && (index == 0) && - (mVoiceCapable || - (mStreamVolumeAlias[mStreamType] != AudioSystem.STREAM_MUSIC))) { + // the initial index should never be 0 for ring and notification streams on phones + // (voice capable devices) if not in silent or vibrate mode. + // same for system stream on phones and tablets + if ((index == 0) && (mRingerMode == AudioManager.RINGER_MODE_NORMAL) && + ((mVoiceCapable && + (mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_RING)) || + (mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_SYSTEM))) { index = lastAudibleIndex; // Correct the data base sendMsg(mAudioHandler, @@ -2328,14 +2376,22 @@ public class AudioService extends IAudioService.Stub implements OnFinished { mLastAudibleIndex.put(device, index); } // Apply change to all streams using this one as alias + // if changing volume of current device, also change volume of current + // device on aliased stream + boolean currentDevice = (device == getDeviceForStream(mStreamType)); int numStreamTypes = AudioSystem.getNumStreamTypes(); for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { - if (streamType != mStreamType && mStreamVolumeAlias[streamType] == mStreamType) { - mStreamStates[streamType].setIndex(rescaleIndex(index, - mStreamType, - streamType), - getDeviceForStream(streamType), + if (streamType != mStreamType && + mStreamVolumeAlias[streamType] == mStreamType) { + int scaledIndex = rescaleIndex(index, mStreamType, streamType); + mStreamStates[streamType].setIndex(scaledIndex, + device, lastAudible); + if (currentDevice) { + mStreamStates[streamType].setIndex(scaledIndex, + getDeviceForStream(streamType), + lastAudible); + } } } return true; @@ -2544,6 +2600,25 @@ public class AudioService extends IAudioService.Stub implements OnFinished { return handler; } } + + private void dump(PrintWriter pw) { + pw.print(" Current: "); + Set set = mIndex.entrySet(); + Iterator i = set.iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry)i.next(); + pw.print(Integer.toHexString(((Integer)entry.getKey()).intValue()) + + ": " + ((((Integer)entry.getValue()).intValue() + 5) / 10)+", "); + } + pw.print("\n Last audible: "); + set = mLastAudibleIndex.entrySet(); + i = set.iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry)i.next(); + pw.print(Integer.toHexString(((Integer)entry.getKey()).intValue()) + + ": " + ((((Integer)entry.getValue()).intValue() + 5) / 10)+", "); + } + } } /** Thread that handles native AudioSystem control. */ @@ -2631,10 +2706,6 @@ public class AudioService extends IAudioService.Stub implements OnFinished { System.putInt(mContentResolver, System.MODE_RINGER, ringerMode); } - private void persistVibrateSetting() { - System.putInt(mContentResolver, System.VIBRATE_ON, mVibrateSetting); - } - private void playSoundEffect(int effectType, int volume) { synchronized (mSoundEffectsLock) { if (mSoundPool == null) { @@ -2734,10 +2805,6 @@ public class AudioService extends IAudioService.Stub implements OnFinished { persistRingerMode(getRingerMode()); break; - case MSG_PERSIST_VIBRATE_SETTING: - persistVibrateSetting(); - break; - case MSG_MEDIA_SERVER_DIED: if (!mMediaServerOk) { Log.e(TAG, "Media server died."); @@ -4366,5 +4433,6 @@ public class AudioService extends IAudioService.Stub implements OnFinished { // TODO probably a lot more to do here than just the audio focus and remote control stacks dumpFocusStack(pw); dumpRCStack(pw); + dumpStreamStates(pw); } } diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 9bafa5ca8d0f..55071ec04380 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -260,6 +260,8 @@ public class AudioSystem public static final String DEVICE_OUT_AUX_DIGITAL_NAME = "aux_digital"; public static final String DEVICE_OUT_ANLG_DOCK_HEADSET_NAME = "analog_dock"; public static final String DEVICE_OUT_DGTL_DOCK_HEADSET_NAME = "digital_dock"; + public static final String DEVICE_OUT_USB_ACCESSORY_NAME = "usb_accessory"; + public static final String DEVICE_OUT_USB_DEVICE_NAME = "usb_device"; public static String getDeviceName(int device) { @@ -290,6 +292,10 @@ public class AudioSystem return DEVICE_OUT_ANLG_DOCK_HEADSET_NAME; case DEVICE_OUT_DGTL_DOCK_HEADSET: return DEVICE_OUT_DGTL_DOCK_HEADSET_NAME; + case DEVICE_OUT_USB_ACCESSORY: + return DEVICE_OUT_USB_ACCESSORY_NAME; + case DEVICE_OUT_USB_DEVICE: + return DEVICE_OUT_USB_DEVICE_NAME; case DEVICE_IN_DEFAULT: default: return ""; diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index abf713bf63c8..ee3b53fd9af5 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -63,7 +63,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { // database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion' // is properly propagated through your change. Not doing so will result in a loss of user // settings. - private static final int DATABASE_VERSION = 76; + private static final int DATABASE_VERSION = 77; private Context mContext; @@ -1031,6 +1031,23 @@ public class DatabaseHelper extends SQLiteOpenHelper { upgradeVersion = 76; } + /************* The following are Jelly Bean changes ************/ + + if (upgradeVersion == 76) { + // Removed VIBRATE_IN_SILENT setting + db.beginTransaction(); + try { + db.execSQL("DELETE FROM system WHERE name='" + + Settings.System.VIBRATE_IN_SILENT + "'"); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + upgradeVersion = 77; + } + + // *** Remember to update DATABASE_VERSION above! if (upgradeVersion != currentVersion) { @@ -1311,8 +1328,6 @@ public class DatabaseHelper extends SQLiteOpenHelper { loadSetting(stmt, Settings.System.MODE_RINGER, AudioManager.RINGER_MODE_NORMAL); - loadVibrateSetting(db, false); - // By default: // - ringtones, notification, system and music streams are affected by ringer mode // on non voice capable devices (tablets) @@ -1433,9 +1448,6 @@ public class DatabaseHelper extends SQLiteOpenHelper { loadUISoundEffectsSettings(stmt); - loadBooleanSetting(stmt, Settings.System.VIBRATE_IN_SILENT, - R.bool.def_vibrate_in_silent); - loadIntegerSetting(stmt, Settings.System.POINTER_SPEED, R.integer.def_pointer_speed); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java index 3e7d86a38bd1..18e7faa95fe6 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java @@ -43,9 +43,6 @@ public class SettingsHelper { private IContentService mContentService; private IPowerManager mPowerManager; - private boolean mSilent; - private boolean mVibrate; - public SettingsHelper(Context context) { mContext = context; mAudioManager = (AudioManager) context @@ -119,18 +116,6 @@ public class SettingsHelper { } } - private void setRingerMode() { - if (mSilent) { - mAudioManager.setRingerMode(mVibrate ? AudioManager.RINGER_MODE_VIBRATE : - AudioManager.RINGER_MODE_SILENT); - } else { - mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); - mAudioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, - mVibrate ? AudioManager.VIBRATE_SETTING_ON - : AudioManager.VIBRATE_SETTING_OFF); - } - } - byte[] getLocaleData() { Configuration conf = mContext.getResources().getConfiguration(); final Locale loc = conf.locale; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 5f18b5dfe8ab..374226d3a536 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -122,8 +122,7 @@ public class PhoneStatusBarPolicy { action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) { updateBluetooth(intent); } - else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) || - action.equals(AudioManager.VIBRATE_SETTING_CHANGED_ACTION)) { + else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) { updateVolume(); } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) { @@ -144,7 +143,6 @@ public class PhoneStatusBarPolicy { filter.addAction(Intent.ACTION_ALARM_CHANGED); filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); - filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); @@ -238,7 +236,7 @@ public class PhoneStatusBarPolicy { final int iconId; String contentDescription = null; - if (audioManager.shouldVibrate(AudioManager.VIBRATE_TYPE_RINGER)) { + if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) { iconId = R.drawable.stat_sys_ringer_vibrate; contentDescription = mContext.getString(R.string.accessibility_ringer_vibrate); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java index c9da01aa73d2..43cb85ea3a56 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java @@ -20,6 +20,7 @@ import android.content.ContentResolver; import android.content.Context; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.Vibrator; import android.media.AudioManager; import android.provider.Settings; import android.util.Slog; @@ -36,10 +37,16 @@ public class VolumeController implements ToggleSlider.Listener { private boolean mMute; private int mVolume; + // Is there a vibrator + private final boolean mHasVibrator; public VolumeController(Context context, ToggleSlider control) { mContext = context; mControl = control; + + Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + mHasVibrator = vibrator == null ? false : vibrator.hasVibrator(); + mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); mMute = mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL; @@ -54,10 +61,8 @@ public class VolumeController implements ToggleSlider.Listener { public void onChanged(ToggleSlider view, boolean tracking, boolean mute, int level) { if (!tracking) { if (mute) { - boolean vibeInSilent = (1 == Settings.System.getInt(mContext.getContentResolver(), - Settings.System.VIBRATE_IN_SILENT, 1)); mAudioManager.setRingerMode( - vibeInSilent ? AudioManager.RINGER_MODE_VIBRATE + mHasVibrator ? AudioManager.RINGER_MODE_VIBRATE : AudioManager.RINGER_MODE_SILENT); } else { mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); diff --git a/policy/src/com/android/internal/policy/impl/LockScreen.java b/policy/src/com/android/internal/policy/impl/LockScreen.java index 8b0d858823b3..c7a30e291b3f 100644 --- a/policy/src/com/android/internal/policy/impl/LockScreen.java +++ b/policy/src/com/android/internal/policy/impl/LockScreen.java @@ -34,6 +34,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; +import android.os.Vibrator; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; @@ -82,6 +83,8 @@ class LockScreen extends LinearLayout implements KeyguardScreen { private boolean mCameraDisabled; private boolean mSearchDisabled; private SearchManager mSearchManager; + // Is there a vibrator + private final boolean mHasVibrator; InfoCallbackImpl mInfoCallback = new InfoCallbackImpl() { @@ -385,11 +388,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen { // toggle silent mode mSilentMode = !mSilentMode; if (mSilentMode) { - final boolean vibe = (Settings.System.getInt( - mContext.getContentResolver(), - Settings.System.VIBRATE_IN_SILENT, 1) == 1); - - mAudioManager.setRingerMode(vibe + mAudioManager.setRingerMode(mHasVibrator ? AudioManager.RINGER_MODE_VIBRATE : AudioManager.RINGER_MODE_SILENT); } else { @@ -451,6 +450,8 @@ class LockScreen extends LinearLayout implements KeyguardScreen { setFocusableInTouchMode(true); setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); + Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + mHasVibrator = vibrator == null ? false : vibrator.hasVibrator(); mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); mSilentMode = isSilentMode(); mUnlockWidget = findViewById(R.id.unlock_widget); diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java index 663a0316dbee..52ba665aea61 100755 --- a/services/java/com/android/server/NotificationManagerService.java +++ b/services/java/com/android/server/NotificationManagerService.java @@ -1046,7 +1046,7 @@ public class NotificationManagerService extends INotificationManager.Stub final boolean useDefaultVibrate = (notification.defaults & Notification.DEFAULT_VIBRATE) != 0; if ((useDefaultVibrate || notification.vibrate != null) - && audioManager.shouldVibrate(AudioManager.VIBRATE_TYPE_NOTIFICATION)) { + && !(audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT)) { mVibrateNotification = r; mVibrator.vibrate(useDefaultVibrate ? DEFAULT_VIBRATE_PATTERN -- cgit v1.2.3-59-g8ed1b