Home | History | Annotate | Download | only in com.example.android.directboot
      1 /*
      2 * Copyright 2016 The Android Open Source Project
      3 *
      4 * Licensed under the Apache License, Version 2.0 (the "License");
      5 * you may not use this file except in compliance with the License.
      6 * You may obtain a copy of the License at
      7 *
      8 *     http://www.apache.org/licenses/LICENSE-2.0
      9 *
     10 * Unless required by applicable law or agreed to in writing, software
     11 * distributed under the License is distributed on an "AS IS" BASIS,
     12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 * See the License for the specific language governing permissions and
     14 * limitations under the License.
     15 */
     16 
     17 package com.example.android.directboot;
     18 
     19 import com.example.android.directboot.alarms.Alarm;
     20 import com.example.android.directboot.alarms.AlarmAdapter;
     21 import com.example.android.directboot.alarms.AlarmIntentService;
     22 import com.example.android.directboot.alarms.AlarmStorage;
     23 import com.example.android.directboot.alarms.AlarmUtil;
     24 
     25 import android.app.Activity;
     26 import android.content.BroadcastReceiver;
     27 import android.content.Context;
     28 import android.content.Intent;
     29 import android.content.IntentFilter;
     30 import android.os.Bundle;
     31 import android.support.annotation.Nullable;
     32 import android.support.design.widget.FloatingActionButton;
     33 import android.support.v4.app.Fragment;
     34 import android.support.v4.content.LocalBroadcastManager;
     35 import android.support.v7.widget.LinearLayoutManager;
     36 import android.support.v7.widget.RecyclerView;
     37 import android.view.LayoutInflater;
     38 import android.view.View;
     39 import android.view.ViewGroup;
     40 import android.widget.TextView;
     41 
     42 /**
     43  * Fragment that registers scheduled alarms.
     44  */
     45 public class SchedulerFragment extends Fragment {
     46 
     47     private static final String FRAGMENT_TIME_PICKER_TAG = "fragment_time_picker";
     48 
     49     private AlarmAdapter mAlarmAdapter;
     50     private AlarmUtil mAlarmUtil;
     51     private TextView mTextViewIntroMessage;
     52     private BroadcastReceiver mAlarmWentOffBroadcastReceiver;
     53 
     54     public static SchedulerFragment newInstance() {
     55         SchedulerFragment fragment = new SchedulerFragment();
     56         return fragment;
     57     }
     58 
     59     public SchedulerFragment() {
     60         // Required empty public constructor
     61     }
     62 
     63     @Override
     64     public void onActivityCreated(@Nullable Bundle savedInstanceState) {
     65         super.onActivityCreated(savedInstanceState);
     66         mAlarmWentOffBroadcastReceiver = new AlarmWentOffReceiver();
     67         LocalBroadcastManager.getInstance(getActivity())
     68                 .registerReceiver(mAlarmWentOffBroadcastReceiver,
     69                         new IntentFilter(AlarmIntentService.ALARM_WENT_OFF_ACTION));
     70     }
     71 
     72     @Override
     73     public View onCreateView(LayoutInflater inflater, ViewGroup container,
     74             Bundle savedInstanceState) {
     75         return inflater.inflate(R.layout.fragment_alarm_scheduler, container, false);
     76     }
     77 
     78     @Override
     79     public void onViewCreated(final View rootView, Bundle savedInstanceState) {
     80         super.onViewCreated(rootView, savedInstanceState);
     81         FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.fab_add_alarm);
     82         fab.setOnClickListener(new View.OnClickListener() {
     83             @Override
     84             public void onClick(View view) {
     85                 TimePickerFragment fragment = TimePickerFragment.newInstance();
     86                 fragment.setAlarmAddListener(new AlarmAddListenerImpl());
     87                 fragment.show(getFragmentManager(), FRAGMENT_TIME_PICKER_TAG);
     88             }
     89         });
     90         mTextViewIntroMessage = (TextView) rootView.findViewById(R.id.text_intro_message);
     91         Activity activity = getActivity();
     92         AlarmStorage alarmStorage = new AlarmStorage(activity);
     93         mAlarmAdapter = new AlarmAdapter(activity, alarmStorage.getAlarms());
     94         if (mAlarmAdapter.getItemCount() == 0) {
     95             mTextViewIntroMessage.setVisibility(View.VISIBLE);
     96         }
     97         RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view_alarms);
     98         recyclerView.setLayoutManager(new LinearLayoutManager(activity));
     99         recyclerView.setAdapter(mAlarmAdapter);
    100         recyclerView.addItemDecoration(new AlarmAdapter.DividerItemDecoration(activity));
    101         mAlarmUtil = new AlarmUtil(activity);
    102     }
    103 
    104     @Override
    105     public void onDestroy() {
    106         LocalBroadcastManager.getInstance(getActivity())
    107                 .unregisterReceiver(mAlarmWentOffBroadcastReceiver);
    108         super.onDestroy();
    109     }
    110 
    111     /**
    112      * {@link TimePickerFragment.AlarmAddListener} to do actions after an alarm is added.
    113      */
    114     private class AlarmAddListenerImpl implements TimePickerFragment.AlarmAddListener {
    115 
    116         @Override
    117         public void onAlarmAdded(Alarm alarm) {
    118             mAlarmAdapter.addAlarm(alarm);
    119             mAlarmUtil.scheduleAlarm(alarm);
    120             mTextViewIntroMessage.setVisibility(View.GONE);
    121         }
    122     }
    123 
    124     /**
    125      * A {@link BroadcastReceiver} that receives an intent when an alarm goes off.
    126      * This receiver removes the corresponding alarm from the RecyclerView.
    127      */
    128     private class AlarmWentOffReceiver extends BroadcastReceiver {
    129 
    130         @Override
    131         public void onReceive(Context context, Intent intent) {
    132             Alarm alarm = intent.getParcelableExtra(AlarmIntentService.ALARM_KEY);
    133             mAlarmAdapter.deleteAlarm(alarm);
    134         }
    135     }
    136 }
    137