1/*
2 * Copyright (C) 2014 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
17package com.android.deskclock.timer;
18
19import android.app.Fragment;
20import android.content.Context;
21import android.os.Bundle;
22import android.view.LayoutInflater;
23import android.view.View;
24import android.view.ViewGroup;
25
26import com.android.deskclock.LabelDialogFragment;
27import com.android.deskclock.R;
28import com.android.deskclock.data.DataModel;
29import com.android.deskclock.data.Timer;
30import com.android.deskclock.data.TimerStringFormatter;
31import com.android.deskclock.events.Events;
32
33public class TimerItemFragment extends Fragment {
34
35    private static final String KEY_TIMER_ID = "KEY_TIMER_ID";
36    private int mTimerId;
37
38    /** The public no-arg constructor required by all fragments. */
39    public TimerItemFragment() {}
40
41    public static TimerItemFragment newInstance(Timer timer) {
42        final TimerItemFragment fragment = new TimerItemFragment();
43        final Bundle args = new Bundle();
44        args.putInt(KEY_TIMER_ID, timer.getId());
45        fragment.setArguments(args);
46        return fragment;
47    }
48
49    @Override
50    public void onCreate(Bundle savedInstanceState) {
51        super.onCreate(savedInstanceState);
52
53        mTimerId = getArguments().getInt(KEY_TIMER_ID);
54    }
55
56    @Override
57    public View onCreateView(LayoutInflater inflater, ViewGroup container,
58            Bundle savedInstanceState) {
59        final Timer timer = getTimer();
60        if (timer == null) {
61            return null;
62        }
63
64        final TimerItem view = (TimerItem) inflater.inflate(R.layout.timer_item, container, false);
65        view.findViewById(R.id.reset_add).setOnClickListener(new ResetAddListener());
66        view.findViewById(R.id.timer_label).setOnClickListener(new EditLabelListener());
67        view.findViewById(R.id.timer_time_text).setOnClickListener(new TimeTextListener());
68        view.update(timer);
69
70        return view;
71    }
72
73    /**
74     * @return {@code true} iff the timer is in a state that requires continuous updates
75     */
76    boolean updateTime() {
77        final TimerItem view = (TimerItem) getView();
78        if (view != null) {
79            final Timer timer = getTimer();
80            view.update(timer);
81            return !timer.isReset();
82        }
83
84        return false;
85    }
86
87    int getTimerId() {
88        return mTimerId;
89    }
90
91    Timer getTimer() {
92        return DataModel.getDataModel().getTimer(getTimerId());
93    }
94
95    private final class ResetAddListener implements View.OnClickListener {
96        @Override
97        public void onClick(View v) {
98            final Timer timer = getTimer();
99            if (timer.isPaused()) {
100                DataModel.getDataModel().resetOrDeleteTimer(timer, R.string.label_deskclock);
101            } else if (timer.isRunning() || timer.isExpired() || timer.isMissed()) {
102                DataModel.getDataModel().addTimerMinute(timer);
103                Events.sendTimerEvent(R.string.action_add_minute, R.string.label_deskclock);
104
105                final Context context = v.getContext();
106                // Must use getTimer() because old timer is no longer accurate.
107                final long currentTime = getTimer().getRemainingTime();
108                if (currentTime > 0) {
109                    v.announceForAccessibility(TimerStringFormatter.formatString(
110                            context, R.string.timer_accessibility_one_minute_added, currentTime,
111                            true));
112                }
113            }
114        }
115    }
116
117    private final class EditLabelListener implements View.OnClickListener {
118        @Override
119        public void onClick(View v) {
120            final LabelDialogFragment fragment = LabelDialogFragment.newInstance(getTimer());
121            LabelDialogFragment.show(getFragmentManager(), fragment);
122        }
123    }
124
125    private final class TimeTextListener implements View.OnClickListener {
126        @Override
127        public void onClick(View view) {
128            final Timer clickedTimer = getTimer();
129            if (clickedTimer.isPaused() || clickedTimer.isReset()) {
130                DataModel.getDataModel().startTimer(clickedTimer);
131            } else if (clickedTimer.isRunning()) {
132                DataModel.getDataModel().pauseTimer(clickedTimer);
133            }
134        }
135    }
136}