diff --git a/app/src/main/java/com/philliphsu/clock2/alarms/misc/AlarmController.java b/app/src/main/java/com/philliphsu/clock2/alarms/misc/AlarmController.java index 2ced869..d514a5e 100644 --- a/app/src/main/java/com/philliphsu/clock2/alarms/misc/AlarmController.java +++ b/app/src/main/java/com/philliphsu/clock2/alarms/misc/AlarmController.java @@ -230,7 +230,7 @@ public final class AlarmController { private PendingIntent alarmIntent(Alarm alarm, boolean retrievePrevious) { Intent intent = new Intent(mAppContext, AlarmActivity.class) - .putExtra(AlarmActivity.EXTRA_RINGING_OBJECT, alarm); + .putExtra(AlarmActivity.EXTRA_RINGING_OBJECT, ParcelableUtil.marshall(alarm)); int flag = retrievePrevious ? FLAG_NO_CREATE : FLAG_CANCEL_CURRENT; // Even when we try to retrieve a previous instance that actually did exist, // null can be returned for some reason. Thus, we don't checkNotNull(). diff --git a/app/src/main/java/com/philliphsu/clock2/ringtone/AlarmActivity.java b/app/src/main/java/com/philliphsu/clock2/ringtone/AlarmActivity.java index 17f6047..485b85f 100644 --- a/app/src/main/java/com/philliphsu/clock2/ringtone/AlarmActivity.java +++ b/app/src/main/java/com/philliphsu/clock2/ringtone/AlarmActivity.java @@ -20,6 +20,7 @@ import android.app.Notification; import android.app.NotificationManager; import android.content.Intent; import android.os.Bundle; +import android.os.Parcelable; import android.support.v4.app.NotificationCompat; import android.view.ViewGroup; @@ -124,6 +125,11 @@ public class AlarmActivity extends RingtoneActivity { stopAndFinish(); } + @Override + protected Parcelable.Creator getParcelableCreator() { + return Alarm.CREATOR; + } + // TODO: Consider changing the return type to Notification, and move the actual // task of notifying to the base class. @Override diff --git a/app/src/main/java/com/philliphsu/clock2/ringtone/RingtoneActivity.java b/app/src/main/java/com/philliphsu/clock2/ringtone/RingtoneActivity.java index 132c6a9..63cbdc2 100644 --- a/app/src/main/java/com/philliphsu/clock2/ringtone/RingtoneActivity.java +++ b/app/src/main/java/com/philliphsu/clock2/ringtone/RingtoneActivity.java @@ -34,6 +34,7 @@ import com.philliphsu.clock2.BaseActivity; import com.philliphsu.clock2.R; import com.philliphsu.clock2.ringtone.playback.RingtoneService; import com.philliphsu.clock2.util.LocalBroadcastHelper; +import com.philliphsu.clock2.util.ParcelableUtil; import butterknife.Bind; import butterknife.ButterKnife; @@ -98,13 +99,25 @@ public abstract class RingtoneActivity extends BaseActivit @OnClick(R.id.btn_right) protected abstract void onRightButtonClick(); + /** + * @return An implementation of {@link android.os.Parcelable.Creator} that can create + * an instance of the {@link #mRingingObject ringing object}. + */ + // TODO: Make abstract when we override this in all RingtoneActivities. + protected Parcelable.Creator getParcelableCreator() { + return null; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ButterKnife.bind(this); - if ((mRingingObject = getIntent().getParcelableExtra(EXTRA_RINGING_OBJECT)) == null) + final byte[] bytes = getIntent().getByteArrayExtra(EXTRA_RINGING_OBJECT); + if (bytes == null) { throw new IllegalStateException("Cannot start RingtoneActivity without a ringing object"); + } + mRingingObject = ParcelableUtil.unmarshall(bytes, getParcelableCreator()); sIsAlive = true; getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); @@ -122,7 +135,7 @@ public abstract class RingtoneActivity extends BaseActivit mRightButton.setCompoundDrawablesWithIntrinsicBounds(0, getRightButtonDrawable(), 0, 0); Intent intent = new Intent(this, getRingtoneServiceClass()) - .putExtra(EXTRA_RINGING_OBJECT, mRingingObject); + .putExtra(EXTRA_RINGING_OBJECT, ParcelableUtil.marshall(mRingingObject)); startService(intent); } diff --git a/app/src/main/java/com/philliphsu/clock2/ringtone/playback/AlarmRingtoneService.java b/app/src/main/java/com/philliphsu/clock2/ringtone/playback/AlarmRingtoneService.java index efb4eb1..2829b4d 100644 --- a/app/src/main/java/com/philliphsu/clock2/ringtone/playback/AlarmRingtoneService.java +++ b/app/src/main/java/com/philliphsu/clock2/ringtone/playback/AlarmRingtoneService.java @@ -19,6 +19,7 @@ package com.philliphsu.clock2.ringtone.playback; import android.app.Notification; import android.content.Intent; import android.net.Uri; +import android.os.Parcelable; import android.provider.Settings; import android.support.v4.app.NotificationCompat; @@ -106,4 +107,9 @@ public class AlarmRingtoneService extends RingtoneService { protected int minutesToAutoSilence() { return AlarmPreferences.minutesToSilenceAfter(this); } + + @Override + protected Parcelable.Creator getParcelableCreator() { + return Alarm.CREATOR; + } } diff --git a/app/src/main/java/com/philliphsu/clock2/ringtone/playback/RingtoneService.java b/app/src/main/java/com/philliphsu/clock2/ringtone/playback/RingtoneService.java index 93cf417..16b77ed 100644 --- a/app/src/main/java/com/philliphsu/clock2/ringtone/playback/RingtoneService.java +++ b/app/src/main/java/com/philliphsu/clock2/ringtone/playback/RingtoneService.java @@ -34,6 +34,7 @@ import android.util.Log; import com.philliphsu.clock2.R; import com.philliphsu.clock2.ringtone.RingtoneActivity; import com.philliphsu.clock2.util.LocalBroadcastHelper; +import com.philliphsu.clock2.util.ParcelableUtil; import java.util.concurrent.TimeUnit; @@ -104,12 +105,23 @@ public abstract class RingtoneService extends Service { */ protected abstract int minutesToAutoSilence(); + /** + * @return An implementation of {@link android.os.Parcelable.Creator} that can create + * an instance of the {@link #mRingingObject ringing object}. + */ + // TODO: Make abstract when we override this in all RingtoneServices. + protected Parcelable.Creator getParcelableCreator() { + return null; + } + @Override public int onStartCommand(Intent intent, int flags, int startId) { if (mRingingObject == null) { - if ((mRingingObject = intent.getParcelableExtra(EXTRA_RINGING_OBJECT)) == null) { + final byte[] bytes = intent.getByteArrayExtra(EXTRA_RINGING_OBJECT); + if (bytes == null) { throw new IllegalStateException("Cannot start RingtoneService without a ringing object"); } + mRingingObject = ParcelableUtil.unmarshall(bytes, getParcelableCreator()); } // Play ringtone, if not already playing if (mAudioManager == null && mRingtone == null) {