From be5c377917a341d3a363787a7db67068495ea339 Mon Sep 17 00:00:00 2001 From: Aditya-Sood Date: Tue, 25 Jun 2019 23:29:02 +0530 Subject: [PATCH] Increment: After handshake, both devices display list of files being transferred Next step - Use this list to display progress of transfer --- app/build.gradle | 1 + .../DeviceListFragment.java | 38 +++-- .../local_file_transfer/FileListAdapter.java | 53 +++++++ .../LocalFileTransferActivity.java | 1 + .../TransferProgressFragment.java | 133 ++++++++++++++++++ .../layout/activity_local_file_transfer.xml | 15 +- .../res/layout/fragment_transfer_progress.xml | 32 +++++ .../main/res/layout/item_transfer_list.xml | 21 +++ app/src/main/res/values/strings.xml | 3 + 9 files changed, 283 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/FileListAdapter.java create mode 100644 app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/TransferProgressFragment.java create mode 100644 app/src/main/res/layout/fragment_transfer_progress.xml create mode 100644 app/src/main/res/layout/item_transfer_list.xml diff --git a/app/build.gradle b/app/build.gradle index 7cbc59f29..62728442d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -62,6 +62,7 @@ dependencies { implementation "androidx.test.espresso:espresso-idling-resource:$espressoVersion" implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' androidTestImplementation("androidx.test.espresso:espresso-core:$espressoVersion") androidTestImplementation "androidx.test.espresso:espresso-web:$espressoVersion" androidTestImplementation "androidx.test.espresso:espresso-intents:$espressoVersion" diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/DeviceListFragment.java b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/DeviceListFragment.java index 1c030c1f3..804fda10a 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/DeviceListFragment.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/DeviceListFragment.java @@ -32,6 +32,7 @@ import androidx.appcompat.app.AlertDialog; import androidx.core.content.FileProvider; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.ListFragment; @@ -57,6 +58,7 @@ import java.net.URI; import java.util.ArrayList; import java.util.List; +import static android.view.View.GONE; import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.DeviceListFragment.TAG; import static org.kiwix.kiwixmobile.zim_manager.local_file_transfer.LocalFileTransferActivity.filePath; @@ -81,7 +83,7 @@ public class DeviceListFragment extends ListFragment implements WifiP2pManager.P private ArrayList fileUriList; private int totalFiles = -1; private int totalFilesSent = 0; - private ArrayList fileNames; + private ArrayList fileNames = new ArrayList<>(); @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { @@ -118,6 +120,9 @@ public class DeviceListFragment extends ListFragment implements WifiP2pManager.P fileSender = true; fileUriList = ((LocalFileTransferActivity) getActivity()).getFileURIArrayList(); totalFiles = fileUriList.size(); + + for(int i = 0; i < fileUriList.size(); i++) + fileNames.add(getFileName(fileUriList.get(i))); } } @@ -254,7 +259,18 @@ public class DeviceListFragment extends ListFragment implements WifiP2pManager.P return (sharedPreferenceUtil.getPrefStorage() + "/Kiwix/"); } + private void displayTransferProgressFragment() { + TransferProgressFragment fragment = new TransferProgressFragment(fileNames); + FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + fragmentTransaction.add(R.id.container_fragment_transfer_progress, fragment) + .commit(); + } + private void startFileTransfer() { + + displayTransferProgressFragment(); + if(groupInfo.groupFormed && !fileSender) { new FileServerAsyncTask(getActivity(), this).execute(); Toast.makeText(getActivity(), "File receiving device", Toast.LENGTH_SHORT).show(); @@ -499,20 +515,20 @@ public class DeviceListFragment extends ListFragment implements WifiP2pManager.P protected void onPostExecute(InetAddress inetAddress) { (deviceListFragment).setClientAddress(inetAddress); } + } - private String getFileName(Uri fileUri) { - String fileName = ""; - String fileUriString = fileUri.toString(); + public static String getFileName(Uri fileUri) { + String fileName = ""; + String fileUriString = fileUri.toString(); - // Searches for location of last slash in the file path - for(int loc = fileUriString.length()-1; loc >= 0; loc--) { - if(fileUriString.charAt(loc) == '/') { - return fileUriString.substring(loc+1); - } + // Searches for location of last slash in the file path + for(int loc = fileUriString.length()-1; loc >= 0; loc--) { + if(fileUriString.charAt(loc) == '/') { + return fileUriString.substring(loc+1); } - - return null; } + + return null; } public InetAddress getFileReceiverAddress() { diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/FileListAdapter.java b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/FileListAdapter.java new file mode 100644 index 000000000..a9bed5aef --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/FileListAdapter.java @@ -0,0 +1,53 @@ +package org.kiwix.kiwixmobile.zim_manager.local_file_transfer; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import org.kiwix.kiwixmobile.R; + +import java.util.ArrayList; + +public class FileListAdapter extends RecyclerView.Adapter { + private final ArrayList fileNames; + private LayoutInflater layoutInflater; + + public FileListAdapter(Context context, ArrayList fileNames) { + this.layoutInflater = LayoutInflater.from(context); + this.fileNames = fileNames; + } + + @NonNull + @Override + public FileListAdapter.FileViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View itemView = layoutInflater.inflate(R.layout.item_transfer_list, parent, false); + return new FileViewHolder(itemView, this); + } + + @Override + public void onBindViewHolder(@NonNull FileListAdapter.FileViewHolder holder, int position) { + String name = fileNames.get(position); + holder.fileItemView.setText(name); + } + + @Override + public int getItemCount() { + return fileNames.size(); + } + + class FileViewHolder extends RecyclerView.ViewHolder { + public final TextView fileItemView; + final FileListAdapter fileListAdapter; + + public FileViewHolder(View itemView, FileListAdapter fileListAdapter) { + super(itemView); + this.fileItemView = itemView.findViewById(R.id.text_view_file_item_name); + this.fileListAdapter = fileListAdapter; + } + } +} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/LocalFileTransferActivity.java b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/LocalFileTransferActivity.java index 3d2885474..09f9671d9 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/LocalFileTransferActivity.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/LocalFileTransferActivity.java @@ -518,6 +518,7 @@ public class LocalFileTransferActivity extends AppCompatActivity implements Wifi } } + // TODO: Remove this feature since reflection of hidden methods/fields is restricted from Pie (& will subsequently lead to exceptions) @Override public void changeDeviceName(String deviceNewName) { try { diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/TransferProgressFragment.java b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/TransferProgressFragment.java new file mode 100644 index 000000000..a9f2d6f3b --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/local_file_transfer/TransferProgressFragment.java @@ -0,0 +1,133 @@ +package org.kiwix.kiwixmobile.zim_manager.local_file_transfer; + +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; + +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import org.kiwix.kiwixmobile.R; + +import java.util.ArrayList; + +//{@link TransferProgressFragment.OnFragmentInteractionListener} interface +/** + * A simple {@link Fragment} subclass. + * Activities that contain this fragment must implement the + * + * to handle interaction events. + * Use the {@link TransferProgressFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class TransferProgressFragment extends Fragment { + + + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + + private ArrayList fileNames; + private RecyclerView filesRecyclerView; + private FileListAdapter fileListAdapter; + + //private OnFragmentInteractionListener mListener; + + public TransferProgressFragment() { + // Required empty public constructor + } + + public TransferProgressFragment(ArrayList fileNames) { + this.fileNames = fileNames; + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment TransferProgressFragment. + */ + // TODO: Rename and change types and number of parameters + public static TransferProgressFragment newInstance(String param1, String param2) { + TransferProgressFragment fragment = new TransferProgressFragment(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View view = inflater.inflate(R.layout.fragment_transfer_progress, container, false); + // TODO: RECYCLERVIEW + filesRecyclerView = view.findViewById(R.id.recycler_view_transfer_files); + fileListAdapter = new FileListAdapter(getActivity(), fileNames); + filesRecyclerView.setAdapter(fileListAdapter); + filesRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + + return view; + } + + // TODO: Rename method, update argument and hook method into UI event + public void onButtonPressed(Uri uri) { + /*if (mListener != null) { + mListener.onFragmentInteraction(uri); + }*/ + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + /*if (context instanceof OnFragmentInteractionListener) { + mListener = (OnFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnFragmentInteractionListener"); + }*/ + } + + @Override + public void onDetach() { + super.onDetach(); + //mListener = null; + } + + /** + * This interface must be implemented by activities that contain this + * fragment to allow an interaction in this fragment to be communicated + * to the activity and potentially other fragments contained in that + * activity. + *

+ * See the Android Training lesson Communicating with Other Fragments for more information. + */ + /*public interface OnFragmentInteractionListener { + // TODO: Update argument type and name + void onFragmentInteraction(Uri uri); + }*/ +} diff --git a/app/src/main/res/layout/activity_local_file_transfer.xml b/app/src/main/res/layout/activity_local_file_transfer.xml index 09f8d3b83..0ad295e33 100644 --- a/app/src/main/res/layout/activity_local_file_transfer.xml +++ b/app/src/main/res/layout/activity_local_file_transfer.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" - tools:context=".zim_manager.local_file_transfer.LocalFileTransferActivity">> + tools:context=".zim_manager.local_file_transfer.LocalFileTransferActivity"> + + diff --git a/app/src/main/res/layout/fragment_transfer_progress.xml b/app/src/main/res/layout/fragment_transfer_progress.xml new file mode 100644 index 000000000..dcf9f0263 --- /dev/null +++ b/app/src/main/res/layout/fragment_transfer_progress.xml @@ -0,0 +1,32 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/item_transfer_list.xml b/app/src/main/res/layout/item_transfer_list.xml new file mode 100644 index 000000000..0cbf83c42 --- /dev/null +++ b/app/src/main/res/layout/item_transfer_list.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9e3995720..0b7edc56a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -245,4 +245,7 @@ Switch tabs :D Close all tabs + + + Hello blank fragment