DeskClock.java revision d13733225cb1a3e16413b35336e94e400bf5d399
1/*
2 * Copyright (C) 2009 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;
18
19import android.app.Activity;
20import android.app.AlertDialog;
21import android.content.BroadcastReceiver;
22import android.content.Context;
23import android.content.DialogInterface;
24import android.content.Intent;
25import android.content.IntentFilter;
26import android.content.SharedPreferences;
27import android.content.res.Configuration;
28import android.database.Cursor;
29import android.graphics.drawable.Drawable;
30import android.graphics.drawable.ColorDrawable;
31import android.net.Uri;
32import android.os.Bundle;
33import android.os.Handler;
34import android.provider.Settings;
35import android.text.TextUtils;
36import android.util.Log;
37import android.view.animation.AnimationUtils;
38import android.view.ContextMenu;
39import android.view.ContextMenu.ContextMenuInfo;
40import android.view.LayoutInflater;
41import android.view.Menu;
42import android.view.MenuItem;
43import android.view.View;
44import android.view.View.OnClickListener;
45import android.view.View.OnCreateContextMenuListener;
46import android.view.ViewGroup;
47import android.view.Window;
48import android.view.WindowManager;
49import android.widget.AdapterView;
50import android.widget.AdapterView.AdapterContextMenuInfo;
51import android.widget.AdapterView.OnItemClickListener;
52import android.widget.Button;
53import android.widget.TextView;
54import android.widget.CheckBox;
55
56import static android.os.BatteryManager.BATTERY_STATUS_CHARGING;
57import static android.os.BatteryManager.BATTERY_STATUS_FULL;
58import static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN;
59
60import java.text.DateFormat;
61import java.util.Date;
62
63/**
64 * DeskClock clock view for desk docks.
65 */
66public class DeskClock extends Activity {
67
68    private static final String LOG_TAG = "DeskClock";
69
70    private static final String MUSIC_NOW_PLAYING_ACTIVITY = "com.android.music.PLAYBACK_VIEWER";
71
72    private TextView mNextAlarm = null;
73    private TextView mDate;
74    private TextView mBatteryDisplay;
75    private DigitalClock mTime;
76
77    private boolean mDimmed = false;
78
79    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
80        @Override
81        public void onReceive(Context context, Intent intent) {
82            final String action = intent.getAction();
83            if (Intent.ACTION_DATE_CHANGED.equals(action)) {
84                refreshDate();
85            } else if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
86                handleBatteryUpdate(
87                    intent.getIntExtra("status", BATTERY_STATUS_UNKNOWN),
88                    intent.getIntExtra("level", 0));
89            }
90        }
91    };
92
93    private DateFormat mDateFormat;
94
95    private int mBatteryLevel;
96    private boolean mPluggedIn;
97
98    // Adapted from KeyguardUpdateMonitor.java
99    private void handleBatteryUpdate(int plugStatus, int batteryLevel) {
100        final boolean pluggedIn = (plugStatus == BATTERY_STATUS_CHARGING || plugStatus == BATTERY_STATUS_FULL);
101        if (pluggedIn != mPluggedIn || batteryLevel != mBatteryLevel) {
102            mBatteryLevel = batteryLevel;
103            mPluggedIn = pluggedIn;
104            refreshBattery();
105        }
106    }
107
108    private void refreshBattery() {
109        if (mPluggedIn /* || mBatteryLevel < LOW_BATTERY_THRESHOLD */) {
110            mBatteryDisplay.setCompoundDrawablesWithIntrinsicBounds(
111                0, 0, android.R.drawable.ic_lock_idle_charging, 0);
112            mBatteryDisplay.setText(
113                getString(R.string.battery_charging_level, mBatteryLevel));
114            mBatteryDisplay.setVisibility(View.VISIBLE);
115        } else {
116            mBatteryDisplay.setVisibility(View.INVISIBLE);
117        }
118    }
119
120    private void refreshDate() {
121        mDate.setText(mDateFormat.format(new Date()));
122    }
123
124    private void refreshAlarm() {
125        String nextAlarm = Settings.System.getString(getContentResolver(),
126                Settings.System.NEXT_ALARM_FORMATTED);
127        if (!TextUtils.isEmpty(nextAlarm)) {
128            mNextAlarm.setText(nextAlarm);
129            //mNextAlarm.setCompoundDrawablesWithIntrinsicBounds(
130            //    android.R.drawable.ic_lock_idle_alarm, 0, 0, 0);
131            mNextAlarm.setVisibility(View.VISIBLE);
132        } else {
133            mNextAlarm.setVisibility(View.INVISIBLE);
134        }
135    }
136
137    private void doDim() {
138        View tintView = findViewById(R.id.window_tint);
139
140        Window win = getWindow();
141        WindowManager.LayoutParams winParams = win.getAttributes();
142
143        // dim the wallpaper somewhat (how much is determined below)
144        winParams.flags |= (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
145
146        if (mDimmed) {
147            winParams.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
148//            winParams.flags &= (~WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
149            winParams.dimAmount = 0.5f; // pump up contrast in dim mode
150
151            // show the window tint
152            tintView.startAnimation(AnimationUtils.loadAnimation(this, R.anim.dim));
153        } else {
154            winParams.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
155//            winParams.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
156            winParams.dimAmount = 0.2f; // lower contrast in normal mode
157
158            // hide the window tint
159            tintView.startAnimation(AnimationUtils.loadAnimation(this, R.anim.undim));
160        }
161
162        win.setAttributes(winParams);
163    }
164
165    @Override
166    public void onResume() {
167        super.onResume();
168
169        // reload the date format in case the user has changed settings
170        // recently
171        mDateFormat = java.text.DateFormat.getDateInstance(java.text.DateFormat.FULL);
172
173        IntentFilter filter = new IntentFilter();
174        filter.addAction(Intent.ACTION_DATE_CHANGED);
175        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
176        registerReceiver(mIntentReceiver, filter);
177
178        doDim();
179        refreshDate();
180        refreshAlarm();
181        refreshBattery();
182    }
183
184    @Override
185    public void onPause() {
186        super.onPause();
187        unregisterReceiver(mIntentReceiver);
188    }
189
190
191    private void initViews() {
192        setContentView(R.layout.desk_clock);
193
194        mTime = (DigitalClock) findViewById(R.id.time);
195        mDate = (TextView) findViewById(R.id.date);
196        mBatteryDisplay = (TextView) findViewById(R.id.battery);
197
198        mNextAlarm = (TextView) findViewById(R.id.nextAlarm);
199
200        final Button alarmButton = (Button) findViewById(R.id.alarm_button);
201        alarmButton.setOnClickListener(new View.OnClickListener() {
202            public void onClick(View v) {
203                startActivity(new Intent(DeskClock.this, AlarmClock.class));
204            }
205        });
206
207        final Button galleryButton = (Button) findViewById(R.id.gallery_button);
208        galleryButton.setOnClickListener(new View.OnClickListener() {
209            public void onClick(View v) {
210                try {
211                    startActivity(new Intent(
212                        Intent.ACTION_VIEW,
213                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI));
214                } catch (android.content.ActivityNotFoundException e) {
215                    Log.e(LOG_TAG, "Couldn't launch image browser", e);
216                }
217            }
218        });
219
220        final Button musicButton = (Button) findViewById(R.id.music_button);
221        musicButton.setOnClickListener(new View.OnClickListener() {
222            public void onClick(View v) {
223                try {
224                    startActivity(new Intent(MUSIC_NOW_PLAYING_ACTIVITY));
225                } catch (android.content.ActivityNotFoundException e) {
226                    Log.e(LOG_TAG, "Couldn't launch music browser", e);
227                }
228            }
229        });
230
231        final Button homeButton = (Button) findViewById(R.id.home_button);
232        homeButton.setOnClickListener(new View.OnClickListener() {
233            public void onClick(View v) {
234                startActivity(
235                    new Intent(Intent.ACTION_MAIN)
236                        .addCategory(Intent.CATEGORY_HOME));
237            }
238        });
239
240        final Button nightmodeButton = (Button) findViewById(R.id.nightmode_button);
241        nightmodeButton.setOnClickListener(new View.OnClickListener() {
242            public void onClick(View v) {
243                mDimmed = ! mDimmed;
244                doDim();
245            }
246        });
247
248        doDim();
249    }
250
251    @Override
252    public void onConfigurationChanged(Configuration newConfig) {
253        super.onConfigurationChanged(newConfig);
254        initViews();
255    }
256
257
258    @Override
259    protected void onCreate(Bundle icicle) {
260        super.onCreate(icicle);
261        initViews();
262    }
263
264}
265