1
0

2 Commits e7e70d84a0 ... 9c85addc49

Autor SHA1 Mensagem Data
  tama 9c85addc49 grid há 11 meses atrás
  tama 2176b6c303 fix label há 11 meses atrás
1 ficheiros alterados com 436 adições e 30 exclusões
  1. 436 30
      main.py

+ 436 - 30
main.py

@@ -7,7 +7,9 @@ import uuid
 
 from flask import Flask, request
 
+# base_directory = "/home/easysoft054/Projects/git-es"
 base_directory = "/Users/maronakins/Documents"
+ALLOWED_EXTENSIONS_ICON = {'png'}
 
 app = Flask(__name__)
 app.base_project = {
@@ -35,6 +37,9 @@ def vprint(*data):
 def indented_str(n, s, line=True, spaces=4) -> str:
     return " " * n * spaces + s + os.linesep if line else ""
 
+def allowed_file(filename):
+    return '.' in filename and \
+           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS_ICON
 
 def create_folder(platform, uid):
     path = os.path.join(app.temp_folder, uid)
@@ -383,6 +388,14 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(2, "ImageView imageViewChat = findViewById(R.id.btn_chat);"))
                     else:
                         f.write(indented_str(2, "// ImageView imageViewChat = findViewById(R.id.btn_chat);"))
+                    if features["ac"]["status"]:
+                        f.write(indented_str(2, "ImageView imageViewAudioCall = findViewById(R.id.btn_audio_call);"))
+                    else:
+                        f.write(indented_str(2, "// ImageView imageViewAudioCall = findViewById(R.id.btn_audio_call);"))
+                    if features["vc"]["status"]:
+                        f.write(indented_str(2, "ImageView imageViewVideoCall = findViewById(R.id.btn_video_call);"))
+                    else:
+                        f.write(indented_str(2, "// ImageView imageViewVideoCall = findViewById(R.id.btn_video_call);"))
                     if features["call"]["status"]:
                         f.write(indented_str(2, "ImageView imageViewCall = findViewById(R.id.btn_call);"))
                     else:
@@ -395,6 +408,38 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(2, "ImageView imageViewSF = findViewById(R.id.btn_sf);"))
                     else:
                         f.write(indented_str(2, "// ImageView imageViewSF = findViewById(R.id.btn_sf);"))
+                    if features["custom_url"]["status"]:
+                        f.write(indented_str(2, "ImageView imageViewCustomURL = findViewById(R.id.btn_custom_url);"))
+                    else:
+                        f.write(indented_str(2, "// ImageView imageViewCustomURL = findViewById(R.id.btn_custom_url);"))
+                    if features["xapps"]["status"]:
+                        f.write(indented_str(2, "ImageView imageViewExternalApps = findViewById(R.id.btn_xapps);"))
+                    else:
+                        f.write(indented_str(2, "// ImageView imageViewExternalApps = findViewById(R.id.btn_xapps);"))
+                    if features["conpost"]["status"]:
+                        f.write(indented_str(2, "ImageView imageViewContentPosting = findViewById(R.id.btn_contentpost);"))
+                    else:
+                        f.write(indented_str(2, "// ImageView imageViewContentPosting = findViewById(R.id.btn_contentpost);"))
+                    if features["ppob"]["status"]:
+                        f.write(indented_str(2, "ImageView imageViewPPOB = findViewById(R.id.btn_ppob);"))
+                    else:
+                        f.write(indented_str(2, "// ImageView imageViewPPOB = findViewById(R.id.btn_ppob);"))
+                    if features["wallet"]["status"]:
+                        f.write(indented_str(2, "ImageView imageViewWallet = findViewById(R.id.btn_wallet);"))
+                    else:
+                        f.write(indented_str(2, "// ImageView imageViewWallet = findViewById(R.id.btn_wallet);"))
+                    if features["social_commerce"]["status"]:
+                        f.write(indented_str(2, "ImageView imageViewSocialCommerce = findViewById(R.id.btn_social_commerce);"))
+                    else:
+                        f.write(indented_str(2, "// ImageView imageViewSocialCommerce = findViewById(R.id.btn_social_commerce);"))
+                    if features["news_update"]["status"]:
+                        f.write(indented_str(2, "ImageView imageViewNews = findViewById(R.id.btn_news);"))
+                    else:
+                        f.write(indented_str(2, "// ImageView imageViewNews = findViewById(R.id.btn_news);"))
+                    if features["contact_list"]["status"]:
+                        f.write(indented_str(2, "ImageView imageViewContactList = findViewById(R.id.btn_contact_list);"))
+                    else:
+                        f.write(indented_str(2, "// ImageView imageViewContactList = findViewById(R.id.btn_contact_list);"))
                     f.write(indented_str(0, ""))
                     f.write(indented_str(2, "imageViewSetting.setOnClickListener(v -> {"))
                     f.write(indented_str(3, "API.openSettings();"))
@@ -418,7 +463,7 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(2, "// imageViewNC.setOnClickListener(v -> {"))
                         f.write(indented_str(3, "// API.openNotificationCenter();"))
                         f.write(indented_str(2, "// });"))
-                    if features["nc"]["status"]:
+                    if features["im"]["status"]:
                         f.write(indented_str(2, "imageViewChat.setOnClickListener(v -> {"))
                         f.write(indented_str(3, "API.openChat();"))
                         f.write(indented_str(2, "});"))
@@ -426,6 +471,22 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(2, "// imageViewChat.setOnClickListener(v -> {"))
                         f.write(indented_str(3, "// API.openChat();"))
                         f.write(indented_str(2, "// });"))
+                    if features["ac"]["status"]:
+                        f.write(indented_str(2, "imageViewAudioCall.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "API.openAudioCall();"))
+                        f.write(indented_str(2, "});"))
+                    else:
+                        f.write(indented_str(2, "// imageViewAudioCall.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "// API.openAudioCall();"))
+                        f.write(indented_str(2, "// });"))
+                    if features["vc"]["status"]:
+                        f.write(indented_str(2, "imageViewVideoCall.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "API.openVideoCall();"))
+                        f.write(indented_str(2, "});"))
+                    else:
+                        f.write(indented_str(2, "// imageViewVideoCall.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "// API.openVideoCall();"))
+                        f.write(indented_str(2, "// });"))
                     if features["call"]["status"]:
                         f.write(indented_str(2, "imageViewCall.setOnClickListener(v -> {"))
                         f.write(indented_str(3, "API.openCall();"))
@@ -450,6 +511,70 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(2, "// imageViewSF.setOnClickListener(v -> {"))
                         f.write(indented_str(3, "// API.openSecureFolder();"))
                         f.write(indented_str(2, "// });"))
+                    if features["custom_url"]["status"]:
+                        f.write(indented_str(2, "imageViewCustomURL.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "API.openCustomURL();"))
+                        f.write(indented_str(2, "});"))
+                    else:
+                        f.write(indented_str(2, "// imageViewCustomURL.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "// API.openCustomURL();"))
+                        f.write(indented_str(2, "// });"))
+                    if features["xapps"]["status"]:
+                        f.write(indented_str(2, "imageViewExternalApps.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "API.openExternalApps();"))
+                        f.write(indented_str(2, "});"))
+                    else:
+                        f.write(indented_str(2, "// imageViewExternalApps.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "// API.openExternalApps();"))
+                        f.write(indented_str(2, "// });"))
+                    if features["conpost"]["status"]:
+                        f.write(indented_str(2, "imageViewContentPosting.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "API.openUserGeneratedContent();"))
+                        f.write(indented_str(2, "});"))
+                    else:
+                        f.write(indented_str(2, "// imageViewContentPosting.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "// API.openUserGeneratedContent();"))
+                        f.write(indented_str(2, "// });"))
+                    if features["ppob"]["status"]:
+                        f.write(indented_str(2, "imageViewPPOB.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "API.openPPOB();"))
+                        f.write(indented_str(2, "});"))
+                    else:
+                        f.write(indented_str(2, "// imageViewPPOB.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "// API.openPPOB();"))
+                        f.write(indented_str(2, "// });"))
+                    if features["wallet"]["status"]:
+                        f.write(indented_str(2, "imageViewWallet.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "API.openWallet();"))
+                        f.write(indented_str(2, "});"))
+                    else:
+                        f.write(indented_str(2, "// imageViewWallet.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "// API.openWallet();"))
+                        f.write(indented_str(2, "// });"))
+                    if features["social_commerce"]["status"]:
+                        f.write(indented_str(2, "imageViewSocialCommerce.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "API.openSocialCommerce();"))
+                        f.write(indented_str(2, "});"))
+                    else:
+                        f.write(indented_str(2, "// imageViewSocialCommerce.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "// API.openSocialCommerce();"))
+                        f.write(indented_str(2, "// });"))
+                    if features["news_update"]["status"]:
+                        f.write(indented_str(2, "imageViewNews.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "API.openNewsUpdate();"))
+                        f.write(indented_str(2, "});"))
+                    else:
+                        f.write(indented_str(2, "// imageViewNews.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "// API.openNewsUpdate();"))
+                        f.write(indented_str(2, "// });"))
+                    if features["contact_list"]["status"]:
+                        f.write(indented_str(2, "imageViewContactList.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "API.openConversation();"))
+                        f.write(indented_str(2, "});"))
+                    else:
+                        f.write(indented_str(2, "// imageViewContactList.setOnClickListener(v -> {"))
+                        f.write(indented_str(3, "// API.openConversation();"))
+                        f.write(indented_str(2, "// });"))
                 elif "//BREAK" in line:
                     if mode == "floating" or mode == "grid":
                         f.write("}")
@@ -635,7 +760,7 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(1, "<item"))
                         f.write(indented_str(2, 'android:id="@+id/action_custom_url"'))
                         f.write(indented_str(2, f'android:orderInCategory="{n}"'))
-                        f.write(indented_str(2, 'android:title=Custom URL"'))
+                        f.write(indented_str(2, 'android:title="Custom URL"'))
                         f.write(indented_str(2, 'app:showAsAction="never" />'))
                         n = n + 1
                     else:
@@ -649,28 +774,28 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                         f.write(indented_str(1, "<item"))
                         f.write(indented_str(2, 'android:id="@+id/action_xapps"'))
                         f.write(indented_str(2, f'android:orderInCategory="{n}"'))
-                        f.write(indented_str(2, 'android:title=External Apps"'))
+                        f.write(indented_str(2, 'android:title="External Apps"'))
                         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_xapps"'))
                         f.write(indented_str(2, f'android:orderInCategory="{n}"'))
-                        f.write(indented_str(2, 'android:title=External Apps"'))
+                        f.write(indented_str(2, 'android:title="External Apps"'))
                         f.write(indented_str(2, 'app:showAsAction="never" /> -->'))
                         n = n + 1
                     if features["conpost"]["status"]:
                         f.write(indented_str(1, "<item"))
                         f.write(indented_str(2, 'android:id="@+id/action_conpost"'))
                         f.write(indented_str(2, f'android:orderInCategory="{n}"'))
-                        f.write(indented_str(2, 'android:title=User Generated Content"'))
+                        f.write(indented_str(2, 'android:title="User Generated Content"'))
                         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_conpost"'))
                         f.write(indented_str(2, f'android:orderInCategory="{n}"'))
-                        f.write(indented_str(2, 'android:title=User Generated Content"'))
+                        f.write(indented_str(2, 'android:title="User Generated Content"'))
                         f.write(indented_str(2, 'app:showAsAction="never" /> -->'))
                         n = n + 1
                     if features["ppob"]["status"]:
@@ -828,6 +953,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_chat"/>-->'))
+                    if "ac" in l_features:
+                        f.write(indented_str(1, "<ImageView"))
+                        f.write(indented_str(2, 'android:id="@+id/btn_audio_call"'))
+                        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_audio_call"/>'))
+                    else:
+                        f.write(indented_str(1, "<!--<ImageView-->"))
+                        f.write(indented_str(2, '<!--android:id="@+id/btn_audio_call"-->'))
+                        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_audio_call"/>-->'))
+                    if "vc" in l_features:
+                        f.write(indented_str(1, "<ImageView"))
+                        f.write(indented_str(2, 'android:id="@+id/btn_video_call"'))
+                        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_video_call"/>'))
+                    else:
+                        f.write(indented_str(1, "<!--<ImageView-->"))
+                        f.write(indented_str(2, '<!--android:id="@+id/btn_video_call"-->'))
+                        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_video_call"/>-->'))
                     if "call" in l_features:
                         f.write(indented_str(1, "<ImageView"))
                         f.write(indented_str(2, 'android:id="@+id/btn_call"'))
@@ -870,6 +1023,118 @@ 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_secure_folder"/>-->'))
+                    if "custom_url" in l_features:
+                        f.write(indented_str(1, "<ImageView"))
+                        f.write(indented_str(2, 'android:id="@+id/btn_custom_url"'))
+                        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_custom_url"/>'))
+                    else:
+                        f.write(indented_str(1, "<!--<ImageView-->"))
+                        f.write(indented_str(2, '<!--android:id="@+id/btn_custom_url"-->'))
+                        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_custom_url"/>-->'))
+                    if "xapps" in l_features:
+                        f.write(indented_str(1, "<ImageView"))
+                        f.write(indented_str(2, 'android:id="@+id/btn_xapps"'))
+                        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_external_apps"/>'))
+                    else:
+                        f.write(indented_str(1, "<!--<ImageView-->"))
+                        f.write(indented_str(2, '<!--android:id="@+id/btn_xapps"-->'))
+                        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_external_apps"/>-->'))
+                    if "conpost" in l_features:
+                        f.write(indented_str(1, "<ImageView"))
+                        f.write(indented_str(2, 'android:id="@+id/btn_contentpost"'))
+                        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_user_content"/>'))
+                    else:
+                        f.write(indented_str(1, "<!--<ImageView-->"))
+                        f.write(indented_str(2, '<!--android:id="@+id/btn_contentpost"-->'))
+                        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_user_content"/>-->'))
+                    if "ppob" in l_features:
+                        f.write(indented_str(1, "<ImageView"))
+                        f.write(indented_str(2, 'android:id="@+id/btn_ppob"'))
+                        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_ppob"/>'))
+                    else:
+                        f.write(indented_str(1, "<!--<ImageView-->"))
+                        f.write(indented_str(2, '<!--android:id="@+id/btn_ppob"-->'))
+                        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_ppob"/>-->'))
+                    if "wallet" in l_features:
+                        f.write(indented_str(1, "<ImageView"))
+                        f.write(indented_str(2, 'android:id="@+id/btn_wallet"'))
+                        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_wallet"/>'))
+                    else:
+                        f.write(indented_str(1, "<!--<ImageView-->"))
+                        f.write(indented_str(2, '<!--android:id="@+id/btn_wallet"-->'))
+                        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_wallet"/>-->'))
+                    if "social_commerce" in l_features:
+                        f.write(indented_str(1, "<ImageView"))
+                        f.write(indented_str(2, 'android:id="@+id/btn_social_commerce"'))
+                        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_social_commerce"/>'))
+                    else:
+                        f.write(indented_str(1, "<!--<ImageView-->"))
+                        f.write(indented_str(2, '<!--android:id="@+id/btn_social_commerce"-->'))
+                        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_social_commerce"/>-->'))
+                    if "news_update" in l_features:
+                        f.write(indented_str(1, "<ImageView"))
+                        f.write(indented_str(2, 'android:id="@+id/btn_news"'))
+                        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_news"/>'))
+                    else:
+                        f.write(indented_str(1, "<!--<ImageView-->"))
+                        f.write(indented_str(2, '<!--android:id="@+id/btn_news"-->'))
+                        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_news"/>-->'))
+                    if "contact_list" in l_features:
+                        f.write(indented_str(1, "<ImageView"))
+                        f.write(indented_str(2, 'android:id="@+id/btn_contact_list"'))
+                        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_contact_list"/>'))
+                    else:
+                        f.write(indented_str(1, "<!--<ImageView-->"))
+                        f.write(indented_str(2, '<!--android:id="@+id/btn_contact_list"-->'))
+                        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_contact_list"/>-->'))
                 else:
                     f.write(line)
         write_android_manifest(manifest_path, features, security)
@@ -2423,6 +2688,58 @@ def change(app_id: str, platform: str, mode: str, path_dest: str, features: dict
                 else:
                     f.write(line)
 
+def save_icons(app_id: str, platform: str, mode: str, path_dest: str, features: dict, security: dict):
+    if platform == "android" and mode == "grid":
+        drawable_path = os.path.join(path_dest, "app/src/main/res/drawable/")
+        if features["im"]["icon"]:
+            file = features["im"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_chat.png"))
+        if features["cc"]["icon"]:
+            file = features["cc"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_cc.png"))
+        if features["ac"]["icon"]:
+            file = features["ac"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_audio_call.png"))
+        if features["vc"]["icon"]:
+            file = features["vc"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_video_call.png"))
+        if features["call"]["icon"]:
+            file = features["call"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_call.png"))
+        if features["ls"]["icon"]:
+            file = features["ls"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_stream.png"))
+        if features["nc"]["icon"]:
+            file = features["nc"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_notif_center.png"))
+        if features["custom_url"]["icon"]:
+            file = features["custom_url"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_custom_url.png"))
+        if features["xapps"]["icon"]:
+            file = features["im"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_external_apps.png"))
+        if features["conpost"]["icon"]:
+            file = features["im"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_user_content.png"))
+        if features["ppob"]["icon"]:
+            file = features["im"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_ppob.png"))
+        if features["wallet"]["icon"]:
+            file = features["im"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_wallet.png"))
+        if features["social_commerce"]["icon"]:
+            file = features["im"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_social_commerce.png"))
+        if features["news_update"]["icon"]:
+            file = features["im"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_news.png"))
+        if features["contact_list"]["icon"]:
+            file = features["im"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_contact_list.png"))
+        if features["secure_folder"]["icon"]:
+            file = features["im"]["icon"]
+            file.save(os.path.join(drawable_path, "pb_button_secure_folder.png"))
+        pass
 
 def deliver_zip(path_dest, uid):
     rand_name = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(32))
@@ -2446,61 +2763,84 @@ def build_project():
         app_id = ""
         feature_dict = {
             "im": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "cc": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "ac": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "vc": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "call": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "ls": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "nc": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "sms": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "email": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "smartbot": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "settings": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "custom_url": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "xapps": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "conpost": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "ppob": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "wallet": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "social_commerce": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "news_update": {
-                "status": False
+                "status": False,
+                "icon": None
             },
             "contact_list": {
-                "status": False
+                "status": False,
+                "icon": None
+            },
+            "secure_folder": {
+                "status": False,
+                "icon": None
             }
         }
         security_dict = {
@@ -2547,15 +2887,15 @@ def build_project():
                 feature_dict["xapps"]["status"] = request.form["feature_xapps"] == "1"
             if "feature_conpost" in request.form:
                 feature_dict["conpost"]["status"] = request.form["feature_conpost"] == "1"
-            if "check_ppob" in request.form:
+            if "feature_ppob" in request.form:
                 feature_dict["ppob"]["status"] = request.form["check_ppob"] == "1"
-            if "check_wallet" in request.form:
+            if "feature_wallet" in request.form:
                 feature_dict["wallet"]["status"] = request.form["check_wallet"] == "1"
-            if "social_commerce" in request.form:
+            if "feature_social_commerce" in request.form:
                 feature_dict["social_commerce"]["status"] = request.form["social_commerce"] == "1"
-            if "news_update" in request.form:
+            if "feature_news_update" in request.form:
                 feature_dict["news_update"]["status"] = request.form["news_update"] == "1"
-            if "contact_list" in request.form:
+            if "feature_contact_list" in request.form:
                 feature_dict["contact_list"]["status"] = request.form["contact_list"] == "1"
             
             if "security_malware" in request.form:
@@ -2591,6 +2931,71 @@ def build_project():
                                               or security_dict["sim_swap"] or security_dict["capture"]
                                               or security_dict["call_forwarding"]
                                               or security_dict["secure_folder"])
+
+            if "gridicon_im" in request.files:
+                file = request.files['gridicon_im']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["im"]["icon"] = file
+            if "gridicon_cc" in request.files:
+                file = request.files['gridicon_cc']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["cc"]["icon"] = file
+            if "gridicon_ac" in request.files:
+                file = request.files['gridicon_ac']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["ac"]["icon"] = file
+            if "gridicon_vc" in request.files:
+                file = request.files['gridicon_vc']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["vc"]["icon"] = file
+            if "gridicon_avc" in request.files:
+                file = request.files['gridicon_avc']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["call"]["icon"] = file
+            if "gridicon_ls" in request.files:
+                file = request.files['gridicon_ls']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["ls"]["icon"] = file
+            if "gridicon_nc" in request.files:
+                file = request.files['gridicon_nc']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["nc"]["icon"] = file
+            if "gridicon_curl" in request.files:
+                file = request.files['gridicon_curl']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["custom_url"]["icon"] = file
+            if "gridicon_xapps" in request.files:
+                file = request.files['gridicon_xapps']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["xapps"]["icon"] = file
+            if "gridicon_conpost" in request.files:
+                file = request.files['gridicon_conpost']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["conpost"]["icon"] = file
+            if "gridicon_ppob" in request.files:
+                file = request.files['gridicon_ppob']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["ppob"]["icon"] = file
+            if "gridicon_wallet" in request.files:
+                file = request.files['gridicon_wallet']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["wallet"]["icon"] = file
+            if "gridicon_social_commerce" in request.files:
+                file = request.files['gridicon_social_commerce']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["social_commerce"]["icon"] = file
+            if "gridicon_news_update" in request.files:
+                file = request.files['gridicon_news_update']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["news_update"]["icon"] = file
+            if "gridicon_contact_list" in request.files:
+                file = request.files['gridicon_contact_list']
+                if file and file.filename and allowed_file(file.filename):
+                    feature_dict["contact_list"]["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):
+                    feature_dict["secure_folder"]["icon"] = file
             
             if "platform" in request.form:
                 platform = request.form["platform"]
@@ -2605,6 +3010,7 @@ def build_project():
             uu_id = str(uuid.uuid4())
             path_dest = create_folder(platform, uu_id)
             change(app_id, platform, mode, path_dest, feature_dict, security_dict)
+            save_icons(app_id, platform, mode, path_dest, feature_dict, security_dict)
             return deliver_zip(path_dest, uu_id)
         except BaseException as e:
             vprint(traceback.format_exc())