Merging gst-examples
[platform/upstream/gstreamer.git] / subprojects / gst-examples / playback / player / android / app / src / main / java / org / freedesktop / gstreamer / play / Play.java
1 /* GStreamer
2  *
3  * Copyright (C) 2014 Sebastian Dröge <sebastian@centricular.com>
4  *
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.
9  *
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.
14  *
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.
19  */
20
21 package org.freedesktop.gstreamer.play;
22
23 import java.text.SimpleDateFormat;
24 import java.util.Date;
25 import java.util.TimeZone;
26
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;
42
43 import org.freedesktop.gstreamer.Player;
44
45 public class Play extends AppCompatActivity implements SurfaceHolder.Callback, OnSeekBarChangeListener {
46     private PowerManager.WakeLock wake_lock;
47     private Player player;
48
49     @Override
50     public void onCreate(Bundle savedInstanceState)
51     {
52         super.onCreate(savedInstanceState);
53
54         try {
55             Player.init(this);
56         } catch (Exception e) {
57             Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
58             finish();
59             return;
60         }
61
62         setContentView(R.layout.main);
63
64         player = new Player();
65
66         PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
67         wake_lock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GStreamer Play");
68         wake_lock.setReferenceCounted(false);
69
70         ImageButton play = (ImageButton) this.findViewById(R.id.button_play);
71         play.setOnClickListener(new OnClickListener() {
72             public void onClick(View v) {
73                 player.play();
74                 wake_lock.acquire();
75             }
76         });
77
78         ImageButton pause = (ImageButton) this.findViewById(R.id.button_pause);
79         pause.setOnClickListener(new OnClickListener() {
80             public void onClick(View v) {
81                 player.pause();
82                 wake_lock.release();
83             }
84         });
85
86         final SeekBar sb = (SeekBar) this.findViewById(R.id.seek_bar);
87         sb.setOnSeekBarChangeListener(this);
88
89         player.setPositionUpdatedListener(new Player.PositionUpdatedListener() {
90             public void positionUpdated(Player player, final long position) {
91                 runOnUiThread (new Runnable() {
92                     public void run() {
93                         sb.setProgress((int) (position / 1000000));
94                         updateTimeWidget();
95                     }
96                 });
97             }
98         });
99
100         player.setDurationChangedListener(new Player.DurationChangedListener() {
101             public void durationChanged(Player player, final long duration) {
102                 runOnUiThread (new Runnable() {
103                     public void run() {
104                         sb.setMax((int) (duration / 1000000));
105                         updateTimeWidget();
106                     }
107                 });
108             }
109         });
110
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() {
115                     public void run() {
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() {
120                             public void run() {
121                                 gsv.requestLayout();
122                             }
123                         });
124                     }
125                 });
126             }
127         });
128
129         SurfaceHolder sh = gsv.getHolder();
130         sh.addCallback(this);
131
132         String mediaUri = null;
133         Intent intent = getIntent();
134         android.net.Uri uri = intent.getData();
135         Log.i ("GStreamer", "Received URI: " + uri);
136         if (uri != null) {
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));
141                 cursor.close();
142             } else {
143                 mediaUri = uri.toString();
144             }
145             player.setUri(mediaUri);
146         }
147
148         updateTimeWidget();
149     }
150
151     protected void onDestroy() {
152         player.close();
153         super.onDestroy();
154     }
155
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();
161
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));
165         tv.setText(message);
166     }
167
168     public void surfaceChanged(SurfaceHolder holder, int format, int width,
169             int height) {
170         Log.d("GStreamer", "Surface changed to format " + format + " width "
171                 + width + " height " + height);
172         player.setSurface(holder.getSurface());
173     }
174
175     public void surfaceCreated(SurfaceHolder holder) {
176         Log.d("GStreamer", "Surface created: " + holder.getSurface());
177     }
178
179     public void surfaceDestroyed(SurfaceHolder holder) {
180         Log.d("GStreamer", "Surface destroyed");
181         player.setSurface(null);
182     }
183
184     public void onProgressChanged(SeekBar sb, int progress, boolean fromUser) {
185         if (!fromUser) return;
186
187         updateTimeWidget();
188     }
189
190     public void onStartTrackingTouch(SeekBar sb) {
191     }
192
193     public void onStopTrackingTouch(SeekBar sb) {
194         Log.d("GStreamer", "Seek to " + sb.getProgress());
195         player.seek(((long) sb.getProgress()) * 1000000);
196     }
197 }