diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/gallery3d/app/CropImage.java | 27 | ||||
-rw-r--r-- | src/com/android/gallery3d/app/MovieActivity.java | 18 | ||||
-rw-r--r-- | src/com/android/gallery3d/app/MoviePlayer.java | 69 | ||||
-rw-r--r-- | src/com/android/gallery3d/app/PhotoPage.java | 6 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/LocalImage.java | 20 | ||||
-rw-r--r-- | src/com/android/gallery3d/gadget/PhotoAppWidgetProvider.java | 6 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/GLRootView.java | 16 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/PhotoView.java | 56 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/UndoBarView.java | 59 |
9 files changed, 222 insertions, 55 deletions
diff --git a/src/com/android/gallery3d/app/CropImage.java b/src/com/android/gallery3d/app/CropImage.java index 4f450d85e..294e285ea 100644 --- a/src/com/android/gallery3d/app/CropImage.java +++ b/src/com/android/gallery3d/app/CropImage.java @@ -16,6 +16,7 @@ package com.android.gallery3d.app; +import android.annotation.TargetApi; import android.app.ActionBar; import android.app.ProgressDialog; import android.app.WallpaperManager; @@ -32,6 +33,7 @@ import android.graphics.Rect; import android.graphics.RectF; import android.media.ExifInterface; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; @@ -45,6 +47,7 @@ import android.view.Window; import android.widget.Toast; import com.android.gallery3d.R; +import com.android.gallery3d.common.ApiHelper; import com.android.gallery3d.common.BitmapUtils; import com.android.gallery3d.common.Utils; import com.android.gallery3d.data.DataManager; @@ -96,10 +99,6 @@ public class CropImage extends AbstractGalleryActivity { private static final int DEFAULT_COMPRESS_QUALITY = 90; private static final String TIME_STAMP_NAME = "'IMG'_yyyyMMdd_HHmmss"; - // Change these to Images.Media.WIDTH/HEIGHT after they are unhidden. - private static final String WIDTH = "width"; - private static final String HEIGHT = "height"; - public static final String KEY_RETURN_DATA = "return-data"; public static final String KEY_CROPPED_RECT = "cropped-rect"; public static final String KEY_ASPECT_X = "aspectX"; @@ -371,6 +370,15 @@ public class CropImage extends AbstractGalleryActivity { } } + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + private static void setImageSize(ContentValues values, int width, int height) { + // The two fields are available since ICS but got published in JB + if (ApiHelper.HAS_MEDIA_COLUMNS_WIDTH_AND_HEIGHT) { + values.put(Images.Media.WIDTH, width); + values.put(Images.Media.HEIGHT, height); + } + } + private Uri savePicasaImage(JobContext jc, Bitmap cropped) { if (!DOWNLOAD_BUCKET.isDirectory() && !DOWNLOAD_BUCKET.mkdirs()) { throw new RuntimeException("cannot create download folder"); @@ -395,8 +403,7 @@ public class CropImage extends AbstractGalleryActivity { values.put(Images.Media.ORIENTATION, 0); values.put(Images.Media.DATA, output.getAbsolutePath()); values.put(Images.Media.SIZE, output.length()); - values.put(WIDTH, cropped.getWidth()); - values.put(HEIGHT, cropped.getHeight()); + setImageSize(values, cropped.getWidth(), cropped.getHeight()); double latitude = PicasaSource.getLatitude(mMediaItem); double longitude = PicasaSource.getLongitude(mMediaItem); @@ -434,8 +441,8 @@ public class CropImage extends AbstractGalleryActivity { values.put(Images.Media.ORIENTATION, 0); values.put(Images.Media.DATA, output.getAbsolutePath()); values.put(Images.Media.SIZE, output.length()); - values.put(WIDTH, cropped.getWidth()); - values.put(HEIGHT, cropped.getHeight()); + + setImageSize(values, cropped.getWidth(), cropped.getHeight()); if (GalleryUtils.isValidLocation(localImage.latitude, localImage.longitude)) { values.put(Images.Media.LATITUDE, localImage.latitude); @@ -467,8 +474,8 @@ public class CropImage extends AbstractGalleryActivity { values.put(Images.Media.ORIENTATION, 0); values.put(Images.Media.DATA, output.getAbsolutePath()); values.put(Images.Media.SIZE, output.length()); - values.put(WIDTH, cropped.getWidth()); - values.put(HEIGHT, cropped.getHeight()); + + setImageSize(values, cropped.getWidth(), cropped.getHeight()); return getContentResolver().insert( Images.Media.EXTERNAL_CONTENT_URI, values); diff --git a/src/com/android/gallery3d/app/MovieActivity.java b/src/com/android/gallery3d/app/MovieActivity.java index 78fe1ee78..5f4db1d13 100644 --- a/src/com/android/gallery3d/app/MovieActivity.java +++ b/src/com/android/gallery3d/app/MovieActivity.java @@ -16,6 +16,7 @@ package com.android.gallery3d.app; +import android.annotation.TargetApi; import android.app.ActionBar; import android.app.Activity; import android.content.AsyncQueryHandler; @@ -27,6 +28,7 @@ import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.media.AudioManager; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.provider.OpenableColumns; @@ -39,6 +41,7 @@ import android.view.WindowManager; import android.widget.ShareActionProvider; import com.android.gallery3d.R; +import com.android.gallery3d.common.ApiHelper; import com.android.gallery3d.common.Utils; /** @@ -59,6 +62,15 @@ public class MovieActivity extends Activity { private Uri mUri; private boolean mTreatUpAsBack; + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + private void setSystemUiVisibility(View rootView) { + if (ApiHelper.HAS_VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE) { + rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + } + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -68,9 +80,9 @@ public class MovieActivity extends Activity { setContentView(R.layout.movie_view); View rootView = findViewById(R.id.movie_view_root); - rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + + setSystemUiVisibility(rootView); + Intent intent = getIntent(); initializeActionBar(intent); mFinishOnCompletion = intent.getBooleanExtra( diff --git a/src/com/android/gallery3d/app/MoviePlayer.java b/src/com/android/gallery3d/app/MoviePlayer.java index 11b40bdf8..c0f0ce739 100644 --- a/src/com/android/gallery3d/app/MoviePlayer.java +++ b/src/com/android/gallery3d/app/MoviePlayer.java @@ -16,6 +16,7 @@ package com.android.gallery3d.app; +import android.annotation.TargetApi; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; @@ -28,6 +29,7 @@ import android.graphics.Color; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.view.KeyEvent; @@ -37,6 +39,7 @@ import android.view.ViewGroup; import android.widget.VideoView; import com.android.gallery3d.R; +import com.android.gallery3d.common.ApiHelper; import com.android.gallery3d.common.BlobCache; import com.android.gallery3d.util.CacheManager; import com.android.gallery3d.util.GalleryUtils; @@ -98,9 +101,10 @@ public class MoviePlayer implements }; private final Runnable mRemoveBackground = new Runnable() { + @SuppressWarnings("deprecation") @Override public void run() { - mRootView.setBackground(null); + mRootView.setBackgroundDrawable(null); } }; @@ -148,6 +152,37 @@ public class MoviePlayer implements } }, BLACK_TIMEOUT); + setOnSystemUiVisibilityChangeListener(); + // Hide system UI by default + showSystemUi(false); + + mAudioBecomingNoisyReceiver = new AudioBecomingNoisyReceiver(); + mAudioBecomingNoisyReceiver.register(); + + Intent i = new Intent(SERVICECMD); + i.putExtra(CMDNAME, CMDPAUSE); + movieActivity.sendBroadcast(i); + + if (savedInstance != null) { // this is a resumed activity + mVideoPosition = savedInstance.getInt(KEY_VIDEO_POSITION, 0); + mResumeableTime = savedInstance.getLong(KEY_RESUMEABLE_TIME, Long.MAX_VALUE); + mVideoView.start(); + mVideoView.suspend(); + mHasPaused = true; + } else { + final Integer bookmark = mBookmarker.getBookmark(mUri); + if (bookmark != null) { + showResumeDialog(movieActivity, bookmark); + } else { + startVideo(); + } + } + } + + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + private void setOnSystemUiVisibilityChangeListener() { + if (!ApiHelper.HAS_VIEW_SYSTEM_UI_FLAG_HIDE_NAVIGATION) return; + // When the user touches the screen or uses some hard key, the framework // will change system ui visibility from invisible to visible. We show // the media control and enable system UI (e.g. ActionBar) to be visible at this point @@ -176,37 +211,15 @@ public class MoviePlayer implements } } }); - - // Hide system UI by default - showSystemUi(false); - - mAudioBecomingNoisyReceiver = new AudioBecomingNoisyReceiver(); - mAudioBecomingNoisyReceiver.register(); - - Intent i = new Intent(SERVICECMD); - i.putExtra(CMDNAME, CMDPAUSE); - movieActivity.sendBroadcast(i); - - if (savedInstance != null) { // this is a resumed activity - mVideoPosition = savedInstance.getInt(KEY_VIDEO_POSITION, 0); - mResumeableTime = savedInstance.getLong(KEY_RESUMEABLE_TIME, Long.MAX_VALUE); - mVideoView.start(); - mVideoView.suspend(); - mHasPaused = true; - } else { - final Integer bookmark = mBookmarker.getBookmark(mUri); - if (bookmark != null) { - showResumeDialog(movieActivity, bookmark); - } else { - startVideo(); - } - } } + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void showSystemUi(boolean visible) { + if (!ApiHelper.HAS_VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE) return; + int flag = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; if (!visible) { flag |= View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; @@ -496,7 +509,7 @@ class Bookmarker { DataInputStream dis = new DataInputStream( new ByteArrayInputStream(data)); - String uriString = dis.readUTF(dis); + String uriString = DataInputStream.readUTF(dis); int bookmark = dis.readInt(); int duration = dis.readInt(); diff --git a/src/com/android/gallery3d/app/PhotoPage.java b/src/com/android/gallery3d/app/PhotoPage.java index 1d9344ba3..c94454352 100644 --- a/src/com/android/gallery3d/app/PhotoPage.java +++ b/src/com/android/gallery3d/app/PhotoPage.java @@ -721,7 +721,7 @@ public class PhotoPage extends ActivityState implements mDeletePath = path; mDeleteIsFocus = (offset == 0); mMediaSet.setDeletion(path, mCurrentIndex + offset); - mPhotoView.showUndoButton(true); + mPhotoView.showUndoBar(); } @Override @@ -731,14 +731,14 @@ public class PhotoPage extends ActivityState implements if (mDeleteIsFocus) mModel.setFocusHintPath(mDeletePath); mMediaSet.setDeletion(null, 0); mDeletePath = null; - mPhotoView.showUndoButton(false); + mPhotoView.hideUndoBar(); } @Override public void onCommitDeleteImage() { if (mDeletePath == null) return; commitDeletion(); - mPhotoView.showUndoButton(false); + mPhotoView.hideUndoBar(); } private void commitDeletion() { diff --git a/src/com/android/gallery3d/data/LocalImage.java b/src/com/android/gallery3d/data/LocalImage.java index aa27c6f42..b64b2c3f0 100644 --- a/src/com/android/gallery3d/data/LocalImage.java +++ b/src/com/android/gallery3d/data/LocalImage.java @@ -16,6 +16,7 @@ package com.android.gallery3d.data; +import android.annotation.TargetApi; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; @@ -24,11 +25,14 @@ import android.graphics.BitmapFactory; import android.graphics.BitmapRegionDecoder; import android.media.ExifInterface; import android.net.Uri; +import android.os.Build; import android.provider.MediaStore.Images; import android.provider.MediaStore.Images.ImageColumns; +import android.provider.MediaStore.MediaColumns; import android.util.Log; import com.android.gallery3d.app.GalleryApp; +import com.android.gallery3d.common.ApiHelper; import com.android.gallery3d.common.BitmapUtils; import com.android.gallery3d.util.GalleryUtils; import com.android.gallery3d.util.ThreadPool.Job; @@ -74,10 +78,22 @@ public class LocalImage extends LocalMediaItem { ImageColumns.ORIENTATION, // 9 ImageColumns.BUCKET_ID, // 10 ImageColumns.SIZE, // 11 - ImageColumns.WIDTH, // 12 - ImageColumns.HEIGHT // 13 + "0", // 12 + "0" // 13 }; + static { + updateWidthAndHeightProjection(); + } + + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + private static void updateWidthAndHeightProjection() { + if (ApiHelper.HAS_MEDIA_COLUMNS_WIDTH_AND_HEIGHT) { + PROJECTION[INDEX_WIDTH] = MediaColumns.WIDTH; + PROJECTION[INDEX_HEIGHT] = MediaColumns.HEIGHT; + } + } + private final GalleryApp mApplication; public int rotation; diff --git a/src/com/android/gallery3d/gadget/PhotoAppWidgetProvider.java b/src/com/android/gallery3d/gadget/PhotoAppWidgetProvider.java index c18652d5b..343b15a5b 100644 --- a/src/com/android/gallery3d/gadget/PhotoAppWidgetProvider.java +++ b/src/com/android/gallery3d/gadget/PhotoAppWidgetProvider.java @@ -66,6 +66,7 @@ public class PhotoAppWidgetProvider extends AppWidgetProvider { super.onUpdate(context, appWidgetManager, appWidgetIds); } + @SuppressWarnings("deprecation") private static RemoteViews buildStackWidget(Context context, int widgetId, Entry entry) { RemoteViews views = new RemoteViews( context.getPackageName(), R.layout.appwidget_main); @@ -76,7 +77,10 @@ public class PhotoAppWidgetProvider extends AppWidgetProvider { intent.putExtra(WidgetService.EXTRA_ALBUM_PATH, entry.albumPath); intent.setData(Uri.parse("widget://gallery/" + widgetId)); - views.setRemoteAdapter(R.id.appwidget_stack_view, intent); + // We use the deprecated API for backward compatibility + // The new API is available in ICE_CREAM_SANDWICH (15) + views.setRemoteAdapter(widgetId, R.id.appwidget_stack_view, intent); + views.setEmptyView(R.id.appwidget_stack_view, R.id.appwidget_empty_view); Intent clickIntent = new Intent(context, WidgetClickHandler.class); diff --git a/src/com/android/gallery3d/ui/GLRootView.java b/src/com/android/gallery3d/ui/GLRootView.java index 99ed8cb42..2068520aa 100644 --- a/src/com/android/gallery3d/ui/GLRootView.java +++ b/src/com/android/gallery3d/ui/GLRootView.java @@ -16,10 +16,12 @@ package com.android.gallery3d.ui; +import android.annotation.TargetApi; import android.content.Context; import android.graphics.Matrix; import android.graphics.PixelFormat; import android.opengl.GLSurfaceView; +import android.os.Build; import android.os.Process; import android.os.SystemClock; import android.util.AttributeSet; @@ -29,6 +31,7 @@ import android.view.View; import com.android.gallery3d.R; import com.android.gallery3d.anim.CanvasAnimation; +import com.android.gallery3d.common.ApiHelper; import com.android.gallery3d.common.Utils; import com.android.gallery3d.util.GalleryUtils; import com.android.gallery3d.util.Profile; @@ -536,12 +539,15 @@ public class GLRootView extends GLSurfaceView } @Override + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public void setLightsOutMode(boolean enabled) { - int flags = enabled - ? SYSTEM_UI_FLAG_LOW_PROFILE - | SYSTEM_UI_FLAG_FULLSCREEN - | SYSTEM_UI_FLAG_LAYOUT_STABLE - : 0; + int flags = 0; + if (enabled) { + flags = SYSTEM_UI_FLAG_LOW_PROFILE; + if (ApiHelper.HAS_VIEW_SYSTEM_UI_FLAG_LAYOUT_STABLE) { + flags |= (SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_LAYOUT_STABLE); + } + } setSystemUiVisibility(flags); } diff --git a/src/com/android/gallery3d/ui/PhotoView.java b/src/com/android/gallery3d/ui/PhotoView.java index 3fba261fb..496d34d05 100644 --- a/src/com/android/gallery3d/ui/PhotoView.java +++ b/src/com/android/gallery3d/ui/PhotoView.java @@ -141,6 +141,7 @@ public class PhotoView extends GLView { private static final int MSG_CAPTURE_ANIMATION_DONE = 4; private static final int MSG_DELETE_ANIMATION_DONE = 5; private static final int MSG_DELETE_DONE = 6; + private static final int MSG_HIDE_UNDO_BAR = 7; private static final int MOVE_THRESHOLD = 256; private static final float SWIPE_THRESHOLD = 300f; @@ -221,6 +222,10 @@ public class PhotoView extends GLView { // Whether the box indicated by mTouchBoxIndex is deletable. Only meaningful // if mTouchBoxIndex is not Integer.MAX_VALUE. private boolean mTouchBoxDeletable; + // This is the index of the last deleted item. This is only used as a hint + // to hide the undo button when we are too far away from the deleted + // item. The value Integer.MAX_VALUE means there is no such hint. + private int mUndoIndexHint = Integer.MAX_VALUE; public PhotoView(GalleryActivity activity) { mTileView = new TileImageView(activity); @@ -334,6 +339,10 @@ public class PhotoView extends GLView { } break; } + case MSG_HIDE_UNDO_BAR: { + checkHideUndoBar(UNDO_BAR_TIMEOUT); + break; + } default: throw new AssertionError(message.what); } } @@ -359,6 +368,13 @@ public class PhotoView extends GLView { } } + // Hide undo button if we are too far away + if (mUndoIndexHint != Integer.MAX_VALUE) { + if (Math.abs(mUndoIndexHint - mModel.getCurrentIndex()) >= 3) { + hideUndoBar(); + } + } + // Update the ScreenNails. for (int i = -SCREEN_NAIL_MAX; i <= SCREEN_NAIL_MAX; i++) { Picture p = mPictures.get(i); @@ -1041,6 +1057,8 @@ public class PhotoView extends GLView { private void deleteAfterAnimation(int duration) { MediaItem item = mModel.getMediaItem(mTouchBoxIndex); if (item == null) return; + mListener.onCommitDeleteImage(); + mUndoIndexHint = mModel.getCurrentIndex() + mTouchBoxIndex; mHolding |= HOLD_DELETE; Message m = mHandler.obtainMessage(MSG_DELETE_ANIMATION_DONE); m.obj = item.getPath(); @@ -1136,9 +1154,10 @@ public class PhotoView extends GLView { @Override public void onDown(float x, float y) { + checkHideUndoBar(UNDO_BAR_TOUCHED); + mDeltaY = 0; mSeenScaling = false; - mListener.onCommitDeleteImage(); if (mIgnoreSwipingGesture) return; @@ -1248,8 +1267,39 @@ public class PhotoView extends GLView { setFilmMode(false); } - public void showUndoButton(boolean show) { - mUndoBar.setVisibility(show ? GLView.VISIBLE : GLView.INVISIBLE); + //////////////////////////////////////////////////////////////////////////// + // Undo Bar + //////////////////////////////////////////////////////////////////////////// + + private int mUndoBarState; + private static final int UNDO_BAR_SHOW = 1; + private static final int UNDO_BAR_TIMEOUT = 2; + private static final int UNDO_BAR_TOUCHED = 4; + + public void showUndoBar() { + mHandler.removeMessages(MSG_HIDE_UNDO_BAR); + mUndoBarState = UNDO_BAR_SHOW; + mUndoBar.animateVisibility(GLView.VISIBLE); + mHandler.sendEmptyMessageDelayed(MSG_HIDE_UNDO_BAR, 3000); + } + + public void hideUndoBar() { + mHandler.removeMessages(MSG_HIDE_UNDO_BAR); + mListener.onCommitDeleteImage(); + mUndoBar.animateVisibility(GLView.INVISIBLE); + mUndoBarState = 0; + mUndoIndexHint = Integer.MAX_VALUE; + } + + // Check if the all conditions for hiding the undo bar have been met. The + // conditions are: it has been three seconds since last showing, and the + // user has touched. + private void checkHideUndoBar(int addition) { + mUndoBarState |= addition; + if (mUndoBarState == + (UNDO_BAR_SHOW | UNDO_BAR_TIMEOUT | UNDO_BAR_TOUCHED)) { + hideUndoBar(); + } } //////////////////////////////////////////////////////////////////////////// diff --git a/src/com/android/gallery3d/ui/UndoBarView.java b/src/com/android/gallery3d/ui/UndoBarView.java index 9ddd1d755..f5ea5d1ad 100644 --- a/src/com/android/gallery3d/ui/UndoBarView.java +++ b/src/com/android/gallery3d/ui/UndoBarView.java @@ -20,6 +20,7 @@ import android.content.Context; import android.view.MotionEvent; import com.android.gallery3d.R; +import com.android.gallery3d.common.Utils; import com.android.gallery3d.util.GalleryUtils; public class UndoBarView extends GLView { @@ -89,6 +90,11 @@ public class UndoBarView extends GLView { @Override protected void render(GLCanvas canvas) { super.render(canvas); + advanceAnimation(); + + canvas.save(GLCanvas.SAVE_FLAG_ALPHA); + canvas.multiplyAlpha(mAlpha); + int w = getWidth(); int h = getHeight(); mPanel.draw(canvas, mBarMargin, 0, w - mBarMargin * 2, mBarHeight); @@ -112,6 +118,8 @@ public class UndoBarView extends GLView { x = mBarMargin + mDeletedTextMargin; y = (mBarHeight - mDeletedText.getHeight()) / 2; mDeletedText.draw(canvas, x, y); + + canvas.restore(); } @Override @@ -143,4 +151,55 @@ public class UndoBarView extends GLView { int h = getHeight(); return (x >= w - mClickRegion && x < w && y >= 0 && y < h); } + + //////////////////////////////////////////////////////////////////////////// + // Alpha Animation + //////////////////////////////////////////////////////////////////////////// + + private static final long NO_ANIMATION = -1; + private static long ANIM_TIME = 200; + private long mAnimationStartTime = NO_ANIMATION; + private float mFromAlpha, mToAlpha; + private float mAlpha; + + private static float getTargetAlpha(int visibility) { + return (visibility == VISIBLE) ? 1f : 0f; + } + + public void setVisibility(int visibility) { + mAlpha = getTargetAlpha(visibility); + mAnimationStartTime = NO_ANIMATION; + super.setVisibility(visibility); + invalidate(); + } + + public void animateVisibility(int visibility) { + float target = getTargetAlpha(visibility); + if (mAnimationStartTime == NO_ANIMATION && mAlpha == target) return; + if (mAnimationStartTime != NO_ANIMATION && mToAlpha == target) return; + + mFromAlpha = mAlpha; + mToAlpha = target; + mAnimationStartTime = AnimationTime.startTime(); + + super.setVisibility(VISIBLE); + invalidate(); + } + + private void advanceAnimation() { + if (mAnimationStartTime == NO_ANIMATION) return; + + float delta = (float) (AnimationTime.get() - mAnimationStartTime) / + ANIM_TIME; + mAlpha = mFromAlpha + ((mToAlpha > mFromAlpha) ? delta : -delta); + mAlpha = Utils.clamp(mAlpha, 0f, 1f); + + if (mAlpha == mToAlpha) { + mAnimationStartTime = NO_ANIMATION; + if (mAlpha == 0) { + super.setVisibility(INVISIBLE); + } + } + invalidate(); + } } |