BaseActivity.java revision bc885205d5c6d71a34bd06b8539b02d0b3b92d8c
1/*
2 * Copyright (C) 2015 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.ObjectAnimator;
20import android.content.BroadcastReceiver;
21import android.content.Context;
22import android.content.Intent;
23import android.content.IntentFilter;
24import android.graphics.drawable.ColorDrawable;
25import android.os.Bundle;
26import android.support.v7.app.AppCompatActivity;
27
28/**
29 * Base activity class that changes with window's background color dynamically based on the
30 * current hour.
31 */
32public class BaseActivity extends AppCompatActivity {
33
34    /**
35     * Key used to save/restore the current background color from the saved instance state.
36     */
37    private static final String KEY_BACKGROUND_COLOR = "background_color";
38
39    /**
40     * Duration in millis to animate changes to the background color.
41     */
42    private static final long BACKGROUND_COLOR_ANIMATION_DURATION = 3000L;
43
44    /**
45     * {@link BroadcastReceiver} to update the background color whenever the system time changes.
46     */
47    private BroadcastReceiver mOnTimeChangedReceiver;
48
49    /**
50     * {@link ColorDrawable} used to draw the window's background.
51     */
52    private ColorDrawable mBackground;
53
54    @Override
55    protected void onCreate(Bundle savedInstanceState) {
56        super.onCreate(savedInstanceState);
57
58        final int currentColor = Utils.getCurrentHourColor();
59        final int backgroundColor = savedInstanceState == null ? currentColor
60                : savedInstanceState.getInt(KEY_BACKGROUND_COLOR, currentColor);
61        setBackgroundColor(backgroundColor, false /* animate */);
62    }
63
64    @Override
65    protected void onResume() {
66        super.onResume();
67
68        // Register mOnTimeChangedReceiver to update current background color periodically.
69        if (mOnTimeChangedReceiver == null) {
70            final IntentFilter filter = new IntentFilter();
71            filter.addAction(Intent.ACTION_TIME_TICK);
72            filter.addAction(Intent.ACTION_TIME_CHANGED);
73            filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
74            registerReceiver(mOnTimeChangedReceiver = new BroadcastReceiver() {
75                @Override
76                public void onReceive(Context context, Intent intent) {
77                    setBackgroundColor(Utils.getCurrentHourColor(), true /* animate */);
78                }
79            }, filter);
80        }
81
82        // Ensure the background color is up-to-date.
83        setBackgroundColor(Utils.getCurrentHourColor(), true /* animate */);
84    }
85
86    @Override
87    protected void onPause() {
88        super.onPause();
89
90        // Stop updating the background color when not active.
91        if (mOnTimeChangedReceiver != null) {
92            unregisterReceiver(mOnTimeChangedReceiver);
93            mOnTimeChangedReceiver = null;
94        }
95    }
96
97    @Override
98    protected void onSaveInstanceState(Bundle outState) {
99        super.onSaveInstanceState(outState);
100
101        // Save the background color so we can animate the change when the activity is restored.
102        if (mBackground != null) {
103            outState.putInt(KEY_BACKGROUND_COLOR, mBackground.getColor());
104        }
105    }
106
107    /**
108     * Sets the current background color to the provided value and animates the change if desired.
109     *
110     * @param color the ARGB value to set as the current background color
111     * @param animate {@code true} if the change should be animated
112     */
113    protected void setBackgroundColor(int color, boolean animate) {
114        if (mBackground == null) {
115            mBackground = new ColorDrawable(color);
116            getWindow().setBackgroundDrawable(mBackground);
117        }
118
119        if (mBackground.getColor() != color) {
120            if (animate) {
121                ObjectAnimator.ofObject(mBackground, "color", AnimatorUtils.ARGB_EVALUATOR, color)
122                        .setDuration(BACKGROUND_COLOR_ANIMATION_DURATION)
123                        .start();
124            } else {
125                mBackground.setColor(color);
126            }
127        }
128    }
129}
130