content: /*
  * Copyright 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
  
  package com.example.android.directboot;
  
  import com.example.android.directboot.alarms.Alarm;
  import com.example.android.directboot.alarms.AlarmAdapter;
  import com.example.android.directboot.alarms.AlarmIntentService;
  import com.example.android.directboot.alarms.AlarmStorage;
  import com.example.android.directboot.alarms.AlarmUtil;
  import com.google.android.material.floatingactionbutton.FloatingActionButton;
  
  import android.app.Activity;
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.content.IntentFilter;
  import android.os.Bundle;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.TextView;
  
  import androidx.annotation.Nullable;
  import androidx.fragment.app.Fragment;
  import androidx.localbroadcastmanager.content.LocalBroadcastManager;
  import androidx.recyclerview.widget.LinearLayoutManager;
  import androidx.recyclerview.widget.RecyclerView;
  
  /**
   * Fragment that registers scheduled alarms.
   */
  public class SchedulerFragment extends Fragment {
  
      private static final String FRAGMENT_TIME_PICKER_TAG = "fragment_time_picker";
  
      private AlarmAdapter mAlarmAdapter;
      private AlarmUtil mAlarmUtil;
      private TextView mTextViewIntroMessage;
      private BroadcastReceiver mAlarmWentOffBroadcastReceiver;
  
      public static SchedulerFragment newInstance() {
          SchedulerFragment fragment = new SchedulerFragment();
          return fragment;
      }
  
      public SchedulerFragment() {
          // Required empty public constructor
      }
  
      @Override
      public void onActivityCreated(@Nullable Bundle savedInstanceState) {
          super.onActivityCreated(savedInstanceState);
          mAlarmWentOffBroadcastReceiver = new AlarmWentOffReceiver();
          LocalBroadcastManager.getInstance(getActivity())
                  .registerReceiver(mAlarmWentOffBroadcastReceiver,
                          new IntentFilter(AlarmIntentService.ALARM_WENT_OFF_ACTION));
      }
  
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
          return inflater.inflate(R.layout.fragment_alarm_scheduler, container, false);
      }
  
      @Override
      public void onViewCreated(final View rootView, Bundle savedInstanceState) {
          super.onViewCreated(rootView, savedInstanceState);
          FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.fab_add_alarm);
          fab.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  TimePickerFragment fragment = TimePickerFragment.newInstance();
                  fragment.setAlarmAddListener(new AlarmAddListenerImpl());
                  fragment.show(getFragmentManager(), FRAGMENT_TIME_PICKER_TAG);
              }
          });
          mTextViewIntroMessage = (TextView) rootView.findViewById(R.id.text_intro_message);
          Activity activity = getActivity();
          AlarmStorage alarmStorage = new AlarmStorage(activity);
          mAlarmAdapter = new AlarmAdapter(activity, alarmStorage.getAlarms());
          if (mAlarmAdapter.getItemCount() == 0) {
              mTextViewIntroMessage.setVisibility(View.VISIBLE);
          }
          RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view_alarms);
          recyclerView.setLayoutManager(new LinearLayoutManager(activity));
          recyclerView.setAdapter(mAlarmAdapter);
          recyclerView.addItemDecoration(new AlarmAdapter.DividerItemDecoration(activity));
          mAlarmUtil = new AlarmUtil(activity);
      }
  
      @Override
      public void onDestroy() {
          LocalBroadcastManager.getInstance(getActivity())
                  .unregisterReceiver(mAlarmWentOffBroadcastReceiver);
          super.onDestroy();
      }
  
      /**
       * {@link TimePickerFragment.AlarmAddListener} to do actions after an alarm is added.
       */
      private class AlarmAddListenerImpl implements TimePickerFragment.AlarmAddListener {
  
          @Override
          public void onAlarmAdded(Alarm alarm) {
              mAlarmAdapter.addAlarm(alarm);
              mAlarmUtil.scheduleAlarm(alarm);
              mTextViewIntroMessage.setVisibility(View.GONE);
          }
      }
  
      /**
       * A {@link BroadcastReceiver} that receives an intent when an alarm goes off.
       * This receiver removes the corresponding alarm from the RecyclerView.
       */
      private class AlarmWentOffReceiver extends BroadcastReceiver {
  
          @Override
          public void onReceive(Context context, Intent intent) {
              Alarm alarm = AlarmUtil.readAlarm(intent.getExtras());
              mAlarmAdapter.deleteAlarm(alarm);
          }
      }
  }
  