11799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen/*
21799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen * Copyright (C) 2015 The Android Open Source Project
31799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen *
41799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen * Licensed under the Apache License, Version 2.0 (the "License");
51799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen * you may not use this file except in compliance with the License.
61799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen * You may obtain a copy of the License at
71799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen *
81799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen *   http://www.apache.org/licenses/LICENSE-2.0
91799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen *
101799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen * Unless required by applicable law or agreed to in writing, software
111799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen * distributed under the License is distributed on an "AS IS" BASIS,
121799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen * See the License for the specific language governing permissions and
141799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen * limitations under the License.
151799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen */
161799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
171799dca790bfb9995f779da181c84cac47ee1468Justin Klaassenpackage com.android.deskclock;
181799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
191799dca790bfb9995f779da181c84cac47ee1468Justin Klaassenimport android.animation.ObjectAnimator;
207b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassenimport android.content.BroadcastReceiver;
217b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassenimport android.content.Context;
227b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassenimport android.content.Intent;
237b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassenimport android.content.IntentFilter;
241799dca790bfb9995f779da181c84cac47ee1468Justin Klaassenimport android.graphics.drawable.ColorDrawable;
251799dca790bfb9995f779da181c84cac47ee1468Justin Klaassenimport android.os.Bundle;
261799dca790bfb9995f779da181c84cac47ee1468Justin Klaassenimport android.support.v7.app.AppCompatActivity;
271799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
281799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen/**
291799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen * Base activity class that changes with window's background color dynamically based on the
301799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen * current hour.
311799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen */
321799dca790bfb9995f779da181c84cac47ee1468Justin Klaassenpublic class BaseActivity extends AppCompatActivity {
331799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
341799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    /**
351799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen     * Key used to save/restore the current background color from the saved instance state.
361799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen     */
371799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    private static final String KEY_BACKGROUND_COLOR = "background_color";
381799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
391799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    /**
401799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen     * Duration in millis to animate changes to the background color.
411799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen     */
421799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    private static final long BACKGROUND_COLOR_ANIMATION_DURATION = 3000L;
431799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
441799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    /**
457b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassen     * {@link BroadcastReceiver} to update the background color whenever the system time changes.
461799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen     */
47bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen    private BroadcastReceiver mOnTimeChangedReceiver;
481799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
491799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    /**
501799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen     * {@link ColorDrawable} used to draw the window's background.
511799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen     */
521799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    private ColorDrawable mBackground;
531799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
541799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    @Override
551799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    protected void onCreate(Bundle savedInstanceState) {
561799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen        super.onCreate(savedInstanceState);
571799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
587b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassen        final int currentColor = Utils.getCurrentHourColor();
597b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassen        final int backgroundColor = savedInstanceState == null ? currentColor
607b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassen                : savedInstanceState.getInt(KEY_BACKGROUND_COLOR, currentColor);
611799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen        setBackgroundColor(backgroundColor, false /* animate */);
621799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    }
631799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
641799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    @Override
651799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    protected void onResume() {
661799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen        super.onResume();
671799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
68bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen        // Register mOnTimeChangedReceiver to update current background color periodically.
69bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen        if (mOnTimeChangedReceiver == null) {
70bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen            final IntentFilter filter = new IntentFilter();
71bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen            filter.addAction(Intent.ACTION_TIME_TICK);
72bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen            filter.addAction(Intent.ACTION_TIME_CHANGED);
73bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen            filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
74bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen            registerReceiver(mOnTimeChangedReceiver = new BroadcastReceiver() {
75bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen                @Override
76bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen                public void onReceive(Context context, Intent intent) {
77bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen                    setBackgroundColor(Utils.getCurrentHourColor(), true /* animate */);
78bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen                }
79bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen            }, filter);
80bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen        }
817b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassen
827b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassen        // Ensure the background color is up-to-date.
837b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassen        setBackgroundColor(Utils.getCurrentHourColor(), true /* animate */);
841799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    }
851799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
861799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    @Override
871799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    protected void onPause() {
881799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen        super.onPause();
891799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
901799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen        // Stop updating the background color when not active.
91bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen        if (mOnTimeChangedReceiver != null) {
92bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen            unregisterReceiver(mOnTimeChangedReceiver);
93bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen            mOnTimeChangedReceiver = null;
94bc885205d5c6d71a34bd06b8539b02d0b3b92d8cJustin Klaassen        }
951799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    }
961799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
971799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    @Override
981799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    protected void onSaveInstanceState(Bundle outState) {
991799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen        super.onSaveInstanceState(outState);
1001799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
1011799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen        // Save the background color so we can animate the change when the activity is restored.
1027b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassen        if (mBackground != null) {
1037b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassen            outState.putInt(KEY_BACKGROUND_COLOR, mBackground.getColor());
1047b5c5b16646932fbe991c86ffd9404cdbdc0f84fJustin Klaassen        }
1051799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    }
1061799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
1071799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    /**
1081799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen     * Sets the current background color to the provided value and animates the change if desired.
1091799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen     *
1101799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen     * @param color the ARGB value to set as the current background color
1111799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen     * @param animate {@code true} if the change should be animated
1121799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen     */
1131799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    protected void setBackgroundColor(int color, boolean animate) {
1141799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen        if (mBackground == null) {
1151799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen            mBackground = new ColorDrawable(color);
1161799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen            getWindow().setBackgroundDrawable(mBackground);
1171799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen        }
1181799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen
1191799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen        if (mBackground.getColor() != color) {
1201799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen            if (animate) {
1211799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen                ObjectAnimator.ofObject(mBackground, "color", AnimatorUtils.ARGB_EVALUATOR, color)
1221799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen                        .setDuration(BACKGROUND_COLOR_ANIMATION_DURATION)
1231799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen                        .start();
1241799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen            } else {
1251799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen                mBackground.setColor(color);
1261799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen            }
1271799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen        }
1281799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen    }
1291799dca790bfb9995f779da181c84cac47ee1468Justin Klaassen}
130