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