summaryrefslogtreecommitdiffstats
path: root/packages/SystemUI/src/com/android/systemui/ViewInvertHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'packages/SystemUI/src/com/android/systemui/ViewInvertHelper.java')
-rw-r--r--packages/SystemUI/src/com/android/systemui/ViewInvertHelper.java101
1 files changed, 101 insertions, 0 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/ViewInvertHelper.java b/packages/SystemUI/src/com/android/systemui/ViewInvertHelper.java
new file mode 100644
index 0000000..2ff8f8a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/ViewInvertHelper.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2014 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.systemui;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
+import android.graphics.Paint;
+import android.view.View;
+import android.view.animation.AnimationUtils;
+import android.view.animation.Interpolator;
+
+import com.android.systemui.statusbar.phone.NotificationPanelView;
+
+/**
+ * Helper to invert the colors of views and fade between the states.
+ */
+public class ViewInvertHelper {
+
+ private final Paint mDarkPaint = new Paint();
+ private final Interpolator mLinearOutSlowInInterpolator;
+ private final View mTarget;
+ private final ColorMatrix mMatrix = new ColorMatrix();
+ private final ColorMatrix mGrayscaleMatrix = new ColorMatrix();
+ private final long mFadeDuration;
+
+ public ViewInvertHelper(View target, long fadeDuration) {
+ mTarget = target;
+ mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(mTarget.getContext(),
+ android.R.interpolator.linear_out_slow_in);
+ mFadeDuration = fadeDuration;
+ }
+
+ public void fade(final boolean invert, long delay) {
+ float startIntensity = invert ? 0f : 1f;
+ float endIntensity = invert ? 1f : 0f;
+ ValueAnimator animator = ValueAnimator.ofFloat(startIntensity, endIntensity);
+ animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ updateInvertPaint((Float) animation.getAnimatedValue());
+ mTarget.setLayerType(View.LAYER_TYPE_HARDWARE, mDarkPaint);
+ }
+ });
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (!invert) {
+ mTarget.setLayerType(View.LAYER_TYPE_NONE, null);
+ }
+ }
+ });
+ animator.setDuration(mFadeDuration);
+ animator.setInterpolator(mLinearOutSlowInInterpolator);
+ animator.setStartDelay(delay);
+ animator.start();
+ }
+
+ public void update(boolean invert) {
+ if (invert) {
+ updateInvertPaint(1f);
+ mTarget.setLayerType(View.LAYER_TYPE_HARDWARE, mDarkPaint);
+ } else {
+ mTarget.setLayerType(View.LAYER_TYPE_NONE, null);
+ }
+ }
+
+ public View getTarget() {
+ return mTarget;
+ }
+
+ private void updateInvertPaint(float intensity) {
+ float components = 1 - 2 * intensity;
+ final float[] invert = {
+ components, 0f, 0f, 0f, 255f * intensity,
+ 0f, components, 0f, 0f, 255f * intensity,
+ 0f, 0f, components, 0f, 255f * intensity,
+ 0f, 0f, 0f, 1f, 0f
+ };
+ mMatrix.set(invert);
+ mGrayscaleMatrix.setSaturation(1 - intensity);
+ mMatrix.preConcat(mGrayscaleMatrix);
+ mDarkPaint.setColorFilter(new ColorMatrixColorFilter(mMatrix));
+ }
+} \ No newline at end of file