// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package io.flutter.plugins.androidalarmmanager;

import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.util.Log;

/**
 * Reschedules background work after the Android device reboots.
 *
 * <p>When an Android device reboots, all previously scheduled {@link AlarmManager} timers are
 * cleared.
 *
 * <p>Timer callbacks registered with the android_alarm_manager plugin can be designated
 * "persistent" and therefore, upon device reboot, should be rescheduled for execution. To
 * accomplish this rescheduling, {@code RebootBroadcastReceiver} is scheduled by {@link
 * AlarmService} to run on {@code BOOT_COMPLETED} and do the rescheduling.
 */
public class RebootBroadcastReceiver extends BroadcastReceiver {
  /**
   * Invoked by the OS whenever a broadcast is received by this app.
   *
   * <p>If the broadcast's action is {@code BOOT_COMPLETED} then this {@code
   * RebootBroadcastReceiver} reschedules all persistent timer callbacks. That rescheduling work is
   * handled by {@link AlarmService#reschedulePersistentAlarms(Context)}.
   */
  @Override
  public void onReceive(Context context, Intent intent) {
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
      Log.i("AlarmService", "Rescheduling after boot!");
      AlarmService.reschedulePersistentAlarms(context);
    }
  }

  /**
   * Schedules this {@code RebootBroadcastReceiver} to be run whenever the Android device reboots.
   */
  public static void enableRescheduleOnReboot(Context context) {
    scheduleOnReboot(context, PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
  }

  /**
   * Unschedules this {@code RebootBroadcastReceiver} to be run whenever the Android device reboots.
   * This {@code RebootBroadcastReceiver} will no longer be run upon reboot.
   */
  public static void disableRescheduleOnReboot(Context context) {
    scheduleOnReboot(context, PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
  }

  private static void scheduleOnReboot(Context context, int state) {
    ComponentName receiver = new ComponentName(context, RebootBroadcastReceiver.class);
    PackageManager pm = context.getPackageManager();
    pm.setComponentEnabledSetting(receiver, state, PackageManager.DONT_KILL_APP);
  }
}
