diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/CallToggleListener.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/CallToggleListener.kt index a8042ad3b4..815a5d6050 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/CallToggleListener.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/CallToggleListener.kt @@ -11,7 +11,7 @@ import org.thoughtcrime.securesms.sessionDialog internal class CallToggleListener( private val context: Fragment, - private val setCallback: Function1 + private val setCallback: (Boolean) -> Unit ) : Preference.OnPreferenceChangeListener { override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.java deleted file mode 100644 index e7fbd14f95..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.java +++ /dev/null @@ -1,153 +0,0 @@ -package org.thoughtcrime.securesms.preferences; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.KeyguardManager; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.provider.Settings; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.view.ContextThemeWrapper; -import androidx.preference.Preference; - -import org.session.libsession.utilities.TextSecurePreferences; -import org.thoughtcrime.securesms.ApplicationContext; -import org.thoughtcrime.securesms.components.SwitchPreferenceCompat; -import org.thoughtcrime.securesms.permissions.Permissions; -import org.thoughtcrime.securesms.service.KeyCachingService; -import org.thoughtcrime.securesms.util.CallNotificationBuilder; -import org.thoughtcrime.securesms.util.IntentUtils; - -import network.loki.messenger.BuildConfig; -import network.loki.messenger.R; - -public class PrivacySettingsPreferenceFragment extends ListSummaryPreferenceFragment { - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - } - - @Override - public void onCreate(Bundle paramBundle) { - super.onCreate(paramBundle); - - this.findPreference(TextSecurePreferences.SCREEN_LOCK).setOnPreferenceChangeListener(new ScreenLockListener()); - - this.findPreference(TextSecurePreferences.READ_RECEIPTS_PREF).setOnPreferenceChangeListener(new ReadReceiptToggleListener()); - this.findPreference(TextSecurePreferences.TYPING_INDICATORS).setOnPreferenceChangeListener(new TypingIndicatorsToggleListener()); - this.findPreference(TextSecurePreferences.LINK_PREVIEWS).setOnPreferenceChangeListener(new LinkPreviewToggleListener()); - this.findPreference(TextSecurePreferences.CALL_NOTIFICATIONS_ENABLED).setOnPreferenceChangeListener(new CallToggleListener(this, this::setCall)); - - initializeVisibility(); - } - - private Void setCall(boolean isEnabled) { - ((SwitchPreferenceCompat)findPreference(TextSecurePreferences.CALL_NOTIFICATIONS_ENABLED)).setChecked(isEnabled); - if (isEnabled && !CallNotificationBuilder.areNotificationsEnabled(requireActivity())) { - // show a dialog saying that calls won't work properly if you don't have notifications on at a system level - new AlertDialog.Builder(new ContextThemeWrapper(requireActivity(), R.style.ThemeOverlay_Session_AlertDialog)) - .setTitle(R.string.CallNotificationBuilder_system_notification_title) - .setMessage(R.string.CallNotificationBuilder_system_notification_message) - .setPositiveButton(R.string.activity_notification_settings_title, (d, w) -> { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { - Intent settingsIntent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .putExtra(Settings.EXTRA_APP_PACKAGE, BuildConfig.APPLICATION_ID); - if (IntentUtils.isResolvable(requireContext(), settingsIntent)) { - startActivity(settingsIntent); - } - } else { - Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .setData(Uri.parse("package:"+BuildConfig.APPLICATION_ID)); - if (IntentUtils.isResolvable(requireContext(), settingsIntent)) { - startActivity(settingsIntent); - } - } - d.dismiss(); - }) - .setNeutralButton(R.string.dismiss, (d, w) -> { - // do nothing, user might have broken notifications - d.dismiss(); - }) - .show(); - } - return null; - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults); - } - - @Override - public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) { - addPreferencesFromResource(R.xml.preferences_app_protection); - } - - @Override - public void onResume() { - super.onResume(); - } - - private void initializeVisibility() { - if (TextSecurePreferences.isPasswordDisabled(getContext())) { - KeyguardManager keyguardManager = (KeyguardManager)getContext().getSystemService(Context.KEYGUARD_SERVICE); - if (!keyguardManager.isKeyguardSecure()) { - ((SwitchPreferenceCompat)findPreference(TextSecurePreferences.SCREEN_LOCK)).setChecked(false); - findPreference(TextSecurePreferences.SCREEN_LOCK).setEnabled(false); - } - } else { - findPreference(TextSecurePreferences.SCREEN_LOCK).setVisible(false); - findPreference(TextSecurePreferences.SCREEN_LOCK_TIMEOUT).setVisible(false); - } - } - - private class ScreenLockListener implements Preference.OnPreferenceChangeListener { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - boolean enabled = (Boolean)newValue; - - TextSecurePreferences.setScreenLockEnabled(getContext(), enabled); - - Intent intent = new Intent(getContext(), KeyCachingService.class); - intent.setAction(KeyCachingService.LOCK_TOGGLED_EVENT); - getContext().startService(intent); - return true; - } - } - - private class ReadReceiptToggleListener implements Preference.OnPreferenceChangeListener { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - return true; - } - } - - private class TypingIndicatorsToggleListener implements Preference.OnPreferenceChangeListener { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - boolean enabled = (boolean)newValue; - - if (!enabled) { - ApplicationContext.getInstance(requireContext()).getTypingStatusRepository().clear(); - } - - return true; - } - } - - private class LinkPreviewToggleListener implements Preference.OnPreferenceChangeListener { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - return true; - } - } - -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt new file mode 100644 index 0000000000..10c5336df1 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt @@ -0,0 +1,147 @@ +package org.thoughtcrime.securesms.preferences + +import android.app.AlertDialog +import android.app.KeyguardManager +import android.content.Context +import android.content.DialogInterface +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.Settings +import androidx.appcompat.view.ContextThemeWrapper +import androidx.preference.Preference +import network.loki.messenger.BuildConfig +import network.loki.messenger.R +import org.session.libsession.utilities.TextSecurePreferences +import org.session.libsession.utilities.TextSecurePreferences.Companion.isPasswordDisabled +import org.session.libsession.utilities.TextSecurePreferences.Companion.setScreenLockEnabled +import org.thoughtcrime.securesms.ApplicationContext +import org.thoughtcrime.securesms.components.SwitchPreferenceCompat +import org.thoughtcrime.securesms.permissions.Permissions +import org.thoughtcrime.securesms.service.KeyCachingService +import org.thoughtcrime.securesms.util.CallNotificationBuilder.Companion.areNotificationsEnabled +import org.thoughtcrime.securesms.util.IntentUtils + +class PrivacySettingsPreferenceFragment : ListSummaryPreferenceFragment() { + override fun onCreate(paramBundle: Bundle?) { + super.onCreate(paramBundle) + findPreference(TextSecurePreferences.SCREEN_LOCK)!!.onPreferenceChangeListener = + ScreenLockListener() + findPreference(TextSecurePreferences.READ_RECEIPTS_PREF)!!.onPreferenceChangeListener = + ReadReceiptToggleListener() + findPreference(TextSecurePreferences.TYPING_INDICATORS)!!.onPreferenceChangeListener = + TypingIndicatorsToggleListener() + findPreference(TextSecurePreferences.LINK_PREVIEWS)!!.onPreferenceChangeListener = + LinkPreviewToggleListener() + findPreference(TextSecurePreferences.CALL_NOTIFICATIONS_ENABLED)!!.onPreferenceChangeListener = + CallToggleListener(this) { setCall(it) } + initializeVisibility() + } + + private fun setCall(isEnabled: Boolean) { + (findPreference(TextSecurePreferences.CALL_NOTIFICATIONS_ENABLED) as SwitchPreferenceCompat?)!!.isChecked = + isEnabled + if (isEnabled && !areNotificationsEnabled(requireActivity())) { + // show a dialog saying that calls won't work properly if you don't have notifications on at a system level + AlertDialog.Builder( + ContextThemeWrapper( + requireActivity(), + R.style.ThemeOverlay_Session_AlertDialog + ) + ) + .setTitle(R.string.CallNotificationBuilder_system_notification_title) + .setMessage(R.string.CallNotificationBuilder_system_notification_message) + .setPositiveButton(R.string.activity_notification_settings_title) { d: DialogInterface, w: Int -> + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val settingsIntent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(Settings.EXTRA_APP_PACKAGE, BuildConfig.APPLICATION_ID) + if (IntentUtils.isResolvable(requireContext(), settingsIntent)) { + startActivity(settingsIntent) + } + } else { + val settingsIntent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .setData(Uri.parse("package:" + BuildConfig.APPLICATION_ID)) + if (IntentUtils.isResolvable(requireContext(), settingsIntent)) { + startActivity(settingsIntent) + } + } + d.dismiss() + } + .setNeutralButton(R.string.dismiss) { d: DialogInterface, w: Int -> + // do nothing, user might have broken notifications + d.dismiss() + } + .show() + } + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults) + } + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + addPreferencesFromResource(R.xml.preferences_app_protection) + } + + override fun onResume() { + super.onResume() + } + + private fun initializeVisibility() { + if (isPasswordDisabled(context!!)) { + val keyguardManager = + context!!.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager + if (!keyguardManager.isKeyguardSecure) { + (findPreference(TextSecurePreferences.SCREEN_LOCK) as SwitchPreferenceCompat?)!!.isChecked = + false + findPreference(TextSecurePreferences.SCREEN_LOCK)!!.isEnabled = + false + } + } else { + findPreference(TextSecurePreferences.SCREEN_LOCK)!!.isVisible = false + findPreference(TextSecurePreferences.SCREEN_LOCK_TIMEOUT)!!.isVisible = + false + } + } + + private inner class ScreenLockListener : Preference.OnPreferenceChangeListener { + override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { + val enabled = newValue as Boolean + setScreenLockEnabled(context!!, enabled) + val intent = Intent(context, KeyCachingService::class.java) + intent.action = KeyCachingService.LOCK_TOGGLED_EVENT + context!!.startService(intent) + return true + } + } + + private inner class ReadReceiptToggleListener : Preference.OnPreferenceChangeListener { + override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { + return true + } + } + + private inner class TypingIndicatorsToggleListener : Preference.OnPreferenceChangeListener { + override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { + val enabled = newValue as Boolean + if (!enabled) { + ApplicationContext.getInstance(requireContext()).typingStatusRepository.clear() + } + return true + } + } + + private inner class LinkPreviewToggleListener : Preference.OnPreferenceChangeListener { + override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { + return true + } + } +} \ No newline at end of file