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