3 * Copyright (C) 2014 Sebastian Dröge <sebastian@centricular.com>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
21 package org.freedesktop.gstreamer.play;
23 import java.text.SimpleDateFormat;
24 import java.util.Date;
25 import java.util.TimeZone;
27 import android.content.Context;
28 import android.content.Intent;
29 import android.os.Bundle;
30 import android.os.PowerManager;
31 import android.util.Log;
32 import android.view.SurfaceHolder;
33 import android.view.SurfaceView;
34 import android.view.View;
35 import android.view.View.OnClickListener;
36 import android.widget.ImageButton;
37 import android.widget.SeekBar;
38 import android.widget.SeekBar.OnSeekBarChangeListener;
39 import android.widget.TextView;
40 import android.widget.Toast;
41 import android.support.v7.app.AppCompatActivity;
43 import org.freedesktop.gstreamer.Player;
45 public class Play extends AppCompatActivity implements SurfaceHolder.Callback, OnSeekBarChangeListener {
46 private PowerManager.WakeLock wake_lock;
47 private Player player;
50 public void onCreate(Bundle savedInstanceState)
52 super.onCreate(savedInstanceState);
56 } catch (Exception e) {
57 Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
62 setContentView(R.layout.main);
64 player = new Player();
66 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
67 wake_lock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GStreamer Play");
68 wake_lock.setReferenceCounted(false);
70 ImageButton play = (ImageButton) this.findViewById(R.id.button_play);
71 play.setOnClickListener(new OnClickListener() {
72 public void onClick(View v) {
78 ImageButton pause = (ImageButton) this.findViewById(R.id.button_pause);
79 pause.setOnClickListener(new OnClickListener() {
80 public void onClick(View v) {
86 final SeekBar sb = (SeekBar) this.findViewById(R.id.seek_bar);
87 sb.setOnSeekBarChangeListener(this);
89 player.setPositionUpdatedListener(new Player.PositionUpdatedListener() {
90 public void positionUpdated(Player player, final long position) {
91 runOnUiThread (new Runnable() {
93 sb.setProgress((int) (position / 1000000));
100 player.setDurationChangedListener(new Player.DurationChangedListener() {
101 public void durationChanged(Player player, final long duration) {
102 runOnUiThread (new Runnable() {
104 sb.setMax((int) (duration / 1000000));
111 final GStreamerSurfaceView gsv = (GStreamerSurfaceView) this.findViewById(R.id.surface_video);
112 player.setVideoDimensionsChangedListener(new Player.VideoDimensionsChangedListener() {
113 public void videoDimensionsChanged(Player player, final int width, final int height) {
114 runOnUiThread (new Runnable() {
116 Log.i ("GStreamer", "Media size changed to " + width + "x" + height);
117 gsv.media_width = width;
118 gsv.media_height = height;
119 runOnUiThread(new Runnable() {
129 SurfaceHolder sh = gsv.getHolder();
130 sh.addCallback(this);
132 String mediaUri = null;
133 Intent intent = getIntent();
134 android.net.Uri uri = intent.getData();
135 Log.i ("GStreamer", "Received URI: " + uri);
137 if (uri.getScheme().equals("content")) {
138 android.database.Cursor cursor = getContentResolver().query(uri, null, null, null, null);
139 cursor.moveToFirst();
140 mediaUri = "file://" + cursor.getString(cursor.getColumnIndex(android.provider.MediaStore.Video.Media.DATA));
143 mediaUri = uri.toString();
145 player.setUri(mediaUri);
151 protected void onDestroy() {
156 private void updateTimeWidget () {
157 final TextView tv = (TextView) this.findViewById(R.id.textview_time);
158 final SeekBar sb = (SeekBar) this.findViewById(R.id.seek_bar);
159 final int pos = sb.getProgress();
160 final int max = sb.getMax();
162 SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
163 df.setTimeZone(TimeZone.getTimeZone("UTC"));
164 final String message = df.format(new Date (pos)) + " / " + df.format(new Date (max));
168 public void surfaceChanged(SurfaceHolder holder, int format, int width,
170 Log.d("GStreamer", "Surface changed to format " + format + " width "
171 + width + " height " + height);
172 player.setSurface(holder.getSurface());
175 public void surfaceCreated(SurfaceHolder holder) {
176 Log.d("GStreamer", "Surface created: " + holder.getSurface());
179 public void surfaceDestroyed(SurfaceHolder holder) {
180 Log.d("GStreamer", "Surface destroyed");
181 player.setSurface(null);
184 public void onProgressChanged(SeekBar sb, int progress, boolean fromUser) {
185 if (!fromUser) return;
190 public void onStartTrackingTouch(SeekBar sb) {
193 public void onStopTrackingTouch(SeekBar sb) {
194 Log.d("GStreamer", "Seek to " + sb.getProgress());
195 player.seek(((long) sb.getProgress()) * 1000000);