Home | History | Annotate | Download | only in notification
      1 /*
      2  * Copyright (C) 2014 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.systemui.statusbar.notification;
     18 
     19 import android.animation.Animator;
     20 import android.animation.AnimatorListenerAdapter;
     21 import android.animation.ValueAnimator;
     22 import android.graphics.Color;
     23 import android.graphics.ColorMatrixColorFilter;
     24 import android.graphics.Paint;
     25 import android.graphics.drawable.ColorDrawable;
     26 import android.graphics.drawable.Drawable;
     27 import android.service.notification.StatusBarNotification;
     28 import android.support.v4.graphics.ColorUtils;
     29 import android.view.View;
     30 
     31 import com.android.systemui.R;
     32 import com.android.systemui.ViewInvertHelper;
     33 import com.android.systemui.statusbar.ExpandableNotificationRow;
     34 import com.android.systemui.statusbar.phone.NotificationPanelView;
     35 
     36 /**
     37  * Wraps a notification containing a custom view.
     38  */
     39 public class NotificationCustomViewWrapper extends NotificationViewWrapper {
     40 
     41     private final ViewInvertHelper mInvertHelper;
     42     private final Paint mGreyPaint = new Paint();
     43     private int mBackgroundColor = 0;
     44     private static final int CUSTOM_BACKGROUND_TAG = R.id.custom_background_color;
     45     private boolean mShouldInvertDark;
     46     private boolean mShowingLegacyBackground;
     47 
     48     protected NotificationCustomViewWrapper(View view, ExpandableNotificationRow row) {
     49         super(view, row);
     50         mInvertHelper = new ViewInvertHelper(view, NotificationPanelView.DOZE_ANIMATION_DURATION);
     51     }
     52 
     53     @Override
     54     public void setDark(boolean dark, boolean fade, long delay) {
     55         if (dark == mDark && mDarkInitialized) {
     56             return;
     57         }
     58         super.setDark(dark, fade, delay);
     59         if (!mShowingLegacyBackground && mShouldInvertDark) {
     60             if (fade) {
     61                 mInvertHelper.fade(dark, delay);
     62             } else {
     63                 mInvertHelper.update(dark);
     64             }
     65         } else {
     66             mView.setLayerType(dark ? View.LAYER_TYPE_HARDWARE : View.LAYER_TYPE_NONE, null);
     67             if (fade) {
     68                 fadeGrayscale(dark, delay);
     69             } else {
     70                 updateGrayscale(dark);
     71             }
     72         }
     73     }
     74 
     75     protected void fadeGrayscale(final boolean dark, long delay) {
     76         startIntensityAnimation(new ValueAnimator.AnimatorUpdateListener() {
     77             @Override
     78             public void onAnimationUpdate(ValueAnimator animation) {
     79                 updateGrayscaleMatrix((float) animation.getAnimatedValue());
     80                 mGreyPaint.setColorFilter(new ColorMatrixColorFilter(mGrayscaleColorMatrix));
     81                 mView.setLayerPaint(mGreyPaint);
     82             }
     83         }, dark, delay, new AnimatorListenerAdapter() {
     84             @Override
     85             public void onAnimationEnd(Animator animation) {
     86                 if (!dark) {
     87                     mView.setLayerType(View.LAYER_TYPE_NONE, null);
     88                 }
     89             }
     90         });
     91     }
     92 
     93     protected void updateGrayscale(boolean dark) {
     94         if (dark) {
     95             updateGrayscaleMatrix(1f);
     96             mGreyPaint.setColorFilter(
     97                     new ColorMatrixColorFilter(mGrayscaleColorMatrix));
     98             mView.setLayerPaint(mGreyPaint);
     99         }
    100     }
    101 
    102     @Override
    103     public void setVisible(boolean visible) {
    104         super.setVisible(visible);
    105         mView.setAlpha(visible ? 1.0f : 0.0f);
    106     }
    107 
    108     @Override
    109     public void notifyContentUpdated(StatusBarNotification notification) {
    110         super.notifyContentUpdated(notification);
    111         Drawable background = mView.getBackground();
    112         mBackgroundColor = 0;
    113         if (background instanceof ColorDrawable) {
    114             mBackgroundColor = ((ColorDrawable) background).getColor();
    115             mView.setBackground(null);
    116             mView.setTag(CUSTOM_BACKGROUND_TAG, mBackgroundColor);
    117         } else if (mView.getTag(CUSTOM_BACKGROUND_TAG) != null) {
    118             mBackgroundColor = (int) mView.getTag(CUSTOM_BACKGROUND_TAG);
    119         }
    120         mShouldInvertDark = mBackgroundColor == 0 || isColorLight(mBackgroundColor);
    121     }
    122 
    123     private boolean isColorLight(int backgroundColor) {
    124         return Color.alpha(backgroundColor) == 0
    125                 || ColorUtils.calculateLuminance(backgroundColor) > 0.5;
    126     }
    127 
    128     @Override
    129     public int getCustomBackgroundColor() {
    130         // Parent notifications should always use the normal background color
    131         return mRow.isSummaryWithChildren() ? 0 : mBackgroundColor;
    132     }
    133 
    134     @Override
    135     public void setShowingLegacyBackground(boolean showing) {
    136         super.setShowingLegacyBackground(showing);
    137         mShowingLegacyBackground = showing;
    138     }
    139 }
    140