mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-09-22 20:24:03 -04:00
Refactor: (Major) Shift DeviceListFragment functionality to LocalFileTransferActivity
This commit is contained in:
parent
c667315a97
commit
e7bc597a78
@ -54,33 +54,33 @@ import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTra
|
|||||||
*
|
*
|
||||||
* The starting point for the module is {@link LocalFileTransferActivity}
|
* The starting point for the module is {@link LocalFileTransferActivity}
|
||||||
*/
|
*/
|
||||||
public class DeviceListFragment extends ListFragment
|
public class DeviceListFragment extends ListFragment {
|
||||||
implements WifiP2pManager.PeerListListener, WifiP2pManager.ConnectionInfoListener {
|
//implements WifiP2pManager.PeerListListener, WifiP2pManager.ConnectionInfoListener {
|
||||||
|
|
||||||
public static final String TAG = "DeviceListFragment";
|
public static final String TAG = "DeviceListFragment";
|
||||||
public static int PEER_HANDSHAKE_PORT = 8009;
|
/*public static int PEER_HANDSHAKE_PORT = 8009;
|
||||||
public static int FILE_TRANSFER_PORT = 8008;
|
public static int FILE_TRANSFER_PORT = 8008;*/
|
||||||
|
|
||||||
private SharedPreferenceUtil sharedPreferenceUtil;
|
private SharedPreferenceUtil sharedPreferenceUtil;
|
||||||
private AlertDialogShower alertDialogShower;
|
private AlertDialogShower alertDialogShower;
|
||||||
|
|
||||||
private LocalFileTransferActivity localFileTransferActivity;
|
private LocalFileTransferActivity localFileTransferActivity;
|
||||||
// Parent activity, starting point of the module
|
// Parent activity, starting point of the module
|
||||||
private TransferProgressFragment transferProgressFragment;
|
/*private TransferProgressFragment transferProgressFragment;*/
|
||||||
// Sibling fragment, for displaying transfer progress
|
// Sibling fragment, for displaying transfer progress
|
||||||
|
|
||||||
// Views part of the DeviceListFragment
|
/*// Views part of the DeviceListFragment
|
||||||
@BindView(R.id.text_view_device_name) TextView deviceName;
|
@BindView(R.id.text_view_device_name) TextView deviceName;
|
||||||
@BindView(R.id.progress_bar_searching_peers) ProgressBar searchingPeersProgressBar;
|
@BindView(R.id.progress_bar_searching_peers) ProgressBar searchingPeersProgressBar;
|
||||||
@BindView(android.R.id.list) ListView listViewPeerDevices;
|
@BindView(android.R.id.list) ListView listViewPeerDevices;
|
||||||
@BindView(android.R.id.empty) TextView textViewPeerDevices;
|
@BindView(android.R.id.empty) TextView textViewPeerDevices;*/
|
||||||
|
|
||||||
private Unbinder unbinder;
|
private Unbinder unbinder;
|
||||||
|
|
||||||
private boolean fileSender = false; // Whether file sending device or not
|
private boolean fileSender = false; // Whether file sending device or not
|
||||||
private ArrayList<Uri> fileUriList;
|
private ArrayList<Uri> fileUriList;
|
||||||
// Uris of files to be shared, available only for the sender device
|
// Uris of files to be shared, available only for the sender device
|
||||||
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> filesToSend = new ArrayList<>();
|
private ArrayList<FileItem> filesToSend = new ArrayList<>();
|
||||||
|
|
||||||
@ -97,7 +97,7 @@ public class DeviceListFragment extends ListFragment
|
|||||||
|
|
||||||
private PeerGroupHandshakeAsyncTask peerGroupHandshakeAsyncTask;
|
private PeerGroupHandshakeAsyncTask peerGroupHandshakeAsyncTask;
|
||||||
private SenderDeviceAsyncTask senderDeviceAsyncTaskArray[];
|
private SenderDeviceAsyncTask senderDeviceAsyncTaskArray[];
|
||||||
private ReceiverDeviceAsyncTask receiverDeviceAsyncTask;
|
private ReceiverDeviceAsyncTask receiverDeviceAsyncTask;*/
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
|
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
|
||||||
@ -105,10 +105,10 @@ public class DeviceListFragment extends ListFragment
|
|||||||
localFileTransferActivity = (LocalFileTransferActivity) getActivity();
|
localFileTransferActivity = (LocalFileTransferActivity) getActivity();
|
||||||
|
|
||||||
// As DeviceListFragment extends ListFragment for the purpose of displaying list of peers
|
// As DeviceListFragment extends ListFragment for the purpose of displaying list of peers
|
||||||
this.setListAdapter(
|
/*this.setListAdapter(
|
||||||
new WifiPeerListAdapter(localFileTransferActivity, R.layout.row_peer_device, peerDevices));
|
new WifiPeerListAdapter(localFileTransferActivity, R.layout.row_peer_device, peerDevices));*/
|
||||||
|
|
||||||
if (localFileTransferActivity.isFileSender()) {
|
/*if (localFileTransferActivity.isFileSender()) {
|
||||||
fileSender = true;
|
fileSender = true;
|
||||||
fileUriList = localFileTransferActivity.getFileUriArrayList();
|
fileUriList = localFileTransferActivity.getFileUriArrayList();
|
||||||
totalFilesForTransfer = fileUriList.size();
|
totalFilesForTransfer = fileUriList.size();
|
||||||
@ -118,7 +118,7 @@ public class DeviceListFragment extends ListFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
displayTransferProgressFragment();
|
displayTransferProgressFragment();
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -138,7 +138,7 @@ public class DeviceListFragment extends ListFragment
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onListItemClick(ListView l, View v, int position, long id) {
|
public void onListItemClick(ListView l, View v, int position, long id) {
|
||||||
/* Connection can only be initiated by user of the sender device, & only when transfer has not been started */
|
/* Connection can only be initiated by user of the sender device, & only when transfer has not been started *//*
|
||||||
if (!isFileSender() || fileTransferStarted) {
|
if (!isFileSender() || fileTransferStarted) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -151,27 +151,27 @@ public class DeviceListFragment extends ListFragment
|
|||||||
showToast(localFileTransferActivity, R.string.performing_handshake, Toast.LENGTH_LONG);
|
showToast(localFileTransferActivity, R.string.performing_handshake, Toast.LENGTH_LONG);
|
||||||
return Unit.INSTANCE;
|
return Unit.INSTANCE;
|
||||||
}
|
}
|
||||||
});
|
});*/
|
||||||
}
|
}
|
||||||
|
|
||||||
private void displayTransferProgressFragment() {
|
/*private void displayTransferProgressFragment() {
|
||||||
transferProgressFragment = TransferProgressFragment.newInstance(filesToSend);
|
transferProgressFragment = TransferProgressFragment.newInstance(filesToSend);
|
||||||
FragmentManager fragmentManager = localFileTransferActivity.getSupportFragmentManager();
|
FragmentManager fragmentManager = localFileTransferActivity.getSupportFragmentManager();
|
||||||
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
|
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
|
||||||
fragmentTransaction.add(R.id.container_fragment_transfer_progress, transferProgressFragment)
|
fragmentTransaction.add(R.id.container_fragment_transfer_progress, transferProgressFragment)
|
||||||
.commit();
|
.commit();
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public void updateUserDevice(WifiP2pDevice device) { // Update UI with user device's details
|
/*public void updateUserDevice(WifiP2pDevice device) { // Update UI with user device's details
|
||||||
this.userDevice = device;
|
this.userDevice = device;
|
||||||
|
|
||||||
if (userDevice != null) {
|
if (userDevice != null) {
|
||||||
deviceName.setText(userDevice.deviceName);
|
deviceName.setText(userDevice.deviceName);
|
||||||
Log.d(TAG, getDeviceStatus(userDevice.status));
|
Log.d(TAG, getDeviceStatus(userDevice.status));
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public static String getDeviceStatus(int status) {
|
/*public static String getDeviceStatus(int status) {
|
||||||
|
|
||||||
if (BuildConfig.DEBUG) Log.d(TAG, "Peer Status: " + status);
|
if (BuildConfig.DEBUG) Log.d(TAG, "Peer Status: " + status);
|
||||||
switch (status) {
|
switch (status) {
|
||||||
@ -189,9 +189,9 @@ public class DeviceListFragment extends ListFragment
|
|||||||
default:
|
default:
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
/* From WifiP2pManager.PeerListListener callback-interface */
|
/* From WifiP2pManager.PeerListListener callback-interface *//*
|
||||||
@Override
|
@Override
|
||||||
public void onPeersAvailable(WifiP2pDeviceList peers) {
|
public void onPeersAvailable(WifiP2pDeviceList peers) {
|
||||||
searchingPeersProgressBar.setVisibility(View.GONE);
|
searchingPeersProgressBar.setVisibility(View.GONE);
|
||||||
@ -204,9 +204,9 @@ public class DeviceListFragment extends ListFragment
|
|||||||
if (peerDevices.size() == 0) {
|
if (peerDevices.size() == 0) {
|
||||||
Log.d(LocalFileTransferActivity.TAG, "No devices found");
|
Log.d(LocalFileTransferActivity.TAG, "No devices found");
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public void clearPeers() {
|
/*public void clearPeers() {
|
||||||
peerDevices.clear();
|
peerDevices.clear();
|
||||||
((WifiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
|
((WifiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
@ -231,10 +231,10 @@ public class DeviceListFragment extends ListFragment
|
|||||||
textViewPeerDevices.setVisibility(View.INVISIBLE);
|
textViewPeerDevices.setVisibility(View.INVISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* From WifiP2pManager.ConnectionInfoListener callback-interface */
|
*//* From WifiP2pManager.ConnectionInfoListener callback-interface *//*
|
||||||
@Override
|
@Override
|
||||||
public void onConnectionInfoAvailable(WifiP2pInfo info) {
|
public void onConnectionInfoAvailable(WifiP2pInfo info) {
|
||||||
/* 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
|
||||||
peerGroupHandshakeAsyncTask = new PeerGroupHandshakeAsyncTask(this, groupInfo);
|
peerGroupHandshakeAsyncTask = new PeerGroupHandshakeAsyncTask(this, groupInfo);
|
||||||
@ -283,7 +283,7 @@ public class DeviceListFragment extends ListFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper methods */
|
*//* Helper methods *//*
|
||||||
|
|
||||||
public WifiP2pDevice getUserDevice() {
|
public WifiP2pDevice getUserDevice() {
|
||||||
return userDevice;
|
return userDevice;
|
||||||
@ -335,11 +335,11 @@ public class DeviceListFragment extends ListFragment
|
|||||||
return fileReceiverDeviceAddress;
|
return fileReceiverDeviceAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getFileName(Uri fileUri) {
|
*//*public static String getFileName(Uri fileUri) {
|
||||||
String fileUriString = fileUri.toString();
|
String fileUriString = fileUri.toString();
|
||||||
// Returns text after location of last slash in the file path
|
// Returns text after location of last slash in the file path
|
||||||
return fileUriString.substring(fileUriString.lastIndexOf('/') + 1);
|
return fileUriString.substring(fileUriString.lastIndexOf('/') + 1);
|
||||||
}
|
}*//*
|
||||||
|
|
||||||
public static void copyToOutputStream(InputStream inputStream, OutputStream outputStream)
|
public static void copyToOutputStream(InputStream inputStream, OutputStream outputStream)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
@ -354,7 +354,7 @@ public class DeviceListFragment extends ListFragment
|
|||||||
outputStream.close();
|
outputStream.close();
|
||||||
inputStream.close();
|
inputStream.close();
|
||||||
Log.d(LocalFileTransferActivity.TAG, "Both streams closed");
|
Log.d(LocalFileTransferActivity.TAG, "Both streams closed");
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public interface DeviceActionListener {
|
public interface DeviceActionListener {
|
||||||
void connect(@NonNull WifiP2pDevice peerDevice);
|
void connect(@NonNull WifiP2pDevice peerDevice);
|
||||||
|
@ -11,6 +11,8 @@ import android.net.Uri;
|
|||||||
import android.net.wifi.WpsInfo;
|
import android.net.wifi.WpsInfo;
|
||||||
import android.net.wifi.p2p.WifiP2pConfig;
|
import android.net.wifi.p2p.WifiP2pConfig;
|
||||||
import android.net.wifi.p2p.WifiP2pDevice;
|
import android.net.wifi.p2p.WifiP2pDevice;
|
||||||
|
import android.net.wifi.p2p.WifiP2pDeviceList;
|
||||||
|
import android.net.wifi.p2p.WifiP2pInfo;
|
||||||
import android.net.wifi.p2p.WifiP2pManager;
|
import android.net.wifi.p2p.WifiP2pManager;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@ -18,6 +20,10 @@ import android.util.Log;
|
|||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.ListView;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
@ -26,12 +32,19 @@ import androidx.appcompat.app.AppCompatActivity;
|
|||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.fragment.app.FragmentTransaction;
|
import androidx.fragment.app.FragmentTransaction;
|
||||||
|
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.util.List;
|
||||||
import kotlin.Unit;
|
import kotlin.Unit;
|
||||||
import kotlin.jvm.functions.Function0;
|
import kotlin.jvm.functions.Function0;
|
||||||
|
import org.kiwix.kiwixmobile.BuildConfig;
|
||||||
import org.kiwix.kiwixmobile.KiwixApplication;
|
import org.kiwix.kiwixmobile.KiwixApplication;
|
||||||
import org.kiwix.kiwixmobile.R;
|
import org.kiwix.kiwixmobile.R;
|
||||||
import org.kiwix.kiwixmobile.utils.AlertDialogShower;
|
import org.kiwix.kiwixmobile.utils.AlertDialogShower;
|
||||||
@ -42,6 +55,8 @@ import java.util.ArrayList;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.FileItem.FileStatus.TO_BE_SENT;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by @Aditya-Sood as a part of GSoC 2019.
|
* Created by @Aditya-Sood as a part of GSoC 2019.
|
||||||
*
|
*
|
||||||
@ -53,8 +68,7 @@ import javax.inject.Inject;
|
|||||||
* The module uses this activity along with {@link DeviceListFragment} to manage connection
|
* The module uses this activity along with {@link DeviceListFragment} to manage connection
|
||||||
* and file transfer between the devices.
|
* and file transfer between the devices.
|
||||||
*/
|
*/
|
||||||
public class LocalFileTransferActivity extends AppCompatActivity {
|
public class LocalFileTransferActivity extends AppCompatActivity implements WifiP2pManager.PeerListListener, WifiP2pManager.ConnectionInfoListener {
|
||||||
//implements WifiP2pManager.ChannelListener, DeviceListFragment.DeviceActionListener {
|
|
||||||
|
|
||||||
public static final String TAG = "LocalFileTransferActvty";
|
public static final String TAG = "LocalFileTransferActvty";
|
||||||
// Not a typo, 'Log' tags have a length upper limit of 25 characters
|
// Not a typo, 'Log' tags have a length upper limit of 25 characters
|
||||||
@ -63,29 +77,46 @@ public class LocalFileTransferActivity extends AppCompatActivity {
|
|||||||
private static final int PERMISSION_REQUEST_CODE_COARSE_LOCATION = 1;
|
private static final int PERMISSION_REQUEST_CODE_COARSE_LOCATION = 1;
|
||||||
private static final int PERMISSION_REQUEST_CODE_STORAGE_WRITE_ACCESS = 2;
|
private static final int PERMISSION_REQUEST_CODE_STORAGE_WRITE_ACCESS = 2;
|
||||||
|
|
||||||
|
public static int PEER_HANDSHAKE_PORT = 8009;
|
||||||
|
public static int FILE_TRANSFER_PORT = 8008;
|
||||||
|
|
||||||
|
private TransferProgressFragment transferProgressFragment;
|
||||||
|
|
||||||
@Inject SharedPreferenceUtil sharedPreferenceUtil;
|
@Inject SharedPreferenceUtil sharedPreferenceUtil;
|
||||||
@Inject AlertDialogShower alertDialogShower;
|
@Inject AlertDialogShower alertDialogShower;
|
||||||
|
|
||||||
@BindView(R.id.toolbar_local_file_transfer) Toolbar actionBar;
|
@BindView(R.id.toolbar_local_file_transfer) Toolbar actionBar;
|
||||||
|
// Views part of the DeviceListFragment
|
||||||
|
@BindView(R.id.text_view_device_name) TextView deviceName;
|
||||||
|
@BindView(R.id.progress_bar_searching_peers) ProgressBar searchingPeersProgressBar;
|
||||||
|
@BindView(R.id.list_peer_devices) ListView listViewPeerDevices;
|
||||||
|
@BindView(R.id.text_view_empty_peer_list) TextView textViewPeerDevices;
|
||||||
|
|
||||||
private ArrayList<Uri> fileUriArrayList;
|
private ArrayList<Uri> fileUriArrayList;
|
||||||
// For sender device, stores Uris of files to be transferred
|
// For sender device, stores Uris of files to be transferred
|
||||||
public Boolean fileSendingDevice = false;// Whether the device is the file sender or not
|
public Boolean fileSendingDevice = false;// Whether the device is the file sender or not
|
||||||
|
|
||||||
/* Variables related to the WiFi P2P API */
|
|
||||||
/*private boolean wifiP2pEnabled = false; // Whether WiFi has been enabled or not
|
|
||||||
private boolean retryChannel = false; // Whether channel has retried connecting previously
|
|
||||||
|
|
||||||
private WifiP2pManager manager; // Overall manager of Wifi p2p connections for the module
|
|
||||||
private WifiP2pManager.Channel channel;
|
|
||||||
// Connects the module to device's underlying Wifi p2p framework
|
|
||||||
|
|
||||||
private final IntentFilter intentFilter = new IntentFilter();
|
|
||||||
// For specifying broadcasts (of the P2P API) that the module needs to respond to
|
|
||||||
private BroadcastReceiver receiver = null; // For receiving the broadcasts given by above filter*/
|
|
||||||
|
|
||||||
public WifiDirectManager wifiDirectManager;
|
public WifiDirectManager wifiDirectManager;
|
||||||
|
|
||||||
|
private int totalFilesForTransfer = -1;
|
||||||
|
private int filesSent = 0; // Count of number of files transferred until now
|
||||||
|
private ArrayList<FileItem> filesToSend = new ArrayList<>();
|
||||||
|
|
||||||
|
private WifiP2pDevice userDevice; // Represents the device on which the app is running
|
||||||
|
private WifiP2pInfo groupInfo;
|
||||||
|
// Corresponds to the WiFi P2P group formed between the two devices
|
||||||
|
private List<WifiP2pDevice> peerDevices = new ArrayList<WifiP2pDevice>();
|
||||||
|
|
||||||
|
private WifiP2pDevice selectedPeerDevice = null;
|
||||||
|
private InetAddress selectedPeerDeviceInetAddress;
|
||||||
|
|
||||||
|
private InetAddress fileReceiverDeviceAddress; // IP address of the file receiving device
|
||||||
|
private boolean fileTransferStarted = false;
|
||||||
|
|
||||||
|
private PeerGroupHandshakeAsyncTask peerGroupHandshakeAsyncTask;
|
||||||
|
private SenderDeviceAsyncTask senderDeviceAsyncTaskArray[];
|
||||||
|
private ReceiverDeviceAsyncTask receiverDeviceAsyncTask;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@ -120,18 +151,39 @@ public class LocalFileTransferActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
|
|
||||||
/* Initialisations for using the WiFi P2P API */
|
/* Initialisations for using the WiFi P2P API */
|
||||||
/*
|
|
||||||
// Intents that the broadcast receiver will be responding to
|
|
||||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
|
|
||||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
|
|
||||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
|
|
||||||
intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
|
|
||||||
|
|
||||||
manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
|
|
||||||
channel = manager.initialize(this, getMainLooper(), null);*/
|
|
||||||
|
|
||||||
this.wifiDirectManager = new WifiDirectManager(this);
|
this.wifiDirectManager = new WifiDirectManager(this);
|
||||||
wifiDirectManager.initialiseWifiDirectManager();
|
wifiDirectManager.initialiseWifiDirectManager();
|
||||||
|
|
||||||
|
listViewPeerDevices.setAdapter(new WifiPeerListAdapter(this, R.layout.row_peer_device, peerDevices));
|
||||||
|
|
||||||
|
if(isFileSender()) {
|
||||||
|
totalFilesForTransfer = fileUriArrayList.size();
|
||||||
|
|
||||||
|
for (int i = 0; i < fileUriArrayList.size(); i++) {
|
||||||
|
filesToSend.add(new FileItem(getFileName(fileUriArrayList.get(i)), TO_BE_SENT));
|
||||||
|
}
|
||||||
|
|
||||||
|
displayTransferProgressFragment();
|
||||||
|
|
||||||
|
listViewPeerDevices.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||||
|
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||||
|
/* Connection can only be initiated by user of the sender device, & only when transfer has not been started */
|
||||||
|
if (!isFileSender() || fileTransferStarted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
selectedPeerDevice = (WifiP2pDevice) listViewPeerDevices.getAdapter().getItem(position);
|
||||||
|
alertDialogShower.show(new KiwixDialog.FileTransferConfirmation(selectedPeerDevice),
|
||||||
|
new Function0<Unit>() {
|
||||||
|
@Override public Unit invoke() {
|
||||||
|
((DeviceListFragment.DeviceActionListener) wifiDirectManager).connect(selectedPeerDevice);
|
||||||
|
showToast(LocalFileTransferActivity.this, R.string.performing_handshake, Toast.LENGTH_LONG);
|
||||||
|
return Unit.INSTANCE;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -160,11 +212,12 @@ public class LocalFileTransferActivity extends AppCompatActivity {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
final DeviceListFragment deviceListFragment =
|
onInitiateDiscovery();
|
||||||
|
/*final DeviceListFragment deviceListFragment =
|
||||||
(DeviceListFragment) getSupportFragmentManager().findFragmentById(
|
(DeviceListFragment) getSupportFragmentManager().findFragmentById(
|
||||||
R.id.fragment_device_list);
|
R.id.fragment_device_list);
|
||||||
deviceListFragment.onInitiateDiscovery();
|
deviceListFragment.onInitiateDiscovery();
|
||||||
deviceListFragment.performFieldInjection(sharedPreferenceUtil, alertDialogShower);
|
deviceListFragment.performFieldInjection(sharedPreferenceUtil, alertDialogShower);*/
|
||||||
/*manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
|
/*manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess() {
|
public void onSuccess() {
|
||||||
@ -225,21 +278,23 @@ public class LocalFileTransferActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void resetPeers() {
|
public void resetPeers() {
|
||||||
DeviceListFragment deviceListFragment =
|
/*DeviceListFragment deviceListFragment =
|
||||||
(DeviceListFragment) getSupportFragmentManager().findFragmentById(
|
(DeviceListFragment) getSupportFragmentManager().findFragmentById(
|
||||||
R.id.fragment_device_list);
|
R.id.fragment_device_list);
|
||||||
if (deviceListFragment != null) {
|
if (deviceListFragment != null) {
|
||||||
deviceListFragment.clearPeers();
|
deviceListFragment.clearPeers();
|
||||||
}
|
}*/
|
||||||
|
clearPeers();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resetData() {
|
public void resetData() {
|
||||||
DeviceListFragment deviceListFragment =
|
/*DeviceListFragment deviceListFragment =
|
||||||
(DeviceListFragment) getSupportFragmentManager().findFragmentById(
|
(DeviceListFragment) getSupportFragmentManager().findFragmentById(
|
||||||
R.id.fragment_device_list);
|
R.id.fragment_device_list);
|
||||||
if (deviceListFragment != null) {
|
if (deviceListFragment != null) {
|
||||||
deviceListFragment.clearPeers();
|
deviceListFragment.clearPeers();
|
||||||
}
|
}*/
|
||||||
|
clearPeers();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void showToast(Context context, int stringResource, int duration) {
|
static void showToast(Context context, int stringResource, int duration) {
|
||||||
@ -484,12 +539,7 @@ public class LocalFileTransferActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
@Override protected void onDestroy() {
|
@Override protected void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
final DeviceListFragment deviceListFragment =
|
cancelAsyncTasks();
|
||||||
(DeviceListFragment) getSupportFragmentManager().findFragmentById(
|
|
||||||
R.id.fragment_device_list);
|
|
||||||
if (deviceListFragment != null) {
|
|
||||||
deviceListFragment.cancelAsyncTasks();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -497,4 +547,208 @@ public class LocalFileTransferActivity extends AppCompatActivity {
|
|||||||
super.onBackPressed();
|
super.onBackPressed();
|
||||||
wifiDirectManager.closeLocalFileTransferActivity();
|
wifiDirectManager.closeLocalFileTransferActivity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getFileName(Uri fileUri) {
|
||||||
|
String fileUriString = fileUri.toString();
|
||||||
|
// Returns text after location of last slash in the file path
|
||||||
|
return fileUriString.substring(fileUriString.lastIndexOf('/') + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void displayTransferProgressFragment() {
|
||||||
|
transferProgressFragment = TransferProgressFragment.newInstance(filesToSend);
|
||||||
|
FragmentManager fragmentManager = this.getSupportFragmentManager();
|
||||||
|
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
|
||||||
|
fragmentTransaction.add(R.id.container_fragment_transfer_progress, transferProgressFragment)
|
||||||
|
.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateUserDevice(WifiP2pDevice device) { // Update UI with user device's details
|
||||||
|
this.userDevice = device;
|
||||||
|
|
||||||
|
if (userDevice != null) {
|
||||||
|
deviceName.setText(userDevice.deviceName);
|
||||||
|
Log.d(TAG, getDeviceStatus(userDevice.status));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDeviceStatus(int status) {
|
||||||
|
|
||||||
|
if (BuildConfig.DEBUG) Log.d(TAG, "Peer Status: " + status);
|
||||||
|
switch (status) {
|
||||||
|
case WifiP2pDevice.AVAILABLE:
|
||||||
|
return "Available";
|
||||||
|
case WifiP2pDevice.INVITED:
|
||||||
|
return "Invited";
|
||||||
|
case WifiP2pDevice.CONNECTED:
|
||||||
|
return "Connected";
|
||||||
|
case WifiP2pDevice.FAILED:
|
||||||
|
return "Failed";
|
||||||
|
case WifiP2pDevice.UNAVAILABLE:
|
||||||
|
return "Unavailable";
|
||||||
|
|
||||||
|
default:
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* From WifiP2pManager.PeerListListener callback-interface */
|
||||||
|
@Override
|
||||||
|
public void onPeersAvailable(WifiP2pDeviceList peers) {
|
||||||
|
searchingPeersProgressBar.setVisibility(View.GONE);
|
||||||
|
listViewPeerDevices.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
peerDevices.clear();
|
||||||
|
peerDevices.addAll(peers.getDeviceList());
|
||||||
|
((WifiPeerListAdapter) listViewPeerDevices.getAdapter()).notifyDataSetChanged();
|
||||||
|
|
||||||
|
if (peerDevices.size() == 0) {
|
||||||
|
Log.d(LocalFileTransferActivity.TAG, "No devices found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearPeers() {
|
||||||
|
peerDevices.clear();
|
||||||
|
((WifiPeerListAdapter) listViewPeerDevices.getAdapter()).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);
|
||||||
|
listViewPeerDevices.setVisibility(View.INVISIBLE);
|
||||||
|
textViewPeerDevices.setVisibility(View.INVISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* From WifiP2pManager.ConnectionInfoListener callback-interface */
|
||||||
|
@Override
|
||||||
|
public void onConnectionInfoAvailable(WifiP2pInfo info) {
|
||||||
|
/* Devices have successfully connected, and 'info' holds information about the wifi p2p group formed */
|
||||||
|
groupInfo = info;
|
||||||
|
// Start handshake between the devices
|
||||||
|
peerGroupHandshakeAsyncTask = new PeerGroupHandshakeAsyncTask(this, groupInfo);
|
||||||
|
peerGroupHandshakeAsyncTask.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClientAddress(InetAddress clientAddress) {
|
||||||
|
if (clientAddress == null) {
|
||||||
|
// null is returned only in case of a failed handshake
|
||||||
|
showToast(this, R.string.device_not_cooperating, Toast.LENGTH_LONG);
|
||||||
|
wifiDirectManager.closeLocalFileTransferActivity();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If control reaches here, means handshake was successful
|
||||||
|
selectedPeerDeviceInetAddress = clientAddress;
|
||||||
|
startFileTransfer();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startFileTransfer() {
|
||||||
|
fileTransferStarted = true;
|
||||||
|
|
||||||
|
if (groupInfo.groupFormed && !isFileSender()) {
|
||||||
|
displayTransferProgressFragment();
|
||||||
|
|
||||||
|
receiverDeviceAsyncTask = new ReceiverDeviceAsyncTask(this, transferProgressFragment);
|
||||||
|
receiverDeviceAsyncTask.execute();
|
||||||
|
} else if (groupInfo.groupFormed) {
|
||||||
|
{
|
||||||
|
Log.d(LocalFileTransferActivity.TAG, "Starting file transfer");
|
||||||
|
|
||||||
|
fileReceiverDeviceAddress =
|
||||||
|
(groupInfo.isGroupOwner) ? selectedPeerDeviceInetAddress : groupInfo.groupOwnerAddress;
|
||||||
|
|
||||||
|
// Hack for allowing slower receiver devices to setup server before sender device requests to connect
|
||||||
|
showToast(this, 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++) {
|
||||||
|
senderDeviceAsyncTaskArray[i] =
|
||||||
|
new SenderDeviceAsyncTask(this, transferProgressFragment, i);
|
||||||
|
senderDeviceAsyncTaskArray[i].execute(fileUriArrayList.get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Helper methods */
|
||||||
|
|
||||||
|
public WifiP2pDevice getUserDevice() {
|
||||||
|
return userDevice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTotalFilesForTransfer() {
|
||||||
|
return totalFilesForTransfer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalFilesForTransfer(int totalFilesForTransfer) {
|
||||||
|
this.totalFilesForTransfer = totalFilesForTransfer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<FileItem> getFileItems() {
|
||||||
|
return filesToSend;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFileItems(ArrayList<FileItem> fileItems) {
|
||||||
|
this.filesToSend = fileItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Uri> getFileUriList() {
|
||||||
|
return fileUriArrayList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void incrementTotalFilesSent() {
|
||||||
|
this.filesSent++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean allFilesSent() {
|
||||||
|
return (filesSent == totalFilesForTransfer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*public void performFieldInjection(SharedPreferenceUtil sharedPreferenceUtil,
|
||||||
|
AlertDialogShower alertDialogShower) {
|
||||||
|
this.sharedPreferenceUtil = sharedPreferenceUtil;
|
||||||
|
this.alertDialogShower = alertDialogShower;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
public String getZimStorageRootPath() {
|
||||||
|
return (sharedPreferenceUtil.getPrefStorage() + "/Kiwix/");
|
||||||
|
}
|
||||||
|
|
||||||
|
public InetAddress getFileReceiverDeviceAddress() {
|
||||||
|
return fileReceiverDeviceAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*public static String getFileName(Uri fileUri) {
|
||||||
|
String fileUriString = fileUri.toString();
|
||||||
|
// Returns text after location of last slash in the file path
|
||||||
|
return fileUriString.substring(fileUriString.lastIndexOf('/') + 1);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
public static void copyToOutputStream(InputStream inputStream, OutputStream outputStream)
|
||||||
|
throws IOException {
|
||||||
|
byte[] bufferForBytes = new byte[1024];
|
||||||
|
int bytesRead;
|
||||||
|
|
||||||
|
Log.d(TAG, "Copying to OutputStream...");
|
||||||
|
while ((bytesRead = inputStream.read(bufferForBytes)) != -1) {
|
||||||
|
outputStream.write(bufferForBytes, 0, bytesRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
outputStream.close();
|
||||||
|
inputStream.close();
|
||||||
|
Log.d(LocalFileTransferActivity.TAG, "Both streams closed");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,9 @@ import java.net.ServerSocket;
|
|||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.DeviceListFragment.PEER_HANDSHAKE_PORT;
|
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.DeviceListFragment.getFileName;
|
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.FileItem.FileStatus.TO_BE_SENT;
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.FileItem.FileStatus.TO_BE_SENT;
|
||||||
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.PEER_HANDSHAKE_PORT;
|
||||||
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.getFileName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper class for the local file sharing module, used in {@link DeviceListFragment}.
|
* Helper class for the local file sharing module, used in {@link DeviceListFragment}.
|
||||||
@ -39,11 +39,11 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
|
|||||||
private static final String TAG = "PeerGrpHndshakeAsyncTsk";
|
private static final String TAG = "PeerGrpHndshakeAsyncTsk";
|
||||||
private final String HANDSHAKE_MESSAGE = "Request Kiwix File Sharing";
|
private final String HANDSHAKE_MESSAGE = "Request Kiwix File Sharing";
|
||||||
|
|
||||||
private DeviceListFragment deviceListFragment;
|
private LocalFileTransferActivity localFileTransferActivity;
|
||||||
private WifiP2pInfo groupInfo;
|
private WifiP2pInfo groupInfo;
|
||||||
|
|
||||||
public PeerGroupHandshakeAsyncTask(DeviceListFragment deviceListFragment, WifiP2pInfo groupInfo) {
|
public PeerGroupHandshakeAsyncTask(LocalFileTransferActivity localFileTransferActivity, WifiP2pInfo groupInfo) {
|
||||||
this.deviceListFragment = deviceListFragment;
|
this.localFileTransferActivity = localFileTransferActivity;
|
||||||
this.groupInfo = groupInfo;
|
this.groupInfo = groupInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,12 +100,12 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void exchangeFileTransferMetadata(OutputStream outputStream, InputStream inputStream) {
|
private void exchangeFileTransferMetadata(OutputStream outputStream, InputStream inputStream) {
|
||||||
if (deviceListFragment.isFileSender()) {
|
if (localFileTransferActivity.isFileSender()) {
|
||||||
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
|
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
|
||||||
// Send total number of files which will be transferred
|
// Send total number of files which will be transferred
|
||||||
objectOutputStream.writeObject("" + deviceListFragment.getTotalFilesForTransfer());
|
objectOutputStream.writeObject("" + localFileTransferActivity.getTotalFilesForTransfer());
|
||||||
|
|
||||||
ArrayList<Uri> fileUriList = deviceListFragment.getFileUriList();
|
ArrayList<Uri> fileUriList = localFileTransferActivity.getFileUriList();
|
||||||
for (
|
for (
|
||||||
Uri fileUri : fileUriList) { // 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(getFileName(fileUri));
|
objectOutputStream.writeObject(getFileName(fileUri));
|
||||||
@ -120,7 +120,7 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
|
|||||||
|
|
||||||
if (totalFilesObject.getClass().equals(String.class)) {
|
if (totalFilesObject.getClass().equals(String.class)) {
|
||||||
int total = Integer.parseInt((String) totalFilesObject);
|
int total = Integer.parseInt((String) totalFilesObject);
|
||||||
deviceListFragment.setTotalFilesForTransfer(total);
|
localFileTransferActivity.setTotalFilesForTransfer(total);
|
||||||
|
|
||||||
ArrayList<FileItem> fileItems = new ArrayList<>();
|
ArrayList<FileItem> fileItems = new ArrayList<>();
|
||||||
for (int i = 0; i < total; i++) { // Read names of each of those files, in order
|
for (int i = 0; i < total; i++) { // Read names of each of those files, in order
|
||||||
@ -131,7 +131,7 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deviceListFragment.setFileItems(fileItems);
|
localFileTransferActivity.setFileItems(fileItems);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -145,6 +145,6 @@ class PeerGroupHandshakeAsyncTask extends AsyncTask<Void, Void, InetAddress> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostExecute(InetAddress inetAddress) {
|
protected void onPostExecute(InetAddress inetAddress) {
|
||||||
deviceListFragment.setClientAddress(inetAddress);
|
localFileTransferActivity.setClientAddress(inetAddress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,10 +14,10 @@ import java.net.ServerSocket;
|
|||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.DeviceListFragment.FILE_TRANSFER_PORT;
|
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.DeviceListFragment.copyToOutputStream;
|
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.FileItem.FileStatus.SENDING;
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.FileItem.FileStatus.SENDING;
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.FileItem.FileStatus.SENT;
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.FileItem.FileStatus.SENT;
|
||||||
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.FILE_TRANSFER_PORT;
|
||||||
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.copyToOutputStream;
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.showToast;
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.showToast;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -34,13 +34,13 @@ class ReceiverDeviceAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
|
|
||||||
private static final String TAG = "ReceiverDeviceAsyncTask";
|
private static final String TAG = "ReceiverDeviceAsyncTask";
|
||||||
|
|
||||||
private DeviceListFragment deviceListFragment;
|
private LocalFileTransferActivity localFileTransferActivity;
|
||||||
private TransferProgressFragment transferProgressFragment;
|
private TransferProgressFragment transferProgressFragment;
|
||||||
private int fileItemIndex;
|
private int fileItemIndex;
|
||||||
|
|
||||||
public ReceiverDeviceAsyncTask(DeviceListFragment deviceListFragment,
|
public ReceiverDeviceAsyncTask(LocalFileTransferActivity localFileTransferActivity,
|
||||||
TransferProgressFragment transferProgressFragment) {
|
TransferProgressFragment transferProgressFragment) {
|
||||||
this.deviceListFragment = deviceListFragment;
|
this.localFileTransferActivity = localFileTransferActivity;
|
||||||
this.transferProgressFragment = transferProgressFragment;
|
this.transferProgressFragment = transferProgressFragment;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,9 +49,9 @@ class ReceiverDeviceAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
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);
|
if (BuildConfig.DEBUG) Log.d(TAG, "Server: Socket opened at " + FILE_TRANSFER_PORT);
|
||||||
|
|
||||||
final String KIWIX_ROOT = deviceListFragment.getZimStorageRootPath();
|
final String KIWIX_ROOT = localFileTransferActivity.getZimStorageRootPath();
|
||||||
|
|
||||||
int totalFileCount = deviceListFragment.getTotalFilesForTransfer();
|
int totalFileCount = localFileTransferActivity.getTotalFilesForTransfer();
|
||||||
for (int currentFile = 1; currentFile <= totalFileCount && !isCancelled(); currentFile++) {
|
for (int currentFile = 1; currentFile <= totalFileCount && !isCancelled(); currentFile++) {
|
||||||
|
|
||||||
Socket client = serverSocket.accept();
|
Socket client = serverSocket.accept();
|
||||||
@ -60,7 +60,7 @@ class ReceiverDeviceAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
fileItemIndex = currentFile - 1;
|
fileItemIndex = currentFile - 1;
|
||||||
publishProgress(SENDING);
|
publishProgress(SENDING);
|
||||||
|
|
||||||
ArrayList<FileItem> fileItems = deviceListFragment.getFileItems();
|
ArrayList<FileItem> fileItems = localFileTransferActivity.getFileItems();
|
||||||
String incomingFileName = fileItems.get(fileItemIndex).getFileName();
|
String incomingFileName = fileItems.get(fileItemIndex).getFileName();
|
||||||
|
|
||||||
final File clientNoteFileLocation = new File(KIWIX_ROOT + incomingFileName);
|
final File clientNoteFileLocation = new File(KIWIX_ROOT + incomingFileName);
|
||||||
@ -76,7 +76,7 @@ class ReceiverDeviceAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
copyToOutputStream(client.getInputStream(), new FileOutputStream(clientNoteFileLocation));
|
copyToOutputStream(client.getInputStream(), new FileOutputStream(clientNoteFileLocation));
|
||||||
|
|
||||||
publishProgress(SENT);
|
publishProgress(SENT);
|
||||||
deviceListFragment.incrementTotalFilesSent();
|
localFileTransferActivity.incrementTotalFilesSent();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isCancelled()) {
|
if (isCancelled()) {
|
||||||
@ -105,13 +105,13 @@ class ReceiverDeviceAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
if (BuildConfig.DEBUG) Log.d(TAG, "File transfer complete");
|
if (BuildConfig.DEBUG) Log.d(TAG, "File transfer complete");
|
||||||
|
|
||||||
if (allFilesReceived) {
|
if (allFilesReceived) {
|
||||||
showToast(deviceListFragment.getActivity(), R.string.file_transfer_complete,
|
showToast(localFileTransferActivity, R.string.file_transfer_complete,
|
||||||
Toast.LENGTH_LONG);
|
Toast.LENGTH_LONG);
|
||||||
} else {
|
} else {
|
||||||
showToast(deviceListFragment.getActivity(), R.string.error_during_transfer,
|
showToast(localFileTransferActivity, R.string.error_during_transfer,
|
||||||
Toast.LENGTH_LONG);
|
Toast.LENGTH_LONG);
|
||||||
}
|
}
|
||||||
|
|
||||||
((LocalFileTransferActivity) deviceListFragment.getActivity()).wifiDirectManager.closeLocalFileTransferActivity();
|
(localFileTransferActivity).wifiDirectManager.closeLocalFileTransferActivity();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,9 +16,10 @@ import java.io.OutputStream;
|
|||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
|
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.DeviceListFragment.FILE_TRANSFER_PORT;
|
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.DeviceListFragment.getFileName;
|
|
||||||
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.LocalFileTransferActivity.FILE_TRANSFER_PORT;
|
||||||
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.copyToOutputStream;
|
||||||
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.getFileName;
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.showToast;
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.showToast;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,13 +38,13 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Void, Boolean> {
|
|||||||
|
|
||||||
private static final String TAG = "SenderDeviceAsyncTask";
|
private static final String TAG = "SenderDeviceAsyncTask";
|
||||||
|
|
||||||
private DeviceListFragment deviceListFragment;
|
private LocalFileTransferActivity localFileTransferActivity;
|
||||||
private TransferProgressFragment transferProgressFragment;
|
private TransferProgressFragment transferProgressFragment;
|
||||||
private int fileItemIndex;
|
private int fileItemIndex;
|
||||||
|
|
||||||
public SenderDeviceAsyncTask(DeviceListFragment deviceListFragment,
|
public SenderDeviceAsyncTask(LocalFileTransferActivity localFileTransferActivity,
|
||||||
TransferProgressFragment transferProgressFragment, int fileItemIndex) {
|
TransferProgressFragment transferProgressFragment, int fileItemIndex) {
|
||||||
this.deviceListFragment = deviceListFragment;
|
this.localFileTransferActivity = localFileTransferActivity;
|
||||||
this.transferProgressFragment = transferProgressFragment;
|
this.transferProgressFragment = transferProgressFragment;
|
||||||
this.fileItemIndex = fileItemIndex;
|
this.fileItemIndex = fileItemIndex;
|
||||||
}
|
}
|
||||||
@ -56,7 +57,7 @@ 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
|
||||||
ContentResolver contentResolver = deviceListFragment.getActivity().getContentResolver();
|
ContentResolver contentResolver = localFileTransferActivity.getContentResolver();
|
||||||
|
|
||||||
try (Socket socket = new Socket();
|
try (Socket socket = new Socket();
|
||||||
InputStream fileInputStream = contentResolver.openInputStream(
|
InputStream fileInputStream = contentResolver.openInputStream(
|
||||||
@ -67,14 +68,14 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Void, Boolean> {
|
|||||||
}
|
}
|
||||||
socket.bind(null);
|
socket.bind(null);
|
||||||
|
|
||||||
String hostAddress = deviceListFragment.getFileReceiverDeviceAddress().getHostAddress();
|
String hostAddress = localFileTransferActivity.getFileReceiverDeviceAddress().getHostAddress();
|
||||||
socket.connect((new InetSocketAddress(hostAddress, FILE_TRANSFER_PORT)), 15000);
|
socket.connect((new InetSocketAddress(hostAddress, FILE_TRANSFER_PORT)), 15000);
|
||||||
|
|
||||||
if (BuildConfig.DEBUG) Log.d(TAG, "Sender socket - " + socket.isConnected());
|
if (BuildConfig.DEBUG) Log.d(TAG, "Sender socket - " + socket.isConnected());
|
||||||
|
|
||||||
OutputStream socketOutputStream = socket.getOutputStream();
|
OutputStream socketOutputStream = socket.getOutputStream();
|
||||||
|
|
||||||
DeviceListFragment.copyToOutputStream(fileInputStream, socketOutputStream);
|
copyToOutputStream(fileInputStream, socketOutputStream);
|
||||||
if (BuildConfig.DEBUG) Log.d(TAG, "Sender: Data written");
|
if (BuildConfig.DEBUG) Log.d(TAG, "Sender: Data written");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -90,21 +91,20 @@ class SenderDeviceAsyncTask extends AsyncTask<Uri, Void, Boolean> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostExecute(Boolean fileSendSuccessful) {
|
protected void onPostExecute(Boolean fileSendSuccessful) {
|
||||||
deviceListFragment.incrementTotalFilesSent();
|
localFileTransferActivity.incrementTotalFilesSent();
|
||||||
|
|
||||||
if (fileSendSuccessful) { // Whether this task was successful in sending the file
|
if (fileSendSuccessful) { // Whether this task was successful in sending the file
|
||||||
transferProgressFragment.changeStatus(fileItemIndex, SENT);
|
transferProgressFragment.changeStatus(fileItemIndex, SENT);
|
||||||
} else {
|
} else {
|
||||||
Activity activity = deviceListFragment.getActivity();
|
showToast(localFileTransferActivity, localFileTransferActivity.getString(R.string.error_sending,
|
||||||
showToast(activity, activity.getString(R.string.error_sending,
|
getFileName(localFileTransferActivity.getFileUriList().get(fileItemIndex))), Toast.LENGTH_SHORT);
|
||||||
getFileName(deviceListFragment.getFileUriList().get(fileItemIndex))), Toast.LENGTH_SHORT);
|
|
||||||
transferProgressFragment.changeStatus(fileItemIndex, ERROR);
|
transferProgressFragment.changeStatus(fileItemIndex, ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (deviceListFragment.allFilesSent()) {
|
if (localFileTransferActivity.allFilesSent()) {
|
||||||
showToast(deviceListFragment.getActivity(), R.string.file_transfer_complete,
|
showToast(localFileTransferActivity, R.string.file_transfer_complete,
|
||||||
Toast.LENGTH_SHORT);
|
Toast.LENGTH_SHORT);
|
||||||
deviceListFragment.getActivity().finish();
|
localFileTransferActivity.finish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,9 +54,7 @@ public class WifiDirectBroadcastReceiver extends BroadcastReceiver {
|
|||||||
if (manager != null) {
|
if (manager != null) {
|
||||||
/* List of available peers has changed, so request & use the new list through
|
/* List of available peers has changed, so request & use the new list through
|
||||||
* PeerListListener.requestPeers() callback */
|
* PeerListListener.requestPeers() callback */
|
||||||
manager.requestPeers(channel,
|
manager.requestPeers(channel, wifiActivity);
|
||||||
(WifiP2pManager.PeerListListener) wifiActivity.getSupportFragmentManager()
|
|
||||||
.findFragmentById(R.id.fragment_device_list));
|
|
||||||
}
|
}
|
||||||
Log.d(LocalFileTransferActivity.TAG, "P2P peers changed");
|
Log.d(LocalFileTransferActivity.TAG, "P2P peers changed");
|
||||||
} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
|
} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
|
||||||
@ -68,19 +66,14 @@ public class WifiDirectBroadcastReceiver extends BroadcastReceiver {
|
|||||||
|
|
||||||
if (networkInfo.isConnected()) {
|
if (networkInfo.isConnected()) {
|
||||||
// Request connection info about the wifi p2p group formed upon connection
|
// Request connection info about the wifi p2p group formed upon connection
|
||||||
manager.requestConnectionInfo(channel,
|
manager.requestConnectionInfo(channel, wifiActivity);
|
||||||
(DeviceListFragment) wifiActivity.getSupportFragmentManager()
|
|
||||||
.findFragmentById(R.id.fragment_device_list));
|
|
||||||
} else {
|
} else {
|
||||||
// Not connected after connection change -> Disconnected
|
// Not connected after connection change -> Disconnected
|
||||||
wifiActivity.resetData();
|
wifiActivity.resetData();
|
||||||
}
|
}
|
||||||
} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
|
} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
|
||||||
// Update UI with wifi-direct details about the user device
|
// Update UI with wifi-direct details about the user device
|
||||||
DeviceListFragment deviceListFragment =
|
wifiActivity.updateUserDevice(
|
||||||
(DeviceListFragment) wifiActivity.getSupportFragmentManager()
|
|
||||||
.findFragmentById(R.id.fragment_device_list);
|
|
||||||
deviceListFragment.updateUserDevice(
|
|
||||||
intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE));
|
intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,11 +16,15 @@ import org.kiwix.kiwixmobile.R;
|
|||||||
import static android.os.Looper.getMainLooper;
|
import static android.os.Looper.getMainLooper;
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.showToast;
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.showToast;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manager for the Wifi-P2p API, used in the local file transfer module
|
||||||
|
* */
|
||||||
public class WifiDirectManager implements WifiP2pManager.ChannelListener, DeviceListFragment.DeviceActionListener {
|
public class WifiDirectManager implements WifiP2pManager.ChannelListener, DeviceListFragment.DeviceActionListener {
|
||||||
|
|
||||||
private static final String TAG = "WifiDirectManager";
|
private static final String TAG = "WifiDirectManager";
|
||||||
|
|
||||||
LocalFileTransferActivity activity;
|
private LocalFileTransferActivity activity;
|
||||||
|
|
||||||
/* Variables related to the WiFi P2P API */
|
/* Variables related to the WiFi P2P API */
|
||||||
private boolean wifiP2pEnabled = false; // Whether WiFi has been enabled or not
|
private boolean wifiP2pEnabled = false; // Whether WiFi has been enabled or not
|
||||||
@ -125,12 +129,7 @@ public class WifiDirectManager implements WifiP2pManager.ChannelListener, Device
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void closeLocalFileTransferActivity() {
|
public void closeLocalFileTransferActivity() {
|
||||||
final DeviceListFragment deviceListFragment =
|
activity.cancelAsyncTasks();
|
||||||
(DeviceListFragment) activity.getSupportFragmentManager().findFragmentById(
|
|
||||||
R.id.fragment_device_list);
|
|
||||||
if (deviceListFragment != null) {
|
|
||||||
deviceListFragment.cancelAsyncTasks();
|
|
||||||
}
|
|
||||||
|
|
||||||
activity.fileSendingDevice = false;
|
activity.fileSendingDevice = false;
|
||||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
|
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
|
||||||
|
@ -17,8 +17,8 @@ import org.kiwix.kiwixmobile.R;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.DeviceListFragment.getDeviceStatus;
|
|
||||||
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.DeviceListFragment.TAG;
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.DeviceListFragment.TAG;
|
||||||
|
import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.getDeviceStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper class, part of the local file sharing module.
|
* Helper class, part of the local file sharing module.
|
||||||
|
@ -14,20 +14,117 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
app:layout_constraintRight_toRightOf="parent">
|
||||||
app:layout_constraintBottom_toTopOf="@id/fragment_device_list">
|
|
||||||
|
|
||||||
<androidx.appcompat.widget.Toolbar
|
<androidx.appcompat.widget.Toolbar
|
||||||
android:id="@+id/toolbar_local_file_transfer"
|
android:id="@+id/toolbar_local_file_transfer"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:titleTextColor="#FFFFFF"
|
app:titleTextColor="#FFFFFF"
|
||||||
app:title="Local ZIM Sharing">
|
app:title="@string/local_zim_sharing">
|
||||||
</androidx.appcompat.widget.Toolbar>
|
</androidx.appcompat.widget.Toolbar>
|
||||||
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
<fragment
|
<TextView
|
||||||
|
android:id="@+id/text_view_your_device"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="15dp"
|
||||||
|
android:layout_marginStart="15dp"
|
||||||
|
android:paddingLeft="5dp"
|
||||||
|
android:paddingTop="5dp"
|
||||||
|
android:paddingRight="5dp"
|
||||||
|
android:paddingBottom="1dp"
|
||||||
|
android:text="@string/your_device"
|
||||||
|
android:textSize="13sp"
|
||||||
|
android:textStyle="italic"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/app_bar_local_file_transfer" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_view_device_name"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="Device Name"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/text_view_your_device"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:textSize="17sp"
|
||||||
|
android:layout_marginLeft="15dp"
|
||||||
|
android:layout_marginStart="15dp"
|
||||||
|
android:paddingLeft="5dp"
|
||||||
|
android:paddingRight="5dp"
|
||||||
|
android:paddingBottom="5dp"/>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/view_device_list_boundary"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="2dp"
|
||||||
|
android:background="#0000f0"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/text_view_device_name"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
android:layout_marginLeft="5dp"
|
||||||
|
android:layout_marginRight="5dp"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_view_available_device"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/nearby_devices"
|
||||||
|
android:gravity="center"
|
||||||
|
android:textSize="16sp"
|
||||||
|
app:fontFamily="monospace"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/view_device_list_boundary"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
android:paddingTop="5dp"/>
|
||||||
|
|
||||||
|
<!--<androidx.constraintlayout.widget.Group
|
||||||
|
android:id="@+id/group_peer_devices"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:constraint_referenced_ids="list_peer_devices,text_view_empty_peer_list"/>-->
|
||||||
|
|
||||||
|
<ListView
|
||||||
|
android:id="@+id/list_peer_devices"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/text_view_available_device"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintVertical_bias="0.0"
|
||||||
|
android:visibility="invisible"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_view_empty_peer_list"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/no_devices_found"
|
||||||
|
android:gravity="center"
|
||||||
|
android:layout_margin="50dp"
|
||||||
|
android:textColor="@android:color/black"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/text_view_available_device"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"/>
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progress_bar_searching_peers"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:indeterminate="true"
|
||||||
|
android:layout_margin="50dp"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/text_view_available_device"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
|
||||||
|
<!--<fragment
|
||||||
class="org.kiwix.kiwixmobile.zim_manager.local_file_transfer.DeviceListFragment"
|
class="org.kiwix.kiwixmobile.zim_manager.local_file_transfer.DeviceListFragment"
|
||||||
android:id="@+id/fragment_device_list"
|
android:id="@+id/fragment_device_list"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@ -35,13 +132,14 @@
|
|||||||
app:layout_constraintTop_toBottomOf="@id/app_bar_local_file_transfer"
|
app:layout_constraintTop_toBottomOf="@id/app_bar_local_file_transfer"
|
||||||
app:layout_constraintBottom_toTopOf="@id/container_fragment_transfer_progress"
|
app:layout_constraintBottom_toTopOf="@id/container_fragment_transfer_progress"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
app:layout_constraintRight_toRightOf="parent"/>
|
app:layout_constraintRight_toRightOf="parent"/>-->
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/container_fragment_transfer_progress"
|
android:id="@+id/container_fragment_transfer_progress"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
app:layout_constraintTop_toBottomOf="@id/fragment_device_list"
|
android:layout_marginTop="200dp"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/text_view_available_device"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
app:layout_constraintRight_toRightOf="parent"/>
|
app:layout_constraintRight_toRightOf="parent"/>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
android:background="@android:color/transparent"
|
android:background="@android:color/transparent"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
<TextView
|
<!--<TextView
|
||||||
android:id="@+id/text_view_your_device"
|
android:id="@+id/text_view_your_device"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -97,6 +97,6 @@
|
|||||||
app:layout_constraintTop_toBottomOf="@id/text_view_available_device"
|
app:layout_constraintTop_toBottomOf="@id/text_view_available_device"
|
||||||
app:layout_constraintLeft_toLeftOf="parent"
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
app:layout_constraintRight_toRightOf="parent"
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
android:visibility="gone"/>
|
android:visibility="gone"/>-->
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
@ -286,4 +286,5 @@
|
|||||||
<string name="files_for_transfer">FILES FOR TRANSFER</string>
|
<string name="files_for_transfer">FILES FOR TRANSFER</string>
|
||||||
<string name="preparing_files">Preparing files for transfer....</string>
|
<string name="preparing_files">Preparing files for transfer....</string>
|
||||||
<string name="performing_handshake">Performing handshake....</string>
|
<string name="performing_handshake">Performing handshake....</string>
|
||||||
|
<string name="local_zim_sharing">Local ZIM Sharing</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user