blob: 8642b7886b8457f58d681bf9327dbe82d6e74fd4 [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éraud37fb52e2020-10-02 19:24:31 -040043import cx.ring.daemon.Ringservice;
Adrien Béraud7307cd52020-04-13 23:29:11 -040044import cx.ring.databinding.FragSettingsBinding;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050045import cx.ring.model.Settings;
Adrien Bérauda373e3b2018-12-12 11:14:50 -050046import cx.ring.mvp.BaseSupportFragment;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050047import cx.ring.mvp.GenericView;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050048
Amirhossein54fb16a2020-10-12 20:56:05 -040049import static cx.ring.daemon.Ringservice.getPluginsEnabled;
50import static cx.ring.daemon.Ringservice.setPluginsEnabled;
51
52/**
53 * TODO: improvements : handle multiples permissions for feature.
54 */
Adrien Béraudb96a7d92020-02-24 11:55:05 -050055public class SettingsFragment extends BaseSupportFragment<SettingsPresenter> implements GenericView<Settings>, ViewTreeObserver.OnScrollChangedListener {
56
57 private static final int SCROLL_DIRECTION_UP = -1;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050058
Adrien Béraud7307cd52020-04-13 23:29:11 -040059 private FragSettingsBinding binding;
Adrien Béraud64320ac2020-06-08 10:30:12 -040060 private Settings currentSettings = null;
Adrien Béraud91f88742019-09-09 00:46:46 -040061
Adrien Bérauda945e9a2020-06-09 15:10:35 -040062 private boolean mIsRefreshingViewFromPresenter = true;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050063
Adrien Béraud7307cd52020-04-13 23:29:11 -040064 @Nullable
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050065 @Override
Adrien Béraud7307cd52020-04-13 23:29:11 -040066 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
67 binding = FragSettingsBinding.inflate(inflater, container, false);
Amirhossein54fb16a2020-10-12 20:56:05 -040068 ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
Adrien Béraud7307cd52020-04-13 23:29:11 -040069 return binding.getRoot();
Hadrien De Sousa73d6dd72017-09-07 10:54:51 -040070 }
71
72 @Override
Adrien Béraud7307cd52020-04-13 23:29:11 -040073 public void onDestroyView() {
74 super.onDestroyView();
75 binding = null;
Hadrien De Sousa73d6dd72017-09-07 10:54:51 -040076 }
77
78 @Override
Adrien Béraudc14d55d2019-01-02 16:33:40 -050079 public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
Thibault Wittemberg89b77c12017-01-26 13:37:30 -050080 setHasOptionsMenu(true);
Hadrien De Sousa73d6dd72017-09-07 10:54:51 -040081 super.onViewCreated(view, savedInstanceState);
Adrien Béraud7307cd52020-04-13 23:29:11 -040082 binding.settingsDarkTheme.setChecked(presenter.getDarkMode());
Amirhossein54fb16a2020-10-12 20:56:05 -040083 binding.settingsPluginsSwitch.setChecked(getPluginsEnabled());
Adrien Béraude4f901a2019-10-25 17:26:30 -040084 if (TextUtils.isEmpty(JamiApplication.getInstance().getPushToken())) {
Adrien Béraud7307cd52020-04-13 23:29:11 -040085 binding.settingsPushNotificationsLayout.setVisibility(View.GONE);
Adrien Béraud6fd9e692018-05-16 17:03:04 -040086 }
Thibault Wittemberg77cf6002016-11-09 16:53:31 -050087 // loading preferences
Hadrien De Sousaf5774ee2017-05-17 14:04:17 -040088 presenter.loadSettings();
Amirhossein54fb16a2020-10-12 20:56:05 -040089 ((HomeActivity) getActivity()).setToolbarTitle(R.string.menu_item_settings);
Adrien Béraudb96a7d92020-02-24 11:55:05 -050090
Adrien Béraud7307cd52020-04-13 23:29:11 -040091 binding.scrollview.getViewTreeObserver().addOnScrollChangedListener(this);
92 binding.settingsDarkTheme.setOnCheckedChangeListener((buttonView, isChecked) -> presenter.setDarkMode(isChecked));
Amirhossein54fb16a2020-10-12 20:56:05 -040093 binding.settingsPluginsSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> setPluginsEnabled(isChecked));
Adrien Béraud7307cd52020-04-13 23:29:11 -040094
95 CompoundButton.OnCheckedChangeListener save = (buttonView, isChecked) -> {
96 if (!mIsRefreshingViewFromPresenter)
97 saveSettings();
98 };
99 binding.settingsPushNotifications.setOnCheckedChangeListener(save);
100 binding.settingsStartup.setOnCheckedChangeListener(save);
101 binding.settingsPersistNotification.setOnCheckedChangeListener(save);
Amirhossein4ae37ef2020-11-30 23:26:27 -0500102 binding.settingsTyping.setOnCheckedChangeListener(save);
Adrien Béraud7307cd52020-04-13 23:29:11 -0400103
104 binding.settingsVideoLayout.setOnClickListener(v -> {
105 HomeActivity activity = (HomeActivity) getActivity();
106 if (activity != null)
107 activity.goToVideoSettings();
108 });
109
110 binding.settingsClearHistory.setOnClickListener(v -> new MaterialAlertDialogBuilder(view.getContext())
111 .setTitle(getString(R.string.clear_history_dialog_title))
112 .setMessage(getString(R.string.clear_history_dialog_message))
113 .setPositiveButton(android.R.string.ok, (dialog, id) -> {
114 // ask the presenter to clear history
115 presenter.clearHistory();
116 Snackbar.make(view,
117 getString(R.string.clear_history_completed),
118 Snackbar.LENGTH_SHORT).show();
119 })
120 .setNegativeButton(android.R.string.cancel, (dialog, id) -> {
121 //~ Empty
122 })
123 .show());
ayounes019267f2020-01-13 15:14:08 -0500124 binding.settingsPluginsLayout.setOnClickListener(v -> {
125 HomeActivity activity = (HomeActivity) getActivity();
Amirhossein54fb16a2020-10-12 20:56:05 -0400126 if (activity != null && getPluginsEnabled()){
ayounes019267f2020-01-13 15:14:08 -0500127 activity.goToPluginsListSettings();
Aline Gondim Santosf781c5b2020-06-26 12:44:44 -0400128 }
ayounes019267f2020-01-13 15:14:08 -0500129 });
Adrien Béraudb96a7d92020-02-24 11:55:05 -0500130 }
131
132 @Override
133 public void onResume() {
134 super.onResume();
Amirhossein54fb16a2020-10-12 20:56:05 -0400135 ((HomeActivity) getActivity()).setToolbarTitle(R.string.menu_item_settings);
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500136 }
137
138 @Override
Adrien Béraud7307cd52020-04-13 23:29:11 -0400139 public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
Thibault Wittemberg89b77c12017-01-26 13:37:30 -0500140 menu.clear();
141 }
142
143 @Override
144 public void onPrepareOptionsMenu(Menu menu) {
145 menu.clear();
146 }
147
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500148 private void saveSettings() {
Adrien Béraud64320ac2020-06-08 10:30:12 -0400149 Settings newSettings = new Settings(currentSettings);
Adrien Béraud7307cd52020-04-13 23:29:11 -0400150 newSettings.setAllowRingOnStartup(binding.settingsStartup.isChecked());
151 newSettings.setAllowPushNotifications(binding.settingsPushNotifications.isChecked());
152 newSettings.setAllowPersistentNotification(binding.settingsPersistNotification.isChecked());
Amirhossein4ae37ef2020-11-30 23:26:27 -0500153 newSettings.setAllowPersistentNotification(binding.settingsPersistNotification.isChecked());
154 newSettings.setAllowTypingIndicator(binding.settingsTyping.isChecked());
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500155
156 // save settings according to UI inputs
Hadrien De Sousaf5774ee2017-05-17 14:04:17 -0400157 presenter.saveSettings(newSettings);
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500158 }
159
Amirhossein54fb16a2020-10-12 20:56:05 -0400160 /**
161 * Presents a Toast explaining why the Read Contacts permission is required to display the devi-
162 * ces contacts in Ring.
163 */
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500164 private void presentReadContactPermissionExplanationToast() {
Amirhossein54fb16a2020-10-12 20:56:05 -0400165 Activity activity = getActivity();
166 if (null != activity) {
167 String toastMessage = getString(R.string.permission_dialog_read_contacts_message);
168 Toast.makeText(activity, toastMessage, Toast.LENGTH_LONG).show();
169 }
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500170 }
171
Amirhossein54fb16a2020-10-12 20:56:05 -0400172 /**
173 * Presents a Toast explaining why the Write Call Log permission is required to enable the cor-
174 * responding feature.
175 */
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500176 private void presentWriteCallLogPermissionExplanationToast() {
Amirhossein54fb16a2020-10-12 20:56:05 -0400177 Activity activity = getActivity();
178 if (null != activity) {
179 String toastMessage = getString(R.string.permission_dialog_write_call_log_message);
180 Toast.makeText(activity, toastMessage, Toast.LENGTH_LONG).show();
181 }
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500182 }
183
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500184 @Override
Adrien Béraud2693eca2018-01-24 16:38:48 -0500185 public void showViewModel(Settings viewModel) {
Adrien Béraud64320ac2020-06-08 10:30:12 -0400186 currentSettings = viewModel;
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500187 mIsRefreshingViewFromPresenter = true;
Adrien Béraud7307cd52020-04-13 23:29:11 -0400188 binding.settingsPushNotifications.setChecked(viewModel.isAllowPushNotifications());
189 binding.settingsPersistNotification.setChecked(viewModel.isAllowPersistentNotification());
Adrien Béraude591bdd2020-05-10 22:31:16 -0400190 binding.settingsStartup.setChecked(viewModel.isAllowOnStartup());
Amirhossein4ae37ef2020-11-30 23:26:27 -0500191 binding.settingsTyping.setChecked(viewModel.isAllowTypingIndicator());
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500192 mIsRefreshingViewFromPresenter = false;
193 }
Adrien Béraudb96a7d92020-02-24 11:55:05 -0500194
195 @Override
196 public void onScrollChanged() {
Adrien Béraud7307cd52020-04-13 23:29:11 -0400197 if (binding != null) {
198 Activity activity = getActivity();
199 if (activity instanceof HomeActivity)
200 ((HomeActivity) activity).setToolbarElevation(binding.scrollview.canScrollVertically(SCROLL_DIRECTION_UP));
Adrien Béraudb96a7d92020-02-24 11:55:05 -0500201 }
202 }
203
Thibault Wittemberg77cf6002016-11-09 16:53:31 -0500204}