diff --git a/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.java b/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.java index 80f2408d1..8eacbd4f6 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.java @@ -23,11 +23,13 @@ package com.nextcloud.talk.activities; import android.annotation.SuppressLint; import android.os.Bundle; import android.util.Log; +import android.view.WindowManager; import android.webkit.SslErrorHandler; import com.nextcloud.talk.R; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.events.CertificateEvent; +import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.ssl.MagicTrustManager; import com.yarolegovich.lovelydialog.LovelyStandardDialog; @@ -53,10 +55,16 @@ public class BaseActivity extends AppCompatActivity { @Inject EventBus eventBus; + @Inject + AppPreferences appPreferences; + @Override protected void onCreate(Bundle savedInstanceState) { NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); super.onCreate(savedInstanceState); + if (appPreferences.getIsScreenSecured()) { + getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + } } public void showCertificateDialog(X509Certificate cert, MagicTrustManager magicTrustManager, diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java index 4b8a61154..644037b32 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java @@ -73,6 +73,7 @@ import com.nextcloud.talk.presenters.MentionAutocompletePresenter; import com.nextcloud.talk.utils.*; import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.database.user.UserUtils; +import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder; import com.otaliastudios.autocomplete.Autocomplete; import com.otaliastudios.autocomplete.AutocompleteCallback; @@ -113,6 +114,8 @@ public class ChatController extends BaseController implements MessagesListAdapte NcApi ncApi; @Inject UserUtils userUtils; + @Inject + AppPreferences appPreferences; @BindView(R.id.messagesListView) MessagesList messagesListView; @BindView(R.id.messageInputView) @@ -152,6 +155,8 @@ public class ChatController extends BaseController implements MessagesListAdapte private boolean isHelloClicked; private boolean isLeavingForConversation; + private boolean isLinkPreviewAllowed; + private static final byte CONTENT_TYPE_SYSTEM_MESSAGE = 1; private boolean wasDetached; @@ -443,6 +448,7 @@ public class ChatController extends BaseController implements MessagesListAdapte ApplicationWideCurrentRoomHolder.getInstance().setInCall(false); ApplicationWideCurrentRoomHolder.getInstance().setUserInRoom(conversationUser); + isLinkPreviewAllowed = appPreferences.getAreLinkPreviewsAllowed(); emojiPopup = EmojiPopup.Builder.fromRootView(view).setOnEmojiPopupShownListener(new OnEmojiPopupShownListener() { @Override @@ -856,8 +862,11 @@ public class ChatController extends BaseController implements MessagesListAdapte countGroupedMessages = 0; } } - chatMessageList.get(i).setBaseUrl(conversationUser.getBaseUrl()); - chatMessageList.get(i).setActiveUserId(conversationUser.getUserId()); + + ChatMessage chatMessage = chatMessageList.get(i); + chatMessage.setLinkPreviewAllowed(isLinkPreviewAllowed); + chatMessage.setBaseUrl(conversationUser.getBaseUrl()); + chatMessage.setActiveUserId(conversationUser.getUserId()); if (globalLastKnownPastMessageId == -1 || chatMessageList.get(i).getJsonMessageId() < globalLastKnownPastMessageId) { globalLastKnownPastMessageId = chatMessageList.get(i).getJsonMessageId(); @@ -882,7 +891,8 @@ public class ChatController extends BaseController implements MessagesListAdapte chatMessage = chatMessageList.get(i); chatMessage.setBaseUrl(conversationUser.getBaseUrl()); - chatMessageList.get(i).setActiveUserId(conversationUser.getUserId()); + chatMessage.setActiveUserId(conversationUser.getUserId()); + chatMessage.setLinkPreviewAllowed(isLinkPreviewAllowed); // if credentials are empty, we're acting as a guest if (TextUtils.isEmpty(credentials) && !TextUtils.isEmpty(myFirstMessage.toString())) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java index 9a1aa4d66..4a2611c76 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/SettingsController.java @@ -31,6 +31,7 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.widget.Checkable; import android.widget.ImageView; import android.widget.TextView; @@ -153,6 +154,15 @@ public class SettingsController extends BaseController { @BindView(R.id.settings_always_vibrate) MaterialSwitchPreference shouldVibrateSwitchPreference; + @BindView(R.id.settings_incognito_keyboard) + MaterialSwitchPreference incognitoKeyboardSwitchPreference; + + @BindView(R.id.settings_screen_security) + MaterialSwitchPreference screenSecuritySwitchPreference; + + @BindView(R.id.settings_link_previews) + MaterialSwitchPreference linkPreviewsSwitchPreference; + @BindView(R.id.message_text) TextView messageText; @@ -173,6 +183,7 @@ public class SettingsController extends BaseController { private OnPreferenceValueChangedListener proxyTypeChangeListener; private OnPreferenceValueChangedListener proxyCredentialsChangeListener; + private OnPreferenceValueChangedListener screenSecurityChangeListener; private Disposable profileQueryDisposable; private Disposable dbQueryDisposable; @@ -198,8 +209,8 @@ public class SettingsController extends BaseController { getCurrentUser(); appPreferences.registerProxyTypeListener(proxyTypeChangeListener = new ProxyTypeChangeListener()); - appPreferences.registerProxyCredentialsListener(proxyCredentialsChangeListener = new - ProxyCredentialsChangeListener()); + appPreferences.registerProxyCredentialsListener(proxyCredentialsChangeListener = new ProxyCredentialsChangeListener()); + appPreferences.registerScreenSecurityListener(screenSecurityChangeListener = new ScreenSecurityChangeListener()); List listWithIntFields = new ArrayList<>(); listWithIntFields.add("proxy_port"); @@ -330,6 +341,11 @@ public class SettingsController extends BaseController { ((Checkable)shouldVibrateSwitchPreference.findViewById(R.id.mp_checkable)).setChecked(appPreferences.getShouldVibrateSetting()); } + ((Checkable)screenSecuritySwitchPreference.findViewById(R.id.mp_checkable)).setChecked(appPreferences.getIsScreenSecured()); + ((Checkable)incognitoKeyboardSwitchPreference.findViewById(R.id.mp_checkable)).setChecked(appPreferences.getIsKeyboardIncognito()); + ((Checkable)linkPreviewsSwitchPreference.findViewById(R.id.mp_checkable)).setChecked(appPreferences.getAreLinkPreviewsAllowed()); + + String ringtoneName = ""; RingtoneSettings ringtoneSettings; if (!TextUtils.isEmpty(appPreferences.getCallRingtoneUri())) { @@ -532,6 +548,7 @@ public class SettingsController extends BaseController { if (appPreferences != null) { appPreferences.unregisterProxyTypeListener(proxyTypeChangeListener); appPreferences.unregisterProxyCredentialsListener(proxyCredentialsChangeListener); + appPreferences.unregisterScreenSecurityListener(screenSecurityChangeListener); } super.onDestroy(); } @@ -594,6 +611,21 @@ public class SettingsController extends BaseController { return getResources().getString(R.string.nc_app_name); } + private class ScreenSecurityChangeListener implements OnPreferenceValueChangedListener { + + @Override + public void onChanged(Boolean newValue) { + if (newValue) { + if (getActivity() != null) { + getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + } + } else { + if (getActivity() != null) { + getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); + } + } + } + } private class ProxyCredentialsChangeListener implements OnPreferenceValueChangedListener { @Override diff --git a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java index 8a618c045..883425636 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java @@ -82,7 +82,7 @@ public class ChatMessage implements IMessage, MessageContentType, MessageContent } } - if (!messageTypesToIgnore.contains(getMessageType())) { + if (!messageTypesToIgnore.contains(getMessageType()) && isLinkPreviewAllowed) { return getMessage().trim(); } @@ -163,6 +163,8 @@ public class ChatMessage implements IMessage, MessageContentType, MessageContent public String activeUserId; @JsonIgnore public Map selectedIndividualHashMap; + @JsonIgnore + public boolean isLinkPreviewAllowed; public Map getSelectedIndividualHashMap() { diff --git a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java index 078160dbb..81968215e 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java +++ b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java @@ -192,6 +192,58 @@ public interface AppPreferences { @RemoveMethod void removeVibrateSetting(); + @KeyByString("screen_security") + @DefaultValue(R.bool.value_false) + boolean getIsScreenSecured(); + + @KeyByString("screen_security") + void setScreenSecurity(boolean value); + + @KeyByString("screen_security") + @RemoveMethod + void removeScreenSecurity(); + + @KeyByString("screen_security") + @RegisterChangeListenerMethod + void registerScreenSecurityListener(OnPreferenceValueChangedListener listener); + + @KeyByString("screen_security") + @UnregisterChangeListenerMethod + void unregisterScreenSecurityListener(OnPreferenceValueChangedListener listener); + + @KeyByString("screen_lock") + @DefaultValue(R.bool.value_false) + boolean getIsScreenLocked(); + + @KeyByString("screen_lock") + void setScreenLock(boolean value); + + @KeyByString("screen_lock") + @RemoveMethod + void removeScreenLock(); + + @KeyByString("incognito_keyboard") + @DefaultValue(R.bool.value_false) + boolean getIsKeyboardIncognito(); + + @KeyByString("incognito_keyboard") + void setIncognitoKeyboard(boolean value); + + @KeyByString("incognito_keyboard") + @RemoveMethod + void removeIncognitoKeyboard(); + + @KeyByString("link_previews") + @DefaultValue(R.bool.value_true) + boolean getAreLinkPreviewsAllowed(); + + @KeyByString("link_previews") + void setLinkPreviewsAllowed(boolean value); + + @KeyByString("link_previews") + @RemoveMethod + void removeLinkPreviews(); + @ClearMethod void clear(); } diff --git a/app/src/main/res/layout/controller_settings.xml b/app/src/main/res/layout/controller_settings.xml index cb0fb571b..206c1c149 100644 --- a/app/src/main/res/layout/controller_settings.xml +++ b/app/src/main/res/layout/controller_settings.xml @@ -142,6 +142,40 @@ + + + + + + + + - true - \ No newline at end of file + false + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c4f8d1a17..9b8fe6c22 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -83,9 +83,26 @@ Librem by feandesign No sound Vibrate - Your phone will vibrate unless it\'s silenced + Phone will unless it\'s silenced notifications_vibrate + Privacy + Screen lock + Lock %1$s with Android screen lock or fingerprint + screen_lock + Screen lock inactivity timeout + None + screen_lock_timeout + Screen security + Prevents screenshots in the recents list and inside the app + screen_security + Screen security + Instructs keyboard to disable personalized learning (without guarantees) + incognito_keyboard + Show link previews + Allows previews of content from received links for supported services + link_previews + No proxy Username