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 boolean fileTransferStarted = false;
private PeerGroupHandshakeAsyncTask peerGroupHandshakeAsyncTask;
private SenderDeviceAsyncTask senderDeviceAsyncTaskArray[];
private ReceiverDeviceAsyncTask receiverDeviceAsyncTask;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
@ -192,6 +196,20 @@ public class DeviceListFragment extends ListFragment implements WifiP2pManager.P
((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
searchingPeersProgressBar.setVisibility(View.VISIBLE);
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 */
groupInfo = info;
// Start handshake between the devices
new PeerGroupHandshakeAsyncTask(this, groupInfo).execute();
peerGroupHandshakeAsyncTask = new PeerGroupHandshakeAsyncTask(this, groupInfo);
peerGroupHandshakeAsyncTask.execute();
}
public void setClientAddress(InetAddress clientAddress) {
@ -225,7 +244,8 @@ public class DeviceListFragment extends ListFragment implements WifiP2pManager.P
if(groupInfo.groupFormed && !fileSender) {
displayTransferProgressFragment();
new ReceiverDeviceAsyncTask(this, transferProgressFragment).execute();
receiverDeviceAsyncTask = new ReceiverDeviceAsyncTask(this, transferProgressFragment);
receiverDeviceAsyncTask.execute();
} 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);
for(int i = 0; i < 20000000; i++);
senderDeviceAsyncTaskArray = new SenderDeviceAsyncTask[totalFilesForTransfer];
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
public void closeLocalFileTransferActivity() {
final DeviceListFragment deviceListFragment = (DeviceListFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_device_list);
if(deviceListFragment != null) {
deviceListFragment.cancelAsyncTasks();
}
fileSendingDevice = false;
disconnect();
this.finish();

View File

@ -50,9 +50,8 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
@Override
protected InetAddress doInBackground(Void... voids) {
try {
if(groupInfo.groupFormed && groupInfo.isGroupOwner) {
ServerSocket serverSocket = new ServerSocket(PEER_HANDSHAKE_PORT);
if(groupInfo.groupFormed && groupInfo.isGroupOwner && !isCancelled()) {
try (ServerSocket serverSocket = new ServerSocket(PEER_HANDSHAKE_PORT)) {
serverSocket.setReuseAddress(true);
Socket server = serverSocket.accept();
@ -60,20 +59,24 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
Object object = objectInputStream.readObject();
// 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) {
Log.d(TAG, "Client IP address: "+ server.getInetAddress());
}
exchangeFileTransferMetadata(server.getOutputStream(), server.getInputStream());
server.close();
return server.getInetAddress();
} else { // Selected device is not accepting wifi direct connections through the kiwix app
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.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());
client.close();
return groupInfo.groupOwnerAddress;
}
else {
return null;
}
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
else {
return null;
}
}
private boolean isKiwixHandshake(Object object) {
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
protected void onPostExecute(InetAddress inetAddress) {
deviceListFragment.setClientAddress(inetAddress);

View File

@ -45,14 +45,13 @@ class ReceiverDeviceAsyncTask extends AsyncTask<Void, Integer, Boolean> {
@Override
protected Boolean doInBackground(Void... voids) {
try {
ServerSocket serverSocket = new ServerSocket(FILE_TRANSFER_PORT);
try (ServerSocket serverSocket = new ServerSocket(FILE_TRANSFER_PORT)) {
if(BuildConfig.DEBUG) Log.d(TAG, "Server: Socket opened at " + FILE_TRANSFER_PORT);
final String KIWIX_ROOT = deviceListFragment.getZimStorageRootPath();
int totalFileCount = deviceListFragment.getTotalFilesForTransfer();
for(int currentFile = 1; currentFile <= totalFileCount; currentFile++) {
for(int currentFile = 1; currentFile <= totalFileCount && !isCancelled(); currentFile++) {
Socket client = serverSocket.accept();
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);
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) {
Log.e(TAG, e.getMessage());
@ -94,6 +95,10 @@ class ReceiverDeviceAsyncTask extends AsyncTask<Void, Integer, Boolean> {
transferProgressFragment.changeStatus(fileItemIndex, fileStatus);
}
@Override protected void onCancelled() {
Log.d(TAG, "ReceiverDeviceAsyncTask cancelled");
}
@Override
protected void onPostExecute(Boolean allFilesReceived) {
if(BuildConfig.DEBUG) Log.d(TAG, "File transfer complete");

View File

@ -55,9 +55,13 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Void, Boolean> {
@Override
protected Boolean doInBackground(Uri... fileUris) {
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);
String hostAddress = deviceListFragment.getFileReceiverDeviceAddress().getHostAddress();
@ -67,9 +71,6 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Void, Boolean> {
OutputStream socketOutputStream = socket.getOutputStream();
ContentResolver contentResolver = deviceListFragment.getActivity().getContentResolver();
InputStream fileInputStream = contentResolver.openInputStream(fileUri);
DeviceListFragment.copyToOutputStream(fileInputStream, socketOutputStream);
if(BuildConfig.DEBUG) Log.d(TAG, "Sender: Data written");
@ -78,16 +79,11 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Void, Boolean> {
} catch (IOException e) {
Log.e(TAG, e.getMessage());
return false;
}
}
} finally {
if (socket.isConnected()) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override protected void onCancelled() {
Log.d(TAG, "SenderDeviceAsyncTask cancelled");
}
@Override