/*
========================================================================================
Filename: 21_AlarmClock.txt
Program 21: Create an alarm application.
Files Included: MainActivity.java, AlarmReceiver.java
========================================================================================

WHAT ALL TO DO / SETUP INSTRUCTIONS:
----------------------------------------------------------------------------------------
1. UI Components to Add (in res/layout/activity_main.xml):
   Add 1 TextView: 'Alarm Clock'
   Add 2 Button:
     - btnSelectTime: Text: 'Select Time', onClick: 'showTimePicker'
     - btnSetAlarm: Text: 'Set Alarm', onClick: 'setAlarm'

2. Layout Configuration:
   - LinearLayout (vertical, gravity='center', padding 20dp)

3. Menu Configuration:
   - None required.

4. Themes Configuration (res/values/themes.xml):
   - Default theme.

5. AndroidManifest.xml:
   Register AlarmReceiver inside <application>:
   <receiver android:name=".AlarmReceiver" android:exported="false" />

6. Additional Files & Resources Required:
   - Create AlarmReceiver.java extending BroadcastReceiver (plays ringtone or shows Toast). Uses AlarmManager and TimePickerDialog.
========================================================================================
*/

// ======================================================================================
// File: MainActivity.java
// ======================================================================================
package com.example.alarmclock;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {
    Button btnSelectTime;
    int hour,minute;
    @Override
    protected void onCreate(Bundle b) {
        super.onCreate(b);
        setContentView(R.layout.activity_main);
        btnSelectTime=findViewById(R.id.btnSelectTime);
    }

    public void showTimePicker(View v) {
        Calendar c=Calendar.getInstance();
        new TimePickerDialog(this,(tp,h,m)-> {
            hour=h;
            minute=m;
            Calendar t=Calendar.getInstance();
            t.set(Calendar.HOUR_OF_DAY,h);
            t.set(Calendar.MINUTE,m);
            btnSelectTime.setText(new SimpleDateFormat("hh:mm a",Locale.getDefault()).format(t.getTime()));
        }

        ,c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),false).show();
    }

    public void setAlarm(View v) {
        Calendar c=Calendar.getInstance();
        c.set(Calendar.HOUR_OF_DAY,hour);
        c.set(Calendar.MINUTE,minute);
        c.set(Calendar.SECOND,0);
        if(c.before(Calendar.getInstance()))c.add(Calendar.DATE,1);
        PendingIntent pi=PendingIntent.getBroadcast(this,0,new Intent(this,AlarmReceiver.class),PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);
        AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
        if(am!=null) {
            am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),pi);
            Toast.makeText(this,"Alarm Set Successfully",Toast.LENGTH_SHORT).show();
        }
    }
}

// ======================================================================================
// File: AlarmReceiver.java
// ======================================================================================
package com.example.alarmclock;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.widget.Toast;

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context c,Intent i) {
        Toast.makeText(c,"Alarm Ringing!",Toast.LENGTH_LONG).show();
        Uri u=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        if(u==null)u=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Ringtone r=RingtoneManager.getRingtone(c,u);
        if(r!=null)r.play();
    }
}
