ScreensaverActivity.java revision 78b8e1513e24c58ffea6ee4edbebdce85c248f6f
1/*
2 * Copyright (C) 2012 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.animation.Animator;
20import android.animation.AnimatorSet;
21import android.animation.ObjectAnimator;
22import android.animation.TimeInterpolator;
23import android.app.Activity;
24import android.app.AlarmManager;
25import android.app.PendingIntent;
26import android.app.UiModeManager;
27import android.content.BroadcastReceiver;
28import android.content.Context;
29import android.content.Intent;
30import android.content.IntentFilter;
31import android.content.SharedPreferences;
32import android.content.res.Configuration;
33import android.graphics.Color;
34import android.graphics.Paint;
35import android.graphics.PorterDuff;
36import android.graphics.PorterDuffColorFilter;
37import android.os.BatteryManager;
38import android.os.Bundle;
39import android.os.Handler;
40import android.preference.PreferenceManager;
41import android.provider.Settings;
42import android.service.dreams.DreamService;
43import android.text.TextUtils;
44import android.text.format.DateFormat;
45import android.util.Log;
46import android.view.View;
47import android.view.Window;
48import android.view.WindowManager;
49import android.view.animation.AccelerateInterpolator;
50import android.view.animation.DecelerateInterpolator;
51import android.widget.TextView;
52
53import com.android.deskclock.Utils.ScreensaverMoveSaverRunnable;
54
55import java.util.Calendar;
56
57public class ScreensaverActivity extends Activity {
58    static final boolean DEBUG = false;
59    static final String TAG = "DeskClock/ScreensaverActivity";
60
61    // This value must match android:defaultValue of
62    // android:key="screensaver_clock_style" in dream_settings.xml
63    static final String DEFAULT_CLOCK_STYLE = "digital";
64
65    private View mContentView, mSaverView;
66    private View mAnalogClock, mDigitalClock;
67
68    private final Handler mHandler = new Handler();
69    private final ScreensaverMoveSaverRunnable mMoveSaverRunnable;
70    private String mDateFormat;
71    private String mDateFormatForAccessibility;
72    private PendingIntent mQuarterlyIntent;
73    private String mClockStyle;
74    private boolean mPluggedIn = true;
75    private final int mFlags = (WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
76            | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
77            | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
78            | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
79
80    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
81        @Override
82        public void onReceive(Context context, Intent intent) {
83            boolean changed = intent.getAction().equals(Intent.ACTION_TIME_CHANGED)
84                    || intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED);
85            if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
86                mPluggedIn = true;
87                setWakeLock();
88            } else if (intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) {
89                mPluggedIn = false;
90                setWakeLock();
91            } else if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
92                finish();
93            } else if (intent.getAction().equals(Utils.ACTION_ON_QUARTER_HOUR) || changed) {
94                Utils.updateDate(mDateFormat, mDateFormatForAccessibility,
95                        mClockStyle, mAnalogClock, mDigitalClock);
96            }
97
98            if (changed) {
99                Utils.refreshAlarm(ScreensaverActivity.this,
100                        mClockStyle, mAnalogClock, mAnalogClock);
101            }
102
103        }
104    };
105
106    public ScreensaverActivity() {
107        if (DEBUG) Log.d(TAG, "Screensaver allocated");
108        mMoveSaverRunnable = new ScreensaverMoveSaverRunnable(mHandler);
109    }
110
111    @Override
112    public void onStart() {
113        super.onStart();
114        IntentFilter filter = new IntentFilter();
115        filter.addAction(Intent.ACTION_POWER_CONNECTED);
116        filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
117        filter.addAction(Intent.ACTION_USER_PRESENT);
118        filter.addAction(Utils.ACTION_ON_QUARTER_HOUR);
119        filter.addAction(Intent.ACTION_TIME_CHANGED);
120        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
121        registerReceiver(mIntentReceiver, filter);
122    }
123
124    @Override
125    public void onResume() {
126        super.onResume();
127        Intent chargingIntent =
128                registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
129        int plugged = chargingIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
130        mPluggedIn = plugged == BatteryManager.BATTERY_PLUGGED_AC
131                || plugged == BatteryManager.BATTERY_PLUGGED_USB
132                || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS;
133
134        mDateFormat = getString(R.string.abbrev_wday_month_day_no_year);
135        mDateFormatForAccessibility = getString(R.string.full_wday_month_day_no_year);
136
137        setWakeLock();
138        layoutClockSaver();
139        mHandler.post(mMoveSaverRunnable);
140
141        long alarmOnQuarterHour = Utils.getAlarmOnQuarterHour();
142        mQuarterlyIntent = PendingIntent.getBroadcast(
143                this, 0, new Intent(Utils.ACTION_ON_QUARTER_HOUR), 0);
144        ((AlarmManager) getSystemService(Context.ALARM_SERVICE)).setRepeating(
145                AlarmManager.RTC, alarmOnQuarterHour, AlarmManager.INTERVAL_FIFTEEN_MINUTES,
146                mQuarterlyIntent);
147    }
148
149    @Override
150    public void onPause() {
151        mHandler.removeCallbacks(mMoveSaverRunnable);
152        ((AlarmManager) getSystemService(Context.ALARM_SERVICE)).cancel(mQuarterlyIntent);
153        finish();
154        super.onPause();
155    }
156
157    @Override
158    public void onStop() {
159        unregisterReceiver(mIntentReceiver);
160        super.onStop();
161   }
162
163    @Override
164    public void onConfigurationChanged(Configuration newConfig) {
165        if (DEBUG) Log.d(TAG, "Screensaver configuration changed");
166        super.onConfigurationChanged(newConfig);
167        mHandler.removeCallbacks(mMoveSaverRunnable);
168        layoutClockSaver();
169        mHandler.postDelayed(mMoveSaverRunnable, 250);
170    }
171
172    @Override
173    public void onUserInteraction() {
174        // We want the screen saver to exit upon user interaction.
175        finish();
176    }
177
178    private void setWakeLock() {
179        Window win = getWindow();
180        WindowManager.LayoutParams winParams = win.getAttributes();
181        winParams.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
182        if (mPluggedIn)
183            winParams.flags |= mFlags;
184        else
185            winParams.flags &= (~mFlags);
186        win.setAttributes(winParams);
187    }
188
189    private void setClockStyle() {
190        mSaverView = Utils.setClockStyle(this, mDigitalClock, mAnalogClock,
191                SettingsActivity.KEY_CLOCK_STYLE);
192        mClockStyle = (mSaverView == mDigitalClock ?
193                Utils.CLOCK_TYPE_DIGITAL : Utils.CLOCK_TYPE_ANALOG);
194        Utils.dimClockView(true, mSaverView);
195    }
196
197    private void layoutClockSaver() {
198        setContentView(R.layout.desk_clock_saver);
199        mDigitalClock = findViewById(R.id.main_digital_clock);
200        mAnalogClock = findViewById(R.id.main_analog_clock);
201        setClockStyle();
202        mContentView = (View) mSaverView.getParent();
203        mContentView.forceLayout();
204        mSaverView.forceLayout();
205        mSaverView.setAlpha(0);
206
207        findViewById(R.id.analog_clock_extras).setVisibility(View.VISIBLE);
208        findViewById(R.id.digital_clock_extras).setVisibility(View.VISIBLE);
209        mMoveSaverRunnable.registerViews(mContentView, mSaverView);
210
211        mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
212                | View.SYSTEM_UI_FLAG_FULLSCREEN
213                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
214
215        Utils.updateDate(mDateFormat, mDateFormatForAccessibility,
216                mClockStyle, mAnalogClock, mDigitalClock);
217        Utils.refreshAlarm(ScreensaverActivity.this,
218                mClockStyle, mAnalogClock, mDigitalClock);
219    }
220
221}
222