14e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi/* 24e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * Copyright (C) 2014 The Android Open Source Project 34e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * 44e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 54e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * you may not use this file except in compliance with the License. 64e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * You may obtain a copy of the License at 74e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * 84e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 94e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * 104e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * Unless required by applicable law or agreed to in writing, software 114e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 124e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * See the License for the specific language governing permissions and 144e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * limitations under the License 154e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi */ 164e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi 170ffbda62e55ad390e05e6c3ff52e1378e420285cSelim Cinekpackage com.android.systemui.statusbar.notification; 184e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi 194e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.content.Context; 204e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.graphics.Color; 215d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinekimport android.graphics.Rect; 224ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinekimport android.service.notification.StatusBarNotification; 234e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.view.View; 244e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggiimport android.widget.ImageView; 2575fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinekimport android.widget.ProgressBar; 264ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinekimport android.widget.TextView; 274ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek 28fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinekimport com.android.systemui.statusbar.CrossFadeHelper; 297d1c63e66a2e19bf32249f52c56e563eae4c6819Selim Cinekimport com.android.systemui.statusbar.ExpandableNotificationRow; 300ffbda62e55ad390e05e6c3ff52e1378e420285cSelim Cinekimport com.android.systemui.statusbar.TransformableView; 31fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinekimport com.android.systemui.statusbar.ViewTransformationHelper; 3265b2e7c6cbcd41985ab007eec3a21aad75dfc983Selim Cinek 334e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi/** 344e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi * Wraps a notification view inflated from a template. 354e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi */ 369c7712d45ccec56a80873a83e56a83f810624b43Selim Cinekpublic class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapper { 374e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi 389c7712d45ccec56a80873a83e56a83f810624b43Selim Cinek private static final int mDarkProgressTint = 0xffffffff; 394e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi 40dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi protected ImageView mPicture; 4175fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek private ProgressBar mProgressBar; 424ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek private TextView mTitle; 434ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek private TextView mText; 44181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos private View mActionsContainer; 455d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek private View mReplyAction; 465d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek private Rect mTmpRect = new Rect(); 47181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos 48181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos private int mContentHeight; 49181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos private int mMinHeightHint; 5092df1f275831c23e3ed5b70d621a0c298e0bafeaJorim Jaggi 517bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos protected NotificationTemplateViewWrapper(Context ctx, View view, 527bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos ExpandableNotificationRow row) { 537d1c63e66a2e19bf32249f52c56e563eae4c6819Selim Cinek super(ctx, view, row); 54fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek mTransformationHelper.setCustomTransformation( 55fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek new ViewTransformationHelper.CustomTransformation() { 56fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek @Override 57fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek public boolean transformTo(TransformState ownState, 588f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek TransformableView notification, final float transformationAmount) { 59fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek if (!(notification instanceof HybridNotificationView)) { 60fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek return false; 61fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek } 62fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek TransformState otherState = notification.getCurrentState( 63fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek TRANSFORMING_VIEW_TITLE); 64b66685b0d08147641253aab0a95b9bd5edaa1549Selim Cinek final View text = ownState.getTransformedView(); 658f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek CrossFadeHelper.fadeOut(text, transformationAmount); 66fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek if (otherState != null) { 678f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek ownState.transformViewVerticalTo(otherState, this, 688f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek transformationAmount); 69fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek otherState.recycle(); 70fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek } 71fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek return true; 72fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek } 73fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek 74fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek @Override 758f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek public boolean customTransformTarget(TransformState ownState, 768f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek TransformState otherState) { 778f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek float endY = getTransformationY(ownState, otherState); 788f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek ownState.setTransformationEndY(endY); 798f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek return true; 808f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek } 818f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek 828f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek @Override 83fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek public boolean transformFrom(TransformState ownState, 848f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek TransformableView notification, float transformationAmount) { 85fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek if (!(notification instanceof HybridNotificationView)) { 86fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek return false; 87fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek } 88fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek TransformState otherState = notification.getCurrentState( 89fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek TRANSFORMING_VIEW_TITLE); 90b66685b0d08147641253aab0a95b9bd5edaa1549Selim Cinek final View text = ownState.getTransformedView(); 918f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek CrossFadeHelper.fadeIn(text, transformationAmount); 92fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek if (otherState != null) { 938f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek ownState.transformViewVerticalFrom(otherState, this, 948f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek transformationAmount); 95fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek otherState.recycle(); 96fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek } 97fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek return true; 98fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek } 998f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek 1008f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek @Override 1018f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek public boolean initTransformation(TransformState ownState, 1028f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek TransformState otherState) { 1038f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek float startY = getTransformationY(ownState, otherState); 1048f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek ownState.setTransformationStartY(startY); 1058f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek return true; 1068f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek } 1078f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek 1088f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek private float getTransformationY(TransformState ownState, 1098f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek TransformState otherState) { 1108f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek int[] otherStablePosition = otherState.getLaidOutLocationOnScreen(); 1118f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek int[] ownStablePosition = ownState.getLaidOutLocationOnScreen(); 1128f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek return (otherStablePosition[1] 1138f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek + otherState.getTransformedView().getHeight() 1148f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek - ownStablePosition[1]) * 0.33f; 1158f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek } 1168f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek 117fd3e2624b55a0988fc129c2fe0e2db4885eb87f9Selim Cinek }, TRANSFORMING_VIEW_TEXT); 118dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi } 119dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi 1204ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek private void resolveTemplateViews(StatusBarNotification notification) { 12165b2e7c6cbcd41985ab007eec3a21aad75dfc983Selim Cinek mPicture = (ImageView) mView.findViewById(com.android.internal.R.id.right_icon); 1220aac04ff79b43933742d5ebdd8d7a94751ff6309Adrian Roos if (mPicture != null) { 1230aac04ff79b43933742d5ebdd8d7a94751ff6309Adrian Roos mPicture.setTag(ImageTransformState.ICON_TAG, 1240aac04ff79b43933742d5ebdd8d7a94751ff6309Adrian Roos notification.getNotification().getLargeIcon()); 1250aac04ff79b43933742d5ebdd8d7a94751ff6309Adrian Roos } 1264ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek mTitle = (TextView) mView.findViewById(com.android.internal.R.id.title); 1274ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek mText = (TextView) mView.findViewById(com.android.internal.R.id.text); 12875fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek final View progress = mView.findViewById(com.android.internal.R.id.progress); 12975fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek if (progress instanceof ProgressBar) { 13075fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek mProgressBar = (ProgressBar) progress; 13175fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek } else { 13275fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek // It's still a viewstub 13375fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek mProgressBar = null; 13475fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek } 135181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos mActionsContainer = mView.findViewById(com.android.internal.R.id.actions_container); 1365d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek mReplyAction = mView.findViewById(com.android.internal.R.id.reply_icon_action); 1375d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek } 1385d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek 1395d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek @Override 1405d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek public boolean disallowSingleClick(float x, float y) { 1415d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek if (mReplyAction != null && mReplyAction.getVisibility() == View.VISIBLE) { 1425d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek if (isOnView(mReplyAction, x, y) || isOnView(mPicture, x, y)) { 1435d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek return true; 1445d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek } 1455d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek } 1465d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek return super.disallowSingleClick(x, y); 1475d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek } 1485d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek 1495d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek private boolean isOnView(View view, float x, float y) { 1505d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek View searchView = (View) view.getParent(); 1515d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek while (searchView != null && !(searchView instanceof ExpandableNotificationRow)) { 1525d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek searchView.getHitRect(mTmpRect); 1535d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek x -= mTmpRect.left; 1545d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek y -= mTmpRect.top; 1555d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek searchView = (View) searchView.getParent(); 1565d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek } 1575d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek view.getHitRect(mTmpRect); 1585d6ef8de1e2da541d1cf7c6603739289be4d593eSelim Cinek return mTmpRect.contains((int) x,(int) y); 1594ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek } 1604ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek 1614ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek @Override 162131f1a4bc491c07f0c3f643ac5b2551061799024Selim Cinek public void onContentUpdated(ExpandableNotificationRow row) { 163646d2054dd76d7213ced8a73f2352f0d63f20043Selim Cinek // Reinspect the notification. Before the super call, because the super call also updates 164646d2054dd76d7213ced8a73f2352f0d63f20043Selim Cinek // the transformation types and we need to have our values set by then. 165414ad33470789e9f9fc6c7b82ba684418ff5caa4Selim Cinek resolveTemplateViews(row.getStatusBarNotification()); 166131f1a4bc491c07f0c3f643ac5b2551061799024Selim Cinek super.onContentUpdated(row); 1674ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek } 1684ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek 1694ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek @Override 1704ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek protected void updateInvertHelper() { 1714ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek super.updateInvertHelper(); 1724ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek View mainColumn = mView.findViewById(com.android.internal.R.id.notification_main_column); 17375fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek if (mainColumn != null) { 1749c7712d45ccec56a80873a83e56a83f810624b43Selim Cinek mInvertHelper.addTarget(mainColumn); 1754e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi } 1764e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi } 1774e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi 1784e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi @Override 1794ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek protected void updateTransformedTypes() { 1804ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek // This also clears the existing types 1814ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek super.updateTransformedTypes(); 1824ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek if (mTitle != null) { 1837bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_TITLE, 1847bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos mTitle); 1854ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek } 1864ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek if (mText != null) { 1877bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_TEXT, 1887bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos mText); 1894ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek } 1904ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek if (mPicture != null) { 1917bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_IMAGE, 1927bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos mPicture); 1934ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek } 1944ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek if (mProgressBar != null) { 1957bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_PROGRESS, 1967bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos mProgressBar); 1974ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek } 198dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi } 199dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi 200dacc924a65d68e7888d8771baa14141329265ebfJorim Jaggi @Override 2014e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi public void setDark(boolean dark, boolean fade, long delay) { 202b88b98477ae725092c27dfe52f7fca3d4f29913eSelim Cinek if (dark == mDark && mDarkInitialized) { 20319ba7050c3aaf47f431d33341de7399df776f559Selim Cinek return; 20419ba7050c3aaf47f431d33341de7399df776f559Selim Cinek } 2059c7712d45ccec56a80873a83e56a83f810624b43Selim Cinek super.setDark(dark, fade, delay); 2067bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos setPictureDark(dark, fade, delay); 20775fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek setProgressBarDark(dark, fade, delay); 20875fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek } 20975fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek 21075fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek private void setProgressBarDark(boolean dark, boolean fade, long delay) { 21175fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek if (mProgressBar != null) { 21275fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek if (fade) { 21375fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek fadeProgressDark(mProgressBar, dark, delay); 21475fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek } else { 21575fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek updateProgressDark(mProgressBar, dark); 21675fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek } 21775fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek } 21875fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek } 21975fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek 22075fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek private void fadeProgressDark(final ProgressBar target, final boolean dark, long delay) { 2217bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos getDozer().startIntensityAnimation(animation -> { 2227bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos float t = (float) animation.getAnimatedValue(); 2237bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos updateProgressDark(target, t); 22475fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek }, dark, delay, null /* listener */); 22575fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek } 22675fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek 22775fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek private void updateProgressDark(ProgressBar target, float intensity) { 22875fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek int color = interpolateColor(mColor, mDarkProgressTint, intensity); 22975fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek target.getIndeterminateDrawable().mutate().setTint(color); 23075fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek target.getProgressDrawable().mutate().setTint(color); 23175fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek } 23275fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek 23375fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek private void updateProgressDark(ProgressBar target, boolean dark) { 23475fe38c51790df834df914fda2bb0f12b8c9eebbSelim Cinek updateProgressDark(target, dark ? 1f : 0f); 2354e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi } 2364e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi 2377bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos private void setPictureDark(boolean dark, boolean fade, long delay) { 2384e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi if (mPicture != null) { 2397bcf6d378f1bf1294ccd4c9beeb11bfd9b39816dAdrian Roos getDozer().setImageDark(mPicture, dark, fade, delay, true /* useGrayscale */); 2404e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi } 2414e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi } 2424e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi 2434e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi private static int interpolateColor(int source, int target, float t) { 2444e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi int aSource = Color.alpha(source); 2454e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi int rSource = Color.red(source); 2464e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi int gSource = Color.green(source); 2474e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi int bSource = Color.blue(source); 2484e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi int aTarget = Color.alpha(target); 2494e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi int rTarget = Color.red(target); 2504e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi int gTarget = Color.green(target); 2514e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi int bTarget = Color.blue(target); 2524e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi return Color.argb( 2534e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi (int) (aSource * (1f - t) + aTarget * t), 2544e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi (int) (rSource * (1f - t) + rTarget * t), 2554e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi (int) (gSource * (1f - t) + gTarget * t), 2564e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi (int) (bSource * (1f - t) + bTarget * t)); 2574e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi } 258181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos 259181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos @Override 260181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos public void setContentHeight(int contentHeight, int minHeightHint) { 261181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos super.setContentHeight(contentHeight, minHeightHint); 262181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos 263181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos mContentHeight = contentHeight; 264181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos mMinHeightHint = minHeightHint; 265181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos updateActionOffset(); 266181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos } 267181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos 268181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos private void updateActionOffset() { 269181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos if (mActionsContainer != null) { 270181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos // We should never push the actions higher than they are in the headsup view. 271181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos int constrainedContentHeight = Math.max(mContentHeight, mMinHeightHint); 272181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos mActionsContainer.setTranslationY(constrainedContentHeight - mView.getHeight()); 273181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos } 274181385ce33c83a249087a1cff65870dfe120aae8Adrian Roos } 2754e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi} 276