Merge "Get gestures animation preview image in async loader." into nyc-mr1-dev

This commit is contained in:
TreeHugger Robot
2016-07-21 02:43:37 +00:00
committed by Android (Google) Code Review
2 changed files with 85 additions and 16 deletions

View File

@@ -14,13 +14,18 @@
package com.android.settings.gestures; package com.android.settings.gestures;
import android.app.LoaderManager;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Loader;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.SurfaceTexture; import android.graphics.SurfaceTexture;
import android.media.MediaMetadataRetriever; import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle;
import android.support.v14.preference.SwitchPreference; import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.PreferenceViewHolder; import android.support.v7.preference.PreferenceViewHolder;
import android.view.View; import android.view.View;
@@ -31,22 +36,24 @@ import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.utils.AsyncLoader;
/** /**
* Preference item for a gesture with a switch to signify if it should be enabled. * Preference item for a gesture with a switch to signify if it should be enabled.
* This shows the title and description of the gesture along with an animation showing how to do * This shows the title and description of the gesture along with an animation showing how to do
* the gesture * the gesture
*/ */
public final class GesturePreference extends SwitchPreference { public final class GesturePreference extends SwitchPreference implements
LoaderManager.LoaderCallbacks<Bitmap> {
private static final String TAG = "GesturePreference"; private static final String TAG = "GesturePreference";
private final Context mContext; private final Context mContext;
private Uri mVideoPath; private Uri mVideoPath;
private MediaPlayer mMediaPlayer; private MediaPlayer mMediaPlayer;
private MediaMetadataRetriever mMediaMetadata;
private boolean mAnimationAvailable; private boolean mAnimationAvailable;
private boolean mPreviewReady; private boolean mVideoReady;
private boolean mScrolling; private boolean mScrolling;
private BitmapDrawable mPreviewImage;
public GesturePreference(Context context, AttributeSet attrs) { public GesturePreference(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@@ -62,15 +69,12 @@ public final class GesturePreference extends SwitchPreference {
.authority(context.getPackageName()) .authority(context.getPackageName())
.appendPath(String.valueOf(animation)) .appendPath(String.valueOf(animation))
.build(); .build();
mMediaMetadata = new MediaMetadataRetriever();
mMediaMetadata.setDataSource(mContext, mVideoPath);
mMediaPlayer = MediaPlayer.create(mContext, mVideoPath); mMediaPlayer = MediaPlayer.create(mContext, mVideoPath);
if (mMediaPlayer != null) { if (mMediaPlayer != null) {
mMediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() { mMediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
@Override @Override
public void onSeekComplete(MediaPlayer mp) { public void onSeekComplete(MediaPlayer mp) {
mPreviewReady = true; mVideoReady = true;
mMediaPlayer.setOnSeekCompleteListener(null);
} }
}); });
@@ -82,6 +86,7 @@ public final class GesturePreference extends SwitchPreference {
}); });
} }
mAnimationAvailable = true; mAnimationAvailable = true;
} catch (Exception e) { } catch (Exception e) {
Log.w(TAG, "Animation resource not found. Will not show animation."); Log.w(TAG, "Animation resource not found. Will not show animation.");
} finally { } finally {
@@ -125,6 +130,7 @@ public final class GesturePreference extends SwitchPreference {
int height) { int height) {
if (mMediaPlayer != null) { if (mMediaPlayer != null) {
mMediaPlayer.setSurface(new Surface(surfaceTexture)); mMediaPlayer.setSurface(new Surface(surfaceTexture));
mVideoReady = false;
mMediaPlayer.seekTo(0); mMediaPlayer.seekTo(0);
} }
} }
@@ -136,12 +142,16 @@ public final class GesturePreference extends SwitchPreference {
@Override @Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
if (mPreviewImage != null && imageView.getDrawable() == null) {
imageView.setImageDrawable(mPreviewImage);
}
imageView.setVisibility(View.VISIBLE);
return false; return false;
} }
@Override @Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
if (mPreviewReady && imageView.getVisibility() == View.VISIBLE) { if (mVideoReady && imageView.getVisibility() == View.VISIBLE) {
imageView.setVisibility(View.GONE); imageView.setVisibility(View.GONE);
} else if (mScrolling) { } else if (mScrolling) {
mScrolling = false; mScrolling = false;
@@ -153,13 +163,14 @@ public final class GesturePreference extends SwitchPreference {
} }
}); });
if (mPreviewImage != null) {
imageView.setImageDrawable(mPreviewImage);
}
} }
@Override @Override
public void onDetached() { public void onDetached() {
if (mMediaMetadata != null) {
mMediaMetadata.release();
}
if (mMediaPlayer != null) { if (mMediaPlayer != null) {
mMediaPlayer.stop(); mMediaPlayer.stop();
mMediaPlayer.reset(); mMediaPlayer.reset();
@@ -172,4 +183,55 @@ public final class GesturePreference extends SwitchPreference {
mScrolling = scrolling; mScrolling = scrolling;
} }
void loadPreview(LoaderManager manager, int id) {
Loader<Bitmap> loader = manager.initLoader(id, Bundle.EMPTY, this);
}
private static final class PreviewRetriever extends AsyncLoader<Bitmap> {
private Uri mVideoPath;
public PreviewRetriever(Context context, Uri videoPath) {
super(context);
mVideoPath = videoPath;
}
@Override
public Bitmap loadInBackground() {
MediaMetadataRetriever mediaMetadata = new MediaMetadataRetriever();
try {
mediaMetadata.setDataSource(getContext(), mVideoPath);
return mediaMetadata.getFrameAtTime(0);
} catch (Exception e) {
Log.w(TAG, "Unable to get animation preview.");
} finally {
mediaMetadata.release();
}
return null;
}
@Override
public void onDiscardResult(final Bitmap result) {
if (result != null && !result.isRecycled()) {
result.recycle();
}
}
}
@Override
public Loader<Bitmap> onCreateLoader(int id, Bundle args) {
return new PreviewRetriever(mContext, mVideoPath);
}
@Override
public void onLoadFinished(final Loader<Bitmap> loader, final Bitmap bitmap) {
if (bitmap != null) {
mPreviewImage = new BitmapDrawable(mContext.getResources(), bitmap);
}
}
@Override
public void onLoaderReset(Loader<Bitmap> loader) {
}
} }

View File

@@ -56,6 +56,10 @@ public class GestureSettings extends SettingsPreferenceFragment implements
private static final String PREF_KEY_SWIPE_DOWN_FINGERPRINT = "gesture_swipe_down_fingerprint"; private static final String PREF_KEY_SWIPE_DOWN_FINGERPRINT = "gesture_swipe_down_fingerprint";
private static final String DEBUG_DOZE_COMPONENT = "debug.doze.component"; private static final String DEBUG_DOZE_COMPONENT = "debug.doze.component";
private static final String ARG_SCROLL_TO_PREFERENCE = "gesture_scroll_to_preference"; private static final String ARG_SCROLL_TO_PREFERENCE = "gesture_scroll_to_preference";
private static final int PREF_ID_DOUBLE_TAP_POWER = 0;
private static final int PREF_ID_DOUBLE_TWIST = 1;
private static final int PREF_ID_PICK_UP_AND_NUDG = 2;
private static final int PREF_ID_SWIPE_DOWN_FINGERPRINT = 3;
private int mScrollPosition = -1; private int mScrollPosition = -1;
private List<GesturePreference> mPreferences; private List<GesturePreference> mPreferences;
@@ -71,7 +75,7 @@ public class GestureSettings extends SettingsPreferenceFragment implements
if (isCameraDoubleTapPowerGestureAvailable(getResources())) { if (isCameraDoubleTapPowerGestureAvailable(getResources())) {
int cameraDisabled = Secure.getInt( int cameraDisabled = Secure.getInt(
getContentResolver(), Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0); getContentResolver(), Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0);
addPreference(PREF_KEY_DOUBLE_TAP_POWER, cameraDisabled == 0); addPreference(PREF_KEY_DOUBLE_TAP_POWER, cameraDisabled == 0, PREF_ID_DOUBLE_TAP_POWER);
} else { } else {
removePreference(PREF_KEY_DOUBLE_TAP_POWER); removePreference(PREF_KEY_DOUBLE_TAP_POWER);
} }
@@ -79,14 +83,15 @@ public class GestureSettings extends SettingsPreferenceFragment implements
// Ambient Display // Ambient Display
if (isDozeAvailable(context)) { if (isDozeAvailable(context)) {
int dozeEnabled = Secure.getInt(getContentResolver(), Secure.DOZE_ENABLED, 1); int dozeEnabled = Secure.getInt(getContentResolver(), Secure.DOZE_ENABLED, 1);
addPreference(PREF_KEY_PICK_UP_AND_NUDGE, dozeEnabled != 0); addPreference(PREF_KEY_PICK_UP_AND_NUDGE, dozeEnabled != 0, PREF_ID_DOUBLE_TWIST);
} else { } else {
removePreference(PREF_KEY_PICK_UP_AND_NUDGE); removePreference(PREF_KEY_PICK_UP_AND_NUDGE);
} }
// Fingerprint slide for notifications // Fingerprint slide for notifications
if (isSystemUINavigationAvailable(context)) { if (isSystemUINavigationAvailable(context)) {
addPreference(PREF_KEY_SWIPE_DOWN_FINGERPRINT, isSystemUINavigationEnabled(context)); addPreference(PREF_KEY_SWIPE_DOWN_FINGERPRINT, isSystemUINavigationEnabled(context),
PREF_ID_PICK_UP_AND_NUDG);
} else { } else {
removePreference(PREF_KEY_SWIPE_DOWN_FINGERPRINT); removePreference(PREF_KEY_SWIPE_DOWN_FINGERPRINT);
} }
@@ -95,7 +100,8 @@ public class GestureSettings extends SettingsPreferenceFragment implements
if (isDoubleTwistAvailable(context)) { if (isDoubleTwistAvailable(context)) {
int doubleTwistEnabled = Secure.getInt( int doubleTwistEnabled = Secure.getInt(
getContentResolver(), Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, 1); getContentResolver(), Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, 1);
addPreference(PREF_KEY_DOUBLE_TWIST, doubleTwistEnabled != 0); addPreference(PREF_KEY_DOUBLE_TWIST, doubleTwistEnabled != 0,
PREF_ID_SWIPE_DOWN_FINGERPRINT);
} else { } else {
removePreference(PREF_KEY_DOUBLE_TWIST); removePreference(PREF_KEY_DOUBLE_TWIST);
} }
@@ -211,10 +217,11 @@ public class GestureSettings extends SettingsPreferenceFragment implements
return false; return false;
} }
private void addPreference(String key, boolean enabled) { private void addPreference(String key, boolean enabled, int id) {
GesturePreference preference = (GesturePreference) findPreference(key); GesturePreference preference = (GesturePreference) findPreference(key);
preference.setChecked(enabled); preference.setChecked(enabled);
preference.setOnPreferenceChangeListener(this); preference.setOnPreferenceChangeListener(this);
preference.loadPreview(getLoaderManager(), id);
mPreferences.add(preference); mPreferences.add(preference);
} }