Major refactor: Incorporate file uris in FileItem

This commit is contained in:
Aditya-Sood 2019-08-11 21:23:12 +05:30
parent 4e7a2e03c2
commit d6cc0b8faa
5 changed files with 43 additions and 37 deletions

View File

@ -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;
}

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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() {

View File

@ -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) {