settings: block screenshot and recording
Change-Id: I8ab06856e9190961acadd3618d9906dc29aaab39
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
index 8c0c6d6..9827fb6 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
@@ -412,6 +412,11 @@
}
}
+ if (presenter.setBlockRecordStatus()) {
+ binding.videoSurface.setSecure(true);
+ getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
+ }
+
binding.videoSurface.getHolder().setFormat(PixelFormat.RGBA_8888);
binding.videoSurface.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
index 4084b6c..d25c948 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
@@ -48,6 +48,7 @@
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
+import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.ImageView;
import android.widget.RelativeLayout;
@@ -331,6 +332,10 @@
if (animator != null)
animator.setSupportsChangeAnimations(false);
binding.histList.setAdapter(mAdapter);
+
+ if (presenter.isRecordingBlocked()) {
+ getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
+ }
}
@Override
diff --git a/ring-android/app/src/main/java/cx/ring/services/SharedPreferencesServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/SharedPreferencesServiceImpl.java
index c8924f5..f459964 100644
--- a/ring-android/app/src/main/java/cx/ring/services/SharedPreferencesServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/SharedPreferencesServiceImpl.java
@@ -54,6 +54,7 @@
private static final String PREF_PERSISTENT_NOTIFICATION = "persistent_notif";
private static final String PREF_SHOW_TYPING = "persistent_typing";
private static final String PREF_SHOW_READ = "persistent_read";
+ private static final String PREF_BLOCK_RECORD = "persistent_block_record";
private static final String PREF_HW_ENCODING = "video_hwenc";
public static final String PREF_BITRATE = "video_bitrate";
public static final String PREF_RESOLUTION = "video_resolution";
@@ -80,6 +81,7 @@
edit.putBoolean(PREF_PERSISTENT_NOTIFICATION, settings.isAllowPersistentNotification());
edit.putBoolean(PREF_SHOW_TYPING, settings.isAllowTypingIndicator());
edit.putBoolean(PREF_SHOW_READ, settings.isAllowReadIndicator());
+ edit.putBoolean(PREF_BLOCK_RECORD, settings.isRecordingBlocked());
edit.apply();
}
@@ -97,6 +99,7 @@
settings.setAllowPersistentNotification(appPrefs.getBoolean(PREF_PERSISTENT_NOTIFICATION, false));
settings.setAllowTypingIndicator(appPrefs.getBoolean(PREF_SHOW_TYPING, true));
settings.setAllowReadIndicator(appPrefs.getBoolean(PREF_SHOW_READ, true));
+ settings.setBlockRecordIndicator(appPrefs.getBoolean(PREF_BLOCK_RECORD, false));
return settings;
}
diff --git a/ring-android/app/src/main/java/cx/ring/settings/SettingsFragment.java b/ring-android/app/src/main/java/cx/ring/settings/SettingsFragment.java
index fe28344..5abcd9b 100644
--- a/ring-android/app/src/main/java/cx/ring/settings/SettingsFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/settings/SettingsFragment.java
@@ -100,6 +100,7 @@
binding.settingsPersistNotification.setOnCheckedChangeListener(save);
binding.settingsTyping.setOnCheckedChangeListener(save);
binding.settingsRead.setOnCheckedChangeListener(save);
+ binding.settingsBlockRecord.setOnCheckedChangeListener(save);
binding.settingsVideoLayout.setOnClickListener(v -> {
HomeActivity activity = (HomeActivity) getActivity();
@@ -153,6 +154,7 @@
newSettings.setAllowPersistentNotification(binding.settingsPersistNotification.isChecked());
newSettings.setAllowTypingIndicator(binding.settingsTyping.isChecked());
newSettings.setAllowReadIndicator(binding.settingsRead.isChecked());
+ newSettings.setBlockRecordIndicator(binding.settingsBlockRecord.isChecked());
// save settings according to UI inputs
presenter.saveSettings(newSettings);
@@ -191,6 +193,7 @@
binding.settingsStartup.setChecked(viewModel.isAllowOnStartup());
binding.settingsTyping.setChecked(viewModel.isAllowTypingIndicator());
binding.settingsRead.setChecked(viewModel.isAllowReadIndicator());
+ binding.settingsBlockRecord.setChecked(viewModel.isRecordingBlocked());
mIsRefreshingViewFromPresenter = false;
}
diff --git a/ring-android/app/src/main/res/drawable/baseline_stop_screen_share_24dp.xml b/ring-android/app/src/main/res/drawable/baseline_stop_screen_share_24dp.xml
new file mode 100644
index 0000000..ecd1644
--- /dev/null
+++ b/ring-android/app/src/main/res/drawable/baseline_stop_screen_share_24dp.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:pathData="M21.22,18.02l2,2L24,20.02v-2h-2.78zM21.99,16.02l0.01,-10c0,-1.11 -0.9,-2 -2,-2L7.22,4.02l5.23,5.23c0.18,-0.04 0.36,-0.07 0.55,-0.1L13,7.02l4,3.73 -1.58,1.47 5.54,5.54c0.61,-0.33 1.03,-0.99 1.03,-1.74zM2.39,1.73L1.11,3l1.54,1.54c-0.4,0.36 -0.65,0.89 -0.65,1.48v10c0,1.1 0.89,2 2,2L0,18.02v2h18.13l2.71,2.71 1.27,-1.27L2.39,1.73zM7,15.02c0.31,-1.48 0.92,-2.95 2.07,-4.06l1.59,1.59c-1.54,0.38 -2.7,1.18 -3.66,2.47z"
+ android:fillColor="#ffffff"/>
+</vector>
diff --git a/ring-android/app/src/main/res/layout/frag_settings.xml b/ring-android/app/src/main/res/layout/frag_settings.xml
index b585ee0..5832400 100644
--- a/ring-android/app/src/main/res/layout/frag_settings.xml
+++ b/ring-android/app/src/main/res/layout/frag_settings.xml
@@ -348,6 +348,57 @@
</RelativeLayout>
<RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:padding="@dimen/padding_large">
+
+ <ImageView
+ android:id="@+id/system_block_record_image"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/pref_read_summary"
+ android:src="@drawable/baseline_stop_screen_share_24dp"
+ android:layout_alignParentStart="true"
+ app:tint="@color/colorPrimary"
+ android:layout_centerVertical="true"
+ android:layout_marginEnd="32dp"/>
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_toStartOf="@+id/settings_block_record"
+ android:layout_toEndOf="@+id/system_block_record_image"
+ android:orientation="vertical">
+
+ <TextView
+ style="@style/ListPrimary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:lines="1"
+ android:text="@string/pref_block_record_title" />
+
+ <TextView
+ style="@style/ListSecondary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/pref_block_record_summary" />
+
+ </LinearLayout>
+
+ <Switch
+ android:id="@+id/settings_block_record"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:checked="false"
+ android:layout_marginStart="16dp"
+ android:layout_centerVertical="true"/>
+
+ </RelativeLayout>
+
+ <RelativeLayout
android:id="@+id/settings_clear_history"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/ring-android/app/src/main/res/values/strings_preferences.xml b/ring-android/app/src/main/res/values/strings_preferences.xml
index fc86ea0..cc7e48c 100644
--- a/ring-android/app/src/main/res/values/strings_preferences.xml
+++ b/ring-android/app/src/main/res/values/strings_preferences.xml
@@ -56,6 +56,9 @@
<string name="pref_read_title">Enable read receipts</string>
<string name="pref_read_summary">Send and receive receipts indicating that a message have been displayed.</string>
+ <string name="pref_block_record_title">Block screenshot and recording</string>
+ <string name="pref_block_record_summary">Block taking screenshot or record video in conversations</string>
+
<!-- Plugin -->
<string name="pref_plugins_title">Plugins</string>
<string name="pref_plugins_summary">Enable plugins and set their parameters</string>
diff --git a/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java
index 76328fd..89d6746 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java
@@ -39,6 +39,7 @@
import cx.ring.services.ContactService;
import cx.ring.services.DeviceRuntimeService;
import cx.ring.services.HardwareService;
+import cx.ring.services.PreferencesService;
import cx.ring.utils.Log;
import cx.ring.utils.StringUtils;
import io.reactivex.Maybe;
@@ -65,6 +66,7 @@
private Conference mConference;
private final List<SipCall> mPendingCalls = new ArrayList<>();
private final Subject<List<SipCall>> mPendingSubject = BehaviorSubject.createDefault(mPendingCalls);
+ private final PreferencesService mPreferencesService;
private boolean mOnGoingCall = false;
private boolean mAudioOnly = true;
@@ -92,13 +94,15 @@
HardwareService hardwareService,
CallService callService,
DeviceRuntimeService deviceRuntimeService,
- ConversationFacade conversationFacade) {
+ ConversationFacade conversationFacade,
+ PreferencesService preferencesService) {
mAccountService = accountService;
mContactService = contactService;
mHardwareService = hardwareService;
mCallService = callService;
mDeviceRuntimeService = deviceRuntimeService;
mConversationFacade = conversationFacade;
+ mPreferencesService = preferencesService;
}
public void cameraPermissionChanged(boolean isGranted) {
@@ -742,4 +746,9 @@
return;
mHardwareService.switchInput(mConference.getId(), mHardwareService.isPreviewFromFrontCamera());
}
+
+ public boolean setBlockRecordStatus(){
+ return mPreferencesService.getSettings().isRecordingBlocked();
+ }
+
}
diff --git a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
index d145b28..13273fd 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
@@ -85,7 +85,8 @@
HardwareService hardwareService,
ConversationFacade conversationFacade,
VCardService vCardService,
- DeviceRuntimeService deviceRuntimeService, PreferencesService preferencesService) {
+ DeviceRuntimeService deviceRuntimeService,
+ PreferencesService preferencesService) {
mContactService = contactService;
mAccountService = accountService;
mHardwareService = hardwareService;
@@ -133,7 +134,7 @@
}
}));
- getView().setReadIndicatorStatus(setReadIndicatorStatus());
+ getView().setReadIndicatorStatus(showReadIndicator());
}
private void setConversation(final Conversation conversation) {
@@ -435,8 +436,12 @@
return mPreferencesService.getSettings().isAllowTypingIndicator();
}
- private boolean setReadIndicatorStatus() {
+ private boolean showReadIndicator() {
return mPreferencesService.getSettings().isAllowReadIndicator();
}
+ public boolean isRecordingBlocked(){
+ return mPreferencesService.getSettings().isRecordingBlocked();
+ }
+
}
diff --git a/ring-android/libringclient/src/main/java/cx/ring/model/Settings.java b/ring-android/libringclient/src/main/java/cx/ring/model/Settings.java
index 81f95ae..47c9be6 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/model/Settings.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/model/Settings.java
@@ -27,6 +27,7 @@
private boolean mAllowOnStartup;
private boolean mAllowTypingIndicator;
private boolean mAllowReadIndicator;
+ private boolean mBlockRecordIndicator;
private boolean mHwEncoding;
public Settings() {
@@ -41,6 +42,7 @@
mAllowOnStartup = s.mAllowOnStartup;
mAllowTypingIndicator = s.mAllowTypingIndicator;
mAllowReadIndicator = s.mAllowReadIndicator;
+ mBlockRecordIndicator = s.mBlockRecordIndicator;
mHwEncoding = s.mHwEncoding;
}
}
@@ -101,4 +103,12 @@
return mAllowReadIndicator;
}
+ public void setBlockRecordIndicator(boolean checked) {
+ this.mBlockRecordIndicator = checked;
+ }
+
+ public boolean isRecordingBlocked() {
+ return mBlockRecordIndicator;
+ }
+
}