Squash increasing volume for alarm commits

DeskClock: Add increasing volume option for alarm clocks

this commit adds a checkbox preference for "increasing volume" to
alarm clocks. when checked, the alarm will start off at 10% of the
system-wide alarm volume and slowly increase to 100% over the
course of a minute.

Original author for jb is Austen Dicken<cvpcsm@gmail.com>
jb-mr1 porters Davor Bertovic (LorD ClockaN) and maxwen

Change-Id: Ic097e344ed1570602f17f774faed7b612d47be73

Conflicts:
	src/com/android/deskclock/AlarmKlaxon.java

Fix a number of issues introduced with the increasing volume setting

- Fix coding style
- Fix alarm layout
- Don't increase volume to levels higher than set in the system
- If increasing volume is enabled and alarm volume is set to 0, don't
  play alarm
- Don't randomly change log class usage

Change-Id: Ib98d82e361e83a76f08550f3b74df0c6270645a8

Conflicts:
	res/values-el/strings.xml
	res/values-es/strings.xml
	res/values-fr/strings.xml
	res/values-hu/strings.xml
	res/values-pt/strings.xml
	res/values-ru/strings.xml
	src/com/android/deskclock/AlarmKlaxon.java

Fix layout issues with increasing volume option.

- Ellipsize 'increasing volume' check box so even long strings aren't
  wrapped to two lines
- Adjust margins so they're consistent with the day buttons right above

Change-Id: Icfdefa837e84ff7db51376ca1d938dc1876f8da3

Fix NullPointerException when using vibrate-only alarms.

mAudioManager wasn't initialized in that case.

Fixes issue CYAN-376.

Change-Id: I70b3bc1f89498c3407980f512b09c3449969e733
diff --git a/res/layout/alarm_time.xml b/res/layout/alarm_time.xml
index 91124af..325c150 100644
--- a/res/layout/alarm_time.xml
+++ b/res/layout/alarm_time.xml
@@ -165,20 +165,20 @@
             android:visibility="gone">
             <!-- Day buttons are put here programatically -->
         </LinearLayout>
-        <LinearLayout
+        <RelativeLayout
             android:layout_width="match_parent"
-            android:layout_height="64dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:layout_marginBottom="16dp"
             android:layout_marginLeft="10dp"
-            android:layout_marginRight="16dp"
+            android:layout_marginRight="10dp"
             android:gravity="center_vertical">
 
             <TextView
                 android:id="@+id/choose_ringtone"
                 android:layout_height="match_parent"
-                android:layout_width="0dp"
-                android:layout_weight="1"
-                android:layout_marginRight="16dp"
-                android:gravity="center_vertical"
+                android:layout_width="match_parent"
+                android:layout_marginBottom="10dp"
                 style="@style/body"
                 android:background="@drawable/item_background"
                 android:clickable="true"
@@ -197,9 +197,23 @@
                 android:textColor="@color/clock_gray"
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
-                android:layout_gravity="center_vertical|right"
+                android:layout_below="@id/choose_ringtone"
+                android:layout_alignParentLeft="true"
+                android:layout_marginRight="10dp"
                 style="@style/body"/>
-        </LinearLayout>
+            <CheckBox
+                android:id="@+id/increasing_volume_onoff"
+                android:text="@string/alarm_increasing_volume"
+                android:includeFontPadding="false"
+                android:textColor="@color/clock_gray"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:layout_below="@id/choose_ringtone"
+                android:layout_toRightOf="@id/vibrate_onoff"
+                android:maxLines="1"
+                android:ellipsize="end"
+                style="@style/body"/>
+        </RelativeLayout>
         <View
             android:id="@+id/hairline"
             android:layout_height="1dp"
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 6448e11..b1d2605 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -330,4 +330,5 @@
     <string name="timer_delete_confirmation" msgid="2815524107015816453">"Διαγραφή αυτού του ξυπνητηριού;"</string>
     <string name="city_delete_confirmation" msgid="1783441538785676299">"Να διαγραφεί αυτή η πόλη;"</string>
     <string name="digital_gadget" msgid="2326954556720571358">"Ψηφιακό ρολόι"</string>
+    <string name="alarm_increasing_volume">Αυξανόμενη ένταση</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index aca9b33..e306314 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -330,4 +330,5 @@
     <string name="timer_delete_confirmation" msgid="2815524107015816453">"¿Eliminar este temporizador?"</string>
     <string name="city_delete_confirmation" msgid="1783441538785676299">"¿Eliminar esta ciudad?"</string>
     <string name="digital_gadget" msgid="2326954556720571358">"Reloj digital"</string>
+    <string name="alarm_increasing_volume">Volumen ascendente</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 177925a..3fce4ad 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--  Copyright (C) 2007 The Android Open Source Project
+      Copyright (C) 2013 The CyanogenMod Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -330,4 +331,5 @@
     <string name="timer_delete_confirmation" msgid="2815524107015816453">"Supprimer ce minuteur ?"</string>
     <string name="city_delete_confirmation" msgid="1783441538785676299">"Supprimer cette ville ?"</string>
     <string name="digital_gadget" msgid="2326954556720571358">"Horloge numérique"</string>
+    <string name="alarm_increasing_volume">Volume progressif</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 01c2d4a..9ac020d 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -31,6 +31,7 @@
     <string name="default_label" msgid="5590025289805630372">"Ébresztő"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Ébresztés beállítása"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Rezgés"</string>
+    <string name="alarm_increasing_volume">Emelkedő csengőhang</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Ismétlődés"</string>
     <string name="alert" msgid="6506982899651975645">"Ébresztés csengőhangja"</string>
     <string name="ringtone" msgid="9110746249688559579">"Csengőhang"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 80d3dee..cca00aa 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -330,4 +330,5 @@
     <string name="timer_delete_confirmation" msgid="2815524107015816453">"Excluir este temporizador?"</string>
     <string name="city_delete_confirmation" msgid="1783441538785676299">"Remover esta cidade?"</string>
     <string name="digital_gadget" msgid="2326954556720571358">"Relógio digital"</string>
+    <string name="alarm_increasing_volume">Volume crescente</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index b6c51f7..159df20 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -31,6 +31,7 @@
     <string name="default_label" msgid="5590025289805630372">"Будильник"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Установить будильник"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Вибросигнал"</string>
+    <string name="alarm_increasing_volume">Возрастающая громкость</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Повторять"</string>
     <string name="alert" msgid="6506982899651975645">"Звонок будильника"</string>
     <string name="ringtone" msgid="9110746249688559579">"Рингтон"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 878df78..ef58005 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -64,6 +64,9 @@
     <!-- Setting labels on Set alarm screen: Vibration on or off -->
     <string name="alarm_vibrate">Vibrate</string>
 
+    <!-- Setting labels on Set alarm screen: Increasing volume on or off -->
+    <string name="alarm_increasing_volume">Increasing volume</string>
+
     <!-- Setting labels on Set alarm screen: Repeat -->
     <string name="alarm_repeat">Repeat</string>
 
diff --git a/res/xml/alarm_prefs.xml b/res/xml/alarm_prefs.xml
index 162b674..fd10e9b 100644
--- a/res/xml/alarm_prefs.xml
+++ b/res/xml/alarm_prefs.xml
@@ -36,4 +36,7 @@
     <CheckBoxPreference android:key="vibrate"
         android:persistent="false"
         android:title="@string/alarm_vibrate"/>
+    <CheckBoxPreference android:key="increasingVolume"
+        android:persistent="false"
+        android:title="@string/alarm_increasing_volume" />
 </PreferenceScreen>
diff --git a/src/com/android/deskclock/Alarm.java b/src/com/android/deskclock/Alarm.java
index 73414c5..7df1401 100644
--- a/src/com/android/deskclock/Alarm.java
+++ b/src/com/android/deskclock/Alarm.java
@@ -60,6 +60,7 @@
         p.writeString(label);
         p.writeParcelable(alert, flags);
         p.writeInt(silent ? 1 : 0);
+        p.writeInt(increasingVolume ? 1 : 0);
     }
     //////////////////////////////
     // end Parcelable apis
@@ -125,6 +126,12 @@
         public static final String ALERT = "alert";
 
         /**
+         * True if alarm should start off quiet and slowly increase volume
+         * <P>Type: BOOLEAN</P>
+         */
+        public static final String INCREASING_VOLUME = "incvol";
+
+        /**
          * The default sort order for this table
          */
         public static final String DEFAULT_SORT_ORDER =
@@ -135,7 +142,7 @@
 
         static final String[] ALARM_QUERY_COLUMNS = {
             _ID, HOUR, MINUTES, DAYS_OF_WEEK, ALARM_TIME,
-            ENABLED, VIBRATE, MESSAGE, ALERT };
+            ENABLED, VIBRATE, MESSAGE, ALERT, INCREASING_VOLUME };
 
         /**
          * These save calls to cursor.getColumnIndexOrThrow()
@@ -150,6 +157,7 @@
         public static final int ALARM_VIBRATE_INDEX = 6;
         public static final int ALARM_MESSAGE_INDEX = 7;
         public static final int ALARM_ALERT_INDEX = 8;
+        public static final int ALARM_INCREASING_VOLUME_INDEX = 9;
     }
     //////////////////////////////
     // End column definitions
@@ -166,6 +174,7 @@
     public String     label;
     public Uri        alert;
     public boolean    silent;
+    public boolean    increasingVolume;
 
     @Override
     public String toString() {
@@ -178,6 +187,7 @@
                 ", daysOfWeek=" + daysOfWeek +
                 ", time=" + time +
                 ", vibrate=" + vibrate +
+                ", increasingVolume=" + increasingVolume +
                 ", label='" + label + '\'' +
                 ", silent=" + silent +
                 '}';
@@ -210,6 +220,7 @@
                         RingtoneManager.TYPE_ALARM);
             }
         }
+        increasingVolume = c.getInt(Columns.ALARM_INCREASING_VOLUME_INDEX) == 1;
     }
 
     public Alarm(Parcel p) {
@@ -223,6 +234,7 @@
         label = p.readString();
         alert = (Uri) p.readParcelable(null);
         silent = p.readInt() == 1;
+        increasingVolume = p.readInt() == 1;
     }
 
     // Creates a default alarm at the current time.
@@ -234,6 +246,7 @@
         daysOfWeek = new DaysOfWeek(0);
         label = "";
         alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
+        increasingVolume = false;
     }
 
     public String getLabelOrDefault(Context context) {
diff --git a/src/com/android/deskclock/AlarmClock.java b/src/com/android/deskclock/AlarmClock.java
index 14868c0..b01084b 100644
--- a/src/com/android/deskclock/AlarmClock.java
+++ b/src/com/android/deskclock/AlarmClock.java
@@ -476,6 +476,7 @@
             ViewGroup[] dayButtonParents = new ViewGroup[7];
             ToggleButton[] dayButtons = new ToggleButton[7];
             CheckBox vibrate;
+            CheckBox increasingVolume;
             ViewGroup collapse;
             TextView ringtone;
             View hairLine;
@@ -606,6 +607,7 @@
                 holder.dayButtonParents[i] = viewgroup;
             }
             holder.vibrate = (CheckBox) view.findViewById(R.id.vibrate_onoff);
+            holder.increasingVolume = (CheckBox) view.findViewById(R.id.increasing_volume_onoff);
             holder.collapse = (ViewGroup) view.findViewById(R.id.collapse);
             holder.ringtone = (TextView) view.findViewById(R.id.choose_ringtone);
 
@@ -884,6 +886,30 @@
                 }
             });
 
+            itemHolder.increasingVolume.setVisibility(View.VISIBLE);
+            itemHolder.increasingVolume.setChecked(alarm.increasingVolume);
+            itemHolder.increasingVolume.setTextColor(
+                    alarm.increasingVolume ? mColorLit : mColorDim);
+            itemHolder.increasingVolume.setOnLongClickListener(mLongClickListener);
+
+            itemHolder.increasingVolume.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    final boolean checked = ((CheckBox) v).isChecked();
+                    //When action mode is on - simulate long click
+                    if (doLongClick(v)) {
+                        return;
+                    }
+                    if (checked) {
+                        itemHolder.increasingVolume.setTextColor(mColorLit);
+                    } else {
+                        itemHolder.increasingVolume.setTextColor(mColorDim);
+                    }
+                    alarm.increasingVolume = checked;
+                    asyncUpdateAlarm(alarm, false);
+                }
+            });
+
             itemHolder.collapse.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
diff --git a/src/com/android/deskclock/AlarmDatabaseHelper.java b/src/com/android/deskclock/AlarmDatabaseHelper.java
index aa22c10..c2ffdf9 100644
--- a/src/com/android/deskclock/AlarmDatabaseHelper.java
+++ b/src/com/android/deskclock/AlarmDatabaseHelper.java
@@ -32,7 +32,7 @@
 class AlarmDatabaseHelper extends SQLiteOpenHelper {
 
     private static final String DATABASE_NAME = "alarms.db";
-    private static final int DATABASE_VERSION = 5;
+    private static final int DATABASE_VERSION = 6;
 
     public AlarmDatabaseHelper(Context context) {
         super(context, DATABASE_NAME, null, DATABASE_VERSION);
@@ -49,14 +49,15 @@
                    "enabled INTEGER, " +
                    "vibrate INTEGER, " +
                    "message TEXT, " +
-                   "alert TEXT);");
+                   "alert TEXT, " +
+                   "incvol INTEGER);");
 
         // insert default alarms
         String insertMe = "INSERT INTO alarms " +
                 "(hour, minutes, daysofweek, alarmtime, enabled, vibrate, " +
-                " message, alert) VALUES ";
-        db.execSQL(insertMe + "(8, 30, 31, 0, 0, 1, '', '');");
-        db.execSQL(insertMe + "(9, 00, 96, 0, 0, 1, '', '');");
+                " message, alert, incvol) VALUES ";
+        db.execSQL(insertMe + "(8, 30, 31, 0, 0, 1, '', '', 0);");
+        db.execSQL(insertMe + "(9, 00, 96, 0, 0, 1, '', '', 0);");
     }
 
     @Override
diff --git a/src/com/android/deskclock/AlarmKlaxon.java b/src/com/android/deskclock/AlarmKlaxon.java
index 7834623..1f3edef 100644
--- a/src/com/android/deskclock/AlarmKlaxon.java
+++ b/src/com/android/deskclock/AlarmKlaxon.java
@@ -45,16 +45,25 @@
 
     private static final long[] sVibratePattern = new long[] { 500, 500 };
 
+    private static final long INCVOL_DELAY = 5000; // 5sec * 7 volume levels = 30sec till max volume
+    private static final int INCVOL_START = 1;
+    private static final int INCVOL_DELTA = 1;
+
     private boolean mPlaying = false;
     private Vibrator mVibrator;
     private MediaPlayer mMediaPlayer;
+    private AudioManager mAudioManager;
     private Alarm mCurrentAlarm;
     private long mStartTime;
     private TelephonyManager mTelephonyManager;
     private int mInitialCallState;
+    private int mCurrentVolume;
+    private int mAlarmVolumeSetting = -1;
 
     // Internal messages
     private static final int KILLER = 1000;
+    private static final int INCREASE_VOLUME = 1001;
+
     private Handler mHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
@@ -63,9 +72,22 @@
                     if (Log.LOGV) {
                         Log.v("*********** Alarm killer triggered ***********");
                     }
+
                     sendKillBroadcast((Alarm) msg.obj, false);
                     stopSelf();
                     break;
+                case INCREASE_VOLUME:
+                    if (mPlaying && mMediaPlayer != null && mMediaPlayer.isPlaying()) {
+                        mCurrentVolume += INCVOL_DELTA;
+                        if (Log.LOGV) {
+                            Log.v("Increasing alarm volume to " + mCurrentVolume);
+                        }
+                        mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, mCurrentVolume, 0);
+                        if (mCurrentVolume < mAlarmVolumeSetting) {
+                            mHandler.sendEmptyMessageDelayed(INCREASE_VOLUME, INCVOL_DELAY);
+                        }
+                    }
+                    break;
             }
         }
     };
@@ -87,6 +109,7 @@
 
     @Override
     public void onCreate() {
+        mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
         mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
         // Listen for incoming calls to kill the alarm.
         mTelephonyManager =
@@ -201,7 +224,7 @@
                 } else {
                     mMediaPlayer.setDataSource(this, alert);
                 }
-                startAlarm(mMediaPlayer);
+                startAlarm(mMediaPlayer, alarm.increasingVolume);
             } catch (Exception ex) {
                 Log.v("Using the fallback ringtone");
                 // The alert may be on the sd card which could be busy right
@@ -211,7 +234,7 @@
                     mMediaPlayer.reset();
                     setDataSourceFromResource(getResources(), mMediaPlayer,
                             R.raw.fallbackring);
-                    startAlarm(mMediaPlayer);
+                    startAlarm(mMediaPlayer, alarm.increasingVolume);
                 } catch (Exception ex2) {
                     // At this point we just don't play anything.
                     Log.e("Failed to play fallback ringtone", ex2);
@@ -232,18 +255,23 @@
     }
 
     // Do the common stuff when starting the alarm.
-    private void startAlarm(MediaPlayer player)
+    private void startAlarm(MediaPlayer player, boolean useIncreasingVolume)
             throws java.io.IOException, IllegalArgumentException,
                    IllegalStateException {
-        final AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
         // do not play alarms if stream volume is 0
         // (typically because ringer mode is silent).
-        if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
-            player.setAudioStreamType(AudioManager.STREAM_ALARM);
-            player.setLooping(true);
-            player.prepare();
-            player.start();
+        if (mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM) == 0) {
+            return;
         }
+
+        if (useIncreasingVolume) {
+            startVolumeIncrease();
+        }
+
+        player.setAudioStreamType(AudioManager.STREAM_ALARM);
+        player.setLooping(true);
+        player.prepare();
+        player.start();
     }
 
     private void setDataSourceFromResource(Resources resources,
@@ -276,6 +304,7 @@
             mVibrator.cancel();
         }
         disableKiller();
+        stopVolumeIncrease();
     }
 
     /**
@@ -301,5 +330,21 @@
         mHandler.removeMessages(KILLER);
     }
 
+    private void startVolumeIncrease() {
+        // save current value
+        mAlarmVolumeSetting = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM);
 
+        mCurrentVolume = INCVOL_START;
+        mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, mCurrentVolume, 0);
+        mHandler.sendEmptyMessageDelayed(INCREASE_VOLUME, INCVOL_DELAY);
+    }
+
+    private void stopVolumeIncrease() {
+        mHandler.removeMessages(INCREASE_VOLUME);
+        if (mAlarmVolumeSetting >= 0) {
+            // reset to default from before
+            mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, mAlarmVolumeSetting, 0);
+            mAlarmVolumeSetting = -1;
+        }
+    }
 }
diff --git a/src/com/android/deskclock/Alarms.java b/src/com/android/deskclock/Alarms.java
index 7b4ff74..341e37c 100644
--- a/src/com/android/deskclock/Alarms.java
+++ b/src/com/android/deskclock/Alarms.java
@@ -192,6 +192,8 @@
         values.put(Alarm.Columns.ALERT, alarm.alert == null ? ALARM_ALERT_SILENT
                 : alarm.alert.toString());
 
+        values.put(Alarm.Columns.INCREASING_VOLUME, alarm.increasingVolume);
+
         return values;
     }
 
diff --git a/src/com/android/deskclock/HandleSetAlarm.java b/src/com/android/deskclock/HandleSetAlarm.java
index 69ef89e..0f831cb 100644
--- a/src/com/android/deskclock/HandleSetAlarm.java
+++ b/src/com/android/deskclock/HandleSetAlarm.java
@@ -89,6 +89,7 @@
         values.put(Alarm.Columns.VIBRATE, 1);
         values.put(Alarm.Columns.DAYS_OF_WEEK, 0);
         values.put(Alarm.Columns.ALARM_TIME, timeInMillis);
+        values.put(Alarm.Columns.INCREASING_VOLUME, 0);
 
         ContentResolver cr = getContentResolver();
         Uri result = cr.insert(Alarm.Columns.CONTENT_URI, values);
diff --git a/src/com/android/deskclock/SetAlarm.java b/src/com/android/deskclock/SetAlarm.java
index 3b73231..f650796 100644
--- a/src/com/android/deskclock/SetAlarm.java
+++ b/src/com/android/deskclock/SetAlarm.java
@@ -52,6 +52,7 @@
     private Preference mTimePref;
     private AlarmPreference mAlarmPref;
     private CheckBoxPreference mVibratePref;
+    private CheckBoxPreference mIncreasingVolumePref;
     private RepeatPreference mRepeatPref;
 
     private int     mId;
@@ -87,6 +88,8 @@
         if (!v.hasVibrator()) {
             getPreferenceScreen().removePreference(mVibratePref);
         }
+        mIncreasingVolumePref = (CheckBoxPreference) findPreference("increasingVolume");
+        mIncreasingVolumePref.setOnPreferenceChangeListener(this);
         mRepeatPref = (RepeatPreference) findPreference("setRepeat");
         mRepeatPref.setOnPreferenceChangeListener(this);
 
@@ -233,6 +236,7 @@
         mMinute = alarm.minutes;
         mRepeatPref.setDaysOfWeek(alarm.daysOfWeek);
         mVibratePref.setChecked(alarm.vibrate);
+        mIncreasingVolumePref.setChecked(alarm.increasingVolume);
         // Give the alert uri to the preference.
         mAlarmPref.setAlert(alarm.alert);
         updateTime();
@@ -300,6 +304,7 @@
         alarm.vibrate = mVibratePref.isChecked();
         alarm.label = mLabel.getText().toString();
         alarm.alert = mAlarmPref.getAlert();
+        alarm.increasingVolume = mIncreasingVolumePref.isChecked();
         return alarm;
     }