Increment: Cancel all async-tasks when closing LocalFileTransferActivity

This commit is contained in:
Aditya-Sood 2019-07-17 12:43:24 +05:30
parent 3198753d3d
commit 73268cfb5b
5 changed files with 69 additions and 36 deletions

View File

@ -90,6 +90,10 @@ public class DeviceListFragment extends ListFragment implements WifiP2pManager.P
private InetAddress fileReceiverDeviceAddress; // IP address of the file receiving device private InetAddress fileReceiverDeviceAddress; // IP address of the file receiving device
private boolean fileTransferStarted = false; private boolean fileTransferStarted = false;
private PeerGroupHandshakeAsyncTask peerGroupHandshakeAsyncTask;
private SenderDeviceAsyncTask senderDeviceAsyncTaskArray[];
private ReceiverDeviceAsyncTask receiverDeviceAsyncTask;
@Override @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) { public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
@ -192,6 +196,20 @@ public class DeviceListFragment extends ListFragment implements WifiP2pManager.P
((WifiPeerListAdapter) getListAdapter()).notifyDataSetChanged(); ((WifiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
} }
void cancelAsyncTasks() {
if(peerGroupHandshakeAsyncTask != null) {
peerGroupHandshakeAsyncTask.cancel(true);
}
if(senderDeviceAsyncTaskArray != null) {
for(SenderDeviceAsyncTask task : senderDeviceAsyncTaskArray) {
task.cancel(true);
}
} else if(receiverDeviceAsyncTask != null) {
receiverDeviceAsyncTask.cancel(true);
}
}
public void onInitiateDiscovery() { // Setup UI for searching peers public void onInitiateDiscovery() { // Setup UI for searching peers
searchingPeersProgressBar.setVisibility(View.VISIBLE); searchingPeersProgressBar.setVisibility(View.VISIBLE);
frameLayoutPeerDevices.setVisibility(View.INVISIBLE); frameLayoutPeerDevices.setVisibility(View.INVISIBLE);
@ -203,7 +221,8 @@ public class DeviceListFragment extends ListFragment implements WifiP2pManager.P
/* Devices have successfully connected, and 'info' holds information about the wifi p2p group formed */ /* Devices have successfully connected, and 'info' holds information about the wifi p2p group formed */
groupInfo = info; groupInfo = info;
// Start handshake between the devices // Start handshake between the devices
new PeerGroupHandshakeAsyncTask(this, groupInfo).execute(); peerGroupHandshakeAsyncTask = new PeerGroupHandshakeAsyncTask(this, groupInfo);
peerGroupHandshakeAsyncTask.execute();
} }
public void setClientAddress(InetAddress clientAddress) { public void setClientAddress(InetAddress clientAddress) {
@ -225,7 +244,8 @@ public class DeviceListFragment extends ListFragment implements WifiP2pManager.P
if(groupInfo.groupFormed && !fileSender) { if(groupInfo.groupFormed && !fileSender) {
displayTransferProgressFragment(); displayTransferProgressFragment();
new ReceiverDeviceAsyncTask(this, transferProgressFragment).execute(); receiverDeviceAsyncTask = new ReceiverDeviceAsyncTask(this, transferProgressFragment);
receiverDeviceAsyncTask.execute();
} else if(groupInfo.groupFormed) { } else if(groupInfo.groupFormed) {
{ {
@ -237,8 +257,10 @@ public class DeviceListFragment extends ListFragment implements WifiP2pManager.P
showToast(localFileTransferActivity, R.string.preparing_files, Toast.LENGTH_LONG); showToast(localFileTransferActivity, R.string.preparing_files, Toast.LENGTH_LONG);
for(int i = 0; i < 20000000; i++); for(int i = 0; i < 20000000; i++);
senderDeviceAsyncTaskArray = new SenderDeviceAsyncTask[totalFilesForTransfer];
for(int i = 0; i < totalFilesForTransfer; i++) { for(int i = 0; i < totalFilesForTransfer; i++) {
new SenderDeviceAsyncTask(this, transferProgressFragment, i).execute(fileUriList.get(i)); senderDeviceAsyncTaskArray[i] = new SenderDeviceAsyncTask(this, transferProgressFragment, i);
senderDeviceAsyncTaskArray[i].execute(fileUriList.get(i));
} }
} }
} }

View File

@ -269,6 +269,11 @@ public class LocalFileTransferActivity extends AppCompatActivity implements Wifi
@Override @Override
public void closeLocalFileTransferActivity() { public void closeLocalFileTransferActivity() {
final DeviceListFragment deviceListFragment = (DeviceListFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_device_list);
if(deviceListFragment != null) {
deviceListFragment.cancelAsyncTasks();
}
fileSendingDevice = false; fileSendingDevice = false;
disconnect(); disconnect();
this.finish(); this.finish();

View File

@ -50,9 +50,8 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
@Override @Override
protected InetAddress doInBackground(Void... voids) { protected InetAddress doInBackground(Void... voids) {
try { if(groupInfo.groupFormed && groupInfo.isGroupOwner && !isCancelled()) {
if(groupInfo.groupFormed && groupInfo.isGroupOwner) { try (ServerSocket serverSocket = new ServerSocket(PEER_HANDSHAKE_PORT)) {
ServerSocket serverSocket = new ServerSocket(PEER_HANDSHAKE_PORT);
serverSocket.setReuseAddress(true); serverSocket.setReuseAddress(true);
Socket server = serverSocket.accept(); Socket server = serverSocket.accept();
@ -60,20 +59,24 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
Object object = objectInputStream.readObject(); Object object = objectInputStream.readObject();
// Verify that the peer trying to communicate is a kiwix app intending to transfer files // Verify that the peer trying to communicate is a kiwix app intending to transfer files
if (isKiwixHandshake(object)) { if (isKiwixHandshake(object) && !isCancelled()) {
if(BuildConfig.DEBUG) { if(BuildConfig.DEBUG) {
Log.d(TAG, "Client IP address: "+ server.getInetAddress()); Log.d(TAG, "Client IP address: "+ server.getInetAddress());
} }
exchangeFileTransferMetadata(server.getOutputStream(), server.getInputStream()); exchangeFileTransferMetadata(server.getOutputStream(), server.getInputStream());
server.close();
return server.getInetAddress(); return server.getInetAddress();
} else { // Selected device is not accepting wifi direct connections through the kiwix app } else { // Selected device is not accepting wifi direct connections through the kiwix app
return null; return null;
} }
} catch (Exception ex) {
ex.printStackTrace();
return null;
} }
else if(groupInfo.groupFormed) { //&& !groupInfo.isGroupOwner }
Socket client = new Socket(); else if(groupInfo.groupFormed && !isCancelled()) { //&& !groupInfo.isGroupOwner
try (Socket client = new Socket()) {
client.setReuseAddress(true); client.setReuseAddress(true);
client.connect((new InetSocketAddress(groupInfo.groupOwnerAddress.getHostAddress(), PEER_HANDSHAKE_PORT)), 15000); client.connect((new InetSocketAddress(groupInfo.groupOwnerAddress.getHostAddress(), PEER_HANDSHAKE_PORT)), 15000);
@ -82,19 +85,17 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
exchangeFileTransferMetadata(client.getOutputStream(), client.getInputStream()); exchangeFileTransferMetadata(client.getOutputStream(), client.getInputStream());
client.close();
return groupInfo.groupOwnerAddress; return groupInfo.groupOwnerAddress;
}
else {
return null;
}
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
return null; return null;
} }
} }
else {
return null;
}
}
private boolean isKiwixHandshake(Object object) { private boolean isKiwixHandshake(Object object) {
return (object.getClass().equals(String.class) && object.equals(HANDSHAKE_MESSAGE)); return (object.getClass().equals(String.class) && object.equals(HANDSHAKE_MESSAGE));
@ -143,6 +144,10 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
} }
} }
@Override protected void onCancelled() {
Log.d(TAG, "PeerGroupHandshakeAsyncTask cancelled");
}
@Override @Override
protected void onPostExecute(InetAddress inetAddress) { protected void onPostExecute(InetAddress inetAddress) {
deviceListFragment.setClientAddress(inetAddress); deviceListFragment.setClientAddress(inetAddress);

View File

@ -45,14 +45,13 @@ class ReceiverDeviceAsyncTask extends AsyncTask<Void, Integer, Boolean> {
@Override @Override
protected Boolean doInBackground(Void... voids) { protected Boolean doInBackground(Void... voids) {
try { try (ServerSocket serverSocket = new ServerSocket(FILE_TRANSFER_PORT)) {
ServerSocket serverSocket = new ServerSocket(FILE_TRANSFER_PORT);
if(BuildConfig.DEBUG) Log.d(TAG, "Server: Socket opened at " + FILE_TRANSFER_PORT); if(BuildConfig.DEBUG) Log.d(TAG, "Server: Socket opened at " + FILE_TRANSFER_PORT);
final String KIWIX_ROOT = deviceListFragment.getZimStorageRootPath(); final String KIWIX_ROOT = deviceListFragment.getZimStorageRootPath();
int totalFileCount = deviceListFragment.getTotalFilesForTransfer(); int totalFileCount = deviceListFragment.getTotalFilesForTransfer();
for(int currentFile = 1; currentFile <= totalFileCount; currentFile++) { for(int currentFile = 1; currentFile <= totalFileCount && !isCancelled(); currentFile++) {
Socket client = serverSocket.accept(); Socket client = serverSocket.accept();
if(BuildConfig.DEBUG) Log.d(TAG, "Server: Client connected for file " + currentFile); if(BuildConfig.DEBUG) Log.d(TAG, "Server: Client connected for file " + currentFile);
@ -78,9 +77,11 @@ class ReceiverDeviceAsyncTask extends AsyncTask<Void, Integer, Boolean> {
publishProgress(SENT); publishProgress(SENT);
deviceListFragment.incrementTotalFilesSent(); deviceListFragment.incrementTotalFilesSent();
} }
serverSocket.close();
return true; // Returned in case of a succesful file transfer if(isCancelled())
return false; // Returned in case the task was cancelled
else
return true; // Returned in case of a successful file transfer
} catch (IOException e) { } catch (IOException e) {
Log.e(TAG, e.getMessage()); Log.e(TAG, e.getMessage());
@ -94,6 +95,10 @@ class ReceiverDeviceAsyncTask extends AsyncTask<Void, Integer, Boolean> {
transferProgressFragment.changeStatus(fileItemIndex, fileStatus); transferProgressFragment.changeStatus(fileItemIndex, fileStatus);
} }
@Override protected void onCancelled() {
Log.d(TAG, "ReceiverDeviceAsyncTask cancelled");
}
@Override @Override
protected void onPostExecute(Boolean allFilesReceived) { protected void onPostExecute(Boolean allFilesReceived) {
if(BuildConfig.DEBUG) Log.d(TAG, "File transfer complete"); if(BuildConfig.DEBUG) Log.d(TAG, "File transfer complete");

View File

@ -55,9 +55,13 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Void, Boolean> {
@Override @Override
protected Boolean doInBackground(Uri... fileUris) { protected Boolean doInBackground(Uri... fileUris) {
Uri fileUri = fileUris[0]; // Uri of file to be transferred Uri fileUri = fileUris[0]; // Uri of file to be transferred
Socket socket = new Socket(); // Represents the sender device ContentResolver contentResolver = deviceListFragment.getActivity().getContentResolver();
try { try (Socket socket = new Socket(); InputStream fileInputStream = contentResolver.openInputStream(fileUri)) { // Represents the sender device
if(isCancelled()) {
return false;
}
socket.bind(null); socket.bind(null);
String hostAddress = deviceListFragment.getFileReceiverDeviceAddress().getHostAddress(); String hostAddress = deviceListFragment.getFileReceiverDeviceAddress().getHostAddress();
@ -67,9 +71,6 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Void, Boolean> {
OutputStream socketOutputStream = socket.getOutputStream(); OutputStream socketOutputStream = socket.getOutputStream();
ContentResolver contentResolver = deviceListFragment.getActivity().getContentResolver();
InputStream fileInputStream = contentResolver.openInputStream(fileUri);
DeviceListFragment.copyToOutputStream(fileInputStream, socketOutputStream); DeviceListFragment.copyToOutputStream(fileInputStream, socketOutputStream);
if(BuildConfig.DEBUG) Log.d(TAG, "Sender: Data written"); if(BuildConfig.DEBUG) Log.d(TAG, "Sender: Data written");
@ -78,16 +79,11 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Void, Boolean> {
} catch (IOException e) { } catch (IOException e) {
Log.e(TAG, e.getMessage()); Log.e(TAG, e.getMessage());
return false; return false;
}
}
} finally { @Override protected void onCancelled() {
if (socket.isConnected()) { Log.d(TAG, "SenderDeviceAsyncTask cancelled");
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }
@Override @Override