diff --git a/app/src/main/java/org/linphone/LinphoneActivity.java b/app/src/main/java/org/linphone/LinphoneActivity.java index c9e7ae584..7ea2b2d9d 100644 --- a/app/src/main/java/org/linphone/LinphoneActivity.java +++ b/app/src/main/java/org/linphone/LinphoneActivity.java @@ -1532,6 +1532,7 @@ public class LinphoneActivity extends LinphoneGenericActivity LinphoneActivity.instance().goToChatList(); return true; case SETTINGS: + case ACCOUNT_SETTINGS: case ABOUT: hideTopBar(); // just in case LinphoneActivity.instance().goToDialerFragment(); diff --git a/app/src/main/java/org/linphone/settings/AccountPreferencesFragment.java b/app/src/main/java/org/linphone/settings/AccountPreferencesFragment.java index 021f5855b..58a8513ad 100644 --- a/app/src/main/java/org/linphone/settings/AccountPreferencesFragment.java +++ b/app/src/main/java/org/linphone/settings/AccountPreferencesFragment.java @@ -27,6 +27,7 @@ import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceCategory; +import android.preference.PreferenceFragment; import android.view.WindowManager; import java.util.ArrayList; import java.util.List; @@ -44,7 +45,7 @@ import org.linphone.fragments.FragmentsAvailable; import org.linphone.settings.LinphonePreferences.AccountBuilder; import org.linphone.utils.LinphoneUtils; -public class AccountPreferencesFragment extends PreferencesListFragment +public class AccountPreferencesFragment extends PreferenceFragment implements AccountCreatorListener { private int mN; private final OnPreferenceClickListener linkAccountListener = @@ -61,7 +62,7 @@ public class AccountPreferencesFragment extends PreferencesListFragment } }; private boolean mIsNewAccount = false; - private final LinphonePreferences mPrefs; + private LinphonePreferences mPrefs; private final OnPreferenceChangeListener mAvpfRRIntervalChangedListener = new OnPreferenceChangeListener() { @Override @@ -312,11 +313,6 @@ public class AccountPreferencesFragment extends PreferencesListFragment }; private AccountCreator mAccountCreator; - public AccountPreferencesFragment() { - super(R.xml.account_preferences); - mPrefs = LinphonePreferences.instance(); - } - private static boolean isEditTextEmpty(String s) { return s.equals(""); // really empty. } @@ -333,7 +329,9 @@ public class AccountPreferencesFragment extends PreferencesListFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.account_preferences); + mPrefs = LinphonePreferences.instance(); mN = getArguments().getInt("Account", 0); if (mN == mPrefs.getAccountCount()) { mIsNewAccount = true; diff --git a/app/src/main/java/org/linphone/settings/PreferencesListFragment.java b/app/src/main/java/org/linphone/settings/PreferencesListFragment.java deleted file mode 100644 index 3b0205e56..000000000 --- a/app/src/main/java/org/linphone/settings/PreferencesListFragment.java +++ /dev/null @@ -1,286 +0,0 @@ -package org.linphone.settings; - -/* -PreferencesListFragment.java -Copyright (C) 2017 Belledonne Communications, Grenoble, France - -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 2 -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. -*/ - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.ListFragment; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.preference.Preference; -import android.preference.PreferenceGroup; -import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewParent; -import android.widget.ListView; -import android.widget.RelativeLayout; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import org.linphone.R; -import org.linphone.core.tools.Log; - -@SuppressLint("ValidFragment") -public class PreferencesListFragment extends ListFragment { - /** The starting request code given out to preference framework. */ - private static final int FIRST_REQUEST_CODE = 100; - - private static final int MSG_BIND_PREFERENCES = 0; - - private PreferenceManager mPreferenceManager; - private ListView mPreferencesList; - private final Handler mHandler = - new Handler() { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_BIND_PREFERENCES: - bindPreferences(); - break; - } - } - }; - private int mXmlResID; - - PreferencesListFragment(int xmlId) { - mXmlResID = xmlId; - } - - // Must be provided - public PreferencesListFragment() {} - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle b) { - // Hack to correctly display preferences - View view = inflater.inflate(R.layout.settings, null); - - ViewParent p = mPreferencesList.getParent(); - if (p != null) { - ((ViewGroup) p).removeView(mPreferencesList); - } - - RelativeLayout layout = view.findViewById(R.id.topLayout); - layout.addView(mPreferencesList); - - postBindPreferences(); - return view; - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - ViewParent p = mPreferencesList.getParent(); - if (p != null) { - ((ViewGroup) p).removeView(mPreferencesList); - } - } - - @Override - public void onCreate(Bundle bundle) { - super.onCreate(bundle); - - if (bundle != null) { - mXmlResID = bundle.getInt("xml"); - } - - mPreferenceManager = onCreatePreferenceManager(); - mPreferencesList = - (ListView) - LayoutInflater.from(getActivity()) - .inflate(R.layout.preference_list_content, null); - mPreferencesList.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); - addPreferencesFromResource(mXmlResID); - postBindPreferences(); - } - - @Override - public void onStop() { - super.onStop(); - try { - Method m = PreferenceManager.class.getDeclaredMethod("dispatchActivityStop"); - m.setAccessible(true); - m.invoke(mPreferenceManager); - } catch (Exception e) { - Log.e("[PreferencesListFragment] onStop " + e); - } - } - - @Override - public void onDestroy() { - super.onDestroy(); - mPreferencesList = null; - try { - Method m = PreferenceManager.class.getDeclaredMethod("dispatchActivityDestroy"); - m.setAccessible(true); - m.invoke(mPreferenceManager); - } catch (Exception e) { - Log.e("[PreferencesListFragment] onDestroy " + e); - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - outState.putInt("xml", mXmlResID); - super.onSaveInstanceState(outState); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - try { - Method m = - PreferenceManager.class.getDeclaredMethod( - "dispatchActivityResult", int.class, int.class, Intent.class); - m.setAccessible(true); - m.invoke(mPreferenceManager, requestCode, resultCode, data); - } catch (Exception e) { - Log.e("[PreferencesListFragment] onActivityResult " + e); - } - } - - /** - * Posts a message to bind the preferences to the list view. - * - *

Binding late is preferred as any custom preference types created in {@link - * #onCreate(Bundle)} are able to have their views recycled. - */ - private void postBindPreferences() { - if (mHandler.hasMessages(MSG_BIND_PREFERENCES)) return; - mHandler.obtainMessage(MSG_BIND_PREFERENCES).sendToTarget(); - } - - private void bindPreferences() { - final PreferenceScreen preferenceScreen = getPreferenceScreen(); - if (preferenceScreen != null && mPreferencesList != null) { - preferenceScreen.bind(mPreferencesList); - } - } - - /** - * Creates the {@link PreferenceManager}. - * - * @return The {@link PreferenceManager} used by this activity. - */ - private PreferenceManager onCreatePreferenceManager() { - try { - Constructor c = - PreferenceManager.class.getDeclaredConstructor(Activity.class, int.class); - c.setAccessible(true); - return c.newInstance(this.getActivity(), FIRST_REQUEST_CODE); - } catch (Exception e) { - Log.e("[PreferencesListFragment] onCreatePreferenceManager " + e); - return null; - } - } - - /** - * Returns the {@link PreferenceManager} used by this activity. - * - * @return The {@link PreferenceManager}. - */ - PreferenceManager getPreferenceManager() { - return mPreferenceManager; - } - - /** - * Gets the root of the preference hierarchy that this activity is showing. - * - * @return The {@link PreferenceScreen} that is the root of the preference hierarchy. - */ - PreferenceScreen getPreferenceScreen() { - try { - Method m = PreferenceManager.class.getDeclaredMethod("getPreferenceScreen"); - m.setAccessible(true); - return (PreferenceScreen) m.invoke(mPreferenceManager); - } catch (Exception e) { - Log.e("[PreferencesListFragment] getPreferenceScreen " + e); - } - - return null; - } - - /** - * Sets the root of the preference hierarchy that this activity is showing. - * - * @param preferenceScreen The root {@link PreferenceScreen} of the preference hierarchy. - */ - private void setPreferenceScreen(PreferenceScreen preferenceScreen) { - try { - Method m = - PreferenceManager.class.getDeclaredMethod( - "setPreferences", PreferenceScreen.class); - m.setAccessible(true); - boolean result = (Boolean) m.invoke(mPreferenceManager, preferenceScreen); - if (result && preferenceScreen != null) { - postBindPreferences(); - } - } catch (Exception e) { - Log.e("[PreferencesListFragment] setPreferenceScreen " + e); - } - } - - /** - * Inflates the given XML resource and adds the preference hierarchy to the current preference - * hierarchy. - * - * @param preferencesResId The XML resource ID to inflate. - */ - private void addPreferencesFromResource(int preferencesResId) { - try { - Method m = - PreferenceManager.class.getDeclaredMethod( - "inflateFromResource", - Context.class, - int.class, - PreferenceScreen.class); - m.setAccessible(true); - PreferenceScreen prefScreen = - (PreferenceScreen) - m.invoke( - mPreferenceManager, - getActivity(), - preferencesResId, - getPreferenceScreen()); - setPreferenceScreen(prefScreen); - } catch (Exception e) { - Log.e("[PreferencesListFragment] addPreferencesFromResource " + e); - } - } - - /** - * Finds a {@link Preference} based on its key. - * - * @param key The key of the preference to retrieve. - * @return The {@link Preference} with the key, or null. - * @see PreferenceGroup#findPreference(CharSequence) - */ - Preference findPreference(CharSequence key) { - if (mPreferenceManager == null) { - Log.e("[PreferencesListFragment] PreferenceManager is null !"); - return null; - } - return mPreferenceManager.findPreference(key); - } -} diff --git a/app/src/main/java/org/linphone/settings/SettingsFragment.java b/app/src/main/java/org/linphone/settings/SettingsFragment.java index 4e94ebd94..9f9f4b953 100644 --- a/app/src/main/java/org/linphone/settings/SettingsFragment.java +++ b/app/src/main/java/org/linphone/settings/SettingsFragment.java @@ -29,6 +29,7 @@ import android.content.pm.PackageManager; import android.media.AudioManager; import android.net.Uri; import android.os.Build; +import android.os.Bundle; import android.os.Handler; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; @@ -37,6 +38,7 @@ import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceCategory; +import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; import android.provider.Settings; import java.io.File; @@ -65,7 +67,7 @@ import org.linphone.utils.DeviceUtils; import org.linphone.utils.FileUtils; import org.linphone.views.LedPreference; -public class SettingsFragment extends PreferencesListFragment { +public class SettingsFragment extends PreferenceFragment { private LinphonePreferences mPrefs; private final Handler mHandler = new Handler(); private CoreListenerStub mListener; @@ -79,8 +81,10 @@ public class SettingsFragment extends PreferencesListFragment { } }; - public SettingsFragment() { - super(R.xml.preferences); + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.preferences); } private static void setListPreferenceValues( @@ -156,6 +160,27 @@ public class SettingsFragment extends PreferencesListFragment { hideSettings(); } + @Override + public void onResume() { + super.onResume(); + + // Init the settings page interface + initAccounts(); + + if (LinphoneActivity.isInstanciated()) { + LinphoneActivity.instance().selectMenu(FragmentsAvailable.SETTINGS); + } + } + + @Override + public void onPause() { + if (LinphoneActivity.isInstanciated() && LinphoneManager.isInstanciated()) { + if (LinphoneManager.getInstance().getEchoTesterStatus()) stopEchoTester(); + LinphoneActivity.instance().hideTopBar(); + } + super.onPause(); + } + private void removePreviousPreferencesFile() { SharedPreferences.Editor editor = getPreferenceManager().getSharedPreferences().edit(); editor.clear(); @@ -1778,25 +1803,4 @@ public class SettingsFragment extends PreferencesListFragment { } }); } - - @Override - public void onResume() { - super.onResume(); - - // Init the settings page interface - initAccounts(); - - if (LinphoneActivity.isInstanciated()) { - LinphoneActivity.instance().selectMenu(FragmentsAvailable.SETTINGS); - } - } - - @Override - public void onPause() { - if (LinphoneActivity.isInstanciated() && LinphoneManager.isInstanciated()) { - if (LinphoneManager.getInstance().getEchoTesterStatus()) stopEchoTester(); - LinphoneActivity.instance().hideTopBar(); - } - super.onPause(); - } }