| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.incallui; |
| |
| import android.content.Context; |
| import android.graphics.Color; |
| import android.support.annotation.ColorInt; |
| import android.support.annotation.Nullable; |
| import android.support.v4.graphics.ColorUtils; |
| import android.telecom.PhoneAccount; |
| import android.telecom.PhoneAccountHandle; |
| import android.telecom.TelecomManager; |
| import com.android.contacts.common.util.MaterialColorMapUtils; |
| import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette; |
| import com.android.incallui.call.DialerCall; |
| |
| /** |
| * Calculates the background color for the in call window. The background color is based on the SIM |
| * and spam status. |
| */ |
| public class ThemeColorManager { |
| private final MaterialColorMapUtils colorMap; |
| @ColorInt private int primaryColor; |
| @ColorInt private int secondaryColor; |
| @ColorInt private int backgroundColorTop; |
| @ColorInt private int backgroundColorMiddle; |
| @ColorInt private int backgroundColorBottom; |
| @ColorInt private int backgroundColorSolid; |
| |
| /** |
| * If there is no actual call currently in the call list, this will be used as a fallback to |
| * determine the theme color for InCallUI. |
| */ |
| @Nullable private PhoneAccountHandle pendingPhoneAccountHandle; |
| |
| public ThemeColorManager(MaterialColorMapUtils colorMap) { |
| this.colorMap = colorMap; |
| } |
| |
| public void setPendingPhoneAccountHandle(@Nullable PhoneAccountHandle pendingPhoneAccountHandle) { |
| this.pendingPhoneAccountHandle = pendingPhoneAccountHandle; |
| } |
| |
| public void onForegroundCallChanged(Context context, @Nullable DialerCall newForegroundCall) { |
| if (newForegroundCall == null) { |
| updateThemeColors(context, getHighlightColor(context, pendingPhoneAccountHandle), false); |
| } else { |
| updateThemeColors( |
| context, |
| getHighlightColor(context, newForegroundCall.getAccountHandle()), |
| newForegroundCall.isSpam()); |
| } |
| } |
| |
| private void updateThemeColors(Context context, @ColorInt int highlightColor, boolean isSpam) { |
| MaterialPalette palette; |
| if (isSpam) { |
| palette = |
| colorMap.calculatePrimaryAndSecondaryColor(R.color.incall_call_spam_background_color); |
| backgroundColorTop = context.getColor(R.color.incall_background_gradient_spam_top); |
| backgroundColorMiddle = context.getColor(R.color.incall_background_gradient_spam_middle); |
| backgroundColorBottom = context.getColor(R.color.incall_background_gradient_spam_bottom); |
| backgroundColorSolid = context.getColor(R.color.incall_background_multiwindow_spam); |
| } else { |
| palette = colorMap.calculatePrimaryAndSecondaryColor(highlightColor); |
| backgroundColorTop = context.getColor(R.color.incall_background_gradient_top); |
| backgroundColorMiddle = context.getColor(R.color.incall_background_gradient_middle); |
| backgroundColorBottom = context.getColor(R.color.incall_background_gradient_bottom); |
| backgroundColorSolid = context.getColor(R.color.incall_background_multiwindow); |
| if (highlightColor != PhoneAccount.NO_HIGHLIGHT_COLOR) { |
| // The default background gradient has a subtle alpha. We grab that alpha and apply it to |
| // the phone account color. |
| backgroundColorTop = applyAlpha(palette.mPrimaryColor, backgroundColorTop); |
| backgroundColorMiddle = applyAlpha(palette.mPrimaryColor, backgroundColorMiddle); |
| backgroundColorBottom = applyAlpha(palette.mPrimaryColor, backgroundColorBottom); |
| backgroundColorSolid = applyAlpha(palette.mPrimaryColor, backgroundColorSolid); |
| } |
| } |
| |
| primaryColor = palette.mPrimaryColor; |
| secondaryColor = palette.mSecondaryColor; |
| } |
| |
| @ColorInt |
| private int getHighlightColor(Context context, @Nullable PhoneAccountHandle handle) { |
| if (handle != null) { |
| PhoneAccount account = context.getSystemService(TelecomManager.class).getPhoneAccount(handle); |
| if (account != null) { |
| return account.getHighlightColor(); |
| } |
| } |
| return PhoneAccount.NO_HIGHLIGHT_COLOR; |
| } |
| |
| @ColorInt |
| public int getPrimaryColor() { |
| return primaryColor; |
| } |
| |
| @ColorInt |
| public int getSecondaryColor() { |
| return secondaryColor; |
| } |
| |
| @ColorInt |
| public int getBackgroundColorTop() { |
| return backgroundColorTop; |
| } |
| |
| @ColorInt |
| public int getBackgroundColorMiddle() { |
| return backgroundColorMiddle; |
| } |
| |
| @ColorInt |
| public int getBackgroundColorBottom() { |
| return backgroundColorBottom; |
| } |
| |
| @ColorInt |
| public int getBackgroundColorSolid() { |
| return backgroundColorSolid; |
| } |
| |
| @ColorInt |
| private static int applyAlpha(@ColorInt int color, @ColorInt int sourceColorWithAlpha) { |
| return ColorUtils.setAlphaComponent(color, Color.alpha(sourceColorWithAlpha)); |
| } |
| } |