PagedViewWidget.java revision 6a0f57dfafced837a2a282d8feec28d5418be3b9
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.content.res.TypedArray; 2629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.graphics.Bitmap; 2729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.graphics.Canvas; 2829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.graphics.Color; 2929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.graphics.Paint; 301908d07151e0d3f82899f368874e41ed1e49ba16Winson Chungimport android.graphics.PorterDuff; 31c3f9f4fcbd3fba3753335d5c9671c0893393b164Winson Chungimport android.graphics.PorterDuff.Mode; 321908d07151e0d3f82899f368874e41ed1e49ba16Winson Chungimport android.graphics.PorterDuffXfermode; 331908d07151e0d3f82899f368874e41ed1e49ba16Winson Chungimport android.graphics.Rect; 341908d07151e0d3f82899f368874e41ed1e49ba16Winson Chungimport android.graphics.RectF; 3529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.os.Handler; 3629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.os.HandlerThread; 3729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.os.Message; 3829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.util.AttributeSet; 3997d85d23b013347bead4e2f5fa430a79ce69431eWinson Chungimport android.view.KeyEvent; 4029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.view.MotionEvent; 413e6882c3fe0a11941fbb3b78cea5aceb82f16319Winson Chungimport android.view.View; 4259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chungimport android.widget.Checkable; 4329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.ImageView; 4429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.LinearLayout; 4529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.TextView; 4629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 4729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport com.android.launcher.R; 4829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 4929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung/** 5029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * The linear layout used strictly for the widget/wallpaper tab of the customization tray 5129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung */ 5259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chungpublic class PagedViewWidget extends LinearLayout implements Checkable { 5329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung static final String TAG = "PagedViewWidgetLayout"; 5429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 5529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung private final Paint mPaint = new Paint(); 5629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung private Bitmap mHolographicOutline; 57b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung private HolographicOutlineHelper mHolographicOutlineHelper; 581908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung private ImageView mPreviewImageView; 591908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung private final RectF mTmpScaleRect = new RectF(); 6029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 6163257c110a4ee54d5e8872c471cce254cf613c7aWinson Chung private String mDimensionsFormatString; 620499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung 6329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung private int mAlpha = 255; 6429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung private int mHolographicAlpha; 6529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 6659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung private boolean mIsChecked; 6759e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung private ObjectAnimator mCheckedAlphaAnimator; 6859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung private float mCheckedAlpha = 1.0f; 6959e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung private int mCheckedFadeInDuration; 7059e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung private int mCheckedFadeOutDuration; 7159e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 7229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public PagedViewWidget(Context context) { 7329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung this(context, null); 7429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 7529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 7629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public PagedViewWidget(Context context, AttributeSet attrs) { 7729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung this(context, attrs, 0); 7829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 7929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 8029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public PagedViewWidget(Context context, AttributeSet attrs, int defStyle) { 8129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung super(context, attrs, defStyle); 8229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 8359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung // Set up fade in/out constants 8459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung final Resources r = context.getResources(); 85785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung final int alpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha); 8659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung if (alpha > 0) { 87785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mCheckedAlpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha) / 256.0f; 88785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mCheckedFadeInDuration = 89785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung r.getInteger(R.integer.config_dragAppsCustomizeIconFadeInDuration); 90785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mCheckedFadeOutDuration = 91785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung r.getInteger(R.integer.config_dragAppsCustomizeIconFadeOutDuration); 9259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 9363257c110a4ee54d5e8872c471cce254cf613c7aWinson Chung mDimensionsFormatString = r.getString(R.string.widget_dims_format); 9459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 9529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung setWillNotDraw(false); 9629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung setClipToPadding(false); 9729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 9829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 9929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public void applyFromAppWidgetProviderInfo(AppWidgetProviderInfo info, 1000499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung FastBitmapDrawable preview, int maxWidth, int[] cellSpan, 101b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung HolographicOutlineHelper holoOutlineHelper) { 102b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung mHolographicOutlineHelper = holoOutlineHelper; 10329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung final ImageView image = (ImageView) findViewById(R.id.widget_preview); 1044b576be59e58072cc03b5a8d36afb6a322513575Winson Chung if (maxWidth > -1) { 1054b576be59e58072cc03b5a8d36afb6a322513575Winson Chung image.setMaxWidth(maxWidth); 1064b576be59e58072cc03b5a8d36afb6a322513575Winson Chung } 10729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung image.setImageDrawable(preview); 1086a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung image.setContentDescription(info.label); 1091908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung mPreviewImageView = image; 11029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung final TextView name = (TextView) findViewById(R.id.widget_name); 11129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung name.setText(info.label); 1123e6882c3fe0a11941fbb3b78cea5aceb82f16319Winson Chung name.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 11329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung final TextView dims = (TextView) findViewById(R.id.widget_dims); 11463257c110a4ee54d5e8872c471cce254cf613c7aWinson Chung dims.setText(String.format(mDimensionsFormatString, cellSpan[0], cellSpan[1])); 1153e6882c3fe0a11941fbb3b78cea5aceb82f16319Winson Chung dims.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 11629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 11729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 1181ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung public void applyFromResolveInfo(PackageManager pm, ResolveInfo info, 119b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung FastBitmapDrawable preview, HolographicOutlineHelper holoOutlineHelper) { 120b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung mHolographicOutlineHelper = holoOutlineHelper; 1216a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung CharSequence label = info.loadLabel(pm); 1221ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung final ImageView image = (ImageView) findViewById(R.id.widget_preview); 1231ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung image.setImageDrawable(preview); 1246a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung image.setContentDescription(label); 1251ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung mPreviewImageView = image; 1261ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung final TextView name = (TextView) findViewById(R.id.widget_name); 1276a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung name.setText(label); 1281ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung name.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 1291ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung final TextView dims = (TextView) findViewById(R.id.widget_dims); 13046af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung if (dims != null) { 13146af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung dims.setText(String.format(mDimensionsFormatString, 1, 1)); 13246af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung dims.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 13346af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung } 134b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung } 1350499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung 136b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung public void setHolographicOutline(Bitmap holoOutline) { 137b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung mHolographicOutline = holoOutline; 138b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung invalidate(); 13929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 14029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 14129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 14229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public boolean onTouchEvent(MotionEvent event) { 14329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // We eat up the touch events here, since the PagedView (which uses the same swiping 14429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // touch code as Workspace previously) uses onInterceptTouchEvent() to determine when 14529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // the user is scrolling between pages. This means that if the pages themselves don't 14629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // handle touch events, it gets forwarded up to PagedView itself, and it's own 14729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // onTouchEvent() handling will prevent further intercept touch events from being called 14829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // (it's the same view in that case). This is not ideal, but to prevent more changes, 14929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // we just always mark the touch event as handled. 15029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung return super.onTouchEvent(event) || true; 15129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 15229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 15329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 15497d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung public boolean onKeyDown(int keyCode, KeyEvent event) { 155faa13255de0fb1d581ec7a583ed6ef0b661dbea0Winson Chung return FocusHelper.handlePagedViewGridLayoutWidgetKeyEvent(this, keyCode, event) 156faa13255de0fb1d581ec7a583ed6ef0b661dbea0Winson Chung || super.onKeyDown(keyCode, event); 15797d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung } 15897d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung 15997d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung @Override 16097d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung public boolean onKeyUp(int keyCode, KeyEvent event) { 161faa13255de0fb1d581ec7a583ed6ef0b661dbea0Winson Chung return FocusHelper.handlePagedViewGridLayoutWidgetKeyEvent(this, keyCode, event) 162faa13255de0fb1d581ec7a583ed6ef0b661dbea0Winson Chung || super.onKeyUp(keyCode, event); 16397d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung } 16497d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung 16597d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung @Override 16629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung protected void onDraw(Canvas canvas) { 16729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung if (mAlpha > 0) { 16829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung super.onDraw(canvas); 16929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 17029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 17129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // draw any blended overlays 17229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung if (mHolographicOutline != null && mHolographicAlpha > 0) { 1731908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung // Calculate how much to scale the holographic preview 1741908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung mTmpScaleRect.set(0,0,1,1); 1751908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung mPreviewImageView.getImageMatrix().mapRect(mTmpScaleRect); 1761908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung 17729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung mPaint.setAlpha(mHolographicAlpha); 1781908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung canvas.save(); 1791908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung canvas.scale(mTmpScaleRect.right, mTmpScaleRect.bottom); 180fd3385fe9e0f034b04f99d5d59a58d74fe040da4Winson Chung canvas.drawBitmap(mHolographicOutline, mPreviewImageView.getLeft(), 181fd3385fe9e0f034b04f99d5d59a58d74fe040da4Winson Chung mPreviewImageView.getTop(), mPaint); 1821908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung canvas.restore(); 18329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 18429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 18529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 18629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 18729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung protected boolean onSetAlpha(int alpha) { 18829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung return true; 18929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 19029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 191b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung private void setChildrenAlpha(float alpha) { 192b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung final int childCount = getChildCount(); 193b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung for (int i = 0; i < childCount; i++) { 194b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung getChildAt(i).setAlpha(alpha); 195b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung } 196b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung } 19729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 19829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public void setAlpha(float alpha) { 199b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung final float viewAlpha = mHolographicOutlineHelper.viewAlphaInterpolator(alpha); 200b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung final float holographicAlpha = mHolographicOutlineHelper.highlightAlphaInterpolator(alpha); 20129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung int newViewAlpha = (int) (viewAlpha * 255); 20229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung int newHolographicAlpha = (int) (holographicAlpha * 255); 20329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung if ((mAlpha != newViewAlpha) || (mHolographicAlpha != newHolographicAlpha)) { 20429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung mAlpha = newViewAlpha; 20529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung mHolographicAlpha = newHolographicAlpha; 20629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung setChildrenAlpha(viewAlpha); 20729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung super.setAlpha(viewAlpha); 20829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 20929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 21029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 2115f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy void setChecked(boolean checked, boolean animate) { 21259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung if (mIsChecked != checked) { 21359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung mIsChecked = checked; 21459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 21559e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung float alpha; 21659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung int duration; 21759e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung if (mIsChecked) { 21859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung alpha = mCheckedAlpha; 21959e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung duration = mCheckedFadeInDuration; 22059e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } else { 22159e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung alpha = 1.0f; 22259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung duration = mCheckedFadeOutDuration; 22359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 22459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 22559e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung // Initialize the animator 22659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung if (mCheckedAlphaAnimator != null) { 22759e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung mCheckedAlphaAnimator.cancel(); 22859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 2295f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy if (animate) { 2305f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha); 2315f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy mCheckedAlphaAnimator.setDuration(duration); 2325f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy mCheckedAlphaAnimator.start(); 2335f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy } else { 2345f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy setAlpha(alpha); 2355f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy } 23659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 23759e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung invalidate(); 23859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 23959e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 24059e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 24159e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung @Override 2425f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy public void setChecked(boolean checked) { 2435f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy setChecked(checked, true); 2445f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy } 2455f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy 2465f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy @Override 24759e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung public boolean isChecked() { 24859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung return mIsChecked; 24959e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 25059e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 25159e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung @Override 25259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung public void toggle() { 25359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung setChecked(!mIsChecked); 25459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 25529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung} 256