Home | History | Annotate | Download | only in deskclock
      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 
     17 package com.android.deskclock;
     18 
     19 import android.animation.Animator;
     20 import android.animation.AnimatorSet;
     21 import android.animation.ObjectAnimator;
     22 import android.animation.TimeInterpolator;
     23 import android.app.Activity;
     24 import android.app.AlarmManager;
     25 import android.app.PendingIntent;
     26 import android.app.UiModeManager;
     27 import android.content.BroadcastReceiver;
     28 import android.content.Context;
     29 import android.content.Intent;
     30 import android.content.IntentFilter;
     31 import android.content.SharedPreferences;
     32 import android.content.res.Configuration;
     33 import android.graphics.Color;
     34 import android.graphics.Paint;
     35 import android.graphics.PorterDuff;
     36 import android.graphics.PorterDuffColorFilter;
     37 import android.os.BatteryManager;
     38 import android.os.Bundle;
     39 import android.os.Handler;
     40 import android.preference.PreferenceManager;
     41 import android.provider.Settings;
     42 import android.service.dreams.DreamService;
     43 import android.text.TextUtils;
     44 import android.text.format.DateFormat;
     45 import android.util.Log;
     46 import android.view.View;
     47 import android.view.Window;
     48 import android.view.WindowManager;
     49 import android.view.animation.AccelerateInterpolator;
     50 import android.view.animation.DecelerateInterpolator;
     51 import android.widget.TextView;
     52 
     53 import com.android.deskclock.Utils.ScreensaverMoveSaverRunnable;
     54 
     55 import java.util.Calendar;
     56 
     57 public 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 final 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, mContentView);
     95             }
     96 
     97             if (changed) {
     98                 Utils.refreshAlarm(ScreensaverActivity.this, mContentView);
     99             }
    100 
    101         }
    102     };
    103 
    104     public ScreensaverActivity() {
    105         if (DEBUG) Log.d(TAG, "Screensaver allocated");
    106         mMoveSaverRunnable = new ScreensaverMoveSaverRunnable(mHandler);
    107     }
    108 
    109     @Override
    110     public void onStart() {
    111         super.onStart();
    112         IntentFilter filter = new IntentFilter();
    113         filter.addAction(Intent.ACTION_POWER_CONNECTED);
    114         filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
    115         filter.addAction(Intent.ACTION_USER_PRESENT);
    116         filter.addAction(Utils.ACTION_ON_QUARTER_HOUR);
    117         filter.addAction(Intent.ACTION_TIME_CHANGED);
    118         filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
    119         registerReceiver(mIntentReceiver, filter);
    120     }
    121 
    122     @Override
    123     public void onResume() {
    124         super.onResume();
    125         Intent chargingIntent =
    126                 registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    127         int plugged = chargingIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
    128         mPluggedIn = plugged == BatteryManager.BATTERY_PLUGGED_AC
    129                 || plugged == BatteryManager.BATTERY_PLUGGED_USB
    130                 || plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS;
    131 
    132         mDateFormat = getString(R.string.abbrev_wday_month_day_no_year);
    133         mDateFormatForAccessibility = getString(R.string.full_wday_month_day_no_year);
    134 
    135         setWakeLock();
    136         layoutClockSaver();
    137         mHandler.post(mMoveSaverRunnable);
    138 
    139         long alarmOnQuarterHour = Utils.getAlarmOnQuarterHour();
    140         mQuarterlyIntent = PendingIntent.getBroadcast(
    141                 this, 0, new Intent(Utils.ACTION_ON_QUARTER_HOUR), 0);
    142         ((AlarmManager) getSystemService(Context.ALARM_SERVICE)).setRepeating(
    143                 AlarmManager.RTC, alarmOnQuarterHour, AlarmManager.INTERVAL_FIFTEEN_MINUTES,
    144                 mQuarterlyIntent);
    145     }
    146 
    147     @Override
    148     public void onPause() {
    149         mHandler.removeCallbacks(mMoveSaverRunnable);
    150         ((AlarmManager) getSystemService(Context.ALARM_SERVICE)).cancel(mQuarterlyIntent);
    151         finish();
    152         super.onPause();
    153     }
    154 
    155     @Override
    156     public void onStop() {
    157         unregisterReceiver(mIntentReceiver);
    158         super.onStop();
    159    }
    160 
    161     @Override
    162     public void onConfigurationChanged(Configuration newConfig) {
    163         if (DEBUG) Log.d(TAG, "Screensaver configuration changed");
    164         super.onConfigurationChanged(newConfig);
    165         mHandler.removeCallbacks(mMoveSaverRunnable);
    166         layoutClockSaver();
    167         mHandler.postDelayed(mMoveSaverRunnable, 250);
    168     }
    169 
    170     @Override
    171     public void onUserInteraction() {
    172         // We want the screen saver to exit upon user interaction.
    173         finish();
    174     }
    175 
    176     private void setWakeLock() {
    177         Window win = getWindow();
    178         WindowManager.LayoutParams winParams = win.getAttributes();
    179         winParams.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
    180         if (mPluggedIn)
    181             winParams.flags |= mFlags;
    182         else
    183             winParams.flags &= (~mFlags);
    184         win.setAttributes(winParams);
    185     }
    186 
    187     private void setClockStyle() {
    188         Utils.setClockStyle(this, mDigitalClock, mAnalogClock,
    189                 SettingsActivity.KEY_CLOCK_STYLE);
    190         mSaverView = findViewById(R.id.main_clock);
    191         mClockStyle = (mSaverView == mDigitalClock ?
    192                 Utils.CLOCK_TYPE_DIGITAL : Utils.CLOCK_TYPE_ANALOG);
    193         Utils.dimClockView(true, mSaverView);
    194     }
    195 
    196     private void layoutClockSaver() {
    197         setContentView(R.layout.desk_clock_saver);
    198         mDigitalClock = findViewById(R.id.digital_clock);
    199         mAnalogClock = findViewById(R.id.analog_clock);
    200         setClockStyle();
    201         mContentView = (View) mSaverView.getParent();
    202         mContentView.forceLayout();
    203         mSaverView.forceLayout();
    204         mSaverView.setAlpha(0);
    205 
    206         mMoveSaverRunnable.registerViews(mContentView, mSaverView);
    207 
    208         mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
    209                 | View.SYSTEM_UI_FLAG_FULLSCREEN
    210                 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    211 
    212         Utils.updateDate(mDateFormat, mDateFormatForAccessibility,mContentView);
    213         Utils.refreshAlarm(ScreensaverActivity.this, mContentView);
    214     }
    215 
    216 }
    217