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