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;
import android.app.LoaderManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Loader;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.SurfaceTexture;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.PreferenceViewHolder;
import android.view.View;
@@ -31,22 +36,24 @@ import android.util.AttributeSet;
import android.util.Log;
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.
* This shows the title and description of the gesture along with an animation showing how to do
* 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 final Context mContext;
private Uri mVideoPath;
private MediaPlayer mMediaPlayer;
private MediaMetadataRetriever mMediaMetadata;
private boolean mAnimationAvailable;
private boolean mPreviewReady;
private boolean mVideoReady;
private boolean mScrolling;
private BitmapDrawable mPreviewImage;
public GesturePreference(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -62,15 +69,12 @@ public final class GesturePreference extends SwitchPreference {
.authority(context.getPackageName())
.appendPath(String.valueOf(animation))
.build();
mMediaMetadata = new MediaMetadataRetriever();
mMediaMetadata.setDataSource(mContext, mVideoPath);
mMediaPlayer = MediaPlayer.create(mContext, mVideoPath);
if (mMediaPlayer != null) {
mMediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
@Override
public void onSeekComplete(MediaPlayer mp) {
mPreviewReady = true;
mMediaPlayer.setOnSeekCompleteListener(null);
mVideoReady = true;
}
});
@@ -82,6 +86,7 @@ public final class GesturePreference extends SwitchPreference {
});
}
mAnimationAvailable = true;
} catch (Exception e) {
Log.w(TAG, "Animation resource not found. Will not show animation.");
} finally {
@@ -125,6 +130,7 @@ public final class GesturePreference extends SwitchPreference {
int height) {
if (mMediaPlayer != null) {
mMediaPlayer.setSurface(new Surface(surfaceTexture));
mVideoReady = false;
mMediaPlayer.seekTo(0);
}
}
@@ -136,12 +142,16 @@ public final class GesturePreference extends SwitchPreference {
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
if (mPreviewImage != null && imageView.getDrawable() == null) {
imageView.setImageDrawable(mPreviewImage);
}
imageView.setVisibility(View.VISIBLE);
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
if (mPreviewReady && imageView.getVisibility() == View.VISIBLE) {
if (mVideoReady && imageView.getVisibility() == View.VISIBLE) {
imageView.setVisibility(View.GONE);
} else if (mScrolling) {
mScrolling = false;
@@ -153,13 +163,14 @@ public final class GesturePreference extends SwitchPreference {
}
});
if (mPreviewImage != null) {
imageView.setImageDrawable(mPreviewImage);
}
}
@Override
public void onDetached() {
if (mMediaMetadata != null) {
mMediaMetadata.release();
}
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.reset();
@@ -172,4 +183,55 @@ public final class GesturePreference extends SwitchPreference {
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 DEBUG_DOZE_COMPONENT = "debug.doze.component";
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 List<GesturePreference> mPreferences;
@@ -71,7 +75,7 @@ public class GestureSettings extends SettingsPreferenceFragment implements
if (isCameraDoubleTapPowerGestureAvailable(getResources())) {
int cameraDisabled = Secure.getInt(
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 {
removePreference(PREF_KEY_DOUBLE_TAP_POWER);
}
@@ -79,14 +83,15 @@ public class GestureSettings extends SettingsPreferenceFragment implements
// Ambient Display
if (isDozeAvailable(context)) {
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 {
removePreference(PREF_KEY_PICK_UP_AND_NUDGE);
}
// Fingerprint slide for notifications
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 {
removePreference(PREF_KEY_SWIPE_DOWN_FINGERPRINT);
}
@@ -95,7 +100,8 @@ public class GestureSettings extends SettingsPreferenceFragment implements
if (isDoubleTwistAvailable(context)) {
int doubleTwistEnabled = Secure.getInt(
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 {
removePreference(PREF_KEY_DOUBLE_TWIST);
}
@@ -211,10 +217,11 @@ public class GestureSettings extends SettingsPreferenceFragment implements
return false;
}
private void addPreference(String key, boolean enabled) {
private void addPreference(String key, boolean enabled, int id) {
GesturePreference preference = (GesturePreference) findPreference(key);
preference.setChecked(enabled);
preference.setOnPreferenceChangeListener(this);
preference.loadPreview(getLoaderManager(), id);
mPreferences.add(preference);
}