diff --git a/.gitignore b/.gitignore
index 129e92ab0..6f7e64a3b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,3 +55,4 @@ libs/libs.iml
.idea/
gradle.properties
projectFilesBackup
+/src/main/res/raw/key.bks
diff --git a/src/main/java/com/amaze/filemanager/activities/AboutActivity.java b/src/main/java/com/amaze/filemanager/activities/AboutActivity.java
index 907abbbd6..45d4a3eb2 100644
--- a/src/main/java/com/amaze/filemanager/activities/AboutActivity.java
+++ b/src/main/java/com/amaze/filemanager/activities/AboutActivity.java
@@ -192,7 +192,7 @@ public class AboutActivity extends BasicActivity implements View.OnClickListener
private void switchIcons() {
if (getAppTheme().equals(AppTheme.DARK)) {
// dark theme
- mAuthorsDivider.setBackgroundColor(getResources().getColor(R.color.divider_dark));
+ mAuthorsDivider.setBackgroundColor(getResources().getColor(R.color.divider_dark_card));
}
}
diff --git a/src/main/java/com/amaze/filemanager/fragments/FTPServerFragment.java b/src/main/java/com/amaze/filemanager/fragments/FTPServerFragment.java
index 84c1c1435..2269692bf 100644
--- a/src/main/java/com/amaze/filemanager/fragments/FTPServerFragment.java
+++ b/src/main/java/com/amaze/filemanager/fragments/FTPServerFragment.java
@@ -11,8 +11,13 @@ import android.net.NetworkInfo;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
+import android.support.design.widget.TextInputLayout;
import android.support.v4.app.Fragment;
+import android.support.v7.widget.AppCompatCheckBox;
+import android.support.v7.widget.AppCompatEditText;
+import android.text.Html;
import android.text.InputType;
+import android.text.Spanned;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -20,8 +25,8 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
+import android.widget.CompoundButton;
import android.widget.EditText;
-import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
@@ -34,56 +39,23 @@ import com.amaze.filemanager.utils.color.ColorUsage;
import com.amaze.filemanager.utils.theme.AppTheme;
import java.io.File;
+import java.io.InputStream;
/**
* Created by yashwanthreddyg on 10-06-2016.
*/
public class FTPServerFragment extends Fragment {
- TextView statusText, warningText, ftpAddrText;
+ TextView statusText, username, password, port, sharedPath;
+ private AppCompatEditText usernameEditText, passwordEditText;
+ private TextInputLayout usernameTextInput, passwordTextInput;
+ private AppCompatCheckBox mAnonymousCheckBox, mSecureCheckBox;
Button ftpBtn;
private MainActivity mainActivity;
- private View rootView;
- private int skin_color, skinTwoColor;
-
- private BroadcastReceiver mWifiReceiver = new BroadcastReceiver() {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo netInfo = conMan.getActiveNetworkInfo();
- if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) {
- warningText.setText("");
- } else {
- stopServer();
- statusText.setText(getResources().getString(R.string.ftp_status_not_running));
- warningText.setText(getResources().getString(R.string.ftp_no_wifi));
- ftpAddrText.setText("");
- ftpBtn.setText(getResources().getString(R.string.start_ftp));
- }
- }
- };
- private BroadcastReceiver ftpReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (action == FTPService.ACTION_STARTED) {
- statusText.setText(getResources().getString(R.string.ftp_status_running));
- warningText.setText("");
- ftpAddrText.setText(getFTPAddressString());
- ftpBtn.setText(getResources().getString(R.string.stop_ftp));
- } else if (action == FTPService.ACTION_FAILEDTOSTART) {
- statusText.setText(getResources().getString(R.string.ftp_status_not_running));
- warningText.setText("Oops! Something went wrong");
- ftpAddrText.setText("");
- ftpBtn.setText(getResources().getString(R.string.start_ftp));
- } else if (action == FTPService.ACTION_STOPPED) {
- statusText.setText(getResources().getString(R.string.ftp_status_not_running));
- ftpAddrText.setText("");
- ftpBtn.setText(getResources().getString(R.string.start_ftp));
- }
- }
- };
+ private View rootView, startDividerView, statusDividerView;
+ private int skin_color, skinTwoColor, accentColor;
+ private Spanned spannedStatusNoConnection, spannedStatusConnected;
+ private Spanned spannedStatusSecure, spannedStatusNotRunning;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -92,13 +64,98 @@ public class FTPServerFragment extends Fragment {
mainActivity = (MainActivity) getActivity();
}
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ // Inflate the layout for this fragment
+ rootView = inflater.inflate(R.layout.fragment_ftp, container, false);
+ statusText =(TextView) rootView.findViewById(R.id.text_view_ftp_status);
+ username = (TextView) rootView.findViewById(R.id.text_view_ftp_username);
+ password = (TextView) rootView.findViewById(R.id.text_view_ftp_password);
+ port = (TextView) rootView.findViewById(R.id.text_view_ftp_port);
+ sharedPath = (TextView) rootView.findViewById(R.id.text_view_ftp_path);
+ ftpBtn = (Button) rootView.findViewById(R.id.startStopButton);
+ startDividerView = rootView.findViewById(R.id.divider_ftp_start);
+ statusDividerView = rootView.findViewById(R.id.divider_ftp_status);
+
+ String statusHead = getResources().getString(R.string.ftp_status_title) + ": ";
+
+
+ skin_color = mainActivity.getColorPreference().getColor(ColorUsage.PRIMARY);
+ skinTwoColor = mainActivity.getColorPreference().getColor(ColorUsage.PRIMARY_TWO);
+ accentColor = mainActivity.getColorPreference().getColor(ColorUsage.ACCENT);
+
+ spannedStatusConnected = Html.fromHtml(statusHead + " " +
+ ""
+ + getResources().getString(R.string.ftp_status_running) + "");
+ spannedStatusNoConnection = Html.fromHtml(statusHead + " " +
+ ""
+ + getResources().getString(R.string.ftp_status_no_connection) + "");
+
+ spannedStatusNotRunning = Html.fromHtml(statusHead + " " +
+ getResources().getString(R.string.ftp_status_not_running) + "");
+ spannedStatusSecure = Html.fromHtml(statusHead + " " +
+ ""
+ + getResources().getString(R.string.ftp_status_secure_connection) + "");
+
+ updateStatus();
+
+ //light theme
+ if (mainActivity.getAppTheme().equals(AppTheme.LIGHT)) {
+ startDividerView.setBackgroundColor(getResources().getColor(R.color.divider));
+ statusDividerView.setBackgroundColor(getResources().getColor(R.color.divider));
+ } else {
+ //dark
+ startDividerView.setBackgroundColor(getResources().getColor(R.color.divider_dark_card));
+ statusDividerView.setBackgroundColor(getResources().getColor(R.color.divider_dark_card));
+ }
+
+ ftpBtn.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ if (!FTPService.isRunning()) {
+ if (FTPService.isConnectedToWifi(getContext()))
+ startServer();
+ else {
+ // no wifi, we shouldn't be here in the first place, because of broadcast
+ // receiver, but just to be sure
+ statusText.setText(spannedStatusNoConnection);
+ }
+ } else {
+ stopServer();
+ }
+ }
+ });
+
+ return rootView;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ setRetainInstance(true);
+ mainActivity.setActionBarTitle(getResources().getString(R.string.ftp));
+ mainActivity.floatingActionButton.hideMenuButton(true);
+ mainActivity.buttonBarFrame.setVisibility(View.GONE);
+ mainActivity.supportInvalidateOptionsMenu();
+
+ mainActivity.updateViews(new ColorDrawable(MainActivity.currentTab==1 ?
+ skinTwoColor : skin_color));
+ }
+
+ @Override
+ public void onDestroy() {
+
+ super.onDestroy();
+ }
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
switch (item.getItemId()) {
case R.id.choose_ftp_port:
- int currentFtpPort = FTPService.getDefaultPortFromPreferences(preferences);
+ int currentFtpPort = getDefaultPortFromPreferences();
new MaterialDialog.Builder(getActivity())
.input(getString(R.string.ftp_port_edit_menu_title), Integer.toString(currentFtpPort), true, new MaterialDialog.InputCallback() {
@@ -120,7 +177,7 @@ public class FTPServerFragment extends Fragment {
Toast.makeText(getActivity(), R.string.ftp_port_change_error_invalid, Toast.LENGTH_SHORT)
.show();
} else {
- FTPService.changeFTPServerPort(preferences, portNumber);
+ changeFTPServerPort(portNumber);
Toast.makeText(getActivity(), R.string.ftp_port_change_success, Toast.LENGTH_SHORT)
.show();
}
@@ -136,7 +193,7 @@ public class FTPServerFragment extends Fragment {
MaterialDialog.Builder dialogBuilder = new MaterialDialog.Builder(getActivity());
dialogBuilder.title(getString(R.string.ftp_path));
dialogBuilder.input(getString(R.string.ftp_path_hint),
- FTPService.getDefaultPathFromPreferences(preferences),
+ getDefaultPathFromPreferences(),
false, new MaterialDialog.InputCallback() {
@Override
public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
@@ -154,7 +211,8 @@ public class FTPServerFragment extends Fragment {
File pathFile = new File(path);
if (pathFile.exists() && pathFile.isDirectory()) {
- FTPService.changeFTPServerPath(preferences, pathFile.getPath());
+ changeFTPServerPath(pathFile.getPath());
+
Toast.makeText(getActivity(), R.string.ftp_path_change_success,
Toast.LENGTH_SHORT)
.show();
@@ -163,7 +221,7 @@ public class FTPServerFragment extends Fragment {
File pathParentFile = new File(pathFile.getParent());
if (pathParentFile.exists() && pathParentFile.isDirectory()) {
- FTPService.changeFTPServerPath(preferences, pathParentFile.getPath());
+ changeFTPServerPath(pathParentFile.getPath());
Toast.makeText(getActivity(), R.string.ftp_path_change_success,
Toast.LENGTH_SHORT)
.show();
@@ -183,6 +241,84 @@ public class FTPServerFragment extends Fragment {
.negativeText(R.string.cancel)
.build()
.show();
+ return true;
+ case R.id.ftp_login:
+ MaterialDialog.Builder loginDialogBuilder = new MaterialDialog.Builder(getActivity());
+
+ LayoutInflater inflater = getActivity().getLayoutInflater();
+ View rootView = inflater.inflate(R.layout.dialog_ftp_login, null);
+ initLoginDialogViews(rootView);
+
+ loginDialogBuilder.customView(rootView, true);
+
+ loginDialogBuilder.title(getString(R.string.ftp_login));
+
+ loginDialogBuilder.onPositive(new MaterialDialog.SingleButtonCallback() {
+ @Override
+ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
+
+ if (mAnonymousCheckBox.isChecked()) {
+
+ // remove preferences
+ setFTPUsername("");
+ setFTPPassword("");
+ } else {
+
+ if (passwordEditText.getText().toString().equals("")) {
+ passwordTextInput.setError(getResources().getString(R.string.field_empty));
+ } else if (usernameEditText.getText().toString().equals("")) {
+ usernameTextInput.setError(getResources().getString(R.string.field_empty));
+ } else {
+
+ // password and username field not empty, let's set them to preferences
+ setFTPUsername(usernameEditText.getText().toString());
+ setFTPPassword(passwordEditText.getText().toString());
+ }
+ }
+
+ if (mSecureCheckBox.isChecked()) {
+ setSecurePreference(true);
+ } else setSecurePreference(false);
+ }
+ });
+
+ loginDialogBuilder.positiveText(getResources().getString(R.string.set).toUpperCase())
+ .negativeText(getResources().getString(R.string.cancel))
+ .build()
+ .show();
+
+ return true;
+ case R.id.ftp_timeout:
+ MaterialDialog.Builder timeoutBuilder = new MaterialDialog.Builder(getActivity());
+
+ timeoutBuilder.title(getResources().getString(R.string.ftp_timeout) + "(" +
+ getResources().getString(R.string.ftp_seconds) + ")");
+ timeoutBuilder.input(String.valueOf(FTPService.DEFAULT_TIMEOUT + " " +
+ getResources().getString(R.string.ftp_seconds)), String.valueOf(getFTPTimeout()),
+ true, new MaterialDialog.InputCallback() {
+ @Override
+ public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
+
+ boolean isInputInteger;
+ try {
+ // try parsing for integer check
+ Integer.parseInt(input.toString());
+ isInputInteger = true;
+ } catch (NumberFormatException e) {
+ isInputInteger = false;
+ }
+
+ if (input.length()==0 || !isInputInteger)
+ setFTPTimeout(FTPService.DEFAULT_TIMEOUT);
+ else
+ setFTPTimeout(Integer.valueOf(input.toString()));
+ }
+ });
+ timeoutBuilder.positiveText(getResources().getString(R.string.set).toUpperCase())
+ .negativeText(getResources().getString(R.string.cancel))
+ .build()
+ .show();
+ return true;
}
return false;
@@ -193,65 +329,51 @@ public class FTPServerFragment extends Fragment {
mainActivity.getMenuInflater().inflate(R.menu.ftp_server_menu, menu);
}
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- rootView = inflater.inflate(R.layout.fragment_ftp, container, false);
- statusText =(TextView) rootView.findViewById(R.id.statusText);
- warningText = (TextView) rootView.findViewById(R.id.warningText);
- ftpAddrText = (TextView) rootView.findViewById(R.id.ftpAddressText);
- ftpBtn = (Button) rootView.findViewById(R.id.startStopButton);
+ private BroadcastReceiver mWifiReceiver = new BroadcastReceiver() {
- ImageView ftpImage = (ImageView)rootView.findViewById(R.id.ftp_image);
-
- //light theme
- if (mainActivity.getAppTheme().equals(AppTheme.LIGHT)) {
- ftpImage.setImageResource(R.drawable.ic_ftp_light);
- } else {
- //dark
- ftpImage.setImageResource(R.drawable.ic_ftp_dark);
- }
-
- ftpBtn.setOnClickListener(new View.OnClickListener() {
-
- @Override
- public void onClick(View v) {
- if (!FTPService.isRunning()) {
- if (FTPService.isConnectedToWifi(getContext()))
- startServer();
- else
- warningText.setText(getResources().getString(R.string.ftp_no_wifi));
- } else {
- stopServer();
- }
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkInfo netInfo = conMan.getActiveNetworkInfo();
+ if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) {
+ // connected to wifi
+ ftpBtn.setEnabled(true);
+ } else {
+ // wifi connection lost
+ stopServer();
+ statusText.setText(spannedStatusNoConnection);
+ ftpBtn.setEnabled(true);
+ ftpBtn.setEnabled(false);
+ ftpBtn.setText(getResources().getString(R.string.start_ftp).toUpperCase());
}
- });
+ }
+ };
- return rootView;
- }
+ private BroadcastReceiver ftpReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action == FTPService.ACTION_STARTED) {
+ if (getSecurePreference()) {
+ statusText.setText(spannedStatusSecure);
+ } else {
+ statusText.setText(spannedStatusConnected);
+ }
+ ftpBtn.setText(getResources().getString(R.string.stop_ftp).toUpperCase());
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- setRetainInstance(true);
- mainActivity.setActionBarTitle(getResources().getString(R.string.ftp));
- mainActivity.floatingActionButton.hideMenuButton(true);
- mainActivity.buttonBarFrame.setVisibility(View.GONE);
- mainActivity.supportInvalidateOptionsMenu();
+ } else if (action == FTPService.ACTION_FAILEDTOSTART) {
+ statusText.setText(spannedStatusNotRunning);
- skin_color = mainActivity.getColorPreference().getColor(ColorUsage.PRIMARY);
- skinTwoColor = mainActivity.getColorPreference().getColor(ColorUsage.PRIMARY_TWO);
+ Toast.makeText(getContext(),
+ getResources().getString(R.string.unknown_error), Toast.LENGTH_LONG).show();
- mainActivity.updateViews(new ColorDrawable(MainActivity.currentTab==1 ?
- skinTwoColor : skin_color));
- }
-
- @Override
- public void onDestroy() {
-
- super.onDestroy();
- }
+ ftpBtn.setText(getResources().getString(R.string.start_ftp).toUpperCase());
+ } else if (action == FTPService.ACTION_STOPPED) {
+ statusText.setText(spannedStatusNotRunning);
+ ftpBtn.setText(getResources().getString(R.string.start_ftp).toUpperCase());
+ }
+ }
+ };
/**
* Sends a broadcast to start ftp server
@@ -270,7 +392,7 @@ public class FTPServerFragment extends Fragment {
@Override
public void onResume() {
super.onResume();
- updateStatus();
+
IntentFilter wifiFilter = new IntentFilter();
wifiFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
getContext().registerReceiver(mWifiReceiver, wifiFilter);
@@ -289,16 +411,79 @@ public class FTPServerFragment extends Fragment {
}
/**
- * Update UI widgets based on connection status
+ * Update UI widgets after change in shared preferences
*/
private void updateStatus() {
- if (FTPService.isRunning()) {
- statusText.setText(getResources().getString(R.string.ftp_status_running));
- ftpBtn.setText(getResources().getString(R.string.stop_ftp));
- ftpAddrText.setText(getFTPAddressString());
+
+ if (!FTPService.isRunning()) {
+ if (!FTPService.isConnectedToWifi(getContext())) {
+ statusText.setText(spannedStatusNoConnection);
+ ftpBtn.setEnabled(false);
+ } else {
+
+ statusText.setText(spannedStatusNotRunning);
+ ftpBtn.setEnabled(true);
+ }
+
+ ftpBtn.setText(getResources().getString(R.string.start_ftp).toUpperCase());
+
} else {
- statusText.setText(getResources().getString(R.string.ftp_status_not_running));
- ftpBtn.setText(getResources().getString(R.string.start_ftp));
+ statusText.setText(spannedStatusConnected);
+ ftpBtn.setEnabled(true);
+ ftpBtn.setText(getResources().getString(R.string.stop_ftp).toUpperCase());
+ }
+
+ username.setText(getResources().getString(R.string.username) + ": " +
+ getUsernameFromPreferences());
+ password.setText(getResources().getString(R.string.password) + ": " +
+ getPasswordFromPreferences());
+ port.setText(getResources().getString(R.string.ftp_port) + ": " +
+ getDefaultPortFromPreferences());
+ sharedPath.setText(getResources().getString(R.string.ftp_path) + ": " +
+ getDefaultPathFromPreferences());
+ }
+
+ private void initLoginDialogViews(View loginDialogView) {
+
+ usernameEditText = (AppCompatEditText) loginDialogView.findViewById(R.id.edit_text_dialog_ftp_username);
+ passwordEditText = (AppCompatEditText) loginDialogView.findViewById(R.id.edit_text_dialog_ftp_password);
+ usernameTextInput = (TextInputLayout) loginDialogView.findViewById(R.id.text_input_dialog_ftp_username);
+ passwordTextInput = (TextInputLayout) loginDialogView.findViewById(R.id.text_input_dialog_ftp_password);
+ mAnonymousCheckBox = (AppCompatCheckBox) loginDialogView.findViewById(R.id.checkbox_ftp_anonymous);
+ mSecureCheckBox = (AppCompatCheckBox) loginDialogView.findViewById(R.id.checkbox_ftp_secure);
+
+ mAnonymousCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (isChecked) {
+ usernameEditText.setEnabled(false);
+ passwordEditText.setEnabled(false);
+ } else {
+ usernameEditText.setEnabled(true);
+ passwordEditText.setEnabled(true);
+ }
+ }
+ });
+
+ // init dialog views as per preferences
+ if (getUsernameFromPreferences().equals(FTPService.DEFAULT_USERNAME)) {
+ mAnonymousCheckBox.setChecked(true);
+ } else {
+
+ usernameEditText.setText(getUsernameFromPreferences());
+ passwordEditText.setText(getPasswordFromPreferences());
+ }
+
+ if (getSecurePreference()) {
+ mSecureCheckBox.setChecked(true);
+ } else mSecureCheckBox.setChecked(false);
+
+ // check if we have a keystore
+ InputStream stream = getResources().openRawResource(R.raw.key);
+ if (stream == null) {
+ mSecureCheckBox.setEnabled(false);
+ mSecureCheckBox.setChecked(false);
+ setSecurePreference(false);
}
}
@@ -308,4 +493,82 @@ public class FTPServerFragment extends Fragment {
private String getFTPAddressString() {
return "ftp://" + FTPService.getLocalInetAddress(getContext()).getHostAddress() + ":" + FTPService.getPort();
}
+
+ private int getDefaultPortFromPreferences() {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ return preferences.getInt(FTPService.PORT_PREFERENCE_KEY, FTPService.DEFAULT_PORT);
+ }
+
+ private String getUsernameFromPreferences() {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ return preferences.getString(FTPService.KEY_PREFERENCE_USERNAME, FTPService.DEFAULT_USERNAME);
+ }
+
+ private String getPasswordFromPreferences() {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+
+ return preferences.getString(FTPService.KEY_PREFERENCE_PASSWORD, "");
+ }
+
+ private String getDefaultPathFromPreferences() {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+
+ return preferences.getString(FTPService.KEY_PREFERENCE_PATH, FTPService.DEFAULT_PATH);
+ }
+
+ private void changeFTPServerPort(int port) {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+
+ preferences.edit()
+ .putInt(FTPService.PORT_PREFERENCE_KEY, port)
+ .apply();
+
+ updateStatus();
+ }
+
+ private void changeFTPServerPath(String path) {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ preferences.edit().putString(FTPService.KEY_PREFERENCE_PATH, path).apply();
+
+ updateStatus();
+
+ }
+
+ private void setFTPUsername(String username) {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+
+ preferences.edit().putString(FTPService.KEY_PREFERENCE_USERNAME, username).apply();
+ updateStatus();
+ }
+
+ private void setFTPPassword(String password) {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+
+ preferences.edit().putString(FTPService.KEY_PREFERENCE_PASSWORD, password).apply();
+ updateStatus();
+ }
+
+ /**
+ * Returns timeout from preferences
+ * @return timeout in seconds
+ */
+ private int getFTPTimeout() {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ return preferences.getInt(FTPService.KEY_PREFERENCE_TIMEOUT, FTPService.DEFAULT_TIMEOUT);
+ }
+
+ private void setFTPTimeout(int seconds) {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ preferences.edit().putInt(FTPService.KEY_PREFERENCE_TIMEOUT, seconds).apply();
+ }
+
+ private boolean getSecurePreference() {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ return preferences.getBoolean(FTPService.KEY_PREFERENCE_SECURE, FTPService.DEFAULT_SECURE);
+ }
+
+ private void setSecurePreference(boolean isSecureEnabled) {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ preferences.edit().putBoolean(FTPService.KEY_PREFERENCE_SECURE, isSecureEnabled).apply();
+ }
}
diff --git a/src/main/java/com/amaze/filemanager/services/ftpservice/FTPService.java b/src/main/java/com/amaze/filemanager/services/ftpservice/FTPService.java
index c95dcd2f0..b9b0dbd7d 100644
--- a/src/main/java/com/amaze/filemanager/services/ftpservice/FTPService.java
+++ b/src/main/java/com/amaze/filemanager/services/ftpservice/FTPService.java
@@ -19,16 +19,23 @@ import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.util.Log;
+import com.amaze.filemanager.R;
+
+import org.apache.commons.compress.utils.IOUtils;
import org.apache.ftpserver.ConnectionConfigFactory;
import org.apache.ftpserver.FtpServer;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.ftplet.Authority;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.listener.ListenerFactory;
+import org.apache.ftpserver.ssl.SslConfigurationFactory;
import org.apache.ftpserver.usermanager.impl.BaseUser;
import org.apache.ftpserver.usermanager.impl.WritePermission;
+import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.lang.reflect.Method;
import java.net.DatagramSocket;
import java.net.InetAddress;
@@ -44,35 +51,17 @@ import java.util.List;
public class FTPService extends Service implements Runnable {
public static final int DEFAULT_PORT = 2211;
+ public static final String DEFAULT_USERNAME = "";
+ public static final int DEFAULT_TIMEOUT = 600; // default timeout, in sec
+ public static final boolean DEFAULT_SECURE = false;
public static final String PORT_PREFERENCE_KEY = "ftpPort";
public static final String KEY_PREFERENCE_PATH = "ftp_path";
+ public static final String KEY_PREFERENCE_USERNAME = "ftp_username";
+ public static final String KEY_PREFERENCE_PASSWORD = "ftp_password";
+ public static final String KEY_PREFERENCE_TIMEOUT = "ftp_timeout";
+ public static final String KEY_PREFERENCE_SECURE = "ftp_secure";
public static final String DEFAULT_PATH = Environment.getExternalStorageDirectory().getAbsolutePath();
- public static int getDefaultPortFromPreferences(SharedPreferences preferences) {
- try {
- return preferences.getInt(PORT_PREFERENCE_KEY, DEFAULT_PORT);
- } catch (ClassCastException ex) {
- Log.e("FtpService", "Default port preference is not an int. Resetting to default.");
- changeFTPServerPort(preferences, DEFAULT_PORT);
-
- return DEFAULT_PORT;
- }
- }
-
- public static String getDefaultPathFromPreferences(SharedPreferences preferences) {
- return preferences.getString(KEY_PREFERENCE_PATH, DEFAULT_PATH);
- }
-
- public static void changeFTPServerPort(SharedPreferences preferences, int port) {
- preferences.edit()
- .putInt(PORT_PREFERENCE_KEY, port)
- .apply();
- }
-
- public static void changeFTPServerPath(SharedPreferences preferences, String path) {
- preferences.edit().putString(KEY_PREFERENCE_PATH, path).apply();
- }
-
private static final String TAG = FTPService.class.getSimpleName();
/**
@@ -109,11 +98,6 @@ public class FTPService extends Service implements Runnable {
}
}
- if (intent != null && intent.getStringExtra("username") != null && intent.getStringExtra("password") != null) {
- username = intent.getStringExtra("username");
- password = intent.getStringExtra("password");
- isPasswordProtected = true;
- }
serverThread = new Thread(this);
serverThread.start();
@@ -136,6 +120,13 @@ public class FTPService extends Service implements Runnable {
serverFactory.setConnectionConfig(connectionConfigFactory.createConnectionConfig());
+ String usernamePreference = preferences.getString(KEY_PREFERENCE_USERNAME, DEFAULT_USERNAME);
+ if (!usernamePreference.equals(DEFAULT_USERNAME)) {
+ username = usernamePreference;
+ password = preferences.getString(KEY_PREFERENCE_PASSWORD, "");
+ isPasswordProtected = true;
+ }
+
BaseUser user = new BaseUser();
if (!isPasswordProtected) {
user.setName("anonymous");
@@ -144,7 +135,7 @@ public class FTPService extends Service implements Runnable {
user.setPassword(password);
}
- user.setHomeDirectory(getDefaultPathFromPreferences(preferences));
+ user.setHomeDirectory(preferences.getString(KEY_PREFERENCE_PATH, DEFAULT_PATH));
List list = new ArrayList<>();
list.add(new WritePermission());
user.setAuthorities(list);
@@ -155,9 +146,36 @@ public class FTPService extends Service implements Runnable {
}
ListenerFactory fac = new ListenerFactory();
- port = getDefaultPortFromPreferences(preferences);
+ port = preferences.getInt(PORT_PREFERENCE_KEY, DEFAULT_PORT);
+
+ if (preferences.getBoolean(KEY_PREFERENCE_SECURE, DEFAULT_SECURE)) {
+ SslConfigurationFactory sslConfigurationFactory = new SslConfigurationFactory();
+
+ File file;
+ try {
+
+ InputStream stream = getResources().openRawResource(R.raw.key);
+ file = File.createTempFile("keystore", "bks");
+ FileOutputStream outputStream = new FileOutputStream(file);
+ IOUtils.copy(stream, outputStream);
+ } catch (Exception e) {
+ e.printStackTrace();
+ file = null;
+ }
+
+ if (file != null) {
+ sslConfigurationFactory.setKeystoreFile(file);
+ sslConfigurationFactory.setKeystorePassword("vishal007");
+ fac.setSslConfiguration(sslConfigurationFactory.createSslConfiguration());
+ fac.setImplicitSsl(true);
+ } else {
+ // no keystore found
+ preferences.edit().putBoolean(KEY_PREFERENCE_SECURE, false).apply();
+ }
+ }
fac.setPort(port);
+ fac.setIdleTimeout(preferences.getInt(KEY_PREFERENCE_TIMEOUT, DEFAULT_TIMEOUT));
serverFactory.addListener("default", fac.createListener());
try {
@@ -211,7 +229,6 @@ public class FTPService extends Service implements Runnable {
SystemClock.elapsedRealtime() + 2000, restartServicePI);
}
-
public static boolean isRunning() {
// return true if and only if a server Thread is running
if (serverThread == null) {
@@ -268,7 +285,6 @@ public class FTPService extends Service implements Runnable {
return connected;
}
-
public static boolean isConnectedToWifi(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
diff --git a/src/main/res/layout/dialog_ftp_login.xml b/src/main/res/layout/dialog_ftp_login.xml
new file mode 100644
index 000000000..e8a6ac578
--- /dev/null
+++ b/src/main/res/layout/dialog_ftp_login.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/fragment_ftp.xml b/src/main/res/layout/fragment_ftp.xml
index cfb3e0b48..1e737fbe2 100644
--- a/src/main/res/layout/fragment_ftp.xml
+++ b/src/main/res/layout/fragment_ftp.xml
@@ -1,45 +1,109 @@
-
+
-
+ android:id="@+id/card_view_ftp"
+ android:layout_margin="@dimen/material_generic"
+ app:cardElevation="@dimen/material_generic_card_elevation"
+ >
+
-
+
-
+
+
-
+
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/smb_dialog.xml b/src/main/res/layout/smb_dialog.xml
index aa646502c..226f5cc0b 100644
--- a/src/main/res/layout/smb_dialog.xml
+++ b/src/main/res/layout/smb_dialog.xml
@@ -9,14 +9,14 @@
app:errorEnabled="true"
android:id="@+id/connectionTIL"
android:layout_height="wrap_content">
-
+
-
+
-
+
-
-
+
+
-
+
\ No newline at end of file
diff --git a/src/main/res/menu/ftp_server_menu.xml b/src/main/res/menu/ftp_server_menu.xml
index 6f3499058..cfa9d835d 100644
--- a/src/main/res/menu/ftp_server_menu.xml
+++ b/src/main/res/menu/ftp_server_menu.xml
@@ -6,4 +6,10 @@
+
+
\ No newline at end of file
diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml
index fbf97ecad..b502e25c2 100644
--- a/src/main/res/values/colors.xml
+++ b/src/main/res/values/colors.xml
@@ -32,7 +32,8 @@
#212121
#424242
#e0e0e0
- #474747
+ #575757
+ #484848
#FF9632
#EEEEEE
diff --git a/src/main/res/values/dimens.xml b/src/main/res/values/dimens.xml
index b2d139261..a0540505c 100644
--- a/src/main/res/values/dimens.xml
+++ b/src/main/res/values/dimens.xml
@@ -26,6 +26,9 @@
72dp
4dp
16sp
+ 20sp
12sp
72dp
+
+ 1dp
\ No newline at end of file
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 86bdeae33..ee9a779c3 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -411,7 +411,7 @@
Amaze FTP Server running
at %s
STOP
- Choose FTP port
+ FTP port
FTP port changed successfully
Invalid port number selected
Primary Color (Right Tab)
@@ -575,8 +575,17 @@
Path to the root of directory to share
Path not a directory
Change
+ Oops, something went wrong!
FTP path changed successfully
Invalid path
+ No Connection
+ Secure Connection
+ Status
+ Port
+ Login
+ Field can\'t be empty
+ Idle timeout
+ Seconds