mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-09-23 12:42:56 -04:00
Increment: Cancel all async-tasks when closing LocalFileTransferActivity
This commit is contained in:
parent
3198753d3d
commit
73268cfb5b
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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");
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user