129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung/* 229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * Copyright (C) 2010 The Android Open Source Project 329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * 429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * Licensed under the Apache License, Version 2.0 (the "License"); 529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * you may not use this file except in compliance with the License. 629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * You may obtain a copy of the License at 729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * 829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * http://www.apache.org/licenses/LICENSE-2.0 929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * 1029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * Unless required by applicable law or agreed to in writing, software 1129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * distributed under the License is distributed on an "AS IS" BASIS, 1229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * See the License for the specific language governing permissions and 1429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * limitations under the License. 1529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung */ 1629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 1729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungpackage com.android.launcher2; 1829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 1959e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chungimport android.animation.ObjectAnimator; 2029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.appwidget.AppWidgetProviderInfo; 2129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.content.Context; 2229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.content.pm.PackageManager; 2329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.content.pm.ResolveInfo; 2459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chungimport android.content.res.Resources; 2529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.graphics.Bitmap; 2629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.graphics.Canvas; 2729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.graphics.Paint; 281908d07151e0d3f82899f368874e41ed1e49ba16Winson Chungimport android.graphics.RectF; 2929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.util.AttributeSet; 3097d85d23b013347bead4e2f5fa430a79ce69431eWinson Chungimport android.view.KeyEvent; 3129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.view.MotionEvent; 3259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chungimport android.widget.Checkable; 3329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.ImageView; 3429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.LinearLayout; 3529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.TextView; 3629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 3729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport com.android.launcher.R; 3829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 3929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung/** 4029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * The linear layout used strictly for the widget/wallpaper tab of the customization tray 4129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung */ 4259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chungpublic class PagedViewWidget extends LinearLayout implements Checkable { 4329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung static final String TAG = "PagedViewWidgetLayout"; 4429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 45141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka private static boolean sDeletePreviewsWhenDetachedFromWindow = true; 46e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung 4729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung private final Paint mPaint = new Paint(); 4829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung private Bitmap mHolographicOutline; 49b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung private HolographicOutlineHelper mHolographicOutlineHelper; 501908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung private ImageView mPreviewImageView; 511908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung private final RectF mTmpScaleRect = new RectF(); 5229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 5363257c110a4ee54d5e8872c471cce254cf613c7aWinson Chung private String mDimensionsFormatString; 540499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung 5529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung private int mAlpha = 255; 5629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung private int mHolographicAlpha; 5729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 5859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung private boolean mIsChecked; 5959e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung private ObjectAnimator mCheckedAlphaAnimator; 6059e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung private float mCheckedAlpha = 1.0f; 6159e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung private int mCheckedFadeInDuration; 6259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung private int mCheckedFadeOutDuration; 6359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 6429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public PagedViewWidget(Context context) { 6529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung this(context, null); 6629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 6729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 6829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public PagedViewWidget(Context context, AttributeSet attrs) { 6929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung this(context, attrs, 0); 7029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 7129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 7229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public PagedViewWidget(Context context, AttributeSet attrs, int defStyle) { 7329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung super(context, attrs, defStyle); 7429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 7559e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung // Set up fade in/out constants 7659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung final Resources r = context.getResources(); 77785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung final int alpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha); 7859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung if (alpha > 0) { 79785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mCheckedAlpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha) / 256.0f; 80785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mCheckedFadeInDuration = 81785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung r.getInteger(R.integer.config_dragAppsCustomizeIconFadeInDuration); 82785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mCheckedFadeOutDuration = 83785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung r.getInteger(R.integer.config_dragAppsCustomizeIconFadeOutDuration); 8459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 8563257c110a4ee54d5e8872c471cce254cf613c7aWinson Chung mDimensionsFormatString = r.getString(R.string.widget_dims_format); 8659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 8729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung setWillNotDraw(false); 8829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung setClipToPadding(false); 8929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 9029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 91141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka public static void setDeletePreviewsWhenDetachedFromWindow(boolean value) { 92141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka sDeletePreviewsWhenDetachedFromWindow = value; 93141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka } 94141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka 95099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung @Override 96099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung protected void onDetachedFromWindow() { 97099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung super.onDetachedFromWindow(); 98099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung 99141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka if (sDeletePreviewsWhenDetachedFromWindow) { 100141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka final ImageView image = (ImageView) findViewById(R.id.widget_preview); 101141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka if (image != null) { 102141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka FastBitmapDrawable preview = (FastBitmapDrawable) image.getDrawable(); 103141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka if (preview != null && preview.getBitmap() != null) { 104141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka preview.getBitmap().recycle(); 105141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka } 106141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka image.setImageDrawable(null); 107141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka } 108099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung } 109099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung } 110099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung 11129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public void applyFromAppWidgetProviderInfo(AppWidgetProviderInfo info, 112e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung int maxWidth, int[] cellSpan, HolographicOutlineHelper holoOutlineHelper) { 113b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung mHolographicOutlineHelper = holoOutlineHelper; 11429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung final ImageView image = (ImageView) findViewById(R.id.widget_preview); 1154b576be59e58072cc03b5a8d36afb6a322513575Winson Chung if (maxWidth > -1) { 1164b576be59e58072cc03b5a8d36afb6a322513575Winson Chung image.setMaxWidth(maxWidth); 1174b576be59e58072cc03b5a8d36afb6a322513575Winson Chung } 1186a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung image.setContentDescription(info.label); 1191908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung mPreviewImageView = image; 12029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung final TextView name = (TextView) findViewById(R.id.widget_name); 12129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung name.setText(info.label); 12229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung final TextView dims = (TextView) findViewById(R.id.widget_dims); 12335d4a257cff6ff69232f10c8dc405df8044eab1fWinson Chung if (dims != null) { 12435d4a257cff6ff69232f10c8dc405df8044eab1fWinson Chung dims.setText(String.format(mDimensionsFormatString, cellSpan[0], cellSpan[1])); 12535d4a257cff6ff69232f10c8dc405df8044eab1fWinson Chung } 12629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 12729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 1281ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung public void applyFromResolveInfo(PackageManager pm, ResolveInfo info, 129e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung HolographicOutlineHelper holoOutlineHelper) { 130b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung mHolographicOutlineHelper = holoOutlineHelper; 1316a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung CharSequence label = info.loadLabel(pm); 1321ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung final ImageView image = (ImageView) findViewById(R.id.widget_preview); 1336a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung image.setContentDescription(label); 1341ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung mPreviewImageView = image; 1351ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung final TextView name = (TextView) findViewById(R.id.widget_name); 1366a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung name.setText(label); 1371ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung final TextView dims = (TextView) findViewById(R.id.widget_dims); 13846af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung if (dims != null) { 13946af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung dims.setText(String.format(mDimensionsFormatString, 1, 1)); 14046af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung } 141b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung } 1420499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung 143038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka public int[] getPreviewSize() { 144038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka final ImageView i = (ImageView) findViewById(R.id.widget_preview); 145038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka int[] maxSize = new int[2]; 146038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka maxSize[0] = i.getWidth() - i.getPaddingLeft() - i.getPaddingRight(); 147038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka maxSize[1] = i.getHeight() - i.getPaddingBottom() - i.getPaddingTop(); 148038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka return maxSize; 149038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka } 150038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka 151038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka void applyPreview(FastBitmapDrawable preview, int index) { 15281efbad05e0ce69b06d7323749ef2e200b84b98eMichael Jurka final PagedViewWidgetImageView image = 15381efbad05e0ce69b06d7323749ef2e200b84b98eMichael Jurka (PagedViewWidgetImageView) findViewById(R.id.widget_preview); 154e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung if (preview != null) { 15581efbad05e0ce69b06d7323749ef2e200b84b98eMichael Jurka image.mAllowRequestLayout = false; 156e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung image.setImageDrawable(preview); 15768e4c64a67f4a40afac4cab44def461783f096a4Winson Chung image.setAlpha(1f); 15881efbad05e0ce69b06d7323749ef2e200b84b98eMichael Jurka image.mAllowRequestLayout = true; 159e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung } 160e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung } 161e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung 162b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung public void setHolographicOutline(Bitmap holoOutline) { 163b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung mHolographicOutline = holoOutline; 164b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung invalidate(); 16529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 16629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 16729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 16829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public boolean onTouchEvent(MotionEvent event) { 16929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // We eat up the touch events here, since the PagedView (which uses the same swiping 17029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // touch code as Workspace previously) uses onInterceptTouchEvent() to determine when 17129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // the user is scrolling between pages. This means that if the pages themselves don't 17229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // handle touch events, it gets forwarded up to PagedView itself, and it's own 17329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // onTouchEvent() handling will prevent further intercept touch events from being called 17429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // (it's the same view in that case). This is not ideal, but to prevent more changes, 17529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // we just always mark the touch event as handled. 17629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung return super.onTouchEvent(event) || true; 17729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 17829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 17929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 18029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung protected void onDraw(Canvas canvas) { 18129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung if (mAlpha > 0) { 18229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung super.onDraw(canvas); 18329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 18429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 18529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // draw any blended overlays 18629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung if (mHolographicOutline != null && mHolographicAlpha > 0) { 1871908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung // Calculate how much to scale the holographic preview 1881908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung mTmpScaleRect.set(0,0,1,1); 1891908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung mPreviewImageView.getImageMatrix().mapRect(mTmpScaleRect); 1901908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung 19129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung mPaint.setAlpha(mHolographicAlpha); 1921908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung canvas.save(); 1931908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung canvas.scale(mTmpScaleRect.right, mTmpScaleRect.bottom); 194fd3385fe9e0f034b04f99d5d59a58d74fe040da4Winson Chung canvas.drawBitmap(mHolographicOutline, mPreviewImageView.getLeft(), 195fd3385fe9e0f034b04f99d5d59a58d74fe040da4Winson Chung mPreviewImageView.getTop(), mPaint); 1961908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung canvas.restore(); 19729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 19829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 19929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 20029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 20129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung protected boolean onSetAlpha(int alpha) { 20229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung return true; 20329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 20429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 205b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung private void setChildrenAlpha(float alpha) { 206b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung final int childCount = getChildCount(); 207b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung for (int i = 0; i < childCount; i++) { 208b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung getChildAt(i).setAlpha(alpha); 209b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung } 210b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung } 21129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 21229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public void setAlpha(float alpha) { 213b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung final float viewAlpha = mHolographicOutlineHelper.viewAlphaInterpolator(alpha); 214b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung final float holographicAlpha = mHolographicOutlineHelper.highlightAlphaInterpolator(alpha); 21529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung int newViewAlpha = (int) (viewAlpha * 255); 21629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung int newHolographicAlpha = (int) (holographicAlpha * 255); 21729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung if ((mAlpha != newViewAlpha) || (mHolographicAlpha != newHolographicAlpha)) { 21829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung mAlpha = newViewAlpha; 21929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung mHolographicAlpha = newHolographicAlpha; 22029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung setChildrenAlpha(viewAlpha); 22129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung super.setAlpha(viewAlpha); 22229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 22329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 22429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 2255f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy void setChecked(boolean checked, boolean animate) { 22659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung if (mIsChecked != checked) { 22759e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung mIsChecked = checked; 22859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 22959e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung float alpha; 23059e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung int duration; 23159e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung if (mIsChecked) { 23259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung alpha = mCheckedAlpha; 23359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung duration = mCheckedFadeInDuration; 23459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } else { 23559e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung alpha = 1.0f; 23659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung duration = mCheckedFadeOutDuration; 23759e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 23859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 23959e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung // Initialize the animator 24059e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung if (mCheckedAlphaAnimator != null) { 24159e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung mCheckedAlphaAnimator.cancel(); 24259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 2435f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy if (animate) { 2445f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha); 2455f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy mCheckedAlphaAnimator.setDuration(duration); 2465f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy mCheckedAlphaAnimator.start(); 2475f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy } else { 2485f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy setAlpha(alpha); 2495f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy } 25059e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 25159e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung invalidate(); 25259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 25359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 25459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 25559e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung @Override 2565f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy public void setChecked(boolean checked) { 2575f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy setChecked(checked, true); 2585f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy } 2595f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy 2605f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy @Override 26159e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung public boolean isChecked() { 26259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung return mIsChecked; 26359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 26459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 26559e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung @Override 26659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung public void toggle() { 26759e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung setChecked(!mIsChecked); 26859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 26929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung} 270