Fix issue when fullscreen
[rtmpclient.git] / app / src / main / java / ai / suanzi / rtmpclient / MainActivity.java
1 package ai.suanzi.rtmpclient;
2
3 import android.content.IntentFilter;
4 import android.hardware.Camera;
5 import android.net.Uri;
6 import android.support.design.widget.TextInputEditText;
7 import android.support.v7.app.ActionBar;
8 import android.support.v7.app.AppCompatActivity;
9 import android.os.Bundle;
10 import android.util.DisplayMetrics;
11 import android.util.Log;
12 import android.view.SurfaceHolder;
13 import android.view.SurfaceView;
14 import android.view.View;
15 import android.view.Window;
16 import android.view.WindowManager;
17 import android.widget.Button;
18 import android.widget.Toast;
19 import android.content.Context;
20
21 import java.io.File;
22 import android.content.Intent;
23 import de.mindpipe.android.logging.log4j.LogConfigurator;
24 import org.apache.log4j.Level;
25 import org.apache.log4j.Logger;
26 import android.net.wifi.WifiManager;
27 import android.net.wifi.WifiInfo;
28 import android.content.ServiceConnection;
29 import android.content.ComponentName;
30
31 import ai.suanzi.rtmpclient.MyService.LocalBinder;
32 import android.os.IBinder;
33 import android.net.ConnectivityManager;
34 import android.view.ViewGroup;
35 import org.apache.http.impl.client.HttpClients;
36 import org.apache.http.impl.client.CloseableHttpClient;
37 import org.apache.http.client.methods.CloseableHttpResponse;
38
39 //import org.apache.http.client.methods;
40 import android.view.MotionEvent;
41 import android.graphics.Color;
42 import android.os.Build;
43 import android.content.pm.ActivityInfo;
44 import android.view.Display;
45 import android.graphics.Point;
46
47 public class MainActivity extends AppCompatActivity implements MyService.MyServiceEventListener, CameraView.Callback {
48
49     private Logger gLogger;
50     private NetworkMonitor networkMonitor;
51     private UsbMonitor mUsbMonitor;
52     private ServiceHealthMonitor mServiceHealthMonitor;
53     private static final int INTERVAL = 3 * 60; // seconds
54
55     boolean mBounded = false;
56     MyService mServer;
57     Intent mIntent;
58     private boolean isFullScreen = false;
59
60     private CameraView mCameraView;
61
62     private void init(){
63
64         mIntent = new Intent(this, MyService.class);
65         mUsbMonitor = new UsbMonitor(new UsbMonitor.UsbListener() {
66             @Override
67             public void onCameraConnected() {
68                 gLogger.error("onCameraConnected, current Usb Camera count: " + mUsbMonitor.getUsbCameraCount());
69                 doUnbindService();
70                 if(mUsbMonitor.hasUsbCamera()){
71                     doBindService();
72                 }
73             }
74
75             @Override
76             public void onCameraDisconnected() {
77                 gLogger.error("onCameraDisconnected, current camera count: " + mUsbMonitor.getUsbCameraCount());
78                 doUnbindService();
79                 if(mUsbMonitor.hasUsbCamera()){
80                     doBindService();
81                 }
82             }
83         }, this);
84
85         networkMonitor = new NetworkMonitor(new NetworkMonitor.NetworkListener() {
86             @Override
87             public void onWifiConnected() {
88                 gLogger.error("onWifiConnected");
89                 doBindService();
90             }
91
92             @Override
93             public void onWifiDisconnected() {
94                 gLogger.error("onWifiDisconnected");
95                 doUnbindService();
96             }
97
98             @Override
99             public void onWifiEnabled() {
100                 gLogger.error("onWifiEnabled");
101             }
102
103             @Override
104             public void onWifiDisabled() {
105                 gLogger.error("onWifiDisabled");
106             }
107         });
108         IntentFilter filter = new IntentFilter();
109         filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
110         registerReceiver(networkMonitor, filter);
111
112         mServiceHealthMonitor = new ServiceHealthMonitor(new ServiceHealthMonitor.Callback() {
113             @Override
114             public void onNotHealthy() {
115                 gLogger.error("onNotHealthy, in " + INTERVAL + " seconds, the publishing may stopped or have error ");
116                 doUnbindService();
117                 doBindService();
118             }
119         });
120         mServiceHealthMonitor.setInterval(INTERVAL);
121     }
122
123
124     ServiceConnection mConnection = new ServiceConnection() {
125         @Override
126         public void onServiceDisconnected(ComponentName name) {
127             Toast.makeText(MainActivity.this, "Service is disconnected", 1000).show();
128             gLogger.error("onServiceDisconnected ---------->");
129             mBounded = false;
130             mServer = null;
131         }
132
133         @Override
134         public void onServiceConnected(ComponentName name, IBinder service) {
135             Toast.makeText(MainActivity.this, "Service is connected", 1000).show();
136             gLogger.error("onServiceConnected ---------->");
137             mBounded = true;
138             LocalBinder mLocalBinder = (LocalBinder)service;
139             mServer = mLocalBinder.getServiceInstance();
140             mServer.setServiceEventListener(MainActivity.this);
141             if(mServer.setRtmpUrl(UserInfo.toUrl())){
142                 mServer.startPreview(mCameraView.getHolder());
143                 Camera.Size cs = mServer.getBestPictureSize();
144                 mCameraView.setLayout(cs.width, cs.height);
145             } else {
146                 gLogger.error("onServiceConnected - setRtmpUrl failed");
147             }
148         }
149     };
150
151     private void doBindService(){
152         gLogger.debug("doBindService");
153         if(!mBounded && canStartService()) {
154             gLogger.debug("Start service --------->");
155             bindService(mIntent, mConnection, BIND_AUTO_CREATE);
156         }
157     }
158
159     private void doUnbindService() {
160         gLogger.debug("doUnbindService");
161         if(mBounded){
162             gLogger.debug("Stop service <---------");
163             unbindService(mConnection);
164             mBounded = false;
165         }
166     }
167
168     private class ScreenSize {
169         public ScreenSize(){ }
170         public int width = 0;
171         public int height = 0;
172     }
173
174     private ScreenSize getScreenSize(){
175         ScreenSize size = new ScreenSize();
176         WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
177         final Display display = windowManager.getDefaultDisplay();
178         Point outPoint = new Point();
179         if(Build.VERSION.SDK_INT >= 19) {
180             display.getRealSize(outPoint); // include navigation bar
181         } else {
182             display.getSize(outPoint); // exclude navigation bar
183         }
184         size.width = outPoint.x;
185         size.height = outPoint.y;
186
187         /*if(outPoint.y > outPoint.x) {
188             size.height = outPoint.y;
189             size.width = outPoint.x;
190         } else {
191             size.height = outPoint.x;
192             size.width = outPoint.y;
193         }*/
194         return size;
195     }
196
197     private void initCameraView (){
198 //        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
199 //        requestWindowFeature(Window.FEATURE_NO_TITLE);
200 //        getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
201 //        ///setContentView(R.layout.activity_main);
202 //        //getWindow().setNavigationBarColor(Color.TRANSPARENT);
203 //
204 //        View decorView = getWindow().getDecorView();
205 //        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
206 //                | View.SYSTEM_UI_FLAG_FULLSCREEN;
207 //        decorView.setSystemUiVisibility(uiOptions);
208 //
209 //
210 //        ActionBar actionBar = getSupportActionBar();
211 //        try {
212 //            actionBar.hide();
213 //        }catch (NullPointerException e){
214 //            gLogger.error("initCameraView - " + e.getMessage());
215 //            e.printStackTrace();
216 //        }
217
218
219
220 //        DisplayMetrics outMetrics = new DisplayMetrics();
221 //        this.getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
222 //
223 //        CameraView.SCREEN_WIDTH = outMetrics.widthPixels;
224 //        CameraView.SCREEN_HEIGHT = outMetrics.heightPixels;
225 //        gLogger.debug("Screen size is w: " + CameraView.SCREEN_WIDTH  + ", h: " + CameraView.SCREEN_HEIGHT);
226
227         ScreenSize size = getScreenSize();
228
229         CameraView.SCREEN_WIDTH = size.width;
230         CameraView.SCREEN_HEIGHT = size.height;
231         gLogger.debug("Screen size is w: " + CameraView.SCREEN_WIDTH  + ", h: " + CameraView.SCREEN_HEIGHT);
232
233
234         mCameraView = new CameraView(getApplicationContext(), this);
235         setContentView(R.layout.activity_main);
236
237         ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(640, 480);
238         addContentView(mCameraView, lp);
239         //setContentView(mCameraView);
240     }
241     @Override
242     protected void onCreate(Bundle savedInstanceState) {
243         super.onCreate(savedInstanceState);
244         LogUtil.config(this);
245         gLogger = Logger.getLogger(getClass());
246         gLogger.error("onCreate ---------> ");
247         UserInfo.readConfig(getExternalFilesDir(null) + File.separator + "config", getMacAddr());
248         initCameraView();
249         init();
250
251         if(canStartService()){
252             gLogger.error("Current network is available");
253             doBindService();
254         } else {
255             gLogger.error("Current network NOT available or no USB Camera connected");
256         }
257
258         if(!mServiceHealthMonitor.isAlive()) {
259             gLogger.debug("mServiceHealthMonitor start, interval " + INTERVAL);
260             mServiceHealthMonitor.start();
261         }
262         ////////// LogUtil.sendLogs();  /// Log test
263         //LogUtil.sendLogs();
264         // test
265         //new CheckVersionInfoTask(MainActivity.this).execute();
266     }
267
268     @Override
269     protected void onPause(){
270         super.onPause();
271         gLogger.debug("OnPause --------->");
272     }
273
274     @Override
275     protected void onResume() {
276         super.onResume();
277         gLogger.debug("OnResume ---------> ");
278     }
279
280     @Override
281     protected void onStop() {
282         super.onStop();
283         gLogger.debug("onStop --------->");
284     }
285
286     @Override
287     protected void onStart(){
288         super.onStart();
289         gLogger.debug("onStart --------->");
290     }
291
292     @Override
293     protected void onDestroy(){
294         super.onDestroy();
295         mUsbMonitor.unregisterReceiver();
296         unregisterReceiver(networkMonitor);
297         unbindService(mConnection);
298         gLogger.debug("onDestroy --------->");
299     }
300
301     @Override
302     protected void onRestart(){
303         super.onRestart();
304         gLogger.debug("onRestart ---------->");
305     }
306
307     @Override
308     public void onBackPressed() {
309         gLogger.debug("onBackPressed  --------->");
310         Intent intent = new Intent(Intent.ACTION_MAIN);
311         intent.addCategory(Intent.CATEGORY_HOME);
312         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
313         startActivity(intent);
314     }
315
316     @Override
317     public boolean onTouchEvent(MotionEvent event) {
318         if(event.getAction() == MotionEvent.ACTION_UP) {
319             toggleFullScreen();
320         }
321         return super.onTouchEvent(event);
322     }
323
324     @Override
325     public void onWindowFocusChanged(boolean hasFocus) {
326         super.onWindowFocusChanged(hasFocus);
327         if (hasFocus && Build.VERSION.SDK_INT >= 19) {
328             toggleFullScreen();
329         }
330     }
331
332     private String getMacAddr() {
333         WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
334         WifiInfo info = manager.getConnectionInfo();
335         gLogger.debug("Mac Address is " + info.getMacAddress());
336         return info.getMacAddress().replace(":", ""); //02:00:00:00:00:00 - 020000000000
337     }
338
339     private boolean canStartService(){
340
341         if(System.getProperty("os.arch").equals("i686")){
342             return  true;
343         }
344         return mUsbMonitor.hasUsbCamera() && NetworkMonitor.isNetworkAvailable(this);
345     }
346
347     // MyServiceEventListener
348     @Override
349     public void onCameraError(String msg){
350         gLogger.error("onCameraEvent " + msg);
351         //if(mUsbMonitor.hasUsbCamera()){
352             //mServer.reopenCamera();
353         //}
354     }
355
356     @Override
357     public void onEncoderError(String msg){
358         gLogger.error("onEncoderError: " + msg);
359         doUnbindService();
360         doBindService();
361     }
362
363     @Override
364     public void onPublishing(String msg){
365         mServiceHealthMonitor.record();
366     }
367
368     @Override
369     public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height){
370         if(mServer != null){
371             mServer.startPreview(holder);
372         }
373     }
374
375     private void restartApplication() {
376         final Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName());
377         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
378         startActivity(intent);
379     }
380
381     private void toggleFullScreen (){
382         View decorView = getWindow().getDecorView();
383         if(!isFullScreen) {
384             decorView.setSystemUiVisibility(
385                     View.SYSTEM_UI_FLAG_LAYOUT_STABLE
386                             | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
387                             | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
388                             | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
389                             | View.SYSTEM_UI_FLAG_FULLSCREEN
390                             | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
391         } else {
392             decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_VISIBLE);
393         }
394         isFullScreen = !isFullScreen;
395     }
396 }