Как установить будильник из AlarmManager с помощью виджета приложения? - PullRequest
1 голос
/ 09 марта 2020

Я создал приложение, которое устанавливает будильник с определенной задержкой и т. Д. c. который сохраняется в общих настройках. Я хотел создать виджет, который бы запускал цикл будильника нажатием на него со всеми настройками, которые я записал в приложение, пока оно было открыто. Вот мой код виджета:

public class SetAlarmWidget extends AppWidgetProvider {
    Double delay;
    int howManyTimes;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int appWidgetId : appWidgetIds) {

            double delayHours;
            double delayMinutes;
            final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
            boolean amountRestricted = sharedPreferences.getBoolean("amountSwitchState", false);
            if (sharedPreferences.getString("delayHours", "0").equals("") && sharedPreferences.getString("delayMinutes", "0").equals("")) {
                delay = 0.0;
            } else if(sharedPreferences.getString("delayHours", "0").equals("")){
                delayMinutes = Double.parseDouble(sharedPreferences.getString("delayMinutes", "0"));
                delay = 60*1000*delayMinutes;
            }else if(sharedPreferences.getString("delayMinutes", "0").equals("")){
                delayHours = Double.parseDouble(sharedPreferences.getString("delayHours", "0"));
                delay = (60 * 60 * 1000) * delayHours;
            }else{
                delayMinutes = Double.parseDouble(sharedPreferences.getString("delayMinutes", "0"));
                delayHours = Double.parseDouble(sharedPreferences.getString("delayHours", "0"));
                delay = (60 * 60 * 1000) * delayHours+ (60*1000) * delayMinutes;
            }


            if (sharedPreferences.getString("amount", "0").equals("")) {
                howManyTimes = 0;
            } else {
                howManyTimes = Integer.parseInt(sharedPreferences.getString("amount", "0"));
            }


            if (delay>0) {
                double tmpDelay = delay;
                startAlarm(context);
            }

        }
    }

    private void startAlarm(Context context) {
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlertReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, intent, 0);


        assert alarmManager != null;
        alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() + delay.longValue(),
                delay.longValue(), pendingIntent);

        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        boolean amountRestricted = sharedPreferences.getBoolean("amountSwitchState", false);
        boolean hourRestricted = sharedPreferences.getBoolean("hourSwitchState", false);

        Calendar calendar = Calendar.getInstance();
        int currentHours = calendar.get(Calendar.HOUR_OF_DAY);
        int currentMinutes = calendar.get(Calendar.MINUTE) + currentHours * 60;

        int minutesToLast=0;
        if(hourRestricted)
        {
            String setTime = sharedPreferences.getString("lastHour", "false");
            String[] parts = setTime.split(":");
            String part1 = parts[0]; // 004
            String part2 = parts[1];
            int setHours = Integer.parseInt(part1);
            int setMinutes = Integer.parseInt(part2) + setHours * 60;

            if (!setTime.equals("false")) {
                if (currentMinutes < setMinutes) {
                    minutesToLast = setMinutes - currentMinutes;
                } else {
                    minutesToLast = 24 * 60 - currentMinutes + setMinutes;
                }
            }
        }

        int howManyTimesFromHour=-1;
        int minutesTemp=minutesToLast;

        while(minutesTemp>=0)
        {
            minutesTemp-=delay/60000;
            howManyTimesFromHour++;
        }

        if(amountRestricted && hourRestricted)
        {
            editor.putInt("desiredBursts", Math.min(howManyTimes, howManyTimesFromHour));
            editor.putBoolean("setRestricted", true);
        }else if(amountRestricted){
            editor.putInt("desiredBursts", howManyTimes);
            editor.putBoolean("setRestricted", true);
        }else if(hourRestricted){
            editor.putInt("desiredBursts", howManyTimesFromHour);
            editor.putBoolean("setRestricted", true);
        }else{
            editor.putInt("desiredBursts", 1);
            editor.putBoolean("setRestricted", false);
        }
        editor.putInt("elapsedBursts", 0);
        editor.putString("setDelay", delay.toString());

        editor.apply();


    }


}

Проблема в том, что когда я нажимаю на виджет, он ничего не делает. Метод startAlarm отличается от метода MainActivity только использованием context вместо this

...