diff options
18 files changed, 202 insertions, 8 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index bfab30a..e8897c7 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1497,6 +1497,66 @@ public final class Settings { public static final String POINTER_LOCATION = "pointer_location"; /** + * Whether to play a sound for low-battery alerts. + * @hide + */ + public static final String POWER_SOUNDS_ENABLED = "power_sounds_enabled"; + + /** + * Whether to play a sound for dock events. + * @hide + */ + public static final String DOCK_SOUNDS_ENABLED = "dock_sounds_enabled"; + + /** + * Whether to play sounds when the keyguard is shown and dismissed. + * @hide + */ + public static final String LOCKSCREEN_SOUNDS_ENABLED = "lockscreen_sounds_enabled"; + + /** + * URI for the low battery sound file. + * @hide + */ + public static final String LOW_BATTERY_SOUND = "low_battery_sound"; + + /** + * URI for the desk dock "in" event sound. + * @hide + */ + public static final String DESK_DOCK_SOUND = "desk_dock_sound"; + + /** + * URI for the desk dock "out" event sound. + * @hide + */ + public static final String DESK_UNDOCK_SOUND = "desk_undock_sound"; + + /** + * URI for the car dock "in" event sound. + * @hide + */ + public static final String CAR_DOCK_SOUND = "car_dock_sound"; + + /** + * URI for the car dock "out" event sound. + * @hide + */ + public static final String CAR_UNDOCK_SOUND = "car_undock_sound"; + + /** + * URI for the "device locked" (keyguard shown) sound. + * @hide + */ + public static final String LOCK_SOUND = "lock_sound"; + + /** + * URI for the "device unlocked" (keyguard dismissed) sound. + * @hide + */ + public static final String UNLOCK_SOUND = "unlock_sound"; + + /** * Settings to backup. This is here so that it's in the same place as the settings * keys and easy to update. * @hide diff --git a/data/sounds/AudioPackage2.mk b/data/sounds/AudioPackage2.mk index 5dacc70..d7f7c7e 100644 --- a/data/sounds/AudioPackage2.mk +++ b/data/sounds/AudioPackage2.mk @@ -67,6 +67,11 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ + $(LOCAL_PATH)/effects/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \ + $(LOCAL_PATH)/effects/Dock.ogg:system/media/audio/ui/Dock.ogg \ + $(LOCAL_PATH)/effects/Undock.ogg:system/media/audio/ui/Undock.ogg \ + $(LOCAL_PATH)/effects/Lock.ogg:system/media/audio/ui/Lock.ogg \ + $(LOCAL_PATH)/effects/Unlock.ogg:system/media/audio/ui/Unlock.ogg \ $(LOCAL_PATH)/newwavelabs/CrazyDream.ogg:system/media/audio/ringtones/CrazyDream.ogg \ $(LOCAL_PATH)/newwavelabs/DreamTheme.ogg:system/media/audio/ringtones/DreamTheme.ogg \ $(LOCAL_PATH)/newwavelabs/Big_Easy.ogg:system/media/audio/ringtones/Big_Easy.ogg \ diff --git a/data/sounds/AudioPackage3.mk b/data/sounds/AudioPackage3.mk index f2f6212..64d6717 100644 --- a/data/sounds/AudioPackage3.mk +++ b/data/sounds/AudioPackage3.mk @@ -59,6 +59,11 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ + $(LOCAL_PATH)/effects/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \ + $(LOCAL_PATH)/effects/Dock.ogg:system/media/audio/ui/Dock.ogg \ + $(LOCAL_PATH)/effects/Undock.ogg:system/media/audio/ui/Undock.ogg \ + $(LOCAL_PATH)/effects/Lock.ogg:system/media/audio/ui/Lock.ogg \ + $(LOCAL_PATH)/effects/Unlock.ogg:system/media/audio/ui/Unlock.ogg \ $(LOCAL_PATH)/newwavelabs/Big_Easy.ogg:system/media/audio/ringtones/Big_Easy.ogg \ $(LOCAL_PATH)/newwavelabs/Bollywood.ogg:system/media/audio/ringtones/Bollywood.ogg \ $(LOCAL_PATH)/newwavelabs/Cairo.ogg:system/media/audio/ringtones/Cairo.ogg \ @@ -89,4 +94,3 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/notifications/pixiedust.ogg:system/media/audio/notifications/pixiedust.ogg \ $(LOCAL_PATH)/notifications/pizzicato.ogg:system/media/audio/notifications/pizzicato.ogg \ $(LOCAL_PATH)/notifications/tweeters.ogg:system/media/audio/notifications/tweeters.ogg - diff --git a/data/sounds/AudioPackage4.mk b/data/sounds/AudioPackage4.mk index 6c36bad..b011b78 100644 --- a/data/sounds/AudioPackage4.mk +++ b/data/sounds/AudioPackage4.mk @@ -46,6 +46,11 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ + $(LOCAL_PATH)/effects/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \ + $(LOCAL_PATH)/effects/Dock.ogg:system/media/audio/ui/Dock.ogg \ + $(LOCAL_PATH)/effects/Undock.ogg:system/media/audio/ui/Undock.ogg \ + $(LOCAL_PATH)/effects/Lock.ogg:system/media/audio/ui/Lock.ogg \ + $(LOCAL_PATH)/effects/Unlock.ogg:system/media/audio/ui/Unlock.ogg \ $(LOCAL_PATH)/Ring_Classic_02.ogg:system/media/audio/ringtones/Ring_Classic_02.ogg \ $(LOCAL_PATH)/Ring_Digital_02.ogg:system/media/audio/ringtones/Ring_Digital_02.ogg \ $(LOCAL_PATH)/Ring_Synth_04.ogg:system/media/audio/ringtones/Ring_Synth_04.ogg \ diff --git a/data/sounds/effects/Dock.aif b/data/sounds/effects/Dock.aif Binary files differnew file mode 100644 index 0000000..9f408cc --- /dev/null +++ b/data/sounds/effects/Dock.aif diff --git a/data/sounds/effects/Dock.ogg b/data/sounds/effects/Dock.ogg Binary files differnew file mode 100644 index 0000000..1462813d --- /dev/null +++ b/data/sounds/effects/Dock.ogg diff --git a/data/sounds/effects/Lock.aiff b/data/sounds/effects/Lock.aiff Binary files differnew file mode 100644 index 0000000..90870f2 --- /dev/null +++ b/data/sounds/effects/Lock.aiff diff --git a/data/sounds/effects/Lock.ogg b/data/sounds/effects/Lock.ogg Binary files differnew file mode 100644 index 0000000..841ee2e --- /dev/null +++ b/data/sounds/effects/Lock.ogg diff --git a/data/sounds/effects/LowBattery.aif b/data/sounds/effects/LowBattery.aif Binary files differnew file mode 100644 index 0000000..9216583 --- /dev/null +++ b/data/sounds/effects/LowBattery.aif diff --git a/data/sounds/effects/LowBattery.ogg b/data/sounds/effects/LowBattery.ogg Binary files differnew file mode 100644 index 0000000..68eb2c3 --- /dev/null +++ b/data/sounds/effects/LowBattery.ogg diff --git a/data/sounds/effects/Undock.aif b/data/sounds/effects/Undock.aif Binary files differnew file mode 100644 index 0000000..fe9d0b0 --- /dev/null +++ b/data/sounds/effects/Undock.aif diff --git a/data/sounds/effects/Undock.ogg b/data/sounds/effects/Undock.ogg Binary files differnew file mode 100644 index 0000000..0053066 --- /dev/null +++ b/data/sounds/effects/Undock.ogg diff --git a/data/sounds/effects/Unlock.aiff b/data/sounds/effects/Unlock.aiff Binary files differnew file mode 100644 index 0000000..546ea39 --- /dev/null +++ b/data/sounds/effects/Unlock.aiff diff --git a/data/sounds/effects/Unlock.ogg b/data/sounds/effects/Unlock.ogg Binary files differnew file mode 100644 index 0000000..26d5ea6 --- /dev/null +++ b/data/sounds/effects/Unlock.ogg diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index ba6024f..654ca32 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -58,4 +58,16 @@ <bool name="def_mount_ums_notify_enabled">true</bool> <bool name="set_install_location">true</bool> + <!-- user interface sound effects --> + <integer name="def_power_sounds_enabled">1</integer> + <string name="def_low_battery_sound">/system/media/ui/LowBattery.ogg</string> + <integer name="def_dock_sounds_enabled">1</integer> + <string name="def_desk_dock_sound">/system/media/audio/ui/dock.ogg</string> + <string name="def_desk_undock_sound">/system/media/audio/ui/undock.ogg</string> + <string name="def_car_dock_sound">/system/media/audio/ui/Dock.ogg</string> + <string name="def_car_undock_sound">/system/media/audio/ui/Undock.ogg</string> + <integer name="def_lockscreen_sounds_enabled">1</integer> + <string name="def_lock_sound">/system/media/audio/ui/Lock.ogg</string> + <string name="def_unlock_sound">/system/media/audio/ui/Unlock.ogg</string> + </resources> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index 57503f7..cf34d4e 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -76,7 +76,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 = 49; + private static final int DATABASE_VERSION = 50; private Context mContext; @@ -633,6 +633,24 @@ public class DatabaseHelper extends SQLiteOpenHelper { upgradeVersion = 49; } + if (upgradeVersion == 49) { + /* + * New settings for new user interface noises. + */ + db.beginTransaction(); + try { + SQLiteStatement stmt = db.compileStatement("INSERT INTO system(name,value)" + + " VALUES(?,?);"); + loadUISoundEffectsSettings(stmt); + stmt.close(); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + upgradeVersion = 50; + } + if (upgradeVersion != currentVersion) { Log.w(TAG, "Got stuck trying to upgrade from version " + upgradeVersion + ", must wipe the settings provider"); @@ -894,9 +912,37 @@ public class DatabaseHelper extends SQLiteOpenHelper { loadBooleanSetting(stmt, Settings.System.SET_INSTALL_LOCATION, R.bool.set_install_location); loadSetting(stmt, Settings.System.DEFAULT_INSTALL_LOCATION, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); + + loadUISoundEffectsSettings(stmt); + stmt.close(); } + private void loadUISoundEffectsSettings(SQLiteStatement stmt) { + loadIntegerSetting(stmt, Settings.System.POWER_SOUNDS_ENABLED, + R.integer.def_power_sounds_enabled); + loadStringSetting(stmt, Settings.System.LOW_BATTERY_SOUND, + R.string.def_low_battery_sound); + + loadIntegerSetting(stmt, Settings.System.DOCK_SOUNDS_ENABLED, + R.integer.def_dock_sounds_enabled); + loadStringSetting(stmt, Settings.System.DESK_DOCK_SOUND, + R.string.def_desk_dock_sound); + loadStringSetting(stmt, Settings.System.DESK_UNDOCK_SOUND, + R.string.def_desk_undock_sound); + loadStringSetting(stmt, Settings.System.CAR_DOCK_SOUND, + R.string.def_car_dock_sound); + loadStringSetting(stmt, Settings.System.CAR_UNDOCK_SOUND, + R.string.def_car_undock_sound); + + loadIntegerSetting(stmt, Settings.System.LOCKSCREEN_SOUNDS_ENABLED, + R.integer.def_lockscreen_sounds_enabled); + loadStringSetting(stmt, Settings.System.LOCK_SOUND, + R.string.def_lock_sound); + loadStringSetting(stmt, Settings.System.UNLOCK_SOUND, + R.string.def_unlock_sound); + } + private void loadDefaultAnimationSettings(SQLiteStatement stmt) { loadFractionSetting(stmt, Settings.System.WINDOW_ANIMATION_SCALE, R.fraction.def_window_animation_scale, 1); diff --git a/services/java/com/android/server/DockObserver.java b/services/java/com/android/server/DockObserver.java index c907368..d280475 100644 --- a/services/java/com/android/server/DockObserver.java +++ b/services/java/com/android/server/DockObserver.java @@ -26,10 +26,14 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.os.Binder; +import android.media.Ringtone; +import android.media.RingtoneManager; +import android.net.Uri; import android.os.Handler; import android.os.Message; import android.os.RemoteException; @@ -60,8 +64,11 @@ class DockObserver extends UEventObserver { public static final int MODE_NIGHT_YES = Configuration.UI_MODE_NIGHT_YES >> 4; private int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED; + private int mPreviousDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED; + private int mNightMode = MODE_NIGHT_NO; private boolean mCarModeEnabled = false; + private boolean mSystemReady; private final Context mContext; @@ -129,7 +136,7 @@ class DockObserver extends UEventObserver { try { int newState = Integer.parseInt(event.get("SWITCH_STATE")); if (newState != mDockState) { - int oldState = mDockState; + mPreviousDockState = mDockState; mDockState = newState; boolean carModeEnabled = mDockState == Intent.EXTRA_DOCK_STATE_CAR; if (mCarModeEnabled != carModeEnabled) { @@ -143,8 +150,8 @@ class DockObserver extends UEventObserver { // Don't force screen on when undocking from the desk dock. // The change in power state will do this anyway. // FIXME - we should be configurable. - if (oldState != Intent.EXTRA_DOCK_STATE_DESK || - newState != Intent.EXTRA_DOCK_STATE_UNDOCKED) { + if (mPreviousDockState != Intent.EXTRA_DOCK_STATE_DESK || + mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED) { mPowerManager.userActivityWithForce(SystemClock.uptimeMillis(), false, true); } @@ -163,7 +170,7 @@ class DockObserver extends UEventObserver { try { FileReader file = new FileReader(DOCK_STATE_PATH); int len = file.read(buffer, 0, 1024); - mDockState = Integer.valueOf((new String(buffer, 0, len)).trim()); + mPreviousDockState = mDockState = Integer.valueOf((new String(buffer, 0, len)).trim()); } catch (FileNotFoundException e) { Log.w(TAG, "This kernel does not have dock station support"); @@ -195,7 +202,10 @@ class DockObserver extends UEventObserver { public void handleMessage(Message msg) { synchronized (this) { Log.i(TAG, "Dock state changed: " + mDockState); - if (Settings.Secure.getInt(mContext.getContentResolver(), + + final ContentResolver cr = mContext.getContentResolver(); + + if (Settings.Secure.getInt(cr, Settings.Secure.DEVICE_PROVISIONED, 0) == 0) { Log.i(TAG, "Device not provisioned, skipping dock broadcast"); return; @@ -217,6 +227,38 @@ class DockObserver extends UEventObserver { intent.putExtra(BluetoothDevice.EXTRA_DEVICE, BluetoothAdapter.getDefaultAdapter().getRemoteDevice(address)); + // User feedback to confirm dock connection. Particularly + // useful for flaky contact pins... + if (Settings.System.getInt(cr, + Settings.System.DOCK_SOUNDS_ENABLED, 1) == 1) + { + String whichSound = null; + if (mDockState == Intent.EXTRA_DOCK_STATE_UNDOCKED) { + if (mPreviousDockState == Intent.EXTRA_DOCK_STATE_DESK) { + whichSound = Settings.System.DESK_UNDOCK_SOUND; + } else if (mPreviousDockState == Intent.EXTRA_DOCK_STATE_CAR) { + whichSound = Settings.System.CAR_UNDOCK_SOUND; + } + } else { + if (mDockState == Intent.EXTRA_DOCK_STATE_DESK) { + whichSound = Settings.System.DESK_DOCK_SOUND; + } else if (mDockState == Intent.EXTRA_DOCK_STATE_CAR) { + whichSound = Settings.System.CAR_DOCK_SOUND; + } + } + + if (whichSound != null) { + final String soundPath = Settings.System.getString(cr, whichSound); + if (soundPath != null) { + final Uri soundUri = Uri.parse("file://" + soundPath); + if (soundUri != null) { + final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri); + if (sfx != null) sfx.play(); + } + } + } + } + // Send the ordered broadcast; the result receiver will receive after all // broadcasts have been sent. If any broadcast receiver changes the result // code from the initial value of RESULT_OK, then the result receiver will diff --git a/services/java/com/android/server/status/StatusBarPolicy.java b/services/java/com/android/server/status/StatusBarPolicy.java index 20209e4..d13f9d3 100644 --- a/services/java/com/android/server/status/StatusBarPolicy.java +++ b/services/java/com/android/server/status/StatusBarPolicy.java @@ -22,6 +22,7 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothHeadset; import android.bluetooth.BluetoothPbap; import android.content.BroadcastReceiver; +import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -30,7 +31,10 @@ import android.content.res.TypedArray; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.media.AudioManager; +import android.media.Ringtone; +import android.media.RingtoneManager; import android.net.NetworkInfo; +import android.net.Uri; import android.net.wifi.WifiManager; import android.os.Binder; import android.os.Handler; @@ -109,6 +113,7 @@ public class StatusBarPolicy { private int mBatteryViewSequence; private boolean mBatteryShowLowOnEndCall = false; private static final boolean SHOW_LOW_BATTERY_WARNING = true; + private static final boolean SHOW_BATTERY_WARNINGS_IN_CALL = true; // phone private TelephonyManager mPhone; @@ -686,7 +691,7 @@ public class StatusBarPolicy { + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall); } - if (mPhoneState == TelephonyManager.CALL_STATE_IDLE) { + if (SHOW_BATTERY_WARNINGS_IN_CALL || mPhoneState == TelephonyManager.CALL_STATE_IDLE) { showLowBatteryWarning(); } else { mBatteryShowLowOnEndCall = true; @@ -810,6 +815,21 @@ public class StatusBarPolicy { d.show(); mLowBatteryDialog = d; } + + final ContentResolver cr = mContext.getContentResolver(); + if (Settings.System.getInt(cr, + Settings.System.POWER_SOUNDS_ENABLED, 1) == 1) + { + final String soundPath = Settings.System.getString(cr, + Settings.System.LOW_BATTERY_SOUND); + if (soundPath != null) { + final Uri soundUri = Uri.parse("file://" + soundPath); + if (soundUri != null) { + final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri); + if (sfx != null) sfx.play(); + } + } + } } private final void updateCallState(int state) { |