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