package io.evercam.connect.discover.ipscan; import android.content.SharedPreferences; import android.os.AsyncTask; import android.preference.PreferenceManager; import android.util.Log; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Date; import java.util.concurrent.ExecutorService; import io.evercam.connect.DiscoverMainActivity; import io.evercam.connect.db.Camera; import io.evercam.connect.db.CameraOperation; import io.evercam.connect.helper.AwsS3Uploader; import io.evercam.connect.helper.Constants; import io.evercam.connect.helper.JsonMessage; import io.evercam.connect.helper.PropertyReader; import io.evercam.connect.helper.SharedPrefsManager; import io.evercam.connect.helper.VendorFromMac; import io.evercam.connect.net.NetInfo; import io.evercam.network.discovery.IpScan; import io.evercam.network.discovery.MacAddress; import io.evercam.network.discovery.ScanRange; import io.evercam.network.discovery.ScanResult; public class IpScanTask extends AsyncTask<Void, Host, Void> { private final String TAG = "evercamdiscover-IpScanTask"; private ExecutorService pool; final protected WeakReference<DiscoverMainActivity> mainDiscover; ScanRange scanRange; public IpScanTask(DiscoverMainActivity ipmainDiscover, ScanRange scanRange) { mainDiscover = new WeakReference<DiscoverMainActivity>(ipmainDiscover); this.scanRange = scanRange; } @Override protected void onProgressUpdate(Host... host) { if(mainDiscover != null) { final DiscoverMainActivity discover = mainDiscover.get(); if(discover != null) { if(!isCancelled()) { if(host[0] != null) { discover.addHost(host[0]); } } } } } @Override protected Void doInBackground(Void... params) { if(mainDiscover != null) { final DiscoverMainActivity discover = mainDiscover.get(); if(discover != null) { IpScan ipScan = new IpScan(new ScanResult() { @Override public void onActiveIp(String ip) { Host host = new Host(); host.setIpAddress(ip); host.setHardwareAddress(MacAddress.getByIpLinux(ip)); publish(host); } @Override public void onIpScanned(String ip) { } }); this.pool = ipScan.pool; ipScan.scanAll(scanRange); } } return null; } @Override protected void onPostExecute(Void unused) { if(mainDiscover != null) { final DiscoverMainActivity discover = mainDiscover.get(); if(discover != null) { discover.stopDiscovery(); // Evercam data collection, only enabled if property // 'EnableDataCollection' exists in property file. startEvercamDataCollection(); } } } @Override protected void onCancelled() { if(pool != null) { synchronized(pool) { pool.shutdownNow(); } } super.onCancelled(); } private void publish(final Host host) { if(host == null) { publishProgress((Host) null); return; } if(mainDiscover != null) { final DiscoverMainActivity discover = mainDiscover.get(); if(discover != null) { // Mac Addr not already detected if(!host.hardwareAddress.equals(NetInfo.EMPTY_MAC)) { host.hardwareAddress = MacAddress.getByIpLinux(host.ipAddress); } // NIC vendor VendorFromMac vendorFromMac = new VendorFromMac(host.hardwareAddress); host.vendor = vendorFromMac.getCompany(); // Is camera String cameraVendorName = VendorFromMac.getCameraVendor(host.hardwareAddress); if(!cameraVendorName.isEmpty()) { host.vendor = cameraVendorName.toUpperCase(); host.deviceType = Constants.TYPE_CAMERA; } // Is gateway if(discover.netInfo.getGatewayIp().equals(host.ipAddress)) { host.deviceType = Constants.TYPE_ROUTER; } } } publishProgress(host); } private void sendFeedBack() { new SendFeedBackTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } private void startEvercamDataCollection() { SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences (mainDiscover.get().getApplicationContext()); boolean isDataCollectionAllowed = sharedPrefs.getBoolean(Constants.KEY_USER_DATA, true); PropertyReader propertyReader = new PropertyReader(mainDiscover.get() .getApplicationContext()); if(isDataCollectionAllowed && propertyReader.isPropertyExist(PropertyReader .KEY_DATA_COLLECTION)) { sendFeedBack(); } } private class SendFeedBackTask extends AsyncTask<Void, Void, String> { String userName = ""; String userEmail = ""; String userCountry = ""; @Override protected String doInBackground(Void... params) { try { SharedPreferences sharedPrefs; NetInfo netInfo = new NetInfo(mainDiscover.get().getApplicationContext()); sharedPrefs = PreferenceManager.getDefaultSharedPreferences(mainDiscover.get() .getApplicationContext()); if(SharedPrefsManager.isSignedWithEvercam(sharedPrefs)) { userEmail = SharedPrefsManager.getEvercamEmail(sharedPrefs); userName = SharedPrefsManager.getEvercamName(sharedPrefs); } else if(sharedPrefs.getString(Constants.KEY_USER_EMAIL, null) != null) { userEmail = sharedPrefs.getString(Constants.KEY_USER_EMAIL, null); userName = sharedPrefs.getString(Constants.KEY_USER_FIRST_NAME, null) + sharedPrefs.getString(Constants.KEY_USER_LAST_NAME, null); } CameraOperation cameraOperation = new CameraOperation(mainDiscover.get().getApplicationContext()); ArrayList<Camera> list = cameraOperation.selectAllIP(netInfo.getSsid()); JsonMessage jsonMessage = new JsonMessage(); return jsonMessage.getAllDataJsonMsg(list, userName, userEmail, netInfo); } catch(Exception e) { Log.e(TAG, e.toString()); } return ""; } @Override protected void onPostExecute(String uploadContent) { if(!uploadContent.isEmpty()) { Date date = new Date(System.currentTimeMillis()); String uploadTitle = userEmail + " " + date; new AwsS3Uploader(uploadTitle, uploadContent, mainDiscover.get().getApplicationContext()); } } } }