From 916f4259603c4679017ac02534d32627b8fa7c95 Mon Sep 17 00:00:00 2001 From: Emin Kokalari Date: Thu, 16 Mar 2023 01:24:22 +0100 Subject: [PATCH 1/5] Update build.gradle --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 49d3387b..5b983ca3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 32 + compileSdkVersion 33 defaultConfig { applicationId "be.ppareit.swiftp" minSdkVersion 23 - targetSdkVersion 32 + targetSdkVersion 33 versionCode 30100 versionName "3.1" } From 06c4e5ca39537a466dab23b0392937bfa281bc80 Mon Sep 17 00:00:00 2001 From: Emin Kokalari Date: Thu, 16 Mar 2023 01:25:12 +0100 Subject: [PATCH 2/5] Update FsService.java --- app/src/main/java/be/ppareit/swiftp/FsService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/be/ppareit/swiftp/FsService.java b/app/src/main/java/be/ppareit/swiftp/FsService.java index 897dc3c3..ba4d0292 100644 --- a/app/src/main/java/be/ppareit/swiftp/FsService.java +++ b/app/src/main/java/be/ppareit/swiftp/FsService.java @@ -465,7 +465,7 @@ public void onTaskRemoved(Intent rootIntent) { Intent restartService = new Intent(getApplicationContext(), this.getClass()); restartService.setPackage(getPackageName()); PendingIntent restartServicePI = PendingIntent.getService( - getApplicationContext(), 1, restartService, PendingIntent.FLAG_ONE_SHOT); + getApplicationContext(), 1, restartService, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE); AlarmManager alarmService = (AlarmManager) getApplicationContext() .getSystemService(Context.ALARM_SERVICE); alarmService.set(AlarmManager.ELAPSED_REALTIME, From 0a10c0670d94022fe64fc7d6236a8d022195259e Mon Sep 17 00:00:00 2001 From: Emin Kokalari Date: Tue, 28 Mar 2023 22:56:56 +0200 Subject: [PATCH 3/5] Remove Notification Badge It is not needed and sometimes annoying too... --- app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java b/app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java index e9dc4597..0aa2f90a 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java @@ -96,6 +96,7 @@ public static Notification setupNotification(Context context) { int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel(channelId, name, importance); channel.setDescription(description); + channel.setShowBadge(false); nm.createNotificationChannel(channel); } From 25a03539f0a56fb161ac4a698fba3f61f85614a2 Mon Sep 17 00:00:00 2001 From: Emin Kokalari Date: Tue, 28 Mar 2023 23:28:36 +0200 Subject: [PATCH 4/5] Don't start service on Android 11+ if writing external storage not set When the app first start writing external storage is null and most of the users start the service without setting it up. This results on starting the service and after connecting via FTP client nothing is shown on the file tree. So better to notify them when using Android 11+ --- .../ppareit/swiftp/gui/PreferenceFragment.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/be/ppareit/swiftp/gui/PreferenceFragment.java b/app/src/main/java/be/ppareit/swiftp/gui/PreferenceFragment.java index 23e37a13..082b3504 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/PreferenceFragment.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/PreferenceFragment.java @@ -41,7 +41,7 @@ import android.text.util.Linkify; import android.widget.TextView; import android.widget.Toast; - +import androidx.appcompat.app.AlertDialog; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; @@ -78,7 +78,19 @@ public void onCreate(Bundle savedInstanceState) { updateRunningState(); runningPref.setOnPreferenceChangeListener((preference, newValue) -> { if ((Boolean) newValue) { - FsService.start(); + if (FsSettings.getExternalStorageUri() != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + FsService.start(); + } else { + AlertDialog.Builder adb = new AlertDialog.Builder(getActivity()); + adb.setTitle("Write External Storage is Required"); + adb.setMessage("Please set the starting directory at Advanced Settings->Writing external storage"); + adb.setPositiveButton("Ok", (dialog, which) -> { + dialog.dismiss(); + runningPref.setChecked(false); + }); + adb.show(); + FsService.stop(); + } } else { FsService.stop(); } From 1f96de1ad7503fd9fe0dd4bce6f4e647ec1b62d3 Mon Sep 17 00:00:00 2001 From: Emin Kokalari Date: Wed, 29 Mar 2023 00:13:14 +0200 Subject: [PATCH 5/5] Get Rid of cat external library Refactor to use Android native log instead of cat library to keep the app as pure as possible. --- app/build.gradle | 1 - .../DynamicMultiSelectListPreference.java | 4 +- app/src/main/java/be/ppareit/swiftp/App.java | 4 +- .../java/be/ppareit/swiftp/FsService.java | 5 +-- .../swiftp/gui/FolderPickerDialogBuilder.java | 8 ++-- .../be/ppareit/swiftp/gui/FsNotification.java | 4 +- .../be/ppareit/swiftp/gui/FsTileService.java | 5 ++- .../ppareit/swiftp/gui/FsWidgetProvider.java | 12 ++--- .../be/ppareit/swiftp/gui/MainActivity.java | 12 ++--- .../swiftp/gui/PreferenceFragment.java | 18 ++++---- .../ppareit/swiftp/locale/EditActivity.java | 7 +-- .../swiftp/locale/SettingsBundleHelper.java | 5 ++- .../swiftp/server/CmdAbstractStore.java | 17 ++++--- .../be/ppareit/swiftp/server/CmdHASH.java | 11 +++-- .../be/ppareit/swiftp/server/CmdLIST.java | 13 +++--- .../be/ppareit/swiftp/server/CmdMFMT.java | 13 +++--- .../be/ppareit/swiftp/server/CmdRANG.java | 4 +- .../be/ppareit/swiftp/server/CmdREST.java | 5 ++- .../be/ppareit/swiftp/server/CmdRETR.java | 23 +++++----- .../be/ppareit/swiftp/server/CmdRNFR.java | 5 +-- .../be/ppareit/swiftp/server/CmdRNTO.java | 11 +++-- .../ppareit/swiftp/server/SessionThread.java | 45 ++++++++++--------- 22 files changed, 114 insertions(+), 118 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 49d3387b..0d7ef453 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,7 +45,6 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'net.vrallev.android:cat:1.0.5' implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.documentfile:documentfile:1.0.1' diff --git a/app/src/main/java/be/ppareit/android/DynamicMultiSelectListPreference.java b/app/src/main/java/be/ppareit/android/DynamicMultiSelectListPreference.java index 7df030b8..54714c82 100644 --- a/app/src/main/java/be/ppareit/android/DynamicMultiSelectListPreference.java +++ b/app/src/main/java/be/ppareit/android/DynamicMultiSelectListPreference.java @@ -22,9 +22,9 @@ import android.content.Context; import android.preference.MultiSelectListPreference; import android.util.AttributeSet; +import android.util.Log; import android.view.View; -import net.vrallev.android.cat.Cat; /** * This is the same as the sdk MultiSelectListPreference but each time @@ -41,7 +41,7 @@ public DynamicMultiSelectListPreference(Context context, AttributeSet attrs) { @Override protected View onCreateDialogView() { - Cat.d("Creating dialog view"); + Log.d("swiftp", "Creating dialog view"); mPopulateListener.onPopulate(this); diff --git a/app/src/main/java/be/ppareit/swiftp/App.java b/app/src/main/java/be/ppareit/swiftp/App.java index d2f7bbb4..d5a6da89 100644 --- a/app/src/main/java/be/ppareit/swiftp/App.java +++ b/app/src/main/java/be/ppareit/swiftp/App.java @@ -23,8 +23,8 @@ import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.util.Log; -import net.vrallev.android.cat.Cat; import be.ppareit.swiftp.gui.FsWidgetProvider; @@ -99,7 +99,7 @@ public static String getVersion() { PackageManager pm = context.getPackageManager(); return pm.getPackageInfo(packageName, 0).versionName; } catch (NameNotFoundException e) { - Cat.e("Unable to find the name " + packageName + " in the package"); + Log.e("swiftp","Unable to find the name " + packageName + " in the package"); return null; } } diff --git a/app/src/main/java/be/ppareit/swiftp/FsService.java b/app/src/main/java/be/ppareit/swiftp/FsService.java index 897dc3c3..f3beed4b 100644 --- a/app/src/main/java/be/ppareit/swiftp/FsService.java +++ b/app/src/main/java/be/ppareit/swiftp/FsService.java @@ -39,7 +39,6 @@ import androidx.core.content.ContextCompat; -import net.vrallev.android.cat.Cat; import java.io.IOException; import java.lang.reflect.Method; @@ -148,7 +147,7 @@ public int onStartCommand(Intent intent, int flags, int startId) { //https://developer.android.com/reference/android/app/Service.html //if there are not any pending start commands to be delivered to the service, it will be called with a null intent object, if (intent != null && intent.getAction() != null) { - Cat.d("onStartCommand called with action: " + intent.getAction()); + Log.d("swiftp","onStartCommand called with action: " + intent.getAction()); switch (intent.getAction()) { case ACTION_REQUEST_START: @@ -365,7 +364,7 @@ public static InetAddress getLocalInetAddress() { && !address.isLinkLocalAddress() && address instanceof Inet4Address) { if (returnAddress != null) { - Cat.w("Found more than one valid address local inet address, why???"); + Log.w("swiftp","Found more than one valid address local inet address, why???"); } returnAddress = address; } diff --git a/app/src/main/java/be/ppareit/swiftp/gui/FolderPickerDialogBuilder.java b/app/src/main/java/be/ppareit/swiftp/gui/FolderPickerDialogBuilder.java index 6c504013..e295701d 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/FolderPickerDialogBuilder.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/FolderPickerDialogBuilder.java @@ -22,10 +22,10 @@ import android.app.AlertDialog; import android.content.Context; import android.os.Environment; +import android.util.Log; import android.widget.ArrayAdapter; import android.widget.ListView; -import net.vrallev.android.cat.Cat; import java.io.File; import java.io.IOException; @@ -77,7 +77,7 @@ private void update() { try { mRoot = new File(mRoot.getCanonicalPath()); } catch (IOException e) { - Cat.w("Directory root is incorrect, fixing to external storage."); + Log.w("swiftp","Directory root is incorrect, fixing to external storage."); mRoot = Environment.getExternalStorageDirectory(); } @@ -94,8 +94,8 @@ private void update() { return (file.isDirectory() && !file.isHidden()); }); if (dirs == null) { - Cat.w("Unable to receive dirs list, no Access rights?"); - Cat.d("Unable to fix, continue with empty list"); + Log.w("swiftp", "Unable to receive dirs list, no Access rights?"); + Log.d("swiftp","Unable to fix, continue with empty list"); dirs = new String[]{}; } mAdapter.add(".."); diff --git a/app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java b/app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java index e9dc4597..0300e990 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/FsNotification.java @@ -28,10 +28,10 @@ import android.content.Context; import android.content.Intent; import android.os.Build; +import android.util.Log; import androidx.core.app.NotificationCompat; -import net.vrallev.android.cat.Cat; import java.net.InetAddress; @@ -44,7 +44,7 @@ public class FsNotification { public static final int NOTIFICATION_ID = 7890; public static Notification setupNotification(Context context) { - Cat.d("Setting up the notification"); + Log.d("swiftp","Setting up the notification"); // Get NotificationManager reference NotificationManager nm = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); diff --git a/app/src/main/java/be/ppareit/swiftp/gui/FsTileService.java b/app/src/main/java/be/ppareit/swiftp/gui/FsTileService.java index d8bc555a..9ee68ead 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/FsTileService.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/FsTileService.java @@ -5,9 +5,10 @@ import android.os.Build; import android.service.quicksettings.Tile; import android.service.quicksettings.TileService; +import android.util.Log; + import androidx.annotation.RequiresApi; -import net.vrallev.android.cat.Cat; import java.net.InetAddress; @@ -50,7 +51,7 @@ private void updateTileState() { // Fill in the FTP server address InetAddress address = FsService.getLocalInetAddress(); if (address == null) { - Cat.v("Unable to retrieve wifi ip address"); + Log.v("swiftp","Unable to retrieve wifi ip address"); tile.setLabel(getString(R.string.swiftp_name)); return; } diff --git a/app/src/main/java/be/ppareit/swiftp/gui/FsWidgetProvider.java b/app/src/main/java/be/ppareit/swiftp/gui/FsWidgetProvider.java index b14f334d..c7ec40ca 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/FsWidgetProvider.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/FsWidgetProvider.java @@ -30,12 +30,12 @@ import android.content.Intent; import android.os.Build; import android.os.IBinder; +import android.util.Log; import android.widget.RemoteViews; import androidx.core.app.NotificationCompat; import androidx.core.content.ContextCompat; -import net.vrallev.android.cat.Cat; import java.net.InetAddress; @@ -52,7 +52,7 @@ public class FsWidgetProvider extends AppWidgetProvider { @Override public void onReceive(Context context, Intent intent) { - Cat.v("Received broadcast: " + intent.getAction()); + Log.v("swiftp","Received broadcast: " + intent.getAction()); // watch for the broadcasts by the ftp server and update the widget if needed final String action = intent.getAction(); if (FsService.ACTION_STARTED.equals(action) || FsService.ACTION_STOPPED.equals(action)) { @@ -65,7 +65,7 @@ public void onReceive(Context context, Intent intent) { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - Cat.d("onUpdated called"); + Log.d("swiftp","onUpdated called"); // let the updating happen by a service Intent updateIntent = new Intent(context, UpdateService.class); ContextCompat.startForegroundService(context, updateIntent); @@ -75,11 +75,11 @@ public static class UpdateService extends Service { // all real work is done in a service to avoid ANR messages @Override public int onStartCommand(Intent intent, int flags, int startId) { - Cat.d("UpdateService start command"); + Log.d("swiftp","UpdateService start command"); // We won't take long, but still we need to keep display a notification while updating NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); if (nm == null) { - Cat.e("We were unable to receive the notification manager."); + Log.e("swiftp","We were unable to receive the notification manager."); return START_NOT_STICKY; } String channelId = "be.ppareit.swiftp.widget_provider.channelId"; @@ -113,7 +113,7 @@ public int onStartCommand(Intent intent, int flags, int startId) { // get ip address InetAddress address = FsService.getLocalInetAddress(); if (address == null) { - Cat.w("Unable to retrieve the local ip address"); + Log.w("swiftp","Unable to retrieve the local ip address"); text = "ERROR"; } else { text = address.getHostAddress(); diff --git a/app/src/main/java/be/ppareit/swiftp/gui/MainActivity.java b/app/src/main/java/be/ppareit/swiftp/gui/MainActivity.java index b0228ee9..59ea6681 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/MainActivity.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/MainActivity.java @@ -29,6 +29,7 @@ import android.os.Build; import android.os.Build.VERSION; import android.os.Bundle; +import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -37,7 +38,6 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; -import net.vrallev.android.cat.Cat; import java.util.Arrays; @@ -56,7 +56,7 @@ public class MainActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { - Cat.d("created"); + Log.d("swiftp","created"); setTheme(FsSettings.getTheme()); super.onCreate(savedInstanceState); @@ -65,7 +65,7 @@ public void onCreate(Bundle savedInstanceState) { } if (App.isFreeVersion() && App.isPaidVersionInstalled()) { - Cat.d("Running demo while paid is installed"); + Log.d("swiftp","Running demo while paid is installed"); AlertDialog ad = new AlertDialog.Builder(this) .setTitle(R.string.demo_while_paid_dialog_title) .setMessage(R.string.demo_while_paid_dialog_message) @@ -101,11 +101,11 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode != PERMISSIONS_REQUEST_CODE) { - Cat.e("Unhandled request code"); + Log.e("swiftp","Unhandled request code"); return; } - Cat.d("permissions: " + Arrays.toString(permissions)); - Cat.d("grantResults: " + Arrays.toString(grantResults)); + Log.d("swiftp","permissions: " + Arrays.toString(permissions)); + Log.d("swiftp","grantResults: " + Arrays.toString(grantResults)); if (grantResults.length > 0) { // Permissions not granted, close down for (int result : grantResults) { diff --git a/app/src/main/java/be/ppareit/swiftp/gui/PreferenceFragment.java b/app/src/main/java/be/ppareit/swiftp/gui/PreferenceFragment.java index 23e37a13..82f02b46 100644 --- a/app/src/main/java/be/ppareit/swiftp/gui/PreferenceFragment.java +++ b/app/src/main/java/be/ppareit/swiftp/gui/PreferenceFragment.java @@ -39,13 +39,13 @@ import android.preference.PreferenceScreen; import android.preference.TwoStatePreference; import android.text.util.Linkify; +import android.util.Log; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; -import net.vrallev.android.cat.Cat; import java.net.InetAddress; import java.util.List; @@ -120,7 +120,7 @@ public void onCreate(Bundle savedInstanceState) { try { portNumber = Integer.parseInt(newPortNumberString); } catch (Exception e) { - Cat.d("Error parsing port number! Moving on..."); + Log.d("swiftp","Error parsing port number! Moving on..."); } if (portNumber <= 0 || 65535 < portNumber) { Toast.makeText(getActivity(), @@ -182,7 +182,7 @@ public void onCreate(Bundle savedInstanceState) { Preference helpPref = findPref("help"); helpPref.setOnPreferenceClickListener(preference -> { - Cat.v("On preference help clicked"); + Log.v("swiftp","On preference help clicked"); Context context = getActivity(); AlertDialog ad = new AlertDialog.Builder(context) .setTitle(R.string.help_dlg_title) @@ -228,7 +228,7 @@ public void onResume() { updateRunningState(); updateUsersPref(); - Cat.d("onResume: Registering the FTP server actions"); + Log.d("swiftp","onResume: Registering the FTP server actions"); IntentFilter filter = new IntentFilter(); filter.addAction(FsService.ACTION_STARTED); filter.addAction(FsService.ACTION_STOPPED); @@ -240,17 +240,17 @@ public void onResume() { public void onPause() { super.onPause(); - Cat.v("onPause: Unregistering the FTPServer actions"); + Log.v("swiftp","onPause: Unregistering the FTPServer actions"); getActivity().unregisterReceiver(mFsActionsReceiver); } @Override public void onActivityResult(int requestCode, int resultCode, Intent resultData) { - Cat.d("onActivityResult called"); + Log.d("swiftp","onActivityResult called"); if (requestCode == ACTION_OPEN_DOCUMENT_TREE && resultCode == Activity.RESULT_OK) { Uri treeUri = resultData.getData(); String path = treeUri.getPath(); - Cat.d("Action Open Document Tree on path " + path); + Log.d("swiftp","Action Open Document Tree on path " + path); final CheckBoxPreference writeExternalStoragePref = findPref("writeExternalStorage"); if (!":".equals(path.substring(path.length() - 1)) || path.contains("primary")) { @@ -302,7 +302,7 @@ private void updateRunningState() { // Fill in the FTP server address InetAddress address = FsService.getLocalInetAddress(); if (address == null) { - Cat.v("Unable to retrieve wifi ip address"); + Log.v("swiftp","Unable to retrieve wifi ip address"); runningPref.setSummary(R.string.running_summary_failed_to_get_ip_address); return; } @@ -324,7 +324,7 @@ private void updateRunningState() { BroadcastReceiver mFsActionsReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - Cat.v("action received: " + intent.getAction()); + Log.v("swiftp","action received: " + intent.getAction()); if (intent.getAction() == null) { return; } diff --git a/app/src/main/java/be/ppareit/swiftp/locale/EditActivity.java b/app/src/main/java/be/ppareit/swiftp/locale/EditActivity.java index bfa742f7..325b340b 100644 --- a/app/src/main/java/be/ppareit/swiftp/locale/EditActivity.java +++ b/app/src/main/java/be/ppareit/swiftp/locale/EditActivity.java @@ -23,13 +23,14 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; + +import android.util.Log; import android.view.MenuItem; import android.widget.RadioButton; import android.widget.RadioGroup; import com.twofortyfouram.locale.sdk.client.ui.activity.AbstractAppCompatPluginActivity; -import net.vrallev.android.cat.Cat; import be.ppareit.swiftp.FsSettings; import be.ppareit.swiftp.R; @@ -56,7 +57,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { ApplicationInfo ai = pm.getApplicationInfo(getCallingPackage(), 0); callingApplicationLabel = pm.getApplicationLabel(ai); } catch (final PackageManager.NameNotFoundException e) { - Cat.e("Calling package couldn't be found%s", e); //$NON-NLS-1$ + Log.e("swiftp","Calling package couldn't be found%s", e); //$NON-NLS-1$ } if (null != callingApplicationLabel) { setTitle(callingApplicationLabel); @@ -85,7 +86,7 @@ public boolean isBundleValid(@NonNull Bundle bundle) { public void onPostCreateWithPreviousResult(@NonNull Bundle previousBundle, @NonNull String previousBlurb) { if (!isBundleValid(previousBundle)) { - Cat.e("Invalid bundle received, repairing to default"); + Log.e("swiftp","Invalid bundle received, repairing to default"); previousBundle = generateBundle(this, false); } boolean running = previousBundle.getBoolean(BUNDLE_BOOLEAN_RUNNING); diff --git a/app/src/main/java/be/ppareit/swiftp/locale/SettingsBundleHelper.java b/app/src/main/java/be/ppareit/swiftp/locale/SettingsBundleHelper.java index ef5e63d6..4ea104ee 100644 --- a/app/src/main/java/be/ppareit/swiftp/locale/SettingsBundleHelper.java +++ b/app/src/main/java/be/ppareit/swiftp/locale/SettingsBundleHelper.java @@ -20,12 +20,13 @@ import android.content.Context; import android.os.Bundle; +import android.util.Log; + import androidx.annotation.NonNull; import com.twofortyfouram.assertion.BundleAssertions; import com.twofortyfouram.spackle.AppBuildInfo; -import net.vrallev.android.cat.Cat; public final class SettingsBundleHelper { @@ -41,7 +42,7 @@ static public boolean isBundleValid(Bundle bundle) { BundleAssertions.assertHasBoolean(bundle, BUNDLE_BOOLEAN_RUNNING); BundleAssertions.assertHasInt(bundle, BUNDLE_VERSION_CODE); } catch (AssertionError e) { - Cat.e("Bundle failed verification"); + Log.e("swiftp","Bundle failed verification"); return false; } return true; diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdAbstractStore.java b/app/src/main/java/be/ppareit/swiftp/server/CmdAbstractStore.java index 8ced03eb..9f3a2935 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdAbstractStore.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdAbstractStore.java @@ -26,7 +26,6 @@ import android.util.Log; -import net.vrallev.android.cat.Cat; import java.io.File; import java.io.FileNotFoundException; @@ -44,7 +43,7 @@ public CmdAbstractStore(SessionThread sessionThread, String input) { } public void doStorOrAppe(String param, boolean append) { - Cat.d("STOR/APPE executing with append = " + append); + Log.d("swiftp","STOR/APPE executing with append = " + append); File storeFile = inputPathToChrootedFile(sessionThread.getChrootDir(), sessionThread.getWorkingDir(), param); @@ -104,7 +103,7 @@ public void doStorOrAppe(String param, boolean append) { } } catch (FileNotFoundException e) { - Cat.e("error : ", e); + Log.e("swiftp","error : ", e); try { errString = "451 Couldn't open file \"" + param + "\" aka \"" + storeFile.getCanonicalPath() + "\" for writing\r\n"; @@ -120,18 +119,18 @@ public void doStorOrAppe(String param, boolean append) { errString = "425 Couldn't open data socket\r\n"; break storing; } - Cat.d("Data socket ready"); + Log.d("swiftp","Data socket ready"); sessionThread.writeString("150 Data socket ready\r\n"); byte[] buffer = new byte[SessionThread.DATA_CHUNK_SIZE]; int numRead; - Cat.d("Mode is " + (sessionThread.isBinaryMode() ? "binary" : "ascii")); + Log.d("swiftp","Mode is " + (sessionThread.isBinaryMode() ? "binary" : "ascii")); while (true) { switch (numRead = sessionThread.receiveFromDataSocket(buffer)) { case -1: - Cat.d("Returned from final read"); + Log.d("swiftp","Returned from final read"); // We're finished reading break storing; case 0: @@ -162,7 +161,7 @@ public void doStorOrAppe(String param, boolean append) { } } catch (IOException e) { errString = "451 File IO problem. Device might be full.\r\n"; - Cat.d("Exception while storing: " + e); + Log.d("swiftp","Exception while storing: " + e); break storing; } break; @@ -177,7 +176,7 @@ public void doStorOrAppe(String param, boolean append) { } if (errString != null) { - Cat.i("STOR error: " + errString.trim()); + Log.i("swiftp","STOR error: " + errString.trim()); sessionThread.writeString(errString); } else { sessionThread.writeString("226 Transmission complete\r\n"); @@ -186,6 +185,6 @@ public void doStorOrAppe(String param, boolean append) { MediaUpdater.notifyFileCreated(storeFile.getPath()); } sessionThread.closeDataSocket(); - Cat.d("STOR finished"); + Log.d("swiftp","STOR finished"); } } diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdHASH.java b/app/src/main/java/be/ppareit/swiftp/server/CmdHASH.java index d7695b88..83daa109 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdHASH.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdHASH.java @@ -2,7 +2,6 @@ import android.util.Log; -import net.vrallev.android.cat.Cat; import java.io.File; import java.io.FileInputStream; @@ -27,7 +26,7 @@ public CmdHASH(SessionThread sessionThread, String input) { @Override public void run() { - Cat.d("HASH executing"); + Log.d("swiftp","HASH executing"); String param = getParameter(input); File fileToHash; String errString = null; @@ -39,15 +38,15 @@ public void run() { errString = "550 Invalid name or chroot violation\r\n"; break mainblock; } else if (fileToHash.isDirectory()) { - Cat.d("Ignoring HASH for directory"); + Log.d("swiftp","Ignoring HASH for directory"); errString = "553 Can't HASH a directory\r\n"; break mainblock; } else if (!fileToHash.exists()) { - Cat.d("Can't HASH nonexistent file: " + fileToHash.getAbsolutePath()); + Log.d("swiftp","Can't HASH nonexistent file: " + fileToHash.getAbsolutePath()); errString = "550 File does not exist\r\n"; break mainblock; } else if (!fileToHash.canRead()) { - Cat.i("Failed HASH permission (canRead() is false)"); + Log.i("swiftp","Failed HASH permission (canRead() is false)"); errString = "556 No read permissions\r\n"; break mainblock; } @@ -111,6 +110,6 @@ public void run() { if (errString != null) { sessionThread.writeString(errString); } - Cat.d("HASH done"); + Log.d("swiftp","HASH done"); } } diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdLIST.java b/app/src/main/java/be/ppareit/swiftp/server/CmdLIST.java index c54ac7bd..038a0061 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdLIST.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdLIST.java @@ -33,7 +33,6 @@ import android.util.Log; -import net.vrallev.android.cat.Cat; public class CmdLIST extends CmdAbstractListing implements Runnable { @@ -52,10 +51,10 @@ public void run() { mainblock: { String param = getParameter(input); - Cat.d("LIST parameter: " + param); + Log.d("swiftp","LIST parameter: " + param); while (param.startsWith("-")) { // Skip all dashed -args, if present - Cat.d("LIST is skipping dashed arg " + param); + Log.d("swiftp","LIST is skipping dashed arg " + param); param = getParameter(param); } File fileToList = null; @@ -95,9 +94,9 @@ public void run() { if (errString != null) { sessionThread.writeString(errString); - Cat.d("LIST failed with: " + errString); + Log.d("swiftp","LIST failed with: " + errString); } else { - Cat.d("LIST completed OK"); + Log.d("swiftp","LIST completed OK"); } // The success or error response over the control connection will // have already been handled by sendListing, so we can just quit now. @@ -110,7 +109,7 @@ protected String makeLsString(File file) { StringBuilder response = new StringBuilder(); if (!file.exists()) { - Cat.i("makeLsString had nonexistent file"); + Log.i("swiftp","makeLsString had nonexistent file"); return null; } @@ -121,7 +120,7 @@ protected String makeLsString(File file) { String lastNamePart = file.getName(); // Many clients can't handle files containing these symbols if (lastNamePart.contains("*") || lastNamePart.contains("/")) { - Cat.i("Filename omitted due to disallowed character"); + Log.i("swiftp","Filename omitted due to disallowed character"); return null; } else { // The following line generates many calls in large directories diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdMFMT.java b/app/src/main/java/be/ppareit/swiftp/server/CmdMFMT.java index b8753505..3ad2d011 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdMFMT.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdMFMT.java @@ -30,7 +30,6 @@ import android.util.Log; -import net.vrallev.android.cat.Cat; /** * CmdMFMT implements File Modification Time. See draft-somers-ftp-mfxx-04 in documentation. @@ -46,14 +45,14 @@ public CmdMFMT(SessionThread sessionThread, String input) { @Override public void run() { - Cat.d("run: MFMT executing, input: " + mInput); + Log.d("swiftp","run: MFMT executing, input: " + mInput); //Syntax: "MFMT" SP time-val SP pathname CRLF String parameter = getParameter(mInput); int splitPosition = parameter.indexOf(' '); if (splitPosition == -1) { sessionThread.writeString("500 wrong number of parameters\r\n"); - Cat.d("run: MFMT failed, wrong number of parameters"); + Log.d("swiftp","run: MFMT failed, wrong number of parameters"); return; } @@ -70,7 +69,7 @@ public void run() { timeVal = Util.parseDate(timeString); } catch (ParseException e) { sessionThread.writeString("501 unable to parse parameter time-val\r\n"); - Cat.d("run: MFMT failed, unable to parse parameter time-val"); + Log.d("swiftp","run: MFMT failed, unable to parse parameter time-val"); return; } @@ -79,14 +78,14 @@ public void run() { if (!file.exists()) { sessionThread.writeString("550 file does not exist on server\r\n"); - Cat.d("run: MFMT failed, file does not exist"); + Log.d("swiftp","run: MFMT failed, file does not exist"); return; } boolean success = file.setLastModified(timeVal.getTime()); if (!success) { sessionThread.writeString("500 unable to modify last modification time\r\n"); - Cat.d("run: MFMT failed, unable to modify last modification time"); + Log.d("swiftp","run: MFMT failed, unable to modify last modification time"); // more info at https://code.google.com/p/android/issues/detail?id=18624 return; } @@ -96,7 +95,7 @@ public void run() { + file.getAbsolutePath() + "\r\n"; sessionThread.writeString(response); - Cat.d("run: MFMT completed successful"); + Log.d("swiftp","run: MFMT completed successful"); } } diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdRANG.java b/app/src/main/java/be/ppareit/swiftp/server/CmdRANG.java index 7869aa8d..10bad13b 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdRANG.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdRANG.java @@ -1,7 +1,7 @@ package be.ppareit.swiftp.server; -import net.vrallev.android.cat.Cat; +import android.util.Log; /** * CmdRANG add's a RANG command to be used by clients to designate an octet range to a @@ -18,7 +18,7 @@ public CmdRANG(SessionThread sessionThread, String input) { @Override public void run() { - Cat.d("RANG executing"); + Log.d("swiftp","RANG executing"); String param = getParameter(input); String splits[] = param.split(" "); String errString = null; diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdREST.java b/app/src/main/java/be/ppareit/swiftp/server/CmdREST.java index 99a1adf3..75bd6b99 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdREST.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdREST.java @@ -17,7 +17,8 @@ package be.ppareit.swiftp.server; -import net.vrallev.android.cat.Cat; + +import android.util.Log; public class CmdREST extends FtpCmd implements Runnable { protected String input; @@ -41,7 +42,7 @@ public void run() { sessionThread.writeString("550 Restart position must be non-negative\r\n"); return; } - Cat.d("run REST with offset " + offset); + Log.d("swiftp","run REST with offset " + offset); if (sessionThread.isBinaryMode()) { sessionThread.offset = offset; sessionThread.writeString("350 Restart position accepted (" + offset + ")\r\n"); diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdRETR.java b/app/src/main/java/be/ppareit/swiftp/server/CmdRETR.java index b5f35b27..0f460781 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdRETR.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdRETR.java @@ -21,7 +21,6 @@ import android.util.Log; -import net.vrallev.android.cat.Cat; import java.io.File; import java.io.FileInputStream; @@ -39,7 +38,7 @@ public CmdRETR(SessionThread sessionThread, String input) { @Override public void run() { - Cat.d("RETR executing"); + Log.d("swiftp","RETR executing"); String param = getParameter(input); File fileToRetr; String errString = null; @@ -51,15 +50,15 @@ public void run() { errString = "550 Invalid name or chroot violation\r\n"; break mainblock; } else if (fileToRetr.isDirectory()) { - Cat.d("Ignoring RETR for directory"); + Log.d("swiftp","Ignoring RETR for directory"); errString = "550 Can't RETR a directory\r\n"; break mainblock; } else if (!fileToRetr.exists()) { - Cat.d("Can't RETR nonexistent file: " + fileToRetr.getAbsolutePath()); + Log.d("swiftp","Can't RETR nonexistent file: " + fileToRetr.getAbsolutePath()); errString = "550 File does not exist\r\n"; break mainblock; } else if (!fileToRetr.canRead()) { - Cat.i("Failed RETR permission (canRead() is false)"); + Log.i("swiftp","Failed RETR permission (canRead() is false)"); errString = "550 No read permissions\r\n"; break mainblock; } @@ -70,15 +69,15 @@ public void run() { byte[] buffer = new byte[SessionThread.DATA_CHUNK_SIZE]; int bytesRead; if (sessionThread.openDataSocket()) { - Cat.d("RETR opened data socket"); + Log.d("swiftp","RETR opened data socket"); } else { errString = "425 Error opening socket\r\n"; - Cat.i("Error in initDataSocket()"); + Log.i("swiftp","Error in initDataSocket()"); break mainblock; } sessionThread.writeString("150 Sending file\r\n"); if (sessionThread.isBinaryMode()) { // RANG is supported only in binary mode. - Cat.d("Transferring in binary mode"); + Log.d("swiftp","Transferring in binary mode"); long offset = 0L; long endPosition = fileToRetr.length() - 1; if (sessionThread.offset >= 0) { @@ -102,15 +101,15 @@ public void run() { if (!success) { errString = "426 Data socket error\r\n"; - Cat.i("Data socket error"); + Log.i("swiftp","Data socket error"); break mainblock; } } } else { // We're in ASCII mode - Cat.d("Transferring in ASCII mode"); + Log.d("swiftp","Transferring in ASCII mode"); if (sessionThread.offset >= 0) { errString = "550 Unable to seek to requested position in ASCII mode"; - Cat.e("Error: " + errString); + Log.e("swiftp","Error: " + errString); break mainblock; } // We have to convert all solitary \n to \r\n @@ -169,6 +168,6 @@ public void run() { } else { sessionThread.writeString("226 Transmission finished\r\n"); } - Cat.d("RETR done"); + Log.d("swiftp","RETR done"); } } diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdRNFR.java b/app/src/main/java/be/ppareit/swiftp/server/CmdRNFR.java index 09a6d236..0af69cbb 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdRNFR.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdRNFR.java @@ -23,7 +23,6 @@ import android.util.Log; -import net.vrallev.android.cat.Cat; /** * CmdRNFR implements RENAME FROM (RNFR) @@ -42,7 +41,7 @@ public CmdRNFR(SessionThread sessionThread, String input) { @Override public void run() { - Cat.d("Executing RNFR"); + Log.d("swiftp","Executing RNFR"); String param = getParameter(input); String errString = null; File file = null; @@ -59,7 +58,7 @@ public void run() { } if (errString != null) { sessionThread.writeString(errString); - Cat.d("RNFR failed: " + errString.trim()); + Log.d("swiftp","RNFR failed: " + errString.trim()); sessionThread.setRenameFrom(null); } else { sessionThread.writeString("350 Filename noted, now send RNTO\r\n"); diff --git a/app/src/main/java/be/ppareit/swiftp/server/CmdRNTO.java b/app/src/main/java/be/ppareit/swiftp/server/CmdRNTO.java index 136a04fd..a6104b73 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/CmdRNTO.java +++ b/app/src/main/java/be/ppareit/swiftp/server/CmdRNTO.java @@ -25,7 +25,6 @@ import android.os.Build; import android.util.Log; -import net.vrallev.android.cat.Cat; import be.ppareit.swiftp.App; import be.ppareit.swiftp.utils.FileUtil; @@ -48,14 +47,14 @@ public CmdRNTO(SessionThread sessionThread, String input) { @Override public void run() { - Cat.d("RNTO executing"); + Log.d("swiftp","RNTO executing"); String param = getParameter(input); String errString = null; File toFile = null; mainblock: { toFile = inputPathToChrootedFile(sessionThread.getChrootDir(), sessionThread.getWorkingDir(), param); - Cat.i("RNTO to file: " + toFile.getPath()); + Log.i("swiftp","RNTO to file: " + toFile.getPath()); if (violatesChroot(toFile)) { errString = "550 Invalid name or chroot violation\r\n"; break mainblock; @@ -65,7 +64,7 @@ public void run() { errString = "550 Rename error, maybe RNFR not sent\r\n"; break mainblock; } - Cat.i("RNTO from file: " + fromFile.getPath()); + Log.i("swiftp","RNTO from file: " + fromFile.getPath()); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { // TODO: this code is working around a bug that java6 and before cannot @@ -105,11 +104,11 @@ public void run() { } if (errString != null) { sessionThread.writeString(errString); - Cat.i("RNFR failed: " + errString.trim()); + Log.i("swiftp","RNFR failed: " + errString.trim()); } else { sessionThread.writeString("250 rename successful\r\n"); } sessionThread.setRenameFrom(null); - Cat.d("RNTO finished"); + Log.d("swiftp","RNTO finished"); } } diff --git a/app/src/main/java/be/ppareit/swiftp/server/SessionThread.java b/app/src/main/java/be/ppareit/swiftp/server/SessionThread.java index 7a485ff8..3914c1f0 100644 --- a/app/src/main/java/be/ppareit/swiftp/server/SessionThread.java +++ b/app/src/main/java/be/ppareit/swiftp/server/SessionThread.java @@ -19,7 +19,8 @@ package be.ppareit.swiftp.server; -import net.vrallev.android.cat.Cat; + +import android.util.Log; import java.io.BufferedReader; import java.io.File; @@ -78,10 +79,10 @@ public SessionThread(Socket socket, LocalDataSocket dataSocket) { public boolean sendViaDataSocket(String string) { try { byte[] bytes = string.getBytes(encoding); - Cat.d("Using data connection encoding: " + encoding); + Log.d("swiftp","Using data connection encoding: " + encoding); return sendViaDataSocket(bytes, 0, bytes.length); } catch (UnsupportedEncodingException e) { - Cat.e("Unsupported encoding for data socket send"); + Log.e("swiftp","Unsupported encoding for data socket send"); return false; } } @@ -97,7 +98,7 @@ public boolean sendViaDataSocket(String string) { public boolean sendViaDataSocket(byte[] bytes, int start, int len) { if (dataOutputStream == null) { - Cat.i("Can't send via null dataOutputStream"); + Log.i("swiftp","Can't send via null dataOutputStream"); return false; } if (len == 0) { @@ -106,7 +107,7 @@ public boolean sendViaDataSocket(byte[] bytes, int start, int len) { try { dataOutputStream.write(bytes, start, len); } catch (IOException e) { - Cat.e("Couldn't write output stream for data socket, error:" + e.toString()); + Log.e("swiftp","Couldn't write output stream for data socket, error:" + e.toString()); return false; } localDataSocket.reportTraffic(len); @@ -128,11 +129,11 @@ public int receiveFromDataSocket(byte[] buf) { int bytesRead; if (dataSocket == null) { - Cat.i("Can't receive from null dataSocket"); + Log.i("swiftp","Can't receive from null dataSocket"); return -2; } if (!dataSocket.isConnected()) { - Cat.i("Can't receive from unconnected socket"); + Log.i("swiftp","Can't receive from unconnected socket"); return -2; } @@ -141,7 +142,7 @@ public int receiveFromDataSocket(byte[] buf) { bytesRead = dataInputStream.read(buf, 0, buf.length); } while (bytesRead == 0); } catch (IOException e) { - Cat.i("Error reading data socket"); + Log.i("swiftp","Error reading data socket"); return 0; } return bytesRead; @@ -184,14 +185,14 @@ public boolean openDataSocket() { try { dataSocket = localDataSocket.onTransfer(); if (dataSocket == null) { - Cat.i("dataSocketFactory.onTransfer() returned null"); + Log.i("swiftp","dataSocketFactory.onTransfer() returned null"); return false; } dataInputStream = dataSocket.getInputStream(); dataOutputStream = dataSocket.getOutputStream(); return true; } catch (IOException e) { - Cat.i("IOException getting OutputStream for data socket"); + Log.i("swiftp","IOException getting OutputStream for data socket"); dataSocket = null; return false; } @@ -201,7 +202,7 @@ public boolean openDataSocket() { * Call when done doing IO over the data socket */ public void closeDataSocket() { - Cat.d("Closing data socket"); + Log.d("swiftp","Closing data socket"); if (dataInputStream != null) { try { dataInputStream.close(); @@ -226,13 +227,13 @@ public void closeDataSocket() { } public void quit() { - Cat.d("SessionThread told to quit"); + Log.d("swiftp","SessionThread told to quit"); closeSocket(); } @Override public void run() { - Cat.i("SessionThread started"); + Log.i("swiftp","SessionThread started"); // Give client a welcome if (sendWelcomeBanner) { writeString("220 SwiFTP " + App.getVersion() + " ready\r\n"); @@ -245,15 +246,15 @@ public void run() { String line; line = in.readLine(); // will accept \r\n or \n for terminator if (line != null) { - Cat.d("Received line from client: " + line); + Log.d("swiftp","Received line from client: " + line); FtpCmd.dispatchCommand(this, line); } else { - Cat.i("readLine gave null, quitting"); + Log.i("swiftp","readLine gave null, quitting"); break; } } } catch (IOException e) { - Cat.i("Connection was dropped"); + Log.i("swiftp","Connection was dropped"); } closeSocket(); } @@ -275,7 +276,7 @@ public void writeBytes(byte[] bytes) { outputStream.flush(); localDataSocket.reportTraffic(bytes.length); } catch (IOException e) { - Cat.i("Exception writing socket"); + Log.i("swiftp","Exception writing socket"); closeSocket(); } } @@ -285,7 +286,7 @@ public void writeString(String str) { try { strBytes = str.getBytes(encoding); } catch (UnsupportedEncodingException e) { - Cat.e("Unsupported encoding: " + encoding); + Log.e("swiftp","Unsupported encoding: " + encoding); strBytes = str.getBytes(); } writeBytes(strBytes); @@ -342,13 +343,13 @@ public boolean isUserLoggedIn() { public void authAttempt(boolean authenticated) { if (authenticated) { - Cat.i("Authentication complete"); + Log.i("swiftp","Authentication complete"); userAuthenticated = true; } else { authFails++; - Cat.i("Auth failed: " + authFails + "/" + MAX_AUTH_FAILS); + Log.i("swiftp","Auth failed: " + authFails + "/" + MAX_AUTH_FAILS); if (authFails > MAX_AUTH_FAILS) { - Cat.i("Too many auth fails, quitting session"); + Log.i("swiftp","Too many auth fails, quitting session"); quit(); } } @@ -362,7 +363,7 @@ public void setWorkingDir(File workingDir) { try { this.workingDir = workingDir.getCanonicalFile().getAbsoluteFile(); } catch (IOException e) { - Cat.i("SessionThread canonical error"); + Log.i("swiftp","SessionThread canonical error"); } }