From c61225163854bb6548807a8179c0391c2903da94 Mon Sep 17 00:00:00 2001 From: Amsal Situmorang <if317035@students.del.ac.id> Date: Sat, 9 May 2020 21:08:17 +0700 Subject: [PATCH] Initial commit --- .gitignore | 14 ++++++++++++++ .idea/codeStyles/Project.xml | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .idea/gradle.xml | 16 ++++++++++++++++ .idea/misc.xml | 9 +++++++++ .idea/runConfigurations.xml | 12 ++++++++++++ .idea/vcs.xml | 6 ++++++ app/.gitignore | 1 + app/build.gradle | 46 ++++++++++++++++++++++++++++++++++++++++++++++ app/proguard-rules.pro | 21 +++++++++++++++++++++ app/src/androidTest/java/com/amsal/ta/ExampleInstrumentedTest.java | 27 +++++++++++++++++++++++++++ app/src/main/AndroidManifest.xml | 32 ++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/DetailResultActivity.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/IntroActivity.java | 215 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/MainActivity.java | 30 ++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/ResultActivity.java | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/SplashscreenActivity.java | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/adapter/AppAdapter.java | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/adapter/IntroViewPagerAdapter.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/adapter/ResultAdapter.java | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/model/AppInfo.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/model/AppResult.java | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/model/ScreenItem.java | 37 +++++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/ui/account/AccountFragment.java | 35 +++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/ui/account/AccountViewModel.java | 19 +++++++++++++++++++ app/src/main/java/com/amsal/ta/ui/dashboard/DashboardFragment.java | 307 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/ui/dashboard/DashboardViewModel.java | 19 +++++++++++++++++++ app/src/main/java/com/amsal/ta/ui/home/HomeFragment.java | 35 +++++++++++++++++++++++++++++++++++ app/src/main/java/com/amsal/ta/ui/home/HomeViewModel.java | 19 +++++++++++++++++++ app/src/main/res/anim/bottom_animation.xml | 14 ++++++++++++++ app/src/main/res/anim/button_animation.xml | 16 ++++++++++++++++ app/src/main/res/anim/top_animation.xml | 14 ++++++++++++++ app/src/main/res/drawable-v24/btn_gradient_style.xml | 11 +++++++++++ app/src/main/res/drawable-v24/drawable-v24/btn_gradient_style.xml | 11 +++++++++++ app/src/main/res/drawable-v24/drawable-v24/ic_launcher_foreground.xml | 34 ++++++++++++++++++++++++++++++++++ app/src/main/res/drawable-v24/drawable-v24/ic_policy.png | Bin 0 -> 578 bytes app/src/main/res/drawable-v24/drawable-v24/img1.png | Bin 0 -> 115019 bytes app/src/main/res/drawable-v24/drawable-v24/img2.png | Bin 0 -> 80392 bytes app/src/main/res/drawable-v24/drawable-v24/img3.png | Bin 0 -> 128907 bytes app/src/main/res/drawable-v24/drawable-v24/indicator_default.xml | 23 +++++++++++++++++++++++ app/src/main/res/drawable-v24/drawable-v24/indicator_selected.xml | 23 +++++++++++++++++++++++ app/src/main/res/drawable-v24/drawable-v24/indicator_selector.xml | 12 ++++++++++++ app/src/main/res/drawable-v24/drawable/ic_arrow_forward_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable-v24/drawable/ic_dashboard_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable-v24/drawable/ic_home_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable-v24/drawable/ic_launcher_background.xml | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/res/drawable-v24/drawable/ic_notifications_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable-v24/drawable/ic_person_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable-v24/drawable/logos.png | Bin 0 -> 42129 bytes app/src/main/res/drawable-v24/error.png | Bin 0 -> 328039 bytes app/src/main/res/drawable-v24/ic_launcher_foreground.xml | 34 ++++++++++++++++++++++++++++++++++ app/src/main/res/drawable-v24/ic_policy.png | Bin 0 -> 578 bytes app/src/main/res/drawable-v24/img1.png | Bin 0 -> 115019 bytes app/src/main/res/drawable-v24/img2.png | Bin 0 -> 80392 bytes app/src/main/res/drawable-v24/img3.png | Bin 0 -> 128907 bytes app/src/main/res/drawable-v24/indicator_default.xml | 23 +++++++++++++++++++++++ app/src/main/res/drawable-v24/indicator_selected.xml | 23 +++++++++++++++++++++++ app/src/main/res/drawable-v24/indicator_selector.xml | 12 ++++++++++++ app/src/main/res/drawable/ic_arrow_forward_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable/ic_check_circle_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable/ic_clear_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable/ic_dashboard_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable/ic_file_upload_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable/ic_home_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/res/drawable/ic_notifications_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable/ic_person_black_24dp.xml | 9 +++++++++ app/src/main/res/drawable/logos.png | Bin 0 -> 42129 bytes app/src/main/res/font/acme.xml | 7 +++++++ app/src/main/res/font/antic.xml | 7 +++++++ app/src/main/res/font/berkshire_swash.xml | 7 +++++++ app/src/main/res/font/chivo_black_italic.xml | 7 +++++++ app/src/main/res/layout/activity_detail_result.xml | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/res/layout/activity_intro.xml | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/res/layout/activity_result.xml | 17 +++++++++++++++++ app/src/main/res/layout/activity_splashscreen.xml | 47 +++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/res/layout/app_layout.xml | 42 ++++++++++++++++++++++++++++++++++++++++++ app/src/main/res/layout/fragment_account.xml | 19 +++++++++++++++++++ app/src/main/res/layout/fragment_dashboard.xml | 16 ++++++++++++++++ app/src/main/res/layout/fragment_home.xml | 19 +++++++++++++++++++ app/src/main/res/layout/layout_error.xml | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/res/layout/layout_screen.xml | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/res/layout/result_list.xml | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/src/main/res/menu/bottom_nav_menu.xml | 19 +++++++++++++++++++ app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml | 5 +++++ app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml | 5 +++++ app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2963 bytes app/src/main/res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2060 bytes app/src/main/res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2783 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes app/src/main/res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes app/src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6387 bytes app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10413 bytes app/src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9128 bytes app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15132 bytes app/src/main/res/navigation/mobile_navigation.xml | 25 +++++++++++++++++++++++++ app/src/main/res/values/colors.xml | 17 +++++++++++++++++ app/src/main/res/values/dimens.xml | 5 +++++ app/src/main/res/values/font_certs.xml | 17 +++++++++++++++++ app/src/main/res/values/preloaded_fonts.xml | 9 +++++++++ app/src/main/res/values/strings.xml | 13 +++++++++++++ app/src/main/res/values/styles.xml | 18 ++++++++++++++++++ app/src/test/java/com/amsal/ta/ExampleUnitTest.java | 17 +++++++++++++++++ build.gradle | 29 +++++++++++++++++++++++++++++ gradle.properties | 20 ++++++++++++++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 ++++++ gradlew | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gradlew.bat | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ settings.gradle | 2 ++ 111 files changed, 3579 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/vcs.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/amsal/ta/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/amsal/ta/DetailResultActivity.java create mode 100644 app/src/main/java/com/amsal/ta/IntroActivity.java create mode 100644 app/src/main/java/com/amsal/ta/MainActivity.java create mode 100644 app/src/main/java/com/amsal/ta/ResultActivity.java create mode 100644 app/src/main/java/com/amsal/ta/SplashscreenActivity.java create mode 100644 app/src/main/java/com/amsal/ta/adapter/AppAdapter.java create mode 100644 app/src/main/java/com/amsal/ta/adapter/IntroViewPagerAdapter.java create mode 100644 app/src/main/java/com/amsal/ta/adapter/ResultAdapter.java create mode 100644 app/src/main/java/com/amsal/ta/model/AppInfo.java create mode 100644 app/src/main/java/com/amsal/ta/model/AppResult.java create mode 100644 app/src/main/java/com/amsal/ta/model/ScreenItem.java create mode 100644 app/src/main/java/com/amsal/ta/ui/account/AccountFragment.java create mode 100644 app/src/main/java/com/amsal/ta/ui/account/AccountViewModel.java create mode 100644 app/src/main/java/com/amsal/ta/ui/dashboard/DashboardFragment.java create mode 100644 app/src/main/java/com/amsal/ta/ui/dashboard/DashboardViewModel.java create mode 100644 app/src/main/java/com/amsal/ta/ui/home/HomeFragment.java create mode 100644 app/src/main/java/com/amsal/ta/ui/home/HomeViewModel.java create mode 100644 app/src/main/res/anim/bottom_animation.xml create mode 100644 app/src/main/res/anim/button_animation.xml create mode 100644 app/src/main/res/anim/top_animation.xml create mode 100644 app/src/main/res/drawable-v24/btn_gradient_style.xml create mode 100644 app/src/main/res/drawable-v24/drawable-v24/btn_gradient_style.xml create mode 100644 app/src/main/res/drawable-v24/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable-v24/drawable-v24/ic_policy.png create mode 100644 app/src/main/res/drawable-v24/drawable-v24/img1.png create mode 100644 app/src/main/res/drawable-v24/drawable-v24/img2.png create mode 100644 app/src/main/res/drawable-v24/drawable-v24/img3.png create mode 100644 app/src/main/res/drawable-v24/drawable-v24/indicator_default.xml create mode 100644 app/src/main/res/drawable-v24/drawable-v24/indicator_selected.xml create mode 100644 app/src/main/res/drawable-v24/drawable-v24/indicator_selector.xml create mode 100644 app/src/main/res/drawable-v24/drawable/ic_arrow_forward_black_24dp.xml create mode 100644 app/src/main/res/drawable-v24/drawable/ic_dashboard_black_24dp.xml create mode 100644 app/src/main/res/drawable-v24/drawable/ic_home_black_24dp.xml create mode 100644 app/src/main/res/drawable-v24/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable-v24/drawable/ic_notifications_black_24dp.xml create mode 100644 app/src/main/res/drawable-v24/drawable/ic_person_black_24dp.xml create mode 100644 app/src/main/res/drawable-v24/drawable/logos.png create mode 100644 app/src/main/res/drawable-v24/error.png create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable-v24/ic_policy.png create mode 100644 app/src/main/res/drawable-v24/img1.png create mode 100644 app/src/main/res/drawable-v24/img2.png create mode 100644 app/src/main/res/drawable-v24/img3.png create mode 100644 app/src/main/res/drawable-v24/indicator_default.xml create mode 100644 app/src/main/res/drawable-v24/indicator_selected.xml create mode 100644 app/src/main/res/drawable-v24/indicator_selector.xml create mode 100644 app/src/main/res/drawable/ic_arrow_forward_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_check_circle_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_clear_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_dashboard_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_file_upload_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_home_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_notifications_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_person_black_24dp.xml create mode 100644 app/src/main/res/drawable/logos.png create mode 100644 app/src/main/res/font/acme.xml create mode 100644 app/src/main/res/font/antic.xml create mode 100644 app/src/main/res/font/berkshire_swash.xml create mode 100644 app/src/main/res/font/chivo_black_italic.xml create mode 100644 app/src/main/res/layout/activity_detail_result.xml create mode 100644 app/src/main/res/layout/activity_intro.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_result.xml create mode 100644 app/src/main/res/layout/activity_splashscreen.xml create mode 100644 app/src/main/res/layout/app_layout.xml create mode 100644 app/src/main/res/layout/fragment_account.xml create mode 100644 app/src/main/res/layout/fragment_dashboard.xml create mode 100644 app/src/main/res/layout/fragment_home.xml create mode 100644 app/src/main/res/layout/layout_error.xml create mode 100644 app/src/main/res/layout/layout_screen.xml create mode 100644 app/src/main/res/layout/result_list.xml create mode 100644 app/src/main/res/menu/bottom_nav_menu.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/navigation/mobile_navigation.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/font_certs.xml create mode 100644 app/src/main/res/values/preloaded_fonts.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/test/java/com/amsal/ta/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..603b140 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..681f41a --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ +<component name="ProjectCodeStyleConfiguration"> + <code_scheme name="Project" version="173"> + <codeStyleSettings language="XML"> + <indentOptions> + <option name="CONTINUATION_INDENT_SIZE" value="4" /> + </indentOptions> + <arrangement> + <rules> + <section> + <rule> + <match> + <AND> + <NAME>xmlns:android</NAME> + <XML_ATTRIBUTE /> + <XML_NAMESPACE>^$</XML_NAMESPACE> + </AND> + </match> + </rule> + </section> + <section> + <rule> + <match> + <AND> + <NAME>xmlns:.*</NAME> + <XML_ATTRIBUTE /> + <XML_NAMESPACE>^$</XML_NAMESPACE> + </AND> + </match> + <order>BY_NAME</order> + </rule> + </section> + <section> + <rule> + <match> + <AND> + <NAME>.*:id</NAME> + <XML_ATTRIBUTE /> + <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> + </AND> + </match> + </rule> + </section> + <section> + <rule> + <match> + <AND> + <NAME>.*:name</NAME> + <XML_ATTRIBUTE /> + <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> + </AND> + </match> + </rule> + </section> + <section> + <rule> + <match> + <AND> + <NAME>name</NAME> + <XML_ATTRIBUTE /> + <XML_NAMESPACE>^$</XML_NAMESPACE> + </AND> + </match> + </rule> + </section> + <section> + <rule> + <match> + <AND> + <NAME>style</NAME> + <XML_ATTRIBUTE /> + <XML_NAMESPACE>^$</XML_NAMESPACE> + </AND> + </match> + </rule> + </section> + <section> + <rule> + <match> + <AND> + <NAME>.*</NAME> + <XML_ATTRIBUTE /> + <XML_NAMESPACE>^$</XML_NAMESPACE> + </AND> + </match> + <order>BY_NAME</order> + </rule> + </section> + <section> + <rule> + <match> + <AND> + <NAME>.*</NAME> + <XML_ATTRIBUTE /> + <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> + </AND> + </match> + <order>ANDROID_ATTRIBUTE_ORDER</order> + </rule> + </section> + <section> + <rule> + <match> + <AND> + <NAME>.*</NAME> + <XML_ATTRIBUTE /> + <XML_NAMESPACE>.*</XML_NAMESPACE> + </AND> + </match> + <order>BY_NAME</order> + </rule> + </section> + </rules> + </arrangement> + </codeStyleSettings> + </code_scheme> +</component> \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..d291b3d --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="GradleSettings"> + <option name="linkedExternalProjectsSettings"> + <GradleProjectSettings> + <compositeConfiguration> + <compositeBuild compositeDefinitionSource="SCRIPT" /> + </compositeConfiguration> + <option name="distributionType" value="DEFAULT_WRAPPED" /> + <option name="externalProjectPath" value="$PROJECT_DIR$" /> + <option name="resolveModulePerSourceSet" value="false" /> + <option name="testRunner" value="PLATFORM" /> + </GradleProjectSettings> + </option> + </component> +</project> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..7bfef59 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK"> + <output url="file://$PROJECT_DIR$/build/classes" /> + </component> + <component name="ProjectType"> + <option name="id" value="Android" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="RunConfigurationProducerService"> + <option name="ignoredProducers"> + <set> + <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" /> + <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" /> + <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" /> + </set> + </option> + </component> +</project> \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="$PROJECT_DIR$" vcs="Git" /> + </component> +</project> \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..2a82869 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,46 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.3" + defaultConfig { + applicationId "com.amsal.ta" + minSdkVersion 21 + targetSdkVersion 29 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + targetCompatibility = "1.8" + sourceCompatibility = 1.8 + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'com.google.android.material:material:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.navigation:navigation-fragment:2.2.2' + implementation 'androidx.navigation:navigation-ui:2.2.2' + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'de.hdodenhof:circleimageview:3.0.2' + implementation 'com.github.bumptech.glide:glide:4.9.0' + implementation 'com.loopj.android:android-async-http:1.4.9' + implementation 'com.squareup.okhttp3:logging-interceptor:4.2.1' + implementation 'com.squareup.okhttp3:okhttp:4.2.1' + implementation 'com.squareup.retrofit2:retrofit:2.6.1' + implementation 'com.squareup.retrofit2:converter-gson:2.3.0' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/amsal/ta/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/amsal/ta/ExampleInstrumentedTest.java new file mode 100644 index 0000000..7a35736 --- /dev/null +++ b/app/src/androidTest/java/com/amsal/ta/ExampleInstrumentedTest.java @@ -0,0 +1,27 @@ +package com.amsal.ta; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.amsal.ta", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..5f1c7fe --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.amsal.ta"> + + <uses-permission android:name="android.permission.INTERNET" /> + + <application + android:allowBackup="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:roundIcon="@mipmap/ic_launcher_round" + android:supportsRtl="true" + android:theme="@style/AppTheme" + android:usesCleartextTraffic="true"> + <activity android:name=".DetailResultActivity"></activity> + <activity android:name=".ResultActivity" /> + <activity android:name=".IntroActivity" /> + <activity + android:name=".SplashscreenActivity" + android:theme="@style/NoTheme"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + <activity + android:name=".MainActivity" + android:label="@string/app_name"></activity> + </application> + +</manifest> \ No newline at end of file diff --git a/app/src/main/java/com/amsal/ta/DetailResultActivity.java b/app/src/main/java/com/amsal/ta/DetailResultActivity.java new file mode 100644 index 0000000..48a67dd --- /dev/null +++ b/app/src/main/java/com/amsal/ta/DetailResultActivity.java @@ -0,0 +1,52 @@ +package com.amsal.ta; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.cardview.widget.CardView; + +import android.content.pm.PackageManager; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.util.Log; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.amsal.ta.model.AppResult; + +public class DetailResultActivity extends AppCompatActivity { + + public static final String DETAIL_APP = "detail_app"; + private ImageView logo; + private TextView appName, appStatus, appMalware, appKeterangan; + private LinearLayout appCard; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_detail_result); + logo = findViewById(R.id.app_logo); + appName = findViewById(R.id.app_name); + appStatus = findViewById(R.id.status); + appMalware = findViewById(R.id.malware_name); + appCard = findViewById(R.id.status_card); + appKeterangan = findViewById(R.id.detail); + + AppResult app = getIntent().getParcelableExtra(DETAIL_APP); + + Drawable background = app.getApp().info.loadIcon(getPackageManager()); + logo.setBackgroundDrawable(background); + + appName.setText(app.getApkName()); + appMalware.setText(app.getMalware()); + appKeterangan.setText(app.getDetail()); + if (app.getStatus().equals("Tidak Berbahaya")) { + appCard.setBackgroundColor(Color.GREEN); + appStatus.setText("TIDAK BERBAHAYA"); + } else { + appCard.setBackgroundColor(Color.RED); + appStatus.setText("BERBAHAYA"); + } + + } +} diff --git a/app/src/main/java/com/amsal/ta/IntroActivity.java b/app/src/main/java/com/amsal/ta/IntroActivity.java new file mode 100644 index 0000000..4d12ed2 --- /dev/null +++ b/app/src/main/java/com/amsal/ta/IntroActivity.java @@ -0,0 +1,215 @@ +package com.amsal.ta; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.Button; +import android.widget.TextView; + +import com.amsal.ta.adapter.IntroViewPagerAdapter; +import com.amsal.ta.model.ScreenItem; +import com.google.android.material.tabs.TabLayout; + +import java.util.ArrayList; +import java.util.List; + +public class IntroActivity extends AppCompatActivity { + + private ViewPager screenPager; + IntroViewPagerAdapter introViewPagerAdapter ; + TabLayout tabIndicator; + Button btnNext; + int position = 0 ; + Button btnGetStarted; + Animation btnAnim ; + TextView tvSkip; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // make the activity on full screen + + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + + + // when this activity is about to be launch we need to check if its openened before or not + + if (restorePrefData()) { + + Intent mainActivity = new Intent(getApplicationContext(),MainActivity.class ); + startActivity(mainActivity); + finish(); + + + } + + setContentView(R.layout.activity_intro); + + // hide the action bar + + getSupportActionBar().hide(); + + // ini views + btnNext = findViewById(R.id.btn_next); + btnGetStarted = findViewById(R.id.btn_get_started); + tabIndicator = findViewById(R.id.tab_indicator); + btnAnim = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.button_animation); + tvSkip = findViewById(R.id.tv_skip); + + // fill list screen + + final List<ScreenItem> mList = new ArrayList<>(); + mList.add(new ScreenItem("Fresh Food","Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua, consectetur consectetur adipiscing elit",R.drawable.img1)); + mList.add(new ScreenItem("Fast Delivery","Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua, consectetur consectetur adipiscing elit",R.drawable.img2)); + mList.add(new ScreenItem("Easy Payment","Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua, consectetur consectetur adipiscing elit",R.drawable.img3)); + + // setup viewpager + screenPager =findViewById(R.id.screen_viewpager); + introViewPagerAdapter = new IntroViewPagerAdapter(this,mList); + screenPager.setAdapter(introViewPagerAdapter); + + // setup tablayout with viewpager + + tabIndicator.setupWithViewPager(screenPager); + + // next button click Listner + + btnNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + position = screenPager.getCurrentItem(); + if (position < mList.size()) { + + position++; + screenPager.setCurrentItem(position); + + + } + + if (position == mList.size()-1) { // when we rech to the last screen + + // TODO : show the GETSTARTED Button and hide the indicator and the next button + + loaddLastScreen(); + + + } + + + + } + }); + + // tablayout add change listener + + + tabIndicator.addOnTabSelectedListener(new TabLayout.BaseOnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + + if (tab.getPosition() == mList.size()-1) { + + loaddLastScreen(); + + } + + + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + + } + }); + + + + // Get Started button click listener + + btnGetStarted.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + + //open main activity + + Intent mainActivity = new Intent(getApplicationContext(),MainActivity.class); + startActivity(mainActivity); + // also we need to save a boolean value to storage so next time when the user run the app + // we could know that he is already checked the intro screen activity + // i'm going to use shared preferences to that process + savePrefsData(); + finish(); + + + + } + }); + + // skip button click listener + + tvSkip.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + screenPager.setCurrentItem(mList.size()); + } + }); + + + + } + + private boolean restorePrefData() { + + + SharedPreferences pref = getApplicationContext().getSharedPreferences("myPrefs",MODE_PRIVATE); + Boolean isIntroActivityOpnendBefore = pref.getBoolean("isIntroOpnend",false); + return isIntroActivityOpnendBefore; + + + + } + + private void savePrefsData() { + + SharedPreferences pref = getApplicationContext().getSharedPreferences("myPrefs",MODE_PRIVATE); + SharedPreferences.Editor editor = pref.edit(); + editor.putBoolean("isIntroOpnend",true); + editor.commit(); + + + } + + // show the GETSTARTED Button and hide the indicator and the next button + private void loaddLastScreen() { + + btnNext.setVisibility(View.INVISIBLE); + btnGetStarted.setVisibility(View.VISIBLE); + tvSkip.setVisibility(View.INVISIBLE); + tabIndicator.setVisibility(View.INVISIBLE); + // TODO : ADD an animation the getstarted button + // setup animation + btnGetStarted.setAnimation(btnAnim); + + + + } +} diff --git a/app/src/main/java/com/amsal/ta/MainActivity.java b/app/src/main/java/com/amsal/ta/MainActivity.java new file mode 100644 index 0000000..c5ca8d0 --- /dev/null +++ b/app/src/main/java/com/amsal/ta/MainActivity.java @@ -0,0 +1,30 @@ +package com.amsal.ta; + +import android.os.Bundle; + +import com.google.android.material.bottomnavigation.BottomNavigationView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; +import androidx.navigation.ui.AppBarConfiguration; +import androidx.navigation.ui.NavigationUI; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + BottomNavigationView navView = findViewById(R.id.nav_view); + // Passing each menu ID as a set of Ids because each + // menu should be considered as top level destinations. + AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder( + R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_account) + .build(); + NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); + NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration); + NavigationUI.setupWithNavController(navView, navController); + } + +} diff --git a/app/src/main/java/com/amsal/ta/ResultActivity.java b/app/src/main/java/com/amsal/ta/ResultActivity.java new file mode 100644 index 0000000..7b47959 --- /dev/null +++ b/app/src/main/java/com/amsal/ta/ResultActivity.java @@ -0,0 +1,205 @@ +package com.amsal.ta; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.app.ProgressDialog; +import android.content.Intent; +import android.os.AsyncTask; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; + +import com.amsal.ta.adapter.ResultAdapter; +import com.amsal.ta.model.AppInfo; +import com.amsal.ta.model.AppResult; + +import org.json.JSONObject; + +import java.io.File; +import java.io.IOException; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.concurrent.TimeUnit; + +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class ResultActivity extends AppCompatActivity implements MyAsyncCallback { + public static final String EXTRA_APP = "extra_app"; + private RecyclerView rvResult; + private RelativeLayout errorLayout; + private ImageView errorImg; + private Button exit; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_result); + errorLayout = findViewById(R.id.error_layout); + exit = findViewById(R.id.back_btn); + errorImg = findViewById(R.id.error_img); + ArrayList<AppInfo> apps = getIntent().getParcelableArrayListExtra(EXTRA_APP); + errorLayout.setVisibility(View.GONE); + rvResult = findViewById(R.id.rv_result); + rvResult.setHasFixedSize(true); + + Async async = new Async(this); + async.execute(apps); + + } + + @Override + public void onPreExecute() { + + } + + @Override + public void onPostExecute(ArrayList<AppResult> list) { + if (list.size() != 0) { + rvResult.setLayoutManager(new LinearLayoutManager(this)); + ResultAdapter resultAdapter = new ResultAdapter(this, list); + rvResult.setAdapter(resultAdapter); + } else { + if (errorLayout.getVisibility() == View.GONE) { + errorLayout.setVisibility(View.VISIBLE); + exit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent moveIntent = new Intent(ResultActivity.this, IntroActivity.class); + startActivity(moveIntent); + finish(); + } + }); + errorImg.setImageResource(R.drawable.error); + } + } + + } + + private class Async extends AsyncTask<ArrayList<AppInfo>, Void, ArrayList<AppResult>> { + static final String LOG_ASYNC = "DemoAsync"; + WeakReference<MyAsyncCallback> myListener; + ProgressDialog mProgressDialog; + + Async(MyAsyncCallback myListener) { + this.myListener = new WeakReference<>(myListener); + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + Log.d(LOG_ASYNC, "status : onPreExecute"); + mProgressDialog = new ProgressDialog(ResultActivity.this); + // Set your ProgressBar Title + mProgressDialog.setTitle("Scanning Apps"); + mProgressDialog.setIcon(R.drawable.ic_file_upload_black_24dp); + // Set your ProgressBar Message + mProgressDialog.setMessage("Still Scanning Your Apps, Please Wait!"); + mProgressDialog.setIndeterminate(false); + mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); + // Show ProgressBar + mProgressDialog.setCancelable(false); +// mProgressDialog.setCanceledOnTouchOutside(false); + mProgressDialog.show(); + + MyAsyncCallback myListener = this.myListener.get(); + if (myListener != null) { + myListener.onPreExecute(); + } + } + + @Override + protected ArrayList<AppResult> doInBackground(ArrayList<AppInfo>... apps) { + Log.d(LOG_ASYNC, "status : doInBackground"); + String url = "https://tad3ti03.xyz/upload/"; + return Scan(apps[0], url); + } + + @Override + protected void onPostExecute(ArrayList<AppResult> result) { + super.onPostExecute(result); + mProgressDialog.dismiss(); + Log.d(LOG_ASYNC, "status : onPostExecute"); + MyAsyncCallback myListener = this.myListener.get(); + if (myListener != null) { + myListener.onPostExecute(result); + } + } + } + + public static ArrayList<AppResult> Scan(ArrayList<AppInfo> apps, String url) { + + String fileName; + ArrayList<AppResult> list = new ArrayList<>(); + + + OkHttpClient fileUploadClient = new OkHttpClient.Builder().addNetworkInterceptor(chain -> { + Request originalRequest = chain.request(); + + if (originalRequest.body() == null) { + return chain.proceed(originalRequest); + } + Request progressRequest = originalRequest.newBuilder() + .build(); + + return chain.proceed(progressRequest); + + }).connectTimeout(30000, TimeUnit.SECONDS) + .writeTimeout(30000, TimeUnit.SECONDS) + .readTimeout(30000, TimeUnit.SECONDS) + .build(); + + for (int i = 0; i < apps.size(); i++) { + File apkFile = new File(apps.get(i).info.publicSourceDir); + if (apkFile.isFile()) { + fileName = apps.get(i).info.publicSourceDir; + RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", fileName, RequestBody.create(apkFile, MediaType.parse("application/*"))).build(); + Request request = new Request.Builder().url(url).post(requestBody).build(); + + try { + Response response = fileUploadClient.newCall(request).execute(); + if (response.isSuccessful()) { + Log.i("horas", "onResponse: BERHASIL"); + try { + JSONObject jsonObject = new JSONObject(response.body().string()); + + AppResult sucsess = new AppResult(); + sucsess.app = apps.get(i); + sucsess.apkName = jsonObject.getString("nama_apk"); + sucsess.malware = jsonObject.getString("malware_name"); + sucsess.status = jsonObject.getString("status"); + sucsess.detail = jsonObject.getString("detail"); + list.add(sucsess); + Log.d("horas", list.get(i).detail); + } catch (Exception e) { + } + + } else { + Log.i("horas", "onResponse: GAGAL"); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return list; + } + +} + +interface MyAsyncCallback { + void onPreExecute(); + + void onPostExecute(ArrayList<AppResult> list); +} diff --git a/app/src/main/java/com/amsal/ta/SplashscreenActivity.java b/app/src/main/java/com/amsal/ta/SplashscreenActivity.java new file mode 100644 index 0000000..c3a1cf7 --- /dev/null +++ b/app/src/main/java/com/amsal/ta/SplashscreenActivity.java @@ -0,0 +1,50 @@ +package com.amsal.ta; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.view.WindowManager; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.ImageView; +import android.widget.TextView; + +public class SplashscreenActivity extends AppCompatActivity { + + Handler handler; + Animation topAnim; + Animation botAnim; + ImageView image; + TextView logo, slogan; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + setContentView(R.layout.activity_splashscreen); + + topAnim = AnimationUtils.loadAnimation(this, R.anim.top_animation); + botAnim = AnimationUtils.loadAnimation(this, R.anim.bottom_animation); + + image = findViewById(R.id.logo); + logo = findViewById(R.id.txt_apps_name); + slogan = findViewById(R.id.txt_apps); + + image.setAnimation(topAnim); + logo.setAnimation(botAnim); + slogan.setAnimation(botAnim); + + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + Intent moveIntent = new Intent(SplashscreenActivity.this, IntroActivity.class); + startActivity(moveIntent); + finish(); + } + }, 4000); + + } +} diff --git a/app/src/main/java/com/amsal/ta/adapter/AppAdapter.java b/app/src/main/java/com/amsal/ta/adapter/AppAdapter.java new file mode 100644 index 0000000..99c93ef --- /dev/null +++ b/app/src/main/java/com/amsal/ta/adapter/AppAdapter.java @@ -0,0 +1,107 @@ +package com.amsal.ta.adapter; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.amsal.ta.R; +import com.amsal.ta.model.AppInfo; + +import java.util.ArrayList; +import java.util.List; + +public class AppAdapter extends RecyclerView.Adapter<AppAdapter.GridViewHolder> { + private LayoutInflater layoutInflater; + private PackageManager packageManager; + private List<AppInfo> apps; + + + private OnItemClickCallback onItemClickCallback; + + public AppAdapter(@NonNull Context context, List<AppInfo> apps) { + layoutInflater = LayoutInflater.from(context); + packageManager = context.getPackageManager(); + this.apps = apps; + } + + public void setOnItemClickCallback(OnItemClickCallback onItemClickCallback) { + this.onItemClickCallback = onItemClickCallback; + } + + @NonNull + @Override + public GridViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { + View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.app_layout, viewGroup, false); + return new GridViewHolder(view); + } + @Override + public void onBindViewHolder(@NonNull final GridViewHolder holder, int position) { + final AppInfo current = apps.get(position); + + holder.textViewTitle.setText(current.label); + Drawable background = current.info.loadIcon(packageManager); + holder.imageView.setBackgroundDrawable(background); + + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + current.setChecked(!current.isChecked()); + holder.check.setVisibility(current.isChecked() ? View.VISIBLE : View.GONE); + onItemClickCallback.onItemClicked(apps.get(holder.getAdapterPosition())); + } + }); + } + + @Override + public int getItemCount() { + return apps.size(); + } + public class GridViewHolder extends RecyclerView.ViewHolder { + ImageView imageView; + TextView textViewTitle; + private ImageView check; + public GridViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.icon_image); + textViewTitle = itemView.findViewById(R.id.titleTextView); + check = itemView.findViewById(R.id.imageCheck); + } + } + public interface OnItemClickCallback { + void onItemClicked(AppInfo data); + } + public int getSelected() { + int count = 0; + for (int i = 0; i < apps.size(); i++) { + if (apps.get(i).isChecked()) { + count++; + } + } + return count; + } + public void clearSelected() { + for (int i = 0; i < apps.size(); i++) { + if (apps.get(i).isChecked()) { + apps.get(i).setChecked(false); + } + } + } + + public ArrayList<AppInfo> getSelectedApk(){ + ArrayList<AppInfo> listApps = new ArrayList<AppInfo>(); + for (int i = 0; i < apps.size(); i++) { + if (apps.get(i).isChecked()) { + listApps.add(apps.get(i)); + } + } + return listApps; + } +} diff --git a/app/src/main/java/com/amsal/ta/adapter/IntroViewPagerAdapter.java b/app/src/main/java/com/amsal/ta/adapter/IntroViewPagerAdapter.java new file mode 100644 index 0000000..192a2ff --- /dev/null +++ b/app/src/main/java/com/amsal/ta/adapter/IntroViewPagerAdapter.java @@ -0,0 +1,70 @@ +package com.amsal.ta.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.viewpager.widget.PagerAdapter; + +import com.amsal.ta.R; +import com.amsal.ta.model.ScreenItem; + +import java.util.List; + +public class IntroViewPagerAdapter extends PagerAdapter { + + Context mContext ; + List<ScreenItem> mListScreen; + + public IntroViewPagerAdapter(Context mContext, List<ScreenItem> mListScreen) { + this.mContext = mContext; + this.mListScreen = mListScreen; + } + + + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup container, int position) { + + LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View layoutScreen = inflater.inflate(R.layout.layout_screen,null); + + ImageView imgSlide = layoutScreen.findViewById(R.id.intro_img); + TextView title = layoutScreen.findViewById(R.id.intro_title); + TextView description = layoutScreen.findViewById(R.id.intro_description); + + title.setText(mListScreen.get(position).getTitle()); + description.setText(mListScreen.get(position).getDescription()); + imgSlide.setImageResource(mListScreen.get(position).getScreenImg()); + + container.addView(layoutScreen); + + return layoutScreen; + + + + + + } + + @Override + public int getCount() { + return mListScreen.size(); + } + + @Override + public boolean isViewFromObject(@NonNull View view, @NonNull Object o) { + return view == o; + } + + @Override + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + + container.removeView((View)object); + + } +} diff --git a/app/src/main/java/com/amsal/ta/adapter/ResultAdapter.java b/app/src/main/java/com/amsal/ta/adapter/ResultAdapter.java new file mode 100644 index 0000000..a7eee8c --- /dev/null +++ b/app/src/main/java/com/amsal/ta/adapter/ResultAdapter.java @@ -0,0 +1,95 @@ +package com.amsal.ta.adapter; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.amsal.ta.DetailResultActivity; +import com.amsal.ta.R; +import com.amsal.ta.ResultActivity; +import com.amsal.ta.model.AppResult; +import com.bumptech.glide.Glide; + +import java.util.ArrayList; + +public class ResultAdapter extends RecyclerView.Adapter<ResultAdapter.CardViewViewHolder> { + private ArrayList<AppResult> listAppResult; + private PackageManager packageManager; + private Context context; + private AppAdapter.OnItemClickCallback onItemClickCallback; + + public ResultAdapter(@NonNull Context context, ArrayList<AppResult> list) { + this.listAppResult = list; + packageManager = context.getPackageManager(); + this.context = context; + this.listAppResult = list; + } + + public void setOnItemClickCallback(AppAdapter.OnItemClickCallback onItemClickCallback) { + this.onItemClickCallback = onItemClickCallback; + } + + @NonNull + @Override + public CardViewViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.result_list, viewGroup, false); + return new CardViewViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull final CardViewViewHolder holder, int position) { + + AppResult result = listAppResult.get(position); + Drawable background = result.getApp().info.loadIcon(packageManager); + holder.appPhoto.setBackgroundDrawable(background); + if (result.getStatus().equals("Tidak Berbahaya")) { + holder.tvStatus.setText(result.getStatus()); + holder.tvStatus.setTextColor(Color.GREEN); + } else { + holder.tvStatus.setTextColor(Color.RED); + holder.tvStatus.setText(result.getStatus()); + } + holder.tvName.setText(result.getApkName()); + holder.tvMalware.setText(result.getMalware()); + holder.btnDetail.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(context, DetailResultActivity.class); + intent.putExtra(DetailResultActivity.DETAIL_APP, result); + context.startActivity(intent); + } + }); + } + + @Override + public int getItemCount() { + return listAppResult.size(); + } + + class CardViewViewHolder extends RecyclerView.ViewHolder { + ImageView appPhoto; + TextView tvName, tvMalware, tvStatus; + Button btnDetail; + + CardViewViewHolder(View itemView) { + super(itemView); + appPhoto = itemView.findViewById(R.id.img_item_photo); + tvName = itemView.findViewById(R.id.tv_item_name); + tvMalware = itemView.findViewById(R.id.tv_item_malware); + tvStatus = itemView.findViewById(R.id.tv_item_status); + btnDetail = itemView.findViewById(R.id.btn_set_detail); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amsal/ta/model/AppInfo.java b/app/src/main/java/com/amsal/ta/model/AppInfo.java new file mode 100644 index 0000000..1e9b084 --- /dev/null +++ b/app/src/main/java/com/amsal/ta/model/AppInfo.java @@ -0,0 +1,51 @@ +package com.amsal.ta.model; + +import android.content.pm.ApplicationInfo; +import android.os.Parcel; +import android.os.Parcelable; + +public class AppInfo implements Parcelable { + public ApplicationInfo info; + public String label; + private boolean isChecked = false; + + public AppInfo(Parcel in) { + info = in.readParcelable(ApplicationInfo.class.getClassLoader()); + label = in.readString(); + } + + public boolean isChecked() { + return isChecked; + } + + public void setChecked(boolean checked) { + isChecked = checked; + } + + public static final Creator<AppInfo> CREATOR = new Creator<AppInfo>() { + @Override + public AppInfo createFromParcel(Parcel in) { + return new AppInfo(in); + } + + @Override + public AppInfo[] newArray(int size) { + return new AppInfo[size]; + } + }; + + public AppInfo() { + + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeParcelable(info, flags); + dest.writeString(label); + } +} diff --git a/app/src/main/java/com/amsal/ta/model/AppResult.java b/app/src/main/java/com/amsal/ta/model/AppResult.java new file mode 100644 index 0000000..7f32698 --- /dev/null +++ b/app/src/main/java/com/amsal/ta/model/AppResult.java @@ -0,0 +1,94 @@ +package com.amsal.ta.model; + +import android.os.Parcel; +import android.os.Parcelable; + +public class AppResult implements Parcelable { + public AppInfo app; + public String apkName; + public String status; + public String malware; + public String detail; + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + public AppInfo getApp() { + return app; + } + + public void setApp(AppInfo app) { + this.app = app; + } + + public String getApkName() { + return apkName; + } + + public void setApkName(String apkName) { + this.apkName = apkName; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getMalware() { + return malware; + } + + public void setMalware(String malware) { + this.malware = malware; + } + + public static Creator<AppResult> getCREATOR() { + return CREATOR; + } + + public AppResult(Parcel in) { + app = in.readParcelable(AppInfo.class.getClassLoader()); + apkName = in.readString(); + status = in.readString(); + malware = in.readString(); + detail = in.readString(); + } + + public static final Creator<AppResult> CREATOR = new Creator<AppResult>() { + @Override + public AppResult createFromParcel(Parcel in) { + return new AppResult(in); + } + + @Override + public AppResult[] newArray(int size) { + return new AppResult[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeParcelable(app, flags); + dest.writeString(apkName); + dest.writeString(status); + dest.writeString(malware); + dest.writeString(detail); + } + + public AppResult() { + + } +} diff --git a/app/src/main/java/com/amsal/ta/model/ScreenItem.java b/app/src/main/java/com/amsal/ta/model/ScreenItem.java new file mode 100644 index 0000000..c5a4cef --- /dev/null +++ b/app/src/main/java/com/amsal/ta/model/ScreenItem.java @@ -0,0 +1,37 @@ +package com.amsal.ta.model; + +public class ScreenItem { + + String Title,Description; + int ScreenImg; + + public ScreenItem(String title, String description, int screenImg) { + Title = title; + Description = description; + ScreenImg = screenImg; + } + + public void setTitle(String title) { + Title = title; + } + + public void setDescription(String description) { + Description = description; + } + + public void setScreenImg(int screenImg) { + ScreenImg = screenImg; + } + + public String getTitle() { + return Title; + } + + public String getDescription() { + return Description; + } + + public int getScreenImg() { + return ScreenImg; + } +} diff --git a/app/src/main/java/com/amsal/ta/ui/account/AccountFragment.java b/app/src/main/java/com/amsal/ta/ui/account/AccountFragment.java new file mode 100644 index 0000000..243f59c --- /dev/null +++ b/app/src/main/java/com/amsal/ta/ui/account/AccountFragment.java @@ -0,0 +1,35 @@ +package com.amsal.ta.ui.account; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; + +import com.amsal.ta.R; + +public class AccountFragment extends Fragment { + + private AccountViewModel notificationsViewModel; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + notificationsViewModel = + ViewModelProviders.of(this).get(AccountViewModel.class); + View root = inflater.inflate(R.layout.fragment_account, container, false); + final TextView textView = root.findViewById(R.id.text_account); + notificationsViewModel.getText().observe(this, new Observer<String>() { + @Override + public void onChanged(@Nullable String s) { + textView.setText(s); + } + }); + return root; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amsal/ta/ui/account/AccountViewModel.java b/app/src/main/java/com/amsal/ta/ui/account/AccountViewModel.java new file mode 100644 index 0000000..069e8ca --- /dev/null +++ b/app/src/main/java/com/amsal/ta/ui/account/AccountViewModel.java @@ -0,0 +1,19 @@ +package com.amsal.ta.ui.account; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class AccountViewModel extends ViewModel { + + private MutableLiveData<String> mText; + + public AccountViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is notifications fragment"); + } + + public LiveData<String> getText() { + return mText; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amsal/ta/ui/dashboard/DashboardFragment.java b/app/src/main/java/com/amsal/ta/ui/dashboard/DashboardFragment.java new file mode 100644 index 0000000..571df2f --- /dev/null +++ b/app/src/main/java/com/amsal/ta/ui/dashboard/DashboardFragment.java @@ -0,0 +1,307 @@ +package com.amsal.ta.ui.dashboard; + +import android.app.ProgressDialog; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.os.Parcelable; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.amsal.ta.R; +import com.amsal.ta.ResultActivity; +import com.amsal.ta.adapter.AppAdapter; +import com.amsal.ta.model.AppInfo; +import com.google.android.material.bottomnavigation.BottomNavigationView; +import com.loopj.android.http.AsyncHttpClient; +import com.loopj.android.http.AsyncHttpResponseHandler; +import com.loopj.android.http.RequestParams; + +import org.jetbrains.annotations.NotNull; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import cz.msebera.android.httpclient.Header; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class DashboardFragment extends Fragment { + + RecyclerView gridView; + private ProgressBar progressBar; + private ConstraintLayout scan; + boolean mIncludeSystemApps; + private Button btnScan; + private ImageView clear; + private BottomNavigationView bottomNavigationView; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_dashboard, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + + scan = getActivity().findViewById(R.id.scan_layout); + gridView = getView().findViewById(R.id.griview); + gridView.setHasFixedSize(true); + btnScan = getActivity().findViewById(R.id.btn_scan); + bottomNavigationView = getActivity().findViewById(R.id.nav_view); + clear = getActivity().findViewById(R.id.clear); + progressBar = getActivity().findViewById(R.id.progressBar); + progressBar.setVisibility(View.INVISIBLE); + + + List<AppInfo> apps = new ArrayList<>(); + PackageManager packageManager = getActivity().getPackageManager(); + List<ApplicationInfo> infos = packageManager.getInstalledApplications(PackageManager.GET_META_DATA); + + for (ApplicationInfo info : infos) { + if (!mIncludeSystemApps && (info.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { + continue; + } + AppInfo app = new AppInfo(); + app.info = info; + app.label = (String) info.loadLabel(packageManager); + apps.add(app); + } + + //sort the data + + Collections.sort(apps, new DNComparator()); + gridView.setLayoutManager(new GridLayoutManager(getContext(), 4)); + final AppAdapter adapter = new AppAdapter(getActivity(), apps); + gridView.setAdapter(adapter); + + adapter.setOnItemClickCallback(new AppAdapter.OnItemClickCallback() { + @Override + public void onItemClicked(AppInfo data) { + int count = adapter.getSelected(); + if (count > 0) { + bottomNavigationView.setVisibility(View.INVISIBLE); + scan.setVisibility(View.VISIBLE); + btnScan.setText("SCAN(" + count + ")"); + } else { + scan.setVisibility(View.INVISIBLE); + bottomNavigationView.setVisibility(View.VISIBLE); + } +// Toast.makeText(getActivity(), data.label, Toast.LENGTH_LONG).show(); + } + }); + + clear.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + adapter.clearSelected(); + gridView.setAdapter(adapter); + scan.setVisibility(View.INVISIBLE); + bottomNavigationView.setVisibility(View.VISIBLE); + } + }); + + btnScan.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent resultIntent = new Intent(getContext(), ResultActivity.class); + resultIntent.putParcelableArrayListExtra(ResultActivity.EXTRA_APP, adapter.getSelectedApk()); + startActivity(resultIntent); + } + }); + + } + + private class DNComparator implements Comparator<AppInfo> { + + @Override + public int compare(AppInfo aa, AppInfo ab) { + CharSequence sa = aa.label; + CharSequence sb = ab.label; + if (sa == null) { + sa = aa.info.packageName; + } + if (sb == null) { + sb = ab.info.packageName; + } + return Collator.getInstance().compare(sa.toString(), sb.toString()); + } + } + +// private void scanApk(List<AppInfo> apps){ +// progressBar.setVisibility(View.VISIBLE); +// +// AsyncHttpClient client = new AsyncHttpClient(); +// String url = "https://tugasakhir03.herokuapp.com/upload/"; +// +// RequestParams params = new RequestParams(); +// try { +// for(int i = 0 ; i < apps.size(); i++){ +// File apkFile = new File(apps.get(i).info.publicSourceDir); +// String packageName = apps.get(i).info.packageName; +// if (apkFile.isFile()) { +//// installedApkFilePaths.put(packageName, apkFile.getAbsolutePath()); +//// Toast.makeText(getActivity(), apkFile.getAbsolutePath(), Toast.LENGTH_LONG).show(); +// params.put("file", apkFile.getAbsoluteFile()); +// Log.d("horas" ,apkFile.getAbsoluteFile().getName()); +// } +// } +//// params.put("file", myFile); +// } catch(Exception e) { +// Log.d("horas" , "gagal"); +// } +// client.put(getActivity(), url, params, new AsyncHttpResponseHandler() { +// @Override +// public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { +// Log.d("horas" , "mantap"); +// progressBar.setVisibility(View.INVISIBLE); +// } +// +// @Override +// public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { +// Log.d("horas" , "ancor"); +// Log.e("horas ", "onFailure: ERROR > " + error.getMessage()); +// } +// +// }); + + +// } + +// private void scanApk(List<AppInfo> apps) { +// ArrayList<JSONObject> resultApk = new ArrayList<JSONObject>(); +// ArrayList<String> hasil = new ArrayList<String>(); +// List<AppInfo> status = new ArrayList<AppInfo>(); +// String url = "https://tugasakhir03.herokuapp.com/upload/"; +//// OkHttpClient fileUploadClient = new OkHttpClient.Builder().addNetworkInterceptor(chain -> { +//// Request originalRequest = chain.request(); +//// +//// if (originalRequest.body() == null) { +//// return chain.proceed(originalRequest); +//// } +//// Request progressRequest = originalRequest.newBuilder() +//// .build(); +//// +//// return chain.proceed(progressRequest); +//// +//// }).build(); +//// +//// for (int i = 0; i < apps.size(); i++) { +//// File apkFile = new File(apps.get(i).info.publicSourceDir); +//// String packageName = apps.get(i).info.packageName; +//// if (apkFile.isFile()) { +//// fileName = apps.get(i).info.publicSourceDir; +//// RequestBody requestBody = new MultipartBody.Builder() +//// .setType(MultipartBody.FORM) +//// .addFormDataPart("file", fileName, RequestBody.create(apkFile, MediaType.parse("application/*"))) +//// .build(); +//// Log.d("horas", apkFile.getAbsoluteFile().getName()); +//// +//// Request request = new Request.Builder() +//// .url(url) +////// .header("Prediction-Key", "42b03f551d0a439785a7f601b92a18fb") +////// .header("Content-Type", "application/octet-stream") +//// .post(requestBody) +//// .build(); +//// +//// fileUploadClient.newCall(request).enqueue(new Callback() { +//// @Override +//// public void onFailure(@NotNull Call call, @NotNull IOException e) { +//// Log.e("horas", "onFailure: ERROR > " + e.getMessage()); +//// return; +////// loading.dismiss(); +//// } +//// +//// @Override +//// public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { +//// if (response.isSuccessful()) { +//// Log.i("horas", "onResponse: BERHASIL"); +//// try { +//// JSONObject jsonObject = new JSONObject(response.body().string()); +//// String status = jsonObject.getString("status"); +//// String malware_name = jsonObject.getString("malware_name"); +////// hasil.add(status); +////// hasil.add(malware_name); +////// hasil.add("Berhasil"); +////// Intent uploadIntent = new Intent(UploadActivity.this, UploadResultActivity.class); +////// Toast.makeText(getApplicationContext() , jsonObject.toString(), Toast.LENGTH_LONG).show(); +////// for (int i = 0; i < jsonObject.getJSONArray("status").length(); i++) { +////// probability = jsonObject.getJSONArray("predictions").getJSONObject(0).getString("probability"); +////// tagName = jsonObject.getJSONArray("predictions").getJSONObject(0).getString("tagName"); +////// Log.i("debug", "responseBody: " + tagName + " = " + probability); +////// } +////// uploadIntent.putExtra("AppInfo" , app); +//// Log.i("horas", status); +////// loading.dismiss(); +////// getDataHamaResources(tagName); +////// runOnUiThread(() -> getDataTanahResources(tagName)); +////// runOnUiThread(() -> showToast(tagName)); +//// } catch (JSONException | IOException e) { +//// e.printStackTrace(); +//// } +//// } else { +//// Log.i("horas", "onResponse: GAGAL"); +////// loading.dismiss(); +//// } +//// } +//// }); +//// }else{ +//// +//// } +//// } +// +// JSONObject json = new JSONObject(); +// JSONArray array = new JSONArray(); +// JSONObject item = new JSONObject(); +// +// //ini sementara, nanti akan dipindahkan jika server sudah oke +// try { +// json.put("nama_apk", "horas"); +// +// item.put("status", "Tidak Berbahaya"); +// item.put("malware_name", "-"); +// +// array.put(item); +// +// json.put("response", array); +// Log.d("horas", json.getJSONArray("response").getJSONObject(0).getString("status")); +// }catch (Exception e){} +// +// resultApk.add(json); +// status.add(apps.get(0)); +// +// +// } + +} \ No newline at end of file diff --git a/app/src/main/java/com/amsal/ta/ui/dashboard/DashboardViewModel.java b/app/src/main/java/com/amsal/ta/ui/dashboard/DashboardViewModel.java new file mode 100644 index 0000000..d477cfe --- /dev/null +++ b/app/src/main/java/com/amsal/ta/ui/dashboard/DashboardViewModel.java @@ -0,0 +1,19 @@ +package com.amsal.ta.ui.dashboard; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class DashboardViewModel extends ViewModel { + + private MutableLiveData<String> mText; + + public DashboardViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is dashboard fragment"); + } + + public LiveData<String> getText() { + return mText; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amsal/ta/ui/home/HomeFragment.java b/app/src/main/java/com/amsal/ta/ui/home/HomeFragment.java new file mode 100644 index 0000000..aa0aa60 --- /dev/null +++ b/app/src/main/java/com/amsal/ta/ui/home/HomeFragment.java @@ -0,0 +1,35 @@ +package com.amsal.ta.ui.home; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; + +import com.amsal.ta.R; + +public class HomeFragment extends Fragment { + + private HomeViewModel homeViewModel; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + homeViewModel = + ViewModelProviders.of(this).get(HomeViewModel.class); + View root = inflater.inflate(R.layout.fragment_home, container, false); + final TextView textView = root.findViewById(R.id.text_home); + homeViewModel.getText().observe(this, new Observer<String>() { + @Override + public void onChanged(@Nullable String s) { + textView.setText(s); + } + }); + return root; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amsal/ta/ui/home/HomeViewModel.java b/app/src/main/java/com/amsal/ta/ui/home/HomeViewModel.java new file mode 100644 index 0000000..0881c79 --- /dev/null +++ b/app/src/main/java/com/amsal/ta/ui/home/HomeViewModel.java @@ -0,0 +1,19 @@ +package com.amsal.ta.ui.home; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class HomeViewModel extends ViewModel { + + private MutableLiveData<String> mText; + + public HomeViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is home fragment"); + } + + public LiveData<String> getText() { + return mText; + } +} \ No newline at end of file diff --git a/app/src/main/res/anim/bottom_animation.xml b/app/src/main/res/anim/bottom_animation.xml new file mode 100644 index 0000000..6621fa7 --- /dev/null +++ b/app/src/main/res/anim/bottom_animation.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android"> + + <translate + android:fromXDelta="0%" + android:fromYDelta="100%" + android:duration="1500"/> + + <alpha + android:fromAlpha="0.1" + android:toAlpha="1.0" + android:duration="1500"/> + +</set> \ No newline at end of file diff --git a/app/src/main/res/anim/button_animation.xml b/app/src/main/res/anim/button_animation.xml new file mode 100644 index 0000000..4d9e84d --- /dev/null +++ b/app/src/main/res/anim/button_animation.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android"> + + <alpha + android:fromAlpha="0.0" + android:toAlpha="1.0" + android:duration="500" /> + + <translate + android:fromYDelta="-100%" + android:toYDelta="0%" + android:duration="700" /> + + + +</set> \ No newline at end of file diff --git a/app/src/main/res/anim/top_animation.xml b/app/src/main/res/anim/top_animation.xml new file mode 100644 index 0000000..b8c7211 --- /dev/null +++ b/app/src/main/res/anim/top_animation.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android"> + + <translate + android:fromXDelta="0%" + android:fromYDelta="-50%" + android:duration="2000"/> + + <alpha + android:fromAlpha="0.1" + android:toAlpha="1.0" + android:duration="1500"/> + +</set> \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/btn_gradient_style.xml b/app/src/main/res/drawable-v24/btn_gradient_style.xml new file mode 100644 index 0000000..17da166 --- /dev/null +++ b/app/src/main/res/drawable-v24/btn_gradient_style.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + + <corners android:radius="6dp"></corners> + + + <gradient android:startColor="@color/gradient_start_color" + android:endColor="@color/gradient_end_color" /> + + +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/drawable-v24/btn_gradient_style.xml b/app/src/main/res/drawable-v24/drawable-v24/btn_gradient_style.xml new file mode 100644 index 0000000..17da166 --- /dev/null +++ b/app/src/main/res/drawable-v24/drawable-v24/btn_gradient_style.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + + <corners android:radius="6dp"></corners> + + + <gradient android:startColor="@color/gradient_start_color" + android:endColor="@color/gradient_end_color" /> + + +</shape> \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f6bb29 --- /dev/null +++ b/app/src/main/res/drawable-v24/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + <path + android:fillType="evenOdd" + android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z" + android:strokeWidth="1" + android:strokeColor="#00000000"> + <aapt:attr name="android:fillColor"> + <gradient + android:endX="78.5885" + android:endY="90.9159" + android:startX="48.7653" + android:startY="61.0927" + android:type="linear"> + <item + android:color="#44000000" + android:offset="0.0" /> + <item + android:color="#00000000" + android:offset="1.0" /> + </gradient> + </aapt:attr> + </path> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> +</vector> diff --git a/app/src/main/res/drawable-v24/drawable-v24/ic_policy.png b/app/src/main/res/drawable-v24/drawable-v24/ic_policy.png new file mode 100644 index 0000000..9de56c1 Binary files /dev/null and b/app/src/main/res/drawable-v24/drawable-v24/ic_policy.png differ diff --git a/app/src/main/res/drawable-v24/drawable-v24/img1.png b/app/src/main/res/drawable-v24/drawable-v24/img1.png new file mode 100644 index 0000000..174a7b0 Binary files /dev/null and b/app/src/main/res/drawable-v24/drawable-v24/img1.png differ diff --git a/app/src/main/res/drawable-v24/drawable-v24/img2.png b/app/src/main/res/drawable-v24/drawable-v24/img2.png new file mode 100644 index 0000000..3be48f4 Binary files /dev/null and b/app/src/main/res/drawable-v24/drawable-v24/img2.png differ diff --git a/app/src/main/res/drawable-v24/drawable-v24/img3.png b/app/src/main/res/drawable-v24/drawable-v24/img3.png new file mode 100644 index 0000000..8d613fd Binary files /dev/null and b/app/src/main/res/drawable-v24/drawable-v24/img3.png differ diff --git a/app/src/main/res/drawable-v24/drawable-v24/indicator_default.xml b/app/src/main/res/drawable-v24/drawable-v24/indicator_default.xml new file mode 100644 index 0000000..44fc6f8 --- /dev/null +++ b/app/src/main/res/drawable-v24/drawable-v24/indicator_default.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + + <item> + + <shape android:shape="ring" + android:innerRadius="0dp" + android:thickness="4dp" + android:useLevel="false"> + + <solid android:color="@color/tab_indicator_gray" /> + + + + </shape> + + + + </item> + + + +</layer-list> \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/drawable-v24/indicator_selected.xml b/app/src/main/res/drawable-v24/drawable-v24/indicator_selected.xml new file mode 100644 index 0000000..479d1c0 --- /dev/null +++ b/app/src/main/res/drawable-v24/drawable-v24/indicator_selected.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + + <item> + + <shape android:shape="ring" + android:innerRadius="3dp" + android:thickness="2dp" + android:useLevel="false"> + + <solid android:color="@color/gradient_start_color" /> + + + + </shape> + + + + </item> + + + +</layer-list> \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/drawable-v24/indicator_selector.xml b/app/src/main/res/drawable-v24/drawable-v24/indicator_selector.xml new file mode 100644 index 0000000..e738fca --- /dev/null +++ b/app/src/main/res/drawable-v24/drawable-v24/indicator_selector.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + + + <item android:drawable="@drawable/indicator_selected" + android:state_selected="true" /> + + <item android:drawable="@drawable/indicator_default" /> + + + +</selector> \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/drawable/ic_arrow_forward_black_24dp.xml b/app/src/main/res/drawable-v24/drawable/ic_arrow_forward_black_24dp.xml new file mode 100644 index 0000000..cf9e208 --- /dev/null +++ b/app/src/main/res/drawable-v24/drawable/ic_arrow_forward_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z"/> +</vector> diff --git a/app/src/main/res/drawable-v24/drawable/ic_dashboard_black_24dp.xml b/app/src/main/res/drawable-v24/drawable/ic_dashboard_black_24dp.xml new file mode 100644 index 0000000..46fc8de --- /dev/null +++ b/app/src/main/res/drawable-v24/drawable/ic_dashboard_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M3,13h8L11,3L3,3v10zM3,21h8v-6L3,15v6zM13,21h8L21,11h-8v10zM13,3v6h8L21,3h-8z" /> +</vector> diff --git a/app/src/main/res/drawable-v24/drawable/ic_home_black_24dp.xml b/app/src/main/res/drawable-v24/drawable/ic_home_black_24dp.xml new file mode 100644 index 0000000..f8bb0b5 --- /dev/null +++ b/app/src/main/res/drawable-v24/drawable/ic_home_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" /> +</vector> diff --git a/app/src/main/res/drawable-v24/drawable/ic_launcher_background.xml b/app/src/main/res/drawable-v24/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..0d025f9 --- /dev/null +++ b/app/src/main/res/drawable-v24/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + <path + android:fillColor="#008577" + android:pathData="M0,0h108v108h-108z" /> + <path + android:fillColor="#00000000" + android:pathData="M9,0L9,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,0L19,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M29,0L29,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M39,0L39,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M49,0L49,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M59,0L59,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M69,0L69,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M79,0L79,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M89,0L89,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M99,0L99,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,9L108,9" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,19L108,19" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,29L108,29" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,39L108,39" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,49L108,49" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,59L108,59" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,69L108,69" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,79L108,79" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,89L108,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,99L108,99" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,29L89,29" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,39L89,39" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,49L89,49" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,59L89,59" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,69L89,69" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,79L89,79" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M29,19L29,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M39,19L39,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M49,19L49,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M59,19L59,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M69,19L69,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M79,19L79,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> +</vector> diff --git a/app/src/main/res/drawable-v24/drawable/ic_notifications_black_24dp.xml b/app/src/main/res/drawable-v24/drawable/ic_notifications_black_24dp.xml new file mode 100644 index 0000000..78b75c3 --- /dev/null +++ b/app/src/main/res/drawable-v24/drawable/ic_notifications_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z" /> +</vector> diff --git a/app/src/main/res/drawable-v24/drawable/ic_person_black_24dp.xml b/app/src/main/res/drawable-v24/drawable/ic_person_black_24dp.xml new file mode 100644 index 0000000..b2cb337 --- /dev/null +++ b/app/src/main/res/drawable-v24/drawable/ic_person_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/> +</vector> diff --git a/app/src/main/res/drawable-v24/drawable/logos.png b/app/src/main/res/drawable-v24/drawable/logos.png new file mode 100644 index 0000000..3c0eab9 Binary files /dev/null and b/app/src/main/res/drawable-v24/drawable/logos.png differ diff --git a/app/src/main/res/drawable-v24/error.png b/app/src/main/res/drawable-v24/error.png new file mode 100644 index 0000000..b37a9b4 Binary files /dev/null and b/app/src/main/res/drawable-v24/error.png differ diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f6bb29 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + <path + android:fillType="evenOdd" + android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z" + android:strokeWidth="1" + android:strokeColor="#00000000"> + <aapt:attr name="android:fillColor"> + <gradient + android:endX="78.5885" + android:endY="90.9159" + android:startX="48.7653" + android:startY="61.0927" + android:type="linear"> + <item + android:color="#44000000" + android:offset="0.0" /> + <item + android:color="#00000000" + android:offset="1.0" /> + </gradient> + </aapt:attr> + </path> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> +</vector> diff --git a/app/src/main/res/drawable-v24/ic_policy.png b/app/src/main/res/drawable-v24/ic_policy.png new file mode 100644 index 0000000..9de56c1 Binary files /dev/null and b/app/src/main/res/drawable-v24/ic_policy.png differ diff --git a/app/src/main/res/drawable-v24/img1.png b/app/src/main/res/drawable-v24/img1.png new file mode 100644 index 0000000..174a7b0 Binary files /dev/null and b/app/src/main/res/drawable-v24/img1.png differ diff --git a/app/src/main/res/drawable-v24/img2.png b/app/src/main/res/drawable-v24/img2.png new file mode 100644 index 0000000..3be48f4 Binary files /dev/null and b/app/src/main/res/drawable-v24/img2.png differ diff --git a/app/src/main/res/drawable-v24/img3.png b/app/src/main/res/drawable-v24/img3.png new file mode 100644 index 0000000..8d613fd Binary files /dev/null and b/app/src/main/res/drawable-v24/img3.png differ diff --git a/app/src/main/res/drawable-v24/indicator_default.xml b/app/src/main/res/drawable-v24/indicator_default.xml new file mode 100644 index 0000000..44fc6f8 --- /dev/null +++ b/app/src/main/res/drawable-v24/indicator_default.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + + <item> + + <shape android:shape="ring" + android:innerRadius="0dp" + android:thickness="4dp" + android:useLevel="false"> + + <solid android:color="@color/tab_indicator_gray" /> + + + + </shape> + + + + </item> + + + +</layer-list> \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/indicator_selected.xml b/app/src/main/res/drawable-v24/indicator_selected.xml new file mode 100644 index 0000000..479d1c0 --- /dev/null +++ b/app/src/main/res/drawable-v24/indicator_selected.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + + <item> + + <shape android:shape="ring" + android:innerRadius="3dp" + android:thickness="2dp" + android:useLevel="false"> + + <solid android:color="@color/gradient_start_color" /> + + + + </shape> + + + + </item> + + + +</layer-list> \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/indicator_selector.xml b/app/src/main/res/drawable-v24/indicator_selector.xml new file mode 100644 index 0000000..e738fca --- /dev/null +++ b/app/src/main/res/drawable-v24/indicator_selector.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + + + <item android:drawable="@drawable/indicator_selected" + android:state_selected="true" /> + + <item android:drawable="@drawable/indicator_default" /> + + + +</selector> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_arrow_forward_black_24dp.xml b/app/src/main/res/drawable/ic_arrow_forward_black_24dp.xml new file mode 100644 index 0000000..cf9e208 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_forward_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_check_circle_black_24dp.xml b/app/src/main/res/drawable/ic_check_circle_black_24dp.xml new file mode 100644 index 0000000..d44c9a2 --- /dev/null +++ b/app/src/main/res/drawable/ic_check_circle_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="@color/colorPrimary" + android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_clear_black_24dp.xml b/app/src/main/res/drawable/ic_clear_black_24dp.xml new file mode 100644 index 0000000..ede4b71 --- /dev/null +++ b/app/src/main/res/drawable/ic_clear_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_dashboard_black_24dp.xml b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml new file mode 100644 index 0000000..46fc8de --- /dev/null +++ b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M3,13h8L11,3L3,3v10zM3,21h8v-6L3,15v6zM13,21h8L21,11h-8v10zM13,3v6h8L21,3h-8z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_file_upload_black_24dp.xml b/app/src/main/res/drawable/ic_file_upload_black_24dp.xml new file mode 100644 index 0000000..d633972 --- /dev/null +++ b/app/src/main/res/drawable/ic_file_upload_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M9,16h6v-6h4l-7,-7 -7,7h4zM5,18h14v2L5,20z"/> +</vector> diff --git a/app/src/main/res/drawable/ic_home_black_24dp.xml b/app/src/main/res/drawable/ic_home_black_24dp.xml new file mode 100644 index 0000000..f8bb0b5 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..0d025f9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + <path + android:fillColor="#008577" + android:pathData="M0,0h108v108h-108z" /> + <path + android:fillColor="#00000000" + android:pathData="M9,0L9,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,0L19,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M29,0L29,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M39,0L39,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M49,0L49,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M59,0L59,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M69,0L69,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M79,0L79,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M89,0L89,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M99,0L99,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,9L108,9" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,19L108,19" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,29L108,29" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,39L108,39" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,49L108,49" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,59L108,59" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,69L108,69" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,79L108,79" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,89L108,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,99L108,99" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,29L89,29" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,39L89,39" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,49L89,49" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,59L89,59" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,69L89,69" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,79L89,79" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M29,19L29,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M39,19L39,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M49,19L49,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M59,19L59,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M69,19L69,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M79,19L79,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> +</vector> diff --git a/app/src/main/res/drawable/ic_notifications_black_24dp.xml b/app/src/main/res/drawable/ic_notifications_black_24dp.xml new file mode 100644 index 0000000..78b75c3 --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_person_black_24dp.xml b/app/src/main/res/drawable/ic_person_black_24dp.xml new file mode 100644 index 0000000..b2cb337 --- /dev/null +++ b/app/src/main/res/drawable/ic_person_black_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/> +</vector> diff --git a/app/src/main/res/drawable/logos.png b/app/src/main/res/drawable/logos.png new file mode 100644 index 0000000..3c0eab9 Binary files /dev/null and b/app/src/main/res/drawable/logos.png differ diff --git a/app/src/main/res/font/acme.xml b/app/src/main/res/font/acme.xml new file mode 100644 index 0000000..b8c586d --- /dev/null +++ b/app/src/main/res/font/acme.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<font-family xmlns:app="http://schemas.android.com/apk/res-auto" + app:fontProviderAuthority="com.google.android.gms.fonts" + app:fontProviderPackage="com.google.android.gms" + app:fontProviderQuery="Acme" + app:fontProviderCerts="@array/com_google_android_gms_fonts_certs"> +</font-family> diff --git a/app/src/main/res/font/antic.xml b/app/src/main/res/font/antic.xml new file mode 100644 index 0000000..20c218f --- /dev/null +++ b/app/src/main/res/font/antic.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<font-family xmlns:app="http://schemas.android.com/apk/res-auto" + app:fontProviderAuthority="com.google.android.gms.fonts" + app:fontProviderPackage="com.google.android.gms" + app:fontProviderQuery="Antic" + app:fontProviderCerts="@array/com_google_android_gms_fonts_certs"> +</font-family> diff --git a/app/src/main/res/font/berkshire_swash.xml b/app/src/main/res/font/berkshire_swash.xml new file mode 100644 index 0000000..b2a4424 --- /dev/null +++ b/app/src/main/res/font/berkshire_swash.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<font-family xmlns:app="http://schemas.android.com/apk/res-auto" + app:fontProviderAuthority="com.google.android.gms.fonts" + app:fontProviderPackage="com.google.android.gms" + app:fontProviderQuery="Berkshire Swash" + app:fontProviderCerts="@array/com_google_android_gms_fonts_certs"> +</font-family> diff --git a/app/src/main/res/font/chivo_black_italic.xml b/app/src/main/res/font/chivo_black_italic.xml new file mode 100644 index 0000000..53c7c2f --- /dev/null +++ b/app/src/main/res/font/chivo_black_italic.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<font-family xmlns:app="http://schemas.android.com/apk/res-auto" + app:fontProviderAuthority="com.google.android.gms.fonts" + app:fontProviderPackage="com.google.android.gms" + app:fontProviderQuery="name=Chivo&weight=900&italic=1" + app:fontProviderCerts="@array/com_google_android_gms_fonts_certs"> +</font-family> diff --git a/app/src/main/res/layout/activity_detail_result.xml b/app/src/main/res/layout/activity_detail_result.xml new file mode 100644 index 0000000..0c395bd --- /dev/null +++ b/app/src/main/res/layout/activity_detail_result.xml @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="405dp"> + <LinearLayout + android:background="@color/design_default_color_background" + android:layout_width="match_parent" + android:layout_height="350dp" + android:orientation="vertical"> + <ImageView + android:id="@+id/app_logo" + android:layout_marginTop="45dp" + android:layout_gravity="center_horizontal" + android:layout_width="150dp" + android:layout_height="150dp"/> + <TextView + android:id="@+id/app_name" + android:layout_marginTop="10dp" + android:layout_gravity="center_horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Application name" + android:textColor="@color/colorPrimaryDark" + android:textStyle="bold" + android:textSize="21sp"/> + </LinearLayout> + + <androidx.cardview.widget.CardView + android:layout_width="358dp" + android:layout_height="104dp" + android:layout_centerHorizontal="true" + android:layout_marginTop="275dp"> + + <LinearLayout + android:id="@+id/status_card" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="horizontal" + android:weightSum="2"> + + <LinearLayout + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="2" + android:gravity="center" + android:orientation="vertical"> + + <TextView + android:id="@+id/status" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="#FFFFFF" + android:text="STATUS" + android:textSize="20sp" /> + + <TextView + android:id="@+id/malware_name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingTop="10dp" + android:text="Malware Name" + android:textColor="#FFFFFF" + android:textSize="20sp" + android:textStyle="bold" /> + + </LinearLayout> + + </LinearLayout> + </androidx.cardview.widget.CardView> + </RelativeLayout> + <TextView + android:textStyle="bold" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingLeft="20dp" + android:text="Keterangan Malware"/> + + <LinearLayout + android:layout_width="360dp" + android:layout_height="250dp" + android:orientation="vertical" + android:layout_gravity="center" + android:layout_marginTop="25dp"> + + <TextView + android:id="@+id/detail" + android:layout_gravity="center_vertical" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingLeft="20dp" + android:text="Lorem Ipsum"/> + + </LinearLayout> + +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_intro.xml b/app/src/main/res/layout/activity_intro.xml new file mode 100644 index 0000000..75473ba --- /dev/null +++ b/app/src/main/res/layout/activity_intro.xml @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".IntroActivity"> + + <androidx.viewpager.widget.ViewPager + android:id="@+id/screen_viewpager" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_marginBottom="8dp" + app:layout_constraintBottom_toTopOf="@+id/tab_indicator" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <Button + android:id="@+id/btn_next" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="32dp" + android:layout_marginRight="32dp" + android:layout_marginBottom="16dp" + android:background="#fff" + android:drawableRight="@drawable/ic_arrow_forward_black_24dp" + android:drawableTint="@color/gradient_start_color" + android:text="Next" + android:textColor="@color/gradient_start_color" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" /> + + <com.google.android.material.tabs.TabLayout + android:id="@+id/tab_indicator" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="32dp" + android:layout_marginLeft="32dp" + android:layout_marginEnd="8dp" + android:layout_marginRight="8dp" + android:layout_marginBottom="16dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/btn_next" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:tabBackground="@drawable/indicator_selector"> + + </com.google.android.material.tabs.TabLayout> + + <Button + android:visibility="invisible" + android:id="@+id/btn_get_started" + android:layout_width="132dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginLeft="8dp" + android:layout_marginEnd="8dp" + android:layout_marginRight="8dp" + android:layout_marginBottom="64dp" + android:background="@drawable/btn_gradient_style" + android:text="Get Started" + android:textColor="#fff" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" /> + + <TextView + android:textSize="16sp" + android:textStyle="bold" + android:textColor="#2d2d2d" + android:id="@+id/tv_skip" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="24dp" + android:layout_marginEnd="24dp" + android:layout_marginRight="24dp" + android:text="Skip" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..a3eed0c --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/container" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ProgressBar + android:id="@+id/progressBar" + style="?android:attr/progressBarStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/scan_layout" + android:layout_width="410dp" + android:layout_height="55dp" + android:background="?android:attr/windowBackground" + android:visibility="invisible" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent"> + + + <ImageView + android:id="@+id/clear" + android:layout_width="37dp" + android:layout_height="38dp" + android:layout_marginStart="64dp" + android:src="@drawable/ic_clear_black_24dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.47" /> + + <Button + android:id="@+id/btn_scan" + android:layout_width="133dp" + android:layout_height="37dp" + android:background="@drawable/btn_gradient_style" + android:text="Scan" + android:textColor="#fff" + android:visibility="visible" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + + <com.google.android.material.bottomnavigation.BottomNavigationView + android:id="@+id/nav_view" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="0dp" + android:layout_marginEnd="0dp" + android:background="?android:attr/windowBackground" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + android:visibility="visible" + app:menu="@menu/bottom_nav_menu" /> + + <fragment + android:id="@+id/nav_host_fragment" + android:name="androidx.navigation.fragment.NavHostFragment" + android:layout_width="0dp" + android:layout_height="0dp" + app:defaultNavHost="true" + app:layout_constraintBottom_toTopOf="@+id/nav_view" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0" + app:navGraph="@navigation/mobile_navigation" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_result.xml b/app/src/main/res/layout/activity_result.xml new file mode 100644 index 0000000..070ed28 --- /dev/null +++ b/app/src/main/res/layout/activity_result.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".ResultActivity"> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/rv_result" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:listitem="@layout/result_list" /> + + <include layout="@layout/layout_error" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_splashscreen.xml b/app/src/main/res/layout/activity_splashscreen.xml new file mode 100644 index 0000000..d57a7a2 --- /dev/null +++ b/app/src/main/res/layout/activity_splashscreen.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".SplashscreenActivity"> + + <ImageView + android:id="@+id/logo" + android:layout_width="0dp" + android:layout_height="271dp" + android:layout_marginTop="150dp" + android:src="@drawable/logos" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.565" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/txt_apps_name" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="36dp" + android:fontFamily="@font/chivo_black_italic" + android:text="NamaApps" + android:textAlignment="center" + android:textSize="55sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/logo" /> + + <TextView + android:id="@+id/txt_apps" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="12dp" + android:fontFamily="@font/antic" + android:text="Malware Detector Apps" + android:textAlignment="center" + android:textSize="18sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/txt_apps_name" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/app_layout.xml b/app/src/main/res/layout/app_layout.xml new file mode 100644 index 0000000..ece59c3 --- /dev/null +++ b/app/src/main/res/layout/app_layout.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="8dp" + android:layout_marginBottom="10dp" + android:gravity="center" + android:orientation="vertical"> + + <ImageView + android:id="@+id/icon_image" + android:layout_width="60dp" + android:layout_height="60dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <ImageView + android:id="@+id/imageCheck" + android:layout_width="20dp" + android:layout_height="20dp" + android:src="@drawable/ic_check_circle_black_24dp" + android:visibility="gone" + app:layout_constraintEnd_toEndOf="@+id/icon_image" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/titleTextView" + android:layout_width="100dp" + android:layout_height="20dp" + android:layout_marginTop="4dp" + android:gravity="center" + android:textSize="8sp" + android:textStyle="bold" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.498" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/icon_image" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml new file mode 100644 index 0000000..20ebff8 --- /dev/null +++ b/app/src/main/res/layout/fragment_account.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <TextView + android:id="@+id/text_account" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="8dp" + android:textAlignment="center" + android:textSize="20sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml new file mode 100644 index 0000000..55af52f --- /dev/null +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/griview" + android:numColumns="auto_fit" + android:gravity="center" + android:columnWidth="100dp" + android:layout_width="match_parent" + android:layout_height="match_parent"/> + + +</RelativeLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..fba9341 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <TextView + android:id="@+id/text_home" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="8dp" + android:textAlignment="center" + android:textSize="20sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/layout_error.xml b/app/src/main/res/layout/layout_error.xml new file mode 100644 index 0000000..ec12ed6 --- /dev/null +++ b/app/src/main/res/layout/layout_error.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/error_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:visibility="gone"> + + <ImageView + android:id="@+id/error_img" + android:layout_width="407dp" + android:layout_height="311dp" + android:layout_centerHorizontal="true" + android:layout_marginTop="64dp" + tools:srcCompat="@drawable/error" /> + + <TextView + android:id="@+id/error_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@+id/error_img" + android:layout_centerHorizontal="true" + android:layout_marginTop="4dp" + android:fontFamily="sans-serif-light" + android:text="Upps ! Something wrong here :(" + android:textSize="25dp" + android:textStyle="bold" /> + + <TextView + android:id="@+id/error_desc" + android:layout_width="383dp" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:layout_below="@+id/error_title" + android:layout_centerHorizontal="true" + android:text="Sometimes there are applications that cannot be scanned, such as Games and default applications." + android:textAlignment="center"/> + + <Button + android:id="@+id/back_btn" + android:layout_width="110dp" + android:layout_height="38dp" + android:layout_marginTop="19dp" + android:background="@color/cardview_dark_background" + android:layout_below="@+id/error_desc" + android:layout_centerHorizontal="true" + android:text="Back" + android:textColor="#FFFFFF"/> + + +</RelativeLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/layout_screen.xml b/app/src/main/res/layout/layout_screen.xml new file mode 100644 index 0000000..0806a41 --- /dev/null +++ b/app/src/main/res/layout/layout_screen.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <androidx.constraintlayout.widget.Guideline + android:id="@+id/guideline" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal" + app:layout_constraintGuide_percent="0.56882256" /> + + <TextView + android:id="@+id/intro_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginLeft="16dp" + android:layout_marginEnd="16dp" + android:layout_marginRight="16dp" + android:layout_marginBottom="8dp" + android:text="TextView" + android:textColor="@color/intro_title_color" + android:textSize="32dp" + android:textStyle="bold" + app:layout_constraintBottom_toTopOf="@+id/guideline" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@+id/guideline" /> + + <TextView + android:lineSpacingExtra="16dp" + android:id="@+id/intro_description" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="32dp" + android:layout_marginLeft="32dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="32dp" + android:layout_marginRight="32dp" + android:layout_marginBottom="8dp" + android:text="TextView" + android:textAlignment="center" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/intro_title" + app:layout_constraintVertical_bias="0.13" /> + + <ImageView + android:id="@+id/intro_img" + android:layout_width="wrap_content" + android:layout_height="222dp" + android:layout_marginStart="8dp" + android:layout_marginLeft="8dp" + android:layout_marginEnd="8dp" + android:layout_marginRight="8dp" + android:layout_marginBottom="32dp" + app:layout_constraintBottom_toTopOf="@+id/intro_title" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + tools:srcCompat="@tools:sample/avatars" /> + + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/result_list.xml b/app/src/main/res/layout/result_list.xml new file mode 100644 index 0000000..a49dc12 --- /dev/null +++ b/app/src/main/res/layout/result_list.xml @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:card_view="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/card_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_marginLeft="8dp" + android:layout_marginTop="4dp" + android:layout_marginRight="8dp" + android:layout_marginBottom="4dp" + card_view:cardCornerRadius="4dp"> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:padding="8dp"> + + <ImageView + android:id="@+id/img_item_photo" + android:layout_width="75dp" + android:layout_height="75dp" + android:layout_alignParentTop="true" + android:layout_marginTop="14dp" + android:layout_marginBottom="4dp" + android:scaleType="centerCrop" + tools:src="@color/colorAccent" /> + + <TextView + android:id="@+id/tv_item_name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="31dp" + android:layout_marginLeft="31dp" + android:layout_marginTop="16dp" + android:layout_marginRight="16dp" + android:layout_marginBottom="8dp" + android:layout_toEndOf="@id/img_item_photo" + android:layout_toRightOf="@id/img_item_photo" + android:textSize="16sp" + android:textStyle="bold" + tools:text="@string/apps_name" /> + + <TextView + android:id="@+id/tv_item_status" + android:layout_width="195dp" + android:layout_height="wrap_content" + android:layout_below="@id/tv_item_name" + android:layout_marginStart="36dp" + android:layout_marginLeft="36dp" + android:layout_marginTop="5dp" + android:layout_marginRight="16dp" + android:layout_toEndOf="@id/img_item_photo" + android:layout_toRightOf="@id/img_item_photo" + android:ellipsize="end" + android:maxLines="5" + android:textAlignment="center" + android:textStyle="bold" + tools:text="@string/app_status" /> + + <TextView + android:id="@+id/tv_item_malware" + android:layout_width="196dp" + android:layout_height="18dp" + android:layout_below="@+id/tv_item_status" + android:layout_marginStart="36dp" + android:layout_marginLeft="36dp" + android:layout_marginTop="4dp" + android:layout_marginRight="16dp" + android:layout_toEndOf="@id/img_item_photo" + android:layout_toRightOf="@id/img_item_photo" + android:ellipsize="end" + android:maxLines="5" + android:textAlignment="center" + tools:text="@string/app_malware" /> + + + <Button + android:id="@+id/btn_set_detail" + style="@style/Widget.AppCompat.Button.Colored" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@+id/tv_item_malware" + android:layout_marginStart="0dp" + android:layout_marginTop="6dp" + android:layout_toEndOf="@+id/img_item_photo" + android:text="@string/detail" + android:textSize="12sp" /> + </RelativeLayout> +</androidx.cardview.widget.CardView> diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..8417d1b --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + + <item + android:id="@+id/navigation_home" + android:icon="@drawable/ic_home_black_24dp" + android:title="@string/title_home" /> + + <item + android:id="@+id/navigation_dashboard" + android:icon="@drawable/ic_policy" + android:title="@string/title_scan" /> + + <item + android:id="@+id/navigation_account" + android:icon="@drawable/ic_person_black_24dp" + android:title="@string/title_account" /> + +</menu> diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/ic_launcher_background" /> + <foreground android:drawable="@drawable/ic_launcher_foreground" /> +</adaptive-icon> \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/ic_launcher_background" /> + <foreground android:drawable="@drawable/ic_launcher_foreground" /> +</adaptive-icon> \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..898f3ed Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..dffca36 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..64ba76f Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..dae5e08 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..e5ed465 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..14ed0af Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..b0907ca Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..d8ae031 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..2c18de9 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..beed3cd Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml new file mode 100644 index 0000000..d7f3dcf --- /dev/null +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<navigation xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/mobile_navigation" + app:startDestination="@+id/navigation_dashboard"> + + <fragment + android:id="@+id/navigation_home" + android:name="com.amsal.ta.ui.home.HomeFragment" + android:label="@string/title_home" + tools:layout="@layout/fragment_home" /> + + <fragment + android:id="@+id/navigation_dashboard" + android:name="com.amsal.ta.ui.dashboard.DashboardFragment" + android:label="@string/title_dashboard" + tools:layout="@layout/fragment_dashboard" /> + + <fragment + android:id="@+id/navigation_account" + android:name="com.amsal.ta.ui.account.AccountFragment" + android:label="@string/title_account" + tools:layout="@layout/fragment_account" /> +</navigation> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..3571589 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="colorPrimary">#03A9F4</color> + <color name="colorPrimaryDark">#0288D1</color> + <color name="colorAccent">#FF9800</color> + + <!--btn color--> + + <color name="gradient_start_color">#4c84ff</color> + <color name="gradient_end_color">#18a3fe</color> + + <color name="tab_indicator_gray">#c0c0c0</color> + <color name="intro_title_color">#000000</color> + <color name="intro_description_color">#656565</color> + + +</resources> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..47c8224 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ +<resources> + <!-- Default screen margins, per the Android Design guidelines. --> + <dimen name="activity_horizontal_margin">16dp</dimen> + <dimen name="activity_vertical_margin">16dp</dimen> +</resources> diff --git a/app/src/main/res/values/font_certs.xml b/app/src/main/res/values/font_certs.xml new file mode 100644 index 0000000..d2226ac --- /dev/null +++ b/app/src/main/res/values/font_certs.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <array name="com_google_android_gms_fonts_certs"> + <item>@array/com_google_android_gms_fonts_certs_dev</item> + <item>@array/com_google_android_gms_fonts_certs_prod</item> + </array> + <string-array name="com_google_android_gms_fonts_certs_dev"> + <item> + MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs= + </item> + </string-array> + <string-array name="com_google_android_gms_fonts_certs_prod"> + <item> + MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK + </item> + </string-array> +</resources> diff --git a/app/src/main/res/values/preloaded_fonts.xml b/app/src/main/res/values/preloaded_fonts.xml new file mode 100644 index 0000000..e1a2109 --- /dev/null +++ b/app/src/main/res/values/preloaded_fonts.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <array name="preloaded_fonts" translatable="false"> + <item>@font/acme</item> + <item>@font/antic</item> + <item>@font/berkshire_swash</item> + <item>@font/chivo_black_italic</item> + </array> +</resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..2047c9d --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,13 @@ +<resources> + <string name="app_name">TugasAkhir</string> + <string name="title_activity_main">MainActivity</string> + <string name="title_home">Home</string> + <string name="title_dashboard">Dashboard</string> + <string name="title_notifications">Notifications</string> + <string name="title_account">Account</string> + <string name="title_scan">Scan</string> + <string name="apps_name">Aplication Name</string> + <string name="app_status">Application Status</string> + <string name="app_malware">Malware Name</string> + <string name="detail">Detail</string> +</resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..bec8f4e --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> + <!-- Customize your theme here. --> + <item name="colorPrimary">@color/colorPrimary</item> + <item name="colorPrimaryDark">@color/colorPrimaryDark</item> + <item name="colorAccent">@color/colorAccent</item> + </style> + + <style name="NoTheme" parent="Theme.AppCompat.Light.NoActionBar"> + <!-- Customize your theme here. --> + <item name="colorPrimary">@color/colorPrimary</item> + <item name="colorPrimaryDark">@color/colorPrimaryDark</item> + <item name="colorAccent">@color/colorAccent</item> + </style> + +</resources> diff --git a/app/src/test/java/com/amsal/ta/ExampleUnitTest.java b/app/src/test/java/com/amsal/ta/ExampleUnitTest.java new file mode 100644 index 0000000..b9ffc66 --- /dev/null +++ b/app/src/test/java/com/amsal/ta/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.amsal.ta; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..2767571 --- /dev/null +++ b/build.gradle @@ -0,0 +1,29 @@ +ext { + var = "1.8" +}// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + google() + jcenter() + + } + dependencies { + classpath 'com.android.tools.build:gradle:3.5.3' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..199d16e --- /dev/null +++ b/gradle.properties @@ -0,0 +1,20 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..f6b961f Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..89ded30 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Apr 29 14:44:49 ICT 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..fa77947 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +include ':app' +rootProject.name='TA' -- libgit2 0.27.1