package com.alimuzaffar.ramadanalarm; import android.Manifest; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.res.AssetFileDescriptor; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.NotificationCompat; import android.support.v7.app.AppCompatActivity; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.TextView; import com.alimuzaffar.ramadanalarm.util.AlarmUtils; import com.alimuzaffar.ramadanalarm.util.AppSettings; import com.alimuzaffar.ramadanalarm.util.PrayTime; import com.alimuzaffar.ramadanalarm.util.ScreenUtils; import java.lang.ref.WeakReference; import java.util.Calendar; import java.util.TimeZone; public class RingAlarmActivity extends AppCompatActivity implements Constants, View.OnClickListener, MediaPlayer.OnCompletionListener { private Button mAlarmOff; private TextView mPrayerName; MediaPlayer mMediaPlayer = null; Runnable mAutoStop = null; Runnable mStartDua = null; int mOriginalVolume = -1; AudioManager mAudioManager; AscendingAlarmHandler mAscHandler; String mPrayerNameString = null; AppSettings mSettings; static int mAudioStream = AudioManager.STREAM_ALARM; boolean mPreAlarm = false; private NotificationManager mNotificationManager; private AudioManager.OnAudioFocusChangeListener mOnAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() { @Override public void onAudioFocusChange(int focusChange) { if (focusChange == AudioManager.AUDIOFOCUS_LOSS) { sendNotification(true); stopAlarm(); finish(); } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { startAlarm(); } } }; private PhoneStateListener phoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { if (state == TelephonyManager.CALL_STATE_RINGING) { mOnAudioFocusChangeListener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_FULLSCREEN); ScreenUtils.lockOrientation(this); setContentView(R.layout.activity_ring_alarm); setVolumeControlStream(AudioManager.STREAM_ALARM); Calendar now = Calendar.getInstance(TimeZone.getDefault()); now.setTimeInMillis(System.currentTimeMillis()); mSettings = AppSettings.getInstance(this); mPrayerName = (TextView) findViewById(R.id.prayer_name); mPrayerNameString = getIntent().getStringExtra(EXTRA_PRAYER_NAME); mPreAlarm = getIntent().hasExtra(EXTRA_PRE_ALARM_FLAG) && getIntent().getBooleanExtra(EXTRA_PRE_ALARM_FLAG, true); if (mPreAlarm) { String formatString = "%2$tl:%2$tM %2$tp %1$s"; if (mSettings.getTimeFormatFor(0) == PrayTime.TIME_24) { formatString = "%2$tk:%2$tM %1$s"; } mPrayerName.setText(String.format(formatString, mPrayerNameString, now)); } else { mPrayerName.setText(getString(R.string.prayer_name_time, mPrayerNameString)); } mAlarmOff = (Button) findViewById(R.id.alarm_off); mAlarmOff.setOnClickListener(this); try { playAlarm(); } catch (Exception e) { Log.e("RingAlarmActivity", e.getMessage(), e); } //if(PermissionUtil.hasSelfPermission(this, Manifest.permission.READ_PHONE_STATE)) { TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); //} } private void playAlarm() throws Exception { boolean loop = true; Uri alert = null; AssetFileDescriptor assetFileDescriptor = null; if (!mPreAlarm && mSettings.getBoolean(AppSettings.Key.USE_ADHAN)) { loop = false; //mAudioStream = AudioManager.STREAM_MUSIC; if (mPrayerNameString.equalsIgnoreCase(getString(R.string.fajr))) { assetFileDescriptor = getResources().openRawResourceFd(R.raw.adhan_fajr_trimmed); } else { assetFileDescriptor = getResources().openRawResourceFd(R.raw.adhan_trimmed); } } else if (mSettings.getBoolean(AppSettings.Key.IS_RANDOM_ALARM)) { //IF RANDOM RINGTONE IS SELECTED, USE IT. alert = AlarmUtils.getRandomRingtone(this); } else { //IF A RINGTONE IS SELECTED, USE IT! String uriStr = mSettings.getString(AppSettings.Key.SELECTED_RINGTONE); if (TextUtils.isEmpty(uriStr)) { alert = AlarmUtils.getAlarmRingtoneUri(); } else { alert = Uri.parse(uriStr); } } //if URI is not null, then it's a ringtone mMediaPlayer = new MediaPlayer(); if (alert != null) { mMediaPlayer.setDataSource(this, alert); } else { mMediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength()); } mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mOriginalVolume = mAudioManager.getStreamVolume(mAudioStream); if (mOriginalVolume == 0) { int volume = AlarmUtils.getAlarmVolumeFromPercentage(mAudioManager, mAudioStream, 50f); mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, volume, 0); } if (mSettings.getBoolean(AppSettings.Key.IS_ASCENDING_ALARM)) { int volume = AlarmUtils.getAlarmVolumeFromPercentage(mAudioManager, mAudioStream, 20f); mAudioManager.setStreamVolume(mAudioStream, volume, 0); if (mAscHandler == null) { mAscHandler = new AscendingAlarmHandler(mAudioManager); } mAscHandler.sendEmptyMessageDelayed(2, 10000); mAscHandler.sendEmptyMessageDelayed(3, 20000); mAscHandler.sendEmptyMessageDelayed(4, 30000); mAscHandler.sendEmptyMessageDelayed(5, 40000); } mMediaPlayer.setLooping(loop); mMediaPlayer.setAudioStreamType(mAudioStream); mMediaPlayer.prepare(); if (assetFileDescriptor != null) { mMediaPlayer.setOnCompletionListener(this); } int result = mAudioManager.requestAudioFocus(mOnAudioFocusChangeListener, mAudioStream, AudioManager.AUDIOFOCUS_GAIN); if (result == AudioManager.AUDIOFOCUS_GAIN) { startAlarm(); } } private void startAlarm() { mMediaPlayer.start(); mAlarmOff.postDelayed(mAutoStop = new Runnable() { @Override public void run() { sendNotification(); mAlarmOff.performClick(); } }, FIVE_MINUTES); } private void stopAlarm() { if (mAscHandler != null) { if (mAscHandler.hasMessages(20)) { mAscHandler.removeMessages(20); } if (mAscHandler.hasMessages(40)) { mAscHandler.removeMessages(20); } if (mAscHandler.hasMessages(60)) { mAscHandler.removeMessages(20); } if (mAscHandler.hasMessages(80)) { mAscHandler.removeMessages(20); } if (mAscHandler.hasMessages(100)) { mAscHandler.removeMessages(20); } mAscHandler = null; } if (mAutoStop != null) { mAlarmOff.removeCallbacks(mAutoStop); mAutoStop = null; } if (mStartDua != null) { mAlarmOff.removeCallbacks(mStartDua); mStartDua = null; } if (mMediaPlayer != null) { mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; if (mOriginalVolume != -1) { mAudioManager.setStreamVolume(mAudioStream, mOriginalVolume, 0); } } mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener); TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); } @Override public void onClick(View v) { stopAlarm(); finish(); } @Override public void onBackPressed() { //Do nothing since we want to force the user //to click the alarm button. } @Override protected void onDestroy() { stopAlarm(); super.onDestroy(); } private void sendNotification() { sendNotification(false); } private void sendNotification(boolean interrupted) { Calendar now = Calendar.getInstance(TimeZone.getDefault()); now.setTimeInMillis(System.currentTimeMillis()); String formatString = " %1$tl:%1$tM %1$tp " + getString(R.string.alarm_timed_out, mPrayerName.getText().toString()); if (AppSettings.getInstance(this).getTimeFormatFor(0) == PrayTime.TIME_24) { formatString = "%1$tk:%1$tM " + getString(R.string.alarm_timed_out, mPrayerName.getText().toString()); } String title = interrupted? getString(R.string.alarm_interrupted) : getString(R.string.alarm_timed_out_only); String body = String.format(formatString, now); if (interrupted) { body = mPrayerName.getText().toString(); } mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SalaatTimesActivity.class), PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(title) .setStyle(new NotificationCompat.BigTextStyle() .bigText(body)) .setContentText(body); mBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); } @Override public void onCompletion(MediaPlayer mp) { //IF RAMADAN PLAY PRAYER, IF PRAYER ALREADY PLAYED, STOP if (mSettings.getBoolean(AppSettings.Key.USE_ADHAN) && mSettings.getBoolean(AppSettings.Key.IS_RAMADAN)) { mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; AssetFileDescriptor assetFileDescriptor = null; if (mPrayerNameString.equalsIgnoreCase(getString(R.string.fajr))) { assetFileDescriptor = getResources().openRawResourceFd(R.raw.dua_sehri); } else if (mPrayerNameString.equalsIgnoreCase(getString(R.string.maghrib))) { assetFileDescriptor = getResources().openRawResourceFd(R.raw.dua_iftar); } if (assetFileDescriptor == null) { stopAlarm(); return; } try { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength()); mMediaPlayer.setAudioStreamType(mAudioStream); mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { stopAlarm(); } }); mMediaPlayer.setLooping(false); mMediaPlayer.prepare(); mAlarmOff.postDelayed(mStartDua = new Runnable() { @Override public void run() { mMediaPlayer.start(); } }, 3000); } catch (Exception e) { Log.e("RingAlarmActivity", e.getMessage(), e); } } } private static class AscendingAlarmHandler extends Handler { WeakReference<AudioManager> mAudioManagerRef = null; public AscendingAlarmHandler(AudioManager audioManager) { mAudioManagerRef = new WeakReference<>(audioManager); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); AudioManager audioManager = mAudioManagerRef.get(); if (audioManager != null) { int what = msg.what; float percentage = (float) what * 20f; int volume = AlarmUtils.getAlarmVolumeFromPercentage(audioManager, mAudioStream, percentage); audioManager.setStreamVolume(AudioManager.STREAM_ALARM, volume, 0); } } } }