1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2016 The Android Open Source Project 3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License. 6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at 7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and 14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License. 15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.incallui; 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.Context; 20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.graphics.Color; 21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.ColorInt; 22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.Nullable; 23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.v4.graphics.ColorUtils; 24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.telecom.PhoneAccount; 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.telecom.PhoneAccountHandle; 26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.telecom.TelecomManager; 27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.util.MaterialColorMapUtils; 28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette; 29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.incallui.call.DialerCall; 30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** 32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Calculates the background color for the in call window. The background color is based on the SIM 33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * and spam status. 34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class ThemeColorManager { 36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final MaterialColorMapUtils colorMap; 37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt private int primaryColor; 38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt private int secondaryColor; 39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt private int backgroundColorTop; 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt private int backgroundColorMiddle; 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt private int backgroundColorBottom; 42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt private int backgroundColorSolid; 43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * If there is no actual call currently in the call list, this will be used as a fallback to 46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * determine the theme color for InCallUI. 47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Nullable private PhoneAccountHandle pendingPhoneAccountHandle; 49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public ThemeColorManager(MaterialColorMapUtils colorMap) { 51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian this.colorMap = colorMap; 52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void setPendingPhoneAccountHandle(@Nullable PhoneAccountHandle pendingPhoneAccountHandle) { 55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian this.pendingPhoneAccountHandle = pendingPhoneAccountHandle; 56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onForegroundCallChanged(Context context, @Nullable DialerCall newForegroundCall) { 59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (newForegroundCall == null) { 60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian updateThemeColors(context, pendingPhoneAccountHandle, false); 61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else { 62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian updateThemeColors(context, newForegroundCall.getAccountHandle(), newForegroundCall.isSpam()); 63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private void updateThemeColors( 67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Context context, @Nullable PhoneAccountHandle handle, boolean isSpam) { 68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian MaterialPalette palette; 69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (isSpam) { 70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian palette = 71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian colorMap.calculatePrimaryAndSecondaryColor(R.color.incall_call_spam_background_color); 72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian backgroundColorTop = context.getColor(R.color.incall_background_gradient_spam_top); 73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian backgroundColorMiddle = context.getColor(R.color.incall_background_gradient_spam_middle); 74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian backgroundColorBottom = context.getColor(R.color.incall_background_gradient_spam_bottom); 75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian backgroundColorSolid = context.getColor(R.color.incall_background_multiwindow_spam); 76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else { 77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt int highlightColor = getHighlightColor(context, handle); 78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian palette = colorMap.calculatePrimaryAndSecondaryColor(highlightColor); 79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian backgroundColorTop = context.getColor(R.color.incall_background_gradient_top); 80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian backgroundColorMiddle = context.getColor(R.color.incall_background_gradient_middle); 81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian backgroundColorBottom = context.getColor(R.color.incall_background_gradient_bottom); 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian backgroundColorSolid = context.getColor(R.color.incall_background_multiwindow); 83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (highlightColor != PhoneAccount.NO_HIGHLIGHT_COLOR) { 84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // The default background gradient has a subtle alpha. We grab that alpha and apply it to 85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // the phone account color. 86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian backgroundColorTop = applyAlpha(palette.mPrimaryColor, backgroundColorTop); 87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian backgroundColorMiddle = applyAlpha(palette.mPrimaryColor, backgroundColorMiddle); 88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian backgroundColorBottom = applyAlpha(palette.mPrimaryColor, backgroundColorBottom); 89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian backgroundColorSolid = applyAlpha(palette.mPrimaryColor, backgroundColorSolid); 90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian primaryColor = palette.mPrimaryColor; 94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian secondaryColor = palette.mSecondaryColor; 95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt 98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static int getHighlightColor(Context context, @Nullable PhoneAccountHandle handle) { 99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (handle != null) { 100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian PhoneAccount account = context.getSystemService(TelecomManager.class).getPhoneAccount(handle); 101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (account != null) { 102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return account.getHighlightColor(); 103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return PhoneAccount.NO_HIGHLIGHT_COLOR; 106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt 109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public int getPrimaryColor() { 110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return primaryColor; 111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt 114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public int getSecondaryColor() { 115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return secondaryColor; 116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt 119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public int getBackgroundColorTop() { 120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return backgroundColorTop; 121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt 124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public int getBackgroundColorMiddle() { 125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return backgroundColorMiddle; 126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 127ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 128ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt 129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public int getBackgroundColorBottom() { 130ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return backgroundColorBottom; 131ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 132ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 133ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt 134ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public int getBackgroundColorSolid() { 135ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return backgroundColorSolid; 136ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 137ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 138ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @ColorInt 139ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static int applyAlpha(@ColorInt int color, @ColorInt int sourceColorWithAlpha) { 140ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return ColorUtils.setAlphaComponent(color, Color.alpha(sourceColorWithAlpha)); 141ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 142ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 143