PagedViewWidget.java revision 35d4a257cff6ff69232f10c8dc405df8044eab1f
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); 11435d4a257cff6ff69232f10c8dc405df8044eab1fWinson Chung if (dims != null) { 11535d4a257cff6ff69232f10c8dc405df8044eab1fWinson Chung dims.setText(String.format(mDimensionsFormatString, cellSpan[0], cellSpan[1])); 11635d4a257cff6ff69232f10c8dc405df8044eab1fWinson Chung dims.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 11735d4a257cff6ff69232f10c8dc405df8044eab1fWinson Chung } 11829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 11929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 1201ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung public void applyFromResolveInfo(PackageManager pm, ResolveInfo info, 121b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung FastBitmapDrawable preview, HolographicOutlineHelper holoOutlineHelper) { 122b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung mHolographicOutlineHelper = holoOutlineHelper; 1236a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung CharSequence label = info.loadLabel(pm); 1241ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung final ImageView image = (ImageView) findViewById(R.id.widget_preview); 1251ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung image.setImageDrawable(preview); 1266a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung image.setContentDescription(label); 1271ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung mPreviewImageView = image; 1281ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung final TextView name = (TextView) findViewById(R.id.widget_name); 1296a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung name.setText(label); 1301ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung name.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 1311ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung final TextView dims = (TextView) findViewById(R.id.widget_dims); 13246af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung if (dims != null) { 13346af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung dims.setText(String.format(mDimensionsFormatString, 1, 1)); 13446af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung dims.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 13546af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung } 136b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung } 1370499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung 138b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung public void setHolographicOutline(Bitmap holoOutline) { 139b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung mHolographicOutline = holoOutline; 140b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung invalidate(); 14129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 14229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 14329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 14429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public boolean onTouchEvent(MotionEvent event) { 14529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // We eat up the touch events here, since the PagedView (which uses the same swiping 14629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // touch code as Workspace previously) uses onInterceptTouchEvent() to determine when 14729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // the user is scrolling between pages. This means that if the pages themselves don't 14829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // handle touch events, it gets forwarded up to PagedView itself, and it's own 14929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // onTouchEvent() handling will prevent further intercept touch events from being called 15029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // (it's the same view in that case). This is not ideal, but to prevent more changes, 15129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // we just always mark the touch event as handled. 15229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung return super.onTouchEvent(event) || true; 15329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 15429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 15529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 15697d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung public boolean onKeyDown(int keyCode, KeyEvent event) { 157faa13255de0fb1d581ec7a583ed6ef0b661dbea0Winson Chung return FocusHelper.handlePagedViewGridLayoutWidgetKeyEvent(this, keyCode, event) 158faa13255de0fb1d581ec7a583ed6ef0b661dbea0Winson Chung || super.onKeyDown(keyCode, event); 15997d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung } 16097d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung 16197d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung @Override 16297d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung public boolean onKeyUp(int keyCode, KeyEvent event) { 163faa13255de0fb1d581ec7a583ed6ef0b661dbea0Winson Chung return FocusHelper.handlePagedViewGridLayoutWidgetKeyEvent(this, keyCode, event) 164faa13255de0fb1d581ec7a583ed6ef0b661dbea0Winson Chung || super.onKeyUp(keyCode, event); 16597d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung } 16697d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung 16797d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung @Override 16829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung protected void onDraw(Canvas canvas) { 16929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung if (mAlpha > 0) { 17029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung super.onDraw(canvas); 17129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 17229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 17329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // draw any blended overlays 17429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung if (mHolographicOutline != null && mHolographicAlpha > 0) { 1751908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung // Calculate how much to scale the holographic preview 1761908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung mTmpScaleRect.set(0,0,1,1); 1771908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung mPreviewImageView.getImageMatrix().mapRect(mTmpScaleRect); 1781908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung 17929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung mPaint.setAlpha(mHolographicAlpha); 1801908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung canvas.save(); 1811908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung canvas.scale(mTmpScaleRect.right, mTmpScaleRect.bottom); 182fd3385fe9e0f034b04f99d5d59a58d74fe040da4Winson Chung canvas.drawBitmap(mHolographicOutline, mPreviewImageView.getLeft(), 183fd3385fe9e0f034b04f99d5d59a58d74fe040da4Winson Chung mPreviewImageView.getTop(), mPaint); 1841908d07151e0d3f82899f368874e41ed1e49ba16Winson Chung canvas.restore(); 18529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 18629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 18729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 18829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 18929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung protected boolean onSetAlpha(int alpha) { 19029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung return true; 19129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 19229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 193b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung private void setChildrenAlpha(float alpha) { 194b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung final int childCount = getChildCount(); 195b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung for (int i = 0; i < childCount; i++) { 196b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung getChildAt(i).setAlpha(alpha); 197b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung } 198b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung } 19929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 20029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public void setAlpha(float alpha) { 201b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung final float viewAlpha = mHolographicOutlineHelper.viewAlphaInterpolator(alpha); 202b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung final float holographicAlpha = mHolographicOutlineHelper.highlightAlphaInterpolator(alpha); 20329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung int newViewAlpha = (int) (viewAlpha * 255); 20429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung int newHolographicAlpha = (int) (holographicAlpha * 255); 20529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung if ((mAlpha != newViewAlpha) || (mHolographicAlpha != newHolographicAlpha)) { 20629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung mAlpha = newViewAlpha; 20729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung mHolographicAlpha = newHolographicAlpha; 20829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung setChildrenAlpha(viewAlpha); 20929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung super.setAlpha(viewAlpha); 21029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 21129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 21229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 2135f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy void setChecked(boolean checked, boolean animate) { 21459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung if (mIsChecked != checked) { 21559e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung mIsChecked = checked; 21659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 21759e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung float alpha; 21859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung int duration; 21959e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung if (mIsChecked) { 22059e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung alpha = mCheckedAlpha; 22159e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung duration = mCheckedFadeInDuration; 22259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } else { 22359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung alpha = 1.0f; 22459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung duration = mCheckedFadeOutDuration; 22559e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 22659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 22759e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung // Initialize the animator 22859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung if (mCheckedAlphaAnimator != null) { 22959e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung mCheckedAlphaAnimator.cancel(); 23059e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 2315f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy if (animate) { 2325f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha); 2335f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy mCheckedAlphaAnimator.setDuration(duration); 2345f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy mCheckedAlphaAnimator.start(); 2355f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy } else { 2365f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy setAlpha(alpha); 2375f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy } 23859e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 23959e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung invalidate(); 24059e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 24159e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 24259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 24359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung @Override 2445f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy public void setChecked(boolean checked) { 2455f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy setChecked(checked, true); 2465f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy } 2475f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy 2485f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy @Override 24959e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung public boolean isChecked() { 25059e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung return mIsChecked; 25159e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 25259e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 25359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung @Override 25459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung public void toggle() { 25559e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung setChecked(!mIsChecked); 25659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung } 25729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung} 258