├── app ├── .gitignore ├── src │ ├── main │ │ ├── assets │ │ │ └── xposed_init │ │ ├── res │ │ │ ├── font │ │ │ │ └── digiface.ttf │ │ │ ├── drawable │ │ │ │ ├── ic_charge.png │ │ │ │ ├── ic_battery_1.png │ │ │ │ ├── ic_battery_2.png │ │ │ │ ├── ic_battery_3.png │ │ │ │ ├── ic_battery_4.png │ │ │ │ ├── ic_menu_call.png │ │ │ │ ├── ic_menu_set.png │ │ │ │ ├── ic_menu_sms.png │ │ │ │ ├── ic_sim_card1.png │ │ │ │ ├── ic_sim_card2.png │ │ │ │ ├── wallpaper_1.png │ │ │ │ ├── ic_menu_camera.png │ │ │ │ ├── ic_menu_contact.png │ │ │ │ ├── ic_menu_gallery.png │ │ │ │ ├── ic_settings_passwd.png │ │ │ │ ├── ic_volume_speaker_on.png │ │ │ │ ├── ic_volume_speaker_off.png │ │ │ │ ├── bg_selector.xml │ │ │ │ ├── dialog_rounded_bg.xml │ │ │ │ ├── menu_rounded_bg.xml │ │ │ │ ├── gridview_item_foreground_selector.xml │ │ │ │ ├── ic_video.xml │ │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── xml │ │ │ │ ├── device_admin.xml │ │ │ │ ├── backup_rules.xml │ │ │ │ ├── shortcuts.xml │ │ │ │ ├── data_extraction_rules.xml │ │ │ │ ├── preference_index.xml │ │ │ │ ├── preference_view.xml │ │ │ │ ├── preference_behaviour.xml │ │ │ │ └── preference_permission.xml │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ ├── ic_launcher_round.webp │ │ │ │ └── ic_launcher_background.webp │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ ├── ic_launcher_round.webp │ │ │ │ └── ic_launcher_background.webp │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ ├── ic_launcher_round.webp │ │ │ │ └── ic_launcher_background.webp │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ ├── ic_launcher_round.webp │ │ │ │ └── ic_launcher_background.webp │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ ├── ic_launcher_round.webp │ │ │ │ └── ic_launcher_background.webp │ │ │ ├── values │ │ │ │ ├── colors.xml │ │ │ │ ├── arrays.xml │ │ │ │ ├── attrs.xml │ │ │ │ ├── themes.xml │ │ │ │ └── preferences.xml │ │ │ ├── anim │ │ │ │ ├── fall_down.xml │ │ │ │ └── slide_up.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── layout │ │ │ │ ├── fragment_option.xml │ │ │ │ ├── gallery_item.xml │ │ │ │ ├── fragment_contacts_detail.xml │ │ │ │ ├── activity_listview.xml │ │ │ │ ├── single_textview_item.xml │ │ │ │ ├── preference_dialog_edittext.xml │ │ │ │ ├── dialog_custom.xml │ │ │ │ ├── fragment_dialer.xml │ │ │ │ ├── listview_item.xml │ │ │ │ ├── fragment_menu.xml │ │ │ │ ├── fragment_message.xml │ │ │ │ ├── dialog_stroke_text.xml │ │ │ │ ├── activity_settings.xml │ │ │ │ ├── fragment_contacts.xml │ │ │ │ ├── fragment_password.xml │ │ │ │ ├── fragment_camera.xml │ │ │ │ ├── fragment_about.xml │ │ │ │ ├── activity_volume.xml │ │ │ │ ├── activity_fragment.xml │ │ │ │ ├── activity_main_player.xml │ │ │ │ ├── fragment_gallery.xml │ │ │ │ └── activity_main_phone.xml │ │ │ ├── values-night │ │ │ │ └── themes.xml │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ └── values-zh-rCN │ │ │ │ └── strings.xml │ │ ├── ic_launcher-playstore.png │ │ ├── aidl │ │ │ └── com │ │ │ │ └── wtbruh │ │ │ │ └── fakelauncher │ │ │ │ └── IUserService.aidl │ │ ├── java │ │ │ ├── android │ │ │ │ └── app │ │ │ │ │ └── admin │ │ │ │ │ └── IDevicePolicyManager.java │ │ │ └── com │ │ │ │ └── wtbruh │ │ │ │ └── fakelauncher │ │ │ │ ├── xposed │ │ │ │ ├── SelfHook.java │ │ │ │ ├── SystemUIHook.java │ │ │ │ └── MainHook.java │ │ │ │ ├── receiver │ │ │ │ ├── DeviceAdminReceiver.java │ │ │ │ └── PowerConnectionReceiver.java │ │ │ │ ├── service │ │ │ │ └── UserService.java │ │ │ │ ├── ui │ │ │ │ ├── view │ │ │ │ │ ├── BaseAdapter.java │ │ │ │ │ └── SingleTextviewAdapter.java │ │ │ │ ├── fragment │ │ │ │ │ ├── phone │ │ │ │ │ │ ├── ContactDetailFragment.java │ │ │ │ │ │ ├── MessageFragment.java │ │ │ │ │ │ ├── OptionMenuFragment.java │ │ │ │ │ │ ├── PasswordFragment.java │ │ │ │ │ │ ├── DialerFragment.java │ │ │ │ │ │ ├── MenuFragment.java │ │ │ │ │ │ └── ContactsFragment.java │ │ │ │ │ ├── BaseFragment.java │ │ │ │ │ └── settings │ │ │ │ │ │ ├── SettingsFragment.java │ │ │ │ │ │ └── AboutFragment.java │ │ │ │ ├── widget │ │ │ │ │ ├── FitTextView.java │ │ │ │ │ └── StrokeTextView.java │ │ │ │ ├── BaseAppCompatActivity.java │ │ │ │ ├── preference │ │ │ │ │ └── SeekBarPreference.java │ │ │ │ └── VolumeActivity.java │ │ │ │ ├── ActivityShortcut.java │ │ │ │ ├── SplashActivity.java │ │ │ │ ├── utils │ │ │ │ ├── LogHelper.java │ │ │ │ ├── ApplicationHelper.java │ │ │ │ ├── TelephonyHelper.java │ │ │ │ ├── ScreenObserver.java │ │ │ │ └── ContentProvider.java │ │ │ │ ├── SettingsActivity.java │ │ │ │ └── SubActivity.java │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── wtbruh │ │ │ └── fakelauncher │ │ │ └── ExampleUnitTest.java │ └── androidTest │ │ └── java │ │ └── com │ │ └── wtbruh │ │ └── fakelauncher │ │ └── ExampleInstrumentedTest.java ├── testkey.jks ├── proguard-rules.pro └── build.gradle ├── docs ├── readme-assets │ ├── E1.jpg │ └── app-icon.png ├── README-ZH.md └── README.md ├── gradle ├── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties └── libs.versions.toml ├── keystore.properties ├── .gitignore ├── settings.gradle ├── .github └── workflows │ └── android.yml ├── gradle.properties ├── gradlew.bat └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /release 3 | /debug -------------------------------------------------------------------------------- /app/src/main/assets/xposed_init: -------------------------------------------------------------------------------- 1 | com.wtbruh.fakelauncher.xposed.MainHook -------------------------------------------------------------------------------- /app/testkey.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/testkey.jks -------------------------------------------------------------------------------- /docs/readme-assets/E1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/docs/readme-assets/E1.jpg -------------------------------------------------------------------------------- /docs/readme-assets/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/docs/readme-assets/app-icon.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/font/digiface.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/font/digiface.ttf -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_charge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_charge.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_battery_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_battery_1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_battery_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_battery_2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_battery_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_battery_3.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_battery_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_battery_4.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_call.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_menu_call.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_menu_set.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_sms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_menu_sms.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sim_card1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_sim_card1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sim_card2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_sim_card2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/wallpaper_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/wallpaper_1.png -------------------------------------------------------------------------------- /app/src/main/res/xml/device_admin.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /keystore.properties: -------------------------------------------------------------------------------- 1 | # Test key 2 | keyStoreFile=testkey.jks 3 | keyStorePassword=testkey 4 | keyAlias=testkey 5 | keyAliasPassword=testkey 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | .DS_Store 4 | .externalNativeBuild 5 | .cxx 6 | .idea 7 | build 8 | captures 9 | local.properties 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_menu_camera.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_contact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_menu_contact.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_gallery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_menu_gallery.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_passwd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_settings_passwd.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_volume_speaker_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_volume_speaker_on.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_volume_speaker_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/drawable/ic_volume_speaker_off.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZH-XiJun/fakelauncher/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FF000000 4 | #FFFFFFFF 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | android 5 | com.android.systemui 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/aidl/com/wtbruh/fakelauncher/IUserService.aidl: -------------------------------------------------------------------------------- 1 | // IUserService.aidl 2 | package com.wtbruh.fakelauncher; 3 | 4 | import android.os.Bundle; 5 | 6 | interface IUserService { 7 | Bundle runMultiCmd(in String[] cmd) = 1; 8 | void destroy() = 16777114; 9 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/fall_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_option.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Mar 11 13:32:58 CST 2025 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 5 | # Mirror in China Mainland 6 | # distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-bin.zip 7 | zipStoreBase=GRADLE_USER_HOME 8 | zipStorePath=wrapper/dists 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/gallery_item.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dialog_rounded_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_contacts_detail.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/menu_rounded_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /app/src/test/java/com/wtbruh/fakelauncher/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_listview.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/android/app/admin/IDevicePolicyManager.java: -------------------------------------------------------------------------------- 1 | package android.app.admin; 2 | 3 | import android.os.Binder; 4 | import android.os.IBinder; 5 | import android.os.IInterface; 6 | 7 | import androidx.annotation.Keep; 8 | 9 | @Keep 10 | public interface IDevicePolicyManager extends IInterface { 11 | @Keep 12 | abstract class Stub extends Binder implements IDevicePolicyManager { 13 | public static IDevicePolicyManager asInterface(IBinder obj) { 14 | throw new UnsupportedOperationException(); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/xml/backup_rules.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/gridview_item_foreground_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/single_textview_item.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_video.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/xml/shortcuts.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_dialog_edittext.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/xposed/SelfHook.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.xposed; 2 | 3 | import com.wtbruh.fakelauncher.utils.HookHelper; 4 | 5 | public class SelfHook extends HookHelper { 6 | private final static String TAG = SelfHook.class.getSimpleName(); 7 | 8 | @Override 9 | public void init() { 10 | // Hook myself if I'm activated 11 | findAndHookMethod("com.wtbruh.fakelauncher.MainActivity", "isXposedModuleActivated", new HookAction() { 12 | @Override 13 | protected void before(MethodHookParam param) { 14 | super.before(param); 15 | param.setResult(true); 16 | } 17 | }); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_custom.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 18 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | google { 4 | content { 5 | includeGroupByRegex("com\\.android.*") 6 | includeGroupByRegex("com\\.google.*") 7 | includeGroupByRegex("androidx.*") 8 | } 9 | } 10 | mavenCentral() 11 | gradlePluginPortal() 12 | } 13 | } 14 | dependencyResolutionManagement { 15 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 16 | repositories { 17 | google() 18 | mavenCentral() 19 | // Xposed API 20 | maven { url 'https://api.xposed.info/' } 21 | maven { url 'https://www.jitpack.io' } 22 | } 23 | } 24 | rootProject.name = "fakelauncher" 25 | include ':app' 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/receiver/DeviceAdminReceiver.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.receiver; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.util.Log; 6 | 7 | import androidx.annotation.NonNull; 8 | 9 | public class DeviceAdminReceiver extends android.app.admin.DeviceAdminReceiver { 10 | private final static String TAG = DeviceAdminReceiver.class.getSimpleName(); 11 | 12 | @Override 13 | public void onEnabled(@NonNull Context context, @NonNull Intent intent) { 14 | Log.d(TAG, "Device admin is enabled"); 15 | } 16 | 17 | @Override 18 | public void onDisabled(@NonNull Context context, @NonNull Intent intent) { 19 | Log.d(TAG, "Device admin is disabled"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.service; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | 6 | import androidx.annotation.Keep; 7 | 8 | import com.wtbruh.fakelauncher.IUserService; 9 | import com.wtbruh.fakelauncher.utils.PrivilegeProvider; 10 | 11 | public class UserService extends IUserService.Stub { 12 | 13 | @Keep 14 | public UserService() { 15 | 16 | } 17 | 18 | @Keep 19 | public UserService(Context context) { 20 | 21 | } 22 | 23 | @Override 24 | public Bundle runMultiCmd(String[] cmd) { 25 | return PrivilegeProvider.runCommand(PrivilegeProvider.PRIVILEGE_NORMAL, cmd); 26 | } 27 | 28 | @Override 29 | public void destroy() { 30 | System.exit(0); 31 | } 32 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 11 | 12 | 15 | 16 | 19 | -------------------------------------------------------------------------------- /.github/workflows/android.yml: -------------------------------------------------------------------------------- 1 | name: Android CI 2 | 3 | on: 4 | push: 5 | branches: [ "master" ] 6 | pull_request: 7 | branches: [ "master" ] 8 | workflow_dispatch: 9 | 10 | jobs: 11 | build: 12 | 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v4 17 | 18 | - name: set up JDK 17 19 | uses: actions/setup-java@v4 20 | with: 21 | java-version: '17' 22 | distribution: 'temurin' 23 | cache: gradle 24 | 25 | - name: Grant execute permission for gradlew 26 | run: chmod +x gradlew 27 | 28 | - name: Build with Gradle 29 | run: ./gradlew :app:assembleDebug --daemon --parallel 30 | 31 | - name: Upload artifact 32 | uses: actions/upload-artifact@v4 33 | with: 34 | name: app-debug 35 | path: app/build/outputs/apk/debug/app-debug.apk 36 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/wtbruh/fakelauncher/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | assertEquals("com.wtbruh.fakelauncher", appContext.getPackageName()); 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_dialer.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/listview_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 17 | 18 | 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/receiver/PowerConnectionReceiver.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.receiver; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.text.TextUtils; 7 | 8 | import com.wtbruh.fakelauncher.MainActivity; 9 | 10 | /** 11 | * Power connection status receiver
12 | * 获取电源连接状态相关广播的广播接收器 13 | */ 14 | 15 | public class PowerConnectionReceiver extends BroadcastReceiver { 16 | 17 | private getStat stat; 18 | 19 | @Override 20 | public void onReceive(Context context, Intent intent) { 21 | String action = intent.getAction(); 22 | if (TextUtils.isEmpty(action)) { 23 | return; 24 | } 25 | stat.getConnectionStatus(action); 26 | } 27 | 28 | public interface getStat { 29 | void getConnectionStatus(String str); 30 | } 31 | 32 | public void setStat (getStat str) { 33 | this.stat = str; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/ui/view/BaseAdapter.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.ui.view; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.view.View; 5 | 6 | import androidx.annotation.NonNull; 7 | import androidx.recyclerview.widget.RecyclerView; 8 | 9 | public abstract class BaseAdapter extends RecyclerView.Adapter{ 10 | public static class ViewHolder extends RecyclerView.ViewHolder { 11 | @SuppressLint("ClickableViewAccessibility") 12 | public ViewHolder(@NonNull View itemView) { 13 | super(itemView); 14 | } 15 | } 16 | 17 | @Override 18 | public void onBindViewHolder(@NonNull ViewHolder holder, int position) { 19 | holder.itemView.setSelected(position == mSelectedPosition); 20 | } 21 | 22 | private int mSelectedPosition = 0; 23 | 24 | public void setSelectedPosition(int position) { 25 | int oldPosition = mSelectedPosition; 26 | mSelectedPosition = position; 27 | notifyItemChanged(oldPosition); 28 | notifyItemChanged(position); 29 | } 30 | 31 | public int getSelectedPosition() { 32 | return mSelectedPosition; 33 | } 34 | 35 | 36 | 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/ui/fragment/phone/ContactDetailFragment.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.ui.fragment.phone; 2 | 3 | import android.os.Bundle; 4 | import android.view.KeyEvent; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import com.wtbruh.fakelauncher.R; 10 | import com.wtbruh.fakelauncher.ui.fragment.BaseFragment; 11 | 12 | public class ContactDetailFragment extends BaseFragment { 13 | public static ContactDetailFragment newInstance() { 14 | return new ContactDetailFragment(); 15 | } 16 | 17 | @Override 18 | public void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | } 21 | 22 | @Override 23 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 24 | Bundle savedInstanceState) { 25 | rootView = inflater.inflate(R.layout.fragment_contacts_detail, container, false); 26 | init(); 27 | return rootView; 28 | } 29 | 30 | @Override 31 | public boolean onKeyUp(int keyCode, KeyEvent event) { 32 | return false; 33 | } 34 | 35 | private void init() { 36 | 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 21 | 22 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/xml/preference_index.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 12 | 16 | 20 | 24 | 28 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. For more details, visit 12 | # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app's APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Enables namespacing of each library's R class so that its R class includes only the 19 | # resources declared in the library itself and none from the library's dependencies, 20 | # thereby reducing the size of the R class for that library 21 | android.nonTransitiveRClass=true -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_message.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/ActivityShortcut.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | 6 | import androidx.appcompat.app.AppCompatActivity; 7 | import androidx.core.content.pm.ShortcutInfoCompat; 8 | import androidx.core.content.pm.ShortcutManagerCompat; 9 | import androidx.core.graphics.drawable.IconCompat; 10 | 11 | import java.util.Objects; 12 | 13 | public class ActivityShortcut extends AppCompatActivity { 14 | @Override 15 | protected void onCreate(Bundle b) { 16 | super.onCreate(b); 17 | if (Objects.equals(getIntent().getAction(), Intent.ACTION_CREATE_SHORTCUT)) { 18 | Intent intent = new Intent(this, SplashActivity.class).setAction(Intent.ACTION_MAIN); 19 | 20 | setResult(RESULT_OK, 21 | ShortcutManagerCompat.createShortcutResultIntent(this, 22 | new ShortcutInfoCompat.Builder(this, "fakeUI") 23 | .setIntent(intent) 24 | .setIcon(IconCompat.createWithResource(this, R.mipmap.ic_launcher_round)) 25 | .setShortLabel(getString(R.string.shortcut_name)) 26 | .build() 27 | )); 28 | } 29 | finish(); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/ui/widget/FitTextView.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.ui.widget; 2 | 3 | import android.content.Context; 4 | import android.text.TextPaint; 5 | import android.util.AttributeSet; 6 | 7 | import androidx.annotation.NonNull; 8 | import androidx.annotation.Nullable; 9 | import androidx.core.widget.TextViewCompat; 10 | 11 | public class FitTextView extends androidx.appcompat.widget.AppCompatTextView { 12 | 13 | public FitTextView(@NonNull Context context) { 14 | super(context); 15 | } 16 | 17 | public FitTextView(@NonNull Context context, @Nullable AttributeSet attrs) { 18 | super(context, attrs); 19 | } 20 | 21 | public FitTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 22 | super(context, attrs, defStyleAttr); 23 | } 24 | 25 | public void fitWidth() { 26 | TextPaint paint = getLayout().getPaint(); 27 | getLayoutParams().width = (int) (paint.measureText((String) getText()) + getPaddingStart() + getPaddingEnd()); 28 | requestLayout(); 29 | } 30 | 31 | public void fitHeight() { 32 | TextViewCompat.setAutoSizeTextTypeWithDefaults(this, TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE); 33 | getLayoutParams().height = (int) (getTextSize() + getPaddingTop() + getPaddingBottom() + 10); 34 | requestLayout(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_stroke_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 21 | 22 | 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/SplashActivity.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.os.Bundle; 7 | import android.os.Vibrator; 8 | 9 | import androidx.appcompat.app.AppCompatActivity; 10 | import androidx.preference.PreferenceManager; 11 | 12 | import com.wtbruh.fakelauncher.ui.fragment.settings.SubSettingsFragment; 13 | import com.wtbruh.fakelauncher.utils.UIHelper; 14 | 15 | @SuppressLint("CustomSplashScreen") 16 | public class SplashActivity extends AppCompatActivity { 17 | 18 | @Override 19 | protected void onCreate(Bundle b) { 20 | super.onCreate(b); 21 | // Disable touch screen 22 | UIHelper.setTouchscreenState(false, this); 23 | // Launch fake ui with flags 24 | startActivity(new Intent() 25 | .setClass(SplashActivity.this, MainActivity.class) 26 | .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK)); 27 | // Vibrate after fake ui being launched 28 | if (PreferenceManager.getDefaultSharedPreferences(SplashActivity.this).getBoolean(SubSettingsFragment.PREF_VIBRATE_ON_START,true)) { 29 | Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 30 | vibrator.vibrate(200); 31 | } 32 | finish(); 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/xposed/SystemUIHook.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.xposed; 2 | 3 | import com.wtbruh.fakelauncher.utils.HookHelper; 4 | 5 | import java.lang.reflect.Method; 6 | 7 | import de.robv.android.xposed.XC_MethodHook; 8 | 9 | public class SystemUIHook extends HookHelper { 10 | String TAG = PinningHook.class.getSimpleName(); 11 | @Override 12 | public void init() { 13 | // 不要屏幕固定那个toast 14 | Class ScreenPinningNotify = findClassIfExists("com.android.systemui.navigationbar.ScreenPinningNotify"); 15 | if (ScreenPinningNotify != null) { 16 | Method[] methods = ScreenPinningNotify.getDeclaredMethods(); 17 | for (Method method : methods) { 18 | switch (method.getName()) { 19 | case "showPinningStartToast": 20 | case "showPinningExitToast": 21 | case "showEscapeToast": 22 | if (method.getReturnType().equals(void.class)) hookToast(method); 23 | } 24 | } 25 | } 26 | } 27 | 28 | public void hookToast(Method method) { 29 | hookMethod(method, 30 | new HookAction() { 31 | @Override 32 | protected void before(XC_MethodHook.MethodHookParam param) { 33 | param.setResult(null); 34 | } 35 | } 36 | ); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 22 | 23 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/utils/LogHelper.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.utils; 2 | 3 | import de.robv.android.xposed.XposedBridge; 4 | 5 | public class LogHelper { 6 | public static final String hookMain = "[FakeLauncher]"; 7 | public static final String mHook = "[FakeLauncher:"; 8 | public static final String mode = "]"; 9 | 10 | public static void logI(String tag, String Log) { 11 | XposedBridge.log(hookMain + "[" + tag + "]: " + "I: " + Log); 12 | } 13 | 14 | public static void logI(String name, String tag, String Log) { 15 | XposedBridge.log(mHook + name + mode + "[" + tag + "]: " + "I: " + Log); 16 | } 17 | 18 | public static void logW(String tag, String Log) { 19 | XposedBridge.log(hookMain + "[" + tag + "]: " + "W: " + Log); 20 | } 21 | 22 | public static void logE(String tag, String Log) { 23 | XposedBridge.log(hookMain + "[" + tag + "]: " + "E: " + Log); 24 | } 25 | 26 | public static void logSI(String name, String tag, String log) { 27 | android.util.Log.i(mHook + name + mode, "[" + tag + "]: I: " + log); 28 | } 29 | 30 | public static void logSI(String tag, String log) { 31 | android.util.Log.i(hookMain, "[" + tag + "]: I: " + log); 32 | } 33 | 34 | public static void logSW(String tag, String log) { 35 | android.util.Log.w(hookMain, "[" + tag + "]: W: " + log); 36 | } 37 | 38 | public void logSE(String tag, String log) { 39 | android.util.Log.e(hookMain, "[" + tag + "]: E: " + log); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/ui/BaseAppCompatActivity.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.ui; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.pm.ActivityInfo; 5 | import android.os.Bundle; 6 | import android.view.KeyEvent; 7 | 8 | import androidx.appcompat.app.AppCompatActivity; 9 | 10 | import com.wtbruh.fakelauncher.utils.UIHelper; 11 | 12 | /** 13 | * 继承AppCompatActivity,添加自己的代码,并让其他Activity继承自己 14 | */ 15 | public class BaseAppCompatActivity extends AppCompatActivity { 16 | 17 | @SuppressLint("SourceLockedOrientationActivity") 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | 22 | // Lock screen orientation to portrait 23 | // 锁定竖屏 24 | setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 25 | } 26 | 27 | @Override 28 | protected void onPause() { 29 | // Disable transition anim 30 | // 去掉过渡动画 31 | overridePendingTransition(0, 0); 32 | super.onPause(); 33 | } 34 | 35 | @Override 36 | public boolean onKeyDown(int keyCode, KeyEvent event) { 37 | return switch (keyCode) { 38 | // Volume key interruption 39 | // 音量键拦截 40 | case KeyEvent.KEYCODE_VOLUME_UP, KeyEvent.KEYCODE_VOLUME_DOWN -> { 41 | UIHelper.intentStarter(this, VolumeActivity.class); 42 | // 阻止系统音量面板弹出 43 | yield true; 44 | } 45 | default -> super.onKeyDown(keyCode, event); 46 | }; 47 | } 48 | 49 | 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/res/xml/preference_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 16 | 22 | 26 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_contacts.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 26 | 27 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/xposed/MainHook.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.xposed; 2 | 3 | import com.wtbruh.fakelauncher.utils.HookHelper; 4 | import com.wtbruh.fakelauncher.utils.LogHelper; 5 | 6 | import de.robv.android.xposed.IXposedHookLoadPackage; 7 | import de.robv.android.xposed.IXposedHookZygoteInit; 8 | import de.robv.android.xposed.XC_MethodHook; 9 | import de.robv.android.xposed.XposedHelpers; 10 | import de.robv.android.xposed.callbacks.XC_LoadPackage; 11 | 12 | public class MainHook extends LogHelper implements IXposedHookLoadPackage, IXposedHookZygoteInit { 13 | public static String modulePath; 14 | private final static String TAG = MainHook.class.getSimpleName(); 15 | 16 | public static void initHook(HookHelper hook, XC_LoadPackage.LoadPackageParam lpparam) { 17 | hook.runHook(lpparam); 18 | } 19 | 20 | @Override 21 | public void initZygote(IXposedHookZygoteInit.StartupParam startupParam) { 22 | modulePath = startupParam.modulePath; 23 | } 24 | @Override 25 | public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) { 26 | // hook method 27 | switch (lpparam.packageName) { 28 | case "android": 29 | initHook(new PinningHook(), lpparam); 30 | logI(TAG, "Android framework hooked"); 31 | break; 32 | case "com.android.systemui": 33 | initHook(new SystemUIHook(), lpparam); 34 | logI(TAG, "Android SystemUI hooked"); 35 | break; 36 | case "com.wtbruh.fakelauncher": 37 | initHook(new SelfHook(), lpparam); 38 | logI(TAG, "Hooked myself"); 39 | break; 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/utils/ApplicationHelper.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.utils; 2 | 3 | import android.app.Activity; 4 | import android.app.Application; 5 | import android.os.Bundle; 6 | import android.util.Log; 7 | 8 | import androidx.annotation.NonNull; 9 | import androidx.annotation.Nullable; 10 | 11 | public class ApplicationHelper extends Application { 12 | 13 | public static String topActivity; 14 | private final static String TAG = ApplicationHelper.class.getSimpleName(); 15 | 16 | @Override 17 | public void onCreate() { 18 | super.onCreate(); 19 | registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { 20 | @Override 21 | public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { 22 | 23 | } 24 | 25 | @Override 26 | public void onActivityStarted(@NonNull Activity activity) { 27 | 28 | } 29 | 30 | @Override 31 | public void onActivityResumed(@NonNull Activity activity) { 32 | topActivity = activity.toString(); 33 | } 34 | 35 | @Override 36 | public void onActivityPaused(@NonNull Activity activity) { 37 | topActivity = ""; 38 | } 39 | 40 | @Override 41 | public void onActivityStopped(@NonNull Activity activity) { 42 | 43 | } 44 | 45 | @Override 46 | public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) { 47 | 48 | } 49 | 50 | @Override 51 | public void onActivityDestroyed(@NonNull Activity activity) { 52 | 53 | } 54 | }); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/utils/TelephonyHelper.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.utils; 2 | 3 | import android.Manifest; 4 | import android.content.Context; 5 | import android.telephony.SubscriptionInfo; 6 | import android.telephony.SubscriptionManager; 7 | import android.telephony.TelephonyManager; 8 | import android.util.Log; 9 | 10 | import com.wtbruh.fakelauncher.R; 11 | 12 | public class TelephonyHelper { 13 | private Context context; 14 | private final TelephonyManager mTelephonyManager; 15 | private final SubscriptionManager mSubscriptionManager; 16 | private final static String TAG = TelephonyHelper.class.getSimpleName(); 17 | private final static String OPERATOR_CHINA_MOBILE = "46000"; 18 | private final static String OPERATOR_CHINA_MOBILE_2 = "46002"; 19 | private final static String OPERATOR_CHINA_UNICOM = "46001"; 20 | private final static String OPERATOR_CHINA_TELECOM = "46003"; 21 | 22 | public TelephonyHelper(Context context) { 23 | this.context = context; 24 | mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 25 | mSubscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); 26 | } 27 | 28 | public String getProvidersName(int sub) { 29 | if (! PrivilegeProvider.checkPermission(context,Manifest.permission.READ_PHONE_STATE)) { 30 | Log.d(TAG, "No permission READ_PHONE_STATE!!!"); 31 | return context.getResources().getString(R.string.sim_removed); 32 | } 33 | SubscriptionInfo sub0 = mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(sub); 34 | if (sub0 == null) return context.getResources().getString(R.string.sim_removed); 35 | return String.valueOf(sub0.getDisplayName()); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_password.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 18 | 19 | 24 | 25 | 37 | 38 | 46 | 47 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_camera.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 16 | 17 | 27 | 28 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/xml/preference_behaviour.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 13 | 19 | 25 | 28 | 33 | 38 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/values/preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | None 6 | Root 7 | Shizuku 8 | 9 | 10 | 11 | None 12 | Root 13 | 14 | 15 | 16 | @string/pref_provider_none 17 | @string/pref_provider_root 18 | @string/pref_provider_shizuku 19 | 20 | 21 | 22 | @string/pref_provider_none 23 | @string/pref_provider_root 24 | 25 | 26 | None 27 | 28 | 29 | 30 | phone 31 | player 32 | 33 | 34 | 35 | @string/pref_style_phone 36 | @string/pref_style_player 37 | 38 | 39 | phone 40 | 41 | 42 | 43 | dpad 44 | dialer 45 | passwd 46 | 47 | 48 | 49 | @string/pref_exit_dpad 50 | @string/pref_exit_dialer 51 | @string/pref_exit_password 52 | 53 | 54 | dpad 55 | 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/ui/fragment/phone/MessageFragment.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.ui.fragment.phone; 2 | 3 | import android.os.Bundle; 4 | 5 | import androidx.fragment.app.Fragment; 6 | 7 | import android.view.KeyEvent; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | 12 | import com.wtbruh.fakelauncher.R; 13 | import com.wtbruh.fakelauncher.ui.fragment.BaseFragment; 14 | 15 | /** 16 | * A simple {@link Fragment} subclass. 17 | * Use the {@link MessageFragment#newInstance} factory method to 18 | * create an instance of this fragment. 19 | */ 20 | public class MessageFragment extends BaseFragment { 21 | 22 | public static final String URI_HEADER = "content://sms/"; 23 | public static final String PATH_INBOX = "inbox"; 24 | public static final String PATH_SEND = "sent"; 25 | public static final String PATH_DRAFT = "draft"; 26 | public static final String PATH_OUTBOX = "outbox"; 27 | public static final String PATH_FAILED = "failed"; 28 | public static final String PATH_QUEUED = "queued"; 29 | 30 | public MessageFragment() { 31 | // Required empty public constructor 32 | } 33 | 34 | public static MessageFragment newInstance() { 35 | return new MessageFragment(); 36 | } 37 | 38 | @Override 39 | public void onCreate(Bundle savedInstanceState) { 40 | super.onCreate(savedInstanceState); 41 | } 42 | 43 | @Override 44 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 45 | Bundle savedInstanceState) { 46 | // Inflate the layout for this fragment 47 | rootView = inflater.inflate(R.layout.fragment_message, container, false); 48 | init(); 49 | return rootView; 50 | } 51 | 52 | @Override 53 | public boolean onKeyUp(int keyCode, KeyEvent event) { 54 | return false; 55 | } 56 | 57 | private void init() { 58 | // todo:Message 59 | setFooterBar(L_EMPTY); 60 | readSMS(); 61 | } 62 | 63 | private void readSMS() { 64 | } 65 | } -------------------------------------------------------------------------------- /app/src/main/res/xml/preference_permission.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 11 | 15 | 16 | 17 | 20 | 26 | 30 | 34 | 38 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/ui/fragment/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.ui.fragment; 2 | 3 | import android.view.KeyEvent; 4 | import android.view.View; 5 | 6 | import androidx.fragment.app.Fragment; 7 | 8 | import com.wtbruh.fakelauncher.R; 9 | import com.wtbruh.fakelauncher.SubActivity; 10 | 11 | public abstract class BaseFragment extends Fragment { 12 | 13 | public final static String LEFT_BTN = "l"; 14 | public final static String RIGHT_BTN = "r"; 15 | public final static String CENTER_BTN = "c"; 16 | 17 | public final static String[] L_DEFAULT = {LEFT_BTN, String.valueOf(R.string.common_leftButton)}; 18 | public final static String[] L_EMPTY = {LEFT_BTN, "-1"}; 19 | public final static String[] L_OPTION = {LEFT_BTN, String.valueOf(R.string.option_leftButton)}; 20 | public final static String[] L_SAVE = {LEFT_BTN, String.valueOf(R.string.save_leftButton)}; 21 | public final static String[] R_DEFAULT = {RIGHT_BTN, String.valueOf(R.string.common_rightButton)}; 22 | public final static String[] R_EDITTEXT = {RIGHT_BTN, String.valueOf(R.string.edittext_rightButton)}; 23 | public final static String[] R_EMPTY = {RIGHT_BTN, "-1"}; 24 | public final static String[] C_PLAY = {CENTER_BTN, String.valueOf(R.string.play_centerButton)}; 25 | public final static String[] C_PAUSE = {CENTER_BTN, String.valueOf(R.string.pause_centerButton)}; 26 | public final static String[] C_RESUME = {CENTER_BTN, String.valueOf(R.string.resume_centerButton)}; 27 | public final static String[] C_STOP = {CENTER_BTN, String.valueOf(R.string.stop_centerButton)}; 28 | public final static String[] C_SHOOT = {CENTER_BTN, String.valueOf(R.string.shoot_centerButton)}; 29 | public final static String[] C_RECORD = {CENTER_BTN, String.valueOf(R.string.record_centerButton)}; 30 | 31 | public View rootView; 32 | public abstract boolean onKeyUp(int keyCode, KeyEvent event); 33 | 34 | public void setFooterBar(String[]... texts) { 35 | requireSubActivity().setFooterBar(texts); 36 | } 37 | 38 | public SubActivity requireSubActivity() { 39 | return ((SubActivity) requireActivity()); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/ui/fragment/settings/SettingsFragment.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.ui.fragment.settings; 2 | 3 | import android.os.Bundle; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.annotation.Nullable; 7 | import androidx.preference.Preference; 8 | import androidx.preference.PreferenceFragmentCompat; 9 | 10 | import com.wtbruh.fakelauncher.R; 11 | import com.wtbruh.fakelauncher.SettingsActivity; 12 | import com.wtbruh.fakelauncher.utils.UIHelper; 13 | 14 | public class SettingsFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener { 15 | 16 | public final static String FUN = "fun"; 17 | public final static String PAGE = "page"; 18 | 19 | public final static String PAGE_PERMISSION = "page_permission"; 20 | public final static String PAGE_VIEW = "page_view"; 21 | public final static String PAGE_BEHAVIOUR = "page_behaviour"; 22 | public final static String PAGE_ABOUT = "page_about"; 23 | public final static String FUN_OPEN_FAKEUI = "fun_fakeui"; 24 | public final static String FUN_TOUCH = "fun_touch"; 25 | 26 | 27 | @Override 28 | public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) { 29 | setPreferencesFromResource(R.xml.preference_index, rootKey); 30 | String[] pages = { 31 | FUN_OPEN_FAKEUI, 32 | FUN_TOUCH, 33 | PAGE_PERMISSION, 34 | PAGE_VIEW, 35 | PAGE_BEHAVIOUR, 36 | PAGE_ABOUT 37 | }; 38 | Preference pref = findPreference(FUN_TOUCH); 39 | if (pref != null) pref.setVisible(!UIHelper.getTouchscreenState(requireContext())); 40 | for (String page : pages) { 41 | if ((pref = findPreference(page)) != null) pref.setOnPreferenceClickListener(this); 42 | } 43 | } 44 | 45 | @Override 46 | public boolean onPreferenceClick(@NonNull Preference preference) { 47 | SettingsActivity activity = (SettingsActivity) requireActivity(); 48 | activity.openSubSettings(preference.getKey()); 49 | return false; 50 | } 51 | 52 | @Override 53 | public void onResume() { 54 | super.onResume(); 55 | SettingsActivity activity = (SettingsActivity)getActivity(); 56 | if (activity != null) activity.setToolbarTitle(R.string.app_settings_name); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/wtbruh/fakelauncher/ui/view/SingleTextviewAdapter.java: -------------------------------------------------------------------------------- 1 | package com.wtbruh.fakelauncher.ui.view; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.TextView; 8 | 9 | import androidx.annotation.NonNull; 10 | import androidx.annotation.Nullable; 11 | 12 | import com.wtbruh.fakelauncher.R; 13 | 14 | import java.util.HashMap; 15 | import java.util.List; 16 | 17 | public class SingleTextviewAdapter extends BaseAdapter{ 18 | private final List data; 19 | public HashMap tvSet; 20 | private int scale = 1; 21 | public SingleTextviewAdapter(List data) { 22 | this.data = data; 23 | tvSet = new HashMap<>(); 24 | } 25 | 26 | @NonNull 27 | @Override 28 | public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 29 | View view = LayoutInflater.from(parent.getContext()) 30 | .inflate(R.layout.single_textview_item, parent, false); 31 | return new ViewHolder(view); 32 | } 33 | 34 | @Override 35 | public void onBindViewHolder(@NonNull BaseAdapter.ViewHolder holder, int position) { 36 | if (holder instanceof ViewHolder) { 37 | tvSet.put(position, ((ViewHolder) holder).tv); 38 | TextView tv = ((ViewHolder) holder).tv; 39 | tv.setText(data.get(position)); 40 | tv.getLayoutParams().height /= scale; 41 | } 42 | super.onBindViewHolder(holder, position); 43 | } 44 | 45 | @Override 46 | public int getItemCount() { 47 | return data.size(); 48 | } 49 | 50 | @Nullable 51 | public TextView getTextView(int position) { 52 | return tvSet.get(position); 53 | } 54 | 55 | /** 56 | * Reduce the height of TextView to scale
57 | * 按比例减小TextView高度 58 | * @param scale 比例(高度除以几) 59 | */ 60 | @SuppressLint("NotifyDataSetChanged") 61 | public void smallerTextViewHeight(int scale) { 62 | if (scale == 0) scale = 1; 63 | this.scale = scale; 64 | notifyDataSetChanged(); 65 | } 66 | 67 | public static class ViewHolder extends BaseAdapter.ViewHolder { 68 | TextView tv; 69 | public ViewHolder(@NonNull View itemView) { 70 | super(itemView); 71 | tv = itemView.findViewById(R.id.item); 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_about.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 22 | 23 | 24 | 30 | 31 | 39 | 40 | 49 | 50 |