/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.deskclock; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.UiModeManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.res.Configuration; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.os.BatteryManager; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.provider.Settings; import android.service.dreams.DreamService; import android.text.TextUtils; import android.text.format.DateFormat; import android.util.Log; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.widget.TextView; import com.android.deskclock.Utils.ScreensaverMoveSaverRunnable; import java.util.Calendar; public class ScreensaverActivity extends Activity { static final boolean DEBUG = false; static final String TAG = "DeskClock/ScreensaverActivity"; // This value must match android:defaultValue of // android:key="screensaver_clock_style" in dream_settings.xml static final String DEFAULT_CLOCK_STYLE = "digital"; private View mContentView, mSaverView; private View mAnalogClock, mDigitalClock; private final Handler mHandler = new Handler(); private final ScreensaverMoveSaverRunnable mMoveSaverRunnable; private String mDateFormat; private String mDateFormatForAccessibility; private PendingIntent mQuarterlyIntent; private String mClockStyle; private boolean mPluggedIn = true; private final int mFlags = (WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { boolean changed = intent.getAction().equals(Intent.ACTION_TIME_CHANGED) || intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED); if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) { mPluggedIn = true; setWakeLock(); } else if (intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) { mPluggedIn = false; setWakeLock(); } else if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) { finish(); } else if (intent.getAction().equals(Utils.ACTION_ON_QUARTER_HOUR) || changed) { Utils.updateDate(mDateFormat, mDateFormatForAccessibility, mContentView); } if (changed) { Utils.refreshAlarm(ScreensaverActivity.this, mContentView); } } }; public ScreensaverActivity() { if (DEBUG) Log.d(TAG, "Screensaver allocated"); mMoveSaverRunnable = new ScreensaverMoveSaverRunnable(mHandler); } @Override public void onStart() { super.onStart(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_POWER_CONNECTED); filter.addAction(Intent.ACTION_POWER_DISCONNECTED); filter.addAction(Intent.ACTION_USER_PRESENT); filter.addAction(Utils.ACTION_ON_QUARTER_HOUR); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); registerReceiver(mIntentReceiver, filter); } @Override public void onResume() { super.onResume(); Intent chargingIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int plugged = chargingIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); mPluggedIn = plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS; mDateFormat = getString(R.string.abbrev_wday_month_day_no_year); mDateFormatForAccessibility = getString(R.string.full_wday_month_day_no_year); setWakeLock(); layoutClockSaver(); mHandler.post(mMoveSaverRunnable); long alarmOnQuarterHour = Utils.getAlarmOnQuarterHour(); mQuarterlyIntent = PendingIntent.getBroadcast( this, 0, new Intent(Utils.ACTION_ON_QUARTER_HOUR), 0); ((AlarmManager) getSystemService(Context.ALARM_SERVICE)).setRepeating( AlarmManager.RTC, alarmOnQuarterHour, AlarmManager.INTERVAL_FIFTEEN_MINUTES, mQuarterlyIntent); } @Override public void onPause() { mHandler.removeCallbacks(mMoveSaverRunnable); ((AlarmManager) getSystemService(Context.ALARM_SERVICE)).cancel(mQuarterlyIntent); finish(); super.onPause(); } @Override public void onStop() { unregisterReceiver(mIntentReceiver); super.onStop(); } @Override public void onConfigurationChanged(Configuration newConfig) { if (DEBUG) Log.d(TAG, "Screensaver configuration changed"); super.onConfigurationChanged(newConfig); mHandler.removeCallbacks(mMoveSaverRunnable); layoutClockSaver(); mHandler.postDelayed(mMoveSaverRunnable, 250); } @Override public void onUserInteraction() { // We want the screen saver to exit upon user interaction. finish(); } private void setWakeLock() { Window win = getWindow(); WindowManager.LayoutParams winParams = win.getAttributes(); winParams.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; if (mPluggedIn) winParams.flags |= mFlags; else winParams.flags &= (~mFlags); win.setAttributes(winParams); } private void setClockStyle() { Utils.setClockStyle(this, mDigitalClock, mAnalogClock, SettingsActivity.KEY_CLOCK_STYLE); mSaverView = findViewById(R.id.main_clock); mClockStyle = (mSaverView == mDigitalClock ? Utils.CLOCK_TYPE_DIGITAL : Utils.CLOCK_TYPE_ANALOG); Utils.dimClockView(true, mSaverView); } private void layoutClockSaver() { setContentView(R.layout.desk_clock_saver); mDigitalClock = findViewById(R.id.digital_clock); mAnalogClock = findViewById(R.id.analog_clock); setClockStyle(); mContentView = (View) mSaverView.getParent(); mContentView.forceLayout(); mSaverView.forceLayout(); mSaverView.setAlpha(0); mMoveSaverRunnable.registerViews(mContentView, mSaverView); mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); Utils.updateDate(mDateFormat, mDateFormatForAccessibility,mContentView); Utils.refreshAlarm(ScreensaverActivity.this, mContentView); } }