Add MailUtil and send log mail
[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.support.design.widget.TextInputEditText;
6 import android.support.v7.app.ActionBar;
7 import android.support.v7.app.AppCompatActivity;
8 import android.os.Bundle;
9 import android.util.DisplayMetrics;
10 import android.util.Log;
11 import android.view.SurfaceHolder;
12 import android.view.SurfaceView;
13 import android.view.View;
14 import android.view.Window;
15 import android.view.WindowManager;
16 import android.widget.Button;
17 import android.widget.Toast;
18 import android.content.Context;
19
20 import java.io.File;
21 import android.content.Intent;
22 import de.mindpipe.android.logging.log4j.LogConfigurator;
23 import org.apache.log4j.Level;
24 import org.apache.log4j.Logger;
25 import android.net.wifi.WifiManager;
26 import android.net.wifi.WifiInfo;
27 import android.content.ServiceConnection;
28 import android.content.ComponentName;
29
30 import ai.suanzi.rtmpclient.MyService.LocalBinder;
31 import android.os.IBinder;
32 import android.net.ConnectivityManager;
33 import android.view.ViewGroup;
34
35 //"rtmp://gpussh.suanzi.ai:1935/myapp/suanzi_ac83f34ead90";
36
37 public class MainActivity extends AppCompatActivity implements MyService.MyServiceEventListener, CameraView.Callback {
38
39     //private static final String TAG = "MainActivity";
40     private Logger gLogger;
41
42     private String mMacAddr = "";
43     private NetworkMonitor networkMonitor;
44     private UsbMonitor mUsbMonitor;
45     private ServiceHealthMonitor mServiceHealthMonitor;
46     private static final int INTERVAL = 3 * 60; // seconds
47
48     boolean mBounded = false;
49     MyService mServer;
50     Intent mIntent;
51
52     private CameraView mCameraView;
53
54     private void init(){
55         // set config file
56         UserInfo.setConfigPath(getExternalFilesDir(null) + File.separator + "config");
57
58         this.mMacAddr = getMacAddr();
59
60         mIntent = new Intent(this, MyService.class);
61         mUsbMonitor = new UsbMonitor(new UsbMonitor.UsbListener() {
62             @Override
63             public void onCameraConnected() {
64                 gLogger.error("onCameraConnected, current Usb Camera count: " + mUsbMonitor.getUsbCameraCount());
65                 doUnbindService();
66                 if(mUsbMonitor.hasUsbCamera()){
67                     doBindService();
68                 }
69             }
70
71             @Override
72             public void onCameraDisconnected() {
73                 gLogger.error("onCameraDisconnected, current camera count: " + mUsbMonitor.getUsbCameraCount());
74                 doUnbindService();
75                 if(mUsbMonitor.hasUsbCamera()){
76                     doBindService();
77                 }
78             }
79         }, this);
80
81         networkMonitor = new NetworkMonitor(new NetworkMonitor.NetworkListener() {
82             @Override
83             public void onWifiConnected() {
84                 gLogger.error("onWifiConnected");
85                 doBindService();
86             }
87
88             @Override
89             public void onWifiDisconnected() {
90                 gLogger.error("onWifiDisconnected");
91                 doUnbindService();
92             }
93
94             @Override
95             public void onWifiEnabled() {
96                 gLogger.error("onWifiEnabled");
97             }
98
99             @Override
100             public void onWifiDisabled() {
101                 gLogger.error("onWifiDisabled");
102             }
103         });
104         IntentFilter filter = new IntentFilter();
105         filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
106         registerReceiver(networkMonitor, filter);
107
108         mServiceHealthMonitor = new ServiceHealthMonitor(new ServiceHealthMonitor.Callback() {
109             @Override
110             public void onNotHealthy() {
111                 gLogger.error("onNotHealthy, in " + INTERVAL + " seconds, the publishing may stopped or have error ");
112                 doUnbindService();
113                 doBindService();
114             }
115         });
116         mServiceHealthMonitor.setInterval(INTERVAL);
117     }
118
119
120     ServiceConnection mConnection = new ServiceConnection() {
121         @Override
122         public void onServiceDisconnected(ComponentName name) {
123             Toast.makeText(MainActivity.this, "Service is disconnected", 1000).show();
124             gLogger.error("onServiceDisconnected ---------->");
125             mBounded = false;
126             mServer = null;
127         }
128
129         @Override
130         public void onServiceConnected(ComponentName name, IBinder service) {
131             Toast.makeText(MainActivity.this, "Service is connected", 1000).show();
132             gLogger.error("onServiceConnected ---------->");
133             mBounded = true;
134             LocalBinder mLocalBinder = (LocalBinder)service;
135             mServer = mLocalBinder.getServiceInstance();
136             mServer.setServiceEventListener(MainActivity.this);
137             if(mServer.setRtmpUrl(UserInfo.getConfig().toUrl(mMacAddr))){
138                 mServer.startPreview(mCameraView.getHolder());
139                 Camera.Size cs = mServer.getBestPictureSize();
140                 mCameraView.setLayout(cs.width, cs.height);
141             }
142
143
144         }
145     };
146
147     private void doBindService(){
148         gLogger.debug("doBindService");
149         if(!mBounded && canStartService()) {
150             gLogger.debug("Start service --------->");
151             bindService(mIntent, mConnection, BIND_AUTO_CREATE);
152         }
153     }
154
155     private void doUnbindService() {
156         gLogger.debug("doUnbindService");
157         if(mBounded){
158             gLogger.debug("Stop service <---------");
159             unbindService(mConnection);
160             mBounded = false;
161         }
162     }
163
164     private void initCameraView (){
165         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
166         requestWindowFeature(Window.FEATURE_NO_TITLE);
167         getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
168         ///setContentView(R.layout.activity_main);
169
170         ActionBar actionBar = getSupportActionBar();
171         actionBar.hide();
172
173         DisplayMetrics outMetrics = new DisplayMetrics();
174         this.getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
175
176         CameraView.SCREEN_WIDTH = outMetrics.widthPixels;
177         CameraView.SCREEN_HEIGHT = outMetrics.heightPixels;
178         gLogger.debug("Screen size is w: " + CameraView.SCREEN_WIDTH  + ", h: " + CameraView.SCREEN_HEIGHT);
179
180
181
182         mCameraView = new CameraView(getApplicationContext(), this);
183         setContentView(R.layout.activity_main);
184
185         ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(640, 480);
186         addContentView(mCameraView, lp);
187         //setContentView(mCameraView);
188     }
189     @Override
190     protected void onCreate(Bundle savedInstanceState) {
191         super.onCreate(savedInstanceState);
192         LogUtil.config(getExternalFilesDir(null));
193         gLogger = Logger.getLogger(getClass());
194         gLogger.error("#######################################");
195         //configLog();
196         initCameraView();
197         init();
198         loadConfig();
199
200
201         if(NetworkMonitor.isNetworkAvailable(this) && mUsbMonitor.hasUsbCamera()){
202             gLogger.error("Current network is available");
203             doBindService();
204         } else {
205             gLogger.error("Current network NOT available or no USB Camera connected");
206         }
207
208         if(!mServiceHealthMonitor.isAlive()) {
209             gLogger.debug("mServiceHealthMonitor start, interval " + INTERVAL);
210             mServiceHealthMonitor.start();
211         }
212     }
213
214     @Override
215     protected void onPause(){
216         super.onPause();
217         gLogger.error("OnPause --------->");
218     }
219
220     @Override
221     protected void onResume() {
222         super.onResume();
223         gLogger.error("OnResume ---------> ");
224     }
225
226     @Override
227     protected void onStop() {
228         super.onStop();
229         gLogger.debug("onStop --------->");
230     }
231
232     @Override
233     protected void onStart(){
234         super.onStart();
235         gLogger.debug("onStart --------->");
236     }
237
238     @Override
239     protected void onDestroy(){
240         super.onDestroy();
241         mUsbMonitor.unregisterReceiver();
242         unregisterReceiver(networkMonitor);
243         unbindService(mConnection);
244         gLogger.debug("onDestroy --------->");
245     }
246
247     @Override
248     protected void onRestart(){
249         super.onRestart();
250         gLogger.debug("onRestart ---------->");
251     }
252
253     @Override
254     public void onBackPressed() {
255         gLogger.error("onBackPressed  --------->");
256         Intent intent = new Intent(Intent.ACTION_MAIN);
257         intent.addCategory(Intent.CATEGORY_HOME);
258         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
259         startActivity(intent);
260     }
261
262     private String getMacAddr() {
263         WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
264         WifiInfo info = manager.getConnectionInfo();
265         gLogger.debug("Mac Address is " + info.getMacAddress());
266         return info.getMacAddress().replace(":", ""); //02:00:00:00:00:00 - 020000000000
267     }
268
269     private void loadConfig() {
270 //        UserInfo info = UserInfo.getConfig();
271 //        gLogger.error("server is:" + info.server);
272 //        mTextServer.setText(info.server.equals("") ? "rtmp://gpussh.suanzi.ai:1935/myapp" : info.server);
273 //        mTextUser.setText(info.user);
274 //        //mMacAddr = info.macAddr.equals("") ?  this.mMacAddr : info.macAddr;
275 //        gLogger.error("loadConfig - url is :" + info.toUrl(mMacAddr));
276     }
277
278     private void saveConfig() {
279         UserInfo info = UserInfo.getConfig();
280         //info.update(mTextServer.getText().toString(), mTextUser.getText().toString(), mMacAddr, mTextCamera.getText().toString());
281         if(info.saveConfig()) {
282             Toast.makeText(getApplicationContext(), "Config saved", Toast.LENGTH_LONG).show();
283         } else {
284             Toast.makeText(getApplicationContext(), "Error: config saved", Toast.LENGTH_LONG).show();
285         }
286         gLogger.error("saveConfig - url: " + info.toUrl(mMacAddr));
287     }
288
289     private boolean canStartService(){
290         return mUsbMonitor.hasUsbCamera() && NetworkMonitor.isNetworkAvailable(this);
291     }
292
293     // MyServiceEventListener
294     @Override
295     public void onCameraError(String msg){
296         gLogger.error("onCameraEvent " + msg);
297         //if(mUsbMonitor.hasUsbCamera()){
298             //mServer.reopenCamera();
299         //}
300     }
301
302     @Override
303     public void onEncoderError(String msg){
304         gLogger.error("onEncoderError: " + msg);
305         doUnbindService();
306         doBindService();
307     }
308
309     @Override
310     public void onPublishing(String msg){
311         mServiceHealthMonitor.record();
312     }
313
314     @Override
315     public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height){
316         if(mServer != null){
317             mServer.startPreview(holder);
318         }
319     }
320
321     private void restartApplication() {
322         final Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName());
323         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
324         startActivity(intent);
325     }
326 }