├── .idea ├── artifacts │ └── Apktool_GUI_jar.xml ├── compiler.xml ├── description.html ├── encodings.xml ├── gradle.xml ├── libraries │ └── apktool_cli_all.xml ├── misc.xml ├── modules.xml ├── uiDesigner.xml ├── vcs.xml └── workspace.xml ├── ApktoolFX.iml ├── README.md ├── img ├── ss1.png └── ss2.png ├── lib └── apktool-cli-all.jar ├── out ├── artifacts │ └── Apktool_GUI_jar │ │ └── Apktool_GUI.jar └── production │ ├── ApktoolFX │ ├── META-INF │ │ └── MANIFEST.MF │ ├── com │ │ └── bittle │ │ │ └── apktoolfx │ │ │ ├── LOGGER.class │ │ │ ├── Main.class │ │ │ ├── MainFXML.fxml │ │ │ ├── controllers │ │ │ ├── CompileController$1.class │ │ │ ├── CompileController.class │ │ │ ├── Controller.class │ │ │ ├── DecompileController$1.class │ │ │ └── DecompileController.class │ │ │ └── fxml │ │ │ ├── CompileTabPage.fxml │ │ │ └── DecompileTabPage.fxml │ └── styles │ │ ├── MaterialFxTester.fxml │ │ ├── material.css │ │ ├── materialfx-toggleswitch.css │ │ └── materialfx-toggleswitch.fxml │ └── Apktool_GUI │ ├── META-INF │ └── MANIFEST.MF │ ├── com │ └── bittle │ │ └── apktoolfx │ │ ├── LOGGER.class │ │ ├── Main.class │ │ ├── MainFXML.fxml │ │ ├── controllers │ │ ├── CompileController$1.class │ │ ├── CompileController.class │ │ ├── Controller.class │ │ ├── DecompileController$1.class │ │ └── DecompileController.class │ │ └── fxml │ │ ├── CompileTabPage.fxml │ │ └── DecompileTabPage.fxml │ └── styles │ ├── MaterialFxTester.fxml │ ├── material.css │ ├── materialfx-toggleswitch.css │ └── materialfx-toggleswitch.fxml └── src ├── META-INF └── MANIFEST.MF ├── com └── bittle │ └── apktoolfx │ ├── LOGGER.java │ ├── Main.java │ ├── MainFXML.fxml │ ├── controllers │ ├── CompileController.java │ ├── Controller.java │ └── DecompileController.java │ └── fxml │ ├── CompileTabPage.fxml │ └── DecompileTabPage.fxml └── styles └── material.css /.idea/artifacts/Apktool_GUI_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | $PROJECT_DIR$/out/artifacts/Apktool_GUI_jar 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple JavaFX 2.0 application that includes simple .fxml file with attached controller and Main class to quick start. Artifact to build JavaFX application is provided. 2 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/libraries/apktool_cli_all.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/uiDesigner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /ApktoolFX.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ApktoolFX 2 | A GUI for Apktool to make reverse engineering of android apps a breeze. 3 | 4 | ApktoolFX is a GUI for [Apktool](https://github.com/iBotPeaches/Apktool) written in JavaFX 5 | 6 | Features: 7 | - Drag and drop 8 | - [Material design](https://bitbucket.org/agix-material-fx/materialfx-material-design-for-javafx) 9 | - Log (with color-coding) 10 | 11 | 12 | Images: 13 |
14 | 15 |
16 |
17 | 18 |
19 | 20 | Jar file can be found [here](/out/artifacts/Apktool_GUI_jar/Apktool_GUI.jar) 21 | -------------------------------------------------------------------------------- /img/ss1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/img/ss1.png -------------------------------------------------------------------------------- /img/ss2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/img/ss2.png -------------------------------------------------------------------------------- /lib/apktool-cli-all.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/lib/apktool-cli-all.jar -------------------------------------------------------------------------------- /out/artifacts/Apktool_GUI_jar/Apktool_GUI.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/artifacts/Apktool_GUI_jar/Apktool_GUI.jar -------------------------------------------------------------------------------- /out/production/ApktoolFX/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Main-Class: com.bittle.apktoolfx.Main 3 | 4 | -------------------------------------------------------------------------------- /out/production/ApktoolFX/com/bittle/apktoolfx/LOGGER.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/ApktoolFX/com/bittle/apktoolfx/LOGGER.class -------------------------------------------------------------------------------- /out/production/ApktoolFX/com/bittle/apktoolfx/Main.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/ApktoolFX/com/bittle/apktoolfx/Main.class -------------------------------------------------------------------------------- /out/production/ApktoolFX/com/bittle/apktoolfx/MainFXML.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /out/production/ApktoolFX/com/bittle/apktoolfx/controllers/CompileController$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/ApktoolFX/com/bittle/apktoolfx/controllers/CompileController$1.class -------------------------------------------------------------------------------- /out/production/ApktoolFX/com/bittle/apktoolfx/controllers/CompileController.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/ApktoolFX/com/bittle/apktoolfx/controllers/CompileController.class -------------------------------------------------------------------------------- /out/production/ApktoolFX/com/bittle/apktoolfx/controllers/Controller.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/ApktoolFX/com/bittle/apktoolfx/controllers/Controller.class -------------------------------------------------------------------------------- /out/production/ApktoolFX/com/bittle/apktoolfx/controllers/DecompileController$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/ApktoolFX/com/bittle/apktoolfx/controllers/DecompileController$1.class -------------------------------------------------------------------------------- /out/production/ApktoolFX/com/bittle/apktoolfx/controllers/DecompileController.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/ApktoolFX/com/bittle/apktoolfx/controllers/DecompileController.class -------------------------------------------------------------------------------- /out/production/ApktoolFX/com/bittle/apktoolfx/fxml/CompileTabPage.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 48 | 295 | 385 | -------------------------------------------------------------------------------- /out/production/ApktoolFX/styles/material.css: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2015 - AGIX | Innovative Engineering 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | */ 25 | 26 | /* 27 | * This is a Material Design CSS for JavaFX 28 | */ 29 | 30 | /******************************************************************************* 31 | * * 32 | * Root * 33 | * * 34 | ******************************************************************************/ 35 | .root { 36 | /* Swatch Colors - Blue*/ 37 | -swatch-100: #BBDEFB; 38 | -swatch-200: #90CAF9; 39 | -swatch-300: #64BEF6; 40 | -swatch-400: #42A5F5; 41 | -swatch-500: #2196F3; 42 | /*default text */ 43 | -fx-text-base-color: rgb(100.0, 100.0, 100.0); 44 | -fx-text-button-normal: -swatch-500; 45 | -fx-text-button-colored: rgb(255.0, 255.0, 255.0); 46 | -fx-text-button-text: rgb(100.0, 100.0, 100.0); 47 | -fx-text-title-color: rgb(45.0, 45.0, 45.0); 48 | -fx-text-subtitle-color: rgb(65.0, 65.0, 65.0); 49 | -fx-text-control-title-color: rgb(130.0, 130.0, 130.0); 50 | -fx-text-fill: -fx-text-base-color; 51 | -dark: rgb(47.0, 52.0, 57.0); 52 | -light: rgb(238, 238, 238); 53 | -fx-background-color: -light; 54 | /*default font */ 55 | -fx-font-family: 'Roboto Medium'; 56 | -fx-font-size: 14.0px; 57 | -fx-disabled-opacity: 0.6; 58 | /*default colors */ 59 | -swatch-grey: rgb(200.0, 200.0, 200.0); 60 | -swatch-dark-grey: rgb(150.0, 150.0, 150.0); 61 | -swatch-light-grey: rgb(230.0, 230.0, 230.0); 62 | -swatch-toolbar: rgb(245.0, 245.0, 245.0); 63 | -swatch-toolbar-selected: rgb(215.0, 215.0, 215.0); 64 | /* 65 | Modena colors 66 | */ 67 | -fx-dark-text-color: white; /* Text color when selected*/ 68 | -fx-mid-text-color: -fx-text-base-color; 69 | -fx-light-text-color: -swatch-light-grey; 70 | -fx-body-color: white; 71 | /* A bright blue for the focus indicator of objects. Typically used as the 72 | * first color in -fx-background-color for the "focused" pseudo-class. Also 73 | * typically used with insets of -1.4 to provide a glowing effect. 74 | */ 75 | -fx-focus-color: -swatch-400; 76 | -fx-faint-focus-color: -swatch-200; 77 | /* A bright blue for highlighting/accenting objects. For example: selected 78 | * text; selected items in menus, lists, trees, and tables; progress bars */ 79 | -fx-accent: -swatch-400; 80 | -fx-dark-text-color: white; 81 | } 82 | 83 | /******************************************************************************* 84 | * * 85 | * Material Design - Cards * 86 | * * 87 | ******************************************************************************/ 88 | .card { 89 | -fx-background-color: rgb(255.0, 255.0, 255.0); 90 | -fx-background-radius: 4.0; 91 | -fx-effect: dropshadow(gaussian, rgb(0.0, 0.0, 0.0, 0.15), 6.0, 0.7, 0.0, 92 | 1.5); 93 | -fx-padding: 16 16 16 16; 94 | } 95 | 96 | .card-title { 97 | -fx-font-size: 20.0px; 98 | -fx-padding: 5 0 5 0; 99 | } 100 | 101 | .card-title .text { 102 | -fx-fill: -fx-text-title-color; 103 | } 104 | 105 | .card-subtitle { 106 | -fx-font-size: 16.0px; 107 | -fx-padding: 5 0 5 0; 108 | } 109 | 110 | .card-subtitle .text { 111 | -fx-fill: -fx-text-subtitle-color; 112 | } 113 | 114 | .control-label { 115 | -fx-font-size: 12.0px; 116 | -fx-padding: 16 0 0 0; 117 | } 118 | 119 | .control-label .text { 120 | -fx-fill: -fx-text-control-title-color; 121 | } 122 | 123 | .card-button { 124 | -fx-effect: null; 125 | } 126 | 127 | /******************************************************************************* 128 | * * 129 | * Button & ToggleButton * 130 | * * 131 | ******************************************************************************/ 132 | .button-raised { 133 | -fx-effect: dropshadow(gaussian, rgb(0.0, 0.0, 0.0, 0.30), 6.0, 0.3, 0, 134 | 1); 135 | -fx-background-color: rgb(250, 250, 250); 136 | } 137 | 138 | .button-flat { 139 | -fx-effect: null; 140 | -fx-background-color: transparent; 141 | } 142 | 143 | .toggle-button, .button { 144 | -fx-text-fill: -fx-text-button-normal; 145 | -fx-font-family: 'Roboto'; 146 | -fx-font-weight: bold; 147 | -fx-background-insets: 0.0; 148 | -fx-background-radius: 4.0; 149 | -fx-padding: 0.7em; 150 | -fx-alignment: CENTER; 151 | } 152 | 153 | .button-raised .button .text, .button-flat .button .text { 154 | -fx-text-weight: Bold; 155 | } 156 | 157 | .button:default { 158 | -fx-background-color: -swatch-500; 159 | -fx-text-fill: -fx-text-button-colored; 160 | } 161 | 162 | .toggle-button:focused, .button:focused, .button:default:focused { 163 | -fx-background-color: -swatch-light-grey; 164 | } 165 | 166 | .toggle-button:focused:selected { 167 | -fx-background-color: derive(-swatch-500, 50.0%), 168 | derive(-swatch-500, -20.0%); 169 | -fx-background-insets: 0.0, 0.2em; 170 | -fx-text-fill: -fx-text-button-colored; 171 | } 172 | 173 | .toggle-button:armed, .toggle-button:selected, .button:armed, .button:default:armed 174 | { 175 | -fx-background-color: -swatch-grey; 176 | -fx-text-fill: -fx-text-button-colored; 177 | } 178 | 179 | .icon-button { 180 | -fx-background-color: transparent; 181 | -fx-pref-height: 42; 182 | -fx-pref-width: 42; 183 | -fx-min-height: 42; 184 | -fx-min-width: 42; 185 | -fx-padding: 0; 186 | } 187 | 188 | .icon-button .text { 189 | -fx-font-family: 'MaterialDesignIconicFont'; 190 | -fx-font-size: 24px; 191 | } 192 | 193 | /******************************************************************************* 194 | * * 195 | * ComboBox, ChoiceBox COMMON * 196 | * * 197 | ******************************************************************************/ 198 | .combo-box-base, .choice-box { 199 | -fx-background-color: transparent; 200 | -fx-border-color: -swatch-grey; 201 | -fx-border-width: 0 0 2 0; 202 | -fx-background-radius: 0; 203 | -fx-border-radius: 0; 204 | } 205 | 206 | .combo-box:focused, .choice-box:focused { 207 | -fx-border-color: -swatch-500; 208 | } 209 | 210 | .combo-box-base>.label, .choice-box>.label { 211 | -fx-padding: 0.7em 0.7em 0.7em 0em; 212 | } 213 | 214 | .combo-box-base>.arrow-button, .choice-box>.open-button { 215 | -fx-padding: 1.2em 0.7em 1.2em 0.5em; 216 | -fx-background-radius: 0.0 2.0 2.0 0.0; 217 | } 218 | 219 | .combo-box-base>.arrow-button>.arrow, .choice-box>.open-button>.arrow { 220 | -fx-background-color: -swatch-grey; 221 | } 222 | 223 | .combo-box-base .arrow-button:hover .arrow, .spinner .increment-arrow-button:hover .increment-arrow, 224 | .spinner .decrement-arrow-button:hover .decrement-arrow { 225 | -fx-background-color: -swatch-dark-grey; 226 | } 227 | 228 | .button-bar .button{ 229 | -fx-padding: 5 5 5 5; 230 | } 231 | 232 | .menu-item:focused { 233 | -fx-background-color: -swatch-light-grey; 234 | } 235 | 236 | /******************************************************************************* 237 | * * 238 | * CheckBox * 239 | * * 240 | ******************************************************************************/ 241 | .check-box { 242 | -fx-padding: 10; 243 | } 244 | 245 | .check-box .text { 246 | -fx-fill: -fx-text-base-color; 247 | } 248 | 249 | .check-box>.box, .check-box>.box.unfocused, .check-box:disabled>.box, 250 | .check-box:indeterminate>.box { 251 | -fx-border-radius: 4.0; 252 | -fx-border-color: -swatch-grey; 253 | -fx-border-width: 2; 254 | -fx-background-radius: 4; 255 | -fx-background-color: transparent; 256 | -fx-padding: 1; 257 | } 258 | 259 | .check-box:selected>.box { 260 | /*-fx-border-color: -swatch-500;*/ 261 | -fx-background-color: -swatch-500; 262 | } 263 | 264 | .check-box:focused>.box { 265 | -fx-effect: dropshadow(gaussian, rgb(0.0, 0.0, 0.0, 0.30), 2.0, 0.3, 0, 266 | 0); 267 | } 268 | 269 | .check-box:selected>.box { 270 | -fx-background-color: white; 271 | } 272 | 273 | .check-box:indeterminate>.box { 274 | -fx-background-color: -swatch-grey; 275 | -fx-padding: 0.45em; 276 | } 277 | 278 | /******************************************************************************* 279 | * * 280 | * ChoiceBox * 281 | * * 282 | ******************************************************************************/ 283 | .context-menu { 284 | -fx-background-color: rgb(255.0, 255.0, 255.0, 0.95); 285 | -fx-background-radius: 2.0; 286 | } 287 | 288 | .radio-menu-item, .check-menu-item { 289 | -fx-padding: 0.7em 0.7em 0.7em 0em; 290 | } 291 | 292 | .radio-menu-item:checked .label, .check-menu-item:checked .label { 293 | -fx-text-fill: -swatch-500; 294 | } 295 | 296 | .radio-menu-item:checked>.left-container>.radio, .check-menu-item:checked>.left-container>.check 297 | { 298 | -fx-background-color: -swatch-dark-grey; 299 | -fx-padding: 0.68em 0.5em 0.0em 0.0em; 300 | -fx-effect: dropshadow(gaussian, rgb(0.0, 0.0, 0.0, 0.2), 0.0, 0.0, 0.0, 301 | 1.0); 302 | } 303 | 304 | .radio-menu-item>.left-container>.radio, .check-menu-item>.left-container>.check 305 | { 306 | -fx-background-color: transparent; 307 | -fx-padding: 0.68em 0.68em 0.0em 0.0em; 308 | } 309 | 310 | /******************************************************************************* 311 | * * 312 | * ComboBox * 313 | * * 314 | ******************************************************************************/ 315 | .combo-box .list-cell { 316 | -fx-padding: 0.7em 0.7em 0.7em 0em; 317 | } 318 | 319 | .popup-overlay { 320 | -fx-background-color: white; 321 | -fx-border-color: -swatch-grey; 322 | -fx-border-width: 0 0 2 0; 323 | -fx-background-radius: 0; 324 | -fx-border-radius: 0; 325 | } 326 | 327 | .title-bar { 328 | -fx-padding: 10; 329 | } 330 | 331 | .title-bar .icon { 332 | -fx-alignment: center-left; 333 | -fx-effect: dropshadow(gaussian, rgb(0.0, 0.0, 0.0, 0.2), 0.0, 0.0, 0.0, 334 | 1.0); 335 | } 336 | 337 | .title-bar .title-label { 338 | -fx-padding: 0 10 0 10; 339 | -fx-alignment: center; 340 | -fx-font-size: 36; 341 | -fx-font-weight: bolder; 342 | } 343 | 344 | .content-area { 345 | -fx-background-color: -dark; 346 | } 347 | 348 | .content-background { 349 | -fx-background-color: white; 350 | -fx-background-radius: 0.0 0.0 11.0 11.0; 351 | -fx-padding: 0 10 10 10; 352 | } 353 | 354 | /******************************************************************************* 355 | * * 356 | * Date Picker * 357 | * * 358 | ******************************************************************************/ 359 | .date-picker-popup .button { 360 | -fx-background-color: -swatch-500; 361 | } 362 | 363 | .date-picker-popup>.month-year-pane { 364 | -fx-background-color: -swatch-500; 365 | } 366 | 367 | .date-picker-popup>*>.spinner>.button>.left-arrow, .date-picker-popup>*>.spinner>.button>.right-arrow 368 | { 369 | -fx-background-color: white; 370 | } 371 | 372 | .date-picker-popup>*>.spinner { 373 | -fx-border-width: 0; 374 | } 375 | 376 | .date-picker-popup>*>.spinner>.label { 377 | -fx-text-fill: white; 378 | -fx-font-weight: bold; 379 | } 380 | 381 | .date-picker-popup>*>.day-name-cell, .date-picker-popup>*>.week-number-cell 382 | { 383 | -fx-font-weight: normal; 384 | -fx-text-fill: -swatch-dark-grey; 385 | -fx-font-size: 1em; 386 | } 387 | 388 | /******************************************************************************* 389 | * * 390 | * Date picker * 391 | * * 392 | ******************************************************************************/ 393 | .date-picker .arrow-button { 394 | -fx-background-color: transparent; 395 | } 396 | 397 | .date-picker .arrow-button .arrow { 398 | -fx-background-insets: -4; 399 | } 400 | 401 | .date-picker .date-picker-display-node { 402 | -fx-border-width: 0; 403 | } 404 | 405 | /******************************************************************************* 406 | * * 407 | * HTML Editor * 408 | * * 409 | ******************************************************************************/ 410 | .html-editor { 411 | -fx-background-color: white; 412 | -fx-border-width: 2 0 2 0; 413 | -fx-border-color: -swatch-grey; 414 | } 415 | 416 | .html-editor .web-view { 417 | -fx-border-color: grey; 418 | -fx-border-width: grey; 419 | } 420 | 421 | .web-view { 422 | -fx-font-smoothing-type: gray; 423 | } 424 | 425 | /******************************************************************************* 426 | * * 427 | * Label * 428 | * * 429 | ******************************************************************************/ 430 | .label { 431 | -fx-text-fill: -fx-text-base-color; 432 | } 433 | 434 | .label:disabled { 435 | -fx-opacity: -fx-disabled-opacity; 436 | } 437 | 438 | .label:show-mnemonics>.mnemonic-underline { 439 | -fx-stroke: -fx-text-base-color; 440 | } 441 | 442 | /******************************************************************************* 443 | * * 444 | * List, Tree, Table COMMON * 445 | * * 446 | ******************************************************************************/ 447 | .list-view:focused .list-cell:filled:focused:selected { 448 | -fx-background-color: -swatch-light-grey; 449 | -fx-text-fill: -swatch-500; 450 | } 451 | 452 | .list-view:hover .list-cell:hover { 453 | -fx-background-color: -swatch-light-grey; 454 | -fx-text-fill: -fx-text-base-color; 455 | } 456 | 457 | .list-cell { 458 | -fx-cell-size: 40; 459 | } 460 | 461 | /******************************************************************************* 462 | * * 463 | * ProgressBar * 464 | * * 465 | ******************************************************************************/ 466 | .progress-bar>.track { 467 | -fx-background-color: derive(-swatch-grey, 50.0%); 468 | -fx-background-radius: 2.0; 469 | -fx-padding: 0.0; 470 | } 471 | 472 | .progress-bar>.bar { 473 | -fx-background-color: -swatch-500; 474 | -fx-background-radius: 2.0; 475 | -fx-background-insets: 0.0; 476 | -fx-border-width: 0.0; 477 | -fx-effect: null; 478 | } 479 | 480 | .progress-bar:indeterminate>.bar { 481 | -fx-background-color: derive(-swatch-500, 50.0%); 482 | -fx-background-radius: 2.0; 483 | -fx-background-insets: 0.0; 484 | -fx-border-width: 0.0; 485 | -fx-effect: null; 486 | } 487 | 488 | /******************************************************************************* 489 | * * 490 | * ProgressIndicator * 491 | * * 492 | ******************************************************************************/ 493 | .progress-indicator>.spinner { 494 | -fx-border-width: 0; 495 | } 496 | 497 | .progress-indicator>.determinate-indicator>.indicator { 498 | -fx-background-color: rgb(255.0, 255.0, 255.0, 0.5); 499 | -fx-padding: 0.0; 500 | } 501 | 502 | .progress-indicator>.determinate-indicator>.progress { 503 | -fx-background-color: -swatch-500; 504 | } 505 | 506 | .progress-indicator>.determinate-indicator>.percentage { 507 | -fx-fill: -fx-text-base-color; 508 | -fx-translate-y: 0em; 509 | -fx-padding: 0.0; 510 | -fx-font-size: 11px; 511 | } 512 | 513 | /******************************************************************************* 514 | * * 515 | * RadioButton * 516 | * * 517 | ******************************************************************************/ 518 | .radio-button { 519 | -fx-padding: 10; 520 | } 521 | 522 | .radio-button .text { 523 | -fx-fill: -fx-text-base-color; 524 | } 525 | 526 | .radio-button>.radio, .radio-button>.radio.unfocused, .radio-button:disabled>.radio, 527 | .radio-button:selected>.radio { 528 | -fx-border-radius: 100.0; 529 | -fx-border-color: -swatch-grey; 530 | -fx-border-width: 2; 531 | -fx-background-radius: 100; 532 | -fx-background-color: transparent; 533 | -fx-padding: 3 3 3 3; 534 | } 535 | 536 | .radio-button:focused>.radio { 537 | -fx-background-color: -swatch-100; 538 | } 539 | 540 | .radio-button:focused:armed>.radio { 541 | -fx-background-color: -swatch-100; 542 | } 543 | 544 | .radio-button:selected>.radio>.dot { 545 | -fx-background-color: -swatch-500; 546 | -fx-background-insets: 0; 547 | } 548 | 549 | /******************************************************************************* 550 | * * 551 | * Separators * 552 | * * 553 | ******************************************************************************/ 554 | .separator { 555 | -fx-padding: 16 -16 16 -16; 556 | } 557 | 558 | /******************************************************************************* 559 | * * 560 | * Scroll Bar * 561 | * * 562 | ******************************************************************************/ 563 | .scroll-bar:vertical>.track-background, .scroll-bar:horizontal>.track-background 564 | { 565 | -fx-background-color: -swatch-light-grey; 566 | -fx-background-insets: 0.0; 567 | } 568 | 569 | .scroll-bar:vertical>.thumb, .scroll-bar:horizontal>.thumb { 570 | -fx-background-color: -swatch-grey; 571 | -fx-background-insets: 0.0; 572 | -fx-background-radius: 4.0; 573 | } 574 | 575 | .scroll-bar>.increment-button, .scroll-bar>.decrement-button, 576 | .scroll-bar:hover>.increment-button, .scroll-bar:hover>.decrement-button 577 | { 578 | -fx-background-color: transparent; 579 | } 580 | 581 | .scroll-bar>.increment-button>.increment-arrow, .scroll-bar>.decrement-button>.decrement-arrow 582 | { 583 | -fx-background-color: -swatch-dark-grey; 584 | } 585 | 586 | .scroll-bar>.track-background { 587 | -fx-background-color: transparent; 588 | } 589 | 590 | /******************************************************************************* 591 | * * 592 | * Slider * 593 | * * 594 | ******************************************************************************/ 595 | .slider { 596 | -fx-padding: 10 0 10 0; 597 | } 598 | 599 | .slider:vertical { 600 | -fx-padding: 0 10 0 10; 601 | } 602 | 603 | .slider>.track { 604 | -fx-background-color: -swatch-grey; 605 | -fx-background-insets: 1.5; 606 | } 607 | 608 | .slider>.thumb { 609 | -fx-background-color: -swatch-500; 610 | } 611 | 612 | /******************************************************************************* 613 | * * 614 | * Spinner * 615 | * * 616 | ******************************************************************************/ 617 | .spinner { 618 | -fx-background-color: transparent; 619 | -fx-border-width: 0 0 2 0; 620 | -fx-border-color: -swatch-grey; 621 | } 622 | 623 | .spinner:focused { 624 | -fx-border-color: -swatch-500; 625 | } 626 | 627 | .spinner .text-field { 628 | -fx-background-color: transparent; 629 | -fx-background-radius: 0; 630 | -fx-border-width: 0; 631 | -fx-padding: 0.5em 0.5em 0.5em 0.1em; 632 | -fx-prompt-text-fill: derive(-dark, 50.0%); 633 | -fx-highlight-fill: rgb(94.0, 203.0, 234.0); 634 | } 635 | 636 | .spinner .increment-arrow-button, .spinner .decrement-arrow-button { 637 | -fx-background-color: transparent; 638 | -fx-fill: swatch-500; 639 | } 640 | 641 | .spinner .increment-arrow-button .increment-arrow, .spinner .decrement-arrow-button .decrement-arrow 642 | { 643 | -fx-background-color: -swatch-grey; 644 | } 645 | 646 | .spinner .increment-arrow-button, .spinner .decrement-arrow-button { 647 | -fx-background-color: transparent; 648 | -fx-fill: swatch-500; 649 | } 650 | 651 | /******************************************************************************* 652 | * * 653 | * Tables * 654 | * * 655 | ******************************************************************************/ 656 | .table-view, .tree-table-view { 657 | /* Constants used throughout the tableview. */ 658 | -fx-table-header-border-color: transparent; 659 | -fx-table-cell-border-color: -fx-box-border; /* Horizontal Lines*/ 660 | -fx-background-color: transparent; 661 | } 662 | 663 | /* The column header row is made up of a number of column-header, one for each 664 | TableColumn, and a 'filler' area that extends from the right-most column 665 | to the edge of the tableview, or up to the 'column control' button. */ 666 | .table-view .filler, .tree-table-view .filler, .table-view .column-header, 667 | .tree-table-view .column-header { 668 | -fx-size: 65; 669 | -fx-border-style: null; 670 | -fx-border-color: -swatch-grey; 671 | -fx-border-width: 0 0 2 0; 672 | -fx-background-color: transparent; 673 | } 674 | 675 | .table-view .show-hide-columns-button, .tree-table-view .show-hide-columns-button 676 | { 677 | -fx-background-color: transparent; 678 | } 679 | 680 | .table-view .column-header .label, .table-view .filler .label, 681 | .table-view .column-drag-header .label, .tree-table-view .column-header .label, 682 | .tree-table-view .filler .label, .tree-table-view .column-drag-header .label 683 | { 684 | -fx-alignment: CENTER_LEFT; 685 | } 686 | 687 | .table-view .column-header-background, .tree-table-view .column-header-background 688 | { 689 | -fx-background-color: transparent; 690 | } 691 | 692 | .table-row-cell, .tree-table-row-cell { 693 | -fx-cell-size: 40px; 694 | } 695 | 696 | .table-cell { 697 | -fx-border-color: transparent; /* Vertical Lines*/ 698 | -fx-border-width: 1; 699 | } 700 | 701 | /******************************************************************************* 702 | * * 703 | * Text, Text field & Text area * 704 | * * 705 | ******************************************************************************/ 706 | .text { 707 | -fx-font-smoothing-type: gray; 708 | } 709 | 710 | .text-area, .text-field, .text{ 711 | -fx-background-color: transparent; 712 | -fx-background-radius: 2.0; 713 | -fx-padding: 0.5em 0.5em 0.5em 0.1em; 714 | -fx-border-color: -swatch-grey; 715 | -fx-border-width: 0 0 2 0; 716 | -fx-prompt-text-fill: derive(-dark, 50.0%); 717 | -fx-highlight-fill: rgb(94.0, 203.0, 234.0); 718 | } 719 | 720 | .text-area .text, .text-field>*>.text { 721 | -fx-effect: null; 722 | -fx-fill: -dark; 723 | } 724 | 725 | .text-area { 726 | -fx-padding: 0.15em; 727 | } 728 | 729 | .text-area .content { 730 | -fx-padding: 0.7em; 731 | -fx-border-width: 0.0; 732 | -fx-background-color: transparent; 733 | } 734 | 735 | .text-area:focused .content { 736 | -fx-background-color: transparent; 737 | } 738 | 739 | .text-area:focused, .text-field:focused { 740 | -fx-border-color: -swatch-500; 741 | } 742 | 743 | /******************************************************************************* 744 | * * 745 | * Tool bar & Menu bar * 746 | * * 747 | ******************************************************************************/ 748 | .tool-bar, .menu-bar { /* top */ 749 | -fx-background-color: -swatch-toolbar; 750 | -fx-border-width: 0 0 2 0; 751 | -fx-border-color: -swatch-grey; 752 | -fx-min-height: 48; 753 | -fx-alignment: CENTER_LEFT; 754 | } 755 | 756 | .tool-bar .label { 757 | -fx-font-size: 18; 758 | } 759 | 760 | .tool-bar .combo-box-base, .menu-bar .combo-base { 761 | -fx-border-width: 0; 762 | } 763 | 764 | .tool-bar .button, .tool-bar .toggle-button { 765 | -fx-background-color: -swatch-toolbar; 766 | -fx-text-fill: -fx-text-base-color; 767 | -fx-pref-height: 42; 768 | -fx-pref-width: 42; 769 | -fx-min-height: 42; 770 | -fx-min-width: 42; 771 | -fx-padding: 0; 772 | -fx-background-radius: 0; 773 | } 774 | 775 | .tool-bar .button:pressed, .tool-bar .toggle-button:pressed, .tool-bar .toggle-button:selected 776 | { 777 | -fx-background-color: -swatch-grey; 778 | } 779 | 780 | .tool-bar .toggle-button { 781 | -fx-background-color: -swatch-toolbar; 782 | } 783 | 784 | .tool-bar .separator { 785 | -fx-padding: 5 10 5 10; 786 | } 787 | 788 | .toolbar-colored { 789 | -fx-background-color: -swatch-500; 790 | -fx-border-width: 0 0 2 0; 791 | -fx-border-color: -swatch-grey; 792 | } 793 | 794 | .toolbar-colored .button, .toolbar-colored .toggle-button { 795 | -fx-background-color: -swatch-500; 796 | -fx-text-fill: white; 797 | } 798 | 799 | .toolbar-colored .button:pressed, .toolbar-colored .toggle-button:pressed, 800 | .toolbar-colored .toggle-button:selected { 801 | -fx-background-color: -swatch-200; 802 | } 803 | 804 | .toolbar-colored .text { 805 | -fx-fill: white; 806 | } 807 | 808 | #error_text { 809 | -fx-fill: rgb(244,67,54); 810 | } 811 | 812 | #severe_text{ 813 | -fx-fill: rgb(244,81,30); 814 | } 815 | 816 | #warning_text{ 817 | -fx-fill: rgb(251,140,0); 818 | } 819 | 820 | #normal_text{ 821 | -fx-fill: rgb(66,66,66); 822 | } 823 | 824 | #info_text{ 825 | -fx-fill: rgb(41,182,246); 826 | } 827 | 828 | #fine_text{ 829 | -fx-fill: rgb(46,125,50); 830 | } 831 | -------------------------------------------------------------------------------- /out/production/ApktoolFX/styles/materialfx-toggleswitch.css: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * * 3 | * Root * 4 | * * 5 | ******************************************************************************/ 6 | .root { 7 | /* Swatch Colors - Blue*/ 8 | -swatch-100: #BBDEFB; 9 | -swatch-200: #90CAF9; 10 | -swatch-300: #64BEF6; 11 | -swatch-400: #42A5F5; 12 | -swatch-500: #2196F3; 13 | -fx-text-base-color: rgb(100.0, 100.0, 100.0); 14 | /* Text defaults */ 15 | -fx-font-family: 'Roboto Medium'; 16 | -fx-font-size: 14.0px; 17 | -fx-disabled-opacity: 0.6; 18 | -fx-text-fill: -fx-text-base-color; 19 | } 20 | 21 | /******************************************************************************* 22 | * * 23 | * Text, Text field & Text area * 24 | * * 25 | ******************************************************************************/ 26 | .text { 27 | -fx-font-smoothing-type: gray; 28 | -fx-fill: -fx-text-base-color; 29 | } 30 | 31 | /******************************************************************************* 32 | * * 33 | * CheckBox -> Material ToggleSwitch * 34 | * * 35 | ******************************************************************************/ 36 | 37 | .check-box>*.box{ 38 | -fx-background-color: rgb(200.0, 200.0, 200.0); 39 | -fx-pref-height: 20; 40 | -fx-pref-width: 40; 41 | -fx-background-radius: 100; /* Full round corner */ 42 | -fx-background-insets: 2.5; 43 | -fx-padding:0; 44 | } 45 | .check-box:selected>*.box{ 46 | -fx-background-color: derive(-swatch-500, 0.54); 47 | } 48 | 49 | .check-box:disabled>*.box{ 50 | -fx-background-color: derive(grey, 0.54); 51 | } 52 | 53 | 54 | .check-box >*.box>*.mark { 55 | -fx-background-color: white; 56 | -fx-padding:0; 57 | -fx-background-insets: 0; 58 | -fx-shape: "M 10.5,0 C 4.7010101,0 0,4.7010101 0,10.5 0,16.29899 4.7010101,21 10.5,21 16.29899,21 21,16.29899 21,10.5 21,4.7010101 16.29899,0 10.5,0 Z m 29.455078,10.6875 0,0.134766 0.08984,0 0,-0.134766 z"; 59 | -fx-effect: dropshadow(gaussian, rgb(0.0, 0.0, 0.0, 0.15), 6.0, 0.7, 0.0,1.5); 60 | } 61 | 62 | .check-box:selected>*.box>*.mark { 63 | -fx-background-color: -swatch-500; 64 | -fx-shape: "M 10,5 c 5.79899,0 10.5,4.701 10.5,10.5 0,5.799 -4.70101,10.5 -10.5,10.5 -5.79899,0 -10.5,-4.701 -10.5,-10.5 0,-5.799 4.70101,-10.5 10.5,-10.5 z m -29.455078,10.6875 0,0.1348 -0.08984,0 0,-0.1348 z"; 65 | } 66 | 67 | .check-box:indeterminate>*.box>*.mark { 68 | -fx-background-color: white; 69 | -fx-shape: "M 20 0 C 14.20101 0 9.5 4.701 9.5 10.5 C 9.5 16.299 14.20101 21 20 21 C 25.79899 21 30.5 16.299 30.5 10.5 C 30.5 4.701 25.79899 0 20 0 z M 0 10.6875 L 0 10.822266 L 0.08984375 10.822266 L 0.08984375 10.6875 L 0 10.6875 z M 40.066406 10.900391 A 0.080000006 0.050000001 0 0 0 40 10.949219 A 0.080000006 0.050000001 0 0 0 40.080078 11 A 0.080000006 0.050000001 0 0 0 40.160156 10.949219 A 0.080000006 0.050000001 0 0 0 40.080078 10.900391 A 0.080000006 0.050000001 0 0 0 40.066406 10.900391 z "; 70 | } 71 | 72 | .check-box:disabled>*.box>*.mark { 73 | -fx-background-color: grey; 74 | } 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /out/production/ApktoolFX/styles/materialfx-toggleswitch.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 22 | 23 | -------------------------------------------------------------------------------- /out/production/Apktool_GUI/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Main-Class: com.bittle.apktoolfx.Main 3 | 4 | -------------------------------------------------------------------------------- /out/production/Apktool_GUI/com/bittle/apktoolfx/LOGGER.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/Apktool_GUI/com/bittle/apktoolfx/LOGGER.class -------------------------------------------------------------------------------- /out/production/Apktool_GUI/com/bittle/apktoolfx/Main.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/Apktool_GUI/com/bittle/apktoolfx/Main.class -------------------------------------------------------------------------------- /out/production/Apktool_GUI/com/bittle/apktoolfx/MainFXML.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /out/production/Apktool_GUI/com/bittle/apktoolfx/controllers/CompileController$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/Apktool_GUI/com/bittle/apktoolfx/controllers/CompileController$1.class -------------------------------------------------------------------------------- /out/production/Apktool_GUI/com/bittle/apktoolfx/controllers/CompileController.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/Apktool_GUI/com/bittle/apktoolfx/controllers/CompileController.class -------------------------------------------------------------------------------- /out/production/Apktool_GUI/com/bittle/apktoolfx/controllers/Controller.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/Apktool_GUI/com/bittle/apktoolfx/controllers/Controller.class -------------------------------------------------------------------------------- /out/production/Apktool_GUI/com/bittle/apktoolfx/controllers/DecompileController$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/Apktool_GUI/com/bittle/apktoolfx/controllers/DecompileController$1.class -------------------------------------------------------------------------------- /out/production/Apktool_GUI/com/bittle/apktoolfx/controllers/DecompileController.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscar0812/ApktoolFX/0d24fca0ced2a84b03d5216a2df47b213271aaf5/out/production/Apktool_GUI/com/bittle/apktoolfx/controllers/DecompileController.class -------------------------------------------------------------------------------- /out/production/Apktool_GUI/com/bittle/apktoolfx/fxml/CompileTabPage.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 48 | 295 | 385 | -------------------------------------------------------------------------------- /out/production/Apktool_GUI/styles/material.css: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * 4 | * Copyright (c) 2015 - AGIX | Innovative Engineering 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all 14 | * copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | * SOFTWARE. 23 | * 24 | */ 25 | 26 | /* 27 | * This is a Material Design CSS for JavaFX 28 | */ 29 | 30 | /******************************************************************************* 31 | * * 32 | * Root * 33 | * * 34 | ******************************************************************************/ 35 | .root { 36 | /* Swatch Colors - Blue*/ 37 | -swatch-100: #BBDEFB; 38 | -swatch-200: #90CAF9; 39 | -swatch-300: #64BEF6; 40 | -swatch-400: #42A5F5; 41 | -swatch-500: #2196F3; 42 | /*default text */ 43 | -fx-text-base-color: rgb(100.0, 100.0, 100.0); 44 | -fx-text-button-normal: -swatch-500; 45 | -fx-text-button-colored: rgb(255.0, 255.0, 255.0); 46 | -fx-text-button-text: rgb(100.0, 100.0, 100.0); 47 | -fx-text-title-color: rgb(45.0, 45.0, 45.0); 48 | -fx-text-subtitle-color: rgb(65.0, 65.0, 65.0); 49 | -fx-text-control-title-color: rgb(130.0, 130.0, 130.0); 50 | -fx-text-fill: -fx-text-base-color; 51 | -dark: rgb(47.0, 52.0, 57.0); 52 | -light: rgb(238, 238, 238); 53 | -fx-background-color: -light; 54 | /*default font */ 55 | -fx-font-family: 'Roboto Medium'; 56 | -fx-font-size: 14.0px; 57 | -fx-disabled-opacity: 0.6; 58 | /*default colors */ 59 | -swatch-grey: rgb(200.0, 200.0, 200.0); 60 | -swatch-dark-grey: rgb(150.0, 150.0, 150.0); 61 | -swatch-light-grey: rgb(230.0, 230.0, 230.0); 62 | -swatch-toolbar: rgb(245.0, 245.0, 245.0); 63 | -swatch-toolbar-selected: rgb(215.0, 215.0, 215.0); 64 | /* 65 | Modena colors 66 | */ 67 | -fx-dark-text-color: white; /* Text color when selected*/ 68 | -fx-mid-text-color: -fx-text-base-color; 69 | -fx-light-text-color: -swatch-light-grey; 70 | -fx-body-color: white; 71 | /* A bright blue for the focus indicator of objects. Typically used as the 72 | * first color in -fx-background-color for the "focused" pseudo-class. Also 73 | * typically used with insets of -1.4 to provide a glowing effect. 74 | */ 75 | -fx-focus-color: -swatch-400; 76 | -fx-faint-focus-color: -swatch-200; 77 | /* A bright blue for highlighting/accenting objects. For example: selected 78 | * text; selected items in menus, lists, trees, and tables; progress bars */ 79 | -fx-accent: -swatch-400; 80 | -fx-dark-text-color: white; 81 | } 82 | 83 | /******************************************************************************* 84 | * * 85 | * Material Design - Cards * 86 | * * 87 | ******************************************************************************/ 88 | .card { 89 | -fx-background-color: rgb(255.0, 255.0, 255.0); 90 | -fx-background-radius: 4.0; 91 | -fx-effect: dropshadow(gaussian, rgb(0.0, 0.0, 0.0, 0.15), 6.0, 0.7, 0.0, 92 | 1.5); 93 | -fx-padding: 16 16 16 16; 94 | } 95 | 96 | .card-title { 97 | -fx-font-size: 20.0px; 98 | -fx-padding: 5 0 5 0; 99 | } 100 | 101 | .card-title .text { 102 | -fx-fill: -fx-text-title-color; 103 | } 104 | 105 | .card-subtitle { 106 | -fx-font-size: 16.0px; 107 | -fx-padding: 5 0 5 0; 108 | } 109 | 110 | .card-subtitle .text { 111 | -fx-fill: -fx-text-subtitle-color; 112 | } 113 | 114 | .control-label { 115 | -fx-font-size: 12.0px; 116 | -fx-padding: 16 0 0 0; 117 | } 118 | 119 | .control-label .text { 120 | -fx-fill: -fx-text-control-title-color; 121 | } 122 | 123 | .card-button { 124 | -fx-effect: null; 125 | } 126 | 127 | /******************************************************************************* 128 | * * 129 | * Button & ToggleButton * 130 | * * 131 | ******************************************************************************/ 132 | .button-raised { 133 | -fx-effect: dropshadow(gaussian, rgb(0.0, 0.0, 0.0, 0.30), 6.0, 0.3, 0, 134 | 1); 135 | -fx-background-color: rgb(250, 250, 250); 136 | } 137 | 138 | .button-flat { 139 | -fx-effect: null; 140 | -fx-background-color: transparent; 141 | } 142 | 143 | .toggle-button, .button { 144 | -fx-text-fill: -fx-text-button-normal; 145 | -fx-font-family: 'Roboto'; 146 | -fx-font-weight: bold; 147 | -fx-background-insets: 0.0; 148 | -fx-background-radius: 4.0; 149 | -fx-padding: 0.7em; 150 | -fx-alignment: CENTER; 151 | } 152 | 153 | .button-raised .button .text, .button-flat .button .text { 154 | -fx-text-weight: Bold; 155 | } 156 | 157 | .button:default { 158 | -fx-background-color: -swatch-500; 159 | -fx-text-fill: -fx-text-button-colored; 160 | } 161 | 162 | .toggle-button:focused, .button:focused, .button:default:focused { 163 | -fx-background-color: -swatch-light-grey; 164 | } 165 | 166 | .toggle-button:focused:selected { 167 | -fx-background-color: derive(-swatch-500, 50.0%), 168 | derive(-swatch-500, -20.0%); 169 | -fx-background-insets: 0.0, 0.2em; 170 | -fx-text-fill: -fx-text-button-colored; 171 | } 172 | 173 | .toggle-button:armed, .toggle-button:selected, .button:armed, .button:default:armed 174 | { 175 | -fx-background-color: -swatch-grey; 176 | -fx-text-fill: -fx-text-button-colored; 177 | } 178 | 179 | .icon-button { 180 | -fx-background-color: transparent; 181 | -fx-pref-height: 42; 182 | -fx-pref-width: 42; 183 | -fx-min-height: 42; 184 | -fx-min-width: 42; 185 | -fx-padding: 0; 186 | } 187 | 188 | .icon-button .text { 189 | -fx-font-family: 'MaterialDesignIconicFont'; 190 | -fx-font-size: 24px; 191 | } 192 | 193 | /******************************************************************************* 194 | * * 195 | * ComboBox, ChoiceBox COMMON * 196 | * * 197 | ******************************************************************************/ 198 | .combo-box-base, .choice-box { 199 | -fx-background-color: transparent; 200 | -fx-border-color: -swatch-grey; 201 | -fx-border-width: 0 0 2 0; 202 | -fx-background-radius: 0; 203 | -fx-border-radius: 0; 204 | } 205 | 206 | .combo-box:focused, .choice-box:focused { 207 | -fx-border-color: -swatch-500; 208 | } 209 | 210 | .combo-box-base>.label, .choice-box>.label { 211 | -fx-padding: 0.7em 0.7em 0.7em 0em; 212 | } 213 | 214 | .combo-box-base>.arrow-button, .choice-box>.open-button { 215 | -fx-padding: 1.2em 0.7em 1.2em 0.5em; 216 | -fx-background-radius: 0.0 2.0 2.0 0.0; 217 | } 218 | 219 | .combo-box-base>.arrow-button>.arrow, .choice-box>.open-button>.arrow { 220 | -fx-background-color: -swatch-grey; 221 | } 222 | 223 | .combo-box-base .arrow-button:hover .arrow, .spinner .increment-arrow-button:hover .increment-arrow, 224 | .spinner .decrement-arrow-button:hover .decrement-arrow { 225 | -fx-background-color: -swatch-dark-grey; 226 | } 227 | 228 | .button-bar .button{ 229 | -fx-padding: 5 5 5 5; 230 | } 231 | 232 | .menu-item:focused { 233 | -fx-background-color: -swatch-light-grey; 234 | } 235 | 236 | /******************************************************************************* 237 | * * 238 | * CheckBox * 239 | * * 240 | ******************************************************************************/ 241 | .check-box { 242 | -fx-padding: 10; 243 | } 244 | 245 | .check-box .text { 246 | -fx-fill: -fx-text-base-color; 247 | } 248 | 249 | .check-box>.box, .check-box>.box.unfocused, .check-box:disabled>.box, 250 | .check-box:indeterminate>.box { 251 | -fx-border-radius: 4.0; 252 | -fx-border-color: -swatch-grey; 253 | -fx-border-width: 2; 254 | -fx-background-radius: 4; 255 | -fx-background-color: transparent; 256 | -fx-padding: 1; 257 | } 258 | 259 | .check-box:selected>.box { 260 | /*-fx-border-color: -swatch-500;*/ 261 | -fx-background-color: -swatch-500; 262 | } 263 | 264 | .check-box:focused>.box { 265 | -fx-effect: dropshadow(gaussian, rgb(0.0, 0.0, 0.0, 0.30), 2.0, 0.3, 0, 266 | 0); 267 | } 268 | 269 | .check-box:selected>.box { 270 | -fx-background-color: white; 271 | } 272 | 273 | .check-box:indeterminate>.box { 274 | -fx-background-color: -swatch-grey; 275 | -fx-padding: 0.45em; 276 | } 277 | 278 | /******************************************************************************* 279 | * * 280 | * ChoiceBox * 281 | * * 282 | ******************************************************************************/ 283 | .context-menu { 284 | -fx-background-color: rgb(255.0, 255.0, 255.0, 0.95); 285 | -fx-background-radius: 2.0; 286 | } 287 | 288 | .radio-menu-item, .check-menu-item { 289 | -fx-padding: 0.7em 0.7em 0.7em 0em; 290 | } 291 | 292 | .radio-menu-item:checked .label, .check-menu-item:checked .label { 293 | -fx-text-fill: -swatch-500; 294 | } 295 | 296 | .radio-menu-item:checked>.left-container>.radio, .check-menu-item:checked>.left-container>.check 297 | { 298 | -fx-background-color: -swatch-dark-grey; 299 | -fx-padding: 0.68em 0.5em 0.0em 0.0em; 300 | -fx-effect: dropshadow(gaussian, rgb(0.0, 0.0, 0.0, 0.2), 0.0, 0.0, 0.0, 301 | 1.0); 302 | } 303 | 304 | .radio-menu-item>.left-container>.radio, .check-menu-item>.left-container>.check 305 | { 306 | -fx-background-color: transparent; 307 | -fx-padding: 0.68em 0.68em 0.0em 0.0em; 308 | } 309 | 310 | /******************************************************************************* 311 | * * 312 | * ComboBox * 313 | * * 314 | ******************************************************************************/ 315 | .combo-box .list-cell { 316 | -fx-padding: 0.7em 0.7em 0.7em 0em; 317 | } 318 | 319 | .popup-overlay { 320 | -fx-background-color: white; 321 | -fx-border-color: -swatch-grey; 322 | -fx-border-width: 0 0 2 0; 323 | -fx-background-radius: 0; 324 | -fx-border-radius: 0; 325 | } 326 | 327 | .title-bar { 328 | -fx-padding: 10; 329 | } 330 | 331 | .title-bar .icon { 332 | -fx-alignment: center-left; 333 | -fx-effect: dropshadow(gaussian, rgb(0.0, 0.0, 0.0, 0.2), 0.0, 0.0, 0.0, 334 | 1.0); 335 | } 336 | 337 | .title-bar .title-label { 338 | -fx-padding: 0 10 0 10; 339 | -fx-alignment: center; 340 | -fx-font-size: 36; 341 | -fx-font-weight: bolder; 342 | } 343 | 344 | .content-area { 345 | -fx-background-color: -dark; 346 | } 347 | 348 | .content-background { 349 | -fx-background-color: white; 350 | -fx-background-radius: 0.0 0.0 11.0 11.0; 351 | -fx-padding: 0 10 10 10; 352 | } 353 | 354 | /******************************************************************************* 355 | * * 356 | * Date Picker * 357 | * * 358 | ******************************************************************************/ 359 | .date-picker-popup .button { 360 | -fx-background-color: -swatch-500; 361 | } 362 | 363 | .date-picker-popup>.month-year-pane { 364 | -fx-background-color: -swatch-500; 365 | } 366 | 367 | .date-picker-popup>*>.spinner>.button>.left-arrow, .date-picker-popup>*>.spinner>.button>.right-arrow 368 | { 369 | -fx-background-color: white; 370 | } 371 | 372 | .date-picker-popup>*>.spinner { 373 | -fx-border-width: 0; 374 | } 375 | 376 | .date-picker-popup>*>.spinner>.label { 377 | -fx-text-fill: white; 378 | -fx-font-weight: bold; 379 | } 380 | 381 | .date-picker-popup>*>.day-name-cell, .date-picker-popup>*>.week-number-cell 382 | { 383 | -fx-font-weight: normal; 384 | -fx-text-fill: -swatch-dark-grey; 385 | -fx-font-size: 1em; 386 | } 387 | 388 | /******************************************************************************* 389 | * * 390 | * Date picker * 391 | * * 392 | ******************************************************************************/ 393 | .date-picker .arrow-button { 394 | -fx-background-color: transparent; 395 | } 396 | 397 | .date-picker .arrow-button .arrow { 398 | -fx-background-insets: -4; 399 | } 400 | 401 | .date-picker .date-picker-display-node { 402 | -fx-border-width: 0; 403 | } 404 | 405 | /******************************************************************************* 406 | * * 407 | * HTML Editor * 408 | * * 409 | ******************************************************************************/ 410 | .html-editor { 411 | -fx-background-color: white; 412 | -fx-border-width: 2 0 2 0; 413 | -fx-border-color: -swatch-grey; 414 | } 415 | 416 | .html-editor .web-view { 417 | -fx-border-color: grey; 418 | -fx-border-width: grey; 419 | } 420 | 421 | .web-view { 422 | -fx-font-smoothing-type: gray; 423 | } 424 | 425 | /******************************************************************************* 426 | * * 427 | * Label * 428 | * * 429 | ******************************************************************************/ 430 | .label { 431 | -fx-text-fill: -fx-text-base-color; 432 | } 433 | 434 | .label:disabled { 435 | -fx-opacity: -fx-disabled-opacity; 436 | } 437 | 438 | .label:show-mnemonics>.mnemonic-underline { 439 | -fx-stroke: -fx-text-base-color; 440 | } 441 | 442 | /******************************************************************************* 443 | * * 444 | * List, Tree, Table COMMON * 445 | * * 446 | ******************************************************************************/ 447 | .list-view:focused .list-cell:filled:focused:selected { 448 | -fx-background-color: -swatch-light-grey; 449 | -fx-text-fill: -swatch-500; 450 | } 451 | 452 | .list-view:hover .list-cell:hover { 453 | -fx-background-color: -swatch-light-grey; 454 | -fx-text-fill: -fx-text-base-color; 455 | } 456 | 457 | .list-cell { 458 | -fx-cell-size: 40; 459 | } 460 | 461 | /******************************************************************************* 462 | * * 463 | * ProgressBar * 464 | * * 465 | ******************************************************************************/ 466 | .progress-bar>.track { 467 | -fx-background-color: derive(-swatch-grey, 50.0%); 468 | -fx-background-radius: 2.0; 469 | -fx-padding: 0.0; 470 | } 471 | 472 | .progress-bar>.bar { 473 | -fx-background-color: -swatch-500; 474 | -fx-background-radius: 2.0; 475 | -fx-background-insets: 0.0; 476 | -fx-border-width: 0.0; 477 | -fx-effect: null; 478 | } 479 | 480 | .progress-bar:indeterminate>.bar { 481 | -fx-background-color: derive(-swatch-500, 50.0%); 482 | -fx-background-radius: 2.0; 483 | -fx-background-insets: 0.0; 484 | -fx-border-width: 0.0; 485 | -fx-effect: null; 486 | } 487 | 488 | /******************************************************************************* 489 | * * 490 | * ProgressIndicator * 491 | * * 492 | ******************************************************************************/ 493 | .progress-indicator>.spinner { 494 | -fx-border-width: 0; 495 | } 496 | 497 | .progress-indicator>.determinate-indicator>.indicator { 498 | -fx-background-color: rgb(255.0, 255.0, 255.0, 0.5); 499 | -fx-padding: 0.0; 500 | } 501 | 502 | .progress-indicator>.determinate-indicator>.progress { 503 | -fx-background-color: -swatch-500; 504 | } 505 | 506 | .progress-indicator>.determinate-indicator>.percentage { 507 | -fx-fill: -fx-text-base-color; 508 | -fx-translate-y: 0em; 509 | -fx-padding: 0.0; 510 | -fx-font-size: 11px; 511 | } 512 | 513 | /******************************************************************************* 514 | * * 515 | * RadioButton * 516 | * * 517 | ******************************************************************************/ 518 | .radio-button { 519 | -fx-padding: 10; 520 | } 521 | 522 | .radio-button .text { 523 | -fx-fill: -fx-text-base-color; 524 | } 525 | 526 | .radio-button>.radio, .radio-button>.radio.unfocused, .radio-button:disabled>.radio, 527 | .radio-button:selected>.radio { 528 | -fx-border-radius: 100.0; 529 | -fx-border-color: -swatch-grey; 530 | -fx-border-width: 2; 531 | -fx-background-radius: 100; 532 | -fx-background-color: transparent; 533 | -fx-padding: 3 3 3 3; 534 | } 535 | 536 | .radio-button:focused>.radio { 537 | -fx-background-color: -swatch-100; 538 | } 539 | 540 | .radio-button:focused:armed>.radio { 541 | -fx-background-color: -swatch-100; 542 | } 543 | 544 | .radio-button:selected>.radio>.dot { 545 | -fx-background-color: -swatch-500; 546 | -fx-background-insets: 0; 547 | } 548 | 549 | /******************************************************************************* 550 | * * 551 | * Separators * 552 | * * 553 | ******************************************************************************/ 554 | .separator { 555 | -fx-padding: 16 -16 16 -16; 556 | } 557 | 558 | /******************************************************************************* 559 | * * 560 | * Scroll Bar * 561 | * * 562 | ******************************************************************************/ 563 | .scroll-bar:vertical>.track-background, .scroll-bar:horizontal>.track-background 564 | { 565 | -fx-background-color: -swatch-light-grey; 566 | -fx-background-insets: 0.0; 567 | } 568 | 569 | .scroll-bar:vertical>.thumb, .scroll-bar:horizontal>.thumb { 570 | -fx-background-color: -swatch-grey; 571 | -fx-background-insets: 0.0; 572 | -fx-background-radius: 4.0; 573 | } 574 | 575 | .scroll-bar>.increment-button, .scroll-bar>.decrement-button, 576 | .scroll-bar:hover>.increment-button, .scroll-bar:hover>.decrement-button 577 | { 578 | -fx-background-color: transparent; 579 | } 580 | 581 | .scroll-bar>.increment-button>.increment-arrow, .scroll-bar>.decrement-button>.decrement-arrow 582 | { 583 | -fx-background-color: -swatch-dark-grey; 584 | } 585 | 586 | .scroll-bar>.track-background { 587 | -fx-background-color: transparent; 588 | } 589 | 590 | /******************************************************************************* 591 | * * 592 | * Slider * 593 | * * 594 | ******************************************************************************/ 595 | .slider { 596 | -fx-padding: 10 0 10 0; 597 | } 598 | 599 | .slider:vertical { 600 | -fx-padding: 0 10 0 10; 601 | } 602 | 603 | .slider>.track { 604 | -fx-background-color: -swatch-grey; 605 | -fx-background-insets: 1.5; 606 | } 607 | 608 | .slider>.thumb { 609 | -fx-background-color: -swatch-500; 610 | } 611 | 612 | /******************************************************************************* 613 | * * 614 | * Spinner * 615 | * * 616 | ******************************************************************************/ 617 | .spinner { 618 | -fx-background-color: transparent; 619 | -fx-border-width: 0 0 2 0; 620 | -fx-border-color: -swatch-grey; 621 | } 622 | 623 | .spinner:focused { 624 | -fx-border-color: -swatch-500; 625 | } 626 | 627 | .spinner .text-field { 628 | -fx-background-color: transparent; 629 | -fx-background-radius: 0; 630 | -fx-border-width: 0; 631 | -fx-padding: 0.5em 0.5em 0.5em 0.1em; 632 | -fx-prompt-text-fill: derive(-dark, 50.0%); 633 | -fx-highlight-fill: rgb(94.0, 203.0, 234.0); 634 | } 635 | 636 | .spinner .increment-arrow-button, .spinner .decrement-arrow-button { 637 | -fx-background-color: transparent; 638 | -fx-fill: swatch-500; 639 | } 640 | 641 | .spinner .increment-arrow-button .increment-arrow, .spinner .decrement-arrow-button .decrement-arrow 642 | { 643 | -fx-background-color: -swatch-grey; 644 | } 645 | 646 | .spinner .increment-arrow-button, .spinner .decrement-arrow-button { 647 | -fx-background-color: transparent; 648 | -fx-fill: swatch-500; 649 | } 650 | 651 | /******************************************************************************* 652 | * * 653 | * Tables * 654 | * * 655 | ******************************************************************************/ 656 | .table-view, .tree-table-view { 657 | /* Constants used throughout the tableview. */ 658 | -fx-table-header-border-color: transparent; 659 | -fx-table-cell-border-color: -fx-box-border; /* Horizontal Lines*/ 660 | -fx-background-color: transparent; 661 | } 662 | 663 | /* The column header row is made up of a number of column-header, one for each 664 | TableColumn, and a 'filler' area that extends from the right-most column 665 | to the edge of the tableview, or up to the 'column control' button. */ 666 | .table-view .filler, .tree-table-view .filler, .table-view .column-header, 667 | .tree-table-view .column-header { 668 | -fx-size: 65; 669 | -fx-border-style: null; 670 | -fx-border-color: -swatch-grey; 671 | -fx-border-width: 0 0 2 0; 672 | -fx-background-color: transparent; 673 | } 674 | 675 | .table-view .show-hide-columns-button, .tree-table-view .show-hide-columns-button 676 | { 677 | -fx-background-color: transparent; 678 | } 679 | 680 | .table-view .column-header .label, .table-view .filler .label, 681 | .table-view .column-drag-header .label, .tree-table-view .column-header .label, 682 | .tree-table-view .filler .label, .tree-table-view .column-drag-header .label 683 | { 684 | -fx-alignment: CENTER_LEFT; 685 | } 686 | 687 | .table-view .column-header-background, .tree-table-view .column-header-background 688 | { 689 | -fx-background-color: transparent; 690 | } 691 | 692 | .table-row-cell, .tree-table-row-cell { 693 | -fx-cell-size: 40px; 694 | } 695 | 696 | .table-cell { 697 | -fx-border-color: transparent; /* Vertical Lines*/ 698 | -fx-border-width: 1; 699 | } 700 | 701 | /******************************************************************************* 702 | * * 703 | * Text, Text field & Text area * 704 | * * 705 | ******************************************************************************/ 706 | .text { 707 | -fx-font-smoothing-type: gray; 708 | } 709 | 710 | .text-area, .text-field, .text{ 711 | -fx-background-color: transparent; 712 | -fx-background-radius: 2.0; 713 | -fx-padding: 0.5em 0.5em 0.5em 0.1em; 714 | -fx-border-color: -swatch-grey; 715 | -fx-border-width: 0 0 2 0; 716 | -fx-prompt-text-fill: derive(-dark, 50.0%); 717 | -fx-highlight-fill: rgb(94.0, 203.0, 234.0); 718 | } 719 | 720 | .text-area .text, .text-field>*>.text { 721 | -fx-effect: null; 722 | -fx-fill: -dark; 723 | } 724 | 725 | .text-area { 726 | -fx-padding: 0.15em; 727 | } 728 | 729 | .text-area .content { 730 | -fx-padding: 0.7em; 731 | -fx-border-width: 0.0; 732 | -fx-background-color: transparent; 733 | } 734 | 735 | .text-area:focused .content { 736 | -fx-background-color: transparent; 737 | } 738 | 739 | .text-area:focused, .text-field:focused { 740 | -fx-border-color: -swatch-500; 741 | } 742 | 743 | /******************************************************************************* 744 | * * 745 | * Tool bar & Menu bar * 746 | * * 747 | ******************************************************************************/ 748 | .tool-bar, .menu-bar { /* top */ 749 | -fx-background-color: -swatch-toolbar; 750 | -fx-border-width: 0 0 2 0; 751 | -fx-border-color: -swatch-grey; 752 | -fx-min-height: 48; 753 | -fx-alignment: CENTER_LEFT; 754 | } 755 | 756 | .tool-bar .label { 757 | -fx-font-size: 18; 758 | } 759 | 760 | .tool-bar .combo-box-base, .menu-bar .combo-base { 761 | -fx-border-width: 0; 762 | } 763 | 764 | .tool-bar .button, .tool-bar .toggle-button { 765 | -fx-background-color: -swatch-toolbar; 766 | -fx-text-fill: -fx-text-base-color; 767 | -fx-pref-height: 42; 768 | -fx-pref-width: 42; 769 | -fx-min-height: 42; 770 | -fx-min-width: 42; 771 | -fx-padding: 0; 772 | -fx-background-radius: 0; 773 | } 774 | 775 | .tool-bar .button:pressed, .tool-bar .toggle-button:pressed, .tool-bar .toggle-button:selected 776 | { 777 | -fx-background-color: -swatch-grey; 778 | } 779 | 780 | .tool-bar .toggle-button { 781 | -fx-background-color: -swatch-toolbar; 782 | } 783 | 784 | .tool-bar .separator { 785 | -fx-padding: 5 10 5 10; 786 | } 787 | 788 | .toolbar-colored { 789 | -fx-background-color: -swatch-500; 790 | -fx-border-width: 0 0 2 0; 791 | -fx-border-color: -swatch-grey; 792 | } 793 | 794 | .toolbar-colored .button, .toolbar-colored .toggle-button { 795 | -fx-background-color: -swatch-500; 796 | -fx-text-fill: white; 797 | } 798 | 799 | .toolbar-colored .button:pressed, .toolbar-colored .toggle-button:pressed, 800 | .toolbar-colored .toggle-button:selected { 801 | -fx-background-color: -swatch-200; 802 | } 803 | 804 | .toolbar-colored .text { 805 | -fx-fill: white; 806 | } 807 | 808 | #error_text { 809 | -fx-fill: rgb(244,67,54); 810 | } 811 | 812 | #severe_text{ 813 | -fx-fill: rgb(244,81,30); 814 | } 815 | 816 | #warning_text{ 817 | -fx-fill: rgb(251,140,0); 818 | } 819 | 820 | #normal_text{ 821 | -fx-fill: rgb(66,66,66); 822 | } 823 | 824 | #info_text{ 825 | -fx-fill: rgb(41,182,246); 826 | } 827 | 828 | #fine_text{ 829 | -fx-fill: rgb(46,125,50); 830 | } 831 | -------------------------------------------------------------------------------- /out/production/Apktool_GUI/styles/materialfx-toggleswitch.css: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * * 3 | * Root * 4 | * * 5 | ******************************************************************************/ 6 | .root { 7 | /* Swatch Colors - Blue*/ 8 | -swatch-100: #BBDEFB; 9 | -swatch-200: #90CAF9; 10 | -swatch-300: #64BEF6; 11 | -swatch-400: #42A5F5; 12 | -swatch-500: #2196F3; 13 | -fx-text-base-color: rgb(100.0, 100.0, 100.0); 14 | /* Text defaults */ 15 | -fx-font-family: 'Roboto Medium'; 16 | -fx-font-size: 14.0px; 17 | -fx-disabled-opacity: 0.6; 18 | -fx-text-fill: -fx-text-base-color; 19 | } 20 | 21 | /******************************************************************************* 22 | * * 23 | * Text, Text field & Text area * 24 | * * 25 | ******************************************************************************/ 26 | .text { 27 | -fx-font-smoothing-type: gray; 28 | -fx-fill: -fx-text-base-color; 29 | } 30 | 31 | /******************************************************************************* 32 | * * 33 | * CheckBox -> Material ToggleSwitch * 34 | * * 35 | ******************************************************************************/ 36 | 37 | .check-box>*.box{ 38 | -fx-background-color: rgb(200.0, 200.0, 200.0); 39 | -fx-pref-height: 20; 40 | -fx-pref-width: 40; 41 | -fx-background-radius: 100; /* Full round corner */ 42 | -fx-background-insets: 2.5; 43 | -fx-padding:0; 44 | } 45 | .check-box:selected>*.box{ 46 | -fx-background-color: derive(-swatch-500, 0.54); 47 | } 48 | 49 | .check-box:disabled>*.box{ 50 | -fx-background-color: derive(grey, 0.54); 51 | } 52 | 53 | 54 | .check-box >*.box>*.mark { 55 | -fx-background-color: white; 56 | -fx-padding:0; 57 | -fx-background-insets: 0; 58 | -fx-shape: "M 10.5,0 C 4.7010101,0 0,4.7010101 0,10.5 0,16.29899 4.7010101,21 10.5,21 16.29899,21 21,16.29899 21,10.5 21,4.7010101 16.29899,0 10.5,0 Z m 29.455078,10.6875 0,0.134766 0.08984,0 0,-0.134766 z"; 59 | -fx-effect: dropshadow(gaussian, rgb(0.0, 0.0, 0.0, 0.15), 6.0, 0.7, 0.0,1.5); 60 | } 61 | 62 | .check-box:selected>*.box>*.mark { 63 | -fx-background-color: -swatch-500; 64 | -fx-shape: "M 10,5 c 5.79899,0 10.5,4.701 10.5,10.5 0,5.799 -4.70101,10.5 -10.5,10.5 -5.79899,0 -10.5,-4.701 -10.5,-10.5 0,-5.799 4.70101,-10.5 10.5,-10.5 z m -29.455078,10.6875 0,0.1348 -0.08984,0 0,-0.1348 z"; 65 | } 66 | 67 | .check-box:indeterminate>*.box>*.mark { 68 | -fx-background-color: white; 69 | -fx-shape: "M 20 0 C 14.20101 0 9.5 4.701 9.5 10.5 C 9.5 16.299 14.20101 21 20 21 C 25.79899 21 30.5 16.299 30.5 10.5 C 30.5 4.701 25.79899 0 20 0 z M 0 10.6875 L 0 10.822266 L 0.08984375 10.822266 L 0.08984375 10.6875 L 0 10.6875 z M 40.066406 10.900391 A 0.080000006 0.050000001 0 0 0 40 10.949219 A 0.080000006 0.050000001 0 0 0 40.080078 11 A 0.080000006 0.050000001 0 0 0 40.160156 10.949219 A 0.080000006 0.050000001 0 0 0 40.080078 10.900391 A 0.080000006 0.050000001 0 0 0 40.066406 10.900391 z "; 70 | } 71 | 72 | .check-box:disabled>*.box>*.mark { 73 | -fx-background-color: grey; 74 | } 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /out/production/Apktool_GUI/styles/materialfx-toggleswitch.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 22 | 23 | -------------------------------------------------------------------------------- /src/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Main-Class: com.bittle.apktoolfx.Main 3 | 4 | -------------------------------------------------------------------------------- /src/com/bittle/apktoolfx/LOGGER.java: -------------------------------------------------------------------------------- 1 | package com.bittle.apktoolfx; 2 | 3 | import brut.androlib.MainLogger; 4 | import javafx.application.Platform; 5 | import javafx.scene.control.ScrollPane; 6 | import javafx.scene.text.Text; 7 | import javafx.scene.text.TextFlow; 8 | 9 | public class LOGGER extends MainLogger { 10 | 11 | private static LOGGER instance = null; 12 | 13 | public static LOGGER getInstance(){ 14 | if(instance == null) 15 | instance = new LOGGER(); 16 | return instance; 17 | } 18 | 19 | private static TextFlow log_text_area; 20 | private static ScrollPane log_scroll_pane; 21 | 22 | public static void setGUIVars(TextFlow area, ScrollPane pane) { 23 | log_text_area = area; 24 | log_scroll_pane = pane; 25 | } 26 | 27 | @Override 28 | public void ERROR(Object msg) { 29 | if(msg.toString().contains("-f")){ 30 | msg = msg.toString().replace("-f", "force"); 31 | } 32 | if (!msg.toString().trim().isEmpty()) 33 | appendToTextArea(msg + "\n", "error_text"); 34 | } 35 | 36 | @Override 37 | public void SEVERE(Object msg) { 38 | if (!msg.toString().trim().isEmpty()) 39 | appendToTextArea(msg + "\n", "severe_text"); 40 | } 41 | 42 | @Override 43 | public void SEVERE(Object msg, Exception e) { 44 | if (!msg.toString().trim().isEmpty()) 45 | appendToTextArea(msg + ", " + e + "\n", "severe_text"); 46 | } 47 | 48 | @Override 49 | public void WARNING(Object msg) { 50 | if (!msg.toString().trim().isEmpty()) 51 | appendToTextArea(msg + "\n", "error_text"); 52 | } 53 | 54 | @Override 55 | public void WARNING(Object msg, Exception e) { 56 | if (!msg.toString().trim().isEmpty()) 57 | appendToTextArea(msg + ", " + e + "\n", "warning_text"); 58 | } 59 | 60 | @Override 61 | public void NORMAL(Object msg) { 62 | if (!msg.toString().trim().isEmpty()) 63 | appendToTextArea(msg + "\n", "normal_text"); 64 | } 65 | 66 | @Override 67 | public void INFO(Object msg) { 68 | if (!msg.toString().trim().isEmpty()) 69 | appendToTextArea("I: " + msg + "\n", "info_text"); 70 | } 71 | 72 | @Override 73 | public void FINE(Object msg) { 74 | if (!msg.toString().trim().isEmpty()) 75 | appendToTextArea(msg + "\n", "fine_text"); 76 | } 77 | 78 | private double prev = 0; 79 | private void appendToTextArea(Object a, String id) { 80 | // need thread to update log view 81 | Platform.runLater(() -> { 82 | Text text = new Text(a.toString()); 83 | 84 | text.setId(id); 85 | log_text_area.getChildren().add(text); 86 | 87 | if(prev == 0 && log_text_area.getHeight() > 0.0){ 88 | prev = log_text_area.getHeight(); 89 | } 90 | 91 | if(log_text_area.getHeight() > prev){ 92 | log_scroll_pane.setVvalue(1.0); 93 | } 94 | }); 95 | } 96 | } -------------------------------------------------------------------------------- /src/com/bittle/apktoolfx/Main.java: -------------------------------------------------------------------------------- 1 | package com.bittle.apktoolfx; 2 | 3 | import brut.androlib.MainLogger; 4 | import javafx.application.Application; 5 | import javafx.fxml.FXMLLoader; 6 | import javafx.scene.Parent; 7 | import javafx.scene.Scene; 8 | import javafx.stage.Stage; 9 | 10 | public class Main extends Application { 11 | @Override 12 | public void start(Stage primaryStage) throws Exception{ 13 | MainLogger.getInstance().setLogger(LOGGER.getInstance()); 14 | 15 | FXMLLoader fxml = new FXMLLoader(getClass().getResource("MainFXML.fxml")); 16 | Parent root = fxml.load(); 17 | primaryStage.setTitle("Apktool GUI"); 18 | primaryStage.setScene(new Scene(root, 600, 400)); 19 | primaryStage.show(); 20 | } 21 | 22 | 23 | public static void main(String[] args) { 24 | launch(args); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/com/bittle/apktoolfx/MainFXML.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/com/bittle/apktoolfx/controllers/CompileController.java: -------------------------------------------------------------------------------- 1 | package com.bittle.apktoolfx.controllers; 2 | 3 | import com.bittle.apktoolfx.LOGGER; 4 | import javafx.concurrent.Task; 5 | import javafx.fxml.FXML; 6 | import javafx.scene.input.DragEvent; 7 | import javafx.scene.input.Dragboard; 8 | 9 | import java.io.File; 10 | 11 | public class CompileController extends Controller { 12 | private String current_folder_path; 13 | 14 | @FXML 15 | public void drag_dropped(DragEvent event) { 16 | try { 17 | Dragboard board = event.getDragboard(); 18 | File file = board.getFiles().get(0); 19 | 20 | if (file.isDirectory()) { 21 | // folder dragged in 22 | current_folder_path = file.getAbsolutePath(); 23 | main_text_field.setText(file.getPath()); 24 | 25 | LOGGER.setGUIVars(log_text_area, log_scroll_pane); 26 | LOGGER.getInstance().INFO("File dropped: " + file.getAbsolutePath()); 27 | } 28 | } catch (Exception e) { 29 | LOGGER.getInstance().ERROR(e.toString()); 30 | } 31 | } 32 | 33 | public void main_button_click() { 34 | LOGGER.setGUIVars(log_text_area, log_scroll_pane); 35 | 36 | if (main_text_field.getText().trim().isEmpty()) { 37 | LOGGER.getInstance().ERROR("Folder field cannot be empty"); 38 | return; 39 | } 40 | 41 | Task task = new Task() { 42 | @Override 43 | protected Void call() throws Exception { 44 | // include any options 45 | String params = "b "; 46 | if (force_checkbox.isSelected()) 47 | params += " -f "; 48 | 49 | String[] p = params.split("\\s+"); 50 | p = append(p, current_folder_path); 51 | 52 | // add the output directory to the end 53 | if (!output_dir_text.getText().isEmpty() && 54 | !output_dir_text.getText().toLowerCase().equals("no directory selected")) { 55 | 56 | p = append(p, "-o"); 57 | p = append(p, output_dir_text.getText()); 58 | 59 | } 60 | 61 | brut.apktool.Main.main(p); 62 | LOGGER.getInstance().NORMAL("-----------------------------------------------"); 63 | return null; 64 | } 65 | }; 66 | 67 | Thread thread = new Thread(task); 68 | thread.setDaemon(true); 69 | thread.start(); 70 | 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/com/bittle/apktoolfx/controllers/Controller.java: -------------------------------------------------------------------------------- 1 | package com.bittle.apktoolfx.controllers; 2 | 3 | import javafx.fxml.FXML; 4 | import javafx.fxml.Initializable; 5 | import javafx.scene.control.*; 6 | import javafx.scene.input.DragEvent; 7 | import javafx.scene.input.Dragboard; 8 | import javafx.scene.input.TransferMode; 9 | import javafx.scene.text.Text; 10 | import javafx.scene.text.TextFlow; 11 | import javafx.stage.DirectoryChooser; 12 | 13 | import java.io.File; 14 | import java.net.URL; 15 | import java.util.ResourceBundle; 16 | 17 | // min methods and fields controllers should have 18 | public abstract class Controller implements Initializable { 19 | @FXML 20 | public TextField main_text_field; 21 | 22 | @FXML 23 | public Button main_button; 24 | 25 | @FXML 26 | public TextFlow log_text_area; 27 | 28 | @FXML 29 | public ScrollPane log_scroll_pane; 30 | 31 | @FXML 32 | public Text output_dir_text; 33 | 34 | @FXML 35 | public CheckBox force_checkbox; 36 | 37 | public void initialize(URL url, ResourceBundle bundle) { 38 | log_scroll_pane.setFitToWidth(true); 39 | } 40 | 41 | @FXML 42 | public void drag_over(DragEvent event) { 43 | Dragboard board = event.getDragboard(); 44 | if (board.hasFiles()) { 45 | event.acceptTransferModes(TransferMode.ANY); 46 | } 47 | } 48 | 49 | public void change_output_dir_click() { 50 | Alert alert = new Alert(Alert.AlertType.WARNING); 51 | alert.setTitle("Warning"); 52 | alert.setContentText("All chosen folder contents will be erased!"); 53 | 54 | alert.showAndWait(); 55 | directoryChooser(); 56 | } 57 | 58 | private void directoryChooser() { 59 | DirectoryChooser directoryChooser = new DirectoryChooser(); 60 | File selectedDirectory = 61 | directoryChooser.showDialog(null); 62 | 63 | if (selectedDirectory == null) { 64 | output_dir_text.setText("No Directory selected"); 65 | } else { 66 | output_dir_text.setText(selectedDirectory.getAbsolutePath()); 67 | } 68 | } 69 | 70 | // helper method 71 | public String[] append(String[] arr, String a) { 72 | String[] temp = new String[arr.length + 1]; 73 | System.arraycopy(arr, 0, temp, 0, arr.length); 74 | temp[arr.length] = a; 75 | 76 | return temp; 77 | } 78 | 79 | // these methods could be different 80 | @FXML 81 | public abstract void drag_dropped(DragEvent event); 82 | 83 | @FXML 84 | public abstract void main_button_click(); 85 | } 86 | -------------------------------------------------------------------------------- /src/com/bittle/apktoolfx/controllers/DecompileController.java: -------------------------------------------------------------------------------- 1 | package com.bittle.apktoolfx.controllers; 2 | 3 | import com.bittle.apktoolfx.LOGGER; 4 | import javafx.concurrent.Task; 5 | import javafx.fxml.FXML; 6 | import javafx.scene.control.*; 7 | import javafx.scene.input.DragEvent; 8 | import javafx.scene.input.Dragboard; 9 | 10 | import java.io.File; 11 | 12 | public class DecompileController extends Controller { 13 | 14 | // checkbox settings 15 | @FXML 16 | CheckBox no_res_checkbox; 17 | @FXML 18 | CheckBox no_src_checkbox; 19 | 20 | // apk vars 21 | private String current_apk_path = ""; 22 | 23 | @FXML 24 | public void drag_dropped(DragEvent event) { 25 | try { 26 | Dragboard board = event.getDragboard(); 27 | File file = board.getFiles().get(0); 28 | 29 | if (file.getName().endsWith(".apk")) { 30 | // apk file dragged in 31 | current_apk_path = file.getAbsolutePath(); 32 | main_text_field.setText(file.getName()); 33 | 34 | LOGGER.setGUIVars(log_text_area, log_scroll_pane); 35 | LOGGER.getInstance().FINE("File dropped: " + file.getAbsolutePath()); 36 | } 37 | } catch (Exception e) { 38 | LOGGER.getInstance().ERROR(e.toString()); 39 | } 40 | } 41 | 42 | @FXML 43 | public void main_button_click() { 44 | LOGGER.setGUIVars(log_text_area, log_scroll_pane); 45 | 46 | if (main_text_field.getText().trim().isEmpty()) { 47 | LOGGER.getInstance().ERROR("APK text field cannot be empty"); 48 | return; 49 | } 50 | 51 | Task task = new Task() { 52 | @Override 53 | protected Void call() throws Exception { 54 | // include any options 55 | String params = "d "; 56 | if (force_checkbox.isSelected()) 57 | params += " -f "; 58 | if (no_res_checkbox.isSelected()) 59 | params += " -r "; 60 | if (no_src_checkbox.isSelected()) 61 | params += " -s "; 62 | String[] p = params.split("\\s+"); 63 | p = append(p, current_apk_path); 64 | 65 | // add the output directory to the end 66 | if (!output_dir_text.getText().isEmpty() && 67 | !output_dir_text.getText().toLowerCase().equals("no directory selected")) { 68 | 69 | p = append(p, "-o"); 70 | p = append(p, output_dir_text.getText()); 71 | 72 | } 73 | 74 | brut.apktool.Main.main(p); 75 | LOGGER.getInstance().NORMAL("-----------------------------------------------"); 76 | return null; 77 | } 78 | }; 79 | 80 | Thread thread = new Thread(task); 81 | thread.setDaemon(true); 82 | thread.start(); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/com/bittle/apktoolfx/fxml/CompileTabPage.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |