mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-09-22 03:54:18 -04:00
Major refactor: Incorporate file uris in FileItem
This commit is contained in:
parent
4e7a2e03c2
commit
d6cc0b8faa
@ -1,5 +1,6 @@
|
||||
package org.kiwix.kiwixmobile.zim_manager.local_file_transfer;
|
||||
|
||||
import android.net.Uri;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import androidx.annotation.IntDef;
|
||||
@ -26,12 +27,20 @@ public class FileItem implements Parcelable {
|
||||
int ERROR = +2; // Error encountered while transferring the file
|
||||
}
|
||||
|
||||
private Uri fileUri;
|
||||
private String fileName;
|
||||
private int fileStatus;
|
||||
|
||||
public FileItem(@NonNull String fileName, @FileStatus int fileStatus) {
|
||||
public FileItem(@NonNull Uri fileUri) { // For sender devices
|
||||
this.fileUri = fileUri;
|
||||
this.fileName = WifiDirectManager.getFileName(fileUri);
|
||||
this.fileStatus = TO_BE_SENT;
|
||||
}
|
||||
|
||||
public FileItem(@NonNull String fileName) { // For receiver devices
|
||||
this.fileUri = null;
|
||||
this.fileName = fileName;
|
||||
this.fileStatus = fileStatus;
|
||||
this.fileStatus = TO_BE_SENT;
|
||||
}
|
||||
|
||||
// For making FileItem a Parcelable
|
||||
@ -70,6 +79,10 @@ public class FileItem implements Parcelable {
|
||||
this.fileStatus = fileStatus;
|
||||
}
|
||||
|
||||
public @NonNull Uri getFileUri() {
|
||||
return fileUri;
|
||||
}
|
||||
|
||||
public @NonNull String getFileName() {
|
||||
return fileName;
|
||||
}
|
||||
|
@ -124,13 +124,13 @@ public class LocalFileTransferActivity extends AppCompatActivity implements
|
||||
|
||||
if (isFileSender) {
|
||||
for (int i = 0; i < fileUriArrayList.size(); i++) {
|
||||
filesForTransfer.add(new FileItem(getFileName(fileUriArrayList.get(i)), TO_BE_SENT));
|
||||
filesForTransfer.add(new FileItem(fileUriArrayList.get(i)));
|
||||
}
|
||||
|
||||
displayFileTransferProgress(filesForTransfer);
|
||||
}
|
||||
|
||||
wifiDirectManager.createWifiDirectManager(sharedPreferenceUtil, alertDialogShower, filesForTransfer, fileUriArrayList);
|
||||
wifiDirectManager.startWifiDirectManager(sharedPreferenceUtil, alertDialogShower, filesForTransfer);
|
||||
}
|
||||
|
||||
@OnItemClick(R.id.list_peer_devices)
|
||||
@ -403,6 +403,6 @@ public class LocalFileTransferActivity extends AppCompatActivity implements
|
||||
|
||||
@Override protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
wifiDirectManager.destroyWifiDirectManager();
|
||||
wifiDirectManager.stopWifiDirectManager();
|
||||
}
|
||||
}
|
||||
|
@ -106,11 +106,10 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
|
||||
// Send total number of files which will be transferred
|
||||
objectOutputStream.writeObject("" + wifiDirectManager.getTotalFilesForTransfer());
|
||||
|
||||
ArrayList<Uri> fileUriList = wifiDirectManager.getFileUriArrayList();
|
||||
for (
|
||||
Uri fileUri : fileUriList) { // Send the names of each of those files, in order
|
||||
objectOutputStream.writeObject(getFileName(fileUri));
|
||||
Log.d(TAG, "Sending " + fileUri.toString());
|
||||
ArrayList<FileItem> fileItemArrayList = wifiDirectManager.getFilesForTransfer();
|
||||
for (FileItem fileItem : fileItemArrayList) { // Send the names of each of those files, in order
|
||||
objectOutputStream.writeObject(fileItem.getFileName());
|
||||
Log.d(TAG, "Sending " + fileItem.getFileUri().toString());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
@ -130,7 +129,7 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
|
||||
Object fileNameObject = objectInputStream.readObject();
|
||||
|
||||
if (fileNameObject.getClass().equals(String.class)) {
|
||||
fileItems.add(new FileItem((String) fileNameObject, TO_BE_SENT));
|
||||
fileItems.add(new FileItem((String) fileNameObject));
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, "Expecting "+fileNameObject);
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,10 @@
|
||||
package org.kiwix.kiwixmobile.zim_manager.local_file_transfer;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.kiwix.kiwixmobile.BuildConfig;
|
||||
import org.kiwix.kiwixmobile.R;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@ -18,7 +15,6 @@ import java.net.Socket;
|
||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.FileItem.FileStatus.*;
|
||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.WifiDirectManager.FILE_TRANSFER_PORT;
|
||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.WifiDirectManager.copyToOutputStream;
|
||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.WifiDirectManager.getFileName;
|
||||
|
||||
/**
|
||||
* Helper class for the local file sharing module.
|
||||
@ -32,7 +28,7 @@ import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.WifiDirectMa
|
||||
*
|
||||
* A single task is used by the sender for the entire transfer
|
||||
*/
|
||||
class SenderDeviceAsyncTask extends AsyncTask<Uri, Integer, Boolean> {
|
||||
class SenderDeviceAsyncTask extends AsyncTask<FileItem, Integer, Boolean> {
|
||||
|
||||
private static final String TAG = "SenderDeviceAsyncTask";
|
||||
|
||||
@ -45,7 +41,7 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Integer, Boolean> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Boolean doInBackground(Uri... fileUris) {
|
||||
protected Boolean doInBackground(FileItem... fileItems) {
|
||||
|
||||
if (delayForSlowReceiverDevicesToSetupServer() == false) {
|
||||
return false;
|
||||
@ -54,11 +50,11 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Integer, Boolean> {
|
||||
boolean result = true;
|
||||
int fileItemIndex = -1;
|
||||
|
||||
for(Uri fileUri : fileUris) { // Uri of file to be transferred
|
||||
for(FileItem fileItem : fileItems) { // Uri of file to be transferred
|
||||
fileItemIndex++;
|
||||
|
||||
try (Socket socket = new Socket(); // Represents the sender device
|
||||
InputStream fileInputStream = contentResolver.openInputStream(fileUri)) {
|
||||
InputStream fileInputStream = contentResolver.openInputStream(fileItem.getFileUri())) {
|
||||
|
||||
if (isCancelled()) {
|
||||
result = false;
|
||||
@ -107,10 +103,6 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Integer, Boolean> {
|
||||
int fileIndex = values[0];
|
||||
int fileStatus = values[1];
|
||||
wifiDirectManager.changeStatus(fileIndex, fileStatus);
|
||||
|
||||
if(fileStatus == ERROR) {
|
||||
wifiDirectManager.displayToast(R.string.error_transferring, getFileName(wifiDirectManager.getFileUriArrayList().get(fileIndex)), Toast.LENGTH_SHORT);
|
||||
}
|
||||
}
|
||||
|
||||
@Override protected void onCancelled() {
|
||||
|
@ -31,6 +31,7 @@ import org.kiwix.kiwixmobile.utils.KiwixDialog;
|
||||
import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil;
|
||||
|
||||
import static android.os.Looper.getMainLooper;
|
||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.FileItem.FileStatus.ERROR;
|
||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.showToast;
|
||||
|
||||
|
||||
@ -72,9 +73,8 @@ public class WifiDirectManager implements WifiP2pManager.ChannelListener, WifiP2
|
||||
|
||||
private int totalFilesForTransfer = -1;
|
||||
private int filesSent = 0; // Count of number of files transferred until now
|
||||
private ArrayList<FileItem> filesForTransfer = new ArrayList<>();
|
||||
private ArrayList<FileItem> filesForTransfer;
|
||||
|
||||
private ArrayList<Uri> fileUriArrayList; // For sender device, stores uris of the files
|
||||
private boolean isFileSender = false; // Whether the device is the file sender or not
|
||||
private boolean hasSenderStartedConnection = false;
|
||||
|
||||
@ -84,17 +84,15 @@ public class WifiDirectManager implements WifiP2pManager.ChannelListener, WifiP2
|
||||
}
|
||||
|
||||
/* Initialisations for using the WiFi P2P API */
|
||||
public void createWifiDirectManager(@NonNull SharedPreferenceUtil sharedPreferenceUtil,
|
||||
@NonNull AlertDialogShower alertDialogShower, @Nullable ArrayList<FileItem> filesForTransfer,
|
||||
@Nullable ArrayList<Uri> fileUriArrayList) {
|
||||
public void startWifiDirectManager(@NonNull SharedPreferenceUtil sharedPreferenceUtil,
|
||||
@NonNull AlertDialogShower alertDialogShower, @Nullable ArrayList<FileItem> filesForTransfer) {
|
||||
this.sharedPreferenceUtil = sharedPreferenceUtil;
|
||||
this.alertDialogShower = alertDialogShower;
|
||||
this.fileUriArrayList = fileUriArrayList;
|
||||
this.filesForTransfer = filesForTransfer;
|
||||
this.isFileSender = (fileUriArrayList != null && fileUriArrayList.size() > 0);
|
||||
this.isFileSender = (filesForTransfer != null && filesForTransfer.size() > 0);
|
||||
|
||||
if(isFileSender) {
|
||||
this.totalFilesForTransfer = fileUriArrayList.size();
|
||||
this.totalFilesForTransfer = filesForTransfer.size();
|
||||
}
|
||||
|
||||
manager = (WifiP2pManager) activity.getSystemService(Context.WIFI_P2P_SERVICE);
|
||||
@ -277,10 +275,6 @@ public class WifiDirectManager implements WifiP2pManager.ChannelListener, WifiP2
|
||||
return isFileSender;
|
||||
}
|
||||
|
||||
public @NonNull ArrayList<Uri> getFileUriArrayList() {
|
||||
return fileUriArrayList;
|
||||
}
|
||||
|
||||
public int getTotalFilesForTransfer() {
|
||||
return totalFilesForTransfer;
|
||||
}
|
||||
@ -347,8 +341,12 @@ public class WifiDirectManager implements WifiP2pManager.ChannelListener, WifiP2
|
||||
(isGroupOwner()) ? selectedPeerDeviceInetAddress : getGroupOwnerAddress();
|
||||
|
||||
displayToast(R.string.preparing_files, Toast.LENGTH_LONG);
|
||||
ArrayList<Uri> fileUriArrayList = new ArrayList<>();
|
||||
for (FileItem fileItem : filesForTransfer) {
|
||||
fileUriArrayList.add(fileItem.getFileUri());
|
||||
}
|
||||
senderDeviceAsyncTask = new SenderDeviceAsyncTask(this, activity);
|
||||
senderDeviceAsyncTask.execute(fileUriArrayList.toArray(new Uri[0]));
|
||||
senderDeviceAsyncTask.execute(filesForTransfer.toArray(new FileItem[0]));
|
||||
|
||||
} else {
|
||||
callbacks.onFilesForTransferAvailable(filesForTransfer);
|
||||
@ -362,6 +360,10 @@ public class WifiDirectManager implements WifiP2pManager.ChannelListener, WifiP2
|
||||
public void changeStatus(int itemIndex, @FileItem.FileStatus int status) {
|
||||
filesForTransfer.get(itemIndex).setFileStatus(status);
|
||||
callbacks.onFileStatusChanged(itemIndex);
|
||||
|
||||
if(status == ERROR) {
|
||||
displayToast(R.string.error_transferring, filesForTransfer.get(itemIndex).getFileName(), Toast.LENGTH_SHORT);
|
||||
}
|
||||
}
|
||||
|
||||
private void cancelAsyncTasks(AsyncTask... tasks) {
|
||||
@ -372,7 +374,7 @@ public class WifiDirectManager implements WifiP2pManager.ChannelListener, WifiP2
|
||||
}
|
||||
}
|
||||
|
||||
public void destroyWifiDirectManager() {
|
||||
public void stopWifiDirectManager() {
|
||||
cancelAsyncTasks(peerGroupHandshakeAsyncTask, senderDeviceAsyncTask, receiverDeviceAsyncTask);
|
||||
|
||||
if (!isFileSender) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user