blob: 5abcd9b4f0e9c3367f04b7eeac94c03528554bba [file] [log] [blame]
Thibault Wittemberg77cf6002016-11-09 16:53:31 -05001/*
Adrien Béraude552f692020-11-03 14:30:52 -05002 * Copyright (C) 2004-2020 Savoir-faire Linux Inc.
Thibault Wittemberg77cf6002016-11-09 16:53:31 -05003 *
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 */
20package cx.ring.settings;
21
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050022import android.app.Activity;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050023import android.os.Bundle;
Adrien Béraud8bc95102018-08-25 22:34:51 -040024import androidx.annotation.NonNull;
Adrien Béraud7307cd52020-04-13 23:29:11 -040025import androidx.annotation.Nullable;
Adrien Béraud91f88742019-09-09 00:46:46 -040026
27import com.google.android.material.dialog.MaterialAlertDialogBuilder;
Adrien Béraud8bc95102018-08-25 22:34:51 -040028import com.google.android.material.snackbar.Snackbar;
Adrien Béraude4f901a2019-10-25 17:26:30 -040029
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050030import android.text.TextUtils;
Adrien Béraud7307cd52020-04-13 23:29:11 -040031import android.view.LayoutInflater;
Thibault Wittemberg89b77c12017-01-26 13:37:30 -050032import android.view.Menu;
33import android.view.MenuInflater;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050034import android.view.View;
Adrien Béraud6fd9e692018-05-16 17:03:04 -040035import android.view.ViewGroup;
Adrien Béraudb96a7d92020-02-24 11:55:05 -050036import android.view.ViewTreeObserver;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050037import android.widget.CompoundButton;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050038import android.widget.Toast;
39
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050040import cx.ring.R;
Adrien Béraude4f901a2019-10-25 17:26:30 -040041import cx.ring.application.JamiApplication;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050042import cx.ring.client.HomeActivity;
Adrien Béraud7307cd52020-04-13 23:29:11 -040043import cx.ring.databinding.FragSettingsBinding;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050044import cx.ring.model.Settings;
Adrien Bérauda373e3b2018-12-12 11:14:50 -050045import cx.ring.mvp.BaseSupportFragment;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050046import cx.ring.mvp.GenericView;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050047
Amirhossein54fb16a2020-10-12 20:56:05 -040048import static cx.ring.daemon.Ringservice.getPluginsEnabled;
49import static cx.ring.daemon.Ringservice.setPluginsEnabled;
50
51/**
52 * TODO: improvements : handle multiples permissions for feature.
53 */
Adrien Béraudb96a7d92020-02-24 11:55:05 -050054public class SettingsFragment extends BaseSupportFragment<SettingsPresenter> implements GenericView<Settings>, ViewTreeObserver.OnScrollChangedListener {
55
56 private static final int SCROLL_DIRECTION_UP = -1;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050057
Adrien Béraud7307cd52020-04-13 23:29:11 -040058 private FragSettingsBinding binding;
Adrien Béraud64320ac2020-06-08 10:30:12 -040059 private Settings currentSettings = null;
Adrien Béraud91f88742019-09-09 00:46:46 -040060
Adrien Bérauda945e9a2020-06-09 15:10:35 -040061 private boolean mIsRefreshingViewFromPresenter = true;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050062
Adrien Béraud7307cd52020-04-13 23:29:11 -040063 @Nullable
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050064 @Override
Adrien Béraud7307cd52020-04-13 23:29:11 -040065 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
66 binding = FragSettingsBinding.inflate(inflater, container, false);
Amirhossein54fb16a2020-10-12 20:56:05 -040067 ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
Adrien Béraud7307cd52020-04-13 23:29:11 -040068 return binding.getRoot();
Hadrien De Sousa73d6dd72017-09-07 10:54:51 -040069 }
70
71 @Override
Adrien Béraud7307cd52020-04-13 23:29:11 -040072 public void onDestroyView() {
73 super.onDestroyView();
74 binding = null;
Hadrien De Sousa73d6dd72017-09-07 10:54:51 -040075 }
76
77 @Override
Adrien Béraudc14d55d2019-01-02 16:33:40 -050078 public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
Thibault Wittemberg89b77c12017-01-26 13:37:30 -050079 setHasOptionsMenu(true);
Hadrien De Sousa73d6dd72017-09-07 10:54:51 -040080 super.onViewCreated(view, savedInstanceState);
Adrien Béraud7307cd52020-04-13 23:29:11 -040081 binding.settingsDarkTheme.setChecked(presenter.getDarkMode());
Amirhossein54fb16a2020-10-12 20:56:05 -040082 binding.settingsPluginsSwitch.setChecked(getPluginsEnabled());
Adrien Béraude4f901a2019-10-25 17:26:30 -040083 if (TextUtils.isEmpty(JamiApplication.getInstance().getPushToken())) {
Adrien Béraud7307cd52020-04-13 23:29:11 -040084 binding.settingsPushNotificationsLayout.setVisibility(View.GONE);
Adrien Béraud6fd9e692018-05-16 17:03:04 -040085 }
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050086 // loading preferences
Hadrien De Sousaf5774ee2017-05-17 14:04:17 -040087 presenter.loadSettings();
Amirhossein54fb16a2020-10-12 20:56:05 -040088 ((HomeActivity) getActivity()).setToolbarTitle(R.string.menu_item_settings);
Adrien Béraudb96a7d92020-02-24 11:55:05 -050089
Adrien Béraud7307cd52020-04-13 23:29:11 -040090 binding.scrollview.getViewTreeObserver().addOnScrollChangedListener(this);
91 binding.settingsDarkTheme.setOnCheckedChangeListener((buttonView, isChecked) -> presenter.setDarkMode(isChecked));
Amirhossein54fb16a2020-10-12 20:56:05 -040092 binding.settingsPluginsSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> setPluginsEnabled(isChecked));
Adrien Béraud7307cd52020-04-13 23:29:11 -040093
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);
Amirhossein4ae37ef2020-11-30 23:26:27 -0500101 binding.settingsTyping.setOnCheckedChangeListener(save);
Amirhossein85b3f2e2020-12-01 13:05:43 -0500102 binding.settingsRead.setOnCheckedChangeListener(save);
Amirhossein7bb77aa2020-12-18 16:30:44 -0500103 binding.settingsBlockRecord.setOnCheckedChangeListener(save);
Adrien Béraud7307cd52020-04-13 23:29:11 -0400104
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());
ayounes019267f2020-01-13 15:14:08 -0500125 binding.settingsPluginsLayout.setOnClickListener(v -> {
126 HomeActivity activity = (HomeActivity) getActivity();
Amirhossein54fb16a2020-10-12 20:56:05 -0400127 if (activity != null && getPluginsEnabled()){
ayounes019267f2020-01-13 15:14:08 -0500128 activity.goToPluginsListSettings();
Aline Gondim Santosf781c5b2020-06-26 12:44:44 -0400129 }
ayounes019267f2020-01-13 15:14:08 -0500130 });
Adrien Béraudb96a7d92020-02-24 11:55:05 -0500131 }
132
133 @Override
134 public void onResume() {
135 super.onResume();
Amirhossein54fb16a2020-10-12 20:56:05 -0400136 ((HomeActivity) getActivity()).setToolbarTitle(R.string.menu_item_settings);
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500137 }
138
139 @Override
Adrien Béraud7307cd52020-04-13 23:29:11 -0400140 public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
Thibault Wittemberg89b77c12017-01-26 13:37:30 -0500141 menu.clear();
142 }
143
144 @Override
145 public void onPrepareOptionsMenu(Menu menu) {
146 menu.clear();
147 }
148
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500149 private void saveSettings() {
Adrien Béraud64320ac2020-06-08 10:30:12 -0400150 Settings newSettings = new Settings(currentSettings);
Adrien Béraud7307cd52020-04-13 23:29:11 -0400151 newSettings.setAllowRingOnStartup(binding.settingsStartup.isChecked());
152 newSettings.setAllowPushNotifications(binding.settingsPushNotifications.isChecked());
153 newSettings.setAllowPersistentNotification(binding.settingsPersistNotification.isChecked());
Amirhossein4ae37ef2020-11-30 23:26:27 -0500154 newSettings.setAllowPersistentNotification(binding.settingsPersistNotification.isChecked());
155 newSettings.setAllowTypingIndicator(binding.settingsTyping.isChecked());
Amirhossein85b3f2e2020-12-01 13:05:43 -0500156 newSettings.setAllowReadIndicator(binding.settingsRead.isChecked());
Amirhossein7bb77aa2020-12-18 16:30:44 -0500157 newSettings.setBlockRecordIndicator(binding.settingsBlockRecord.isChecked());
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500158
159 // save settings according to UI inputs
Hadrien De Sousaf5774ee2017-05-17 14:04:17 -0400160 presenter.saveSettings(newSettings);
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500161 }
162
Amirhossein54fb16a2020-10-12 20:56:05 -0400163 /**
164 * Presents a Toast explaining why the Read Contacts permission is required to display the devi-
165 * ces contacts in Ring.
166 */
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500167 private void presentReadContactPermissionExplanationToast() {
Amirhossein54fb16a2020-10-12 20:56:05 -0400168 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 Wittemberg77cf6002016-11-09 16:53:31 -0500173 }
174
Amirhossein54fb16a2020-10-12 20:56:05 -0400175 /**
176 * Presents a Toast explaining why the Write Call Log permission is required to enable the cor-
177 * responding feature.
178 */
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500179 private void presentWriteCallLogPermissionExplanationToast() {
Amirhossein54fb16a2020-10-12 20:56:05 -0400180 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 Wittemberg77cf6002016-11-09 16:53:31 -0500185 }
186
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500187 @Override
Adrien Béraud2693eca2018-01-24 16:38:48 -0500188 public void showViewModel(Settings viewModel) {
Adrien Béraud64320ac2020-06-08 10:30:12 -0400189 currentSettings = viewModel;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500190 mIsRefreshingViewFromPresenter = true;
Adrien Béraud7307cd52020-04-13 23:29:11 -0400191 binding.settingsPushNotifications.setChecked(viewModel.isAllowPushNotifications());
192 binding.settingsPersistNotification.setChecked(viewModel.isAllowPersistentNotification());
Adrien Béraude591bdd2020-05-10 22:31:16 -0400193 binding.settingsStartup.setChecked(viewModel.isAllowOnStartup());
Amirhossein4ae37ef2020-11-30 23:26:27 -0500194 binding.settingsTyping.setChecked(viewModel.isAllowTypingIndicator());
Amirhossein85b3f2e2020-12-01 13:05:43 -0500195 binding.settingsRead.setChecked(viewModel.isAllowReadIndicator());
Amirhossein7bb77aa2020-12-18 16:30:44 -0500196 binding.settingsBlockRecord.setChecked(viewModel.isRecordingBlocked());
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500197 mIsRefreshingViewFromPresenter = false;
198 }
Adrien Béraudb96a7d92020-02-24 11:55:05 -0500199
200 @Override
201 public void onScrollChanged() {
Adrien Béraud7307cd52020-04-13 23:29:11 -0400202 if (binding != null) {
203 Activity activity = getActivity();
204 if (activity instanceof HomeActivity)
205 ((HomeActivity) activity).setToolbarElevation(binding.scrollview.canScrollVertically(SCROLL_DIRECTION_UP));
Adrien Béraudb96a7d92020-02-24 11:55:05 -0500206 }
207 }
208
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500209}