Randomized Alarm Generator অ্যাপ

AlarmManager ব্যবহার করে কীভাবে পূর্বনির্ধারিত সময়ে একাধিক Alarm সৃষ্টি করে নোটিফিকেশন তৈরি করা যায় সেটা আমরা এই অত্যন্ত সহজ-সরল অ্যাপের মাধ্যমে দেখবো।

NotificationGeneratorApp

এখানে আমরা দেখতে পাচ্ছি যে অ্যাপ এর ভেতর কেবল একটি বাক্য আছে, যেখানে বলা আছে Generate Multiple Random Alarms! এটি clickable এবং এখানে ক্লিক করার মাধ্যমে আমরা কিছু নির্দিষ্ট সংখ্যক random অ্যালার্ম থেকে নোটিফিকেশন নির্দিষ্ট সময়ের মধ্যে জেনারেট করবো।

প্রথমেই আমরা এই TextView এর জন্য একটি OnClickListener সেট করবো।

public class MainActivity extends AppCompatActivity {
    ...
    private TextView notifyText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        this.notifyText = this.findViewById(R.id.notify);
        this.notifyText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });
    }

আমাদের লক্ষ্য হল যেন এই ক্লিক এর দ্বারা আমরা নিম্নরূপ নোটিফিকেশন তৈরি করতে পারি।

NotificationGeneratorAppNotification

র‍্যান্ডমাইজড টাইমস্ট্যাম্প জেনারেশন

আমরা OnClick method এর মধ্যে এই generateAlarmTimestamps() ফাংশনটি কল করবো।

public class MainActivity extends AppCompatActivity {
    ...
    private ArrayList<Long> alarmTimestamps;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        this.notifyText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alarmTimestamps = generateAlarmTimestamps (
                        System.currentTimeMillis(), 
                        System.currentTimeMillis() + CONST.MINUTE_IN_MILLISECONDS*6, 
                        5
                );
            }
        });
    }

generateAlarmTimestamps() ফাংশন এর ডেফিনিশন নিম্নে দেয়া হলঃ

public ArrayList<Long> generateAlarmTimestamps(long start_time, long end_time, int frequency) {
        long minimum_gap = CONST.MINUTE_IN_MILLISECONDS;
        return generateAlarmTimestamps(start_time, end_time, frequency, minimum_gap);
    }

    public ArrayList<Long> generateAlarmTimestamps(long start_time, long end_time, int frequency, long minimum_gap){
        ArrayList<Long> alarmTimestamps = new ArrayList<>();
        for (int i=0; i<frequency; i++) {
            while (true) {
                boolean tooClose = false;
                long alarmTime = start_time + (long) (Math.random() * (end_time - start_time));
                for (int j=0; j<i; j++) {
                    if (Math.abs(alarmTime - alarmTimestamps.get(j)) <= minimum_gap) {
                        tooClose = true;
                    }
                }
                if (tooClose == false) {
                    alarmTimestamps.add(alarmTime);
                    break;
                }
            }
        }
        Collections.sort(alarmTimestamps);
        return  alarmTimestamps;
    }

ফাংশন কল দেখে আমরা বুঝতে পারছি যে এটি বর্তমান সময় হতে শুরু করে আগামী ৬ মিনিটের মধ্যে ৫টি Timestamp রিটার্ন করে দিবে। এই Timestamp গুলোতেই আমরা নোটিফিকেশন এক্সপেক্ট করতে পারি। Timestamp গুলো কোন সময় নির্দেশ করছে সেটি Testing এর সুবিধার জন্য আমরা https://currentmillis.com/ সাইট হতে যাচাই করে নিতে পারি।

currentmillis

টাইমস্ট্যাম্পসমূহ অ্যালার্ম হিসেবে সেট করা

Timestamp গুলো জেনারেট করার পর আমাদের আমাদের কাজ হল সেগুলো AlarmManager এর মাধ্যমে সেট করা।

private void sendAlarmTimestamps(ArrayList <Long> notificationTimesInMilliseconds){
  Intent notificationIntent = new Intent(this, NotificationReceiver.class);
  AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
  for (int i=0; i<notificationTimesInMilliseconds.size(); i++) {
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
      getApplicationContext(),
      i,
      notificationIntent,
      PendingIntent.FLAG_UPDATE_CURRENT
    );
    alarmManager.set(AlarmManager.RTC_WAKEUP, notificationTimesInMilliseconds.get(i), pendingIntent);
  }
}

এখানে গুরুত্বপূর্ণ বিষয় হচ্ছে PendingIntent.getBroadcast() ফাংশনের দ্বিতীয় parameter যা দ্বারা request code বুঝায়। কারণ একাধিক alarm সেট করার জন্য নিশ্চিত করতে হবে যেন তাদের PendingIntent ভিন্ন হয়। আমরা লুপ চালিয়ে প্রত্যেকটি Timestamp এর জন্য ভিন্ন PendingIntent তৈরি করে নিলাম।

ইতিকথা

এভাবে আমরা alarm গুলো সেট করে নিলাম। এগুলোকে নোটিফিকেশন হিসেবে দেখার জন্য প্রয়োজনীয় বিষয়াদি সম্পর্কে আমরা পরবর্তী ব্লগপোস্টে আলোচনা করবো।