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;
+    }
+
 }