Parcourir la source

project refactor

tama il y a 9 mois
Parent
commit
0727daff87

+ 1 - 1
NexilisSampleCode/app/proguard-rules.pro

@@ -38,7 +38,7 @@
 -keep public class * implements com.bumptech.esglide.module.GlideModule
 -keep public class * extends com.bumptech.esglide.module.AppGlideModule
 -keep public enum com.bumptech.glide.load.ImageHeaderParser$** { **[] $VALUES; public *; }
--keep public class io.nexilis.service.** { *; }
+-keep public class io.nexilis.ui.** { *; }
 # **********************************************************************************************************
 -keep class net.zetetic.database.sqlcipher.** { *; }
 

+ 7 - 7
NexilisSampleCode/app/src/main/java/com/example/nexilissamplecodeburger/MainActivity.java

@@ -11,13 +11,13 @@ import android.webkit.WebSettings;
 import android.webkit.WebView;
 import android.widget.ImageView;
 import android.widget.Toast;
-import io.nexilis.service.API;
-import io.nexilis.service.Callback;
-import io.nexilis.service.utils.callback.GeneralCallback;
-import io.nexilis.service.utils.callback.SimCardDetectionCallback;
-import io.nexilis.service.utils.xthunder.FloatingButton;
-import io.nexilis.service.utils.xthunder.FloatingButtonVar;
-import io.security.streamshield.SecurityShield;
+import io.nexilis.ui.API;
+import io.nexilis.ui.Callback;
+import io.nexilis.ui.utils.callback.GeneralCallback;
+import io.nexilis.ui.utils.callback.SimCardDetectionCallback;
+import io.nexilis.ui.utils.xthunder.FloatingButton;
+import io.nexilis.ui.utils.xthunder.FloatingButtonVar;
+import io.nexilis.ss.SecurityShield;
 
 public class MainActivity extends AppCompatActivity {
 

+ 1 - 1
NexilisSampleCodeFlutter-Android/android/app/proguard-rules.pro

@@ -38,7 +38,7 @@
 -keep public class * implements com.bumptech.esglide.module.GlideModule
 -keep public class * extends com.bumptech.esglide.module.AppGlideModule
 -keep public enum com.bumptech.glide.load.ImageHeaderParser$** { **[] $VALUES; public *; }
--keep public class io.nexilis.service.** { *; }
+-keep public class io.nexilis.ui.** { *; }
 # **********************************************************************************************************
 -keep class net.zetetic.database.sqlcipher.** { *; }
 

+ 6 - 6
NexilisSampleCodeFlutter-Android/android/app/src/main/java/com/example/paliolitesamplecodeflutter/MainActivity.java

@@ -12,11 +12,11 @@ import java.util.ArrayList;
 import io.flutter.embedding.android.FlutterActivity;
 import io.flutter.embedding.engine.FlutterEngine;
 import io.flutter.plugin.common.MethodChannel;
-import io.nexilis.service.API;
-import io.nexilis.service.Callback;
-import io.nexilis.service.utils.callback.SimCardDetectionCallback;
-import io.nexilis.service.utils.xthunder.FloatingButton;
-import io.security.streamshield.SecurityShield;
+import io.nexilis.ui.API;
+import io.nexilis.ui.Callback;
+import io.nexilis.ui.utils.callback.SimCardDetectionCallback;
+import io.nexilis.ui.utils.xthunder.FloatingButton;
+import io.nexilis.ss.SecurityShield;
 
 public class MainActivity extends FlutterActivity {
     private static final String CHANNEL = "nativeChannel";
@@ -75,7 +75,7 @@ public class MainActivity extends FlutterActivity {
                     @Override
                     public void run() {
                         //FLOATING
-                        Toast.makeText(getBaseContext(), "Your User ID: " + NexilisUserID + " : " + getString(io.nexilis.service.R.string.pb_loading), Toast.LENGTH_LONG).show();
+                        Toast.makeText(getBaseContext(), "Your User ID: " + NexilisUserID + " : " + getString(io.nexilis.ui.R.string.pb_loading), Toast.LENGTH_LONG).show();
                     }
                 });
             }

+ 2 - 2
NexilisSampleCodeFlutter-iOS/android/app/src/main/java/com/example/paliolitesamplecodeflutter/MainActivity.java

@@ -11,8 +11,8 @@ import java.util.Map;
 import io.flutter.embedding.android.FlutterActivity;
 import io.flutter.embedding.engine.FlutterEngine;
 import io.flutter.plugin.common.MethodChannel;
-import io.nexilis.service.API;
-import io.nexilis.service.Callback;
+import io.nexilis.ui.API;
+import io.nexilis.ui.Callback;
 
 public class MainActivity extends FlutterActivity {
     private static final String CHANNEL = "nativeChannel";

+ 1 - 1
NexilisSampleCodeIonic-Android/android/app/proguard-rules.pro

@@ -38,7 +38,7 @@
 -keep public class * implements com.bumptech.esglide.module.GlideModule
 -keep public class * extends com.bumptech.esglide.module.AppGlideModule
 -keep public enum com.bumptech.glide.load.ImageHeaderParser$** { **[] $VALUES; public *; }
--keep public class io.nexilis.service.** { *; }
+-keep public class io.nexilis.ui.** { *; }
 # **********************************************************************************************************
 -keep class net.zetetic.database.sqlcipher.** { *; }
 

+ 6 - 6
NexilisSampleCodeIonic-Android/android/app/src/main/java/com/example/nexilissamplecodeionic/MainActivity.java

@@ -7,11 +7,11 @@ import android.widget.Toast;
 
 import com.getcapacitor.BridgeActivity;
 
-import io.nexilis.service.API;
-import io.nexilis.service.Callback;
-import io.nexilis.service.utils.callback.SimCardDetectionCallback;
-import io.nexilis.service.utils.xthunder.FloatingButton;
-import io.security.streamshield.SecurityShield;
+import io.nexilis.ui.API;
+import io.nexilis.ui.Callback;
+import io.nexilis.ui.utils.callback.SimCardDetectionCallback;
+import io.nexilis.ui.utils.xthunder.FloatingButton;
+import io.nexilis.ss.SecurityShield;
 
 public class MainActivity extends BridgeActivity {
   @Override
@@ -68,7 +68,7 @@ public class MainActivity extends BridgeActivity {
           @Override
           public void run() {
             //FLOATING
-            Toast.makeText(getBaseContext(), "Your User ID: " + NexilisUserID + " : " + getString(io.nexilis.service.R.string.pb_loading), Toast.LENGTH_LONG).show();
+            Toast.makeText(getBaseContext(), "Your User ID: " + NexilisUserID + " : " + getString(io.nexilis.ui.R.string.pb_loading), Toast.LENGTH_LONG).show();
           }
         });
       }

+ 1 - 1
NexilisSampleCodeIonic-Android/android/app/src/main/java/com/example/nexilissamplecodeionic/NativePlugin.java

@@ -6,7 +6,7 @@ import com.getcapacitor.PluginCall;
 import com.getcapacitor.PluginMethod;
 import com.getcapacitor.annotation.CapacitorPlugin;
 
-import io.nexilis.service.API;
+import io.nexilis.ui.API;
 
 @CapacitorPlugin(name = "NativeCap")
 public class NativePlugin extends Plugin {

+ 2 - 2
NexilisSampleCodeIonic-iOS/android/app/src/main/java/com/example/paliolitesamplecodeionic/MainActivity.java

@@ -5,8 +5,8 @@ import android.widget.Toast;
 
 import com.getcapacitor.BridgeActivity;
 
-import io.nexilis.service.API;
-import io.nexilis.service.Callback;
+import io.nexilis.ui.API;
+import io.nexilis.ui.Callback;
 
 public class MainActivity extends BridgeActivity {
   @Override

+ 1 - 1
NexilisSampleCodeIonic-iOS/android/app/src/main/java/com/example/paliolitesamplecodeionic/NativePlugin.java

@@ -6,7 +6,7 @@ import com.getcapacitor.PluginCall;
 import com.getcapacitor.PluginMethod;
 import com.getcapacitor.annotation.CapacitorPlugin;
 
-import io.nexilis.service.API;
+import io.nexilis.ui.API;
 
 @CapacitorPlugin(name = "NativeCap")
 public class NativePlugin extends Plugin {

+ 1 - 1
NexilisSampleCodeReact-Android/android/app/src/main/java/com/nxsample/CallNative.java

@@ -7,7 +7,7 @@ import com.facebook.react.bridge.ReactApplicationContext;
 import com.facebook.react.bridge.ReactContextBaseJavaModule;
 import com.facebook.react.bridge.ReactMethod;
 
-import io.nexilis.service.API;
+import io.nexilis.ui.API;
 
 public class CallNative extends ReactContextBaseJavaModule {
 

+ 4 - 4
NexilisSampleCodeReact-Android/android/app/src/main/java/com/nxsample/MainActivity.kt

@@ -6,10 +6,10 @@ import com.facebook.react.ReactActivity
 import com.facebook.react.ReactActivityDelegate
 import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
 import com.facebook.react.defaults.DefaultReactActivityDelegate
-import io.nexilis.service.API
-import io.nexilis.service.Callback
-import io.nexilis.service.R
-import io.security.streamshield.SecurityShield
+import io.nexilis.ui.API
+import io.nexilis.ui.Callback
+import io.nexilis.ui.R
+import io.nexilis.ss.SecurityShield
 
 class MainActivity : ReactActivity() {
 

+ 15 - 15
NexilisSampleCodeShield/app/proguard-rules.pro

@@ -58,20 +58,20 @@
 -keep public class * extends com.bumptech.glide.module.AppGlideModule
 -keep public enum com.bumptech.glide.load.ImageHeaderParser$** { **[] $VALUES; public *; }
 
-#-keep public class io.nexilis.service.** { *; }
--keep public class io.nexilis.service.API { *; }
--keep public class io.nexilis.service.Callback { *; }
--keep public class io.nexilis.service.utils.utility.** { *; }
--keep public class io.nexilis.service.utils.callback.** { *; }
--keep public class io.nexilis.service.activity.** { *; }
--keep public class io.nexilis.service.service.** { *; }
--keep public class io.nexilis.service.utils.SharedObj { *; }
-#-keep public class io.nexilis.service.utils.xthunder.MABController { *; }
-#-keep public class io.nexilis.service.thirdps.mnv.MnVCallback { *; }
--keep public class io.nexilis.service.utils.xthunder.FloatingButton { *; }
--keep public enum io.nexilis.service.utils.xthunder.FloatingButton$** { **[] $VALUES; public *; }
--keep public class io.nexilis.service.utils.xthunder.FeatureBuilder { *; }
--keep public enum io.nexilis.service.utils.xthunder.FeatureBuilder$** { **[] $VALUES; public *; }
+#-keep public class io.nexilis.ui.** { *; }
+-keep public class io.nexilis.ui.API { *; }
+-keep public class io.nexilis.ui.Callback { *; }
+-keep public class io.nexilis.ui.utils.utility.** { *; }
+-keep public class io.nexilis.ui.utils.callback.** { *; }
+-keep public class io.nexilis.ui.activity.** { *; }
+-keep public class io.nexilis.ui.service.** { *; }
+-keep public class io.nexilis.ui.utils.SharedObj { *; }
+#-keep public class io.nexilis.ui.utils.xthunder.MABController { *; }
+#-keep public class io.nexilis.ui.thirdps.mnv.MnVCallback { *; }
+-keep public class io.nexilis.ui.utils.xthunder.FloatingButton { *; }
+-keep public enum io.nexilis.ui.utils.xthunder.FloatingButton$** { **[] $VALUES; public *; }
+-keep public class io.nexilis.ui.utils.xthunder.FeatureBuilder { *; }
+-keep public enum io.nexilis.ui.utils.xthunder.FeatureBuilder$** { **[] $VALUES; public *; }
 # Kebutuhan untuk MAB
 #-include proguard-mab.pro
 
@@ -80,7 +80,7 @@
 -keep public class org.apache.harmony.** { *; }
 
 
--keepclassmembers class io.nexilis.service.utils.xthunder.JSInterface {
+-keepclassmembers class io.nexilis.ui.utils.xthunder.JSInterface {
    public *;
 }
 

+ 1 - 1
NexilisSampleCodeShield/app/src/main/java/com/example/app/MainActivity.java

@@ -8,7 +8,7 @@ import androidx.core.graphics.Insets;
 import androidx.core.view.ViewCompat;
 import androidx.core.view.WindowInsetsCompat;
 
-import io.security.streamshield.SecurityShield;
+import io.nexilis.ss.SecurityShield;
 public class MainActivity extends AppCompatActivity {
 
     @Override

+ 274 - 15
main-embed.py

@@ -293,14 +293,14 @@ def write_android_menu(xml_menu_path: str, features: dict, security: dict):
                     f.write(indented_str(1, "<item"))
                     f.write(indented_str(2, 'android:id="@+id/action_news_update"'))
                     f.write(indented_str(2, f'android:orderInCategory="{n}"'))
-                    f.write(indented_str(2, 'android:title="News & Update"'))
+                    f.write(indented_str(2, 'android:title="News and Update"'))
                     f.write(indented_str(2, 'app:showAsAction="never" />'))
                     n = n + 1
                 else:
                     f.write(indented_str(1, "<!-- <item"))
                     f.write(indented_str(2, 'android:id="@+id/action_news_update"'))
                     f.write(indented_str(2, f'android:orderInCategory="{n}"'))
-                    f.write(indented_str(2, 'android:title="News & Update"'))
+                    f.write(indented_str(2, 'android:title="News and Update"'))
                     f.write(indented_str(2, 'app:showAsAction="never" /> -->'))
                     n = n + 1
                 if features["contact_list"]["status"]:
@@ -331,6 +331,34 @@ def write_android_menu(xml_menu_path: str, features: dict, security: dict):
                     f.write(indented_str(2, 'android:title="Community"'))
                     f.write(indented_str(2, 'app:showAsAction="never" /> -->'))
                     n = n + 1
+                if features["conference_room"]["status"]:
+                    f.write(indented_str(1, "<item"))
+                    f.write(indented_str(2, 'android:id="@+id/action_conference_room"'))
+                    f.write(indented_str(2, f'android:orderInCategory="{n}"'))
+                    f.write(indented_str(2, 'android:title="Conference Room"'))
+                    f.write(indented_str(2, 'app:showAsAction="never" />'))
+                    n = n + 1
+                else:
+                    f.write(indented_str(1, "<!-- <item"))
+                    f.write(indented_str(2, 'android:id="@+id/action_conference_room"'))
+                    f.write(indented_str(2, f'android:orderInCategory="{n}"'))
+                    f.write(indented_str(2, 'android:title="Conference Room"'))
+                    f.write(indented_str(2, 'app:showAsAction="never" /> -->'))
+                    n = n + 1
+                if features["call_log"]["status"]:
+                    f.write(indented_str(1, "<item"))
+                    f.write(indented_str(2, 'android:id="@+id/action_call_log"'))
+                    f.write(indented_str(2, f'android:orderInCategory="{n}"'))
+                    f.write(indented_str(2, 'android:title="Call Log"'))
+                    f.write(indented_str(2, 'app:showAsAction="never" />'))
+                    n = n + 1
+                else:
+                    f.write(indented_str(1, "<!-- <item"))
+                    f.write(indented_str(2, 'android:id="@+id/action_call_log"'))
+                    f.write(indented_str(2, f'android:orderInCategory="{n}"'))
+                    f.write(indented_str(2, 'android:title="Call Log"'))
+                    f.write(indented_str(2, 'app:showAsAction="never" /> -->'))
+                    n = n + 1
                 if security["secure_folder"]:
                     f.write(indented_str(1, "<item"))
                     f.write(indented_str(2, 'android:id="@+id/action_sf"'))
@@ -531,6 +559,26 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(3, "// API.openCommunity();"))
                         f.write(indented_str(3, "// return true;"))
                         f.write(indented_str(2, "// }"))
+                    if features["conference_room"]["status"]:
+                        f.write(indented_str(2, "if (id == R.id.action_conference_room) {"))
+                        f.write(indented_str(3, "API.openConferenceRoom();"))
+                        f.write(indented_str(3, "return true;"))
+                        f.write(indented_str(2, "}"))
+                    else:
+                        f.write(indented_str(2, "// if (id == R.id.action_conference_room) {"))
+                        f.write(indented_str(3, "// API.openConferenceRoom();"))
+                        f.write(indented_str(3, "// return true;"))
+                        f.write(indented_str(2, "// }"))
+                    if features["call_log"]["status"]:
+                        f.write(indented_str(2, "if (id == R.id.action_call_log) {"))
+                        f.write(indented_str(3, "API.openCallLog();"))
+                        f.write(indented_str(3, "return true;"))
+                        f.write(indented_str(2, "}"))
+                    else:
+                        f.write(indented_str(2, "// if (id == R.id.action_call_log) {"))
+                        f.write(indented_str(3, "// API.openCallLog();"))
+                        f.write(indented_str(3, "// return true;"))
+                        f.write(indented_str(2, "// }"))
                     if security["secure_folder"]:
                         f.write(indented_str(2, "if (id == R.id.action_sf) {"))
                         f.write(indented_str(3, "API.openSecureFolder();"))
@@ -714,9 +762,17 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                     else:
                         f.write(indented_str(2, "// ImageView imageViewContactList = findViewById(R.id.btn_contact_list);"))
                     if features["community"]["status"]:
-                        f.write(indented_str(2, "ImageView imageViewContactList = findViewById(R.id.btn_community);"))
+                        f.write(indented_str(2, "ImageView imageViewCommunity = findViewById(R.id.btn_community);"))
+                    else:
+                        f.write(indented_str(2, "// ImageView imageViewCommunity = findViewById(R.id.btn_community);"))
+                    if features["conference_room"]["status"]:
+                        f.write(indented_str(2, "ImageView imageViewConferenceRoom = findViewById(R.id.btn_conference_room);"))
+                    else:
+                        f.write(indented_str(2, "// ImageView imageViewConferenceRoom = findViewById(R.id.btn_conference_room);"))
+                    if features["call_log"]["status"]:
+                        f.write(indented_str(2, "ImageView imageViewCallLog = findViewById(R.id.btn_call_log);"))
                     else:
-                        f.write(indented_str(2, "// ImageView imageViewContactList = findViewById(R.id.btn_community);"))
+                        f.write(indented_str(2, "// ImageView imageViewCallLog = findViewById(R.id.btn_call_log);"))
                     f.write(indented_str(0, ""))
                     f.write(indented_str(2, "imageViewSetting.setOnClickListener(v -> {"))
                     f.write(indented_str(3, "API.openSettings();"))
@@ -858,7 +914,23 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(2, "});"))
                     else:
                         f.write(indented_str(2, "// imageViewCommunity.setOnClickListener(v -> {"))
-                        f.write(indented_str(3, "// API.opencommunity();"))
+                        f.write(indented_str(3, "// API.openCommunity();"))
+                        f.write(indented_str(2, "// });"))
+                    if features["conference_room"]["status"]:
+                        f.write(indented_str(2, "imageViewConferenceRoom.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "API.openConferenceRoom();"))
+                        f.write(indented_str(2, "});"))
+                    else:
+                        f.write(indented_str(2, "// imageViewConferenceRoom.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "// API.openConferenceRoom();"))
+                        f.write(indented_str(2, "// });"))
+                    if features["call_log"]["status"]:
+                        f.write(indented_str(2, "imageViewCallLog.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "API.openCallLog();"))
+                        f.write(indented_str(2, "});"))
+                    else:
+                        f.write(indented_str(2, "// imageViewCallLog.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "// API.openCallLog();"))
                         f.write(indented_str(2, "// });"))
                 elif "//BREAK" in line:
                     if mode == "floating" or mode == "grid":
@@ -1158,6 +1230,34 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(2, '<!--android:layout_width="100dp"-->'))
                         f.write(indented_str(2, '<!--android:layout_margin="10dp"-->'))
                         f.write(indented_str(2, '<!--android:src="@drawable/pb_button_community"/>-->'))
+                    if mode == "grid" and "conference_room" in l_features:
+                        f.write(indented_str(1, "<ImageView"))
+                        f.write(indented_str(2, 'android:id="@+id/btn_conference_room"'))
+                        f.write(indented_str(2, 'android:layout_height="100dp"'))
+                        f.write(indented_str(2, 'android:layout_width="100dp"'))
+                        f.write(indented_str(2, 'android:layout_margin="10dp"'))
+                        f.write(indented_str(2, 'android:src="@drawable/pb_button_conference_room"/>'))
+                    else:
+                        f.write(indented_str(1, "<!--<ImageView-->"))
+                        f.write(indented_str(2, '<!--android:id="@+id/btn_conference_room"-->'))
+                        f.write(indented_str(2, '<!--android:layout_height="100dp"-->'))
+                        f.write(indented_str(2, '<!--android:layout_width="100dp"-->'))
+                        f.write(indented_str(2, '<!--android:layout_margin="10dp"-->'))
+                        f.write(indented_str(2, '<!--android:src="@drawable/pb_button_conference_room"/>-->'))
+                    if mode == "grid" and "call_log" in l_features:
+                        f.write(indented_str(1, "<ImageView"))
+                        f.write(indented_str(2, 'android:id="@+id/btn_call_log"'))
+                        f.write(indented_str(2, 'android:layout_height="100dp"'))
+                        f.write(indented_str(2, 'android:layout_width="100dp"'))
+                        f.write(indented_str(2, 'android:layout_margin="10dp"'))
+                        f.write(indented_str(2, 'android:src="@drawable/pb_button_call_log"/>'))
+                    else:
+                        f.write(indented_str(1, "<!--<ImageView-->"))
+                        f.write(indented_str(2, '<!--android:id="@+id/btn_call_log"-->'))
+                        f.write(indented_str(2, '<!--android:layout_height="100dp"-->'))
+                        f.write(indented_str(2, '<!--android:layout_width="100dp"-->'))
+                        f.write(indented_str(2, '<!--android:layout_margin="10dp"-->'))
+                        f.write(indented_str(2, '<!--android:src="@drawable/pb_button_call_log"/>-->'))
                 else:
                     f.write(line)
         write_android_manifest(manifest_path, features, security)
@@ -1242,6 +1342,14 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         features_str.append("'Community'")
                     else:
                         features_str.append("// 'Community'")
+                    if features["conference_room"]["status"]:
+                        features_str.append("'Conference Room'")
+                    else:
+                        features_str.append("// 'Conference Room'")
+                    if features["call_log"]["status"]:
+                        features_str.append("'Call Log'")
+                    else:
+                        features_str.append("// 'Call Log'")
                     for feature_str in features_str:
                         f.write(indented_str(8, f"{feature_str},", spaces=2))
                 elif "//FEATURES" in line:
@@ -1307,6 +1415,14 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(3, '// case "Streaming":', spaces=2))
                         f.write(indented_str(4, '// nativeChannel.invokeMethod("openStreaming");', spaces=2))
                         f.write(indented_str(4, "// break;", spaces=2))
+                    if security["secure_folder"]:
+                        f.write(indented_str(3, 'case "Secure Folder":', spaces=2))
+                        f.write(indented_str(4, 'nativeChannel.invokeMethod("openSecureFolder");', spaces=2))
+                        f.write(indented_str(4, "break;", spaces=2))
+                    else:
+                        f.write(indented_str(3, '// case "Secure Folder":', spaces=2))
+                        f.write(indented_str(4, '// nativeChannel.invokeMethod("openSecureFolder");', spaces=2))
+                        f.write(indented_str(4, "// break;", spaces=2))
                     if features["custom_url"]["status"]:
                         f.write(indented_str(3, 'case "Custom URL":', spaces=2))
                         f.write(indented_str(4, 'nativeChannel.invokeMethod("openCustomURL");', spaces=2))
@@ -1379,13 +1495,21 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(3, '// case "Community":', spaces=2))
                         f.write(indented_str(4, '// nativeChannel.invokeMethod("openCommunity");', spaces=2))
                         f.write(indented_str(4, "// break;", spaces=2))
-                    if security["secure_folder"]:
-                        f.write(indented_str(3, 'case "Secure Folder":', spaces=2))
-                        f.write(indented_str(4, 'nativeChannel.invokeMethod("openSecureFolder");', spaces=2))
+                    if features["conference_room"]["status"]:
+                        f.write(indented_str(3, 'case "Conference Room":', spaces=2))
+                        f.write(indented_str(4, 'nativeChannel.invokeMethod("openConferenceRoom");', spaces=2))
                         f.write(indented_str(4, "break;", spaces=2))
                     else:
-                        f.write(indented_str(3, '// case "Secure Folder":', spaces=2))
-                        f.write(indented_str(4, '// nativeChannel.invokeMethod("openSecureFolder");', spaces=2))
+                        f.write(indented_str(3, '// case "Conference Room":', spaces=2))
+                        f.write(indented_str(4, '// nativeChannel.invokeMethod("openConferenceRoom");', spaces=2))
+                        f.write(indented_str(4, "// break;", spaces=2))
+                    if features["call_log"]["status"]:
+                        f.write(indented_str(3, 'case "Call Log":', spaces=2))
+                        f.write(indented_str(4, 'nativeChannel.invokeMethod("openCallLog");', spaces=2))
+                        f.write(indented_str(4, "break;", spaces=2))
+                    else:
+                        f.write(indented_str(3, '// case "Call Log":', spaces=2))
+                        f.write(indented_str(4, '// nativeChannel.invokeMethod("openCallLog");', spaces=2))
                         f.write(indented_str(4, "// break;", spaces=2))
                 else:
                     f.write(line)
@@ -1747,7 +1871,34 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(6, "// this.openCommunity();", spaces=2))
                         f.write(indented_str(5, "// },", spaces=2))
                         f.write(indented_str(4, "// },", spaces=2))
-
+                    if features["conference_room"]["status"]:
+                        f.write(indented_str(4, '{', spaces=2))
+                        f.write(indented_str(5, "text: 'Conference Room',", spaces=2))
+                        f.write(indented_str(5, "handler: () => {", spaces=2))
+                        f.write(indented_str(6, "this.openConferenceRoom();", spaces=2))
+                        f.write(indented_str(5, "},", spaces=2))
+                        f.write(indented_str(4, "},", spaces=2))
+                    else:
+                        f.write(indented_str(4, '// {', spaces=2))
+                        f.write(indented_str(5, "// text: 'Conference Room',", spaces=2))
+                        f.write(indented_str(5, "// handler: () => {", spaces=2))
+                        f.write(indented_str(6, "// this.openConferenceRoom();", spaces=2))
+                        f.write(indented_str(5, "// },", spaces=2))
+                        f.write(indented_str(4, "// },", spaces=2))
+                    if features["call_log"]["status"]:
+                        f.write(indented_str(4, '{', spaces=2))
+                        f.write(indented_str(5, "text: 'Call Log',", spaces=2))
+                        f.write(indented_str(5, "handler: () => {", spaces=2))
+                        f.write(indented_str(6, "this.openCallLog();", spaces=2))
+                        f.write(indented_str(5, "},", spaces=2))
+                        f.write(indented_str(4, "},", spaces=2))
+                    else:
+                        f.write(indented_str(4, '// {', spaces=2))
+                        f.write(indented_str(5, "// text: 'Call Log',", spaces=2))
+                        f.write(indented_str(5, "// handler: () => {", spaces=2))
+                        f.write(indented_str(6, "// this.openCallLog();", spaces=2))
+                        f.write(indented_str(5, "// },", spaces=2))
+                        f.write(indented_str(4, "// },", spaces=2))
                 else:
                     f.write(line)
         with open(main_act_android, "r") as f:
@@ -1928,6 +2079,14 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(4, "'Community',", spaces=2))
                     else:
                         f.write(indented_str(4, "// 'Community',", spaces=2))
+                    if features["conference_room"]["status"]:
+                        f.write(indented_str(4, "'Conference Room',", spaces=2))
+                    else:
+                        f.write(indented_str(4, "// 'Conference Room',", spaces=2))
+                    if features["call_log"]["status"]:
+                        f.write(indented_str(4, "'Call Log',", spaces=2))
+                    else:
+                        f.write(indented_str(4, "// 'Call Log',", spaces=2))
 
                 elif "//FEATURES1" in line:
                     n = 0
@@ -2092,6 +2251,24 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(5, "// if (buttonIndex === 18) {", spaces=2))
                         f.write(indented_str(6, "// CallNative.openCommunity();", spaces=2))
                         f.write(indented_str(5, "// }", spaces=2))
+                    if features["conference_room"]["status"]:
+                        f.write(indented_str(5, f"if (buttonIndex === {n}) {{", spaces=2))
+                        f.write(indented_str(6, "CallNative.openConferenceRoom();", spaces=2))
+                        f.write(indented_str(5, "}", spaces=2))
+                        n = n + 1
+                    else:
+                        f.write(indented_str(5, "// if (buttonIndex === 19) {", spaces=2))
+                        f.write(indented_str(6, "// CallNative.openConferenceRoom();", spaces=2))
+                        f.write(indented_str(5, "// }", spaces=2))
+                    if features["call_log"]["status"]:
+                        f.write(indented_str(5, f"if (buttonIndex === {n}) {{", spaces=2))
+                        f.write(indented_str(6, "CallNative.openCallLog();", spaces=2))
+                        f.write(indented_str(5, "}", spaces=2))
+                        n = n + 1
+                    else:
+                        f.write(indented_str(5, "// if (buttonIndex === 20) {", spaces=2))
+                        f.write(indented_str(6, "// CallNative.openCallLog();", spaces=2))
+                        f.write(indented_str(5, "// }", spaces=2))
 
                 elif "//FEATURES2" in line:
                     n = 0
@@ -2400,6 +2577,40 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(4, "// console.log(e);", spaces=2))
                         f.write(indented_str(3, "// }", spaces=2))
                         f.write(indented_str(2, "// }", spaces=2))
+                    if features["conference_room"]["status"]:
+                        f.write(indented_str(2, f"if (buttonIndex === {n}) {{", spaces=2))
+                        f.write(indented_str(3, "try {", spaces=2))
+                        f.write(indented_str(4, "CallNative.openConferenceRoom();", spaces=2))
+                        f.write(indented_str(3, "} catch (e) {", spaces=2))
+                        f.write(indented_str(4, "console.log(e);", spaces=2))
+                        f.write(indented_str(3, "}", spaces=2))
+                        f.write(indented_str(2, "}", spaces=2))
+                        n = n + 1
+                    else:
+                        f.write(indented_str(2, "// if (buttonIndex === 19) {", spaces=2))
+                        f.write(indented_str(3, "// try {", spaces=2))
+                        f.write(indented_str(4, "// CallNative.openConferenceRoom();", spaces=2))
+                        f.write(indented_str(3, "// } catch (e) {", spaces=2))
+                        f.write(indented_str(4, "// console.log(e);", spaces=2))
+                        f.write(indented_str(3, "// }", spaces=2))
+                        f.write(indented_str(2, "// }", spaces=2))
+                    if features["call_log"]["status"]:
+                        f.write(indented_str(2, f"if (buttonIndex === {n}) {{", spaces=2))
+                        f.write(indented_str(3, "try {", spaces=2))
+                        f.write(indented_str(4, "CallNative.openCallLog();", spaces=2))
+                        f.write(indented_str(3, "} catch (e) {", spaces=2))
+                        f.write(indented_str(4, "console.log(e);", spaces=2))
+                        f.write(indented_str(3, "}", spaces=2))
+                        f.write(indented_str(2, "}", spaces=2))
+                        n = n + 1
+                    else:
+                        f.write(indented_str(2, "// if (buttonIndex === 20) {", spaces=2))
+                        f.write(indented_str(3, "// try {", spaces=2))
+                        f.write(indented_str(4, "// CallNative.openCallLog();", spaces=2))
+                        f.write(indented_str(3, "// } catch (e) {", spaces=2))
+                        f.write(indented_str(4, "// console.log(e);", spaces=2))
+                        f.write(indented_str(3, "// }", spaces=2))
+                        f.write(indented_str(2, "// }", spaces=2))
                 elif "//FEATURES3" in line:
                     n = 0
                     f.write(indented_str(5, "<Button", spaces=2))
@@ -2599,6 +2810,28 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(6, 'title="Community"', spaces=2))
                         f.write(indented_str(6, f'onPress={{() => handleActionSheetPress(18)}}', spaces=2))
                         f.write(indented_str(5, "/> */}", spaces=2))
+                    if features["conference_room"]["status"]:
+                        f.write(indented_str(5, "<Button", spaces=2))
+                        f.write(indented_str(6, 'title="Conference Room"', spaces=2))
+                        f.write(indented_str(6, f'onPress={{() => handleActionSheetPress({n})}}', spaces=2))
+                        f.write(indented_str(5, "/>", spaces=2))
+                        n = n + 1
+                    else:
+                        f.write(indented_str(5, "{/* <Button", spaces=2))
+                        f.write(indented_str(6, 'title="Conference Room"', spaces=2))
+                        f.write(indented_str(6, f'onPress={{() => handleActionSheetPress(19)}}', spaces=2))
+                        f.write(indented_str(5, "/> */}", spaces=2))
+                    if features["call_log"]["status"]:
+                        f.write(indented_str(5, "<Button", spaces=2))
+                        f.write(indented_str(6, 'title="Call Log"', spaces=2))
+                        f.write(indented_str(6, f'onPress={{() => handleActionSheetPress({n})}}', spaces=2))
+                        f.write(indented_str(5, "/>", spaces=2))
+                        n = n + 1
+                    else:
+                        f.write(indented_str(5, "{/* <Button", spaces=2))
+                        f.write(indented_str(6, 'title="Call Log"', spaces=2))
+                        f.write(indented_str(6, f'onPress={{() => handleActionSheetPress(20)}}', spaces=2))
+                        f.write(indented_str(5, "/> */}", spaces=2))
                 else:
                     f.write(line)
         with open(main_act_android, "r") as f:
@@ -3353,6 +3586,9 @@ def save_icons(app_id: str, platform: str, mode: str, path_dest: str, features:
         if features["nc"]["icon"]:
             file = features["nc"]["icon"]
             file.save(os.path.join(drawable_path, "pb_button_notif_center.png"))
+        if features["secure_folder"]["icon"]:
+            file = features["im"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_secure_folder.png"))
         if features["custom_url"]["icon"]:
             file = features["custom_url"]["icon"]
             file.save(os.path.join(drawable_path, "pb_button_custom_url.png"))
@@ -3380,9 +3616,12 @@ def save_icons(app_id: str, platform: str, mode: str, path_dest: str, features:
         if features["community"]["icon"]:
             file = features["community"]["icon"]
             file.save(os.path.join(drawable_path, "pb_button_community.png"))
-        if features["secure_folder"]["icon"]:
-            file = features["im"]["icon"]
-            file.save(os.path.join(drawable_path, "pb_button_secure_folder.png"))
+        if features["conference_room"]["icon"]:
+            file = features["conference_room"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_conference_room.png"))
+        if features["call_log"]["icon"]:
+            file = features["call_log"]["icon"]
+            file.save(os.path.join(drawable_path, "call_log.png"))
         pass
 
 def deliver_zip(path_dest, uid):
@@ -3507,6 +3746,14 @@ def build_project():
                 "status": False,
                 "icon": None
             },
+            "conference_room": {
+                "status": False,
+                "icon": None
+            },
+            "call_log": {
+                "status": False,
+                "icon": None
+            },
 
             "cc_chat": {
                 "status": False,
@@ -3597,6 +3844,10 @@ def build_project():
                 feature_dict["contact_list"]["status"] = request.form["feature_contact_list"] == "1"
             if "feature_community" in request.form:
                 feature_dict["community"]["status"] = request.form["feature_community"] == "1"
+            if "feature_conference_room" in request.form:
+                feature_dict["conference_room"]["status"] = request.form["feature_conference_room"] == "1"
+            if "feature_call_log" in request.form:
+                feature_dict["call_log"]["status"] = request.form["feature_call_log"] == "1"
             if "feature_secure_folder" in request.form and not security_dict["secure_folder"]:
                 security_dict["secure_folder"] = request.form["feature_secure_folder"] == "1"
 
@@ -3631,7 +3882,7 @@ def build_project():
                 security_dict["capture"] = request.form["security_capture"] == "1"
             if "security_call_forwarding" in request.form:
                 security_dict["call_forwarding"] = request.form["security_call_forwarding"] == "1"
-            if "security_secure_folder" in request.form and not security_dict["secure_folder"]::
+            if "security_secure_folder" in request.form and not security_dict["secure_folder"]:
                 security_dict["secure_folder"] = request.form["security_secure_folder"] == "1"
             if "secure_folder" in request.form and not security_dict["secure_folder"]:
                 security_dict["secure_folder"] = request.form["secure_folder"] == "1"
@@ -3715,6 +3966,14 @@ def build_project():
                 file = request.files['gridicon_community']
                 if file and file.filename and allowed_file(file.filename):
                     feature_dict["community"]["icon"] = file
+            if "gridicon_conference_room" in request.files:
+                file = request.files['gridicon_conference_room']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["conference_room"]["icon"] = file
+            if "gridicon_call_log" in request.files:
+                file = request.files['gridicon_call_log']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["call_log"]["icon"] = file
             if "gridicon_secure_folder" in request.files:
                 file = request.files['gridicon_secure_folder']
                 if file and file.filename and allowed_file(file.filename):