#!/bin/sh

# Systemlessly de-bloats system apps with Magisk.
# This is tested with/made for Pixel 2 with LineageOS 22.2.

[ "$(id -u)" -gt 0 ] && { echo 'You must run this with elevated privileges (such as with sudo).'; exit 1 ;}

# Module path
module='/data/adb/modules/systemless-de-bloater'

err() { echo 'Failed!'; exit 1 ;}

debloat_dir() {
	dir="system/${1}"
	printf "De-bloating '${dir}'..."
	sudo mkdir -p "${module}/${dir}" || err
	sudo cp /dev/null "${module}/${dir}/.replace" || err
	printf 'Done\n'
	}

debloat_apk() {
	apk="system/${1}"
	printf "De-bloating '${apk}'... "
	sudo mkdir -p "${module}/${apk%/*}" || err
	sudo cp /dev/null "${module}/${apk}" || err
	printf 'Done\n'
	}

debloat_capex() {
	package="${1}"
	printf "Uninstalling '${package}'... "
	sudo cmd package uninstall --user ${user} "${package}" || err
	printf 'Done\n'
	}

# Texting and calling:
# priv-app/TeleService
# priv-app/TelephonyProvider
# product/overlay/TeleService__lineage_walleye__auto_generated_rro_product.apk
# product/overlay/TeleService__nosdcard__auto_generated_characteristics_rro.apk
# product/overlay/TelephonyProvider__nosdcard__auto_generated_characteristics_rro.apk
# vendor/overlay/TeleService__lineage_walleye__auto_generated_rro_vendor.apk

# Bluetooth:
# apex/com.android.btservices.apex

# Wi-Fi certificates storage, etc:
# app/CertInstaller
# app/KeyChain

# Printing:
# app/PrintRecommendationService
# app/PrintSpooler

# Work profile:
# priv-app/ManagedProvisioning
# product/overlay/ManagedProvisioning__lineage_walleye__auto_generated_rro_product.apk

# System updater:
# system_ext/priv-app/Updater
# product/overlay/Updater__lineage_walleye__auto_generated_rro_product.apk

# System colors:
# product/app/ThemesStub
# system_ext/priv-app/ThemePicker

# Ringtone, alarms, etc:
# priv-app/SoundPicker

# Stock keyboard:
# product/app/LatinIME

# Pixel 2 only:
# vendor/app/wahoo_gfxdrv

# Create empty directories for system apps to be overlayed with.
for app in \
	apex/com.android.appsearch.capex \
	apex/com.android.cellbroadcast.capex \
	apex/com.android.healthfitness.apex \
	apex/com.android.mediaprovider.capex \
	apex/com.android.nfcservices.capex \
	apex/com.android.ondevicepersonalization.capex \
	apex/com.android.rkpd.apex \
	apex/com.android.uwb.capex \
	apex/com.android.virt.apex \
	app/BasicDreams \
	app/BluetoothMidiService \
	app/BookmarkProvider \
	app/CameraExtensionsProxy \
	app/CaptivePortalLogin \
	app/CarrierDefaultApp \
	app/CompanionDeviceManager \
	app/EasterEgg \
	app/HTMLViewer \
	app/PacProcessor \
	app/QAS_DVC_MSP_VZW \
	app/SecureElement \
	app/SimAppDialog \
	app/Stk \
	app/WallpaperBackup \
	app/ims \
	app/uceShimService \
	app/vzw_msdc_api \
	priv-app/AvatarPicker \
	priv-app/BackupRestoreConfirmation \
	priv-app/BlockedNumberProvider \
	priv-app/BuiltInPrintService \
	priv-app/CNEService \
	priv-app/CalendarProvider \
	priv-app/CallLogBackup \
	priv-app/CellBroadcastLegacyApp \
	priv-app/ContactsProvider \
	priv-app/CredentialManager \
	priv-app/DeviceAsWebcam \
	priv-app/DeviceDiagnostics \
	priv-app/DownloadProviderUi \
	priv-app/DynamicSystemInstallationService \
	priv-app/E2eeContactKeysProvider \
	priv-app/InputDevices \
	priv-app/LiveWallpapersPicker \
	priv-app/LocalTransport \
	priv-app/MmsService \
	priv-app/MtpService \
	priv-app/NfcNci \
	priv-app/ONS \
	priv-app/OemDmTrigger \
	priv-app/ProxyHandler \
	priv-app/SharedStorageBackup \
	priv-app/StatementService \
	priv-app/Tag \
	priv-app/Telecom \
	priv-app/UserDictionaryProvider \
	priv-app/qcrilmsgtunnel \
	product/app/Aperture \
	product/app/ApertureLensLauncher \
	product/app/Backgrounds \
	product/app/Camelot \
	product/app/DeskClock \
	product/app/Etar \
	product/app/ExactCalculator \
	product/app/Gallery2 \
	product/app/Glimpse \
	product/app/Jelly \
	product/app/LocalContactsBackup \
	product/app/PhotoTable \
	product/app/Recorder \
	product/app/Twelve \
	product/app/VZWAPNLib \
	product/app/messaging \
	product/overlay/DisplayCutoutEmulationCorner \
	product/overlay/DisplayCutoutEmulationDouble \
	product/overlay/DisplayCutoutEmulationHole \
	product/overlay/DisplayCutoutEmulationTall \
	product/overlay/DisplayCutoutEmulationWaterfall \
	product/overlay/FontLato \
	product/overlay/FontNotoSerifSource \
	product/overlay/FontRubik \
	product/overlay/IconPackCircularAndroid \
	product/overlay/IconPackCircularLauncher \
	product/overlay/IconPackCircularSettings \
	product/overlay/IconPackCircularSystemUI \
	product/overlay/IconPackFilledAndroid \
	product/overlay/IconPackFilledLauncher \
	product/overlay/IconPackFilledSettings \
	product/overlay/IconPackFilledSystemUI \
	product/overlay/IconPackKaiAndroid \
	product/overlay/IconPackKaiLauncher \
	product/overlay/IconPackKaiSettings \
	product/overlay/IconPackKaiSystemUI \
	product/overlay/IconPackRoundedAndroid \
	product/overlay/IconPackRoundedLauncher \
	product/overlay/IconPackRoundedSettings \
	product/overlay/IconPackRoundedSystemUI \
	product/overlay/IconPackSamAndroid \
	product/overlay/IconPackSamLauncher \
	product/overlay/IconPackSamSettings \
	product/overlay/IconPackSamSystemUI \
	product/overlay/IconPackVictorAndroid \
	product/overlay/IconPackVictorLauncher \
	product/overlay/IconPackVictorSettings \
	product/overlay/IconPackVictorSystemUI \
	product/overlay/IconShapePebble \
	product/overlay/IconShapeRoundedRect \
	product/overlay/IconShapeSquare \
	product/overlay/IconShapeSquircle \
	product/overlay/IconShapeTaperedRect \
	product/overlay/IconShapeTeardrop \
	product/overlay/IconShapeVessel \
	product/overlay/LineageBlackTheme \
	product/overlay/LineageNavigationBarNoHint \
	product/overlay/NavigationBarMode2Button \
	product/overlay/NavigationBarMode3Button \
	product/overlay/NotesRoleEnabled \
	product/overlay/TransparentNavigationBar \
	product/priv-app/AmbientSensePrebuilt \
	product/priv-app/AppDirectedSMSService \
	product/priv-app/CarrierServices \
	product/priv-app/CarrierSettings \
	product/priv-app/CarrierWifi \
	product/priv-app/ConnMO \
	product/priv-app/Contacts \
	product/priv-app/DCMO \
	product/priv-app/DMService \
	product/priv-app/DevicePersonalizationPrebuiltPixel2 \
	product/priv-app/DiagMon \
	product/priv-app/Dialer \
	product/priv-app/HardwareInfo \
	product/priv-app/HotwordEnrollmentOKGoogleWCD9340 \
	product/priv-app/HotwordEnrollmentXGoogleWCD9340 \
	product/priv-app/ImsServiceEntitlement \
	product/priv-app/MyVerizonServices \
	product/priv-app/OBDM_Permissions \
	product/priv-app/SettingsIntelligence \
	product/priv-app/SprintDM \
	product/priv-app/SprintHM \
	product/priv-app/TetheringEntitlement \
	product/priv-app/WfcActivation \
	product/priv-app/obdm_stub \
	system_ext/app/AccessibilityMenu \
	system_ext/app/PresencePolling \
	system_ext/app/Profiles \
	system_ext/app/RcsService \
	system_ext/app/WAPPushManager \
	system_ext/priv-app/AudioFX \
	system_ext/priv-app/CarrierConfig \
	system_ext/priv-app/CarrierSetup \
	system_ext/priv-app/ElmyraService \
	system_ext/priv-app/EmergencyInfo \
	system_ext/priv-app/LineageSetupWizard \
	system_ext/priv-app/QuickAccessWallet \
	system_ext/priv-app/Seedvault \
	system_ext/priv-app/StorageManager \
	vendor/app/ModemService \
	vendor/app/QtiTelephonyService
do
	debloat_app "${app}"
done

# Create blank files for system apps to be overlayed with.
for apk in \
	product/overlay/ApertureFrameworksBaseOverlay.apk \
	product/overlay/CompanionDeviceManager__nosdcard__auto_generated_characteristics_rro.apk \
	product/overlay/DeviceDiagnostics__lineage_walleye__auto_generated_rro_product.apk \
	product/overlay/Dialer__lineage_walleye__auto_generated_rro_product.apk \
	product/overlay/ElmyraService__lineage_walleye__auto_generated_rro_product.apk \
	product/overlay/EmergencyInfo__lineage_walleye__auto_generated_rro_product.apk \
	product/overlay/GlimpseFrameworksBaseOverlay.apk \
	product/overlay/ImsServiceEntitlement__lineage_walleye__auto_generated_rro_product.apk \
	product/overlay/LatinIME__lineage_walleye__auto_generated_rro_product.apk \
	product/overlay/LineageSetupWizard__lineage_walleye__auto_generated_rro_product.apk \
	product/overlay/StorageManager__lineage_walleye__auto_generated_rro_product.apk \
	vendor/overlay/Dialer__lineage_walleye__auto_generated_rro_vendor.apk
do
	debloat_apk "${apk}"
done

# .capex system apps can't be debloated normally. So ADB is used to "uninstall"
# them. The system files are not deleted.

# Set user number for package
user=0

for capex in \
	com.android.adservices.api \
	com.android.appsearch.apk \
	com.android.cellbroadcastreceiver.module \
	com.android.federatedcompute.services \
	com.android.nfc \
	com.android.ondevicepersonalization.services \
	com.android.photopicker \
	com.android.server.deviceconfig.resources \
	com.android.hotspot2.osulogin \
	com.android.safetycenter.resources \
	com.android.uwb.resources
do
	debloat_capex "${capex}"
done

printf 'Finished\n'
