diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index b4b9ea2..1514238 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -67,7 +67,7 @@ diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 6c075a5..8f779fc 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/build.gradle b/app/build.gradle index 44eb524..37a43fb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "ca.pkay.rcloneexplorer" minSdkVersion 21 targetSdkVersion 27 - versionCode 3 - versionName "0.3.0-alpha" + versionCode 4 + versionName "1.0.0-beta" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -36,6 +36,7 @@ dependencies { implementation "com.mikepenz:iconics-core:3.0.3@aar" implementation 'com.mikepenz:community-material-typeface:2.0.46.1@aar' implementation 'com.mikepenz:fontawesome-typeface:5.0.6.0@aar' + implementation 'com.mikepenz:octicons-typeface:3.2.0.4@aar' implementation "com.mikepenz:aboutlibraries:6.0.8" implementation 'us.feras.mdv:markdownview:1.1.0' testImplementation 'junit:junit:4.12' diff --git a/app/src/main/assets/changelog.md b/app/src/main/assets/changelog.md index dfdc2b8..506cd7d 100644 --- a/app/src/main/assets/changelog.md +++ b/app/src/main/assets/changelog.md @@ -1,4 +1,13 @@ -### Version 0.3.0-alpha +### 1.0.0-beta +*** +First beta release! + +* Code refactoring + +*** + + +### 0.3.0-alpha *** * **New:** Changelog added under About screen diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/AboutActivity.java b/app/src/main/java/ca/pkay/rcloneexplorer/AboutActivity.java index 2a8d61b..592fb6d 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/AboutActivity.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/AboutActivity.java @@ -80,7 +80,7 @@ private void showChangelog() { private void showOpenSourceLibraries() { new LibsBuilder() .withActivityStyle(Libs.ActivityStyle.LIGHT_DARK_TOOLBAR) - .withActivityTitle("Credits/Libraries") + .withActivityTitle(getString(R.string.credits_libraries)) .withAutoDetect(false) .withLibraries() .withExcludedLibraries() @@ -88,17 +88,17 @@ private void showOpenSourceLibraries() { } private void openAppGitHubLink() { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/kaczmarkiewiczp/rcloneExplorer")); + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.github_app_url))); startActivity(browserIntent); } private void reportBug() { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/kaczmarkiewiczp/rcloneExplorer/issues/new")); + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.github_issue_url))); startActivity(browserIntent); } private void openAuthorGitHubLink() { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/kaczmarkiewiczp")); + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.github_author_url))); startActivity(browserIntent); } } diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/BroadcastReceivers/ServeCancelAction.java b/app/src/main/java/ca/pkay/rcloneexplorer/BroadcastReceivers/ServeCancelAction.java index 5fd758e..6c973c8 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/BroadcastReceivers/ServeCancelAction.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/BroadcastReceivers/ServeCancelAction.java @@ -5,7 +5,6 @@ import android.content.Intent; import ca.pkay.rcloneexplorer.Services.StreamingService; -import ca.pkay.rcloneexplorer.Services.UploadService; public class ServeCancelAction extends BroadcastReceiver { diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/BroadcastReceivers/UploadCancelAction.java b/app/src/main/java/ca/pkay/rcloneexplorer/BroadcastReceivers/UploadCancelAction.java index d0db8d4..a04b3fd 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/BroadcastReceivers/UploadCancelAction.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/BroadcastReceivers/UploadCancelAction.java @@ -4,7 +4,6 @@ import android.content.Context; import android.content.Intent; -import ca.pkay.rcloneexplorer.Services.DownloadService; import ca.pkay.rcloneexplorer.Services.UploadService; public class UploadCancelAction extends BroadcastReceiver { diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/FileComparators.java b/app/src/main/java/ca/pkay/rcloneexplorer/FileComparators.java index 8d19362..5b353d2 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/FileComparators.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/FileComparators.java @@ -48,13 +48,7 @@ public int compare(FileItem fileItem, FileItem t1) { return fileItem.getName().compareTo(t1.getName()); } - if (fileItem.getSize() == t1.getSize()) { - return 0; - } else if (fileItem.getSize() > t1.getSize()) { - return -1; - } else { - return 1; - } + return Long.compare(t1.getSize(), fileItem.getSize()); } } @@ -72,13 +66,7 @@ public int compare(FileItem fileItem, FileItem t1) { return fileItem.getName().compareTo(t1.getName()); } - if (fileItem.getSize() == t1.getSize()) { - return 0; - } else if (fileItem.getSize() > t1.getSize()) { - return 1; - } else { - return -1; - } + return Long.compare(fileItem.getSize(), t1.getSize()); } } @@ -92,13 +80,7 @@ public int compare(FileItem fileItem, FileItem t1) { return 1; } - if (fileItem.getModTime() == t1.getModTime()) { - return 0; - } else if (fileItem.getModTime() > t1.getModTime()) { - return -1; - } else { - return 1; - } + return Long.compare(t1.getModTime(), fileItem.getModTime()); } } @@ -112,13 +94,7 @@ public int compare(FileItem fileItem, FileItem t1) { return 1; } - if (fileItem.getModTime() == t1.getModTime()) { - return 0; - } else if (fileItem.getModTime() > t1.getModTime()) { - return 1; - } else { - return -1; - } + return Long.compare(fileItem.getModTime(), t1.getModTime()); } } } diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/Fragments/FileExplorerFragment.java b/app/src/main/java/ca/pkay/rcloneexplorer/Fragments/FileExplorerFragment.java index 7061ef3..6223c36 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/Fragments/FileExplorerFragment.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/Fragments/FileExplorerFragment.java @@ -157,7 +157,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c swipeRefreshLayout = view.findViewById(R.id.file_explorer_srl); swipeRefreshLayout.setOnRefreshListener(this); - if (null != directoryContent && null != fetchDirectoryTask) { + if (directoryContent != null && fetchDirectoryTask != null) { swipeRefreshLayout.setRefreshing(false); } else { swipeRefreshLayout.setRefreshing(true); @@ -180,10 +180,10 @@ public void onClick(View v) { } }); fab.addFabOptionItem(new SpeedDialActionItem.Builder(R.id.fab_upload, R.drawable.ic_file_upload) - .setLabel("Upload Files") + .setLabel(getString(R.string.fab_upload_files)) .create()); fab.addFabOptionItem(new SpeedDialActionItem.Builder(R.id.fab_add_folder, R.drawable.ic_create_new_folder) - .setLabel("New Folder") + .setLabel(getString(R.string.fab_new_folder)) .create()); setFabClickListeners(); @@ -266,7 +266,7 @@ public boolean onOptionsItemSelected(MenuItem item) { */ @Override public void onRefresh() { - if (null != fetchDirectoryTask) { + if (fetchDirectoryTask != null) { fetchDirectoryTask.cancel(true); } fetchDirectoryTask = new FetchDirectoryContent().execute(); @@ -293,63 +293,42 @@ private void setBottomBarClickListeners(final View view) { view.findViewById(R.id.file_download).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - onDownloadClicked(); + downloadClicked(); } }); view.findViewById(R.id.file_move).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - onMoveClicked(); + moveClicked(); } }); view.findViewById(R.id.file_rename).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - onRenameClicked(); + renameClicked(); } }); view.findViewById(R.id.file_delete).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - onDeleteClicked(); + deleteClicked(); } }); view.findViewById(R.id.cancel_move).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - ((FragmentActivity) context).setTitle(remoteType); - recyclerViewAdapter.setMoveMode(false); - isInMoveMode = false; - hideMoveBar(); - fab.show(); - fab.setVisibility(View.VISIBLE); - ((FragmentActivity) context).findViewById(R.id.action_select_all).setVisibility(View.VISIBLE); - recyclerViewAdapter.refreshData(); + cancelMoveClicked(); } }); view.findViewById(R.id.select_move).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - ((FragmentActivity) context).setTitle(remoteType); - hideMoveBar(); - fab.show(); - fab.setVisibility(View.VISIBLE); - ((FragmentActivity) context).findViewById(R.id.action_select_all).setVisibility(View.VISIBLE); - recyclerViewAdapter.setMoveMode(false); - isInMoveMode = false; - String oldPath = moveList.get(0).getPath(); - int index = oldPath.lastIndexOf(moveList.get(0).getName()); - if (index > 0) { - directoryCache.remove(moveList.get(0).getPath().substring(0, index - 1)); - } else { - directoryCache.remove("//" + remote); - } - new MoveTask().execute(); + moveLocationSelected(); } }); @@ -361,6 +340,35 @@ public void onClick(View v) { }); } + private void cancelMoveClicked() { + ((FragmentActivity) context).setTitle(remoteType); + recyclerViewAdapter.setMoveMode(false); + isInMoveMode = false; + hideMoveBar(); + fab.show(); + fab.setVisibility(View.VISIBLE); + ((FragmentActivity) context).findViewById(R.id.action_select_all).setVisibility(View.VISIBLE); + recyclerViewAdapter.refreshData(); + } + + private void moveLocationSelected() { + ((FragmentActivity) context).setTitle(remoteType); + hideMoveBar(); + fab.show(); + fab.setVisibility(View.VISIBLE); + ((FragmentActivity) context).findViewById(R.id.action_select_all).setVisibility(View.VISIBLE); + recyclerViewAdapter.setMoveMode(false); + isInMoveMode = false; + String oldPath = moveList.get(0).getPath(); + int index = oldPath.lastIndexOf(moveList.get(0).getName()); + if (index > 0) { + directoryCache.remove(moveList.get(0).getPath().substring(0, index - 1)); + } else { + directoryCache.remove("//" + remote); + } + new MoveTask().execute(); + } + private void showSortMenu() { DroppyMenuPopup droppyMenu; DroppyMenuPopup.Builder droppyBuilder = new DroppyMenuPopup.Builder(getContext(), ((FragmentActivity) context).findViewById(R.id.action_sort)); @@ -495,8 +503,8 @@ public void onFileClicked(FileItem fileItem) { new DownloadAndOpen().execute(fileItem); } else { new MaterialDialog.Builder(context) - .title("Max file size for streaming exceeded") - .neutralText("Okay") + .title(R.string.max_streaming_size_exceeded) + .neutralText(R.string.okay_confirmation) .show(); } } @@ -508,7 +516,7 @@ public void onDirectoryClicked(FileItem fileItem) { pathStack.push(path); directoryCache.put(path, new ArrayList<>(directoryContent)); - if (null != fetchDirectoryTask) { + if (fetchDirectoryTask != null) { fetchDirectoryTask.cancel(true); } if (directoryCache.containsKey(fileItem.getPath())) { @@ -530,7 +538,7 @@ public void onFilesSelected(boolean longClick) { int numOfSelected = recyclerViewAdapter.getNumberOfSelectedItems(); if (numOfSelected > 0) { // something is selected - ((FragmentActivity) context).setTitle(numOfSelected + " selected"); + ((FragmentActivity) context).setTitle(numOfSelected + " " + getString(R.string.selected)); showBottomBar(); fab.hide(); fab.setVisibility(View.INVISIBLE); @@ -601,7 +609,7 @@ private void hideMoveBar() { moveBar.setVisibility(View.GONE); } - private void onDeleteClicked() { + private void deleteClicked() { if (!recyclerViewAdapter.isInSelectMode()) { return; } @@ -613,9 +621,9 @@ private void onDeleteClicked() { new MaterialDialog.Builder(context) .title(title) .content(content) - .icon(context.getDrawable(R.drawable.ic_warning)) - .negativeText("Cancel") - .positiveText("Delete") + .icon(getResources().getDrawable(R.drawable.ic_warning)) + .negativeText(getResources().getString(R.string.cancel)) + .positiveText(getResources().getString(R.string.delete)) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { @@ -626,7 +634,7 @@ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) .show(); } - private void onRenameClicked() { + private void renameClicked() { if (!recyclerViewAdapter.isInSelectMode() || recyclerViewAdapter.getNumberOfSelectedItems() > 1) { return; } @@ -635,8 +643,8 @@ private void onRenameClicked() { final FileItem renameItem = list.get(0); new MaterialDialog.Builder(context) - .title("Rename a file") - .content("Please type new file name") + .title(R.string.rename_file) + .content(R.string.type_new_file_name) .input(null, renameItem.getName(), new MaterialDialog.InputCallback() { @Override public void onInput(@NonNull MaterialDialog dialog, CharSequence input) { @@ -653,11 +661,11 @@ public void onInput(@NonNull MaterialDialog dialog, CharSequence input) { new RenameFileTask().execute(renameItem.getPath(), newFilePath); } }) - .negativeText("Cancel") + .negativeText(getResources().getString(R.string.cancel)) .show(); } - private void onDownloadClicked() { + private void downloadClicked() { if (!recyclerViewAdapter.isInSelectMode()) { return; } @@ -668,7 +676,7 @@ private void onDownloadClicked() { exFilePicker.start(this, EX_FILE_PICKER_DOWNLOAD_RESULT); } - private void onMoveClicked() { + private void moveClicked() { if (recyclerViewAdapter.getNumberOfSelectedItems() < 1) { return; } @@ -676,7 +684,7 @@ private void onMoveClicked() { recyclerViewAdapter.cancelSelection(); recyclerViewAdapter.setMoveMode(true); isInMoveMode = true; - ((FragmentActivity) context).setTitle("Select destination"); + ((FragmentActivity) context).setTitle(getString(R.string.select_destination)); ((FragmentActivity) context).findViewById(R.id.move_bar).setVisibility(View.VISIBLE); ((FragmentActivity) context).findViewById(R.id.action_select_all).setVisibility(View.GONE); fab.hide(); @@ -685,9 +693,9 @@ private void onMoveClicked() { private void onCreateNewDirectory() { new MaterialDialog.Builder(context) - .title("Create new folder") - .content("Please type new folder name") - .negativeText("Cancel") + .title(R.string.create_new_folder) + .content(R.string.type_new_folder_name) + .negativeText(getResources().getString(R.string.cancel)) .input(null, null, new MaterialDialog.InputCallback() { @Override public void onInput(@NonNull MaterialDialog dialog, CharSequence input) { @@ -899,11 +907,11 @@ private void cancelProcess() { protected void onPreExecute() { super.onPreExecute(); materialDialog = new MaterialDialog.Builder(context) - .title("Loading file") - .content("Please wait") + .title(R.string.loading_file) + .content(R.string.please_wait) .cancelable(false) .progress(true, 0) - .negativeText("Cancel") + .negativeText(getResources().getString(R.string.cancel)) .onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/Fragments/RemotesFragment.java b/app/src/main/java/ca/pkay/rcloneexplorer/Fragments/RemotesFragment.java index fd339cd..2d2dca7 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/Fragments/RemotesFragment.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/Fragments/RemotesFragment.java @@ -2,8 +2,10 @@ import android.content.Context; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -24,6 +26,7 @@ public class RemotesFragment extends Fragment { private Rclone rclone; private List remotes; private OnRemoteClickListener clickListener; + private Context context; /** * Mandatory empty constructor for the fragment manager to instantiate the @@ -41,22 +44,23 @@ public static RemotesFragment newInstance() { public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - getActivity().setTitle("Remotes"); + ((FragmentActivity) context).setTitle(getString(R.string.remotes_toolbar_title)); rclone = new Rclone(getContext()); remotes = rclone.getRemotes(); } @Nullable @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view; if (!rclone.isConfigFileCreated()) { - view = inflater.inflate(R.layout.empty_state_config_file2, container, false); + view = inflater.inflate(R.layout.empty_state_config_file, container, false); view.findViewById(R.id.empty_state_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - ((MainActivity)getActivity()).importConfigFile(); + if (getActivity() != null) { + ((MainActivity) getActivity()).importConfigFile(); + } } }); return view; @@ -76,6 +80,7 @@ public void onClick(View view) { @Override public void onAttach(Context context) { super.onAttach(context); + this.context = context; if (context instanceof OnRemoteClickListener) { clickListener = (OnRemoteClickListener) context; } else { @@ -86,6 +91,7 @@ public void onAttach(Context context) { @Override public void onDetach() { super.onDetach(); + context = null; clickListener = null; } diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/Items/FileItem.java b/app/src/main/java/ca/pkay/rcloneexplorer/Items/FileItem.java index 71985cd..125e9b7 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/Items/FileItem.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/Items/FileItem.java @@ -2,10 +2,8 @@ import android.os.Parcel; import android.os.Parcelable; -import android.support.annotation.NonNull; import android.text.format.DateUtils; -import java.io.Serializable; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/MainActivity.java b/app/src/main/java/ca/pkay/rcloneexplorer/MainActivity.java index 0419ef9..17d9470 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/MainActivity.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/MainActivity.java @@ -10,23 +10,18 @@ import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.design.widget.FloatingActionButton; -import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; -import android.util.Log; -import android.view.View; import android.support.design.widget.NavigationView; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; -import android.view.Menu; import android.view.MenuItem; import java.io.File; @@ -35,7 +30,6 @@ import ca.pkay.rcloneexplorer.BroadcastReceivers.NetworkStateReceiver; import ca.pkay.rcloneexplorer.Fragments.FileExplorerFragment; import ca.pkay.rcloneexplorer.Fragments.RemotesFragment; -import ca.pkay.rcloneexplorer.Items.FileItem; import ca.pkay.rcloneexplorer.Items.RemoteItem; public class MainActivity extends AppCompatActivity @@ -69,6 +63,7 @@ protected void onCreate(Bundle savedInstanceState) { rclone = new Rclone(this); + networkStateReceiver = new NetworkStateReceiver(); final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); @@ -114,7 +109,7 @@ public void onBackPressed() { DrawerLayout drawer = findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); - } else if (null != fragment && fragment instanceof FileExplorerFragment) { + } else if (fragment != null && fragment instanceof FileExplorerFragment) { if (((FileExplorerFragment) fragment).onBackButtonPressed()) return; } @@ -167,16 +162,16 @@ private void startRemotesFragment() { private void warnUserAboutOverwritingConfiguration() { AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle("Replace current configuration file?"); - builder.setMessage("Your current configuration will be lost"); - builder.setPositiveButton("Continue", new DialogInterface.OnClickListener() { + builder.setTitle(R.string.replace_config_file_question); + builder.setMessage(R.string.config_file_lost_statement); + builder.setPositiveButton(R.string.continue_statement, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.cancel(); importConfigFile(); } }); - builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.cancel(); diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/RecyclerViewAdapters/FileExplorerRecyclerViewAdapter.java b/app/src/main/java/ca/pkay/rcloneexplorer/RecyclerViewAdapters/FileExplorerRecyclerViewAdapter.java index e99bad0..fdf3f46 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/RecyclerViewAdapters/FileExplorerRecyclerViewAdapter.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/RecyclerViewAdapters/FileExplorerRecyclerViewAdapter.java @@ -1,5 +1,6 @@ package ca.pkay.rcloneexplorer.RecyclerViewAdapters; +import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; @@ -37,32 +38,31 @@ public FileExplorerRecyclerViewAdapter(List files, View emptyView, OnC isInMoveMode = false; } + @NonNull @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_file_explorer_item, parent, false); return new ViewHolder(view); } @Override - public void onBindViewHolder(final ViewHolder holder, int position) { + public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { final FileItem item = files.get(position); holder.fileItem = item; if (item.isDir()) { holder.fileIcon.setImageResource(R.drawable.ic_folder); + holder.fileSize.setVisibility(View.GONE); + holder.interpunct.setVisibility(View.GONE); } else { holder.fileIcon.setImageResource(R.drawable.ic_file); - } - holder.fileName.setText(item.getName()); - holder.fileModTime.setText(item.getHumanReadableModTime()); - if (!item.isDir()) { holder.fileSize.setText(item.getHumanReadableSize()); holder.fileSize.setVisibility(View.VISIBLE); holder.interpunct.setVisibility(View.VISIBLE); - } else { - holder.fileSize.setVisibility(View.GONE); - holder.interpunct.setVisibility(View.GONE); } + holder.fileName.setText(item.getName()); + holder.fileModTime.setText(item.getHumanReadableModTime()); + if (isInSelectMode) { if (selectedItems.contains(item)) { holder.view.setBackgroundColor(holder.view.getResources().getColor(R.color.colorPrimaryLight)); @@ -230,7 +230,7 @@ public class ViewHolder extends RecyclerView.ViewHolder { public final TextView interpunct; public FileItem fileItem; - public ViewHolder(View itemView) { + ViewHolder(View itemView) { super(itemView); this.view = itemView; this.fileIcon = view.findViewById(R.id.file_icon); diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/RecyclerViewAdapters/RemotesRecyclerViewAdapter.java b/app/src/main/java/ca/pkay/rcloneexplorer/RecyclerViewAdapters/RemotesRecyclerViewAdapter.java index ab57884..a209c7c 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/RecyclerViewAdapters/RemotesRecyclerViewAdapter.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/RecyclerViewAdapters/RemotesRecyclerViewAdapter.java @@ -2,6 +2,7 @@ import android.graphics.Color; +import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; @@ -12,10 +13,9 @@ import com.mikepenz.community_material_typeface_library.CommunityMaterial; import com.mikepenz.fontawesome_typeface_library.FontAwesome; import com.mikepenz.iconics.IconicsDrawable; +import com.mikepenz.octicons_typeface_library.Octicons; -import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; import ca.pkay.rcloneexplorer.Fragments.RemotesFragment; @@ -34,14 +34,15 @@ public RemotesRecyclerViewAdapter(List remotes, RemotesFragment.OnRe this.clickListener = clickListener; } + @NonNull @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_remotes_item, parent, false); return new ViewHolder(view); } @Override - public void onBindViewHolder(final ViewHolder holder, final int position) { + public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) { String remoteName = remotes.get(position).getName(); String remoteType = remotes.get(position).getType(); holder.remoteName = remoteName; @@ -79,7 +80,7 @@ public void onBindViewHolder(final ViewHolder holder, final int position) { holder.ivIcon.setImageDrawable(new IconicsDrawable(view.getContext()).icon(CommunityMaterial.Icon.cmd_box).color(Color.BLACK).sizeDp(24)); break; case "sftp": - holder.ivIcon.setImageDrawable(new IconicsDrawable(view.getContext()).icon(FontAwesome.Icon.faw_terminal).color(Color.BLACK).sizeDp(24)); + holder.ivIcon.setImageDrawable(new IconicsDrawable(view.getContext()).icon(Octicons.Icon.oct_terminal).color(Color.BLACK).sizeDp(24)); break; default: holder.ivIcon.setImageDrawable(new IconicsDrawable(view.getContext()).icon(CommunityMaterial.Icon.cmd_cloud).color(Color.BLACK).sizeDp(24)); @@ -108,7 +109,7 @@ public class ViewHolder extends RecyclerView.ViewHolder { public final TextView tvName; public String remoteName; - public ViewHolder(View itemView) { + ViewHolder(View itemView) { super(itemView); this.view = itemView; this.ivIcon = view.findViewById(R.id.remoteIcon); diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/Services/DownloadService.java b/app/src/main/java/ca/pkay/rcloneexplorer/Services/DownloadService.java index d8f510b..a37f17f 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/Services/DownloadService.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/Services/DownloadService.java @@ -9,7 +9,6 @@ import android.os.Build; import android.support.annotation.Nullable; import android.support.v4.app.NotificationCompat; -import android.util.Log; import java.util.List; @@ -53,13 +52,17 @@ protected void onHandleIntent(@Nullable Intent intent) { NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(android.R.drawable.stat_sys_download) - .setContentTitle("Download") + .setContentTitle(getString(R.string.download_service_notification_title)) .setPriority(NotificationCompat.PRIORITY_LOW) .setContentIntent(pendingIntent) - .addAction(R.drawable.ic_cancel_download, "Cancel", cancelPendingIntent); + .addAction(R.drawable.ic_cancel_download, getString(R.string.cancel), cancelPendingIntent); startForeground(1, builder.build()); + if (intent == null) { + return; + } + final List downloadList = intent.getParcelableArrayListExtra(DOWNLOAD_LIST_ARG); final String downloadPath = intent.getStringExtra(DOWNLOAD_PATH_ARG); final String remote = intent.getStringExtra(REMOTE_ARG); @@ -78,11 +81,13 @@ protected void onHandleIntent(@Nullable Intent intent) { NotificationCompat.Builder builder1 = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(android.R.drawable.stat_sys_download_done) - .setContentTitle("Download complete") + .setContentTitle(getString(R.string.download_complete)) .setPriority(NotificationCompat.PRIORITY_DEFAULT); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.notify(2, builder1.build()); + if (notificationManager != null) { + notificationManager.notify(2, builder1.build()); + } } @Override @@ -98,7 +103,7 @@ private void setNotificationChannel() { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is new and not in the support library NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW); - channel.setDescription("File downloads"); + channel.setDescription(getString(R.string.download_service_notification_description)); // Register the channel with the system NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.createNotificationChannel(channel); diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/Services/StreamingService.java b/app/src/main/java/ca/pkay/rcloneexplorer/Services/StreamingService.java index 88ff068..0abfa75 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/Services/StreamingService.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/Services/StreamingService.java @@ -43,6 +43,9 @@ public void onCreate() { @Override protected void onHandleIntent(@Nullable Intent intent) { + if (intent == null) { + return; + } final String servePath = intent.getStringExtra(SERVE_PATH_ARG); final String remote = intent.getStringExtra(REMOTE_ARG); final Boolean showNotificationText = intent.getBooleanExtra(SHOW_NOTIFICATION_TEXT, false); @@ -55,10 +58,10 @@ protected void onHandleIntent(@Nullable Intent intent) { NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_http) - .setContentTitle("Streaming Service") + .setContentTitle(getString(R.string.streaming_service_notification_title)) .setPriority(NotificationCompat.PRIORITY_LOW) .setContentIntent(pendingIntent) - .addAction(R.drawable.ic_cancel_download, "Cancel", cancelPendingIntent); + .addAction(R.drawable.ic_cancel_download, getString(R.string.cancel), cancelPendingIntent); if (showNotificationText) { Uri uri = Uri.parse("http://127.0.0.1:8080"); @@ -66,7 +69,7 @@ protected void onHandleIntent(@Nullable Intent intent) { webPageIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent webPagePendingIntent = PendingIntent.getActivity(this, 0, webPageIntent, 0); builder.setContentIntent(webPagePendingIntent); - builder.setContentText("Serving on http://127.0.0.1:8080"); + builder.setContentText(getString(R.string.streaming_service_notification_content)); } startForeground(1, builder.build()); @@ -92,10 +95,12 @@ private void setNotificationChannel() { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is new and not in the support library NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW); - channel.setDescription("Streaming service"); + channel.setDescription(getString(R.string.streaming_service_notification_channel_description)); // Register the channel with the system NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.createNotificationChannel(channel); + if (notificationManager != null) { + notificationManager.createNotificationChannel(channel); + } } } } diff --git a/app/src/main/java/ca/pkay/rcloneexplorer/Services/UploadService.java b/app/src/main/java/ca/pkay/rcloneexplorer/Services/UploadService.java index a4ea329..99cd56c 100644 --- a/app/src/main/java/ca/pkay/rcloneexplorer/Services/UploadService.java +++ b/app/src/main/java/ca/pkay/rcloneexplorer/Services/UploadService.java @@ -53,13 +53,16 @@ protected void onHandleIntent(@Nullable Intent intent) { NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(android.R.drawable.stat_sys_upload) - .setContentTitle("Upload") + .setContentTitle(getString(R.string.upload_service_notification_title)) .setPriority(NotificationCompat.PRIORITY_LOW) .setContentIntent(pendingIntent) - .addAction(R.drawable.ic_cancel_download, "Cancel", cancelPendingIntent); + .addAction(R.drawable.ic_cancel_download, getString(R.string.cancel), cancelPendingIntent); startForeground(10, builder.build()); + if (intent == null) { + return; + } final String uploadPath = intent.getStringExtra(UPLOAD_PATH_ARG); final ArrayList uploadList = intent.getStringArrayListExtra(LOCAL_PATH_ARG); final String remote = intent.getStringExtra(REMOTE_ARG); @@ -79,11 +82,13 @@ protected void onHandleIntent(@Nullable Intent intent) { NotificationCompat.Builder builder1 = new NotificationCompat.Builder(this, CHANNEL_ID) .setSmallIcon(android.R.drawable.stat_sys_upload_done) - .setContentTitle("Upload complete") + .setContentTitle(getString(R.string.upload_complete)) .setPriority(NotificationCompat.PRIORITY_DEFAULT); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.notify(20, builder1.build()); + if (notificationManager != null) { + notificationManager.notify(20, builder1.build()); + } } @Override @@ -99,10 +104,12 @@ private void setNotificationChannel() { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is new and not in the support library NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW); - channel.setDescription("File uploads"); + channel.setDescription(getString(R.string.upload_service_notification_channel_description)); // Register the channel with the system NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.createNotificationChannel(channel); + if (notificationManager != null) { + notificationManager.createNotificationChannel(channel); + } } } } diff --git a/app/src/main/res/drawable-hdpi/empty_desert.png b/app/src/main/res/drawable-hdpi/empty_desert.png deleted file mode 100644 index b8de603..0000000 Binary files a/app/src/main/res/drawable-hdpi/empty_desert.png and /dev/null differ diff --git a/app/src/main/res/drawable-land-hdpi/empty_desert.png b/app/src/main/res/drawable-land-hdpi/empty_desert.png deleted file mode 100644 index ea6f365..0000000 Binary files a/app/src/main/res/drawable-land-hdpi/empty_desert.png and /dev/null differ diff --git a/app/src/main/res/drawable-land-mdpi/empty_desert.png b/app/src/main/res/drawable-land-mdpi/empty_desert.png deleted file mode 100644 index 206f295..0000000 Binary files a/app/src/main/res/drawable-land-mdpi/empty_desert.png and /dev/null differ diff --git a/app/src/main/res/drawable-land-xhdpi/empty_desert.png b/app/src/main/res/drawable-land-xhdpi/empty_desert.png deleted file mode 100644 index f5d460a..0000000 Binary files a/app/src/main/res/drawable-land-xhdpi/empty_desert.png and /dev/null differ diff --git a/app/src/main/res/drawable-land-xxhdpi/empty_desert.png b/app/src/main/res/drawable-land-xxhdpi/empty_desert.png deleted file mode 100644 index a03ccd0..0000000 Binary files a/app/src/main/res/drawable-land-xxhdpi/empty_desert.png and /dev/null differ diff --git a/app/src/main/res/drawable-land-xxxhdpi/empty_desert.png b/app/src/main/res/drawable-land-xxxhdpi/empty_desert.png deleted file mode 100644 index 586595c..0000000 Binary files a/app/src/main/res/drawable-land-xxxhdpi/empty_desert.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/empty_desert.png b/app/src/main/res/drawable-mdpi/empty_desert.png deleted file mode 100644 index d8eb66c..0000000 Binary files a/app/src/main/res/drawable-mdpi/empty_desert.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/empty_desert.png b/app/src/main/res/drawable-xhdpi/empty_desert.png deleted file mode 100644 index 7b8c519..0000000 Binary files a/app/src/main/res/drawable-xhdpi/empty_desert.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/empty_desert.png b/app/src/main/res/drawable-xxhdpi/empty_desert.png deleted file mode 100644 index 74d7f08..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/empty_desert.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/empty_desert.png b/app/src/main/res/drawable-xxxhdpi/empty_desert.png deleted file mode 100644 index 56d160d..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/empty_desert.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_add_white_24dp.xml b/app/src/main/res/drawable/ic_add_white_24dp.xml deleted file mode 100644 index b5b5ba4..0000000 --- a/app/src/main/res/drawable/ic_add_white_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_file_download_notification.xml b/app/src/main/res/drawable/ic_file_download_notification.xml deleted file mode 100644 index 492b41d..0000000 --- a/app/src/main/res/drawable/ic_file_download_notification.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_libraries.xml b/app/src/main/res/drawable/ic_libraries.xml index a51097e..811d5ac 100644 --- a/app/src/main/res/drawable/ic_libraries.xml +++ b/app/src/main/res/drawable/ic_libraries.xml @@ -5,5 +5,5 @@ android:viewportHeight="24.0"> + android:pathData="M18,2H6c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2zM6,4h5v8l-2.5,-1.5L6,12V4z"/> diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index d77d931..41a9ec1 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#DDDDDD" + android:background="@color/grey" tools:context=".AboutActivity"> - - diff --git a/app/src/main/res/layout/bottom_bar.xml b/app/src/main/res/layout/bottom_bar.xml index e392157..a85917a 100644 --- a/app/src/main/res/layout/bottom_bar.xml +++ b/app/src/main/res/layout/bottom_bar.xml @@ -11,7 +11,8 @@ android:visibility="gone" android:clickable="true" tools:showIn="@layout/fragment_file_explorer_list" - tools:visibility="visible"> + tools:visibility="visible" + android:focusable="true"> + android:src="@drawable/ic_file_download" + android:contentDescription="@string/download" /> @@ -65,7 +67,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="6dp" - android:src="@drawable/ic_folder_move"/> + android:src="@drawable/ic_folder_move" + android:contentDescription="@string/move" /> + android:text="@string/move"/> + android:src="@drawable/ic_edit" + android:contentDescription="@string/rename" /> + android:text="@string/rename"/> + android:src="@drawable/ic_delete" + android:contentDescription="@string/delete" /> + android:text="@string/delete"/> + android:layout_gravity="center_vertical" + android:contentDescription="@string/app_version" /> + android:paddingStart="32dp" + android:paddingEnd="0dp"> + android:gravity="center_vertical" + android:contentDescription="@string/rclone_version" /> + android:paddingStart="32dp" + android:paddingEnd="0dp"> + android:src="@drawable/ic_changelog" + android:contentDescription="@string/changelog" /> @@ -137,13 +143,15 @@ + android:src="@drawable/ic_libraries" + android:contentDescription="@string/credits_libraries" /> @@ -161,13 +169,16 @@ + android:src="@drawable/ic_mark_github" + android:contentDescription="@string/star_on_github" /> + + android:paddingStart="32dp" + android:paddingEnd="0dp"/> + android:src="@drawable/ic_bug_report" + android:contentDescription="@string/report_a_bug" /> @@ -214,7 +227,7 @@ + android:src="@drawable/ic_person_outline" + android:contentDescription="@string/author_name" /> + android:paddingStart="32dp" + android:paddingEnd="0dp"/> + android:src="@drawable/ic_mark_github" + android:contentDescription="@string/follow_on_github" /> + android:paddingStart="32dp" + android:paddingEnd="0dp"/> diff --git a/app/src/main/res/layout/empty_directory_state.xml b/app/src/main/res/layout/empty_directory_state.xml index c998699..9387692 100644 --- a/app/src/main/res/layout/empty_directory_state.xml +++ b/app/src/main/res/layout/empty_directory_state.xml @@ -24,13 +24,14 @@ android:layout_width="80dp" android:layout_height="80dp" android:src="@drawable/ic_folder_open" - android:layout_gravity="center"/> + android:layout_gravity="center" + android:contentDescription="@string/empty_folder" /> diff --git a/app/src/main/res/layout/empty_state_config_file.xml b/app/src/main/res/layout/empty_state_config_file.xml index e418894..8d27fbf 100644 --- a/app/src/main/res/layout/empty_state_config_file.xml +++ b/app/src/main/res/layout/empty_state_config_file.xml @@ -15,7 +15,7 @@ android:src="@drawable/ic_empty_box" android:layout_centerHorizontal="true" android:layout_alignParentTop="true" - android:contentDescription="Empty state icon" /> + android:contentDescription="@string/empty_state_icon" /> @@ -34,7 +34,7 @@ android:layout_height="wrap_content" android:layout_below="@+id/empty_state_title" android:layout_centerHorizontal="true" - android:text="No configuration file found" + android:text="@string/no_config_file" android:layout_marginTop="8dp" />