android.widget.MediaController

Here are the examples of the java api android.widget.MediaController taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.

53 Examples 7

19 Source : VideoView.java
with MIT License
from xugaoxiang

public void setMediaController(MediaController controller) {
}

19 Source : VideoFragment.java
with Apache License 2.0
from Kerr1Gan

/**
 * Created by Ethan_Xiang on 2017/10/10.
 */
public clreplaced VideoFragment extends Fragment {

    private String mVideoUrl = "http://sp.9ky.cc/vlook.php?id=YklkPTQ5NDcyMjY=";

    private MediaController mMediaController;

    private VideoView mVideoView;

    private int mLastPosition = 0;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.cc_fragment_video, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mMediaController = new MediaController(getContext());
        mVideoView = (VideoView) view.findViewById(R.id.video);
        mVideoView.setVideoPath(mVideoUrl);
        mVideoView.setMediaController(mMediaController);
        mVideoView.requestFocus();
    }

    @Override
    public void onResume() {
        super.onResume();
        mVideoView.start();
        mVideoView.seekTo(mLastPosition);
    }

    @Override
    public void onPause() {
        super.onPause();
        mVideoView.pause();
        mLastPosition = mVideoView.getCurrentPosition();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mVideoView.stopPlayback();
    }
}

19 Source : VideoViewTV.java
with Apache License 2.0
from JackChan1999

public void setMediaController(MediaController controller) {
    if (this.mediaController != null) {
        this.mediaController.hide();
    }
    this.mediaController = controller;
    attachMediaController();
}

19 Source : VideoViewH264mp4.java
with Apache License 2.0
from JackChan1999

public void setMediaController(MediaController controller) {
    if (this.mMediaController != null) {
        this.mMediaController.hide();
    }
    this.mMediaController = controller;
    attachMediaController();
}

19 Source : VideoPlayer.java
with Apache License 2.0
from djzhao627

/**
 * Created by djzhao on 17/04/29.
 */
public clreplaced VideoPlayer extends BaseActivity {

    private VideoView videoView;

    private MediaController mediaController;

    @Override
    protected void onCreate(Bundle paramBundle) {
        super.onCreate(paramBundle);
        setContentView(R.layout.activity_test_video_player);
        findViewById();
        initView();
    }

    @Override
    protected void findViewById() {
        this.videoView = $(R.id.player_test_vv);
    }

    @Override
    protected void initView() {
        // String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/movie.mp4";
        String uri = "android.resource://" + getPackageName() + "/" + R.raw.base;
        // 本地视频
        // videoView.setVideoPath(path);
        // 网络视频
        // videoView.setVideoURI(Uri.parse("http://www.runoob.com/try/demo_source/movie.mp4"));
        videoView.setVideoURI(Uri.parse(uri));
        mediaController = new MediaController(this);
        videoView.setMediaController(mediaController);
        mediaController.setMediaPlayer(videoView);
    }
}

19 Source : MainActivity.java
with MIT License
from a914-gowtham

public clreplaced MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final int REQUEST_TAKE_VIDEO = 552;

    private VideoView videoView;

    private MediaController mediaController;

    private EditText edtFixedGap, edtMinGap, edtMinFrom, edtMAxTo;

    private int trimType;

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        videoView = findViewById(R.id.video_view);
        edtFixedGap = findViewById(R.id.edt_fixed_gap);
        edtMinGap = findViewById(R.id.edt_min_gap);
        edtMinFrom = findViewById(R.id.edt_min_from);
        edtMAxTo = findViewById(R.id.edt_max_to);
        mediaController = new MediaController(this);
        findViewById(R.id.btn_default_trim).setOnClickListener(this);
        findViewById(R.id.btn_fixed_gap).setOnClickListener(this);
        findViewById(R.id.btn_min_gap).setOnClickListener(this);
        findViewById(R.id.btn_min_max_gap).setOnClickListener(this);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        try {
            if (requestCode == TrimVideo.VIDEO_TRIMMER_REQ_CODE && data != null) {
                Uri uri = Uri.parse(TrimVideo.getTrimmedVideoPath(data));
                Log.d(TAG, "Trimmed path:: " + uri);
                videoView.setMediaController(mediaController);
                videoView.setVideoURI(uri);
                videoView.requestFocus();
                videoView.start();
                videoView.setOnPreparedListener(mediaPlayer -> {
                    mediaController.setAnchorView(videoView);
                });
                String filepath = String.valueOf(uri);
                File file = new File(filepath);
                long length = file.length();
                Log.d(TAG, "Video size:: " + (length / 1024));
            } else if (requestCode == REQUEST_TAKE_VIDEO && resultCode == RESULT_OK) {
                /*    //check video duration if needed
                if (TrimmerUtils.getVideoDuration(this,data.getData())<=30){
                    Toast.makeText(this,"Video should be larger than 30 sec",Toast.LENGTH_SHORT).show();
                    return;
                }*/
                if (data.getData() != null) {
                    LogMessage.v("Video path:: " + data.getData());
                    openTrimActivity(String.valueOf(data.getData()));
                } else {
                    Toast.makeText(this, "video uri is null", Toast.LENGTH_SHORT).show();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void openTrimActivity(String data) {
        if (trimType == 0) {
            TrimVideo.activity(data).start(this);
        } else if (trimType == 1) {
            TrimVideo.activity(data).setTrimType(TrimType.FIXED_DURATION).setFixedDuration(getEdtValueLong(edtFixedGap)).start(this);
        } else if (trimType == 2) {
            TrimVideo.activity(data).setTrimType(TrimType.MIN_DURATION).setMinDuration(getEdtValueLong(edtMinGap)).start(this);
        } else {
            TrimVideo.activity(data).setTrimType(TrimType.MIN_MAX_DURATION).setMinToMax(getEdtValueLong(edtMinFrom), getEdtValueLong(edtMAxTo)).start(this);
        }
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()) {
            case R.id.btn_default_trim:
                onDefaultTrimClicked();
                break;
            case R.id.btn_fixed_gap:
                onFixedTrimClicked();
                break;
            case R.id.btn_min_gap:
                onMinGapTrimClicked();
                break;
            case R.id.btn_min_max_gap:
                onMinToMaxTrimClicked();
                break;
        }
    }

    private void onDefaultTrimClicked() {
        trimType = 0;
        if (checkCamStoragePer())
            showVideoOptions();
    }

    private void onFixedTrimClicked() {
        trimType = 1;
        if (isEdtTxtEmpty(edtFixedGap))
            Toast.makeText(this, "Enter fixed gap duration", Toast.LENGTH_SHORT).show();
        else if (checkCamStoragePer())
            showVideoOptions();
    }

    private void onMinGapTrimClicked() {
        trimType = 2;
        if (isEdtTxtEmpty(edtMinGap))
            Toast.makeText(this, "Enter min gap duration", Toast.LENGTH_SHORT).show();
        else if (checkCamStoragePer())
            showVideoOptions();
    }

    private void onMinToMaxTrimClicked() {
        trimType = 3;
        if (isEdtTxtEmpty(edtMinFrom))
            Toast.makeText(this, "Enter min gap duration", Toast.LENGTH_SHORT).show();
        else if (isEdtTxtEmpty(edtMAxTo))
            Toast.makeText(this, "Enter max gap duration", Toast.LENGTH_SHORT).show();
        else if (checkCamStoragePer())
            showVideoOptions();
    }

    public void showVideoOptions() {
        try {
            BottomSheet.Builder builder = getBottomSheet();
            builder.sheet(R.menu.menu_video);
            builder.listener(item -> {
                if (R.id.action_take == item.gereplacedemId())
                    captureVideo();
                else
                    openVideo();
                return false;
            });
            builder.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public BottomSheet.Builder getBottomSheet() {
        return new BottomSheet.Builder(this).replacedle(R.string.txt_option);
    }

    public void captureVideo() {
        try {
            Intent intent = new Intent("android.media.action.VIDEO_CAPTURE");
            intent.putExtra("android.intent.extra.durationLimit", 30);
            startActivityForResult(intent, REQUEST_TAKE_VIDEO);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void openVideo() {
        try {
            Intent intent = new Intent();
            intent.setType("video/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent, "Select Video"), REQUEST_TAKE_VIDEO);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (isPermissionOk(grantResults))
            showVideoOptions();
    }

    private boolean isEdtTxtEmpty(EditText editText) {
        return editText.getText().toString().trim().isEmpty();
    }

    private long getEdtValueLong(EditText editText) {
        return Long.parseLong(editText.getText().toString().trim());
    }

    private boolean checkCamStoragePer() {
        return checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA);
    }

    private boolean checkPermission(String... permissions) {
        boolean allPermitted = false;
        for (String permission : permissions) {
            allPermitted = (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED);
            if (!allPermitted)
                break;
        }
        if (allPermitted)
            return true;
        ActivityCompat.requestPermissions(this, permissions, 220);
        return false;
    }

    private boolean isPermissionOk(int... results) {
        boolean isAllGranted = true;
        for (int result : results) {
            if (PackageManager.PERMISSION_GRANTED != result) {
                isAllGranted = false;
                break;
            }
        }
        return isAllGranted;
    }
}

18 Source : MediaActivity.java
with Apache License 2.0
from yangchong211

public clreplaced MediaActivity extends AppCompatActivity {

    private VideoView mVideo;

    private Button mBtnStart;

    private Button mBtnPause;

    private MediaController mMediaController;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_media_player);
        initView();
        initListener();
    }

    private void initView() {
        mVideo = findViewById(R.id.video);
        mBtnStart = findViewById(R.id.btn_start);
        mBtnPause = findViewById(R.id.btn_pause);
        Uri uri = Uri.parse(ConstantVideo.VideoPlayerList[2]);
        mVideo.setVideoURI(uri);
        mMediaController = new MediaController(this);
        mVideo.setMediaController(mMediaController);
        mVideo.start();
        mVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                // mp.setLooping(true);
                // 播放
                mp.start();
                BaseToast.showRoundRectToast("开始播放!");
            }
        });
        mVideo.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                BaseToast.showRoundRectToast("播放完毕!");
            }
        });
    }

    private void initListener() {
        mBtnStart.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mVideo.start();
            }
        });
        mBtnPause.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mVideo.pause();
            }
        });
    }
}

18 Source : VideoPlayerFragment.java
with GNU General Public License v3.0
from victordiaz

public void loadVideo(final String path) {
    /*
         * Alternatively,for streaming media you can use
         * mVideoView.setVideoURI(Uri.parse(URLstring));
         */
    mVideoView.setVideoPath(path);
    MediaController mediaController = new MediaController(c);
    mediaController.setAnchorView(mVideoView);
    mVideoView.setMediaController(null);
    mVideoView.requestFocus();
    mVideoView.setKeepScreenOn(true);
    mVideoView.start();
    mVideoView.setOnClickListener(v -> close());
    mVideoView.setOnPreparedListener(new OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mp) {
            mp_ = mp;
            mp_.setLooping(true);
            // mVideoView.animate().rotation(200).alpha((float) 0.5)
            // .scaleX(0.2f).scaleY(0.2f).setDuration(2000);
            r = new Runnable() {

                @Override
                public void run() {
                    for (VideoListener l : listeners) {
                        try {
                            l.onTimeUpdate(mp_.getCurrentPosition(), mp_.getDuration());
                        } catch (Exception e) {
                        }
                    }
                    handler.postDelayed(this, 1000);
                }
            };
            handler.post(r);
        }
    });
    // mp_.setO
    mVideoView.setOnCompletionListener(mp -> {
        // finish();
        for (VideoListener l : listeners) {
            l.onFinish(true);
        }
    });
}

18 Source : TimelineVideoActivity.java
with GNU General Public License v3.0
from swentel

public clreplaced TimelineVideoActivity extends AppCompatActivity {

    VideoView videoPlayer;

    TextView noVideo;

    MediaController mediaController;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timeline_video);
        noVideo = findViewById(R.id.timeline_video_not_video_found);
        videoPlayer = findViewById(R.id.timeline_video);
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            final String videoUrl = extras.getString("video");
            if (videoUrl != null) {
                if (videoUrl.contains("youtube.com")) {
                    hideVideoPlayer(false);
                    TextView youtubeVideo = findViewById(R.id.timeline_video_youtube);
                    youtubeVideo.setVisibility(View.VISIBLE);
                    youtubeVideo.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                            Intent i = new Intent(Intent.ACTION_VIEW);
                            i.setData(Uri.parse(videoUrl));
                            startActivity(i);
                        }
                    });
                } else {
                    videoPlayer.setVideoPath(videoUrl);
                    videoPlayer.canPause();
                    mediaController = new MediaController(this);
                    mediaController.setAnchorView(videoPlayer);
                    videoPlayer.setMediaController(mediaController);
                    videoPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mediaController.show();
                            if (Preferences.getPreference(TimelineVideoActivity.this, "pref_key_video_autoplay", false)) {
                                videoPlayer.start();
                            }
                        }
                    });
                }
            } else {
                hideVideoPlayer(true);
            }
        } else {
            hideVideoPlayer(true);
        }
    }

    public void hideVideoPlayer(boolean showVideoNotFound) {
        videoPlayer.setVisibility(View.GONE);
        if (showVideoNotFound) {
            noVideo.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public void onBackPressed() {
        if (videoPlayer != null) {
            videoPlayer.stopPlayback();
        }
        super.onBackPressed();
    }

    @Override
    public void onDestroy() {
        if (videoPlayer != null) {
            videoPlayer.stopPlayback();
        }
        super.onDestroy();
    }
}

18 Source : PlayerControl.java
with Apache License 2.0
from Straas

private void processPlaybackState(PlaybackStateCompat state, MediaController mediaController) {
    if (state == null || state.getActiveQueueItemId() == StraasMediaCore.AD_PLAYBACK_ID) {
        return;
    }
    mLastPlaybackState = state;
    if (mediaController != null && mediaController.isShowing()) {
        mediaController.show();
    }
}

18 Source : MediaControllerSubject.java
with Apache License 2.0
from pkware

/**
 * Propositions for {@link MediaController} subjects.
 */
public clreplaced MediaControllerSubject extends AbstractFrameLayoutSubject<MediaController> {

    @Nullable
    private final MediaController actual;

    public MediaControllerSubject(@Nonnull FailureMetadata failureMetadata, @Nullable MediaController actual) {
        super(failureMetadata, actual);
        this.actual = actual;
    }

    public void isShowing() {
        check("isShowing()").that(actual.isShowing()).isTrue();
    }

    public void isNotShowing() {
        check("isShowing()").that(actual.isShowing()).isFalse();
    }
}

18 Source : PlaybackActivity.java
with Apache License 2.0
from pili-engineering

public clreplaced PlaybackActivity extends Activity implements MediaController.MediaPlayerControl {

    private static final String TAG = "PlaybackActivity";

    private static final String MP4_PATH = "MP4_PATH";

    private static final String PREVIOUS_ORIENTATION = "PREVIOUS_ORIENTATION";

    private SurfaceView mSurfaceView;

    private SurfaceHolder mSurfaceHolder;

    private MediaPlayer mMediaPlayer;

    private MediaController mMediaController;

    private String mVideoPath;

    private int mPreviousOrientation;

    private int mSeekingPosition = 0;

    public static void start(Activity activity, String mp4Path) {
        Intent intent = new Intent(activity, PlaybackActivity.clreplaced);
        intent.putExtra(MP4_PATH, mp4Path);
        activity.startActivity(intent);
    }

    public static void start(Activity activity, String mp4Path, int previousOrientation) {
        Intent intent = new Intent(activity, PlaybackActivity.clreplaced);
        intent.putExtra(MP4_PATH, mp4Path);
        intent.putExtra(PREVIOUS_ORIENTATION, previousOrientation);
        activity.startActivity(intent);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_playback);
        mVideoPath = getIntent().getStringExtra(MP4_PATH);
        mPreviousOrientation = getIntent().getIntExtra(PREVIOUS_ORIENTATION, 1);
        mMediaPlayer = new MediaPlayer();
        if (mMediaPlayer != null) {
            mMediaPlayer.setOnInfoListener(mOnInfoListener);
            mMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
            mMediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
            mMediaPlayer.setOnCompletionListener(mOnCompletionListener);
            mMediaPlayer.setOnErrorListener(mOnErrorListener);
        } else {
            Log.e(TAG, "creating MediaPlayer instance failed, exit.");
            return;
        }
        mSurfaceView = findViewById(R.id.video);
        mSurfaceView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (!mMediaController.isShowing()) {
                    mMediaController.show(0);
                } else {
                    mMediaController.hide();
                }
            }
        });
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                mMediaPlayer.setDisplay(mSurfaceHolder);
                if (!"".equals(mVideoPath) && !mMediaPlayer.isPlaying()) {
                    try {
                        mMediaPlayer.reset();
                        mMediaPlayer.setLooping(true);
                        mMediaPlayer.setDataSource(mVideoPath);
                        mMediaPlayer.prepare();
                        mMediaPlayer.seekTo(mSeekingPosition);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                makeUpVideoPlayingSize();
                mMediaPlayer.start();
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                if (mMediaPlayer.isPlaying()) {
                    mSeekingPosition = mMediaPlayer.getCurrentPosition();
                    mMediaPlayer.stop();
                }
            }
        });
        mMediaController = new MediaController(this);
        mMediaController.setMediaPlayer(this);
        mMediaController.setAnchorView(mSurfaceView);
    }

    private void makeUpVideoPlayingSize() {
        int screenWidth, screenHeight, videoWidth, videoHeight, displayWidth, displayHeight;
        float screenAspectRatio, videoAspectRatio;
        WindowManager windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        windowManager.getDefaultDisplay().getMetrics(outMetrics);
        screenWidth = outMetrics.widthPixels;
        screenHeight = outMetrics.heightPixels;
        screenAspectRatio = (float) screenHeight / screenWidth;
        Log.i(TAG, "Screen size: " + screenWidth + " × " + screenHeight);
        videoWidth = mMediaPlayer.getVideoWidth();
        videoHeight = mMediaPlayer.getVideoHeight();
        videoAspectRatio = (float) videoHeight / videoWidth;
        Log.i(TAG, "Video size: " + screenWidth + " × " + screenHeight);
        if (screenAspectRatio > videoAspectRatio) {
            displayWidth = screenWidth;
            displayHeight = (int) ((float) screenWidth / videoWidth * videoHeight);
        } else {
            displayWidth = (int) ((float) screenHeight / videoHeight * videoWidth);
            displayHeight = screenHeight;
        }
        mSurfaceHolder.setFixedSize(displayWidth, displayHeight);
    }

    @Override
    public void finish() {
        if (0 == mPreviousOrientation) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        super.finish();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMediaPlayer.stop();
        mMediaPlayer.release();
    }

    @Override
    public void start() {
        mMediaPlayer.start();
    }

    @Override
    public void pause() {
        mMediaPlayer.pause();
    }

    @Override
    public int getDuration() {
        return mMediaPlayer.getDuration();
    }

    @Override
    public int getCurrentPosition() {
        return mMediaPlayer.getCurrentPosition();
    }

    @Override
    public void seekTo(int pos) {
        mMediaPlayer.seekTo(pos);
    }

    @Override
    public boolean isPlaying() {
        return mMediaPlayer.isPlaying();
    }

    @Override
    public int getBufferPercentage() {
        return 0;
    }

    @Override
    public boolean canPause() {
        return true;
    }

    @Override
    public boolean canSeekBackward() {
        return true;
    }

    @Override
    public boolean canSeekForward() {
        return true;
    }

    @Override
    public int getAudioSessionId() {
        return 0;
    }

    private MediaPlayer.OnInfoListener mOnInfoListener = new MediaPlayer.OnInfoListener() {

        @Override
        public boolean onInfo(MediaPlayer mp, int what, int extra) {
            Log.i(TAG, "OnInfo, what = " + what + ", extra = " + extra);
            switch(what) {
                case MediaPlayer.MEDIA_INFO_UNKNOWN:
                    break;
                case MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:
                    break;
                case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
                    Log.i(TAG, "video rendering start, ts = " + extra);
                    break;
                case MediaPlayer.MEDIA_INFO_BUFFERING_START:
                    Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_BUFFERING_START");
                    break;
                case MediaPlayer.MEDIA_INFO_BUFFERING_END:
                    Log.i(TAG, "onInfo: MEDIA_INFO_BUFFERING_END");
                    break;
                case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:
                    Log.i(TAG, "onInfo: MEDIA_INFO_BAD_INTERLEAVING");
                    break;
                case MediaPlayer.MEDIA_INFO_NOT_SEEKABLE:
                    Log.i(TAG, "onInfo: MEDIA_INFO_NOT_SEEKABLE");
                    break;
                case MediaPlayer.MEDIA_INFO_METADATA_UPDATE:
                    Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_METADATA_UPDATE");
                    break;
                case MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBreplacedLE:
                    Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBreplacedLE");
                    break;
                case MediaPlayer.MEDIA_INFO_SUBreplacedLE_TIMED_OUT:
                    Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_SUBreplacedLE_TIMED_OUT ");
                    break;
                default:
                    break;
            }
            return true;
        }
    };

    private MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() {

        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            Log.e(TAG, "Error happened, errorCode = " + extra);
            final String errorTip;
            switch(extra) {
                case MediaPlayer.MEDIA_ERROR_IO:
                    /**
                     * SDK will do reconnecting automatically
                     */
                    Log.e(TAG, "IO Error!");
                    return false;
                case MediaPlayer.MEDIA_ERROR_MALFORMED:
                    errorTip = "Malformed bitstream!";
                    break;
                case MediaPlayer.MEDIA_ERROR_UNSUPPORTED:
                    errorTip = "Unsupported bitstream!";
                    break;
                case MediaPlayer.MEDIA_ERROR_TIMED_OUT:
                    errorTip = "Timeout!";
                    break;
                default:
                    errorTip = "unknown error !";
                    break;
            }
            if (errorTip != null) {
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        ToastUtils.s(PlaybackActivity.this, errorTip);
                    }
                });
            }
            finish();
            return true;
        }
    };

    private MediaPlayer.OnCompletionListener mOnCompletionListener = new MediaPlayer.OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer mp) {
            Log.i(TAG, "Play Completed !");
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    ToastUtils.s(PlaybackActivity.this, "Play Completed !");
                }
            });
            finish();
        }
    };

    private MediaPlayer.OnBufferingUpdateListener mOnBufferingUpdateListener = new MediaPlayer.OnBufferingUpdateListener() {

        @Override
        public void onBufferingUpdate(MediaPlayer mp, int percent) {
            Log.i(TAG, "onBufferingUpdate: " + percent);
        }
    };

    private MediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener = new MediaPlayer.OnVideoSizeChangedListener() {

        @Override
        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
            Log.i(TAG, "onVideoSizeChanged: width = " + width + ", height = " + height);
        }
    };
}

18 Source : AnotherRSS.java
with The Unlicense
from no-go

/**
 * Der Einstiegspunkt des Launchers.
 * In der Applications-Klreplacede befinden sich auch die initalen
 * Konfigurationen der SharedPreferences sowie einige Konstanten.
 *
 * @author Jochen Peters
 */
public clreplaced AnotherRSS extends Application {

    public static boolean showAdditionalFeed = true;

    public static String query = "";

    public static MediaPlayer mediaPlayer;

    public static MediaController mediaController;

    public static final String urls = "http://www.tagesschau.de/xml/rss2 " + "http://www.taz.de/!p4608;rss/ " + "http://www.deutschlandfunk.de/die-nachrichten.353.de.rss " + "https://www.npo3.nl/blog.rss " + "http://digisocken.de/_p/wdrWetter/?rss=true " + "http://feeds.bbci.co.uk/news/world/europe/rss.xml " + "http://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml " + "http://feeds.t-online.de/rss/nachrichten " + "https://www.wz.de/feed.rss " + "https://www.heise.de/security/news/news-atom.xml " + "https://www.amnesty.de/rss/news " + "https://rp-online.de/panorama/wissen/feed.rss " + "http://feeds.reuters.com/Reuters/UKWorldNews " + "http://feeds.reuters.com/reuters/scienceNews?format=xml " + "https://www1.wdr.de/mediathek/audio/wdr5/wdr5-alles-in-butter/alles-in-butter106.podcast " + "https://www1.wdr.de/mediathek/audio/wdr5/polit-wg/polit-wg-104.podcast " + "https://www.tagesschau.de/export/video-podcast/webm/tagesschau-in-100-sekunden_https " + "https://thebugcast.org/feed/ogg " + "http://feeds.feedburner.com/daily_tech_news_show?format=xml " + "http://www.wetterleitstelle.de/nordrhein-westfalen.xml";

    public static final boolean[] feedActive = { false, false, false, true, false, false, false, false, true, false, false, true, true, false, false, false, true, true, false, false };

    public static clreplaced Config {

        /**
         * really delete old database entries (marked as deleted)
         * older than Config.DEFAULT_expunge days
         */
        public static final int DEFAULT_autodelete = 14;

        public static final int DEFAULT_expunge = 5;

        public static final String DEFAULT_rsssec = "10800";

        public static final String DEFAULT_notifySound = "0";

        public static final String DEFAULT_notifyColor = "#FF00FFFF";

        public static final String DEFAULT_notifyType = "2";

        public static final int DEFAULT_NIGHT_START = 18;

        public static final int DEFAULT_NIGHT_STOP = 6;

        public static final String SEARCH_HINT_COLOR = "#FFAA00";

        public static final float DEFAULT_FONT_SIZE = 14.0f;

        public static final int DEFAULT_MAX_IMG_WIDTH = 120;

        public static final float IMG_ROUND = 15f;

        public static final String DEFAULT_regexAll = "";

        public static final String DEFAULT_regexTo = "";

        public static final boolean DEFAULT_OFFLINEHINT = false;

        /**
         * sollte eine Verbindung nicht zu sande kommen, wird ein neuer
         * Alarm in {@value #RETRYSEC_AFTER_OFFLINE} sec ausgelöst
         */
        public static final long RETRYSEC_AFTER_OFFLINE = 75L;
    }

    public static Alarm alarm = null;

    /**
     * So kann der {@link Refresher} erkennen, ob er nur im Hintergrund läuft.
     * Wäre withGui auf true, wird nur eine HeadUp Notifikation gezeigt.
     * An dieser Stelle wird klar, dreplaced der Alarm <i>doch</i> auf this zugreifen kann (?)
     */
    public static boolean withGui = false;

    public static final String TAG = AnotherRSS.clreplaced.getSimpleName();

    private static Context contextOfApplication;

    @Override
    public void onCreate() {
        super.onCreate();
        contextOfApplication = getApplicationContext();
        mediaPlayer = new MediaPlayer();
        SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        if (!mPreferences.contains("rss_url")) {
            mPreferences.edit().putString("rss_url", AnotherRSS.urls).commit();
            PreferencesActivity.storeArray(feedActive, "rss_url_act", getApplicationContext());
        } else {
            if (!mPreferences.contains("rss_url_act_0")) {
                String[] urls = mPreferences.getString("rss_url", AnotherRSS.urls).split(" ");
                boolean[] act = new boolean[urls.length];
                Arrays.fill(act, true);
                PreferencesActivity.storeArray(act, "rss_url_act", getApplicationContext());
            }
        }
        if (!mPreferences.contains("regexAll")) {
            mPreferences.edit().putString("regexAll", Config.DEFAULT_regexAll).commit();
        }
        if (!mPreferences.contains("regexTo")) {
            mPreferences.edit().putString("regexTo", Config.DEFAULT_regexTo).commit();
        }
        if (!mPreferences.contains("nightmode_use_start")) {
            mPreferences.edit().putInt("nightmode_use_start", Config.DEFAULT_NIGHT_START).commit();
        }
        if (!mPreferences.contains("nightmode_use_stop")) {
            mPreferences.edit().putInt("nightmode_use_stop", Config.DEFAULT_NIGHT_STOP).commit();
        }
        if (!mPreferences.contains("offline_hint")) {
            mPreferences.edit().putBoolean("offline_hint", Config.DEFAULT_OFFLINEHINT).commit();
        }
        if (!mPreferences.contains("autodelete")) {
            mPreferences.edit().putInt("autodelete", Config.DEFAULT_autodelete).commit();
        }
        if (alarm == null)
            alarm = new Alarm();
    }

    public static Context getContextOfApplication() {
        return contextOfApplication;
    }

    public static boolean inTimeSpan(int startH, int stopH) {
        int nowH = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
        if (startH == stopH && startH == nowH)
            return true;
        if (startH > stopH && (nowH <= stopH || nowH >= startH))
            return true;
        if (startH < stopH && nowH >= startH && nowH <= stopH)
            return true;
        return false;
    }
}

18 Source : VideoPlayer.java
with Apache License 2.0
from djzhao627

/**
 * Created by djzhao on 17/04/29.
 */
public clreplaced VideoPlayer extends BaseActivity {

    private VideoView videoView;

    private MediaController mediaController;

    private Context mContext;

    private int tag;

    private boolean videoStop;

    private int currentPosition;

    private String duration = "0";

    @Override
    protected void onCreate(Bundle paramBundle) {
        super.onCreate(paramBundle);
        tag = getIntent().getIntExtra("tag", 1);
        setContentView(R.layout.activity_test_video_player);
        findViewById();
        initView();
    }

    @Override
    protected void findViewById() {
        this.videoView = $(R.id.player_test_vv);
    }

    @Override
    protected void initView() {
        mContext = this;
        uiFlusHandler = new MyDialogHandler(mContext, "数据同步中...");
        loadVideo();
    }

    private void loadVideo() {
        // String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/movie.mp4";
        String uri = "android.resource://" + getPackageName() + "/";
        switch(tag) {
            case 1:
                duration = "8";
                uri += R.raw.base;
                break;
            case 2:
                duration = "9";
                uri += R.raw.enhance;
                break;
            case 3:
                duration = "11";
                uri += R.raw.acme;
                break;
        }
        // 本地视频
        // videoView.setVideoPath(path);
        // 网络视频
        // videoView.setVideoURI(Uri.parse("http://www.runoob.com/try/demo_source/movie.mp4"));
        videoView.setVideoURI(Uri.parse(uri));
        mediaController = new MediaController(this);
        videoView.setMediaController(mediaController);
        mediaController.setMediaPlayer(videoView);
        videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                videoStop = true;
                saveTrainRecord();
            }
        });
        videoView.start();
    }

    private void saveTrainRecord() {
        uiFlusHandler.sendEmptyMessage(SHOW_LOADING_DIALOG);
        String url = Constants.BASE_URL + "Train?method=addNewTrainRecord";
        OkHttpUtils.post().url(url).id(1).addParams("userId", Constants.USER.getUserId() + "").addParams("duration", duration).build().execute(new MyStringCallback());
    }

    private void showInfo() {
        String message = "";
        switch(tag) {
            case 1:
                message = "“肌撕裂者-初级”";
                break;
            case 2:
                message = "“肌撕裂者-中级”";
                break;
            case 3:
                message = "“肌撕裂者-极致”";
                break;
        }
        SystemClock.sleep(1000);
        AlertDialog.Builder builder = new AlertDialog.Builder(VideoPlayer.this);
        builder.setreplacedle("锻炼结束").setMessage("恭喜你," + message + "锻炼结束!").setPositiveButton("好的", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                finish();
            }
        }).create().show();
    }

    public clreplaced MyStringCallback extends StringCallback {

        @Override
        public void onResponse(String response, int id) {
            uiFlusHandler.sendEmptyMessage(DISMISS_LOADING_DIALOG);
            switch(id) {
                case 1:
                    if (response.contains("error")) {
                        DisplayToast("锻炼记录同步失败");
                    }
                    showInfo();
                    break;
                default:
                    DisplayToast("what?");
                    break;
            }
        }

        @Override
        public void onError(Call arg0, Exception arg1, int arg2) {
            Toast.makeText(mContext, "网络链接出错!", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (!videoStop) {
                videoView.pause();
                currentPosition = videoView.getCurrentPosition();
                AlertDialog.Builder builder = new AlertDialog.Builder(VideoPlayer.this);
                builder.setreplacedle("猛男").setMessage("你确定要放弃锻炼吗?").setPositiveButton("择日再战", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        finish();
                    }
                }).setNegativeButton("我怎么可能半途而废", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        videoView.seekTo(currentPosition);
                        videoView.start();
                    }
                }).create().show();
            }
        }
        return super.onKeyDown(keyCode, event);
    }
}

18 Source : PictureVideoPlayActivity.java
with Apache License 2.0
from Achenglove

/**
 * @author:luck
 * @data:2017/8/28 下午11:00
 * @描述: 视频播放类
 */
public clreplaced PictureVideoPlayActivity extends PictureBaseActivity implements MediaPlayer.OnErrorListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, View.OnClickListener {

    private String video_path = "";

    private ImageView picture_left_back;

    private MediaController mMediaController;

    private VideoView mVideoView;

    private ImageView iv_play;

    private int mPositionWhenPaused = -1;

    @Override
    public boolean isImmersive() {
        return false;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.picture_activity_video_play);
        video_path = getIntent().getStringExtra("video_path");
        picture_left_back = findViewById(R.id.picture_left_back);
        mVideoView = findViewById(R.id.video_view);
        mVideoView.setBackgroundColor(Color.BLACK);
        iv_play = findViewById(R.id.iv_play);
        mMediaController = new MediaController(this);
        mVideoView.setOnCompletionListener(this);
        mVideoView.setOnPreparedListener(this);
        mVideoView.setMediaController(mMediaController);
        picture_left_back.setOnClickListener(this);
        iv_play.setOnClickListener(this);
    }

    @Override
    public void onStart() {
        // Play Video
        mVideoView.setVideoPath(video_path);
        mVideoView.start();
        super.onStart();
    }

    @Override
    public void onPause() {
        // Stop video when the activity is pause.
        mPositionWhenPaused = mVideoView.getCurrentPosition();
        mVideoView.stopPlayback();
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        mMediaController = null;
        mVideoView = null;
        iv_play = null;
        super.onDestroy();
    }

    @Override
    public void onResume() {
        // Resume video player
        if (mPositionWhenPaused >= 0) {
            mVideoView.seekTo(mPositionWhenPaused);
            mPositionWhenPaused = -1;
        }
        super.onResume();
    }

    @Override
    public boolean onError(MediaPlayer player, int arg1, int arg2) {
        return false;
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        if (null != iv_play) {
            iv_play.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.picture_left_back) {
            finish();
        } else if (id == R.id.iv_play) {
            mVideoView.start();
            iv_play.setVisibility(View.INVISIBLE);
        }
    }

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(new ContextWrapper(newBase) {

            @Override
            public Object getSystemService(String name) {
                if (Context.AUDIO_SERVICE.equals(name)) {
                    return getApplicationContext().getSystemService(name);
                }
                return super.getSystemService(name);
            }
        });
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setOnInfoListener((mp1, what, extra) -> {
            if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
                // video started
                mVideoView.setBackgroundColor(Color.TRANSPARENT);
                return true;
            }
            return false;
        });
    }
}

17 Source : PreviewVideoActivity.java
with MIT License
from zhongjhATC

/**
 * 播放视频,用于录制后,在是否确认的界面中,播放视频
 */
private void playVideo(File file) {
    mVVPreview.pause();
    // mediaController 是底部控制条
    MediaController mediaController = new MediaController(PreviewVideoActivity.this);
    mediaController.setAnchorView(mVVPreview);
    mediaController.setMediaPlayer(mVVPreview);
    mediaController.setVisibility(View.GONE);
    mVVPreview.setMediaController(mediaController);
    Uri uri = Uri.fromFile(file);
    mVVPreview.setVideoURI(uri);
    // 这段代码需要放在更新视频文件后播放,不然会找不到文件。
    mVVPreview.setVisibility(View.VISIBLE);
    if (!mVVPreview.isPlaying()) {
        mVVPreview.start();
    }
    mVVPreview.setOnCompletionListener(mediaPlayer -> {
        // 循环播放
        if (!mVVPreview.isPlaying()) {
            mVVPreview.start();
        }
    });
}

17 Source : VideoPlayer.java
with GNU General Public License v3.0
from XecureIT

private void initializeVideoViewControls(@NonNull VideoView videoView) {
    MediaController mediaController = new MediaController(getContext());
    mediaController.setAnchorView(videoView);
    mediaController.setMediaPlayer(videoView);
    videoView.setMediaController(mediaController);
}

17 Source : ThemeManager.java
with GNU General Public License v3.0
from vassela

public void setMediaController(Context context, View view) {
    if (view instanceof MediaController) {
        MediaController v = (MediaController) view;
        for (int i = 0; i < v.getChildCount(); i++) {
            this.setMediaController(context, v.getChildAt(i));
        }
    } else if (view instanceof LinearLayout) {
        LinearLayout ll = (LinearLayout) view;
        for (int i = 0; i < ll.getChildCount(); i++) {
            this.setMediaController(context, ll.getChildAt(i));
        }
    } else if (view instanceof SeekBar) {
        ((SeekBar) view).getProgressDrawable().mutate().setColorFilter(context.getResources().getColor(getColorTheme(context)), PorterDuff.Mode.SRC_IN);
    }
}

17 Source : PlaybackActivity.java
with Apache License 2.0
from pili-engineering

public clreplaced PlaybackActivity extends Activity implements PLUploadResultListener, PLUploadProgressListener, MediaController.MediaPlayerControl {

    private static final String TAG = "PlaybackActivity";

    private static final String MP4_PATH = "MP4_PATH";

    private static final String PREVIOUS_ORIENTATION = "PREVIOUS_ORIENTATION";

    private SurfaceView mSurfaceView;

    private SurfaceHolder mSurfaceHolder;

    private MediaPlayer mMediaPlayer;

    private MediaController mMediaController;

    private Button mUploadBtn;

    private PLShortVideoUploader mVideoUploadManager;

    private ProgressBar mProgressBarDeterminate;

    private boolean mIsUpload = false;

    private String mVideoPath;

    private int mPreviousOrientation;

    private int mSeekingPosition = 0;

    public static void start(Activity activity, String mp4Path) {
        Intent intent = new Intent(activity, PlaybackActivity.clreplaced);
        intent.putExtra(MP4_PATH, mp4Path);
        activity.startActivity(intent);
    }

    public static void start(Activity activity, String mp4Path, int previousOrientation) {
        Intent intent = new Intent(activity, PlaybackActivity.clreplaced);
        intent.putExtra(MP4_PATH, mp4Path);
        intent.putExtra(PREVIOUS_ORIENTATION, previousOrientation);
        activity.startActivity(intent);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_replacedLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_playback);
        PLUploadSetting uploadSetting = new PLUploadSetting();
        uploadSetting.setHttpsEnabled(true);
        mVideoUploadManager = new PLShortVideoUploader(getApplicationContext(), uploadSetting);
        mVideoUploadManager.setUploadProgressListener(this);
        mVideoUploadManager.setUploadResultListener(this);
        mUploadBtn = (Button) findViewById(R.id.upload_btn);
        mUploadBtn.setText(R.string.upload);
        mUploadBtn.setOnClickListener(new UploadOnClickListener());
        mProgressBarDeterminate = (ProgressBar) findViewById(R.id.progressBar);
        mProgressBarDeterminate.setMax(100);
        mVideoPath = getIntent().getStringExtra(MP4_PATH);
        mPreviousOrientation = getIntent().getIntExtra(PREVIOUS_ORIENTATION, 1);
        mMediaPlayer = new MediaPlayer();
        if (mMediaPlayer != null) {
            mMediaPlayer.setOnInfoListener(mOnInfoListener);
            mMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
            mMediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
            mMediaPlayer.setOnCompletionListener(mOnCompletionListener);
            mMediaPlayer.setOnErrorListener(mOnErrorListener);
        } else {
            Log.e(TAG, "creating MediaPlayer instance failed, exit.");
            return;
        }
        mSurfaceView = (SurfaceView) findViewById(R.id.video);
        mSurfaceView.setOnClickListener(v -> {
            if (!mMediaController.isShowing()) {
                mMediaController.show(0);
            } else {
                mMediaController.hide();
            }
        });
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                mMediaPlayer.setDisplay(mSurfaceHolder);
                if (!"".equals(mVideoPath) && !mMediaPlayer.isPlaying()) {
                    try {
                        mMediaPlayer.reset();
                        mMediaPlayer.setLooping(true);
                        mMediaPlayer.setDataSource(mVideoPath);
                        mMediaPlayer.prepare();
                        mMediaPlayer.seekTo(mSeekingPosition);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                makeUpVideoPlayingSize();
                mMediaPlayer.start();
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                if (mMediaPlayer.isPlaying()) {
                    mSeekingPosition = mMediaPlayer.getCurrentPosition();
                    mMediaPlayer.stop();
                }
            }
        });
        mMediaController = new MediaController(this);
        mMediaController.setMediaPlayer(this);
        mMediaController.setAnchorView(mSurfaceView);
    }

    private void makeUpVideoPlayingSize() {
        int screenWidth, screenHeight, videoWidth, videoHeight, displayWidth, displayHeight;
        float screenAspectRatio, videoAspectRatio;
        WindowManager windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        windowManager.getDefaultDisplay().getMetrics(outMetrics);
        screenWidth = outMetrics.widthPixels;
        screenHeight = outMetrics.heightPixels;
        screenAspectRatio = (float) screenHeight / screenWidth;
        Log.i(TAG, "Screen size: " + screenWidth + " × " + screenHeight);
        videoWidth = mMediaPlayer.getVideoWidth();
        videoHeight = mMediaPlayer.getVideoHeight();
        videoAspectRatio = (float) videoHeight / videoWidth;
        Log.i(TAG, "Video size: " + screenWidth + " × " + screenHeight);
        if (screenAspectRatio > videoAspectRatio) {
            displayWidth = screenWidth;
            displayHeight = (int) ((float) screenWidth / videoWidth * videoHeight);
        } else {
            displayWidth = (int) ((float) screenHeight / videoHeight * videoWidth);
            displayHeight = screenHeight;
        }
        mSurfaceHolder.setFixedSize(displayWidth, displayHeight);
    }

    @Override
    public void finish() {
        if (0 == mPreviousOrientation) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        super.finish();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMediaPlayer.stop();
        mMediaPlayer.release();
    }

    @Override
    public void start() {
        mMediaPlayer.start();
    }

    @Override
    public void pause() {
        mMediaPlayer.pause();
    }

    @Override
    public int getDuration() {
        return mMediaPlayer.getDuration();
    }

    @Override
    public int getCurrentPosition() {
        return mMediaPlayer.getCurrentPosition();
    }

    @Override
    public void seekTo(int pos) {
        mMediaPlayer.seekTo(pos);
    }

    @Override
    public boolean isPlaying() {
        return mMediaPlayer.isPlaying();
    }

    @Override
    public int getBufferPercentage() {
        return 0;
    }

    @Override
    public boolean canPause() {
        return true;
    }

    @Override
    public boolean canSeekBackward() {
        return true;
    }

    @Override
    public boolean canSeekForward() {
        return true;
    }

    @Override
    public int getAudioSessionId() {
        return 0;
    }

    public clreplaced UploadOnClickListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            if (!mIsUpload) {
                mVideoUploadManager.startUpload(mVideoPath, Config.TOKEN);
                mProgressBarDeterminate.setVisibility(View.VISIBLE);
                mUploadBtn.setText(R.string.cancel_upload);
                mIsUpload = true;
            } else {
                mVideoUploadManager.cancelUpload();
                mProgressBarDeterminate.setVisibility(View.INVISIBLE);
                mUploadBtn.setText(R.string.upload);
                mIsUpload = false;
            }
        }
    }

    @Override
    public void onUploadProgress(String fileName, double percent) {
        mProgressBarDeterminate.setProgress((int) (percent * 100));
        if (1.0 == percent) {
            mProgressBarDeterminate.setVisibility(View.INVISIBLE);
        }
    }

    public void copyToClipboard(String filePath) {
        ClipData clipData = ClipData.newPlainText("VideoFilePath", filePath);
        ClipboardManager clipboardManager = (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);
        clipboardManager.setPrimaryClip(clipData);
    }

    @Override
    public void onUploadVideoSuccess(JSONObject response) {
        try {
            final String filePath = "http://" + Config.DOMAIN + "/" + response.getString("key");
            copyToClipboard(filePath);
            runOnUiThread(() -> ToastUtils.showLongToast(PlaybackActivity.this, "文件上传成功," + filePath + "已复制到粘贴板"));
            mUploadBtn.setVisibility(View.INVISIBLE);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onUploadVideoFailed(final int statusCode, final String error) {
        runOnUiThread(() -> ToastUtils.showLongToast(PlaybackActivity.this, "Upload failed, statusCode = " + statusCode + " error = " + error));
    }

    private MediaPlayer.OnInfoListener mOnInfoListener = new MediaPlayer.OnInfoListener() {

        @Override
        public boolean onInfo(MediaPlayer mp, int what, int extra) {
            Log.i(TAG, "OnInfo, what = " + what + ", extra = " + extra);
            switch(what) {
                case MediaPlayer.MEDIA_INFO_UNKNOWN:
                    break;
                case MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:
                    break;
                case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
                    Log.i(TAG, "video rendering start, ts = " + extra);
                    break;
                case MediaPlayer.MEDIA_INFO_BUFFERING_START:
                    Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_BUFFERING_START");
                    break;
                case MediaPlayer.MEDIA_INFO_BUFFERING_END:
                    Log.i(TAG, "onInfo: MEDIA_INFO_BUFFERING_END");
                    break;
                case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:
                    Log.i(TAG, "onInfo: MEDIA_INFO_BAD_INTERLEAVING");
                    break;
                case MediaPlayer.MEDIA_INFO_NOT_SEEKABLE:
                    Log.i(TAG, "onInfo: MEDIA_INFO_NOT_SEEKABLE");
                    break;
                case MediaPlayer.MEDIA_INFO_METADATA_UPDATE:
                    Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_METADATA_UPDATE");
                    break;
                case MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBreplacedLE:
                    Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBreplacedLE");
                    break;
                case MediaPlayer.MEDIA_INFO_SUBreplacedLE_TIMED_OUT:
                    Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_SUBreplacedLE_TIMED_OUT ");
                    break;
                default:
                    break;
            }
            return true;
        }
    };

    private MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() {

        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            Log.e(TAG, "Error happened, errorCode = " + extra);
            final String errorTip;
            switch(extra) {
                case MediaPlayer.MEDIA_ERROR_IO:
                    /**
                     * SDK will do reconnecting automatically
                     */
                    Log.e(TAG, "IO Error!");
                    return false;
                case MediaPlayer.MEDIA_ERROR_MALFORMED:
                    errorTip = "Malformed bitstream!";
                    break;
                case MediaPlayer.MEDIA_ERROR_UNSUPPORTED:
                    errorTip = "Unsupported bitstream!";
                    break;
                case MediaPlayer.MEDIA_ERROR_TIMED_OUT:
                    errorTip = "Timeout!";
                    break;
                default:
                    errorTip = "unknown error !";
                    break;
            }
            if (errorTip != null) {
                runOnUiThread(() -> ToastUtils.showShortToast(PlaybackActivity.this, errorTip));
            }
            finish();
            return true;
        }
    };

    private MediaPlayer.OnCompletionListener mOnCompletionListener = mp -> {
        Log.i(TAG, "Play Completed !");
        runOnUiThread(() -> ToastUtils.showShortToast(PlaybackActivity.this, "Play Completed !"));
        finish();
    };

    private MediaPlayer.OnBufferingUpdateListener mOnBufferingUpdateListener = (mp, percent) -> {
        Log.i(TAG, "onBufferingUpdate: " + percent);
    };

    private MediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener = (mp, width, height) -> {
        Log.i(TAG, "onVideoSizeChanged: width = " + width + ", height = " + height);
    };
}

17 Source : VideoPlayerActivity.java
with Apache License 2.0
from liying2008

private void init() {
    BaseConfig.sPositionWhenPaused = -1;
    // Create media controller
    MediaController mediaController = new MediaController(this);
    // 设置MediaController
    mVideoView.setMediaController(mediaController);
    mVideoView.setOnCompletionListener(this);
    mVideoView.setOnErrorListener(this);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        mVideoView.setOnInfoListener(this);
    } else {
        mLoadingView.setVisibility(View.GONE);
    }
    mVideoView.setOnPreparedListener(this);
    mGestureDetector = new GestureDetector(this, new MyGestureListener());
    Uri uri = Uri.parse(mVideoUrl);
    mVideoView.setVideoURI(uri);
}

17 Source : VideoViewH264mp4.java
with Apache License 2.0
from JackChan1999

public clreplaced VideoViewH264mp4 extends SurfaceView implements LetvMediaPlayerControl {

    public static final int STATE_ENFORCEMENT = 7;

    public static final int STATE_ERROR = -1;

    public static final int STATE_IDLE = 0;

    public static final int STATE_PAUSED = 4;

    public static final int STATE_PLAYBACK_COMPLETED = 5;

    public static final int STATE_PLAYING = 3;

    public static final int STATE_PREPARED = 2;

    public static final int STATE_PREPARING = 1;

    public static final int STATE_STOPBACK = 6;

    private final int FORWARD_TIME;

    private final int REWIND_TIME;

    private String TAG;

    private boolean enforcementPause;

    private boolean enforcementWait;

    protected int lastSeekWhenDestoryed;

    private OnBufferingUpdateListener mBufferingUpdateListener;

    private boolean mCanPause;

    private boolean mCanSeekBack;

    private boolean mCanSeekForward;

    private OnCompletionListener mCompletionListener;

    private WeakReference<Context> mContext;

    private int mCurrentBufferPercentage;

    private int mCurrentState;

    private int mDuration;

    private OnErrorListener mErrorListener;

    private OnInfoListener mInfoListener;

    private MediaController mMediaController;

    private MediaPlayer mMediaPlayer;

    private OnBufferingUpdateListener mOnBufferingUpdateListener;

    private OnCompletionListener mOnCompletionListener;

    private OnErrorListener mOnErrorListener;

    private OnInfoListener mOnInfoListener;

    private OnMediaStateTimeListener mOnMediaStateTimeListener;

    private OnPreparedListener mOnPreparedListener;

    private OnSeekCompleteListener mOnSeekCompleteListener;

    private OnVideoSizeChangedListener mOnVideoSizeChangedListener;

    private OnVideoViewStateChangeListener mOnVideoViewStateChangeListener;

    private PlayUrl mPlayerUrl;

    OnPreparedListener mPreparedListener;

    private int mRatioType;

    Callback mSHCallback;

    private OnSeekCompleteListener mSeekCompleteListener;

    private int mSeekWhenPrepared;

    OnVideoSizeChangedListener mSizeChangedListener;

    private int mSurfaceHeight;

    private SurfaceHolder mSurfaceHolder;

    private int mSurfaceWidth;

    private int mTargetState;

    private Uri mUri;

    private int mVideoHeight;

    private int mVideoWidth;

    public VideoViewH264mp4(Context context) {
        super(context);
        this.TAG = "VideoViewH264mp4";
        this.mCurrentState = 0;
        this.mTargetState = 0;
        this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.mSurfaceHolder = null;
        this.mMediaPlayer = null;
        this.mRatioType = -1;
        this.lastSeekWhenDestoryed = 0;
        this.enforcementWait = false;
        this.enforcementPause = false;
        this.mSizeChangedListener = new OnVideoSizeChangedListener() {

            public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
                LogTag.i("onVideoSizeChanged(), width=" + width + ", heigth=" + height);
                VideoViewH264mp4.this.mVideoWidth = mp.getVideoWidth();
                VideoViewH264mp4.this.mVideoHeight = mp.getVideoHeight();
                if (!(VideoViewH264mp4.this.mVideoWidth == 0 || VideoViewH264mp4.this.mVideoHeight == 0)) {
                    VideoViewH264mp4.this.getHolder().setFixedSize(VideoViewH264mp4.this.mVideoWidth, VideoViewH264mp4.this.mVideoHeight);
                }
                if (VideoViewH264mp4.this.mOnVideoSizeChangedListener != null) {
                    VideoViewH264mp4.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, width, height);
                }
            }
        };
        this.mPreparedListener = new OnPreparedListener() {

            public void onPrepared(MediaPlayer mp) {
                LogTag.i("onPrepared()");
                String currentDate = Tools.getCurrentDate();
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264mp4(普通手机videoview)  onPrepared()");
                if (VideoViewH264mp4.this.mOnMediaStateTimeListener != null) {
                    VideoViewH264mp4.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
                }
                VideoViewH264mp4.this.mCurrentState = 2;
                VideoViewH264mp4.this.StateChange(VideoViewH264mp4.this.mCurrentState);
                VideoViewH264mp4 videoViewH264mp4 = VideoViewH264mp4.this;
                VideoViewH264mp4 videoViewH264mp42 = VideoViewH264mp4.this;
                VideoViewH264mp4.this.mCanSeekForward = true;
                videoViewH264mp42.mCanSeekBack = true;
                videoViewH264mp4.mCanPause = true;
                if (VideoViewH264mp4.this.mMediaController != null) {
                    VideoViewH264mp4.this.mMediaController.setEnabled(true);
                }
                VideoViewH264mp4.this.mVideoWidth = mp.getVideoWidth();
                VideoViewH264mp4.this.mVideoHeight = mp.getVideoHeight();
                int seekToPosition = VideoViewH264mp4.this.mSeekWhenPrepared;
                if (seekToPosition != 0) {
                    VideoViewH264mp4.this.seekTo(seekToPosition);
                }
                if (VideoViewH264mp4.this.mVideoWidth != 0 && VideoViewH264mp4.this.mVideoHeight != 0) {
                    VideoViewH264mp4.this.getHolder().setFixedSize(VideoViewH264mp4.this.mVideoWidth, VideoViewH264mp4.this.mVideoHeight);
                    if (VideoViewH264mp4.this.mSurfaceWidth == VideoViewH264mp4.this.mVideoWidth && VideoViewH264mp4.this.mSurfaceHeight == VideoViewH264mp4.this.mVideoHeight) {
                        if (VideoViewH264mp4.this.mTargetState == 3) {
                            VideoViewH264mp4.this.start();
                            if (VideoViewH264mp4.this.mMediaController != null) {
                                VideoViewH264mp4.this.mMediaController.show();
                            }
                        } else if (!VideoViewH264mp4.this.isPlaying() && ((seekToPosition != 0 || VideoViewH264mp4.this.getCurrentPosition() > 0) && VideoViewH264mp4.this.mMediaController != null)) {
                            VideoViewH264mp4.this.mMediaController.show(0);
                        }
                    }
                } else if (VideoViewH264mp4.this.mTargetState == 3) {
                    VideoViewH264mp4.this.start();
                }
                if (VideoViewH264mp4.this.mOnPreparedListener != null) {
                    VideoViewH264mp4.this.mOnPreparedListener.onPrepared(mp);
                }
            }
        };
        this.mCompletionListener = new OnCompletionListener() {

            public void onCompletion(MediaPlayer mp) {
                LogTag.i("onCompletion()");
                VideoViewH264mp4.this.mCurrentState = 5;
                VideoViewH264mp4.this.StateChange(VideoViewH264mp4.this.mCurrentState);
                VideoViewH264mp4.this.mTargetState = 5;
                VideoViewH264mp4.this.mCurrentState = 6;
                VideoViewH264mp4.this.StateChange(VideoViewH264mp4.this.mCurrentState);
                if (VideoViewH264mp4.this.mMediaController != null) {
                    VideoViewH264mp4.this.mMediaController.hide();
                }
                if (VideoViewH264mp4.this.mOnCompletionListener != null) {
                    VideoViewH264mp4.this.mOnCompletionListener.onCompletion(mp);
                }
            }
        };
        this.mErrorListener = new OnErrorListener() {

            public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
                LogTag.i("onError(): framework_err=" + framework_err + ", impl_err=" + impl_err);
                VideoViewH264mp4.this.mCurrentState = -1;
                VideoViewH264mp4.this.StateChange(VideoViewH264mp4.this.mCurrentState);
                VideoViewH264mp4.this.mTargetState = -1;
                if (VideoViewH264mp4.this.mMediaController != null) {
                    VideoViewH264mp4.this.mMediaController.hide();
                }
                if (VideoViewH264mp4.this.mOnErrorListener != null) {
                    VideoViewH264mp4.this.mOnErrorListener.onError(mp, framework_err, impl_err);
                }
                String currentDate = Tools.getCurrentDate();
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + "VideoViewH264mp4(普通手机videoview) 播放出错error, framework_err=" + framework_err + ", impl_err=" + impl_err);
                if (VideoViewH264mp4.this.mOnMediaStateTimeListener != null) {
                    VideoViewH264mp4.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
                }
                return true;
            }
        };
        this.mBufferingUpdateListener = new OnBufferingUpdateListener() {

            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                VideoViewH264mp4.this.mCurrentBufferPercentage = percent;
                if (VideoViewH264mp4.this.mOnBufferingUpdateListener != null) {
                    VideoViewH264mp4.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
                }
            }
        };
        this.mSeekCompleteListener = new OnSeekCompleteListener() {

            public void onSeekComplete(MediaPlayer mp) {
                LogTag.i("onSeekComplete()");
                if (VideoViewH264mp4.this.mOnSeekCompleteListener != null) {
                    VideoViewH264mp4.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264mp4.this.mMediaPlayer);
                }
            }
        };
        this.mInfoListener = new OnInfoListener() {

            public boolean onInfo(MediaPlayer mp, int what, int extra) {
                if (VideoViewH264mp4.this.mOnInfoListener != null) {
                    VideoViewH264mp4.this.mOnInfoListener.onInfo(mp, what, extra);
                }
                return false;
            }
        };
        this.mSHCallback = new Callback() {

            public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
                LogTag.i("mSHCallback:surfaceChanged(), w=" + w + ", h=" + h);
                VideoViewH264mp4.this.mSurfaceWidth = w;
                VideoViewH264mp4.this.mSurfaceHeight = h;
                boolean isValidState;
                if (VideoViewH264mp4.this.mTargetState == 3) {
                    isValidState = true;
                } else {
                    isValidState = false;
                }
                boolean hasValidSize;
                if (VideoViewH264mp4.this.mVideoWidth == w && VideoViewH264mp4.this.mVideoHeight == h) {
                    hasValidSize = true;
                } else {
                    hasValidSize = false;
                }
                if (VideoViewH264mp4.this.mMediaPlayer != null && isValidState && hasValidSize) {
                    if (VideoViewH264mp4.this.mSeekWhenPrepared != 0) {
                        VideoViewH264mp4.this.seekTo(VideoViewH264mp4.this.mSeekWhenPrepared);
                    }
                    VideoViewH264mp4.this.start();
                    if (VideoViewH264mp4.this.mMediaController != null) {
                        VideoViewH264mp4.this.mMediaController.show();
                    }
                }
            }

            public void surfaceCreated(SurfaceHolder holder) {
                LogTag.i("mSHCallback:surfaceCreated()");
                VideoViewH264mp4.this.mSurfaceHolder = holder;
                VideoViewH264mp4.this.openVideo();
            }

            public void surfaceDestroyed(SurfaceHolder holder) {
                LogTag.i("mSHCallback:surfaceDestroyed()");
                VideoViewH264mp4.this.mSurfaceHolder = null;
                if (VideoViewH264mp4.this.mMediaController != null) {
                    VideoViewH264mp4.this.mMediaController.hide();
                }
                VideoViewH264mp4.this.lastSeekWhenDestoryed = VideoViewH264mp4.this.getCurrentPosition();
                VideoViewH264mp4.this.release(true);
            }
        };
        this.mContext = new WeakReference(context);
        initVideoView();
    }

    public VideoViewH264mp4(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        this.mContext = new WeakReference(context);
        initVideoView();
    }

    public VideoViewH264mp4(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.TAG = "VideoViewH264mp4";
        this.mCurrentState = 0;
        this.mTargetState = 0;
        this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.mSurfaceHolder = null;
        this.mMediaPlayer = null;
        this.mRatioType = -1;
        this.lastSeekWhenDestoryed = 0;
        this.enforcementWait = false;
        this.enforcementPause = false;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        this.mContext = new WeakReference(context);
        initVideoView();
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
        int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
        if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
            switch(this.mRatioType) {
                case -1:
                    if (this.mVideoWidth * height < this.mVideoHeight * width) {
                        if (this.mVideoWidth * height < this.mVideoHeight * width) {
                            width = (this.mVideoWidth * height) / this.mVideoHeight;
                            break;
                        }
                    }
                    height = (this.mVideoHeight * width) / this.mVideoWidth;
                    break;
                    break;
                case 1:
                    if (height * 4 <= width * 3) {
                        if (height * 4 < width * 3) {
                            width = (height * 4) / 3;
                            break;
                        }
                    }
                    height = (width * 3) / 4;
                    break;
                    break;
                case 2:
                    if (height * 16 <= width * 9) {
                        if (height * 16 < width * 9) {
                            width = (height * 16) / 9;
                            break;
                        }
                    }
                    height = (width * 9) / 16;
                    break;
                    break;
            }
        }
        setMeasuredDimension(width + 3, height + 3);
    }

    public void adjust(int type) {
        this.mRatioType = type;
        invalateScreenSize();
    }

    private void invalateScreenSize() {
        setLayoutParams((LayoutParams) getLayoutParams());
    }

    public int resolveAdjustedSize(int desiredSize, int measureSpec) {
        int result = desiredSize;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        switch(specMode) {
            case Integer.MIN_VALUE:
                return Math.min(desiredSize, specSize);
            case 0:
                return desiredSize;
            case 1073741824:
                return specSize;
            default:
                return result;
        }
    }

    private void initVideoView() {
        this.mVideoWidth = 0;
        this.mVideoHeight = 0;
        getHolder().addCallback(this.mSHCallback);
        getHolder().setType(3);
        setFocusable(true);
        setFocusableInTouchMode(true);
        requestFocus();
        this.mCurrentState = 0;
        StateChange(this.mCurrentState);
        this.mTargetState = 0;
    }

    public void setVideoPath(String path) {
        this.mPlayerUrl = new PlayUrl();
        this.mPlayerUrl.setVid(-1);
        this.mPlayerUrl.setUrl(path);
        this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
        setVideoURI(Uri.parse(path));
    }

    public void setVideoPath(String path, Map<String, String> map) {
    }

    public void setVideoURI(Uri uri) {
        String currentDate = Tools.getCurrentDate();
        LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264mp4(普通手机videoview)  setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
        if (this.mOnMediaStateTimeListener != null) {
            this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
        }
        this.mUri = uri;
        this.mSeekWhenPrepared = 0;
        openVideo();
        requestLayout();
        invalidate();
        LogTag.i("setVideoURI(), url=" + (uri != null ? uri.toString() : "null"));
    }

    private void openVideo() {
        if (this.mUri == null || this.mSurfaceHolder == null || this.mContext.get() == null) {
            setVisibility(0);
            return;
        }
        Intent i = new Intent("com.android.music.musicservicecommand");
        i.putExtra("command", "pause");
        ((Context) this.mContext.get()).sendBroadcast(i);
        release(false);
        try {
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264mp4(普通手机videoview)  创建MediaPlayer对象");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
            }
            this.mMediaPlayer = new MediaPlayer();
            this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
            this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
            this.mDuration = -1;
            this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
            this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
            this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
            this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
            this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
            this.mCurrentBufferPercentage = 0;
            this.mMediaPlayer.setDataSource((Context) this.mContext.get(), this.mUri);
            this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
            this.mMediaPlayer.setAudioStreamType(3);
            this.mMediaPlayer.setScreenOnWhilePlaying(true);
            this.mMediaPlayer.prepareAsync();
            this.mCurrentState = 1;
            StateChange(this.mCurrentState);
            attachMediaController();
        } catch (IOException ex) {
            LogTag.i("Unable to open content: " + this.mUri + " ,IOException=" + ex);
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        } catch (IllegalArgumentException ex2) {
            LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex2);
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        }
    }

    public void setMediaController(MediaController controller) {
        if (this.mMediaController != null) {
            this.mMediaController.hide();
        }
        this.mMediaController = controller;
        attachMediaController();
    }

    private void attachMediaController() {
        if (this.mMediaPlayer != null && this.mMediaController != null) {
            View anchorView;
            this.mMediaController.setMediaPlayer(this);
            if (getParent() instanceof View) {
                anchorView = (View) getParent();
            } else {
                anchorView = this;
            }
            this.mMediaController.setAnchorView(anchorView);
            this.mMediaController.setEnabled(isInPlaybackState());
        }
    }

    private void release(boolean cleartargetstate) {
        if (this.mMediaPlayer != null) {
            this.mMediaPlayer.reset();
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewH264mp4 release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            if (cleartargetstate) {
                this.mTargetState = 0;
            }
        }
    }

    public boolean onTrackballEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        boolean isKeyCodeSupported;
        if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
            isKeyCodeSupported = false;
        } else {
            isKeyCodeSupported = true;
        }
        if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
            if (keyCode == 79 || keyCode == 85) {
                if (this.mMediaPlayer.isPlaying()) {
                    pause();
                    this.mMediaController.show();
                    return true;
                }
                start();
                this.mMediaController.hide();
                return true;
            } else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
                pause();
                this.mMediaController.show();
            } else {
                toggleMediaControlsVisiblity();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    public int getLastSeekWhenDestoryed() {
        return this.lastSeekWhenDestoryed;
    }

    private void toggleMediaControlsVisiblity() {
        if (this.mMediaController.isShowing()) {
            this.mMediaController.hide();
        } else {
            this.mMediaController.show();
        }
    }

    public void start() {
        if (this.mContext.get() != null) {
            HttpRequestManager.getInstance((Context) this.mContext.get()).requestCapability();
            if (this.enforcementWait || this.enforcementPause) {
                StateChange(7);
            } else if (isInPlaybackState()) {
                LogTag.i("start()  Mp4系统播放器开始播放");
                this.mMediaPlayer.start();
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + " VideoViewH264mp4(普通手机videoview)  start()");
                this.mCurrentState = 3;
                StateChange(this.mCurrentState);
            }
            this.mTargetState = 3;
        }
    }

    public void pause() {
        if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
            LogTag.i("pause()");
            this.mMediaPlayer.pause();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + " VideoViewH264mp4(普通手机videoview)  pause()");
            this.mCurrentState = 4;
            StateChange(this.mCurrentState);
        }
        this.mTargetState = 4;
    }

    public int getDuration() {
        if (!isInPlaybackState()) {
            this.mDuration = -1;
            LogTag.i("getDuration()=" + this.mDuration);
            return this.mDuration;
        } else if (this.mDuration > 0) {
            return this.mDuration;
        } else {
            this.mDuration = this.mMediaPlayer.getDuration();
            LogTag.i("getDuration()=" + this.mDuration);
            return this.mDuration;
        }
    }

    public int getCurrentPosition() {
        if (isInPlaybackState()) {
            return this.mMediaPlayer.getCurrentPosition();
        }
        return 0;
    }

    public void seekTo(int msec) {
        if (isInPlaybackState()) {
            this.mMediaPlayer.seekTo(msec);
            this.mSeekWhenPrepared = 0;
            this.lastSeekWhenDestoryed = 0;
            return;
        }
        this.mSeekWhenPrepared = msec;
        this.lastSeekWhenDestoryed = 0;
    }

    public void forward() {
        seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
    }

    public void rewind() {
        seekTo(getCurrentPosition() - 15000);
    }

    public boolean isPlaying() {
        return isInPlaybackState() && this.mMediaPlayer.isPlaying();
    }

    public boolean isPaused() {
        return this.mCurrentState == 4;
    }

    public boolean isInPlaybackState() {
        return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
    }

    public int getBufferPercentage() {
        if (this.mMediaPlayer != null) {
            return this.mCurrentBufferPercentage;
        }
        return 0;
    }

    public boolean canPause() {
        return this.mCanPause;
    }

    public boolean canSeekBackward() {
        return this.mCanSeekBack;
    }

    public boolean canSeekForward() {
        return this.mCanSeekForward;
    }

    public boolean isEnforcementWait() {
        return this.enforcementWait;
    }

    public void setEnforcementWait(boolean enforcementWait) {
        this.enforcementWait = enforcementWait;
    }

    public boolean isEnforcementPause() {
        return this.enforcementPause;
    }

    public void setEnforcementPause(boolean enforcementPause) {
        this.enforcementPause = enforcementPause;
    }

    public void stopPlayback() {
        LogTag.i("stopPlayback()");
        StateChange(6);
        if (this.mMediaPlayer != null) {
            String currentDateStop = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateStop + "VideoViewH264mp4 stop()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
            }
            this.mMediaPlayer.stop();
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewH264mp4 release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            this.mTargetState = 0;
            setVisibility(4);
        }
    }

    public View getView() {
        return this;
    }

    private void StateChange(int mCurrentState) {
        LogTag.i("StateChange(), mCurrentState=" + mCurrentState);
        if (this.mOnVideoViewStateChangeListener != null) {
            this.mOnVideoViewStateChangeListener.onChange(mCurrentState);
        }
    }

    public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener videoViewListener) {
        this.mOnVideoViewStateChangeListener = videoViewListener;
    }

    public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
        this.mOnBufferingUpdateListener = l;
    }

    public void setOnCompletionListener(OnCompletionListener l) {
        this.mOnCompletionListener = l;
    }

    public void setOnErrorListener(OnErrorListener l) {
        this.mOnErrorListener = l;
    }

    public void setOnInfoListener(OnInfoListener l) {
        this.mOnInfoListener = l;
    }

    public void setOnPreparedListener(OnPreparedListener l) {
        this.mOnPreparedListener = l;
    }

    public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
        this.mOnSeekCompleteListener = l;
    }

    public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
        this.mOnVideoSizeChangedListener = l;
    }

    public void setVideoPlayUrl(PlayUrl url) {
        this.mPlayerUrl = url;
        setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
    }

    public void setOnAdNumberListener(OnAdNumberListener l) {
    }

    public void setCacheSize(int video_size, int audio_size, int picutureSize, int startpic_size) {
    }

    public void setOnBlockListener(OnBlockListener l) {
    }

    public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
        this.mOnMediaStateTimeListener = l;
    }

    public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
    }

    public int getAudioSessionId() {
        return 0;
    }

    public void setOnCacheListener(OnCacheListener l) {
    }

    public void setOnFirstPlayListener(OnFirstPlayLitener l) {
    }

    public int setSourceType(int sourceType) {
        return 0;
    }

    public int setMachineInfomation(float ScreenResolution) {
        return 0;
    }

    public int setOneFingertouchInfomation(float begin_x, float begin_y, float end_x, float end_y) {
        return 0;
    }

    public int setTwoFingertouchInfomation(float begin_x0, float begin_y0, float begin_x1, float begin_y1, float end_x0, float end_y0, float end_x1, float end_y1) {
        return 0;
    }

    public int setgravity_yroInfomation(float gravity_yro_x, float gravity_yro_y, float gravity_yro_z) {
        return 0;
    }

    public int setGravityInfomation(float gravity_x, float gravity_y, float gravity_z) {
        return 0;
    }

    public int setgravity_yroValidInfomation(boolean gravityValid) {
        return 0;
    }

    public int setAngleInit() {
        return 0;
    }

    public int setTwoFingerZoom(float zoom) {
        return 0;
    }

    public void setInitPosition(int msec) {
    }

    public void setVolume(int volume) {
    }

    public void setCacheTime(double start_cache, double block_cache) {
    }

    public void processSensorEvent(SensorEvent sensorEvent) {
    }
}

17 Source : DVEasyVideoPlayActivity.java
with Apache License 2.0
from Devil-Chen

/**
 * 简易视频播放
 */
public clreplaced DVEasyVideoPlayActivity extends AppCompatActivity implements View.OnClickListener {

    // 根布局
    private View rootView;

    // 视频地址
    private String videoPath;

    // 返回按钮
    private RelativeLayout rl_back;

    // 播放view
    private VideoView videoView;

    private MediaController mediaController;

    /**
     * 打开视频播放
     * @param mContext
     * @param path
     */
    public static void openVideo(Context mContext, String path) {
        Intent intent = new Intent(mContext, DVEasyVideoPlayActivity.clreplaced);
        intent.putExtra("videoPath", path);
        mContext.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setFullScreen();
        rootView = LayoutInflater.from(this).inflate(R.layout.activity_dv_esay_video_play, null);
        setContentView(rootView);
        initView();
        initData();
    }

    /**
     * 设置全屏
     */
    private void setFullScreen() {
        // 隐藏标题栏
        requestWindowFeature(Window.FEATURE_NO_replacedLE);
        // 隐藏状态栏
        // 定义全屏参数
        int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;
        // 获得当前窗体对象
        Window window = this.getWindow();
        // 设置当前窗体为全屏显示
        window.setFlags(flag, flag);
    }

    /**
     * 初始化控件
     */
    private void initView() {
        videoView = (VideoView) findViewById(R.id.videoView);
        rl_back = findViewById(R.id.rl_back);
        rl_back.setOnClickListener(this);
    }

    /**
     * 初始化数据
     */
    private void initData() {
        // 加载指定的视频文件
        videoPath = getIntent().getStringExtra("videoPath");
        if (TextUtils.isEmpty(videoPath)) {
            Toast.makeText(this, "视频地址为空无法播放", Toast.LENGTH_SHORT).show();
            finish();
        }
        videoView.setVideoPath(videoPath);
        // 创建MediaController对象
        mediaController = new MediaController(this);
        // VideoView与MediaController建立关联
        videoView.setMediaController(mediaController);
        // 让VideoView获取焦点
        videoView.requestFocus();
        // 开始播放
        videoView.start();
        // 显示进度条
        rootView.postDelayed(new Runnable() {

            @Override
            public void run() {
                mediaController.show();
            }
        }, 100);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.rl_back) {
            finish();
        }
    }
}

17 Source : MovieView.java
with MIT License
from developerfromjokela

public clreplaced MovieView extends MotionEyeActivity {

    private String TAG = this.getClreplaced().getSimpleName();

    private Toolbar toolbar;

    private MotionEyeMediaPlayer videoView;

    private MediaController mc;

    ProgressDialog mProgressDialog;

    private String filename;

    private String url;

    private Camera camera;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_movie_view);
        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(R.drawable.ic_back);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                finish();
            }
        });
        Intent intent = getIntent();
        if (intent.getExtras() != null) {
            String baseurl = intent.getStringExtra("baseurl");
            CameraUser user = (CameraUser) intent.getSerializableExtra("user");
            camera = (Camera) intent.getSerializableExtra("camera");
            Media media = (Media) intent.getSerializableExtra("media");
            filename = media.getPath().split("/")[media.getPath().split("/").length - 1];
            setreplacedle(filename);
            try {
                url = baseurl + "/movie/" + camera.getId() + "/playback" + media.getPath() + "?_=" + new Date().getTime();
                MotionEyeHelper helper = new MotionEyeHelper();
                helper.setUsername(user.getUsername());
                helper.setPreplacedwordHash(user.getPreplacedword());
                url = helper.addAuthParams("GET", url, "");
                Log.e("RA", url);
                videoView = findViewById(R.id.videoView);
                videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        Log.e("MovView", "Load done!");
                        findViewById(R.id.loadingLayout).setVisibility(View.GONE);
                    }
                });
                videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {

                    @Override
                    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
                        snack(getString(R.string.video_playback_error, String.valueOf(i)));
                        findViewById(R.id.loadingLayout).setVisibility(View.GONE);
                        return true;
                    }
                });
                mc = new MediaController(this);
                mc.show(500);
                mc.setAnchorView(videoView);
                mc.setMediaPlayer(videoView);
                Uri video = Uri.parse(url);
                videoView.setMediaController(mc);
                videoView.getBufferPercentage();
                videoView.setVideoURI(video);
                videoView.requestFocus();
                videoView.start();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        } else
            finish();
    }

    private boolean checkForPermissions() {
        int result = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        return (result == PackageManager.PERMISSION_GRANTED);
    }

    private long downloadVideo(String url, String filename, Camera camera) {
        if (!checkForPermissions()) {
            ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 101);
        }
        /*DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        Uri uri = Uri.parse(url);
        DownloadManager.Request request = new DownloadManager.Request(uri);
        request.setreplacedle(filename);
        request.setDescription(getString(R.string.downloading_recording_from, camera.getName()));
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        request.allowScanningByMediaScanner();

        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,filename);*/
        // declare the dialog as a member field of your activity
        // instantiate it within the onCreate method
        mProgressDialog = new ProgressDialog(MovieView.this);
        mProgressDialog.setreplacedle(filename);
        mProgressDialog.setMessage(getString(R.string.downloading_recording_from, camera.getName()));
        mProgressDialog.setIndeterminate(true);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.setCancelable(true);
        // execute this when the downloader must be fired
        final DownloadTask downloadTask = new DownloadTask(MovieView.this);
        downloadTask.execute(url, filename);
        mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                // cancel the task
                downloadTask.cancel(true);
            }
        });
        return 0;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.movie_view, menu);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            menu.gereplacedem(1).setVisible(true);
        }
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.gereplacedemId() == R.id.fullscreen) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                toggleHideyBar();
            }
        } else if (item.gereplacedemId() == R.id.download_video) {
            long val = downloadVideo(url, filename, camera);
            Log.e(TAG, "DOWNLOAD VAL: " + val);
        }
        return true;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == 101) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // granted
                long val = downloadVideo(url, filename, camera);
                Log.e(TAG, "DOWNLOAD VAL: " + val);
            } else {
                // not granted
                snack(getString(R.string.allow_permissions));
            }
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    /**
     * Detects and toggles immersive mode (also known as "hidey bar" mode).
     */
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public void toggleHideyBar() {
        // BEGIN_INCLUDE (get_current_ui_flags)
        // The UI options currently enabled are represented by a bitfield.
        // getSystemUiVisibility() gives us that bitfield.
        int uiOptions = getWindow().getDecorView().getSystemUiVisibility();
        int newUiOptions = uiOptions;
        // END_INCLUDE (get_current_ui_flags)
        // BEGIN_INCLUDE (toggle_ui_flags)
        boolean isImmersiveModeEnabled = ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
        if (isImmersiveModeEnabled) {
            Log.i(TAG, "Turning immersive mode mode off. ");
        } else {
            toolbar.setVisibility(View.GONE);
            Log.i(TAG, "Turning immersive mode mode on.");
            mc.hide();
            videoView.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    toolbar.setVisibility(View.VISIBLE);
                }
            });
        }
        newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
        // Status bar hiding: Backwards compatible to Jellybean
        if (Build.VERSION.SDK_INT >= 16) {
            newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
        }
        // Immersive mode: Backward compatible to KitKat.
        // Note that this flag doesn't do anything by itself, it only augments the behavior
        // of HIDE_NAVIGATION and FLAG_FULLSCREEN.  For the purposes of this sample
        // all three flags are being toggled together.
        // Note that there are two immersive mode UI flags, one of which is referred to as "sticky".
        // Sticky immersive mode differs in that it makes the navigation and status bars
        // semi-transparent, and the UI flag does not get cleared when the user interacts with
        // the screen.
        if (Build.VERSION.SDK_INT >= 18) {
            newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        }
        getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
    // END_INCLUDE (set_ui_flags)
    }

    private clreplaced DownloadTask extends AsyncTask<String, Integer, String> {

        private Context context;

        private PowerManager.WakeLock mWakeLock;

        public DownloadTask(Context context) {
            this.context = context;
        }

        @Override
        protected String doInBackground(String... sUrl) {
            InputStream input = null;
            OutputStream output = null;
            HttpURLConnection connection = null;
            try {
                URL url = new URL(sUrl[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();
                // expect HTTP 200 OK, so we don't mistakenly save error report
                // instead of the file
                if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                    return "Server returned HTTP " + connection.getResponseCode() + " " + connection.getResponseMessage();
                }
                // this will be useful to display download percentage
                // might be -1: server did not report the length
                int fileLength = connection.getContentLength();
                // download the file
                input = connection.getInputStream();
                output = new FileOutputStream(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/" + sUrl[1]);
                byte[] data = new byte[4096];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
                    // allow canceling with back button
                    if (isCancelled()) {
                        input.close();
                        return null;
                    }
                    total += count;
                    // publishing the progress....
                    if (// only if total length is known
                    fileLength > 0)
                        publishProgress((int) (total * 100 / fileLength));
                    output.write(data, 0, count);
                }
            } catch (Exception e) {
                e.printStackTrace();
                return e.toString();
            } finally {
                try {
                    if (output != null)
                        output.close();
                    if (input != null)
                        input.close();
                } catch (IOException ignored) {
                }
                if (connection != null)
                    connection.disconnect();
            }
            return null;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // take CPU lock to prevent CPU from going off if the user
            // presses the power button during download
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClreplaced().getName());
            mWakeLock.acquire();
            mProgressDialog.show();
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            super.onProgressUpdate(progress);
            // if we get here, length is known, now set indeterminate to false
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.setMax(100);
            mProgressDialog.setProgress(progress[0]);
        }

        @Override
        protected void onPostExecute(String result) {
            mWakeLock.release();
            mProgressDialog.dismiss();
            if (result != null)
                snack(getString(R.string.download_error, result));
            else
                snack(getString(R.string.video_downloaded));
        }
    }
}

17 Source : CometChatMediaViewActivity.java
with MIT License
from cometchat-pro

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cometchat_media_view);
    handleIntent();
    mediaPlayer = new MediaPlayer();
    toolbar = findViewById(R.id.toolbar);
    toolbar.getNavigationIcon().setTint(getResources().getColor(R.color.textColorWhite));
    toolbar.setreplacedle(senderName);
    toolbar.setSubreplacedle(Utils.getLastMessageDate(sentAt));
    imageMessage = findViewById(R.id.image_message);
    videoMessage = findViewById(R.id.video_message);
    audioMessage = findViewById(R.id.audio_message);
    mediaSize = findViewById(R.id.media_size_tv);
    playBtn = findViewById(R.id.playBtn);
    if (mediaType.equals(CometChatConstants.MESSAGE_TYPE_IMAGE)) {
        Glide.with(this).asBitmap().load(mediaUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into(new CustomTarget<Bitmap>() {

            @Override
            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                imageMessage.setImageBitmap(resource);
            }

            @Override
            public void onLoadCleared(@Nullable Drawable placeholder) {
            }
        });
        imageMessage.setVisibility(View.VISIBLE);
    } else if (mediaType.equals(CometChatConstants.MESSAGE_TYPE_VIDEO)) {
        MediaController mediacontroller = new MediaController(this);
        mediacontroller.setAnchorView(videoMessage);
        videoMessage.setMediaController(mediacontroller);
        videoMessage.setVideoURI(Uri.parse(mediaUrl));
        videoMessage.setVisibility(View.VISIBLE);
    } else if (mediaType.equals(CometChatConstants.MESSAGE_TYPE_AUDIO)) {
        mediaPlayer.reset();
        mediaSize.setText(Utils.getFileSize(mSize));
        playBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    mediaPlayer.setDataSource(mediaUrl);
                    mediaPlayer.prepare();
                    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            playBtn.setImageResource(R.drawable.ic_play_arrow_black_24dp);
                        }
                    });
                } catch (Exception e) {
                    Log.e(TAG, "MediaPlayerError: " + e.getMessage());
                }
                if (!mediaPlayer.isPlaying()) {
                    mediaPlayer.start();
                    playBtn.setImageResource(R.drawable.ic_pause_24dp);
                } else {
                    mediaPlayer.pause();
                    playBtn.setImageResource(R.drawable.ic_play_arrow_black_24dp);
                }
            }
        });
        audioMessage.setVisibility(View.VISIBLE);
    }
    setSupportActionBar(toolbar);
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
}

17 Source : GabrielClientActivity.java
with Apache License 2.0
from cmusatyalab

public clreplaced GabrielClientActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    private static final String LOG_TAG = "GabrielClientActivity";

    private static final int REQUEST_CODE = 1000;

    private static int DISPLAY_WIDTH = 640;

    private static int DISPLAY_HEIGHT = 480;

    private static int BITRATE = 1 * 1024 * 1024;

    private static final int MEDIA_TYPE_IMAGE = 1;

    private static final int MEDIA_TYPE_VIDEO = 2;

    // major components for streaming sensor data and receiving information
    String serverIP = null;

    private String styleType = "?";

    private OpenrtistComm openrtistComm;

    private boolean isRunning = false;

    private boolean isFirstExperiment = true;

    private List<int[]> supportingFPS = null;

    private boolean isSurfaceReady = false;

    private boolean waitingToStart = false;

    private boolean isPreviewing = false;

    public byte[] reusedBuffer = null;

    private TextureView preview;

    private SurfaceTexture mSurfaceTexture;

    private MediaController mediaController = null;

    private int mScreenDensity;

    private MediaProjectionManager mProjectionManager;

    private MediaProjection mMediaProjection;

    private VirtualDisplay mVirtualDisplay;

    private MediaRecorder mMediaRecorder;

    private boolean capturingScreen = false;

    private boolean recordingInitiated = false;

    private String mOutputPath = null;

    // views
    private ImageView imgView = null;

    private ImageView stereoView1 = null;

    private ImageView stereoView2 = null;

    private ImageView iconView = null;

    private Handler iterationHandler = null;

    private Handler fpsHandler = null;

    private int cameraId = 0;

    private boolean imageRotate = false;

    private TextView fpsLabel = null;

    private boolean cleared = false;

    private int framesProcessed = 0;

    private EngineInput engineInput;

    final private Object engineInputLock = new Object();

    private FrameSupplier frameSupplier = new FrameSupplier(this);

    private Session session;

    private Config config;

    private ArFragment arFragment;

    private ArSceneView sceneView;

    private Scene scene;

    private Image image;

    private Image depth_map;

    private Image img;

    SeekBar simpleSeekBar;

    private int depth_threshold = 0;

    private ArrayAdapter<String> spinner_adapter = null;

    private List<String> styleDescriptions = new ArrayList<>(Arrays.asList("Clear Display"));

    public List<String> getStyleDescriptions() {
        return styleDescriptions;
    }

    private List<String> styleIds = new ArrayList<>(Arrays.asList("none"));

    public List<String> getStyleIds() {
        return styleIds;
    }

    // Background threads based on
    // https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java#L652
    /**
     * Thread for running tasks that shouldn't block the UI.
     */
    private HandlerThread backgroundThread;

    /**
     * A {@link Handler} for running tasks in the background.
     */
    private Handler backgroundHandler;

    /**
     * Starts a background thread and its {@link Handler}.
     */
    private void startBackgroundThread() {
        backgroundThread = new HandlerThread("ImageUpload");
        backgroundThread.start();
        backgroundHandler = new Handler(backgroundThread.getLooper());
        backgroundHandler.post(imageUpload);
    }

    /**
     * Stops the background thread and its {@link Handler}.
     */
    private void stopBackgroundThread() {
        openrtistComm.stop();
        backgroundThread.quitSafely();
        // Will stop backgroundThread.join() from blocking if backgroundThread is currently blocked
        // on a call to wait()
        backgroundThread.interrupt();
        try {
            backgroundThread.join();
            backgroundThread = null;
            backgroundHandler = null;
        } catch (InterruptedException e) {
            Log.e(LOG_TAG, "Problem stopping background thread", e);
        }
    }

    private Runnable imageUpload = new Runnable() {

        @Override
        public void run() {
            openrtistComm.sendSupplier(GabrielClientActivity.this.frameSupplier);
            if (isRunning) {
                backgroundHandler.post(imageUpload);
            }
        }
    };

    // local execution
    private boolean runLocally = false;

    private LocalTransfer localRunner = null;

    private HandlerThread localRunnerThread = null;

    private Handler localRunnerThreadHandler = null;

    private volatile boolean localRunnerBusy = false;

    private RenderScript rs = null;

    private Bitmap localRunnerBitmapCache = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        isRunning = true;
        Log.v(LOG_TAG, "++onCreate");
        super.onCreate(savedInstanceState);
        Const.STYLES_RETRIEVED = false;
        Const.ITERATION_STARTED = false;
        if (Const.STEREO_ENABLED) {
            setContentView(R.layout.activity_stereo);
        } else {
            setContentView(R.layout.activity_main);
            // Spinner element
            Spinner spinner = (Spinner) findViewById(R.id.spinner);
            spinner_adapter = new ArrayAdapter<String>(this, R.layout.mylist, styleDescriptions);
            // Spinner click listener
            spinner.setOnItemSelectedListener(this);
            spinner.setAdapter(spinner_adapter);
        }
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        stereoView1 = (ImageView) findViewById(R.id.guidance_image1);
        // styleView1 = (ImageView) findViewById(R.id.style_image1);
        stereoView2 = (ImageView) findViewById(R.id.guidance_image2);
        imgView = (ImageView) findViewById(R.id.guidance_image);
        iconView = (ImageView) findViewById(R.id.style_image);
        fpsLabel = (TextView) findViewById(R.id.fpsLabel);
        // initiate  views
        simpleSeekBar = (SeekBar) findViewById(R.id.seekBar);
        ((TextView) findViewById(R.id.depthLabel)).setText(GabrielClientActivity.this.getApplicationContext().getString(R.string.depth_toast, Float.valueOf(0)));
        // perform seek bar change listener event used for getting the progress value
        simpleSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                depth_threshold = progress;
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                TextView depthLabel = (TextView) findViewById(R.id.depthLabel);
                depthLabel.setText(GabrielClientActivity.this.getApplicationContext().getString(R.string.depth_toast, Float.valueOf(depth_threshold) / 1000));
            }
        });
        if (Const.SHOW_RECORDER) {
            final ImageView recButton = (ImageView) findViewById(R.id.imgRecord);
            recButton.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    if (capturingScreen) {
                        ((ImageView) findViewById(R.id.imgRecord)).setImageDrawable(getResources().getDrawable(R.drawable.ic_baseline_videocam_24px));
                        stopRecording();
                        MediaActionSound m = new MediaActionSound();
                        m.play(MediaActionSound.STOP_VIDEO_RECORDING);
                    } else {
                        recordingInitiated = true;
                        MediaActionSound m = new MediaActionSound();
                        m.play(MediaActionSound.START_VIDEO_RECORDING);
                        ((ImageView) findViewById(R.id.imgRecord)).setImageDrawable(getResources().getDrawable(R.drawable.ic_baseline_videocam_off_24px));
                        initRecorder();
                        shareScreen();
                    }
                    recButton.performHapticFeedback(android.view.HapticFeedbackConstants.LONG_PRESS);
                }
            });
            final ImageView screenshotButton = (ImageView) findViewById(R.id.imgScreenshot);
            screenshotButton.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    Bitmap b = Screenshot.takescreenshotOfRootView(imgView);
                    storeScreenshot(b, getOutputMediaFile(MEDIA_TYPE_IMAGE).getPath());
                    screenshotButton.performHapticFeedback(android.view.HapticFeedbackConstants.LONG_PRESS);
                }
            });
        } else if (!Const.STEREO_ENABLED) {
            // this view doesn't exist when stereo is enabled (activity_stereo.xml)
            findViewById(R.id.imgRecord).setVisibility(View.GONE);
            findViewById(R.id.imgScreenshot).setVisibility(View.GONE);
        }
        if (Const.ITERATE_STYLES) {
            if (!Const.STEREO_ENABLED) {
                final ImageView playpauseButton = (ImageView) findViewById(R.id.imgPlayPause);
                playpauseButton.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        if (Const.ITERATION_STARTED == false) {
                            Const.ITERATION_STARTED = true;
                            playpauseButton.setImageResource(R.drawable.ic_pause);
                            Toast.makeText(playpauseButton.getContext(), getString(R.string.iteration_started), Toast.LENGTH_LONG).show();
                        } else {
                            Const.ITERATION_STARTED = false;
                            playpauseButton.setImageResource(R.drawable.ic_play);
                            Toast.makeText(playpauseButton.getContext(), getString(R.string.iteration_stopped), Toast.LENGTH_LONG).show();
                        }
                        playpauseButton.performHapticFeedback(android.view.HapticFeedbackConstants.LONG_PRESS);
                    }
                });
                findViewById(R.id.spinner).setVisibility(View.GONE);
            } else {
                // artificially start iteration since we don't display
                // any buttons in stereo view
                Const.ITERATION_STARTED = true;
            }
            iterationHandler = new Handler();
            iterationHandler.postDelayed(styleIterator, 100);
        } else {
            ImageView playpauseButton = (ImageView) findViewById(R.id.imgPlayPause);
            playpauseButton.setVisibility(View.GONE);
        }
        if (Const.SHOW_FPS) {
            findViewById(R.id.fpsLabel).setVisibility(View.VISIBLE);
            fpsHandler = new Handler();
            fpsHandler.postDelayed(fpsCalculator, 1000);
        }
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        mScreenDensity = metrics.densityDpi;
        mMediaRecorder = new MediaRecorder();
        mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
        // setup local execution if needed
        if (Const.SERVER_IP.equals(getString(R.string.local_execution_dns_placeholder))) {
            runLocally = true;
            styleDescriptions.add("Going to Work (L.S. Lowry)");
            styleDescriptions.add("Mosaic (Unknown)");
            styleDescriptions.add("The Scream (Edvard Munch)");
            styleDescriptions.add("Starry Night (Vincent Van Gogh)");
            styleDescriptions.add("Weeping Woman (Pablo Picreplacedo)");
            styleIds.add("going_to_work");
            styleIds.add("mosaic");
            styleIds.add("the_scream");
            styleIds.add("starry-night");
            styleIds.add("weeping_woman");
            Const.STYLES_RETRIEVED = true;
            localRunner = new LocalTransfer(Const.IMAGE_WIDTH, Const.IMAGE_HEIGHT);
            rs = RenderScript.create(this);
        }
    }

    private void storeScreenshot(Bitmap bitmap, String path) {
        OutputStream out = null;
        File imageFile = new File(path);
        try {
            MediaActionSound m = new MediaActionSound();
            m.play(MediaActionSound.SHUTTER_CLICK);
            out = new FileOutputStream(imageFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
            out.flush();
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageFile)));
            Toast.makeText(this, getString(R.string.screenshot_taken, path), Toast.LENGTH_LONG).show();
            out.close();
        } catch (IOException e) {
            Log.e(LOG_TAG, "IOException when attempting to store screenshot", e);
        }
    }

    private Runnable styleIterator = new Runnable() {

        private int position = 1;

        @Override
        public void run() {
            if (Const.STYLES_RETRIEVED && Const.ITERATION_STARTED) {
                // wait until styles are retrieved before iterating
                if (++position == styleIds.size())
                    position = 1;
                styleType = styleIds.get(position);
                if (runLocally) {
                    localRunnerThreadHandler.post(new Runnable() {

                        @Override
                        public void run() {
                            try {
                                localRunner.load(getApplicationContext(), String.format("%s.pt", styleType));
                            } catch (FileNotFoundException e) {
                                styleType = "none";
                                AlertDialog.Builder builder = new AlertDialog.Builder(GabrielClientActivity.this, AlertDialog.THEME_HOLO_DARK);
                                builder.setMessage("Style Not Found Locally").setreplacedle("Failed to Load Style");
                                AlertDialog dialog = builder.create();
                                dialog.show();
                            }
                        }
                    });
                }
                Toast.makeText(getApplicationContext(), styleDescriptions.get(position), Toast.LENGTH_SHORT).show();
                if (Const.STEREO_ENABLED) {
                    if (stereoView1.getVisibility() == View.INVISIBLE) {
                        stereoView1.setVisibility(View.VISIBLE);
                        stereoView2.setVisibility(View.VISIBLE);
                    }
                } else {
                    if (Const.DISPLAY_REFERENCE) {
                        iconView.setVisibility(View.VISIBLE);
                    }
                    if (imgView.getVisibility() == View.INVISIBLE) {
                        imgView.setVisibility(View.VISIBLE);
                    }
                }
                iterationHandler.postDelayed(this, 1000 * Const.ITERATE_INTERVAL);
            } else {
                iterationHandler.postDelayed(this, 100);
            }
        }
    };

    @Override
    protected void onResume() {
        Log.v(LOG_TAG, "++onResume");
        super.onResume();
        initOnce();
        Intent intent = getIntent();
        serverIP = intent.getStringExtra("SERVER_IP");
        initPerRun(serverIP);
    }

    @Override
    protected void onPause() {
        Log.v(LOG_TAG, "++onPause");
        if (iterationHandler != null)
            iterationHandler.removeCallbacks(styleIterator);
        if (capturingScreen)
            stopRecording();
        this.terminate();
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        Log.v(LOG_TAG, "++onDestroy");
        if (iterationHandler != null)
            iterationHandler.removeCallbacks(styleIterator);
        if (capturingScreen)
            stopRecording();
        super.onDestroy();
    }

    /**
     * Creates a media file in the {@code Environment.DIRECTORY_PICTURES} directory. The directory
     * is persistent and available to other applications like gallery.
     *
     * @param type Media type. Can be video or image.
     * @return A file object pointing to the newly created file.
     */
    public static File getOutputMediaFile(int type) {
        // To be safe, you should check that the SDCard is mounted
        // using Environment.getExternalStorageState() before doing this.
        if (!Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) {
            return null;
        }
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "OpenRTiST");
        // This location works best if you want the created images to be shared
        // between applications and persist after your app has been uninstalled.
        // Create the storage directory if it does not exist
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d(LOG_TAG, "failed to create media directory");
                return null;
            }
        }
        // Create a media file name
        String pattern = "yyyyMMdd_HHmmss";
        String timeStamp = new SimpleDateFormat(pattern, Locale.US).format(new Date());
        File mediaFile;
        if (type == MEDIA_TYPE_IMAGE) {
            mediaFile = new File(mediaStorageDir.getPath(), "IMG_" + timeStamp + ".jpg");
        } else if (type == MEDIA_TYPE_VIDEO) {
            mediaFile = new File(mediaStorageDir.getPath(), "VID_" + timeStamp + ".mp4");
        } else {
            return null;
        }
        return mediaFile;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode != REQUEST_CODE) {
            Log.e(LOG_TAG, "Unknown request code: " + requestCode);
            return;
        }
        if (resultCode != RESULT_OK) {
            Toast.makeText(this, "Screen Cast Permission Denied", Toast.LENGTH_SHORT).show();
            return;
        }
        mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
        mVirtualDisplay = createVirtualDisplay();
        mMediaRecorder.start();
        capturingScreen = true;
        if (Const.ITERATE_STYLES)
            iterationHandler.postDelayed(styleIterator, 100 * Const.ITERATE_INTERVAL);
    }

    private void shareScreen() {
        if (mMediaProjection == null) {
            startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
            return;
        }
    }

    private VirtualDisplay createVirtualDisplay() {
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        mScreenDensity = metrics.densityDpi;
        return mMediaProjection.createVirtualDisplay("MainActivity", DISPLAY_WIDTH, DISPLAY_HEIGHT, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mMediaRecorder.getSurface(), null, /*Callbacks*/
        null);
    }

    private void initRecorder() {
        try {
            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mOutputPath = getOutputMediaFile(MEDIA_TYPE_VIDEO).getPath();
            mMediaRecorder.setOutputFile(mOutputPath);
            mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);
            mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
            mMediaRecorder.setVideoEncodingBitRate(BITRATE);
            mMediaRecorder.setVideoFrameRate(24);
            mMediaRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "Problem with recorder", e);
        }
    }

    private void stopRecording() {
        mMediaRecorder.stop();
        mMediaRecorder.reset();
        Log.v(LOG_TAG, "Recording Stopped");
        Toast.makeText(this, getString(R.string.recording_complete, mOutputPath), Toast.LENGTH_LONG).show();
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(mOutputPath))));
        mMediaProjection = null;
        stopScreenSharing();
    }

    private void stopScreenSharing() {
        if (mVirtualDisplay == null) {
            return;
        }
        mVirtualDisplay.release();
        // mMediaRecorder.release(); //If used: mMediaRecorder object cannot
        // be reused again
        destroyMediaProjection();
        capturingScreen = false;
    }

    private void destroyMediaProjection() {
        if (mMediaProjection != null) {
            mMediaProjection.stop();
            mMediaProjection = null;
        }
        Log.i(LOG_TAG, "MediaProjection Stopped");
    }

    /**
     * Does initialization for the entire application.
     */
    private void initOnce() {
        Log.v(LOG_TAG, "++initOnce");
        if (Const.SENSOR_VIDEO) {
            // preview = (CameraPreview) findViewById(R.id.camera_preview);
            if (Const.STEREO_ENABLED)
                preview = (TextureView) findViewById(R.id.camera_preview1);
            else
                preview = (TextureView) findViewById(R.id.camera_preview);
        }
        // get ARFragment instance to use SceneForm functions with ARCore
        try {
            arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
            arFragment.getPlaneDiscoveryController().hide();
            sceneView = arFragment.getArSceneView();
            scene = sceneView.getScene();
            session = new Session(this);
            sceneView.setupSession(session);
            while (session == null) {
                Log.v("CHECKPOINT FAILED: ", "null session");
            }
            Config config = new Config(session);
            config.setUpdateMode(Config.UpdateMode.LATEST_CAMERA_IMAGE);
            if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) {
                config.setDepthMode(Config.DepthMode.AUTOMATIC);
            } else {
                Log.v("CHECKPOINT FAILED: ", "DepthMode NOT Supported");
            }
            session.configure(config);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // ensures that the update listener is called whenever the camera frame updates
        scene.addOnUpdateListener(frameTime -> {
            if (isRunning) {
                // obtain the current frame from ARSession
                Frame frame = sceneView.getArFrame();
                if (styleType.equals("?") || !styleType.equals("none")) {
                    if (GabrielClientActivity.this.openrtistComm != null) {
                        // cloudlet execution
                        synchronized (GabrielClientActivity.this.engineInputLock) {
                            try {
                                // obtain the camera image
                                image = frame.acquireCameraImage();
                                if (image == null) {
                                    Log.v("CHECKPOINT FAILED: ", "cameraimage null");
                                    return;
                                }
                                if (image.getFormat() != ImageFormat.YUV_420_888) {
                                    Log.v("CHECKPOINT FAILED: ", "Expected cameraimage in YUV_420_888 format, got format:" + image.getFormat());
                                    return;
                                }
                                byte[] imageBytes = imageToByte(image);
                                int imageHeight = image.getHeight();
                                int imageWidth = image.getWidth();
                                image.close();
                                // obtain the depth map if depth mode is supported
                                if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) {
                                    depth_map = frame.acquireDepthImage();
                                    if (depth_map == null) {
                                        Log.v("CHECKPOINT FAILED: ", "depth_map null");
                                        return;
                                    }
                                    if (depth_map.getFormat() != ImageFormat.DEPTH16) {
                                        Log.v("CHECKPOINT FAILED: ", "Expected depth_map in DEPTH16 format, got format:" + depth_map.getFormat());
                                        return;
                                    }
                                    byte[] depthBytes = DEPTH16toBYTEs(depth_map);
                                    depth_map.close();
                                    // create engineInput for generating protobuf later and send data to server
                                    GabrielClientActivity.this.engineInput = new EngineInput(imageBytes, depthBytes, imageHeight, imageWidth, styleType, depth_threshold);
                                    GabrielClientActivity.this.engineInputLock.notifyAll();
                                // Log.v("CHECKPOINT SUCCESS", "GabrielClientActivity addOnUpdateListener");
                                } else {
                                    // send depth as null and only send the image if depth mode is not supported
                                    // replacedign the depth threshold as -1 as an indicator that the protobuf will not contain depth_map
                                    GabrielClientActivity.this.engineInput = new EngineInput(imageBytes, null, imageHeight, imageWidth, styleType, -1);
                                    GabrielClientActivity.this.engineInputLock.notifyAll();
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                } else {
                    GabrielClientActivity.this.engineInput = null;
                    Log.v(LOG_TAG, "Display Cleared");
                    try {
                        if (img != null) {
                            img.close();
                        }
                        img = frame.acquireCameraImage();
                        byte[] bytes = imageToByte(img);
                        final Bitmap camView = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                        this.imgView = (ImageView) this.findViewById(R.id.guidance_image);
                        this.imgView.setVisibility(View.VISIBLE);
                        this.imgView.setImageBitmap(camView);
                    } catch (NotYetAvailableException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        // Media controller
        if (mediaController == null) {
            mediaController = new MediaController(this);
        }
        isRunning = true;
    }

    public EngineInput getEngineInput() {
        synchronized (this.engineInputLock) {
            try {
                while (isRunning && this.engineInput == null) {
                    engineInputLock.wait();
                }
                // Log.v("CHECKPOINT SUCCESS", "GabrielClientActivity getEngineInput NOTIFIED");
                EngineInput inputToSend = this.engineInput;
                // Prevent sending the same frame again
                this.engineInput = null;
                return inputToSend;
            } catch (/* InterruptedException */
            Exception e) {
                Log.e(LOG_TAG, "Error waiting for engine input", e);
                return null;
            }
        }
    }

    /**
     * Does initialization before each run (connecting to a specific server).
     */
    private void initPerRun(String serverIP) {
        Log.v(LOG_TAG, "++initPerRun");
        // don't connect to cloudlet if running locally
        // if a mobile only run is specified
        if (runLocally) {
            if ((localRunnerThread != null) && (localRunnerThread.isAlive())) {
                localRunnerThread.quitSafely();
                localRunnerThread.interrupt();
            }
            localRunnerThread = new HandlerThread("LocalTransferThread");
            localRunnerThread.start();
            localRunnerThreadHandler = new Handler(localRunnerThread.getLooper());
            localRunnerBusy = false;
            return;
        }
        if (serverIP == null)
            return;
        this.setupComm();
        this.startBackgroundThread();
    }

    int getPort() {
        // make sure there is a scheme before we use URI.create()
        String endpoint = this.serverIP;
        if (!endpoint.matches("^[a-zA-Z]+://.*$")) {
            endpoint = "ws://" + endpoint;
        }
        int port = URI.create(endpoint).getPort();
        if (port == -1) {
            return Const.PORT;
        }
        return port;
    }

    void setupComm() {
        int port = getPort();
        Log.d("CHECKPOINT: ", "Port_discovery ServerIP " + serverIP);
        Log.d("CHECKPOINT: ", "Port_discovery PORT: " + port);
        Consumer<ByteString> imageViewUpdater = new ImageViewUpdater(this.imgView);
        this.openrtistComm = OpenrtistComm.createOpenrtistComm(this.serverIP, port, this, this.iconView, imageViewUpdater, Const.TOKEN_LIMIT);
    }

    void setOpenrtistComm(OpenrtistComm openrtistComm) {
        this.openrtistComm = openrtistComm;
    }

    /**
     * ************* Convert imageformat to Byte arrays **********************
     */
    /**
     * Convert imageformat YUV_420_888 to Byte arrays.
     */
    private static byte[] imageToByte(Image image) {
        byte[] byteArray = null;
        byteArray = NV21toJPEG(YUV420toNV21(image), image.getWidth(), image.getHeight(), 100);
        return byteArray;
    }

    private static byte[] NV21toJPEG(byte[] nv21, int width, int height, int quality) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        YuvImage yuv = new YuvImage(nv21, ImageFormat.NV21, width, height, null);
        yuv.compressToJpeg(new Rect(0, 0, width, height), quality, out);
        return out.toByteArray();
    }

    private static byte[] YUV420toNV21(Image image) {
        byte[] nv21;
        // Get the three planes.
        ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
        ByteBuffer uBuffer = image.getPlanes()[1].getBuffer();
        ByteBuffer vBuffer = image.getPlanes()[2].getBuffer();
        int ySize = yBuffer.remaining();
        int uSize = uBuffer.remaining();
        int vSize = vBuffer.remaining();
        nv21 = new byte[ySize + uSize + vSize];
        // U and V are swapped
        yBuffer.get(nv21, 0, ySize);
        vBuffer.get(nv21, ySize, vSize);
        uBuffer.get(nv21, ySize + vSize, uSize);
        return nv21;
    }

    /**
     * Convert imageformat DEPTH16 to Byte arrays.
     */
    private static byte[] DEPTH16toBYTEs(Image image) {
        byte[] ans;
        // DEPTH16 has 1 plane.
        ByteBuffer buffer = image.getPlanes()[0].getBuffer();
        int size = buffer.remaining();
        ans = new byte[size];
        buffer.get(ans, 0, size);
        return ans;
    }

    /**
     * ************* End of onItemSelected ***************
     */
    private Runnable fpsCalculator = new Runnable() {

        @Override
        public void run() {
            if (true) {
                // if(Const.SHOW_FPS) {
                if (fpsLabel.getVisibility() == View.INVISIBLE) {
                    fpsLabel.setVisibility(View.VISIBLE);
                }
                String msg = "FPS: " + framesProcessed;
                fpsLabel.setText(msg);
            }
            framesProcessed = 0;
            fpsHandler.postDelayed(this, 1000);
        }
    };

    /**
     * Handles messages preplaceded from streaming threads and result receiving threads.
     */
    Handler returnMsgHandler = new ReturnHandler(this);

    static clreplaced ReturnHandler extends Handler {

        private final WeakReference<GabrielClientActivity> mGabrielClientActivity;

        ReturnHandler(GabrielClientActivity gabrielClientActivity) {
            this.mGabrielClientActivity = new WeakReference<GabrielClientActivity>(gabrielClientActivity);
        }

        public void handleMessage(Message msg) {
            final GabrielClientActivity gabrielClientActivity = this.mGabrielClientActivity.get();
            if (gabrielClientActivity == null) {
                return;
            }
            if (msg.what == NetworkProtocol.NETWORK_RET_FAILED) {
                // suppress this error when screen recording as we have to temporarily leave this
                // activity causing a network disruption
                if (!gabrielClientActivity.recordingInitiated) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(gabrielClientActivity, AlertDialog.THEME_HOLO_DARK);
                    builder.setMessage(msg.getData().getString("message")).setreplacedle(R.string.connection_error).setNegativeButton(R.string.back_button, new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            gabrielClientActivity.finish();
                        }
                    }).setCancelable(false);
                    AlertDialog dialog = builder.create();
                    dialog.show();
                }
            } else if (msg.what == Const.REFERENCE_IMAGE) {
                if (!Const.STEREO_ENABLED) {
                    Bitmap refImage = null;
                    if (msg.obj != null) {
                        Log.v(LOG_TAG, "Setting reference image.");
                        refImage = (Bitmap) msg.obj;
                        gabrielClientActivity.iconView.setImageBitmap(refImage);
                    } else {
                        gabrielClientActivity.iconView.setImageResource(R.drawable.ic_question_mark);
                    }
                }
            }
            if (msg.what == NetworkProtocol.NETWORK_RET_IMAGE) {
                if (gabrielClientActivity.styleType.equals("none")) {
                    return;
                }
                if (!Const.STEREO_ENABLED && gabrielClientActivity.styleType.equals("?")) {
                    Spinner spinner = (Spinner) gabrielClientActivity.findViewById(R.id.spinner);
                    ((ArrayAdapter<String>) spinner.getAdapter()).notifyDataSetChanged();
                    gabrielClientActivity.styleType = "none";
                }
                gabrielClientActivity.cleared = false;
                Bitmap feedbackImg = (Bitmap) msg.obj;
                gabrielClientActivity.set_image(feedbackImg);
                gabrielClientActivity.framesProcessed++;
            }
        }
    }

    public void set_image(Bitmap feedbackImg) {
        if (Const.STEREO_ENABLED) {
            this.stereoView1 = (ImageView) this.findViewById(R.id.guidance_image1);
            this.stereoView1.setVisibility(View.VISIBLE);
            this.stereoView1.setImageBitmap(feedbackImg);
            this.stereoView2 = (ImageView) this.findViewById(R.id.guidance_image2);
            this.stereoView2.setVisibility(View.VISIBLE);
            this.stereoView2.setImageBitmap(feedbackImg);
        } else {
            this.imgView = (ImageView) this.findViewById(R.id.guidance_image);
            this.imgView.setVisibility(View.VISIBLE);
            this.imgView.setImageBitmap(feedbackImg);
        }
    }

    /**
     * Terminates all services.
     */
    private void terminate() {
        Log.v(LOG_TAG, "++terminate");
        isRunning = false;
        if ((localRunnerThread != null) && (localRunnerThread.isAlive())) {
            localRunnerThread.quitSafely();
            localRunnerThread.interrupt();
            localRunnerThread = null;
            localRunnerThreadHandler = null;
        }
        if (rs != null) {
            rs.destroy();
        }
        // Allow this.backgroundHandler to return if it is currently waiting on this.engineInputLock
        synchronized (this.engineInputLock) {
            this.engineInputLock.notify();
        }
        if (this.backgroundThread != null) {
            this.stopBackgroundThread();
        }
        if (this.openrtistComm != null) {
            this.openrtistComm.stop();
            this.openrtistComm = null;
        }
        if (preview != null) {
            reusedBuffer = null;
            preview = null;
        }
    }

    /**
     * ************* End of Camera Preview ***************
     */
    /**
     * ************* onItemSelected **********************
     */
    // Performing action onItemSelected and onNothing selected
    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
        if (styleIds.get(position) == "none") {
            if (!Const.STYLES_RETRIEVED)
                styleType = "?";
            else
                styleType = "none";
            if (Const.STEREO_ENABLED) {
                stereoView1.setVisibility(View.INVISIBLE);
                stereoView2.setVisibility(View.INVISIBLE);
            } else {
                imgView.setVisibility(View.INVISIBLE);
                if (Const.DISPLAY_REFERENCE) {
                    iconView.setVisibility(View.INVISIBLE);
                }
            }
        } else {
            styleType = styleIds.get(position);
            if (Const.STEREO_ENABLED) {
                if (stereoView1.getVisibility() == View.INVISIBLE) {
                    stereoView1.setVisibility(View.VISIBLE);
                    stereoView2.setVisibility(View.VISIBLE);
                }
            } else {
                if (Const.DISPLAY_REFERENCE) {
                    iconView.setVisibility(View.VISIBLE);
                }
                if (imgView.getVisibility() == View.INVISIBLE) {
                    imgView.setVisibility(View.VISIBLE);
                }
            }
            if (!styleType.equals("?") && runLocally) {
                localRunnerThreadHandler.post(new Runnable() {

                    @Override
                    public void run() {
                        try {
                            localRunner.load(getApplicationContext(), String.format("%s.pt", styleType));
                        } catch (FileNotFoundException e) {
                            styleType = "none";
                            AlertDialog.Builder builder = new AlertDialog.Builder(GabrielClientActivity.this, AlertDialog.THEME_HOLO_DARK);
                            builder.setMessage("Style Not Found Locally").setreplacedle("Failed to Load Style");
                            AlertDialog dialog = builder.create();
                            dialog.show();
                        }
                    }
                });
            }
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
    }

    public void showNetworkErrorMessage(String message) {
        // suppress this error when screen recording as we have to temporarily leave this
        // activity causing a network disruption
        if (!recordingInitiated) {
            this.runOnUiThread(() -> {
                AlertDialog.Builder builder = new AlertDialog.Builder(this, android.R.style.Theme_Material_Light_Dialog_Alert);
                builder.setMessage(message).setreplacedle(R.string.connection_error).setNegativeButton(R.string.back_button, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        GabrielClientActivity.this.finish();
                    }
                }).setCancelable(false);
                AlertDialog dialog = builder.create();
                dialog.show();
            });
        }
    }

    public void addStyles(Set<Map.Entry<String, String>> entrySet) {
        this.styleType = "none";
        for (Map.Entry<String, String> entry : entrySet) {
            Log.v(LOG_TAG, "style: " + entry.getKey() + ", desc: " + entry.getValue());
            styleDescriptions.add(entry.getValue().trim());
            styleIds.add(entry.getKey().trim());
        }
    }

    public void addFrameProcessed() {
        framesProcessed++;
    }
}

16 Source : CameraLayout.java
with MIT License
from zhongjhATC

/**
 * 播放视频,用于录制后,在是否确认的界面中,播放视频
 */
private void playVideo(File file) {
    mViewHolder.vvPreview.pause();
    // mediaController 是底部控制条
    MediaController mediaController = new MediaController(mContext);
    mediaController.setAnchorView(mViewHolder.vvPreview);
    mediaController.setMediaPlayer(mViewHolder.vvPreview);
    mediaController.setVisibility(View.GONE);
    mViewHolder.vvPreview.setMediaController(mediaController);
    Uri uri = Uri.fromFile(file);
    mViewHolder.vvPreview.setVideoURI(uri);
    // 这段代码需要放在更新视频文件后播放,不然会找不到文件。
    mViewHolder.vvPreview.setVisibility(View.VISIBLE);
    if (!mViewHolder.vvPreview.isPlaying()) {
        mViewHolder.vvPreview.start();
    }
    mViewHolder.vvPreview.setOnCompletionListener(mediaPlayer -> {
        // 循环播放
        if (!mViewHolder.vvPreview.isPlaying()) {
            mViewHolder.vvPreview.start();
        }
    });
}

16 Source : MainActivity.java
with Apache License 2.0
from xietiantian

/**
 * Our MAIN Activity - MAIN LAUNCHER
 */
public clreplaced MainActivity extends AppCompatActivity implements RecordingFragment.OnListFragmentInteractionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaController.MediaPlayerControl {

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a
     * {@link FragmentPagerAdapter} derivative, which will keep every
     * loaded fragment in memory. If this becomes too memory intensive, it
     * may be best to switch to a
     * {@link android.support.v4.app.FragmentStatePagerAdapter}.
     */
    private SectionsPagerAdapter mSectionsPagerAdapter;

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    private ViewPager mViewPager;

    private Handler handler = new Handler();

    boolean isLicensed;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        checkPermissions();
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                // 页面切换后将选中项清空
                onListFragmentInteraction(new PhoneCallRecord[] {});
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);
        // set up MediaPlayer
        mediaController = new MediaController(this);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setOnCompletionListener(this);
    // RateMeNowDialog.showRateDialog(this, 10);
    }

    @Override
    protected void onStop() {
        super.onStop();
        mediaController.hide();
        if (mediaPlayer.isPlaying())
            mediaPlayer.stop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mediaPlayer.release();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // the MediaController will hide after 3 seconds - tap the screen to make it appear again
        mediaController.show();
        return false;
    }

    Menu optionsMenu;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        optionsMenu = menu;
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        SwitchCompat switchCompat = (SwitchCompat) menu.findItem(R.id.onswitch).getActionView().findViewById(R.id.switch1);
        switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                AppPreferences.getInstance(MainActivity.this).setRecordingEnabled(isChecked);
            }
        });
        switchCompat.setChecked(AppPreferences.getInstance(MainActivity.this).isRecordingEnabled());
        return true;
    }

    boolean doubleBackToExitPressedOnce;

    @Override
    public void onBackPressed() {
        if (doubleBackToExitPressedOnce) {
            super.onBackPressed();
            return;
        }
        // Does the user really want to exit?
        this.doubleBackToExitPressedOnce = true;
        Toast.makeText(this, getString(R.string.press_back_again), Toast.LENGTH_LONG).show();
        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                doubleBackToExitPressedOnce = false;
            }
        }, 2000);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.gereplacedemId();
        // noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            Intent intent = new Intent(this, SettingsActivity.clreplaced);
            intent.putExtra("write_external", permissionWriteExternal);
            startActivity(intent);
            return true;
        }
        if (id == R.id.action_save) {
            if (null != selectedItems && selectedItems.length > 0) {
                Runnable runnable = new Runnable() {

                    @Override
                    public void run() {
                        for (PhoneCallRecord record : selectedItems) {
                            record.getPhoneCall().setKept(true);
                            record.getPhoneCall().save(MainActivity.this);
                        }
                        LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(new Intent(// Causes refresh
                        LocalBroadcastActions.NEW_RECORDING_BROADCAST));
                    }
                };
                handler.post(runnable);
            }
            return true;
        }
        if (id == R.id.action_share) {
            if (null != selectedItems && selectedItems.length > 0) {
                Runnable runnable = new Runnable() {

                    @Override
                    public void run() {
                        ArrayList<Uri> fileUris = new ArrayList<Uri>();
                        for (PhoneCallRecord record : selectedItems) {
                            fileUris.add(Uri.fromFile(new File(record.getPhoneCall().getPathToRecording())));
                        }
                        Intent shareIntent = new Intent();
                        shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
                        shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, fileUris);
                        shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_replacedle));
                        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
                            shareIntent.putExtra(Intent.EXTRA_HTML_TEXT, Html.fromHtml(getString(R.string.email_body_html), Html.FROM_HTML_MODE_LEGACY));
                        } else {
                            shareIntent.putExtra(Intent.EXTRA_HTML_TEXT, Html.fromHtml(getString(R.string.email_body_html)));
                        }
                        shareIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.email_body));
                        shareIntent.setType("audio/*");
                        startActivity(Intent.createChooser(shareIntent, getString(R.string.action_share)));
                    }
                };
                handler.post(runnable);
            }
            return true;
        }
        if (id == R.id.action_delete) {
            if (null != selectedItems && selectedItems.length > 0) {
                AlertDialog.Builder alert = new AlertDialog.Builder(this);
                alert.setreplacedle(R.string.delete_recording_replacedle);
                alert.setMessage(R.string.delete_recording_subject);
                alert.setPositiveButton(R.string.dialog_yes, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Runnable runnable = new Runnable() {

                            @Override
                            public void run() {
                                Database callLog = Database.getInstance(MainActivity.this);
                                for (PhoneCallRecord record : selectedItems) {
                                    int id = record.getPhoneCall().getId();
                                    callLog.removeCall(id);
                                }
                                LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(new Intent(LocalBroadcastActions.RECORDING_DELETED_BROADCAST));
                                // 选中的都删除了,删除后selectedItems应该为空
                                onListFragmentInteraction(new PhoneCallRecord[] {});
                            }
                        };
                        handler.post(runnable);
                        dialog.dismiss();
                    }
                });
                alert.setNegativeButton(R.string.dialog_no, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                alert.show();
            }
            return true;
        }
        if (id == R.id.action_delete_all) {
            AlertDialog.Builder alert = new AlertDialog.Builder(this);
            alert.setreplacedle(R.string.delete_recording_replacedle);
            alert.setMessage(R.string.delete_all_recording_subject);
            alert.setPositiveButton(R.string.dialog_yes, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Runnable runnable = new Runnable() {

                        @Override
                        public void run() {
                            Database.getInstance(MainActivity.this).removeAllCalls(false);
                            LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(new Intent(LocalBroadcastActions.RECORDING_DELETED_BROADCAST));
                            // 选中的都删除了,删除后selectedItems应该为空
                            onListFragmentInteraction(new PhoneCallRecord[] {});
                        }
                    };
                    handler.post(runnable);
                    dialog.dismiss();
                }
            });
            alert.setNegativeButton(R.string.dialog_no, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
            alert.show();
            return true;
        }
        if (R.id.action_whitelist == id) {
            if (permissionReadContacts) {
                Intent intent = new Intent(this, WhitelistActivity.clreplaced);
                startActivity(intent);
            } else {
                AlertDialog.Builder alert = new AlertDialog.Builder(this);
                alert.setreplacedle(R.string.permission_whitelist_replacedle);
                alert.setMessage(R.string.permission_whitelist);
            }
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        // Evoked by the {@link RecordCallService#displayNotification}
        setIntent(intent);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Intent intent = getIntent();
        if (null != intent) {
            // User clicked the {@link RecordCallService#displayNotification} to listen to the recording
            long id = intent.getIntExtra("RecordingId", -1);
            if (-1 != id) {
                CallLog call = Database.getInstance(this).getCall((int) id);
                if (null != call) {
                    audioPlayer(call.getPathToRecording());
                }
                // run only once...
                intent.putExtra("RecordingId", -1);
            }
        }
    }

    @Override
    public void onListFragmentInteraction(PhoneCallRecord[] items) {
        optionsMenu.findItem(R.id.action_delete).setVisible(items.length > 0);
        optionsMenu.findItem(R.id.action_share).setVisible(items.length > 0);
        selectedItems = items;
        // the MediaController will hide after 3 seconds - tap the screen to make it appear again
        if (mediaController.isEnabled() && !mediaController.isShowing())
            mediaController.show();
    }

    PhoneCallRecord[] selectedItems;

    @Override
    public void onItemPlay(PhoneCallRecord item) {
        audioPlayer(item.getPhoneCall().getPathToRecording());
    }

    @Override
    public boolean onLisreplacedemLongClick(View v, final PhoneCallRecord record, final PhoneCallRecord[] items) {
        selectedItems = items;
        PopupMenu popupMenu = new PopupMenu(this, v);
        popupMenu.getMenuInflater().inflate(R.menu.menu_main_popup, popupMenu.getMenu());
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                return onOptionsItemSelected(item);
            }
        });
        popupMenu.show();
        return false;
    }

    MediaPlayer mediaPlayer;

    MediaController mediaController;

    public void audioPlayer(String path) {
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(path);
            mediaPlayer.prepare();
            mediaPlayer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Media Player stuff
     */
    @Override
    public void start() {
        mediaPlayer.start();
    }

    @Override
    public void pause() {
        mediaPlayer.pause();
    }

    @Override
    public int getDuration() {
        return mediaPlayer.getDuration();
    }

    @Override
    public int getCurrentPosition() {
        return mediaPlayer.getCurrentPosition();
    }

    @Override
    public void seekTo(int pos) {
        mediaPlayer.seekTo(pos);
    }

    @Override
    public boolean isPlaying() {
        return mediaPlayer.isPlaying();
    }

    @Override
    public int getBufferPercentage() {
        return 0;
    }

    @Override
    public boolean canPause() {
        return true;
    }

    @Override
    public boolean canSeekBackward() {
        return true;
    }

    @Override
    public boolean canSeekForward() {
        return true;
    }

    @Override
    public int getAudioSessionId() {
        return 0;
    }

    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        mediaController.setMediaPlayer(this);
        mediaController.setAnchorView(this.findViewById(R.id.list));
        handler.post(new Runnable() {

            public void run() {
                mediaController.setEnabled(true);
                mediaController.show(5000);
            }
        });
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        mp.reset();
        mediaController.hide();
        mediaController.setEnabled(false);
    }

    boolean permissionReadContacts = false;

    boolean permissionWriteExternal = false;

    public void checkPermissions() {
        permissionReadContacts = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED;
        permissionWriteExternal = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
        if (!permissionReadContacts)
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
                // Should we show an explanation?
                if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) {
                    // Show an expanation to the user *asynchronously* -- don't block
                    // this thread waiting for the user's response! After the user
                    // sees the explanation, try again to request the permission.
                    new android.app.AlertDialog.Builder(this).setCancelable(true).setMessage(R.string.str_access_permissions).setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            ActivityCompat.requestPermissions(MainActivity.this, new String[] { Manifest.permission.READ_CONTACTS }, 0x01);
                        }
                    }).show();
                } else {
                    // No explanation needed, we can request the permission.
                    ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.READ_CONTACTS }, 0x01);
                }
            }
        if (!permissionWriteExternal)
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                // Should we show an explanation?
                if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    // Show an expanation to the user *asynchronously* -- don't block
                    // this thread waiting for the user's response! After the user
                    // sees the explanation, try again to request the permission.
                    new android.app.AlertDialog.Builder(this).setCancelable(true).setMessage(R.string.str_write_external_permission).setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            ActivityCompat.requestPermissions(MainActivity.this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0x02);
                        }
                    }).show();
                } else {
                    // No explanation needed, we can request the permission.
                    ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0x02);
                }
            }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch(requestCode) {
            case 0x01:
                {
                    // validateRequestPermissionsRequestCode in FragmentActivity requires requestCode to be of 8 bits, meaning the range is from 0 to 255.
                    // If request is cancelled, the result arrays are empty.
                    if (grantResults.length > 0) {
                        // we only asked for one permission
                        permissionReadContacts = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    }
                    break;
                }
            case 0x02:
                {
                    // validateRequestPermissionsRequestCode in FragmentActivity requires requestCode to be of 8 bits, meaning the range is from 0 to 255.
                    // If request is cancelled, the result arrays are empty.
                    if (grantResults.length > 0) {
                        // we only asked for one permission
                        permissionWriteExternal = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    }
                    break;
                }
        }
    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public clreplaced SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment gereplacedem(int position) {
            // gereplacedem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner clreplaced below).
            if (position == 1)
                return RecordingFragment.newInstance(1, RecordingFragment.SORT_TYPE.INCOMING);
            else if (position == 2)
                return RecordingFragment.newInstance(1, RecordingFragment.SORT_TYPE.OUTGOING);
            else
                return RecordingFragment.newInstance(1, RecordingFragment.SORT_TYPE.ALL);
        }

        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }

        @Override
        public CharSequence getPagereplacedle(int position) {
            switch(position) {
                case 0:
                    return getString(R.string.all);
                case 1:
                    return getString(R.string.incoming);
                case 2:
                    return getString(R.string.outgoing);
            }
            return null;
        }
    }
}

16 Source : Replayer.java
with GNU General Public License v3.0
from vassela

public clreplaced Replayer extends Activity implements MediaController.MediaPlayerControl, OnPreparedListener, AppCompatCallback {

    private MediaPlayer mediaPlayer;

    private ReplayFileVisualizer replayFileVisualizer;

    private MediaController mediaController;

    private Handler handler = new Handler();

    private int direction;

    private String number;

    private int doubleCall;

    private String doubleCallNumber;

    private long startingDate;

    private long endingDate;

    // private long duration;
    private String recordPath;

    private String recordFilename;

    private int recordFormat;

    // private int locked;
    private String description;

    private String recordFileAbsolutePath;

    private boolean isPrepared;

    private DatabaseManager databaseManager = new DatabaseManager();

    private TelephoneCallNotifier telephoneCallNotifier = new TelephoneCallNotifier();

    private LocalizerManager localizerManager = new LocalizerManager();

    private ThemeManager themeManager = new ThemeManager();

    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");

    private static SimpleDateFormat simpleDurationFormat = new SimpleDateFormat("HH:mm:ss");

    private AppCompatDelegate delegate;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        try {
            localizerManager.setPreferencesLocale(getApplicationContext());
            themeManager.setPreferencesTheme(getApplicationContext(), this);
            delegate = AppCompatDelegate.create(this, this);
            delegate.installViewFactory();
            super.onCreate(savedInstanceState);
            delegate.onCreate(savedInstanceState);
            delegate.setContentView(R.layout.replayer);
            Toolbar toolbar = (Toolbar) findViewById(R.id.replayer_toolbar);
            delegate.setSupportActionBar(toolbar);
            delegate.getSupportActionBar().setLogo(R.drawable.ic_menu_play_clip);
            delegate.setreplacedle("Replayer");
            delegate.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            delegate.getSupportActionBar().setDisplayShowHomeEnabled(true);
            Intent intent = getIntent();
            if (intent.getExtras() != null) {
                direction = intent.getIntExtra("direction", 0);
                number = intent.getStringExtra("number");
                doubleCall = intent.getIntExtra("doubleCall", 0);
                doubleCallNumber = intent.getStringExtra("doubleCallNumber");
                startingDate = intent.getLongExtra("startingDate", 0);
                endingDate = intent.getLongExtra("endingDate", 0);
                // duration = intent.getLongExtra("duration", 0);
                recordPath = intent.getStringExtra("recordPath");
                recordFilename = intent.getStringExtra("recordFilename");
                recordFormat = intent.getIntExtra("recordFormat", 0);
                // locked = intent.getIntExtra("locked",0);
                description = intent.getStringExtra("description");
                TextView directionTextView = (TextView) findViewById(R.id.replayer_direction);
                TextView numberTextView = (TextView) findViewById(R.id.replayer_number);
                TextView doubleCallTextView = (TextView) findViewById(R.id.replayer_double_call);
                TextView doubleCallNumberTextView = (TextView) findViewById(R.id.replayer_double_call_number);
                TextView startingDateTextView = (TextView) findViewById(R.id.replayer_starting_date);
                TextView endingDateTextView = (TextView) findViewById(R.id.replayer_ending_date);
                // TextView durationTextView = (TextView) findViewById(R.id.replayer_duration);
                // TextView recordPathTextView = (TextView) findViewById(R.id.replayer_record_path);
                TextView recordFilenameTextView = (TextView) findViewById(R.id.replayer_record_filename);
                TextView recordFormatTextView = (TextView) findViewById(R.id.replayer_record_format);
                // TextView lockedTextView = (TextView) findViewById(R.id.replayer_locked);
                TextView descriptionTextView = (TextView) findViewById(R.id.replayer_description);
                directionTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_direction) + " : " + direction);
                if (number.contains("MICROPHONE")) {
                    numberTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_number) + " : " + getApplicationContext().getString(R.string.records_microphone));
                } else {
                    numberTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_number) + " : " + number);
                }
                if (doubleCall == 0) {
                    doubleCallTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_doublecall) + " : " + getApplicationContext().getString(R.string.record_dialog_detail_doublecall_no));
                } else {
                    doubleCallTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_doublecall) + " : " + getApplicationContext().getString(R.string.record_dialog_detail_doublecall_yes));
                }
                doubleCallNumberTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_doublecallnumber) + " : " + doubleCallNumber);
                startingDateTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_startingdate) + " : " + simpleDateFormat.format(new Date(startingDate)));
                endingDateTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_endingdate) + " : " + simpleDateFormat.format(new Date(endingDate)));
                // durationTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_duration) + " : " + simpleDurationFormat.format(new Date(duration)));
                // recordPathTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_recordpath) + " : " + recordPath);
                recordFilenameTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_recordfilename) + " : " + recordFilename);
                recordFormatTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_recordformat) + " : " + new RecordFileMaker().getRecordFormat(getApplicationContext(), recordFormat));
                /*if(locked == 0)
				{
	        		lockedTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_locked) + " : " + getApplicationContext().getString(R.string.record_dialog_detail_locked_no));
				}
	        	else
	        	{
	        		lockedTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_locked) + " : " + getApplicationContext().getString(R.string.record_dialog_detail_locked_yes));
	        	}*/
                descriptionTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_description) + " : " + description);
                recordFileAbsolutePath = recordPath + "/" + recordFilename;
                ReplayFileReader replayFileReader = new ReplayFileReader();
                boolean isReplayFileExists = replayFileReader.onCreate(getApplicationContext(), recordFileAbsolutePath);
                isPrepared = false;
                if (isReplayFileExists == true) {
                    mediaController = new MediaController(this);
                    if (// 3GPP, AMR, MP3
                    recordFormat < 10) {
                        initMediaplayer();
                    } else // WAV
                    {
                        initWavMediaplayer(replayFileReader);
                    }
                } else {
                    Log.e("Replayer", "initMediaController : " + getApplicationContext().getString(R.string.log_replayer_error_player_init));
                    databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_player_init), new Date().getTime(), 1, false);
                    telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_launch_toast), true);
                }
                replayFileReader.onClose(getApplicationContext(), recordFileAbsolutePath);
            }
        } catch (Exception e) {
            Log.e("Replayer", "onCreate : " + getApplicationContext().getString(R.string.log_replayer_error_create) + " : " + e);
            databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_create), new Date().getTime(), 1, false);
        }
    }

    public void initMediaplayer() {
        try {
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setDataSource(recordFileAbsolutePath);
            mediaPlayer.setOnPreparedListener(this);
            mediaPlayer.prepare();
        } catch (Exception e) {
            try {
                mediaPlayer.reset();
                mediaPlayer.release();
                mediaPlayer = null;
            } catch (Exception e2) {
                Log.w("Replayer", "initMediaplayer : " + getApplicationContext().getString(R.string.log_replayer_echec_player_close) + " : " + e);
                databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_player_close), new Date().getTime(), 2, false);
                Log.e("Replayer", "initMediaplayer : " + getApplicationContext().getString(R.string.log_replayer_error_player_init) + " : " + e);
                databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_player_init), new Date().getTime(), 1, false);
                telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_launch_toast), true);
            } finally {
                Log.e("Replayer", "initMediaplayer : " + getApplicationContext().getString(R.string.log_replayer_error_player_init) + " : " + e);
                databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_player_init), new Date().getTime(), 1, false);
                telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_launch_toast), true);
            }
        }
    }

    public void initWavMediaplayer(ReplayFileReader replayFileReader) {
        boolean isValidAudioReplayWavFile = replayFileReader.isValidAudioReplayWavFile(getApplicationContext(), recordFileAbsolutePath);
        if (isValidAudioReplayWavFile == true) {
            try {
                mediaPlayer = new MediaPlayer();
                mediaPlayer.setDataSource(recordFileAbsolutePath);
                mediaPlayer.setOnPreparedListener(this);
                mediaPlayer.prepare();
            } catch (Exception e) {
                try {
                    mediaPlayer.reset();
                    mediaPlayer.release();
                    mediaPlayer = null;
                } catch (Exception e2) {
                    Log.w("Replayer", "initWavMediaplayer : " + getApplicationContext().getString(R.string.log_replayer_echec_player_close) + " : " + e);
                    databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_player_close), new Date().getTime(), 2, false);
                    Log.e("Replayer", "initWavMediaplayer : " + getApplicationContext().getString(R.string.log_replayer_error_player_init) + " : " + e);
                    databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_player_init), new Date().getTime(), 1, false);
                    telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_launch_toast), true);
                } finally {
                    Log.e("Replayer", "initWavMediaplayer : " + getApplicationContext().getString(R.string.log_replayer_error_player_init) + " : " + e);
                    databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_player_init), new Date().getTime(), 1, false);
                    telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_launch_toast), true);
                }
            }
        }
    }

    public void initMediaController() {
        try {
            Log.d("Replayer", "initMediaController");
            mediaController.setMediaPlayer(this);
            mediaController.setAnchorView(findViewById(R.id.replayer_media_controller));
            themeManager.setMediaController(getApplicationContext(), mediaController);
            handler.post(new Runnable() {

                public void run() {
                    mediaController.setEnabled(true);
                    mediaController.show();
                }
            });
        } catch (Exception e) {
            Log.e("Replayer", "initMediaController : " + getApplicationContext().getString(R.string.log_replayer_error_controller_init) + " : " + e);
            databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_controller_init), new Date().getTime(), 1, false);
            telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_launch_toast), true);
        } finally {
            Log.i("Replayer", "initMediaController : " + getApplicationContext().getString(R.string.log_replayer_replay_file) + " : " + recordFileAbsolutePath);
            databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_replay_file) + " : " + recordFileAbsolutePath, new Date().getTime(), 3, false);
        }
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        isPrepared = true;
        initMediaController();
    }

    @Override
    protected void onStop() {
        try {
            super.onStop();
            if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
                replayFileVisualizer.releaseReplayFileVisualizer(getApplicationContext());
                mediaController.hide();
                mediaPlayer.stop();
                mediaPlayer.release();
            }
        } catch (Exception e) {
            Log.w("Replayer", "onStop : " + getApplicationContext().getString(R.string.log_replayer_echec_stop) + " : " + e);
            databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_stop), new Date().getTime(), 2, false);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        try {
            if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
                mediaController.show();
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            Log.w("Replayer", "onTouchEvent : " + getApplicationContext().getString(R.string.log_replayer_echec_touch_event) + " : " + e);
            databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_touch_event), new Date().getTime(), 2, false);
            return false;
        }
    }

    @Override
    public boolean canPause() {
        return true;
    }

    @Override
    public boolean canSeekBackward() {
        return true;
    }

    @Override
    public boolean canSeekForward() {
        return true;
    }

    @Override
    public int getBufferPercentage() {
        return 0;
    }

    @Override
    public int getCurrentPosition() {
        try {
            if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
                return mediaPlayer.getCurrentPosition();
            } else {
                return 0;
            }
        } catch (Exception e) {
            Log.w("Replayer", "getCurrentPosition : " + getApplicationContext().getString(R.string.log_replayer_echec_get_current_position) + " : " + e);
            databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_get_current_position), new Date().getTime(), 2, false);
            return 0;
        }
    }

    @Override
    public int getDuration() {
        try {
            if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
                Log.d("Replayer", "getDuration : mediaPlayer.getDuration" + mediaPlayer.getDuration());
                return mediaPlayer.getDuration();
            } else {
                return 0;
            }
        } catch (Exception e) {
            Log.w("Replayer", "getDuration : " + getApplicationContext().getString(R.string.log_replayer_echec_get_duration) + " : " + e);
            databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_get_duration), new Date().getTime(), 2, false);
            return 0;
        }
    }

    @Override
    public boolean isPlaying() {
        try {
            if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
                return mediaPlayer.isPlaying();
            } else {
                return false;
            }
        } catch (Exception e) {
            Log.w("Replayer", "isPlaying : " + getApplicationContext().getString(R.string.log_replayer_echec_is_playing) + " : " + e);
            databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_is_playing), new Date().getTime(), 2, false);
            return false;
        }
    }

    @Override
    public void pause() {
        try {
            if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
                replayFileVisualizer.releaseReplayFileVisualizer(getApplicationContext());
                mediaPlayer.pause();
            }
        } catch (Exception e) {
            Log.w("Replayer", "pause : " + getApplicationContext().getString(R.string.log_replayer_echec_pause) + " : " + e);
            databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_pause), new Date().getTime(), 2, false);
            telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_pause_toast), false);
        }
    }

    @Override
    public void seekTo(int pos) {
        try {
            if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
                mediaPlayer.seekTo(pos);
            }
        } catch (Exception e) {
            Log.w("Replayer", "seekTo : " + getApplicationContext().getString(R.string.log_replayer_echec_seek_to) + " : " + e);
            databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_seek_to), new Date().getTime(), 2, false);
            telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_seek_to_toast), false);
        }
    }

    @Override
    public void start() {
        try {
            if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
                mediaPlayer.start();
                try {
                    replayFileVisualizer = (ReplayFileVisualizer) findViewById(R.id.replayer_visualizer);
                    replayFileVisualizer.linkToMediaPlayer(getApplicationContext(), mediaPlayer);
                    replayFileVisualizer.showAudioDisplayer(getApplicationContext());
                } catch (Exception e) {
                    Log.w("Replayer", "start : " + getApplicationContext().getString(R.string.log_replayer_echec_start_visualizer) + " : " + e);
                    databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_start_visualizer), new Date().getTime(), 2, false);
                    telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_play_visualizer_toast), false);
                }
            }
        } catch (Exception e) {
            Log.w("Replayer", "start : " + getApplicationContext().getString(R.string.log_replayer_echec_start) + " : " + e);
            databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_start), new Date().getTime(), 2, false);
            telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_play_toast), false);
        }
    }

    @Override
    public int getAudioSessionId() {
        try {
            if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
                return mediaPlayer.getAudioSessionId();
            } else {
                return 0;
            }
        } catch (Exception e) {
            Log.w("Replayer", "getAudioSessionId : " + getApplicationContext().getString(R.string.log_replayer_echec_get_audio_session_id) + " : " + e);
            databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_get_audio_session_id), new Date().getTime(), 2, false);
            return 0;
        }
    }

    @Override
    public void onSupportActionModeFinished(ActionMode arg0) {
    }

    @Override
    public void onSupportActionModeStarted(ActionMode arg0) {
    }

    @Override
    public ActionMode onWindowStartingSupportActionMode(Callback arg0) {
        return null;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.gereplacedemId();
        switch(id) {
            case android.R.id.home:
                super.onBackPressed();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

16 Source : PreviewActivity.java
with MIT License
from sandrios

/**
 * PreviewActivity to preview the image captured by sandrios camera
 * Created by Arpit Gandhi on 7/6/16.
 */
public clreplaced PreviewActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "PreviewActivity";

    private final static String SHOW_CROP = "show_crop";

    private final static String MEDIA_ACTION_ARG = "media_action_arg";

    private final static String FILE_PATH_ARG = "file_path_arg";

    private final static String RESPONSE_CODE_ARG = "response_code_arg";

    private final static String VIDEO_POSITION_ARG = "current_video_position";

    private final static String VIDEO_IS_PLAYED_ARG = "is_played";

    private final static String MIME_TYPE_VIDEO = "video";

    private final static String MIME_TYPE_IMAGE = "image";

    private String previewFilePath;

    private PreviewActivity mContext;

    private SurfaceView surfaceView;

    private FrameLayout photoPreviewContainer;

    private UCropView imagePreview;

    private ViewGroup buttonPanel;

    private AspectFrameLayout videoPreviewContainer;

    private MediaController mediaController;

    private MediaPlayer mediaPlayer;

    private int currentPlaybackPosition = 0;

    private boolean isVideoPlaying = true;

    private boolean showCrop = false;

    private MediaController.MediaPlayerControl MediaPlayerControlImpl = new MediaController.MediaPlayerControl() {

        @Override
        public void start() {
            mediaPlayer.start();
        }

        @Override
        public void pause() {
            mediaPlayer.pause();
        }

        @Override
        public int getDuration() {
            return mediaPlayer.getDuration();
        }

        @Override
        public int getCurrentPosition() {
            return mediaPlayer.getCurrentPosition();
        }

        @Override
        public void seekTo(int pos) {
            mediaPlayer.seekTo(pos);
        }

        @Override
        public boolean isPlaying() {
            return mediaPlayer.isPlaying();
        }

        @Override
        public int getBufferPercentage() {
            return 0;
        }

        @Override
        public boolean canPause() {
            return true;
        }

        @Override
        public boolean canSeekBackward() {
            return true;
        }

        @Override
        public boolean canSeekForward() {
            return true;
        }

        @Override
        public int getAudioSessionId() {
            return mediaPlayer.getAudioSessionId();
        }
    };

    private SurfaceHolder.Callback surfaceCallbacks = new SurfaceHolder.Callback() {

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            showVideoPreview(holder);
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        }
    };

    public static Intent newIntent(Context context, @CameraConfiguration.MediaAction int mediaAction, String filePath, boolean showImageCrop) {
        return new Intent(context, PreviewActivity.clreplaced).putExtra(MEDIA_ACTION_ARG, mediaAction).putExtra(SHOW_CROP, showImageCrop).putExtra(FILE_PATH_ARG, filePath);
    }

    public static boolean isResultConfirm(@NonNull Intent resultIntent) {
        return BaseSandriosActivity.ACTION_CONFIRM == resultIntent.getIntExtra(RESPONSE_CODE_ARG, -1);
    }

    public static String getMediaFilePatch(@NonNull Intent resultIntent) {
        return resultIntent.getStringExtra(FILE_PATH_ARG);
    }

    public static boolean isResultRetake(@NonNull Intent resultIntent) {
        return BaseSandriosActivity.ACTION_RETAKE == resultIntent.getIntExtra(RESPONSE_CODE_ARG, -1);
    }

    public static boolean isResultCancel(@NonNull Intent resultIntent) {
        return BaseSandriosActivity.ACTION_CANCEL == resultIntent.getIntExtra(RESPONSE_CODE_ARG, -1);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_preview);
        mContext = this;
        surfaceView = findViewById(R.id.video_preview);
        surfaceView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (mediaController == null)
                    return false;
                if (mediaController.isShowing()) {
                    mediaController.hide();
                    showButtonPanel(true);
                } else {
                    showButtonPanel(false);
                    mediaController.show();
                }
                return false;
            }
        });
        videoPreviewContainer = findViewById(R.id.previewAspectFrameLayout);
        photoPreviewContainer = findViewById(R.id.photo_preview_container);
        imagePreview = findViewById(R.id.image_view);
        buttonPanel = findViewById(R.id.preview_control_panel);
        View confirmMediaResult = findViewById(R.id.confirm_media_result);
        View reTakeMedia = findViewById(R.id.re_take_media);
        View cancelMediaAction = findViewById(R.id.cancel_media_action);
        findViewById(R.id.crop_image).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                UCrop.Options options = new UCrop.Options();
                options.setToolbarColor(ContextCompat.getColor(mContext, android.R.color.black));
                options.setStatusBarColor(ContextCompat.getColor(mContext, android.R.color.black));
                Uri uri = Uri.fromFile(new File(previewFilePath));
                UCrop.of(uri, uri).withOptions(options).start(mContext);
            }
        });
        if (confirmMediaResult != null)
            confirmMediaResult.setOnClickListener(this);
        if (reTakeMedia != null)
            reTakeMedia.setOnClickListener(this);
        if (cancelMediaAction != null)
            cancelMediaAction.setOnClickListener(this);
        Bundle args = getIntent().getExtras();
        int mediaAction = args.getInt(MEDIA_ACTION_ARG);
        previewFilePath = args.getString(FILE_PATH_ARG);
        showCrop = args.getBoolean(SHOW_CROP);
        if (mediaAction == CameraConfiguration.MEDIA_ACTION_VIDEO) {
            displayVideo(savedInstanceState);
        } else if (mediaAction == CameraConfiguration.MEDIA_ACTION_PHOTO) {
            displayImage();
        } else {
            String mimeType = Utils.getMimeType(previewFilePath);
            if (mimeType.contains(MIME_TYPE_VIDEO)) {
                displayVideo(savedInstanceState);
            } else if (mimeType.contains(MIME_TYPE_IMAGE)) {
                displayImage();
            } else
                finish();
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        saveVideoParams(outState);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK && requestCode == UCrop.REQUEST_CROP) {
            showImagePreview();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }
        if (mediaController != null) {
            mediaController.hide();
            mediaController = null;
        }
    }

    private void displayImage() {
        if (showCrop)
            findViewById(R.id.crop_image).setVisibility(View.VISIBLE);
        else
            findViewById(R.id.crop_image).setVisibility(View.GONE);
        videoPreviewContainer.setVisibility(View.GONE);
        surfaceView.setVisibility(View.GONE);
        showImagePreview();
    }

    private void showImagePreview() {
        try {
            Uri uri = Uri.fromFile(new File(previewFilePath));
            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(new File(uri.getPath()).getAbsolutePath(), options);
            imagePreview.getCropImageView().setImageUri(uri, null);
            imagePreview.getOverlayView().setShowCropFrame(false);
            imagePreview.getOverlayView().setShowCropGrid(false);
            imagePreview.getCropImageView().setRotateEnabled(false);
            imagePreview.getOverlayView().setDimmedColor(Color.TRANSPARENT);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void displayVideo(Bundle savedInstanceState) {
        findViewById(R.id.crop_image).setVisibility(View.GONE);
        if (savedInstanceState != null) {
            loadVideoParams(savedInstanceState);
        }
        photoPreviewContainer.setVisibility(View.GONE);
        surfaceView.getHolder().addCallback(surfaceCallbacks);
    }

    private void showVideoPreview(SurfaceHolder holder) {
        try {
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setDataSource(previewFilePath);
            mediaPlayer.setDisplay(holder);
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaController = new MediaController(mContext);
                    mediaController.setAnchorView(surfaceView);
                    mediaController.setMediaPlayer(MediaPlayerControlImpl);
                    int videoWidth = mp.getVideoWidth();
                    int videoHeight = mp.getVideoHeight();
                    videoPreviewContainer.setAspectRatio((double) videoWidth / videoHeight);
                    mediaPlayer.start();
                    mediaPlayer.seekTo(currentPlaybackPosition);
                    if (!isVideoPlaying)
                        mediaPlayer.pause();
                }
            });
            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {

                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    finish();
                    return true;
                }
            });
            mediaPlayer.prepareAsync();
        } catch (Exception e) {
            Log.e(TAG, "Error media player playing video.");
            finish();
        }
    }

    private void saveCroppedImage(Uri croppedFileUri) {
        try {
            File saveFile = new File(previewFilePath);
            FileInputStream inStream = new FileInputStream(new File(croppedFileUri.getPath()));
            FileOutputStream outStream = new FileOutputStream(saveFile);
            FileChannel inChannel = inStream.getChannel();
            FileChannel outChannel = outStream.getChannel();
            inChannel.transferTo(0, inChannel.size(), outChannel);
            inStream.close();
            outStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void saveVideoParams(Bundle outState) {
        if (mediaPlayer != null) {
            outState.putInt(VIDEO_POSITION_ARG, mediaPlayer.getCurrentPosition());
            outState.putBoolean(VIDEO_IS_PLAYED_ARG, mediaPlayer.isPlaying());
        }
    }

    private void loadVideoParams(Bundle savedInstanceState) {
        currentPlaybackPosition = savedInstanceState.getInt(VIDEO_POSITION_ARG, 0);
        isVideoPlaying = savedInstanceState.getBoolean(VIDEO_IS_PLAYED_ARG, true);
    }

    private void showButtonPanel(boolean show) {
        if (show) {
            buttonPanel.setVisibility(View.VISIBLE);
        } else {
            buttonPanel.setVisibility(View.GONE);
        }
    }

    @Override
    public void onClick(View view) {
        Intent resultIntent = new Intent();
        if (view.getId() == R.id.confirm_media_result) {
            resultIntent.putExtra(RESPONSE_CODE_ARG, BaseSandriosActivity.ACTION_CONFIRM);
            resultIntent.putExtra(FILE_PATH_ARG, previewFilePath);
            try {
                rotateImageIfRequired(previewFilePath);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else if (view.getId() == R.id.re_take_media) {
            deleteMediaFile();
            resultIntent.putExtra(RESPONSE_CODE_ARG, BaseSandriosActivity.ACTION_RETAKE);
        } else if (view.getId() == R.id.cancel_media_action) {
            deleteMediaFile();
            resultIntent.putExtra(RESPONSE_CODE_ARG, BaseSandriosActivity.ACTION_CANCEL);
        }
        setResult(RESULT_OK, resultIntent);
        finish();
    }

    /**
     * Rotate an image if required.
     *
     * @param selectedImage Image URI
     * @return The resulted Bitmap after manipulation
     */
    private Bitmap rotateImageIfRequired(String selectedImage) throws IOException {
        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
        Bitmap bitmap = BitmapFactory.decodeFile(selectedImage, bmOptions);
        InputStream input = getContentResolver().openInputStream(Uri.fromFile(new File(selectedImage)));
        ExifInterface ei;
        if (Build.VERSION.SDK_INT > 23)
            ei = new ExifInterface(input);
        else
            ei = new ExifInterface(selectedImage);
        int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
        switch(orientation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                return rotateImage(bitmap, 90);
            case ExifInterface.ORIENTATION_ROTATE_180:
                return rotateImage(bitmap, 180);
            case ExifInterface.ORIENTATION_ROTATE_270:
                return rotateImage(bitmap, 270);
            default:
                return bitmap;
        }
    }

    private Bitmap rotateImage(Bitmap source, float angle) {
        Matrix matrix = new Matrix();
        matrix.postRotate(angle);
        return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        deleteMediaFile();
    }

    private boolean deleteMediaFile() {
        File mediaFile = new File(previewFilePath);
        return mediaFile.delete();
    }
}

16 Source : FragmentShowImage.java
with GNU Affero General Public License v3.0
from RooyeKhat-Media

public clreplaced FragmentShowImage extends BaseFragment {

    public static ArrayList<String> downloadedList = new ArrayList<>();

    public final String ROOM_ID = "roomId";

    public final String SELECTED_IMAGE = "selectedImage";

    public final String TYPE = "type";

    public View appBarLayout;

    public MediaController videoController;

    public int po;

    private TextView txtImageNumber;

    private TextView txtImageName;

    private TextView txtImageDate;

    private TextView txtImageTime;

    private EmojiTextViewE txtImageDesc;

    private LinearLayout toolbarShowImage;

    private boolean isShowToolbar = true;

    private ViewGroup ltImageName;

    private ViewPager viewPager;

    private boolean isFirstPlay = true;

    private boolean isReadyToPause = true;

    private int selectedFile = 0;

    private AdapterViewPager mAdapter;

    private RealmResults<RealmRoomMessage> mRealmList;

    private ArrayList<RealmRoomMessage> mFList = new ArrayList<>();

    private Long mRoomId;

    private Long selectedFileToken;

    private MediaPlayer mMediaPlayer;

    private String path;

    private String type = null;

    private boolean isLockScreen = false;

    private boolean isFocusable = false;

    private Realm realmShowImage;

    private ViewGroup rooShowImage;

    private ViewGroup mainShowImage;

    private ExitFragmentTransition exitFragmentTransition;

    private TouchImageView touchImageViewTmp = null;

    private int lastOrientation = 0;

    public static FocusAudioListener focusAudioListener;

    private ProtoGlobal.RoomMessageType messageType;

    ArrayList<TextureView> mTextureViewTmp = new ArrayList<>();

    public static FragmentShowImage newInstance() {
        return new FragmentShowImage();
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        realmShowImage = Realm.getDefaultInstance();
        // View view = inflater.inflate(R.layout.activity_show_image, container, false);
        // exitFragmentTransition = FragmentTransition.with(this).duration(200).interpolator(new LinearOutSlowInInterpolator()).to(view.findViewById(R.id.asi_view_pager)).start(savedInstanceState);
        // 
        // exitFragmentTransition.exitListener(new AnimatorListenerAdapter() {
        // @Override
        // public void onAnimationStart(Animator animation) {
        // Log.d("FFFFFFF", "onAnimationStart: ");
        // }
        // 
        // @Override
        // public void onAnimationEnd(Animator animation) {
        // Log.d("FFFFFFF", "onAnimationEnd: ");
        // }
        // }).interpolator(new FastOutSlowInInterpolator());
        // exitFragmentTransition.startExitListening(view.findViewById(R.id.rooShowImage));
        return inflater.inflate(R.layout.activity_show_image, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (getIntentData(this.getArguments())) {
            initComponent(view);
        }
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation != lastOrientation) {
            lastOrientation = newConfig.orientation;
            if (touchImageViewTmp != null && videoController != null && mMediaPlayer != null) {
                touchImageViewTmp.setVisibility(View.GONE);
                touchImageViewTmp.setVisibility(View.VISIBLE);
                if (mMediaPlayer.isPlaying()) {
                    videoController.show();
                }
                if (mTextureViewTmp.size() > 0) {
                    getRealSize(mMediaPlayer, mTextureViewTmp.get(0));
                }
            }
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (appBarLayout != null) {
            appBarLayout.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public void onAttach(Context context) {
        if (appBarLayout != null) {
            appBarLayout.setVisibility(View.GONE);
        }
        super.onAttach(context);
    }

    private Realm getRealm() {
        if (realmShowImage == null || !realmShowImage.isClosed()) {
            realmShowImage = Realm.getDefaultInstance();
        }
        return realmShowImage;
    }

    private boolean getIntentData(Bundle bundle) {
        if (G.fragmentActivity != null) {
            G.fragmentActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
        if (bundle != null) {
            // get a list of image
            mRoomId = bundle.getLong("RoomId");
            selectedFileToken = bundle.getLong("SelectedImage");
            if (bundle.getString("TYPE") != null) {
                // type = bundle.getString("TYPE");
                messageType = convertType(bundle.getString("TYPE"));
            }
            if (mRoomId == null) {
                // G.fragmentActivity.getSupportFragmentManager().beginTransaction().remove(FragmentShowImage.this).commit();
                popBackStackFragment();
                return false;
            }
            mRealmList = RealmRoomMessage.findSorted(getRealm(), mRoomId, RealmRoomMessageFields.UPDATE_TIME, Sort.ASCENDING);
            if (mRealmList.size() < 1) {
                popBackStackFragment();
                return false;
            }
            for (RealmRoomMessage roomMessage : mRealmList) {
                if (RealmRoomMessage.isImageOrVideo(roomMessage, convertType(type))) {
                    if ((roomMessage.getForwardMessage() != null ? roomMessage.getForwardMessage().getAttachment() : roomMessage.getAttachment()) != null)
                        mFList.add(roomMessage);
                }
            }
            if (selectedFileToken != null) {
                for (int i = mFList.size() - 1; i >= 0; i--) {
                    if (selectedFileToken == mFList.get(i).getMessageId()) {
                        selectedFile = i;
                        break;
                    }
                }
            }
            return true;
        } else {
            if (G.fragmentActivity != null) {
                popBackStackFragment();
            }
            return false;
        }
    }

    private ProtoGlobal.RoomMessageType convertType(String type) {
        if (type != null) {
            if (type.contains(ProtoGlobal.RoomMessageType.VIDEO.toString())) {
                return ProtoGlobal.RoomMessageType.VIDEO;
            } else if (type.contains(ProtoGlobal.RoomMessageType.IMAGE.toString())) {
                return ProtoGlobal.RoomMessageType.IMAGE;
            }
        }
        return null;
    }

    private void initComponent(View view) {
        downloadedList.clear();
        MaterialDesignTextView btnBack = (MaterialDesignTextView) view.findViewById(R.id.asi_btn_back);
        RippleView rippleBack = (RippleView) view.findViewById(R.id.asi_ripple_back);
        // rippleBack.setOnClickListener(new View.OnClickListener() {
        // @Override
        // public void onClick(View v) {
        // 
        // exitFragmentTransition.startButtonExitListening(rooShowImage);
        // 
        // }
        // });
        rippleBack.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {

            @Override
            public void onComplete(RippleView rippleView) {
                G.fragmentActivity.onBackPressed();
            }
        });
        MaterialDesignTextView btnMenu = (MaterialDesignTextView) view.findViewById(R.id.asi_btn_menu);
        RippleView rippleMenu = (RippleView) view.findViewById(R.id.asi_ripple_menu);
        rippleMenu.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {

            @Override
            public void onComplete(RippleView rippleView) {
                popUpMenuShowImage();
            }
        });
        // rooShowImage = (ViewGroup) view.findViewById(R.id.rooShowImage);
        // 
        // int colorFrom = getResources().getColor(R.color.transparent);
        // int colorTo = getResources().getColor(R.color.black);
        // ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
        // colorAnimation.setDuration(300); // milliseconds
        // colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        // 
        // @Override
        // public void onAnimationUpdate(ValueAnimator animator) {
        // rooShowImage.setBackgroundColor((int) animator.getAnimatedValue());
        // }
        // 
        // });
        // 
        // colorAnimation.start();
        viewPager = (ViewPager) view.findViewById(R.id.asi_view_pager);
        txtImageNumber = (TextView) view.findViewById(R.id.asi_txt_image_number);
        ltImageName = (ViewGroup) view.findViewById(R.id.asi_layout_image_name);
        txtImageName = (TextView) view.findViewById(R.id.asi_txt_image_name);
        txtImageDate = (TextView) view.findViewById(R.id.asi_txt_image_date);
        txtImageTime = (TextView) view.findViewById(R.id.asi_txt_image_time);
        txtImageDesc = (EmojiTextViewE) view.findViewById(R.id.asi_txt_image_desc);
        toolbarShowImage = (LinearLayout) view.findViewById(R.id.toolbarShowImage);
        initViewPager();
        focusAudioListener = new FocusAudioListener() {

            @Override
            public void audioPlay(boolean isPlay) {
                if (isPlay) {
                    if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
                        mMediaPlayer.pause();
                        isLockScreen = true;
                        isFocusable = true;
                    }
                } else {
                    if (mMediaPlayer != null && isFocusable) {
                        int length = mMediaPlayer.getCurrentPosition();
                        mMediaPlayer.seekTo(length);
                        mMediaPlayer.start();
                        isLockScreen = true;
                        isFocusable = false;
                    }
                }
            }
        };
    }

    // ***************************************************************************************
    private void initViewPager() {
        mAdapter = new AdapterViewPager();
        viewPager.setAdapter(mAdapter);
        viewPager.setCurrenreplacedem(selectedFile);
        txtImageNumber.setText(selectedFile + 1 + " " + G.fragmentActivity.getResources().getString(R.string.of) + " " + mFList.size());
        if (HelperCalander.isPersianUnicode) {
            txtImageNumber.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageNumber.getText().toString()));
        }
        if (selectedFile >= mFList.size()) {
            return;
        }
        showImageInfo(mFList.get(selectedFile));
        viewPager.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
            }
        });
        viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {

            @Override
            public void transformPage(View view, float position) {
                final float normalizedPosition = Math.abs(Math.abs(position) - 1);
                view.setScaleX(normalizedPosition / 2 + 0.5f);
                view.setScaleY(normalizedPosition / 2 + 0.5f);
            }
        });
    }

    /**
     * show image info, time , name , description
     */
    private void showImageInfo(RealmRoomMessage realmRoomMessage) {
        if (realmRoomMessage == null || G.authorHash == null) {
            return;
        }
        RealmRoomMessage realmRoomMessageFinal = RealmRoomMessage.getFinalMessage(realmRoomMessage);
        if (realmRoomMessageFinal.getMessage() != null && !realmRoomMessageFinal.getMessage().isEmpty()) {
            txtImageDesc.setText(realmRoomMessageFinal.getMessage());
            txtImageDesc.setVisibility(View.VISIBLE);
        } else {
            txtImageDesc.setVisibility(View.GONE);
        }
        // +Realm realm = Realm.getDefaultInstance();
        RealmRegisteredInfo realmRegisteredInfo = RealmRegisteredInfo.getRegistrationInfo(getRealm(), realmRoomMessageFinal.getUserId());
        if (realmRegisteredInfo != null) {
            txtImageName.setText(realmRegisteredInfo.getDisplayName());
        } else {
            txtImageName.setText("");
        }
        if (realmRoomMessageFinal.getAuthorHash() != null && G.authorHash.equals(realmRoomMessageFinal.getAuthorHash())) {
            txtImageName.setText(R.string.you);
        }
        if (realmRoomMessageFinal.getUpdateTime() != 0) {
            txtImageTime.setText(HelperCalander.getClocktime(realmRoomMessageFinal.getUpdateTime(), true));
            txtImageDate.setText(HelperCalander.checkHijriAndReturnTime(realmRoomMessageFinal.getUpdateTime() / 1000));
        }
        if (HelperCalander.isPersianUnicode) {
            txtImageName.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageName.getText().toString()));
            txtImageTime.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageTime.getText().toString()));
            txtImageDate.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageDate.getText().toString()));
        }
    // realm.close();
    }

    public void popUpMenuShowImage() {
        final MaterialDialog dialog = new MaterialDialog.Builder(G.fragmentActivity).customView(R.layout.chat_popup_dialog_custom, true).build();
        View v = dialog.getCustomView();
        DialogAnimation.animationUp(dialog);
        dialog.show();
        ViewGroup root1 = (ViewGroup) v.findViewById(R.id.dialog_root_item1_notification);
        ViewGroup root2 = (ViewGroup) v.findViewById(R.id.dialog_root_item2_notification);
        final TextView txtShare = (TextView) v.findViewById(R.id.dialog_text_item1_notification);
        TextView txtSaveToGallery = (TextView) v.findViewById(R.id.dialog_text_item2_notification);
        TextView iconSaveToGallery = (TextView) v.findViewById(R.id.dialog_icon_item1_notification);
        iconSaveToGallery.setText(G.fragmentActivity.getResources().getString(R.string.md_save));
        root1.setVisibility(View.VISIBLE);
        root2.setVisibility(View.VISIBLE);
        txtShare.setText(getResources().getString(R.string.save_to_gallery));
        if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
            txtSaveToGallery.setText(G.fragmentActivity.getResources().getString(R.string.share_video_file_2));
        } else {
            txtSaveToGallery.setText(G.fragmentActivity.getResources().getString(R.string.share_image_2));
        }
        TextView iconShare = (TextView) v.findViewById(R.id.dialog_icon_item2_notification);
        iconShare.setText(G.fragmentActivity.getResources().getString(R.string.md_share_button));
        root1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                dialog.dismiss();
                saveToGallery();
            }
        });
        root2.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                dialog.dismiss();
                shareImage();
            }
        });
    }

    /**
     * share Image and video
     */
    private void shareImage() {
        RealmRoomMessage roomMessage = mFList.get(viewPager.getCurrenreplacedem());
        if (roomMessage != null) {
            roomMessage = RealmRoomMessage.getFinalMessage(roomMessage);
            String path = getFilePath(viewPager.getCurrenreplacedem());
            File file = new File(path);
            if (file.exists()) {
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("image/*");
                // +Realm realm = Realm.getDefaultInstance();
                AppUtils.shareItem(intent, StructMessageInfo.convert(getRealm(), roomMessage));
                // putExtra(intent, StructMessageInfo.convert(getRealm(), roomMessage));
                startActivity(Intent.createChooser(intent, G.fragmentActivity.getResources().getString(R.string.share_image_from_igap)));
            }
        }
    }

    /**
     * share Image and video
     */
    private void saveToGallery() {
        RealmRoomMessage rm = mFList.get(viewPager.getCurrenreplacedem());
        if (rm != null) {
            String path = getFilePath(viewPager.getCurrenreplacedem());
            ProtoGlobal.RoomMessageType messageType;
            if (rm.getForwardMessage() != null) {
                messageType = rm.getForwardMessage().getMessageType();
            } else {
                messageType = rm.getMessageType();
            }
            File file = new File(path);
            if (file.exists()) {
                if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
                    HelperSaveFile.saveFileToDownLoadFolder(path, "VIDEO_" + System.currentTimeMillis() + ".mp4", HelperSaveFile.FolderType.video, R.string.file_save_to_video_folder);
                } else if (messageType == ProtoGlobal.RoomMessageType.IMAGE || messageType == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
                    HelperSaveFile.savePicToGallery(path, true);
                }
            }
        }
    }

    public String getFilePath(int position) {
        String result = "";
        RealmAttachment at = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getAttachment() : mFList.get(position).getAttachment();
        if (at != null) {
            if (at.getLocalFilePath() != null)
                result = at.getLocalFilePath();
        }
        ProtoGlobal.RoomMessageType messageType = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getMessageType() : mFList.get(position).getMessageType();
        if (result.length() < 1) {
            result = AndroidUtils.getFilePathWithCashId(at.getCacheId(), at.getName(), messageType);
        }
        return result;
    }

    public String getThumbnailPath(RealmRoomMessage roomMessage) {
        String result = "";
        if (roomMessage == null) {
            return "";
        }
        if (roomMessage.getAttachment() != null) {
            if (roomMessage.getAttachment().getLocalThumbnailPath() != null) {
                result = roomMessage.getAttachment().getLocalThumbnailPath();
            }
            if (result.length() < 1) {
                result = AndroidUtils.getFilePathWithCashId(roomMessage.getAttachment().getCacheId(), roomMessage.getAttachment().getName(), G.DIR_TEMP, true);
            }
        }
        return result;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
        if (videoController != null) {
            videoController.hide();
            videoController = null;
        }
        if (realmShowImage != null && !realmShowImage.isClosed()) {
            realmShowImage.close();
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
        if (videoController != null) {
            videoController.hide();
            videoController = null;
        }
        focusAudioListener = null;
    }

    @Override
    public void onPause() {
        super.onPause();
        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
            mMediaPlayer.pause();
            isLockScreen = true;
        }
        if (videoController != null && videoController.isShowing()) {
            videoController.hide();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (isLockScreen) {
            if (videoController != null) {
                videoController.show();
            }
        }
    }

    /**
     * adapter for view pager
     */
    private clreplaced AdapterViewPager extends PagerAdapter implements MediaController.MediaPlayerControl {

        private String videoPath;

        private int lastPosition;

        @Override
        public int getCount() {
            return mFList.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view.equals(object);
        }

        @Override
        public Object instantiateItem(ViewGroup container, final int position) {
            LayoutInflater inflater = LayoutInflater.from(G.fragmentActivity);
            ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.show_image_sub_layout, (ViewGroup) container, false);
            final TextureView mTextureView = (TextureView) layout.findViewById(R.id.textureView);
            final ImageView imgPlay = (ImageView) layout.findViewById(R.id.imgPlay);
            final TouchImageView touchImageView = (TouchImageView) layout.findViewById(R.id.sisl_touch_image_view);
            FrameLayout frameLayout = (FrameLayout) layout.findViewById(R.id.Layout_showImage);
            frameLayout.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    touchImageView.performClick();
                }
            });
            final MessageProgress progress = (MessageProgress) layout.findViewById(R.id.progress);
            AppUtils.setProgresColor(progress.progressBar);
            final RealmRoomMessage rm = RealmRoomMessage.getFinalMessage(mFList.get(position));
            if (rm != null && rm.isValid()) {
                if (HelperDownloadFile.getInstance().isDownLoading(rm.getAttachment().getCacheId())) {
                    progress.withDrawable(R.drawable.ic_cancel, true);
                    startDownload(position, progress, touchImageView, imgPlay, mTextureView);
                } else {
                    progress.withDrawable(R.drawable.ic_download, true);
                }
                path = getFilePath(position);
                File file = new File(path);
                if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
                    mMediaPlayer.pause();
                    mMediaPlayer.seekTo(0);
                    if (videoController != null)
                        videoController.hide();
                }
                if (file.exists()) {
                    progress.setVisibility(View.GONE);
                    G.imageLoader.displayImage(suitablePath(path), touchImageView);
                    if (rm.getMessageType() == ProtoGlobal.RoomMessageType.IMAGE || rm.getMessageType() == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
                        touchImageView.setVisibility(View.VISIBLE);
                        imgPlay.setVisibility(View.GONE);
                        isFirstPlay = false;
                    } else {
                        if (isFirstPlay) {
                            mTextureView.setVisibility(View.VISIBLE);
                            G.handler.postDelayed(new Runnable() {

                                @Override
                                public void run() {
                                    playVideo(position, mTextureView, imgPlay, touchImageView);
                                }
                            }, 100);
                            isFirstPlay = false;
                        }
                        imgPlay.setVisibility(View.VISIBLE);
                        mTextureView.setVisibility(View.INVISIBLE);
                        videoPath = path;
                    }
                } else {
                    imgPlay.setVisibility(View.GONE);
                    path = getThumbnailPath(rm);
                    touchImageView.setVisibility(View.VISIBLE);
                    file = new File(path);
                    if (file.exists()) {
                        G.imageLoader.displayImage(suitablePath(path), touchImageView);
                    } else if (rm.getAttachment() != null) {
                        // if thumpnail not exist download it
                        ProtoFileDownload.FileDownload.Selector selector = null;
                        long fileSize = 0;
                        if (rm.getAttachment().getSmallThumbnail() != null) {
                            selector = ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL;
                            fileSize = rm.getAttachment().getSmallThumbnail().getSize();
                        } else if (rm.getAttachment().getLargeThumbnail() != null) {
                            selector = ProtoFileDownload.FileDownload.Selector.LARGE_THUMBNAIL;
                            fileSize = rm.getAttachment().getLargeThumbnail().getSize();
                        }
                        final String filePathTumpnail = AndroidUtils.getFilePathWithCashId(rm.getAttachment().getCacheId(), rm.getAttachment().getName(), G.DIR_TEMP, true);
                        if (selector != null && fileSize > 0) {
                            HelperDownloadFile.getInstance().startDownload(rm.getMessageType(), System.currentTimeMillis() + "", rm.getAttachment().getToken(), rm.getAttachment().getUrl(), rm.getAttachment().getCacheId(), rm.getAttachment().getName(), fileSize, selector, "", 4, new HelperDownloadFile.UpdateListener() {

                                @Override
                                public void OnProgress(final String path, int progress) {
                                    if (progress == 100) {
                                        G.currentActivity.runOnUiThread(new Runnable() {

                                            @Override
                                            public void run() {
                                                G.imageLoader.displayImage(AndroidUtils.suitablePath(path), touchImageView);
                                            }
                                        });
                                    }
                                }

                                @Override
                                public void OnError(String token) {
                                }
                            });
                        }
                    }
                }
            }
            progress.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    String _cashID = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getAttachment().getCacheId() : mFList.get(position).getAttachment().getCacheId();
                    if (HelperDownloadFile.getInstance().isDownLoading(_cashID)) {
                        HelperDownloadFile.getInstance().stopDownLoad(_cashID);
                    } else {
                        progress.withDrawable(R.drawable.ic_cancel, true);
                        startDownload(position, progress, touchImageView, imgPlay, mTextureView);
                    }
                }
            });
            touchImageView.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    if (isShowToolbar) {
                        toolbarShowImage.animate().setDuration(150).alpha(0F).start();
                        ltImageName.setVisibility(View.GONE);
                        ltImageName.animate().setDuration(150).alpha(0F).start();
                        toolbarShowImage.setVisibility(View.GONE);
                        isShowToolbar = false;
                    } else {
                        toolbarShowImage.animate().setDuration(150).alpha(1F).start();
                        toolbarShowImage.setVisibility(View.VISIBLE);
                        ltImageName.animate().setDuration(150).alpha(1F).start();
                        ltImageName.setVisibility(View.VISIBLE);
                        isShowToolbar = true;
                    }
                    if (touchImageViewTmp != null && imgPlay.getVisibility() != View.VISIBLE && mMediaPlayer != null && videoController != null) {
                        if (videoController.isShowing()) {
                            videoController.hide();
                        } else {
                            videoController.show();
                        }
                    }
                }
            });
            imgPlay.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    mTextureView.setVisibility(View.VISIBLE);
                    playVideo(position, mTextureView, imgPlay, touchImageView);
                }
            });
            mTextureView.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    touchImageView.performClick();
                }
            });
            viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

                @Override
                public void onPageScrolled(final int position, float positionOffset, int positionOffsetPixels) {
                    if (isFirstPlay) {
                        if (mFList.get(position).getMessageType() == ProtoGlobal.RoomMessageType.IMAGE || mFList.get(position).getMessageType() == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
                            isFirstPlay = false;
                        }
                    }
                }

                @Override
                public void onPageSelected(final int position) {
                    touchImageViewTmp = null;
                    txtImageNumber.setText(position + 1 + " " + G.fragmentActivity.getResources().getString(R.string.of) + " " + mFList.size());
                    if (HelperCalander.isPersianUnicode) {
                        txtImageNumber.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageNumber.getText().toString()));
                    }
                    showImageInfo(mFList.get(position));
                    if (mFList.get(position).getForwardMessage() != null) {
                        messageType = mFList.get(position).getForwardMessage().getMessageType();
                    } else {
                        messageType = mFList.get(position).getMessageType();
                    }
                    if (mMediaPlayer != null && mMediaPlayer.isPlaying())
                        mMediaPlayer.stop();
                    if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
                        File f = new File(getFilePath(position));
                        if (f.exists()) {
                            imgPlay.setVisibility(View.VISIBLE);
                            touchImageView.setVisibility(View.VISIBLE);
                        } else {
                            imgPlay.setVisibility(View.GONE);
                        }
                    } else if (messageType == ProtoGlobal.RoomMessageType.IMAGE || messageType == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
                        imgPlay.setVisibility(View.GONE);
                    }
                    if (videoController != null) {
                        videoController.hide();
                    }
                }

                @Override
                public void onPageScrollStateChanged(int state) {
                }
            });
            ((ViewGroup) container).addView(layout);
            return layout;
        }

        /**
         * start download
         */
        private void startDownload(final int position, final MessageProgress progress, final TouchImageView touchImageView, final ImageView imgPlay, final TextureView mTextureView) {
            final RealmRoomMessage rm = RealmRoomMessage.getFinalMessage(mFList.get(position));
            String dirPath = AndroidUtils.getFilePathWithCashId(rm.getAttachment().getCacheId(), rm.getAttachment().getName(), rm.getMessageType());
            if (downloadedList.indexOf(rm.getAttachment().getToken()) == -1) {
                downloadedList.add(rm.getAttachment().getCacheId());
            }
            progress.withOnProgress(new OnProgress() {

                @Override
                public void onProgressFinished() {
                    G.currentActivity.runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            progress.withProgress(0);
                            progress.setVisibility(View.GONE);
                            if (rm.getMessageType() == ProtoGlobal.RoomMessageType.VIDEO) {
                                imgPlay.setVisibility(View.VISIBLE);
                            // if (position == viewPager.getCurrenreplacedem()) playVideo(position, mTextureView, imgPlay, touchImageView);
                            }
                        }
                    });
                }
            });
            HelperDownloadFile.getInstance().startDownload(rm.getMessageType(), System.currentTimeMillis() + "", rm.getAttachment().getToken(), rm.getAttachment().getUrl(), rm.getAttachment().getCacheId(), rm.getAttachment().getName(), rm.getAttachment().getSize(), ProtoFileDownload.FileDownload.Selector.FILE, dirPath, 4, new HelperDownloadFile.UpdateListener() {

                @Override
                public void OnProgress(final String path, final int progres) {
                    G.currentActivity.runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            progress.withProgress(progres);
                            if (progres == 100) {
                                G.imageLoader.displayImage(AndroidUtils.suitablePath(path), touchImageView);
                            }
                        }
                    });
                }

                @Override
                public void OnError(String token) {
                    G.currentActivity.runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            progress.withProgress(0);
                            progress.withDrawable(R.drawable.ic_download, true);
                        }
                    });
                }
            });
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }

        /**
         * video player
         */
        private void playVideo(final int position, final TextureView mTextureView, final ImageView imgPlay, final TouchImageView touchImageView) {
            touchImageViewTmp = touchImageView;
            if (mMediaPlayer == null)
                mMediaPlayer = new MediaPlayer();
            if (videoController == null)
                videoController = new MediaController(G.fragmentActivity);
            mTextureView.setVisibility(View.VISIBLE);
            videoPath = getFilePath(position);
            ViewCompat.setLayoutDirection(videoController, View.LAYOUT_DIRECTION_LTR);
            videoController.setAnchorView(touchImageView);
            videoController.setMediaPlayer(this);
            imgPlay.setVisibility(View.GONE);
            mMediaPlayer.reset();
            mTextureViewTmp.clear();
            mTextureViewTmp.add(mTextureView);
            try {
                mMediaPlayer.setDataSource(G.fragmentActivity, Uri.parse(videoPath));
                mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {

                    @Override
                    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
                        setMediaPlayer(mMediaPlayer, mTextureView, imgPlay, touchImageView);
                    }

                    @Override
                    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
                        Log.e("ddd", "width  :" + width + "    height  : " + height);
                    }

                    @Override
                    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
                        return false;
                    }

                    @Override
                    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
                    }
                });
                if (mTextureView.getSurfaceTexture() != null) {
                    setMediaPlayer(mMediaPlayer, mTextureView, imgPlay, touchImageView);
                }
            } catch (IOException | IllegalArgumentException e) {
                e.printStackTrace();
            }
            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    mp.seekTo(0);
                    imgPlay.setVisibility(View.VISIBLE);
                }
            });
        // mMediaPlayer.seekTo(100);
        }

        private void setMediaPlayer(MediaPlayer mMediaPlayer, final TextureView mTextureView, final ImageView imgPlay, final TouchImageView touchImageView) {
            if (mTextureView == null) {
                return;
            }
            Surface surfaceTexture = new Surface(mTextureView.getSurfaceTexture());
            if (surfaceTexture == null) {
                return;
            }
            try {
                if (mMediaPlayer != null) {
                    mMediaPlayer.setSurface(surfaceTexture);
                    mMediaPlayer.setLooping(false);
                    mMediaPlayer.prepareAsync();
                }
            } catch (IllegalStateException e) {
                e.getMessage();
            }
            mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                @Override
                public void onPrepared(MediaPlayer mp) {
                    getRealSize(mp, mTextureView);
                    imgPlay.setVisibility(View.GONE);
                    mp.start();
                    MusicPlayer.pauseSound();
                    mTextureView.setVisibility(View.VISIBLE);
                    touchImageView.animate().setDuration(700).alpha(0F).start();
                    G.handler.postDelayed(new Runnable() {

                        @Override
                        public void run() {
                            touchImageView.setVisibility(View.GONE);
                            touchImageView.clearAnimation();
                        }
                    }, 700);
                    videoController.setEnabled(true);
                    videoController.show();
                }
            });
        }

        @Override
        public void start() {
            if (mMediaPlayer != null)
                mMediaPlayer.start();
            MusicPlayer.pauseSound();
        }

        @Override
        public void pause() {
            if (mMediaPlayer != null)
                mMediaPlayer.pause();
        }

        @Override
        public int getDuration() {
            if (mMediaPlayer != null) {
                return mMediaPlayer.getDuration();
            }
            return 0;
        }

        @Override
        public int getCurrentPosition() {
            if (mMediaPlayer != null) {
                return mMediaPlayer.getCurrentPosition();
            }
            return 0;
        }

        @Override
        public void seekTo(int pos) {
            if (mMediaPlayer != null)
                mMediaPlayer.seekTo(pos);
        }

        @Override
        public boolean isPlaying() {
            return mMediaPlayer != null && mMediaPlayer.isPlaying();
        }

        @Override
        public int getBufferPercentage() {
            return 0;
        }

        @Override
        public boolean canPause() {
            return true;
        }

        @Override
        public boolean canSeekBackward() {
            return true;
        }

        @Override
        public boolean canSeekForward() {
            return true;
        }

        @Override
        public int getAudioSessionId() {
            return 0;
        }
    }

    /**
     * get real width and height video
     */
    private void getRealSize(MediaPlayer mp, TextureView mTextureView) {
        if (mp == null || mTextureView == null) {
            return;
        }
        // Get the dimensions of the video
        int videoWidth = mp.getVideoWidth();
        int videoHeight = mp.getVideoHeight();
        Display display = G.fragmentActivity.getWindowManager().getDefaultDisplay();
        int finalWith, finalHeight;
        finalWith = display.getWidth();
        finalHeight = (int) (((float) videoHeight / (float) videoWidth) * (float) display.getWidth());
        if (finalHeight > display.getHeight()) {
            finalWith = (int) (((float) finalWith / (float) finalHeight) * (float) display.getHeight());
            finalHeight = display.getHeight();
        }
        ViewGroup.LayoutParams lp = mTextureView.getLayoutParams();
        lp.width = finalWith;
        lp.height = finalHeight;
        mTextureView.setLayoutParams(lp);
    }

    public interface FocusAudioListener {

        void audioPlay(boolean isPlay);
    }
}

16 Source : SpectaculumDemoBaseActivity.java
with Apache License 2.0
from protyposis

/**
 * A base activity implementation for a Spectaculum view that provides all functionality that is
 * shared among all Spectaculum demo activities.
 *
 * Created by Mario on 17.08.2016.
 */
public abstract clreplaced SpectaculumDemoBaseActivity extends Activity {

    private static final String TAG = SpectaculumDemoBaseActivity.clreplaced.getSimpleName();

    private Uri mMediaUri;

    private SpectaculumView mSpectaculumView;

    private EffectManager mEffectManager;

    private ProgressBar mProgressIndicator;

    private MediaController mMediaController;

    /**
     * Sets up the base activity. This must be called from a subclreplaced AFTER setting the layout.
     */
    @SuppressLint("WrongViewCast")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Utils.setActionBarSubreplacedleEllipsizeMiddle(this);
        // Get views from the layout
        mSpectaculumView = (SpectaculumView) findViewById(R.id.spectaculum);
        mProgressIndicator = (ProgressBar) findViewById(R.id.progress);
        // Initialize Spectaculum effects
        mEffectManager = new EffectManager(this, R.id.parameterlist, mSpectaculumView);
        mEffectManager.addEffects();
        // Display progress indicator because subclreplacedes will now initialize their stuff
        showProgressIndicator();
    }

    public void showProgressIndicator() {
        // Not all layouts contain a progress indicator (e.g. cameraview) so we need to check for null here
        if (mProgressIndicator != null) {
            mProgressIndicator.setVisibility(View.VISIBLE);
        }
    }

    public void hideProgressIndicator() {
        // Not all layouts contain a progress indicator (e.g. cameraview) so we need to check for null here
        if (mProgressIndicator != null) {
            mProgressIndicator.setVisibility(View.GONE);
        }
    }

    public void setMediaUri(Uri mediaUri) {
        mMediaUri = mediaUri;
        getActionBar().setSubreplacedle(mMediaUri.toString());
    }

    /**
     * Creates a media controller and attaches it to the activity.
     * This method is for activities that contain a video player.
     * @param mediaPlayerControl the control interface, e.g. a video view
     */
    public void initMediaController(MediaController.MediaPlayerControl mediaPlayerControl) {
        mMediaController = new MediaController(this);
        mMediaController.setAnchorView(findViewById(R.id.container));
        mMediaController.setMediaPlayer(mediaPlayerControl);
        mMediaController.setEnabled(false);
    }

    /**
     * Returns the media controller for programmatic control of video playback.
     */
    public MediaController getMediaControllerWidget() {
        return mMediaController;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Add the common menu items to the action bar
        getMenuInflater().inflate(R.menu.common, menu);
        // Add the effects submenu to the action bar
        mEffectManager.addToMenu(menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.gereplacedemId();
        // Handle action bar clicks
        if (mEffectManager.doMenuActions(item)) {
            // An effect has been selected
            return true;
        } else if (id == R.id.action_save_frame) {
            // Request a frame capture; make sure that a OnFrameCapturedCallback is attached
            mSpectaculumView.captureFrame();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Try to toggle the media controller
        if (event.getAction() == MotionEvent.ACTION_UP && mMediaController != null) {
            long durationMs = event.getEventTime() - event.getDownTime();
            /*
             *If a certain short amount of time preplacedes between DOWN and UP actions, we clreplacedify the
             * event as simple tap and toggle the visibility of the media controller.
             */
            if (durationMs < 500) {
                if (mMediaController.isShowing()) {
                    mMediaController.hide();
                } else {
                    mMediaController.show();
                }
            }
        }
        // Hand the event to the Spectaculum view to process zoom/pan gestures
        if (!mSpectaculumView.isTouchEnabled()) {
            mSpectaculumView.onTouchEvent(event);
        }
        return super.onTouchEvent(event);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mEffectManager.onPause();
        // Spectaculum must be paused when activity pauses to suspend the rendering thread
        mSpectaculumView.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // Log RAM state
        ActivityManager activityManager = (ActivityManager) getSystemService(Activity.ACTIVITY_SERVICE);
        ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
        activityManager.getMemoryInfo(memoryInfo);
        Log.d(TAG, "Memory (available/total/low): " + (memoryInfo.availMem / 1024 / 1024) + "/" + (memoryInfo.totalMem / 1024 / 1024) + "/" + memoryInfo.lowMemory);
        mEffectManager.onResume();
        // Spectaculum must be resumed when activity resumes to resume the rendering thread
        mSpectaculumView.onResume();
    }

    @Override
    protected void onStop() {
        // Hide media controller to avoid window leak
        if (mMediaController != null) {
            mMediaController.hide();
        }
        super.onStop();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        // Retain the media uri through a configuration change
        if (mMediaUri != null) {
            outState.putParcelable("uri", mMediaUri);
        }
    }
}

16 Source : PictureVideoPlayActivity.java
with Apache License 2.0
from JessYanCoding

/**
 * @author:luck
 * @data:2017/8/28 下午11:00
 * @描述: 视频播放类
 */
public clreplaced PictureVideoPlayActivity extends PictureBaseActivity implements MediaPlayer.OnErrorListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, View.OnClickListener {

    private String videoPath;

    private ImageButton ibLeftBack;

    private MediaController mMediaController;

    private VideoView mVideoView;

    private TextView tvConfirm;

    private ImageView iv_play;

    private int mPositionWhenPaused = -1;

    @Override
    public boolean isImmersive() {
        return false;
    }

    @Override
    public boolean isRequestedOrientation() {
        return false;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        super.onCreate(savedInstanceState);
    }

    @Override
    public int getResourceId() {
        return R.layout.picture_activity_video_play;
    }

    @Override
    protected void initPictureSelectorStyle() {
        if (config.style != null) {
            if (config.style.pictureLeftBackIcon != 0) {
                ibLeftBack.setImageResource(config.style.pictureLeftBackIcon);
            }
        }
    }

    @Override
    protected void initWidgets() {
        super.initWidgets();
        videoPath = getIntent().getStringExtra(PictureConfig.EXTRA_VIDEO_PATH);
        boolean isExternalPreview = getIntent().getBooleanExtra(PictureConfig.EXTRA_PREVIEW_VIDEO, false);
        if (TextUtils.isEmpty(videoPath)) {
            LocalMedia media = getIntent().getParcelableExtra(PictureConfig.EXTRA_MEDIA_KEY);
            if (media == null || TextUtils.isEmpty(media.getPath())) {
                finish();
                return;
            }
            videoPath = media.getPath();
        }
        if (TextUtils.isEmpty(videoPath)) {
            closeActivity();
            return;
        }
        ibLeftBack = findViewById(R.id.pictureLeftBack);
        mVideoView = findViewById(R.id.video_view);
        tvConfirm = findViewById(R.id.tv_confirm);
        mVideoView.setBackgroundColor(Color.BLACK);
        iv_play = findViewById(R.id.iv_play);
        mMediaController = new MediaController(this);
        mVideoView.setOnCompletionListener(this);
        mVideoView.setOnPreparedListener(this);
        mVideoView.setMediaController(mMediaController);
        ibLeftBack.setOnClickListener(this);
        iv_play.setOnClickListener(this);
        tvConfirm.setOnClickListener(this);
        tvConfirm.setVisibility(config.selectionMode == PictureConfig.SINGLE && config.enPreviewVideo && !isExternalPreview ? View.VISIBLE : View.GONE);
    }

    @Override
    public void onStart() {
        // Play Video
        if (SdkVersionUtils.checkedAndroid_Q() && PictureMimeType.isContent(videoPath)) {
            mVideoView.setVideoURI(Uri.parse(videoPath));
        } else {
            mVideoView.setVideoPath(videoPath);
        }
        mVideoView.start();
        super.onStart();
    }

    @Override
    public void onPause() {
        // Stop video when the activity is pause.
        mPositionWhenPaused = mVideoView.getCurrentPosition();
        mVideoView.stopPlayback();
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        mMediaController = null;
        mVideoView = null;
        iv_play = null;
        super.onDestroy();
    }

    @Override
    public void onResume() {
        // Resume video player
        if (mPositionWhenPaused >= 0) {
            mVideoView.seekTo(mPositionWhenPaused);
            mPositionWhenPaused = -1;
        }
        super.onResume();
    }

    @Override
    public boolean onError(MediaPlayer player, int arg1, int arg2) {
        return false;
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        if (null != iv_play) {
            iv_play.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.pictureLeftBack) {
            onBackPressed();
        } else if (id == R.id.iv_play) {
            mVideoView.start();
            iv_play.setVisibility(View.INVISIBLE);
        } else if (id == R.id.tv_confirm) {
            List<LocalMedia> result = new ArrayList<>();
            result.add(getIntent().getParcelableExtra(PictureConfig.EXTRA_MEDIA_KEY));
            setResult(RESULT_OK, new Intent().putParcelableArrayListExtra(PictureConfig.EXTRA_SELECT_LIST, (ArrayList<? extends Parcelable>) result));
            onBackPressed();
        }
    }

    @Override
    public void onBackPressed() {
        if (config.windowAnimationStyle != null && config.windowAnimationStyle.activityPreviewExitAnimation != 0) {
            finish();
            overridePendingTransition(0, config.windowAnimationStyle != null && config.windowAnimationStyle.activityPreviewExitAnimation != 0 ? config.windowAnimationStyle.activityPreviewExitAnimation : R.anim.picture_anim_exit);
        } else {
            closeActivity();
        }
    }

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(new ContextWrapper(newBase) {

            @Override
            public Object getSystemService(String name) {
                if (Context.AUDIO_SERVICE.equals(name)) {
                    return getApplicationContext().getSystemService(name);
                }
                return super.getSystemService(name);
            }
        });
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setOnInfoListener((mp1, what, extra) -> {
            if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
                // video started
                mVideoView.setBackgroundColor(Color.TRANSPARENT);
                return true;
            }
            return false;
        });
    }
}

16 Source : VideoViewTV.java
with Apache License 2.0
from JackChan1999

public clreplaced VideoViewTV extends SurfaceView implements LetvMediaPlayerControl {

    private static final int STATE_ERROR = -1;

    private static final int STATE_IDLE = 0;

    private static final int STATE_PAUSED = 4;

    private static final int STATE_PLAYBACK_COMPLETED = 5;

    private static final int STATE_PLAYING = 3;

    private static final int STATE_PREPARED = 2;

    private static final int STATE_PREPARING = 1;

    private final int FORWARD_TIME;

    private final int REWIND_TIME;

    private int duration;

    protected int lastSeekWhenDestoryed;

    private final OnBufferingUpdateListener mBufferingUpdateListener;

    private boolean mCanPause;

    private boolean mCanSeekBack;

    private boolean mCanSeekForward;

    private final OnCompletionListener mCompletionListener;

    protected Context mContext;

    private int mCurrentBufferPercentage;

    private int mCurrentState;

    private final OnErrorListener mErrorListener;

    private Map<String, String> mHeaders;

    OnInfoListener mInfoListener;

    private MediaPlayer mMediaPlayer;

    private OnBufferingUpdateListener mOnBufferingUpdateListener;

    private OnCompletionListener mOnCompletionListener;

    private OnErrorListener mOnErrorListener;

    private OnInfoListener mOnInfoListener;

    private OnMediaStateTimeListener mOnMediaStateTimeListener;

    private OnPreparedListener mOnPreparedListener;

    private OnSeekCompleteListener mOnSeekCompleteListener;

    private OnVideoSizeChangedListener mOnVideoSizeChangedListener;

    OnPreparedListener mPreparedListener;

    private int mRatioType;

    Callback mSHCallback;

    OnSeekCompleteListener mSeekCompleteListener;

    private int mSeekWhenPrepared;

    OnVideoSizeChangedListener mSizeChangedListener;

    private int mSurfaceHeight;

    private SurfaceHolder mSurfaceHolder;

    private int mSurfaceWidth;

    private int mTargetState;

    private Uri mUri;

    private int mVideoHeight;

    private int mVideoWidth;

    private MediaController mediaController;

    public VideoViewTV(Context context) {
        super(context);
        this.FORWARD_TIME = 20000;
        this.REWIND_TIME = 20000;
        this.mCurrentState = 0;
        this.mTargetState = 0;
        this.mSurfaceHolder = null;
        this.mMediaPlayer = null;
        this.lastSeekWhenDestoryed = 0;
        this.mRatioType = -1;
        this.mSHCallback = new Callback() {

            public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
                VideoViewTV.this.mSurfaceWidth = w;
                VideoViewTV.this.mSurfaceHeight = h;
                LogTag.i("VideoViewTV", "surfaceChanged(), mSurfaceWidth=" + VideoViewTV.this.mSurfaceWidth + ", mSurfaceHeight=" + VideoViewTV.this.mSurfaceHeight);
                boolean isValidState;
                if (VideoViewTV.this.mTargetState == 3) {
                    isValidState = true;
                } else {
                    isValidState = false;
                }
                boolean hasValidSize;
                if (VideoViewTV.this.mVideoWidth == w && VideoViewTV.this.mVideoHeight == h) {
                    hasValidSize = true;
                } else {
                    hasValidSize = false;
                }
                if (VideoViewTV.this.mMediaPlayer != null && isValidState && hasValidSize) {
                    if (VideoViewTV.this.mSeekWhenPrepared != 0) {
                        VideoViewTV.this.seekTo(VideoViewTV.this.mSeekWhenPrepared);
                    }
                    VideoViewTV.this.start();
                }
            }

            public void surfaceCreated(SurfaceHolder holder) {
                LogTag.i("VideoViewTV", "surfaceCreated()");
                VideoViewTV.this.mSurfaceHolder = holder;
                VideoViewTV.this.openVideo();
            }

            public void surfaceDestroyed(SurfaceHolder holder) {
                LogTag.i("VideoViewTV", "surfaceDestroyed()");
                VideoViewTV.this.mSurfaceHolder = null;
                if (VideoViewTV.this.mediaController != null) {
                    VideoViewTV.this.mediaController.hide();
                }
                VideoViewTV.this.lastSeekWhenDestoryed = VideoViewTV.this.getCurrentPosition();
                VideoViewTV.this.release(true);
            }
        };
        this.mSizeChangedListener = new OnVideoSizeChangedListener() {

            public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
                VideoViewTV.this.mVideoWidth = mp.getVideoWidth();
                VideoViewTV.this.mVideoHeight = mp.getVideoHeight();
                LogTag.i("VideoViewTV", "onVideoSizeChanged(), mVideoWidth=" + VideoViewTV.this.mVideoWidth + ", mVideoHeight=" + VideoViewTV.this.mVideoHeight);
                if (VideoViewTV.this.mVideoWidth != 0 && VideoViewTV.this.mVideoHeight != 0) {
                    VideoViewTV.this.getHolder().setFixedSize(VideoViewTV.this.mVideoWidth, VideoViewTV.this.mVideoHeight);
                }
            }
        };
        this.mInfoListener = new OnInfoListener() {

            public boolean onInfo(MediaPlayer mp, int what, int extra) {
                if (VideoViewTV.this.mOnInfoListener == null || !VideoViewTV.this.mOnInfoListener.onInfo(mp, what, extra)) {
                    return false;
                }
                return true;
            }
        };
        this.mSeekCompleteListener = new OnSeekCompleteListener() {

            public void onSeekComplete(MediaPlayer mp) {
                if (VideoViewTV.this.mOnSeekCompleteListener != null) {
                    VideoViewTV.this.mOnSeekCompleteListener.onSeekComplete(mp);
                }
            }
        };
        this.mPreparedListener = new OnPreparedListener() {

            public void onPrepared(MediaPlayer mp) {
                String currentDate = Tools.getCurrentDate();
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewTv(乐视电视videoview)  onPrepared()");
                if (VideoViewTV.this.mOnMediaStateTimeListener != null) {
                    VideoViewTV.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
                }
                VideoViewTV.this.mCurrentState = 2;
                try {
                    Metadata data = (Metadata) Clreplaced.forName(MediaPlayer.clreplaced.getName()).getMethod("getMetadata", new Clreplaced[] { Boolean.TYPE, Boolean.TYPE }).invoke(mp, new Object[] { Boolean.valueOf(false), Boolean.valueOf(false) });
                    VideoViewTV videoViewTV;
                    if (data != null) {
                        videoViewTV = VideoViewTV.this;
                        boolean z = !data.has(29) || data.getBoolean(29);
                        videoViewTV.mCanPause = z;
                        videoViewTV = VideoViewTV.this;
                        z = !data.has(30) || data.getBoolean(30);
                        videoViewTV.mCanSeekBack = z;
                        videoViewTV = VideoViewTV.this;
                        z = !data.has(31) || data.getBoolean(31);
                        videoViewTV.mCanSeekForward = z;
                    } else {
                        VideoViewTV videoViewTV2 = VideoViewTV.this;
                        videoViewTV = VideoViewTV.this;
                        VideoViewTV.this.mCanSeekForward = true;
                        videoViewTV.mCanSeekBack = true;
                        videoViewTV2.mCanPause = true;
                    }
                    if (VideoViewTV.this.mOnPreparedListener != null && VideoViewTV.this.isInPlaybackState()) {
                        VideoViewTV.this.mOnPreparedListener.onPrepared(VideoViewTV.this.mMediaPlayer);
                    }
                    if (VideoViewTV.this.mediaController != null) {
                        VideoViewTV.this.mediaController.setEnabled(true);
                    }
                    VideoViewTV.this.mVideoWidth = mp.getVideoWidth();
                    VideoViewTV.this.mVideoHeight = mp.getVideoHeight();
                    int seekToPosition = VideoViewTV.this.mSeekWhenPrepared;
                    if (seekToPosition != 0) {
                        VideoViewTV.this.seekTo(seekToPosition);
                    }
                    if (VideoViewTV.this.mVideoWidth != 0 && VideoViewTV.this.mVideoHeight != 0) {
                        VideoViewTV.this.getHolder().setFixedSize(VideoViewTV.this.mVideoWidth, VideoViewTV.this.mVideoHeight);
                        if (VideoViewTV.this.mSurfaceWidth != VideoViewTV.this.mVideoWidth || VideoViewTV.this.mSurfaceHeight != VideoViewTV.this.mVideoHeight) {
                            return;
                        }
                        if (VideoViewTV.this.mTargetState == 3) {
                            VideoViewTV.this.start();
                            if (VideoViewTV.this.mediaController != null) {
                                VideoViewTV.this.mediaController.show();
                            }
                        } else if (!VideoViewTV.this.isPlaying()) {
                            if ((seekToPosition != 0 || VideoViewTV.this.getCurrentPosition() > 0) && VideoViewTV.this.mediaController != null) {
                                VideoViewTV.this.mediaController.show(0);
                            }
                        }
                    } else if (VideoViewTV.this.mTargetState == 3) {
                        VideoViewTV.this.start();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        this.mCompletionListener = new OnCompletionListener() {

            public void onCompletion(MediaPlayer mp) {
                VideoViewTV.this.mCurrentState = 5;
                VideoViewTV.this.mTargetState = 5;
                if (VideoViewTV.this.mediaController != null) {
                    VideoViewTV.this.mediaController.hide();
                }
                if (VideoViewTV.this.mOnCompletionListener != null) {
                    VideoViewTV.this.mOnCompletionListener.onCompletion(VideoViewTV.this.mMediaPlayer);
                }
            }
        };
        this.mErrorListener = new OnErrorListener() {

            public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
                VideoViewTV.this.mCurrentState = -1;
                VideoViewTV.this.mTargetState = -1;
                if (VideoViewTV.this.mediaController != null) {
                    VideoViewTV.this.mediaController.hide();
                }
                String currentDate = Tools.getCurrentDate();
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + "VideoViewTV(乐视电视videoview) error, framework_err=" + framework_err + ", impl_err=" + impl_err);
                if (VideoViewTV.this.mOnMediaStateTimeListener != null) {
                    VideoViewTV.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
                }
                return (VideoViewTV.this.mOnErrorListener == null || VideoViewTV.this.mOnErrorListener.onError(VideoViewTV.this.mMediaPlayer, framework_err, impl_err)) ? true : true;
            }
        };
        this.mBufferingUpdateListener = new OnBufferingUpdateListener() {

            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                VideoViewTV.this.mCurrentBufferPercentage = percent;
                if (VideoViewTV.this.mOnBufferingUpdateListener != null) {
                    VideoViewTV.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
                }
            }
        };
        this.mContext = context;
        initVideoView();
        setBackgroundColor(Color.argb(101, 99, 22, 0));
    }

    public VideoViewTV(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        this.mContext = context;
        initVideoView();
    }

    public VideoViewTV(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.FORWARD_TIME = 20000;
        this.REWIND_TIME = 20000;
        this.mCurrentState = 0;
        this.mTargetState = 0;
        this.mSurfaceHolder = null;
        this.mMediaPlayer = null;
        this.lastSeekWhenDestoryed = 0;
        this.mRatioType = -1;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        this.mContext = context;
        initVideoView();
    }

    private void initVideoView() {
        this.mVideoWidth = 0;
        this.mVideoHeight = 0;
        getHolder().addCallback(this.mSHCallback);
        getHolder().setType(3);
        setFocusable(true);
        setFocusableInTouchMode(true);
        requestFocus();
        this.mCurrentState = 0;
        this.mTargetState = 0;
    }

    public boolean isInPlaybackState() {
        return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
    }

    public boolean extIsInPlaybackState() {
        return isInPlaybackState();
    }

    public boolean canPause() {
        return this.mCanPause;
    }

    public boolean canSeekBackward() {
        return this.mCanSeekBack;
    }

    public boolean canSeekForward() {
        return this.mCanSeekForward;
    }

    public void stopPlayback() {
        if (this.mMediaPlayer != null) {
            this.mMediaPlayer.reset();
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewTV release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            this.mCurrentState = 0;
            this.mTargetState = 0;
        }
        this.mMediaPlayer = null;
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
        int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
        if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
            switch(this.mRatioType) {
                case -1:
                    if (this.mVideoWidth * height <= this.mVideoHeight * width) {
                        if (this.mVideoWidth * height < this.mVideoHeight * width) {
                            width = (this.mVideoWidth * height) / this.mVideoHeight;
                            break;
                        }
                    }
                    height = (this.mVideoHeight * width) / this.mVideoWidth;
                    break;
                    break;
                case 1:
                    if (height * 4 <= width * 3) {
                        if (height * 4 < width * 3) {
                            width = (height * 4) / 3;
                            break;
                        }
                    }
                    height = (width * 3) / 4;
                    break;
                    break;
                case 2:
                    if (height * 16 <= width * 9) {
                        if (height * 16 < width * 9) {
                            width = (height * 16) / 9;
                            break;
                        }
                    }
                    height = (width * 9) / 16;
                    break;
                    break;
            }
        }
        LogTag.i("VideoViewTV", "onMeasure(), width=" + width + ", height=" + height + ", mVideoWidth=" + this.mVideoWidth + ", mVideoHeight=" + this.mVideoHeight);
        setMeasuredDimension(width, height);
    }

    public void adjust(int type) {
        this.mRatioType = type;
        invalateScreenSize();
    }

    private void invalateScreenSize() {
        setLayoutParams((LayoutParams) getLayoutParams());
    }

    public int resolveAdjustedSize(int desiredSize, int measureSpec) {
        int result = desiredSize;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        switch(specMode) {
            case Integer.MIN_VALUE:
                return Math.min(desiredSize, specSize);
            case 0:
                return desiredSize;
            case 1073741824:
                return specSize;
            default:
                return result;
        }
    }

    public void setVideoPath(String path) {
        setVideoURI(Uri.parse(path));
    }

    public void setVideoPath(String path, Map<String, String> headers) {
        setVideoURI(Uri.parse(path), headers);
    }

    public void setVideoURI(Uri uri) {
        setVideoURI(uri, null);
    }

    public void setVideoURI(Uri uri, Map<String, String> headers) {
        String currentDate = Tools.getCurrentDate();
        LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewTV(乐视电视videoview)  setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
        if (this.mOnMediaStateTimeListener != null) {
            this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
        }
        this.mUri = uri;
        this.mHeaders = headers;
        this.mSeekWhenPrepared = 0;
        openVideo();
        requestLayout();
        invalidate();
    }

    private void initListener() {
        this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
        this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
        this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
        this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
        this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
        this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
        this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
    }

    private void deadListener(MediaPlayer mMediaPlayer) {
        if (mMediaPlayer != null) {
            mMediaPlayer.setOnSeekCompleteListener(null);
            mMediaPlayer.setOnInfoListener(null);
            mMediaPlayer.setOnPreparedListener(null);
            mMediaPlayer.setOnVideoSizeChangedListener(null);
            mMediaPlayer.setOnCompletionListener(null);
            mMediaPlayer.setOnErrorListener(null);
            mMediaPlayer.setOnBufferingUpdateListener(null);
        }
    }

    @SuppressLint({ "NewApi" })
    private void openVideo() {
        if (this.mUri != null && this.mSurfaceHolder != null) {
            Intent i = new Intent("com.android.music.musicservicecommand");
            i.putExtra("command", "pause");
            this.mContext.sendBroadcast(i);
            release(false);
            try {
                String currentDate = Tools.getCurrentDate();
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264mp4(乐视电视videoview)  创建MediaPlayer对象");
                if (this.mOnMediaStateTimeListener != null) {
                    this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
                }
                this.mMediaPlayer = new MediaPlayer();
                initListener();
                this.duration = -1;
                this.mCurrentBufferPercentage = 0;
                this.mMediaPlayer.setDataSource(this.mContext, this.mUri, this.mHeaders);
                this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
                this.mMediaPlayer.setAudioStreamType(3);
                this.mMediaPlayer.setScreenOnWhilePlaying(true);
                this.mMediaPlayer.prepareAsync();
                this.mCurrentState = 1;
                attachMediaController();
            } catch (IOException e) {
                this.mCurrentState = -1;
                this.mTargetState = -1;
                this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
            } catch (IllegalArgumentException e2) {
                this.mCurrentState = -1;
                this.mTargetState = -1;
                this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
            } catch (Exception e3) {
                this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
            }
        }
    }

    public void setMediaController(MediaController controller) {
        if (this.mediaController != null) {
            this.mediaController.hide();
        }
        this.mediaController = controller;
        attachMediaController();
    }

    private void attachMediaController() {
        if (this.mMediaPlayer != null && this.mediaController != null) {
            View anchorView;
            this.mediaController.setMediaPlayer(this);
            if (getParent() instanceof View) {
                anchorView = (View) getParent();
            } else {
                anchorView = this;
            }
            this.mediaController.setAnchorView(anchorView);
            this.mediaController.setEnabled(isInPlaybackState());
        }
    }

    private void release(boolean cleartargetstate) {
        if (this.mMediaPlayer != null) {
            this.mMediaPlayer.reset();
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewTV release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            deadListener(this.mMediaPlayer);
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            if (cleartargetstate) {
                this.mTargetState = 0;
            }
        }
    }

    public void reset() {
        if (this.mMediaPlayer != null) {
            this.mMediaPlayer.reset();
        }
    }

    public boolean onTouchEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onTrackballEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        boolean isKeyCodeSupported;
        if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 164 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
            isKeyCodeSupported = false;
        } else {
            isKeyCodeSupported = true;
        }
        if (isInPlaybackState() && isKeyCodeSupported && this.mediaController != null) {
            if (keyCode == 79 || keyCode == 85) {
                if (this.mMediaPlayer.isPlaying()) {
                    pause();
                    this.mediaController.show();
                    return true;
                }
                start();
                this.mediaController.hide();
                return true;
            } else if (keyCode == TransportMediator.KEYCODE_MEDIA_PLAY) {
                if (this.mMediaPlayer.isPlaying()) {
                    return true;
                }
                start();
                this.mediaController.hide();
                return true;
            } else if (keyCode != 86 && keyCode != TransportMediator.KEYCODE_MEDIA_PAUSE) {
                toggleMediaControlsVisiblity();
            } else if (!this.mMediaPlayer.isPlaying()) {
                return true;
            } else {
                pause();
                this.mediaController.show();
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    public int getLastSeekWhenDestoryed() {
        return this.lastSeekWhenDestoryed;
    }

    private void toggleMediaControlsVisiblity() {
        if (this.mediaController.isShowing()) {
            this.mediaController.hide();
        } else {
            this.mediaController.show();
        }
    }

    public void start() {
        HttpRequestManager.getInstance(this.mContext).requestCapability();
        if (isInPlaybackState()) {
            this.mMediaPlayer.start();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + " VideoViewTV(乐视电视videoview)  start()");
            this.mCurrentState = 3;
        }
        this.mTargetState = 3;
    }

    public void start(MediaPlayer mMediaPlayer) {
        if (isInPlaybackState()) {
            mMediaPlayer.start();
            this.mCurrentState = 3;
        }
        this.mTargetState = 3;
    }

    public void pause() {
        if (isInPlaybackState()) {
            try {
                if (this.mMediaPlayer != null && this.mMediaPlayer.isPlaying()) {
                    this.mMediaPlayer.pause();
                    LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + " VideoViewTV(乐视电视videoview)  pause()");
                    this.mCurrentState = 4;
                }
            } catch (Exception e) {
            }
        }
        this.mTargetState = 4;
    }

    public void suspend() {
        release(false);
    }

    public void resume() {
        openVideo();
    }

    public int getCurrentPosition() {
        if (isInPlaybackState()) {
            return this.mMediaPlayer.getCurrentPosition();
        }
        return 0;
    }

    public int getDuration() {
        if (!isInPlaybackState()) {
            this.duration = -1;
            return this.duration;
        } else if (this.duration > 0) {
            return this.duration;
        } else {
            this.duration = this.mMediaPlayer.getDuration();
            return this.duration;
        }
    }

    public void seekTo(int msec) {
        if (isInPlaybackState()) {
            this.mMediaPlayer.seekTo(msec);
            this.mSeekWhenPrepared = 0;
            this.lastSeekWhenDestoryed = 0;
            return;
        }
        this.mSeekWhenPrepared = msec;
        this.lastSeekWhenDestoryed = 0;
    }

    public void forward() {
        seekTo(getCurrentPosition() + 20000);
    }

    public void rewind() {
        seekTo(getCurrentPosition() - 20000);
    }

    public boolean isPlaying() {
        try {
            return isInPlaybackState() && this.mMediaPlayer.isPlaying();
        } catch (Exception e) {
            return false;
        }
    }

    public boolean isPaused() {
        return this.mCurrentState == 4;
    }

    public int getBufferPercentage() {
        if (this.mMediaPlayer != null) {
            return this.mCurrentBufferPercentage;
        }
        return 0;
    }

    protected int[] getVideoSize() {
        if (this.mMediaPlayer == null) {
            return null;
        }
        int width = this.mMediaPlayer.getVideoWidth();
        int height = this.mMediaPlayer.getVideoHeight();
        int[] screenSize = new int[2];
        float ratios = Math.max(((float) width) / ((float) this.mSurfaceWidth), ((float) height) / ((float) this.mSurfaceHeight));
        screenSize[0] = (int) Math.ceil((double) (((float) width) / ratios));
        screenSize[1] = (int) Math.ceil((double) (((float) height) / ratios));
        return screenSize;
    }

    public View getView() {
        return this;
    }

    public void setOnPreparedListener(OnPreparedListener l) {
        this.mOnPreparedListener = l;
    }

    public void setOnInfoListener(OnInfoListener l) {
        this.mOnInfoListener = l;
    }

    public void setOnCompletionListener(OnCompletionListener l) {
        this.mOnCompletionListener = l;
    }

    public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
        this.mOnBufferingUpdateListener = l;
    }

    public void setOnErrorListener(OnErrorListener l) {
        this.mOnErrorListener = l;
    }

    public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
        this.mOnVideoSizeChangedListener = l;
    }

    public OnSeekCompleteListener getOnSeekCompleteListener() {
        return this.mOnSeekCompleteListener;
    }

    public void setOnSeekCompleteListener(OnSeekCompleteListener mOnSeekCompleteListener) {
        this.mOnSeekCompleteListener = mOnSeekCompleteListener;
    }

    public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener videoViewStateChangeListener) {
    }

    public boolean isEnforcementWait() {
        return false;
    }

    public void setEnforcementWait(boolean enforcementWait) {
    }

    public boolean isEnforcementPause() {
        return false;
    }

    public void setEnforcementPause(boolean enforcementPause) {
    }

    public void setVideoPlayUrl(PlayUrl url) {
    }

    public void setOnAdNumberListener(OnAdNumberListener l) {
    }

    public void setCacheSize(int video_size, int audio_size, int picutureSize, int startpic_size) {
    }

    public void setOnBlockListener(OnBlockListener l) {
    }

    public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
        this.mOnMediaStateTimeListener = l;
    }

    public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
    }

    public int getAudioSessionId() {
        return 0;
    }

    public void setOnCacheListener(OnCacheListener l) {
    }

    public void setOnFirstPlayListener(OnFirstPlayLitener l) {
    }

    public int setSourceType(int sourceType) {
        return 0;
    }

    public int setMachineInfomation(float ScreenResolution) {
        return 0;
    }

    public int setOneFingertouchInfomation(float begin_x, float begin_y, float end_x, float end_y) {
        return 0;
    }

    public int setTwoFingertouchInfomation(float begin_x0, float begin_y0, float begin_x1, float begin_y1, float end_x0, float end_y0, float end_x1, float end_y1) {
        return 0;
    }

    public int setgravity_yroInfomation(float gravity_yro_x, float gravity_yro_y, float gravity_yro_z) {
        return 0;
    }

    public int setGravityInfomation(float gravity_x, float gravity_y, float gravity_z) {
        return 0;
    }

    public int setgravity_yroValidInfomation(boolean gravityValid) {
        return 0;
    }

    public int setAngleInit() {
        return 0;
    }

    public int setTwoFingerZoom(float zoom) {
        return 0;
    }

    public void setInitPosition(int msec) {
    }

    public void setVolume(int volume) {
    }

    public void setCacheTime(double start_cache, double block_cache) {
    }

    public void processSensorEvent(SensorEvent sensorEvent) {
    }
}

16 Source : VideoViewH264LeMobile.java
with Apache License 2.0
from JackChan1999

public clreplaced VideoViewH264LeMobile extends SurfaceView implements LetvMediaPlayerControl {

    public static final int STATE_ENFORCEMENT = 7;

    public static final int STATE_ERROR = -1;

    public static final int STATE_IDLE = 0;

    public static final int STATE_PAUSED = 4;

    public static final int STATE_PLAYBACK_COMPLETED = 5;

    public static final int STATE_PLAYING = 3;

    public static final int STATE_PREPARED = 2;

    public static final int STATE_PREPARING = 1;

    public static final int STATE_STOPBACK = 6;

    private final int FORWARD_TIME;

    private final int REWIND_TIME;

    private String TAG;

    private boolean enforcementPause;

    private boolean enforcementWait;

    protected int lastSeekWhenDestoryed;

    private OnBufferingUpdateListener mBufferingUpdateListener;

    private boolean mCanPause;

    private boolean mCanSeekBack;

    private boolean mCanSeekForward;

    private OnCompletionListener mCompletionListener;

    private Context mContext;

    private int mCurrentBufferPercentage;

    private int mCurrentState;

    private int mDuration;

    private OnErrorListener mErrorListener;

    private OnInfoListener mInfoListener;

    private MediaController mMediaController;

    private MediaPlayer mMediaPlayer;

    private OnBufferingUpdateListener mOnBufferingUpdateListener;

    private OnCompletionListener mOnCompletionListener;

    private OnErrorListener mOnErrorListener;

    private OnInfoListener mOnInfoListener;

    private OnMediaStateTimeListener mOnMediaStateTimeListener;

    private OnPreparedListener mOnPreparedListener;

    private OnSeekCompleteListener mOnSeekCompleteListener;

    private OnVideoSizeChangedListener mOnVideoSizeChangedListener;

    private OnVideoViewStateChangeListener mOnVideoViewStateChangeListener;

    private PlayUrl mPlayerUrl;

    OnPreparedListener mPreparedListener;

    private int mRatioType;

    Callback mSHCallback;

    private OnSeekCompleteListener mSeekCompleteListener;

    private int mSeekWhenPrepared;

    OnVideoSizeChangedListener mSizeChangedListener;

    private int mSurfaceHeight;

    private SurfaceHolder mSurfaceHolder;

    private int mSurfaceWidth;

    private int mTargetState;

    private Uri mUri;

    private int mVideoHeight;

    private int mVideoWidth;

    public VideoViewH264LeMobile(Context context) {
        super(context);
        this.TAG = "VideoViewLeMobile";
        this.mCurrentState = 0;
        this.mTargetState = 0;
        this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.mSurfaceHolder = null;
        this.mMediaPlayer = null;
        this.mRatioType = -1;
        this.lastSeekWhenDestoryed = 0;
        this.enforcementWait = false;
        this.enforcementPause = false;
        this.mSizeChangedListener = new OnVideoSizeChangedListener() {

            public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
                LogTag.i("onVideoSizeChanged(), width=" + width + ", heigth=" + height);
                VideoViewH264LeMobile.this.mVideoWidth = mp.getVideoWidth();
                VideoViewH264LeMobile.this.mVideoHeight = mp.getVideoHeight();
                if (!(VideoViewH264LeMobile.this.mVideoWidth == 0 || VideoViewH264LeMobile.this.mVideoHeight == 0)) {
                    VideoViewH264LeMobile.this.getHolder().setFixedSize(VideoViewH264LeMobile.this.mVideoWidth, VideoViewH264LeMobile.this.mVideoHeight);
                }
                if (VideoViewH264LeMobile.this.mOnVideoSizeChangedListener != null) {
                    VideoViewH264LeMobile.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, width, height);
                }
            }
        };
        this.mPreparedListener = new OnPreparedListener() {

            public void onPrepared(MediaPlayer mp) {
                LogTag.i("onPrepared()");
                String currentDate = Tools.getCurrentDate();
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264LeMobile(乐视手机videoview)  onPrepared()");
                if (VideoViewH264LeMobile.this.mOnMediaStateTimeListener != null) {
                    VideoViewH264LeMobile.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
                }
                VideoViewH264LeMobile.this.mCurrentState = 2;
                VideoViewH264LeMobile.this.StateChange(VideoViewH264LeMobile.this.mCurrentState);
                VideoViewH264LeMobile videoViewH264LeMobile = VideoViewH264LeMobile.this;
                VideoViewH264LeMobile videoViewH264LeMobile2 = VideoViewH264LeMobile.this;
                VideoViewH264LeMobile.this.mCanSeekForward = true;
                videoViewH264LeMobile2.mCanSeekBack = true;
                videoViewH264LeMobile.mCanPause = true;
                if (VideoViewH264LeMobile.this.mMediaController != null) {
                    VideoViewH264LeMobile.this.mMediaController.setEnabled(true);
                }
                VideoViewH264LeMobile.this.mVideoWidth = mp.getVideoWidth();
                VideoViewH264LeMobile.this.mVideoHeight = mp.getVideoHeight();
                int seekToPosition = VideoViewH264LeMobile.this.mSeekWhenPrepared;
                if (seekToPosition != 0) {
                    VideoViewH264LeMobile.this.seekTo(seekToPosition);
                }
                if (VideoViewH264LeMobile.this.mVideoWidth != 0 && VideoViewH264LeMobile.this.mVideoHeight != 0) {
                    VideoViewH264LeMobile.this.getHolder().setFixedSize(VideoViewH264LeMobile.this.mVideoWidth, VideoViewH264LeMobile.this.mVideoHeight);
                    if (VideoViewH264LeMobile.this.mSurfaceWidth == VideoViewH264LeMobile.this.mVideoWidth && VideoViewH264LeMobile.this.mSurfaceHeight == VideoViewH264LeMobile.this.mVideoHeight) {
                        if (VideoViewH264LeMobile.this.mTargetState == 3) {
                            VideoViewH264LeMobile.this.start();
                            if (VideoViewH264LeMobile.this.mMediaController != null) {
                                VideoViewH264LeMobile.this.mMediaController.show();
                            }
                        } else if (!VideoViewH264LeMobile.this.isPlaying() && ((seekToPosition != 0 || VideoViewH264LeMobile.this.getCurrentPosition() > 0) && VideoViewH264LeMobile.this.mMediaController != null)) {
                            VideoViewH264LeMobile.this.mMediaController.show(0);
                        }
                    }
                } else if (VideoViewH264LeMobile.this.mTargetState == 3) {
                    VideoViewH264LeMobile.this.start();
                }
                if (VideoViewH264LeMobile.this.mOnPreparedListener != null) {
                    VideoViewH264LeMobile.this.mOnPreparedListener.onPrepared(mp);
                }
            }
        };
        this.mCompletionListener = new OnCompletionListener() {

            public void onCompletion(MediaPlayer mp) {
                LogTag.i("onCompletion()");
                VideoViewH264LeMobile.this.mCurrentState = 5;
                VideoViewH264LeMobile.this.StateChange(VideoViewH264LeMobile.this.mCurrentState);
                VideoViewH264LeMobile.this.mTargetState = 5;
                VideoViewH264LeMobile.this.mCurrentState = 6;
                VideoViewH264LeMobile.this.StateChange(VideoViewH264LeMobile.this.mCurrentState);
                if (VideoViewH264LeMobile.this.mMediaController != null) {
                    VideoViewH264LeMobile.this.mMediaController.hide();
                }
                if (VideoViewH264LeMobile.this.mOnCompletionListener != null) {
                    VideoViewH264LeMobile.this.mOnCompletionListener.onCompletion(mp);
                }
            }
        };
        this.mErrorListener = new OnErrorListener() {

            public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
                LogTag.i("onError(): framework_err=" + framework_err + ", impl_err=" + impl_err);
                VideoViewH264LeMobile.this.mCurrentState = -1;
                VideoViewH264LeMobile.this.StateChange(VideoViewH264LeMobile.this.mCurrentState);
                VideoViewH264LeMobile.this.mTargetState = -1;
                if (VideoViewH264LeMobile.this.mMediaController != null) {
                    VideoViewH264LeMobile.this.mMediaController.hide();
                }
                if (VideoViewH264LeMobile.this.mOnErrorListener != null) {
                    VideoViewH264LeMobile.this.mOnErrorListener.onError(mp, framework_err, impl_err);
                }
                String currentDate = Tools.getCurrentDate();
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + "VideoViewLeMobile(乐视手机videoview) error, framework_err=" + framework_err + ", impl_err=" + impl_err);
                if (VideoViewH264LeMobile.this.mOnMediaStateTimeListener != null) {
                    VideoViewH264LeMobile.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
                }
                return true;
            }
        };
        this.mBufferingUpdateListener = new OnBufferingUpdateListener() {

            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                VideoViewH264LeMobile.this.mCurrentBufferPercentage = percent;
                if (VideoViewH264LeMobile.this.mOnBufferingUpdateListener != null) {
                    VideoViewH264LeMobile.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
                }
            }
        };
        this.mSeekCompleteListener = new OnSeekCompleteListener() {

            public void onSeekComplete(MediaPlayer mp) {
                LogTag.i("onSeekComplete()");
                if (VideoViewH264LeMobile.this.mOnSeekCompleteListener != null) {
                    VideoViewH264LeMobile.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264LeMobile.this.mMediaPlayer);
                }
            }
        };
        this.mInfoListener = new OnInfoListener() {

            public boolean onInfo(MediaPlayer mp, int what, int extra) {
                if (VideoViewH264LeMobile.this.mOnInfoListener != null) {
                    VideoViewH264LeMobile.this.mOnInfoListener.onInfo(mp, what, extra);
                }
                return false;
            }
        };
        this.mSHCallback = new Callback() {

            public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
                LogTag.i("mSHCallback:surfaceChanged(), w=" + w + ", h=" + h);
                VideoViewH264LeMobile.this.mSurfaceWidth = w;
                VideoViewH264LeMobile.this.mSurfaceHeight = h;
                boolean isValidState;
                if (VideoViewH264LeMobile.this.mTargetState == 3) {
                    isValidState = true;
                } else {
                    isValidState = false;
                }
                boolean hasValidSize;
                if (VideoViewH264LeMobile.this.mVideoWidth == w && VideoViewH264LeMobile.this.mVideoHeight == h) {
                    hasValidSize = true;
                } else {
                    hasValidSize = false;
                }
                if (VideoViewH264LeMobile.this.mMediaPlayer != null && isValidState && hasValidSize) {
                    if (VideoViewH264LeMobile.this.mSeekWhenPrepared != 0) {
                        VideoViewH264LeMobile.this.seekTo(VideoViewH264LeMobile.this.mSeekWhenPrepared);
                    }
                    VideoViewH264LeMobile.this.start();
                    if (VideoViewH264LeMobile.this.mMediaController != null) {
                        VideoViewH264LeMobile.this.mMediaController.show();
                    }
                }
            }

            public void surfaceCreated(SurfaceHolder holder) {
                LogTag.i("mSHCallback:surfaceCreated()");
                VideoViewH264LeMobile.this.mSurfaceHolder = holder;
                VideoViewH264LeMobile.this.openVideo();
            }

            public void surfaceDestroyed(SurfaceHolder holder) {
                LogTag.i("mSHCallback:surfaceDestroyed()");
                VideoViewH264LeMobile.this.mSurfaceHolder = null;
                if (VideoViewH264LeMobile.this.mMediaController != null) {
                    VideoViewH264LeMobile.this.mMediaController.hide();
                }
                VideoViewH264LeMobile.this.lastSeekWhenDestoryed = VideoViewH264LeMobile.this.getCurrentPosition();
                VideoViewH264LeMobile.this.release(true);
            }
        };
        this.mContext = context;
        initVideoView();
    }

    public VideoViewH264LeMobile(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        this.mContext = context;
        initVideoView();
    }

    public VideoViewH264LeMobile(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.TAG = "VideoViewLeMobile";
        this.mCurrentState = 0;
        this.mTargetState = 0;
        this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.mSurfaceHolder = null;
        this.mMediaPlayer = null;
        this.mRatioType = -1;
        this.lastSeekWhenDestoryed = 0;
        this.enforcementWait = false;
        this.enforcementPause = false;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        this.mContext = context;
        initVideoView();
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
        int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
        if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
            switch(this.mRatioType) {
                case -1:
                    if (this.mVideoWidth * height <= this.mVideoHeight * width) {
                        if (this.mVideoWidth * height < this.mVideoHeight * width) {
                            width = (this.mVideoWidth * height) / this.mVideoHeight;
                            break;
                        }
                    }
                    height = (this.mVideoHeight * width) / this.mVideoWidth;
                    break;
                    break;
                case 1:
                    if (height * 4 <= width * 3) {
                        if (height * 4 < width * 3) {
                            width = (height * 4) / 3;
                            break;
                        }
                    }
                    height = (width * 3) / 4;
                    break;
                    break;
                case 2:
                    if (height * 16 <= width * 9) {
                        if (height * 16 < width * 9) {
                            width = (height * 16) / 9;
                            break;
                        }
                    }
                    height = (width * 9) / 16;
                    break;
                    break;
            }
        }
        setMeasuredDimension(width, height);
    }

    public void adjust(int type) {
        this.mRatioType = type;
        invalateScreenSize();
    }

    private void invalateScreenSize() {
        setLayoutParams((LayoutParams) getLayoutParams());
    }

    public int resolveAdjustedSize(int desiredSize, int measureSpec) {
        int result = desiredSize;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        switch(specMode) {
            case Integer.MIN_VALUE:
                return Math.min(desiredSize, specSize);
            case 0:
                return desiredSize;
            case 1073741824:
                return specSize;
            default:
                return result;
        }
    }

    private void initVideoView() {
        this.mVideoWidth = 0;
        this.mVideoHeight = 0;
        getHolder().addCallback(this.mSHCallback);
        getHolder().setType(3);
        setFocusable(true);
        setFocusableInTouchMode(true);
        requestFocus();
        this.mCurrentState = 0;
        StateChange(this.mCurrentState);
        this.mTargetState = 0;
    }

    public void setVideoPath(String path) {
        this.mPlayerUrl = new PlayUrl();
        this.mPlayerUrl.setVid(-1);
        this.mPlayerUrl.setUrl(path);
        this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
        setVideoURI(Uri.parse(path));
    }

    public void setVideoPath(String path, Map<String, String> map) {
    }

    public void setVideoURI(Uri uri) {
        String currentDate = Tools.getCurrentDate();
        LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264LeMobile(乐视手机videoview)  setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
        if (this.mOnMediaStateTimeListener != null) {
            this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
        }
        this.mUri = uri;
        this.mSeekWhenPrepared = 0;
        openVideo();
        requestLayout();
        invalidate();
        LogTag.i("setVideoURI(), url=" + (uri != null ? uri.toString() : "null"));
    }

    private void openVideo() {
        if (this.mUri == null || this.mSurfaceHolder == null) {
            setVisibility(0);
            return;
        }
        Intent i = new Intent("com.android.music.musicservicecommand");
        i.putExtra("command", "pause");
        this.mContext.sendBroadcast(i);
        release(false);
        try {
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264LeMobile(乐视手机videoview)  创建MediaPlayer对象");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
            }
            this.mMediaPlayer = new MediaPlayer();
            this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
            this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
            this.mDuration = -1;
            this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
            this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
            this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
            this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
            this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
            this.mCurrentBufferPercentage = 0;
            this.mMediaPlayer.setDataSource(this.mContext, this.mUri);
            this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
            this.mMediaPlayer.setAudioStreamType(3);
            this.mMediaPlayer.setScreenOnWhilePlaying(true);
            this.mMediaPlayer.prepareAsync();
            this.mCurrentState = 1;
            StateChange(this.mCurrentState);
            attachMediaController();
        } catch (IOException ex) {
            LogTag.i("Unable to open content: " + this.mUri + " ,IOException=" + ex);
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        } catch (IllegalArgumentException ex2) {
            LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex2);
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        }
    }

    public void setMediaController(MediaController controller) {
        if (this.mMediaController != null) {
            this.mMediaController.hide();
        }
        this.mMediaController = controller;
        attachMediaController();
    }

    private void attachMediaController() {
        if (this.mMediaPlayer != null && this.mMediaController != null) {
            View anchorView;
            this.mMediaController.setMediaPlayer(this);
            if (getParent() instanceof View) {
                anchorView = (View) getParent();
            } else {
                anchorView = this;
            }
            this.mMediaController.setAnchorView(anchorView);
            this.mMediaController.setEnabled(isInPlaybackState());
        }
    }

    private void release(boolean cleartargetstate) {
        if (this.mMediaPlayer != null) {
            this.mMediaPlayer.reset();
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewH264LeMobile release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            if (cleartargetstate) {
                this.mTargetState = 0;
            }
        }
    }

    public boolean onTouchEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onTrackballEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        boolean isKeyCodeSupported;
        if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
            isKeyCodeSupported = false;
        } else {
            isKeyCodeSupported = true;
        }
        if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
            if (keyCode == 79 || keyCode == 85) {
                if (this.mMediaPlayer.isPlaying()) {
                    pause();
                    this.mMediaController.show();
                    return true;
                }
                start();
                this.mMediaController.hide();
                return true;
            } else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
                pause();
                this.mMediaController.show();
            } else {
                toggleMediaControlsVisiblity();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    public int getLastSeekWhenDestoryed() {
        return this.lastSeekWhenDestoryed;
    }

    private void toggleMediaControlsVisiblity() {
        if (this.mMediaController.isShowing()) {
            this.mMediaController.hide();
        } else {
            this.mMediaController.show();
        }
    }

    public void start() {
        HttpRequestManager.getInstance(this.mContext).requestCapability();
        if (this.enforcementWait || this.enforcementPause) {
            StateChange(7);
        } else if (isInPlaybackState()) {
            LogTag.i("start()");
            this.mMediaPlayer.start();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + "VideoViewH264LeMobile start()");
            this.mCurrentState = 3;
            StateChange(this.mCurrentState);
        }
        this.mTargetState = 3;
    }

    public void pause() {
        if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
            LogTag.i("pause()");
            this.mMediaPlayer.pause();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + "VideoViewH264LeMobile pause()");
            this.mCurrentState = 4;
            StateChange(this.mCurrentState);
        }
        this.mTargetState = 4;
    }

    public int getDuration() {
        if (!isInPlaybackState()) {
            this.mDuration = -1;
            LogTag.i("getDuration()=" + this.mDuration);
            return this.mDuration;
        } else if (this.mDuration > 0) {
            return this.mDuration;
        } else {
            this.mDuration = this.mMediaPlayer.getDuration();
            LogTag.i("getDuration()=" + this.mDuration);
            return this.mDuration;
        }
    }

    public int getCurrentPosition() {
        if (isInPlaybackState()) {
            return this.mMediaPlayer.getCurrentPosition();
        }
        return 0;
    }

    public void seekTo(int msec) {
        if (isInPlaybackState()) {
            this.mMediaPlayer.seekTo(msec);
            this.mSeekWhenPrepared = 0;
            this.lastSeekWhenDestoryed = 0;
            return;
        }
        this.mSeekWhenPrepared = msec;
        this.lastSeekWhenDestoryed = 0;
    }

    public void forward() {
        seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
    }

    public void rewind() {
        seekTo(getCurrentPosition() - 15000);
    }

    public boolean isPlaying() {
        return isInPlaybackState() && this.mMediaPlayer.isPlaying();
    }

    public boolean isPaused() {
        return this.mCurrentState == 4;
    }

    public boolean isInPlaybackState() {
        return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
    }

    public int getBufferPercentage() {
        if (this.mMediaPlayer != null) {
            return this.mCurrentBufferPercentage;
        }
        return 0;
    }

    public boolean canPause() {
        return this.mCanPause;
    }

    public boolean canSeekBackward() {
        return this.mCanSeekBack;
    }

    public boolean canSeekForward() {
        return this.mCanSeekForward;
    }

    public boolean isEnforcementWait() {
        return this.enforcementWait;
    }

    public void setEnforcementWait(boolean enforcementWait) {
        this.enforcementWait = enforcementWait;
    }

    public boolean isEnforcementPause() {
        return this.enforcementPause;
    }

    public void setEnforcementPause(boolean enforcementPause) {
        this.enforcementPause = enforcementPause;
    }

    public void stopPlayback() {
        LogTag.i("stopPlayback()");
        StateChange(6);
        if (this.mMediaPlayer != null) {
            String currentDateStop = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateStop + "VideoViewH264LeMobile stop()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
            }
            this.mMediaPlayer.stop();
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewH264LeMobile release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            this.mTargetState = 0;
            setVisibility(4);
        }
    }

    public View getView() {
        return this;
    }

    private void StateChange(int mCurrentState) {
        LogTag.i("StateChange(), mCurrentState=" + mCurrentState);
        if (this.mOnVideoViewStateChangeListener != null) {
            this.mOnVideoViewStateChangeListener.onChange(mCurrentState);
        }
    }

    public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener videoViewListener) {
        this.mOnVideoViewStateChangeListener = videoViewListener;
    }

    public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
        this.mOnBufferingUpdateListener = l;
    }

    public void setOnCompletionListener(OnCompletionListener l) {
        this.mOnCompletionListener = l;
    }

    public void setOnErrorListener(OnErrorListener l) {
        this.mOnErrorListener = l;
    }

    public void setOnInfoListener(OnInfoListener l) {
        this.mOnInfoListener = l;
    }

    public void setOnPreparedListener(OnPreparedListener l) {
        this.mOnPreparedListener = l;
    }

    public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
        this.mOnSeekCompleteListener = l;
    }

    public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
        this.mOnVideoSizeChangedListener = l;
    }

    public void setVideoPlayUrl(PlayUrl url) {
        this.mPlayerUrl = url;
        setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
    }

    public void setOnAdNumberListener(OnAdNumberListener l) {
    }

    public void setCacheSize(int video_size, int audio_size, int picutureSize, int startpic_size) {
    }

    public void setOnBlockListener(OnBlockListener l) {
    }

    public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
        this.mOnMediaStateTimeListener = l;
    }

    public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
    }

    public int getAudioSessionId() {
        return 0;
    }

    public void setOnCacheListener(OnCacheListener l) {
    }

    public void setOnFirstPlayListener(OnFirstPlayLitener l) {
    }

    public int setSourceType(int sourceType) {
        return 0;
    }

    public int setMachineInfomation(float ScreenResolution) {
        return 0;
    }

    public int setOneFingertouchInfomation(float begin_x, float begin_y, float end_x, float end_y) {
        return 0;
    }

    public int setTwoFingertouchInfomation(float begin_x0, float begin_y0, float begin_x1, float begin_y1, float end_x0, float end_y0, float end_x1, float end_y1) {
        return 0;
    }

    public int setgravity_yroInfomation(float gravity_yro_x, float gravity_yro_y, float gravity_yro_z) {
        return 0;
    }

    public int setGravityInfomation(float gravity_x, float gravity_y, float gravity_z) {
        return 0;
    }

    public int setgravity_yroValidInfomation(boolean gravityValid) {
        return 0;
    }

    public int setAngleInit() {
        return 0;
    }

    public int setTwoFingerZoom(float zoom) {
        return 0;
    }

    public void setInitPosition(int msec) {
    }

    public void setVolume(int volume) {
    }

    public void setCacheTime(double start_cache, double block_cache) {
    }

    public void processSensorEvent(SensorEvent sensorEvent) {
    }
}

16 Source : VideoViewH264mp4_4D.java
with Apache License 2.0
from JackChan1999

public clreplaced VideoViewH264mp4_4D extends SurfaceView implements LetvMediaPlayerControl4D {

    public static final int DEFAULT = 0;

    private static int FIRST_SYNC_UPDATE_TIME_MS = 200;

    private static int HAPTICS_RESYNC_INTERVAL_MS = LeMessageIds.MSG_FLOAT_BALL_REQUEST_DATA;

    public static final int HAPTIC_ERROR = -1;

    public static final int HAPTIC_INITIALIZED = 1;

    public static final int HAPTIC_UNINITIALIZED = 0;

    private static final String INACCESSIBLE_URL = "INACCESSIBLE_URL";

    private static int INITIAL_RESYNC_INTERVAL_MS = 100;

    private static final String INVALID = "INVALID";

    private static final String MALFORMED_URL = "MALFORMED_URL";

    private static int MEDIA_PREPARE_INTERVAL_MS = 20;

    public static final int MUTED = 1;

    public static final int PAUSED = 2;

    public static final int PAUSED_BUFFERRING_FINISHED = 4;

    public static final int PAUSED_DUE_TO_BUFFERING = 3;

    private static final String PERMISSION_DENIED = "PERMISSION_DENIED";

    public static final int PLAYING = 1;

    private static int PLAY_PAUSE_FADEOUT_TIME_MS = 2000;

    private static int SEEKBAR_UPDATE_DURATION_MS = 200;

    public static final int STATE_ENFORCEMENT = 7;

    public static final int STATE_ERROR = -1;

    public static final int STATE_IDLE = 0;

    public static final int STATE_PAUSED = 4;

    public static final int STATE_PLAYBACK_COMPLETED = 5;

    public static final int STATE_PLAYING = 3;

    public static final int STATE_PREPARED = 2;

    public static final int STATE_PREPARING = 1;

    public static final int STATE_STOPBACK = 6;

    public static final int STOPPED = 0;

    private static final String SUCCESS = "SUCCESS";

    public static final int UNINITIALIZED = -1;

    private static final String UNSUPPORTED_PROTOCOL = "UNSUPPORTED_PROTOCOL";

    private final int FORWARD_TIME;

    private final int REWIND_TIME;

    private String TAG;

    private Runnable changeResyncInterval;

    private boolean downloadHapt;

    private boolean enforcementPause;

    private boolean enforcementWait;

    private String hapt;

    protected int lastSeekWhenDestoryed;

    private OnBufferingUpdateListener mBufferingUpdateListener;

    private boolean mCanPause;

    private boolean mCanSeekBack;

    private boolean mCanSeekForward;

    private OnCompletionListener mCompletionListener;

    private Context mContext;

    private int mCurrentBufferPercentage;

    private int mCurrentState;

    private int mDuration;

    private OnErrorListener mErrorListener;

    private HashMap<Integer, String> mErrorValues;

    private String mHaptFileName;

    private int mHapticState;

    private HapticContentSDK mHaptics;

    private OnInfoListener mInfoListener;

    private boolean mIsMediaBuffering;

    private boolean mIsMediaPreparing;

    private boolean mIsSeeked;

    private MediaController mMediaController;

    private Handler mMediaControlsHandler;

    private boolean mMediaLoaded;

    private MediaPlayer mMediaPlayer;

    private int mMediaState;

    private OnBufferingUpdateListener mOnBufferingUpdateListener;

    private OnCompletionListener mOnCompletionListener;

    private OnErrorListener mOnErrorListener;

    private OnInfoListener mOnInfoListener;

    private OnMediaStateTimeListener mOnMediaStateTimeListener;

    private OnPreparedListener mOnPreparedListener;

    private OnSeekCompleteListener mOnSeekCompleteListener;

    private OnVideoSizeChangedListener mOnVideoSizeChangedListener;

    private OnVideoViewStateChangeListener mOnVideoViewStateChangeListener;

    private String mPreplacedsword;

    private PlayUrl mPlayerUrl;

    OnPreparedListener mPreparedListener;

    private int mRatioType;

    private int mResyncInterval;

    Callback mSHCallback;

    private int mSavedPos;

    private OnSeekCompleteListener mSeekCompleteListener;

    private int mSeekToPosition;

    private int mSeekWhenPrepared;

    OnVideoSizeChangedListener mSizeChangedListener;

    private int mSurfaceHeight;

    private SurfaceHolder mSurfaceHolder;

    private int mSurfaceWidth;

    private int mTargetState;

    private Uri mUri;

    private String mUserName;

    private int mVideoHeight;

    private int mVideoWidth;

    private int mVolumeState;

    private Runnable resyncHaptics;

    private long time;

    private clreplaced MediaPreparer implements Runnable {

        private boolean mIsPrepared;

        private int mProgress;

        public MediaPreparer(boolean prepared, int progress) {
            this.mIsPrepared = prepared;
            this.mProgress = progress;
            VideoViewH264mp4_4D.this.mIsMediaPreparing = true;
        }

        public void run() {
            int curProgress = VideoViewH264mp4_4D.this.getCurrentPosition();
            int delta = curProgress - this.mProgress;
            if (VideoViewH264mp4_4D.this.mMediaState == 3) {
                if (VideoViewH264mp4_4D.this.isHapticUsable()) {
                    VideoViewH264mp4_4D.this.mHaptics.pause();
                }
            } else if ((this.mIsPrepared || delta != 0) && !(this.mIsPrepared && delta == 0)) {
                int returnVal;
                if (this.mIsPrepared) {
                    if (VideoViewH264mp4_4D.this.isHapticUsable()) {
                        if (VideoViewH264mp4_4D.this.mMediaState != 0) {
                            returnVal = VideoViewH264mp4_4D.this.mHaptics.seek(curProgress);
                            if (returnVal != 0) {
                                Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics seek failed with value: " + ((String) VideoViewH264mp4_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264mp4_4D.this.mHaptics.getSDKStatus());
                            }
                        }
                        System.out.println("test prepare:resume");
                        returnVal = VideoViewH264mp4_4D.this.mHaptics.resume();
                        if (returnVal != 0) {
                            Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics resume failed with value: " + ((String) VideoViewH264mp4_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264mp4_4D.this.mHaptics.getSDKStatus());
                        }
                    } else {
                        Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics was not initialized yet.");
                    }
                    VideoViewH264mp4_4D.this.post(VideoViewH264mp4_4D.this.resyncHaptics);
                    VideoViewH264mp4_4D.this.post(VideoViewH264mp4_4D.this.changeResyncInterval);
                    VideoViewH264mp4_4D.this.mMediaState = 1;
                } else {
                    if (!VideoViewH264mp4_4D.this.isHapticUsable()) {
                        Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics was not initialized yet.");
                    } else if (VideoViewH264mp4_4D.this.mMediaLoaded) {
                        returnVal = VideoViewH264mp4_4D.this.mHaptics.play();
                        if (returnVal != 0) {
                            Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics play failed with value: " + ((String) VideoViewH264mp4_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264mp4_4D.this.mHaptics.getSDKStatus());
                        }
                    } else {
                        System.out.println("test mediaprepare else: resume");
                        returnVal = VideoViewH264mp4_4D.this.mHaptics.resume();
                        if (returnVal != 0) {
                            Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics resume failed with value: " + ((String) VideoViewH264mp4_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264mp4_4D.this.mHaptics.getSDKStatus());
                        }
                        VideoViewH264mp4_4D.this.post(VideoViewH264mp4_4D.this.resyncHaptics);
                        VideoViewH264mp4_4D.this.post(VideoViewH264mp4_4D.this.changeResyncInterval);
                    }
                    VideoViewH264mp4_4D.this.mMediaState = 1;
                }
                VideoViewH264mp4_4D.this.mIsSeeked = false;
                VideoViewH264mp4_4D.this.mIsMediaPreparing = false;
            } else {
                VideoViewH264mp4_4D.this.mMediaControlsHandler.postDelayed(this, (long) VideoViewH264mp4_4D.MEDIA_PREPARE_INTERVAL_MS);
            }
        }
    }

    public VideoViewH264mp4_4D(Context context) {
        super(context);
        this.TAG = "VideoViewH264mp4";
        this.mCurrentState = 0;
        this.mTargetState = 0;
        this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.mSurfaceHolder = null;
        this.mMediaPlayer = null;
        this.mRatioType = -1;
        this.lastSeekWhenDestoryed = 0;
        this.enforcementWait = false;
        this.enforcementPause = false;
        this.mUserName = "0f3b69678cce96c0ee8f6c57e31e1273aa0f280ad5519464f52ef3b874a16b6f";
        this.mPreplacedsword = "immr@letv23";
        this.mHaptFileName = "expendables_3_hapt.hapt";
        this.mIsMediaPreparing = false;
        this.mIsMediaBuffering = false;
        this.time = 0;
        this.mIsSeeked = false;
        this.mMediaLoaded = true;
        this.mResyncInterval = INITIAL_RESYNC_INTERVAL_MS;
        this.downloadHapt = true;
        this.mSizeChangedListener = new OnVideoSizeChangedListener() {

            public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
                LogTag.i("onVideoSizeChanged(), width=" + width + ", heigth=" + height);
                VideoViewH264mp4_4D.this.mVideoWidth = mp.getVideoWidth();
                VideoViewH264mp4_4D.this.mVideoHeight = mp.getVideoHeight();
                if (!(VideoViewH264mp4_4D.this.mVideoWidth == 0 || VideoViewH264mp4_4D.this.mVideoHeight == 0)) {
                    VideoViewH264mp4_4D.this.getHolder().setFixedSize(VideoViewH264mp4_4D.this.mVideoWidth, VideoViewH264mp4_4D.this.mVideoHeight);
                }
                if (VideoViewH264mp4_4D.this.mOnVideoSizeChangedListener != null) {
                    VideoViewH264mp4_4D.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, width, height);
                }
            }
        };
        this.mPreparedListener = new OnPreparedListener() {

            public void onPrepared(MediaPlayer mp) {
                LogTag.i("onPrepared()");
                String currentDate = Tools.getCurrentDate();
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264mp4(普通手机videoview)  onPrepared()");
                if (VideoViewH264mp4_4D.this.mOnMediaStateTimeListener != null) {
                    VideoViewH264mp4_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
                }
                VideoViewH264mp4_4D.this.mCurrentState = 2;
                VideoViewH264mp4_4D.this.StateChange(VideoViewH264mp4_4D.this.mCurrentState);
                VideoViewH264mp4_4D videoViewH264mp4_4D = VideoViewH264mp4_4D.this;
                VideoViewH264mp4_4D videoViewH264mp4_4D2 = VideoViewH264mp4_4D.this;
                VideoViewH264mp4_4D.this.mCanSeekForward = true;
                videoViewH264mp4_4D2.mCanSeekBack = true;
                videoViewH264mp4_4D.mCanPause = true;
                if (VideoViewH264mp4_4D.this.mMediaController != null) {
                    VideoViewH264mp4_4D.this.mMediaController.setEnabled(true);
                }
                VideoViewH264mp4_4D.this.mVideoWidth = mp.getVideoWidth();
                VideoViewH264mp4_4D.this.mVideoHeight = mp.getVideoHeight();
                int seekToPosition = VideoViewH264mp4_4D.this.mSeekWhenPrepared;
                if (seekToPosition != 0) {
                    VideoViewH264mp4_4D.this.seekTo(seekToPosition);
                }
                if (VideoViewH264mp4_4D.this.mVideoWidth != 0 && VideoViewH264mp4_4D.this.mVideoHeight != 0) {
                    VideoViewH264mp4_4D.this.getHolder().setFixedSize(VideoViewH264mp4_4D.this.mVideoWidth, VideoViewH264mp4_4D.this.mVideoHeight);
                    if (VideoViewH264mp4_4D.this.mSurfaceWidth == VideoViewH264mp4_4D.this.mVideoWidth && VideoViewH264mp4_4D.this.mSurfaceHeight == VideoViewH264mp4_4D.this.mVideoHeight) {
                        if (VideoViewH264mp4_4D.this.mTargetState == 3) {
                            VideoViewH264mp4_4D.this.start();
                            if (VideoViewH264mp4_4D.this.mMediaController != null) {
                                VideoViewH264mp4_4D.this.mMediaController.show();
                            }
                        } else if (!VideoViewH264mp4_4D.this.isPlaying() && ((seekToPosition != 0 || VideoViewH264mp4_4D.this.getCurrentPosition() > 0) && VideoViewH264mp4_4D.this.mMediaController != null)) {
                            VideoViewH264mp4_4D.this.mMediaController.show(0);
                        }
                    }
                } else if (VideoViewH264mp4_4D.this.mTargetState == 3) {
                    VideoViewH264mp4_4D.this.start();
                }
                if (VideoViewH264mp4_4D.this.mOnPreparedListener != null) {
                    VideoViewH264mp4_4D.this.mOnPreparedListener.onPrepared(mp);
                }
                VideoViewH264mp4_4D.this.palyer4dContrlHandle(seekToPosition);
            }
        };
        this.mCompletionListener = new OnCompletionListener() {

            public void onCompletion(MediaPlayer mp) {
                LogTag.i("onCompletion()");
                VideoViewH264mp4_4D.this.mCurrentState = 5;
                VideoViewH264mp4_4D.this.StateChange(VideoViewH264mp4_4D.this.mCurrentState);
                VideoViewH264mp4_4D.this.mTargetState = 5;
                VideoViewH264mp4_4D.this.mCurrentState = 6;
                VideoViewH264mp4_4D.this.StateChange(VideoViewH264mp4_4D.this.mCurrentState);
                if (VideoViewH264mp4_4D.this.mMediaController != null) {
                    VideoViewH264mp4_4D.this.mMediaController.hide();
                }
                if (VideoViewH264mp4_4D.this.mOnCompletionListener != null) {
                    VideoViewH264mp4_4D.this.mOnCompletionListener.onCompletion(mp);
                }
            }
        };
        this.mErrorListener = new OnErrorListener() {

            public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
                LogTag.i("onError(): framework_err=" + framework_err + ", impl_err=" + impl_err);
                VideoViewH264mp4_4D.this.mCurrentState = -1;
                VideoViewH264mp4_4D.this.StateChange(VideoViewH264mp4_4D.this.mCurrentState);
                VideoViewH264mp4_4D.this.mTargetState = -1;
                if (VideoViewH264mp4_4D.this.mMediaController != null) {
                    VideoViewH264mp4_4D.this.mMediaController.hide();
                }
                if (VideoViewH264mp4_4D.this.mOnErrorListener != null) {
                    VideoViewH264mp4_4D.this.mOnErrorListener.onError(mp, framework_err, impl_err);
                }
                String currentDate = Tools.getCurrentDate();
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + "VideoViewH264mp4(普通手机videoview) 播放出错error, framework_err=" + framework_err + ", impl_err=" + impl_err);
                if (VideoViewH264mp4_4D.this.mOnMediaStateTimeListener != null) {
                    VideoViewH264mp4_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
                }
                return true;
            }
        };
        this.mBufferingUpdateListener = new OnBufferingUpdateListener() {

            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                VideoViewH264mp4_4D.this.mCurrentBufferPercentage = percent;
                if (VideoViewH264mp4_4D.this.mOnBufferingUpdateListener != null) {
                    VideoViewH264mp4_4D.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
                }
            }
        };
        this.mSeekCompleteListener = new OnSeekCompleteListener() {

            public void onSeekComplete(MediaPlayer mp) {
                LogTag.i("onSeekComplete()");
                if (VideoViewH264mp4_4D.this.mOnSeekCompleteListener != null) {
                    VideoViewH264mp4_4D.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264mp4_4D.this.mMediaPlayer);
                }
            }
        };
        this.mInfoListener = new OnInfoListener() {

            public boolean onInfo(MediaPlayer mp, int what, int extra) {
                if (VideoViewH264mp4_4D.this.mOnInfoListener != null) {
                    VideoViewH264mp4_4D.this.mOnInfoListener.onInfo(mp, what, extra);
                }
                return false;
            }
        };
        this.mSHCallback = new Callback() {

            public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
                LogTag.i("mSHCallback:surfaceChanged(), w=" + w + ", h=" + h);
                VideoViewH264mp4_4D.this.mSurfaceWidth = w;
                VideoViewH264mp4_4D.this.mSurfaceHeight = h;
                boolean isValidState;
                if (VideoViewH264mp4_4D.this.mTargetState == 3) {
                    isValidState = true;
                } else {
                    isValidState = false;
                }
                boolean hasValidSize;
                if (VideoViewH264mp4_4D.this.mVideoWidth == w && VideoViewH264mp4_4D.this.mVideoHeight == h) {
                    hasValidSize = true;
                } else {
                    hasValidSize = false;
                }
                if (VideoViewH264mp4_4D.this.mMediaPlayer != null && isValidState && hasValidSize) {
                    if (VideoViewH264mp4_4D.this.mSeekWhenPrepared != 0) {
                        VideoViewH264mp4_4D.this.seekTo(VideoViewH264mp4_4D.this.mSeekWhenPrepared);
                    }
                    VideoViewH264mp4_4D.this.start();
                    if (VideoViewH264mp4_4D.this.mMediaController != null) {
                        VideoViewH264mp4_4D.this.mMediaController.show();
                    }
                }
            }

            public void surfaceCreated(SurfaceHolder holder) {
                LogTag.i("mSHCallback:surfaceCreated()");
                VideoViewH264mp4_4D.this.mSurfaceHolder = holder;
                VideoViewH264mp4_4D.this.openVideo();
            }

            public void surfaceDestroyed(SurfaceHolder holder) {
                LogTag.i("mSHCallback:surfaceDestroyed()");
                VideoViewH264mp4_4D.this.mSurfaceHolder = null;
                if (VideoViewH264mp4_4D.this.mMediaController != null) {
                    VideoViewH264mp4_4D.this.mMediaController.hide();
                }
                VideoViewH264mp4_4D.this.lastSeekWhenDestoryed = VideoViewH264mp4_4D.this.getCurrentPosition();
                VideoViewH264mp4_4D.this.release(true);
            }
        };
        this.resyncHaptics = new Runnable() {

            private int lastPos = 0;

            private boolean stalled = false;

            public synchronized void run() {
                int currPos = VideoViewH264mp4_4D.this.getCurrentPosition();
                if (currPos == this.lastPos || currPos == VideoViewH264mp4_4D.this.mSeekToPosition) {
                    System.out.print("test: haptic sync pausing, currPos=" + currPos + "\n");
                    VideoViewH264mp4_4D.this.mHaptics.pause();
                    this.stalled = true;
                } else if (this.stalled) {
                    System.out.print("test: haptics sync resuming, currPos=" + currPos + "\n");
                    VideoViewH264mp4_4D.this.mHaptics.resume();
                    this.stalled = false;
                }
                this.lastPos = currPos;
                if (VideoViewH264mp4_4D.this.isHapticUsable()) {
                    int returnVal = VideoViewH264mp4_4D.this.mHaptics.update((long) currPos);
                    if (returnVal != 0) {
                        Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics update failed with value: " + ((String) VideoViewH264mp4_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264mp4_4D.this.mHaptics.getSDKStatus());
                    }
                }
                if (VideoViewH264mp4_4D.this.isPlaying()) {
                    VideoViewH264mp4_4D.this.getHandler().removeCallbacks(VideoViewH264mp4_4D.this.resyncHaptics);
                    VideoViewH264mp4_4D.this.postDelayed(VideoViewH264mp4_4D.this.resyncHaptics, (long) VideoViewH264mp4_4D.this.mResyncInterval);
                } else {
                    this.stalled = false;
                }
            }
        };
        this.changeResyncInterval = new Runnable() {

            public void run() {
                if (VideoViewH264mp4_4D.this.getCurrentPosition() > VideoViewH264mp4_4D.FIRST_SYNC_UPDATE_TIME_MS) {
                    VideoViewH264mp4_4D.this.mResyncInterval = VideoViewH264mp4_4D.HAPTICS_RESYNC_INTERVAL_MS;
                } else {
                    VideoViewH264mp4_4D.this.postDelayed(VideoViewH264mp4_4D.this.changeResyncInterval, (long) VideoViewH264mp4_4D.INITIAL_RESYNC_INTERVAL_MS);
                }
            }
        };
        this.mContext = context;
        initVideoView();
    }

    public VideoViewH264mp4_4D(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        this.mContext = context;
        initVideoView();
    }

    public VideoViewH264mp4_4D(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.TAG = "VideoViewH264mp4";
        this.mCurrentState = 0;
        this.mTargetState = 0;
        this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.mSurfaceHolder = null;
        this.mMediaPlayer = null;
        this.mRatioType = -1;
        this.lastSeekWhenDestoryed = 0;
        this.enforcementWait = false;
        this.enforcementPause = false;
        this.mUserName = "0f3b69678cce96c0ee8f6c57e31e1273aa0f280ad5519464f52ef3b874a16b6f";
        this.mPreplacedsword = "immr@letv23";
        this.mHaptFileName = "expendables_3_hapt.hapt";
        this.mIsMediaPreparing = false;
        this.mIsMediaBuffering = false;
        this.time = 0;
        this.mIsSeeked = false;
        this.mMediaLoaded = true;
        this.mResyncInterval = INITIAL_RESYNC_INTERVAL_MS;
        this.downloadHapt = true;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        this.mContext = context;
        initVideoView();
    }

    public void setHaptUrl(String url) {
        this.hapt = url;
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
        int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
        if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
            switch(this.mRatioType) {
                case -1:
                    if (this.mVideoWidth * height <= this.mVideoHeight * width) {
                        if (this.mVideoWidth * height < this.mVideoHeight * width) {
                            width = (this.mVideoWidth * height) / this.mVideoHeight;
                            break;
                        }
                    }
                    height = (this.mVideoHeight * width) / this.mVideoWidth;
                    break;
                    break;
                case 1:
                    if (height * 4 <= width * 3) {
                        if (height * 4 < width * 3) {
                            width = (height * 4) / 3;
                            break;
                        }
                    }
                    height = (width * 3) / 4;
                    break;
                    break;
                case 2:
                    if (height * 16 <= width * 9) {
                        if (height * 16 < width * 9) {
                            width = (height * 16) / 9;
                            break;
                        }
                    }
                    height = (width * 9) / 16;
                    break;
                    break;
            }
        }
        setMeasuredDimension(width, height);
    }

    public void adjust(int type) {
        this.mRatioType = type;
        invalateScreenSize();
    }

    private void invalateScreenSize() {
        setLayoutParams((LayoutParams) getLayoutParams());
    }

    public int resolveAdjustedSize(int desiredSize, int measureSpec) {
        int result = desiredSize;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        switch(specMode) {
            case Integer.MIN_VALUE:
                return Math.min(desiredSize, specSize);
            case 0:
                return desiredSize;
            case 1073741824:
                return specSize;
            default:
                return result;
        }
    }

    private void initVideoView() {
        this.mVideoWidth = 0;
        this.mVideoHeight = 0;
        getHolder().addCallback(this.mSHCallback);
        getHolder().setType(3);
        setFocusable(true);
        setFocusableInTouchMode(true);
        requestFocus();
        this.mCurrentState = 0;
        StateChange(this.mCurrentState);
        this.mTargetState = 0;
    }

    public void setVideoPath(String path) {
        this.mPlayerUrl = new PlayUrl();
        this.mPlayerUrl.setVid(-1);
        this.mPlayerUrl.setUrl(path);
        this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
        setVideoURI(Uri.parse(path));
    }

    public void setVideoPath(String path, Map<String, String> map) {
    }

    public void setVideoURI(Uri uri) {
        String currentDate = Tools.getCurrentDate();
        LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264mp4(普通手机videoview)  setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
        if (this.mOnMediaStateTimeListener != null) {
            this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
        }
        this.mUri = uri;
        this.mSeekWhenPrepared = 0;
        openVideo();
        requestLayout();
        invalidate();
        LogTag.i("setVideoURI(), url=" + (uri != null ? uri.toString() : "null"));
    }

    private void openVideo() {
        if (this.mUri == null || this.mSurfaceHolder == null) {
            setVisibility(0);
            return;
        }
        Intent i = new Intent("com.android.music.musicservicecommand");
        i.putExtra("command", "pause");
        this.mContext.sendBroadcast(i);
        release(false);
        try {
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264mp4(普通手机videoview)  创建MediaPlayer对象");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
            }
            this.mMediaPlayer = new MediaPlayer();
            this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
            this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
            this.mDuration = -1;
            this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
            this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
            this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
            this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
            this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
            this.mCurrentBufferPercentage = 0;
            this.mMediaPlayer.setDataSource(this.mContext, this.mUri);
            this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
            this.mMediaPlayer.setAudioStreamType(3);
            this.mMediaPlayer.setScreenOnWhilePlaying(true);
            this.mMediaPlayer.prepareAsync();
            this.mCurrentState = 1;
            StateChange(this.mCurrentState);
            attachMediaController();
        } catch (IOException ex) {
            LogTag.i("Unable to open content: " + this.mUri + " ,IOException=" + ex);
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        } catch (IllegalArgumentException ex2) {
            LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex2);
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        }
    }

    public void setMediaController(MediaController controller) {
        if (this.mMediaController != null) {
            this.mMediaController.hide();
        }
        this.mMediaController = controller;
        attachMediaController();
    }

    private void attachMediaController() {
        if (this.mMediaPlayer != null && this.mMediaController != null) {
            View anchorView;
            this.mMediaController.setMediaPlayer(this);
            if (getParent() instanceof View) {
                anchorView = (View) getParent();
            } else {
                anchorView = this;
            }
            this.mMediaController.setAnchorView(anchorView);
            this.mMediaController.setEnabled(isInPlaybackState());
        }
    }

    private void release(boolean cleartargetstate) {
        if (this.mMediaPlayer != null) {
            this.mMediaPlayer.reset();
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewH264mp4 release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            int returnVal = this.mHaptics.stop();
            Log.e(this.TAG, "Haptic dispose " + this.mHaptics.getSDKStatus());
            this.mHaptics.dispose();
            if (returnVal != 0) {
                Log.e(this.TAG, "Haptics stop failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
            }
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            if (cleartargetstate) {
                this.mTargetState = 0;
            }
        }
    }

    public boolean onTouchEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onTrackballEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        boolean isKeyCodeSupported;
        if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
            isKeyCodeSupported = false;
        } else {
            isKeyCodeSupported = true;
        }
        if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
            if (keyCode == 79 || keyCode == 85) {
                if (this.mMediaPlayer.isPlaying()) {
                    pause();
                    this.mMediaController.show();
                    return true;
                }
                start();
                this.mMediaController.hide();
                return true;
            } else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
                pause();
                this.mMediaController.show();
            } else {
                toggleMediaControlsVisiblity();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    public int getLastSeekWhenDestoryed() {
        return this.lastSeekWhenDestoryed;
    }

    private void toggleMediaControlsVisiblity() {
        if (this.mMediaController.isShowing()) {
            this.mMediaController.hide();
        } else {
            this.mMediaController.show();
        }
    }

    public void start() {
        this.mMediaState = -1;
        this.mVolumeState = 0;
        if (this.mMediaControlsHandler == null) {
            this.mMediaControlsHandler = new Handler();
        }
        if (this.downloadHapt) {
            palyer4dInit();
            return;
        }
        if (!(this.enforcementWait || this.enforcementPause || !isInPlaybackState())) {
            this.mMediaPlayer.start();
            this.mCurrentState = 3;
            StateChange(this.mCurrentState);
            init4DMediaPreparer();
        }
        this.mTargetState = 3;
        StateChange(7);
    }

    public void pause() {
        if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
            LogTag.i("pause()");
            this.mMediaPlayer.pause();
            this.mCurrentState = 4;
            StateChange(this.mCurrentState);
        }
        this.mTargetState = 4;
    }

    public int getDuration() {
        if (!isInPlaybackState()) {
            this.mDuration = -1;
            LogTag.i("getDuration()=" + this.mDuration);
            return this.mDuration;
        } else if (this.mDuration > 0) {
            return this.mDuration;
        } else {
            this.mDuration = this.mMediaPlayer.getDuration();
            LogTag.i("getDuration()=" + this.mDuration);
            return this.mDuration;
        }
    }

    public int getCurrentPosition() {
        if (isInPlaybackState()) {
            return this.mMediaPlayer.getCurrentPosition();
        }
        return 0;
    }

    public void seekTo(int msec) {
        if (isInPlaybackState()) {
            this.mMediaPlayer.seekTo(msec);
            this.mSeekWhenPrepared = 0;
            this.lastSeekWhenDestoryed = 0;
            return;
        }
        this.mSeekWhenPrepared = msec;
        this.lastSeekWhenDestoryed = 0;
    }

    public void forward() {
        seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
    }

    public void rewind() {
        seekTo(getCurrentPosition() - 15000);
    }

    public boolean isPlaying() {
        return isInPlaybackState() && this.mMediaPlayer.isPlaying();
    }

    public boolean isPaused() {
        return this.mCurrentState == 4;
    }

    public boolean isInPlaybackState() {
        return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
    }

    public int getBufferPercentage() {
        if (this.mMediaPlayer != null) {
            return this.mCurrentBufferPercentage;
        }
        return 0;
    }

    public boolean canPause() {
        return this.mCanPause;
    }

    public boolean canSeekBackward() {
        return this.mCanSeekBack;
    }

    public boolean canSeekForward() {
        return this.mCanSeekForward;
    }

    public boolean isEnforcementWait() {
        return this.enforcementWait;
    }

    public void setEnforcementWait(boolean enforcementWait) {
        this.enforcementWait = enforcementWait;
    }

    public boolean isEnforcementPause() {
        return this.enforcementPause;
    }

    public void setEnforcementPause(boolean enforcementPause) {
        this.enforcementPause = enforcementPause;
    }

    public void stopPlayback() {
        LogTag.i("stopPlayback()");
        StateChange(6);
        if (this.mMediaPlayer != null) {
            String currentDateStop = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateStop + "VideoViewH264mp4 stop()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
            }
            this.mMediaPlayer.stop();
            int returnVal = this.mHaptics.stop();
            this.mHaptics.dispose();
            if (returnVal != 0) {
                Log.e(this.TAG, "Haptics stop failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
            }
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewH264mp4 release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            this.mTargetState = 0;
            setVisibility(4);
        }
    }

    public View getView() {
        return this;
    }

    private void StateChange(int mCurrentState) {
        LogTag.i("StateChange(), mCurrentState=" + mCurrentState);
        if (this.mOnVideoViewStateChangeListener != null) {
            this.mOnVideoViewStateChangeListener.onChange(mCurrentState);
        }
    }

    public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener videoViewListener) {
        this.mOnVideoViewStateChangeListener = videoViewListener;
    }

    public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
        this.mOnBufferingUpdateListener = l;
    }

    public void setOnCompletionListener(OnCompletionListener l) {
        this.mOnCompletionListener = l;
    }

    public void setOnErrorListener(OnErrorListener l) {
        this.mOnErrorListener = l;
    }

    public void setOnInfoListener(OnInfoListener l) {
        this.mOnInfoListener = l;
    }

    public void setOnPreparedListener(OnPreparedListener l) {
        this.mOnPreparedListener = l;
    }

    public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
        this.mOnSeekCompleteListener = l;
    }

    public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
        this.mOnVideoSizeChangedListener = l;
    }

    public void setVideoPlayUrl(PlayUrl url) {
        this.mPlayerUrl = url;
        setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
    }

    public void setOnAdNumberListener(OnAdNumberListener l) {
    }

    public void setCacheSize(int video_size, int audio_size, int picutureSize, int startpic_size) {
    }

    public void setOnBlockListener(OnBlockListener l) {
    }

    public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
        this.mOnMediaStateTimeListener = l;
    }

    public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
    }

    public void initHapticValues() {
        this.mErrorValues = new HashMap();
        this.mErrorValues.put(Integer.valueOf(0), SUCCESS);
        this.mErrorValues.put(Integer.valueOf(-1), INVALID);
        this.mErrorValues.put(Integer.valueOf(-2), INACCESSIBLE_URL);
        this.mErrorValues.put(Integer.valueOf(-3), PERMISSION_DENIED);
        this.mErrorValues.put(Integer.valueOf(-4), MALFORMED_URL);
        this.mErrorValues.put(Integer.valueOf(-5), UNSUPPORTED_PROTOCOL);
    }

    private boolean isHapticUsable() {
        return this.mHapticState == 1;
    }

    public void palyer4dInit() {
        this.mMediaState = -1;
        this.mVolumeState = 0;
        initHapticValues();
        this.mHaptics = HapticContentSDKFactory.GetNewSDKInstance(0, this.mContext, this.mUserName, this.mPreplacedsword, HapticContentSDK.DEFAULT_DNS);
        if (this.mHaptics == null) {
            Log.e(this.TAG, "Could not get new Haptic SDK Instance!");
            this.mHapticState = -1;
        } else {
            this.mHapticState = 0;
        }
        this.mSavedPos = 0;
        this.mMediaControlsHandler = new Handler();
        if (this.mHapticState == 0) {
            int returnVal = this.mHaptics.openHaptics(this.hapt);
            Log.e(this.TAG, "Haptics returnVal=" + returnVal);
            if (returnVal == 0) {
                this.mHapticState = 1;
                this.downloadHapt = false;
            } else {
                Log.e(this.TAG, "Haptics open failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
            }
        }
        if (!(this.enforcementWait || this.enforcementPause || !isInPlaybackState())) {
            this.mMediaPlayer.start();
            System.out.println("test is start");
            this.mCurrentState = 3;
            StateChange(this.mCurrentState);
            if (this.mMediaLoaded) {
                this.mMediaControlsHandler.post(new MediaPreparer(true, getCurrentPosition()));
            } else {
                this.mMediaControlsHandler.post(new MediaPreparer(false, getCurrentPosition()));
            }
        }
        this.mTargetState = 3;
        StateChange(7);
    }

    public void init4DMediaPreparer() {
        if (this.mMediaLoaded) {
            this.mMediaControlsHandler.post(new MediaPreparer(true, getCurrentPosition()));
        } else {
            this.mMediaControlsHandler.post(new MediaPreparer(false, getCurrentPosition()));
        }
    }

    public void palyer4dContrlHandle(int seekToPosition) {
        postDelayed(this.resyncHaptics, (long) INITIAL_RESYNC_INTERVAL_MS);
        postDelayed(this.changeResyncInterval, (long) INITIAL_RESYNC_INTERVAL_MS);
        this.mSavedPos = seekToPosition;
        if (this.mSavedPos == 0) {
            this.mMediaControlsHandler.post(new MediaPreparer(false, 0));
        } else {
            this.mMediaState = 2;
        }
    }

    public void setHapticMute(boolean disable) {
        int returnVal;
        if (disable) {
            if (isHapticUsable()) {
                returnVal = this.mHaptics.mute();
                if (returnVal == 0) {
                    this.mVolumeState = 1;
                } else {
                    Log.e(this.TAG, "Haptics mute failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
                }
            }
        } else if (isHapticUsable()) {
            returnVal = this.mHaptics.unmute();
            if (returnVal == 0) {
                this.mVolumeState = 0;
            } else {
                Log.e(this.TAG, "Haptics unmute failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
            }
        }
    }
}

16 Source : VideoViewH264LeMobile_4D.java
with Apache License 2.0
from JackChan1999

public clreplaced VideoViewH264LeMobile_4D extends SurfaceView implements LetvMediaPlayerControl4D {

    public static final int DEFAULT = 0;

    private static int FIRST_SYNC_UPDATE_TIME_MS = 200;

    private static int HAPTICS_RESYNC_INTERVAL_MS = LeMessageIds.MSG_FLOAT_BALL_REQUEST_DATA;

    public static final int HAPTIC_ERROR = -1;

    public static final int HAPTIC_INITIALIZED = 1;

    public static final int HAPTIC_UNINITIALIZED = 0;

    private static final String INACCESSIBLE_URL = "INACCESSIBLE_URL";

    private static int INITIAL_RESYNC_INTERVAL_MS = 100;

    private static final String INVALID = "INVALID";

    private static final String MALFORMED_URL = "MALFORMED_URL";

    private static int MEDIA_PREPARE_INTERVAL_MS = 20;

    public static final int MUTED = 1;

    public static final int PAUSED = 2;

    public static final int PAUSED_BUFFERRING_FINISHED = 4;

    public static final int PAUSED_DUE_TO_BUFFERING = 3;

    private static final String PERMISSION_DENIED = "PERMISSION_DENIED";

    public static final int PLAYING = 1;

    private static int PLAY_PAUSE_FADEOUT_TIME_MS = 2000;

    private static int SEEKBAR_UPDATE_DURATION_MS = 200;

    public static final int STATE_ENFORCEMENT = 7;

    public static final int STATE_ERROR = -1;

    public static final int STATE_IDLE = 0;

    public static final int STATE_PAUSED = 4;

    public static final int STATE_PLAYBACK_COMPLETED = 5;

    public static final int STATE_PLAYING = 3;

    public static final int STATE_PREPARED = 2;

    public static final int STATE_PREPARING = 1;

    public static final int STATE_STOPBACK = 6;

    public static final int STOPPED = 0;

    private static final String SUCCESS = "SUCCESS";

    public static final int UNINITIALIZED = -1;

    private static final String UNSUPPORTED_PROTOCOL = "UNSUPPORTED_PROTOCOL";

    private final int FORWARD_TIME;

    private final int REWIND_TIME;

    private String TAG;

    private Runnable changeResyncInterval;

    private boolean downloadHapt;

    private boolean enforcementPause;

    private boolean enforcementWait;

    private String hapt;

    protected int lastSeekWhenDestoryed;

    private OnBufferingUpdateListener mBufferingUpdateListener;

    private boolean mCanPause;

    private boolean mCanSeekBack;

    private boolean mCanSeekForward;

    private OnCompletionListener mCompletionListener;

    private Context mContext;

    private int mCurrentBufferPercentage;

    private int mCurrentState;

    private int mDuration;

    private OnErrorListener mErrorListener;

    private HashMap<Integer, String> mErrorValues;

    private String mHaptFileName;

    private int mHapticState;

    private HapticContentSDK mHaptics;

    private OnInfoListener mInfoListener;

    private boolean mIsMediaBuffering;

    private boolean mIsMediaPreparing;

    private boolean mIsSeeked;

    private MediaController mMediaController;

    private Handler mMediaControlsHandler;

    private boolean mMediaLoaded;

    private MediaPlayer mMediaPlayer;

    private int mMediaState;

    private OnBufferingUpdateListener mOnBufferingUpdateListener;

    private OnCompletionListener mOnCompletionListener;

    private OnErrorListener mOnErrorListener;

    private OnInfoListener mOnInfoListener;

    private OnMediaStateTimeListener mOnMediaStateTimeListener;

    private OnPreparedListener mOnPreparedListener;

    private OnSeekCompleteListener mOnSeekCompleteListener;

    private OnVideoSizeChangedListener mOnVideoSizeChangedListener;

    private OnVideoViewStateChangeListener mOnVideoViewStateChangeListener;

    private String mPreplacedsword;

    private PlayUrl mPlayerUrl;

    OnPreparedListener mPreparedListener;

    private int mRatioType;

    private int mResyncInterval;

    Callback mSHCallback;

    private int mSavedPos;

    private OnSeekCompleteListener mSeekCompleteListener;

    private int mSeekToPosition;

    private int mSeekWhenPrepared;

    OnVideoSizeChangedListener mSizeChangedListener;

    private int mSurfaceHeight;

    private SurfaceHolder mSurfaceHolder;

    private int mSurfaceWidth;

    private int mTargetState;

    private Uri mUri;

    private String mUserName;

    private int mVideoHeight;

    private int mVideoWidth;

    private int mVolumeState;

    private Runnable resyncHaptics;

    private long time;

    private clreplaced MediaPreparer implements Runnable {

        private boolean mIsPrepared;

        private int mProgress;

        public MediaPreparer(boolean prepared, int progress) {
            this.mIsPrepared = prepared;
            this.mProgress = progress;
            VideoViewH264LeMobile_4D.this.mIsMediaPreparing = true;
        }

        public void run() {
            int curProgress = VideoViewH264LeMobile_4D.this.getCurrentPosition();
            int delta = curProgress - this.mProgress;
            if (VideoViewH264LeMobile_4D.this.mMediaState == 3) {
                if (VideoViewH264LeMobile_4D.this.isHapticUsable()) {
                    VideoViewH264LeMobile_4D.this.mHaptics.pause();
                }
            } else if ((this.mIsPrepared || delta != 0) && !(this.mIsPrepared && delta == 0)) {
                int returnVal;
                if (this.mIsPrepared) {
                    if (VideoViewH264LeMobile_4D.this.isHapticUsable()) {
                        if (VideoViewH264LeMobile_4D.this.mMediaState != 0) {
                            returnVal = VideoViewH264LeMobile_4D.this.mHaptics.seek(curProgress);
                            if (returnVal != 0) {
                                Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics seek failed with value: " + ((String) VideoViewH264LeMobile_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264LeMobile_4D.this.mHaptics.getSDKStatus());
                            }
                        }
                        System.out.println("test prepare:resume");
                        returnVal = VideoViewH264LeMobile_4D.this.mHaptics.resume();
                        if (returnVal != 0) {
                            Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics resume failed with value: " + ((String) VideoViewH264LeMobile_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264LeMobile_4D.this.mHaptics.getSDKStatus());
                        }
                    } else {
                        Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics was not initialized yet.");
                    }
                    VideoViewH264LeMobile_4D.this.post(VideoViewH264LeMobile_4D.this.resyncHaptics);
                    VideoViewH264LeMobile_4D.this.post(VideoViewH264LeMobile_4D.this.changeResyncInterval);
                    VideoViewH264LeMobile_4D.this.mMediaState = 1;
                } else {
                    if (!VideoViewH264LeMobile_4D.this.isHapticUsable()) {
                        Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics was not initialized yet.");
                    } else if (VideoViewH264LeMobile_4D.this.mMediaLoaded) {
                        returnVal = VideoViewH264LeMobile_4D.this.mHaptics.play();
                        if (returnVal != 0) {
                            Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics play failed with value: " + ((String) VideoViewH264LeMobile_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264LeMobile_4D.this.mHaptics.getSDKStatus());
                        }
                    } else {
                        System.out.println("test mediaprepare else: resume");
                        returnVal = VideoViewH264LeMobile_4D.this.mHaptics.resume();
                        if (returnVal != 0) {
                            Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics resume failed with value: " + ((String) VideoViewH264LeMobile_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264LeMobile_4D.this.mHaptics.getSDKStatus());
                        }
                        VideoViewH264LeMobile_4D.this.post(VideoViewH264LeMobile_4D.this.resyncHaptics);
                        VideoViewH264LeMobile_4D.this.post(VideoViewH264LeMobile_4D.this.changeResyncInterval);
                    }
                    VideoViewH264LeMobile_4D.this.mMediaState = 1;
                }
                VideoViewH264LeMobile_4D.this.mIsSeeked = false;
                VideoViewH264LeMobile_4D.this.mIsMediaPreparing = false;
            } else {
                VideoViewH264LeMobile_4D.this.mMediaControlsHandler.postDelayed(this, (long) VideoViewH264LeMobile_4D.MEDIA_PREPARE_INTERVAL_MS);
            }
        }
    }

    public VideoViewH264LeMobile_4D(Context context) {
        super(context);
        this.TAG = "VideoViewLeMobile";
        this.mCurrentState = 0;
        this.mTargetState = 0;
        this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.mSurfaceHolder = null;
        this.mMediaPlayer = null;
        this.mRatioType = -1;
        this.lastSeekWhenDestoryed = 0;
        this.enforcementWait = false;
        this.enforcementPause = false;
        this.mUserName = "0f3b69678cce96c0ee8f6c57e31e1273aa0f280ad5519464f52ef3b874a16b6f";
        this.mPreplacedsword = "immr@letv23";
        this.mHaptFileName = "expendables_3_hapt.hapt";
        this.mIsMediaPreparing = false;
        this.mIsMediaBuffering = false;
        this.time = 0;
        this.mIsSeeked = false;
        this.mMediaLoaded = true;
        this.mResyncInterval = INITIAL_RESYNC_INTERVAL_MS;
        this.downloadHapt = true;
        this.mSizeChangedListener = new OnVideoSizeChangedListener() {

            public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
                LogTag.i("onVideoSizeChanged(), width=" + width + ", heigth=" + height);
                VideoViewH264LeMobile_4D.this.mVideoWidth = mp.getVideoWidth();
                VideoViewH264LeMobile_4D.this.mVideoHeight = mp.getVideoHeight();
                if (!(VideoViewH264LeMobile_4D.this.mVideoWidth == 0 || VideoViewH264LeMobile_4D.this.mVideoHeight == 0)) {
                    VideoViewH264LeMobile_4D.this.getHolder().setFixedSize(VideoViewH264LeMobile_4D.this.mVideoWidth, VideoViewH264LeMobile_4D.this.mVideoHeight);
                }
                if (VideoViewH264LeMobile_4D.this.mOnVideoSizeChangedListener != null) {
                    VideoViewH264LeMobile_4D.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, width, height);
                }
            }
        };
        this.mPreparedListener = new OnPreparedListener() {

            public void onPrepared(MediaPlayer mp) {
                LogTag.i("onPrepared()");
                String currentDate = Tools.getCurrentDate();
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264LeMobile(乐视手机videoview)  onPrepared()");
                if (VideoViewH264LeMobile_4D.this.mOnMediaStateTimeListener != null) {
                    VideoViewH264LeMobile_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
                }
                VideoViewH264LeMobile_4D.this.mCurrentState = 2;
                VideoViewH264LeMobile_4D.this.StateChange(VideoViewH264LeMobile_4D.this.mCurrentState);
                VideoViewH264LeMobile_4D videoViewH264LeMobile_4D = VideoViewH264LeMobile_4D.this;
                VideoViewH264LeMobile_4D videoViewH264LeMobile_4D2 = VideoViewH264LeMobile_4D.this;
                VideoViewH264LeMobile_4D.this.mCanSeekForward = true;
                videoViewH264LeMobile_4D2.mCanSeekBack = true;
                videoViewH264LeMobile_4D.mCanPause = true;
                if (VideoViewH264LeMobile_4D.this.mMediaController != null) {
                    VideoViewH264LeMobile_4D.this.mMediaController.setEnabled(true);
                }
                VideoViewH264LeMobile_4D.this.mVideoWidth = mp.getVideoWidth();
                VideoViewH264LeMobile_4D.this.mVideoHeight = mp.getVideoHeight();
                int seekToPosition = VideoViewH264LeMobile_4D.this.mSeekWhenPrepared;
                if (seekToPosition != 0) {
                    VideoViewH264LeMobile_4D.this.seekTo(seekToPosition);
                }
                if (VideoViewH264LeMobile_4D.this.mVideoWidth != 0 && VideoViewH264LeMobile_4D.this.mVideoHeight != 0) {
                    VideoViewH264LeMobile_4D.this.getHolder().setFixedSize(VideoViewH264LeMobile_4D.this.mVideoWidth, VideoViewH264LeMobile_4D.this.mVideoHeight);
                    if (VideoViewH264LeMobile_4D.this.mSurfaceWidth == VideoViewH264LeMobile_4D.this.mVideoWidth && VideoViewH264LeMobile_4D.this.mSurfaceHeight == VideoViewH264LeMobile_4D.this.mVideoHeight) {
                        if (VideoViewH264LeMobile_4D.this.mTargetState == 3) {
                            VideoViewH264LeMobile_4D.this.start();
                            if (VideoViewH264LeMobile_4D.this.mMediaController != null) {
                                VideoViewH264LeMobile_4D.this.mMediaController.show();
                            }
                        } else if (!VideoViewH264LeMobile_4D.this.isPlaying() && ((seekToPosition != 0 || VideoViewH264LeMobile_4D.this.getCurrentPosition() > 0) && VideoViewH264LeMobile_4D.this.mMediaController != null)) {
                            VideoViewH264LeMobile_4D.this.mMediaController.show(0);
                        }
                    }
                } else if (VideoViewH264LeMobile_4D.this.mTargetState == 3) {
                    VideoViewH264LeMobile_4D.this.start();
                }
                if (VideoViewH264LeMobile_4D.this.mOnPreparedListener != null) {
                    VideoViewH264LeMobile_4D.this.mOnPreparedListener.onPrepared(mp);
                }
                VideoViewH264LeMobile_4D.this.palyer4dContrlHandle(seekToPosition);
            }
        };
        this.mCompletionListener = new OnCompletionListener() {

            public void onCompletion(MediaPlayer mp) {
                LogTag.i("onCompletion()");
                VideoViewH264LeMobile_4D.this.mCurrentState = 5;
                VideoViewH264LeMobile_4D.this.StateChange(VideoViewH264LeMobile_4D.this.mCurrentState);
                VideoViewH264LeMobile_4D.this.mTargetState = 5;
                VideoViewH264LeMobile_4D.this.mCurrentState = 6;
                VideoViewH264LeMobile_4D.this.StateChange(VideoViewH264LeMobile_4D.this.mCurrentState);
                if (VideoViewH264LeMobile_4D.this.mMediaController != null) {
                    VideoViewH264LeMobile_4D.this.mMediaController.hide();
                }
                if (VideoViewH264LeMobile_4D.this.mOnCompletionListener != null) {
                    VideoViewH264LeMobile_4D.this.mOnCompletionListener.onCompletion(mp);
                }
            }
        };
        this.mErrorListener = new OnErrorListener() {

            public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
                LogTag.i("onError(): framework_err=" + framework_err + ", impl_err=" + impl_err);
                VideoViewH264LeMobile_4D.this.mCurrentState = -1;
                VideoViewH264LeMobile_4D.this.StateChange(VideoViewH264LeMobile_4D.this.mCurrentState);
                VideoViewH264LeMobile_4D.this.mTargetState = -1;
                if (VideoViewH264LeMobile_4D.this.mMediaController != null) {
                    VideoViewH264LeMobile_4D.this.mMediaController.hide();
                }
                if (VideoViewH264LeMobile_4D.this.mOnErrorListener != null) {
                    VideoViewH264LeMobile_4D.this.mOnErrorListener.onError(mp, framework_err, impl_err);
                }
                String currentDate = Tools.getCurrentDate();
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + "VideoViewLeMobile(乐视手机videoview) error, framework_err=" + framework_err + ", impl_err=" + impl_err);
                if (VideoViewH264LeMobile_4D.this.mOnMediaStateTimeListener != null) {
                    VideoViewH264LeMobile_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
                }
                return true;
            }
        };
        this.mBufferingUpdateListener = new OnBufferingUpdateListener() {

            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                VideoViewH264LeMobile_4D.this.mCurrentBufferPercentage = percent;
                if (VideoViewH264LeMobile_4D.this.mOnBufferingUpdateListener != null) {
                    VideoViewH264LeMobile_4D.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
                }
            }
        };
        this.mSeekCompleteListener = new OnSeekCompleteListener() {

            public void onSeekComplete(MediaPlayer mp) {
                LogTag.i("onSeekComplete()");
                if (VideoViewH264LeMobile_4D.this.mOnSeekCompleteListener != null) {
                    VideoViewH264LeMobile_4D.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264LeMobile_4D.this.mMediaPlayer);
                }
            }
        };
        this.mInfoListener = new OnInfoListener() {

            public boolean onInfo(MediaPlayer mp, int what, int extra) {
                if (VideoViewH264LeMobile_4D.this.mOnInfoListener != null) {
                    VideoViewH264LeMobile_4D.this.mOnInfoListener.onInfo(mp, what, extra);
                }
                return false;
            }
        };
        this.mSHCallback = new Callback() {

            public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
                LogTag.i("mSHCallback:surfaceChanged(), w=" + w + ", h=" + h);
                VideoViewH264LeMobile_4D.this.mSurfaceWidth = w;
                VideoViewH264LeMobile_4D.this.mSurfaceHeight = h;
                boolean isValidState;
                if (VideoViewH264LeMobile_4D.this.mTargetState == 3) {
                    isValidState = true;
                } else {
                    isValidState = false;
                }
                boolean hasValidSize;
                if (VideoViewH264LeMobile_4D.this.mVideoWidth == w && VideoViewH264LeMobile_4D.this.mVideoHeight == h) {
                    hasValidSize = true;
                } else {
                    hasValidSize = false;
                }
                if (VideoViewH264LeMobile_4D.this.mMediaPlayer != null && isValidState && hasValidSize) {
                    if (VideoViewH264LeMobile_4D.this.mSeekWhenPrepared != 0) {
                        VideoViewH264LeMobile_4D.this.seekTo(VideoViewH264LeMobile_4D.this.mSeekWhenPrepared);
                    }
                    VideoViewH264LeMobile_4D.this.start();
                    if (VideoViewH264LeMobile_4D.this.mMediaController != null) {
                        VideoViewH264LeMobile_4D.this.mMediaController.show();
                    }
                }
            }

            public void surfaceCreated(SurfaceHolder holder) {
                LogTag.i("mSHCallback:surfaceCreated()");
                VideoViewH264LeMobile_4D.this.mSurfaceHolder = holder;
                VideoViewH264LeMobile_4D.this.openVideo();
            }

            public void surfaceDestroyed(SurfaceHolder holder) {
                LogTag.i("mSHCallback:surfaceDestroyed()");
                VideoViewH264LeMobile_4D.this.mSurfaceHolder = null;
                if (VideoViewH264LeMobile_4D.this.mMediaController != null) {
                    VideoViewH264LeMobile_4D.this.mMediaController.hide();
                }
                VideoViewH264LeMobile_4D.this.lastSeekWhenDestoryed = VideoViewH264LeMobile_4D.this.getCurrentPosition();
                VideoViewH264LeMobile_4D.this.release(true);
            }
        };
        this.resyncHaptics = new Runnable() {

            private int lastPos = 0;

            private boolean stalled = false;

            public synchronized void run() {
                int currPos = VideoViewH264LeMobile_4D.this.getCurrentPosition();
                if (currPos == this.lastPos || currPos == VideoViewH264LeMobile_4D.this.mSeekToPosition) {
                    System.out.print("test: haptic sync pausing, currPos=" + currPos + "\n");
                    VideoViewH264LeMobile_4D.this.mHaptics.pause();
                    this.stalled = true;
                } else if (this.stalled) {
                    System.out.print("test: haptics sync resuming, currPos=" + currPos + "\n");
                    VideoViewH264LeMobile_4D.this.mHaptics.resume();
                    this.stalled = false;
                }
                this.lastPos = currPos;
                if (VideoViewH264LeMobile_4D.this.isHapticUsable()) {
                    int returnVal = VideoViewH264LeMobile_4D.this.mHaptics.update((long) currPos);
                    if (returnVal != 0) {
                        Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics update failed with value: " + ((String) VideoViewH264LeMobile_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264LeMobile_4D.this.mHaptics.getSDKStatus());
                    }
                }
                if (VideoViewH264LeMobile_4D.this.isPlaying()) {
                    VideoViewH264LeMobile_4D.this.getHandler().removeCallbacks(VideoViewH264LeMobile_4D.this.resyncHaptics);
                    VideoViewH264LeMobile_4D.this.postDelayed(VideoViewH264LeMobile_4D.this.resyncHaptics, (long) VideoViewH264LeMobile_4D.this.mResyncInterval);
                } else {
                    this.stalled = false;
                }
            }
        };
        this.changeResyncInterval = new Runnable() {

            public void run() {
                if (VideoViewH264LeMobile_4D.this.getCurrentPosition() > VideoViewH264LeMobile_4D.FIRST_SYNC_UPDATE_TIME_MS) {
                    VideoViewH264LeMobile_4D.this.mResyncInterval = VideoViewH264LeMobile_4D.HAPTICS_RESYNC_INTERVAL_MS;
                } else {
                    VideoViewH264LeMobile_4D.this.postDelayed(VideoViewH264LeMobile_4D.this.changeResyncInterval, (long) VideoViewH264LeMobile_4D.INITIAL_RESYNC_INTERVAL_MS);
                }
            }
        };
        this.mContext = context;
        initVideoView();
    }

    public VideoViewH264LeMobile_4D(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        this.mContext = context;
        initVideoView();
    }

    public VideoViewH264LeMobile_4D(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.TAG = "VideoViewLeMobile";
        this.mCurrentState = 0;
        this.mTargetState = 0;
        this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
        this.mSurfaceHolder = null;
        this.mMediaPlayer = null;
        this.mRatioType = -1;
        this.lastSeekWhenDestoryed = 0;
        this.enforcementWait = false;
        this.enforcementPause = false;
        this.mUserName = "0f3b69678cce96c0ee8f6c57e31e1273aa0f280ad5519464f52ef3b874a16b6f";
        this.mPreplacedsword = "immr@letv23";
        this.mHaptFileName = "expendables_3_hapt.hapt";
        this.mIsMediaPreparing = false;
        this.mIsMediaBuffering = false;
        this.time = 0;
        this.mIsSeeked = false;
        this.mMediaLoaded = true;
        this.mResyncInterval = INITIAL_RESYNC_INTERVAL_MS;
        this.downloadHapt = true;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        ???;
        this.mContext = context;
        initVideoView();
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
        int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
        if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
            switch(this.mRatioType) {
                case -1:
                    if (this.mVideoWidth * height <= this.mVideoHeight * width) {
                        if (this.mVideoWidth * height < this.mVideoHeight * width) {
                            width = (this.mVideoWidth * height) / this.mVideoHeight;
                            break;
                        }
                    }
                    height = (this.mVideoHeight * width) / this.mVideoWidth;
                    break;
                    break;
                case 1:
                    if (height * 4 <= width * 3) {
                        if (height * 4 < width * 3) {
                            width = (height * 4) / 3;
                            break;
                        }
                    }
                    height = (width * 3) / 4;
                    break;
                    break;
                case 2:
                    if (height * 16 <= width * 9) {
                        if (height * 16 < width * 9) {
                            width = (height * 16) / 9;
                            break;
                        }
                    }
                    height = (width * 9) / 16;
                    break;
                    break;
            }
        }
        setMeasuredDimension(width, height);
    }

    public void adjust(int type) {
        this.mRatioType = type;
        invalateScreenSize();
    }

    private void invalateScreenSize() {
        setLayoutParams((LayoutParams) getLayoutParams());
    }

    public int resolveAdjustedSize(int desiredSize, int measureSpec) {
        int result = desiredSize;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        switch(specMode) {
            case Integer.MIN_VALUE:
                return Math.min(desiredSize, specSize);
            case 0:
                return desiredSize;
            case 1073741824:
                return specSize;
            default:
                return result;
        }
    }

    private void initVideoView() {
        this.mVideoWidth = 0;
        this.mVideoHeight = 0;
        getHolder().addCallback(this.mSHCallback);
        getHolder().setType(3);
        setFocusable(true);
        setFocusableInTouchMode(true);
        requestFocus();
        this.mCurrentState = 0;
        StateChange(this.mCurrentState);
        this.mTargetState = 0;
    }

    public void setVideoPath(String path) {
        this.mPlayerUrl = new PlayUrl();
        this.mPlayerUrl.setVid(-1);
        this.mPlayerUrl.setUrl(path);
        this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
        setVideoURI(Uri.parse(path));
    }

    public void setVideoPath(String path, Map<String, String> map) {
    }

    public void setVideoURI(Uri uri) {
        String currentDate = Tools.getCurrentDate();
        LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264LeMobile(乐视手机videoview)  setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
        if (this.mOnMediaStateTimeListener != null) {
            this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
        }
        this.mUri = uri;
        this.mSeekWhenPrepared = 0;
        openVideo();
        requestLayout();
        invalidate();
        LogTag.i("setVideoURI(), url=" + (uri != null ? uri.toString() : "null"));
    }

    private void openVideo() {
        if (this.mUri == null || this.mSurfaceHolder == null) {
            setVisibility(0);
            return;
        }
        Intent i = new Intent("com.android.music.musicservicecommand");
        i.putExtra("command", "pause");
        this.mContext.sendBroadcast(i);
        release(false);
        try {
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264LeMobile(乐视手机videoview)  创建MediaPlayer对象");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
            }
            this.mMediaPlayer = new MediaPlayer();
            this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
            this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
            this.mDuration = -1;
            this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
            this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
            this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
            this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
            this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
            this.mCurrentBufferPercentage = 0;
            this.mMediaPlayer.setDataSource(this.mContext, this.mUri);
            this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
            this.mMediaPlayer.setAudioStreamType(3);
            this.mMediaPlayer.setScreenOnWhilePlaying(true);
            this.mMediaPlayer.prepareAsync();
            this.mCurrentState = 1;
            StateChange(this.mCurrentState);
            attachMediaController();
        } catch (IOException ex) {
            LogTag.i("Unable to open content: " + this.mUri + " ,IOException=" + ex);
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        } catch (IllegalArgumentException ex2) {
            LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex2);
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        }
    }

    public void setMediaController(MediaController controller) {
        if (this.mMediaController != null) {
            this.mMediaController.hide();
        }
        this.mMediaController = controller;
        attachMediaController();
    }

    private void attachMediaController() {
        if (this.mMediaPlayer != null && this.mMediaController != null) {
            View anchorView;
            this.mMediaController.setMediaPlayer(this);
            if (getParent() instanceof View) {
                anchorView = (View) getParent();
            } else {
                anchorView = this;
            }
            this.mMediaController.setAnchorView(anchorView);
            this.mMediaController.setEnabled(isInPlaybackState());
        }
    }

    private void release(boolean cleartargetstate) {
        if (this.mMediaPlayer != null) {
            this.mMediaPlayer.reset();
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewH264LeMobile release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            int returnVal = this.mHaptics.stop();
            Log.e(this.TAG, "Haptic dispose " + this.mHaptics.getSDKStatus());
            this.mHaptics.dispose();
            if (returnVal != 0) {
                Log.e(this.TAG, "Haptics stop failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
            }
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            if (cleartargetstate) {
                this.mTargetState = 0;
            }
        }
    }

    public boolean onTouchEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onTrackballEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        boolean isKeyCodeSupported;
        if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
            isKeyCodeSupported = false;
        } else {
            isKeyCodeSupported = true;
        }
        if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
            if (keyCode == 79 || keyCode == 85) {
                if (this.mMediaPlayer.isPlaying()) {
                    pause();
                    this.mMediaController.show();
                    return true;
                }
                start();
                this.mMediaController.hide();
                return true;
            } else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
                pause();
                this.mMediaController.show();
            } else {
                toggleMediaControlsVisiblity();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    public int getLastSeekWhenDestoryed() {
        return this.lastSeekWhenDestoryed;
    }

    private void toggleMediaControlsVisiblity() {
        if (this.mMediaController.isShowing()) {
            this.mMediaController.hide();
        } else {
            this.mMediaController.show();
        }
    }

    public void start() {
        HttpRequestManager.getInstance(this.mContext).requestCapability();
        this.mMediaState = -1;
        this.mVolumeState = 0;
        if (this.mMediaControlsHandler == null) {
            this.mMediaControlsHandler = new Handler();
        }
        if (this.downloadHapt) {
            palyer4dInit();
            return;
        }
        if (!(this.enforcementWait || this.enforcementPause || !isInPlaybackState())) {
            LogTag.i("start()");
            this.mMediaPlayer.start();
            this.mCurrentState = 3;
            StateChange(this.mCurrentState);
            init4DMediaPreparer();
        }
        this.mTargetState = 3;
        StateChange(7);
    }

    public void pause() {
        if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
            LogTag.i("pause()");
            this.mMediaPlayer.pause();
            this.mCurrentState = 4;
            StateChange(this.mCurrentState);
        }
        this.mTargetState = 4;
    }

    public int getDuration() {
        if (!isInPlaybackState()) {
            this.mDuration = -1;
            LogTag.i("getDuration()=" + this.mDuration);
            return this.mDuration;
        } else if (this.mDuration > 0) {
            return this.mDuration;
        } else {
            this.mDuration = this.mMediaPlayer.getDuration();
            LogTag.i("getDuration()=" + this.mDuration);
            return this.mDuration;
        }
    }

    public int getCurrentPosition() {
        if (isInPlaybackState()) {
            return this.mMediaPlayer.getCurrentPosition();
        }
        return 0;
    }

    public void seekTo(int msec) {
        if (isInPlaybackState()) {
            this.mMediaPlayer.seekTo(msec);
            this.mSeekWhenPrepared = 0;
            this.lastSeekWhenDestoryed = 0;
            return;
        }
        this.mSeekWhenPrepared = msec;
        this.lastSeekWhenDestoryed = 0;
    }

    public void forward() {
        seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
    }

    public void rewind() {
        seekTo(getCurrentPosition() - 15000);
    }

    public boolean isPlaying() {
        return isInPlaybackState() && this.mMediaPlayer.isPlaying();
    }

    public boolean isPaused() {
        return this.mCurrentState == 4;
    }

    public boolean isInPlaybackState() {
        return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
    }

    public int getBufferPercentage() {
        if (this.mMediaPlayer != null) {
            return this.mCurrentBufferPercentage;
        }
        return 0;
    }

    public boolean canPause() {
        return this.mCanPause;
    }

    public boolean canSeekBackward() {
        return this.mCanSeekBack;
    }

    public boolean canSeekForward() {
        return this.mCanSeekForward;
    }

    public boolean isEnforcementWait() {
        return this.enforcementWait;
    }

    public void setEnforcementWait(boolean enforcementWait) {
        this.enforcementWait = enforcementWait;
    }

    public boolean isEnforcementPause() {
        return this.enforcementPause;
    }

    public void setEnforcementPause(boolean enforcementPause) {
        this.enforcementPause = enforcementPause;
    }

    public void stopPlayback() {
        LogTag.i("stopPlayback()");
        StateChange(6);
        if (this.mMediaPlayer != null) {
            String currentDateStop = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateStop + "VideoViewH264LeMobile stop()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
            }
            this.mMediaPlayer.stop();
            Log.e(this.TAG, "Haptics dispose");
            int returnVal = this.mHaptics.stop();
            this.mHaptics.dispose();
            if (returnVal != 0) {
                Log.e(this.TAG, "Haptics stop failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
            }
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewH264LeMobile release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            this.mTargetState = 0;
            setVisibility(4);
        }
    }

    public View getView() {
        return this;
    }

    private void StateChange(int mCurrentState) {
        LogTag.i("StateChange(), mCurrentState=" + mCurrentState);
        if (this.mOnVideoViewStateChangeListener != null) {
            this.mOnVideoViewStateChangeListener.onChange(mCurrentState);
        }
    }

    public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener videoViewListener) {
        this.mOnVideoViewStateChangeListener = videoViewListener;
    }

    public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
        this.mOnBufferingUpdateListener = l;
    }

    public void setOnCompletionListener(OnCompletionListener l) {
        this.mOnCompletionListener = l;
    }

    public void setOnErrorListener(OnErrorListener l) {
        this.mOnErrorListener = l;
    }

    public void setOnInfoListener(OnInfoListener l) {
        this.mOnInfoListener = l;
    }

    public void setOnPreparedListener(OnPreparedListener l) {
        this.mOnPreparedListener = l;
    }

    public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
        this.mOnSeekCompleteListener = l;
    }

    public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
        this.mOnVideoSizeChangedListener = l;
    }

    public void setVideoPlayUrl(PlayUrl url) {
        this.mPlayerUrl = url;
        setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
    }

    public void setOnAdNumberListener(OnAdNumberListener l) {
    }

    public void setCacheSize(int video_size, int audio_size, int picutureSize, int startpic_size) {
    }

    public void setOnBlockListener(OnBlockListener l) {
    }

    public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
        this.mOnMediaStateTimeListener = l;
    }

    public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
    }

    public void setHaptUrl(String url) {
        this.hapt = url;
    }

    public void initHapticValues() {
        this.mErrorValues = new HashMap();
        this.mErrorValues.put(Integer.valueOf(0), SUCCESS);
        this.mErrorValues.put(Integer.valueOf(-1), INVALID);
        this.mErrorValues.put(Integer.valueOf(-2), INACCESSIBLE_URL);
        this.mErrorValues.put(Integer.valueOf(-3), PERMISSION_DENIED);
        this.mErrorValues.put(Integer.valueOf(-4), MALFORMED_URL);
        this.mErrorValues.put(Integer.valueOf(-5), UNSUPPORTED_PROTOCOL);
    }

    private boolean isHapticUsable() {
        return this.mHapticState == 1;
    }

    public void palyer4dInit() {
        this.mMediaState = -1;
        this.mVolumeState = 0;
        initHapticValues();
        this.mHaptics = HapticContentSDKFactory.GetNewSDKInstance(0, this.mContext, this.mUserName, this.mPreplacedsword, HapticContentSDK.DEFAULT_DNS);
        if (this.mHaptics == null) {
            Log.e(this.TAG, "Could not get new Haptic SDK Instance!");
            this.mHapticState = -1;
        } else {
            this.mHapticState = 0;
        }
        this.mSavedPos = 0;
        this.mMediaControlsHandler = new Handler();
        if (this.mHapticState == 0) {
            int returnVal = this.mHaptics.openHaptics(this.hapt);
            if (returnVal == 0) {
                this.mHapticState = 1;
                this.downloadHapt = false;
            } else {
                Log.e(this.TAG, "Haptics open failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
            }
        }
        if (!(this.enforcementWait || this.enforcementPause || !isInPlaybackState())) {
            this.mMediaPlayer.start();
            System.out.println("test is start");
            this.mCurrentState = 3;
            StateChange(this.mCurrentState);
            if (this.mMediaLoaded) {
                this.mMediaControlsHandler.post(new MediaPreparer(true, getCurrentPosition()));
            } else {
                this.mMediaControlsHandler.post(new MediaPreparer(false, getCurrentPosition()));
            }
        }
        this.mTargetState = 3;
        StateChange(7);
    }

    public void init4DMediaPreparer() {
        if (this.mMediaLoaded) {
            this.mMediaControlsHandler.post(new MediaPreparer(true, getCurrentPosition()));
        } else {
            this.mMediaControlsHandler.post(new MediaPreparer(false, getCurrentPosition()));
        }
    }

    public void palyer4dContrlHandle(int seekToPosition) {
        postDelayed(this.resyncHaptics, (long) INITIAL_RESYNC_INTERVAL_MS);
        postDelayed(this.changeResyncInterval, (long) INITIAL_RESYNC_INTERVAL_MS);
        this.mSavedPos = seekToPosition;
        if (this.mSavedPos == 0) {
            this.mMediaControlsHandler.post(new MediaPreparer(false, 0));
        } else {
            this.mMediaState = 2;
        }
    }

    public void setHapticMute(boolean disable) {
        int returnVal;
        if (disable) {
            if (isHapticUsable()) {
                returnVal = this.mHaptics.mute();
                if (returnVal == 0) {
                    this.mVolumeState = 1;
                } else {
                    Log.e(this.TAG, "Haptics mute failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
                }
            }
        } else if (isHapticUsable()) {
            returnVal = this.mHaptics.unmute();
            if (returnVal == 0) {
                this.mVolumeState = 0;
            } else {
                Log.e(this.TAG, "Haptics unmute failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
            }
        }
    }
}

16 Source : SampleVideoPlayerActivity.java
with Apache License 2.0
from googlearchive

/**
 * Unlike most of the rest of this example, this clreplaced is only really guaranteed
 * to work well on Froyo devices or above. This clreplaced tries to do the right
 * thing with a video player that is constrained to landscape even if its parent
 * is not so constrained. This can lead to some interesting state transitions in
 * Android.
 */
public clreplaced SampleVideoPlayerActivity extends Activity implements OnPreparedListener {

    private Uri mMediaUri;

    private String mMediareplacedle;

    private VideoView mVideoView;

    private View mPlayerLayout;

    private Method mSetSystemUiVisibility;

    private Method mSetSystemUiVisibilityListener;

    private int mSavedPosition;

    private boolean mIgnoreSystemUIChange;

    private boolean mResumeVideoPlaybackOnResume;

    private boolean mStartVideoOnCreate;

    private boolean mHasFocus;

    private boolean mSystemKeysShowing;

    private Handler mHandler;

    private MediaController mMediaController;

    static final private String SAVE_VIDEO_POSITION = "POS";

    static final private String RESUME_VIDEO_ON_RESUME = "RES";

    protected static final int MSG_HIDE_SYSTEM_UI = 1;

    static final private String LOG_TAG = "SampleVideo";

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
         * We create a handler here so that we can delay hiding the system Ui
         * for a fraction of a second.
         */
        mHandler = new Handler() {

            @Override
            public void handleMessage(Message msg) {
                switch(msg.what) {
                    case MSG_HIDE_SYSTEM_UI:
                        hideSystemUi();
                        break;
                }
                super.handleMessage(msg);
            }
        };
        /**
         * We use a combination of getLastNonConfigurationInstance and saved
         * instance state to make sure we resume under a variety of cases.
         */
        if (null == savedInstanceState) {
            savedInstanceState = (Bundle) getLastNonConfigurationInstance();
        }
        if (null != savedInstanceState) {
            mResumeVideoPlaybackOnResume = savedInstanceState.getBoolean(RESUME_VIDEO_ON_RESUME, false);
            mStartVideoOnCreate = false;
        } else {
            mStartVideoOnCreate = true;
            mSavedPosition = -1;
        }
        setContentView(R.layout.videoplayer);
        mPlayerLayout = this.findViewById(R.id.PlayerLayout);
        mMediaUri = this.getIntent().getData();
        mMediareplacedle = this.getIntent().getStringExtra(Intent.EXTRA_replacedLE);
        ((TextView) findViewById(R.id.NowPlaying)).setText(mMediareplacedle);
        mVideoView = (VideoView) findViewById(R.id.VideoView);
        /**
         * This code will hide the system UI when the Media Controller is hidden
         * on ICS devices.
         */
        mMediaController = new MediaController(this) {

            /**
             * Whenever we hide the MediaController, we also hide the system UI
             * a fraction of a second later.
             */
            @Override
            public void hide() {
                super.hide();
                postHideSystemUi();
            }

            /**
             * If we are on an ICS device, we don't want the back key to just
             * dismiss the media controller, because that will also hide the
             * system keys, so the user effectively cannot back out of the app
             * using the back key. Since the media controller times out (or
             * exits when the user taps on a part of the screen that is not the
             * media controller) This seems to be a reasonable compromise
             */
            @Override
            public boolean dispatchKeyEvent(KeyEvent event) {
                if (mSystemKeysShowing && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                    finish();
                }
                return super.dispatchKeyEvent(event);
            }
        };
        /**
         * Set up the use of reflection to hide system UI and use a Proxy to get
         * notified when the visibility changes. Once we are playing the video,
         * we hide the system UI.
         */
        try {
            mSetSystemUiVisibility = View.clreplaced.getMethod("setSystemUiVisibility", int.clreplaced);
            Clreplaced<?> onChangeListener = Clreplaced.forName("android.view.View$OnSystemUiVisibilityChangeListener");
            mSetSystemUiVisibilityListener = View.clreplaced.getMethod("setOnSystemUiVisibilityChangeListener", onChangeListener);
            ClreplacedLoader cl = onChangeListener.getClreplacedLoader();
            InvocationHandler h = new InvocationHandler() {

                /**
                 * This gets called when the view calls the
                 * OnSystemUiVisibilityChangeListener. Since there is only one
                 * method in this clreplaced, we don't bother to look at the Method
                 * parameter.
                 */
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    if (mIgnoreSystemUIChange) {
                        mIgnoreSystemUIChange = false;
                        return null;
                    }
                    switch(((Integer) args[0]).intValue()) {
                        case View.SYSTEM_UI_FLAG_LOW_PROFILE:
                            mMediaController.show();
                            mSystemKeysShowing = true;
                            break;
                        case View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LOW_PROFILE:
                        case View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:
                            mSystemKeysShowing = false;
                            break;
                    }
                    return null;
                }
            };
            Object o = Proxy.newProxyInstance(cl, new Clreplaced[] { onChangeListener }, h);
            mSetSystemUiVisibilityListener.invoke(mPlayerLayout, o);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (ClreplacedNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        mVideoView.setVideoURI(mMediaUri);
        mVideoView.setMediaController(mMediaController);
        mVideoView.requestFocus();
        mVideoView.setOnPreparedListener(this);
        hideSystemUi();
    }

    /**
     * We both resume and start the video, depending on the state.
     */
    private void resumeVideoIfNecessary() {
        if (mResumeVideoPlaybackOnResume && mHasFocus) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
                mVideoView.resume();
            }
            if (!mVideoView.isPlaying()) {
                mVideoView.start();
            }
            mResumeVideoPlaybackOnResume = false;
        }
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        mHasFocus = hasFocus;
        resumeVideoIfNecessary();
        super.onWindowFocusChanged(hasFocus);
    }

    @Override
    protected void onPause() {
        if (mHasFocus) {
            mResumeVideoPlaybackOnResume = mVideoView.isPlaying();
        }
        int savedPosition = mVideoView.getCurrentPosition();
        // if not active, video view will return 0 for the saved position
        if (0 != savedPosition) {
            mSavedPosition = savedPosition;
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
            mVideoView.suspend();
        }
        super.onPause();
    }

    @Override
    public Object onRetainNonConfigurationInstance() {
        Bundle outState = new Bundle();
        saveInstance(outState);
        return super.onRetainNonConfigurationInstance();
    }

    private void saveInstance(Bundle outState) {
        int videoPosition = mVideoView.getCurrentPosition();
        if (-1 == mSavedPosition) {
            mSavedPosition = videoPosition;
        }
        outState.putInt(SAVE_VIDEO_POSITION, mSavedPosition);
        outState.putBoolean(RESUME_VIDEO_ON_RESUME, mResumeVideoPlaybackOnResume);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        saveInstance(outState);
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onResume() {
        resumeVideoIfNecessary();
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandler = null;
        mMediaController = null;
        if (null != mSetSystemUiVisibilityListener) {
            try {
                mSetSystemUiVisibilityListener.invoke(mPlayerLayout, new Object[] { null });
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    /**
     * We want to avoid a race condition where the system UI doesn't end up
     * getting hidden because the touch event gets there before the call to hide
     * the UI gets there.
     */
    private void postHideSystemUi() {
        if (null != mSetSystemUiVisibility && null != mHandler) {
            mHandler.sendEmptyMessageDelayed(MSG_HIDE_SYSTEM_UI, 100);
        }
    }

    /**
     * Use reflection to hide the system UI.
     */
    private void hideSystemUi() {
        Log.d(LOG_TAG, "Hiding System Ui");
        if (null != mSetSystemUiVisibility) {
            try {
                mSetSystemUiVisibility.invoke(mPlayerLayout, View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
                mIgnoreSystemUIChange = true;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * If we are being restarted from a paused state, don't start playing.
     */
    public void onPrepared(MediaPlayer mp) {
        mp.start();
        if (!mStartVideoOnCreate) {
            mp.pause();
        }
        if (-1 != mSavedPosition) {
            mp.seekTo(mSavedPosition);
            mSavedPosition = -1;
        }
        hideSystemUi();
    }
}

16 Source : VideoViewer.java
with MIT License
from GnikDroy

public clreplaced VideoViewer extends AppCompatActivity {

    private String url = "http://st3.anime1.com/Darling in the FranXX Episode 15.mp4?st=5hjUoXuMBfTplZ49TKn8oQ&e=1529135685";

    private VideoView video;

    private MediaController ctlr;

    private ProgressBar progressBar;

    private RequestQueue requestQueue;

    private StringRequest stringRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_viewer);
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
            url = bundle.getString("url");
        } else {
        // This case causes errors.
        }
        video = (VideoView) findViewById(R.id.videoView);
        video.setVisibility(View.INVISIBLE);
        ctlr = new MediaController(this);
        ctlr.setVisibility(View.INVISIBLE);
        progressBar = findViewById(R.id.progressBar);
        progressBar.setVisibility(View.VISIBLE);
        requestQueue = Volley.newRequestQueue(this);
        stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                progressBar.setVisibility(View.INVISIBLE);
                video.setVisibility(View.VISIBLE);
                ctlr.setVisibility(View.VISIBLE);
                String videoUrl = SiteTools.getVideoURL(response);
                Uri uri = Uri.parse(videoUrl);
                video.setVideoURI(uri);
                ctlr.setMediaPlayer(video);
                video.setMediaController(ctlr);
                video.requestFocus();
                video.start();
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
            }
        });
        requestQueue.add(stringRequest);
    }
}

15 Source : JavaVideoActivity.java
with MIT License
from LeslieCorrea

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_java_video);
    mVideoView = (VideoView) this.findViewById(R.id.SampleVideoView);
    MediaController mediaController = new MediaController(this);
    mVideoView.setMediaController(mediaController);
    mVideoView.setVideoPath("content://com.example.lesliecorrea.videoapp/big_buck_bunny.mp4");
    mVideoView.start();
}

15 Source : FragmentShowImage.java
with GNU Affero General Public License v3.0
from KianIranian-STDG

public clreplaced FragmentShowImage extends BaseFragment {

    private static ArrayList<String> downloadedList = new ArrayList<>();

    public final String ROOM_ID = "roomId";

    public final String TYPE = "type";

    public View appBarLayout;

    private MediaController videoController;

    private TextView txtImageNumber;

    private TextView txtImageName;

    private TextView txtImageDate;

    private TextView txtImageTime;

    private TextView txtImageDesc;

    private LinearLayout toolbarShowImage;

    private boolean isShowToolbar = true;

    private ViewGroup ltImageName;

    private ViewPager viewPager;

    private boolean isFirstPlay = true;

    private int selectedFile = 0;

    private ArrayList<RealmRoomMessage> mFList = new ArrayList<>();

    private MediaPlayer mMediaPlayer;

    private boolean isLockScreen = false;

    private boolean isFocusable = false;

    private PhotoView zoomableImageViewTmp = null;

    private int lastOrientation = 0;

    public static FocusAudioListener focusAudioListener;

    private ProtoGlobal.RoomMessageType messageType;

    private ArrayList<TextureView> mTextureViewTmp = new ArrayList<>();

    private RealmRoom room;

    public static FragmentShowImage newInstance() {
        return new FragmentShowImage();
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // View view = inflater.inflate(R.layout.activity_show_image, container, false);
        // exitFragmentTransition = FragmentTransition.with(this).duration(200).interpolator(new LinearOutSlowInInterpolator()).to(view.findViewById(R.id.asi_view_pager)).start(savedInstanceState);
        // 
        // exitFragmentTransition.exitListener(new AnimatorListenerAdapter() {
        // @Override
        // public void onAnimationStart(Animator animation) {
        // 
        // }
        // 
        // @Override
        // public void onAnimationEnd(Animator animation) {
        // 
        // }
        // }).interpolator(new FastOutSlowInInterpolator());
        // exitFragmentTransition.startExitListening(view.findViewById(R.id.rooShowImage));
        return inflater.inflate(R.layout.activity_show_image, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (getIntentData(this.getArguments())) {
            initComponent(view);
        }
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation != lastOrientation) {
            lastOrientation = newConfig.orientation;
            if (zoomableImageViewTmp != null && videoController != null && mMediaPlayer != null) {
                zoomableImageViewTmp.setVisibility(View.GONE);
                zoomableImageViewTmp.setVisibility(View.VISIBLE);
                if (mMediaPlayer.isPlaying()) {
                    videoController.show();
                }
                if (mTextureViewTmp.size() > 0) {
                    getRealSize(mMediaPlayer, mTextureViewTmp.get(0));
                }
            }
        }
    }

    @Override
    public void onAttach(Context context) {
        if (appBarLayout != null) {
            appBarLayout.setVisibility(View.GONE);
        }
        super.onAttach(context);
    }

    private boolean getIntentData(Bundle bundle) {
        if (getActivity() != null) {
            getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
        if (bundle != null) {
            // get a list of image
            Long mRoomId = bundle.getLong("RoomId");
            Long selectedFileToken = bundle.getLong("SelectedImage");
            if (bundle.getString("TYPE") != null) {
                messageType = convertType(bundle.getString("TYPE"));
            }
            if (mRoomId == null) {
                popBackStackFragment();
                return false;
            }
            RealmResults<RealmRoomMessage> mRealmList = DbManager.getInstance().doRealmTask(realm -> {
                return RealmRoomMessage.findSorted(realm, mRoomId, "updateTime", Sort.ASCENDING);
            });
            if (mRealmList.size() < 1) {
                popBackStackFragment();
                return false;
            }
            // todo : remove for and handle it with query
            for (RealmRoomMessage roomMessage : mRealmList) {
                if (RealmRoomMessage.isImageOrVideo(roomMessage, messageType)) {
                    if ((roomMessage.getForwardMessage() != null ? roomMessage.getForwardMessage().getAttachment() : roomMessage.getAttachment()) != null)
                        mFList.add(roomMessage);
                }
            }
            if (selectedFileToken != null) {
                for (int i = mFList.size() - 1; i >= 0; i--) {
                    if (selectedFileToken == mFList.get(i).getMessageId()) {
                        selectedFile = i;
                        break;
                    }
                }
            }
            return true;
        } else {
            if (G.fragmentActivity != null) {
                popBackStackFragment();
            }
            return false;
        }
    }

    private ProtoGlobal.RoomMessageType convertType(String type) {
        if (type != null) {
            if (type.contains(ProtoGlobal.RoomMessageType.VIDEO.toString())) {
                return ProtoGlobal.RoomMessageType.VIDEO;
            } else if (type.contains(ProtoGlobal.RoomMessageType.IMAGE.toString())) {
                return ProtoGlobal.RoomMessageType.IMAGE;
            }
        }
        return null;
    }

    private void initComponent(View view) {
        downloadedList.clear();
        RippleView rippleBack = view.findViewById(R.id.asi_ripple_back);
        rippleBack.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {

            @Override
            public void onComplete(RippleView rippleView) {
                Log.wtf(this.getClreplaced().getName(), "on back");
                popBackStackFragment();
            }
        });
        RippleView rippleMenu = view.findViewById(R.id.asi_ripple_menu);
        rippleMenu.setOnRippleCompleteListener(rippleView -> popUpMenuShowImage());
        TextView btnShare = view.findViewById(R.id.asi_btn_share);
        btnShare.setOnClickListener(v -> shareImage());
        viewPager = view.findViewById(R.id.asi_view_pager);
        txtImageNumber = view.findViewById(R.id.asi_txt_image_number);
        ltImageName = view.findViewById(R.id.asi_layout_image_name);
        txtImageName = view.findViewById(R.id.asi_txt_image_name);
        txtImageDate = view.findViewById(R.id.asi_txt_image_date);
        txtImageTime = view.findViewById(R.id.asi_txt_image_time);
        txtImageDesc = view.findViewById(R.id.asi_txt_image_desc);
        toolbarShowImage = view.findViewById(R.id.toolbarShowImage);
        room = DbManager.getInstance().doRealmTask(realm -> {
            return realm.where(RealmRoom.clreplaced).equalTo("id", mFList.get(selectedFile).getRoomId()).findFirst();
        });
        initViewPager();
        focusAudioListener = isPlay -> {
            if (isPlay) {
                if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
                    mMediaPlayer.pause();
                    isLockScreen = true;
                    isFocusable = true;
                }
            } else {
                if (mMediaPlayer != null && isFocusable) {
                    int length = mMediaPlayer.getCurrentPosition();
                    mMediaPlayer.seekTo(length);
                    mMediaPlayer.start();
                    isLockScreen = true;
                    isFocusable = false;
                }
            }
        };
    }

    // ***************************************************************************************
    private void initViewPager() {
        AdapterViewPager mAdapter = new AdapterViewPager();
        viewPager.setAdapter(mAdapter);
        viewPager.setCurrenreplacedem(selectedFile);
        txtImageNumber.setText(selectedFile + 1 + " " + G.fragmentActivity.getResources().getString(R.string.of) + " " + mFList.size());
        if (HelperCalander.isPersianUnicode) {
            txtImageNumber.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageNumber.getText().toString()));
        }
        if (selectedFile >= mFList.size()) {
            return;
        }
        showImageInfo(mFList.get(selectedFile));
        viewPager.setOnClickListener(view -> {
        });
        viewPager.setPageTransformer(false, (view, position) -> {
            final float normalizedPosition = Math.abs(Math.abs(position) - 1);
            view.setScaleX(normalizedPosition / 2 + 0.5f);
            view.setScaleY(normalizedPosition / 2 + 0.5f);
        });
    }

    /**
     * show image info, time , name , description
     */
    private void showImageInfo(RealmRoomMessage realmRoomMessage) {
        if (realmRoomMessage == null || RealmUserInfo.getCurrentUserAuthorHash().equals("")) {
            return;
        }
        RealmRoomMessage realmRoomMessageFinal = RealmRoomMessage.getFinalMessage(realmRoomMessage);
        if (realmRoomMessageFinal != null && realmRoomMessageFinal.isValid() && realmRoomMessageFinal.getMessage() != null && !realmRoomMessageFinal.getMessage().isEmpty()) {
            txtImageDesc.setText(EmojiManager.getInstance().replaceEmoji(realmRoomMessageFinal.getMessage(), txtImageDesc.getPaint().getFontMetricsInt()));
            txtImageDesc.setVisibility(View.VISIBLE);
        } else {
            txtImageDesc.setVisibility(View.GONE);
        }
        RealmRegisteredInfo realmRegisteredInfo = DbManager.getInstance().doRealmTask(realm -> {
            return RealmRegisteredInfo.getRegistrationInfo(realm, realmRoomMessageFinal.getUserId());
        });
        if (realmRegisteredInfo != null) {
            txtImageName.setText(realmRegisteredInfo.getDisplayName());
        } else {
            txtImageName.setText("");
        }
        if (realmRoomMessageFinal.getAuthorHash() != null && RealmUserInfo.getCurrentUserAuthorHash().equals(realmRoomMessageFinal.getAuthorHash())) {
            txtImageName.setText(R.string.you);
        }
        if (realmRoomMessageFinal.getUpdateTime() != 0) {
            txtImageTime.setText(HelperCalander.getClocktime(realmRoomMessageFinal.getUpdateTime(), true));
            txtImageDate.setText(HelperCalander.checkHijriAndReturnTime(realmRoomMessageFinal.getUpdateTime() / 1000));
        }
        if (HelperCalander.isPersianUnicode) {
            txtImageName.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageName.getText().toString()));
            txtImageTime.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageTime.getText().toString()));
            txtImageDate.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageDate.getText().toString()));
        }
    }

    public void popUpMenuShowImage() {
        List<String> items = new ArrayList<>();
        items.add(getString(R.string.save_to_gallery));
        if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
            items.add(getString(R.string.share_video_file_2));
        } else {
            items.add(getString(R.string.share_image_2));
        }
        if (RoomObject.isRoomPublic(room)) {
            if (MessageObject.canSharePublic(mFList.get(selectedFile))) {
                items.add(getString(R.string.share_file_link));
            }
        }
        new TopSheetDialog(getContext()).setListData(items, -1, position -> {
            if (items.get(position).equals(getString(R.string.save_to_gallery))) {
                saveToGallery();
            } else if (items.get(position).equals(getString(R.string.share_file_link))) {
                shareMediaLink();
            } else {
                shareImage();
            }
        }).show();
    }

    /**
     * share Image and video
     */
    private void shareImage() {
        RealmRoomMessage roomMessage = null;
        if (mFList.size() > viewPager.getCurrenreplacedem())
            roomMessage = mFList.get(viewPager.getCurrenreplacedem());
        if (roomMessage != null) {
            roomMessage = RealmRoomMessage.getFinalMessage(roomMessage);
            String path = getFilePath(viewPager.getCurrenreplacedem());
            File file = new File(path);
            if (file.exists()) {
                Intent intent = new Intent(Intent.ACTION_SEND);
                AppUtils.shareItem(intent, new StructMessageInfo(roomMessage));
                if (roomMessage.getMessageType() == ProtoGlobal.RoomMessageType.VIDEO || roomMessage.getMessageType() == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
                    intent.setType("video/*");
                    startActivity(Intent.createChooser(intent, G.fragmentActivity.getResources().getString(R.string.share_video_from_igap)));
                } else {
                    intent.setType("image/*");
                    startActivity(Intent.createChooser(intent, G.fragmentActivity.getResources().getString(R.string.share_image_from_igap)));
                }
            } else {
                HelperError.showSnackMessage(getString(R.string.file_not_download_yet), false);
            }
        }
    }

    private void shareMediaLink() {
        RealmRoomMessage roomMessage = null;
        if (mFList.size() > viewPager.getCurrenreplacedem())
            roomMessage = mFList.get(viewPager.getCurrenreplacedem());
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("text/plain");
        if (roomMessage != null) {
            intent.putExtra(Intent.EXTRA_TEXT, roomMessage.attachment.url);
        }
        startActivity(Intent.createChooser(intent, G.context.getString(R.string.share_link_item_dialog)));
    }

    /**
     * share Image and video
     */
    private void saveToGallery() {
        RealmRoomMessage rm = null;
        if (mFList.size() > viewPager.getCurrenreplacedem())
            rm = mFList.get(viewPager.getCurrenreplacedem());
        if (rm != null) {
            String path = getFilePath(viewPager.getCurrenreplacedem());
            ProtoGlobal.RoomMessageType messageType;
            if (rm.getForwardMessage() != null) {
                messageType = rm.getForwardMessage().getMessageType();
            } else {
                messageType = rm.getMessageType();
            }
            File file = new File(path);
            if (file.exists()) {
                if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
                    HelperSaveFile.saveFileToDownLoadFolder(path, "VIDEO_" + System.currentTimeMillis() + ".mp4", HelperSaveFile.FolderType.video, R.string.file_save_to_video_folder);
                } else if (messageType == ProtoGlobal.RoomMessageType.IMAGE || messageType == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
                    HelperSaveFile.savePicToGallery(path, true);
                }
            }
        }
    }

    public String getFilePath(int position) {
        String result = "";
        RealmAttachment at = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getAttachment() : mFList.get(position).getAttachment();
        if (at != null) {
            if (at.getLocalFilePath() != null)
                result = at.getLocalFilePath();
        }
        ProtoGlobal.RoomMessageType messageType = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getMessageType() : mFList.get(position).getMessageType();
        if (result.length() < 1) {
            result = AndroidUtils.getFilePathWithCashId(at.getCacheId(), at.getName(), messageType);
        }
        return result;
    }

    public String getThumbnailPath(RealmRoomMessage roomMessage) {
        String result = "";
        if (roomMessage == null) {
            return "";
        }
        if (roomMessage.getAttachment() != null) {
            if (roomMessage.getAttachment().getLocalThumbnailPath() != null) {
                result = roomMessage.getAttachment().getLocalThumbnailPath();
            }
            if (result.length() < 1) {
                result = AndroidUtils.getFilePathWithCashId(roomMessage.getAttachment().getCacheId(), roomMessage.getAttachment().getName(), G.DIR_TEMP, true);
            }
        }
        return result;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
        if (videoController != null) {
            videoController.hide();
            videoController = null;
        }
        if (getActivity() != null) {
            getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
        if (videoController != null) {
            videoController.hide();
            videoController = null;
        }
        focusAudioListener = null;
    }

    @Override
    public void onPause() {
        super.onPause();
        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
            mMediaPlayer.pause();
            isLockScreen = true;
        }
        if (videoController != null && videoController.isShowing()) {
            videoController.hide();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (isLockScreen) {
            if (videoController != null && getActivity() != null) {
                videoController.show();
            }
        }
    }

    /**
     * adapter for view pager
     */
    private clreplaced AdapterViewPager extends PagerAdapter implements MediaController.MediaPlayerControl {

        private String videoPath;

        @Override
        public int getCount() {
            return mFList.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view.equals(object);
        }

        @Override
        public Object instantiateItem(ViewGroup container, final int position) {
            LayoutInflater inflater = LayoutInflater.from(G.fragmentActivity);
            ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.show_image_sub_layout, container, false);
            final TextureView mTextureView = layout.findViewById(R.id.textureView);
            final ImageView imgPlay = layout.findViewById(R.id.imgPlay);
            final PhotoView zoomableImageView = layout.findViewById(R.id.sisl_touch_image_view);
            zoomableImageView.setZoomable(false);
            FrameLayout frameLayout = layout.findViewById(R.id.Layout_showImage);
            frameLayout.setOnClickListener(v -> setPageViewState(imgPlay));
            final MessageProgress progress = layout.findViewById(R.id.progress);
            AppUtils.setProgresColor(progress.progressBar);
            final RealmRoomMessage rm = RealmRoomMessage.getFinalMessage(mFList.get(position));
            if (rm != null && rm.isValid()) {
                if (HelperDownloadFile.getInstance().isDownLoading(rm.getAttachment().getCacheId())) {
                    progress.withDrawable(R.drawable.ic_cancel, true);
                    startDownload(position, progress, zoomableImageView, imgPlay, mTextureView);
                } else {
                    progress.withDrawable(R.drawable.ic_download, true);
                }
                String path = getFilePath(position);
                File file = new File(path);
                if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
                    mMediaPlayer.pause();
                    mMediaPlayer.seekTo(0);
                    if (videoController != null)
                        videoController.hide();
                }
                if (file.exists()) {
                    progress.setVisibility(View.GONE);
                    // G.imageLoader.displayImage(suitablePath(path), zoomableImageView);
                    ImageLoadingServiceInjector.inject().loadImage(zoomableImageView, path, true);
                    zoomableImageView.setZoomable(true);
                    if (rm.getMessageType() == ProtoGlobal.RoomMessageType.IMAGE || rm.getMessageType() == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
                        zoomableImageView.setVisibility(View.VISIBLE);
                        imgPlay.setVisibility(View.GONE);
                        isFirstPlay = false;
                    } else {
                        if (isFirstPlay) {
                            mTextureView.setVisibility(View.VISIBLE);
                            G.handler.postDelayed(() -> playVideo(position, mTextureView, imgPlay, zoomableImageView), 100);
                            isFirstPlay = false;
                        }
                        imgPlay.setVisibility(View.VISIBLE);
                        mTextureView.setVisibility(View.INVISIBLE);
                        videoPath = path;
                    }
                } else {
                    imgPlay.setVisibility(View.GONE);
                    path = getThumbnailPath(rm);
                    zoomableImageView.setVisibility(View.VISIBLE);
                    file = new File(path);
                    if (file.exists()) {
                        // G.imageLoader.displayImage(suitablePath(path), zoomableImageView);
                        ImageLoadingServiceInjector.inject().loadImage(zoomableImageView, path);
                    } else if (rm.getAttachment() != null) {
                        // if thumpnail not exist download it
                        ProtoFileDownload.FileDownload.Selector selector = null;
                        long fileSize = 0;
                        if (rm.getAttachment().getSmallThumbnail() != null) {
                            selector = ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL;
                            fileSize = rm.getAttachment().getSmallThumbnail().getSize();
                        } else if (rm.getAttachment().getLargeThumbnail() != null) {
                            selector = ProtoFileDownload.FileDownload.Selector.LARGE_THUMBNAIL;
                            fileSize = rm.getAttachment().getLargeThumbnail().getSize();
                        }
                        final String filePathTumpnail = AndroidUtils.getFilePathWithCashId(rm.getAttachment().getCacheId(), rm.getAttachment().getName(), G.DIR_TEMP, true);
                        if (selector != null && fileSize > 0) {
                            HelperDownloadFile.getInstance().startDownload(rm.getMessageType(), System.currentTimeMillis() + "", rm.getAttachment().getToken(), rm.getAttachment().getUrl(), rm.getAttachment().getCacheId(), rm.getAttachment().getName(), fileSize, selector, "", 4, new HelperDownloadFile.UpdateListener() {

                                @Override
                                public void OnProgress(final String path, int progress) {
                                    if (progress == 100) {
                                        G.currentActivity.runOnUiThread(new Runnable() {

                                            @Override
                                            public void run() {
                                                // G.imageLoader.displayImage(AndroidUtils.suitablePath(path), zoomableImageView);
                                                ImageLoadingServiceInjector.inject().loadImage(zoomableImageView, path);
                                            }
                                        });
                                    }
                                }

                                @Override
                                public void OnError(String token) {
                                }
                            });
                        }
                    }
                }
            }
            progress.setOnClickListener(view -> {
                String _cashID = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getAttachment().getCacheId() : mFList.get(position).getAttachment().getCacheId();
                if (HelperDownloadFile.getInstance().isDownLoading(_cashID)) {
                    HelperDownloadFile.getInstance().stopDownLoad(_cashID);
                } else {
                    progress.withDrawable(R.drawable.ic_cancel, true);
                    startDownload(position, progress, zoomableImageView, imgPlay, mTextureView);
                }
            });
            zoomableImageView.setOnClickListener(view -> {
                setPageViewState(imgPlay);
            });
            imgPlay.setOnClickListener(v -> {
                mTextureView.setVisibility(View.VISIBLE);
                playVideo(position, mTextureView, imgPlay, zoomableImageView);
            });
            mTextureView.setOnClickListener(v -> setPageViewState(imgPlay));
            viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

                @Override
                public void onPageScrolled(final int position, float positionOffset, int positionOffsetPixels) {
                    if (isFirstPlay) {
                        if (mFList.get(position).getMessageType() == ProtoGlobal.RoomMessageType.IMAGE || mFList.get(position).getMessageType() == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
                            isFirstPlay = false;
                        }
                    }
                }

                @Override
                public void onPageSelected(final int position) {
                    zoomableImageViewTmp = null;
                    txtImageNumber.setText(position + 1 + " " + G.fragmentActivity.getResources().getString(R.string.of) + " " + mFList.size());
                    if (HelperCalander.isPersianUnicode) {
                        txtImageNumber.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageNumber.getText().toString()));
                    }
                    showImageInfo(mFList.get(position));
                    if (mFList.get(position).getForwardMessage() != null) {
                        messageType = mFList.get(position).getForwardMessage().getMessageType();
                    } else {
                        messageType = mFList.get(position).getMessageType();
                    }
                    if (mMediaPlayer != null && mMediaPlayer.isPlaying())
                        mMediaPlayer.stop();
                    if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
                        File f = new File(getFilePath(position));
                        if (f.exists()) {
                            imgPlay.setVisibility(View.VISIBLE);
                            zoomableImageView.setVisibility(View.VISIBLE);
                        } else {
                            imgPlay.setVisibility(View.GONE);
                        }
                    } else if (messageType == ProtoGlobal.RoomMessageType.IMAGE || messageType == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
                        imgPlay.setVisibility(View.GONE);
                    }
                    if (videoController != null) {
                        videoController.hide();
                    }
                }

                @Override
                public void onPageScrollStateChanged(int state) {
                }
            });
            container.addView(layout);
            return layout;
        }

        private void setPageViewState(ImageView imgPlay) {
            if (isShowToolbar) {
                toolbarShowImage.animate().setDuration(150).alpha(0F).start();
                ltImageName.setVisibility(View.GONE);
                ltImageName.animate().setDuration(150).alpha(0F).start();
                toolbarShowImage.setVisibility(View.GONE);
                isShowToolbar = false;
            } else {
                toolbarShowImage.animate().setDuration(150).alpha(1F).start();
                toolbarShowImage.setVisibility(View.VISIBLE);
                ltImageName.animate().setDuration(150).alpha(1F).start();
                ltImageName.setVisibility(View.VISIBLE);
                isShowToolbar = true;
            }
            if (getActivity() != null && zoomableImageViewTmp != null && imgPlay.getVisibility() != View.VISIBLE && mMediaPlayer != null && videoController != null) {
                if (videoController.isShowing()) {
                    videoController.hide();
                } else {
                    videoController.show();
                }
            }
        }

        private void startDownload(final int position, final MessageProgress progress, final PhotoView ZoomableImageView, final ImageView imgPlay, final TextureView mTextureView) {
            final RealmRoomMessage rm = RealmRoomMessage.getFinalMessage(mFList.get(position));
            if (downloadedList.indexOf(rm.getAttachment().getToken()) == -1) {
                downloadedList.add(rm.getAttachment().getCacheId());
            }
            progress.withOnProgress(() -> G.currentActivity.runOnUiThread(() -> {
                progress.withProgress(0);
                progress.setVisibility(View.GONE);
                ZoomableImageView.setZoomable(true);
                if (rm.isValid() && rm.getMessageType() == ProtoGlobal.RoomMessageType.VIDEO) {
                    imgPlay.setVisibility(View.VISIBLE);
                }
            }));
            DownloadObject struct = DownloadObject.createForRoomMessage(rm);
            if (struct == null) {
                return;
            }
            ProtoFileDownload.FileDownload.Selector selector = ProtoFileDownload.FileDownload.Selector.FILE;
            getDownloader().download(struct, selector, HttpRequest.PRIORITY.PRIORITY_HIGH, arg -> G.runOnUiThread(() -> {
                if (arg.data == null) {
                    return;
                }
                switch(arg.status) {
                    case SUCCESS:
                        ImageLoadingServiceInjector.inject().loadImage(ZoomableImageView, arg.data.getFilePath());
                        ZoomableImageView.setZoomable(true);
                        break;
                    case LOADING:
                        progress.withProgress(arg.data.getProgress());
                        break;
                    case ERROR:
                        progress.withProgress(0);
                        progress.withDrawable(R.drawable.ic_download, true);
                        break;
                }
            }));
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }

        /**
         * video player
         */
        private void playVideo(final int position, final TextureView mTextureView, final ImageView imgPlay, final PhotoView zoomableImageView) {
            zoomableImageViewTmp = zoomableImageView;
            if (mMediaPlayer == null)
                mMediaPlayer = new MediaPlayer();
            if (videoController == null)
                videoController = new MediaController(G.fragmentActivity);
            mTextureView.setVisibility(View.VISIBLE);
            videoPath = getFilePath(position);
            ViewCompat.setLayoutDirection(videoController, View.LAYOUT_DIRECTION_LTR);
            videoController.setAnchorView(zoomableImageView);
            videoController.setMediaPlayer(this);
            imgPlay.setVisibility(View.GONE);
            mMediaPlayer.reset();
            mTextureViewTmp.clear();
            mTextureViewTmp.add(mTextureView);
            try {
                mMediaPlayer.setDataSource(G.fragmentActivity, Uri.parse(videoPath));
                mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {

                    @Override
                    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
                        setMediaPlayer(mMediaPlayer, mTextureView, imgPlay, zoomableImageView);
                    }

                    @Override
                    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
                    /*Log.e("ddd", "width  :" + width + "    height  : " + height);*/
                    }

                    @Override
                    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
                        return false;
                    }

                    @Override
                    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
                    }
                });
                if (mTextureView.getSurfaceTexture() != null) {
                    setMediaPlayer(mMediaPlayer, mTextureView, imgPlay, zoomableImageView);
                }
            } catch (IOException | IllegalArgumentException e) {
                e.printStackTrace();
            }
            mMediaPlayer.setOnCompletionListener(mp -> {
                mp.seekTo(0);
                imgPlay.setVisibility(View.VISIBLE);
            });
        // mMediaPlayer.seekTo(100);
        }

        private void setMediaPlayer(MediaPlayer mMediaPlayer, final TextureView mTextureView, final ImageView imgPlay, final PhotoView zoomableImageView) {
            if (mTextureView == null) {
                return;
            }
            Surface surfaceTexture = new Surface(mTextureView.getSurfaceTexture());
            if (surfaceTexture == null) {
                return;
            }
            try {
                if (mMediaPlayer != null) {
                    mMediaPlayer.setSurface(surfaceTexture);
                    mMediaPlayer.setLooping(false);
                    mMediaPlayer.prepareAsync();
                }
            } catch (IllegalStateException e) {
                e.getMessage();
            }
            mMediaPlayer.setOnPreparedListener(mp -> {
                getRealSize(mp, mTextureView);
                imgPlay.setVisibility(View.GONE);
                mp.start();
                MusicPlayer.pauseSound();
                mTextureView.setVisibility(View.VISIBLE);
                zoomableImageView.animate().setDuration(700).alpha(0F).start();
                G.handler.postDelayed(() -> {
                    zoomableImageView.setVisibility(View.GONE);
                    zoomableImageView.clearAnimation();
                }, 700);
                videoController.setEnabled(true);
                videoController.show();
            });
        }

        @Override
        public void start() {
            if (mMediaPlayer != null)
                mMediaPlayer.start();
            MusicPlayer.pauseSound();
        }

        @Override
        public void pause() {
            if (mMediaPlayer != null)
                mMediaPlayer.pause();
        }

        @Override
        public int getDuration() {
            if (mMediaPlayer != null) {
                return mMediaPlayer.getDuration();
            }
            return 0;
        }

        @Override
        public int getCurrentPosition() {
            if (mMediaPlayer != null) {
                return mMediaPlayer.getCurrentPosition();
            }
            return 0;
        }

        @Override
        public void seekTo(int pos) {
            if (mMediaPlayer != null)
                mMediaPlayer.seekTo(pos);
        }

        @Override
        public boolean isPlaying() {
            return mMediaPlayer != null && mMediaPlayer.isPlaying();
        }

        @Override
        public int getBufferPercentage() {
            return 0;
        }

        @Override
        public boolean canPause() {
            return true;
        }

        @Override
        public boolean canSeekBackward() {
            return true;
        }

        @Override
        public boolean canSeekForward() {
            return true;
        }

        @Override
        public int getAudioSessionId() {
            return 0;
        }
    }

    /**
     * get real width and height video
     */
    private void getRealSize(MediaPlayer mp, TextureView mTextureView) {
        if (mp == null || mTextureView == null) {
            return;
        }
        // Get the dimensions of the video
        int videoWidth = mp.getVideoWidth();
        int videoHeight = mp.getVideoHeight();
        Display display = G.fragmentActivity.getWindowManager().getDefaultDisplay();
        int finalWith, finalHeight;
        finalWith = display.getWidth();
        finalHeight = (int) (((float) videoHeight / (float) videoWidth) * (float) display.getWidth());
        if (finalHeight > display.getHeight()) {
            finalWith = (int) (((float) finalWith / (float) finalHeight) * (float) display.getHeight());
            finalHeight = display.getHeight();
        }
        ViewGroup.LayoutParams lp = mTextureView.getLayoutParams();
        lp.width = finalWith;
        lp.height = finalHeight;
        mTextureView.setLayoutParams(lp);
    }

    public interface FocusAudioListener {

        void audioPlay(boolean isPlay);
    }
}

15 Source : MainActivity.java
with Apache License 2.0
from kevalpatel2106

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // set the is tracking indicator
    mTrackingStatusIv = (ImageView) findViewById(R.id.eye_tracking);
    mTrackingStatusIv.setVisibility(View.GONE);
    // set user aware video view
    mVideoView = (UserAwareVideoView) findViewById(R.id.video_view);
    mVideoView.setUserAwarenessListener(this);
    mVideoView.setVideoURI(Uri.parse("http://clips.vorwaerts-gmbh.de/VfE_html5.mp4"));
    // attach tge media controller
    MediaController mediaController = new MediaController(this);
    mediaController.setAnchorView(mVideoView);
    mediaController.setPrevNextListeners(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            mVideoView.stopPlayback();
            mVideoView.start();
        }
    }, new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            mVideoView.stopPlayback();
            mVideoView.start();
        }
    });
    mVideoView.setMediaController(mediaController);
    // Start video playing. This will start the user eye tracking too.
    // Do not care about permissions. Permissions will check internally.
    // Just handle errors.
    mVideoView.start();
}

15 Source : VideoViewH264m3u8Hw.java
with Apache License 2.0
from JackChan1999

public clreplaced VideoViewH264m3u8Hw extends SurfaceView implements LetvMediaPlayerControl {

    private static final int AUDIO_SIZE = 1600;

    private static final int PICTURE_SIZE = 90;

    private static final int STARTPIC_SIZE = 20;

    public static final int STATE_ENFORCEMENT = 7;

    public static final int STATE_ERROR = -1;

    public static final int STATE_IDLE = 0;

    public static final int STATE_PAUSED = 4;

    public static final int STATE_PLAYBACK_COMPLETED = 5;

    public static final int STATE_PLAYING = 3;

    public static final int STATE_PREPARED = 2;

    public static final int STATE_PREPARING = 1;

    public static final int STATE_STOPBACK = 6;

    private static final String TAG = "VideoViewH264m3u8Hw";

    private static final int VIDEO_SIZE = 400;

    private final int FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;

    private final int REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;

    private int bufferTime = 0;

    private boolean enforcementPause = false;

    private boolean enforcementWait = false;

    protected int lastSeekWhenDestoryed = 0;

    private OnAdNumberListener mAdNumberListener = new OnAdNumberListener() {

        public void onAdNumber(FFMpegPlayer mediaPlayer, int number) {
            if (VideoViewH264m3u8Hw.this.mOnAdNumberListener != null) {
                VideoViewH264m3u8Hw.this.mOnAdNumberListener.onAdNumber(mediaPlayer, number);
            }
        }
    };

    private OnBlockListener mBlockListener = new OnBlockListener() {

        public void onBlock(FFMpegPlayer mediaPlayer, int blockinfo) {
            if (VideoViewH264m3u8Hw.this.mOnBlockListener != null) {
                VideoViewH264m3u8Hw.this.mOnBlockListener.onBlock(mediaPlayer, blockinfo);
            }
            if (blockinfo == 10001) {
            }
        }
    };

    private OnBufferingUpdateListener mBufferingUpdateListener = new OnBufferingUpdateListener() {

        public void onBufferingUpdate(MediaPlayer mp, int percent) {
            VideoViewH264m3u8Hw.this.mCurrentBufferPercentage = percent;
            if (VideoViewH264m3u8Hw.this.mOnBufferingUpdateListener != null) {
                VideoViewH264m3u8Hw.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
            }
        }
    };

    private OnCacheListener mCacheListener = new OnCacheListener() {

        public void onCache(FFMpegPlayer mediaPlayer, int arg, int percent, long cacherate) {
            if (VideoViewH264m3u8Hw.this.mOnCacheListener != null) {
                VideoViewH264m3u8Hw.this.mOnCacheListener.onCache(mediaPlayer, arg, percent, cacherate);
            }
        }
    };

    private CacheTime mCacheTime;

    private boolean mCanPause;

    private boolean mCanSeekBack;

    private boolean mCanSeekForward;

    private OnCompletionListener mCompletionListener = new OnCompletionListener() {

        public void onCompletion(MediaPlayer mp) {
            VideoViewH264m3u8Hw.this.mCurrentState = 5;
            VideoViewH264m3u8Hw.this.StateChange(VideoViewH264m3u8Hw.this.mCurrentState);
            VideoViewH264m3u8Hw.this.mTargetState = 5;
            if (VideoViewH264m3u8Hw.this.mMediaController != null) {
                VideoViewH264m3u8Hw.this.mMediaController.hide();
            }
            if (VideoViewH264m3u8Hw.this.mOnCompletionListener != null) {
                VideoViewH264m3u8Hw.this.mOnCompletionListener.onCompletion(VideoViewH264m3u8Hw.this.mMediaPlayer);
            }
            VideoViewH264m3u8Hw.this.pause();
            VideoViewH264m3u8Hw.this.release(true);
        }
    };

    private WeakReference<Context> mContext;

    private int mCurrentBufferPercentage;

    private int mCurrentState = 0;

    private OnDisplayListener mDisplayListener = new OnDisplayListener() {

        public void onDisplay(FFMpegPlayer mediaPlayer) {
            LogTag.i("硬解onDisplay()");
            String currentDate = Tools.getCurrentDate();
            if (VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener != null) {
                VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.DIAPLAY, currentDate);
            }
            VideoViewH264m3u8Hw.this.mCurrentState = 3;
            VideoViewH264m3u8Hw.this.StateChange(VideoViewH264m3u8Hw.this.mCurrentState);
        }
    };

    private int mDuration;

    private OnErrorListener mErrorListener = new OnErrorListener() {

        public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
            VideoViewH264m3u8Hw.this.mCurrentState = -1;
            VideoViewH264m3u8Hw.this.StateChange(VideoViewH264m3u8Hw.this.mCurrentState);
            VideoViewH264m3u8Hw.this.mTargetState = -1;
            if (VideoViewH264m3u8Hw.this.mMediaController != null) {
                VideoViewH264m3u8Hw.this.mMediaController.hide();
            }
            if (VideoViewH264m3u8Hw.this.mOnErrorListener != null) {
                VideoViewH264m3u8Hw.this.mOnErrorListener.onError(VideoViewH264m3u8Hw.this.mMediaPlayer, framework_err, impl_err);
            }
            String currentDate = Tools.getCurrentDate();
            if (VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener != null) {
                VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
            }
            LogTag.i("硬解失败");
            LogTag.i("framework_err:" + framework_err);
            return true;
        }
    };

    private OnFirstPlayLitener mFirstPlayLitener = new OnFirstPlayLitener() {

        public void onFirstPlay(FFMpegPlayer mediaPlayer, long startcosttime) {
            if (VideoViewH264m3u8Hw.this.mOnFirstPlayLitener != null) {
                VideoViewH264m3u8Hw.this.mOnFirstPlayLitener.onFirstPlay(mediaPlayer, startcosttime);
            }
        }
    };

    private OnHardDecodeErrorListner mHardDecodeErrorListner = new OnHardDecodeErrorListner() {

        public void onError(FFMpegPlayer mediaPlayer, int arg1, int arg2) {
            LogTag.i("OnHardDecodeErrorListner.onError(): framework_err=" + arg1 + ", impl_err=" + arg2);
            String currentDate = Tools.getCurrentDate();
            if (VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener != null) {
                VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.HARD_ERROR, currentDate);
            }
            if (VideoViewH264m3u8Hw.this.mOnHardDecodeErrorListner != null) {
                VideoViewH264m3u8Hw.this.mOnHardDecodeErrorListner.onError(mediaPlayer, arg1, arg2);
            }
            if (VideoViewH264m3u8Hw.this.mOnErrorListener != null) {
                VideoViewH264m3u8Hw.this.mOnErrorListener.onError(mediaPlayer, arg1, arg2);
            }
            if (VideoViewH264m3u8Hw.this.mContext.get() != null) {
                HttpRequestManager.getInstance((Context) VideoViewH264m3u8Hw.this.mContext.get()).hardDecodeReport(VideoViewH264m3u8Hw.this.mPlayerUrl.mVid, VideoViewH264m3u8Hw.this.mUri.toString(), 0, arg1, VideoViewH264m3u8Hw.this.mPlayerUrl.mStreamType, 1);
            }
        }
    };

    private OnInfoListener mInfoListener = new OnInfoListener() {

        public boolean onInfo(MediaPlayer mp, int what, int extra) {
            LogTag.i("onInfo+++" + what + "extra+++" + extra);
            if (VideoViewH264m3u8Hw.this.mOnInfoListener != null) {
                VideoViewH264m3u8Hw.this.mOnInfoListener.onInfo(mp, what, extra);
            }
            return false;
        }
    };

    private int mInitPostion = 0;

    private String mLastUrl;

    private MediaController mMediaController;

    private FFMpegPlayer mMediaPlayer = null;

    private OnAdNumberListener mOnAdNumberListener;

    private OnBlockListener mOnBlockListener;

    private OnBufferingUpdateListener mOnBufferingUpdateListener;

    private OnCacheListener mOnCacheListener;

    private OnCompletionListener mOnCompletionListener;

    private OnErrorListener mOnErrorListener;

    private OnFirstPlayLitener mOnFirstPlayLitener;

    private OnHardDecodeErrorListner mOnHardDecodeErrorListner;

    private OnInfoListener mOnInfoListener;

    private OnMediaStateTimeListener mOnMediaStateTimeListener;

    private OnPreparedListener mOnPreparedListener;

    private OnSeekCompleteListener mOnSeekCompleteListener;

    private OnSuccessListener mOnSuccessListener;

    private OnVideoSizeChangedListener mOnVideoSizeChangedListener;

    private PlayUrl mPlayerUrl;

    OnPreparedListener mPreparedListener = new OnPreparedListener() {

        public void onPrepared(MediaPlayer mp) {
            LogTag.i("onPrepared()");
            String currentDate = Tools.getCurrentDate();
            if (VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener != null) {
                VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
            }
            VideoViewH264m3u8Hw.this.mCurrentState = 2;
            VideoViewH264m3u8Hw.this.StateChange(VideoViewH264m3u8Hw.this.mCurrentState);
            VideoViewH264m3u8Hw videoViewH264m3u8Hw = VideoViewH264m3u8Hw.this;
            VideoViewH264m3u8Hw videoViewH264m3u8Hw2 = VideoViewH264m3u8Hw.this;
            VideoViewH264m3u8Hw.this.mCanSeekForward = true;
            videoViewH264m3u8Hw2.mCanSeekBack = true;
            videoViewH264m3u8Hw.mCanPause = true;
            if (VideoViewH264m3u8Hw.this.mOnPreparedListener != null) {
                VideoViewH264m3u8Hw.this.mOnPreparedListener.onPrepared(VideoViewH264m3u8Hw.this.mMediaPlayer);
            }
            VideoViewH264m3u8Hw.this.mLastUrl = ((FFMpegPlayer) mp).getLastUrl();
            VideoViewH264m3u8Hw.this.mVersion = ((FFMpegPlayer) mp).getVersion();
            if (VideoViewH264m3u8Hw.this.mMediaController != null) {
                VideoViewH264m3u8Hw.this.mMediaController.setEnabled(true);
            }
            int seekToPosition = VideoViewH264m3u8Hw.this.mSeekWhenPrepared;
            if (seekToPosition != 0) {
                VideoViewH264m3u8Hw.this.seekTo(seekToPosition);
            }
            VideoViewH264m3u8Hw.this.mVideoWidth = mp.getVideoWidth();
            VideoViewH264m3u8Hw.this.mVideoHeight = mp.getVideoHeight();
            if (VideoViewH264m3u8Hw.this.mVideoWidth == 0 || VideoViewH264m3u8Hw.this.mVideoHeight == 0) {
                if (VideoViewH264m3u8Hw.this.mTargetState == 3) {
                    VideoViewH264m3u8Hw.this.start();
                }
            } else if (VideoViewH264m3u8Hw.this.mSurfaceWidth != VideoViewH264m3u8Hw.this.mVideoWidth || VideoViewH264m3u8Hw.this.mSurfaceHeight != VideoViewH264m3u8Hw.this.mVideoHeight) {
                VideoViewH264m3u8Hw.this.getHolder().setFixedSize(VideoViewH264m3u8Hw.this.mVideoWidth, VideoViewH264m3u8Hw.this.mVideoHeight);
            } else if (VideoViewH264m3u8Hw.this.mTargetState == 3) {
                VideoViewH264m3u8Hw.this.start();
                if (VideoViewH264m3u8Hw.this.mMediaController != null) {
                    VideoViewH264m3u8Hw.this.mMediaController.show();
                }
            } else if (!VideoViewH264m3u8Hw.this.isPlaying()) {
                if ((seekToPosition != 0 || VideoViewH264m3u8Hw.this.getCurrentPosition() > 0) && VideoViewH264m3u8Hw.this.mMediaController != null) {
                    VideoViewH264m3u8Hw.this.mMediaController.show(0);
                }
            }
        }
    };

    private int mRatioType = -1;

    Callback mSHCallback = new Callback() {

        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
            LogTag.i(VideoViewH264m3u8Hw.TAG, "surfaceChanged(), w=" + w + " h=" + h);
            VideoViewH264m3u8Hw.this.mSurfaceWidth = w;
            VideoViewH264m3u8Hw.this.mSurfaceHeight = h;
            boolean isValidState;
            if (VideoViewH264m3u8Hw.this.mTargetState == 3) {
                isValidState = true;
            } else {
                isValidState = false;
            }
            boolean hasValidSize;
            if (VideoViewH264m3u8Hw.this.mVideoWidth == w && VideoViewH264m3u8Hw.this.mVideoHeight == h) {
                hasValidSize = true;
            } else {
                hasValidSize = false;
            }
            if (VideoViewH264m3u8Hw.this.mMediaPlayer != null && isValidState && hasValidSize) {
                if (VideoViewH264m3u8Hw.this.mSeekWhenPrepared != 0) {
                    VideoViewH264m3u8Hw.this.seekTo(VideoViewH264m3u8Hw.this.mSeekWhenPrepared);
                }
                VideoViewH264m3u8Hw.this.start();
                if (VideoViewH264m3u8Hw.this.mMediaController != null) {
                    VideoViewH264m3u8Hw.this.mMediaController.show();
                }
            }
        }

        public void surfaceCreated(SurfaceHolder holder) {
            if (VideoViewH264m3u8Hw.this.mSurfaceHolder == null) {
                VideoViewH264m3u8Hw.this.mSurfaceHolder = holder;
                LogTag.i(VideoViewH264m3u8Hw.TAG, "mSHCallback:surfaceCreated()->openVideo()");
                VideoViewH264m3u8Hw.this.openVideo();
            }
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            LogTag.i(VideoViewH264m3u8Hw.TAG, "mSHCallback:surfaceDestroyed()");
            VideoViewH264m3u8Hw.this.mSurfaceHolder = null;
            if (VideoViewH264m3u8Hw.this.mMediaController != null) {
                VideoViewH264m3u8Hw.this.mMediaController.hide();
            }
            VideoViewH264m3u8Hw.this.lastSeekWhenDestoryed = VideoViewH264m3u8Hw.this.getCurrentPosition();
            VideoViewH264m3u8Hw.this.release(false);
        }
    };

    private OnSeekCompleteListener mSeekCompleteListener = new OnSeekCompleteListener() {

        public void onSeekComplete(MediaPlayer mp) {
            if (VideoViewH264m3u8Hw.this.mOnSeekCompleteListener != null) {
                VideoViewH264m3u8Hw.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264m3u8Hw.this.mMediaPlayer);
            }
        }
    };

    private int mSeekWhenPrepared;

    OnVideoSizeChangedListener mSizeChangedListener = new OnVideoSizeChangedListener() {

        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
            VideoViewH264m3u8Hw.this.mVideoWidth = mp.getVideoWidth();
            VideoViewH264m3u8Hw.this.mVideoHeight = mp.getVideoHeight();
            if (!(VideoViewH264m3u8Hw.this.mVideoWidth == 0 || VideoViewH264m3u8Hw.this.mVideoHeight == 0)) {
                VideoViewH264m3u8Hw.this.getHolder().setFixedSize(VideoViewH264m3u8Hw.this.mVideoWidth, VideoViewH264m3u8Hw.this.mVideoHeight);
            }
            if (VideoViewH264m3u8Hw.this.mOnVideoSizeChangedListener != null) {
                VideoViewH264m3u8Hw.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, VideoViewH264m3u8Hw.this.mVideoWidth, VideoViewH264m3u8Hw.this.mVideoHeight);
            }
        }
    };

    private int mSourceType = 0;

    private OnSuccessListener mSuccessListener = new OnSuccessListener() {

        public void onSuccess() {
            if (VideoViewH264m3u8Hw.this.mOnSuccessListener != null) {
                VideoViewH264m3u8Hw.this.mOnSuccessListener.onSuccess();
            }
            LogTag.i("硬解成功");
            if (VideoViewH264m3u8Hw.this.mContext.get() != null) {
                HttpRequestManager.getInstance((Context) VideoViewH264m3u8Hw.this.mContext.get()).hardDecodeReport(VideoViewH264m3u8Hw.this.mPlayerUrl.mVid, VideoViewH264m3u8Hw.this.mUri.toString(), 1, -1, VideoViewH264m3u8Hw.this.mPlayerUrl.mStreamType, 1);
            }
        }
    };

    private int mSurfaceHeight;

    private SurfaceHolder mSurfaceHolder = null;

    private int mSurfaceWidth;

    private int mTargetState = 0;

    private Uri mUri;

    private String mVersion;

    private int mVideoHeight;

    private OnVideoViewStateChangeListener mVideoViewStateChangeListener;

    private int mVideoWidth;

    private int mVolumevalue = 1;

    private clreplaced CacheTime {

        double block_cache;

        double start_cache;

        public CacheTime(double start_cache, double block_cache) {
            this.start_cache = start_cache;
            this.block_cache = block_cache;
        }
    }

    public VideoViewH264m3u8Hw(Context context) {
        super(context);
        this.mContext = new WeakReference(context);
        initVideoView();
    }

    public VideoViewH264m3u8Hw(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext = new WeakReference(context);
        initVideoView();
    }

    private void initVideoView() {
        this.mVideoWidth = 0;
        this.mVideoHeight = 0;
        getHolder().addCallback(this.mSHCallback);
        getHolder().setType(3);
        setFocusable(true);
        setFocusableInTouchMode(true);
        requestFocus();
        this.mCurrentState = 0;
        StateChange(this.mCurrentState);
        this.mTargetState = 0;
    }

    public void setVideoPath(String videoPath) {
        this.mPlayerUrl = new PlayUrl();
        this.mPlayerUrl.setVid(-1);
        this.mPlayerUrl.setUrl(videoPath);
        this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
        setVideoURI(Uri.parse(videoPath));
    }

    public void setVideoPath(String path, Map<String, String> map) {
    }

    public void setVideoURI(Uri uri) {
        String currentDate = Tools.getCurrentDate();
        if (this.mOnMediaStateTimeListener != null) {
            this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
        }
        this.mUri = uri;
        this.mSeekWhenPrepared = 0;
        LogTag.i(TAG, "setVideoURI()->openVideo()");
        openVideo();
        requestLayout();
        invalidate();
        LogTag.i(TAG, "uri=" + this.mUri.toString());
    }

    public boolean canPause() {
        return this.mCanPause;
    }

    public boolean canSeekBackward() {
        return this.mCanSeekBack;
    }

    public boolean canSeekForward() {
        return this.mCanSeekForward;
    }

    public int getBufferPercentage() {
        if (this.mMediaPlayer != null) {
            return this.mCurrentBufferPercentage;
        }
        return 0;
    }

    public int getCurrentPosition() {
        if (isInPlaybackState()) {
            return this.mMediaPlayer.getCurrentPosition();
        }
        return 0;
    }

    public int getDuration() {
        if (!isInPlaybackState()) {
            this.mDuration = -1;
            return this.mDuration;
        } else if (this.mDuration > 0) {
            return this.mDuration;
        } else {
            this.mDuration = this.mMediaPlayer.getDuration();
            return this.mDuration;
        }
    }

    public String getSkipLastURL() {
        return this.mLastUrl;
    }

    public String getVersion() {
        return this.mVersion;
    }

    public int getViewWidth() {
        return getLayoutParams().width;
    }

    public int getViewHeight() {
        return getLayoutParams().height;
    }

    public void start() {
        if (this.mContext.get() != null) {
            HttpRequestManager.getInstance((Context) this.mContext.get()).requestCapability();
            if (this.enforcementWait || this.enforcementPause) {
                StateChange(7);
            } else if (isInPlaybackState()) {
                LogTag.i("硬解开始播放");
                this.mMediaPlayer.start();
            }
            this.mTargetState = 3;
        }
    }

    public void pause() {
        if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
            LogTag.i("pause()");
            this.mMediaPlayer.pause();
            this.mCurrentState = 4;
            StateChange(this.mCurrentState);
        }
        this.mTargetState = 4;
    }

    public void seekTo(int mesc) {
        if (isInPlaybackState()) {
            this.mMediaPlayer.seekTo(mesc);
            this.mSeekWhenPrepared = 0;
            this.lastSeekWhenDestoryed = 0;
            return;
        }
        this.mSeekWhenPrepared = mesc;
        this.lastSeekWhenDestoryed = 0;
    }

    public void forward() {
        seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
    }

    public void rewind() {
        seekTo(getCurrentPosition() - 15000);
    }

    public void stopPlayback() {
        stopPlayback(false);
    }

    public void stopPlayback(boolean isRemoveCallBack) {
        StateChange(6);
        if (this.mMediaPlayer != null) {
            String currentDateStop = Tools.getCurrentDate();
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
            }
            try {
                this.mMediaPlayer.stop();
            } catch (Exception e) {
                LogTag.i(TAG, "hard decode native player has already null");
            }
            if (isRemoveCallBack) {
                getHolder().removeCallback(this.mSHCallback);
            }
            String currentDateRelease = Tools.getCurrentDate();
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            try {
                this.mMediaPlayer.release();
            } catch (Exception e2) {
                LogTag.i(TAG, "hard decode native player has already null");
            }
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            this.mTargetState = 0;
            setVisibility(4);
        }
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
        int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
        if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
            switch(this.mRatioType) {
                case -1:
                    if (this.mVideoWidth * height < this.mVideoHeight * width) {
                        if (this.mVideoWidth * height < this.mVideoHeight * width) {
                            width = (this.mVideoWidth * height) / this.mVideoHeight;
                            break;
                        }
                    }
                    height = (this.mVideoHeight * width) / this.mVideoWidth;
                    break;
                    break;
                case 1:
                    if (height * 4 <= width * 3) {
                        if (height * 4 < width * 3) {
                            width = (height * 4) / 3;
                            break;
                        }
                    }
                    height = (width * 3) / 4;
                    break;
                    break;
                case 2:
                    if (height * 16 <= width * 9) {
                        if (height * 16 < width * 9) {
                            width = (height * 16) / 9;
                            break;
                        }
                    }
                    height = (width * 9) / 16;
                    break;
                    break;
            }
        }
        setMeasuredDimension(width, height);
    }

    public void adjust(int type) {
        this.mRatioType = type;
        invalateScreenSize();
    }

    private void invalateScreenSize() {
        setLayoutParams((LayoutParams) getLayoutParams());
    }

    public int resolveAdjustedSize(int desiredSize, int measureSpec) {
        int result = desiredSize;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        switch(specMode) {
            case Integer.MIN_VALUE:
                return Math.min(desiredSize, specSize);
            case 0:
                return desiredSize;
            case 1073741824:
                return specSize;
            default:
                return result;
        }
    }

    public boolean isInPlaybackState() {
        return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
    }

    private void openVideo() {
        if (this.mUri == null || this.mSurfaceHolder == null || this.mContext.get() == null) {
            setVisibility(0);
            return;
        }
        LogTag.i(TAG, "openVideo()-> release(false)");
        release(false);
        try {
            String currentDate = Tools.getCurrentDate();
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
            }
            this.mMediaPlayer = new FFMpegPlayer((Context) this.mContext.get());
            this.mMediaPlayer.setHardwareDecode(1);
            this.mMediaPlayer.setHwCapbility(CodecWrapper.getProfile(), CodecWrapper.getAVCLevel());
            this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
            this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
            this.mDuration = -1;
            this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
            this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
            this.mMediaPlayer.setOnSuccessListener(this.mSuccessListener);
            this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
            this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
            this.mMediaPlayer.setOnAdNumberListener(this.mAdNumberListener);
            this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
            this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
            this.mMediaPlayer.setOnBlockListener(this.mBlockListener);
            this.mMediaPlayer.setOnCacheListener(this.mCacheListener);
            this.mMediaPlayer.setOnFirstPlayListener(this.mFirstPlayLitener);
            this.mMediaPlayer.setOnDisplayListener(this.mDisplayListener);
            this.mMediaPlayer.setOnHardDecoddErrorListener(this.mHardDecodeErrorListner);
            this.mCurrentBufferPercentage = 0;
            this.mMediaPlayer.setDataSource((Context) this.mContext.get(), this.mUri);
            this.mMediaPlayer.setVolume(this.mVolumevalue);
            this.mMediaPlayer.setInitPosition(this.mInitPostion);
            if (this.mCacheTime != null) {
                this.mMediaPlayer.setCacheTime(this.mCacheTime.start_cache, this.mCacheTime.block_cache);
            }
            this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
            this.mMediaPlayer.setAudioStreamType(3);
            this.mMediaPlayer.setScreenOnWhilePlaying(true);
            this.mMediaPlayer.prepareAsync();
            this.mCurrentState = 1;
            attachMediaController();
        } catch (IllegalStateException ex) {
            LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex);
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        } catch (IllegalArgumentException e) {
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        } catch (IOException e2) {
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        }
    }

    public void setMediaController(MediaController controller) {
        if (this.mMediaController != null) {
            this.mMediaController.hide();
        }
        this.mMediaController = controller;
        attachMediaController();
    }

    private void attachMediaController() {
        if (this.mMediaPlayer != null && this.mMediaController != null) {
            View anchorView;
            this.mMediaController.setMediaPlayer(this);
            if (getParent() instanceof View) {
                anchorView = (View) getParent();
            } else {
                anchorView = this;
            }
            this.mMediaController.setAnchorView(anchorView);
            this.mMediaController.setEnabled(isInPlaybackState());
        }
    }

    private void setVideoViewScale(int width, int height) {
        LayoutParams lp = (LayoutParams) getLayoutParams();
        lp.height = height;
        lp.width = width;
        setLayoutParams(lp);
    }

    private void release(boolean cleartargetstate) {
        LogTag.i(TAG, "release(boolean)" + (cleartargetstate ? "true" : "false"));
        if (this.mMediaPlayer != null) {
            LogTag.i(TAG, "release(boolean)" + (cleartargetstate ? "true" : "false") + "(mMediaPlayer != null)");
            String currentDateStop = Tools.getCurrentDate();
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
            }
            this.mMediaPlayer.stop();
            String currentDateRelease = Tools.getCurrentDate();
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            if (cleartargetstate) {
                this.mTargetState = 0;
            }
        }
    }

    public boolean onTouchEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onTrackballEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        boolean isKeyCodeSupported;
        if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
            isKeyCodeSupported = false;
        } else {
            isKeyCodeSupported = true;
        }
        if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
            if (keyCode == 79 || keyCode == 85) {
                if (this.mMediaPlayer.isPlaying()) {
                    pause();
                    this.mMediaController.show();
                    return true;
                }
                start();
                this.mMediaController.hide();
                return true;
            } else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
                pause();
                this.mMediaController.show();
            } else {
                toggleMediaControlsVisiblity();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    private void toggleMediaControlsVisiblity() {
        if (this.mMediaController.isShowing()) {
            this.mMediaController.hide();
        } else {
            this.mMediaController.show();
        }
    }

    public boolean isPlaying() {
        return isInPlaybackState() && this.mMediaPlayer.isPlaying();
    }

    public boolean isPaused() {
        return this.mCurrentState == 4;
    }

    public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
        this.mOnSeekCompleteListener = l;
    }

    public void setOnAdNumberListener(OnAdNumberListener l) {
        this.mOnAdNumberListener = l;
    }

    public int getLastSeekWhenDestoryed() {
        return this.lastSeekWhenDestoryed;
    }

    public int getAudioSessionId() {
        return 0;
    }

    public boolean isEnforcementWait() {
        return this.enforcementWait;
    }

    public void setEnforcementWait(boolean enforcementWait) {
        this.enforcementWait = enforcementWait;
    }

    public boolean isEnforcementPause() {
        return this.enforcementPause;
    }

    public void setEnforcementPause(boolean enforcementPause) {
        this.enforcementPause = enforcementPause;
    }

    public View getView() {
        return this;
    }

    private void StateChange(int mCurrentState) {
        if (this.mVideoViewStateChangeListener != null) {
            this.mVideoViewStateChangeListener.onChange(mCurrentState);
        }
    }

    public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener listener) {
        this.mVideoViewStateChangeListener = listener;
    }

    public void setOnInfoListener(OnInfoListener l) {
        this.mOnInfoListener = l;
    }

    public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
        this.mOnVideoSizeChangedListener = l;
    }

    public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
        this.mOnBufferingUpdateListener = l;
    }

    public void setOnPreparedListener(OnPreparedListener l) {
        this.mOnPreparedListener = l;
    }

    public void setOnCompletionListener(OnCompletionListener l) {
        this.mOnCompletionListener = l;
    }

    public void setOnErrorListener(OnErrorListener l) {
        this.mOnErrorListener = l;
    }

    public void setOnSuccessListener(OnSuccessListener l) {
        this.mOnSuccessListener = l;
    }

    public void setVideoPlayUrl(PlayUrl url) {
        this.mPlayerUrl = url;
        setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
    }

    public void setCacheSize(int video_size, int audio_size, int picture_size, int startpic_size) {
    }

    public void setOnBlockListener(OnBlockListener l) {
        this.mOnBlockListener = l;
    }

    public void setOnCacheListener(OnCacheListener l) {
        this.mOnCacheListener = l;
    }

    public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
        this.mOnMediaStateTimeListener = l;
    }

    public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
        this.mOnHardDecodeErrorListner = l;
    }

    public void setOnFirstPlayListener(OnFirstPlayLitener l) {
        this.mOnFirstPlayLitener = l;
    }

    public int setSourceType(int sourceType) {
        return 0;
    }

    public int setMachineInfomation(float ScreenResolution) {
        return 0;
    }

    public int setOneFingertouchInfomation(float begin_x, float begin_y, float end_x, float end_y) {
        return 0;
    }

    public int setTwoFingertouchInfomation(float begin_x0, float begin_y0, float begin_x1, float begin_y1, float end_x0, float end_y0, float end_x1, float end_y1) {
        return 0;
    }

    public int setgravity_yroInfomation(float gravity_yro_x, float gravity_yro_y, float gravity_yro_z) {
        return 0;
    }

    public int setGravityInfomation(float gravity_x, float gravity_y, float gravity_z) {
        return 0;
    }

    public int setgravity_yroValidInfomation(boolean gravityValid) {
        return 0;
    }

    public int setAngleInit() {
        return 0;
    }

    public int setTwoFingerZoom(float zoom) {
        return 0;
    }

    public void setCacheTime(double start_cache, double block_cache) {
        if (this.mCacheTime == null) {
            this.mCacheTime = new CacheTime(start_cache, block_cache);
        }
        if (this.mMediaPlayer != null) {
            this.mMediaPlayer.setCacheTime(start_cache, block_cache);
        }
    }

    public void setInitPosition(int msec) {
        this.mInitPostion = msec;
        if (this.mMediaPlayer != null) {
            this.mMediaPlayer.setInitPosition(msec);
        }
    }

    public void setVolume(int volume) {
        this.mVolumevalue = volume;
        if (this.mMediaPlayer != null) {
            this.mMediaPlayer.setVolume(volume);
        }
    }

    public void processSensorEvent(SensorEvent sensorEvent) {
    }
}

14 Source : Activity_VideoSurveillance.java
with Apache License 2.0
from yangxch

private void initView() {
    pg = new ProgressDialog(Activity_VideoSurveillance.this);
    pg.setMessage("缓冲中...");
    pg.show();
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setreplacedle("");
    TextView toolbarText = (TextView) findViewById(R.id.toolbar_text);
    toolbarText.setText("视频监控");
    setSupportActionBar(toolbar);
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
    if (!Util.checkNetwork(this)) {
        return;
    }
    videoViewVideo = (VideoView) findViewById(R.id.videoViewVideo);
    try {
        // 设置视频控制器
        MediaController mediacontroller = new MediaController(Activity_VideoSurveillance.this);
        mediacontroller.setAnchorView(videoViewVideo);
        videoViewVideo.setMediaController(mediacontroller);
        // 视频来源
        videoViewVideo.setVideoURI(Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"));
    } catch (Exception e) {
        e.printStackTrace();
        pg.dismiss();
    }
    videoViewVideo.requestFocus();
    videoViewVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

        // Close the progress bar and play the video
        public void onPrepared(MediaPlayer mp) {
            pg.dismiss();
            // 开始播放视频
            videoViewVideo.start();
        }
    });
}

14 Source : VRMediaController.java
with Apache License 2.0
from wheat7

/**
 * Created by wheat7 on 26/07/2017.
 */
public clreplaced VRMediaController extends FrameLayout {

    MediaController mMediaController = new MediaController(getContext());

    private final static String TAG = "VRMediaController";

    private static final int FADE_OUT = 1;

    private static final int SHOW_PROGRESS = 2;

    private static final int sDefaultTimeout = 3000;

    private static final int VR_INTERACTIVE_MODE_GYROSCOPE = 4;

    private static final int VR_INTERACTIVE_MODE_TOUCH = 3;

    private static final int VR_DISPLAY_MODE_GLreplaced = 102;

    private static final int VR_DISPLAY_MODE_NORMAL = 101;

    private int interactiveMode = VR_INTERACTIVE_MODE_GYROSCOPE;

    private int displayMode = VR_DISPLAY_MODE_GLreplaced;

    private MediaPlayerControl mPlayer;

    private final Context mContext;

    private View mAnchor;

    private View mRoot;

    private PopupWindow mWindow;

    private ProgressBar mProgress;

    private TextView mEndTime, mCurrentTime;

    private boolean mShowing;

    private boolean mDragging;

    private boolean mFromXml;

    StringBuilder mFormatBuilder;

    Formatter mFormatter;

    private ImageView mPauseButton;

    private ImageView mVRInteractiveModeButton;

    private ImageView mVRDisplayModeButton;

    private int mAnimStyle;

    private Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            long pos;
            switch(msg.what) {
                case FADE_OUT:
                    hide();
                    break;
                case SHOW_PROGRESS:
                    pos = setProgress();
                    if (!mDragging && mShowing) {
                        msg = obtainMessage(SHOW_PROGRESS);
                        sendMessageDelayed(msg, 1000 - (pos % 1000));
                        updatePausePlay();
                    }
                    break;
            }
        }
    };

    public VRMediaController(Context context, AttributeSet attrs) {
        super(context, attrs);
        mRoot = this;
        mContext = context;
        mFromXml = true;
    }

    @Override
    public void onFinishInflate() {
        super.onFinishInflate();
        if (mRoot != null)
            initControllerView(mRoot);
    }

    public VRMediaController(Context context, boolean useFastForward) {
        super(context);
        mContext = context;
        initFloatingWindow();
    }

    public VRMediaController(Context context) {
        this(context, true);
    }

    private void initFloatingWindow() {
        mWindow = new PopupWindow(mContext);
        mWindow.setFocusable(false);
        mWindow.setBackgroundDrawable(null);
        mWindow.setOutsideTouchable(true);
        mAnimStyle = android.R.style.Animation;
        requestFocus();
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public void setWindowLayoutType() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            try {
                mAnchor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
                Method setWindowLayoutType = PopupWindow.clreplaced.getMethod("setWindowLayoutType", new Clreplaced[] { int.clreplaced });
                setWindowLayoutType.invoke(mWindow, WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG);
            } catch (Exception e) {
            }
        }
    }

    private final OnTouchListener mTouchListener = new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                if (mShowing) {
                    hide();
                }
            }
            return false;
        }
    };

    public void setMediaPlayer(MediaPlayerControl player) {
        mPlayer = player;
        updatePausePlay();
    }

    /**
     * Set the view that acts as the anchor for the control view.
     * This can for example be a VideoView, or your Activity's main view.
     * When VideoView calls this method, it will use the VideoView's parent
     * as the anchor.
     *
     * @param view The view to which to anchor the controller when it is visible.
     */
    public void setAnchorView(View view) {
        mAnchor = view;
        if (!mFromXml) {
            removeAllViews();
            mRoot = makeControllerView();
            mWindow.setContentView(mRoot);
            mWindow.setWidth(LayoutParams.MATCH_PARENT);
            mWindow.setHeight(LayoutParams.WRAP_CONTENT);
        }
        initControllerView(mRoot);
    }

    /**
     * Create the view that holds the widgets that control playback.
     * Derived clreplacedes can override this to create their own.
     *
     * @return The controller view.
     * @hide This doesn't work as advertised
     */
    protected View makeControllerView() {
        return ((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(getResources().getIdentifier("media_controller_vr", "layout", mContext.getPackageName()), this);
    }

    private void initControllerView(View v) {
        mPauseButton = (ImageView) v.findViewById(getResources().getIdentifier("mediacontroller_play_pause", "id", mContext.getPackageName()));
        if (mPauseButton != null) {
            mPauseButton.requestFocus();
            mPauseButton.setOnClickListener(mPauseListener);
        }
        mVRInteractiveModeButton = (ImageView) v.findViewById(getResources().getIdentifier("mediacontroller_interactive", "id", mContext.getPackageName()));
        if (mVRInteractiveModeButton != null) {
            mVRInteractiveModeButton.requestFocus();
            mVRInteractiveModeButton.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    mVRControl.onInteractiveClick(interactiveMode);
                    updateInteractive();
                }
            });
        }
        mVRDisplayModeButton = (ImageView) v.findViewById(getResources().getIdentifier("mediacontroller_display", "id", mContext.getPackageName()));
        if (mVRDisplayModeButton != null) {
            mVRDisplayModeButton.requestFocus();
            mVRDisplayModeButton.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    mVRControl.onDisplayClick(displayMode);
                    updateDisplay();
                }
            });
        }
        mProgress = (SeekBar) v.findViewById(getResources().getIdentifier("mediacontroller_seekbar", "id", mContext.getPackageName()));
        if (mProgress != null) {
            if (mProgress instanceof SeekBar) {
                SeekBar seeker = (SeekBar) mProgress;
                seeker.setOnSeekBarChangeListener(mSeekListener);
            }
            mProgress.setMax(1000);
        }
        mEndTime = (TextView) v.findViewById(getResources().getIdentifier("mediacontroller_time_total", "id", mContext.getPackageName()));
        mCurrentTime = (TextView) v.findViewById(getResources().getIdentifier("mediacontroller_time_current", "id", mContext.getPackageName()));
        mFormatBuilder = new StringBuilder();
        mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
    }

    /**
     * Show the controller on screen. It will go away
     * automatically after 3 seconds of inactivity.
     */
    public void show() {
        show(sDefaultTimeout);
    }

    /**
     * Show the controller on screen. It will go away
     * automatically after 'timeout' milliseconds of inactivity.
     *
     * @param timeout The timeout in milliseconds. Use 0 to show
     *                the controller until hide() is called.
     */
    public void show(int timeout) {
        if (!mShowing && mAnchor != null) {
            setProgress();
            if (mPauseButton != null) {
                mPauseButton.requestFocus();
            }
            // disableUnsupportedButtons();
            // updateFloatingWindowLayout();
            // mWindowManager.addView(mDecor, mDecorLayoutParams);
            if (mFromXml) {
                setVisibility(View.VISIBLE);
            } else {
                int[] location = new int[2];
                mAnchor.getLocationOnScreen(location);
                Rect anchorRect = new Rect(location[0], location[1], location[0] + mAnchor.getWidth(), location[1]);
                mWindow.setAnimationStyle(mAnimStyle);
                // setWindowLayoutType();
                // mWindow.showAtLocation(mAnchor, Gravity.TOP, anchorRect.left, anchorRect.bottom);
                mWindow.showAsDropDown(mAnchor, 0, -getResources().getDimensionPixelOffset(getResources().getIdentifier("media_control_height", "dimen", mContext.getPackageName())));
            }
            if (mreplacedleView != null)
                mreplacedleView.setVisibility(View.VISIBLE);
            mShowing = true;
        }
        updatePausePlay();
        // cause the progress bar to be updated even if mShowing
        // was already true.  This happens, for example, if we're
        // paused with the progress bar showing the user hits play.
        // post(mShowProgress);
        mHandler.sendEmptyMessage(SHOW_PROGRESS);
        if (timeout != 0) {
            // removeCallbacks(mFadeOut);
            // postDelayed(mFadeOut, timeout);
            mHandler.removeMessages(FADE_OUT);
            mHandler.sendMessageDelayed(mHandler.obtainMessage(FADE_OUT), timeout);
        }
    }

    public boolean isShowing() {
        return mShowing;
    }

    /**
     * Remove the controller from the screen.
     */
    public void hide() {
        if (mAnchor == null)
            return;
        if (mShowing) {
            try {
                if (mFromXml) {
                    // removeCallbacks(mShowProgress);
                    mHandler.removeMessages(SHOW_PROGRESS);
                    setVisibility(View.GONE);
                } else {
                    mWindow.dismiss();
                    if (mreplacedleView != null)
                        mreplacedleView.setVisibility(View.GONE);
                }
            } catch (IllegalArgumentException ex) {
                Log.w("MediaController", "already removed");
            }
            Log.d(TAG, "hide");
            mShowing = false;
        }
    }

    // private final Runnable mFadeOut = new Runnable() {
    // @Override
    // public void run() {
    // Log.d(TAG, "fade," + "mShowing=:" + mShowing);
    // if (mShowing) hide();
    // 
    // }
    // };
    // 
    // private final Runnable mShowProgress = new Runnable() {
    // @Override
    // public void run() {
    // long pos = setProgress();
    // if (!mDragging && mShowing && mPlayer.isPlaying()) {
    // postDelayed(mShowProgress, 1000 - (pos % 1000));
    // }
    // }
    // };
    /**
     * Time Format
     *
     * @param timeMs
     * @return
     */
    private String stringForTime(long timeMs) {
        long totalSeconds = timeMs / 1000;
        long seconds = totalSeconds % 60;
        long minutes = (totalSeconds / 60) % 60;
        long hours = totalSeconds / 3600;
        mFormatBuilder.setLength(0);
        if (hours > 0) {
            return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
        } else {
            return mFormatter.format("%02d:%02d", minutes, seconds).toString();
        }
    }

    private long setProgress() {
        if (mPlayer == null || mDragging) {
            return 0;
        }
        long position = mPlayer.getCurrentPosition();
        long duration = mPlayer.getDuration();
        if (mProgress != null) {
            if (duration > 0) {
                // use long to avoid overflow
                long pos = 1000L * position / duration;
                mProgress.setProgress((int) pos);
            }
            int percent = mPlayer.getBufferPercentage();
            mProgress.setSecondaryProgress(percent * 10);
        }
        if (mEndTime != null)
            mEndTime.setText(stringForTime(duration));
        if (mCurrentTime != null)
            mCurrentTime.setText(stringForTime(position));
        return position;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // showe until hide is called
                show(0);
                break;
            case MotionEvent.ACTION_UP:
                // start timeout
                show(sDefaultTimeout);
                break;
            case MotionEvent.ACTION_CANCEL:
                hide();
                break;
            default:
                break;
        }
        return true;
    }

    @Override
    public boolean onTrackballEvent(MotionEvent ev) {
        show(sDefaultTimeout);
        return false;
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        int keyCode = event.getKeyCode();
        final boolean uniqueDown = event.getRepeatCount() == 0 && event.getAction() == KeyEvent.ACTION_DOWN;
        if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE || keyCode == KeyEvent.KEYCODE_SPACE) {
            if (uniqueDown) {
                doPauseResume();
                show(sDefaultTimeout);
                if (mPauseButton != null) {
                    mPauseButton.requestFocus();
                }
            }
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY) {
            if (uniqueDown && !mPlayer.isPlaying()) {
                mPlayer.start();
                updatePausePlay();
                show(sDefaultTimeout);
            }
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE) {
            if (uniqueDown && mPlayer.isPlaying()) {
                mPlayer.pause();
                updatePausePlay();
                show(sDefaultTimeout);
            }
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE || keyCode == KeyEvent.KEYCODE_CAMERA) {
            // don't show the controls for volume adjustment
            return super.dispatchKeyEvent(event);
        } else if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU) {
            if (uniqueDown) {
                hide();
            }
            return true;
        }
        show(sDefaultTimeout);
        return super.dispatchKeyEvent(event);
    }

    private final View.OnClickListener mPauseListener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            doPauseResume();
            show(sDefaultTimeout);
        }
    };

    private void updatePausePlay() {
        if (mRoot == null || mPauseButton == null)
            return;
        if (mPlayer.isPlaying())
            mPauseButton.setImageResource(getResources().getIdentifier("mediacontroller_pause", "drawable", mContext.getPackageName()));
        else
            mPauseButton.setImageResource(getResources().getIdentifier("mediacontroller_play", "drawable", mContext.getPackageName()));
    }

    private void doPauseResume() {
        if (mPlayer.isPlaying()) {
            mPlayer.pause();
        } else {
            mPlayer.start();
        }
        updatePausePlay();
    }

    // There are two scenarios that can trigger the seekbar listener to trigger:
    // 
    // The first is the user using the touchpad to adjust the posireplacedon of the
    // seekbar's thumb. In this case onStartTrackingTouch is called followed by
    // a number of onProgressChanged notifications, concluded by onStopTrackingTouch.
    // We're setting the field "mDragging" to true for the duration of the dragging
    // session to avoid jumps in the position in case of ongoing playback.
    // 
    // The second scenario involves the user operating the scroll ball, in this
    // case there WON'T BE onStartTrackingTouch/onStopTrackingTouch notifications,
    // we will simply apply the updated position without suspending regular updates.
    private final SeekBar.OnSeekBarChangeListener mSeekListener = new SeekBar.OnSeekBarChangeListener() {

        @Override
        public void onStartTrackingTouch(SeekBar bar) {
            show(3600000);
            mDragging = true;
            // By removing these pending progress messages we make sure
            // that a) we won't update the progress while the user adjusts
            // the seekbar and b) once the user is done dragging the thumb
            // we will post one of these messages to the queue again and
            // this ensures that there will be exactly one message queued up.
            // removeCallbacks(mShowProgress);
            mHandler.removeMessages(SHOW_PROGRESS);
        }

        @Override
        public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) {
            if (!fromuser) {
                // We're not interested in programmatically generated changes to
                // the progress bar's position.
                return;
            }
            long duration = mPlayer.getDuration();
            long newPosition = (duration * progress) / 1000L;
            mPlayer.seekTo((int) newPosition);
            if (mCurrentTime != null)
                mCurrentTime.setText(stringForTime((int) newPosition));
        }

        @Override
        public void onStopTrackingTouch(SeekBar bar) {
            mDragging = false;
            setProgress();
            updatePausePlay();
            show(sDefaultTimeout);
            // Ensure that progress is properly updated in the future,
            // the call to show() does not guarantee this because it is a
            // no-op if we are already showing.
            // post(mShowProgress);
            mHandler.sendEmptyMessageDelayed(SHOW_PROGRESS, 1000);
        }
    };

    @Override
    public void setEnabled(boolean enabled) {
        if (mPauseButton != null) {
            mPauseButton.setEnabled(enabled);
            if (mProgress != null) {
                mProgress.setEnabled(enabled);
            }
            // disableUnsupportedButtons();
            super.setEnabled(enabled);
        }
    }

    public interface MediaPlayerControl {

        void start();

        void pause();

        long getDuration();

        long getCurrentPosition();

        void seekTo(long pos);

        boolean isPlaying();

        int getBufferPercentage();
    }

    /*----------------------------------------Extend VR ------------------------------------------*/
    private VRControl mVRControl;

    public interface VRControl {

        void onInteractiveClick(int currentMode);

        void onDisplayClick(int currentMode);
    }

    public void setOnVRControlListener(VRControl vrControl) {
        mVRControl = vrControl;
    }

    private void updateInteractive() {
        if (mRoot == null || mVRInteractiveModeButton == null)
            return;
        if (interactiveMode == VR_INTERACTIVE_MODE_GYROSCOPE) {
            interactiveMode = VR_INTERACTIVE_MODE_TOUCH;
            mVRInteractiveModeButton.setImageResource(getResources().getIdentifier("ic_gyroscope", "drawable", mContext.getPackageName()));
        } else {
            interactiveMode = VR_INTERACTIVE_MODE_GYROSCOPE;
            mVRInteractiveModeButton.setImageResource(getResources().getIdentifier("ic_touch_mode", "drawable", mContext.getPackageName()));
        }
    }

    private void updateDisplay() {
        if (mRoot == null || mVRDisplayModeButton == null)
            return;
        if (displayMode == VR_DISPLAY_MODE_GLreplaced) {
            displayMode = VR_DISPLAY_MODE_NORMAL;
            mVRDisplayModeButton.setImageResource(getResources().getIdentifier("ic_vr_mode", "drawable", mContext.getPackageName()));
        } else {
            displayMode = VR_DISPLAY_MODE_GLreplaced;
            mVRDisplayModeButton.setImageResource(getResources().getIdentifier("ic_eye_mode", "drawable", mContext.getPackageName()));
        }
    }

    /*----------------------------------------Extend replacedle ------------------------------------------*/
    private View mreplacedleView;

    public void setreplacedleView(View v) {
        mreplacedleView = v;
    }
}

14 Source : VideoPlayer.java
with MIT License
from praharshjain

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    hideStatusBar();
    setContentView(R.layout.video_player);
    vw = findViewById(R.id.videoView);
    vw.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {

        @Override
        public void onSystemUiVisibilityChange(int i) {
            hideStatusBar();
        }
    });
    progressDialog = new ProgressDialog(this);
    showProgressBar();
    MediaController mc = new MediaController(this);
    mc.setAnchorView(vw);
    mc.setMediaPlayer(vw);
    Uri video = null;
    try {
        video = Uri.parse(getIntent().getStringExtra("file"));
    } catch (Exception e) {
        finish();
    }
    vw.setVideoURI(video);
    vw.setMediaController(mc);
    vw.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mp) {
            progressDialog.dismiss();
        }
    });
    vw.requestFocus();
    vw.start();
}

14 Source : PreviewActivity.java
with MIT License
from memfis19

/**
 * Created by memfis on 7/6/16.
 */
public clreplaced PreviewActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "PreviewActivity";

    private final static String MEDIA_ACTION_ARG = "media_action_arg";

    private final static String FILE_PATH_ARG = "file_path_arg";

    private final static String RESPONSE_CODE_ARG = "response_code_arg";

    private final static String VIDEO_POSITION_ARG = "current_video_position";

    private final static String VIDEO_IS_PLAYED_ARG = "is_played";

    private final static String MIME_TYPE_VIDEO = "video";

    private final static String MIME_TYPE_IMAGE = "image";

    private int mediaAction;

    private String previewFilePath;

    private SurfaceView surfaceView;

    private FrameLayout photoPreviewContainer;

    private ImageView imagePreview;

    private ViewGroup buttonPanel;

    private AspectFrameLayout videoPreviewContainer;

    private View cropMediaAction;

    private TextView ratioChanger;

    private MediaController mediaController;

    private MediaPlayer mediaPlayer;

    private int currentPlaybackPosition = 0;

    private boolean isVideoPlaying = true;

    private int currentRatioIndex = 0;

    private float[] ratios;

    private String[] ratioLabels;

    private SurfaceHolder.Callback surfaceCallbacks = new SurfaceHolder.Callback() {

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            showVideoPreview(holder);
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        }
    };

    private MediaController.MediaPlayerControl MediaPlayerControlImpl = new MediaController.MediaPlayerControl() {

        @Override
        public void start() {
            mediaPlayer.start();
        }

        @Override
        public void pause() {
            mediaPlayer.pause();
        }

        @Override
        public int getDuration() {
            return mediaPlayer.getDuration();
        }

        @Override
        public int getCurrentPosition() {
            return mediaPlayer.getCurrentPosition();
        }

        @Override
        public void seekTo(int pos) {
            mediaPlayer.seekTo(pos);
        }

        @Override
        public boolean isPlaying() {
            return mediaPlayer.isPlaying();
        }

        @Override
        public int getBufferPercentage() {
            return 0;
        }

        @Override
        public boolean canPause() {
            return true;
        }

        @Override
        public boolean canSeekBackward() {
            return true;
        }

        @Override
        public boolean canSeekForward() {
            return true;
        }

        @Override
        public int getAudioSessionId() {
            return mediaPlayer.getAudioSessionId();
        }
    };

    public static Intent newIntent(Context context, @AnncaConfiguration.MediaAction int mediaAction, String filePath) {
        return new Intent(context, PreviewActivity.clreplaced).putExtra(MEDIA_ACTION_ARG, mediaAction).putExtra(FILE_PATH_ARG, filePath);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_preview);
        String originalRatioLabel = getString(R.string.preview_controls_original_ratio_label);
        ratioLabels = new String[] { originalRatioLabel, "1:1", "4:3", "16:9" };
        ratios = new float[] { 0f, 1f, 4f / 3f, 16f / 9f };
        surfaceView = (SurfaceView) findViewById(R.id.video_preview);
        surfaceView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (mediaController == null)
                    return false;
                if (mediaController.isShowing()) {
                    mediaController.hide();
                    showButtonPanel(true);
                } else {
                    showButtonPanel(false);
                    mediaController.show();
                }
                return false;
            }
        });
        videoPreviewContainer = (AspectFrameLayout) findViewById(R.id.previewAspectFrameLayout);
        photoPreviewContainer = (FrameLayout) findViewById(R.id.photo_preview_container);
        buttonPanel = (ViewGroup) findViewById(R.id.preview_control_panel);
        View confirmMediaResult = findViewById(R.id.confirm_media_result);
        View reTakeMedia = findViewById(R.id.re_take_media);
        View cancelMediaAction = findViewById(R.id.cancel_media_action);
        cropMediaAction = findViewById(R.id.crop_image);
        ratioChanger = (TextView) findViewById(R.id.ratio_image);
        ratioChanger.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                currentRatioIndex = (currentRatioIndex + 1) % ratios.length;
                ratioChanger.setText(ratioLabels[currentRatioIndex]);
            }
        });
        cropMediaAction.setVisibility(View.GONE);
        ratioChanger.setVisibility(View.GONE);
        if (cropMediaAction != null)
            cropMediaAction.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                }
            });
        if (confirmMediaResult != null)
            confirmMediaResult.setOnClickListener(this);
        if (reTakeMedia != null)
            reTakeMedia.setOnClickListener(this);
        if (cancelMediaAction != null)
            cancelMediaAction.setOnClickListener(this);
        Bundle args = getIntent().getExtras();
        mediaAction = args.getInt(MEDIA_ACTION_ARG);
        previewFilePath = args.getString(FILE_PATH_ARG);
        if (mediaAction == AnncaConfiguration.MEDIA_ACTION_VIDEO) {
            displayVideo(savedInstanceState);
        } else if (mediaAction == AnncaConfiguration.MEDIA_ACTION_PHOTO) {
            displayImage();
        } else {
            String mimeType = Utils.getMimeType(previewFilePath);
            if (mimeType.contains(MIME_TYPE_VIDEO)) {
                displayVideo(savedInstanceState);
            } else if (mimeType.contains(MIME_TYPE_IMAGE)) {
                displayImage();
            } else
                finish();
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        saveVideoParams(outState);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }
        if (mediaController != null) {
            mediaController.hide();
            mediaController = null;
        }
    }

    private void displayImage() {
        videoPreviewContainer.setVisibility(View.GONE);
        surfaceView.setVisibility(View.GONE);
        showImagePreview();
        ratioChanger.setText(ratioLabels[currentRatioIndex]);
    }

    private void showImagePreview() {
        imagePreview = new ImageView(this);
        AnncaImageLoader.Builder builder = new AnncaImageLoader.Builder(this);
        builder.load(previewFilePath).build().into(imagePreview);
        photoPreviewContainer.removeAllViews();
        photoPreviewContainer.addView(imagePreview);
    }

    private void displayVideo(Bundle savedInstanceState) {
        cropMediaAction.setVisibility(View.GONE);
        ratioChanger.setVisibility(View.GONE);
        if (savedInstanceState != null) {
            loadVideoParams(savedInstanceState);
        }
        photoPreviewContainer.setVisibility(View.GONE);
        surfaceView.getHolder().addCallback(surfaceCallbacks);
    }

    private void showVideoPreview(SurfaceHolder holder) {
        try {
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setDataSource(previewFilePath);
            mediaPlayer.setDisplay(holder);
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaController = new MediaController(PreviewActivity.this);
                    mediaController.setAnchorView(surfaceView);
                    mediaController.setMediaPlayer(MediaPlayerControlImpl);
                    int videoWidth = mp.getVideoWidth();
                    int videoHeight = mp.getVideoHeight();
                    videoPreviewContainer.setAspectRatio((double) videoWidth / videoHeight);
                    mediaPlayer.start();
                    mediaPlayer.seekTo(currentPlaybackPosition);
                    if (!isVideoPlaying)
                        mediaPlayer.pause();
                }
            });
            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {

                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    finish();
                    return true;
                }
            });
            mediaPlayer.prepareAsync();
        } catch (Exception e) {
            Log.e(TAG, "Error media player playing video.");
            finish();
        }
    }

    private void saveVideoParams(Bundle outState) {
        if (mediaPlayer != null) {
            outState.putInt(VIDEO_POSITION_ARG, mediaPlayer.getCurrentPosition());
            outState.putBoolean(VIDEO_IS_PLAYED_ARG, mediaPlayer.isPlaying());
        }
    }

    private void loadVideoParams(Bundle savedInstanceState) {
        currentPlaybackPosition = savedInstanceState.getInt(VIDEO_POSITION_ARG, 0);
        isVideoPlaying = savedInstanceState.getBoolean(VIDEO_IS_PLAYED_ARG, true);
    }

    private void showButtonPanel(boolean show) {
        if (show) {
            buttonPanel.setVisibility(View.VISIBLE);
        } else {
            buttonPanel.setVisibility(View.GONE);
        }
    }

    @Override
    public void onClick(View view) {
        Intent resultIntent = new Intent();
        if (view.getId() == R.id.confirm_media_result) {
            resultIntent.putExtra(RESPONSE_CODE_ARG, BaseAnncaActivity.ACTION_CONFIRM).putExtra(FILE_PATH_ARG, previewFilePath);
        } else if (view.getId() == R.id.re_take_media) {
            deleteMediaFile();
            resultIntent.putExtra(RESPONSE_CODE_ARG, BaseAnncaActivity.ACTION_RETAKE);
        } else if (view.getId() == R.id.cancel_media_action) {
            deleteMediaFile();
            resultIntent.putExtra(RESPONSE_CODE_ARG, BaseAnncaActivity.ACTION_CANCEL);
        }
        setResult(RESULT_OK, resultIntent);
        finish();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        deleteMediaFile();
    }

    private boolean deleteMediaFile() {
        File mediaFile = new File(previewFilePath);
        return mediaFile.delete();
    }

    public static boolean isResultConfirm(@NonNull Intent resultIntent) {
        return BaseAnncaActivity.ACTION_CONFIRM == resultIntent.getIntExtra(RESPONSE_CODE_ARG, -1);
    }

    public static String getMediaFilePatch(@NonNull Intent resultIntent) {
        return resultIntent.getStringExtra(FILE_PATH_ARG);
    }

    public static boolean isResultRetake(@NonNull Intent resultIntent) {
        return BaseAnncaActivity.ACTION_RETAKE == resultIntent.getIntExtra(RESPONSE_CODE_ARG, -1);
    }

    public static boolean isResultCancel(@NonNull Intent resultIntent) {
        return BaseAnncaActivity.ACTION_CANCEL == resultIntent.getIntExtra(RESPONSE_CODE_ARG, -1);
    }
}

14 Source : VideoViewH264m3u8HwLeMobile.java
with Apache License 2.0
from JackChan1999

public clreplaced VideoViewH264m3u8HwLeMobile extends SurfaceView implements LetvMediaPlayerControl {

    private static final int AUDIO_SIZE = 1600;

    private static final int PICTURE_SIZE = 90;

    private static final int STARTPIC_SIZE = 20;

    public static final int STATE_ENFORCEMENT = 7;

    public static final int STATE_ERROR = -1;

    public static final int STATE_IDLE = 0;

    public static final int STATE_PAUSED = 4;

    public static final int STATE_PLAYBACK_COMPLETED = 5;

    public static final int STATE_PLAYING = 3;

    public static final int STATE_PREPARED = 2;

    public static final int STATE_PREPARING = 1;

    public static final int STATE_STOPBACK = 6;

    private static final String TAG = "VideoViewH264LeMobileHw";

    private static final int VIDEO_SIZE = 400;

    private final int FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;

    private final int REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;

    private int bufferTime = 0;

    private boolean enforcementPause = false;

    private boolean enforcementWait = false;

    protected int lastSeekWhenDestoryed = 0;

    private OnBlockListener mBlockListener = new OnBlockListener() {

        public void onBlock(FFMpegPlayer mediaPlayer, int blockinfo) {
            if (VideoViewH264m3u8HwLeMobile.this.mOnBlockListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnBlockListener.onBlock(mediaPlayer, blockinfo);
            }
            if (blockinfo == 10001) {
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + " VideoViewH264LeMobileHw(硬解m3u8)  出现卡顿");
            } else if (blockinfo == 10002) {
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + " VideoViewH264LeMobileHw(硬解m3u8)  结束卡顿");
            }
        }
    };

    private OnBufferingUpdateListener mBufferingUpdateListener = new OnBufferingUpdateListener() {

        public void onBufferingUpdate(MediaPlayer mp, int percent) {
            VideoViewH264m3u8HwLeMobile.this.mCurrentBufferPercentage = percent;
            if (VideoViewH264m3u8HwLeMobile.this.mOnBufferingUpdateListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
            }
        }
    };

    private OnCacheListener mCacheListener = new OnCacheListener() {

        public void onCache(FFMpegPlayer mediaPlayer, int arg, int percent, long cacherate) {
            if (VideoViewH264m3u8HwLeMobile.this.mOnCacheListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnCacheListener.onCache(mediaPlayer, arg, percent, cacherate);
            }
            if (arg == 10003) {
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + " VideoViewH264m3u8Hw(软解m3u8)  开始缓存 ");
            }
            if (arg == FFMpegPlayer.MEDIA_CACHE_END) {
                LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + " VideoViewH264m3u8Hw(软解m3u8)  缓存结束 ");
            }
        }
    };

    private boolean mCanPause;

    private boolean mCanSeekBack;

    private boolean mCanSeekForward;

    private OnCompletionListener mCompletionListener = new OnCompletionListener() {

        public void onCompletion(MediaPlayer mp) {
            VideoViewH264m3u8HwLeMobile.this.mCurrentState = 5;
            VideoViewH264m3u8HwLeMobile.this.StateChange(VideoViewH264m3u8HwLeMobile.this.mCurrentState);
            VideoViewH264m3u8HwLeMobile.this.mTargetState = 5;
            VideoViewH264m3u8HwLeMobile.this.mCurrentState = 6;
            VideoViewH264m3u8HwLeMobile.this.StateChange(VideoViewH264m3u8HwLeMobile.this.mCurrentState);
            if (VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
                VideoViewH264m3u8HwLeMobile.this.mMediaController.hide();
            }
            if (VideoViewH264m3u8HwLeMobile.this.mOnCompletionListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnCompletionListener.onCompletion(VideoViewH264m3u8HwLeMobile.this.mMediaPlayer);
            }
            VideoViewH264m3u8HwLeMobile.this.pause();
            VideoViewH264m3u8HwLeMobile.this.release(true);
        }
    };

    private Context mContext;

    private int mCurrentBufferPercentage;

    private int mCurrentState = 0;

    private OnDisplayListener mDisplayListener = new OnDisplayListener() {

        public void onDisplay(FFMpegPlayer mediaPlayer) {
            LogTag.i("硬解onDisplay()");
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264LeMobileHw(硬解m3u8)  第一帧画面时间  onDisplay()");
            if (VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.DIAPLAY, currentDate);
            }
            VideoViewH264m3u8HwLeMobile.this.mCurrentState = 3;
            VideoViewH264m3u8HwLeMobile.this.StateChange(VideoViewH264m3u8HwLeMobile.this.mCurrentState);
        }
    };

    private int mDuration;

    private OnErrorListener mErrorListener = new OnErrorListener() {

        public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
            VideoViewH264m3u8HwLeMobile.this.mCurrentState = -1;
            VideoViewH264m3u8HwLeMobile.this.StateChange(VideoViewH264m3u8HwLeMobile.this.mCurrentState);
            VideoViewH264m3u8HwLeMobile.this.mTargetState = -1;
            if (VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
                VideoViewH264m3u8HwLeMobile.this.mMediaController.hide();
            }
            if (VideoViewH264m3u8HwLeMobile.this.mOnErrorListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnErrorListener.onError(VideoViewH264m3u8HwLeMobile.this.mMediaPlayer, framework_err, impl_err);
            }
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + "VideoViewH264LeMobileHw(硬解m3u8) 播放出错error, framework_err=" + framework_err + ", impl_err=" + impl_err);
            if (VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
            }
            LogTag.i("硬解失败");
            LogTag.i("framework_err:" + framework_err);
            return true;
        }
    };

    private OnFirstPlayLitener mFirstPlayLitener = new OnFirstPlayLitener() {

        public void onFirstPlay(FFMpegPlayer mediaPlayer, long startcosttime) {
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + "第一次播放 ");
            if (VideoViewH264m3u8HwLeMobile.this.mOnFirstPlayLitener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnFirstPlayLitener.onFirstPlay(mediaPlayer, startcosttime);
            }
        }
    };

    private OnHardDecodeErrorListner mHardDecodeErrorListner = new OnHardDecodeErrorListner() {

        public void onError(FFMpegPlayer mediaPlayer, int arg1, int arg2) {
            LogTag.i("OnHardDecodeErrorListner.onError(): framework_err=" + arg1 + ", impl_err=" + arg2);
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + "VideoViewH264LeMobileHw(硬解m3u8)  OnHardDecodeErrorListner.onError(): framework_err=" + arg1 + ", impl_err=" + arg2);
            if (VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.HARD_ERROR, currentDate);
            }
            if (VideoViewH264m3u8HwLeMobile.this.mOnHardDecodeErrorListner != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnHardDecodeErrorListner.onError(mediaPlayer, arg1, arg2);
            }
            if (VideoViewH264m3u8HwLeMobile.this.mOnErrorListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnErrorListener.onError(mediaPlayer, arg1, arg2);
            }
        }
    };

    private OnInfoListener mInfoListener = new OnInfoListener() {

        public boolean onInfo(MediaPlayer mp, int what, int extra) {
            LogTag.i("onInfo+++" + what + "extra+++" + extra);
            if (VideoViewH264m3u8HwLeMobile.this.mOnInfoListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnInfoListener.onInfo(mp, what, extra);
            }
            return false;
        }
    };

    private String mLastUrl;

    private MediaController mMediaController;

    private FFMpegPlayer mMediaPlayer = null;

    private OnBlockListener mOnBlockListener;

    private OnBufferingUpdateListener mOnBufferingUpdateListener;

    private OnCacheListener mOnCacheListener;

    private OnCompletionListener mOnCompletionListener;

    private OnErrorListener mOnErrorListener;

    private OnFirstPlayLitener mOnFirstPlayLitener;

    private OnHardDecodeErrorListner mOnHardDecodeErrorListner;

    private OnInfoListener mOnInfoListener;

    private OnMediaStateTimeListener mOnMediaStateTimeListener;

    private OnPreparedListener mOnPreparedListener;

    private OnSeekCompleteListener mOnSeekCompleteListener;

    private OnSuccessListener mOnSuccessListener;

    private OnVideoSizeChangedListener mOnVideoSizeChangedListener;

    private PlayUrl mPlayerUrl;

    OnPreparedListener mPreparedListener = new OnPreparedListener() {

        public void onPrepared(MediaPlayer mp) {
            LogTag.i("onPrepared()");
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264LeMobileHw(硬解m3u8)  onPrepared()");
            if (VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
            }
            VideoViewH264m3u8HwLeMobile.this.mCurrentState = 2;
            VideoViewH264m3u8HwLeMobile.this.StateChange(VideoViewH264m3u8HwLeMobile.this.mCurrentState);
            VideoViewH264m3u8HwLeMobile videoViewH264m3u8HwLeMobile = VideoViewH264m3u8HwLeMobile.this;
            VideoViewH264m3u8HwLeMobile videoViewH264m3u8HwLeMobile2 = VideoViewH264m3u8HwLeMobile.this;
            VideoViewH264m3u8HwLeMobile.this.mCanSeekForward = true;
            videoViewH264m3u8HwLeMobile2.mCanSeekBack = true;
            videoViewH264m3u8HwLeMobile.mCanPause = true;
            if (VideoViewH264m3u8HwLeMobile.this.mOnPreparedListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnPreparedListener.onPrepared(VideoViewH264m3u8HwLeMobile.this.mMediaPlayer);
            }
            VideoViewH264m3u8HwLeMobile.this.mLastUrl = ((FFMpegPlayer) mp).getLastUrl();
            VideoViewH264m3u8HwLeMobile.this.mVersion = ((FFMpegPlayer) mp).getVersion();
            if (VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
                VideoViewH264m3u8HwLeMobile.this.mMediaController.setEnabled(true);
            }
            int seekToPosition = VideoViewH264m3u8HwLeMobile.this.mSeekWhenPrepared;
            if (seekToPosition != 0) {
                VideoViewH264m3u8HwLeMobile.this.seekTo(seekToPosition);
            }
            VideoViewH264m3u8HwLeMobile.this.mVideoWidth = mp.getVideoWidth();
            VideoViewH264m3u8HwLeMobile.this.mVideoHeight = mp.getVideoHeight();
            if (VideoViewH264m3u8HwLeMobile.this.mVideoWidth == 0 || VideoViewH264m3u8HwLeMobile.this.mVideoHeight == 0) {
                if (VideoViewH264m3u8HwLeMobile.this.mTargetState == 3) {
                    VideoViewH264m3u8HwLeMobile.this.start();
                }
            } else if (VideoViewH264m3u8HwLeMobile.this.mSurfaceWidth != VideoViewH264m3u8HwLeMobile.this.mVideoWidth || VideoViewH264m3u8HwLeMobile.this.mSurfaceHeight != VideoViewH264m3u8HwLeMobile.this.mVideoHeight) {
                VideoViewH264m3u8HwLeMobile.this.getHolder().setFixedSize(VideoViewH264m3u8HwLeMobile.this.mVideoWidth, VideoViewH264m3u8HwLeMobile.this.mVideoHeight);
            } else if (VideoViewH264m3u8HwLeMobile.this.mTargetState == 3) {
                VideoViewH264m3u8HwLeMobile.this.start();
                if (VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
                    VideoViewH264m3u8HwLeMobile.this.mMediaController.show();
                }
            } else if (!VideoViewH264m3u8HwLeMobile.this.isPlaying()) {
                if ((seekToPosition != 0 || VideoViewH264m3u8HwLeMobile.this.getCurrentPosition() > 0) && VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
                    VideoViewH264m3u8HwLeMobile.this.mMediaController.show(0);
                }
            }
        }
    };

    private int mRatioType = -1;

    Callback mSHCallback = new Callback() {

        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
            VideoViewH264m3u8HwLeMobile.this.mSurfaceWidth = w;
            VideoViewH264m3u8HwLeMobile.this.mSurfaceHeight = h;
            boolean isValidState;
            if (VideoViewH264m3u8HwLeMobile.this.mTargetState == 3) {
                isValidState = true;
            } else {
                isValidState = false;
            }
            boolean hasValidSize;
            if (VideoViewH264m3u8HwLeMobile.this.mVideoWidth == w && VideoViewH264m3u8HwLeMobile.this.mVideoHeight == h) {
                hasValidSize = true;
            } else {
                hasValidSize = false;
            }
            if (VideoViewH264m3u8HwLeMobile.this.mMediaPlayer != null && isValidState && hasValidSize) {
                if (VideoViewH264m3u8HwLeMobile.this.mSeekWhenPrepared != 0) {
                    VideoViewH264m3u8HwLeMobile.this.seekTo(VideoViewH264m3u8HwLeMobile.this.mSeekWhenPrepared);
                }
                VideoViewH264m3u8HwLeMobile.this.start();
                if (VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
                    VideoViewH264m3u8HwLeMobile.this.mMediaController.show();
                }
            }
        }

        public void surfaceCreated(SurfaceHolder holder) {
            if (VideoViewH264m3u8HwLeMobile.this.mSurfaceHolder == null) {
                VideoViewH264m3u8HwLeMobile.this.mSurfaceHolder = holder;
                VideoViewH264m3u8HwLeMobile.this.openVideo();
            }
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            VideoViewH264m3u8HwLeMobile.this.mSurfaceHolder = null;
            if (VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
                VideoViewH264m3u8HwLeMobile.this.mMediaController.hide();
            }
            VideoViewH264m3u8HwLeMobile.this.lastSeekWhenDestoryed = VideoViewH264m3u8HwLeMobile.this.getCurrentPosition();
            VideoViewH264m3u8HwLeMobile.this.release(true);
        }
    };

    private OnSeekCompleteListener mSeekCompleteListener = new OnSeekCompleteListener() {

        public void onSeekComplete(MediaPlayer mp) {
            if (VideoViewH264m3u8HwLeMobile.this.mOnSeekCompleteListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264m3u8HwLeMobile.this.mMediaPlayer);
            }
        }
    };

    private int mSeekWhenPrepared;

    OnVideoSizeChangedListener mSizeChangedListener = new OnVideoSizeChangedListener() {

        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
            VideoViewH264m3u8HwLeMobile.this.mVideoWidth = mp.getVideoWidth();
            VideoViewH264m3u8HwLeMobile.this.mVideoHeight = mp.getVideoHeight();
            if (!(VideoViewH264m3u8HwLeMobile.this.mVideoWidth == 0 || VideoViewH264m3u8HwLeMobile.this.mVideoHeight == 0)) {
                VideoViewH264m3u8HwLeMobile.this.getHolder().setFixedSize(VideoViewH264m3u8HwLeMobile.this.mVideoWidth, VideoViewH264m3u8HwLeMobile.this.mVideoHeight);
            }
            if (VideoViewH264m3u8HwLeMobile.this.mOnVideoSizeChangedListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, VideoViewH264m3u8HwLeMobile.this.mVideoWidth, VideoViewH264m3u8HwLeMobile.this.mVideoHeight);
            }
        }
    };

    private OnSuccessListener mSuccessListener = new OnSuccessListener() {

        public void onSuccess() {
            if (VideoViewH264m3u8HwLeMobile.this.mOnSuccessListener != null) {
                VideoViewH264m3u8HwLeMobile.this.mOnSuccessListener.onSuccess();
            }
            LogTag.i("硬解成功");
        }
    };

    private int mSurfaceHeight;

    private SurfaceHolder mSurfaceHolder = null;

    private int mSurfaceWidth;

    private int mTargetState = 0;

    private Uri mUri;

    private String mVersion;

    private int mVideoHeight;

    private OnVideoViewStateChangeListener mVideoViewStateChangeListener;

    private int mVideoWidth;

    public VideoViewH264m3u8HwLeMobile(Context context) {
        super(context);
        this.mContext = context;
        initVideoView();
    }

    public VideoViewH264m3u8HwLeMobile(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;
        initVideoView();
    }

    private void initVideoView() {
        this.mVideoWidth = 0;
        this.mVideoHeight = 0;
        getHolder().addCallback(this.mSHCallback);
        getHolder().setType(3);
        setFocusable(true);
        setFocusableInTouchMode(true);
        requestFocus();
        this.mCurrentState = 0;
        StateChange(this.mCurrentState);
        this.mTargetState = 0;
    }

    public void setVideoPath(String videoPath) {
        this.mPlayerUrl = new PlayUrl();
        this.mPlayerUrl.setVid(-1);
        this.mPlayerUrl.setUrl(videoPath);
        this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
        setVideoURI(Uri.parse(videoPath));
    }

    public void setVideoPath(String path, Map<String, String> map) {
    }

    public void setVideoURI(Uri uri) {
        String currentDate = Tools.getCurrentDate();
        LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264LeMobileHw(硬解m3u8)  setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
        if (this.mOnMediaStateTimeListener != null) {
            this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
        }
        this.mUri = uri;
        this.mSeekWhenPrepared = 0;
        openVideo();
        requestLayout();
        invalidate();
        LogTag.i(TAG, "uri=" + this.mUri.toString());
    }

    public boolean canPause() {
        return this.mCanPause;
    }

    public boolean canSeekBackward() {
        return this.mCanSeekBack;
    }

    public boolean canSeekForward() {
        return this.mCanSeekForward;
    }

    public int getBufferPercentage() {
        if (this.mMediaPlayer != null) {
            return this.mCurrentBufferPercentage;
        }
        return 0;
    }

    public int getCurrentPosition() {
        if (isInPlaybackState()) {
            return this.mMediaPlayer.getCurrentPosition();
        }
        return 0;
    }

    public int getDuration() {
        if (!isInPlaybackState()) {
            this.mDuration = -1;
            return this.mDuration;
        } else if (this.mDuration > 0) {
            return this.mDuration;
        } else {
            this.mDuration = this.mMediaPlayer.getDuration();
            return this.mDuration;
        }
    }

    public String getSkipLastURL() {
        return this.mLastUrl;
    }

    public String getVersion() {
        return this.mVersion;
    }

    public int getViewWidth() {
        return getLayoutParams().width;
    }

    public int getViewHeight() {
        return getLayoutParams().height;
    }

    public void start() {
        if (this.enforcementWait || this.enforcementPause) {
            StateChange(7);
        } else if (isInPlaybackState()) {
            LogTag.i("硬解开始播放");
            this.mMediaPlayer.start();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + " VideoViewH264LeMobileHw(硬解m3u8)  start()");
        }
        this.mTargetState = 3;
    }

    public void pause() {
        if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
            LogTag.i("pause()");
            this.mMediaPlayer.pause();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + Tools.getCurrentDate() + " VideoViewH264LeMobileHw(硬解m3u8)  pause()");
            this.mCurrentState = 4;
            StateChange(this.mCurrentState);
        }
        this.mTargetState = 4;
    }

    public void seekTo(int mesc) {
        if (isInPlaybackState()) {
            this.mMediaPlayer.seekTo(mesc);
            this.mSeekWhenPrepared = 0;
            this.lastSeekWhenDestoryed = 0;
            return;
        }
        this.mSeekWhenPrepared = mesc;
        this.lastSeekWhenDestoryed = 0;
    }

    public void forward() {
        seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
    }

    public void rewind() {
        seekTo(getCurrentPosition() - 15000);
    }

    public void stopPlayback() {
        stopPlayback(false);
    }

    public void stopPlayback(boolean isRemoveCallBack) {
        StateChange(6);
        if (this.mMediaPlayer != null) {
            String currentDateStop = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateStop + "VideoViewH264LeMobileHw stop()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
            }
            try {
                this.mMediaPlayer.stop();
            } catch (Exception e) {
                LogTag.i(TAG, "hard decode native player has already null");
            }
            if (isRemoveCallBack) {
                getHolder().removeCallback(this.mSHCallback);
            }
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewH264LeMobileHw release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            try {
                this.mMediaPlayer.release();
            } catch (Exception e2) {
                LogTag.i(TAG, "hard decode native player has already null");
            }
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            this.mTargetState = 0;
            setVisibility(4);
        }
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
        int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
        if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
            switch(this.mRatioType) {
                case -1:
                    if (this.mVideoWidth * height <= this.mVideoHeight * width) {
                        if (this.mVideoWidth * height < this.mVideoHeight * width) {
                            width = (this.mVideoWidth * height) / this.mVideoHeight;
                            break;
                        }
                    }
                    height = (this.mVideoHeight * width) / this.mVideoWidth;
                    break;
                    break;
                case 1:
                    if (height * 4 <= width * 3) {
                        if (height * 4 < width * 3) {
                            width = (height * 4) / 3;
                            break;
                        }
                    }
                    height = (width * 3) / 4;
                    break;
                    break;
                case 2:
                    if (height * 16 <= width * 9) {
                        if (height * 16 < width * 9) {
                            width = (height * 16) / 9;
                            break;
                        }
                    }
                    height = (width * 9) / 16;
                    break;
                    break;
            }
        }
        setMeasuredDimension(width, height);
    }

    public void adjust(int type) {
        this.mRatioType = type;
        invalateScreenSize();
    }

    private void invalateScreenSize() {
        setLayoutParams((LayoutParams) getLayoutParams());
    }

    public int resolveAdjustedSize(int desiredSize, int measureSpec) {
        int result = desiredSize;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        switch(specMode) {
            case Integer.MIN_VALUE:
                return Math.min(desiredSize, specSize);
            case 0:
                return desiredSize;
            case 1073741824:
                return specSize;
            default:
                return result;
        }
    }

    public boolean isInPlaybackState() {
        return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
    }

    private void openVideo() {
        if (this.mUri == null || this.mSurfaceHolder == null) {
            setVisibility(0);
            return;
        }
        release(false);
        try {
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264LeMobileHw(硬解m3u8)  创建FFMpegPlayer对象");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
            }
            this.mMediaPlayer = new FFMpegPlayer(this.mContext);
            this.mMediaPlayer.setHardwareDecode(1);
            this.mMediaPlayer.setHwCapbility(CodecWrapper.getProfile(), CodecWrapper.getAVCLevel());
            this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
            this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
            this.mDuration = -1;
            this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
            this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
            this.mMediaPlayer.setOnSuccessListener(this.mSuccessListener);
            this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
            this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
            this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
            this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
            this.mMediaPlayer.setOnBlockListener(this.mBlockListener);
            this.mMediaPlayer.setOnCacheListener(this.mCacheListener);
            this.mMediaPlayer.setOnFirstPlayListener(this.mFirstPlayLitener);
            this.mMediaPlayer.setOnDisplayListener(this.mDisplayListener);
            this.mMediaPlayer.setOnHardDecoddErrorListener(this.mHardDecodeErrorListner);
            this.mCurrentBufferPercentage = 0;
            this.mMediaPlayer.setDataSource(this.mContext, this.mUri);
            this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
            this.mMediaPlayer.setAudioStreamType(3);
            this.mMediaPlayer.setScreenOnWhilePlaying(true);
            this.mMediaPlayer.prepareAsync();
            this.mCurrentState = 1;
            attachMediaController();
        } catch (IllegalStateException ex) {
            LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex);
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        } catch (IllegalArgumentException e) {
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        } catch (IOException e2) {
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        }
    }

    public void setMediaController(MediaController controller) {
        if (this.mMediaController != null) {
            this.mMediaController.hide();
        }
        this.mMediaController = controller;
        attachMediaController();
    }

    private void attachMediaController() {
        if (this.mMediaPlayer != null && this.mMediaController != null) {
            View anchorView;
            this.mMediaController.setMediaPlayer(this);
            if (getParent() instanceof View) {
                anchorView = (View) getParent();
            } else {
                anchorView = this;
            }
            this.mMediaController.setAnchorView(anchorView);
            this.mMediaController.setEnabled(isInPlaybackState());
        }
    }

    private void setVideoViewScale(int width, int height) {
        LayoutParams lp = (LayoutParams) getLayoutParams();
        lp.height = height;
        lp.width = width;
        setLayoutParams(lp);
    }

    private void release(boolean cleartargetstate) {
        if (this.mMediaPlayer != null) {
            String currentDateStop = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateStop + "VideoViewH264LeMobileHw stop()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
            }
            this.mMediaPlayer.stop();
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewH264LeMobileHw release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            if (cleartargetstate) {
                this.mTargetState = 0;
            }
        }
    }

    public boolean onTouchEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onTrackballEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        boolean isKeyCodeSupported;
        if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
            isKeyCodeSupported = false;
        } else {
            isKeyCodeSupported = true;
        }
        if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
            if (keyCode == 79 || keyCode == 85) {
                if (this.mMediaPlayer.isPlaying()) {
                    pause();
                    this.mMediaController.show();
                    return true;
                }
                start();
                this.mMediaController.hide();
                return true;
            } else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
                pause();
                this.mMediaController.show();
            } else {
                toggleMediaControlsVisiblity();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    private void toggleMediaControlsVisiblity() {
        if (this.mMediaController.isShowing()) {
            this.mMediaController.hide();
        } else {
            this.mMediaController.show();
        }
    }

    public boolean isPlaying() {
        return isInPlaybackState() && this.mMediaPlayer.isPlaying();
    }

    public boolean isPaused() {
        return this.mCurrentState == 4;
    }

    public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
        this.mOnSeekCompleteListener = l;
    }

    public int getLastSeekWhenDestoryed() {
        return this.lastSeekWhenDestoryed;
    }

    public int getAudioSessionId() {
        return 0;
    }

    public boolean isEnforcementWait() {
        return this.enforcementWait;
    }

    public void setEnforcementWait(boolean enforcementWait) {
        this.enforcementWait = enforcementWait;
    }

    public boolean isEnforcementPause() {
        return this.enforcementPause;
    }

    public void setEnforcementPause(boolean enforcementPause) {
        this.enforcementPause = enforcementPause;
    }

    public View getView() {
        return this;
    }

    private void StateChange(int mCurrentState) {
        if (this.mVideoViewStateChangeListener != null) {
            this.mVideoViewStateChangeListener.onChange(mCurrentState);
        }
    }

    public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener listener) {
        this.mVideoViewStateChangeListener = listener;
    }

    public void setOnInfoListener(OnInfoListener l) {
        this.mOnInfoListener = l;
    }

    public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
        this.mOnVideoSizeChangedListener = l;
    }

    public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
        this.mOnBufferingUpdateListener = l;
    }

    public void setOnPreparedListener(OnPreparedListener l) {
        this.mOnPreparedListener = l;
    }

    public void setOnCompletionListener(OnCompletionListener l) {
        this.mOnCompletionListener = l;
    }

    public void setOnErrorListener(OnErrorListener l) {
        this.mOnErrorListener = l;
    }

    public void setOnSuccessListener(OnSuccessListener l) {
        this.mOnSuccessListener = l;
    }

    public void setVideoPlayUrl(PlayUrl url) {
        this.mPlayerUrl = url;
        setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
    }

    public void setOnAdNumberListener(OnAdNumberListener l) {
    }

    public void setCacheSize(int video_size, int audio_size, int picture_size, int startpic_size) {
    }

    public void setOnBlockListener(OnBlockListener l) {
        this.mOnBlockListener = l;
    }

    public void setOnCacheListener(OnCacheListener l) {
        this.mOnCacheListener = l;
    }

    public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
        this.mOnMediaStateTimeListener = l;
    }

    public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
        this.mOnHardDecodeErrorListner = l;
    }

    public void setOnFirstPlayListener(OnFirstPlayLitener l) {
        this.mOnFirstPlayLitener = l;
    }

    public int setSourceType(int sourceType) {
        return 0;
    }

    public int setMachineInfomation(float ScreenResolution) {
        return 0;
    }

    public int setOneFingertouchInfomation(float begin_x, float begin_y, float end_x, float end_y) {
        return 0;
    }

    public int setTwoFingertouchInfomation(float begin_x0, float begin_y0, float begin_x1, float begin_y1, float end_x0, float end_y0, float end_x1, float end_y1) {
        return 0;
    }

    public int setgravity_yroInfomation(float gravity_yro_x, float gravity_yro_y, float gravity_yro_z) {
        return 0;
    }

    public int setGravityInfomation(float gravity_x, float gravity_y, float gravity_z) {
        return 0;
    }

    public int setgravity_yroValidInfomation(boolean gravityValid) {
        return 0;
    }

    public int setAngleInit() {
        return 0;
    }

    public int setTwoFingerZoom(float zoom) {
        return 0;
    }

    public void setInitPosition(int msec) {
    }

    public void setVolume(int volume) {
    }

    public void setCacheTime(double start_cache, double block_cache) {
    }

    public void processSensorEvent(SensorEvent sensorEvent) {
    }
}

14 Source : VideoViewH264m3u8Hw_4D.java
with Apache License 2.0
from JackChan1999

public clreplaced VideoViewH264m3u8Hw_4D extends SurfaceView implements LetvMediaPlayerControl4D {

    private static final int AUDIO_SIZE = 1600;

    public static final int DEFAULT = 0;

    private static int FIRST_SYNC_UPDATE_TIME_MS = 200;

    private static int HAPTICS_RESYNC_INTERVAL_MS = LeMessageIds.MSG_FLOAT_BALL_REQUEST_DATA;

    public static final int HAPTIC_ERROR = -1;

    public static final int HAPTIC_INITIALIZED = 1;

    public static final int HAPTIC_UNINITIALIZED = 0;

    private static final String INACCESSIBLE_URL = "INACCESSIBLE_URL";

    private static int INITIAL_RESYNC_INTERVAL_MS = 100;

    private static final String INVALID = "INVALID";

    private static final String MALFORMED_URL = "MALFORMED_URL";

    private static int MEDIA_PREPARE_INTERVAL_MS = 20;

    public static final int MUTED = 1;

    public static final int PAUSED = 2;

    public static final int PAUSED_BUFFERRING_FINISHED = 4;

    public static final int PAUSED_DUE_TO_BUFFERING = 3;

    private static final String PERMISSION_DENIED = "PERMISSION_DENIED";

    private static final int PICTURE_SIZE = 90;

    public static final int PLAYING = 1;

    private static int PLAY_PAUSE_FADEOUT_TIME_MS = 2000;

    private static int SEEKBAR_UPDATE_DURATION_MS = 200;

    private static final int STARTPIC_SIZE = 20;

    public static final int STATE_ENFORCEMENT = 7;

    public static final int STATE_ERROR = -1;

    public static final int STATE_IDLE = 0;

    public static final int STATE_PAUSED = 4;

    public static final int STATE_PLAYBACK_COMPLETED = 5;

    public static final int STATE_PLAYING = 3;

    public static final int STATE_PREPARED = 2;

    public static final int STATE_PREPARING = 1;

    public static final int STATE_STOPBACK = 6;

    public static final int STOPPED = 0;

    private static final String SUCCESS = "SUCCESS";

    private static final String TAG = "VideoViewH264m3u8Hw";

    public static final int UNINITIALIZED = -1;

    private static final String UNSUPPORTED_PROTOCOL = "UNSUPPORTED_PROTOCOL";

    private static final int VIDEO_SIZE = 400;

    private final int FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;

    private final int REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;

    private int bufferTime = 0;

    private Runnable changeResyncInterval = new Runnable() {

        public void run() {
            if (VideoViewH264m3u8Hw_4D.this.getCurrentPosition() > VideoViewH264m3u8Hw_4D.FIRST_SYNC_UPDATE_TIME_MS) {
                VideoViewH264m3u8Hw_4D.this.mResyncInterval = VideoViewH264m3u8Hw_4D.HAPTICS_RESYNC_INTERVAL_MS;
            } else {
                VideoViewH264m3u8Hw_4D.this.postDelayed(VideoViewH264m3u8Hw_4D.this.changeResyncInterval, (long) VideoViewH264m3u8Hw_4D.INITIAL_RESYNC_INTERVAL_MS);
            }
        }
    };

    private boolean downloadHapt = true;

    private boolean enforcementPause = false;

    private boolean enforcementWait = false;

    private String hapt;

    protected int lastSeekWhenDestoryed = 0;

    private OnBlockListener mBlockListener = new OnBlockListener() {

        public void onBlock(FFMpegPlayer mediaPlayer, int blockinfo) {
            if (VideoViewH264m3u8Hw_4D.this.mOnBlockListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnBlockListener.onBlock(mediaPlayer, blockinfo);
            }
        }
    };

    private OnBufferingUpdateListener mBufferingUpdateListener = new OnBufferingUpdateListener() {

        public void onBufferingUpdate(MediaPlayer mp, int percent) {
            VideoViewH264m3u8Hw_4D.this.mCurrentBufferPercentage = percent;
            if (VideoViewH264m3u8Hw_4D.this.mOnBufferingUpdateListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
            }
        }
    };

    private boolean mCanPause;

    private boolean mCanSeekBack;

    private boolean mCanSeekForward;

    private OnCompletionListener mCompletionListener = new OnCompletionListener() {

        public void onCompletion(MediaPlayer mp) {
            VideoViewH264m3u8Hw_4D.this.mCurrentState = 5;
            VideoViewH264m3u8Hw_4D.this.StateChange(VideoViewH264m3u8Hw_4D.this.mCurrentState);
            VideoViewH264m3u8Hw_4D.this.mTargetState = 5;
            VideoViewH264m3u8Hw_4D.this.mCurrentState = 6;
            VideoViewH264m3u8Hw_4D.this.StateChange(VideoViewH264m3u8Hw_4D.this.mCurrentState);
            if (VideoViewH264m3u8Hw_4D.this.mMediaController != null) {
                VideoViewH264m3u8Hw_4D.this.mMediaController.hide();
            }
            if (VideoViewH264m3u8Hw_4D.this.mOnCompletionListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnCompletionListener.onCompletion(VideoViewH264m3u8Hw_4D.this.mMediaPlayer);
            }
            VideoViewH264m3u8Hw_4D.this.pause();
            VideoViewH264m3u8Hw_4D.this.release(true);
        }
    };

    private Context mContext;

    private int mCurrentBufferPercentage;

    private int mCurrentState = 0;

    private OnDisplayListener mDisplayListener = new OnDisplayListener() {

        public void onDisplay(FFMpegPlayer mediaPlayer) {
            LogTag.i("硬解onDisplay()");
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264m3u8Hw(硬解m3u8)  第一帧画面时间  onDisplay()");
            if (VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.DIAPLAY, currentDate);
            }
            VideoViewH264m3u8Hw_4D.this.mCurrentState = 3;
            VideoViewH264m3u8Hw_4D.this.StateChange(VideoViewH264m3u8Hw_4D.this.mCurrentState);
        }
    };

    private int mDuration;

    private OnErrorListener mErrorListener = new OnErrorListener() {

        public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
            VideoViewH264m3u8Hw_4D.this.mCurrentState = -1;
            VideoViewH264m3u8Hw_4D.this.StateChange(VideoViewH264m3u8Hw_4D.this.mCurrentState);
            VideoViewH264m3u8Hw_4D.this.mTargetState = -1;
            if (VideoViewH264m3u8Hw_4D.this.mMediaController != null) {
                VideoViewH264m3u8Hw_4D.this.mMediaController.hide();
            }
            if (VideoViewH264m3u8Hw_4D.this.mOnErrorListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnErrorListener.onError(VideoViewH264m3u8Hw_4D.this.mMediaPlayer, framework_err, impl_err);
            }
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + "VideoViewH264m3u8Hw(硬解m3u8) 播放出错error, framework_err=" + framework_err + ", impl_err=" + impl_err);
            if (VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
            }
            LogTag.i("硬解失败");
            LogTag.i("framework_err:" + framework_err);
            return true;
        }
    };

    private HashMap<Integer, String> mErrorValues;

    private String mHaptFileName = "expendables_3_hapt.hapt";

    private int mHapticState;

    private HapticContentSDK mHaptics;

    private OnHardDecodeErrorListner mHardDecodeErrorListner = new OnHardDecodeErrorListner() {

        public void onError(FFMpegPlayer mediaPlayer, int arg1, int arg2) {
            LogTag.i("OnHardDecodeErrorListner.onError(): framework_err=" + arg1 + ", impl_err=" + arg2);
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + "VideoViewH264m3u8Hw(硬解m3u8)  OnHardDecodeErrorListner.onError(): framework_err=" + arg1 + ", impl_err=" + arg2);
            if (VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.HARD_ERROR, currentDate);
            }
            if (VideoViewH264m3u8Hw_4D.this.mOnHardDecodeErrorListner != null) {
                VideoViewH264m3u8Hw_4D.this.mOnHardDecodeErrorListner.onError(mediaPlayer, arg1, arg2);
            }
            if (VideoViewH264m3u8Hw_4D.this.mOnErrorListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnErrorListener.onError(mediaPlayer, arg1, arg2);
            }
            HttpRequestManager.getInstance(VideoViewH264m3u8Hw_4D.this.mContext).hardDecodeReport(VideoViewH264m3u8Hw_4D.this.mPlayerUrl.mVid, VideoViewH264m3u8Hw_4D.this.mUri.toString(), 0, arg1, VideoViewH264m3u8Hw_4D.this.mPlayerUrl.mStreamType, 1);
        }
    };

    private OnInfoListener mInfoListener = new OnInfoListener() {

        public boolean onInfo(MediaPlayer mp, int what, int extra) {
            LogTag.i("onInfo+++" + what + "extra+++" + extra);
            if (VideoViewH264m3u8Hw_4D.this.mOnInfoListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnInfoListener.onInfo(mp, what, extra);
            }
            return false;
        }
    };

    private boolean mIsMediaBuffering = false;

    private boolean mIsMediaPreparing = false;

    private boolean mIsSeeked = false;

    private String mLastUrl;

    private MediaController mMediaController;

    private Handler mMediaControlsHandler;

    private boolean mMediaLoaded = true;

    private FFMpegPlayer mMediaPlayer = null;

    private int mMediaState;

    private OnBlockListener mOnBlockListener;

    private OnBufferingUpdateListener mOnBufferingUpdateListener;

    private OnCompletionListener mOnCompletionListener;

    private OnErrorListener mOnErrorListener;

    private OnHardDecodeErrorListner mOnHardDecodeErrorListner;

    private OnInfoListener mOnInfoListener;

    private OnMediaStateTimeListener mOnMediaStateTimeListener;

    private OnPreparedListener mOnPreparedListener;

    private OnSeekCompleteListener mOnSeekCompleteListener;

    private OnSuccessListener mOnSuccessListener;

    private OnVideoSizeChangedListener mOnVideoSizeChangedListener;

    private String mPreplacedsword = "immr@letv23";

    private PlayUrl mPlayerUrl;

    OnPreparedListener mPreparedListener = new OnPreparedListener() {

        public void onPrepared(MediaPlayer mp) {
            LogTag.i("onPrepared()");
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264m3u8Hw(硬解m3u8)  onPrepared()");
            if (VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
            }
            VideoViewH264m3u8Hw_4D.this.mCurrentState = 2;
            VideoViewH264m3u8Hw_4D.this.StateChange(VideoViewH264m3u8Hw_4D.this.mCurrentState);
            VideoViewH264m3u8Hw_4D videoViewH264m3u8Hw_4D = VideoViewH264m3u8Hw_4D.this;
            VideoViewH264m3u8Hw_4D videoViewH264m3u8Hw_4D2 = VideoViewH264m3u8Hw_4D.this;
            VideoViewH264m3u8Hw_4D.this.mCanSeekForward = true;
            videoViewH264m3u8Hw_4D2.mCanSeekBack = true;
            videoViewH264m3u8Hw_4D.mCanPause = true;
            if (VideoViewH264m3u8Hw_4D.this.mOnPreparedListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnPreparedListener.onPrepared(VideoViewH264m3u8Hw_4D.this.mMediaPlayer);
            }
            VideoViewH264m3u8Hw_4D.this.mLastUrl = ((FFMpegPlayer) mp).getLastUrl();
            VideoViewH264m3u8Hw_4D.this.mVersion = ((FFMpegPlayer) mp).getVersion();
            if (VideoViewH264m3u8Hw_4D.this.mMediaController != null) {
                VideoViewH264m3u8Hw_4D.this.mMediaController.setEnabled(true);
            }
            int seekToPosition = VideoViewH264m3u8Hw_4D.this.mSeekWhenPrepared;
            if (seekToPosition != 0) {
                VideoViewH264m3u8Hw_4D.this.seekTo(seekToPosition);
            }
            VideoViewH264m3u8Hw_4D.this.mVideoWidth = mp.getVideoWidth();
            VideoViewH264m3u8Hw_4D.this.mVideoHeight = mp.getVideoHeight();
            if (VideoViewH264m3u8Hw_4D.this.mVideoWidth == 0 || VideoViewH264m3u8Hw_4D.this.mVideoHeight == 0) {
                if (VideoViewH264m3u8Hw_4D.this.mTargetState == 3) {
                    VideoViewH264m3u8Hw_4D.this.start();
                }
            } else if (VideoViewH264m3u8Hw_4D.this.mSurfaceWidth != VideoViewH264m3u8Hw_4D.this.mVideoWidth || VideoViewH264m3u8Hw_4D.this.mSurfaceHeight != VideoViewH264m3u8Hw_4D.this.mVideoHeight) {
                VideoViewH264m3u8Hw_4D.this.getHolder().setFixedSize(VideoViewH264m3u8Hw_4D.this.mVideoWidth, VideoViewH264m3u8Hw_4D.this.mVideoHeight);
            } else if (VideoViewH264m3u8Hw_4D.this.mTargetState == 3) {
                VideoViewH264m3u8Hw_4D.this.start();
                if (VideoViewH264m3u8Hw_4D.this.mMediaController != null) {
                    VideoViewH264m3u8Hw_4D.this.mMediaController.show();
                }
            } else if (!VideoViewH264m3u8Hw_4D.this.isPlaying() && ((seekToPosition != 0 || VideoViewH264m3u8Hw_4D.this.getCurrentPosition() > 0) && VideoViewH264m3u8Hw_4D.this.mMediaController != null)) {
                VideoViewH264m3u8Hw_4D.this.mMediaController.show(0);
            }
            VideoViewH264m3u8Hw_4D.this.palyer4dContrlHandle(seekToPosition);
        }
    };

    private int mRatioType = -1;

    private int mResyncInterval = INITIAL_RESYNC_INTERVAL_MS;

    Callback mSHCallback = new Callback() {

        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
            VideoViewH264m3u8Hw_4D.this.mSurfaceWidth = w;
            VideoViewH264m3u8Hw_4D.this.mSurfaceHeight = h;
            boolean isValidState;
            if (VideoViewH264m3u8Hw_4D.this.mTargetState == 3) {
                isValidState = true;
            } else {
                isValidState = false;
            }
            boolean hasValidSize;
            if (VideoViewH264m3u8Hw_4D.this.mVideoWidth == w && VideoViewH264m3u8Hw_4D.this.mVideoHeight == h) {
                hasValidSize = true;
            } else {
                hasValidSize = false;
            }
            if (VideoViewH264m3u8Hw_4D.this.mMediaPlayer != null && isValidState && hasValidSize) {
                if (VideoViewH264m3u8Hw_4D.this.mSeekWhenPrepared != 0) {
                    VideoViewH264m3u8Hw_4D.this.seekTo(VideoViewH264m3u8Hw_4D.this.mSeekWhenPrepared);
                }
                VideoViewH264m3u8Hw_4D.this.start();
                if (VideoViewH264m3u8Hw_4D.this.mMediaController != null) {
                    VideoViewH264m3u8Hw_4D.this.mMediaController.show();
                }
            }
        }

        public void surfaceCreated(SurfaceHolder holder) {
            if (VideoViewH264m3u8Hw_4D.this.mSurfaceHolder == null) {
                VideoViewH264m3u8Hw_4D.this.mSurfaceHolder = holder;
                VideoViewH264m3u8Hw_4D.this.openVideo();
            }
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            VideoViewH264m3u8Hw_4D.this.mSurfaceHolder = null;
            if (VideoViewH264m3u8Hw_4D.this.mMediaController != null) {
                VideoViewH264m3u8Hw_4D.this.mMediaController.hide();
            }
            VideoViewH264m3u8Hw_4D.this.lastSeekWhenDestoryed = VideoViewH264m3u8Hw_4D.this.getCurrentPosition();
            VideoViewH264m3u8Hw_4D.this.release(true);
        }
    };

    private int mSavedPos;

    private OnSeekCompleteListener mSeekCompleteListener = new OnSeekCompleteListener() {

        public void onSeekComplete(MediaPlayer mp) {
            if (VideoViewH264m3u8Hw_4D.this.mOnSeekCompleteListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264m3u8Hw_4D.this.mMediaPlayer);
            }
        }
    };

    private int mSeekToPosition;

    private int mSeekWhenPrepared;

    OnVideoSizeChangedListener mSizeChangedListener = new OnVideoSizeChangedListener() {

        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
            VideoViewH264m3u8Hw_4D.this.mVideoWidth = mp.getVideoWidth();
            VideoViewH264m3u8Hw_4D.this.mVideoHeight = mp.getVideoHeight();
            if (!(VideoViewH264m3u8Hw_4D.this.mVideoWidth == 0 || VideoViewH264m3u8Hw_4D.this.mVideoHeight == 0)) {
                VideoViewH264m3u8Hw_4D.this.getHolder().setFixedSize(VideoViewH264m3u8Hw_4D.this.mVideoWidth, VideoViewH264m3u8Hw_4D.this.mVideoHeight);
            }
            if (VideoViewH264m3u8Hw_4D.this.mOnVideoSizeChangedListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, VideoViewH264m3u8Hw_4D.this.mVideoWidth, VideoViewH264m3u8Hw_4D.this.mVideoHeight);
            }
        }
    };

    private OnSuccessListener mSuccessListener = new OnSuccessListener() {

        public void onSuccess() {
            if (VideoViewH264m3u8Hw_4D.this.mOnSuccessListener != null) {
                VideoViewH264m3u8Hw_4D.this.mOnSuccessListener.onSuccess();
            }
            LogTag.i("硬解成功");
            HttpRequestManager.getInstance(VideoViewH264m3u8Hw_4D.this.mContext).hardDecodeReport(VideoViewH264m3u8Hw_4D.this.mPlayerUrl.mVid, VideoViewH264m3u8Hw_4D.this.mUri.toString(), 1, -1, VideoViewH264m3u8Hw_4D.this.mPlayerUrl.mStreamType, 1);
        }
    };

    private int mSurfaceHeight;

    private SurfaceHolder mSurfaceHolder = null;

    private int mSurfaceWidth;

    private int mTargetState = 0;

    private Uri mUri;

    private String mUserName = "0f3b69678cce96c0ee8f6c57e31e1273aa0f280ad5519464f52ef3b874a16b6f";

    private String mVersion;

    private int mVideoHeight;

    private OnVideoViewStateChangeListener mVideoViewStateChangeListener;

    private int mVideoWidth;

    private int mVolumeState;

    private Runnable resyncHaptics = new Runnable() {

        private int lastPos = 0;

        private boolean stalled = false;

        public synchronized void run() {
            int currPos = VideoViewH264m3u8Hw_4D.this.getCurrentPosition();
            if (currPos == this.lastPos || currPos == VideoViewH264m3u8Hw_4D.this.mSeekToPosition) {
                System.out.print("test: haptic sync pausing, currPos=" + currPos + "\n");
                VideoViewH264m3u8Hw_4D.this.mHaptics.pause();
                this.stalled = true;
            } else if (this.stalled) {
                System.out.print("test: haptics sync resuming, currPos=" + currPos + "\n");
                VideoViewH264m3u8Hw_4D.this.mHaptics.resume();
                this.stalled = false;
            }
            this.lastPos = currPos;
            if (VideoViewH264m3u8Hw_4D.this.isHapticUsable()) {
                int returnVal = VideoViewH264m3u8Hw_4D.this.mHaptics.update((long) currPos);
                if (returnVal != 0) {
                    Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics update failed with value: " + ((String) VideoViewH264m3u8Hw_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264m3u8Hw_4D.this.mHaptics.getSDKStatus());
                }
            }
            if (VideoViewH264m3u8Hw_4D.this.isPlaying()) {
                VideoViewH264m3u8Hw_4D.this.getHandler().removeCallbacks(VideoViewH264m3u8Hw_4D.this.resyncHaptics);
                VideoViewH264m3u8Hw_4D.this.postDelayed(VideoViewH264m3u8Hw_4D.this.resyncHaptics, (long) VideoViewH264m3u8Hw_4D.this.mResyncInterval);
            } else {
                this.stalled = false;
            }
        }
    };

    private long time = 0;

    private clreplaced MediaPreparer implements Runnable {

        private boolean mIsPrepared;

        private int mProgress;

        public MediaPreparer(boolean prepared, int progress) {
            this.mIsPrepared = prepared;
            this.mProgress = progress;
            VideoViewH264m3u8Hw_4D.this.mIsMediaPreparing = true;
        }

        public void run() {
            int curProgress = VideoViewH264m3u8Hw_4D.this.getCurrentPosition();
            int delta = curProgress - this.mProgress;
            if (VideoViewH264m3u8Hw_4D.this.mMediaState == 3) {
                if (VideoViewH264m3u8Hw_4D.this.isHapticUsable()) {
                    VideoViewH264m3u8Hw_4D.this.mHaptics.pause();
                }
            } else if ((this.mIsPrepared || delta != 0) && !(this.mIsPrepared && delta == 0)) {
                int returnVal;
                if (this.mIsPrepared) {
                    if (VideoViewH264m3u8Hw_4D.this.isHapticUsable()) {
                        if (VideoViewH264m3u8Hw_4D.this.mMediaState != 0) {
                            returnVal = VideoViewH264m3u8Hw_4D.this.mHaptics.seek(curProgress);
                            if (returnVal != 0) {
                                Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics seek failed with value: " + ((String) VideoViewH264m3u8Hw_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264m3u8Hw_4D.this.mHaptics.getSDKStatus());
                            }
                        }
                        System.out.println("test prepare:resume");
                        returnVal = VideoViewH264m3u8Hw_4D.this.mHaptics.resume();
                        if (returnVal != 0) {
                            Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics resume failed with value: " + ((String) VideoViewH264m3u8Hw_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264m3u8Hw_4D.this.mHaptics.getSDKStatus());
                        }
                    } else {
                        Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics was not initialized yet.");
                    }
                    VideoViewH264m3u8Hw_4D.this.post(VideoViewH264m3u8Hw_4D.this.resyncHaptics);
                    VideoViewH264m3u8Hw_4D.this.post(VideoViewH264m3u8Hw_4D.this.changeResyncInterval);
                    VideoViewH264m3u8Hw_4D.this.mMediaState = 1;
                } else {
                    if (!VideoViewH264m3u8Hw_4D.this.isHapticUsable()) {
                        Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics was not initialized yet.");
                    } else if (VideoViewH264m3u8Hw_4D.this.mMediaLoaded) {
                        returnVal = VideoViewH264m3u8Hw_4D.this.mHaptics.play();
                        if (returnVal != 0) {
                            Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics play failed with value: " + ((String) VideoViewH264m3u8Hw_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264m3u8Hw_4D.this.mHaptics.getSDKStatus());
                        }
                    } else {
                        System.out.println("test mediaprepare else: resume");
                        returnVal = VideoViewH264m3u8Hw_4D.this.mHaptics.resume();
                        if (returnVal != 0) {
                            Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics resume failed with value: " + ((String) VideoViewH264m3u8Hw_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264m3u8Hw_4D.this.mHaptics.getSDKStatus());
                        }
                        VideoViewH264m3u8Hw_4D.this.post(VideoViewH264m3u8Hw_4D.this.resyncHaptics);
                        VideoViewH264m3u8Hw_4D.this.post(VideoViewH264m3u8Hw_4D.this.changeResyncInterval);
                    }
                    VideoViewH264m3u8Hw_4D.this.mMediaState = 1;
                }
                VideoViewH264m3u8Hw_4D.this.mIsSeeked = false;
                VideoViewH264m3u8Hw_4D.this.mIsMediaPreparing = false;
            } else {
                VideoViewH264m3u8Hw_4D.this.mMediaControlsHandler.postDelayed(this, (long) VideoViewH264m3u8Hw_4D.MEDIA_PREPARE_INTERVAL_MS);
            }
        }
    }

    public VideoViewH264m3u8Hw_4D(Context context) {
        super(context);
        this.mContext = context;
        initVideoView();
    }

    public VideoViewH264m3u8Hw_4D(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext = context;
        initVideoView();
    }

    public void setHaptUrl(String url) {
        this.hapt = url;
    }

    private void initVideoView() {
        this.mVideoWidth = 0;
        this.mVideoHeight = 0;
        getHolder().addCallback(this.mSHCallback);
        getHolder().setType(3);
        setFocusable(true);
        setFocusableInTouchMode(true);
        requestFocus();
        this.mCurrentState = 0;
        StateChange(this.mCurrentState);
        this.mTargetState = 0;
    }

    public void setVideoPath(String videoPath) {
        this.mPlayerUrl = new PlayUrl();
        this.mPlayerUrl.setVid(-1);
        this.mPlayerUrl.setUrl(videoPath);
        this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
        setVideoURI(Uri.parse(videoPath));
    }

    public void setVideoPath(String path, Map<String, String> map) {
    }

    public void setVideoURI(Uri uri) {
        String currentDate = Tools.getCurrentDate();
        LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264m3u8Hw(硬解m3u8)  setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
        if (this.mOnMediaStateTimeListener != null) {
            this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
        }
        this.mUri = uri;
        this.mSeekWhenPrepared = 0;
        openVideo();
        requestLayout();
        invalidate();
        LogTag.i(TAG, "uri=" + this.mUri.toString());
    }

    public boolean canPause() {
        return this.mCanPause;
    }

    public boolean canSeekBackward() {
        return this.mCanSeekBack;
    }

    public boolean canSeekForward() {
        return this.mCanSeekForward;
    }

    public int getBufferPercentage() {
        if (this.mMediaPlayer != null) {
            return this.mCurrentBufferPercentage;
        }
        return 0;
    }

    public int getCurrentPosition() {
        if (isInPlaybackState()) {
            return this.mMediaPlayer.getCurrentPosition();
        }
        return 0;
    }

    public int getDuration() {
        if (!isInPlaybackState()) {
            this.mDuration = -1;
            return this.mDuration;
        } else if (this.mDuration > 0) {
            return this.mDuration;
        } else {
            this.mDuration = this.mMediaPlayer.getDuration();
            return this.mDuration;
        }
    }

    public String getSkipLastURL() {
        return this.mLastUrl;
    }

    public String getVersion() {
        return this.mVersion;
    }

    public int getViewWidth() {
        return getLayoutParams().width;
    }

    public int getViewHeight() {
        return getLayoutParams().height;
    }

    public void start() {
        HttpRequestManager.getInstance(this.mContext).requestCapability();
        this.mMediaState = -1;
        this.mVolumeState = 0;
        if (this.mMediaControlsHandler == null) {
            this.mMediaControlsHandler = new Handler();
        }
        if (this.downloadHapt) {
            palyer4dInit();
            return;
        }
        if (!(this.enforcementWait || this.enforcementPause || !isInPlaybackState())) {
            LogTag.i("硬解开始播放");
            this.mMediaPlayer.start();
            init4DMediaPreparer();
        }
        this.mTargetState = 3;
        StateChange(7);
    }

    public void pause() {
        if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
            this.mMediaPlayer.pause();
            this.mCurrentState = 4;
            StateChange(this.mCurrentState);
        }
        this.mTargetState = 4;
    }

    public void seekTo(int mesc) {
        if (isInPlaybackState()) {
            this.mMediaPlayer.seekTo(mesc);
            this.mSeekWhenPrepared = 0;
            this.lastSeekWhenDestoryed = 0;
            return;
        }
        this.mSeekWhenPrepared = mesc;
        this.lastSeekWhenDestoryed = 0;
    }

    public void forward() {
        seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
    }

    public void rewind() {
        seekTo(getCurrentPosition() - 15000);
    }

    public void stopPlayback() {
        stopPlayback(false);
    }

    public void stopPlayback(boolean isRemoveCallBack) {
        StateChange(6);
        if (this.mMediaPlayer != null) {
            String currentDateStop = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateStop + "VideoViewH264m3u8Hw stop()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
            }
            try {
                this.mMediaPlayer.stop();
            } catch (Exception e) {
                LogTag.i(TAG, "hard decode native player has already null");
            }
            int returnVal = this.mHaptics.stop();
            this.mHaptics.dispose();
            if (returnVal != 0) {
                Log.e(TAG, "Haptics stop failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
            }
            if (isRemoveCallBack) {
                getHolder().removeCallback(this.mSHCallback);
            }
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewH264m3u8Hw release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            try {
                this.mMediaPlayer.release();
            } catch (Exception e2) {
                LogTag.i(TAG, "hard decode native player has already null");
            }
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            this.mTargetState = 0;
            setVisibility(4);
        }
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
        int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
        if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
            switch(this.mRatioType) {
                case -1:
                    if (this.mVideoWidth * height <= this.mVideoHeight * width) {
                        if (this.mVideoWidth * height < this.mVideoHeight * width) {
                            width = (this.mVideoWidth * height) / this.mVideoHeight;
                            break;
                        }
                    }
                    height = (this.mVideoHeight * width) / this.mVideoWidth;
                    break;
                    break;
                case 1:
                    if (height * 4 <= width * 3) {
                        if (height * 4 < width * 3) {
                            width = (height * 4) / 3;
                            break;
                        }
                    }
                    height = (width * 3) / 4;
                    break;
                    break;
                case 2:
                    if (height * 16 <= width * 9) {
                        if (height * 16 < width * 9) {
                            width = (height * 16) / 9;
                            break;
                        }
                    }
                    height = (width * 9) / 16;
                    break;
                    break;
            }
        }
        setMeasuredDimension(width, height);
    }

    public void adjust(int type) {
        this.mRatioType = type;
        invalateScreenSize();
    }

    private void invalateScreenSize() {
        setLayoutParams((LayoutParams) getLayoutParams());
    }

    public int resolveAdjustedSize(int desiredSize, int measureSpec) {
        int result = desiredSize;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        switch(specMode) {
            case Integer.MIN_VALUE:
                return Math.min(desiredSize, specSize);
            case 0:
                return desiredSize;
            case 1073741824:
                return specSize;
            default:
                return result;
        }
    }

    public boolean isInPlaybackState() {
        return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
    }

    private void openVideo() {
        if (this.mUri == null || this.mSurfaceHolder == null) {
            setVisibility(0);
            return;
        }
        release(false);
        try {
            String currentDate = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDate + " VideoViewH264m3u8Hw(硬解m3u8)  创建FFMpegPlayer对象");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
            }
            this.mMediaPlayer = new FFMpegPlayer(this.mContext);
            this.mMediaPlayer.setHardwareDecode(1);
            this.mMediaPlayer.setHwCapbility(CodecWrapper.getProfile(), CodecWrapper.getAVCLevel());
            this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
            this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
            this.mDuration = -1;
            this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
            this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
            this.mMediaPlayer.setOnSuccessListener(this.mSuccessListener);
            this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
            this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
            this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
            this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
            this.mMediaPlayer.setOnBlockListener(this.mBlockListener);
            this.mMediaPlayer.setOnDisplayListener(this.mDisplayListener);
            this.mMediaPlayer.setOnHardDecoddErrorListener(this.mHardDecodeErrorListner);
            this.mCurrentBufferPercentage = 0;
            this.mMediaPlayer.setDataSource(this.mContext, this.mUri);
            this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
            this.mMediaPlayer.setAudioStreamType(3);
            this.mMediaPlayer.setScreenOnWhilePlaying(true);
            this.mMediaPlayer.prepareAsync();
            this.mCurrentState = 1;
            attachMediaController();
        } catch (IllegalStateException ex) {
            LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex);
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        } catch (IllegalArgumentException e) {
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        } catch (IOException e2) {
            this.mCurrentState = -1;
            StateChange(this.mCurrentState);
            this.mTargetState = -1;
            this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
        }
    }

    public void setMediaController(MediaController controller) {
        if (this.mMediaController != null) {
            this.mMediaController.hide();
        }
        this.mMediaController = controller;
        attachMediaController();
    }

    private void attachMediaController() {
        if (this.mMediaPlayer != null && this.mMediaController != null) {
            View anchorView;
            this.mMediaController.setMediaPlayer(this);
            if (getParent() instanceof View) {
                anchorView = (View) getParent();
            } else {
                anchorView = this;
            }
            this.mMediaController.setAnchorView(anchorView);
            this.mMediaController.setEnabled(isInPlaybackState());
        }
    }

    private void setVideoViewScale(int width, int height) {
        LayoutParams lp = (LayoutParams) getLayoutParams();
        lp.height = height;
        lp.width = width;
        setLayoutParams(lp);
    }

    private void release(boolean cleartargetstate) {
        if (this.mMediaPlayer != null) {
            String currentDateStop = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateStop + "VideoViewH264m3u8Hw stop()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
            }
            this.mMediaPlayer.stop();
            int returnVal = this.mHaptics.stop();
            Log.e(TAG, "Haptic dispose " + this.mHaptics.getSDKStatus());
            this.mHaptics.dispose();
            if (returnVal != 0) {
                Log.e(TAG, "Haptics stop failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
            }
            String currentDateRelease = Tools.getCurrentDate();
            LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间:  " + currentDateRelease + "VideoViewH264m3u8Hw release()");
            if (this.mOnMediaStateTimeListener != null) {
                this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
            }
            this.mMediaPlayer.release();
            this.mMediaPlayer = null;
            this.mCurrentState = 0;
            StateChange(this.mCurrentState);
            if (cleartargetstate) {
                this.mTargetState = 0;
            }
        }
    }

    public boolean onTouchEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onTrackballEvent(MotionEvent ev) {
        if (isInPlaybackState() && this.mMediaController != null) {
            toggleMediaControlsVisiblity();
        }
        return false;
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        boolean isKeyCodeSupported;
        if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
            isKeyCodeSupported = false;
        } else {
            isKeyCodeSupported = true;
        }
        if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
            if (keyCode == 79 || keyCode == 85) {
                if (this.mMediaPlayer.isPlaying()) {
                    pause();
                    this.mMediaController.show();
                    return true;
                }
                start();
                this.mMediaController.hide();
                return true;
            } else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
                pause();
                this.mMediaController.show();
            } else {
                toggleMediaControlsVisiblity();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    private void toggleMediaControlsVisiblity() {
        if (this.mMediaController.isShowing()) {
            this.mMediaController.hide();
        } else {
            this.mMediaController.show();
        }
    }

    public boolean isPlaying() {
        return isInPlaybackState() && this.mMediaPlayer.isPlaying();
    }

    public boolean isPaused() {
        return this.mCurrentState == 4;
    }

    public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
        this.mOnSeekCompleteListener = l;
    }

    public int getLastSeekWhenDestoryed() {
        return this.lastSeekWhenDestoryed;
    }

    public int getAudioSessionId() {
        return 0;
    }

    public boolean isEnforcementWait() {
        return this.enforcementWait;
    }

    public void setEnforcementWait(boolean enforcementWait) {
        this.enforcementWait = enforcementWait;
    }

    public boolean isEnforcementPause() {
        return this.enforcementPause;
    }

    public void setEnforcementPause(boolean enforcementPause) {
        this.enforcementPause = enforcementPause;
    }

    public View getView() {
        return this;
    }

    private void StateChange(int mCurrentState) {
        if (this.mVideoViewStateChangeListener != null) {
            this.mVideoViewStateChangeListener.onChange(mCurrentState);
        }
    }

    public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener listener) {
        this.mVideoViewStateChangeListener = listener;
    }

    public void setOnInfoListener(OnInfoListener l) {
        this.mOnInfoListener = l;
    }

    public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
        this.mOnVideoSizeChangedListener = l;
    }

    public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
        this.mOnBufferingUpdateListener = l;
    }

    public void setOnPreparedListener(OnPreparedListener l) {
        this.mOnPreparedListener = l;
    }

    public void setOnCompletionListener(OnCompletionListener l) {
        this.mOnCompletionListener = l;
    }

    public void setOnErrorListener(OnErrorListener l) {
        this.mOnErrorListener = l;
    }

    public void setOnSuccessListener(OnSuccessListener l) {
        this.mOnSuccessListener = l;
    }

    public void setVideoPlayUrl(PlayUrl url) {
        this.mPlayerUrl = url;
        setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
    }

    public void setOnAdNumberListener(OnAdNumberListener l) {
    }

    public void setCacheSize(int video_size, int audio_size, int picture_size, int startpic_size) {
    }

    public void setOnBlockListener(OnBlockListener l) {
        this.mOnBlockListener = l;
    }

    public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
        this.mOnMediaStateTimeListener = l;
    }

    public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
        this.mOnHardDecodeErrorListner = l;
    }

    public void initHapticValues() {
        this.mErrorValues = new HashMap();
        this.mErrorValues.put(Integer.valueOf(0), SUCCESS);
        this.mErrorValues.put(Integer.valueOf(-1), INVALID);
        this.mErrorValues.put(Integer.valueOf(-2), INACCESSIBLE_URL);
        this.mErrorValues.put(Integer.valueOf(-3), PERMISSION_DENIED);
        this.mErrorValues.put(Integer.valueOf(-4), MALFORMED_URL);
        this.mErrorValues.put(Integer.valueOf(-5), UNSUPPORTED_PROTOCOL);
    }

    private boolean isHapticUsable() {
        return this.mHapticState == 1;
    }

    public void palyer4dInit() {
        this.mMediaState = -1;
        this.mVolumeState = 0;
        initHapticValues();
        this.mHaptics = HapticContentSDKFactory.GetNewSDKInstance(0, this.mContext, this.mUserName, this.mPreplacedsword, HapticContentSDK.DEFAULT_DNS);
        if (this.mHaptics == null) {
            Log.e(TAG, "Could not get new Haptic SDK Instance!");
            this.mHapticState = -1;
        } else {
            this.mHapticState = 0;
        }
        this.mSavedPos = 0;
        this.mMediaControlsHandler = new Handler();
        if (this.mHapticState == 0) {
            int returnVal = this.mHaptics.openHaptics(this.hapt);
            if (returnVal == 0) {
                this.mHapticState = 1;
                this.downloadHapt = false;
            } else {
                Log.e(TAG, "Haptics open failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
            }
        }
        if (!(this.enforcementWait || this.enforcementPause || !isInPlaybackState())) {
            this.mMediaPlayer.start();
            System.out.println("test is start");
            this.mCurrentState = 3;
            StateChange(this.mCurrentState);
            if (this.mMediaLoaded) {
                this.mMediaControlsHandler.post(new MediaPreparer(true, getCurrentPosition()));
            } else {
                this.mMediaControlsHandler.post(new MediaPreparer(false, getCurrentPosition()));
            }
        }
        this.mTargetState = 3;
        StateChange(7);
    }

    public void init4DMediaPreparer() {
        if (this.mMediaLoaded) {
            this.mMediaControlsHandler.post(new MediaPreparer(true, getCurrentPosition()));
        } else {
            this.mMediaControlsHandler.post(new MediaPreparer(false, getCurrentPosition()));
        }
    }

    public void palyer4dContrlHandle(int seekToPosition) {
        postDelayed(this.resyncHaptics, (long) INITIAL_RESYNC_INTERVAL_MS);
        postDelayed(this.changeResyncInterval, (long) INITIAL_RESYNC_INTERVAL_MS);
        this.mSavedPos = seekToPosition;
        if (this.mSavedPos == 0) {
            this.mMediaControlsHandler.post(new MediaPreparer(false, 0));
        } else {
            this.mMediaState = 2;
        }
    }

    public void setHapticMute(boolean disable) {
        int returnVal;
        if (disable) {
            if (isHapticUsable()) {
                returnVal = this.mHaptics.mute();
                if (returnVal == 0) {
                    this.mVolumeState = 1;
                } else {
                    Log.e(TAG, "Haptics mute failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
                }
            }
        } else if (isHapticUsable()) {
            returnVal = this.mHaptics.unmute();
            if (returnVal == 0) {
                this.mVolumeState = 0;
            } else {
                Log.e(TAG, "Haptics unmute failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
            }
        }
    }
}

14 Source : VideoActivity.java
with MIT License
from crm416

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_video);
    // Load the appropriate URL in the VideoView.
    final String youtubeId = getIntent().getStringExtra(Keys.YOUTUBE_ID);
    final String videoUrl = UrlBuilder.forYoutubeId(youtubeId);
    final VideoView videoView = (VideoView) findViewById(R.id.video_view);
    videoView.setVideoPath(videoUrl);
    videoView.start();
    // Add a MediaController, which gives us play/pause, etc.
    final MediaController mediaController = new MediaController(this);
    mediaController.setAnchorView(videoView);
    videoView.setMediaController(mediaController);
}

13 Source : VideoPlayerActivity.java
with MIT License
from CommonsLab

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_video_player);
    videoView = (VideoView) findViewById(R.id.videoView);
    loadingScreen = (FrameLayout) findViewById(R.id.progressBarContainer);
    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {
            loadingScreen.setVisibility(View.GONE);
        }
    });
    this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    int playerLocation = -1;
    if (savedInstanceState != null) {
        if (localVideoURI == null) {
            contribution = savedInstanceState.getParcelable("Contribution");
            thumbnailURL = savedInstanceState.getString("ThumbnailURL");
        } else {
            localVideoURI = savedInstanceState.getString("VideoURI");
        }
        playerLocation = savedInstanceState.getInt("Location");
    } else {
        contribution = getIntent().getExtras().getParcelable("Contribution");
        thumbnailURL = getIntent().getExtras().getString("ThumbnailURL");
        localVideoURI = getIntent().getExtras().getString("LocalVideoURI");
    }
    MediaController mediaController = new MediaController(this);
    mediaController.setAnchorView(videoView);
    if (localVideoURI == null) {
        if (contribution != null) {
            Uri uri = Uri.parse(contribution.getUrl());
            videoView.setMediaController(mediaController);
            videoView.setVideoURI(uri);
            if (playerLocation != -1)
                videoView.seekTo(playerLocation);
            videoView.start();
        } else
            Toast.makeText(this, R.string.an_error_accourred, Toast.LENGTH_SHORT).show();
    } else {
        // Playing local video
        Uri uri = Uri.parse(localVideoURI);
        videoView.setMediaController(mediaController);
        videoView.setVideoURI(uri);
        if (playerLocation != -1)
            videoView.seekTo(playerLocation);
        videoView.start();
    }
}

See More Examples