Subversion Repositories tpanel

Rev

Blame | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2022 by Andreas Theofilu <andreas@theosys.at>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 */
package org.qtproject.theosys;

import java.util.*;
import java.io.File;

import android.content.ContentResolver;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;

import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.Preference;
import androidx.preference.DropDownPreference;
import androidx.preference.EditTextPreference;
import androidx.preference.ListPreference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.SeekBarPreference;
import androidx.preference.SwitchPreference;

import org.qtproject.theosys.Logger;
import org.qtproject.theosys.UriToPath;

public class SettingsActivity extends AppCompatActivity
{
    static private Intent m_intent = null;
    static private Intent m_intLogFile = null;
    static private EditTextPreference logFilePref = null;
    static private String logFilePath;
    static private String password1Text;
    static private String password2Text;
    static private String password3Text;
    static private String password4Text;
    private static final int CREATE_FILE = 1988;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Logger.log(Logger.HLOG_DEBUG, "SettingsActivity.onCreate()");
        setContentView(R.layout.settings_activity);

        try
        {
            if (savedInstanceState == null)
            {
                getSupportFragmentManager()
                        .beginTransaction()
                        .replace(R.id.settings, new SettingsFragment())
                        .commit();
            }
        }
        catch(Exception e)
        {
            Logger.log(Logger.HLOG_ERROR, "SettingsActivity.onCreate: " + e);
        }

        m_intent = getIntent();
        ActionBar actionBar = getSupportActionBar();

        if (actionBar != null)
        {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setTitle(getString(R.string.title_activity_settings));
        }

        Logger.log(Logger.HLOG_DEBUG, "SettingsActivity.onCreate: finished");
    }

    public static class SettingsFragment extends PreferenceFragmentCompat
    {
        @Override
        public void onDestroyView()
        {
            Logger.log(Logger.HLOG_DEBUG, "onDestroyView: Saving settings ...");
            saveSettings();
            super.onDestroyView();
        }

        public void onViewCreated(View view, Bundle savedInstanceState)
        {
            super.onViewCreated(view, savedInstanceState);
            Logger.log(Logger.HLOG_DEBUG, "SettingsActivity.SettingsFragment.onViewCreated()");

            if (m_intent == null)
            {
                Logger.log(Logger.HLOG_ERROR, "SettingsActivity.SettingsFragment.onViewCreated: Error getting the Intent!");
                return;
            }

            CharSequence[] values = m_intent.getCharSequenceArrayExtra("surfaces");

            if (values != null)
            {
                DropDownPreference surfaces = findPreference("netlinx_surface");

                if (surfaces == null)
                {
                    Logger.log(Logger.HLOG_ERROR, "SettingsActivity.SettingsFragment.onViewCreated: The surface preference \"netlinx_surface\" was not found!");
                    return;
                }

                CharSequence[] entries = new String[values.length];

                for (int i = 0; i < values.length; i++)
                {
                    if (values[i] == null)
                    {
                        Logger.log(Logger.HLOG_WARNING, "SettingsActivity.SettingsFragment.onViewCreated: Index " + String.valueOf(i) + " is not initialized!");
                        continue;
                    }

                    String sf = values[i].toString();
                    int pos = sf.lastIndexOf(".");
                    String name;

                    if (pos >= 0)
                        name = sf.substring(0, pos);
                    else
                        name = sf;

                    entries[i] = name;
                }

                surfaces.setEntries(entries);
                surfaces.setEntryValues(values);
                surfaces.setDefaultValue(values[0]);
            }
            else
                Logger.log(Logger.HLOG_WARNING, "SettingsActivity.SettingsFragment.onViewCreated: No extra data found!");

            // Set the logging states
            Boolean log_info = m_intent.getBooleanExtra("log_info", false);
            Boolean log_warning = m_intent.getBooleanExtra("log_warning", false);
            Boolean log_error = m_intent.getBooleanExtra("log_error", false);
            Boolean log_trace = m_intent.getBooleanExtra("log_trace", false);
            Boolean log_debug = m_intent.getBooleanExtra("log_debug", false);
            Boolean log_file_enabled = m_intent.getBooleanExtra("log_file_enabled", false);
            logFilePath = m_intent.getStringExtra("log_path");

            SwitchPreference logInfo = findPreference("logging_info");

            if (logInfo != null)
                logInfo.setChecked(log_info);
            else
                Logger.log(Logger.HLOG_ERROR, "SettingsActivity.SettingsFragment.onViewCreated: The surface preference \"logging_info\" was not found!");

            SwitchPreference logWarning = findPreference("logging_warning");

            if (logWarning != null)
                logWarning.setChecked(log_warning);
            else
                Logger.log(Logger.HLOG_ERROR, "SettingsActivity.SettingsFragment.onViewCreated: The surface preference \"logging_warning\" was not found!");

            SwitchPreference logError = findPreference("logging_error");

            if (logError != null)
                logError.setChecked(log_error);
            else
                Logger.log(Logger.HLOG_ERROR, "SettingsActivity.SettingsFragment.onViewCreated: The surface preference \"logging_error\" was not found!");

            SwitchPreference logTrace = findPreference("logging_trace");

            if (logTrace != null)
                logTrace.setChecked(log_trace);
            else
                Logger.log(Logger.HLOG_ERROR, "SettingsActivity.SettingsFragment.onViewCreated: The surface preference \"logging_trace\" was not found!");

            SwitchPreference logDebugging = findPreference("logging_debug");

            if (logDebugging != null)
                logDebugging.setChecked(log_debug);
            else
                Logger.log(Logger.HLOG_ERROR, "SettingsActivity.SettingsFragment.onViewCreated: The surface preference \"logging_debug\" was not found!");

            SwitchPreference logFileEnable = findPreference("logging_logfile_enabled");

            if (logFileEnable != null)
                logFileEnable.setChecked(log_file_enabled);

            EditTextPreference logFileText = findPreference("logging_logfile");

            if (logFileText != null)
            {
                logFileText.setText(logFilePath);

                if (logFileEnable != null && !logFileEnable.isChecked())
                    logFileText.setVisible(false);
            }

            EditTextPreference password1 = findPreference("passwords_1");
            EditTextPreference password2 = findPreference("passwords_2");
            EditTextPreference password3 = findPreference("passwords_3");
            EditTextPreference password4 = findPreference("passwords_4");

            if (password1 != null)
            {
                password1Text = m_intent.getStringExtra("password_1");
                password1.setText(password1Text);
                password1.setSummaryProvider(preference -> setAsterisks(password1Text.length()));
            }

            if (password2 != null)
            {
                password2Text = m_intent.getStringExtra("password_2");
                password2.setText(password2Text);
                password2.setSummaryProvider(preference -> setAsterisks(password2Text.length()));
            }

            if (password3 != null)
            {
                password3Text = m_intent.getStringExtra("password_3");
                password3.setText(password3Text);
                password3.setSummaryProvider(preference -> setAsterisks(password3Text.length()));
            }

            if (password4 != null)
            {
                password4Text = m_intent.getStringExtra("password_4");
                password4.setText(password4Text);
                password4.setSummaryProvider(preference -> setAsterisks(password4Text.length()));
            }
        }

        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
        {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);

            EditTextPreference netlinxIp = findPreference("netlinx_ip");

            if (netlinxIp != null)
            {
                netlinxIp.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_TEXT_VARIATION_URI));
                netlinxIp.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "NetLinx IP: " + value);
                    setNetlinxIp(value.toString());
                    return true;
                });
            }

            EditTextPreference netlinxPort = findPreference("netlinx_port");

            if (netlinxPort != null)
            {
                netlinxPort.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_CLASS_NUMBER));
                netlinxPort.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "NetLinx Port: " + value);
                    setNetlinxPort(Integer.parseInt(value.toString()));
                    return true;
                });
            }

            EditTextPreference netlinxChannel = findPreference("netlinx_channel");

            if (netlinxChannel != null)
            {
                netlinxChannel.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_CLASS_NUMBER));
                netlinxChannel.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "NetLinx Channel: " + value);
                    setNetlinxChannel(Integer.parseInt(value.toString()));
                    return true;
                });
            }

            EditTextPreference netlinxType = findPreference("netlinx_type");

            if (netlinxType != null)
            {
                netlinxType.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
                netlinxType.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "NetLinx Type: " + value);
                    setNetlinxType(value.toString());
                    return true;
                });
            }

            EditTextPreference netlinxFtpUser = findPreference("netlinx_ftp_user");

            if (netlinxFtpUser != null)
            {
                netlinxFtpUser.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
                netlinxFtpUser.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "NetLinx User: " + value);
                    setNetlinxFtpUser(value.toString());
                    return true;
                });
            }

            EditTextPreference netlinxPassword = findPreference("netlinx_ftp_password");

            if (netlinxPassword != null)
            {
                netlinxPassword.setOnBindEditTextListener(editText -> {
                    editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                    netlinxPassword.setSummaryProvider(preference -> setAsterisks(editText.getText().toString().length()));
                });

                netlinxPassword.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "NetLinx Password: " + value);
                    setNetlinxFtpPassword(value.toString());
                    return true;
                });
            }

            DropDownPreference netlinxSurface = findPreference("netlinx_surface");

            if (netlinxSurface != null)
            {
                netlinxSurface.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "NetLinx surface: " + value);
                    setNetlinxSurface(value.toString());
                    return true;
                });
            }

            SwitchPreference netlinxFtpPassive = findPreference("netlinx_ftp_passive");

            if (netlinxFtpPassive != null)
            {
                netlinxFtpPassive.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "NetLinx passive: " + value);
                    setNetlinxFtpPassive((Boolean)value);
                    return true;
                });
            }

            // View
            SwitchPreference viewScale = findPreference("view_scale");

            if (viewScale != null)
            {
                viewScale.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "View scale: " + value);
                    setViewScale((Boolean)value);
                    return true;
                });
            }

            SwitchPreference viewToolbar = findPreference("view_toolbar");

            if (viewToolbar != null)
            {
                viewToolbar.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "View toolbar: " + value);
                    setViewToolbar((Boolean)value);
                    return true;
                });
            }

            SwitchPreference viewToolbarForce = findPreference("view_toolbar_force");

            if (viewToolbarForce != null)
            {
                if (viewToolbar != null)
                {
                    if (viewToolbarForce.isChecked())
                        viewToolbar.setVisible(false);
                    else
                        viewToolbar.setVisible(true);
                }

                viewToolbarForce.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "View toolbar force: " + value);

                    if (viewToolbar != null)
                        viewToolbar.setVisible(!(Boolean)value);

                    setViewToolbarForce((Boolean)value);
                    return true;
                });
            }

            SwitchPreference viewRotation = findPreference("view_rotation");

            if (viewRotation != null)
            {
                viewRotation.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "View rotation: " + value);
                    setViewRotation((Boolean)value);
                    return true;
                });
            }
            // Sound
            ListPreference soundSystem = findPreference("sound_system");

            if (soundSystem != null)
            {
                soundSystem.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Sound system: " + value.toString());
                    setSoundSystem(value.toString());
                    return true;
                });
            }

            ListPreference soundSingle = findPreference("sound_single");

            if (soundSingle != null)
            {
                soundSingle.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Sound single: " + value.toString());
                    setSoundSingle(value.toString());
                    return true;
                });
            }

            ListPreference soundDouble = findPreference("sound_double");

            if (soundDouble != null)
            {
                soundDouble.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Sound double: " + value.toString());
                    setSoundDouble(value.toString());
                    return true;
                });
            }

            SwitchPreference soundEnable = findPreference("sound_enable");

            if (soundEnable != null)
            {
                soundEnable.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Sound enable: " + value);
                    setSoundEnable((Boolean)value);
                    return true;
                });
            }

            SeekBarPreference soundVolume = (SeekBarPreference)findPreference("sound_volume");

            if (soundVolume != null)
            {
                soundVolume.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Sound volume: " + value);
                    setSoundVolume((int)value);
                    return true;
                });
            }

            SeekBarPreference soundGain = (SeekBarPreference)findPreference("sound_gain");

            if (soundGain != null)
            {
                soundGain.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Sound gain: " + value);
                    setSoundGain((int)value);
                    return true;
                });
            }

            // SIP
            EditTextPreference sipProxy = findPreference("sip_proxy");

            if (sipProxy != null)
            {
                sipProxy.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_TEXT_VARIATION_URI));
                sipProxy.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "SIP proxy: " + value);
                    setSipProxy(value.toString());
                    return true;
                });
            }

            EditTextPreference sipPort = findPreference("sip_port");

            if (sipPort != null)
            {
                sipProxy.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_CLASS_NUMBER));
                sipProxy.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "SIP port: " + value);
                    setSipPort(Integer.parseInt(value.toString()));
                    return true;
                });
            }

            EditTextPreference sipTlsPort = findPreference("sip_tls_port");

            if (sipTlsPort != null)
            {
                sipProxy.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_CLASS_NUMBER));
                sipProxy.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "SIP TLS port: " + value);
                    setSipTlsPort(Integer.parseInt(value.toString()));
                    return true;
                });
            }

            EditTextPreference sipStun = findPreference("sip_stun");

            if (sipStun != null)
            {
                sipStun.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_TEXT_VARIATION_URI));
                sipStun.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "SIP STUN: " + value);
                    setSipStun(value.toString());
                    return true;
                });
            }

            EditTextPreference sipDomain = findPreference("sip_domain");

            if (sipDomain != null)
            {
                sipDomain.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_TEXT_VARIATION_URI));
                sipDomain.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "SIP somain: " + value);
                    setSipDomain(value.toString());
                    return true;
                });
            }

            EditTextPreference sipUser = findPreference("sip_user");

            if (sipUser != null)
            {
                sipUser.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
                sipUser.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "SIP user: " + value);
                    setSipUser(value.toString());
                    return true;
                });
            }

            EditTextPreference sipPassword = findPreference("sip_password");

            if (sipPassword != null)
            {
                sipPassword.setOnBindEditTextListener(editText -> {
                    editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                    sipPassword.setSummaryProvider(preference -> setAsterisks(editText.getText().toString().length()));
                });

                sipPassword.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "SIP password: " + value);
                    setSipPassword(value.toString());
                    return true;
                });
            }

            SwitchPreference sipIpv4 = findPreference("sip_ipv4");

            if (sipIpv4 != null)
            {
                sipIpv4.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "SIP IPv4: " + value);
                    setSipIpv4((Boolean)value);
                    return true;
                });
            }

            SwitchPreference sipIpv6 = findPreference("sip_ipv6");

            if (sipIpv6 != null)
            {
                sipIpv6.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "SIP IPv6: " + value);
                    setSipIpv6((Boolean)value);
                    return true;
                });
            }

            SwitchPreference sipEnabled = findPreference("sip_enabled");

            if (sipEnabled != null)
            {
                sipEnabled.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "SIP enabled: " + value);
                    setSipEnabled((Boolean)value);
                    return true;
                });
            }

            SwitchPreference sipIphone = findPreference("sip_internal_phone");

            if (sipIphone != null)
            {
                sipIphone.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "SIP internal phone: " + value);
                    setSipIphone((Boolean)value);
                    return true;
                });
            }

            // Logging
            SwitchPreference logInfo = findPreference("logging_info");

            if (logInfo != null)
            {
                logInfo.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Log info: " + value);
                    setLogInfo((Boolean)value);
                    return true;
                });
            }

            SwitchPreference logWarning = findPreference("logging_warning");

            if (logWarning != null)
            {
                logWarning.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Log warning: " + value);
                    setLogWarning((Boolean)value);
                    return true;
                });
            }

            SwitchPreference logError = findPreference("logging_error");

            if (logError != null)
            {
                logError.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Log error: " + value);
                    setLogError((Boolean)value);
                    return true;
                });
            }

            SwitchPreference logTrace = findPreference("logging_trace");

            if (logTrace != null)
            {
                logTrace.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Log trace: " + value);
                    setLogTrace((Boolean)value);
                    return true;
                });
            }

            SwitchPreference logDebug = findPreference("logging_debug");

            if (logDebug != null)
            {
                logDebug.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Log debug: " + value);
                    setLogDebug((Boolean)value);
                    return true;
                });
            }

            SwitchPreference logProfile = findPreference("logging_profile");

            if (logProfile != null)
            {
                logProfile.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Log profile: " + value);
                    setLogProfile((Boolean)value);
                    return true;
                });
            }

            SwitchPreference logFormat = findPreference("logging_long_format");

            if (logFormat != null)
            {
                logFormat.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Log long format: " + value);
                    setLogLongFormat((Boolean)value);
                    return true;
                });
            }

            SwitchPreference logFileEnable = findPreference("logging_logfile_enabled");
            EditTextPreference logFile = findPreference("logging_logfile");

            if (logFileEnable != null)
            {
                logFileEnable.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Log file enabled: " + value);
                    setLogEnableFile((Boolean)value);

                    if ((Boolean)value == true && logFile != null)
                        logFile.setVisible(true);
                    else if (logFile != null)
                        logFile.setVisible(false);

                    return true;
                });
            }

            if (logFile != null)
            {
                logFilePref = logFile;
                logFile.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
                logFile.setOnPreferenceChangeListener((preference, value) -> {
                    Logger.log(Logger.HLOG_DEBUG, "Log file: " + value);

                    if (logFilePath.length() == 0)
                        setLogFile(value.toString());
                    else
                        logFile.setText(logFilePath);

                    return true;
                });
                logFile.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        // Filter filename only, if there is a path also
                        String path = logFile.getText();
                        int index = path.lastIndexOf("/");

                        if (index >= 0)
                        {
                            // First delete the file, if it exists
                            File file = new File(path);
                            file.delete();
                            // Get the file name only
                            path = path.substring(index + 1);
                        }

                        m_intLogFile = new Intent(Intent.ACTION_CREATE_DOCUMENT); // Intent to start File Manager
                        m_intLogFile.addCategory(Intent.CATEGORY_OPENABLE);
                        m_intLogFile.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
                        m_intLogFile.setType("text/*");
                        m_intLogFile.putExtra(Intent.EXTRA_TITLE, path);
                        startActivityForResult(m_intLogFile, CREATE_FILE);
                        Logger.log(Logger.HLOG_DEBUG, "File dialog activity started ...");
                        return true;
                    }
                });
            }

            EditTextPreference passwd1 = findPreference("passwords_1");
            EditTextPreference passwd2 = findPreference("passwords_2");
            EditTextPreference passwd3 = findPreference("passwords_3");
            EditTextPreference passwd4 = findPreference("passwords_4");

            if (passwd1 != null)
            {
                passwd1.setOnBindEditTextListener(editText -> {
                    editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                    passwd1.setSummaryProvider(preference -> setAsterisks(editText.getText().toString().length()));
                });
                passwd1.setOnPreferenceChangeListener((preference, value) -> {
                    setPassword1(value.toString());
                    password1Text = value.toString();
                    return true;
                });
            }

            if (passwd2 != null)
            {
                passwd2.setOnBindEditTextListener(editText -> {
                    editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                    passwd2.setSummaryProvider(preference -> setAsterisks(editText.getText().toString().length()));
                });
                passwd2.setOnPreferenceChangeListener((preference, value) -> {
                    setPassword2(value.toString());
                    password2Text = value.toString();
                    return true;
                });
            }

            if (passwd3 != null)
            {
                passwd3.setOnBindEditTextListener(editText -> {
                    editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                    passwd3.setSummaryProvider(preference -> setAsterisks(editText.getText().toString().length()));
                });
                passwd3.setOnPreferenceChangeListener((preference, value) -> {
                    setPassword3(value.toString());
                    password3Text = value.toString();
                    return true;
                });
            }

            if (passwd4 != null)
            {
                passwd4.setOnBindEditTextListener(editText -> {
                    editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                    passwd4.setSummaryProvider(preference -> setAsterisks(editText.getText().toString().length()));
                });
                passwd4.setOnPreferenceChangeListener((preference, value) -> {
                    setPassword4(value.toString());
                    password4Text = value.toString();
                    return true;
                });
            }
        }

        //return the password in asterisks
        private String setAsterisks(int length)
        {
            StringBuilder sb = new StringBuilder();

            for (int s = 0; s < length; s++)
                sb.append("*");

            return sb.toString();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Logger.log(Logger.HLOG_DEBUG, "SettingsActivity::onActivityResult() [requestCode=" + Integer.toString(requestCode) + ", resultCode=" + Integer.toString(resultCode) + "]");
        //get the new value from Intent data
        if (resultCode == RESULT_OK && data != null)
        {
            Uri uri = data.getData();
            String value = UriToPath.getFileName(uri, getApplicationContext());
            Logger.log(Logger.HLOG_DEBUG, "Translated URI to file: " + value);

            if (logFilePref != null)
                logFilePref.setText(value);

            ContentResolver contentResolver = getContentResolver();
            contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            // We must delete the just created file to ensure it can be accessed
            // by the error logger.
            File file = new File(value);
            file.delete();
            // Now we set the path to the config
            setLogFile(value.toString());
        }
    }

    private static native void setNetlinxIp(String ip);
    private static native void setNetlinxPort(int port);
    private static native void setNetlinxChannel(int channel);
    private static native void setNetlinxType(String type);
    private static native void setNetlinxFtpUser(String user);
    private static native void setNetlinxFtpPassword(String pw);
    private static native void setNetlinxSurface(String surface);
    private static native void setNetlinxFtpPassive(boolean passive);

    private static native void setViewScale(boolean scale);
    private static native void setViewToolbar(boolean bar);
    private static native void setViewToolbarForce(boolean bar);
    private static native void setViewRotation(boolean rotate);

    private static native void setSoundSystem(String sound);
    private static native void setSoundSingle(String sound);
    private static native void setSoundDouble(String sound);
    private static native void setSoundEnable(boolean sound);
    private static native void setSoundVolume(int sound);
    private static native void setSoundGain(int sound);

    private static native void setSipProxy(String sip);
    private static native void setSipPort(int sip);
    private static native void setSipTlsPort(int sip);
    private static native void setSipStun(String sip);
    private static native void setSipDomain(String sip);
    private static native void setSipUser(String sip);
    private static native void setSipPassword(String sip);
    private static native void setSipIpv4(boolean sip);
    private static native void setSipIpv6(boolean sip);
    private static native void setSipEnabled(boolean sip);
    private static native void setSipIphone(boolean sip);

    private static native void setLogInfo(boolean log);
    private static native void setLogWarning(boolean log);
    private static native void setLogError(boolean log);
    private static native void setLogTrace(boolean log);
    private static native void setLogDebug(boolean log);
    private static native void setLogProfile(boolean log);
    private static native void setLogLongFormat(boolean log);
    private static native void setLogEnableFile(boolean log);
    private static native void setLogFile(String log);

    private static native void setPassword1(String pw);
    private static native void setPassword2(String pw);
    private static native void setPassword3(String pw);
    private static native void setPassword4(String pw);

    private static native void saveSettings();
}