- Call to MediaPlayer.create() method can return null, and hence we need to check the return value before trying access the media player. Change-Id: I4a5e0edbd6db21b678efb05ea733187f34185432 Fix: 36668356 Test: make RunSettingsRoboTests
158 lines
5.6 KiB
Java
158 lines
5.6 KiB
Java
/*
|
|
* Copyright (C) 2015 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License
|
|
*/
|
|
|
|
package com.android.settings.fingerprint;
|
|
|
|
import android.content.ContentResolver;
|
|
import android.content.Context;
|
|
import android.content.res.Resources;
|
|
import android.graphics.SurfaceTexture;
|
|
import android.media.MediaPlayer;
|
|
import android.media.MediaPlayer.OnInfoListener;
|
|
import android.media.MediaPlayer.OnPreparedListener;
|
|
import android.net.Uri;
|
|
import android.support.annotation.VisibleForTesting;
|
|
import android.util.AttributeSet;
|
|
import android.view.Surface;
|
|
import android.view.TextureView;
|
|
import android.view.View;
|
|
|
|
import com.android.settings.R;
|
|
|
|
/**
|
|
* A view containing a VideoView for showing the user how to enroll a fingerprint
|
|
*/
|
|
public class FingerprintLocationAnimationVideoView extends TextureView
|
|
implements FingerprintFindSensorAnimation {
|
|
protected float mAspect = 1.0f; // initial guess until we know
|
|
protected MediaPlayer mMediaPlayer;
|
|
|
|
public FingerprintLocationAnimationVideoView(Context context, AttributeSet attrs) {
|
|
super(context, attrs);
|
|
}
|
|
|
|
@Override
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
// Width is driven by measurespec, height is derrived from aspect ratio
|
|
int originalWidth = MeasureSpec.getSize(widthMeasureSpec);
|
|
int height = Math.round(mAspect * originalWidth);
|
|
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
|
|
}
|
|
|
|
protected Uri getFingerprintLocationAnimation() {
|
|
return resourceEntryToUri(getContext(), R.raw.fingerprint_location_animation);
|
|
}
|
|
|
|
@Override
|
|
protected void onFinishInflate() {
|
|
super.onFinishInflate();
|
|
setSurfaceTextureListener(new SurfaceTextureListener() {
|
|
private SurfaceTexture mTextureToDestroy = null;
|
|
|
|
@Override
|
|
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
|
|
int height) {
|
|
setVisibility(View.INVISIBLE);
|
|
Uri videoUri = getFingerprintLocationAnimation();
|
|
if (mMediaPlayer != null) {
|
|
mMediaPlayer.release();
|
|
}
|
|
if (mTextureToDestroy != null) {
|
|
mTextureToDestroy.release();
|
|
mTextureToDestroy = null;
|
|
}
|
|
mMediaPlayer = createMediaPlayer(mContext, videoUri);
|
|
if (mMediaPlayer == null) {
|
|
// MediaPlayer.create() method can return null
|
|
return;
|
|
}
|
|
mMediaPlayer.setSurface(new Surface(surfaceTexture));
|
|
mMediaPlayer.setOnPreparedListener(new OnPreparedListener() {
|
|
@Override
|
|
public void onPrepared(MediaPlayer mediaPlayer) {
|
|
mediaPlayer.setLooping(true);
|
|
}
|
|
});
|
|
mMediaPlayer.setOnInfoListener(new OnInfoListener() {
|
|
@Override
|
|
public boolean onInfo(MediaPlayer mediaPlayer, int what, int extra) {
|
|
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
|
|
// Keep the view hidden until video starts
|
|
setVisibility(View.VISIBLE);
|
|
}
|
|
return false;
|
|
}
|
|
});
|
|
mAspect = (float) mMediaPlayer.getVideoHeight() / mMediaPlayer.getVideoWidth();
|
|
requestLayout();
|
|
startAnimation();
|
|
}
|
|
|
|
@Override
|
|
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture,
|
|
int width, int height) {
|
|
}
|
|
|
|
@Override
|
|
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
|
|
mTextureToDestroy = surfaceTexture;
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
|
|
}
|
|
});
|
|
}
|
|
|
|
@VisibleForTesting
|
|
MediaPlayer createMediaPlayer(Context context, Uri videoUri) {
|
|
return MediaPlayer.create(mContext, videoUri);
|
|
}
|
|
|
|
protected static Uri resourceEntryToUri (Context context, int id) {
|
|
Resources res = context.getResources();
|
|
return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
|
|
res.getResourcePackageName(id) + '/' +
|
|
res.getResourceTypeName(id) + '/' +
|
|
res.getResourceEntryName(id));
|
|
}
|
|
|
|
@Override
|
|
public void startAnimation() {
|
|
if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
|
|
mMediaPlayer.start();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void stopAnimation() {
|
|
if (mMediaPlayer != null) {
|
|
mMediaPlayer.stop();
|
|
mMediaPlayer.release();
|
|
mMediaPlayer = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void pauseAnimation() {
|
|
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
|
|
mMediaPlayer.pause();
|
|
}
|
|
}
|
|
|
|
}
|