├── .github └── workflows │ └── build-apk.yml ├── .gitignore ├── .idea ├── .gitignore ├── .name ├── compiler.xml ├── gradle.xml ├── misc.xml └── vcs.xml ├── README.md ├── SWBlocksPreview.swb ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── ma │ │ └── swblockspreview │ │ ├── BlockPreviewer.java │ │ ├── Constants.java │ │ ├── MainActivity.java │ │ ├── bean │ │ └── BlockBean.java │ │ ├── editor │ │ ├── Rs.java │ │ ├── Ss.java │ │ ├── Ts.java │ │ ├── ViewBlockCollectionEditor.java │ │ ├── logic │ │ │ └── BlockPane.java │ │ └── view │ │ │ └── LogicEditorScrollView.java │ │ └── util │ │ ├── Gx.java │ │ ├── LayoutUtils.java │ │ ├── StringUtils.java │ │ ├── kq.java │ │ └── mq.java │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ └── ic_launcher_background.xml │ ├── layout │ └── activity_main.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── values │ ├── colors.xml │ ├── strings.xml │ └── themes.xml │ └── xml │ ├── backup_rules.xml │ └── data_extraction_rules.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.github/workflows/build-apk.yml: -------------------------------------------------------------------------------- 1 | name: Build APK CI 2 | 3 | on: 4 | pull_request: 5 | workflow_dispatch: 6 | 7 | jobs: 8 | build: 9 | name: Build debug apk 10 | runs-on: ubuntu-latest 11 | steps: 12 | #- name: Cancel previous runs 13 | # uses: styfle/cancel-workflow-action@0.9.1 14 | # with: 15 | # workflow_id: # obtain from https://api.github.com/repos/MikeAndrson/SWBlocksPreview/actions/workflows 16 | # access_token: ${{ github.token }} 17 | 18 | - uses: actions/checkout@v2 19 | 20 | - name: set up JDK 11 21 | uses: actions/setup-java@v2 22 | with: 23 | java-version: '11' 24 | distribution: 'adopt' 25 | cache: gradle 26 | 27 | - name: Grant execute permission for gradlew 28 | run: chmod +x gradlew 29 | 30 | - name: Build debug apk 31 | uses: eskatos/gradle-command-action@v1 32 | with: 33 | arguments: assembleDebug 34 | distributions-cache-enabled: true 35 | dependencies-cache-enabled: true 36 | configuration-cache-enabled: true 37 | 38 | - name: Upload debug apk 39 | uses: actions/upload-artifact@v2 40 | if: ${{ !github.head_ref }} 41 | with: 42 | name: apk-debug 43 | path: app/build/outputs/apk/debug 44 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | SW Blocks Preview -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 10 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SW Blocks Preview 2 | A small port of the BlockPane/blocks preview from Sketchware. See the class [BlockPreviewer.java](app/src/main/java/ma/swblockspreview/BlockPreviewer.java). 3 | 4 | It is read-only (hence "preview") so you can't drag-drop blocks around, although that should be trivial to port also. One would just need to port over part of the [onTouch event](https://github.com/Sketchware-Pro/Sketchware-Pro/blob/9f8aeddcf5147c09a9649e2bac9664a5c2dafcff/app/src/main/java/com/besome/sketch/editor/LogicEditorActivity.java#L2424) from LogicEditorActivity. PRs are welcome. 5 | 6 | It has no external dependencies, not even AndroidX. I only included Gson to load some dummy block data for preview. Refer to [MainActivity.java](app/src/main/java/ma/swblockspreview/MainActivity.java) for example usage. 7 | 8 | ### SWB? 9 | [Here](SWBlocksPreview.swb). 10 | 11 | ### Screenshots 12 | 13 | -------------------------------------------------------------------------------- /SWBlocksPreview.swb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omeraydindev/sw-blocks-preview/b5412f6757ec995c86b38ccc949ef8f2b050184b/SWBlocksPreview.swb -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | } 4 | 5 | android { 6 | namespace 'ma.swblockspreview' 7 | compileSdk 33 8 | 9 | defaultConfig { 10 | applicationId "ma.swblockspreview" 11 | minSdk 21 12 | targetSdk 33 13 | versionCode 1 14 | versionName "1.0" 15 | } 16 | 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | compileOptions { 24 | sourceCompatibility JavaVersion.VERSION_11 25 | targetCompatibility JavaVersion.VERSION_11 26 | } 27 | } 28 | 29 | dependencies { 30 | // https://mvnrepository.com/artifact/com.google.code.gson/gson 31 | implementation 'com.google.code.gson:gson:2.10.1' 32 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 15 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/BlockPreviewer.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.app.AlertDialog; 5 | import android.content.Context; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.LinearLayout; 9 | import android.widget.TextView; 10 | 11 | import java.util.ArrayList; 12 | import java.util.HashMap; 13 | import java.util.Iterator; 14 | 15 | import ma.swblockspreview.bean.BlockBean; 16 | import ma.swblockspreview.editor.Rs; 17 | import ma.swblockspreview.editor.Ss; 18 | import ma.swblockspreview.editor.Ts; 19 | import ma.swblockspreview.editor.ViewBlockCollectionEditor; 20 | import ma.swblockspreview.editor.logic.BlockPane; 21 | import ma.swblockspreview.util.LayoutUtils; 22 | 23 | public class BlockPreviewer { 24 | private Context context; 25 | protected ViewBlockCollectionEditor viewBlockCollectionEditor; 26 | protected BlockPane blockPane; 27 | 28 | public BlockPreviewer(Context context) { 29 | this.context = context; 30 | } 31 | 32 | public void previewInto(ViewGroup container, ArrayList blocks) { 33 | viewBlockCollectionEditor = new ViewBlockCollectionEditor(context); 34 | viewBlockCollectionEditor.setScrollEnabled(true); 35 | blockPane = viewBlockCollectionEditor.getBlockPane(); 36 | 37 | previewBlocks(blocks, 8, 8); 38 | l(); 39 | 40 | container.removeAllViews(); 41 | container.addView(viewBlockCollectionEditor); 42 | } 43 | 44 | // idk if this is necessary but here we go anyway. 45 | // Android is weird when it comes to memory leaks 46 | public void dispose() { 47 | viewBlockCollectionEditor = null; 48 | blockPane = null; 49 | context = null; 50 | } 51 | 52 | /** 53 | * THE CODE BELOW THIS POINT IS *EXTREMELY* MESSY SINCE 54 | * IT WAS DECOMPILED & PORTED TO *JUST* WORK. NO REFACTORING HAS EVEN 55 | * BEEN ATTEMPTED BECAUSE I DID NOT WANT TO GO CRAZY, I JUST WANTED 56 | * IT TO SOMEWHAT WORK. 57 | *

58 | * READ/MODIFY AT YOUR OWN RISK !!! 59 | */ 60 | 61 | 62 | private void previewBlocks(ArrayList blocks, int var2, int var3) { 63 | HashMap var4 = new HashMap<>(); 64 | Iterator var5 = blocks.iterator(); 65 | Rs var6 = null; 66 | boolean var7 = true; 67 | 68 | while (var5.hasNext()) { 69 | Rs block = getBlock(var5.next()); 70 | var4.put((Integer) block.getTag(), block); 71 | blockPane.g = Math.max(blockPane.g, 1 + (Integer) block.getTag()); 72 | blockPane.a(block, var2, var3); 73 | if (var7) { 74 | var6 = block; 75 | var7 = false; 76 | } 77 | } 78 | 79 | Iterator var8 = blocks.iterator(); 80 | 81 | while (true) { 82 | BlockBean var9; 83 | Rs block; 84 | if (!var8.hasNext()) { 85 | var6.k(); 86 | blockPane.b(); 87 | return; 88 | } 89 | 90 | var9 = var8.next(); 91 | block = var4.get(Integer.valueOf(var9.id)); 92 | while (block == null) { 93 | if (!var8.hasNext()) { 94 | var6.k(); 95 | blockPane.b(); 96 | return; 97 | } 98 | 99 | var9 = var8.next(); 100 | block = var4.get(Integer.valueOf(var9.id)); 101 | } 102 | 103 | int subStack1 = var9.subStack1; 104 | if (subStack1 >= 0) { 105 | Rs var20 = var4.get(subStack1); 106 | if (var20 != null) { 107 | block.e(var20); 108 | } 109 | } 110 | 111 | int subStack2 = var9.subStack2; 112 | if (subStack2 >= 0) { 113 | Rs var19 = var4.get(subStack2); 114 | if (var19 != null) { 115 | block.f(var19); 116 | } 117 | } 118 | 119 | int nextBlock = var9.nextBlock; 120 | if (nextBlock >= 0) { 121 | Rs var18 = var4.get(nextBlock); 122 | if (var18 != null) { 123 | block.b(var18); 124 | } 125 | } 126 | 127 | int paramsSize = var9.parameters.size(); 128 | 129 | for (int i = 0; i < paramsSize; ++i) { 130 | String param = var9.parameters.get(i); 131 | if (param != null && param.length() > 0) { 132 | if (param.charAt(0) == 64) { 133 | Rs var17 = var4.get(Integer.valueOf(param.substring(1))); 134 | if (var17 != null && block.V.size() > 0) { 135 | block.a((Ts) block.V.get(i), var17); 136 | } 137 | } else { 138 | if (block.V.size() > 0) { 139 | ((Ss) block.V.get(i)).setArgValue(param); 140 | argOnClick(((Ss) block.V.get(i))); 141 | block.m(); 142 | } 143 | } 144 | } 145 | } 146 | } 147 | } 148 | 149 | private Rs getBlock(BlockBean bean) { 150 | Rs block = new Rs(context, Integer.parseInt(bean.id), bean.spec, bean.type, bean.typeName, bean.opCode); 151 | block.e = bean.color; 152 | blockOnClick(block, bean); 153 | return block; 154 | } 155 | 156 | private void blockOnClick(Rs rs, BlockBean bean) { 157 | rs.setOnClickListener(v -> { 158 | StringBuilder info = new StringBuilder(); 159 | info.append("opCode: "); 160 | info.append(bean.opCode); 161 | info.append("\n\n"); 162 | info.append("spec: "); 163 | info.append(bean.spec); 164 | info.append("\n\n"); 165 | info.append("type: "); 166 | info.append(bean.type.equals(" ") ? "regular" : bean.type); 167 | info.append("\n\n"); 168 | if (!bean.typeName.equals("")) { 169 | info.append("typeName: "); 170 | info.append(bean.typeName); 171 | info.append("\n\n"); 172 | } 173 | info.append("color: "); 174 | info.append(bean.color); 175 | 176 | dialog("Block info", info.toString()); 177 | }); 178 | 179 | } 180 | 181 | private void argOnClick(Ss ss) { 182 | ss.setOnClickListener(v -> dialog("Argument info", String.valueOf(ss.getArgValue()))); 183 | } 184 | 185 | private void dialog(String title, String message) { 186 | AlertDialog.Builder dialog = new AlertDialog.Builder(context); 187 | dialog.setTitle(title); 188 | dialog.setMessage(message); 189 | 190 | dialog.setPositiveButton("OK", null); 191 | AlertDialog dlg = dialog.create(); 192 | dlg.show(); 193 | 194 | View messageView = dlg.findViewById(android.R.id.message); 195 | if (messageView instanceof TextView) { 196 | ((TextView) messageView).setTextIsSelectable(true); 197 | } 198 | } 199 | 200 | private void l() { 201 | int height = context.getResources().getDisplayMetrics().heightPixels; 202 | // this.r.measure(0, 0); 203 | int measureHeight = 0;//this.r.getMeasuredHeight(); 204 | LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height - a(context) - getStatusBarHeight(context) - measureHeight); 205 | viewBlockCollectionEditor.setLayoutParams(layoutParams); 206 | viewBlockCollectionEditor.requestLayout(); 207 | } 208 | 209 | private static int a(Context context) { 210 | return (int) LayoutUtils.getDip(context, 48.0F); 211 | } 212 | 213 | @SuppressLint({"DiscouragedApi", "InternalInsetResource"}) 214 | private static int getStatusBarHeight(Context context) { 215 | int statusBarHeight = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); 216 | return statusBarHeight > 0 ? context.getResources().getDimensionPixelSize(statusBarHeight) : 0; 217 | } 218 | } 219 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/Constants.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview; 2 | 3 | public class Constants { 4 | // 🤓 5 | public static final String SAMPLE_BLOCKS_STR = 6 | "{\"color\":-11899692,\"id\":\"99000020\",\"nextBlock\":99000021,\"opCode\":\"setVisible\",\"parameters\":[\"progressbar1\",\"GONE\"],\"spec\":\"%m.view setVisible %m.visible\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 7 | "{\"color\":-11899692,\"id\":\"99000021\",\"nextBlock\":99000010,\"opCode\":\"setVisible\",\"parameters\":[\"button1\",\"VISIBLE\"],\"spec\":\"%m.view setVisible %m.visible\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 8 | "{\"color\":-1988310,\"id\":\"99000010\",\"nextBlock\":-1,\"opCode\":\"ifElse\",\"parameters\":[\"@99000011\"],\"spec\":\"if %b then\",\"subStack1\":99000050,\"subStack2\":99000022,\"type\":\"e\",\"typeName\":\"\"}\n" + 9 | "{\"color\":-7711273,\"id\":\"99000011\",\"nextBlock\":-1,\"opCode\":\"getArg\",\"parameters\":[],\"spec\":\"success\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"b\",\"typeName\":\"\"}\n" + 10 | "{\"color\":-1988310,\"id\":\"99000050\",\"nextBlock\":-1,\"opCode\":\"ifElse\",\"parameters\":[\"@99000024\"],\"spec\":\"if %b then\",\"subStack1\":99000025,\"subStack2\":99000047,\"type\":\"e\",\"typeName\":\"\"}\n" + 11 | "{\"color\":-1147626,\"id\":\"99000024\",\"nextBlock\":-1,\"opCode\":\"getVar\",\"parameters\":[],\"spec\":\"justregistering\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"b\",\"typeName\":\"\"}\n" + 12 | "{\"color\":-7711273,\"id\":\"99000025\",\"nextBlock\":99000026,\"opCode\":\"definedFunc\",\"parameters\":[],\"spec\":\"hideKeyboard\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 13 | "{\"color\":-1147626,\"id\":\"99000026\",\"nextBlock\":99000028,\"opCode\":\"setVarString\",\"parameters\":[\"key\",\"@99000065\"],\"spec\":\"set %m.varStr to %s\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 14 | "{\"color\":-13851166,\"id\":\"99000065\",\"nextBlock\":-1,\"opCode\":\"firebaseauthGetUid\",\"parameters\":[],\"spec\":\"FirebaseAuth getUid\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n" + 15 | "{\"color\":-1147626,\"id\":\"99000028\",\"nextBlock\":99000029,\"opCode\":\"mapCreateNew\",\"parameters\":[\"registerData\"],\"spec\":\"%m.varMap create new map\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 16 | "{\"color\":-1147626,\"id\":\"99000029\",\"nextBlock\":99000031,\"opCode\":\"mapPut\",\"parameters\":[\"registerData\",\"name\",\"@99000030\"],\"spec\":\"%m.varMap put key %s value %s\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 17 | "{\"color\":-1147626,\"id\":\"99000030\",\"nextBlock\":-1,\"opCode\":\"getVar\",\"parameters\":[],\"spec\":\"temp\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n" + 18 | "{\"color\":-1147626,\"id\":\"99000031\",\"nextBlock\":99000033,\"opCode\":\"mapPut\",\"parameters\":[\"registerData\",\"mail\",\"@99000032\"],\"spec\":\"%m.varMap put key %s value %s\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 19 | "{\"color\":-1147626,\"id\":\"99000032\",\"nextBlock\":-1,\"opCode\":\"getVar\",\"parameters\":[],\"spec\":\"temp2\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n" + 20 | "{\"color\":-1147626,\"id\":\"99000033\",\"nextBlock\":99000035,\"opCode\":\"mapPut\",\"parameters\":[\"registerData\",\"key\",\"@99000034\"],\"spec\":\"%m.varMap put key %s value %s\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 21 | "{\"color\":-1147626,\"id\":\"99000034\",\"nextBlock\":-1,\"opCode\":\"getVar\",\"parameters\":[],\"spec\":\"key\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n" + 22 | "{\"color\":-1147626,\"id\":\"99000035\",\"nextBlock\":99000036,\"opCode\":\"mapPut\",\"parameters\":[\"registerData\",\"rank\",\"@99000045\"],\"spec\":\"%m.varMap put key %s value %s\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 23 | "{\"color\":-1147626,\"id\":\"99000045\",\"nextBlock\":-1,\"opCode\":\"getVar\",\"parameters\":[],\"spec\":\"DEFAULT_RANK\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n" + 24 | "{\"color\":-1147626,\"id\":\"99000036\",\"nextBlock\":99000037,\"opCode\":\"mapPut\",\"parameters\":[\"registerData\",\"about\",\"@99000046\"],\"spec\":\"%m.varMap put key %s value %s\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 25 | "{\"color\":-1147626,\"id\":\"99000046\",\"nextBlock\":-1,\"opCode\":\"getVar\",\"parameters\":[],\"spec\":\"DEFAULT_ABOUT\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n" + 26 | "{\"color\":-1147626,\"id\":\"99000037\",\"nextBlock\":99000038,\"opCode\":\"mapPut\",\"parameters\":[\"registerData\",\"profile_picture\",\"null\"],\"spec\":\"%m.varMap put key %s value %s\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 27 | "{\"color\":-1147626,\"id\":\"99000038\",\"nextBlock\":99000088,\"opCode\":\"mapPut\",\"parameters\":[\"registerData\",\"uid\",\"@99000042\"],\"spec\":\"%m.varMap put key %s value %s\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 28 | "{\"color\":-13851166,\"id\":\"99000042\",\"nextBlock\":-1,\"opCode\":\"firebaseauthGetUid\",\"parameters\":[],\"spec\":\"FirebaseAuth getUid\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n" + 29 | "{\"color\":-13851166,\"id\":\"99000088\",\"nextBlock\":99000039,\"opCode\":\"fileSetData\",\"parameters\":[\"data\",\"username\",\"@99000089\"],\"spec\":\"%m.file setData key %s value %s\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 30 | "{\"color\":-1147626,\"id\":\"99000089\",\"nextBlock\":-1,\"opCode\":\"getVar\",\"parameters\":[],\"spec\":\"temp\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n" + 31 | "{\"color\":-13851166,\"id\":\"99000039\",\"nextBlock\":99000059,\"opCode\":\"firebaseAdd\",\"parameters\":[\"f_db\",\"@99000040\",\"registerData\"],\"spec\":\"%m.firebase add key %s value %m.varMap\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 32 | "{\"color\":-1147626,\"id\":\"99000040\",\"nextBlock\":-1,\"opCode\":\"getVar\",\"parameters\":[],\"spec\":\"key\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n" + 33 | "{\"color\":-10701022,\"id\":\"99000059\",\"nextBlock\":99000051,\"opCode\":\"addSourceDirectly\",\"parameters\":[\"f_auth.getCurrentUser().sendEmailVerification().addOnCompleteListener(new OnCompleteListener\\u003cVoid\\u003e() { \\n@Override\\npublic void onComplete(@android.support.annotation.NonNull Task\\u003cVoid\\u003e task) {\\nif (task.isSuccessful()) {\"],\"spec\":\"add source directly %s.inputOnly\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 34 | "{\"color\":-13851166,\"id\":\"99000051\",\"nextBlock\":99000052,\"opCode\":\"firebaseauthSignOutUser\",\"parameters\":[],\"spec\":\"FirebaseAuth signOut\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 35 | "{\"color\":-7711273,\"id\":\"99000052\",\"nextBlock\":99000053,\"opCode\":\"definedFunc\",\"parameters\":[\"Registered successfully. Please check your email for verification\"],\"spec\":\"createSnackBar %s.message\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 36 | "{\"color\":-1147626,\"id\":\"99000053\",\"nextBlock\":99000055,\"opCode\":\"setVarBoolean\",\"parameters\":[\"LoginMode\",\"@99000054\"],\"spec\":\"set %m.varBool to %b\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 37 | "{\"color\":-10701022,\"id\":\"99000054\",\"nextBlock\":-1,\"opCode\":\"true\",\"parameters\":[],\"spec\":\"true\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"b\",\"typeName\":\"\"}\n" + 38 | "{\"color\":-7711273,\"id\":\"99000055\",\"nextBlock\":99000043,\"opCode\":\"definedFunc\",\"parameters\":[],\"spec\":\"refreshMode\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 39 | "{\"color\":-11899692,\"id\":\"99000043\",\"nextBlock\":99000044,\"opCode\":\"setVisible\",\"parameters\":[\"progressbar1\",\"GONE\"],\"spec\":\"%m.view setVisible %m.visible\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 40 | "{\"color\":-11899692,\"id\":\"99000044\",\"nextBlock\":99000060,\"opCode\":\"setVisible\",\"parameters\":[\"button1\",\"VISIBLE\"],\"spec\":\"%m.view setVisible %m.visible\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 41 | "{\"color\":-10701022,\"id\":\"99000060\",\"nextBlock\":99000061,\"opCode\":\"addSourceDirectly\",\"parameters\":[\"} else {\"],\"spec\":\"add source directly %s.inputOnly\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 42 | "{\"color\":-10701022,\"id\":\"99000061\",\"nextBlock\":-1,\"opCode\":\"addSourceDirectly\",\"parameters\":[\"}}});\"],\"spec\":\"add source directly %s.inputOnly\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 43 | "{\"color\":-10701022,\"id\":\"99000047\",\"nextBlock\":99000083,\"opCode\":\"addSourceDirectly\",\"parameters\":[\"if (f_auth.getCurrentUser().isEmailVerified()) {\"],\"spec\":\"add source directly %s.inputOnly\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 44 | "{\"color\":-1988310,\"id\":\"99000083\",\"nextBlock\":99000049,\"opCode\":\"ifElse\",\"parameters\":[\"@99000084\"],\"spec\":\"if %b then\",\"subStack1\":99000086,\"subStack2\":99000015,\"type\":\"e\",\"typeName\":\"\"}\n" + 45 | "{\"color\":-3384542,\"id\":\"99000084\",\"nextBlock\":-1,\"opCode\":\"containListStr\",\"parameters\":[\"banned\",\"@99000085\"],\"spec\":\"%m.listStr contains %s\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"b\",\"typeName\":\"\"}\n" + 46 | "{\"color\":-13851166,\"id\":\"99000085\",\"nextBlock\":-1,\"opCode\":\"firebaseauthGetUid\",\"parameters\":[],\"spec\":\"FirebaseAuth getUid\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n" + 47 | "{\"color\":-7711273,\"id\":\"99000086\",\"nextBlock\":99000087,\"opCode\":\"definedFunc\",\"parameters\":[\"Your account has been banned. Contact us if you think it\\u0027s mistake.\"],\"spec\":\"createSnackBar %s.message\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 48 | "{\"color\":-13851166,\"id\":\"99000087\",\"nextBlock\":-1,\"opCode\":\"firebaseauthSignOutUser\",\"parameters\":[],\"spec\":\"FirebaseAuth signOut\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 49 | "{\"color\":-13851166,\"id\":\"99000015\",\"nextBlock\":99000012,\"opCode\":\"doToast\",\"parameters\":[\"@99000017\"],\"spec\":\"Toast %s\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 50 | "{\"color\":-10701022,\"id\":\"99000017\",\"nextBlock\":-1,\"opCode\":\"stringJoin\",\"parameters\":[\"Welcome back, \",\"@99000016\"],\"spec\":\"join %s and %s\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n" + 51 | "{\"color\":-13851166,\"id\":\"99000016\",\"nextBlock\":-1,\"opCode\":\"firebaseauthGetCurrentUser\",\"parameters\":[],\"spec\":\"FirebaseAuth getEmail\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n" + 52 | "{\"color\":-13851166,\"id\":\"99000012\",\"nextBlock\":99000013,\"opCode\":\"intentSetScreen\",\"parameters\":[\"intent\",\"HomeActivity\"],\"spec\":\"%m.intent setScreen %m.activity\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 53 | "{\"color\":-13851166,\"id\":\"99000013\",\"nextBlock\":99000048,\"opCode\":\"startActivity\",\"parameters\":[\"intent\"],\"spec\":\"StartActivity %m.intent\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 54 | "{\"color\":-10701022,\"id\":\"99000048\",\"nextBlock\":-1,\"opCode\":\"addSourceDirectly\",\"parameters\":[\"finish();\"],\"spec\":\"add source directly %s.inputOnly\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 55 | "{\"color\":-10701022,\"id\":\"99000049\",\"nextBlock\":99000058,\"opCode\":\"addSourceDirectly\",\"parameters\":[\"} else {\"],\"spec\":\"add source directly %s.inputOnly\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 56 | "{\"color\":-13851166,\"id\":\"99000058\",\"nextBlock\":99000064,\"opCode\":\"firebaseauthSignOutUser\",\"parameters\":[],\"spec\":\"FirebaseAuth signOut\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 57 | "{\"color\":-7711273,\"id\":\"99000064\",\"nextBlock\":99000056,\"opCode\":\"definedFunc\",\"parameters\":[\"Please verify your email address\"],\"spec\":\"createSnackBar %s.message\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 58 | "{\"color\":-10701022,\"id\":\"99000056\",\"nextBlock\":-1,\"opCode\":\"addSourceDirectly\",\"parameters\":[\"}\"],\"spec\":\"add source directly %s.inputOnly\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 59 | "{\"color\":-7711273,\"id\":\"99000022\",\"nextBlock\":-1,\"opCode\":\"definedFunc\",\"parameters\":[\"@99000019\"],\"spec\":\"createSnackBar %s.message\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\" \",\"typeName\":\"\"}\n" + 60 | "{\"color\":-7711273,\"id\":\"99000019\",\"nextBlock\":-1,\"opCode\":\"getArg\",\"parameters\":[],\"spec\":\"errorMessage\",\"subStack1\":-1,\"subStack2\":-1,\"type\":\"s\",\"typeName\":\"\"}\n"; 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/MainActivity.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.widget.LinearLayout; 6 | 7 | import com.google.gson.Gson; 8 | 9 | import java.util.ArrayList; 10 | 11 | import ma.swblockspreview.bean.BlockBean; 12 | 13 | public class MainActivity extends Activity { 14 | private BlockPreviewer blockPreviewer; 15 | 16 | @Override 17 | protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | setContentView(R.layout.activity_main); 20 | 21 | blockPreviewer = new BlockPreviewer(this); 22 | LinearLayout container = findViewById(R.id.lnContainer); 23 | 24 | findViewById(R.id.btnPreview).setOnClickListener(v -> { 25 | var gson = new Gson(); 26 | var blocks = new ArrayList(); 27 | 28 | for (var line : Constants.SAMPLE_BLOCKS_STR.split("\n")) { 29 | blocks.add(gson.fromJson(line, BlockBean.class)); 30 | } 31 | 32 | blockPreviewer.previewInto(container, blocks); 33 | }); 34 | } 35 | 36 | @Override 37 | protected void onDestroy() { 38 | blockPreviewer.dispose(); 39 | super.onDestroy(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/bean/BlockBean.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview.bean; 2 | 3 | import com.google.gson.annotations.Expose; 4 | 5 | import java.util.ArrayList; 6 | 7 | import ma.swblockspreview.util.Gx; 8 | import ma.swblockspreview.util.mq; 9 | 10 | public class BlockBean { 11 | public Gx classInfo; 12 | @Expose 13 | public int color; 14 | @Expose 15 | public String id; 16 | @Expose 17 | public int nextBlock; 18 | @Expose 19 | public String opCode; 20 | public ArrayList paramClassInfo; 21 | @Expose 22 | public ArrayList parameters; 23 | @Expose 24 | public String spec; 25 | @Expose 26 | public int subStack1; 27 | @Expose 28 | public int subStack2; 29 | @Expose 30 | public String type; 31 | @Expose 32 | public String typeName; 33 | 34 | public BlockBean() { 35 | parameters = new ArrayList<>(); 36 | subStack1 = -1; 37 | subStack2 = -1; 38 | nextBlock = -1; 39 | } 40 | 41 | public BlockBean(String var1, String var2, String var3, String var4) { 42 | this(var1, var2, var3, "", var4); 43 | } 44 | 45 | public BlockBean(String var1, String var2, String var3, String var4, String var5) { 46 | id = var1; 47 | spec = var2; 48 | type = var3; 49 | typeName = var4; 50 | opCode = var5; 51 | parameters = new ArrayList<>(); 52 | subStack1 = -1; 53 | subStack2 = -1; 54 | nextBlock = -1; 55 | buildClassInfo(); 56 | } 57 | 58 | private void buildClassInfo() { 59 | classInfo = mq.a(type, typeName); 60 | paramClassInfo = mq.a(spec); 61 | } 62 | 63 | public BlockBean clone() { 64 | BlockBean var1 = new BlockBean(); 65 | var1.copy(this); 66 | return var1; 67 | } 68 | 69 | public void copy(BlockBean var1) { 70 | id = var1.id; 71 | spec = var1.spec; 72 | type = var1.type; 73 | typeName = var1.typeName; 74 | opCode = var1.opCode; 75 | color = var1.color; 76 | parameters = new ArrayList<>(var1.parameters); 77 | subStack1 = var1.subStack1; 78 | subStack2 = var1.subStack2; 79 | nextBlock = var1.nextBlock; 80 | buildClassInfo(); 81 | } 82 | 83 | } 84 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/editor/Rs.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview.editor; 2 | 3 | import android.content.Context; 4 | import android.graphics.Rect; 5 | import android.graphics.Typeface; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | 9 | import java.util.ArrayList; 10 | 11 | import ma.swblockspreview.bean.BlockBean; 12 | import ma.swblockspreview.editor.logic.BlockPane; 13 | import ma.swblockspreview.util.StringUtils; 14 | import ma.swblockspreview.util.kq; 15 | 16 | public class Rs extends Ts { 17 | public String T; 18 | public String U; 19 | public ArrayList V; 20 | public int W = 30; 21 | public int aa = 50; 22 | public int ba = 90; 23 | public int ca = 90; 24 | public int da = 4; 25 | public boolean ea = false; 26 | public boolean fa = false; 27 | public boolean ga = false; 28 | public int ha = -1; 29 | public int ia = -1; 30 | public int ja = -1; 31 | public ArrayList ka = new ArrayList<>(); 32 | public ArrayList la = new ArrayList<>(); 33 | public TextView ma = null; 34 | public int na = 0; 35 | public int oa = 0; 36 | public BlockPane pa = null; 37 | public String qa; 38 | public String ra; 39 | 40 | public Rs(Context var1, int var2, String var3, String var4, String var5) { 41 | super(var1, var4, false); 42 | setTag(Integer.valueOf(var2)); 43 | T = var3; 44 | U = var5; 45 | l(); 46 | } 47 | 48 | public Rs(Context var1, int var2, String var3, String var4, String var5, String var6) { 49 | super(var1, var4, var5, false); 50 | setTag(Integer.valueOf(var2)); 51 | T = var3; 52 | U = var6; 53 | l(); 54 | } 55 | 56 | public final int a(TextView var1) { 57 | Rect var2 = new Rect(); 58 | var1.getPaint().getTextBounds(var1.getText().toString(), 0, var1.getText().length(), var2); 59 | return var2.width(); 60 | } 61 | 62 | public final TextView a(String var1) { 63 | TextView var2 = new TextView(super.a); 64 | if (U.equals("getVar") || U.equals("getArg")) { 65 | String var3 = super.c; 66 | if (var3 != null && var3.length() > 0) { 67 | var1 = super.c + " : " + var1; 68 | } 69 | } 70 | 71 | var2.setText(var1); 72 | var2.setTextSize(10.0F); 73 | var2.setPadding(0, 0, 0, 0); 74 | var2.setGravity(16); 75 | var2.setTextColor(-1); 76 | var2.setTypeface(null, Typeface.BOLD); 77 | LayoutParams var4 = new LayoutParams(-2, super.G); 78 | var4.setMargins(0, 0, 0, 0); 79 | var2.setLayoutParams(var4); 80 | return var2; 81 | } 82 | 83 | public final void a(Rs var1) { 84 | if (b() && -1 == ia) { 85 | e(var1); 86 | } else { 87 | Rs var2 = h(); 88 | var2.ha = ((Integer) var1.getTag()).intValue(); 89 | var1.E = var2; 90 | } 91 | } 92 | 93 | public void a(Ts var1, Rs var2) { 94 | int var3 = ka.indexOf(var1); 95 | if (var3 >= 0) { 96 | boolean var4 = var1 instanceof Rs; 97 | if (var4) { 98 | Rs var6 = (Rs) var1; 99 | var2.qa = var6.qa; 100 | var2.ra = var6.ra; 101 | } else if (var1 instanceof Ss) { 102 | var2.qa = var1.b; 103 | var2.ra = var1.c; 104 | } 105 | 106 | if (!var4) { 107 | removeView(var1); 108 | } 109 | 110 | ka.set(var3, var2); 111 | var2.E = this; 112 | i(); 113 | o(); 114 | if (var1 != var2 && var4) { 115 | var1.E = null; 116 | var1.setX(10.0F + getX() + (float) getWidthSum()); 117 | var1.setY(5.0F + getY()); 118 | ((Rs) var1).k(); 119 | } 120 | 121 | } 122 | } 123 | 124 | public final void a(String var1, int var2) { 125 | ArrayList var3 = StringUtils.tokenize(var1); 126 | ka = new ArrayList<>(); 127 | la = new ArrayList<>(); 128 | 129 | for (int var4 = 0; var4 < var3.size(); ++var4) { 130 | View var5 = b(var3.get(var4), var2); 131 | if (var5 instanceof Ts) { 132 | ((Ts) var5).E = this; 133 | } 134 | 135 | ka.add(var5); 136 | String var7; 137 | if (var5 instanceof Ss) { 138 | var7 = var3.get(var4); 139 | } else { 140 | var7 = "icon"; 141 | } 142 | 143 | if (var5 instanceof TextView) { 144 | var7 = "label"; 145 | } 146 | 147 | la.add(var7); 148 | } 149 | 150 | } 151 | 152 | public final View b(String var1, int var2) { 153 | if (var1.length() >= 2 && var1.charAt(0) == 37) { 154 | char var3 = var1.charAt(1); 155 | String var4 = ""; 156 | if (var3 == 98) { 157 | return new Ss(super.a, "b", var4); 158 | } 159 | 160 | if (var3 == 100) { 161 | return new Ss(super.a, "d", var4); 162 | } 163 | 164 | if (var3 == 109) { 165 | return new Ss(super.a, "m", var1.substring(3)); 166 | } 167 | 168 | if (var3 == 115) { 169 | Context var5 = super.a; 170 | if (var1.length() > 2) { 171 | var4 = var1.substring(3); 172 | } 173 | 174 | return new Ss(var5, "s", var4); 175 | } 176 | } 177 | 178 | return a(StringUtils.unescape(var1)); 179 | } 180 | 181 | public void b(Rs var1) { 182 | View var2 = pa.findViewWithTag(Integer.valueOf(ha)); 183 | if (var2 != null) { 184 | ((Rs) var2).E = null; 185 | } 186 | 187 | var1.E = this; 188 | ha = ((Integer) var1.getTag()).intValue(); 189 | if (var2 != null) { 190 | var1.a((Rs) var2); 191 | } 192 | 193 | } 194 | 195 | public void c(Rs var1) { 196 | var1.setX(getX()); 197 | var1.setY(getY() - (float) var1.getHeightSum() + (float) super.h); 198 | var1.h().b(this); 199 | } 200 | 201 | public void d(Rs var1) { 202 | var1.setX(getX() - (float) super.j); 203 | var1.setY(getY() - (float) f()); 204 | super.E = var1; 205 | var1.ia = ((Integer) getTag()).intValue(); 206 | } 207 | 208 | public void e(Rs var1) { 209 | View var2 = pa.findViewWithTag(Integer.valueOf(ia)); 210 | if (var2 != null) { 211 | ((Rs) var2).E = null; 212 | } 213 | 214 | var1.E = this; 215 | ia = ((Integer) var1.getTag()).intValue(); 216 | if (var2 != null) { 217 | var1.a((Rs) var2); 218 | } 219 | 220 | } 221 | 222 | public void f(Rs var1) { 223 | View var2 = pa.findViewWithTag(Integer.valueOf(ja)); 224 | if (var2 != null) { 225 | ((Rs) var2).E = null; 226 | } 227 | 228 | var1.E = this; 229 | ja = ((Integer) var1.getTag()).intValue(); 230 | if (var2 != null) { 231 | var1.a((Rs) var2); 232 | } 233 | 234 | } 235 | 236 | public void g(Rs var1) { 237 | if (ha == ((Integer) var1.getTag()).intValue()) { 238 | ha = -1; 239 | } 240 | 241 | if (ia == ((Integer) var1.getTag()).intValue()) { 242 | ia = -1; 243 | } 244 | 245 | if (ja == ((Integer) var1.getTag()).intValue()) { 246 | ja = -1; 247 | } 248 | 249 | if (var1.fa) { 250 | int var2 = ka.indexOf(var1); 251 | if (var2 < 0) { 252 | return; 253 | } 254 | 255 | var1.qa = ""; 256 | var1.ra = ""; 257 | View var3 = b(la.get(var2), super.e); 258 | if (var3 instanceof Ts) { 259 | ((Ts) var3).E = this; 260 | } 261 | 262 | ka.set(var2, var3); 263 | addView(var3); 264 | i(); 265 | o(); 266 | } 267 | 268 | p().k(); 269 | } 270 | 271 | public ArrayList getAllChildren() { 272 | ArrayList var1 = new ArrayList<>(); 273 | Rs var2 = this; 274 | 275 | while (true) { 276 | var1.add(var2); 277 | 278 | for (View var10 : var2.ka) { 279 | if (var10 instanceof Rs) { 280 | var1.addAll(((Rs) var10).getAllChildren()); 281 | } 282 | } 283 | 284 | if (var2.b()) { 285 | int var8 = var2.ia; 286 | if (var8 != -1) { 287 | var1.addAll(((Rs) pa.findViewWithTag(Integer.valueOf(var8))).getAllChildren()); 288 | } 289 | } 290 | 291 | if (var2.c()) { 292 | int var6 = var2.ja; 293 | if (var6 != -1) { 294 | var1.addAll(((Rs) pa.findViewWithTag(Integer.valueOf(var6))).getAllChildren()); 295 | } 296 | } 297 | 298 | int var5 = var2.ha; 299 | if (var5 == -1) { 300 | return var1; 301 | } 302 | 303 | var2 = pa.findViewWithTag(Integer.valueOf(var5)); 304 | } 305 | } 306 | 307 | public BlockBean getBean() { 308 | BlockBean var1 = new BlockBean(getTag().toString(), T, super.b, super.c, U); 309 | var1.color = super.e; 310 | 311 | for (View var3 : V) { 312 | if (var3 instanceof Ss) { 313 | var1.parameters.add(((Ss) var3).getArgValue().toString()); 314 | } else if (var3 instanceof Rs) { 315 | ArrayList var4 = var1.parameters; 316 | String var5 = "@" + var3.getTag().toString(); 317 | var4.add(var5); 318 | } 319 | } 320 | 321 | var1.subStack1 = ia; 322 | var1.subStack2 = ja; 323 | var1.nextBlock = ha; 324 | return var1; 325 | } 326 | 327 | public int getBlockType() { 328 | return oa; 329 | } 330 | 331 | public int getDepth() { 332 | int var1 = 0; 333 | Rs var2 = this; 334 | 335 | while (true) { 336 | var2 = var2.E; 337 | if (var2 == null) { 338 | return var1; 339 | } 340 | 341 | ++var1; 342 | } 343 | } 344 | 345 | public int getHeightSum() { 346 | int var1 = 0; 347 | Rs var2 = this; 348 | 349 | while (true) { 350 | if (var1 > 0) { 351 | var1 -= super.h; 352 | } 353 | 354 | var1 += var2.getTotalHeight(); 355 | int var3 = var2.ha; 356 | if (var3 == -1) { 357 | return var1; 358 | } 359 | 360 | var2 = pa.findViewWithTag(Integer.valueOf(var3)); 361 | } 362 | } 363 | 364 | public int getWidthSum() { 365 | int var1 = 0; 366 | Rs var2 = this; 367 | 368 | while (true) { 369 | var1 = Math.max(var1, var2.getW()); 370 | if (var2.b()) { 371 | int var5 = var2.ia; 372 | if (var5 != -1) { 373 | var1 = Math.max(var1, super.j + ((Rs) pa.findViewWithTag(Integer.valueOf(var5))).getWidthSum()); 374 | } 375 | } 376 | 377 | if (var2.c()) { 378 | int var4 = var2.ja; 379 | if (var4 != -1) { 380 | var1 = Math.max(var1, super.j + ((Rs) pa.findViewWithTag(Integer.valueOf(var4))).getWidthSum()); 381 | } 382 | } 383 | 384 | int var3 = var2.ha; 385 | if (var3 == -1) { 386 | return var1; 387 | } 388 | 389 | var2 = pa.findViewWithTag(Integer.valueOf(var3)); 390 | } 391 | } 392 | 393 | public Rs h() { 394 | Rs var1 = this; 395 | 396 | while (true) { 397 | int var2 = var1.ha; 398 | if (var2 == -1) { 399 | return var1; 400 | } 401 | 402 | var1 = pa.findViewWithTag(Integer.valueOf(var2)); 403 | } 404 | } 405 | 406 | public final void i() { 407 | V = new ArrayList<>(); 408 | 409 | for (int var1 = 0; var1 < ka.size(); ++var1) { 410 | View var2 = ka.get(var1); 411 | if (var2 instanceof Rs || var2 instanceof Ss) { 412 | V.add(var2); 413 | } 414 | } 415 | 416 | } 417 | 418 | public final void j() { 419 | TextView var1 = ma; 420 | if (var1 != null) { 421 | var1.bringToFront(); 422 | ma.setX((float) super.w); 423 | ma.setY((float) (g() - super.n)); 424 | } 425 | 426 | } 427 | 428 | public void k() { 429 | bringToFront(); 430 | int var1 = super.w; 431 | 432 | for (int var2 = 0; var2 < ka.size(); ++var2) { 433 | View var12 = ka.get(var2); 434 | var12.bringToFront(); 435 | boolean var13 = var12 instanceof Rs; 436 | if (var13) { 437 | var12.setX(getX() + (float) var1); 438 | } else { 439 | var12.setX((float) var1); 440 | } 441 | 442 | int var14; 443 | if (la.get(var2).equals("label")) { 444 | var14 = a((TextView) var12); 445 | } else { 446 | var14 = 0; 447 | } 448 | 449 | if (var12 instanceof Ss) { 450 | var14 = ((Ss) var12).getW(); 451 | } 452 | 453 | if (var13) { 454 | var14 = ((Rs) var12).getWidthSum(); 455 | } 456 | 457 | var1 += var14 + da; 458 | if (var13) { 459 | float var15 = getY() + (float) super.u; 460 | int var16 = na; 461 | Rs var17 = (Rs) var12; 462 | var12.setY(var15 + (float) ((var16 - var17.na - 1) * super.y)); 463 | var17.k(); 464 | } else { 465 | var12.setY((float) (super.u + na * super.y)); 466 | } 467 | } 468 | 469 | if (super.b.equals("b") || super.b.equals("d") || super.b.equals("s") || super.b.equals("a")) { 470 | var1 = Math.max(var1, W); 471 | } 472 | 473 | if (super.b.equals(" ") || super.b.equals("") || super.b.equals("f")) { 474 | var1 = Math.max(var1, aa); 475 | } 476 | 477 | if (super.b.equals("c") || super.b.equals("e")) { 478 | var1 = Math.max(var1, ca); 479 | } 480 | 481 | if (super.b.equals("h")) { 482 | var1 = Math.max(var1, ba); 483 | } 484 | 485 | a((float) (var1 + super.x), (float) (super.u + super.G + 2 * na * super.y + super.v), true); 486 | if (b()) { 487 | int var5 = super.i; 488 | int var6 = ia; 489 | if (var6 > -1) { 490 | Rs var11 = pa.findViewWithTag(Integer.valueOf(var6)); 491 | var11.setX(getX() + (float) super.j); 492 | var11.setY(getY() + (float) f()); 493 | var11.bringToFront(); 494 | var11.k(); 495 | var5 = var11.getHeightSum(); 496 | } 497 | 498 | setSubstack1Height(var5); 499 | int var7 = super.i; 500 | int var8 = ja; 501 | if (var8 > -1) { 502 | Rs var9 = pa.findViewWithTag(Integer.valueOf(var8)); 503 | var9.setX(getX() + (float) super.j); 504 | var9.setY(getY() + (float) g()); 505 | var9.bringToFront(); 506 | var9.k(); 507 | int var10 = var9.getHeightSum(); 508 | if (var9.h().ga) { 509 | var7 = var10 + super.h; 510 | } else { 511 | var7 = var10; 512 | } 513 | } 514 | 515 | setSubstack2Height(var7); 516 | j(); 517 | } 518 | 519 | int var3 = ha; 520 | if (var3 > -1) { 521 | Rs var4 = pa.findViewWithTag(Integer.valueOf(var3)); 522 | var4.setX(getX()); 523 | var4.setY(getY() + (float) d()); 524 | var4.bringToFront(); 525 | var4.k(); 526 | } 527 | 528 | } 529 | 530 | public void l() { 531 | byte var5; 532 | label84: 533 | { 534 | setDrawingCacheEnabled(false); 535 | float var1 = (float) W; 536 | float var2 = super.D; 537 | W = (int) (var1 * var2); 538 | aa = (int) (var2 * (float) aa); 539 | ba = (int) (var2 * (float) ba); 540 | ca = (int) (var2 * (float) ca); 541 | da = (int) (var2 * (float) da); 542 | String var3 = super.b; 543 | int var4 = var3.hashCode(); 544 | if (var4 != 32) { 545 | if (var4 != 104) { 546 | if (var4 != 108) { 547 | if (var4 != 112) { 548 | if (var4 != 115) { 549 | if (var4 != 118) { 550 | switch (var4) { 551 | case 97: 552 | if (var3.equals("a")) { 553 | var5 = 7; 554 | break label84; 555 | } 556 | break; 557 | case 98: 558 | if (var3.equals("b")) { 559 | var5 = 1; 560 | break label84; 561 | } 562 | break; 563 | case 99: 564 | if (var3.equals("c")) { 565 | var5 = 8; 566 | break label84; 567 | } 568 | break; 569 | case 100: 570 | if (var3.equals("d")) { 571 | var5 = 3; 572 | break label84; 573 | } 574 | break; 575 | case 101: 576 | if (var3.equals("e")) { 577 | var5 = 9; 578 | break label84; 579 | } 580 | break; 581 | case 102: 582 | if (var3.equals("f")) { 583 | var5 = 10; 584 | break label84; 585 | } 586 | } 587 | } else if (var3.equals("v")) { 588 | var5 = 4; 589 | break label84; 590 | } 591 | } else if (var3.equals("s")) { 592 | var5 = 2; 593 | break label84; 594 | } 595 | } else if (var3.equals("p")) { 596 | var5 = 5; 597 | break label84; 598 | } 599 | } else if (var3.equals("l")) { 600 | var5 = 6; 601 | break label84; 602 | } 603 | } else if (var3.equals("h")) { 604 | var5 = 11; 605 | break label84; 606 | } 607 | } else if (var3.equals(" ")) { 608 | var5 = 0; 609 | break label84; 610 | } 611 | 612 | var5 = -1; 613 | } 614 | 615 | switch (var5) { 616 | case 0: 617 | case 8: 618 | case 9: 619 | default: 620 | break; 621 | case 1: 622 | case 2: 623 | case 3: 624 | case 4: 625 | case 5: 626 | case 6: 627 | case 7: 628 | fa = true; 629 | break; 630 | case 10: 631 | ga = true; 632 | break; 633 | case 11: 634 | ea = true; 635 | } 636 | 637 | /* 638 | if(!this.ea && !this.U.equals("definedFunc") && !this.U.equals("getVar") && !this.U.equals("getArg")) { 639 | this.T = xB.b().a(this.getContext(), this.U); 640 | } 641 | */ 642 | 643 | /*if(this.T.equals("")) { 644 | this.T = MakeBlock.getSpecBlock(this.U); 645 | }*/ 646 | 647 | setSpec(T); 648 | 649 | int colorc = kq.getBlockColor(U, super.b); 650 | 651 | if (colorc != -12289797) { 652 | super.e = colorc; 653 | } 654 | 655 | //super.e = /* MakeBlock.getColorBlock(*/kq.a(this.U, super.b);//, this.U); 656 | } 657 | 658 | public void m() { 659 | Rs var1 = this; 660 | 661 | do { 662 | var1.n(); 663 | var1 = var1.E; 664 | } while (var1 != null); 665 | 666 | } 667 | 668 | public void n() { 669 | int var1 = super.w; 670 | 671 | for (int var2 = 0; var2 < ka.size(); ++var2) { 672 | View var4 = ka.get(var2); 673 | int var5; 674 | if (la.get(var2).equals("label")) { 675 | var5 = a((TextView) var4); 676 | } else { 677 | var5 = 0; 678 | } 679 | 680 | if (var4 instanceof Ss) { 681 | var5 = ((Ss) var4).getW(); 682 | } 683 | 684 | if (var4 instanceof Rs) { 685 | var5 = ((Rs) var4).getWidthSum(); 686 | } 687 | 688 | var1 += var5 + da; 689 | } 690 | 691 | if (super.b.equals("b") || super.b.equals("d") || super.b.equals("s") || super.b.equals("a")) { 692 | var1 = Math.max(var1, W); 693 | } 694 | 695 | if (super.b.equals(" ") || super.b.equals("") || super.b.equals("o")) { 696 | var1 = Math.max(var1, aa); 697 | } 698 | 699 | if (super.b.equals("c") || super.b.equals("e")) { 700 | var1 = Math.max(var1, ca); 701 | } 702 | 703 | if (super.b.equals("h")) { 704 | var1 = Math.max(var1, ba); 705 | } 706 | 707 | TextView var3 = ma; 708 | if (var3 != null) { 709 | var1 = Math.max(var1, 2 + super.w + var3.getWidth()); 710 | } 711 | 712 | a((float) (var1 + super.x), (float) (super.u + super.G + 2 * na * super.y + super.v), false); 713 | } 714 | 715 | public void o() { 716 | for (Rs var1 = this; var1 != null; var1 = var1.E) { 717 | int var2 = 0; 718 | 719 | for (View var4 : var1.V) { 720 | if (var4 instanceof Rs) { 721 | var2 = Math.max(var2, 1 + ((Rs) var4).na); 722 | } 723 | } 724 | 725 | var1.na = var2; 726 | var1.n(); 727 | if (!var1.fa) { 728 | return; 729 | } 730 | } 731 | 732 | } 733 | 734 | public Rs p() { 735 | Rs var1 = this; 736 | 737 | while (true) { 738 | Rs var2 = var1.E; 739 | if (var2 == null) { 740 | return var1; 741 | } 742 | 743 | var1 = var2; 744 | } 745 | } 746 | 747 | public void setBlockType(int var1) { 748 | oa = var1; 749 | } 750 | 751 | public void setSpec(String var1) { 752 | T = var1; 753 | removeAllViews(); 754 | a(T, super.e); 755 | 756 | for (View view : ka) { 757 | addView(view); 758 | } 759 | 760 | i(); 761 | if (super.b.equals("e") && U.equals("ifElse")) { 762 | ma = a("else"); 763 | addView(ma); 764 | } 765 | 766 | if (super.b.equals("e") && U.equals("tryCatch")) { 767 | ma = a("Catch"); 768 | addView(ma); 769 | } 770 | 771 | k(); 772 | } 773 | } 774 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/editor/Ss.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview.editor; 2 | 3 | import android.content.Context; 4 | import android.graphics.Paint; 5 | import android.graphics.Rect; 6 | import android.graphics.Typeface; 7 | import android.widget.TextView; 8 | 9 | import ma.swblockspreview.util.kq; 10 | 11 | public class Ss extends Ts { 12 | public Context T; 13 | public Object U = ""; 14 | public TextView V; 15 | public TextView W; 16 | public int aa = 20; 17 | public int ba = 4; 18 | public int ca = 2; 19 | public int da = 0; 20 | public int ea = 0; 21 | 22 | public Ss(Context context, String str, String str2) { 23 | super(context, str, str2, true); 24 | T = context; 25 | as(context); 26 | } 27 | 28 | private void as(Context var1) { 29 | byte var4; 30 | label68: 31 | { 32 | String var2 = super.b; 33 | int var3 = var2.hashCode(); 34 | if (var3 != 98) { 35 | if (var3 != 100) { 36 | if (var3 != 115) { 37 | if (var3 != 109) { 38 | if (var3 == 110 && var2.equals("n")) { 39 | var4 = 2; 40 | break label68; 41 | } 42 | } else if (var2.equals("m")) { 43 | var4 = 4; 44 | break label68; 45 | } 46 | } else if (var2.equals("s")) { 47 | var4 = 3; 48 | break label68; 49 | } 50 | } else if (var2.equals("d")) { 51 | var4 = 1; 52 | break label68; 53 | } 54 | } else if (var2.equals("b")) { 55 | var4 = 0; 56 | break label68; 57 | } 58 | 59 | var4 = -1; 60 | } 61 | 62 | if (var4 != 0) { 63 | if (var4 != 1) { 64 | if (var4 != 2) { 65 | if (var4 != 3) { 66 | if (var4 == 4) { 67 | super.e = 805306368; 68 | } 69 | } else { 70 | super.e = -1; 71 | } 72 | } else { 73 | super.e = -3155748; 74 | } 75 | } else { 76 | super.e = -657931; 77 | } 78 | } else { 79 | super.e = 1342177280; 80 | aa = 25; 81 | } 82 | 83 | float var5 = (float) aa; 84 | float var6 = super.D; 85 | aa = (int) (var5 * var6); 86 | ba = (int) (var6 * (float) ba); 87 | ca = (int) (var6 * (float) ca); 88 | da = ca; 89 | if (super.b.equals("m") && a(super.c).length() >= 0) { 90 | W = b(super.c); 91 | addView(W); 92 | da = getDropdownTypeWidth(); 93 | } 94 | 95 | if (super.b.equals("m") || super.b.equals("d") || super.b.equals("n") || super.b.equals("s")) { 96 | V = c(""); 97 | addView(V); 98 | } 99 | 100 | a((float) (aa + da), (float) super.G, false); 101 | } 102 | 103 | private int getDropdownTypeWidth() { 104 | Rect rect = new Rect(); 105 | Paint paint = W.getPaint(); 106 | String a = a(c); 107 | paint.getTextBounds(a, 0, a.length(), rect); 108 | return rect.width() + (ca * 2); 109 | } 110 | 111 | private int getLabelWidth() { 112 | Rect rect = new Rect(); 113 | V.getPaint().getTextBounds(V.getText().toString(), 0, V.getText().length(), rect); 114 | return rect.width() + ba; 115 | } 116 | 117 | public final String a(String str) { 118 | String b = kq.b(str); 119 | if (b.length() <= 0) { 120 | return b; 121 | } 122 | return b + " : "; 123 | } 124 | 125 | public final TextView b(String str) { 126 | TextView textView = new TextView(T); 127 | textView.setText(a(str)); 128 | textView.setTextSize(8.0f); 129 | textView.setTypeface(null, Typeface.BOLD); 130 | LayoutParams layoutParams = new LayoutParams(-2, G); 131 | int i = ca; 132 | layoutParams.setMargins(i, 0, i, 0); 133 | textView.setPadding(0, 0, 0, 0); 134 | textView.setLayoutParams(layoutParams); 135 | textView.setBackgroundColor(0); 136 | textView.setSingleLine(); 137 | textView.setGravity(17); 138 | textView.setTextColor(-1); 139 | return textView; 140 | } 141 | 142 | public final TextView c(String str) { 143 | TextView textView = new TextView(T); 144 | textView.setText(str); 145 | textView.setTextSize(9.0f); 146 | LayoutParams layoutParams = new LayoutParams(aa, G); 147 | layoutParams.setMargins(da, 0, ea, 0); 148 | textView.setPadding(0, 0, 0, 0); 149 | textView.setLayoutParams(layoutParams); 150 | textView.setBackgroundColor(0); 151 | textView.setSingleLine(); 152 | textView.setGravity(17); 153 | if (b.equals("m")) { 154 | textView.setTextColor(-251658241); 155 | } else { 156 | textView.setTextColor(-268435456); 157 | } 158 | return textView; 159 | } 160 | 161 | public Object getArgValue() { 162 | return (b.equals("d") || b.equals("m") || b.equals("s")) ? V.getText() : U; 163 | } 164 | 165 | public String getMenuName() { 166 | return c; 167 | } 168 | 169 | public void setArgValue(Object obj) { 170 | U = obj; 171 | if (b.equals("d") || b.equals("m") || b.equals("s")) { 172 | V.setText(obj.toString()); 173 | int max = Math.max(aa, getLabelWidth()); 174 | V.getLayoutParams().width = max; 175 | a((float) (max + da), (float) G, true); 176 | } 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/editor/Ts.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview.editor; 2 | 3 | import android.content.Context; 4 | import android.graphics.Canvas; 5 | import android.graphics.Paint; 6 | import android.graphics.Path; 7 | import android.graphics.Rect; 8 | import android.graphics.RectF; 9 | import android.view.View; 10 | import android.widget.RelativeLayout; 11 | 12 | import ma.swblockspreview.util.Gx; 13 | import ma.swblockspreview.util.mq; 14 | import ma.swblockspreview.util.LayoutUtils; 15 | 16 | public class Ts extends RelativeLayout { 17 | public int A; 18 | public int B; 19 | public int C; 20 | public float D; 21 | public Rs E; 22 | public int F; 23 | public int G; 24 | public int H; 25 | public int I; 26 | public int J; 27 | public boolean K; 28 | public boolean L; 29 | public Paint M; 30 | public Paint N; 31 | public Paint O; 32 | public int P; 33 | public int Q; 34 | public int R; 35 | public Gx S; 36 | public Context a; 37 | public String b; 38 | public String c; 39 | public int d; 40 | public int e; 41 | public Paint f; 42 | public boolean g; 43 | public int h; 44 | public int i; 45 | public int j; 46 | public int k; 47 | public int l; 48 | public int m; 49 | public int n; 50 | public int o; 51 | public int p; 52 | public int q; 53 | public int r; 54 | public int s; 55 | public int t; 56 | public int u; 57 | public int v; 58 | public int w; 59 | public int x; 60 | public int y; 61 | public int z; 62 | 63 | public Ts(Context var1, String var2, String var3, boolean var4) { 64 | super(var1); 65 | h = 3; 66 | i = 12; 67 | j = 15; 68 | k = 3; 69 | l = 2; 70 | m = 15; 71 | n = 15; 72 | o = 15; 73 | int var5 = o; 74 | int var6 = h; 75 | p = var5 + var6; 76 | q = 10 + p; 77 | r = var6 + q; 78 | s = 6; 79 | t = 60; 80 | u = 2; 81 | v = 2; 82 | w = 3; 83 | x = 0; 84 | y = 2; 85 | int var7 = i; 86 | B = var7; 87 | C = var7; 88 | E = null; 89 | F = 100; 90 | G = 14; 91 | H = 15; 92 | I = 6; 93 | J = 4; 94 | K = false; 95 | L = false; 96 | P = 1; 97 | Q = 1; 98 | R = 805306368; 99 | S = null; 100 | a = var1; 101 | b = var2; 102 | if (var3 != null && var3.indexOf(".") > 0) { 103 | c = var3.substring(0, var3.indexOf(".")); 104 | } else { 105 | c = var3; 106 | } 107 | 108 | byte var10; 109 | label86: 110 | { 111 | a(); 112 | String var8 = b; 113 | int var9 = var8.hashCode(); 114 | if (var9 != 32) { 115 | if (var9 != 104) { 116 | if (var9 != 112) { 117 | if (var9 != 115) { 118 | if (var9 != 118) { 119 | switch (var9) { 120 | case 97: 121 | if (var8.equals("a")) { 122 | var10 = 13; 123 | break label86; 124 | } 125 | break; 126 | case 98: 127 | if (var8.equals("b")) { 128 | var10 = 1; 129 | break label86; 130 | } 131 | break; 132 | case 99: 133 | if (var8.equals("c")) { 134 | var10 = 4; 135 | break label86; 136 | } 137 | break; 138 | case 100: 139 | if (var8.equals("d")) { 140 | var10 = 2; 141 | break label86; 142 | } 143 | break; 144 | case 101: 145 | if (var8.equals("e")) { 146 | var10 = 5; 147 | break label86; 148 | } 149 | break; 150 | case 102: 151 | if (var8.equals("f")) { 152 | var10 = 6; 153 | break label86; 154 | } 155 | break; 156 | default: 157 | switch (var9) { 158 | case 108: 159 | if (var8.equals("l")) { 160 | var10 = 12; 161 | break label86; 162 | } 163 | break; 164 | case 109: 165 | if (var8.equals("m")) { 166 | var10 = 8; 167 | break label86; 168 | } 169 | break; 170 | case 110: 171 | if (var8.equals("n")) { 172 | var10 = 3; 173 | break label86; 174 | } 175 | } 176 | } 177 | } else if (var8.equals("v")) { 178 | var10 = 10; 179 | break label86; 180 | } 181 | } else if (var8.equals("s")) { 182 | var10 = 9; 183 | break label86; 184 | } 185 | } else if (var8.equals("p")) { 186 | var10 = 11; 187 | break label86; 188 | } 189 | } else if (var8.equals("h")) { 190 | var10 = 7; 191 | break label86; 192 | } 193 | } else if (var8.equals(" ")) { 194 | var10 = 0; 195 | break label86; 196 | } 197 | 198 | var10 = -1; 199 | } 200 | 201 | switch (var10) { 202 | case 0: 203 | u = 4; 204 | d = 4; 205 | break; 206 | case 1: 207 | w = 8; 208 | x = 5; 209 | d = 2; 210 | break; 211 | case 2: 212 | d = 3; 213 | w = 4; 214 | break; 215 | case 3: 216 | d = 3; 217 | break; 218 | case 4: 219 | u = 4; 220 | d = 10; 221 | break; 222 | case 5: 223 | u = 4; 224 | d = 12; 225 | break; 226 | case 6: 227 | u = 4; 228 | d = 5; 229 | break; 230 | case 7: 231 | u = 8; 232 | d = 7; 233 | break; 234 | case 8: 235 | d = 9; 236 | break; 237 | case 9: 238 | case 10: 239 | case 11: 240 | case 12: 241 | case 13: 242 | d = 1; 243 | } 244 | 245 | e = R; 246 | g = var4; 247 | setWillNotDraw(false); 248 | a(var1); 249 | } 250 | 251 | public Ts(Context var1, String var2, boolean var3) { 252 | this(var1, var2, "", var3); 253 | } 254 | 255 | private float[] getBooleanReflections() { 256 | float[] var1 = new float[8]; 257 | int var2 = A / 2; 258 | int var3 = P; 259 | var1[0] = (float) (0 + var3 / 2); 260 | float var4 = (float) var2; 261 | var1[1] = var4; 262 | var1[2] = var4; 263 | var1[3] = (float) (0 + var3 / 2); 264 | var1[4] = var4; 265 | var1[5] = (float) (0 + var3 / 2); 266 | var1[6] = (float) (z - var2); 267 | var1[7] = (float) (0 + var3 / 2); 268 | return var1; 269 | } 270 | 271 | private float[] getBooleanShadows() { 272 | float[] var1 = new float[8]; 273 | int var2 = A; 274 | int var3 = var2 / 2; 275 | int var4 = z; 276 | int var5 = P; 277 | var1[0] = (float) (var4 - var5 / 2); 278 | float var6 = (float) var3; 279 | var1[1] = var6; 280 | var1[2] = (float) (var4 - var3); 281 | var1[3] = (float) (var2 - var5 / 2); 282 | var1[4] = (float) (var4 - var3); 283 | var1[5] = (float) (var2 - var5 / 2); 284 | var1[6] = var6; 285 | var1[7] = (float) (var2 - var5 / 2); 286 | return var1; 287 | } 288 | 289 | private float[] getNumberBottomShadows() { 290 | float[] var1 = new float[4]; 291 | int var2 = A; 292 | int var3 = var2 / 2; 293 | var1[0] = (float) (z - var3); 294 | int var4 = P; 295 | var1[1] = (float) (var2 - var4 / 2); 296 | var1[2] = (float) var3; 297 | var1[3] = (float) (var2 - var4 / 2); 298 | return var1; 299 | } 300 | 301 | private float[] getNumberTopReflections() { 302 | float[] var1 = new float[4]; 303 | int var2 = A / 2; 304 | var1[0] = (float) var2; 305 | int var3 = P; 306 | var1[1] = (float) (0 + var3 / 2); 307 | var1[2] = (float) (z - var2); 308 | var1[3] = (float) (0 + var3 / 2); 309 | return var1; 310 | } 311 | 312 | private float[] getRectReflections() { 313 | float[] var1 = new float[8]; 314 | var1[0] = 0.0F; 315 | int var2 = P; 316 | var1[1] = (float) (0 + var2 / 2); 317 | var1[2] = (float) (z - var2 / 2); 318 | var1[3] = (float) (0 + var2 / 2); 319 | var1[4] = (float) (0 + var2 / 2); 320 | var1[5] = 0.0F; 321 | var1[6] = (float) (0 + var2 / 2); 322 | var1[7] = (float) (A - var2 / 2); 323 | return var1; 324 | } 325 | 326 | private float[] getRectShadows() { 327 | float[] var1 = new float[8]; 328 | int var2 = z; 329 | int var3 = P; 330 | var1[0] = (float) (var2 - var3 / 2); 331 | var1[1] = 0.0F; 332 | var1[2] = (float) (var2 - var3 / 2); 333 | int var4 = A; 334 | var1[3] = (float) (var4 - var3 / 2); 335 | var1[4] = (float) (var2 - var3 / 2); 336 | var1[5] = (float) (var4 - var3 / 2); 337 | var1[6] = 0.0F; 338 | var1[7] = (float) (var4 - var3 / 2); 339 | return var1; 340 | } 341 | 342 | public void a() { 343 | S = mq.a(b, c); 344 | } 345 | 346 | public void a(float var1, float var2, boolean var3) { 347 | if (d == 9) { 348 | z = (int) var1 + H; 349 | } else { 350 | z = (int) var1; 351 | } 352 | 353 | A = (int) var2; 354 | if (var3) { 355 | e(); 356 | } 357 | 358 | } 359 | 360 | public void a(Ts var1, boolean var2, boolean var3, int var4) { 361 | e = -16777216; 362 | d = var1.d; 363 | z = var1.z; 364 | A = var1.A; 365 | B = var1.B; 366 | C = var1.C; 367 | if (!var2) { 368 | if (var3) { 369 | d = 4; 370 | A = (int) (6.0F * D); 371 | } else if (var4 > 0) { 372 | B = var4 - h; 373 | } 374 | } 375 | 376 | e(); 377 | } 378 | 379 | public final void a(Context var1) { 380 | D = LayoutUtils.getDip(var1, 1.0F); 381 | float var2 = (float) h; 382 | float var3 = D; 383 | h = (int) (var2 * var3); 384 | i = (int) (var3 * (float) i); 385 | j = (int) (var3 * (float) j); 386 | m = (int) (var3 * (float) m); 387 | n = (int) (var3 * (float) n); 388 | k = (int) (var3 * (float) k); 389 | l = (int) (var3 * (float) l); 390 | o = (int) (var3 * (float) o); 391 | p = (int) (var3 * (float) p); 392 | q = (int) (var3 * (float) q); 393 | r = (int) (var3 * (float) r); 394 | s = (int) (var3 * (float) s); 395 | t = (int) (var3 * (float) t); 396 | B = (int) (var3 * (float) B); 397 | C = (int) (var3 * (float) C); 398 | w = (int) (var3 * (float) w); 399 | u = (int) (var3 * (float) u); 400 | x = (int) (var3 * (float) x); 401 | v = (int) (var3 * (float) v); 402 | y = (int) (var3 * (float) y); 403 | F = (int) (var3 * (float) F); 404 | G = (int) (var3 * (float) G); 405 | I = (int) (var3 * (float) I); 406 | J = (int) (var3 * (float) J); 407 | H = (int) (var3 * (float) H); 408 | P = (int) (var3 * (float) P); 409 | Q = (int) (var3 * (float) Q); 410 | if (P < 2) { 411 | P = 2; 412 | } 413 | 414 | if (Q < 2) { 415 | Q = 2; 416 | } 417 | 418 | f = new Paint(); 419 | if (!g) { 420 | K = true; 421 | L = true; 422 | } 423 | 424 | M = new Paint(); 425 | M.setColor(-536870912); 426 | M.setStrokeWidth((float) P); 427 | N = new Paint(); 428 | N.setColor(-1610612736); 429 | N.setStyle(Paint.Style.STROKE); 430 | N.setStrokeWidth((float) P); 431 | O = new Paint(); 432 | O.setColor(-1593835521); 433 | O.setStyle(Paint.Style.STROKE); 434 | O.setStrokeWidth((float) Q); 435 | setLayerType(View.LAYER_TYPE_SOFTWARE, null); 436 | a((float) F, (float) (G + u + v), false); 437 | } 438 | 439 | public final void a(Canvas var1) { 440 | Path var2 = new Path(); 441 | int var3 = A; 442 | int var4 = var3 / 2; 443 | float var5 = (float) var4; 444 | var2.moveTo(var5, (float) var3); 445 | var2.lineTo(0.0F, var5); 446 | var2.lineTo(var5, 0.0F); 447 | var2.lineTo((float) (z - var4), 0.0F); 448 | var2.lineTo((float) z, var5); 449 | var2.lineTo((float) (z - var4), (float) A); 450 | var1.drawPath(var2, f); 451 | if (K) { 452 | var1.drawLines(getBooleanShadows(), N); 453 | } 454 | 455 | if (L) { 456 | var1.drawLines(getBooleanReflections(), O); 457 | } 458 | 459 | } 460 | 461 | public final void a(Path var1) { 462 | var1.moveTo(0.0F, (float) k); 463 | var1.lineTo((float) k, 0.0F); 464 | var1.lineTo((float) o, 0.0F); 465 | var1.lineTo((float) p, (float) h); 466 | var1.lineTo((float) q, (float) h); 467 | var1.lineTo((float) r, 0.0F); 468 | var1.lineTo((float) (z - k), 0.0F); 469 | var1.lineTo((float) z, (float) k); 470 | } 471 | 472 | public final void a(Path var1, int var2) { 473 | var1.lineTo((float) j, (float) (var2 - l)); 474 | float var3 = (float) (j + l); 475 | float var4 = (float) var2; 476 | var1.lineTo(var3, var4); 477 | var1.lineTo((float) (z - k), var4); 478 | var1.lineTo((float) z, (float) (var2 + k)); 479 | } 480 | 481 | public final void a(Path var1, int var2, boolean var3, int var4) { 482 | var1.lineTo((float) z, (float) (var2 - k)); 483 | float var5 = (float) (z - k); 484 | float var6 = (float) var2; 485 | var1.lineTo(var5, var6); 486 | if (var3) { 487 | var1.lineTo((float) (var4 + r), var6); 488 | var1.lineTo((float) (var4 + q), (float) (var2 + h)); 489 | var1.lineTo((float) (var4 + p), (float) (var2 + h)); 490 | var1.lineTo((float) (var4 + o), var6); 491 | } 492 | 493 | if (var4 > 0) { 494 | var1.lineTo((float) (var4 + l), var6); 495 | var1.lineTo((float) var4, (float) (var2 + l)); 496 | } else { 497 | var1.lineTo((float) (var4 + k), var6); 498 | var1.lineTo(0.0F, (float) (var2 - k)); 499 | } 500 | } 501 | 502 | public final float[] a(int var1) { 503 | float[] var2 = new float[24]; 504 | int var3 = P; 505 | var2[0] = (float) (0 + var3 / 2); 506 | int var4 = k; 507 | var2[1] = (float) (var1 - var4); 508 | var2[2] = (float) (0 + var3 / 2); 509 | var2[3] = (float) var4; 510 | var2[4] = (float) (0 + var3 / 2); 511 | var2[5] = (float) var4; 512 | var2[6] = (float) var4; 513 | var2[7] = (float) (0 + var3 / 2); 514 | var2[8] = (float) var4; 515 | var2[9] = (float) (0 + var3 / 2); 516 | var2[10] = (float) o; 517 | var2[11] = (float) (0 + var3 / 2); 518 | var2[12] = (float) p; 519 | int var5 = h; 520 | var2[13] = (float) (var5 + var3 / 2); 521 | int var6 = q; 522 | var2[14] = (float) var6; 523 | var2[15] = (float) (var5 + var3 / 2); 524 | var2[16] = (float) var6; 525 | var2[17] = (float) (var5 + var3 / 2); 526 | int var7 = r; 527 | var2[18] = (float) var7; 528 | var2[19] = (float) (0 + var3 / 2); 529 | var2[20] = (float) var7; 530 | var2[21] = (float) (0 + var3 / 2); 531 | var2[22] = (float) (z - var4); 532 | var2[23] = (float) (0 + var3 / 2); 533 | return var2; 534 | } 535 | 536 | public final float[] a(int var1, int var2) { 537 | float[] var3 = new float[8]; 538 | int var4 = j; 539 | int var5 = l; 540 | var3[0] = (float) (var4 + var5); 541 | int var6 = P; 542 | var3[1] = (float) (var1 - var6 / 2); 543 | var3[2] = (float) (var4 - var6 / 2); 544 | var3[3] = (float) (var1 + var5); 545 | var3[4] = (float) (var4 - var6 / 2); 546 | var3[5] = (float) (var1 + var5); 547 | var3[6] = (float) (var4 - var6 / 2); 548 | var3[7] = (float) (var2 - var5); 549 | return var3; 550 | } 551 | 552 | public final float[] a(int var1, boolean var2, int var3) { 553 | float[] var4; 554 | if (var2) { 555 | var4 = new float[24]; 556 | } else { 557 | var4 = new float[8]; 558 | } 559 | 560 | int var5 = z; 561 | var4[0] = (float) var5; 562 | int var6 = k; 563 | int var7 = var1 - var6; 564 | int var8 = P; 565 | var4[1] = (float) (var7 - var8 / 2); 566 | var4[2] = (float) (var5 - var6); 567 | var4[3] = (float) (var1 - var8 / 2); 568 | if (var2) { 569 | var4[4] = (float) (var5 - var6); 570 | var4[5] = (float) (var1 - var8 / 2); 571 | int var9 = r; 572 | var4[6] = (float) (var3 + var9); 573 | var4[7] = (float) (var1 - var8 / 2); 574 | var4[8] = (float) (var9 + var3); 575 | var4[9] = (float) (var1 - var8 / 2); 576 | int var10 = q; 577 | var4[10] = (float) (var3 + var10); 578 | int var11 = h; 579 | var4[11] = (float) (var1 + var11 - var8 / 2); 580 | var4[12] = (float) (var10 + var3); 581 | var4[13] = (float) (var1 + var11 - var8 / 2); 582 | int var12 = p; 583 | var4[14] = (float) (var3 + var12); 584 | var4[15] = (float) (var1 + var11 - var8 / 2); 585 | var4[16] = (float) (var12 + var3); 586 | var4[17] = (float) (var11 + var1 - var8 / 2); 587 | int var13 = o; 588 | var4[18] = (float) (var3 + var13); 589 | var4[19] = (float) (var1 - var8 / 2); 590 | if (var3 > 0) { 591 | var4[20] = (float) (var13 + var3); 592 | var4[21] = (float) (var1 - var8 / 2); 593 | var4[22] = (float) (var3 + l); 594 | var4[23] = (float) (var1 - var8 / 2); 595 | return var4; 596 | } else { 597 | var4[20] = (float) (var13 + var3); 598 | var4[21] = (float) (var1 - var8 / 2); 599 | var4[22] = (float) (var3 + var6); 600 | var4[23] = (float) (var1 - var8 / 2); 601 | return var4; 602 | } 603 | } else if (var3 > 0) { 604 | var4[4] = (float) (var5 - var6); 605 | var4[5] = (float) (var1 - var8 / 2); 606 | var4[6] = (float) (var3 + l); 607 | var4[7] = (float) (var1 - var8 / 2); 608 | return var4; 609 | } else { 610 | var4[4] = (float) (var5 - var6); 611 | var4[5] = (float) (var1 - var8 / 2); 612 | var4[6] = (float) (var3 + var6); 613 | var4[7] = (float) (var1 - var8 / 2); 614 | return var4; 615 | } 616 | } 617 | 618 | public final void b(Canvas var1) { 619 | Path var2 = new Path(); 620 | a(var2); 621 | int var3 = A; 622 | int var4 = d; 623 | boolean var5 = true; 624 | boolean var6; 625 | var6 = var4 != 5; 626 | 627 | a(var2, var3, var6, 0); 628 | var1.drawPath(var2, f); 629 | if (K) { 630 | var1.drawLines(b(0, A), N); 631 | int var7 = A; 632 | if (d == 5) { 633 | var5 = false; 634 | } 635 | 636 | var1.drawLines(a(var7, var5, 0), N); 637 | } 638 | 639 | if (L) { 640 | var1.drawLines(a(A), O); 641 | } 642 | 643 | } 644 | 645 | public boolean b() { 646 | return d >= 10; 647 | } 648 | 649 | public final float[] b(int var1, int var2) { 650 | float[] var3 = new float[4]; 651 | int var4 = z; 652 | int var5 = P; 653 | var3[0] = (float) (var4 - var5 / 2); 654 | int var6 = k; 655 | var3[1] = (float) (var1 + var6); 656 | var3[2] = (float) (var4 - var5 / 2); 657 | var3[3] = (float) (var2 - var6); 658 | return var3; 659 | } 660 | 661 | public final void c(Canvas var1) { 662 | var1.drawRect(new Rect(0, 0, z, A), f); 663 | Path var2 = new Path(); 664 | int var3 = z; 665 | int var4 = J; 666 | var2.moveTo((float) (var3 - var4), (float) var4); 667 | int var5 = z; 668 | int var6 = J; 669 | int var7 = var5 - var6; 670 | int var8 = I; 671 | var2.lineTo((float) (var7 - var8 / 2), (float) (var6 + var8)); 672 | int var9 = z; 673 | int var10 = J; 674 | var2.lineTo((float) (var9 - var10 - I), (float) var10); 675 | var1.drawPath(var2, M); 676 | } 677 | 678 | public boolean c() { 679 | return d == 12; 680 | } 681 | 682 | public final float[] c(int var1, int var2) { 683 | float[] var3 = new float[4]; 684 | var3[0] = (float) (var2 + l); 685 | int var4 = P; 686 | var3[1] = (float) (var1 + var4 / 2); 687 | var3[2] = (float) (z - k); 688 | var3[3] = (float) (var1 + var4 / 2); 689 | return var3; 690 | } 691 | 692 | public int d() { 693 | return getTotalHeight() - h; 694 | } 695 | 696 | public final void d(Canvas var1) { 697 | Path var2 = new Path(); 698 | var2.moveTo(0.0F, (float) s); 699 | var2.arcTo(new RectF(0.0F, 0.0F, (float) t, (float) (2 * s)), 180.0F, 180.0F); 700 | var2.lineTo((float) (z - k), (float) s); 701 | var2.lineTo((float) z, (float) (s + k)); 702 | a(var2, A, true, 0); 703 | var1.drawPath(var2, f); 704 | if (K) { 705 | var1.drawLines(b(s, A), N); 706 | var1.drawLines(a(A, true, 0), N); 707 | } 708 | 709 | } 710 | 711 | public void e() { 712 | requestLayout(); 713 | } 714 | 715 | public final void e(Canvas var1) { 716 | Path var2 = new Path(); 717 | int var3 = A + B; 718 | int var4 = h; 719 | int var5 = var3 - var4; 720 | int var6 = var5 + n + C - var4; 721 | a(var2); 722 | a(var2, A, true, j); 723 | a(var2, var5); 724 | a(var2, var5 + n, true, j); 725 | a(var2, var6); 726 | a(var2, var6 + m, true, 0); 727 | var1.drawPath(var2, f); 728 | if (K) { 729 | var1.drawLines(b(0, A), N); 730 | var1.drawLines(a(A, true, j), N); 731 | var1.drawLines(a(A, var5), N); 732 | var1.drawLines(b(var5, var5 + n), N); 733 | var1.drawLines(a(var5 + n, true, j), N); 734 | var1.drawLines(a(var5 + n, var6), N); 735 | var1.drawLines(b(var6, var6 + m), N); 736 | var1.drawLines(a(var6 + m, true, 0), N); 737 | } 738 | 739 | if (L) { 740 | var1.drawLines(a(var6 + m), O); 741 | var1.drawLines(c(var5, j), O); 742 | var1.drawLines(c(var6, j), O); 743 | } 744 | 745 | } 746 | 747 | public int f() { 748 | return A; 749 | } 750 | 751 | public final void f(Canvas var1) { 752 | Path var2 = new Path(); 753 | int var3 = A + B - h; 754 | a(var2); 755 | int var4 = A; 756 | int var5 = j; 757 | boolean var6 = true; 758 | a(var2, var4, var6, var5); 759 | a(var2, var3); 760 | int var7 = var3 + m; 761 | boolean var8; 762 | var8 = d == 10; 763 | 764 | a(var2, var7, var8, 0); 765 | var1.drawPath(var2, f); 766 | if (K) { 767 | var1.drawLines(b(0, A), N); 768 | var1.drawLines(a(A, var6, j), N); 769 | var1.drawLines(a(A, var3), N); 770 | var1.drawLines(b(var3, var3 + m), N); 771 | int var9 = var3 + m; 772 | if (d != 10) { 773 | var6 = false; 774 | } 775 | 776 | var1.drawLines(a(var9, var6, 0), N); 777 | } 778 | 779 | if (L) { 780 | var1.drawLines(a(var3 + m), O); 781 | var1.drawLines(c(var3, j), O); 782 | } 783 | 784 | } 785 | 786 | public int g() { 787 | return A + B + n - h; 788 | } 789 | 790 | public final void g(Canvas var1) { 791 | Path var2 = new Path(); 792 | int var3 = A; 793 | int var4 = var3 / 2; 794 | var2.moveTo((float) var4, (float) var3); 795 | int var5 = A; 796 | var2.arcTo(new RectF(0.0F, 0.0F, (float) var5, (float) var5), 90.0F, 180.0F); 797 | var2.lineTo((float) (z - var4), 0.0F); 798 | int var6 = z; 799 | int var7 = A; 800 | var2.arcTo(new RectF((float) (var6 - var7), 0.0F, (float) var6, (float) var7), 270.0F, 180.0F); 801 | var1.drawPath(var2, f); 802 | if (K) { 803 | int var16 = z; 804 | int var17 = A; 805 | float var18 = (float) (var16 - var17); 806 | int var19 = P; 807 | var1.drawArc(new RectF(var18, 0.0F, (float) (var16 - var19 / 2), (float) (var17 - var19 / 2)), 330.0F, 120.0F, false, N); 808 | var1.drawLines(getNumberBottomShadows(), N); 809 | int var20 = P; 810 | float var21 = (float) (0 + var20 / 2); 811 | int var22 = A; 812 | var1.drawArc(new RectF(var21, 0.0F, (float) var22, (float) (var22 - var20 / 2)), 90.0F, 30.0F, false, N); 813 | } 814 | 815 | if (L) { 816 | int var8 = P; 817 | float var9 = (float) (0 + var8 / 2); 818 | float var10 = (float) (0 + var8 / 2); 819 | int var11 = A; 820 | var1.drawArc(new RectF(var9, var10, (float) var11, (float) var11), 150.0F, 120.0F, false, O); 821 | var1.drawLines(getNumberTopReflections(), O); 822 | int var12 = z; 823 | int var13 = A; 824 | float var14 = (float) (var12 - var13); 825 | int var15 = P; 826 | var1.drawArc(new RectF(var14, (float) (0 + var15 / 2), (float) (var12 - var15 / 2), (float) var13), 270.0F, 30.0F, false, O); 827 | } 828 | 829 | } 830 | 831 | public Gx getClassInfo() { 832 | if (S == null) { 833 | a(); 834 | } 835 | 836 | return S; 837 | } 838 | 839 | public int getTopH() { 840 | return A; 841 | } 842 | 843 | public int getTotalHeight() { 844 | int var1 = A; 845 | if (b()) { 846 | var1 += n + B - h; 847 | } 848 | 849 | if (c()) { 850 | var1 += m + C - h; 851 | } 852 | 853 | int var2 = d; 854 | if (var2 == 4 || var2 == 7 || var2 == 10 || var2 == 12) { 855 | var1 += h; 856 | } 857 | 858 | return var1; 859 | } 860 | 861 | public int getTotalWidth() { 862 | return z; 863 | } 864 | 865 | public int getW() { 866 | return z; 867 | } 868 | 869 | public final void h(Canvas var1) { 870 | var1.drawRect(new Rect(0, 0, z, A), f); 871 | if (K) { 872 | var1.drawLines(getRectShadows(), N); 873 | } 874 | 875 | if (L) { 876 | var1.drawLines(getRectReflections(), O); 877 | } 878 | 879 | } 880 | 881 | public void onDraw(Canvas var1) { 882 | f.setColor(e); 883 | switch (d) { 884 | case 1: 885 | h(var1); 886 | break; 887 | case 2: 888 | a(var1); 889 | break; 890 | case 3: 891 | g(var1); 892 | break; 893 | case 4: 894 | case 5: 895 | b(var1); 896 | case 6: 897 | case 8: 898 | default: 899 | break; 900 | case 7: 901 | d(var1); 902 | break; 903 | case 9: 904 | c(var1); 905 | break; 906 | case 10: 907 | case 11: 908 | f(var1); 909 | break; 910 | case 12: 911 | e(var1); 912 | } 913 | 914 | super.onDraw(var1); 915 | } 916 | 917 | public void onMeasure(int var1, int var2) { 918 | super.onMeasure(MeasureSpec.makeMeasureSpec(getTotalWidth(), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(getTotalHeight(), MeasureSpec.EXACTLY)); 919 | } 920 | 921 | public void setSubstack1Height(int var1) { 922 | int var2 = Math.max(var1, i); 923 | if (var2 != B) { 924 | B = var2; 925 | } 926 | 927 | } 928 | 929 | public void setSubstack2Height(int var1) { 930 | int var2 = Math.max(var1, i); 931 | if (var2 != C) { 932 | C = var2; 933 | } 934 | 935 | } 936 | } 937 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/editor/ViewBlockCollectionEditor.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview.editor; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.ViewGroup; 6 | 7 | import ma.swblockspreview.editor.logic.BlockPane; 8 | import ma.swblockspreview.editor.view.LogicEditorScrollView; 9 | 10 | public class ViewBlockCollectionEditor extends LogicEditorScrollView { 11 | private Context context; 12 | private BlockPane blockPane; 13 | private boolean k = true; 14 | 15 | public ViewBlockCollectionEditor(Context context) { 16 | super(context); 17 | initialize(context); 18 | } 19 | 20 | public ViewBlockCollectionEditor(Context context, AttributeSet attrs) { 21 | super(context, attrs); 22 | initialize(context); 23 | } 24 | 25 | private void initialize(Context context) { 26 | this.context = context; 27 | blockPane = new BlockPane(this.context); 28 | blockPane.setLayoutParams(new LayoutParams( 29 | ViewGroup.LayoutParams.WRAP_CONTENT, 30 | ViewGroup.LayoutParams.WRAP_CONTENT)); 31 | addView(blockPane); 32 | } 33 | 34 | public BlockPane getBlockPane() { 35 | return blockPane; 36 | } 37 | 38 | @Override 39 | public void onLayout(boolean changed, int left, int top, int right, int bottom) { 40 | super.onLayout(changed, left, top, right, bottom); 41 | if (k) { 42 | blockPane.getLayoutParams().width = right - left; 43 | blockPane.getLayoutParams().height = bottom - top; 44 | blockPane.b(); 45 | k = false; 46 | } 47 | 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/editor/logic/BlockPane.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview.editor.logic; 2 | 3 | import android.content.Context; 4 | import android.view.View; 5 | import android.widget.RelativeLayout; 6 | 7 | import java.util.ArrayList; 8 | 9 | import ma.swblockspreview.bean.BlockBean; 10 | import ma.swblockspreview.editor.Rs; 11 | import ma.swblockspreview.editor.Ss; 12 | import ma.swblockspreview.editor.Ts; 13 | import ma.swblockspreview.util.Gx; 14 | import ma.swblockspreview.util.LayoutUtils; 15 | import ma.swblockspreview.util.mq; 16 | 17 | public class BlockPane extends RelativeLayout { 18 | public Context a; 19 | public int[] b = new int[2]; 20 | public Ts c; 21 | public Rs d; 22 | public ArrayList e = new ArrayList<>(); 23 | public Object[] f = null; 24 | public int g = 10; 25 | public float h = LayoutUtils.getDip(getContext(), 1.0F); 26 | 27 | public BlockPane(Context var1) { 28 | super(var1); 29 | a(var1); 30 | } 31 | 32 | public Rs a(int var1) { 33 | return findViewWithTag(Integer.valueOf(var1)); 34 | } 35 | 36 | public Rs a(Rs block, int x, int y) { 37 | getLocationOnScreen(b); 38 | if (block.getBlockType() == 1) { 39 | Context var4 = getContext(); 40 | int var5 = g; 41 | g = var5 + 1; 42 | block = new Rs(var4, var5, block.T, block.b, block.c, block.U); 43 | } 44 | 45 | block.pa = this; 46 | addView(block); 47 | block.setX((float) (x - b[0] - getPaddingLeft())); 48 | block.setY((float) (y - b[1] - getPaddingTop())); 49 | return block; 50 | } 51 | 52 | public Rs a(Rs var1, int var2, int var3, boolean var4) { 53 | Rs var5; 54 | if (!var4) { 55 | var5 = a(var1, var2, var3); 56 | } else { 57 | var1.setX((float) (var2 - b[0] - getPaddingLeft())); 58 | var1.setY((float) (var3 - b[1] - getPaddingTop())); 59 | var5 = var1; 60 | } 61 | 62 | Object[] var6 = f; 63 | if (var6 != null) { 64 | if (var1.fa) { 65 | ((Ts) var6[1]).E.a((Ts) var6[1], var5); 66 | } else { 67 | Rs var7 = (Rs) var6[1]; 68 | int var8 = ((Integer) var6[2]).intValue(); 69 | if (var8 != 0) { 70 | if (var8 != 1) { 71 | if (var8 != 2) { 72 | if (var8 != 3) { 73 | if (var8 == 4) { 74 | var7.d(var5); 75 | } 76 | } else { 77 | var7.f(var5); 78 | } 79 | } else { 80 | var7.e(var5); 81 | } 82 | } else { 83 | var7.c(var5); 84 | } 85 | } else { 86 | var7.b(var5); 87 | } 88 | } 89 | 90 | } 91 | var5.p().k(); 92 | b(); 93 | return var5; 94 | } 95 | 96 | public Rs a(String var1) { 97 | return findViewWithTag(Integer.valueOf(var1)); 98 | } 99 | 100 | public final void a() { 101 | if (c == null) { 102 | c = new Ts(a, " ", true); 103 | } 104 | 105 | c.a(10.0F, 10.0F, false); 106 | addView(c); 107 | d(); 108 | } 109 | 110 | public void a(Rs var1) { 111 | boolean var2 = var1.h().ga; 112 | boolean var3; 113 | var3 = var1.b() && -1 == var1.ia; 114 | 115 | boolean var4 = var1.fa; 116 | a(var1.getTag().toString(), var2, var3, var4, var1.getHeight(), var1.f()); 117 | f = null; 118 | } 119 | 120 | public void a(Rs var1, int var2) { 121 | while (true) { 122 | if (var1 != null) { 123 | var1.setVisibility(var2); 124 | 125 | for (View var7 : var1.V) { 126 | if (var7 instanceof Rs) { 127 | a((Rs) var7, var2); 128 | } 129 | } 130 | 131 | if (var1.b()) { 132 | int var6 = var1.ia; 133 | if (var6 != -1) { 134 | a(findViewWithTag(Integer.valueOf(var6)), var2); 135 | } 136 | } 137 | 138 | if (var1.c()) { 139 | int var5 = var1.ja; 140 | if (var5 != -1) { 141 | a(findViewWithTag(Integer.valueOf(var5)), var2); 142 | } 143 | } 144 | 145 | int var4 = var1.ha; 146 | if (var4 != -1) { 147 | var1 = findViewWithTag(Integer.valueOf(var4)); 148 | continue; 149 | } 150 | } 151 | 152 | return; 153 | } 154 | } 155 | 156 | public final void a(Rs var1, String var2) { 157 | while (true) { 158 | if (var1 != null) { 159 | if (!var1.ea) { 160 | for (int var6 = 0; var6 < var1.V.size(); ++var6) { 161 | View var7 = var1.V.get(var6); 162 | boolean var8 = var7 instanceof Rs; 163 | if ((var8 || var7 instanceof Ss) && (!var8 || !var7.getTag().toString().equals(var2))) { 164 | int[] var9 = new int[2]; 165 | var7.getLocationOnScreen(var9); 166 | a(var9, var7, 0); 167 | if (var8) { 168 | a((Rs) var7, var2); 169 | } 170 | } 171 | } 172 | } 173 | 174 | int var3 = var1.ia; 175 | if (var3 != -1) { 176 | a(findViewWithTag(Integer.valueOf(var3)), var2); 177 | } 178 | 179 | int var4 = var1.ja; 180 | if (var4 != -1) { 181 | a(findViewWithTag(Integer.valueOf(var4)), var2); 182 | } 183 | 184 | int var5 = var1.ha; 185 | if (var5 != -1) { 186 | var1 = findViewWithTag(Integer.valueOf(var5)); 187 | continue; 188 | } 189 | } 190 | 191 | return; 192 | } 193 | } 194 | 195 | public void a(Rs var1, ArrayList var2) { 196 | if (var2.size() <= 0) { 197 | a(var1); 198 | } else { 199 | BlockBean var3; 200 | BlockBean var4; 201 | byte var7; 202 | label64: 203 | { 204 | var3 = (BlockBean) var2.get(0); 205 | var4 = (BlockBean) var2.get(var2.size() - 1); 206 | String var5 = var3.type; 207 | int var6 = var5.hashCode(); 208 | if (var6 != 97) { 209 | if (var6 != 98) { 210 | if (var6 != 100) { 211 | if (var6 != 108) { 212 | if (var6 != 112) { 213 | if (var6 != 115) { 214 | if (var6 == 118 && var5.equals("v")) { 215 | var7 = 3; 216 | break label64; 217 | } 218 | } else if (var5.equals("s")) { 219 | var7 = 1; 220 | break label64; 221 | } 222 | } else if (var5.equals("p")) { 223 | var7 = 4; 224 | break label64; 225 | } 226 | } else if (var5.equals("l")) { 227 | var7 = 5; 228 | break label64; 229 | } 230 | } else if (var5.equals("d")) { 231 | var7 = 2; 232 | break label64; 233 | } 234 | } else if (var5.equals("b")) { 235 | var7 = 0; 236 | break label64; 237 | } 238 | } else if (var5.equals("a")) { 239 | var7 = 6; 240 | break label64; 241 | } 242 | 243 | var7 = -1; 244 | } 245 | 246 | boolean var8; 247 | switch (var7) { 248 | case 0: 249 | case 1: 250 | case 2: 251 | case 3: 252 | case 4: 253 | case 5: 254 | case 6: 255 | var8 = true; 256 | break; 257 | default: 258 | var8 = false; 259 | } 260 | 261 | boolean var9 = var4.type.equals("f"); 262 | boolean var10; 263 | var10 = (var3.type.equals("c") || var3.type.equals("e")) && var3.subStack1 <= 0; 264 | 265 | a(var3.id, var9, var10, var8, var1.getHeight(), var1.f()); 266 | f = null; 267 | } 268 | } 269 | 270 | public final void a(Rs var1, boolean var2) { 271 | while (var1.getVisibility() != View.GONE) { 272 | if (!var1.ga && (!var2 || -1 == var1.ha)) { 273 | int[] var8 = new int[2]; 274 | var1.getLocationOnScreen(var8); 275 | var8[1] += var1.d(); 276 | a(var8, var1, 0); 277 | } 278 | 279 | if (var1.b() && (!var2 || var1.ia == -1)) { 280 | int[] var7 = new int[2]; 281 | var1.getLocationOnScreen(var7); 282 | var7[0] += var1.j; 283 | var7[1] += var1.f(); 284 | a(var7, var1, 2); 285 | } 286 | 287 | if (var1.c() && (!var2 || var1.ja == -1)) { 288 | int[] var6 = new int[2]; 289 | var1.getLocationOnScreen(var6); 290 | var6[0] += var1.j; 291 | var6[1] += var1.g(); 292 | a(var6, var1, 3); 293 | } 294 | 295 | int var3 = var1.ia; 296 | if (var3 != -1) { 297 | a(findViewWithTag(Integer.valueOf(var3)), var2); 298 | } 299 | 300 | int var4 = var1.ja; 301 | if (var4 != -1) { 302 | a(findViewWithTag(Integer.valueOf(var4)), var2); 303 | } 304 | 305 | int var5 = var1.ha; 306 | if (var5 == -1) { 307 | return; 308 | } 309 | 310 | var1 = findViewWithTag(Integer.valueOf(var5)); 311 | } 312 | 313 | } 314 | 315 | public final void a(Context var1) { 316 | a = var1; 317 | a(); 318 | } 319 | 320 | public void a(BlockBean var1, boolean var2) { 321 | String var3 = var1.id; 322 | if (var3 != null && !var3.equals("")) { 323 | if (var1.id.equals("0")) { 324 | return; 325 | } 326 | 327 | Rs var4 = findViewWithTag(Integer.valueOf(var1.id)); 328 | if (var4 == null) { 329 | return; 330 | } 331 | 332 | Rs var5 = var4.E; 333 | if (var4 != var5) { 334 | c(var4); 335 | removeView(var4); 336 | } else { 337 | removeView(var4); 338 | } 339 | 340 | if (var2 && var5 != null) { 341 | var5.p().k(); 342 | } 343 | } 344 | 345 | } 346 | 347 | public void a(String var1, String var2) { 348 | d = new Rs(getContext(), 0, var1, "h", var2); 349 | d.pa = this; 350 | addView(d); 351 | float var5 = LayoutUtils.getDip(getContext(), 1.0F); 352 | float var7 = var5 * 8.0F; 353 | d.setX(var7); 354 | d.setY(var7); 355 | } 356 | 357 | public void a(String str, boolean z, boolean z2, boolean z3, int i, int i2) { 358 | e = new ArrayList<>(); 359 | int i3 = (int) (3.0f * h); 360 | for (int i4 = 0; i4 < getChildCount(); i4++) { 361 | View childAt = getChildAt(i4); 362 | if (childAt instanceof Rs) { 363 | Rs rs = (Rs) childAt; 364 | if (rs.getVisibility() != View.GONE && rs.E == null) { 365 | if (z3) { 366 | a(rs, str); 367 | } else if (!rs.fa) { 368 | int[] iArr; 369 | boolean z4 = true; 370 | if (!(z || rs.ea)) { 371 | iArr = new int[2]; 372 | rs.getLocationOnScreen(iArr); 373 | iArr[1] = iArr[1] - (i - i3); 374 | a(iArr, rs, 1); 375 | } 376 | if (z2 && !rs.ea) { 377 | iArr = new int[2]; 378 | rs.getLocationOnScreen(iArr); 379 | iArr[0] = iArr[0] - rs.j; 380 | iArr[1] = iArr[1] - (i2 - i3); 381 | a(iArr, rs, 4); 382 | } 383 | if (!z || z2) { 384 | z4 = false; 385 | } 386 | a(rs, z4); 387 | } 388 | } 389 | } 390 | } 391 | } 392 | 393 | public final void a(int[] var1, View var2, int var3) { 394 | Object[] var4 = new Object[]{var1, var2, Integer.valueOf(var3)}; 395 | e.add(var4); 396 | } 397 | 398 | public final boolean a(Rs var1, View var2) { 399 | if (!var1.fa) { 400 | return true; 401 | } else { 402 | if (var2 instanceof Ts) { 403 | Gx var3 = var1.getClassInfo(); 404 | if (var3 == null) { 405 | return false; 406 | } 407 | 408 | Gx var4 = ((Ts) var2).getClassInfo(); 409 | if (var4 == null) { 410 | return false; 411 | } 412 | 413 | if (var3.a(var4)) { 414 | return true; 415 | } 416 | 417 | return var2 instanceof Rs && var3.a(mq.b(((Rs) var2).ra)); 418 | } 419 | 420 | return false; 421 | } 422 | } 423 | 424 | public void b() { 425 | int var1 = getChildCount(); 426 | int var2 = getLayoutParams().width; 427 | int var3 = getLayoutParams().width; 428 | 429 | for (int var4 = 0; var4 < var1; ++var4) { 430 | View var5 = getChildAt(var4); 431 | if (var5 instanceof Rs) { 432 | float var6 = var5.getX(); 433 | Rs var7 = (Rs) var5; 434 | var2 = Math.max(150 + (int) (var6 + (float) var7.getWidthSum()), var2); 435 | var3 = Math.max(150 + (int) (var5.getY() + (float) var7.getHeightSum()), var3); 436 | } 437 | } 438 | 439 | getLayoutParams().width = var2; 440 | getLayoutParams().height = var3; 441 | } 442 | 443 | public void c(Rs var1) { 444 | Rs var2 = var1.E; 445 | if (var2 != null) { 446 | if (var2 != null) { 447 | var2.g(var1); 448 | var1.E = null; 449 | } 450 | 451 | } 452 | } 453 | 454 | public void d() { 455 | c.setVisibility(View.GONE); 456 | } 457 | 458 | } 459 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/editor/view/LogicEditorScrollView.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview.editor.view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.MotionEvent; 6 | import android.view.View; 7 | import android.view.ViewConfiguration; 8 | import android.widget.FrameLayout; 9 | 10 | public class LogicEditorScrollView extends FrameLayout { 11 | public float a = 0.0F; 12 | public float b = 0.0F; 13 | public int c = 0; 14 | public boolean d = false; 15 | public boolean e = true; 16 | public boolean f = true; 17 | public float g = -1.0F; 18 | public float h = -1.0F; 19 | 20 | public LogicEditorScrollView(Context var1) { 21 | super(var1); 22 | a(var1); 23 | } 24 | 25 | public LogicEditorScrollView(Context var1, AttributeSet var2) { 26 | super(var1, var2); 27 | a(var1); 28 | } 29 | 30 | public final void a(Context var1) { 31 | c = ViewConfiguration.get(var1).getScaledTouchSlop(); 32 | } 33 | 34 | public boolean a() { 35 | if (getChildCount() <= 0) { 36 | return false; 37 | } else { 38 | boolean var1 = f; 39 | boolean var2 = false; 40 | if (var1) { 41 | if (!e) { 42 | return false; 43 | } 44 | 45 | View var3 = getChildAt(0); 46 | int var4 = var3.getWidth(); 47 | int var5 = var3.getHeight(); 48 | if (getWidth() >= var4 + getPaddingLeft() + getPaddingRight()) { 49 | int var6 = getHeight(); 50 | int var7 = var5 + getPaddingTop() + getPaddingBottom(); 51 | var2 = false; 52 | if (var6 >= var7) { 53 | return var2; 54 | } 55 | } 56 | 57 | var2 = true; 58 | } 59 | 60 | return var2; 61 | } 62 | } 63 | 64 | @Override 65 | public void addView(View var1) { 66 | if (getChildCount() <= 1) { 67 | super.addView(var1); 68 | } else { 69 | throw new IllegalStateException("BothDirectionScrollView should have child View only one"); 70 | } 71 | } 72 | 73 | public boolean getScrollEnabled() { 74 | return e; 75 | } 76 | 77 | public boolean getUseScroll() { 78 | return f; 79 | } 80 | 81 | @Override 82 | public boolean onInterceptTouchEvent(MotionEvent var1) { 83 | if (!a()) { 84 | return false; 85 | } else { 86 | int var2 = var1.getAction(); 87 | if (var2 == 2 && d) { 88 | return true; 89 | } else { 90 | float var3 = var1.getX(); 91 | float var4 = var1.getY(); 92 | if (var2 != 0) { 93 | if (var2 != 1) { 94 | if (var2 == 2) { 95 | int var5 = (int) Math.abs(a - var3); 96 | int var6 = (int) Math.abs(b - var4); 97 | int var7 = c; 98 | if (var5 > var7 || var6 > var7) { 99 | d = true; 100 | } 101 | } 102 | } else { 103 | d = false; 104 | } 105 | } else { 106 | a = var3; 107 | b = var4; 108 | d = false; 109 | } 110 | 111 | return d; 112 | } 113 | } 114 | } 115 | 116 | @Override 117 | public boolean onTouchEvent(MotionEvent motionEvent) { 118 | if (!a()) { 119 | return false; 120 | } else { 121 | View var2 = getChildAt(0); 122 | int var3 = motionEvent.getAction(); 123 | float var4 = motionEvent.getX(); 124 | float var5 = motionEvent.getY(); 125 | if (var3 != 0) { 126 | if (var3 == 1) { 127 | g = -1.0F; 128 | h = -1.0F; 129 | return true; 130 | } 131 | 132 | if (var3 != 2) { 133 | return true; 134 | } 135 | 136 | if (g < 0.0F) { 137 | g = var4; 138 | } 139 | 140 | if (h < 0.0F) { 141 | h = var5; 142 | } 143 | 144 | int var6 = (int) (g - var4); 145 | int var7 = (int) (h - var5); 146 | g = var4; 147 | h = var5; 148 | int var9; 149 | if (var6 <= 0) { 150 | if (getScrollX() <= 0) { 151 | var6 = 0; 152 | } 153 | 154 | var9 = Math.max(-getScrollX(), var6); 155 | } else { 156 | int var8 = var2.getRight() - getScrollX() - getWidth() - getPaddingRight(); 157 | if (var8 > 0) { 158 | var9 = Math.min(var8, var6); 159 | } else { 160 | var9 = 0; 161 | } 162 | } 163 | 164 | int var11; 165 | if (var7 <= 0) { 166 | if (getScrollY() <= 0) { 167 | var7 = 0; 168 | } 169 | 170 | var11 = Math.max(-getScrollY(), var7); 171 | } else { 172 | int var10 = var2.getBottom() - getScrollY() - getHeight() - getPaddingBottom(); 173 | var11 = 0; 174 | if (var10 > 0) { 175 | var11 = Math.min(var10, var7); 176 | } 177 | } 178 | 179 | if (var9 != 0 || var11 != 0) { 180 | scrollBy(var9, var11); 181 | return true; 182 | } 183 | } else { 184 | g = var4; 185 | h = var5; 186 | } 187 | 188 | return true; 189 | } 190 | } 191 | 192 | public void setScrollEnabled(boolean var1) { 193 | e = var1; 194 | } 195 | 196 | public void setUseScroll(boolean var1) { 197 | f = var1; 198 | } 199 | } 200 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/util/Gx.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview.util; 2 | 3 | import ma.swblockspreview.BlockPreviewer; 4 | 5 | public class Gx { 6 | public String a; 7 | public String[] b; 8 | 9 | public Gx(String classInfo) { 10 | a = classInfo; 11 | b = null; 12 | e(); 13 | } 14 | 15 | public String a() { 16 | return a; 17 | } 18 | 19 | public boolean a(Gx gx) { 20 | return a(gx.a); 21 | } 22 | 23 | public boolean a(String classInfo) { 24 | if (classInfo.equals("!") || classInfo.equals(a)) { 25 | return true; 26 | } else { 27 | for (String s : b) { 28 | if (s.equals(classInfo)) return true; 29 | } 30 | return false; 31 | } 32 | } 33 | 34 | public boolean b() { 35 | return a("List"); 36 | } 37 | 38 | public boolean b(String classInfo) { 39 | return a.equals(classInfo); 40 | } 41 | 42 | public boolean c() { 43 | return a("Var"); 44 | } 45 | 46 | public boolean d() { 47 | return a("View"); 48 | } 49 | 50 | private void e() { 51 | String classInfos = ""; 52 | switch (a) { 53 | case "boolean": 54 | classInfos = "Var.boolean"; 55 | break; 56 | 57 | case "double": 58 | classInfos = "Var.double"; 59 | break; 60 | 61 | case "String": 62 | classInfos = "Var.String"; 63 | break; 64 | 65 | case "Map": 66 | classInfos = "Var.Map"; 67 | break; 68 | 69 | case "ListInt": 70 | classInfos = "List.ListInt"; 71 | break; 72 | 73 | case "ListString": 74 | classInfos = "List.ListString"; 75 | break; 76 | 77 | case "ListMap": 78 | classInfos = "List.ListMap"; 79 | break; 80 | 81 | case "List": 82 | classInfos = "List"; 83 | break; 84 | 85 | case "View": 86 | break; 87 | 88 | case "TextView": 89 | classInfos = "View.Clickable.TextView"; 90 | break; 91 | 92 | case "Button": 93 | classInfos = "View.Clickable.TextView.Button"; 94 | break; 95 | 96 | case "EditText": 97 | classInfos = "View.Clickable.TextView.EditText"; 98 | break; 99 | 100 | case "ImageView": 101 | classInfos = "View.Clickable.ImageView"; 102 | break; 103 | 104 | case "CheckBox": 105 | classInfos = "View.Clickable.TextView.Button.CompoundButton.CheckBox"; 106 | break; 107 | 108 | case "Spinner": 109 | classInfos = "View.AdapterView.AbsSpinner.Spinner"; 110 | break; 111 | 112 | case "ListView": 113 | classInfos = "View.AdapterView.AbsListView.ListView"; 114 | break; 115 | 116 | case "WebView": 117 | classInfos = "View.AbsoluteLayout.WebView"; 118 | break; 119 | 120 | case "Switch": 121 | classInfos = "View.Clickable.TextView.Button.CompoundButton.Switch"; 122 | break; 123 | 124 | case "SeekBar": 125 | classInfos = "View.SeekBar"; 126 | break; 127 | 128 | case "CalendarView": 129 | classInfos = "View.FrameLayout.CalendarView"; 130 | break; 131 | 132 | case "AdView": 133 | classInfos = "View.AdView"; 134 | break; 135 | 136 | case "MapView": 137 | classInfos = "View.MapView"; 138 | break; 139 | 140 | case "FloatingActionButton": 141 | classInfos = "View.Clickable.FloatingActionButton"; 142 | break; 143 | 144 | case "LinearLayout": 145 | classInfos = "View.Clickable.ViewGroup.LinearLayout"; 146 | break; 147 | 148 | case "ScrollView": 149 | classInfos = "View.ViewGroup.FrameLayout.ScrollView"; 150 | break; 151 | 152 | case "HorizontalScrollView": 153 | classInfos = "View.ViewGroup.FrameLayout.HorizontalScrollView"; 154 | break; 155 | 156 | case "Intent": 157 | classInfos = "Component.Intent"; 158 | break; 159 | 160 | case "SharedPreferences": 161 | classInfos = "Component.SharedPreferences"; 162 | break; 163 | 164 | case "Calendar": 165 | classInfos = "Component.Calendar"; 166 | break; 167 | 168 | case "Vibrator": 169 | classInfos = "Component.Vibrator"; 170 | break; 171 | 172 | case "Timer": 173 | classInfos = "Component.Timer"; 174 | break; 175 | 176 | case "Dialog": 177 | classInfos = "Component.Dialog"; 178 | break; 179 | 180 | case "MediaPlayer": 181 | classInfos = "Component.MediaPlayer"; 182 | break; 183 | 184 | case "SoundPool": 185 | classInfos = "Component.SoundPool"; 186 | break; 187 | 188 | case "ObjectAnimator": 189 | classInfos = "Component.ObjectAnimator"; 190 | break; 191 | 192 | case "FirebaseDB": 193 | classInfos = "Component.FirebaseDB"; 194 | break; 195 | 196 | case "FirebaseAuth": 197 | classInfos = "Component.FirebaseAuth"; 198 | break; 199 | 200 | case "Gyroscope": 201 | classInfos = "Component.Gyroscope"; 202 | break; 203 | 204 | case "FirebaseStorage": 205 | classInfos = "Component.FirebaseStorage"; 206 | break; 207 | 208 | case "Camera": 209 | classInfos = "Component.Camera"; 210 | break; 211 | 212 | case "FilePicker": 213 | classInfos = "Component.FilePicker"; 214 | break; 215 | 216 | case "RequestNetwork": 217 | classInfos = "Component.RequestNetwork"; 218 | break; 219 | 220 | case "ProgressBar": 221 | classInfos = "View.SeekBar.ProgressBar"; 222 | break; 223 | 224 | case "TextToSpeech": 225 | classInfos = "Component.TextToSpeech"; 226 | break; 227 | 228 | case "SpeechToText": 229 | classInfos = "Component.SpeechToText"; 230 | break; 231 | 232 | case "BluetoothConnect": 233 | classInfos = "Component.BluetoothConnect"; 234 | break; 235 | 236 | case "LocationManager": 237 | classInfos = "Component.LocationManager"; 238 | break; 239 | 240 | case "RadioButton": 241 | classInfos = "View.Clickable.TextView.Button.CompoundButton.RadioButton"; 242 | break; 243 | 244 | case "RatingBar": 245 | classInfos = "View.Clickable.RatingBar"; 246 | break; 247 | 248 | case "SearchView": 249 | classInfos = "View.ViewGroup.LinearLayoutCompat.SearchView"; 250 | break; 251 | 252 | case "VideoView": 253 | classInfos = "View.VideoView"; 254 | break; 255 | 256 | case "AutoCompleteTextView": 257 | classInfos = "View.Clickable.TextView.EditText.AutoCompleteTextView"; 258 | break; 259 | 260 | case "MultiAutoCompleteTextView": 261 | classInfos = "View.Clickable.TextView.EditText.MultiAutoCompleteTextView"; 262 | break; 263 | 264 | case "GridView": 265 | classInfos = "View.ViewGroup.AdapterView.AbsListView.GridView"; 266 | break; 267 | 268 | case "AnalogClock": 269 | classInfos = "View.Clickable.AnalogClock"; 270 | break; 271 | 272 | case "DigitalClock": 273 | classInfos = "View.Clickable.DigitalClock"; 274 | break; 275 | 276 | case "DatePicker": 277 | classInfos = "View.Clickable.DatePicker"; 278 | break; 279 | 280 | case "TimePicker": 281 | classInfos = "View.Clickable.TimePicker"; 282 | break; 283 | 284 | case "TabLayout": 285 | classInfos = "View.TabLayout"; 286 | break; 287 | 288 | case "ViewPager": 289 | classInfos = "View.ViewGroup.AdapterView.ViewPager"; 290 | break; 291 | 292 | case "BottomNavigationView": 293 | classInfos = "View.ViewGroup.BottomNavigationView"; 294 | break; 295 | 296 | case "BadgeView": 297 | classInfos = "View.Clickable.FrameLayout.BadgeView"; 298 | break; 299 | 300 | case "PatternLockView": 301 | classInfos = "View.PatternLockView"; 302 | break; 303 | 304 | case "WaveSideBar": 305 | classInfos = "View.FrameLayout.RelativeLayout.WaveSideBar"; 306 | break; 307 | 308 | case "SignInButton": 309 | classInfos = "View.Clickable.Button.SignInButton"; 310 | break; 311 | 312 | case "MaterialButton": 313 | classInfos = "View.Clickable.TextView.Button"; 314 | break; 315 | 316 | case "CircleImageView": 317 | classInfos = "View.Clickable.ImageView.CircleImageView"; 318 | break; 319 | 320 | case "CollapsingToolbarLayout": 321 | classInfos = "View.ViewGroup.LinearLayout.CollapsingToolbarLayout"; 322 | break; 323 | 324 | case "SwipeRefreshLayout": 325 | classInfos = "View.ViewGroup.LinearLayout.SwipeRefreshLayout"; 326 | break; 327 | 328 | case "TextInputLayout": 329 | classInfos = "View.ViewGroup.LinearLayout.TextInputLayout"; 330 | break; 331 | 332 | case "RadioGroup": 333 | classInfos = "View.ViewGroup.LinearLayout.RadioGroup"; 334 | break; 335 | 336 | case "CardView": 337 | classInfos = "View.Clickable.ViewGroup.LinearLayout.CardView"; 338 | break; 339 | 340 | case "LottieAnimationView": 341 | classInfos = "View.Clickable.LottieAnimation"; 342 | break; 343 | 344 | case "YoutubePlayerView": 345 | classInfos = "View.Clickable.YoutubePlayer"; 346 | break; 347 | 348 | case "OTPView": 349 | classInfos = "View.Clickable.OTPView"; 350 | break; 351 | 352 | case "RecyclerView": 353 | classInfos = "View.RecyclerView"; 354 | break; 355 | 356 | case "FBAdsInterstitial": 357 | classInfos = "Component.FBAdsInterstitial"; 358 | break; 359 | 360 | case "Videos": 361 | classInfos = "Component.Videos"; 362 | break; 363 | 364 | case "FirebaseAdmin": 365 | classInfos = "Component.OneSignal"; 366 | break; 367 | 368 | case "FirebaseCloudMessage": 369 | classInfos = "Component.FirebaseCloudMessage"; 370 | break; 371 | 372 | case "TimePickerDialog": 373 | classInfos = "Component.TimePickerDialog"; 374 | break; 375 | 376 | case "FBAdsBanner": 377 | classInfos = "Component.FBAdsBanner"; 378 | break; 379 | 380 | case "Notification": 381 | classInfos = "Component.Notification"; 382 | break; 383 | 384 | case "ProgressDialog": 385 | classInfos = "Component.ProgressDialog"; 386 | break; 387 | 388 | case "FirebaseGoogleLogin": 389 | classInfos = "Component.FirebaseGoogleLogin"; 390 | break; 391 | 392 | case "FirebaseDynamicLink": 393 | classInfos = "Component.FirebaseDynamicLink"; 394 | break; 395 | 396 | case "PopupMenu": 397 | classInfos = "Component.PopupMenu"; 398 | break; 399 | 400 | case "DatePickerDialog": 401 | classInfos = "Component.DatePickerDialog"; 402 | break; 403 | 404 | case "FirebasePhoneAuth": 405 | classInfos = "Component.FirebasePhoneAuth"; 406 | break; 407 | 408 | case "MediaController": 409 | classInfos = "Component.MediaController"; 410 | break; 411 | 412 | default: 413 | classInfos = ""; 414 | } 415 | 416 | b = classInfos.split("\\."); 417 | } 418 | } 419 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/util/LayoutUtils.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview.util; 2 | 3 | import android.content.Context; 4 | import android.util.TypedValue; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | public class LayoutUtils { 10 | public static float getDip(Context var0, float var1) { 11 | return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, var1, var0.getResources().getDisplayMetrics()); 12 | } 13 | 14 | public static View inflate(Context var0, ViewGroup var1, int var2) { 15 | return ((LayoutInflater) var0.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(var2, var1, true); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/util/StringUtils.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview.util; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class StringUtils { 6 | 7 | public static class StringTokenizer { 8 | public String src; 9 | public int index; 10 | 11 | public StringTokenizer(String text) { 12 | src = text; 13 | index = 0; 14 | } 15 | 16 | public boolean atEnd() { 17 | return index >= src.length(); 18 | } 19 | 20 | public String nextToken() { 21 | skipWhiteSpace(); 22 | boolean atEnd = atEnd(); 23 | StringBuilder stringBuilder = new StringBuilder(); 24 | if (!atEnd) { 25 | boolean isArg = false; 26 | int startIndex = index; 27 | 28 | while (index < src.length()) { 29 | if (src.charAt(index) == 32) { 30 | return stringBuilder.toString(); 31 | } 32 | 33 | char var5 = src.charAt(index); 34 | if (var5 == 92) { 35 | stringBuilder.append(var5 + src.charAt(1 + index)); 36 | index += 2; 37 | } else { 38 | if (var5 == 37) { 39 | if (index > startIndex) { 40 | return stringBuilder.toString(); 41 | } 42 | 43 | isArg = true; 44 | } 45 | 46 | if (isArg) { 47 | if (var5 == 63) { 48 | break; 49 | } 50 | 51 | if (var5 == 45) { 52 | return stringBuilder.toString(); 53 | } 54 | } 55 | 56 | String var9 = String.valueOf(stringBuilder) + var5; 57 | stringBuilder = new StringBuilder(var9); 58 | ++index; 59 | } 60 | } 61 | 62 | } 63 | return stringBuilder.toString(); 64 | } 65 | 66 | public void skipWhiteSpace() { 67 | while (index < src.length() && src.charAt(index) == 32) { 68 | ++index; 69 | } 70 | } 71 | } 72 | 73 | 74 | public static ArrayList tokenize(String text) { 75 | ArrayList tokenList = new ArrayList<>(); 76 | StringTokenizer stringTokenizer = new StringTokenizer(text); 77 | 78 | while (!stringTokenizer.atEnd()) { 79 | String nextToken = stringTokenizer.nextToken(); 80 | if (nextToken.length() > 0) { 81 | tokenList.add(nextToken); 82 | } 83 | } 84 | 85 | return tokenList; 86 | } 87 | 88 | public static String unescape(String text) { 89 | StringBuilder stringBuilder = new StringBuilder(); 90 | 91 | for (int i = 0; i < text.length(); ++i) { 92 | char charAt = text.charAt(i); 93 | if (charAt == 92) { 94 | StringBuilder sb = new StringBuilder(); 95 | sb.append(stringBuilder); 96 | ++i; 97 | sb.append(text.charAt(i)); 98 | stringBuilder = new StringBuilder(sb.toString()); 99 | } else { 100 | stringBuilder.append(charAt); 101 | } 102 | } 103 | 104 | return stringBuilder.toString(); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /app/src/main/java/ma/swblockspreview/util/mq.java: -------------------------------------------------------------------------------- 1 | package ma.swblockspreview.util; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class mq { 6 | 7 | public static Gx a(String type, String typeName) { 8 | switch (type) { 9 | case "b": 10 | return new Gx("boolean"); 11 | 12 | case "d": 13 | case "n": 14 | return new Gx("double"); 15 | 16 | case "s": 17 | if ("inputOnly".equals(typeName)) { 18 | return new Gx("Input"); 19 | } 20 | return new Gx("String"); 21 | 22 | case "a": 23 | return new Gx("Map"); 24 | 25 | case "l": 26 | switch (typeName) { 27 | case "List Map": 28 | return new Gx("ListMap"); 29 | 30 | case "List String": 31 | return new Gx("ListString"); 32 | 33 | case "List Number": 34 | return new Gx("ListInt"); 35 | } 36 | 37 | case "v": 38 | return new Gx(typeName); 39 | 40 | case "p": 41 | case "m": 42 | return new Gx(b(typeName)); 43 | 44 | default: 45 | return null; 46 | } 47 | } 48 | 49 | 50 | public static String b(String name) { 51 | switch (name) { 52 | case "intent": 53 | case "Intent": 54 | return "Intent"; 55 | 56 | case "file": 57 | case "File": 58 | case "File (Shared Preferences)": 59 | return "SharedPreferences"; 60 | 61 | case "calendar": 62 | case "Calendar": 63 | return "Calendar"; 64 | 65 | case "vibrator": 66 | case "Vibrator": 67 | return "Vibrator"; 68 | 69 | case "Timer": 70 | return "Timer"; 71 | 72 | case "dialog": 73 | case "Dialog": 74 | return "Dialog"; 75 | 76 | case "MediaPlayer": 77 | return "MediaPlayer"; 78 | 79 | case "SoundPool": 80 | return "SoundPool"; 81 | 82 | case "ObjectAnimator": 83 | return "ObjectAnimator"; 84 | 85 | case "firebase": 86 | case "Firebase": 87 | case "Firebase DB": 88 | return "FirebaseDB"; 89 | 90 | case "firebaseauth": 91 | case "Firebase Auth": 92 | return "FirebaseAuth"; 93 | 94 | case "gyroscope": 95 | case "Gyroscope": 96 | return "Gyroscope"; 97 | 98 | case "InterstitialAd": 99 | return "InterstitialAd"; 100 | 101 | case "varBool": 102 | return "boolean.SelectBoolean"; 103 | 104 | case "varInt": 105 | return "double.SelectDouble"; 106 | 107 | case "varStr": 108 | return "String.SelectString"; 109 | 110 | case "varMap": 111 | return "Map"; 112 | 113 | case "listInt": 114 | return "ListInt"; 115 | 116 | case "listStr": 117 | return "ListString"; 118 | 119 | case "listMap": 120 | return "ListMap"; 121 | 122 | case "list": 123 | return "List"; 124 | 125 | case "view": 126 | return "View"; 127 | 128 | case "textview": 129 | return "TextView"; 130 | 131 | case "edittext": 132 | return "EditText"; 133 | 134 | case "imageview": 135 | return "ImageView"; 136 | 137 | case "compoundButton": 138 | return "CompoundButton"; 139 | 140 | case "checkbox": 141 | return "CheckBox"; 142 | 143 | case "switch": 144 | return "Switch"; 145 | 146 | case "listSpn": 147 | return "AdapterView"; 148 | 149 | case "listview": 150 | return "ListView"; 151 | 152 | case "spinner": 153 | return "Spinner"; 154 | 155 | case "webview": 156 | return "WebView"; 157 | 158 | case "calendarview": 159 | return "CalendarView"; 160 | 161 | case "adview": 162 | return "AdView"; 163 | 164 | case "mapview": 165 | return "MapView"; 166 | 167 | case "timer": 168 | return "Timer"; 169 | 170 | case "mediaplayer": 171 | return "MediaPlayer"; 172 | 173 | case "soundpool": 174 | return "SoundPool"; 175 | 176 | case "objectanimator": 177 | return "ObjectAnimator"; 178 | 179 | case "seekbar": 180 | return "SeekBar"; 181 | 182 | case "interstitialad": 183 | return "InterstitialAd"; 184 | 185 | case "firebasestorage": 186 | return "FirebaseStorage"; 187 | 188 | case "camera": 189 | return "Camera"; 190 | 191 | case "filepicker": 192 | return "FilePicker"; 193 | 194 | case "requestnetwork": 195 | return "RequestNetwork"; 196 | 197 | case "progressbar": 198 | return "ProgressBar"; 199 | 200 | case "texttospeech": 201 | return "TextToSpeech"; 202 | 203 | case "speechtotext": 204 | return "SpeechToText"; 205 | 206 | case "bluetoothconnect": 207 | return "BluetoothConnect"; 208 | 209 | case "locationmanager": 210 | return "LocationManager"; 211 | 212 | case "radiobutton": 213 | return "RadioButton"; 214 | 215 | case "ratingbar": 216 | return "RatingBar"; 217 | 218 | case "videoview": 219 | return "VideoView"; 220 | 221 | case "searchview": 222 | return "SearchView"; 223 | 224 | case "gridview": 225 | return "GridView"; 226 | 227 | case "actv": 228 | return "AutoCompleteTextView"; 229 | 230 | case "mactv": 231 | return "MultiAutoCompleteTextView"; 232 | 233 | case "tablayout": 234 | return "TabLayout"; 235 | 236 | case "viewpager": 237 | return "ViewPager"; 238 | 239 | case "badgeview": 240 | return "BadgeView"; 241 | 242 | case "bottomnavigation": 243 | return "BottomNavigationView"; 244 | 245 | case "patternview": 246 | return "PatternLockView"; 247 | 248 | case "sidebar": 249 | return "WaveSideBar"; 250 | 251 | default: 252 | return name; 253 | } 254 | } 255 | 256 | public static ArrayList a(String spec) { 257 | ArrayList paramClass = new ArrayList<>(); 258 | ArrayList specList = StringUtils.tokenize(spec); 259 | for (String params : specList) { 260 | if (params.charAt(0) == '%' && params.length() >= 2) { 261 | String type = String.valueOf(params.charAt(1)); 262 | String typeName; 263 | if (params.length() > 3) { 264 | typeName = params.substring(3); 265 | } else { 266 | typeName = ""; 267 | } 268 | paramClass.add(a(type, typeName)); 269 | } 270 | } 271 | return paramClass; 272 | } 273 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 |