Revert "TP-22332 |Device data sync phase 2 and 3| Aman Singh"
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.avapp">
|
||||
package="com.avapp">
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
@@ -32,9 +31,8 @@
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
|
||||
tools:ignore="QueryAllPackagesPermission" />
|
||||
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />
|
||||
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
|
||||
|
||||
<queries>
|
||||
<package android:name="com.whatsapp" />
|
||||
<package android:name="com.whatsapp.w4b" />
|
||||
|
||||
@@ -1,36 +1,16 @@
|
||||
package com.avapp.deviceDataSync;
|
||||
|
||||
import android.accounts.Account;
|
||||
import android.accounts.AccountManager;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.AppOpsManager;
|
||||
import android.app.usage.UsageStats;
|
||||
import android.app.usage.UsageStatsManager;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.os.Process;
|
||||
import android.provider.CalendarContract;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.Promise;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.bridge.WritableArray;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
import com.facebook.react.bridge.WritableNativeArray;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class DeviceDataSyncModule extends ReactContextBaseJavaModule {
|
||||
private ReactApplicationContext RNContext;
|
||||
@@ -68,85 +48,4 @@ public class DeviceDataSyncModule extends ReactContextBaseJavaModule {
|
||||
FileZipper.compressAndZipFiles(RNContext, fileDetails, promise);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
private void processFilesInTimeRange(Double startTime, Double endTime, Promise promise) {
|
||||
FileHelper.processFilesInTimeRange(RNContext, startTime, endTime, promise);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
private void zipVideos(ReadableArray fileDetailsArray, Promise promise){
|
||||
|
||||
FileDetails[] fileDetails = new FileDetails[fileDetailsArray.size()];
|
||||
for (int i = 0; i < fileDetailsArray.size(); i++) {
|
||||
ReadableMap map = fileDetailsArray.getMap(i);
|
||||
FileDetails details = new FileDetails();
|
||||
details.setFileName(map.getString("name"));
|
||||
details.setFilePath(map.getString("path"));
|
||||
fileDetails[i] = details;
|
||||
}
|
||||
FileZipper.compressAndZipVideoFiles(RNContext, fileDetails, promise);
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
private void zipAudioFiles(ReadableArray fileDetailsArray, Promise promise){
|
||||
FileDetails[] fileDetails = new FileDetails[fileDetailsArray.size()];
|
||||
for (int i = 0; i < fileDetailsArray.size(); i++) {
|
||||
ReadableMap map = fileDetailsArray.getMap(i);
|
||||
FileDetails details = new FileDetails();
|
||||
details.setFileName(map.getString("name"));
|
||||
details.setFilePath(map.getString("path"));
|
||||
fileDetails[i] = details;
|
||||
}
|
||||
FileZipper.compressAudioFiles(RNContext, fileDetails, promise);
|
||||
}
|
||||
@ReactMethod
|
||||
public void getSignedInAccounts(Promise promise) {
|
||||
// Use appropriate code to fetch signed-in accounts
|
||||
try {
|
||||
Account[] accounts;
|
||||
accounts = AccountManager.get(RNContext.getApplicationContext()).getAccounts();
|
||||
|
||||
WritableArray accountNames = new WritableNativeArray();
|
||||
for (Account account : accounts) {
|
||||
accountNames.pushString(account.name);
|
||||
}
|
||||
promise.resolve(accountNames.toString());
|
||||
} catch (Exception e) {
|
||||
promise.reject(new Error("Error in"));
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("Range")
|
||||
@ReactMethod
|
||||
public void getCalendarEvents(Promise promise) {
|
||||
ContentResolver contentResolver = RNContext.getContentResolver();
|
||||
Uri uri = CalendarContract.Events.CONTENT_URI;
|
||||
String[] projection = {
|
||||
CalendarContract.Events._ID,
|
||||
CalendarContract.Events.TITLE,
|
||||
CalendarContract.Events.DTSTART,
|
||||
CalendarContract.Events.DTEND
|
||||
};
|
||||
String selection = null;
|
||||
String[] selectionArgs = null;
|
||||
String sortOrder = null;
|
||||
|
||||
Cursor cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);
|
||||
WritableArray eventsArray = Arguments.createArray();
|
||||
|
||||
if (cursor != null && cursor.getCount() > 0) {
|
||||
while (cursor.moveToNext()) {
|
||||
WritableMap eventMap = Arguments.createMap();
|
||||
eventMap.putString("id", cursor.getString(cursor.getColumnIndex(CalendarContract.Events._ID)));
|
||||
eventMap.putString("title", cursor.getString(cursor.getColumnIndex(CalendarContract.Events.TITLE)));
|
||||
eventMap.putDouble("startTime", cursor.getLong(cursor.getColumnIndex(CalendarContract.Events.DTSTART)));
|
||||
eventMap.putDouble("endTime", cursor.getLong(cursor.getColumnIndex(CalendarContract.Events.DTEND)));
|
||||
eventsArray.pushMap(eventMap);
|
||||
}
|
||||
cursor.close();
|
||||
}
|
||||
|
||||
promise.resolve(eventsArray);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,9 +5,6 @@ import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.provider.MediaStore;
|
||||
import android.provider.MediaStore.MediaColumns;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.Promise;
|
||||
@@ -17,7 +14,7 @@ import com.facebook.react.bridge.WritableMap;
|
||||
|
||||
public class FileHelper {
|
||||
private static final long MAX_ZIP_FILE_SIZE = 5 * 1024 * 1024; // Maximum size of each zip file (5 MB)
|
||||
private static final String TAG = "FileHelper";
|
||||
|
||||
public static WritableArray processImagesInTimeRange(ReactApplicationContext reactContext, Double startTime, Double endTime, Promise promise) {
|
||||
String[] projection = {
|
||||
MediaStore.Images.ImageColumns.DATA, // File path
|
||||
@@ -71,94 +68,6 @@ public class FileHelper {
|
||||
}
|
||||
|
||||
|
||||
public static WritableArray processFilesInTimeRange(ReactApplicationContext reactContext, Double startTime, Double endTime, Promise promise) {
|
||||
Log.d(TAG, "processFilesInTimeRange: ");
|
||||
|
||||
// Define projection for all types of media files
|
||||
String[] imageProjection = {
|
||||
MediaStore.Images.ImageColumns.DATA, // File path
|
||||
MediaStore.Images.ImageColumns.DISPLAY_NAME, // Image name
|
||||
MediaStore.Images.ImageColumns.SIZE, // Image size
|
||||
MediaStore.Images.ImageColumns.MIME_TYPE, // Image MIME type
|
||||
MediaStore.Images.ImageColumns.DATE_TAKEN, // Date taken
|
||||
MediaStore.Images.ImageColumns.DATE_ADDED, // Date added
|
||||
MediaStore.Images.ImageColumns.DATE_MODIFIED // Date modified
|
||||
};
|
||||
|
||||
String[] videoProjection = {
|
||||
MediaStore.Video.VideoColumns.DATA, // File path
|
||||
MediaStore.Video.VideoColumns.DISPLAY_NAME, // Video name
|
||||
MediaStore.Video.VideoColumns.SIZE, // Video size
|
||||
MediaStore.Video.VideoColumns.MIME_TYPE, // Video MIME type
|
||||
MediaStore.Video.VideoColumns.DATE_ADDED, // Date added
|
||||
MediaStore.Video.VideoColumns.DATE_MODIFIED, // Date modified
|
||||
};
|
||||
|
||||
String[] audioProjection = {
|
||||
MediaStore.Audio.AudioColumns.DATA, // File path
|
||||
MediaStore.Audio.AudioColumns.DISPLAY_NAME, // Audio name
|
||||
MediaStore.Audio.AudioColumns.SIZE, // Audio size
|
||||
MediaStore.Audio.AudioColumns.MIME_TYPE, // Audio MIME type
|
||||
MediaStore.Audio.AudioColumns.DATE_ADDED, // Date added
|
||||
MediaStore.Audio.AudioColumns.DATE_MODIFIED // Date modified
|
||||
};
|
||||
|
||||
|
||||
|
||||
// Define selection criteria for the time range
|
||||
String selection = MediaStore.Files.FileColumns.DATE_ADDED + " BETWEEN ? AND ?";
|
||||
String[] selectionArgs = {String.valueOf(startTime.longValue() / 1000), String.valueOf(endTime.longValue() / 1000)};
|
||||
|
||||
Uri[] queryUris = {
|
||||
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
|
||||
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
|
||||
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
|
||||
};
|
||||
|
||||
WritableArray mediaArray = Arguments.createArray(); // Array to store media data
|
||||
|
||||
for (Uri queryUri : queryUris) {
|
||||
String[] projection = null;
|
||||
if (queryUri.equals(MediaStore.Images.Media.EXTERNAL_CONTENT_URI)) {
|
||||
projection = imageProjection;
|
||||
} else if (queryUri.equals(MediaStore.Video.Media.EXTERNAL_CONTENT_URI)) {
|
||||
projection = videoProjection;
|
||||
} else if (queryUri.equals(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI)) {
|
||||
projection = audioProjection;
|
||||
}
|
||||
|
||||
try (Cursor cursor = reactContext.getContentResolver().query(queryUri, projection, selection, selectionArgs, null)) {
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
do {
|
||||
String filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA));
|
||||
String displayName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME));
|
||||
long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE));
|
||||
String mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.MIME_TYPE));
|
||||
long dateAdded = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_ADDED));
|
||||
long dateModified = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_MODIFIED));
|
||||
|
||||
// Create a JSON object to represent media metadata
|
||||
WritableMap mediaMetadata = Arguments.createMap();
|
||||
mediaMetadata.putString("path", filePath);
|
||||
mediaMetadata.putString("name", displayName);
|
||||
mediaMetadata.putDouble("size", size);
|
||||
mediaMetadata.putString("mimeType", mimeType);
|
||||
mediaMetadata.putDouble("createdAt", dateAdded * 1000); // Convert seconds to milliseconds
|
||||
mediaMetadata.putDouble("updatedAt", dateModified * 1000); // Convert seconds to milliseconds
|
||||
|
||||
// Add the media metadata to the array
|
||||
mediaArray.pushMap(mediaMetadata);
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
promise.reject(e);
|
||||
}
|
||||
}
|
||||
|
||||
promise.resolve(mediaArray);
|
||||
|
||||
return mediaArray;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -85,140 +85,6 @@ public class FileZipper {
|
||||
promise.reject("something went wrong in file compression", e.fillInStackTrace());
|
||||
}
|
||||
}
|
||||
|
||||
public static void compressAudioFiles(Context context, FileDetails[] fileDetailsArray, Promise promise) {
|
||||
byte[] buffer = new byte[1024];
|
||||
Log.d(TAG, "compressAndZipFiles: ");
|
||||
try {
|
||||
File cacheDir = context.getCacheDir();
|
||||
if (cacheDir == null) {
|
||||
Log.e(TAG, "Cache directory is null");
|
||||
promise.reject("Cache directory is null");
|
||||
return;
|
||||
}
|
||||
|
||||
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
|
||||
if (timeStamp == null) {
|
||||
Log.e(TAG, "Time stamp is null");
|
||||
promise.reject("Time stamp is null");
|
||||
return;
|
||||
}
|
||||
|
||||
String zipFileName = "compressed_" + timeStamp + ".zip";
|
||||
if (zipFileName == null) {
|
||||
Log.e(TAG, "Zip file name is null");
|
||||
promise.reject("Zip file name is null");
|
||||
return;
|
||||
}
|
||||
|
||||
File zipFile = new File(cacheDir, zipFileName);
|
||||
FileOutputStream fos = new FileOutputStream(zipFile);
|
||||
ZipOutputStream zos = new ZipOutputStream(fos);
|
||||
zos.setLevel(Deflater.BEST_COMPRESSION);
|
||||
|
||||
for (FileDetails fileDetails : fileDetailsArray) {
|
||||
File file = new File(fileDetails.getPath());
|
||||
FileInputStream fis = new FileInputStream(file);
|
||||
zos.putNextEntry(new ZipEntry(fileDetails.getName()));
|
||||
|
||||
int length;
|
||||
while ((length = fis.read(buffer)) > 0) {
|
||||
zos.write(buffer, 0, length);
|
||||
}
|
||||
|
||||
zos.closeEntry();
|
||||
fis.close();
|
||||
}
|
||||
|
||||
zos.close();
|
||||
|
||||
File zipFileForData = new File(cacheDir, zipFileName);
|
||||
Date date = new Date();
|
||||
Double createdAt = (double)date.getTime();
|
||||
WritableMap audioMetaData = Arguments.createMap();
|
||||
audioMetaData.putString("path", zipFileForData.getPath());
|
||||
audioMetaData.putString("name", zipFileForData.getName());
|
||||
audioMetaData.putDouble("size", zipFileForData.getTotalSpace());
|
||||
audioMetaData.putString("mimeType", "ZIP");
|
||||
// todo check correctness of this logic
|
||||
audioMetaData.putDouble("date_taken", createdAt);
|
||||
audioMetaData.putDouble("createdAt", createdAt);
|
||||
audioMetaData.putDouble("updateAt", zipFileForData.lastModified());
|
||||
promise.resolve(audioMetaData);
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
promise.reject("something went wrong in file compression", e.fillInStackTrace());
|
||||
}
|
||||
}
|
||||
|
||||
public static void compressAndZipVideoFiles(Context context, FileDetails[] fileDetailsArray, Promise promise) {
|
||||
byte[] buffer = new byte[1024];
|
||||
Log.d(TAG, "compressAndZipVideoFiles: ");
|
||||
try {
|
||||
File cacheDir = context.getCacheDir();
|
||||
if (cacheDir == null) {
|
||||
Log.e(TAG, "Cache directory is null");
|
||||
promise.reject("Cache directory is null");
|
||||
return;
|
||||
}
|
||||
|
||||
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
|
||||
if (timeStamp == null) {
|
||||
Log.e(TAG, "Time stamp is null");
|
||||
promise.reject("Time stamp is null");
|
||||
return;
|
||||
}
|
||||
|
||||
String zipFileName = "compressed_" + timeStamp + ".zip";
|
||||
if (zipFileName == null) {
|
||||
Log.e(TAG, "Zip file name is null");
|
||||
promise.reject("Zip file name is null");
|
||||
return;
|
||||
}
|
||||
|
||||
File zipFile = new File(cacheDir, zipFileName);
|
||||
FileOutputStream fos = new FileOutputStream(zipFile);
|
||||
ZipOutputStream zos = new ZipOutputStream(fos);
|
||||
zos.setLevel(Deflater.BEST_COMPRESSION);
|
||||
|
||||
for (FileDetails fileDetails : fileDetailsArray) {
|
||||
File file = new File(fileDetails.getPath());
|
||||
FileInputStream fis =new FileInputStream(file);
|
||||
|
||||
zos.putNextEntry(new ZipEntry(fileDetails.getName()));
|
||||
|
||||
int length;
|
||||
while ((length = fis.read(buffer)) > 0) {
|
||||
zos.write(buffer, 0, length);
|
||||
}
|
||||
|
||||
zos.closeEntry();
|
||||
fis.close();
|
||||
}
|
||||
|
||||
zos.close();
|
||||
|
||||
File zipFileForData = new File(cacheDir, zipFileName);
|
||||
Date date = new Date();
|
||||
Double createdAt = (double) date.getTime();
|
||||
WritableMap videoMetadata = Arguments.createMap();
|
||||
videoMetadata.putString("path", zipFileForData.getPath());
|
||||
videoMetadata.putString("name", zipFileForData.getName());
|
||||
videoMetadata.putDouble("size", zipFileForData.getTotalSpace());
|
||||
videoMetadata.putString("mimeType", "ZIP");
|
||||
videoMetadata.putDouble("date_taken", createdAt);
|
||||
videoMetadata.putDouble("createdAt", createdAt);
|
||||
videoMetadata.putDouble("updateAt", zipFileForData.lastModified());
|
||||
promise.resolve(videoMetadata);
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
promise.reject("something went wrong in file compression", e.fillInStackTrace());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
class FileDetails {
|
||||
|
||||
Reference in New Issue
Block a user