├── .gitignore ├── .gradle ├── 4.4 │ ├── fileChanges │ │ └── last-build.bin │ ├── fileContent │ │ └── fileContent.lock │ ├── fileHashes │ │ ├── fileHashes.bin │ │ ├── fileHashes.lock │ │ └── resourceHashesCache.bin │ ├── javaCompile │ │ ├── classAnalysis.bin │ │ ├── jarAnalysis.bin │ │ ├── javaCompile.lock │ │ ├── taskHistory.bin │ │ └── taskJars.bin │ └── taskHistory │ │ ├── taskHistory.bin │ │ └── taskHistory.lock └── buildOutputCleanup │ ├── buildOutputCleanup.lock │ ├── cache.properties │ └── outputFiles.bin ├── .idea ├── caches │ └── build_file_checksums.ser ├── codeStyles │ └── Project.xml ├── gradle.xml ├── libraries │ ├── Gradle__android_arch_core_common_1_1_0_jar.xml │ ├── Gradle__android_arch_core_runtime_1_1_0.xml │ ├── Gradle__android_arch_lifecycle_common_1_1_0_jar.xml │ ├── Gradle__android_arch_lifecycle_livedata_core_1_1_0.xml │ ├── Gradle__android_arch_lifecycle_runtime_1_1_0.xml │ ├── Gradle__android_arch_lifecycle_viewmodel_1_1_0.xml │ ├── Gradle__com_android_support_animated_vector_drawable_27_1_1.xml │ ├── Gradle__com_android_support_appcompat_v7_27_1_1.xml │ ├── Gradle__com_android_support_constraint_constraint_layout_1_1_0.xml │ ├── Gradle__com_android_support_constraint_constraint_layout_solver_1_1_0_jar.xml │ ├── Gradle__com_android_support_design_27_1_1.xml │ ├── Gradle__com_android_support_recyclerview_v7_27_1_1.xml │ ├── Gradle__com_android_support_support_annotations_27_1_1_jar.xml │ ├── Gradle__com_android_support_support_compat_27_1_1.xml │ ├── Gradle__com_android_support_support_core_ui_27_1_1.xml │ ├── Gradle__com_android_support_support_core_utils_27_1_1.xml │ ├── Gradle__com_android_support_support_fragment_27_1_1.xml │ ├── Gradle__com_android_support_support_media_compat_27_1_1.xml │ ├── Gradle__com_android_support_support_v4_27_1_1.xml │ ├── Gradle__com_android_support_support_vector_drawable_27_1_1.xml │ ├── Gradle__com_android_support_test_espresso_espresso_core_3_0_2.xml │ ├── Gradle__com_android_support_test_espresso_espresso_idling_resource_3_0_2.xml │ ├── Gradle__com_android_support_test_monitor_1_0_2.xml │ ├── Gradle__com_android_support_test_runner_1_0_2.xml │ ├── Gradle__com_android_support_transition_27_1_1.xml │ ├── Gradle__com_google_code_findbugs_jsr305_2_0_1_jar.xml │ ├── Gradle__com_squareup_javawriter_2_1_1_jar.xml │ ├── Gradle__javax_inject_javax_inject_1_jar.xml │ ├── Gradle__junit_junit_4_12_jar.xml │ ├── Gradle__net_sf_kxml_kxml2_2_3_0_jar.xml │ ├── Gradle__org_hamcrest_hamcrest_core_1_3_jar.xml │ ├── Gradle__org_hamcrest_hamcrest_integration_1_3_jar.xml │ └── Gradle__org_hamcrest_hamcrest_library_1_3_jar.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml ├── vcs.xml └── workspace.xml ├── LICENSE.md ├── NovaLauncherClone.iml ├── README.md ├── app ├── .gitignore ├── app.iml ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── simcoder │ │ └── novalauncherclone │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── simcoder │ │ │ └── novalauncherclone │ │ │ ├── AppAdapter.java │ │ │ ├── AppObject.java │ │ │ ├── MainActivity.java │ │ │ ├── PagerObject.java │ │ │ ├── SettingsActivity.java │ │ │ └── ViewPagerAdapter.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── activity_settings.xml │ │ ├── item_app.xml │ │ ├── item_pager.xml │ │ └── pager_layout.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── simcoder │ └── novalauncherclone │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── local.properties └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/libraries 5 | /.idea/modules.xml 6 | /.idea/workspace.xml 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | -------------------------------------------------------------------------------- /.gradle/4.4/fileChanges/last-build.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/4.4/fileContent/fileContent.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/4.4/fileContent/fileContent.lock -------------------------------------------------------------------------------- /.gradle/4.4/fileHashes/fileHashes.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/4.4/fileHashes/fileHashes.bin -------------------------------------------------------------------------------- /.gradle/4.4/fileHashes/fileHashes.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/4.4/fileHashes/fileHashes.lock -------------------------------------------------------------------------------- /.gradle/4.4/fileHashes/resourceHashesCache.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/4.4/fileHashes/resourceHashesCache.bin -------------------------------------------------------------------------------- /.gradle/4.4/javaCompile/classAnalysis.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/4.4/javaCompile/classAnalysis.bin -------------------------------------------------------------------------------- /.gradle/4.4/javaCompile/jarAnalysis.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/4.4/javaCompile/jarAnalysis.bin -------------------------------------------------------------------------------- /.gradle/4.4/javaCompile/javaCompile.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/4.4/javaCompile/javaCompile.lock -------------------------------------------------------------------------------- /.gradle/4.4/javaCompile/taskHistory.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/4.4/javaCompile/taskHistory.bin -------------------------------------------------------------------------------- /.gradle/4.4/javaCompile/taskJars.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/4.4/javaCompile/taskJars.bin -------------------------------------------------------------------------------- /.gradle/4.4/taskHistory/taskHistory.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/4.4/taskHistory/taskHistory.bin -------------------------------------------------------------------------------- /.gradle/4.4/taskHistory/taskHistory.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/4.4/taskHistory/taskHistory.lock -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/buildOutputCleanup.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/buildOutputCleanup/buildOutputCleanup.lock -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/cache.properties: -------------------------------------------------------------------------------- 1 | #Wed Apr 25 11:06:43 BST 2018 2 | gradle.version=4.4 3 | -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/outputFiles.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.gradle/buildOutputCleanup/outputFiles.bin -------------------------------------------------------------------------------- /.idea/caches/build_file_checksums.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimCoderYoutube/NovaLauncherClone/16610b8fe2aa147f34f22d8e7bada90544327b0c/.idea/caches/build_file_checksums.ser -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 15 | 16 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__android_arch_core_common_1_1_0_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__android_arch_core_runtime_1_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_0_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_animated_vector_drawable_27_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_appcompat_v7_27_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_constraint_constraint_layout_1_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_constraint_constraint_layout_solver_1_1_0_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_design_27_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_recyclerview_v7_27_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_support_annotations_27_1_1_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_support_compat_27_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_support_core_ui_27_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_support_core_utils_27_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_support_fragment_27_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_support_media_compat_27_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_support_v4_27_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_support_vector_drawable_27_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_test_espresso_espresso_core_3_0_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_test_espresso_espresso_idling_resource_3_0_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_test_monitor_1_0_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_test_runner_1_0_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_android_support_transition_27_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__com_squareup_javawriter_2_1_1_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__javax_inject_javax_inject_1_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__junit_junit_4_12_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2018 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /NovaLauncherClone.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NOVA_LAUNCHER_CLONE 2 | 3 | ▷ Create an android app like NOVA LAUNCHER 4 | 5 | ▷ Full Video Tutorial Playlist here: https://www.youtube.com/watch?v=tml0oqLyY78&list=PLxabZQCAe5fhGgSue40-_DjfFc_5EThhr
6 | 7 | ▷ Become a Patreon: https://www.patreon.com/simpleCoder
8 | ▷ Donate with PayPal: https://www.paypal.me/simcoder
9 | ▷ Twitter: https://twitter.com/S1mpleCoder
10 | ▷ GitHub : https://goo.gl/88FHk4
11 | 12 | ▷ If you have any question please ask, I'll try to answer to every question and even look at your code if that is necessary. 13 | 14 | 15 | **Important Links** 16 | ---- 17 | 18 | P.S: Check the branches for the most recent piece of code. I'm only going to merge everything to the master when the series is completed 19 | 20 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 27 5 | defaultConfig { 6 | applicationId "com.simcoder.novalauncherclone" 7 | minSdkVersion 15 8 | targetSdkVersion 27 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(dir: 'libs', include: ['*.jar']) 23 | implementation 'com.android.support:appcompat-v7:27.1.1' 24 | implementation 'com.android.support.constraint:constraint-layout:1.1.0' 25 | implementation 'com.android.support:design:27.1.1' 26 | testImplementation 'junit:junit:4.12' 27 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 28 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 29 | } 30 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/simcoder/novalauncherclone/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.simcoder.novalauncherclone; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.simcoder.novalauncherclone", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/simcoder/novalauncherclone/AppAdapter.java: -------------------------------------------------------------------------------- 1 | package com.simcoder.novalauncherclone; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.BaseAdapter; 9 | import android.widget.ImageView; 10 | import android.widget.LinearLayout; 11 | import android.widget.TextView; 12 | 13 | import java.util.List; 14 | 15 | public class AppAdapter extends BaseAdapter { 16 | Context context; 17 | List appList; 18 | int cellHeight; 19 | 20 | public AppAdapter(Context context, List appList, int cellHeight){ 21 | this.context = context; 22 | this.appList = appList; 23 | this.cellHeight = cellHeight; 24 | } 25 | @Override 26 | public int getCount() { 27 | return appList.size(); 28 | } 29 | 30 | @Override 31 | public Object getItem(int position) { 32 | return appList.get(position); 33 | } 34 | 35 | @Override 36 | public long getItemId(int position) { 37 | return position; 38 | } 39 | 40 | @Override 41 | public View getView(final int position, final View convertView, ViewGroup parent) { 42 | View v; 43 | if(convertView == null){ 44 | LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 45 | v = inflater.inflate(R.layout.item_app, parent, false); 46 | }else{ 47 | v = convertView; 48 | } 49 | 50 | LinearLayout mLayout = v.findViewById(R.id.layout); 51 | ImageView mImage = v.findViewById(R.id.image); 52 | TextView mLabel = v.findViewById(R.id.label); 53 | 54 | LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, cellHeight); 55 | mLayout.setLayoutParams(lp); 56 | 57 | mImage.setImageDrawable(appList.get(position).getImage()); 58 | mLabel.setText(appList.get(position).getName()); 59 | 60 | mLayout.setOnClickListener(new View.OnClickListener() { 61 | @Override 62 | public void onClick(View v) { 63 | ((MainActivity) context).itemPress(appList.get(position)); 64 | } 65 | }); 66 | mLayout.setOnLongClickListener(new View.OnLongClickListener() { 67 | @Override 68 | public boolean onLongClick(View v) { 69 | ((MainActivity) context).itemLongPress(appList.get(position)); 70 | return true; 71 | } 72 | }); 73 | return v; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/java/com/simcoder/novalauncherclone/AppObject.java: -------------------------------------------------------------------------------- 1 | package com.simcoder.novalauncherclone; 2 | 3 | import android.graphics.drawable.Drawable; 4 | 5 | public class AppObject { 6 | private String name, 7 | packageName; 8 | private Drawable image; 9 | private Boolean isAppInDrawer; 10 | 11 | public AppObject(String packageName, String name, Drawable image, Boolean isAppInDrawer){ 12 | this.name = name; 13 | this.packageName = packageName; 14 | this.image = image; 15 | this.isAppInDrawer = isAppInDrawer; 16 | } 17 | 18 | public String getPackageName(){return packageName;} 19 | public String getName(){return name;} 20 | public Drawable getImage(){return image;} 21 | public Boolean getIsAppInDrawer(){return isAppInDrawer;} 22 | 23 | public void setPackageName(String packageName){ 24 | this.packageName = packageName; 25 | } 26 | public void setName(String name){ 27 | this.name = name; 28 | } 29 | public void setImage(Drawable image){ 30 | this.image = image; 31 | } 32 | public void setIsAppInDrawer(Boolean image){ 33 | this.isAppInDrawer = isAppInDrawer; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/simcoder/novalauncherclone/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.simcoder.novalauncherclone; 2 | 3 | import android.Manifest; 4 | import android.content.Intent; 5 | import android.content.SharedPreferences; 6 | import android.content.pm.ResolveInfo; 7 | import android.graphics.Point; 8 | import android.graphics.drawable.Drawable; 9 | import android.net.Uri; 10 | import android.os.Build; 11 | import android.support.annotation.NonNull; 12 | import android.support.design.widget.BottomSheetBehavior; 13 | import android.support.v4.view.ViewPager; 14 | import android.support.v7.app.AppCompatActivity; 15 | import android.os.Bundle; 16 | import android.view.GestureDetector; 17 | import android.view.MotionEvent; 18 | import android.view.View; 19 | import android.view.WindowManager; 20 | import android.widget.GridView; 21 | import android.widget.ImageButton; 22 | import android.widget.ImageView; 23 | import android.widget.LinearLayout; 24 | import android.widget.Toast; 25 | 26 | import java.util.ArrayList; 27 | import java.util.List; 28 | 29 | public class MainActivity extends AppCompatActivity { 30 | ViewPager mViewPager; 31 | int cellHeight; 32 | 33 | int NUMBER_OF_ROWS = 5; 34 | int DRAWER_PEEK_HEIGHT = 100; 35 | String PREFS_NAME = "NovaPrefs"; 36 | 37 | int numRow = 0, numColumn = 0; 38 | 39 | @Override 40 | protected void onCreate(Bundle savedInstanceState) { 41 | super.onCreate(savedInstanceState); 42 | setContentView(R.layout.activity_main); 43 | getSupportActionBar().hide(); 44 | 45 | 46 | getPermissions(); 47 | getData(); 48 | 49 | final LinearLayout mTopDrawerLayout = findViewById(R.id.topDrawerLayout); 50 | mTopDrawerLayout.post(new Runnable() { 51 | @Override 52 | public void run() { 53 | DRAWER_PEEK_HEIGHT = mTopDrawerLayout.getHeight(); 54 | initializeHome(); 55 | initializeDrawer(); 56 | } 57 | }); 58 | 59 | ImageButton mSettings = findViewById(R.id.settings); 60 | mSettings.setOnClickListener(new View.OnClickListener() { 61 | @Override 62 | public void onClick(View v) { startActivity(new Intent(getApplicationContext(), SettingsActivity.class)); } 63 | }); 64 | } 65 | 66 | 67 | 68 | ViewPagerAdapter mViewPagerAdapter; 69 | private void initializeHome() { 70 | ArrayList pagerAppList = new ArrayList<>(); 71 | 72 | ArrayList appList1 = new ArrayList<>(); 73 | ArrayList appList2 = new ArrayList<>(); 74 | ArrayList appList3 = new ArrayList<>(); 75 | for (int i = 0; i < numColumn*numRow ;i++) 76 | appList1.add(new AppObject("", "", getResources().getDrawable(R.drawable.ic_launcher_foreground), false)); 77 | for (int i = 0; i < numColumn*numRow ;i++) 78 | appList2.add(new AppObject("", "", getResources().getDrawable(R.drawable.ic_launcher_foreground), false)); 79 | for (int i = 0; i < numColumn*numRow ;i++) 80 | appList3.add(new AppObject("", "", getResources().getDrawable(R.drawable.ic_launcher_foreground), false)); 81 | 82 | pagerAppList.add(new PagerObject(appList1)); 83 | pagerAppList.add(new PagerObject(appList2)); 84 | pagerAppList.add(new PagerObject(appList3)); 85 | 86 | cellHeight = (getDisplayContentHeight() - DRAWER_PEEK_HEIGHT) / numRow ; 87 | 88 | mViewPager = findViewById(R.id.viewPager); 89 | mViewPagerAdapter = new ViewPagerAdapter(this, pagerAppList, cellHeight, numColumn); 90 | mViewPager.setAdapter(mViewPagerAdapter); 91 | } 92 | 93 | List installedAppList = new ArrayList<>(); 94 | GridView mDrawerGridView; 95 | BottomSheetBehavior mBottomSheetBehavior; 96 | private void initializeDrawer() { 97 | View mBottomSheet =findViewById(R.id.bottomSheet); 98 | mDrawerGridView = findViewById(R.id.drawerGrid); 99 | mBottomSheetBehavior = BottomSheetBehavior.from(mBottomSheet); 100 | mBottomSheetBehavior.setHideable(false); 101 | mBottomSheetBehavior.setPeekHeight(DRAWER_PEEK_HEIGHT); 102 | 103 | installedAppList = getInstalledAppList(); 104 | 105 | mDrawerGridView.setAdapter(new AppAdapter(this, installedAppList, cellHeight)); 106 | 107 | mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { 108 | @Override 109 | public void onStateChanged(@NonNull View bottomSheet, int newState) { 110 | if(mAppDrag != null) 111 | return; 112 | 113 | if(newState == BottomSheetBehavior.STATE_COLLAPSED && mDrawerGridView.getChildAt(0).getY() != 0) 114 | mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); 115 | if(newState == BottomSheetBehavior.STATE_DRAGGING && mDrawerGridView.getChildAt(0).getY() != 0) 116 | mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 117 | } 118 | 119 | @Override 120 | public void onSlide(@NonNull View bottomSheet, float slideOffset) { 121 | } 122 | }); 123 | 124 | } 125 | 126 | 127 | 128 | public AppObject mAppDrag = null; 129 | public void itemPress(AppObject app){ 130 | if(mAppDrag != null && !app.getName().equals("")){ 131 | Toast.makeText(this,"Cell Already Occupied", Toast.LENGTH_SHORT).show(); 132 | return; 133 | } 134 | if(mAppDrag != null && !app.getIsAppInDrawer()){ 135 | 136 | app.setPackageName(mAppDrag.getPackageName()); 137 | app.setName(mAppDrag.getName()); 138 | app.setImage(mAppDrag.getImage()); 139 | app.setIsAppInDrawer(false); 140 | 141 | if(!mAppDrag.getIsAppInDrawer()){ 142 | mAppDrag.setPackageName(""); 143 | mAppDrag.setName(""); 144 | mAppDrag.setImage(getResources().getDrawable(R.drawable.ic_launcher_foreground)); 145 | mAppDrag.setIsAppInDrawer(false); 146 | } 147 | mAppDrag = null; 148 | mViewPagerAdapter.notifyGridChanged(); 149 | return; 150 | }else{ 151 | Intent launchAppIntent = getApplicationContext().getPackageManager().getLaunchIntentForPackage(app.getPackageName()); 152 | if (launchAppIntent != null) 153 | getApplicationContext().startActivity(launchAppIntent); 154 | } 155 | } 156 | 157 | public void itemLongPress(AppObject app){ 158 | collapseDrawer(); 159 | mAppDrag = app; 160 | } 161 | 162 | private void collapseDrawer() { 163 | mDrawerGridView.setY(DRAWER_PEEK_HEIGHT); 164 | mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); 165 | } 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | private List getInstalledAppList() { 174 | List list = new ArrayList<>(); 175 | 176 | Intent intent = new Intent(Intent.ACTION_MAIN, null); 177 | intent.addCategory(Intent.CATEGORY_LAUNCHER); 178 | List untreatedAppList = getApplicationContext().getPackageManager().queryIntentActivities(intent, 0); 179 | 180 | for(ResolveInfo untreatedApp : untreatedAppList){ 181 | String appName = untreatedApp.activityInfo.loadLabel(getPackageManager()).toString(); 182 | String appPackageName = untreatedApp.activityInfo.packageName; 183 | Drawable appImage = untreatedApp.activityInfo.loadIcon(getPackageManager()); 184 | 185 | AppObject app = new AppObject(appPackageName, appName, appImage, true); 186 | if (!list.contains(app)) 187 | list.add(app); 188 | } 189 | return list; 190 | } 191 | 192 | 193 | private int getDisplayContentHeight() { 194 | final WindowManager windowManager = getWindowManager(); 195 | final Point size = new Point(); 196 | int screenHeight = 0, actionBarHeight = 0, statusBarHeight = 0; 197 | if(getActionBar()!=null){ 198 | actionBarHeight = getActionBar().getHeight(); 199 | } 200 | 201 | int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 202 | if(resourceId > 0){ 203 | statusBarHeight = getResources().getDimensionPixelSize(resourceId); 204 | } 205 | int contentTop = (findViewById(android.R.id.content)).getTop(); 206 | windowManager.getDefaultDisplay().getSize(size); 207 | screenHeight = size.y; 208 | return screenHeight - contentTop - actionBarHeight - statusBarHeight; 209 | } 210 | 211 | 212 | private void getData(){ 213 | ImageView mHomeScreenImage = findViewById(R.id.homeScreenImage); 214 | SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 215 | String imageUri = sharedPreferences.getString("imageUri", null); 216 | int numRow = sharedPreferences.getInt("numRow", 7); 217 | int numColumn = sharedPreferences.getInt("numColumn", 5); 218 | 219 | if(this.numRow != numRow || this.numColumn != numColumn){ 220 | this.numRow = numRow; 221 | this.numColumn = numColumn; 222 | initializeHome(); 223 | } 224 | 225 | if(imageUri != null) 226 | mHomeScreenImage.setImageURI(Uri.parse(imageUri)); 227 | 228 | } 229 | private void getPermissions() { 230 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 231 | requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 232 | requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); 233 | } 234 | } 235 | 236 | @Override 237 | protected void onResume() { 238 | super.onResume(); 239 | getData(); 240 | } 241 | } 242 | -------------------------------------------------------------------------------- /app/src/main/java/com/simcoder/novalauncherclone/PagerObject.java: -------------------------------------------------------------------------------- 1 | package com.simcoder.novalauncherclone; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class PagerObject { 6 | private ArrayList appList; 7 | 8 | public PagerObject(ArrayList appList){ 9 | this.appList = appList; 10 | } 11 | 12 | public ArrayList getAppList() { 13 | return appList; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/simcoder/novalauncherclone/SettingsActivity.java: -------------------------------------------------------------------------------- 1 | package com.simcoder.novalauncherclone; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.content.SharedPreferences; 6 | import android.net.Uri; 7 | import android.support.v7.app.AppCompatActivity; 8 | import android.os.Bundle; 9 | import android.view.View; 10 | import android.widget.Button; 11 | import android.widget.EditText; 12 | import android.widget.ImageView; 13 | 14 | public class SettingsActivity extends AppCompatActivity { 15 | 16 | ImageView mHomeScreenImage; 17 | EditText mNumRow, mNumColumn; 18 | 19 | int REQUEST_CODE_IMAGE = 1; 20 | String PREFS_NAME = "NovaPrefs"; 21 | 22 | Uri imageUri; 23 | 24 | @Override 25 | protected void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | setContentView(R.layout.activity_settings); 28 | 29 | Button mHomeScreenButton = findViewById(R.id.homeScreenButton); 30 | Button mGridSizeButton = findViewById(R.id.gridSizeButton); 31 | 32 | mHomeScreenImage = findViewById(R.id.homeScreenImage); 33 | mNumRow = findViewById(R.id.numRow); 34 | mNumColumn = findViewById(R.id.numColumn); 35 | 36 | mGridSizeButton.setOnClickListener(new View.OnClickListener() { 37 | @Override 38 | public void onClick(View v) { 39 | saveData(); 40 | } 41 | }); 42 | 43 | 44 | mHomeScreenButton.setOnClickListener(new View.OnClickListener() { 45 | @Override 46 | public void onClick(View v) { 47 | Intent intent = new Intent(Intent.ACTION_PICK); 48 | intent.setType("image/*"); 49 | startActivityForResult(intent, REQUEST_CODE_IMAGE); 50 | } 51 | }); 52 | 53 | getData(); 54 | } 55 | 56 | private void getData(){ 57 | SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 58 | String imageUriString = sharedPreferences.getString("imageUri", null); 59 | int numRow = sharedPreferences.getInt("numRow", 7); 60 | int numColumn = sharedPreferences.getInt("numColumn", 5); 61 | 62 | if(imageUriString != null){ 63 | imageUri = Uri.parse(imageUriString); 64 | mHomeScreenImage.setImageURI(imageUri); 65 | } 66 | 67 | mNumRow.setText(String.valueOf(numRow)); 68 | mNumColumn.setText(String.valueOf(numColumn)); 69 | 70 | } 71 | 72 | private void saveData(){ 73 | SharedPreferences.Editor sharedPreferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit(); 74 | 75 | if(imageUri != null) 76 | sharedPreferences.putString("imageUri", imageUri.toString()); 77 | 78 | sharedPreferences.putInt("numRow", Integer.valueOf(mNumRow.getText().toString())); 79 | sharedPreferences.putInt("numColumn", Integer.valueOf(mNumColumn.getText().toString())); 80 | sharedPreferences.apply(); 81 | } 82 | 83 | @Override 84 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 85 | super.onActivityResult(requestCode, resultCode, data); 86 | if(requestCode == REQUEST_CODE_IMAGE && resultCode == Activity.RESULT_OK){ 87 | imageUri = data.getData(); 88 | mHomeScreenImage.setImageURI(imageUri); 89 | saveData(); 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /app/src/main/java/com/simcoder/novalauncherclone/ViewPagerAdapter.java: -------------------------------------------------------------------------------- 1 | package com.simcoder.novalauncherclone; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.NonNull; 5 | import android.support.v4.view.PagerAdapter; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.GridView; 10 | 11 | 12 | import java.util.ArrayList; 13 | 14 | public class ViewPagerAdapter extends PagerAdapter { 15 | 16 | Context context; 17 | ArrayList pagerAppList; 18 | int cellHeight, numColumn; 19 | ArrayList appAdapterList = new ArrayList<>(); 20 | 21 | public ViewPagerAdapter(Context context, ArrayList pagerAppList, int cellHeight, int numColumn){ 22 | this.context = context; 23 | this.pagerAppList = pagerAppList; 24 | this.cellHeight = cellHeight; 25 | this.numColumn = numColumn; 26 | } 27 | 28 | @NonNull 29 | @Override 30 | public Object instantiateItem(@NonNull ViewGroup container, int position) { 31 | LayoutInflater inflater = LayoutInflater.from(context); 32 | ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.pager_layout, container, false); 33 | 34 | final GridView mGridView = layout.findViewById(R.id.grid); 35 | mGridView.setNumColumns(numColumn); 36 | 37 | AppAdapter mGridAdapter = new AppAdapter(context, pagerAppList.get(position).getAppList(), cellHeight); 38 | mGridView.setAdapter(mGridAdapter); 39 | 40 | appAdapterList.add(mGridAdapter); 41 | 42 | container.addView(layout); 43 | return layout; 44 | } 45 | 46 | @Override 47 | public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { 48 | container.removeView((View) object); 49 | } 50 | 51 | @Override 52 | public int getCount() { 53 | return pagerAppList.size(); 54 | } 55 | 56 | @Override 57 | public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { 58 | return view == object; 59 | } 60 | 61 | public void notifyGridChanged(){ 62 | for(int i = 0; i < appAdapterList.size();i++){ 63 | appAdapterList.get(i).notifyDataSetChanged(); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 20 | 24 | 25 | 26 | 27 | 28 | 34 | 35 | 39 | 40 | 45 | 50 | 51 | 52 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 13 | 20 | 24 |