Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 1 | /* |
Adrien Béraud | e552f69 | 2020-11-03 14:30:52 -0500 | [diff] [blame] | 2 | * Copyright (C) 2004-2020 Savoir-faire Linux Inc. |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 3 | * |
| 4 | * Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com> |
| 5 | * Romain Bertozzi <romain.bertozzi@savoirfairelinux.com> |
| 6 | * |
| 7 | * This program is free software; you can redistribute it and/or modify |
| 8 | * it under the terms of the GNU General Public License as published by |
| 9 | * the Free Software Foundation; either version 3 of the License, or |
| 10 | * (at your option) any later version. |
| 11 | * |
| 12 | * This program is distributed in the hope that it will be useful, |
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 | * GNU General Public License for more details. |
| 16 | * |
| 17 | * You should have received a copy of the GNU General Public License |
| 18 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 19 | */ |
| 20 | package cx.ring.settings; |
| 21 | |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 22 | import android.app.Activity; |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 23 | import android.os.Bundle; |
Adrien Béraud | 8bc9510 | 2018-08-25 22:34:51 -0400 | [diff] [blame] | 24 | import androidx.annotation.NonNull; |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 25 | import androidx.annotation.Nullable; |
Adrien Béraud | 91f8874 | 2019-09-09 00:46:46 -0400 | [diff] [blame] | 26 | |
| 27 | import com.google.android.material.dialog.MaterialAlertDialogBuilder; |
Adrien Béraud | 8bc9510 | 2018-08-25 22:34:51 -0400 | [diff] [blame] | 28 | import com.google.android.material.snackbar.Snackbar; |
Adrien Béraud | e4f901a | 2019-10-25 17:26:30 -0400 | [diff] [blame] | 29 | |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 30 | import android.text.TextUtils; |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 31 | import android.view.LayoutInflater; |
Thibault Wittemberg | 89b77c1 | 2017-01-26 13:37:30 -0500 | [diff] [blame] | 32 | import android.view.Menu; |
| 33 | import android.view.MenuInflater; |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 34 | import android.view.View; |
Adrien Béraud | 6fd9e69 | 2018-05-16 17:03:04 -0400 | [diff] [blame] | 35 | import android.view.ViewGroup; |
Adrien Béraud | b96a7d9 | 2020-02-24 11:55:05 -0500 | [diff] [blame] | 36 | import android.view.ViewTreeObserver; |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 37 | import android.widget.CompoundButton; |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 38 | import android.widget.Toast; |
| 39 | |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 40 | import cx.ring.R; |
Adrien Béraud | e4f901a | 2019-10-25 17:26:30 -0400 | [diff] [blame] | 41 | import cx.ring.application.JamiApplication; |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 42 | import cx.ring.client.HomeActivity; |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 43 | import cx.ring.databinding.FragSettingsBinding; |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 44 | import cx.ring.model.Settings; |
Adrien Béraud | a373e3b | 2018-12-12 11:14:50 -0500 | [diff] [blame] | 45 | import cx.ring.mvp.BaseSupportFragment; |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 46 | import cx.ring.mvp.GenericView; |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 47 | |
Amirhossein | 54fb16a | 2020-10-12 20:56:05 -0400 | [diff] [blame] | 48 | import static cx.ring.daemon.Ringservice.getPluginsEnabled; |
| 49 | import static cx.ring.daemon.Ringservice.setPluginsEnabled; |
| 50 | |
| 51 | /** |
| 52 | * TODO: improvements : handle multiples permissions for feature. |
| 53 | */ |
Adrien Béraud | b96a7d9 | 2020-02-24 11:55:05 -0500 | [diff] [blame] | 54 | public class SettingsFragment extends BaseSupportFragment<SettingsPresenter> implements GenericView<Settings>, ViewTreeObserver.OnScrollChangedListener { |
| 55 | |
| 56 | private static final int SCROLL_DIRECTION_UP = -1; |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 57 | |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 58 | private FragSettingsBinding binding; |
Adrien Béraud | 64320ac | 2020-06-08 10:30:12 -0400 | [diff] [blame] | 59 | private Settings currentSettings = null; |
Adrien Béraud | 91f8874 | 2019-09-09 00:46:46 -0400 | [diff] [blame] | 60 | |
Adrien Béraud | a945e9a | 2020-06-09 15:10:35 -0400 | [diff] [blame] | 61 | private boolean mIsRefreshingViewFromPresenter = true; |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 62 | |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 63 | @Nullable |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 64 | @Override |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 65 | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { |
| 66 | binding = FragSettingsBinding.inflate(inflater, container, false); |
Amirhossein | 54fb16a | 2020-10-12 20:56:05 -0400 | [diff] [blame] | 67 | ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this); |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 68 | return binding.getRoot(); |
Hadrien De Sousa | 73d6dd7 | 2017-09-07 10:54:51 -0400 | [diff] [blame] | 69 | } |
| 70 | |
| 71 | @Override |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 72 | public void onDestroyView() { |
| 73 | super.onDestroyView(); |
| 74 | binding = null; |
Hadrien De Sousa | 73d6dd7 | 2017-09-07 10:54:51 -0400 | [diff] [blame] | 75 | } |
| 76 | |
| 77 | @Override |
Adrien Béraud | c14d55d | 2019-01-02 16:33:40 -0500 | [diff] [blame] | 78 | public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { |
Thibault Wittemberg | 89b77c1 | 2017-01-26 13:37:30 -0500 | [diff] [blame] | 79 | setHasOptionsMenu(true); |
Hadrien De Sousa | 73d6dd7 | 2017-09-07 10:54:51 -0400 | [diff] [blame] | 80 | super.onViewCreated(view, savedInstanceState); |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 81 | binding.settingsDarkTheme.setChecked(presenter.getDarkMode()); |
Amirhossein | 54fb16a | 2020-10-12 20:56:05 -0400 | [diff] [blame] | 82 | binding.settingsPluginsSwitch.setChecked(getPluginsEnabled()); |
Adrien Béraud | e4f901a | 2019-10-25 17:26:30 -0400 | [diff] [blame] | 83 | if (TextUtils.isEmpty(JamiApplication.getInstance().getPushToken())) { |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 84 | binding.settingsPushNotificationsLayout.setVisibility(View.GONE); |
Adrien Béraud | 6fd9e69 | 2018-05-16 17:03:04 -0400 | [diff] [blame] | 85 | } |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 86 | // loading preferences |
Hadrien De Sousa | f5774ee | 2017-05-17 14:04:17 -0400 | [diff] [blame] | 87 | presenter.loadSettings(); |
Amirhossein | 54fb16a | 2020-10-12 20:56:05 -0400 | [diff] [blame] | 88 | ((HomeActivity) getActivity()).setToolbarTitle(R.string.menu_item_settings); |
Adrien Béraud | b96a7d9 | 2020-02-24 11:55:05 -0500 | [diff] [blame] | 89 | |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 90 | binding.scrollview.getViewTreeObserver().addOnScrollChangedListener(this); |
| 91 | binding.settingsDarkTheme.setOnCheckedChangeListener((buttonView, isChecked) -> presenter.setDarkMode(isChecked)); |
Amirhossein | 54fb16a | 2020-10-12 20:56:05 -0400 | [diff] [blame] | 92 | binding.settingsPluginsSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> setPluginsEnabled(isChecked)); |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 93 | |
| 94 | CompoundButton.OnCheckedChangeListener save = (buttonView, isChecked) -> { |
| 95 | if (!mIsRefreshingViewFromPresenter) |
| 96 | saveSettings(); |
| 97 | }; |
| 98 | binding.settingsPushNotifications.setOnCheckedChangeListener(save); |
| 99 | binding.settingsStartup.setOnCheckedChangeListener(save); |
| 100 | binding.settingsPersistNotification.setOnCheckedChangeListener(save); |
Amirhossein | 4ae37ef | 2020-11-30 23:26:27 -0500 | [diff] [blame] | 101 | binding.settingsTyping.setOnCheckedChangeListener(save); |
Amirhossein | 85b3f2e | 2020-12-01 13:05:43 -0500 | [diff] [blame] | 102 | binding.settingsRead.setOnCheckedChangeListener(save); |
Amirhossein | 7bb77aa | 2020-12-18 16:30:44 -0500 | [diff] [blame^] | 103 | binding.settingsBlockRecord.setOnCheckedChangeListener(save); |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 104 | |
| 105 | binding.settingsVideoLayout.setOnClickListener(v -> { |
| 106 | HomeActivity activity = (HomeActivity) getActivity(); |
| 107 | if (activity != null) |
| 108 | activity.goToVideoSettings(); |
| 109 | }); |
| 110 | |
| 111 | binding.settingsClearHistory.setOnClickListener(v -> new MaterialAlertDialogBuilder(view.getContext()) |
| 112 | .setTitle(getString(R.string.clear_history_dialog_title)) |
| 113 | .setMessage(getString(R.string.clear_history_dialog_message)) |
| 114 | .setPositiveButton(android.R.string.ok, (dialog, id) -> { |
| 115 | // ask the presenter to clear history |
| 116 | presenter.clearHistory(); |
| 117 | Snackbar.make(view, |
| 118 | getString(R.string.clear_history_completed), |
| 119 | Snackbar.LENGTH_SHORT).show(); |
| 120 | }) |
| 121 | .setNegativeButton(android.R.string.cancel, (dialog, id) -> { |
| 122 | //~ Empty |
| 123 | }) |
| 124 | .show()); |
ayounes | 019267f | 2020-01-13 15:14:08 -0500 | [diff] [blame] | 125 | binding.settingsPluginsLayout.setOnClickListener(v -> { |
| 126 | HomeActivity activity = (HomeActivity) getActivity(); |
Amirhossein | 54fb16a | 2020-10-12 20:56:05 -0400 | [diff] [blame] | 127 | if (activity != null && getPluginsEnabled()){ |
ayounes | 019267f | 2020-01-13 15:14:08 -0500 | [diff] [blame] | 128 | activity.goToPluginsListSettings(); |
Aline Gondim Santos | f781c5b | 2020-06-26 12:44:44 -0400 | [diff] [blame] | 129 | } |
ayounes | 019267f | 2020-01-13 15:14:08 -0500 | [diff] [blame] | 130 | }); |
Adrien Béraud | b96a7d9 | 2020-02-24 11:55:05 -0500 | [diff] [blame] | 131 | } |
| 132 | |
| 133 | @Override |
| 134 | public void onResume() { |
| 135 | super.onResume(); |
Amirhossein | 54fb16a | 2020-10-12 20:56:05 -0400 | [diff] [blame] | 136 | ((HomeActivity) getActivity()).setToolbarTitle(R.string.menu_item_settings); |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 137 | } |
| 138 | |
| 139 | @Override |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 140 | public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) { |
Thibault Wittemberg | 89b77c1 | 2017-01-26 13:37:30 -0500 | [diff] [blame] | 141 | menu.clear(); |
| 142 | } |
| 143 | |
| 144 | @Override |
| 145 | public void onPrepareOptionsMenu(Menu menu) { |
| 146 | menu.clear(); |
| 147 | } |
| 148 | |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 149 | private void saveSettings() { |
Adrien Béraud | 64320ac | 2020-06-08 10:30:12 -0400 | [diff] [blame] | 150 | Settings newSettings = new Settings(currentSettings); |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 151 | newSettings.setAllowRingOnStartup(binding.settingsStartup.isChecked()); |
| 152 | newSettings.setAllowPushNotifications(binding.settingsPushNotifications.isChecked()); |
| 153 | newSettings.setAllowPersistentNotification(binding.settingsPersistNotification.isChecked()); |
Amirhossein | 4ae37ef | 2020-11-30 23:26:27 -0500 | [diff] [blame] | 154 | newSettings.setAllowPersistentNotification(binding.settingsPersistNotification.isChecked()); |
| 155 | newSettings.setAllowTypingIndicator(binding.settingsTyping.isChecked()); |
Amirhossein | 85b3f2e | 2020-12-01 13:05:43 -0500 | [diff] [blame] | 156 | newSettings.setAllowReadIndicator(binding.settingsRead.isChecked()); |
Amirhossein | 7bb77aa | 2020-12-18 16:30:44 -0500 | [diff] [blame^] | 157 | newSettings.setBlockRecordIndicator(binding.settingsBlockRecord.isChecked()); |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 158 | |
| 159 | // save settings according to UI inputs |
Hadrien De Sousa | f5774ee | 2017-05-17 14:04:17 -0400 | [diff] [blame] | 160 | presenter.saveSettings(newSettings); |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 161 | } |
| 162 | |
Amirhossein | 54fb16a | 2020-10-12 20:56:05 -0400 | [diff] [blame] | 163 | /** |
| 164 | * Presents a Toast explaining why the Read Contacts permission is required to display the devi- |
| 165 | * ces contacts in Ring. |
| 166 | */ |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 167 | private void presentReadContactPermissionExplanationToast() { |
Amirhossein | 54fb16a | 2020-10-12 20:56:05 -0400 | [diff] [blame] | 168 | Activity activity = getActivity(); |
| 169 | if (null != activity) { |
| 170 | String toastMessage = getString(R.string.permission_dialog_read_contacts_message); |
| 171 | Toast.makeText(activity, toastMessage, Toast.LENGTH_LONG).show(); |
| 172 | } |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 173 | } |
| 174 | |
Amirhossein | 54fb16a | 2020-10-12 20:56:05 -0400 | [diff] [blame] | 175 | /** |
| 176 | * Presents a Toast explaining why the Write Call Log permission is required to enable the cor- |
| 177 | * responding feature. |
| 178 | */ |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 179 | private void presentWriteCallLogPermissionExplanationToast() { |
Amirhossein | 54fb16a | 2020-10-12 20:56:05 -0400 | [diff] [blame] | 180 | Activity activity = getActivity(); |
| 181 | if (null != activity) { |
| 182 | String toastMessage = getString(R.string.permission_dialog_write_call_log_message); |
| 183 | Toast.makeText(activity, toastMessage, Toast.LENGTH_LONG).show(); |
| 184 | } |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 185 | } |
| 186 | |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 187 | @Override |
Adrien Béraud | 2693eca | 2018-01-24 16:38:48 -0500 | [diff] [blame] | 188 | public void showViewModel(Settings viewModel) { |
Adrien Béraud | 64320ac | 2020-06-08 10:30:12 -0400 | [diff] [blame] | 189 | currentSettings = viewModel; |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 190 | mIsRefreshingViewFromPresenter = true; |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 191 | binding.settingsPushNotifications.setChecked(viewModel.isAllowPushNotifications()); |
| 192 | binding.settingsPersistNotification.setChecked(viewModel.isAllowPersistentNotification()); |
Adrien Béraud | e591bdd | 2020-05-10 22:31:16 -0400 | [diff] [blame] | 193 | binding.settingsStartup.setChecked(viewModel.isAllowOnStartup()); |
Amirhossein | 4ae37ef | 2020-11-30 23:26:27 -0500 | [diff] [blame] | 194 | binding.settingsTyping.setChecked(viewModel.isAllowTypingIndicator()); |
Amirhossein | 85b3f2e | 2020-12-01 13:05:43 -0500 | [diff] [blame] | 195 | binding.settingsRead.setChecked(viewModel.isAllowReadIndicator()); |
Amirhossein | 7bb77aa | 2020-12-18 16:30:44 -0500 | [diff] [blame^] | 196 | binding.settingsBlockRecord.setChecked(viewModel.isRecordingBlocked()); |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 197 | mIsRefreshingViewFromPresenter = false; |
| 198 | } |
Adrien Béraud | b96a7d9 | 2020-02-24 11:55:05 -0500 | [diff] [blame] | 199 | |
| 200 | @Override |
| 201 | public void onScrollChanged() { |
Adrien Béraud | 7307cd5 | 2020-04-13 23:29:11 -0400 | [diff] [blame] | 202 | if (binding != null) { |
| 203 | Activity activity = getActivity(); |
| 204 | if (activity instanceof HomeActivity) |
| 205 | ((HomeActivity) activity).setToolbarElevation(binding.scrollview.canScrollVertically(SCROLL_DIRECTION_UP)); |
Adrien Béraud | b96a7d9 | 2020-02-24 11:55:05 -0500 | [diff] [blame] | 206 | } |
| 207 | } |
| 208 | |
Thibault Wittemberg | 77cf600 | 2016-11-09 16:53:31 -0500 | [diff] [blame] | 209 | } |