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; package org.kiwix.kiwixmobile.zim_manager.local_file_transfer;
import android.net.Uri;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
@ -26,12 +27,20 @@ public class FileItem implements Parcelable {
int ERROR = +2; // Error encountered while transferring the file int ERROR = +2; // Error encountered while transferring the file
} }
private Uri fileUri;
private String fileName; private String fileName;
private int fileStatus; 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.fileName = fileName;
this.fileStatus = fileStatus; this.fileStatus = TO_BE_SENT;
} }
// For making FileItem a Parcelable // For making FileItem a Parcelable
@ -70,6 +79,10 @@ public class FileItem implements Parcelable {
this.fileStatus = fileStatus; this.fileStatus = fileStatus;
} }
public @NonNull Uri getFileUri() {
return fileUri;
}
public @NonNull String getFileName() { public @NonNull String getFileName() {
return fileName; return fileName;
} }

View File

@ -124,13 +124,13 @@ public class LocalFileTransferActivity extends AppCompatActivity implements
if (isFileSender) { if (isFileSender) {
for (int i = 0; i < fileUriArrayList.size(); i++) { 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); displayFileTransferProgress(filesForTransfer);
} }
wifiDirectManager.createWifiDirectManager(sharedPreferenceUtil, alertDialogShower, filesForTransfer, fileUriArrayList); wifiDirectManager.startWifiDirectManager(sharedPreferenceUtil, alertDialogShower, filesForTransfer);
} }
@OnItemClick(R.id.list_peer_devices) @OnItemClick(R.id.list_peer_devices)
@ -403,6 +403,6 @@ public class LocalFileTransferActivity extends AppCompatActivity implements
@Override protected void onDestroy() { @Override protected void onDestroy() {
super.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 // Send total number of files which will be transferred
objectOutputStream.writeObject("" + wifiDirectManager.getTotalFilesForTransfer()); objectOutputStream.writeObject("" + wifiDirectManager.getTotalFilesForTransfer());
ArrayList<Uri> fileUriList = wifiDirectManager.getFileUriArrayList(); ArrayList<FileItem> fileItemArrayList = wifiDirectManager.getFilesForTransfer();
for ( for (FileItem fileItem : fileItemArrayList) { // Send the names of each of those files, in order
Uri fileUri : fileUriList) { // Send the names of each of those files, in order objectOutputStream.writeObject(fileItem.getFileName());
objectOutputStream.writeObject(getFileName(fileUri)); Log.d(TAG, "Sending " + fileItem.getFileUri().toString());
Log.d(TAG, "Sending " + fileUri.toString());
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -130,7 +129,7 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
Object fileNameObject = objectInputStream.readObject(); Object fileNameObject = objectInputStream.readObject();
if (fileNameObject.getClass().equals(String.class)) { 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); if (BuildConfig.DEBUG) Log.d(TAG, "Expecting "+fileNameObject);
} }
} }

View File

@ -1,13 +1,10 @@
package org.kiwix.kiwixmobile.zim_manager.local_file_transfer; package org.kiwix.kiwixmobile.zim_manager.local_file_transfer;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.net.Uri;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
import org.kiwix.kiwixmobile.BuildConfig; import org.kiwix.kiwixmobile.BuildConfig;
import org.kiwix.kiwixmobile.R;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; 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.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.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.copyToOutputStream;
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.WifiDirectManager.getFileName;
/** /**
* Helper class for the local file sharing module. * 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 * 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"; private static final String TAG = "SenderDeviceAsyncTask";
@ -45,7 +41,7 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Integer, Boolean> {
} }
@Override @Override
protected Boolean doInBackground(Uri... fileUris) { protected Boolean doInBackground(FileItem... fileItems) {
if (delayForSlowReceiverDevicesToSetupServer() == false) { if (delayForSlowReceiverDevicesToSetupServer() == false) {
return false; return false;
@ -54,11 +50,11 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Integer, Boolean> {
boolean result = true; boolean result = true;
int fileItemIndex = -1; int fileItemIndex = -1;
for(Uri fileUri : fileUris) { // Uri of file to be transferred for(FileItem fileItem : fileItems) { // Uri of file to be transferred
fileItemIndex++; fileItemIndex++;
try (Socket socket = new Socket(); // Represents the sender device try (Socket socket = new Socket(); // Represents the sender device
InputStream fileInputStream = contentResolver.openInputStream(fileUri)) { InputStream fileInputStream = contentResolver.openInputStream(fileItem.getFileUri())) {
if (isCancelled()) { if (isCancelled()) {
result = false; result = false;
@ -107,10 +103,6 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Integer, Boolean> {
int fileIndex = values[0]; int fileIndex = values[0];
int fileStatus = values[1]; int fileStatus = values[1];
wifiDirectManager.changeStatus(fileIndex, fileStatus); 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() { @Override protected void onCancelled() {

View File

@ -31,6 +31,7 @@ import org.kiwix.kiwixmobile.utils.KiwixDialog;
import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil; import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil;
import static android.os.Looper.getMainLooper; 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; 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 totalFilesForTransfer = -1;
private int filesSent = 0; // Count of number of files transferred until now 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 isFileSender = false; // Whether the device is the file sender or not
private boolean hasSenderStartedConnection = false; private boolean hasSenderStartedConnection = false;
@ -84,17 +84,15 @@ public class WifiDirectManager implements WifiP2pManager.ChannelListener, WifiP2
} }
/* Initialisations for using the WiFi P2P API */ /* Initialisations for using the WiFi P2P API */
public void createWifiDirectManager(@NonNull SharedPreferenceUtil sharedPreferenceUtil, public void startWifiDirectManager(@NonNull SharedPreferenceUtil sharedPreferenceUtil,
@NonNull AlertDialogShower alertDialogShower, @Nullable ArrayList<FileItem> filesForTransfer, @NonNull AlertDialogShower alertDialogShower, @Nullable ArrayList<FileItem> filesForTransfer) {
@Nullable ArrayList<Uri> fileUriArrayList) {
this.sharedPreferenceUtil = sharedPreferenceUtil; this.sharedPreferenceUtil = sharedPreferenceUtil;
this.alertDialogShower = alertDialogShower; this.alertDialogShower = alertDialogShower;
this.fileUriArrayList = fileUriArrayList;
this.filesForTransfer = filesForTransfer; this.filesForTransfer = filesForTransfer;
this.isFileSender = (fileUriArrayList != null && fileUriArrayList.size() > 0); this.isFileSender = (filesForTransfer != null && filesForTransfer.size() > 0);
if(isFileSender) { if(isFileSender) {
this.totalFilesForTransfer = fileUriArrayList.size(); this.totalFilesForTransfer = filesForTransfer.size();
} }
manager = (WifiP2pManager) activity.getSystemService(Context.WIFI_P2P_SERVICE); manager = (WifiP2pManager) activity.getSystemService(Context.WIFI_P2P_SERVICE);
@ -277,10 +275,6 @@ public class WifiDirectManager implements WifiP2pManager.ChannelListener, WifiP2
return isFileSender; return isFileSender;
} }
public @NonNull ArrayList<Uri> getFileUriArrayList() {
return fileUriArrayList;
}
public int getTotalFilesForTransfer() { public int getTotalFilesForTransfer() {
return totalFilesForTransfer; return totalFilesForTransfer;
} }
@ -347,8 +341,12 @@ public class WifiDirectManager implements WifiP2pManager.ChannelListener, WifiP2
(isGroupOwner()) ? selectedPeerDeviceInetAddress : getGroupOwnerAddress(); (isGroupOwner()) ? selectedPeerDeviceInetAddress : getGroupOwnerAddress();
displayToast(R.string.preparing_files, Toast.LENGTH_LONG); 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 = new SenderDeviceAsyncTask(this, activity);
senderDeviceAsyncTask.execute(fileUriArrayList.toArray(new Uri[0])); senderDeviceAsyncTask.execute(filesForTransfer.toArray(new FileItem[0]));
} else { } else {
callbacks.onFilesForTransferAvailable(filesForTransfer); callbacks.onFilesForTransferAvailable(filesForTransfer);
@ -362,6 +360,10 @@ public class WifiDirectManager implements WifiP2pManager.ChannelListener, WifiP2
public void changeStatus(int itemIndex, @FileItem.FileStatus int status) { public void changeStatus(int itemIndex, @FileItem.FileStatus int status) {
filesForTransfer.get(itemIndex).setFileStatus(status); filesForTransfer.get(itemIndex).setFileStatus(status);
callbacks.onFileStatusChanged(itemIndex); callbacks.onFileStatusChanged(itemIndex);
if(status == ERROR) {
displayToast(R.string.error_transferring, filesForTransfer.get(itemIndex).getFileName(), Toast.LENGTH_SHORT);
}
} }
private void cancelAsyncTasks(AsyncTask... tasks) { 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); cancelAsyncTasks(peerGroupHandshakeAsyncTask, senderDeviceAsyncTask, receiverDeviceAsyncTask);
if (!isFileSender) { if (!isFileSender) {