package io.evercam.androidapp.video; import android.app.Activity; import android.content.Intent; import android.media.MediaScannerConnection; import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.util.Log; import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; import io.evercam.androidapp.R; import io.evercam.androidapp.custom.CustomToast; public class SnapshotManager { private final static String TAG = "evercam-SnapshotManager"; public static final String SNAPSHOT_FOLDER_NAME_EVERCAM = "Evercam"; public static final String SNAPSHOT_FOLDER_NAME_PLAY = "Evercam Play"; public enum FileType { PNG, JPG } ; /** * Produce a path for the snapshot to be saved in format: * Folder:Evercam/Evercam Play/camera id * File name: camera id + current time + file type ending * For example Pictures/Evercam/Evercam Play/cameraid/cameraid_20141225_091011.jpg * * @param cameraId the unique camera id from Evercam * @param fileType PNG or JPG depend on it's from video or JPG view * @return snapshot file path */ public static String createFilePath(String cameraId, FileType fileType) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); String timeString = dateFormat.format(Calendar.getInstance().getTime()); String fileName = cameraId + "_" + timeString + fileType(fileType); File folder = new File(getPlayFolderPathForCamera(cameraId)); if(!folder.exists()) { folder.mkdirs(); } return folder.getPath() + File.separator + fileName; } public static String getPlayFolderPathForCamera(String cameraId) { return getPlayFolderPath() + File.separator + cameraId; } public static String getPlayFolderPath() { return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator + SNAPSHOT_FOLDER_NAME_EVERCAM + File.separator + SNAPSHOT_FOLDER_NAME_PLAY; } /** * Notify Gallery about the snapshot that got saved, otherwise the image * won't show in Gallery * * @param path full snapshot path */ public static void updateGallery(String path, Activity activity) { if(Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES)))); } else { new SingleMediaScanner(activity).startScan(path, false); } } public static void showSnapshotsInGalleryForCamera(Activity activity, String cameraId) { String playFolderPath = SnapshotManager.getPlayFolderPathForCamera(cameraId); File folder = new File(playFolderPath); String[] allFiles = folder.list(); if(allFiles != null && allFiles.length > 0) { String latestFile = getLatestFileName(allFiles); Log.d(TAG, latestFile); SnapshotManager.showInGallery(playFolderPath + File.separator + latestFile, activity); } else { CustomToast.showInCenter(activity, R.string.msg_no_snapshot_saved_camera); } } /** * The most recent snapshot from the alphabetically first camera will be displayed * * @param activity */ public static void showAnySnapshotInGallery(Activity activity) { File playFolder = new File(getPlayFolderPath()); String[] allFolderNames = playFolder.list(); if(allFolderNames != null && allFolderNames.length > 0) { for(String cameraFolderName : allFolderNames) { File cameraFolder = new File(getPlayFolderPathForCamera(cameraFolderName)); String[] snapshotFileNames = cameraFolder.list(); if(snapshotFileNames != null && snapshotFileNames.length > 0) { showSnapshotsInGalleryForCamera(activity, cameraFolderName); return; } } } //Executing here means no valid camera name folder found CustomToast.showInCenterLong(activity, R.string.msg_no_snapshot_saved_main); } /** * Return the latest file name from all snapshots * * @param allFiles must have at least one element */ public static String getLatestFileName(String[] allFiles) { String latestFile = ""; for(String file : allFiles) { if(latestFile.isEmpty()) { latestFile = file; } else { if(file.compareTo(latestFile) >= 0) { latestFile = file; } } } return latestFile; } private static void showInGallery(String path, Activity activity) { new SingleMediaScanner(activity).startScan(path, true); } private static String fileType(FileType fileType) { if(fileType.equals(FileType.PNG)) { return ".png"; } else { return ".jpg"; } } static class SingleMediaScanner implements MediaScannerConnectionClient { MediaScannerConnection connection; Activity activity; private String imagepath; private boolean showInGallery; public SingleMediaScanner(Activity activity) { this.activity = activity; } public void startScan(String url, boolean showInGallery) { this.showInGallery = showInGallery; imagepath = url; if(connection != null) connection.disconnect(); connection = new MediaScannerConnection(activity, this); connection.connect(); } @Override public void onMediaScannerConnected() { try { connection.scanFile(imagepath, null); } catch(java.lang.IllegalStateException e) { } } @Override public void onScanCompleted(String path, Uri uri) { final Uri uriFinal = uri; activity.runOnUiThread(new Runnable() { @Override public void run() { if(!showInGallery) { CustomToast.showSuperSnapshotSaved(activity, uriFinal); } else { Intent intent = new Intent(Intent.ACTION_VIEW, uriFinal); activity.startActivity(intent); } } }); connection.disconnect(); } } }