diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 00000000..1e8c5e6c
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+custom: ["https://paypal.me/tpsxj"]
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 455d3751..6745be61 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,7 @@
*.iml
.gradle
+app/release/*
+app/standalone/*
/local.properties
/.idea/caches
/.idea/libraries
@@ -12,3 +14,5 @@
/captures
.externalNativeBuild
/.idea/misc.xml
+app/develop/
+.idea/.name
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 7d7ec2ea..8fabff5a 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index d1eaecb8..da919dcd 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -14,7 +14,6 @@
-
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index f1b63f42..bd90a9ea 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -26,5 +26,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BUGS_EN b/BUGS_EN
deleted file mode 100644
index 12151373..00000000
--- a/BUGS_EN
+++ /dev/null
@@ -1,4 +0,0 @@
-Known bugs:
-
-- Latest versions of some Xiaomi apps (e.g. POCO Launcher past 2.6.8) are obfuscated and are not compatible with mods in this module (never will be)
-- Not all mods are compatible with latest beta ROMs right away
\ No newline at end of file
diff --git a/BUGS_RU b/BUGS_RU
deleted file mode 100644
index dd16a734..00000000
--- a/BUGS_RU
+++ /dev/null
@@ -1,4 +0,0 @@
-Известные баги:
-
-- Код в последних версиях некоторых Xiaomi приложений (например POCO Launcher после версии 2.6.8) обфусцирован, поэтому они не совместимы с модами в данном модуле (и никогда не будут)
-- Не все моды совместимы с последними бета прошивками сразу после их выхода
\ No newline at end of file
diff --git a/CHANGELOG_EN b/CHANGELOG_EN
deleted file mode 100644
index a00d69be..00000000
--- a/CHANGELOG_EN
+++ /dev/null
@@ -1,715 +0,0 @@
-3.2.1
-[New] Horizontal widget margin
-[New] Remove app launch zoom animation in MIUI Launcher
-[New] Launch different hidden system features from module's UI
-[Improved][Disable overscroll] Support more apps
-[Improved][Collapse MIUI titles] Support more apps
-[Improved][Show additional app details] Support latest Security versions
-[Improved][Installed apps initial sort order] Support latest Security versions
-[Improved][Prevent app force close] Allow killing most apps by default if mod is active (Security, Contacts, Backup, etc)
-[Improved][Folder background blur] Wallpaper blur support for latest MIUI Launcher versions
-Added all MIUI apps as recommended scope in LSPosed
-
-3.2.0
-[Improved][Auto close folders/app drawer] Also works when app is launched using shortcut menu
-[Fixed][Clean Open with menu] All suitable apps are listed
-Better LSPosed compatibility
-Removed unnecessary split action bar in module's UI on MIUI 12.5
-MIUI 12.5 mods compatibility:
- Installed apps initial sort order
- Disable overscroll
- Apply lock screen wallpaper using any app (Themes app is no longer required on MIUI 11+)
-
-3.1.7
-[New] Allow configuring battery saver and access to Wi-Fi for system apps
-[Fixed][Remove unlock animation] Compatibility with latest MIUI Launcher versions
-Detect that LSPosed framework is installed
-
-3.1.6
-[New] Configure allowed communications in airplane mode
-[New] Allow 3rd-party apps to set lock screen wallpaper
-[New] Display popup notifications in the middle of the screen
-[New] Minimize brightness slider visual changes when starting to adjust brightness
-[New][Launcher gestures] Pinch and spread gestures
-[Improved][Horizontal gestures] Black list
-[Improved][Disable secure content protection] Works in more places now
-[Improved][Secure Quick settings] Compatibility with older MIUI versions
-[Improved][Show additional app details] Compatibility with newer Security app versions installed on older ROMs
-
-3.1.5
-[New] Unlock frame rate up to 90 in Screen Recorder app (whether it will actually work depends on device and video driver)
-[New] Display a switch between App Vault and Google Discover in Home screen settings on global ROMs
-[New] Automatically close app drawer in MIUI Launcher after app launch
-[New] Enable or disable network activity indicators in status bar
-[Improved][Unlock grid sizes] Launcher grids up to 10x10
-[Improved][Top margin for app titles in launcher] Negative values
-[Improved][Display next alarm] Option to display both relative and regular time
-[Improved][Seconds in status bar clock] Option to try to synchronize updates with beginning or end of a second
-[Fixed][Seconds in status bar clock] Premature update from 59 to 00
-[Fixed][Clock app in notification drawer] Clock app instead of Calendar app replacement in landscape mode
-[Fixed] Unnecessary preferences migration after restoring them from backup
-
-3.1.4
-[Fixed] EdXposed Manager freeze on launch (it might still happen on EdXposed SandHook when Own repository option is active)
-[Fixed] Searching for newly added mods
-
-3.1.3
-[New] Action: Force close current app
-[New] Action: Toggle Hotspot
-[New] Hide status bar on lock screen
-[New] Hide unlock hint on lock screen
-[New] Mute notification sound when screen is on
-[New][Full screen navigation gestures][MIUI 12] Custom action on swipe up from corner
-[Fixed][App info in installer] Fit info into new Google Package Installer dialog
-[Fixed] Navbar height
-Additional repository with CustoMIUIzer module in it for EdXposed Manager to get updates more reliably
-Chinese New Year design updated
-New design added ₿
-
-3.1.2
-[New] Require device unlock before toggling selected Quick settings tiles
-[Fixed][Separate volume controls] Volume settings crash
-[Fixed][Display charging data] Compatibility with older Android versions
-[Fixed] Some Launcher mods not keeping changes after reboot
-
-3.1.1
-[Fixed][Remove unlock animation] Compatibility with latest MIUI Launcher versions
-[Fixed] Module's settings crash on older Android versions
-
-3.1.0
-[New] Bypass app lock for selected activities (activity names of locked apps are written to Xposed log upon launch)
-[Improved][Display charging data] Show battery info (current, voltage, wattage, temperature)
-[Improved][Custom lock screen actions] Option to center actions list horizontally
-[Improved][Disable screen lock] Face unlock skipping is optional
-[Improved][Extended power menu] Faster animations and dynamic background blur
-Minor performance improvements
-EdXposed 0.5.x.x support (build 4653+ is required):
- Module's settings will be migrated to work with new EdXposed Framework version on first module UI launch.
- It is recommended to make a backup using built-in function before updating.
- Old settings could still be loaded by disabling EdXposed Framework or downgrading it to 0.4.x.x.
- Launching any app on device can have an additional delay depending on the number of active mods.
- It's a result of how new EdXposed loads modules, this cannot be avoided without breaking some system mods.
-
-3.0.6
-[New][MIUI 12] Allow using split screen and floating windows together
-[New][MIUI 12] Disable Control center while screen lock is active
-[New][MIUI 12] Change maximum line count in messaging style notifications (can fix truncated action buttons bug)
-[New][MIUI 12] Bring back minimalistic collapsed view for unimportant notifications
-[New][MIUI 12] Open notification channel settings instead of app's common notification settings from notification menu
-[Improved][Disable screen lock] Don't start face unlock and don't hide contents of all notifications if lock is disabled
-[Improved][Allow floating window] Supports black list now to disallow opening floating windows from popup notifications
-[Improved][Compact notifications][MIUI 12] Smaller bottom padding in MIUI style
-[Fixed][Custom lock screen actions] Zero top margin for actions list on some devices
-[Fixed][Sticky floating windows] Remember window state when launched from top widget in recent apps list
-[Fixed][Recent apps background blur] Compatibility with latest MIUI launcher versions
-[Fixed] Module's settings crash on MIUI 11 and lower
-
-3.0.5
-Revert changes introduced in 3.0.2 that break some system mods
-
-3.0.4
-[Fixed][Detailed network speed indicator] Show correct values when VPN is active
-[Fixed] Module's settings crash
-[MIUI 12] Control center compatibility:
- Show illuminance level
- Show brightness percentage
- Deactivate brightness slider
- Status bar gesture controls
- Notification drawer background blur
-
-3.0.3
-[New] Audio silencer: mute any sound that can be uniquely identified
-[New][MIUI 12] Sticky floating windows: remember window state, position and dimensions
-[New][MIUI 12] Allow any app to be opened in floating window
-[Improved][Recent apps background blur] Compatibility with recents from MIUI Launcher
-[Fixed][Expand QS action][MIUI 12] Expands Control center too
-[Fixed][Detailed network speed indicator] Android 7.1 compatibility
-[Fixed][Custom lock screen actions] Android 7.1 compatibility
-[Fixed][MIUI 12] Module's settings crash on beta ROMs
-
-3.0.2
-[New] Disable media stream muting in Do not disturb mode
-[New] Toggle DND instead of Silent mode from collapsed volume dialog
-[New] Volume dialog autohide delay
-[New] Google Keyboard's bottom padding
-[New][MIUI 12] Allow floating window to be opened from any notification that has an appropriate click action defined
-[Improved][Compact notifications][MIUI 12] Increased height of action buttons
-[Fixed][Display next alarm on lock screen] Compatibility with super wallpaper clock style
-[Fixed][Custom lock screen actions] Compatibility with some ancient Android versions
-[Fixed][Popup notification swipe down] Ignore notifications with floating windows
-[Fixed] Show seconds in status bar clock
-[Fixed] Hide No SIM card icon
-
-3.0.0
-[New] Increase limit of active notifications from a single app
-[New] Increase/remove notification icons limit in status bar
-[New] Disable forced dark mode
-[New][MIUI 12] Collapse MIUI titles
-[Improved][Navbar height, Additional navbar buttons margin] Increased value ranges
-[Improved][Show additional app details] APK version code
-[Fixed][Show seconds in status bar clock] Adding seconds twice
-[Fixed][Back gesture area height and width] Support for gestures implementation from MIUI Launcher
-[Fixed][Launcher gestures] Swipe up and down gestures; compatibility with latest MIUI Launcher versions
-[Fixed][Fingerprint actions during calls] Longpress action
-[Fixed][Separate volume controls] Muted state indication for notification slider in volume dialog when DND is active
-Coronavirus anti-holiday is back! Now even more viral!
-MIUI 12 compatibility:
- Fast access icon
- Rotation animation
- Custom lock screen shortcuts (launching without unlock)
- Separate volume controls
- Compact notifications
- Extended notification menu
- Shortcut/Clock/Calendar app in notification drawer
- Display next alarm on lock screen
- Hide top block on lock screen
- More notification snooze options
- Show additional app details
- Horizontal gestures
-
-2.2.1
-[New] Disable emergency call button on lock screen
-[Improved][Screenshot configuration] Option to select a custom save folder
-[Improved][Additional toast elements] Disable stock adding of an app name on China ROMs
-[Improved][Extended notification menu] Display all icons in one row in notification of minimal importance so they fit in when notification is collapsed
-[Fixed][Colorize notification title] Don't apply to styled media notifications
-[Fixed][Screen off timeout on lock screen] Was also affecting timeout outside lock screen
-Module's UI fixes
-
-2.2.0
-[New] Use native recent apps list implementation instead of the one from MIUI Launcher
-[Improved][Album art as wallpaper] Option to convert album art to grayscale
-[Improved][Display charging current] Option to append/prepend/insert as new line
-[Fixed][Custom lock screen actions] Swipe left action and right icon replacement compatibility with latest beta ROMs
-[Fixed][Custom suggestions box actions] Compatibility with recent apps list from MIUI Launcher
-[Fixed][Remove cleaner button] Compatibility with recent apps list from MIUI Launcher
-[Fixed][Remove unlock animation] Compatibility with latest beta ROMs; also disables fade/zoom out unlock animation of lock screen
-[Fixed][Use old launch animation] Compatibility with latest launcher alpha versions
-[Fixed][Fix launcher animation] Compatibility with latest launcher alpha versions
-[Fixed][App info in installer] Compatibility with latest MIUI package installer version
-[Fixed][Floating screenshot display time] Compatibility with latest beta ROMs
-Show main menu on all pages in module settings
-New anti-holiday design ☣️
-
-2.1.5
-[New] Scramble App Lock PIN
-[New] Show a value of charging current at the bottom of lock screen
-[Improved][Battery bar indicator] Option to only show in notification drawer and on lock screen
-[Improved][Snoozed notifications manager] Option to snooze notification indefinitely (until the next device reboot)
-[Fixed][Snoozed notifications manager] Show correct time until snoozed notification is reposted
-
-2.1.4
-[New] Change delay before a floating window with newly created screenshot disappears
-[New] Unlimited number of icons in launcher's dock
-[Improved][Battery bar indicator] Align to the bottom of status bar (indicator will also appear at the bottom of the screen in notification drawer and on lock screen)
-[Fixed][Use entire folder's width] Truncated icons during folder close animation
-
-2.1.3
-[New] Hide overlays while making a screenshot
-[New] Reverse portrait orientation support in launcher
-[Improved][Dynamic page indicator] Option to show only in edit mode
-[Improved][Auto brightness range] Option to switch to non-linear scale on older Android versions (use if mod sets incorrect percentages)
-[Improved][Clean Open with menu] Hide apps from menu based on type of content that is being opened
-[Improved][Music visualizer] Option to display visualizer only if media controller exists (usually used by audio players for notification controls)
-[Fixed][Music visualizer] Visualizer wasn't showing right away in notification drawer
-
-2.1.2
-[New][Hide icons] Hide VoWiFi icon
-[New][MIUI Launcher] Remove unlock animation
-[New][MIUI Launcher] Use old launch animation
-[Improved][Show illuminance level] Lower update rate to prevent chaotic value changes
-[Fixed][Hide low battery warning] Compatibility with some ROMs
-[Fixed][Clear all recent tasks] Compatibility with Android 10
-Module UI crash fixes
-
-2.1.1
-[New] Disable warning dialog about unsafe volume level
-[New] Disable warning dialog about low battery level
-[New] Disable screenshot on Power+Volume down key combination
-[New] Do not wake device using fingerprint scanner if no fingerprints are enrolled
-[New] Tap bottom area of lock screen to start device unlock
-[New][Hide icons] Hide Wi-Fi icon
-[Improved][Auto brightness range] Minimum and maximum values in percents
-[Improved][Music visualizer] Faster rendering in some cases; option to select rendering method
-[Fixed][Colorize notification title] Compatibility with Android 10
-
-2.1.0
-[Improved][Extended notification menu] Always open MIUI-styled app info
-[Improved][Android 9+] Better app list (black/white list) mode support (but not perfect, so warning will remain)
-[Fixed] No vibration on fingerprint authentication failure
-[Fixed] Crash in snoozed notifications list
-[Fixed][Missed call reminder] Stop playing ringtone when missed call notification is dismissed
-[Fixed][Compact notifications] Wrong height of action buttons in some notifications
-[Fixed][Status bar gesture controls] Mod was broken on older Androids after some recent changes
-New holiday design 🐀🏮
-Android 10 compatibility:
- No screen light up on charge/headset connection
- No password after boot
- Disable screen lock
- Orientation lock
- Media position slider
- Disable overscroll
- Hide from recents
- Toasts display duration
- [Fingerprint authentication] Vibrate on success, no vibration on failure, turn screen on after failure
-
-2.0.10
-[New] More snooze time options and snoozed notifications manager
-[New] Clear all tasks using cleaner button in recent apps list
-[New] Remove brightness slider or make it display only
-[Improved][Volume steps multiplier] Multiplier up to 5x
-[Improved][Quick flashlight] Temporarily disable raise to wake when flashlight is active
-[Improved][Status bar gesture controls] Show percentage when adjusting brightness if "Show brightness percentage" mod is enabled
-[Fixed][Toasts display duration] Compatibility with some ROMs
-[Fixed][Android 7] Crash in some app lists
-
-2.0.9
-[New] Toasts display duration
-[New] Do not show vertical line between time and network speed on devices with waterdrop notches
-[New] Make all MIUI launcher screens support both widgets and apps on tablets
-[New][Additional navbar buttons] Option to increase distance from screen edges
-[New][Disable screen lock] Tasker plugin to force enable/disable device lock
-[Improved][Disable screen lock] Option to require authentication once after boot
-[Improved][Disable screen lock] Apply device lock changes right away when state of Bluetooth connections change
-[Fixed][Invert colors action] Restore color scheme/reading mode after inversion is disabled
-[Fixed][Music visualizer] Music playing state detection on some ROMs; also visualizer will now be active when any music is playing, not just the one with media notification
-
-2.0.8.1
-[Fixed][Fingerprint call control] Error during mod activation that was also causing other mods to break
-
-2.0.8
-[New] Customize screenshot format, quality and save folder
-[New] Accept or reject incoming calls and disconnect active calls using fingerprint scanner
-[New] Launcher dock bottom margin
-[New][Launcher bug fixes] Always open MIUI-styled app info from long press menu
-[Improved][Quick Settings grid] Up to 7 columns
-[Improved][Custom lock screen shortcuts] Allow to open whole app without unlock, not just a single activity
-[Improved][Custom lock screen shortcuts] Launch Mi Home and Mi Remote without unlock if corresponding option for shortcuts is enabled
-[Fixed][Separate volume controls] Crash in sound settings
-[Fixed][Hide icons] Hide charging icon inside battery icon
-New Year is nigh! :)
-
-2.0.7
-[New][Launcher bug fixes] Apply value animators' duration scaling to some launcher animations
-[Improved][All rotations] Option to enable or disable
-[Improved][Auto close folders] Option to enable or disable
-[Improved][Separate volume controls] New icons for notification and system sounds volume sliders in Settings
-[Improved][Status bar gesture controls] Better slide detection method with configurable sensitivity
-[Fixed][Auto rotation toggle action] Incorrect orientation in some cases
-[Fixed][Custom lock screen shortcuts] Compatibility with latest ROMs
-
-2.0.6
-[New] Make all widgets freely resizable (exceptions are some MIUI ones)
-[New] Show next alarm time on lock screen
-[New][Status bar gesture controls] Adjust brightness or volume by sliding with 1 or 2 fingers; double tap to perform action
-[Improved][Control input cursor] Black list
-[Fixed][Status bar height] Update launcher's top padding to match modified status bar height
-[Fixed][Minimum auto brightness] Compatibility with some Android 8 ROMs
-
-2.0.5
-[New] Reduce vibration intensity (strength or duration) during selected hours
-[New][Full screen navigation gestures] Back gesture area width
-[Improved][Custom lock screen shortcuts] Unlimited number of shortcuts with app icons and top/bottom alignment
-[Improved][Modify app titles] Dual apps support
-Interface language selection
-Module's UI improvements: preserve current state on configuration changes; correct checkbox size in dark mode
-
-2.0.4
-[New] Folder background blur options (MIUI Launcher with folder blur support is required)
-[Improved][Show brightness percentage] Configurable top margin
-[Improved][Folder background color overlay] Configurable level of darkening/lightening; smoothly change overlay opacity when folder is opened
-[Improved][Clean Open with menu] Hide apps that can accept links with http, https and vnd.youtube protocols
-[Improved][Modify app titles] Change titles in app drawer too
-[Improved][Additional navbar buttons] Original buttons are a little more spaced, full screen mode button moved to the right to prevent it from being truncated
-[Fixed][Volume keys long press actions] Wake up on volume keys press option support
-[Fixed][Custom lock screen shortcuts] Compatibility with latest ROMs
-
-2.0.3
-[New][Number of columns in folders] Use entire folder's width
-[Improved][Volume dialog background blur] Background dimming is disabled when blur is active
-[Fixed][Shortcut actions in recents] Missing titles of some actions
-[Fixed][Launcher compatibility mode] It actually works now
-[Fixed][Show brightness percentage] Compatibility with some ROMs
-Better themes support, UI fixes
-
-2.0.2
-[New] Force all notifications from MIUI apps to be able to appear on lock screen and as floating ones
-[New] Remove Quick Settings and brightness slider in expanded notifications mode on lock screen
-[New] Remove notification drawer background on lock screen
-[New] Double press power key launch action
-[Improved][Number of columns in folders] Option to reduce side padding for more than 3 columns
-[Improved][Show titles in dock] Additional bottom padding for dock when full screen gestures are active (MIUI Launcher only)
-[Improved][Disable signature verification] Skip signature check in MIUI installer
-[Improved][Show seconds] Equal update intervals
-[Improved][Folder background] Use white color when light wallpaper is applied
-[Fixed][Media position slider] Compatibility with some ROMs
-Long press search box to display a list of new mods
-Scroll found mod into view and highlight it beautifully :)
-MIUI-styled checkboxes in lists on MIUI 11
-Adaptive module icon
-
-2.0.1
-[New] Show app titles in launcher dock
-[New] Allow screenshots and video recording of any app
-[New] Blur background behind collapsed and expanded volume dialogs
-[New] Compatibility mode for all launcher mods
-[Improved][Unlock grid sizes] Launcher grids up to 8x8
-[Improved][Album art as wallpaper] Scaling option
-Module's UI fixes
-
-2.0.0
-[New] Alternative back navbar button icon in input mode
-[New] Replace App Vault with Google Discover in MIUI Launcher
-[New] Make MIUI package installer the default one and allow it to update system apps
-[Improved][Media position slider] Option to switch to system slider style
-[Improved][App info in installer] MIUI package installer support
-[Improved][App state control] Ability to disable more apps (System launcher, Find device, etc)
-[Fixed][Dim duration] Compatibility with some ROMs, now configured in % of screen off timeout
-[Fixed][Custom lock screen actions] Launching shortcut actions
-[Fixed][Navbar actions] Media actions on main buttons long press
-MIUI 11 compatibility:
- Fast access icon
- Additional toasts elements
- Unblock launchers
- Media position slider
- Open menu action
-
-1.8.1
-[New] Dark mode Quick Settings tile
-[New] Hide app titles in launcher
-[New] Horizontal launcher grid margins
-[New] Top launcher grid margin
-[New] Page indicator height in launcher
-[New] Display brightness level in percentages while dragging brightness slider
-[Improved][Number of rows in Quick Settings] Option for 2 rows with reduced QS height
-[Fixed][Font size of titles in launcher] Do not apply to opened folder's title
-[Fixed][Custom lock screen actions] Right icon and text replacement; Revert to stock camera launch when no custom action is selected
-[Fixed][Extended power menu] System UI restart
-Minor module's UI fixes
-
-1.8.0
-[New] Action: Toggle one-handed mode
-[New] Display version info about app that is being installed
-[New] Disable overscroll in list views
-[New] Font size of titles in launcher
-[New] Top margin of titles in launcher
-[New] Dual apps support in mods:
-- App lock
-- Hidden apps
-- Clean share menu
-- Clean Open with menu
-- Additional app details
-- Extended notification menu
-- Shortcut/Clock/Calendar app in notification drawer
-- Launch app and Launch activity actions
-[Improved][Number of columns in launcher folders] Increased width of folder grid
-[Improved][Default USB configuration] Do not show dialog automatically upon connection on latest ROMs
-[Improved][Music visualizer] Customizable interval for dynamic color change
-[Fixed][Minimum auto brightness] Compatibility with some ROMs
-[Fixed][Hide mobile network type] Compatibility with some ROMs
-[Fixed][Custom lock screen actions] Compatibility with latest ROMs
-[Fixed][Disable hidden apps folder] Compatibility with latest ROMs
-[Fixed][Number of columns in collapsed Quick Settings panel] Compatibility with latest ROMs
-Detailed report compression to save that precious traffic
-
-1.7.5
-[New] Disable APK signature verification when app is being updated
-[New] Dim duration before automatic screen off
-[Improved][Music visualizer] Dynamic color option (changes color to a random one every 10 seconds)
-[Fixed][Custom app titles] Compatibility with latest launcher alpha versions
-[Fixed][Default USB configuration] Incorrect default value
-[Fixed][Minimum auto brightness] Compatibility with some ROMs
-[Fixed][Extended notification menu] Compatibility with some ROMs
-Detect TaiChi app and don't complain about Xposed not being installed
-
-1.7.4
-[New] Adjust media stream volume on first key press
-[New] Disable test vibration when switching ringer mode to silent or turning on vibration in this mode
-[Improved][Battery bar indicator] Zero bar height
-[Improved][Music visualizer] Animation duration option to configure visualizer update rate
-[Fixed][Launcher icons scale] App icon badge scale
-[Fixed][Clean Open With and Share menus] Compatibility with some ROMs
-[Fixed] Color picker not drawing on some devices
-[Fixed] Module UI crashes
-
-1.7.3
-[New] Action: Switch keyboard
-[New] Hide covered earphone area warning
-[New] Hide top block (clock, date, etc) on lock screen
-[New] Custom sound, vibration and interval for missed call reminder
-[New] Switch between dark/light/auto UI modes (does the same thing as Dark mode is Settings, option is mainly for turning off dark mode on ROMs that don't support it)
-[New][Hide icons] Hide VoLTE status bar icon
-[Fixed][Show illuminance level] Right slider icon visual bug while changing brightness
-[Fixed][Launcher icons scale] Scale MIUI quick functions widgets
-[Fixed][Custom app titles] Changing titles without reboot on latest launcher versions
-[Fixed][Minimum auto brightness] Compatibility with some devices
-[Fixed][Custom lock screen shortcuts] Compatibility with some ROMs
-[Fixed][Detailed network speed indicator] Spacing between tx and rx speeds without indicator icons
-[Fixed] Dark mode
-
-1.7.2
-[New] Show ambient illuminance value in lux inside brightness slider
-[New] Position slider in media notifications
-[New] Turn screen on after failed fingerprint authentication
-[New] LTE icon instead of 4G
-[New] Show incoming call UI instead of just a notification
-[New] Configurable screen brightness during call
-[New] System animations scale from x0 to x20 with 0.1x step
-[New] Icon and folder scale in Launcher
-[New][Hide icons] Hide No SIM and Managed profile status bar icons
-[Improved][Volume steps multiplier] 0.25x multiplier step
-[Removed][Pocket mode] Mod was draining battery during sleep by getting proximity values once a second; ultrasonic sensors are not reliable in such situations as they require 1 second to start showing correct values
-[Fixed][Extended notification menu] Vertical position when Compact notification mod is not active
-[Fixed][Custom lock screen actions] Restore default right image when no action is selected; Better compatibility with different ROMs
-[Fixed][Hide clear button] Compatibility with latest ROMs
-[Fixed][Android 7] Image resource hooks not working (was affecting a number of mods)
-[Fixed] Single app selection lists in module settings
-[Improved] Mods' settings categorization
-
-1.7.1
-[Fixed][Status bar height, Navbar height] Incomplete height changes, slow boot, bootloops
-[Fixed][Custom lock screen actions] Hide left icon when swipe right gesture is disabled; Better compatibility with different ROMs
-[Fixed][Quick flashlight, Volume keys long press actions] Always On Display compatibility
-
-1.7.0
-[New] Disable any notification including system ones
-[New] Customizable actions for shortcuts and swipes on lock screen
-[New][Hide icons] Hide VPN and Hotspot status bar icons
-[Improved][Separate volume controls] Notification slider in expanded volume dialog is optional
-[Fixed][Extended notification menu] Vertical position
-[Fixed][Hide clear button, Default USB configuration, Navbar long press actions] Compatibility with some ROMs
-[Fixed][App state control, Show additional app details] Compatibility with latest Security app
-Resource hooks support in Xposed framework is no longer required for module to work
-
-1.6.7
-[New] Customizable battery bar indicator
-[New] Hide statusbar icons
-[New] Show alarm icon only during the defined number of hours before next alarm
-[New] Hide Bluetooth icon when no devices are connected
-[New] Prevent stock MIUI action from closing selected apps
-[New] Action: Launch any activity of any package
-[New][Android 9+] Display text magnifier during selection (for TextView-based elements only)
-[Improved] Color pickers in module settings (darker colors selection and landscape layout support)
-[Fixed][Alarm clock compatibility] Incorrect alarm time
-[Fixed] Some UI bugs
-
-1.6.6
-[New] Allow all screen rotations
-[New] Vibrate on successful fingerprint authentication
-[New] Do not vibrate on fingerprint authentication failure
-[New] Clean "Open with" menu
-[New] Default USB configuration when connected to another device
-[New][Music visualizer] Glow option
-[New][Detailed network speed indicator] Optionally reduce indicator visibility when both speeds are zero
-[New] Option to mark newly added mods for a number of days after update or forever
-[Improved][Quick settings haptic feedback] Option to not disable vibration when "Vibrate on tap" is off
-[Improved][Separate volume controls] Add notification volume slider to expanded volume dialog
-[Improved][Show additional app details] Open app in Play Store, copy APK filename and data path to clipboard
-[Fixed][Music visualizer] Horizontal rainbow colors on Android versions below 9
-[Fixed] Custom actions for shortcuts in recent apps list
-
-1.6.5
-[New] Make selected apps display correct next alarm time set by stock MIUI Clock app
-[New] Make selected apps ignore incoming calls and keep playing audio
-[New] Enhanced App lock option to lock any app
-[New] Infinite page scroll in MIUI/POCO Launcher - jump from the last page to the first one and vice versa
-[New] Autohide page indicator in MIUI Launcher
-[New][Fingerprint actions] Option to disable actions during calls
-[Improved] Open volume dialog action opens dialog that changes appropriate volume during calls
-[Fixed][Music visualizer] Drawing of dashed bars and circles on Android versions below 9
-[Fixed] Some bugs and crashes
-
-1.6.4
-[New][Music visualizer] Option to draw on top of custom lock screen
-[Improved][Music visualizer] Draw on top of themed background in notification drawer
-[Fixed][Album art as wallpaper] Disable on custom lock screens
-[Fixed][Separate volume controls] Keep system volume between reboots
-[Fixed] Remove labels of Quick Settings tiles
-[Fixed again] Detailed network speed indicator
-
-1.6.3
-[New] Hide navigation bar
-[New] Music visualizer on lock screen and notification drawer
-[New][Detailed network speed indicator] Font size options
-[Fixed] Detailed network speed indicator
-[Fixed] Go to sleep action was preventing screen from turning on again on some devices
-[Fixed][Clean share menu] Removing messaging apps was breaking their functionality
-[Improved][Keep notifications] Compatibility with new ROMs
-[Improved] Open EdXposed Manager from module settings menu
-
-1.6.2
-[New] Navigation bar height
-[New] Minimum auto brightness value
-[New] Do not lock apps when device is locked (when option with locking after exit is selected)
-[New] Change app lock timeout after exit
-[Fixed][Clean share menu] Not all apps were available for removal
-[Fixed][Fast access icon] Better compatibility, new position options
-
-1.6.1
-[New] More intervals for Silent/Do Not Disturb timers
-[New] Remove apps from share menu
-[New] Restrict toasts for selected apps
-[New] Darker app title shadow in launcher
-[New] Unblock 3rd-party launchers on China ROMs
-[New] Define actions for 4 shortcuts in suggestion box in recents list
-[New] Define action for double tap on empty space in launcher
-[New] Actions: Open menu, Open volume dialog, Raise volume, Lower volume
-[New] Shortcut to unlock credentials (long press CustoMIUIzer icon in launcher that supports shortcuts)
-[New] Mod searching function in module settings
-[Fixed] Disable launcher gestures during icons reorder
-[Improved][Detailed network speed indicator] Compatibility with new ROMs
-
-1.6.0
-[New] POCO Launcher support for a number of mods
-[New] MIUI Launcher support up to 4.9.5-dev
-[New] Fix status bar contents color for light/dark wallpapers on dev launcher version
-[New] Make status bar background color the same as app's action bar background color where possible
-[New] Define apps that will be launched when clock, date and shortcut icon in notification drawer's header are tapped
-[New] Action: Go back
-[New] Dark mode support for module settings (some popup dialogs still have wrong text color)
-[Improved][Additional navbar buttons] Left and right buttons appear independently if actions are assigned to them
-
-1.5.7
-[Fixed][Extended power menu] Power off button animation bug
-[Fixed][Extended power menu] Localization
-[Fixed] Unlock credentials
-[Improved] Error handling and logging
-
-1.5.6
-[New] Extended power menu (Fastboot/Recovery/Soft Reboot/Restart System UI/Restart Launcher)
-[New] Bring back Pocket mode option on devices with ultrasonic proximity sensor
-[New] Change status bar height
-[New] Customizable Quick Settings grids (both collapsed and expanded)
-[New] Hide labels in Quick Settings
-[New] Remove cleaner button from recent apps list
-[New] Remove button that clears all notifications
-[New] Disable (almost) any app from its info page
-[New] Combine horizontal full screen gestures and navigation bar
-[New] Actions: Clear memory, Invert colors
-[New] Long press actions for Back, Home and Menu navbar buttons
-
-1.5.5
-[New] Quick Settings tile to lock orientation in portrait or landscape positions
-[New] Disable music ducking (lowering volume during notifications)
-[New] Disable fingerprint actions in Camera app
-[New] Auto close MIUI launcher folders after app launch
-[New][Better popup notifications] Auto hide delay
-[Improved] All multiselection lists in module settings display selected apps on top
-[Improved] Check if Xposed resource hooks are disabled
-[Fixed][Extended notification menu] Latest stable MIUI support
-[Fixed][Block vibration] Android 7 support
-[Fixed][Album art as wallpaper] Better support for different Android versions
-[Fixed][Hide from recents] Switched from dynamic to static to prevent bootloops
-[Fixed][Custom app titles] Bug fixes
-
-1.5.4
-[New] Restrict vibration usage for selected apps
-[New] Modify app titles in MIUI Launcher
-[New][Disable screen lock] Use trusted Bluetooth devices
-[New] Create launcher icon or use shortcut to unlock device credentials (they remain locked if you skip PIN/password/pattern after boot, but are required for authentication in some apps)
-
-1.5.3
-[New] Show notifications on lock screen even after it's dismissed and then opened again
-[New] Open app info and force close app from its notification menu
-[New] Do not show icon with 3 dots in system area when notification icons are hidden
-[New][Quick Settings haptic feedback] Light/strong vibration options
-[New][Full screen navigation gestures] Back gesture area height
-[New][Android 8+] Change number of notifications from one app that triggers auto grouping
-[Fixed][Theme background opacity] Separated from notification drawer background blur
-[Fixed][Detailed network speed indicator] Excessive left padding
-[Fixed][Compact notifications] Opacity bug after opening notification drawer
-[Fixed] Better handling of mods' errors
-Less cluttered module settings, new indication of dynamic mods
-
-1.5.2
-[New] Compact notifications
-[New] Enhanced Hidden apps
-[New] Hide apps from recent tasks list
-[New] Quick settings haptic feedback
-[New] Toggle module's launcher icon
-[Fixed] Fade screen rotation animation
-[Fixed] Vibration in mods respects "Vibrate on tap" system setting
-[Fixed] Module UI bugs
-
-1.5.1
-[New][Expand notifications] Black & white list
-[New][Control input cursor] Option to swap cursor moving directions
-[New][Hide mobile network type] Hide completely or only when not connected
-[New] Do not hide status bar clock on home screens with clock widgets
-[New] Allow installing older app version on top of a newer one
-[New] Action to open system power menu
-[New] Brand new fast access icon :)
-[Fixed][Android 7] Enhanced toasts
-[Fixed] EdXposed Manager detection
-
-1.5.0
-[New] Darken MIUI launcher folder background
-[New] Unlock MIUI launcher grids from 3x4 to 6x7
-[New] Number of columns in MIUI launcher folders
-[New] Screen rotation animation (none or fade)
-[New] Open notification drawer automatically on notifications from selected apps
-[New] Display album art of currently playing track as lock screen wallpaper
-[New][Better popup notifications] Do not dismiss popups automatically
-[New][Better popup notifications] Swipe down from popup to open notification drawer
-[Fixed][Disable screen lock] Selecting multiple trusted Wi-Fi networks
-
-1.4.3
-[New] Dynamic screen lock (disable completely, require only once after boot, disable on trusted Wi-Fi networks; bypass lock screen too)
-[New] Detailed network speed indicator (incoming/outgoing traffic speeds and icons, low speed threshold for different indication)
-[New] Network speed update interval
-
-1.4.2
-[Fixed] Override swipe up action in launcher (search usually) with mod's action
-[Fixed] Additional check whether scanner is currently used or not in fingerprint actions mod
-[New] Customizable double tap and long press delays for fingerprint actions mod
-
-1.4.1
-[Fixed] Quick flashlight
-[New] Action to switch to previous app for navbar buttons and fingerprint scanner
-[New] Optional vibration on volume keys long press action
-
-1.4.0
-[New] Customizable actions for single/double/long press on fingerprint scanner while screen is on
-[New] Option to disable screen light up on charge in all cases or only when there is no charging animation
-[New] Define how long screen should be kept on after charging animation starts
-[New] Actions to open notification drawer/quick settings/recent apps do toggle instead of just opening when possible
-[New] Volume steps multiplier
-
-1.3.1
-[Fixed][Compatibility] MIUI 10.3
-[Fixed] Screen off animation duration
-[Fixed] No screen light up on charge (including wireless)
-[New] No screen light up on headset connection
-
-1.3.0
-[Fixed][Compatibility] Loading module settings on devices with encrypted storage. Backup settings before updating to this version, they will be reset to defaults!
-[Fixed][Compatibility] Additional app details
-[Fixed][Compatibility] Quick flashlight
-[Fixed][Compatibility] Volume keys media actions
-[Fixed][Compatibility] All mods with customizable actions/toggles
-[New] Two additional buttons on navigation bar with customizable actions
-[New] Themed notification drawer background opacity
-[New] Remove mobile network type icon from status bar
-[New] Increase right margin for traffic speed indicator
-
-1.2.0
-[New] Display seconds in the status bar clock
-[New] Always show notifications fully expanded
-[New] Media actions for Volume Up/Down long press when screen is off
-[New] Background blur intensity in recent apps and notification drawer
-[Moved] "Control input cursor" mod was moved to Controls section, requires reactivation
-
-1.1.1
-[New] Configure separate volume for rings/notifications/system sounds in Settings
-[New] Move text input cursor using volume keys
-
-1.1.0
-[New] Double tap on lockscreen to sleep
-[Fixed][Android 7.0+] Module initialization, actions for toggles. Mods are not guaranteed to work.
-
-1.0.1
-[Fixed] Fast access icon on some devices
-[Fixed] Update check
-
-1.0.0
-Initial release
\ No newline at end of file
diff --git a/CHANGELOG_RU b/CHANGELOG_RU
deleted file mode 100644
index eae643f4..00000000
--- a/CHANGELOG_RU
+++ /dev/null
@@ -1,715 +0,0 @@
-3.2.1
-[Новое] Горизонтальные отступы виджетов
-[Новое] Убрать анимацию иконок Рабочего стола MIUI при запуске приложений
-[Новое] Запуск различных скрытых системных функций из интерфейса модуля
-[Улучшено][Отключить избыточную прокрутку] Поддержка большего числа приложений
-[Улучшено][Сворачивать заголовки MIUI] Поддержка большего числа приложений
-[Улучшено][Доп. сведения о приложении] Поддержка последних версий Безопасности
-[Улучшено][Порядок сортировки Всех приложений] Поддержка последних версий Безопасности
-[Улучшено][Предотвратить закрытие приложений] Разрешить убийство большинста приложений по умолчанию, если мод активен (Безопасность, Контакты, Рез. копирование и пр.)
-[Улучшено][Размытие фона папок] Поддержка размытия обоев на последних версиях Рабочего стола MIUI
-Все MIUI приложения добавлены в рекомендованные в LSPosed
-
-3.2.0
-[Улучшено][Автозакрытие папки/меню приложений после запуска приложения] Также работает при запуске из меню ярлыков
-[Исправлено][Очистка меню "Открыть с помощью"] Все подходящие приложения видны в списке
-Улучшена совместимость с LSPosed
-Удалено ненужное разделённое меню действий в интерфейсе модуля на MIUI 12.5
-Совместимость модов с MIUI 12.5:
- Порядок сортировки Всех приложений
- Отключить избыточную прокрутку
- Установка обоев на локскрине любым приложением (Приложение Темы больше не требуется на MIUI 11+)
-
-3.1.7
-[Новое] Разрешить настраивать контроль активности и доступ к Wi-Fi для системных приложений
-[Исправлено][Убрать анимацию разблокировки] Совместимость с последними версиями Рабочего стола MIUI
-Определять установленный LSPosed фреймворк
-
-3.1.6
-[Новое] Настройка разрешённых коммуникаций в режиме полёта
-[Новое] Установка обоев для экрана блокировки сторонними приложениями
-[Новое] Отображение всплывающих уведомлений по центру экрана
-[Новое] Минимизировать визуальные изменения слайдера при старте регулировки яркости
-[Новое][Жесты ланчера] Жесты сведения и разведения пальцев
-[Улучшено][Горизонтальные жесты] Чёрный список
-[Улучшено][Отключить защиту контента] Теперь работает в большем количестве мест
-[Улучшено][Безопасные Быстрые настройки] Совместимость со старыми версиями MIUI
-[Улучшено][Доп. сведения о приложении] Совместимость с новыми версиями приложения Безопасность, установленными на старые прошивки
-
-3.1.5
-[Новое] Разблокировать частоту кадров вплоть до 90 в приложении Запись экрана (будет ли это действительно работать, зависит от устройства и видео драйвера)
-[Новое] Переключатель между лентой виджетов и Google Discover в настройках Рабочего стола на глобальных прошивках
-[Новое] Автозакрытие меню приложений Рабоего стола MIUI после запуска приложения
-[Новое] Включение или отключение индикаторов сетевой активности в строке состояния
-[Улучшено][Разблокировать размеры сетки] Размеры до 10x10
-[Улучшено][Отступ сверху для названий приложений в ланчере] Отрицательные значения
-[Улучшено][Показ будильника] Опция для показа обычного и относительного времени вместе
-[Улучшено][Секунды на часах в строке состояния] Опция для попытки синхронизировать обновления с началом или концом секунды
-[Исправлено][Секунды на часах в строке состояния] Преждевременное обновление с 59 до 00
-[Исправлено][Приложение часов в панели уведомлений] Замена приложения часов вместо календаря в ландшафтном режиме
-[Исправлено] Ненужная миграция настроек при восстановлении их из бэкапа
-
-3.1.4
-[Исправлено] Зависание EdXposed Manager при запуске (всё равно может происходить на EdXposed SandHook, если включена опция Свой репозиторий)
-[Исправлено] Поиск недавно добавленных модов
-
-3.1.3
-[Новое] Действие: Принудительное закрытие текущего приложения
-[Новое] Действие: Переключение мобильной точки доступа
-[Новое] Скрыть строку состояния на экране блокировки
-[Новое] Скрыть подсказку разблокировки на экране блокировки
-[Новое] Не проигрывать звук уведомления при включенном экране
-[Новое][Полноэкранные жесты навигации][MIUI 12] Действие на свайп вверх в углу
-[Исправлено][Данные о приложении при инсталляции] Вместить в новое окно диалога установщика пакетов Google
-[Исправлено] Высота панели навигации
-Доп. репозиторий для EdXposed Менеджера с модулем CustoMIUIzer в нём для более надёжной загрузки данных о модуле
-Обновлён дизайн Китайский Новый Год
-Добавлен новый дизайн ₿
-
-3.1.2
-[Новое] Требовать разблокировки девайса для переключения выбранных Быстрых настроек
-[Исправлено][Раздельные настройки громкости] Вылет настроек громкости
-[Исправлено][Показывать данные зарядки] Совместимость со старыми версиями Android
-[Исправлено] Некоторые моды Рабочего стола не сохраняли изменения после перезагрузки
-
-3.1.1
-[Исправлено][Убрать анимацию разблокировки] Совместимость с последними версиями Рабочего стола MIUI
-[Исправлено] Вылет настроек модуля на старых версиях Android
-
-3.1.0
-[Новое] Пропуск защиты приложения для выбранных компонентов (имена компонентов защищённых приложений пишутся в Xposed лог при их запуске)
-[Улучшено][Показывать данные зарядки] Отображать данные батареи (ток, напряжение, потребление энергии, температура)
-[Улучшено][Пользовательские действия на локскрине] Опция для выравнивания списка действий по горизонтали
-[Улучшено][Отключить блокировку] Пропуск разблокировки по лицу опционален
-[Улучшено][Расширенное меню питания] Быстрые анимации и динамическое размытие фона
-Мелкие улучшения производительности
-Поддержка EdXposed 0.5.x.x (требуется сборка 4653+):
- Настройки модуля будут мигрированы для работы с новой версией EdXposed Framework при первом запуске интерфейса модуля.
- Перед обновлением рекомендуется сделать бэкап настроек встроенным менеджером.
- Для загрузки старых настроек нужно отключить EdXposed Framework или понизить его версию до 0.4.x.x.
- Запуск любого приложения на устройстве может иметь доп. задержку в зависимости от количества активированных модов.
- Виноват новый принцип работы EdXposed, и исправить это невозможно не сломав некоторые системные моды.
-
-3.0.6
-[Новое][MIUI 12] Разрешить совместное использование разделения экрана и плавающих окон
-[Новое][MIUI 12] Отключать Центр управления когда устройство заблокировано
-[Новое][MIUI 12] Изменить максимальное число строк в уведомлениях в стиле сообщений (может исправить баг с обрезанием кнопок действий)
-[Новое][MIUI 12] Вернуть минималистичный свёрнутый вид уведомлений низкой важности
-[Новое][MIUI 12] Открытие настроек канала вместо общих настроек уведомлений приложения из меню уведомления
-[Улучшено][Отключить блокировку] Не начинать разблокировку по лицу и не прятать содержимое всех уведомлений, если блокировка была пропущена
-[Улучшено][Разрешить плавающее окно] Поддержка чёрного списка для запрета открытия плаващих окон из всплывающих уведомлений
-[Улучшено][Компактные уведомления][MIUI 12] Уменьшен отступ снизу в MIUI стиле
-[Исправлено][Пользовательские действия на локскрине] Нулевой отступ сверху для списка действий на некоторых устройствах
-[Исправлено][Запоминать состояние плавающих окон] Запоминать состояние при запуске из верхнего виджета в списке последних приложений
-[Исправлено][Размытие фона списка последних приложений] Совместимость с последними версиями Рабочего стола MIUI
-[Исправлено] Вылет настроек модуля на MIUI 11 и ниже
-
-3.0.5
-Откат изменений в версии 3.0.2, которые делают некоторые системные моды нерабочими
-
-3.0.4
-[Исправлено][Подробный индикатор скорости соединения] Отображение корректных значений при активном VPN
-[Исправлено] Вылет настроек модуля
-[MIUI 12] Совместимость с Центром управления:
- Показать уровень освещённости
- Показывать процент яркости
- Отключить ползунок яркости
- Управление жестами в статусбаре
- Размытие фона панели уведомлений
-
-3.0.3
-[Новое] Аудио глушитель: позволяет заглушить любой уникально опознаваемый звук
-[Новое][MIUI 12] Перманентные плавающие окна: запоминание состояния, позиции и размеров
-[Новое][MIUI 12] Разрешить открывать любое приложение в плавающем окне
-[Улучшено][Размытие фона списка последних приложений] Совместимость со списком из Рабочего стола MIUI
-[Исправлено][Действие открытия Быстрых Настроек][MIUI 12] Также открывать Центр управления
-[Исправлено][Подробный индикатор скорости соединения] Совместимость с Android 7.1
-[Исправлено][Пользовательские действия на локскрине] Совместимость с Android 7.1
-[Исправлено][MIUI 12] Вылет настроек модуля на бета прошивках
-
-3.0.2
-[Новое] Отключить заглушение музыки в режиме Не беспокоить
-[Новое] Переключение режима Не беспокоить вместо Бесшумного режима из свёрнутого диалога громкости
-[Новое] Время перед автоскрытием диалога громкости
-[Новое] Нижний отступ в Google Клавиатуре
-[Новое][MIUI 12] Разрешить плавающее окно по свайпу вниз, если у уведомления задано подходящее действие на нажатие
-[Улучшено][Компактные уведомления][MIUI 12] Увеличена высота кнопок действий
-[Исправлено][Показ будильника на локскрине] Совместимость со стилем часов от супер обоев
-[Исправлено][Пользовательские действия на локскрине] Совместимость с некоторыми древними версиями Андроида
-[Исправлено][Свайп вниз по всплывающим уведомлениям] Игнорировать уведомления с плавающими окнами
-[Исправлено] Показ секунд на часах в строке состояния
-[Исправлено] Скрытие иконки отстутствия SIM карты
-
-3.0.0
-[Новое] Увеличение лимита активных уведомлений от одного приложения
-[Новое] Увеличение/отключение лимита на количество иконок уведомлений в строке состояния
-[Новое] Отключение принудительного тёмного режима
-[Новое][MIUI 12] Сворачивать заголовки MIUI
-[Улучшено][Высота навбара, Отступ доп. кнопок навбара] Увеличен диапазон значений
-[Улучшено][Доп. сведения о приложении] Версия кода APK
-[Исправлено][Показывать секунды в строке состояния] Добавление секунд дважды
-[Исправлено][Высота и ширина области срабатывания жеста Назад] Поддержка жестов из MIUI Launcher
-[Исправлено][Жесты ланчера] Свайп вверх и вниз; совместимость с последними версиями MIUI Launcher
-[Исправлено][Действия на отпечаток пальца при звонке] Действие на долгое нажатие
-[Исправлено][Раздельные настройки громкости] Правильное отображение слайдера уведомлений в заглушённом состоянии в диалоге громкости при включенном режиме Не беспокоить
-Коронавирусный анти-праздник снова с нами! Теперь ещё более вирусный!
-Совместимость с MIUI 12:
- Иконка быстрого доступа
- Анимация при повороте
- Пользовательские ярлыки на экране блокировки (запуск без разблокировки)
- Раздельные настройки громкости
- Компактные уведомления
- Расширенное меню уведомления
- Приложение быстрого доступа/Часов/Календаря в панели уведомлений
- Показ будильника на экране блокировки
- Скрыть верхний блок на экране блокировки
- Увеличение числа отложенных интервалов уведомлений
- Доп. сведения о приложении
- Горизонтальные жесты
-
-2.2.1
-[Новое] Отключение кнопки экстренного вызова на экране блокировки
-[Улучшено][Конфигурация снимков экрана] Опция для выбора произвольной папки сохранения
-[Улучшено][Дополнительные элементы всплывающего сообщения] Отключение родного добавления названия приложения на китайских прошивках
-[Улучшено][Расширенное меню уведомления] Отображение всех иконок в один ряд в уведомлениях минимальной важности, чтобы они влезали по высоте, когда уведомление свёрнуто
-[Исправлено][Раскрасить заголовок уведомления] Не применять к стилизированным медиа уведомлениям
-[Исправлено][Задержка перед выключением на экране блокировки] Мод также влиял на задержку вне экрана блокировки
-Исправления интерфейса настроек модуля
-
-2.2.0
-[Новое] Использовать родной список последних приложений вместо списка из Рабочего стола MIUI
-[Улучшено][Обложка альбома на обоях] Опция для конвертации обложки в чёрно-белое изображение
-[Улучшено][Показывать ток зарядки] Опция для добавления значения после/перед/новой строкой
-[Исправлено][Пользовательские действия на локскрине] Действие на свайп влево и замена правой иконки: совместимость с последними бета прошивками
-[Исправлено][Пользовательские действия виджета безопасности] Совместимость со списком последних приложений из Рабочего стола MIUI
-[Исправлено][Убрать кнопку очистки] Совместимость со списком последних приложений из Рабочего стола MIUI
-[Исправлено][Убрать анимацию разблокировки] Совместимость с последними бета прошивками; также отключает анимацию затухания/уменьшения экрана блокировки
-[Исправлено][Использовать старую анимацию запуска] Совместимость с последними альфа версиями Рабочего стола MIUI
-[Исправлено][Исправить анимацию рабочего стола] Совместимость с последними альфа версиями Рабочего стола MIUI
-[Исправлено][Данные о приложении при инсталляции] Совместимость с последней версией установщика пакетов MIUI
-[Исправлено][Время показа всплывающего скриншота] Совместимость с последними бета прошивками
-Отображение главного меню на всех страницах настроек модуля
-Новый анти-праздничный дизайн ☣️
-
-2.1.5
-[Новое] Усложнить PIN в Защите приложений
-[Новое] Отображение значения текущего тока зарядки в нижней области экрана блокировки
-[Улучшено][Индикатор батареи полоской] Опция для отображения только в панели уведомлений и на экране блокировки
-[Улучшено][Менеджер отложенных уведомлений] Опция для безвременного отключения уведомления (до следующей перезагрузки)
-[Исправлено][Менеджер отложенных уведомлений] Правильное время до возобновления показа отложенного уведомления
-
-2.1.4
-[Новое] Изменение задержки перед скрытием плавающего окна с только что сделанным снимком экрана
-[Новое] Неограниченное число иконок в доке рабочего стола
-[Улучшено][Индикатор батареи полоской] Выравнивание по низу (индикатор также будет внизу экрана в панели уведомлений и на экране блокировки)
-[Исправлено][Использовать всю ширину папки] Обрезанные иконки при анимации закрытия папки
-
-2.1.3
-[Новое] Скрыть оверлеи при создании снимка экрана
-[Новое] Поддержка обратной портретной ориентации рабочим столом
-[Улучшено][Динамический индикатор экранов] Опция для показа только в режиме редактирования
-[Улучшено][Пределы автояркости] Опция для переключения на нелинейную шкалу для старых версий Android (использовать, если мод задаёт неверные проценты)
-[Улучшено][Очистка меню "Открыть с помощью"] Скрытие приложений из меню на основе типа открываемого контента
-[Улучшено][Визуализация музыки] Опция для отображения визуализации только при наличии медиа контроллера (обычно создаётся аудио плеерами для уведомлений с кнопками управления)
-[Исправлено][Визуализация музыки] Визуализация не показывалась сразу после открытия шторки
-
-2.1.2
-[Новое][Скрытие иконок] Скрывать иконку VoWiFi
-[Новое][Рабочий стол MIUI] Убрать анимацию разблокировки
-[Новое][Рабочий стол MIUI] Использовать старую анимацию запуска
-[Улучшено][Показать уровень освещённости] Пониженная частота обновлений для предотвращения хаотичного изменния значений
-[Исправлено][Скрыть предупреждение о низком заряде батареи] Совместимость с некоторыми прошивками
-[Исправлено][Очистить все последние приложения] Совместимость с Android 10
-Исправление вылетов интерфейса модуля
-
-2.1.1
-[Новое] Не показывать диалог при достижении небезопасного уровня громкости
-[Новое] Не показывать диалог о низком заряде батареи
-[Новое] Отключить скриншот на одновременное нажатие кнопки питания и понижения громкости
-[Новое] Не включать экран при нажатии на сканер, если не заданы отпечатки
-[Новое] Начать разблокировку устройства при нажатии на нижнюю область экрана блокировки
-[Новое][Скрытие иконок] Скрывать иконку Wi-Fi
-[Улучшено][Пределы автояркости] Минимальное и максимальное значение автояркости в процентах
-[Улучшено][Визуализация музыки] Более высокая скорость отрисовки в некоторых случаях; опция для выбора метода отрисовки
-[Исправлено][Раскрасить заголовок уведомления] Совместимость с Android 10
-
-2.1.0
-[Улучшено][Расширенное меню уведомления] Всегда открывать страницу с данными о приложении в MIUI стиле
-[Улучшено][Android 9+] Поддержка режима списка приложений (чёрный/белый список) (некоторые моды всё равно могут не работать, поэтому предупреждение останется)
-[Исправлено] Не вибрировать при неудачной аутентификации отпечатком
-[Исправлено] Вылет в списке отложенных уведомлений
-[Исправлено][Напоминание о пропущенном звонке] Останавливать играющий рингтон при удалении уведомления о пропущенном звонке
-[Исправлено][Компактные уведомления] Некорректная высота кнопок действий в некоторых уведомлениях
-[Исправлено][Управление жестами в строке состояния] Мод был сломан на старых версиях Android после недавних изменений
-Новый праздничный дизайн 🐀🏮
-Совместимость с Android 10:
- Не включать экран при зарядке/подключении наушников
- Не требовать пароль после загрузки
- Отключить блокировку
- Закрепление ориентации
- Слайдер медиа позиции
- Отключить избыточную прокрутку
- Скрыть в недавних
- Время отображения всплывающих сообщений
- [Авторизация отпечатком] Вибрация при успехе, отключение вибрации при неудаче, включение экрана при неудаче
-
-2.0.10
-[Новое] Больше опций времени и менеджер отложенных уведомлений
-[Новое] Закрывать все запущенные приложения при нажатиии на кнопку очистки в списке последних приложений
-[Новое] Убрать ползунок яркости или сделать его только для отображения
-[Улучшено][Множитель шагов громкости] Множитель до 5x
-[Улучшено][Быстрый фонарик] Временно отключать пробуждение при взятии в руки, если фонарик активен
-[Улучшено][Управление жестами в строке состояния] Показывать процент при изменении яркости, если включен мод "Показывать процент яркости"
-[Исправлено][Время показа всплывающих сообщений] Совместимость с некоторыми прошивками
-[Исправлено][Android 7] Вылет в некоторых списках приложений
-
-2.0.9
-[Новое] Время показа всплывающих сообщений
-[Новое] Не показывать вертикальный разделитель между временем и индикатором скорости на устройствах с вырезом-каплей
-[Новое] Разрешить добавлять виджеты и приложения на любой экран рабочего стола MIUI на планшетах
-[Новое][Дополнительные кнопки навбара] Опция для увеличения расстояния от кнопок до краёв экрана
-[Новое][Отключить блокировку] Tasker плагин для принудительного включения/выключения блокировки
-[Улучшено][Отключить блокировку] Опция для обязательной аутентификации после перезагрузки
-[Улучшено][Отключить блокировку] Изменение блокировки сразу при изменении статуса Bluetooth подключений
-[Исправлено][Действие инвертирования цветов] Восстанавливать цветовую схему/режим чтения после отключения инвертирования
-[Исправлено][Визуализация музыки] Определение статуса проигрывания музыки на некоторых прошивках; также визуализация теперь будет активна при проигрывании любой музыки, а не только той, что имеет медиа уведомление
-
-2.0.8.1
-[Исправлено][Управление звонками отпечатком] Ошибка при активации мода, которая также влияла на работоспособность других модов
-
-2.0.8
-[Новое] Настройка формата, качества и папки сохранения скриншотов
-[Новое] Принятие или отклонение входящих вызовов и завершение текущего вызова с помощью сканера отпечатков
-[Новое] Отступ дока ланчера снизу
-[Новое][Исправление багов рабочего стола] Всегда открывать данные о приложении в стиле MIUI из меню по долгому нажатию
-[Улучшено][Сетка Быстрых Настроек] До 7 колонок
-[Улучшено][Пользовательские ярлыки на локскрине] Разрешить показ всего приложения полностью на экране блокировки, а не только одной activity
-[Улучшено][Пользовательские ярлыки на локскрине] Запуск приложений Mi Home и Mi Пульт без разблокировки, если включена соответствующая опция для ярлыков
-[Исправлено][Раздельные настройки громкости] Вылет в настройках звука
-[Исправлено][Скрытие иконок] Скрывать иконку зарядки внутри иконки батареи
-Праздник к нам приходит! :)
-
-2.0.7
-[Новое][Исправление багов рабочего стола] Применение масштабирования продолжительности аниматоров значений к некоторым анимациям ланчера
-[Улучшено][Все ориентации] Опция для включения и отключения
-[Улучшено][Закрывать папки автоматом] Опция для включения и отключения
-[Улучшено][Раздельные настройки громкости] Новые иконки в Настройках для слайдеров громкости уведомлений и системных звуков
-[Улучшено][Управление жестами в строке состояния] Лучший метод обработки скольжения с настраиваемой чувствительностью
-[Исправлено][Действие переключения автоповорота] Неправильная ориентация в некоторых случаях
-[Исправлено][Пользовательские ярлыки на локскрине] Совместимость с последними прошивками
-
-2.0.6
-[Новое] Свободное изменение размера любых виджетов (за исключением некоторых виджетов MIUI)
-[Новое] Отображение времени следующего будильника на экране блокировки
-[Новое][Управление жестами в строке состояния] Регулировка яркости или громкости скольжением 1 или 2 пальцами; действие на двойное нажатие
-[Улучшено][Управлять курсором ввода] Чёрный список
-[Исправлено][Высота строки состояния] Обновление отступа сверху в ланчере для соответствия изменённой высоте строки состояния
-[Исправлено][Минимальная автояркость] Совместимость с некоторыми прошивками на Android 8
-
-2.0.5
-[Новое] Уменьшение интенсивности вибрации (силы или продолжительности) в указанные часы
-[Новое][Полноэкранные жесты навигации] Ширина области срабатывания жеста Назад
-[Улучшено][Пользовательские ярлыки на локскрине] Неограниченное количество ярлыков с иконками приложений и выравниванием по верху/низу
-[Улучшено][Модификация названий приложений] Поддержка клонированных приложений
-Выбор языка интерфейса
-Улучшение интерфейса модуля: сохранение текущего состояния при смене конфигурации; правильный размер чекбоксов в тёмном режиме
-
-2.0.4
-[Новое] Опции размытия фона папок (требуется Рабочий стол MIUI с поддержкой размытия фона в папках)
-[Улучшено][Показывать процент яркости] Настраиваемый отступ сверху
-[Улучшено][Наложение цвета на фон папок] Настраиваемый уровень затемнения/осветления; плавное изменение прозрачности наложения при открытии папки
-[Улучшено][Очистка меню "Открыть с помощью"] Скрытие приложений, способных открывать ссылки с протоколами http, https и vnd.youtube
-[Улучшено][Модификация названий приложений] Изменение названий в полном списке приложений
-[Улучшено][Дополнительные кнопки навбара] Чуть больше расстояние между оригинальными кнопками, кнопка полноэкранного режима сдвинута вправо для предотвращения обрезания
-[Исправлено][Действия на долгое нажатие клавиш громкости] Поддержка опции включения экрана при одиночном нажатии
-[Исправлено][Пользовательские ярлыки на локскрине] Совместимость с последними прошивками
-
-2.0.3
-[Новое][Число колонок в папках] Использовать всю ширину папки
-[Улучшено][Размытия фона диалога громкости] Отключено затемнение фона при активном размытии
-[Исправлено][Действия на ярлыках в списке последних приложений] Отсутствовали названия некоторых действий
-[Исправлено][Режим совместимости ланчера] Теперь действительно работает
-[Исправлено][Показывать процент яркости] Совместимость с некоторыми прошивками
-Улучшение поддержки тем оформления, исправления интерфейса
-
-2.0.2
-[Новое] Разрешить любому уведомлению из MIUI приложений отображаться на экране блокировки и в виде всплывающего
-[Новое] Скрыть панель Быстрых Настроек и слайдер яркости в режиме развёрнутых уведомлений на экране блокировки
-[Новое] Убрать фон панели уведомлений на экране блокировки
-[Новое] Действия запуска на двойное нажатие кнопки питания
-[Улучшено][Число колонок в папках] Опция уменьшения боковых отступов для 4 и более колонок
-[Улучшено][Показать названия в доке] Дополнительный отступ дока снизу при включенных полноэкранных жестах (только для MIUI ланчера)
-[Улучшено][Отключить проверку подписи] Пропуск проверки в MIUI установщике
-[Улучшено][Показывать секунды] Равные промежутки обновления
-[Улучшено][Фон папок] Использовать белый цвет для светлых обоев
-[Исправлено][Слайдер медиа позиции] Совместимость с некоторыми прошивками
-Долгое нажатие на строку поиска показывает список новых модов
-Прокручивать до найденного мода и красиво его подсвечивать :)
-Чекбоксы в MIUI стиле в списках на MIUI 11
-Адаптивная иконка модуля
-
-2.0.1
-[Новое] Показывать названия приложений в доке ланчера
-[Новое] Разрешить запись видео и скриншоты во всех приложениях
-[Новое] Размытие фона в свёрнутом и развёрнутом диалогах громкости
-[Новое] Режим совместимости для всех модов ланчера
-[Улучшено][Разблокировать размеры сетки] Сетка ланчера до 8x8
-[Улучшено][Обложка альбома на обоях] Масштабирование обложки
-Исправления интерфейса настроек модуля
-
-2.0.0
-[Новое] Альтернативная иконка кнопки Назад в режиме ввода
-[Новое] Заменить ленту виджетов на Google Discover в MIUI ланчере
-[Новое] Использовать установщик пакетов MIUI по умолчанию и разрешить ему обновление системных приложений
-[Улучшено][Слайдер медиа позиции] Опция для переключения на системный стиль слайдера
-[Улучшено][Данные о приложении при инсталляции] Поддержка установщика пакетов MIUI
-[Улучшено][Контроль состояния приложений] Возможность отключать больше приложений (Системный рабочий стол, Поиск устройства и пр.)
-[Исправлено][Продолжительность затемнения] Совместимость с некоторыми прошивками, теперь настраивается в процентах от задержки выключения экрана
-[Исправлено][Пользовательские действия на локскрине] Запуск действий, назначенных на ярлыки
-[Исправлено][Действия навбара] Медиа действия при долгом нажатии основных кнопок
-Совместимость с MIUI 11:
- Иконка быстрого доступа
- Дополнительные элементы всплывающих уведомлений
- Разблокировать ланчеры
- Слайдер медиа позиции
- Действие открытия меню
-
-1.8.1
-[Новое] Переключатель тёмного режима в Быстрых Настройках
-[Новое] Скрыть названия приложений в ланчере
-[Новое] Горизонтальные отступы сетки ланчера
-[Новое] Отступ сетки ланчера сверху
-[Новое] Высота индикатора страниц ланчера
-[Новое] Отображение уровня яркости в процентах при изменении яркости слайдером
-[Улучшено][Число рядов в панели Быстрых Настроек] Опция для 2 рядов с уменьшенной высотой БН
-[Исправлено][Размер шрифта для названий в ланчере] Не применять размер к заголовку открытой папки
-[Исправлено][Пользовательские действия на локскрине] Замена иконки и текста справа; Запуск стоковой камеры, если не задано пользователькое действие
-[Исправлено][Расширенное меню питания] Перезапуск интерфейса (System UI)
-Мелкие исправления интерфейса модуля
-
-1.8.0
-[Новое] Действие: Переключение режима управления одной рукой
-[Новое] Отображение данных об устанавливаемом приложении в окне инсталлера
-[Новое] Отключение избыточной прокрутки в списках
-[Новое] Размер шрифта для названий в ланчере
-[Новое] Отступ сверху для названий в ланчере
-[Новое] Поддержка клонированных приложений в модах:
-- Защита приложений
-- Скрытые приложения
-- Очистка меню "Поделиться"
-- Очистка меню "Открыть с помощью"
-- Доп. сведения о приложении
-- Расширенное меню уведомления
-- Приложение быстрого доступа/часов/календаря в панели уведомлений
-- Действия Запустить приложение и Запустить компонент
-[Улучшено][Число колонок в папках ланчера] Увеличенная ширина сетки в папках
-[Улучшено][Конфигурация USB по умолчанию] Не показывать диалог при подключении автоматически на последних прошивках
-[Улучшено][Визуализация музыки] Настраиваемый интервал смены динамического цвета
-[Исправлено][Минимальная автояркость] Совместимость с некоторыми прошивками
-[Исправлено][Скрывать тип мобильной сети] Совместимость с некоторыми прошивками
-[Исправлено][Пользовательские действия на локскрине] Совместимость с последними прошивками
-[Исправлено][Убрать скрытую папку] Совместимость с последними прошивками
-[Исправлено][Число колонок в свёрнутой панели Быстрых Настроек] Совместимость с последними прошивками
-Сжатие подробных отчётов для сохранения драгоценного траффика
-
-1.7.5
-[Новое] Отключение проверки подписи APK при обновлении приложений
-[Новое] Продолжительность затемнения перед автоматическим выключением экрана
-[Улучшено][Визуализация музыки] Опция динамического цвета (меняет цвет на случайный каждые 10 секунд)
-[Исправлено][Модификация названий приложений] Совместимость с последними альфа версиями ланчера
-[Исправлено][Конфигурация USB по умолчанию] Неправильное значение по умолчанию
-[Исправлено][Минимальная автояркость] Совместимость с некоторыми прошивками
-[Исправлено][Расширенное меню уведомления] Совместимость с некоторыми прошивками
-Определять, что установлено приложение TaiChi, и не жаловаться на отсутствие Xposed
-
-1.7.4
-[Новое] Менять громкость медиа при первом нажатии кнопки
-[Новое] Не вибрировать при переключении в режим "Без звука" и при включении вибрации в этом режиме
-[Улучшено][Индикатор батареи полоской] Нулевая высота полоски
-[Улучшено][Визуализация музыки] Настройка продолжительности анимации для изменения частоты обновления визуализации
-[Исправлено][Масштаб иконок ланчера] Масштаб метки на иконке приложения
-[Исправлено][Очистка меню "Открыть с помощью" и "Поделиться"] Совместимость с некоторыми прошивками
-[Исправлено] Круг для выбора цвета не отрисовывался на некоторых устройствах
-[Исправлено] Вылеты интерфейса модуля
-
-1.7.3
-[Новое] Действие: Выбор клавиатуры
-[Новое] Не показывать предупреждение о закрытой области динамика
-[Новое] Скрыть верхний блок на экране блокировки с часами, датой и прочими данными
-[Новое] Настраиваемые звук, вибрация и интервал напоминаний о пропущенном звонке
-[Новое] Переключение между тёмным/светлым/авто режимами интерфейса (делает то же, что и Тёмный режим в Настройках, опция главным образом для отключения тёмного режима на прошивках, котрые его не поддерживают)
-[Новое][Скрытие иконок] Скрытие иконки VoLTE в строке состояния
-[Исправлено][Показать уровень освещённости] Визуальный баг правой иконки на слайдере при изменении яркости
-[Исправлено][Масштаб иконок ланчера] Масштабировать виджеты быстрого доступа MIUI
-[Исправлено][Модификация названий приложений] Изменение названий без перезагрузки на последних версиях ланчера
-[Исправлено][Минимальная автояркость] Совместимость с некоторыми устройствами
-[Исправлено][Пользовательские ярлыки на локскрине] Совместимость с некоторыми прошивками
-[Исправлено][Подробный индикатор скорости соединения] Расстояние между скоростями при отсутствии иконок индикатора
-[Исправлено] Тёмный режим
-
-1.7.2
-[Новое] Показывать значение окружающей освещённости в люксах внутри ползунка яркости
-[Новое] Слайдер позиции в медиа уведомлениях
-[Новое] Включение экрана после неудачной авторизации отпечатком
-[Новое] LTE иконка вместо 4G
-[Новое] Показ интерфейса входящего звонка вместо уведомления
-[Новое] Настраиваемая яркость экрана во время звонка
-[Новое] Масштаб системной анимации от x0 до x10 с шагом в 0.1x
-[Новое] Масштаб иконок и папок в ланчере
-[Новое][Скрытие иконок] Скрытие иконок рабочего профиля и отсутствия SIM в строке состояния
-[Улучшено][Множитель шагов громкости] Шаг в 0.25x
-[Удалено][Режим "В кармане"] Мод потреблял батарею во время сна, получая значения от датчика приближения раз в секунду; ультразвуковые сенсоры ненадёжны в подобных ситуациях, т.к. начинают возвращать верные значения только спустя 1 секунду
-[Исправлено][Расширенное меню уведомления] Вертикальная позиция при выключенном моде Компактные уведомления
-[Исправлено][Пользовательские действия на локскрине] Восстанавливать оригинальное изображение камеры справа, если в моде не выбрано действие; Лучшая совместимость с некоторыми прошивками
-[Исправлено][Скрыть кнопку удаления] Совместимость с новыми прошивками
-[Исправлено][Android 7] Не работала замена изображений в ресурсах (влияло на несколько модов)
-[Исправлено] Списки выбора одиночного приложения в настройках модуля
-[Улучшено] Категоризация настроек модов
-
-1.7.1
-[Исправлено][Высота строки состояния, Высота панели навигации] Неполное изменение высоты, медленная загрузка, бутлупы
-[Исправлено][Пользовательские действия на экране блокировки] Скрытие иконки слева при отключении свайпа вправо; Лучшая совместимость с некоторыми прошивками
-[Исправлено][Быстрый фонарик, Действия на долгое нажатие кнопок громкости] Совместимость с режимом AOD ("Экран всегда активен")
-
-1.7.0
-[Новое] Отключение любых уведомлений, включая системные
-[Новое] Настраиваемые действия на ярлыки и жесты на экране блокировки
-[Новое][Скрытие иконок] Скрытие иконок VPN и мобильной точки доступа в строке состояния
-[Улучшено][Раздельные настройки громкости] Ползунок уведомлений в развёрнутой панели громкости теперь опциональный
-[Исправлено][Расширенное меню уведомления] Вертикальная позиция
-[Исправлено][Скрыть кнопку удаления, Конфигурация USB по умолчанию, Действия на долгое нажатие кнопок навбара] Совместимость с некоторыми прошивками
-[Исправлено][Контроль состояния приложений, Доп. сведения о приложении] Совместимость с последними версиями приложения Безопасность
-Поддержка замены ресурсов в Xposed framework больше не требуется для работы модуля
-
-1.6.7
-[Новое] Настраиваемая полоска-индикатор батареи
-[Новое] Скрытие иконок в строке состояния
-[Новое] Показывать иконку будильника только за указанное количество часов до его срабатывания
-[Новое] Скрывать иконку Bluetooth когда нет подключенных устройств
-[Новое] Запретить стандартному MIUI действию насильно закрывать указанные приложения
-[Новое] Действия: Запуск любого компонента из любого установленного приложения
-[Новое][Android 9+] Показывать лупу при выделении текста (только для элементов основанных на TextView)
-[Улучшено] Выбор цвета в настройках модуля (поддержка тёмных цветов и ландшафтного режима)
-[Исправлено][Совместимость будильника] Отображалось неверное время срабатывания
-[Исправлено] Баги интерфейса
-
-1.6.6
-[Новое] Разрешить все ориентации экрана
-[Новое] Виброотклик при успешной аутентификации
-[Новое] Убрать виброотклик при неудачной аутентификации
-[Новое] Очистка меню "Открыть с помощью"
-[Новое] Конфигурация USB по умолчанию при подключении к другим устройствам
-[Новое][Визуализация музыки] Опция, добавляющая свечение
-[Новое][Подробный индикатор скорости соединения] Опционально делать индикатор полупрозрачным, если обе скорости равны нулю
-[Новое] Опция для пометки новых модов определённое количество дней посе обновления или всегда
-[Улучшено][Виброотклик при переключении настроек] Опция для игнорирования отключения виброотклика в системных настойках
-[Улучшено][Раздельные настройки громкости] Добавление ползунка уведомлений в раскрытый диалог громкости
-[Улучшено][Доп. сведения о приложении] Открытие приложения в Play Маркете, копирование имени APK и пути к данным в буфер обмена
-[Исправлено][Визуализация музыки] Цвета радуги горизонтально на версиях Android ниже 9
-[Исправлено] Действия на ярлыки виджета безопасности в списке последних приложений
-
-1.6.5
-[Новое] В выбранных приложениях правильно показывать время следующего будильника, установленного стандартным приложением часов MIUI
-[Новое] Заставить выбранные приложения игнорировать входящие звонки и продолжать играть аудио
-[Новое] Улучшенная версия функции Защита приложений, позволяющая заблокировать любое установленное приложение
-[Новое] Бесконечная прокрутка в MIUI/POCO ланчерах - позволяет переходить с последнего экрана на первый и обратно
-[Новое] Автоскрытие индикатора экранов в MIUI ланчере
-[Новое][Действия на отпечаток пальца] Опция для отключения действий при активном звонке
-[Улучшено] Действие открытия диалога громкости открывает диалог, который регулирует правильную громкость при активном звонке
-[Исправлено][Визуализация музыки] Отрисовка пунктирных полосок и кругов на версиях Android ниже 9
-[Исправлено] Прочие мелкие баги и вылеты
-
-1.6.4
-[Новое][Визуализация музыки] Опция для рисования визуализации поверх стороннего экрана блокировки
-[Улучшено][Визуализация музыки] Рисование визуализации поверх фона из темы в панели уведомлений
-[Исправлено][Обложка альбома на обоях] Отключение на сторонних экранах блокировки
-[Исправлено][Раздельные настройки громкости] Сохранять системную громкость между перезагрузками
-[Исправлено] Скрытие подписей к переключателям в Быстрых Настройках
-[Исправлено снова] Подробный индикатор скорости соединения
-
-1.6.3
-[Новое] Скрыть панель навигации
-[Новое] Визуализация музыки на экране блокировки и в панели уведомлений
-[Новое][Подробный индикатор скорости соединения] Выбор размера шрифта
-[Исправлено] Подробный индикатор скорости соединения
-[Исправлено] На некоторых устройствах действие выключения экрана приводило к невозможности включить его обратно
-[Исправлено][Очистка меню "Поделиться"] Удаление смс приложений приводило к их неработоспособности
-[Улучшено][Не скрывать уведомления] Совместимость с новыми прошивками
-[Улучшено] Открытие EdXposed Manager из меню в настройках модуля
-
-1.6.2
-[Новое] Высота панели навигации
-[Новое] Минимальное значение автояркости
-[Новое] Не блокировать приложения при блокировке устройства (когда выбрана опция с блокировкой после закрытия)
-[Новое] Изменение интервала между закрытием приложения и его блокировкой
-[Исправлено][Очистка меню "Поделиться"] Не все приложения были доступны для удаления
-[Исправлено][Иконка быстрого доступа] Улучшена совместимость, добавлен выбор позиции в списке
-
-1.6.1
-[Новое] Больше интервалов для таймеров бесшумного режима и режима не беспокоить
-[Новое] Удаление приложений из меню Поделиться
-[Новое] Запрет выбранным приложениям показывать всплывающие сообщения
-[Новое] Более тёмная тень у названий приложений в ланчере
-[Новое] Убрать ограничение на сторонние ланчеры на китайских прошивках
-[Новое] Действия для 4 ярлыков в виджете безопасности в списке последних приложений
-[Новое] Действие на двойное нажатие на пустое место в ланчере
-[Новое] Действия: Открыть меню, Открыть панель громкости, Увеличить громкость, Уменьшить громкость
-[Новое] Ярлык для разблокировки учётных данных (долгое нажатие на иконку CustoMIUIzer в ланчерах, поддерживающих подобные ярлыки)
-[Новое] Функция поиска модов в настройках модуля
-[Исправлено] Отключение жестов в ланчере в режиме редактирования
-[Улучшено][Подробный индикатор скорости соединения] Совместимость с новыми прошивками
-
-1.6.0
-[Новое] Поддержка POCO Launcher для некоторых модов
-[Новое] Поддержка MIUI Launcher до версии 4.9.5-dev
-[Новое] Исправление цвета содержимого строки состояния в зависимости от светлых/тёмных обоев на версии ланчера для разработчиков
-[Новое] Одинаковые цвета фона строки состояния и панели действий приложения, где это возможно
-[Новое] Выбор приложений, которые будут запущены при тапе по часам, дате и иконке над батареей в заголовке открытой панели уведомлений
-[Новое] Действие: Назад
-[Новое] Поддержка тёмного режима для настроек модуля (цвет текста в некоторых диалогах неправильный, исправлению пока не поддаётся :))
-[Улучшено][Доп. кнопки на панели навигации] Левая и правая кнопки появляются независимо друг от друга
-
-1.5.7
-[Исправлено][Расширенное меню питания] Баг анимации кнопки выключения
-[Исправлено][Расширенное меню питания] Локализация
-[Исправлено] Разблокировать учётные данные
-[Улучшено] Обработка и логирование ошибок
-
-1.5.6
-[Новое] Расширенное меню питания (Fastboot/Recovery/Быстрая перезагрузка/Перезапуск интерфейса (System UI)/Перезапуск ланчера)
-[Новое] Возвращение режима "В кармане" в расширенные настройки экрана блокировки на устройствах с ультразвуковым датчиком приближения
-[Новое] Изменение высоты строки состояния
-[Новое] Настраиваемая сетка Быстрых Настроек (в свёрнутом и развёрнутом состоянии)
-[Новое] Скрыть все подписи в Быстрых Настройках
-[Новое] Скрыть кнопку для очистки списка последних приложений и памяти
-[Новое] Скрыть в шторке кнопку для удаления всех уведомлений
-[Новое] Возможность отключения (почти) любого приложения с его страницы "О приложении"
-[Новое] Активировать вместе горизонтальные жесты и панель навигации
-[Новое] Действия: Очистить память, Инвертировать цвета
-[Новое] Действия на долгое нажатие кнопок навбара Назад, Домой и Меню
-
-1.5.5
-[Новое] Переключатель в Быстрых Настройках для закрепления портретной или ландшафтной ориентации
-[Новое] Отключение заглушения музыки при проигрывании звуков уведомлений
-[Новое] Отключение действий на сканер отпечатка пальца в Камере
-[Новое] Автоматически закрывать папки в MIUI ланчере после запуска приложений
-[Новое][Улучшенные всплывающие уведомления] Задержка перед скрытием
-[Улучшено] Отображение выбранных приложений в начале списков в настройках модуля
-[Улучшено] Проверка на отключение замены ресурсов в Xposed Framework
-[Исправлено][Расширенное меню уведомления] Поддержка последней стабильной версии MIUI
-[Исправлено][Блокировка вибрации] Поддержка Android 7
-[Исправлено][Обложка альбома на обоях] Улучшена поддержка различных версий Android
-[Исправлено][Скрыть в недавних] Мод переключен с динамического на обычный для предотвращения бутлупов
-[Исправлено][Модификация названий приложений] Исправление багов
-
-1.5.4
-[Новое] Запретить выбранным приложениям использовать вибрацию
-[Новое] Модификация названий приложений на Рабочем столе MIUI
-[Новое][Отключить блокировку] Использовать доверенные Bluetooth устройства
-[Новое] Добавить иконку в ланчере или использовать ярлык для разблокировки учётных данных (авторизация в некоторых приложениях требует доступа к учётным данным, но при пропуске ПИН-кода/пароля/графического ключа после загрузки они остаются заблокированными)
-
-1.5.3
-[Новое] Показывать уведомления на экране блокировки даже после того как он был закрыт и потом открыт вновь
-[Новое] Новые действия в меню уведомления (открывается по свайпу влево) - открыть информацию о приложении и принудительно закрыть приложение
-[Новое] Не показывать иконку с 3 точками, когда активна опция скрытия иконок уведомлений
-[Новое][Виброотклик при переключении настроек] Опция сильной/слабой вибрации
-[Новое][Полноэкранные жесты навигации] Высота области срабатывания жеста Назад
-[Новое][Android 8+] Настройка числа уведомлений от одного приложения при котором срабатывает их автоматическая группировка
-[Исправлено][Прозрачность фона из темы] Отвязана от значения размытия фона панели уведомлений
-[Исправлено][Подробный индикатор скорости соединения] Чрезмерный отступ слева
-[Исправлено][Компактные уведомления] Баг с прозрачностью после открытия панели уведомлений
-[Исправлено] Улучшена обработка ошибок в модах
-Настройки модуля лучше организованы, добавлена новая индикация динамических модов
-
-1.5.2
-[Новое] Компактные уведомления
-[Новое] Улучшенные Скрытые приложения
-[Новое] Скрытие приложений из списка недавних
-[Новое] Виброотдача при переключении Быстрых настроек
-[Новое] Возможность скрыть иконку модуля в ланчере
-[Исправлено] Анимация затухания при повороте экрана
-[Исправлено] Системная настройка "Виброотклик" теперь влияет на вибрацию в модах
-[Исправлено] Баги интерфейса настроек модуля
-
-1.5.1
-[Новое][Разворачивать уведомления] Чёрно-белый список
-[Новое][Управлять курсором ввода] Опция для перемены местами направлений движения курсора
-[Новое][Скрывать тип мобильной сети] Скрывать полностью или только когда нет подключения
-[Новое] Не скрывать часы в статус баре на домашних экранах с виджетами часов
-[Новое] Разрешить установку старых версий приложений поверх новых
-[Новое] Действие открытия системного меню питания (на сканер отпечатка и доп. кнопки на навбаре)
-[Новое] Новенькая иконка быстрого доступа :)
-[Исправлено][Android 7] Расширенные уведомления
-[Исправлено] Определение установлен ли EdXposed Manager
-
-1.5.0
-[Новое][Рабочий стол MIUI] Затемнение фона папок
-[Новое][Рабочий стол MIUI] Разблокировка размеров сетки от 3x4 до 6x7
-[Новое][Рабочий стол MIUI] Количество столбцов в папках
-[Новое] Анимация при повороте экрана (плавный переход или без анимации)
-[Новое] Открытие панели уведомлений автоматически при получении уведомлений от выбранных приложений
-[Новое] Отображение обложки текущего трека в качестве обоев на экране блокировки
-[Новое][Улучшенные всплывающие уведомления] Не скрывать автоматически
-[Новое][Улучшенные всплывающие уведомления] Свайп вниз открывает панель уведомлений
-[Исправлено][Отключение блокировки устройства] Выбор нескольких доверенных Wi-Fi сетей
-
-1.4.3
-[Новое] Динамическая блокировка устройства (полное отключение, блокировка только раз после загрузки, отключение блокировки в доверенных Wi-Fi сетях; также можно пропустить и экран блокировки)
-[Новое] Подробный индикатор скорости соединения (скорость и различные иконки для входящего/исходящего трафика, задание уровня низкой скорости для изменения индикации)
-[Новое] Частота обновления индикатора скорости
-
-1.4.2
-[Исправлено] Мод, задающий действие на свайп вверх в ланчере, заменяет стандартное действие (поиск)
-[Исправлено] Доп. проверка на использование сканера в моде действий на сканер отпечатка пальца
-[Новое] Настраиваемые задержки для двойного и долгого нажатия в моде действий на сканер отпечатка пальца
-
-1.4.1
-[Исправлено] Быстрый фонарик
-[Новое] Действие переключения на предыдущее приложение для кнопок навбара и сканера отпечатков
-[Новое] Опциональная вибрация при выполеннии действия на долгое нажатие кнопок громкости
-
-1.4.0
-[Новое] Настраиваемые действия на одиночное/двойное/долгое нажатие на сканер отпечатка пальца при включенном экране
-[Новое] Опция для запрета включения экрана при любом событии зарядки, либо только для тех, где нет анимации
-[Новое] Настраиваемое время удержания экрана включенным при старте анимации зарядки
-[Новое] Действия открытия панели уведомлений/быстрых настроек/последних приложений также закрывают их, если они уже открыты
-[Новое] Увеличение количества шагов громкости для всех типов потоков множителем
-
-1.3.1
-[Исправлено][Совместимость] MIUI 10.3
-[Исправлено] Длительность анимации при выключении экрана
-[Исправлено] Не включать экран при подключении зарядки (включая беспроводную)
-[Новое] Не включать экран при подключении наушников
-
-1.3.0
-[Исправлено][Совместимость] Загрузка настроек модуля на устройствах с зашифрованным хранилищем. Перед установкой данной версии стоит сделать бэкап настроек, т.к. они будут сброшены до дефолтных!
-[Исправлено][Совместимость] Доп. сведения о приложении
-[Исправлено][Совместимость] Быстрый фонарик
-[Исправлено][Совместимость] Медиа действия на кнопки громкости
-[Исправлено][Совместимость] Все моды с настраиваемыми действиями/переключателями
-[Новое] Две новых кнопки на панели навигации с настраиваемыми действиями
-[Новое] Уровень прозрачности фона панели уведомлений из текущей темы
-[Новое] Скрыть иконку типа мобильной сети в строке состояния
-[Новое] Увеличить отступ справа для индикатора скорости трафика
-
-1.2.0
-[Новое] Отображать секунды на часах в статусбаре
-[Новое] Всегда показывать уведомления в полностью развёрнутом виде
-[Новое] Медиа действия на долгое нажатие клавиш повышения/понижения громкости при выключенном экране
-[Новое] Уровень размытия фона в окне последних приложений и в панели уведомлений
-[Перемещено] Мод "Управлять курсором ввода" был перемещён в категорию Управление, требуется повторная активация
-
-1.1.1
-[Новое] Отдельная громкость в Настройках для звонков/уведомлений/системных звуков
-[Новое] Перемещать курсор ввода текста кнопками громкости
-
-1.1.0
-[Новое] Двойное нажатие на экране блокировки для выключения экрана
-[Исправлено][Android 7.0+] Инициализация модуля, действия для переключателей. Моды всё равно могут не работать.
-
-1.0.1
-[Исправлено] Иконка быстрого доступа на некоторых устройствах
-[Исправлено] Проверка обновлений
-
-1.0.0
-Первый релиз
\ No newline at end of file
diff --git a/README.html b/README.md
similarity index 71%
rename from README.html
rename to README.md
index 9351f5d2..871d1614 100644
--- a/README.html
+++ b/README.md
@@ -1,23 +1,49 @@
-
+
-
+## CustoMIUIzer14 ([中文](./README_zh.md))
+Customize MIUI to your liking
-
What is CustoMIUIzer?
+For MIUI 13 & 14 based on android 12 and 13
+
+> Thanks for the awesome module from [Mikanoshi](https://code.highspec.ru/Mikanoshi/CustoMIUIzer)
+
+### Translations
+[](https://crowdin.com/project/customiuizer14)
+
+### Dowload
+* [Releases](https://github.com/MonwF/customiuizer/releases)
+* LSPosed Repo
+* [Test Releases](https://rz3kv5wa4g.jiandaoyun.com/dash/650e43a383027ec3225083e9)
+
+### Backup functionality
+Backups are stored in /sdcard/Documents/CustoMIUIzer/
+
+### Donate
+Via paypal
+* [$5](https://paypal.me/tpsxj/5)
+* [$10](https://paypal.me/tpsxj/10)
+* [Other](https://paypal.me/tpsxj)
+
+------
+
+## Original Readme
+
+### What is CustoMIUIzer? ###
CustoMIUIzer module contains a variety of mods that will provide additional functionality for your MIUI device. You have to have (Ed)Xposed Framework installed to use these mods. For more info about Xposed refer to the
original thread or
github repo of EdXposed (for Android 8-10) .
-
Compatibility
+### Compatibility ###
Module was written, tested and is mainly intended for MIUI 10-12.5 on Android 9-10.
Mods are not guaranteed to fully work on any other versions, especially lower MIUI versions.
APK installation is limited to Android 7+.
-
How to use CustoMIUIzer?
+### How to use CustoMIUIzer? ###
First you must have (Ed)Xposed Framework installed. After that enable CustoMIUIzer module in (Ed)Xposed Installer, set up mods you like and select 'Soft Reboot' from menu.
-
Backup functionality
+### Backup functionality ###
CustoMIUIzer supports settings backup and restore using local backup on SDCard/internal storage (find it in main window's menu).
It also supports automatic Google cloud backups (Android Backup Service).
-
Troubleshooting
+### Troubleshooting ###
You can send a detailed report with a description of your problem from CustoMIUIzer itself or create new issue on
issue tracker .
Common poblems
@@ -37,5 +63,3 @@
Troubleshooting
Xposed Module Repository
Google Play Store
Localization
-
-
\ No newline at end of file
diff --git a/README_jp.md b/README_jp.md
new file mode 100644
index 00000000..af06a0c4
--- /dev/null
+++ b/README_jp.md
@@ -0,0 +1,60 @@
+
+
+## CustoMIUIzer14 ([中国語](./README_zh.md))
+MIUIを自分好みにカスタマイズ
+
+Android 12/13ベースなMIUI 13/14に対応しています。
+
+### ダウンロード
+* [リリース](https://github.com/MonwF/customiuizer/releases)
+* LSPosedのリポジトリ
+* [テスト版リリース](https://rz3kv5wa4g.jiandaoyun.com/dash/650e43a383027ec3225083e9)
+
+### バックアップ機能
+バックアップは「/sdcard/Documents/CustoMIUIzer/」に保存されます。
+
+### 寄付
+PayPalから行えます
+* [$5](https://paypal.me/tpsxj/5)
+* [$10](https://paypal.me/tpsxj/10)
+* [その他](https://paypal.me/tpsxj)
+
+------
+
+## オリジナルのReadme
+
+### CustoMIUIzerとは? ###
+CustoMIUIzerモジュールは、あなたのMIUIデバイスに様々な追加機能を提供するMODが含まれています。これらのModを使用するには(Ed)Xposed Frameworkをインストールする必要があります。Xposedについては、オリジナル版のスレッド または、EdXposedのEdXposedのGitHubリポジトリ をご参照ください。(Android 8-10用)
+
+### 互換性 ###
+このモジュールは、Android 9-10がベースのMIUI 10-12.5を対象に作成と動作確認をしています。
+Modは、他のバージョンや下位バージョンのMIUIで完全に動作する事は保証していません。
+APKのインストールはAndroid 7以降に限定されます。
+
+### CustoMIUIzerを使用するには? ###
+始めに(Ed)Xposed Frameworkがインストールされている環境が必要になります。その後に(Ed)Xposed InstallerでCustoMIUIzerのモジュールを有効化し、好きなModを設定や選択を行なったら「ソフトリブート」を選択してください。
+
+### バックアップ機能 ###
+CustoMIUIzerは、SDカードまたは内部ストレージにローカルでバックアップと復元が行えます。(メインウィンドウ上のメニューに項目があります)
+その他にGoogleクラウドの自動バックアップ機能(Androidバックアップサービス)にも対応しています。
+
+### トラブルシューティング ###
+CustoMIUIzer上から問題の詳細を報告か、Issue Tracker で新規のIssueを作成する事が可能です。
+
+よくある問題
+
+モジュールとModを起動したが、デバイスの再起動後にどのModも一切動作をしていない。
+
+(Ed)Xposed Installer > ログを開き、情報を確認します。
+"Loading modules from .../name.mikanoshi.customiuizer/..."と言う行を探します。
+もし、次の行に「File does not exist」が含まれている場合はCustoMIUIzerを再インストールをしてみると良いかもしれません。
+次の行が何か他の物(error, exceptionなど)を含んでいた場合は、CustoMIUIzerから詳細なレポートを送信してください。問題が解決されることを願っています:)
+
+CustoMIUIzerからレポートを送信し、返信を待っています。レポートは届いていますか?
+
+連絡先を入力しないと絶対に返信は届きません。
+CustoMIUIzerのメイン画面 > 連絡先の情報にメールアドレス、ICQ、XDAまたは4PDAのニックネームを入力してください。
+
+Xposedモジュールのリポジトリ
+Google Playストア
+ローカライズ
diff --git a/README_pt-BR.md b/README_pt-BR.md
new file mode 100644
index 00000000..b5277ccc
--- /dev/null
+++ b/README_pt-BR.md
@@ -0,0 +1,65 @@
+
+
+## CustoMIUIzer14 ([chinês](./README_zh.md))
+Personalize a MIUI ao seu gosto
+
+Para MIUI 13 e 14 baseado em Android 12 e 13
+
+> Obrigado pelo incrível módulo de [Mikanoshi](https://code.highspec.ru/Mikanoshi/CustoMIUIzer)
+
+### Traduções
+[](https://crowdin.com/project/customiuizer14)
+
+### Download
+* [Lançamentos](https://github.com/MonwF/customiuizer/releases)
+* LSPosed Repo
+* [Testar lançamentos](https://rz3kv5wa4g.jiandaoyun.com/dash/650e43a383027ec3225083e9)
+
+### Funcionalidade de backup
+Os backups são armazenados em /sdcard/Documents/CustoMIUIzer/
+
+### Doar
+Via paypal
+* [US$5](https://paypal.me/tpsxj/5)
+* [US$10](https://paypal.me/tpsxj/10)
+* [Outro](https://paypal.me/tpsxj)
+
+------
+
+## Leia-me Original
+
+### O que é o CustoMIUIzer? ###
+O módulo CustoMIUIzer contém uma variedade de mods que fornecerão funcionalidades adicionais para o seu dispositivo MIUI. Você precisa ter o (Ed)Xposed Framework instalado para usar esses mods. Para obter mais informações sobre o Xposed, consulte o tópico original ou repositório github do EdXposed (para Android 8-10) .
+
+### Compatibilidade ###
+O módulo foi escrito, testado e destina-se principalmente para a MIUI 10-12.5 no Android 9-10.
+Não há garantia de que os mods funcionem totalmente em quaisquer outras versões, especialmente em versões MIUI inferiores.
+A instalação do APK é limitada ao Android 7+.
+
+### Como usar o CustoMIUIzer? ###
+Primeiro você deve ter o (Ed)Xposed Framework instalado. Depois disso, habilite o módulo CustoMIUIzer no (Ed)Xposed Installer, configure os mods que você goste e selecione 'Reinicialização suave' no menu.
+
+### Funcionalidade de backup ###
+O CustoMIUIzer suporta backup e restauração das configurações usando o backup local em SDCard/internal (encontre-o no menu da janela principal).
+Ele também oferece suporte a backups automáticos na nuvem do Google (Android Backup Service).
+
+### Solução de problemas ###
+Você pode enviar um relatório detalhado com uma descrição do seu problema do próprio CustoMIUIzer ou criar um novo problema no rastreador de problemas .
+
+Problemas comuns
+
+O módulo e mods foram ativados, dispositivo reiniciado, mas nenhum dos mods está funcionando.
+
+Vá para (Ed)Xposed Installer> Log e verifique as informações lá.
+Encontre a linha "Loading modules from .../name.mikanoshi.customiuizer/...".
+Se a próxima linha conter "File does not exist", basta reinstalar o CustoMIUIzer.
+Se a próxima linha conter algo mais (error, exception, etc), envie um relatório detalhado do CustoMIUIzer e espere que esse problema possa ser corrigido :)
+
+Enviei um relatório do CustoMIUIzer e agora estou aguardando resposta, onde está?
+
+Você nunca receberá uma resposta se não inserir suas informações de contato.
+Tela principal do CustomMIUIzer > Informações de contato. Escreva seu e-mail, apelido ICQ ou XDA/4PDA lá
+
+Repositório de módulo Xposed
+Google Play Store
+Localização
\ No newline at end of file
diff --git a/README_zh.md b/README_zh.md
new file mode 100644
index 00000000..c08a9322
--- /dev/null
+++ b/README_zh.md
@@ -0,0 +1,46 @@
+## 米客
+客制化你的MIUI
+
+> 由于`Mikanoshi`的 [CustoMIUIzer](code.highspec.ru/Mikanoshi/CustoMIUIzer) 一直不支持 Android 12,只好自行修改。感谢原作者带来的无限可能。
+
+支持基于`android 12`以上的 MIUI 13和14
+
+### 主要功能
+* 双排状态栏
+* 信任蓝牙和Wi-Fi禁止锁屏
+* 查看已保存Wi-Fi密码
+* 自动亮度范围限制
+* 双排信号
+* 状态栏显示电池温度和电池
+* 跳过10s安全警告
+* 音乐可视化
+* 独立通知音量
+* 专辑封面设置为壁纸
+* 状态栏显秒与图标隐藏
+* 彩色电池条
+* 使用导航栏同时启用返回手势
+* 锁屏打开手电筒
+* 通知
+ * 通知重要性设置
+ * 自动展开
+ * 小窗打开通知
+ * 直接打开频道设置
+* 浮窗记住打开状态和位置、移除黑名单(含分屏)
+* 扩展电源菜单
+* 允许直接更新系统应用
+* 导航栏手势与自定义按钮
+* 安装或升级app时显示更多信息
+* 允许限制系统app使用网络
+
+### 下载
+* [lanzou下载](https://rz3kv5wa4g.jiandaoyun.com/dash/650e43a383027ec3225083e9)
+* [Releases](https://github.com/MonwF/customiuizer/releases)
+* LSPosed 仓库
+
+### 备份功能
+设置备份存储在 `/sdcard/Documents/CustoMIUIzer/`
+
+------
+#### 佛系开发,随缘打赏
+
+
diff --git a/app/build.gradle b/app/build.gradle
index 3123388c..db74def7 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,91 +1,99 @@
-apply plugin: 'com.android.application'
-
-def acraVersion = '5.7.0'
-def keystorePropertiesFile = rootProject.file("../keystore.properties")
-def keystoreProperties = new Properties()
-keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
-def sFile = file(keystoreProperties['storeFile'])
-def sPassword = keystoreProperties['storePassword']
-def kAlias = keystoreProperties['keyAlias']
-def kPassword = keystoreProperties['keyPassword']
-
-android {
- signingConfigs {
- v1 {
- storeFile sFile
- storePassword sPassword
- keyAlias kAlias
- keyPassword kPassword
- v1SigningEnabled true
- v2SigningEnabled false
- }
- v2 {
- storeFile sFile
- storePassword sPassword
- keyAlias kAlias
- keyPassword kPassword
- v1SigningEnabled true
- v2SigningEnabled true
- }
- }
- compileSdkVersion 29
- defaultConfig {
- applicationId "name.mikanoshi.customiuizer"
- minSdkVersion 24
- //noinspection OldTargetApi,ExpiredTargetSdkVersion
- targetSdkVersion 27
- versionCode 71
- versionName "3.2.1"
- resConfigs 'ru-rRU', 'uk-rUK', 'zh-rCN', 'pt-rBR', 'de', 'es', 'it', 'tr'
- }
- buildTypes {
- release {
- debuggable false
- minifyEnabled true
- shrinkResources false
- proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
- }
- debug {
- debuggable true
- minifyEnabled false
- shrinkResources false
- proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
- }
- }
- flavorDimensions 'api'
- productFlavors {
- standalone {
- targetSdkVersion 27
- signingConfig signingConfigs.v1
- }
- playstore {
- targetSdkVersion 30
- signingConfig signingConfigs.v2
- }
- }
- packagingOptions {
- resources {
- excludes += ['META-INF/*.kotlin_module', '**.kotlin_builtins', '**.kotlin_metadata']
- }
- }
- androidResources {
- noCompress 'zip'
- }
-// compileOptions {
-// sourceCompatibility JavaVersion.VERSION_1_8
-// targetCompatibility JavaVersion.VERSION_1_8
-// }
-}
-
-dependencies {
- implementation fileTree(include: ['*.jar'], dir: 'libs')
- implementation "ch.acra:acra-core:$acraVersion"
- //noinspection DifferentStdlibGradleVersion
- implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10'
- implementation 'com.github.jinatonic.confetti:confetti:1.1.2'
- implementation files('libs/WeatherView-2.0.3.aar')
- compileOnly 'de.robv.android.xposed:api:82'
- compileOnly files('lib/miui.jar')
- compileOnly files('lib/miuisystem.jar')
- compileOnly files('lib/framework.jar')
-}
\ No newline at end of file
+apply plugin: 'com.android.application'
+
+//def acraVersion = '5.7.0'
+def keystorePropertiesFile = rootProject.file("../keystore.properties")
+def keystoreProperties = new Properties()
+keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+def sFile = file(keystoreProperties['storeFile'])
+def sPassword = keystoreProperties['storePassword']
+def kAlias = keystoreProperties['keyAlias']
+def kPassword = keystoreProperties['keyPassword']
+def lastVersion = 65
+def lastVersionName = "23.10.30"
+
+if (gradle.startParameter.taskNames.contains(":app:assembleDevelop")) {
+ lastVersion += 1
+}
+
+android {
+ namespace "name.monwf.customiuizer"
+ signingConfigs {
+ v2 {
+ storeFile sFile
+ storePassword sPassword
+ keyAlias kAlias
+ keyPassword kPassword
+ v1SigningEnabled false
+ v2SigningEnabled true
+ }
+ }
+ compileSdk 34
+ defaultConfig {
+ applicationId "name.monwf.customiuizer"
+ minSdkVersion 33
+ //noinspection OldTargetApi,ExpiredTargetSdkVersion
+ targetSdkVersion 34
+ versionCode lastVersion
+ versionName lastVersionName
+ buildConfigField "long", "BUILD_TIME", System.currentTimeMillis() + "L"
+ resConfigs 'ru-rRU', 'zh-rCN', 'zh-rTW', 'ja-rJP', 'vi-rVN', 'cs-rCZ', 'pt-rBR', 'tr-rTR', 'es-rES'
+ ndk { abiFilters "arm64-v8a" }
+ }
+ buildTypes {
+ develop {
+ debuggable false
+ minifyEnabled true
+ shrinkResources true
+ crunchPngs false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ release {
+ debuggable false
+ minifyEnabled true
+ shrinkResources true
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ debug {
+ debuggable true
+ minifyEnabled false
+ shrinkResources false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ packagingOptions {
+ resources {
+ merges += 'META-INF/xposed/*'
+ excludes += ['META-INF/*.kotlin_module', 'META-INF/androidx.*.version', '**.kotlin_builtins', '**.kotlin_metadata']
+ }
+ }
+ androidResources {
+ noCompress 'zip'
+ }
+ buildToolsVersion '34.0.0'
+// gradle.projectsEvaluated {
+// tasks.withType(JavaCompile) {
+// options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
+// }
+// }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
+ }
+}
+
+dependencies {
+ // implementation "ch.acra:acra-core:$acraVersion"
+// noinspection DifferentStdlibGradleVersion
+ compileOnly files('lib/api-100.aar')
+ compileOnly files('lib/miuisystem.jar')
+ compileOnly files('lib/framework.jar')
+
+ implementation "io.github.libxposed:service:100-1.0.0"
+ implementation "org.apache.commons:commons-lang3:3.13.0"
+ implementation "androidx.preference:preference:1.2.1"
+ implementation 'androidx.palette:palette:1.0.0'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+// implementation "androidx.recyclerview:recyclerview:1.2.1"
+// implementation 'com.google.android.flexbox:flexbox:3.0.0'
+// implementation 'com.google.android.material:material:1.6.1'
+}
diff --git a/app/lib/api-100.aar b/app/lib/api-100.aar
new file mode 100644
index 00000000..fa2538f1
Binary files /dev/null and b/app/lib/api-100.aar differ
diff --git a/app/lib/framework.jar b/app/lib/framework.jar
index fde62a3b..982dff59 100644
Binary files a/app/lib/framework.jar and b/app/lib/framework.jar differ
diff --git a/app/lib/miui.jar b/app/lib/miui.jar
index 11383923..09d95c58 100644
Binary files a/app/lib/miui.jar and b/app/lib/miui.jar differ
diff --git a/app/lib/miuisystem.jar b/app/lib/miuisystem.jar
index 1f6a6cdb..98dbac33 100644
Binary files a/app/lib/miuisystem.jar and b/app/lib/miuisystem.jar differ
diff --git a/app/libs/WeatherView-2.0.3.aar b/app/libs/WeatherView-2.0.3.aar
deleted file mode 100644
index 6da15dd9..00000000
Binary files a/app/libs/WeatherView-2.0.3.aar and /dev/null differ
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index b54aa9b4..0fa470df 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -1,57 +1,28 @@
-verbose
--dontobfuscate
--allowaccessmodification
-
--keepattributes Exceptions,LineNumberTable,Signature,SourceFile,EnclosingMethod,*Annotation*
--keep public class * extends android.app.Activity
--keep public class * extends android.app.Application
--keep public class * extends android.app.Service
--keep public class * extends android.content.BroadcastReceiver
--keep public class * extends android.content.ContentProvider
-
--keep public class * extends android.view.View {
- public (android.content.Context);
- public (android.content.Context, android.util.AttributeSet);
- public (android.content.Context, android.util.AttributeSet, int);
- public void set*(...);
+# Xposed
+-adaptresourcefilecontents META-INF/xposed/java_init.list
+-keepattributes RuntimeVisibleAnnotations
+-keep,allowoptimization,allowobfuscation public class * extends io.github.libxposed.api.XposedModule {
+ public (...);
+ public void onPackageLoaded(...);
+ public void onSystemServerLoaded(...);
}
--keepclasseswithmembers class * {
- public (android.content.Context, android.util.AttributeSet);
+-keep,allowoptimization,allowobfuscation @io.github.libxposed.api.annotations.* class * {
+ @io.github.libxposed.api.annotations.BeforeInvocation ;
+ @io.github.libxposed.api.annotations.AfterInvocation ;
}
--keepclasseswithmembers class * {
- public (android.content.Context, android.util.AttributeSet, int);
+-keep,allowoptimization class name.monwf.customiuizer.mods.utils.HookerClassHelper$MethodHook {
+ ;
}
--keepclassmembers class * implements android.os.Parcelable {
- static android.os.Parcelable$Creator CREATOR;
-}
+-keepnames class name.monwf.customiuizer.GateWayLauncher
--keepclassmembers class **.R$* {
- public static ;
-}
-
--keepclasseswithmembernames class * {
- native ;
-}
-
--keepclassmembers class * extends java.lang.Enum {
- public static **[] values();
- public static ** valueOf(java.lang.String);
-}
-
--keepclassmembers class * implements java.io.Serializable {
- static final long serialVersionUID;
- static final java.io.ObjectStreamField[] serialPersistentFields;
- private void writeObject(java.io.ObjectOutputStream);
- private void readObject(java.io.ObjectInputStream);
- java.lang.Object writeReplace();
- java.lang.Object readResolve();
-}
-
--keep class name.mikanoshi.** { *; }
+# Obfuscation
+-repackageclasses
+-allowaccessmodification
--dontwarn **
--dontnote **
+-dontwarn android.app.ActivityTaskManager$RootTaskInfo, android.util.Singleton
+# -dontnote **
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 98666fde..c5e49d18 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,216 +1,165 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/assets/xposed_init b/app/src/main/assets/xposed_init
deleted file mode 100644
index 40922ff3..00000000
--- a/app/src/main/assets/xposed_init
+++ /dev/null
@@ -1 +0,0 @@
-name.mikanoshi.customiuizer.MainModule
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/AboutFragment.java b/app/src/main/java/name/mikanoshi/customiuizer/AboutFragment.java
deleted file mode 100644
index e66756cc..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/AboutFragment.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.app.Activity;
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.preference.Preference;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class AboutFragment extends SubFragment {
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- supressMenu = true;
- super.onActivityCreated(savedInstanceState);
- final Activity act = getActivity();
-
- findPreference("pref_key_website").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference pref) {
- Helpers.openURL(act, "https://code.highspec.ru/Mikanoshi/CustoMIUIzer");
- return true;
- }
- });
-
- findPreference("pref_key_xda").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference pref) {
- Helpers.openURL(act, "https://forum.xda-developers.com/xposed/modules/mod-customiuizer-customize-miui-rom-t3910732");
- return true;
- }
- });
-
- findPreference("pref_key_4pda").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference pref) {
- Helpers.openURL(act, "https://4pda.ru/forum/index.php?showtopic=945275");
- return true;
- }
- });
-
- //Add version name to support title
- View view = getView();
- if (view != null) try {
- TextView version = view.findViewById(R.id.about_version);
- version.setText(String.format(getResources().getString(R.string.about_version), act.getPackageManager().getPackageInfo(act.getPackageName(), 0).versionName));
- if (Helpers.currentHoliday == Helpers.Holidays.NEWYEAR) view.findViewById(R.id.santa_hat).setVisibility(View.VISIBLE);
- else if (Helpers.currentHoliday == Helpers.Holidays.LUNARNEWYEAR) {
- view.findViewById(R.id.lunar_animal).setVisibility(View.VISIBLE);
- LinearLayout logoSection = view.findViewById(R.id.logo_section);
- logoSection.setPadding(logoSection.getPaddingLeft(), Math.round(view.getResources().getDisplayMetrics().density * 80), logoSection.getPaddingRight(), logoSection.getPaddingBottom());
- } else if (Helpers.currentHoliday == Helpers.Holidays.PANDEMIC) {
- view.findViewById(R.id.medical_mask).setVisibility(View.VISIBLE);
- view.findViewById(R.id.hand_sanitizer).setVisibility(View.VISIBLE);
- } else if (Helpers.currentHoliday == Helpers.Holidays.CRYPTO) {
- view.findViewById(R.id.doge).setVisibility(View.VISIBLE);
- view.findViewById(R.id.uptrend).setVisibility(View.VISIBLE);
- }
- } catch (Throwable e) {
- //Shouldn't happen...
- e.printStackTrace();
- }
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- if (getView() == null) return;
- getView().findViewById(R.id.miuizer_icon).setVisibility(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? View.GONE : View.VISIBLE);
- super.onConfigurationChanged(newConfig);
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/CredentialsLauncher.java b/app/src/main/java/name/mikanoshi/customiuizer/CredentialsLauncher.java
deleted file mode 100644
index 39e0b034..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/CredentialsLauncher.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.app.Activity;
-
-public class CredentialsLauncher extends Activity {}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/GateWayLauncher.java b/app/src/main/java/name/mikanoshi/customiuizer/GateWayLauncher.java
deleted file mode 100644
index a52dc954..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/GateWayLauncher.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.app.Activity;
-
-public class GateWayLauncher extends Activity {}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/GateWaySettings.java b/app/src/main/java/name/mikanoshi/customiuizer/GateWaySettings.java
deleted file mode 100644
index e3787e9c..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/GateWaySettings.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.app.Activity;
-
-public class GateWaySettings extends Activity {}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/MainActivity.java b/app/src/main/java/name/mikanoshi/customiuizer/MainActivity.java
deleted file mode 100644
index 52600c64..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/MainActivity.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.Manifest;
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.Fragment;
-import android.app.backup.BackupManager;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.FileObserver;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.MenuItem;
-import android.widget.Toast;
-
-import java.util.Set;
-
-import name.mikanoshi.customiuizer.holidays.HolidayHelper;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class MainActivity extends Activity {
-
- MainFragment mainFrag = null;
- SharedPreferences.OnSharedPreferenceChangeListener prefsChanged;
- FileObserver fileObserver;
- boolean migrateOnExit = false;
-
- @Override
- protected void attachBaseContext(Context base) {
- try {
- super.attachBaseContext(Helpers.getLocaleContext(base));
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- boolean mSDKFound = ((MainApplication)getApplication()).mStarted;
- if (mSDKFound) Helpers.setMiuiTheme(this, R.style.MIUIPrefs);
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- if (!mSDKFound) {
- Toast.makeText(this, R.string.sdk_failed, Toast.LENGTH_LONG).show();
- finish();
- return;
- }
-
- HolidayHelper.setup(this);
-
- prefsChanged = new SharedPreferences.OnSharedPreferenceChangeListener() {
- @Override
- public void onSharedPreferenceChanged(SharedPreferences sharedPrefs, String key) {
- Log.i("prefs", "Changed: " + key);
- requestBackup();
- Object val = sharedPrefs.getAll().get(key);
- String path = "";
- if (val instanceof String)
- path = "string/";
- else if (val instanceof Set>)
- path = "stringset/";
- else if (val instanceof Integer)
- path = "integer/";
- else if (val instanceof Boolean)
- path = "boolean/";
- getContentResolver().notifyChange(Uri.parse("content://" + SharedPrefsProvider.AUTHORITY + "/" + path + key), null);
- if (!path.equals(""))
- getContentResolver().notifyChange(Uri.parse("content://" + SharedPrefsProvider.AUTHORITY + "/pref/" + path + key), null);
- }
- };
- Helpers.prefs.registerOnSharedPreferenceChangeListener(prefsChanged);
- Helpers.fixPermissionsAsync(getApplicationContext());
-
- try {
- fileObserver = new FileObserver(Helpers.getSharedPrefsPath(), FileObserver.CLOSE_WRITE) {
- @Override
- public void onEvent(int event, String path) {
- Helpers.fixPermissionsAsync(getApplicationContext());
- }
- };
- fileObserver.startWatching();
- } catch (Throwable t) {
- Log.e("prefs", "Failed to start FileObserver!");
- }
-
- Helpers.updateNewModsMarking(this);
-
- if (savedInstanceState != null)
- mainFrag = (MainFragment)getFragmentManager().getFragment(savedInstanceState, "mainFrag");
- if (mainFrag == null) {
- mainFrag = new MainFragment();
- getFragmentManager().beginTransaction().replace(R.id.fragment_container, mainFrag).commit();
- }
- }
-
- @Override
- public void onSaveInstanceState(Bundle savedInstanceState) {
- getFragmentManager().putFragment(savedInstanceState, "mainFrag", mainFrag);
- super.onSaveInstanceState(savedInstanceState);
- }
-
- @SuppressLint("ApplySharedPref")
- protected void onDestroy() {
- try {
- if (prefsChanged != null) Helpers.prefs.unregisterOnSharedPreferenceChangeListener(prefsChanged);
- if (fileObserver != null) fileObserver.stopWatching();
- HolidayHelper.onDestroy();
- if (migrateOnExit) {
- boolean migrated = Helpers.migratePrefs();
- Helpers.prefs = Helpers.getSharedPrefs(this, true, true);
- Helpers.prefs.edit().putBoolean("miuizer_prefs_migrated", true).putInt("miuizer_prefs_migration_result", migrated ? 1 : 2).commit();
- }
- } catch (Throwable t) {
- t.printStackTrace();
- }
- super.onDestroy();
- }
-
- @Override
- public void onBackPressed() {
- Fragment fragment = getFragmentManager().findFragmentById(R.id.fragment_container);
- if (fragment == null) {
- super.onBackPressed();
- return;
- }
- if (Helpers.shimmerAnim != null) Helpers.shimmerAnim.cancel();
- if (fragment instanceof MainFragment && ((MainFragment)fragment).actionMode != null)
- ((MainFragment)fragment).actionMode.finish();
- else if (fragment instanceof SubFragment)
- ((SubFragment)fragment).finish();
- else
- super.onBackPressed();
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == android.R.id.home) {
- finish();
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_MENU) {
- PreferenceFragmentBase fragment = (PreferenceFragmentBase)getFragmentManager().findFragmentById(R.id.fragment_container);
- if (fragment != null && fragment.getView() != null && !fragment.supressMenu) try {
- fragment.getView().post(fragment::showImmersionMenu);
- return true;
- } catch (Throwable t) {}
- }
- return super.onKeyDown(keyCode, event);
- }
-
- public void requestBackup() {
- new BackupManager(getApplicationContext()).dataChanged();
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
- if (grantResults.length == 0) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- return;
- }
-
- switch (requestCode) {
- case Helpers.REQUEST_PERMISSIONS_BACKUP:
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
- mainFrag.backupSettings(this);
- else if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE))
- Toast.makeText(this, R.string.permission_save, Toast.LENGTH_SHORT).show();
- else
- Toast.makeText(this, R.string.permission_permanent, Toast.LENGTH_LONG).show();
- break;
- case Helpers.REQUEST_PERMISSIONS_RESTORE:
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
- mainFrag.restoreSettings(this);
- else if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE))
- Toast.makeText(this, R.string.permission_restore, Toast.LENGTH_SHORT).show();
- else
- Toast.makeText(this, R.string.permission_permanent, Toast.LENGTH_LONG).show();
- break;
- case Helpers.REQUEST_PERMISSIONS_WIFI:
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- Fragment frag = getFragmentManager().findFragmentById(R.id.fragment_container);
- if (frag instanceof name.mikanoshi.customiuizer.subs.System_NoScreenLock)
- ((name.mikanoshi.customiuizer.subs.System_NoScreenLock)frag).openWifiNetworks();
- } else if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_COARSE_LOCATION))
- Toast.makeText(this, R.string.permission_scan, Toast.LENGTH_LONG).show();
- else
- Toast.makeText(this, R.string.permission_permanent, Toast.LENGTH_LONG).show();
- break;
- case Helpers.REQUEST_PERMISSIONS_REPORT:
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
- mainFrag.createReport();
- else
- Toast.makeText(this, ":(", Toast.LENGTH_SHORT).show();
- break;
- default:
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- }
- }
-
- @Override
- public void onPause() {
- HolidayHelper.onPause();
- super.onPause();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- HolidayHelper.onResume();
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/MainApplication.java b/app/src/main/java/name/mikanoshi/customiuizer/MainApplication.java
deleted file mode 100644
index 4f4e59e4..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/MainApplication.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.app.Application;
-import android.content.Context;
-import android.util.Log;
-
-import org.acra.ACRA;
-import org.acra.collector.ApplicationStartupCollector;
-import org.acra.collector.ConfigurationCollector;
-import org.acra.collector.CustomDataCollector;
-import org.acra.collector.DeviceFeaturesCollector;
-import org.acra.collector.DisplayManagerCollector;
-import org.acra.collector.LogCatCollector;
-import org.acra.collector.MemoryInfoCollector;
-import org.acra.collector.PackageManagerCollector;
-import org.acra.collector.ReflectionCollector;
-import org.acra.collector.SettingsCollector;
-import org.acra.collector.SharedPreferencesCollector;
-import org.acra.collector.SimpleValuesCollector;
-import org.acra.collector.StacktraceCollector;
-import org.acra.collector.ThreadCollector;
-import org.acra.collector.TimeCollector;
-import org.acra.config.CoreConfigurationBuilder;
-import org.acra.data.StringFormat;
-import org.acra.plugins.SimplePluginLoader;
-
-import java.util.HashMap;
-import java.util.Locale;
-
-import miui.core.SdkManager;
-
-import name.mikanoshi.customiuizer.crashreport.DialogInteraction;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-import static org.acra.ReportField.*;
-
-public class MainApplication extends Application {
-
- private boolean mInitialized;
- public boolean mStarted = false;
-
- public MainApplication() {
- try {
- mInitialized = SdkManager.initialize(this, new HashMap()) == 0;
- } catch (Throwable t) {
- mInitialized = false;
- t.printStackTrace();
- }
- }
-
- @Override
- protected void attachBaseContext(Context base) {
- Context pContext;
- try {
- pContext = Helpers.getProtectedContext(base);
- Helpers.prefs = Helpers.getSharedPrefs(pContext, false);
- String locale = Helpers.prefs.getString("pref_key_miuizer_locale", "auto");
- if (locale != null && !"auto".equals(locale) && !"1".equals(locale)) Locale.setDefault(Locale.forLanguageTag(locale));
- } catch (Throwable t) {
- pContext = base;
- Log.e("miuizer", "Failed to use protected storage!");
- }
- super.attachBaseContext(pContext);
-
- if (mInitialized) try {
- int res = SdkManager.start(new HashMap());
- if (res == 1) {
- Log.e("miuizer", "MIUI SDK version is too low");
- mStarted = false;
- } else if (res == 0) {
- mStarted = true;
- } else {
- Log.e("miuizer", "Failed to start MIUI SDK Manager");
- mStarted = false;
- }
- } catch (Throwable t) {
- t.printStackTrace();
- } else Log.e("miuizer", "Failed to init MIUI SDK Manager");
-
- ACRA.DEV_LOGGING = false;
- CoreConfigurationBuilder builder = new CoreConfigurationBuilder(this).setPluginLoader(new SimplePluginLoader(
- ConfigurationCollector.class,
- ApplicationStartupCollector.class,
- ConfigurationCollector.class,
- CustomDataCollector.class,
- DeviceFeaturesCollector.class,
- DisplayManagerCollector.class,
- LogCatCollector.class,
- MemoryInfoCollector.class,
- PackageManagerCollector.class,
- ReflectionCollector.class,
- SettingsCollector.class,
- SharedPreferencesCollector.class,
- SimpleValuesCollector.class,
- StacktraceCollector.class,
- ThreadCollector.class,
- TimeCollector.class,
- DialogInteraction.class
- ));
- builder.setBuildConfigClass(BuildConfig.class).setReportFormat(StringFormat.JSON).setLogcatArguments("-t", "500", "-v", "time").setSharedPreferencesName(Helpers.prefsName);
- builder.setReportContent(REPORT_ID, APP_VERSION_CODE, APP_VERSION_NAME, PACKAGE_NAME, FILE_PATH, PHONE_MODEL, BRAND, PRODUCT, ANDROID_VERSION,
- BUILD, TOTAL_MEM_SIZE, AVAILABLE_MEM_SIZE, CUSTOM_DATA, STACK_TRACE, INITIAL_CONFIGURATION, CRASH_CONFIGURATION, DISPLAY, USER_COMMENT, USER_EMAIL,
- USER_APP_START_DATE, USER_CRASH_DATE, DUMPSYS_MEMINFO, LOGCAT, INSTALLATION_ID, DEVICE_FEATURES, ENVIRONMENT, SHARED_PREFERENCES,
- SETTINGS_SYSTEM, SETTINGS_SECURE, SETTINGS_GLOBAL);
- ACRA.init(this, builder);
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/MainFragment.java b/app/src/main/java/name/mikanoshi/customiuizer/MainFragment.java
deleted file mode 100644
index 5ee8dd47..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/MainFragment.java
+++ /dev/null
@@ -1,758 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.ComponentName;
-import android.content.DialogInterface;
-import android.content.pm.PackageManager;
-import android.content.res.AssetManager;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.drawable.ColorDrawable;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.preference.CheckBoxPreference;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceClickListener;
-import android.preference.PreferenceCategory;
-import android.preference.PreferenceScreen;
-import android.text.Editable;
-import android.text.Layout;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.TextWatcher;
-import android.text.style.AlignmentSpan;
-import android.text.style.LineHeightSpan;
-import android.view.ActionMode;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.Button;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ListAdapter;
-import android.widget.ListView;
-import android.widget.PopupWindow;
-import android.widget.TextView;
-
-import org.acra.ACRA;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.lang.reflect.Method;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Locale;
-
-import miui.app.AlertDialog;
-import miui.view.SearchActionMode;
-
-import name.mikanoshi.customiuizer.prefs.ListPreferenceEx;
-import name.mikanoshi.customiuizer.prefs.PreferenceEx;
-import name.mikanoshi.customiuizer.subs.CategorySelector;
-import name.mikanoshi.customiuizer.subs.Controls;
-import name.mikanoshi.customiuizer.subs.Launcher;
-import name.mikanoshi.customiuizer.subs.System;
-import name.mikanoshi.customiuizer.subs.Various;
-import name.mikanoshi.customiuizer.utils.GuidePopup;
-import name.mikanoshi.customiuizer.utils.Helpers;
-import name.mikanoshi.customiuizer.utils.ModData;
-import name.mikanoshi.customiuizer.utils.ModSearchAdapter;
-
-public class MainFragment extends PreferenceFragmentBase {
-
- private final CategorySelector catSelector = new CategorySelector();
- public System prefSystem = new System();
- public Launcher prefLauncher = new Launcher();
- public Controls prefControls = new Controls();
- public Various prefVarious = new Various();
- private View searchView = null;
- private ListView listView = null;
- private ListView resultView = null;
- private LinearLayout search = null;
- private View modsCat = null;
- private View markCat = null;
- boolean isSearchFocused = false;
- boolean areGuidesCleared = false;
- boolean actionModeNew = false;
- ActionMode actionMode = null;
- SearchActionMode.Callback actionModeCallback = new SearchActionMode.Callback() {
- @Override
- public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- if (searchView == null || listView == null) {
- if (mode != null) mode.finish();
- return false;
- }
-
- SearchActionMode samode = (SearchActionMode)mode;
- samode.setAnchorView(searchView);
- samode.setAnimateView(listView);
- samode.getSearchInput().setOnFocusChangeListener(new View.OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- isSearchFocused = hasFocus;
- }
- });
- samode.getSearchInput().setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- isSearchFocused = v.hasFocus();
- }
- });
- samode.getSearchInput().setOnEditorActionListener(new TextView.OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
- Helpers.hideKeyboard(getActivity(), v);
- resultView.requestFocus();
- return true;
- }
- return false;
- }
- });
- samode.getSearchInput().addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {}
-
- @Override
- public void afterTextChanged(Editable s) {
- findMod(s.toString().trim());
- }
- });
-
- if (actionModeNew) {
- actionModeNew = false;
- resultView.postDelayed(new Runnable() {
- @Override
- public void run() {
- samode.getSearchInput().setText(Helpers.NEW_MODS_SEARCH_QUERY);
- samode.getSearchInput().setSelection(1, 1);
- Helpers.hideKeyboard(getActivity(), getView());
- resultView.requestFocus();
- }
- }, getResources().getInteger(android.R.integer.config_longAnimTime));
- }
-
- return true;
- }
-
- @Override
- public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- if (searchView == null || listView == null) {
- if (mode != null) mode.finish();
- return false;
- }
-
- SearchActionMode samode = (SearchActionMode)mode;
- samode.setAnchorView(searchView);
- samode.setAnimateView(listView);
-
- return true;
- }
-
- @Override
- public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- return true;
- }
-
- @Override
- public void onDestroyActionMode(ActionMode mode) {
- TextView input = search == null ? null : search.findViewById(android.R.id.input);
- if (input != null) input.setText("");
- findMod("");
- getActionBar().show();
- actionMode = null;
- }
- };
-
- private final Runnable showUpdateNotification = new Runnable() {
- @Override
- public void run() {
- if (getView() != null) try {
- ImageView alert = getView().findViewById(R.id.update_alert);
- if (alert != null) alert.setVisibility(View.VISIBLE);
- } catch (Throwable e) {}
- }
- };
-
- private final Runnable hideUpdateNotification = new Runnable() {
- @Override
- public void run() {
- if (getView() != null) try {
- ImageView alert = getView().findViewById(R.id.update_alert);
- if (alert != null) alert.setVisibility(View.GONE);
- } catch (Throwable e) {}
- }
- };
-
- private boolean isFragmentReady(Activity act) {
- return act != null && !act.isFinishing() && MainFragment.this.isAdded();
- }
-
- @Override
- @SuppressLint("MissingSuperCall")
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState, R.xml.prefs_main);
- addPreferencesFromResource(R.xml.prefs_main);
-
- final Activity act = getActivity();
- final Handler handler = new Handler(act.getMainLooper());
-
- if (Helpers.miuizerModuleActive && !Helpers.prefs.getBoolean("miuizer_prefs_migrated", false) && Helpers.usingNewSharedPrefs()) {
- ((MainActivity)act).migrateOnExit = true;
- act.recreate();
- return;
- }
-
- // Preventing launch delay
- new Thread(new Runnable() {
- public void run() {
- if (!Helpers.isXposedInstallerInstalled(act))
- act.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- AlertDialog.Builder builder = new AlertDialog.Builder(act);
- builder.setTitle(R.string.xposed_not_found);
- builder.setMessage(R.string.xposed_not_found_explain);
- builder.setNeutralButton(R.string.okay, null);
- builder.setNegativeButton(R.string.i_use_lsp, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Helpers.prefs.edit().putBoolean("pref_key_miuizer_assumelsposed", true).apply();
- getActivity().recreate();
- }
- });
- AlertDialog dlg = builder.create();
- if (isFragmentReady(act)) dlg.show();
- }
- }); else if (isFragmentReady(act) && !Helpers.miuizerModuleActive)
- act.runOnUiThread(new Runnable() {
- public void run() {
- showXposedDialog(act);
- }
- }); else areGuidesCleared = true;
-
- if (Helpers.prefs.getBoolean("miuizer_prefs_migrated", false)) {
- int result = Helpers.prefs.getInt("miuizer_prefs_migration_result", 0);
- if (result > 0) {
- Helpers.prefs.edit().putInt("miuizer_prefs_migration_result", -1).apply();
- act.runOnUiThread(new Runnable() {
- public void run() {
- showPrefsMigrationDialog(result == 1);
- }
- });
- }
- }
-
- String dataPath = act.getFilesDir().getAbsolutePath();
- try {
- URL url = new URL("https://code.highspec.ru/Mikanoshi/CustoMIUIzer/raw/branch/master/last_build");
- //URL url = new URL("https://code.highspec.ru/last_build");
- HttpURLConnection connection = (HttpURLConnection)url.openConnection();
- connection.setDefaultUseCaches(false);
- connection.setUseCaches(false);
- connection.setRequestProperty("Pragma", "no-cache");
- connection.setRequestProperty("Cache-Control", "no-cache");
- connection.setRequestProperty("Expires", "-1");
- connection.connect();
-
- if (connection.getResponseCode() == HttpURLConnection.HTTP_OK || connection.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) {
- String last_build = "";
-
- try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
- last_build = reader.readLine().trim();
- } catch (Throwable t) { t.printStackTrace(); }
-
- File tmp = new File(dataPath);
- if (!tmp.exists()) tmp.mkdirs();
- try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(dataPath + "/last_build", false))) {
- writer.write(last_build);
- } catch (Throwable t) { t.printStackTrace(); }
- }
-
- connection.disconnect();
- } catch (Throwable t) { t.printStackTrace(); }
-
- try (InputStream inputFile = new FileInputStream(dataPath + "/last_build")) {
- int last_build = 0;
- try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputFile))) {
- last_build = Integer.parseInt(reader.readLine().trim());
- } catch (Throwable ignore) {}
-
- if (last_build > BuildConfig.VERSION_CODE)
- handler.post(showUpdateNotification);
- else
- handler.post(hideUpdateNotification);
- } catch (Throwable t) { t.printStackTrace(); }
-
- Helpers.getAllMods(act, savedInstanceState != null);
- }
- }).start();
-
- if (Helpers.prefs.getBoolean("pref_key_was_restore", false)) {
- Helpers.prefs.edit().putBoolean("pref_key_was_restore", false).apply();
- showRestoreInfoDialog();
- }
- }
-
- public View onInflateView(LayoutInflater inflater, ViewGroup group, Bundle bundle) {
- return inflater.inflate(Helpers.is12() ? R.layout.prefs_main12 : R.layout.prefs_main, group, false);
- }
-
- private void openActionMode(boolean isNew) {
- actionModeNew = isNew;
- actionMode = startActionMode(actionModeCallback);
- hideSplitView();
- }
-
- private static class SetLineOverlap implements LineHeightSpan {
- private int originalBottom = 15;
- private int originalDescent = 13;
- private final Boolean overlap;
- private Boolean overlapSaved = false;
-
- SetLineOverlap(Boolean overlap) {
- this.overlap = overlap;
- }
-
- @Override
- public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, Paint.FontMetricsInt fm) {
- if (overlap) {
- if (!overlapSaved) {
- originalBottom = fm.bottom;
- originalDescent = fm.descent;
- overlapSaved = true;
- }
- fm.bottom += fm.top;
- fm.descent += fm.top;
- } else {
- fm.bottom = originalBottom;
- fm.descent = originalDescent;
- overlapSaved = false;
- }
- }
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- if (getView() == null) return;
-
- resultView = getView().findViewById(android.R.id.custom);
- resultView.setAdapter(new ModSearchAdapter(getActivity()));
- resultView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView> parent, View view, int position, long id) {
- ModData mod = (ModData)parent.getAdapter().getItem(position);
- openModCat(mod.cat.name(), mod.sub, mod.key);
- }
- });
- resultView.setOnTouchListener(new View.OnTouchListener() {
- @Override
- @SuppressLint("ClickableViewAccessibility")
- public boolean onTouch(View v, MotionEvent event) {
- if (actionMode != null && isSearchFocused) {
- isSearchFocused = false;
- Handler handler = new Handler(v.getContext().getMainLooper());
- handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- Helpers.hideKeyboard(getActivity(), getView());
- }
- }, getResources().getInteger(android.R.integer.config_shortAnimTime));
- }
- return false;
- }
- });
- setViewBackground(resultView);
-
- searchView = getView().findViewById(R.id.searchView);
- setActionModeStyle(searchView);
-
- search = searchView.findViewById(android.R.id.inputArea);
- search.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- openActionMode(false);
- }
- });
- search.setOnLongClickListener(new View.OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- openActionMode(true);
- return true;
- }
- });
-
- TextView searchInput = search.findViewById(android.R.id.input);
- searchInput.setHint(R.string.search_input_description);
-
- modsCat = null; markCat = null;
- listView = getView().findViewById(android.R.id.list);
- listView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
- @Override
- public void onChildViewAdded(View parent, View child) {
- if (child == null) return;
- CharSequence title = ((TextView)child.findViewById(android.R.id.title)).getText();
- if (title.equals(getResources().getString(R.string.system_mods))) modsCat = child;
- if (title.equals(getResources().getString(R.string.miuizer_show_newmods_title))) markCat = child;
- if (modsCat != null && markCat != null) {
- if (areGuidesCleared) try {
- showGuides();
- } catch (Throwable t) {
- t.printStackTrace();
- }
- listView.setOnHierarchyChangeListener(null);
- }
- }
-
- @Override
- public void onChildViewRemoved(View parent, View child) {}
- });
-
- if (actionMode != null) actionMode.invalidate();
- final Activity act = getActivity();
-
- PreferenceEx warning = (PreferenceEx)findPreference("pref_key_warning");
- if (warning != null)
- if (Helpers.isRPlus()) {
- warning.setTitle(R.string.warning);
- warning.setSummary(getString(R.string.warning_unsupported_os, Build.VERSION.RELEASE));
- warning.setNotice(true);
- } else if (Helpers.usingNewSharedPrefs() && Helpers.isXposedScopeEnabled(act)) {
- warning.setTitle(R.string.warning);
- warning.setSummary(R.string.warning_scope);
- warning.setOnPreferenceClickListener(new OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- Helpers.openXposedApp(getValidContext());
- return true;
- }
- });
- } else if (!Helpers.usingNewSharedPrefs() && Helpers.areXposedBlacklistsEnabled()) {
- warning.setTitle(R.string.warning);
- if (act.getApplicationContext().getApplicationInfo().targetSdkVersion > 27)
- warning.setSummary(getString(R.string.warning_blacklist) + "\n" + getString(R.string.warning_blacklist_sdk));
- else
- warning.setSummary(R.string.warning_blacklist);
- warning.setOnPreferenceClickListener(new OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- Helpers.openXposedApp(getValidContext());
- return true;
- }
- });
- } else getPreferenceScreen().removePreference(warning);
-
- findPreference("pref_key_miuizer_launchericon").setOnPreferenceChangeListener(new CheckBoxPreference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- PackageManager pm = act.getPackageManager();
- if ((Boolean)newValue)
- pm.setComponentEnabledSetting(new ComponentName(act, GateWayLauncher.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
- else
- pm.setComponentEnabledSetting(new ComponentName(act, GateWayLauncher.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
- return true;
- }
- });
-
- String[] locales;
- try {
- AssetManager am = getContext().getAssets();
- @SuppressWarnings("JavaReflectionMemberAccess") @SuppressLint("SoonBlockedPrivateApi")
- Method getNonSystemLocales = AssetManager.class.getDeclaredMethod("getNonSystemLocales");
- locales = (String[])getNonSystemLocales.invoke(am);
- if (locales == null) locales = new String[] {};
- } catch (Throwable t) {
- locales = new String[] { "de", "es", "it", "pt-BR", "ru-RU", "tr", "uk-UK", "zh-CN" };
- }
-
- ArrayList localesArr = new ArrayList(Arrays.asList(locales));
- ArrayList localeNames = new ArrayList();
- localesArr.add(0, "en");
- for (String locale: localesArr) try {
- Locale loc = Locale.forLanguageTag(locale);
- StringBuilder locStr = new StringBuilder(loc.getDisplayLanguage(loc));
- locStr.setCharAt(0, Character.toUpperCase(locStr.charAt(0)));
- SpannableString locSpanString;
- if (!locale.equals("en")) {
- String locStrPct = locStr + "\n" + Helpers.l10nProgress.get(locale) + "%";
- int fullTextLength = locStrPct.length();
- locSpanString = new SpannableString(locStrPct);
- locSpanString.setSpan(new AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE), locStr.toString().length(), fullTextLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- locSpanString.setSpan(new SetLineOverlap(true), 1, fullTextLength - 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- locSpanString.setSpan(new SetLineOverlap(false), fullTextLength - 1, fullTextLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- } else locSpanString = new SpannableString(locStr.toString());
- localeNames.add(locSpanString);
- } catch (Throwable t) {
- localeNames.add(new SpannableString(Locale.getDefault().getDisplayLanguage(Locale.getDefault())));
- }
-
- localesArr.add(0, "auto");
- localeNames.add(0, new SpannableString(getString(R.string.array_system_default)));
-
- ListPreferenceEx locale = (ListPreferenceEx)findPreference("pref_key_miuizer_locale");
- locale.setEntries(localeNames.toArray(new CharSequence[0]));
- locale.setEntryValues(localesArr.toArray(new CharSequence[0]));
- locale.setOnPreferenceChangeListener(new CheckBoxPreference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- getActivity().recreate();
- return true;
- }
- });
-
- findPreference("pref_key_miuizer_holiday").setOnPreferenceChangeListener(new CheckBoxPreference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- getActivity().recreate();
- return true;
- }
- });
-
- findPreference("pref_key_miuizer_sendreport").setOnPreferenceClickListener(new CheckBoxPreference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- if (Helpers.checkStoragePerm(act, Helpers.REQUEST_PERMISSIONS_REPORT)) createReport();
- return true;
- }
- });
-
- findPreference("pref_key_miuizer_feedback").setOnPreferenceClickListener(new CheckBoxPreference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openSubFragment(new SubFragment(), null, Helpers.SettingsType.Edit, Helpers.ActionBarType.Edit, R.string.miuizer_acramail_title, R.layout.prefs_freedback);
- return true;
- }
- });
-
- findPreference("pref_key_issuetracker").setOnPreferenceClickListener(new OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference pref) {
- Helpers.openURL(act, "https://code.highspec.ru/Mikanoshi/CustoMIUIzer/issues");
- return true;
- }
- });
-
-// findPreference("pref_key_payinapp").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
-// @Override
-// public boolean onPreferenceClick(Preference pref) {
-// Bundle args = new Bundle();
-// args.putInt("baseResId", R.layout.fragment_inapp);
-// openSubFragment(new InAppFragment(), args, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.support_donate_title, R.xml.prefs_inapp);
-// return true;
-// }
-// });
-
- findPreference("pref_key_paycrypto").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference pref) {
- Helpers.openURL(act, "https://code.highspec.ru/cryptodonate");
- return true;
- }
- });
-
- findPreference("pref_key_payother").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- @SuppressWarnings("deprecation")
- public boolean onPreferenceClick(Preference pref) {
- if (getResources().getConfiguration().locale.getISO3Language().contains("ru"))
- Helpers.openURL(act, "https://mikanoshi.name/donate/");
- else
- Helpers.openURL(act, "https://en.mikanoshi.name/donate/");
- return true;
- }
- });
-
- findPreference("pref_key_miuizer_marknewmods").setOnPreferenceChangeListener(new CheckBoxPreference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- Helpers.updateNewModsMarking(getActivity(), Integer.parseInt((String)newValue));
- return true;
- }
- });
-
-// if (Helpers.isUnsupportedManager(act)) {
-// CheckBoxPreferenceEx ownrepo = (CheckBoxPreferenceEx)findPreference("pref_key_miuizer_ownrepo");
-// ownrepo.setSummary(R.string.miuizer_ownrepo_unsupported);
-// ownrepo.setEnabled(false);
-// ownrepo.setChecked(false);
-// }
-
-// Helpers.removePref(this, "pref_key_miuizer_force_material", "pref_key_miuizer");
- }
-
- void showGuides() {
- if (getView() == null || getActivity() == null) return;
- Button more = getView().findViewById(getResources().getIdentifier("more", "id", "miui"));
- View search = getView().findViewById(android.R.id.inputArea);
- View overlay = getActivity().findViewById(R.id.guide_overlay);
- if (more == null || search == null || overlay == null || Helpers.prefs.getBoolean("miuizer_guides_shown", false)) return;
-
- overlay.setBackgroundColor(Helpers.isNightMode(getActivity()) ? Color.argb(150, 0, 0, 0) : Color.argb(150, 255, 255, 255));
- overlay.setVisibility(View.VISIBLE);
- overlay.bringToFront();
-
- showGuide(search, GuidePopup.ARROW_TOP_MODE, R.string.guide_search).setOnDismissListener(new PopupWindow.OnDismissListener() {
- @Override
- public void onDismiss() {
- showGuide(markCat, GuidePopup.ARROW_BOTTOM_MODE, R.string.guide_marknew).setOnDismissListener(new PopupWindow.OnDismissListener() {
- @Override
- public void onDismiss() {
- showImmersionMenu();
- showGuide(more, GuidePopup.ARROW_TOP_MODE, R.string.guide_softreboot).setOnDismissListener(new PopupWindow.OnDismissListener() {
- @Override
- public void onDismiss() {
- dismissImmersionMenu(true);
- overlay.setVisibility(View.GONE);
- }
- });
- }
- });
- }
- });
-
- Helpers.prefs.edit().putBoolean("miuizer_guides_shown", true).apply();
- }
-
- @SuppressWarnings({"UnusedReturnValue", "SameParameterValue"})
- GuidePopup showGuide(View anchor, int arrowMode, int textResId) {
- return showGuide(anchor, arrowMode, textResId, 0, 0);
- }
-
- @SuppressWarnings({"UnusedReturnValue", "SameParameterValue"})
- GuidePopup showGuide(View anchor, int arrowMode, int textResId, int x, int y) {
- GuidePopup guidePopup = new GuidePopup(getActivity());
- guidePopup.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
- guidePopup.setArrowMode(arrowMode);
- guidePopup.setGuideText(textResId);
- guidePopup.setOutsideTouchable(true);
- guidePopup.show(anchor, x, y);
- return guidePopup;
- }
-
- void findMod(String filter) {
- resultView.setVisibility(filter.equals("") ? View.GONE : View.VISIBLE);
- listView.setEnabled(filter.equals(""));
- ListAdapter adapter = resultView.getAdapter();
- if (adapter == null) return;
- ((ModSearchAdapter)resultView.getAdapter()).getFilter().filter(filter);
- }
-
- public void createReport() {
- ACRA.getErrorReporter().handleException(null);
- }
-
- // PreferenceScreens management
- private boolean openModCat(String cat) {
- return openModCat(cat, null, null);
- }
-
- private boolean openModCat(String cat, String sub, String mod) {
- Bundle bundle = new Bundle();
- bundle.putString("cat", cat);
- bundle.putString("sub", sub);
- bundle.putString("mod", mod);
- catSelector.setTargetFragment(this, 0);
- switch (cat) {
- case "pref_key_system":
- if (sub == null)
- openSubFragment(catSelector, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.system_mods, R.xml.prefs_system_cat);
- else
- openSubFragment(prefSystem, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.system_mods, R.xml.prefs_system);
- return false;
- case "pref_key_launcher":
- if (sub == null)
- openSubFragment(catSelector, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.launcher_title, R.xml.prefs_launcher_cat);
- else
- openSubFragment(prefLauncher, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.launcher_title, R.xml.prefs_launcher);
- return true;
- case "pref_key_controls":
- if (sub == null)
- openSubFragment(catSelector, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.controls_mods, R.xml.prefs_controls_cat);
- else
- openSubFragment(prefControls, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.controls_mods, R.xml.prefs_controls);
- return false;
- case "pref_key_various":
- openSubFragment(prefVarious, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.various_mods, R.xml.prefs_various);
- return false;
- default:
- return false;
- }
- }
-
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen parentPreferenceScreen, Preference preference) {
- if (preference != null) {
- PreferenceCategory modsCat = (PreferenceCategory)findPreference("prefs_cat");
- if (modsCat.findPreference(preference.getKey()) != null)
- if (openModCat(preference.getKey())) return true;
- }
- return super.onPreferenceTreeClick(parentPreferenceScreen, preference);
- }
-
- private void showRestoreInfoDialog() {
- try {
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
- builder.setTitle(R.string.warning);
- builder.setMessage(R.string.backup_restore_info);
- builder.setCancelable(true);
- builder.setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton){}
- });
- AlertDialog dlg = builder.create();
- dlg.show();
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- private void showPrefsMigrationDialog(boolean success) {
- try {
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
- builder.setTitle(R.string.warning);
- builder.setMessage(success ? R.string.prefs_migration_success : R.string.prefs_migration_failure);
- builder.setCancelable(false);
- builder.setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton){}
- });
- AlertDialog dlg = builder.create();
- dlg.show();
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
-// private void showNotYetDialog() {
-// try {
-// AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
-// builder.setTitle(R.string.info);
-// builder.setMessage(R.string.not_yet);
-// builder.setCancelable(true);
-// builder.setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() {
-// public void onClick(DialogInterface dialog, int whichButton){}
-// });
-// AlertDialog dlg = builder.create();
-// dlg.show();
-// } catch (Throwable t) {
-// t.printStackTrace();
-// }
-// }
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/MainModule.java b/app/src/main/java/name/mikanoshi/customiuizer/MainModule.java
deleted file mode 100644
index a0c193d7..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/MainModule.java
+++ /dev/null
@@ -1,467 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.app.Application;
-import android.content.Context;
-
-import java.io.File;
-import java.util.Map;
-
-import de.robv.android.xposed.IXposedHookLoadPackage;
-import de.robv.android.xposed.IXposedHookZygoteInit;
-import de.robv.android.xposed.XSharedPreferences;
-import de.robv.android.xposed.XposedBridge;
-import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
-
-import name.mikanoshi.customiuizer.mods.Controls;
-import name.mikanoshi.customiuizer.mods.GlobalActions;
-import name.mikanoshi.customiuizer.mods.Launcher;
-import name.mikanoshi.customiuizer.mods.PackagePermissions;
-import name.mikanoshi.customiuizer.mods.System;
-import name.mikanoshi.customiuizer.mods.Various;
-import name.mikanoshi.customiuizer.utils.Helpers;
-import name.mikanoshi.customiuizer.utils.Helpers.MethodHook;
-import name.mikanoshi.customiuizer.utils.PrefMap;
-import name.mikanoshi.customiuizer.utils.ResourceHooks;
-
-public class MainModule implements IXposedHookZygoteInit, IXposedHookLoadPackage {
-
- public static PrefMap mPrefs = new PrefMap();
- public static ResourceHooks resHooks;
- private static boolean hideIconsActive = false;
-
- public void initZygote(StartupParam startParam) {
- //long startTime = SystemClock.elapsedRealtime();
- if (mPrefs.size() == 0) {
- XSharedPreferences pref = null;
- try {
- if (XposedBridge.getXposedVersion() >= 93)
- pref = new XSharedPreferences(Helpers.modulePkg, Helpers.prefsName);
- else
- pref = new XSharedPreferences(new File(Helpers.prefsFile));
- pref.makeWorldReadable();
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- Map allPrefs = pref == null ? null : pref.getAll();
- if (allPrefs == null || allPrefs.size() == 0)
- Helpers.log("[UID " + android.os.Process.myUid() +"] Cannot read module's SharedPreferences, some mods might not work!");
- else
- mPrefs.putAll(allPrefs);
- }
-
- resHooks = new ResourceHooks();
-
- if (mPrefs.getInt("system_statusbarheight", 19) > 19) System.StatusBarHeightRes();
- if (mPrefs.getInt("controls_navbarheight", 19) > 19) Controls.NavbarHeightRes();
- if (mPrefs.getBoolean("system_compactnotif")) System.CompactNotificationsRes();
- if (mPrefs.getBoolean("system_nosafevolume")) System.NoSafeVolumeWarningRes();
- if (mPrefs.getBoolean("controls_powerflash")) Controls.PowerKeyRes();
- if (mPrefs.getBoolean("controls_noscrchord")) Controls.NoScreenshotChordRes();
- if (mPrefs.getStringAsInt("system_allrotations2", 1) > 1) System.AllRotationsRes();
- if (mPrefs.getStringAsInt("system_rotateanim", 1) > 1) System.RotationAnimationRes();
-
- if (mPrefs.getInt("system_betterpopups_delay", 0) > 0 && !mPrefs.getBoolean("system_betterpopups_nohide")) System.BetterPopupsHideDelaySysHook();
- if (mPrefs.getInt("system_messagingstylelines", 0) > 0 && Helpers.is12()) System.MessagingStyleLinesSysHook();
- if (mPrefs.getBoolean("system_colorizenotiftitle")) System.ColorizedNotificationTitlesHook();
- if (mPrefs.getBoolean("system_nopassword")) System.NoPasswordHook();
- if (mPrefs.getBoolean("system_epm")) System.ExtendedPowerMenuHook();
- if (mPrefs.getBoolean("system_statusbarcolor")) System.StatusBarBackgroundHook();
- if (mPrefs.getBoolean("system_magnifier") && Helpers.isPiePlus()) System.TextMagnifierHook();
- if (mPrefs.getBoolean("system_lockscreenshortcuts") || mPrefs.getInt("controls_powerdt_action", 1) > 1) System.LockScreenSecureLaunchHook();
- if (mPrefs.getBoolean("system_notifmediaseekbar") && !Helpers.is12()) System.MediaNotificationSeekBarHook();
- if (mPrefs.getBoolean("system_disableanynotif") && !Helpers.isNougat()) System.DisableAnyNotificationBlockHook();
- if (mPrefs.getBoolean("system_apksign")) System.NoSignatureVerifyHook();
- if (mPrefs.getBoolean("system_nooverscroll")) System.NoOverscrollHook();
- if (mPrefs.getBoolean("system_cleanshare")) System.CleanShareMenuHook();
- if (mPrefs.getBoolean("system_cleanopenwith")) System.CleanOpenWithMenuHook();
- if (mPrefs.getBoolean("system_removesecure")) System.RemoveSecureHook();
- if (mPrefs.getBoolean("system_allownotifonkeyguard")) System.AllowAllKeyguardSysHook();
- if (mPrefs.getBoolean("system_allownotiffloat")) System.AllowAllFloatSysHook();
- if (mPrefs.getBoolean("system_resizablewidgets")) System.ResizableWidgetsHook();
- if (mPrefs.getBoolean("system_hidelowbatwarn")) System.NoLowBatteryWarningHook();
- if (mPrefs.getBoolean("system_screenshot_overlay")) System.TempHideOverlayHook();
- if (mPrefs.getBoolean("system_nomediamute")) System.NoMediaMuteInDNDHook();
- if (mPrefs.getBoolean("system_audiosilencer")) System.AudioSilencerHook();
- if (mPrefs.getBoolean("system_fw_noblacklist")) System.NoFloatingWindowBlacklistHook();
- if (mPrefs.getBoolean("controls_volumecursor")) Controls.VolumeCursorHook();
- if (mPrefs.getBoolean("controls_fsg_horiz")) Controls.FSGesturesSysHook();
- if (mPrefs.getBoolean("various_alarmcompat")) Various.AlarmCompatHook();
- if (mPrefs.getStringAsInt("system_iconlabletoasts", 1) > 1) System.IconLabelToastsHook();
- if (mPrefs.getStringAsInt("system_blocktoasts", 1) > 1) System.SelectiveToastsHook();
-
- hideIconsActive =
- mPrefs.getBoolean("system_statusbaricons_alarm") ||
- mPrefs.getBoolean("system_statusbaricons_profile") ||
- mPrefs.getBoolean("system_statusbaricons_sound") ||
- mPrefs.getBoolean("system_statusbaricons_dnd") ||
- mPrefs.getBoolean("system_statusbaricons_headset") ||
- mPrefs.getBoolean("system_statusbaricons_mute") ||
- mPrefs.getBoolean("system_statusbaricons_speaker") ||
- mPrefs.getBoolean("system_statusbaricons_record");
- if (hideIconsActive) System.HideIconsSystemHook();
-
- Controls.VolumeMediaPlayerHook();
- GlobalActions.setupSystemHelpers();
- //Helpers.log("initZygote", String.valueOf(SystemClock.elapsedRealtime() - startTime));
- }
-
- public void handleLoadPackage(final LoadPackageParam lpparam) {
- String pkg = lpparam.packageName;
-
- if (pkg.equals("android") && lpparam.processName.equals("android")) {
- PackagePermissions.hook(lpparam);
- GlobalActions.setupGlobalActions(lpparam);
- if (mPrefs.getBoolean("system_popupnotif_fs") ||
- mPrefs.getBoolean("controls_volumecursor") ||
- mPrefs.getBoolean("controls_fsg_horiz") ||
- mPrefs.getStringAsInt("various_showcallui", 0) > 0) GlobalActions.setupForegroundMonitor(lpparam);
-
- if (mPrefs.getInt("controls_fingerprint1_action", 1) > 1 ||
- mPrefs.getInt("controls_fingerprint2_action", 1) > 1 ||
- mPrefs.getInt("controls_fingerprintlong_action", 1) > 1 ||
- mPrefs.getStringAsInt("controls_fingerprint_accept", 1) > 1 ||
- mPrefs.getStringAsInt("controls_fingerprint_reject", 1) > 1 ||
- mPrefs.getStringAsInt("controls_fingerprint_hangup", 1) > 1) Controls.FingerprintEventsHook(lpparam);
- if (mPrefs.getInt("controls_backlong_action", 1) > 1 ||
- mPrefs.getInt("controls_homelong_action", 1) > 1 ||
- mPrefs.getInt("controls_menulong_action", 1) > 1) Controls.NavBarActionsHook(lpparam);
- if (mPrefs.getInt("controls_powerdt_action", 1) > 1) Controls.PowerDoubleTapActionHook(lpparam);
- if (mPrefs.getInt("system_screenanim_duration", 0) > 0) System.ScreenAnimHook(lpparam);
- if (mPrefs.getInt("system_volumesteps", 0) > 0) System.VolumeStepsHook(lpparam);
- if (mPrefs.getInt("system_applock_timeout", 1) > 1) System.AppLockTimeoutHook(lpparam);
- if (mPrefs.getInt("system_dimtime", 0) > 0) System.ScreenDimTimeHook(lpparam);
- if (mPrefs.getInt("system_toasttime", 0) > 0) System.ToastTimeHook(lpparam);
- if (!mPrefs.getString("system_defaultusb", "none").equals("none")) System.USBConfigHook(lpparam);
- if (mPrefs.getBoolean("system_nolightuponheadset")) System.NoLightUpOnHeadsetHook(lpparam);
- if (mPrefs.getBoolean("system_securelock")) System.EnhancedSecurityHook(lpparam);
- if (mPrefs.getBoolean("system_separatevolume")) System.NotificationVolumeServiceHook(lpparam);
- if (mPrefs.getBoolean("system_downgrade")) System.NoVersionCheckHook(lpparam);
- if (mPrefs.getBoolean("system_hidefromrecents")) System.HideFromRecentsHook(lpparam);
- if (mPrefs.getBoolean("system_orientationlock")) System.OrientationLockHook(lpparam);
- if (mPrefs.getBoolean("system_noducking")) System.NoDuckingHook(lpparam);
- if (mPrefs.getBoolean("system_epm")) System.ExtendedPowerMenuHook(lpparam);
- if (mPrefs.getBoolean("system_cleanshare")) System.CleanShareMenuServiceHook(lpparam);
- if (mPrefs.getBoolean("system_cleanopenwith")) System.CleanOpenWithMenuServiceHook(lpparam);
- if (mPrefs.getBoolean("system_autobrightness")) System.AutoBrightnessRangeHook(lpparam);
- if (mPrefs.getBoolean("system_applock")) System.AppLockHook(lpparam);
- if (mPrefs.getBoolean("system_applock_skip")) System.SkipAppLockHook(lpparam);
- if (mPrefs.getBoolean("various_alarmcompat")) Various.AlarmCompatServiceHook(lpparam);
- if (mPrefs.getBoolean("system_ignorecalls")) System.NoCallInterruptionHook(lpparam);
- if (mPrefs.getBoolean("system_forceclose")) System.ForceCloseHook(lpparam);
- if (mPrefs.getBoolean("system_hideproxywarn")) System.HideProximityWarningHook(lpparam);
- if (mPrefs.getBoolean("system_firstpress")) System.FirstVolumePressHook(lpparam);
- if (mPrefs.getBoolean("system_apksign")) System.NoSignatureVerifyServiceHook(lpparam);
- if (mPrefs.getBoolean("system_vibration_amp")) System.MuffledVibrationHook(lpparam);
- if (mPrefs.getBoolean("system_clearalltasks")) System.ClearAllTasksHook(lpparam);
- if (mPrefs.getBoolean("system_snoozedmanager")) System.MoreSnoozeOptionsServiceHook(lpparam);
- if (mPrefs.getBoolean("system_nodarkforce")) System.NoDarkForceHook(lpparam);
- if (mPrefs.getBoolean("system_audiosilencer")) System.AudioSilencerServiceHook(lpparam);
- if (mPrefs.getBoolean("system_fw_sticky")) System.StickyFloatingWindowsHook(lpparam);
- if (mPrefs.getBoolean("system_charginginfo")) System.ChargingInfoServiceHook(lpparam);
- if (mPrefs.getBoolean("system_lswallpaper")) System.SetLockscreenWallpaperHook(lpparam);
- if (mPrefs.getBoolean("system_usenativerecents") && Helpers.is125()) System.UseNativeRecentsFixHook(lpparam);
- if (mPrefs.getBoolean("controls_powerflash")) Controls.PowerKeyHook(lpparam);
- if (mPrefs.getBoolean("controls_fingerprintfailure")) Controls.FingerprintHapticFailureHook(lpparam);
- if (mPrefs.getBoolean("controls_fingerprintscreen")) Controls.FingerprintScreenOnHook(lpparam);
- if (mPrefs.getBoolean("controls_fingerprintwake")) Controls.NoFingerprintWakeHook(lpparam);
- if (mPrefs.getBoolean("various_miuiinstaller")) Various.MiuiPackageInstallerServiceHook(lpparam);
- if (mPrefs.getBoolean("various_disableapp")) Various.AppsDisableServiceHook(lpparam);
- if (mPrefs.getStringAsInt("system_allrotations2", 1) > 1) System.AllRotationsHook(lpparam);
- if (mPrefs.getStringAsInt("system_nolightuponcharges", 1) > 1) System.NoLightUpOnChargeHook(lpparam);
- if (mPrefs.getStringAsInt("system_autogroupnotif", 1) > 1) System.AutoGroupNotificationsHook(lpparam);
- if (mPrefs.getStringAsInt("system_vibration", 1) > 1) System.SelectiveVibrationHook(lpparam);
- if (mPrefs.getStringAsInt("system_rotateanim", 1) > 1 && Helpers.is12()) System.RotationAnimatinoHook(lpparam);
- if (mPrefs.getStringAsInt("controls_fingerprintsuccess", 1) > 1) Controls.FingerprintHapticSuccessHook(lpparam);
- if (mPrefs.getStringAsInt("controls_volumemedia_up", 0) > 0 ||
- mPrefs.getStringAsInt("controls_volumemedia_down", 0) > 0) Controls.VolumeMediaButtonsHook(lpparam);
-
- //Controls.AIButtonHook(lpparam);
- }
-
- if (pkg.equals("com.android.systemui")) {
- GlobalActions.setupStatusBar(lpparam);
-
- if (mPrefs.getInt("system_qsgridcolumns", 2) > 2 || mPrefs.getInt("system_qsgridrows", 1) > 1) System.QSGridRes();
- if (mPrefs.getInt("system_qqsgridcolumns", 2) > 2) System.QQSGridRes();
- if (mPrefs.getInt("system_volumeblur_collapsed", 0) > 0 || mPrefs.getInt("system_volumeblur_expanded", 0) > 0) System.BlurVolumeDialogBackgroundRes();
- if (mPrefs.getBoolean("system_notifrowmenu")) System.NotificationRowMenuRes();
- if (mPrefs.getBoolean("system_volumetimer")) System.VolumeTimerValuesRes();
- if (mPrefs.getBoolean("system_separatevolume")) System.NotificationVolumeDialogRes();
- if (mPrefs.getBoolean("system_snoozedmanager")) System.MoreSnoozeOptionsRes();
- if (mPrefs.getBoolean("system_statusbaricons_volte")) System.HideIconsVoLTERes();
- if (mPrefs.getStringAsInt("system_networkindicator", 1) > 1) System.NetworkIndicatorRes();
-
- if (mPrefs.getInt("system_statusbarheight", 19) > 19) System.StatusBarHeightHook(lpparam);
- if (mPrefs.getInt("system_recents_blur", 100) < 100) System.RecentsBlurRatioHook(lpparam);
- if (mPrefs.getInt("system_drawer_blur", 100) < 100) System.DrawerBlurRatioHook(lpparam);
- if (mPrefs.getInt("system_drawer_opacity", 100) < 100) System.DrawerThemeBackgroundHook(lpparam);
- if (mPrefs.getInt("system_chargeanimtime", 20) < 20) System.ChargeAnimationHook(lpparam);
- if (mPrefs.getInt("system_betterpopups_delay", 0) > 0 && !mPrefs.getBoolean("system_betterpopups_nohide")) System.BetterPopupsHideDelayHook(lpparam);
- if (mPrefs.getInt("system_netspeedinterval", 4) != 4) System.NetSpeedIntervalHook(lpparam);
- if (mPrefs.getInt("system_qsgridrows", 1) > 1 || mPrefs.getBoolean("system_qsnolabels")) System.QSGridLabelsHook(lpparam);
- if (mPrefs.getInt("system_volumeblur_collapsed", 0) > 0 || mPrefs.getInt("system_volumeblur_expanded", 0) > 0) System.BlurVolumeDialogBackgroundHook(lpparam);
- if (mPrefs.getInt("system_lstimeout", 9) > 9) System.LockScreenTimeoutHook(lpparam);
- if (mPrefs.getInt("system_screenshot_floattime", 0) > 0) System.ScreenshotFloatTimeHook(lpparam);
- if (mPrefs.getInt("system_volumedialogdelay_collapsed", 0) > 0 ||
- mPrefs.getInt("system_volumedialogdelay_expanded", 0) > 0) System.VolumeDialogAutohideDelayHook(lpparam);
- if (mPrefs.getInt("controls_fsg_coverage", 60) != 60) Controls.BackGestureAreaHeightHook(lpparam, true);
- if (mPrefs.getInt("controls_fsg_width", 100) > 100) Controls.BackGestureAreaWidthHook(lpparam, true);
- if (mPrefs.getInt("controls_fsg_assist_action", 1) > 1) Controls.AssistGestureActionHook(lpparam);
- if (mPrefs.getInt("controls_navbarleft_action", 1) > 1 ||
- mPrefs.getInt("controls_navbarleftlong_action", 1) > 1 ||
- mPrefs.getInt("controls_navbarright_action", 1) > 1 ||
- mPrefs.getInt("controls_navbarrightlong_action", 1) > 1) Controls.NavBarButtonsHook(lpparam);
- if (mPrefs.getInt("system_recommended_first_action", 1) > 1 ||
- mPrefs.getInt("system_recommended_second_action", 1) > 1 ||
- mPrefs.getInt("system_recommended_third_action", 1) > 1 ||
- mPrefs.getInt("system_recommended_fourth_action", 1) > 1) System.CustomRecommendedHook(lpparam, false);
- if (mPrefs.getBoolean("system_scramblepin")) System.ScramblePINHook(lpparam);
- if (mPrefs.getBoolean("system_dttosleep")) System.DoubleTapToSleepHook(lpparam);
- if (mPrefs.getBoolean("system_clockseconds")) System.ClockSecondsHook(lpparam);
- if (mPrefs.getBoolean("system_fixmeter")) System.TrafficSpeedSpacingHook(lpparam);
- if (mPrefs.getBoolean("system_noscreenlock_act")) System.NoScreenLockHook(lpparam);
- if (mPrefs.getBoolean("system_detailednetspeed")) System.DetailedNetSpeedHook(lpparam);
- if (mPrefs.getBoolean("system_albumartonlock")) System.LockScreenAlbumArtHook(lpparam);
- if (mPrefs.getBoolean("system_popupnotif")) System.PopupNotificationsHook(lpparam);
- if (mPrefs.getBoolean("system_betterpopups_nohide")) System.BetterPopupsNoHideHook(lpparam);
- if (mPrefs.getBoolean("system_betterpopups_swipedown")) System.BetterPopupsSwipeDownHook(lpparam);
- if (mPrefs.getBoolean("system_betterpopups_center")) System.BetterPopupsCenteredHook(lpparam);
- if (mPrefs.getBoolean("system_hidemoreicon")) System.NoMoreIconHook(lpparam);
- if (mPrefs.getBoolean("system_notifafterunlock")) System.ShowNotificationsAfterUnlockHook(lpparam);
- if (mPrefs.getBoolean("system_notifrowmenu")) System.NotificationRowMenuHook(lpparam);
- if (mPrefs.getBoolean("system_compactnotif")) System.CompactNotificationsHook(lpparam);
- if (mPrefs.getBoolean("system_removecleaner")) System.HideMemoryCleanHook(lpparam, false);
- if (mPrefs.getBoolean("system_removedismiss")) System.HideDismissViewHook(lpparam);
- if (mPrefs.getBoolean("controls_nonavbar")) Controls.HideNavBarHook(lpparam);
- if (mPrefs.getBoolean("controls_imebackalticon")) Controls.ImeBackAltIconHook(lpparam);
- if (mPrefs.getBoolean("controls_fsg_horiz")) Controls.FSGesturesHook(lpparam);
- if (mPrefs.getBoolean("system_visualizer")) System.AudioVisualizerHook(lpparam);
- if (mPrefs.getBoolean("system_separatevolume") && mPrefs.getBoolean("system_separatevolume_slider")) System.NotificationVolumeDialogHook(lpparam);
- if (mPrefs.getBoolean("system_batteryindicator")) System.BatteryIndicatorHook(lpparam);
- if (mPrefs.getBoolean("system_disableanynotif")) System.DisableAnyNotificationHook();
- if (mPrefs.getBoolean("system_lockscreenshortcuts")) System.LockScreenShortcutHook(lpparam);
- if (mPrefs.getBoolean("system_4gtolte")) System.Network4GtoLTEHook(lpparam);
- if (mPrefs.getBoolean("system_showlux")) System.BrightnessLuxHook(lpparam);
- if (mPrefs.getBoolean("system_showpct")) System.BrightnessPctHook(lpparam);
- if (mPrefs.getBoolean("system_cleanmirror")) System.ClearBrightnessMirrorHook(lpparam);
- if (mPrefs.getBoolean("system_hidelsstatusbar")) System.HideLockScreenStatusBarHook(lpparam);
- if (mPrefs.getBoolean("system_hidelsclock")) System.HideLockScreenClockHook(lpparam);
- if (mPrefs.getBoolean("system_hidelshint")) System.HideLockScreenHintHook(lpparam);
- if (mPrefs.getBoolean("system_nosilentvibrate")) System.NoSilentVibrateHook(lpparam);
- if (mPrefs.getBoolean("system_drawer_hidebackground")) System.HideThemeBackgroundBrightnessHook(lpparam);
- if (mPrefs.getBoolean("system_allowdirectreply")) System.AllowDirectReplyHook(lpparam);
- if (mPrefs.getBoolean("system_allownotifonkeyguard")) System.AllowAllKeyguardHook(lpparam);
- if (mPrefs.getBoolean("system_allownotiffloat")) System.AllowAllFloatHook(lpparam);
- if (mPrefs.getBoolean("system_hideqs")) System.HideQSHook(lpparam);
- if (mPrefs.getBoolean("system_lsalarm")) System.LockScreenAlaramHook(lpparam);
- if (mPrefs.getBoolean("system_statusbarcontrols")) System.StatusBarGesturesHook(lpparam);
- if (mPrefs.getBoolean("system_screenshot")) System.ScreenshotConfigHook(lpparam);
- if (mPrefs.getBoolean("system_nodrawerbackground")) System.RemoveDrawerBackgroundHook(lpparam);
- if (mPrefs.getBoolean("system_nonetspeedseparator")) System.NoNetworkSpeedSeparatorHook(lpparam);
- if (mPrefs.getBoolean("system_snoozedmanager")) System.MoreSnoozeOptionsHook(lpparam);
- if (mPrefs.getBoolean("system_taptounlock")) System.TapToUnlockHook(lpparam);
- if (mPrefs.getBoolean("system_nosos")) System.NoSOSHook(lpparam);
- if (mPrefs.getBoolean("system_usenativerecents")) System.UseNativeRecentsHook(lpparam);
- if (mPrefs.getBoolean("system_morenotif")) System.MoreNotificationsHook(lpparam);
- if (mPrefs.getBoolean("system_dndtoggle")) System.VolumeDialogDNDSwitchHook(lpparam);
- if (mPrefs.getBoolean("system_fw_splitscreen")) System.MultiWindowPlusNativeHook(lpparam);
- if (mPrefs.getBoolean("system_charginginfo")) System.ChargingInfoHook(lpparam);
- if (mPrefs.getBoolean("system_secureqs")) System.SecureQSTilesHook(lpparam);
- if (mPrefs.getBoolean("system_mutevisiblenotif")) System.MuteVisibleNotificationsHook(lpparam);
- if (mPrefs.getBoolean("launcher_nounlockanim")) System.NoUnlockAnimationHook(lpparam);
- if (mPrefs.getBoolean("system_statusbaricons_battery1")) System.HideIconsBattery1Hook(lpparam);
- if (mPrefs.getBoolean("system_statusbaricons_battery2")) System.HideIconsBattery2Hook(lpparam);
- if (mPrefs.getBoolean("system_statusbaricons_battery3")) System.HideIconsBattery3Hook(lpparam);
- if (mPrefs.getBoolean("system_statusbaricons_signal")) System.HideIconsSignalHook(lpparam);
- if (mPrefs.getBoolean("system_statusbaricons_vpn")) System.HideIconsVPNHook(lpparam);
- if (mPrefs.getBoolean("system_statusbaricons_nosims")) System.HideIconsNoSIMsHook(lpparam);
- if (mPrefs.getBoolean("system_statusbaricons_wifi")) System.HideIconsNoWiFiHook(lpparam);
- if (mPrefs.getBoolean("system_statusbaricons_hotspot")) System.HideIconsHotspotHook(lpparam);
- if (mPrefs.getBoolean("system_statusbaricons_volte")) System.HideIconsVoLTEHook(lpparam);
- if (mPrefs.getBoolean("system_statusbaricons_vowifi")) System.HideIconsVoWiFiHook(lpparam);
- if (!mPrefs.getBoolean("system_statusbaricons_alarm") && mPrefs.getInt("system_statusbaricons_alarmn", 0) > 0) System.HideIconsSelectiveAlarmHook(lpparam);
- if (!mPrefs.getString("system_shortcut_app", "").equals("")) System.ReplaceShortcutAppHook(lpparam);
- if (!mPrefs.getString("system_clock_app", "").equals("")) System.ReplaceClockAppHook(lpparam);
- if (!mPrefs.getString("system_calendar_app", "").equals("")) System.ReplaceCalendarAppHook(lpparam);
- if (mPrefs.getStringAsInt("system_qshaptics", 1) > 1) System.QSHapticHook(lpparam);
- if (mPrefs.getStringAsInt("system_expandnotifs", 1) > 1) System.ExpandNotificationsHook(lpparam);
- if (mPrefs.getStringAsInt("system_inactivebrightness", 1) > 1) System.InactiveBrightnessSliderHook(lpparam);
- if (mPrefs.getStringAsInt("system_mobiletypeicon", 1) > 1) System.HideNetworkTypeHook(lpparam);
- if (mPrefs.getStringAsInt("system_statusbaricons_bluetooth", 1) > 1) System.HideIconsBluetoothHook(lpparam);
- if (hideIconsActive) System.HideIconsHook(lpparam);
-
- if (Helpers.is12()) {
- if (mPrefs.getInt("system_messagingstylelines", 0) > 0) System.MessagingStyleLinesHook(lpparam);
- if (mPrefs.getBoolean("system_betterpopups_allowfloat")) System.BetterPopupsAllowFloatHook(lpparam);
- if (mPrefs.getBoolean("system_securecontrolcenter")) System.SecureControlCenterHook(lpparam);
- if (mPrefs.getBoolean("system_minimalnotifview")) System.MinimalNotificationViewHook(lpparam);
- if (mPrefs.getBoolean("system_notifchannelsettings")) System.NotificationChannelSettingsHook(lpparam);
- if (mPrefs.getStringAsInt("system_maxsbicons", 0) != 0) System.MaxNotificationIconsHook(lpparam);
- } else {
- if (mPrefs.getBoolean("system_notifmediaseekbar")) System.MediaNotificationSeekBarSysUIHook(lpparam);
- }
- }
-
- if (pkg.equals(Helpers.modulePkg)) {
- GlobalActions.miuizerHook(lpparam);
- }
-
- if (pkg.equals("com.android.server.telecom")) {
- if (mPrefs.getBoolean("various_callreminder")) Various.CallReminderHook(lpparam);
- }
-
- if (pkg.equals("com.android.incallui")) {
- if (mPrefs.getStringAsInt("various_showcallui", 0) > 0) Various.ShowCallUIHook(lpparam);
- if (mPrefs.getBoolean("various_calluibright")) Various.InCallBrightnessHook(lpparam);
-// Various.LargeCallerPhotoHook(lpparam);
- }
-
- if (pkg.equals("com.miui.securitycenter")) {
- if (mPrefs.getBoolean("various_appdetails")) Various.AppInfoHook(lpparam);
- if (mPrefs.getBoolean("various_disableapp")) Various.AppsDisableHook(lpparam);
- if (mPrefs.getBoolean("various_restrictapp")) Various.AppsRestrictHook(lpparam);
- if (mPrefs.getBoolean("system_unblockthird")) System.UnblockThirdLaunchersHook(lpparam);
- if (mPrefs.getBoolean("system_applock_scramblepin")) System.ScrambleAppLockPINHook(lpparam);
- if (mPrefs.getStringAsInt("various_appsort", 0) > 0) Various.AppsDefaultSortHook(lpparam);
- }
-
- if (pkg.equals("com.miui.powerkeeper")) {
- if (mPrefs.getBoolean("various_restrictapp")) Various.AppsRestrictPowerHook(lpparam);
- }
-
- if (pkg.equals("com.android.settings")) {
- GlobalActions.miuizerSettingsRes();
- if (Helpers.is12())
- GlobalActions.miuizerSettings12Hook(lpparam);
- else
- GlobalActions.miuizerSettingsHook(lpparam);
- if (mPrefs.getBoolean("system_separatevolume")) {
- System.NotificationVolumeSettingsRes();
- System.NotificationVolumeSettingsHook(lpparam);
- }
- if (mPrefs.getBoolean("system_disableanynotif")) System.DisableAnyNotificationHook();
- if (!mPrefs.getString("system_defaultusb", "none").equals("none")) System.USBConfigSettingsHook(lpparam);
- }
-
- if (pkg.equals("com.google.android.packageinstaller") || pkg.equals("com.android.packageinstaller")) {
- if (mPrefs.getBoolean("various_installappinfo")) Various.AppInfoDuringInstallHook(lpparam);
- }
-
- if (pkg.startsWith("com.google.android.inputmethod")) {
- if (mPrefs.getInt("various_gboardpadding_port", 0) > 0 || mPrefs.getInt("various_gboardpadding_land", 0) > 0) Various.GboardPaddingHook();
- }
-
- if (pkg.equals("com.miui.packageinstaller")) {
- if (mPrefs.getBoolean("system_apksign")) System.NoSignatureVerifyMiuiHook(lpparam);
- if (mPrefs.getBoolean("various_miuiinstaller")) Various.MiuiPackageInstallerHook(lpparam);
- if (mPrefs.getBoolean("various_installappinfo")) Various.AppInfoDuringMiuiInstallHook(lpparam);
- }
-
- if (pkg.equals("org.meowcat.edxposed.manager"))
- Helpers.findAndHookMethod(Application.class, "attach", Context.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- GlobalActions.miuizerEdXposedManagerHook(lpparam);
- }
- });
-
- if (pkg.equals("com.miui.screenrecorder")) {
- if (mPrefs.getBoolean("various_unlockfps")) Various.ScreenRecorderFramerateHook(lpparam);
- }
-
- final boolean isMIUILauncherPkg = pkg.equals("com.miui.home");
- final boolean isLauncherPkg = isMIUILauncherPkg || pkg.equals("com.mi.android.globallauncher");
- final boolean isLauncherPerf = mPrefs.getBoolean("launcher_compat");
- final boolean isGoogleMinus = mPrefs.getBoolean("launcher_googleminus");
- final boolean isStatusBarColor = mPrefs.getBoolean("system_statusbarcolor") && !mPrefs.getStringSet("system_statusbarcolor_apps").contains(pkg);
- final int collapseTitlesOpt = mPrefs.getStringAsInt("various_collapsemiuititles", 1);
- final boolean collapseTitles = collapseTitlesOpt > 1 && Helpers.is12();
- final boolean noOverscroll = mPrefs.getBoolean("system_nooverscroll") && Helpers.is125();
-
- if (isLauncherPkg) {
- if (mPrefs.getInt("launcher_horizmargin", 0) > 0) Launcher.HorizontalSpacingRes();
- if (mPrefs.getInt("launcher_topmargin", 0) > 0) Launcher.TopSpacingRes();
- if (mPrefs.getInt("launcher_bottommargin", 0) > 0) Launcher.BottomSpacingRes();
- if (mPrefs.getInt("launcher_indicatorheight", 9) > 9) Launcher.IndicatorHeightRes();
- if (mPrefs.getBoolean("launcher_unlockgrids")) Launcher.UnlockGridsRes();
- if (mPrefs.getBoolean("launcher_docktitles")) Launcher.ShowHotseatTitlesRes();
- if (isLauncherPerf) handleLoadLauncher(lpparam);
- }
-
- if ((isLauncherPkg && !isLauncherPerf) || (isMIUILauncherPkg && isGoogleMinus) || isStatusBarColor || collapseTitles || noOverscroll)
- Helpers.findAndHookMethod(Application.class, "attach", Context.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (isLauncherPkg && !isLauncherPerf) handleLoadLauncher(lpparam);
- if (isMIUILauncherPkg && isGoogleMinus) Launcher.GoogleMinusScreenHook(lpparam);
- if (isStatusBarColor) System.StatusBarBackgroundCompatHook(lpparam);
- if (collapseTitles) Various.CollapseMIUITitlesHook(lpparam, param, collapseTitlesOpt);
- if (noOverscroll) System.NoOverscrollAppHook(lpparam);
- }
- });
- }
-
- private void handleLoadLauncher(final LoadPackageParam lpparam) {
- boolean closeOnLaunch = false;
- if (mPrefs.getInt("launcher_swipedown_action", 1) != 1 ||
- mPrefs.getInt("launcher_swipeup_action", 1) != 1 ||
- mPrefs.getInt("launcher_swipedown2_action", 1) != 1 ||
- mPrefs.getInt("launcher_swipeup2_action", 1) != 1) Launcher.HomescreenSwipesHook(lpparam);
- if (mPrefs.getInt("launcher_swipeleft_action", 1) != 1 ||
- mPrefs.getInt("launcher_swiperight_action", 1) != 1) Launcher.HotSeatSwipesHook(lpparam);
- if (mPrefs.getInt("launcher_shake_action", 1) != 1) Launcher.ShakeHook(lpparam);
- if (mPrefs.getInt("launcher_doubletap_action", 1) != 1) Launcher.LauncherDoubleTapHook(lpparam);
- if (mPrefs.getInt("launcher_pinch_action", 1) != 1) Launcher.LauncherPinchHook(lpparam);
- if (mPrefs.getInt("launcher_folder_cols", 1) > 1) Launcher.FolderColumnsHook(lpparam);
- if (mPrefs.getInt("launcher_iconscale", 45) > 45) Launcher.IconScaleHook(lpparam);
- if (mPrefs.getInt("launcher_titlefontsize", 5) > 5) Launcher.TitleFontSizeHook(lpparam);
- if (mPrefs.getInt("launcher_titletopmargin", 0) > 0) Launcher.TitleTopMarginHook(lpparam);
- if (mPrefs.getInt("system_statusbarheight", 19) > 19) Launcher.StatusBarHeightHook(lpparam);
- if (mPrefs.getBoolean("launcher_noclockhide")) Launcher.NoClockHideHook(lpparam);
- if (mPrefs.getBoolean("launcher_renameapps")) Launcher.RenameShortcutsHook(lpparam);
- if (mPrefs.getBoolean("launcher_darkershadow")) Launcher.TitleShadowHook(lpparam);
- if (mPrefs.getBoolean("controls_nonavbar")) Launcher.HideNavBarHook(lpparam);
- if (mPrefs.getBoolean("launcher_infinitescroll")) Launcher.InfiniteScrollHook(lpparam);
- if (mPrefs.getBoolean("launcher_hidetitles")) Launcher.HideTitlesHook(lpparam);
- if (mPrefs.getBoolean("launcher_fixlaunch")) Launcher.FixAppInfoLaunchHook(lpparam);
- if (mPrefs.getBoolean("launcher_nowidgetonly")) Launcher.NoWidgetOnlyHook(lpparam);
- if (mPrefs.getBoolean("launcher_sensorportrait")) Launcher.ReverseLauncherPortraitHook(lpparam);
- if (mPrefs.getBoolean("launcher_unlockhotseat")) Launcher.MaxHotseatIconsCountHook(lpparam);
- if (mPrefs.getStringAsInt("launcher_foldershade", 1) > 1) Launcher.FolderShadeHook(lpparam);
- if (mPrefs.getStringAsInt("launcher_closefolders", 1) > 1) { Launcher.CloseFolderOnLaunchHook(lpparam); closeOnLaunch = true; }
- if (lpparam.packageName.equals("com.miui.home")) {
- if (mPrefs.getInt("system_recents_blur", 100) < 100) Launcher.RecentsBlurRatioHook(lpparam);
- if (mPrefs.getInt("system_recommended_first_action", 1) > 1 ||
- mPrefs.getInt("system_recommended_second_action", 1) > 1 ||
- mPrefs.getInt("system_recommended_third_action", 1) > 1 ||
- mPrefs.getInt("system_recommended_fourth_action", 1) > 1) System.CustomRecommendedHook(lpparam, true);
- if (mPrefs.getInt("controls_fsg_coverage", 60) != 60) Controls.BackGestureAreaHeightHook(lpparam, false);
- if (mPrefs.getInt("controls_fsg_width", 100) > 100) Controls.BackGestureAreaWidthHook(lpparam, false);
- if (mPrefs.getBoolean("controls_fsg_horiz")) Launcher.FSGesturesHook(lpparam);
- if (mPrefs.getBoolean("system_removecleaner")) System.HideMemoryCleanHook(lpparam, true);
- if (mPrefs.getBoolean("system_fw_sticky")) System.StickyFloatingWindowsLauncherHook(lpparam);
- if (mPrefs.getBoolean("system_fw_splitscreen")) System.MultiWindowPlusHook(lpparam);
- //if (mPrefs.getBoolean("launcher_fixstatusbarmode")) Launcher.FixStatusBarModeHook(lpparam);
- if (mPrefs.getBoolean("launcher_fixanim")) Launcher.FixAnimHook(lpparam);
- if (mPrefs.getBoolean("launcher_hideseekpoints")) Launcher.HideSeekPointsHook(lpparam);
- if (mPrefs.getBoolean("launcher_privacyapps_gest") ||
- mPrefs.getInt("launcher_spread_action", 1) != 1) Launcher.PrivacyFolderHook(lpparam);
- if (!mPrefs.getBoolean("launcher_googleminus") && mPrefs.getBoolean("launcher_googlediscover")) Launcher.GoogleDiscoverHook(lpparam);
- if (mPrefs.getBoolean("launcher_docktitles") && mPrefs.getInt("launcher_bottommargin", 0) == 0) Launcher.ShowHotseatTitlesHook(lpparam);
- if (mPrefs.getBoolean("launcher_folderblur")) Launcher.FolderBlurHook(lpparam);
- if (mPrefs.getBoolean("launcher_nounlockanim")) Launcher.NoUnlockAnimationHook(lpparam);
- if (mPrefs.getBoolean("launcher_nozoomanim")) Launcher.NoZoomAnimationHook(lpparam);
- if (mPrefs.getBoolean("launcher_oldlaunchanim")) Launcher.UseOldLaunchAnimationHook(lpparam);
- if (mPrefs.getBoolean("launcher_unlockgrids")) Launcher.UnlockGridsHook(lpparam);
- if (mPrefs.getBoolean("launcher_closedrawer")) { Launcher.CloseDrawerOnLaunchHook(lpparam); closeOnLaunch = true; }
- if (mPrefs.getInt("launcher_bottommargin", 0) > 0) Launcher.BottomSpacingHook(lpparam);
- if (mPrefs.getInt("launcher_horizwidgetmargin", 0) > 0) Launcher.HorizontalWidgetSpacingHook(lpparam);
- }
- if (closeOnLaunch) Launcher.CloseFolderOrDrawerOnLaunchShortcutMenuHook(lpparam);
- //if (!mPrefs.getString("system_clock_app", "").equals("")) Launcher.ReplaceClockAppHook(lpparam);
- //if (!mPrefs.getString("system_calendar_app", "").equals("")) Launcher.ReplaceCalendarAppHook(lpparam);
- //Launcher.NoInternationalBuildHook(lpparam);
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/PreferenceFragmentBase.java b/app/src/main/java/name/mikanoshi/customiuizer/PreferenceFragmentBase.java
deleted file mode 100644
index e09b3d34..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/PreferenceFragmentBase.java
+++ /dev/null
@@ -1,533 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.animation.Animator;
-import android.animation.ValueAnimator;
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.Fragment;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.res.Configuration;
-import android.graphics.Color;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable;
-import android.graphics.drawable.LayerDrawable;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Environment;
-import android.preference.PreferenceManager;
-import android.text.SpannableString;
-import android.text.style.ForegroundColorSpan;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.miui.internal.widget.ActionBarView;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.lang.reflect.Field;
-import java.util.Map;
-import java.util.Set;
-
-import miui.app.ActionBar;
-import miui.app.AlertDialog;
-import miui.preference.PreferenceFragment;
-
-import name.mikanoshi.customiuizer.mods.GlobalActions;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class PreferenceFragmentBase extends PreferenceFragment {
-
- private Context actContext = null;
- public boolean isAnimating = false;
- public boolean supressMenu = false;
- public int animDur = 650;
-
- public boolean onCreateOptionsMenu(Menu menu) {
- if (supressMenu) return false;
- getMenuInflater().inflate(R.menu.menu_mods, menu);
- if (Helpers.isNightMode(getActivity()))
- for (int i = 0; i < menu.size(); i++) try {
- MenuItem item = menu.getItem(i);
- SpannableString spanString = new SpannableString(item.getTitle().toString());
- spanString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.preference_primary_text_color, getActivity().getTheme())), 0, spanString.length(), 0);
- item.setTitle(spanString);
- } catch (Throwable t) {}
- return true;
- }
-
- public void onPrepareOptionsMenu(Menu menu) {
- if (supressMenu) return;
- if (menu.size() == 0) return;
- menu.getItem(0).setVisible(false);
- if (getView() == null) return;
- ImageView alert = getView().findViewById(R.id.update_alert);
- if (alert != null && alert.isShown()) menu.getItem(0).setVisible(true);
- }
-
- public boolean onOptionsItemSelected(MenuItem item) {
- Activity act = getActivity();
- switch (item.getItemId()) {
- case android.R.id.home:
- if (this instanceof MainFragment)
- act.finish();
- else
- ((SubFragment)this).finish();
- return true;
- case R.id.get_update:
- try {
- Intent detailsIntent = new Intent("de.robv.android.xposed.installer.DOWNLOAD_DETAILS");
- detailsIntent.addCategory(Intent.CATEGORY_DEFAULT);
- detailsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- detailsIntent.setData(Uri.fromParts("package", Helpers.modulePkg, null));
- startActivity(detailsIntent);
- } catch (Throwable e) {
- Helpers.openURL(getActivity(), "https://code.highspec.ru/Mikanoshi/CustoMIUIzer/releases");
- }
- case R.id.xposedinstaller:
- return Helpers.openXposedApp(getValidContext());
- case R.id.backuprestore:
- showBackupRestoreDialog();
- return true;
- case R.id.softreboot:
- if (!Helpers.miuizerModuleActive) {
- showXposedDialog(getActivity());
- return true;
- }
-
- AlertDialog.Builder alert = new AlertDialog.Builder(getValidContext());
- alert.setTitle(R.string.soft_reboot);
- alert.setMessage(R.string.soft_reboot_ask);
- alert.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- getValidContext().sendBroadcast(new Intent(GlobalActions.ACTION_PREFIX + "FastReboot"));
- }
- });
- alert.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {}
- });
- alert.show();
- return true;
- case R.id.about:
- Bundle args = new Bundle();
- args.putInt("baseResId", R.layout.fragment_about);
- openSubFragment(new AboutFragment(), args, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.app_about, R.xml.prefs_about);
- return true;
- }
- return false;
- }
-
- public void showXposedDialog(Activity act) {
- try {
- AlertDialog.Builder builder = new AlertDialog.Builder(act);
- builder.setTitle(R.string.warning);
- builder.setMessage(R.string.module_not_active);
- builder.setCancelable(true);
- builder.setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton){}
- });
- AlertDialog dlg = builder.create();
- dlg.show();
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- public void showBackupRestoreDialog() {
- final Activity act = getActivity();
-
- AlertDialog.Builder alert = new AlertDialog.Builder(act);
- alert.setTitle(R.string.backup_restore);
- alert.setMessage(R.string.backup_restore_choose);
- alert.setPositiveButton(R.string.do_restore, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- restoreSettings(act);
- }
- });
- alert.setNegativeButton(R.string.do_backup, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- backupSettings(act);
- }
- });
- alert.show();
- }
-
- private void setupImmersiveMenu() {
- ActionBar actionBar = getActionBar();
- if (actionBar != null && Helpers.is12()) try { actionBar.setExpandState(ActionBar.STATE_COLLAPSE, false); } catch (Throwable ignore) {}
- if (supressMenu) return;
- setImmersionMenuEnabled(true);
- hideSplitActionBar();
-
- View view = getView();
- if (view != null)
- if (view.findViewById(R.id.update_alert) == null) {
- Button more = view.findViewById(getResources().getIdentifier("more", "id", "miui"));
- if (more == null) return;
- float density = getResources().getDisplayMetrics().density;
- FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
- lp.gravity = Gravity.END | Gravity.TOP;
- ImageView alert = new ImageView(getValidContext());
- alert.setImageResource(R.drawable.alert);
- alert.setAdjustViewBounds(true);
- alert.setMaxWidth(Math.round(16 * density));
- alert.setMaxHeight(Math.round(16 * density));
- alert.setLayoutParams(lp);
- alert.setId(R.id.update_alert);
- alert.setVisibility(View.GONE);
- ((ViewGroup)more.getParent()).addView(alert);
- }
- }
-
- void hideSplitActionBar() {
- try {
- getActionBar().showSplitActionBar(false, false);
- } catch (Throwable t) {
- hideSplitView();
- return;
- }
- if (Helpers.is125()) hideSplitView125();
- }
-
- void hideSplitView() {
- // Hide stupid auto split actionbar
- try {
- ActionBar actionBar = getActionBar();
- Field mSplitViewField = actionBar.getClass().getDeclaredField("mSplitView");
- mSplitViewField.setAccessible(true);
- View mSplitView = (View)mSplitViewField.get(actionBar);
- if (mSplitView != null) mSplitView.setVisibility(View.GONE);
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- void hideSplitView125() {
- try {
- ActionBar actionBar = getActionBar();
- Field mActionViewField = actionBar.getClass().getDeclaredField("mActionView");
- mActionViewField.setAccessible(true);
- ActionBarView mActionView = (ActionBarView)mActionViewField.get(actionBar);
- if (mActionView != null) mActionView.setSplitActionBar(true);
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- private void initFragment() {
- setHasOptionsMenu(true);
-
- boolean showBack = false;
- if (this instanceof MainFragment) {
- ActivityInfo appInfo;
- try {
- Activity act = getActivity();
- appInfo = act.getPackageManager().getActivityInfo(act.getComponentName(), PackageManager.GET_META_DATA);
- showBack = appInfo.metaData != null && appInfo.metaData.containsKey("from.settings");
- } catch (PackageManager.NameNotFoundException e) {
- e.printStackTrace();
- }
- } else showBack = !(this instanceof SnoozedFragment);
-
- ActionBar actionBar = getActionBar();
- actionBar.setTitle(R.string.app_name);
- actionBar.setDisplayHomeAsUpEnabled(showBack);
- actionBar.setBackgroundDrawable(new ColorDrawable(Helpers.getSystemBackgroundColor(getValidContext())));
- }
-
- @SuppressLint("WorldReadableFiles")
- public void onCreate(Bundle savedInstanceState, int pref_defaults) {
- super.onCreate(savedInstanceState);
- try {
- getPreferenceManager().setSharedPreferencesName(Helpers.prefsName);
- getPreferenceManager().setSharedPreferencesMode(Context.MODE_PRIVATE);
- getPreferenceManager().setStorageDeviceProtected();
- PreferenceManager.setDefaultValues(Helpers.getProtectedContext(getValidContext()), pref_defaults, false);
- } catch (Throwable throwable) {
- throwable.printStackTrace();
- }
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- initFragment();
- setupImmersiveMenu();
- }
-
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- setViewBackground(view);
- }
-
- public void setViewBackground(View view) {
- boolean isNight = Helpers.isNightMode(getValidContext());
- int bgResId = getResources().getIdentifier(isNight ? "settings_window_bg_dark" : "settings_window_bg_light", "drawable", "miui");
- if (bgResId != 0)
- view.setBackgroundResource(bgResId);
- else if (Helpers.is11())
- view.setBackgroundColor(Helpers.getSystemBackgroundColor(getValidContext()));
- else
- view.setBackgroundColor(isNight ? Color.BLACK : Color.rgb(247, 247, 247));
- }
-
- public void setActionModeStyle(View searchView) {
- boolean isNight = Helpers.isNightMode(getValidContext());
- if (searchView != null) try {
- searchView.setSaveFromParentEnabled(false);
- Drawable drawable = getResources().getDrawable(getResources().getIdentifier(isNight ? "search_mode_bg_dark" : "search_mode_bg_light", "drawable", "miui"), getValidContext().getTheme());
- try {
- int colorResId = getResources().getIdentifier(isNight ? "primary_color_dark" : "primary_color_light", "color", "miui");
- if (colorResId != 0 && drawable instanceof LayerDrawable) {
- drawable = ((LayerDrawable)drawable).getDrawable(0);
- if (drawable instanceof GradientDrawable)
- ((GradientDrawable)drawable).setColor(getResources().getColor(colorResId, getValidContext().getTheme()));
- }
- } catch (Throwable ignore) {}
- searchView.setBackground(drawable);
- LinearLayout inputArea = searchView.findViewById(android.R.id.inputArea);
- inputArea.setBackgroundResource(getResources().getIdentifier(isNight ? "search_mode_edit_text_bg_dark" : "search_mode_edit_text_bg_light", "drawable", "miui"));
- if (Helpers.is11()) {
- ViewGroup.LayoutParams lp1 = searchView.getLayoutParams();
- int resId = getResources().getIdentifier("action_bar_default_height", "dimen", "miui");
- lp1.height = getResources().getDimensionPixelSize(resId == 0 ? R.dimen.secondary_text_size : resId);
- searchView.setLayoutParams(lp1);
- FrameLayout.LayoutParams lp2 = (FrameLayout.LayoutParams)inputArea.getLayoutParams();
- resId = getResources().getIdentifier("searchbar_bg_height", "dimen", "miui");
- lp2.height = getResources().getDimensionPixelSize(resId == 0 ? R.dimen.searchbar_bg_height : resId);
- inputArea.setLayoutParams(lp2);
- }
- ImageView inputIcon = searchView.findViewById(R.id.inputIcon);
- inputIcon.setImageResource(getResources().getIdentifier(isNight ? "edit_text_search_dark" : "edit_text_search", "drawable", "miui"));
- TextView input = searchView.findViewById(android.R.id.input);
- int fontSize = getResources().getIdentifier(Helpers.is11() ? "edit_text_font_size" : "secondary_text_size", "dimen", "miui");
- input.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(fontSize == 0 ? R.dimen.secondary_text_size : fontSize));
- input.setHintTextColor(getResources().getColor(getResources().getIdentifier(isNight ? "edit_text_search_hint_color_dark" : "edit_text_search_hint_color_light", "color", "miui"), getValidContext().getTheme()));
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- public void openSubFragment(Fragment fragment, Bundle args, Helpers.SettingsType settingsType, Helpers.ActionBarType abType, int titleResId, int contentResId) {
- if (args == null) args = new Bundle();
- args.putInt("settingsType", settingsType.ordinal());
- args.putInt("abType", abType.ordinal());
- args.putInt("titleResId", titleResId);
- args.putInt("contentResId", contentResId);
- float order = 100.0f;
- try {
- if (getView() != null) order = getView().getTranslationZ();
- } catch (Throwable t) {}
- args.putFloat("order", order);
- if (fragment.getArguments() == null) {
- fragment.setArguments(args);
- } else {
- fragment.getArguments().clear();
- fragment.getArguments().putAll(args);
- }
- getFragmentManager().beginTransaction().setCustomAnimations(R.animator.fragment_open_enter, R.animator.fragment_open_exit, R.animator.fragment_close_enter, R.animator.fragment_close_exit)
- .replace(R.id.fragment_container, fragment).addToBackStack(null).commitAllowingStateLoss();
- getFragmentManager().executePendingTransactions();
- }
-
- @Override
- public Animator onCreateAnimator(int transit, boolean enter, final int nextAnim) {
- if (nextAnim == 0) return null;
- Configuration config = getResources().getConfiguration();
- float density = getResources().getDisplayMetrics().density;
- final float scrWidth = config.screenWidthDp * density;
-
- final View top = getView();
- if (top == null) return null;
- final View content = top.findViewById(android.R.id.content);
-
- //ValueAnimator.setFrameDelay(17);
- ValueAnimator valAnimator = new ValueAnimator();
- valAnimator.setDuration(animDur);
- valAnimator.setFloatValues(0.0f, 1.0f);
- valAnimator.setInterpolator(new DecelerateInterpolator(2.5f));
-
- if (nextAnim == R.animator.fragment_open_enter || nextAnim == R.animator.fragment_open_exit)
- valAnimator.addListener(new Animator.AnimatorListener() {
- @Override
- public void onAnimationStart(Animator animation) {
-// Log.e("animation", "start on: " + PreferenceFragmentBase.this.getClass().getCanonicalName());
- isAnimating = true;
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
-// Log.e("animation", "end on: " + PreferenceFragmentBase.this.getClass().getCanonicalName());
- isAnimating = false;
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {}
-
- @Override
- public void onAnimationRepeat(Animator animation) {}
- }); else isAnimating = false;
-
- boolean is11 = Helpers.is11();
- valAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- if (content == null) return;
- float val = (float)animation.getAnimatedValue();
- if (nextAnim == R.animator.fragment_open_enter) {
- top.setX(scrWidth * (1.0f - val));
- content.setAlpha(is11 ? val * 1.0f : 0.6f + val * 0.4f);
- } else if (nextAnim == R.animator.fragment_open_exit) {
- top.setX(-scrWidth / 4.0f * val);
- top.setAlpha(1.0f - val * 0.4f);
- } else if (nextAnim == R.animator.fragment_close_enter) {
- top.setX(-scrWidth / 4.0f * (1.0f - val));
- top.setAlpha(0.6f + val * 0.4f);
- } else if (nextAnim == R.animator.fragment_close_exit) {
- top.setX(scrWidth * val);
- content.setAlpha(1.0f - val * 0.4f);
- }
- }
- });
-
- return valAnimator;
- }
-
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- this.actContext = context;
- }
-
- @Override
- public void onDetach() {
- super.onDetach();
- this.actContext = null;
- }
-
- @Override
- public void onResume() {
- super.onResume();
- setupImmersiveMenu();
- }
-
- public Context getValidContext() {
- if (actContext != null) return actContext;
- return getActivity() == null ? getContext() : getActivity().getApplicationContext();
- }
-
- public void backupSettings(Activity act) {
- String backupPath = Environment.getExternalStorageDirectory().getAbsolutePath() + Helpers.externalFolder;
- if (!Helpers.preparePathForBackup(act, backupPath)) return;
- ObjectOutputStream output = null;
- try {
- output = new ObjectOutputStream(new FileOutputStream(backupPath + Helpers.backupFile));
- output.writeObject(Helpers.prefs.getAll());
-
- AlertDialog.Builder alert = new AlertDialog.Builder(act);
- alert.setTitle(R.string.do_backup);
- alert.setMessage(R.string.backup_ok);
- alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {}
- });
- alert.show();
- } catch (Throwable e) {
- e.printStackTrace();
- AlertDialog.Builder alert = new AlertDialog.Builder(act);
- alert.setTitle(R.string.warning);
- alert.setMessage(getString(R.string.storage_cannot_backup) + "\n" + e.getMessage());
- alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {}
- });
- alert.show();
- } finally {
- try {
- if (output != null) {
- output.flush();
- output.close();
- }
- } catch (Throwable ex) {
- ex.printStackTrace();
- }
- }
- }
-
- @SuppressWarnings("unchecked")
- public void restoreSettings(final Activity act) {
- if (!Helpers.checkStoragePerm(act, Helpers.REQUEST_PERMISSIONS_RESTORE)) return;
- if (!Helpers.checkStorageReadable(act)) return;
- ObjectInputStream input = null;
- try {
- input = new ObjectInputStream(new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + Helpers.externalFolder + Helpers.backupFile));
- Map entries = (Map)input.readObject();
- if (entries == null || entries.isEmpty()) throw new RuntimeException("Cannot read entries");
-
- SharedPreferences.Editor prefEdit = Helpers.prefs.edit();
- prefEdit.clear();
- for (Map.Entry entry: entries.entrySet()) {
- Object val = entry.getValue();
- String key = entry.getKey();
-
- if (val instanceof Boolean)
- prefEdit.putBoolean(key, (Boolean)val);
- else if (val instanceof Float)
- prefEdit.putFloat(key, (Float)val);
- else if (val instanceof Integer)
- prefEdit.putInt(key, (Integer)val);
- else if (val instanceof Long)
- prefEdit.putLong(key, (Long)val);
- else if (val instanceof String)
- prefEdit.putString(key, ((String)val));
- else if (val instanceof Set>)
- prefEdit.putStringSet(key, ((Set)val));
- }
- prefEdit.putBoolean("miuizer_prefs_migrated", true).putInt("miuizer_prefs_migration_result", -1);
- prefEdit.apply();
-
- AlertDialog.Builder alert = new AlertDialog.Builder(act);
- alert.setTitle(R.string.do_restore);
- alert.setMessage(R.string.restore_ok);
- alert.setCancelable(false);
- alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- act.finish();
- act.startActivity(act.getIntent());
- }
- });
- alert.show();
- } catch (Throwable t) {
- t.printStackTrace();
- AlertDialog.Builder alert = new AlertDialog.Builder(act);
- alert.setTitle(R.string.warning);
- alert.setMessage(R.string.storage_cannot_restore);
- alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {}
- });
- alert.show();
- } finally {
- try {
- if (input != null) input.close();
- } catch (Throwable ex) {
- ex.printStackTrace();
- }
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/SharedPrefsProvider.java b/app/src/main/java/name/mikanoshi/customiuizer/SharedPrefsProvider.java
deleted file mode 100644
index ca5021e6..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/SharedPrefsProvider.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.content.ContentProvider;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.UriMatcher;
-import android.content.res.AssetFileDescriptor;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.net.Uri;
-import android.os.ParcelFileDescriptor;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class SharedPrefsProvider extends ContentProvider {
-
- public static final String AUTHORITY = "name.mikanoshi.customiuizer.provider.sharedprefs";
- private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-
- SharedPreferences prefs;
-
- static {
- uriMatcher.addURI(AUTHORITY, "string/*/", 0);
- uriMatcher.addURI(AUTHORITY, "string/*/*", 1);
- uriMatcher.addURI(AUTHORITY, "integer/*/*", 2);
- uriMatcher.addURI(AUTHORITY, "boolean/*/*", 3);
- uriMatcher.addURI(AUTHORITY, "stringset/*", 4);
- uriMatcher.addURI(AUTHORITY, "test/*", 5);
- uriMatcher.addURI(AUTHORITY, "shortcut_icon/*", 6);
- }
-
- @Override
- public boolean onCreate() {
- try {
- prefs = Helpers.getSharedPrefs(getContext(), true);
- return true;
- } catch (Throwable throwable) {
- return false;
- }
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
- List parts = uri.getPathSegments();
- //Log.e("parts", String.valueOf(parts));
- MatrixCursor cursor = new MatrixCursor(new String[]{"data"});
-
- switch (uriMatcher.match(uri)) {
- case 0: {
- cursor.newRow().add("data", prefs.getString(parts.get(1), ""));
- return cursor;
- }
- case 1: {
- cursor.newRow().add("data", prefs.getString(parts.get(1), parts.get(2)));
- return cursor;
- }
- case 2: {
- cursor.newRow().add("data", prefs.getInt(parts.get(1), Integer.parseInt(parts.get(2))));
- return cursor;
- }
- case 3: {
- cursor.newRow().add("data", prefs.getBoolean(parts.get(1), Integer.parseInt(parts.get(2)) == 1) ? 1 : 0);
- return cursor;
- }
- case 4: {
- Set strings = prefs.getStringSet(parts.get(1), new LinkedHashSet());
- if (strings != null)
- for (String str: strings) cursor.newRow().add("data", str);
- return cursor;
- }
- }
- return null;
- }
-
- @Override
- public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {
- if (getContext() == null) return null;
-
- List parts = uri.getPathSegments();
- if (uriMatcher.match(uri) == 5) {
- String filename = null;
- if ("0".equals(parts.get(1))) filename = "test0.png";
- else if ("1".equals(parts.get(1))) filename = "test1.mp3";
- else if ("2".equals(parts.get(1))) filename = "test2.mp4";
- else if ("3".equals(parts.get(1)) || "5".equals(parts.get(1))) filename = "test3.txt";
- else if ("4".equals(parts.get(1))) filename = "test4.zip";
-
- AssetFileDescriptor afd = null;
- if (filename != null) try {
- afd = getContext().getAssets().openFd(filename);
- } catch (Throwable t) {
- t.printStackTrace();
- }
- return afd;
- } else if (uriMatcher.match(uri) == 6) {
- Context context = Helpers.getProtectedContext(getContext());
- File file = new File(context.getFilesDir() + "/shortcuts/" + parts.get(1) + "_shortcut.png");
- if (!file.exists()) return null;
- return new AssetFileDescriptor(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY), 0, AssetFileDescriptor.UNKNOWN_LENGTH);
- }
-
- return null;
- }
-
- @Override
- public String getType(Uri uri) {
- return null;
- }
-
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- return null;
- }
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- return 0;
- }
-
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- return 0;
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/SnoozedActivity.java b/app/src/main/java/name/mikanoshi/customiuizer/SnoozedActivity.java
deleted file mode 100644
index 2e04d6ee..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/SnoozedActivity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.app.Activity;
-import android.content.Context;
-import android.os.Bundle;
-import android.widget.Toast;
-
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class SnoozedActivity extends Activity {
-
- @Override
- protected void attachBaseContext(Context base) {
- try {
- super.attachBaseContext(Helpers.getLocaleContext(base));
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- boolean mSDKFound = ((MainApplication)getApplication()).mStarted;
- if (mSDKFound) Helpers.setMiuiTheme(this, R.style.MIUIPrefs);
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_snoozed);
-
- if (!mSDKFound) {
- Toast.makeText(this, R.string.sdk_failed, Toast.LENGTH_LONG).show();
- finish();
- return;
- }
-
- getFragmentManager().beginTransaction().replace(R.id.fragment_container, new SnoozedFragment()).commit();
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/SnoozedFragment.java b/app/src/main/java/name/mikanoshi/customiuizer/SnoozedFragment.java
deleted file mode 100644
index 3bcc053e..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/SnoozedFragment.java
+++ /dev/null
@@ -1,252 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.os.Handler;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import miui.app.ActionBar;
-import miui.app.AlertDialog;
-import miui.util.AttributeResolver;
-import miui.widget.ProgressBar;
-
-import name.mikanoshi.customiuizer.mods.GlobalActions;
-import name.mikanoshi.customiuizer.utils.SnoozeData;
-import name.mikanoshi.customiuizer.utils.SnoozedAdapter;
-
-public class SnoozedFragment extends PreferenceFragmentBase {
-
- boolean loading = false;
- ListView listView = null;
- ProgressBar loader = null;
- TextView empty = null;
- static public ArrayList snoozedList = new ArrayList();
- Handler handler = null;
- Runnable fetchFailed = new Runnable() {
- @Override
- public void run() {
- finishLoading();
- Context context = getContext();
- if (context != null)
- Toast.makeText(context, R.string.snooze_fetch_fail, Toast.LENGTH_LONG).show();
- }
- };
-
- BroadcastReceiver updateReceiver = new BroadcastReceiver() {
- @Override
- @SuppressWarnings("ConstantConditions")
- public void onReceive(Context context, Intent intent) {
- handler.removeCallbacks(fetchFailed);
- HashMap> tmpList = new HashMap>();
- Bundle extras = intent.getExtras();
- if (extras != null && extras.size() > 0)
- for (String key: extras.keySet()) {
- Bundle bundle = extras.getBundle(key);
- if (bundle != null) {
- SnoozeData data = new SnoozeData();
- data.key = key;
- data.user = bundle.getInt("user");
- data.pkg = bundle.getString("package");
- data.canceled = bundle.getBoolean("canceled");
- data.created = bundle.getLong("created");
- data.updated = bundle.getLong("updated");
- data.reposted = bundle.getLong("reposted");
- data.channel = bundle.getString("channel", "");
- data.color = bundle.getInt("color");
- data.title = bundle.getString("title", "");
- data.text = bundle.getString("text", "");
- data.messages = bundle.getInt("messages", 0);
- data.icon = bundle.getParcelable("icon");
- if (!tmpList.containsKey(data.pkg)) tmpList.put(data.pkg, new ArrayList());
- tmpList.get(data.pkg).add(data);
- }
- }
- for (String pkg: tmpList.keySet()) {
- SnoozeData header = new SnoozeData();
- header.pkg = pkg;
- header.header = true;
- snoozedList.add(header);
- snoozedList.addAll(tmpList.get(pkg));
- }
- finishLoading();
- }
- };
-
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- handler = new Handler(getContext().getMainLooper());
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- supressMenu = true;
- super.onActivityCreated(savedInstanceState);
- ActionBar actionBar = getActionBar();
- if (actionBar != null) try {
- actionBar.setTitle(R.string.title_snoozed);
- actionBar.showSplitActionBar(true, true);
- } catch (Throwable ignore) {}
- setImmersionMenuEnabled(false);
-
- if (getView() == null) return;
-
- listView = getView().findViewById(android.R.id.list);
- listView.setAdapter(new SnoozedAdapter(getContext()));
- listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView> parent, View view, final int position, long id) {
- final SnoozeData data = snoozedList.get(position);
- AlertDialog.Builder dialog = new AlertDialog.Builder(getContext());
- dialog.setItems(R.array.snoozedactions, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- switch (which) {
- case 0: unsnooze(data); break;
- case 1:
- setCanceled(data, true);
- snoozedList.get(position).canceled = true;
- updateListView();
- break;
- case 2:
- setCanceled(data, false);
- snoozedList.get(position).canceled = false;
- updateListView();
- break;
- }
- }
- });
- AlertDialog alert = dialog.create();
- alert.show();
-
- final int listResID = getResources().getIdentifier("select_dialog_listview", "id", "miui");
- final ListView listView = alert.findViewById(listResID);
- if (listView == null) return;
- listView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
- @Override
- public void onChildViewAdded(View parent, View child) {
- if (child == null) return;
- try {
- int index = ((ViewGroup)parent).indexOfChild(child);
- if ((index == 1 && data.canceled) || (index == 2 && !data.canceled)) child.setEnabled(false);
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- @Override
- public void onChildViewRemoved(View parent, View child) {}
- });
- }
- });
-
- loader = getView().findViewById(R.id.am_progressBar);
- empty = getView().findViewById(android.R.id.empty);
- }
-
- public View onInflateView(LayoutInflater inflater, ViewGroup group, Bundle bundle) {
- return inflater.inflate(R.layout.fragment_snoozed, group, false);
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuItem update = menu.add(R.string.menu_update);
- update.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
- update.setIcon(AttributeResolver.resolveDrawable(getContext(), getResources().getIdentifier("actionBarRefreshIcon", "attr", "miui")));
- update.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- fetchSnoozed();
- return true;
- }
- });
- return true;
- }
-
- @Override
- public void onPrepareOptionsMenu(Menu menu) {
- if (menu != null && menu.size() > 0)
- menu.getItem(0).setEnabled(!loading);
- }
-
- @Override
- public void onPause() {
- getContext().unregisterReceiver(updateReceiver);
- super.onPause();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- getContext().registerReceiver(updateReceiver, new IntentFilter(GlobalActions.EVENT_PREFIX + "UpdateSnoozedNotifications"));
- fetchSnoozed();
- }
-
- private void fetchSnoozed() {
- View root = getView();
- if (root == null) return;
- startLoading();
- root.postDelayed(new Runnable() {
- @Override
- public void run() {
- getContext().sendBroadcast(new Intent(GlobalActions.ACTION_PREFIX + "GetSnoozedNotifications"));
- }
- }, 300);
- handler.removeCallbacks(fetchFailed);
- handler.postDelayed(fetchFailed, 5000);
- }
-
- private void unsnooze(SnoozeData data) {
- startLoading();
- Intent intent = new Intent(GlobalActions.ACTION_PREFIX + "UnsnoozeNotification");
- intent.putExtra("key", data.key);
- intent.putExtra("user", data.user);
- getContext().sendBroadcast(intent);
- }
-
- private void setCanceled(SnoozeData data, boolean isCancaled) {
- Intent intent = new Intent(GlobalActions.ACTION_PREFIX + "CancelNotification");
- intent.putExtra("key", data.key);
- intent.putExtra("user", data.user);
- intent.putExtra("package", data.pkg);
- intent.putExtra("canceled", isCancaled);
- getContext().sendBroadcast(intent);
- }
-
- private void updateListView() {
- if (listView != null) ((SnoozedAdapter)listView.getAdapter()).notifyDataSetChanged();
- }
-
- private void startLoading() {
- if (loading) return;
- loading = true;
- invalidateOptionsMenu();
- snoozedList.clear();
- updateListView();
- if (loader != null) loader.setVisibility(View.VISIBLE);
- if (empty != null) empty.setVisibility(View.GONE);
- }
-
- private void finishLoading() {
- loading = false;
- invalidateOptionsMenu();
- updateListView();
- if (loader != null) loader.setVisibility(View.GONE);
- if (empty != null) empty.setVisibility(snoozedList.size() == 0 ? View.VISIBLE : View.GONE);
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/SubFragment.java b/app/src/main/java/name/mikanoshi/customiuizer/SubFragment.java
deleted file mode 100644
index f9bc0651..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/SubFragment.java
+++ /dev/null
@@ -1,453 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceScreen;
-import android.provider.Settings;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AbsListView;
-import android.widget.FrameLayout;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-
-import miui.app.ActionBar;
-import miui.widget.ClearableEditText;
-import name.mikanoshi.customiuizer.prefs.PreferenceCategoryEx;
-import name.mikanoshi.customiuizer.prefs.PreferenceState;
-import name.mikanoshi.customiuizer.prefs.SpinnerEx;
-import name.mikanoshi.customiuizer.prefs.SpinnerExFake;
-import name.mikanoshi.customiuizer.subs.AppSelector;
-import name.mikanoshi.customiuizer.subs.ColorSelector;
-import name.mikanoshi.customiuizer.subs.MultiAction;
-import name.mikanoshi.customiuizer.subs.SortableList;
-import name.mikanoshi.customiuizer.utils.ColorCircle;
-import name.mikanoshi.customiuizer.utils.Helpers;
-import name.mikanoshi.customiuizer.utils.ModData;
-
-public class SubFragment extends PreferenceFragmentBase {
-
- private int baseResId = 0;
- private int resId = 0;
- public int titleId = 0;
- private float order = 100.0f;
- private String highlight = null;
- public boolean padded = true;
- Helpers.SettingsType settingsType = Helpers.SettingsType.Preference;
- Helpers.ActionBarType abType = Helpers.ActionBarType.Edit;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- settingsType = Helpers.SettingsType.values()[getArguments().getInt("settingsType")];
- abType = Helpers.ActionBarType.values()[getArguments().getInt("abType")];
- baseResId = getArguments().getInt("baseResId");
- resId = getArguments().getInt("contentResId");
- titleId = getArguments().getInt("titleResId");
- order = getArguments().getFloat("order") + 10.0f;
- highlight = getArguments().getString("mod");
-
- if (resId == 0) {
- getActivity().finish();
- return;
- }
-
- if (settingsType == Helpers.SettingsType.Preference) {
- super.onCreate(savedInstanceState, resId);
- addPreferencesFromResource(resId);
- } else {
- super.onCreate(savedInstanceState);
- }
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- supressMenu = supressMenu || abType == Helpers.ActionBarType.Edit;
- super.onActivityCreated(savedInstanceState);
- loadSharedPrefs();
-
- ActionBar actionBar = getActionBar();
- if (actionBar != null)
- if (abType == Helpers.ActionBarType.Edit) {
- actionBar.setCustomView(getResources().getIdentifier("edit_mode_title", "layout", "miui"));
- actionBar.setDisplayShowCustomEnabled(true);
-
- View customView = actionBar.getCustomView();
- ((TextView)customView.findViewById(android.R.id.title)).setText(titleId);
-
- TextView cancelBtn = customView.findViewById(android.R.id.button1);
- int cancelResId = getResources().getIdentifier(Helpers.isNightMode(getValidContext()) ? "action_mode_title_button_cancel_dark" : "action_mode_title_button_cancel_light", "drawable", "miui");
- if (cancelResId == 0) cancelResId = getResources().getIdentifier(Helpers.isNightMode(getValidContext()) ? "action_mode_immersion_close_dark" : "action_mode_immersion_close_light", "drawable", "miui");
- cancelBtn.setBackgroundResource(cancelResId);
- cancelBtn.setText(null);
- cancelBtn.setContentDescription(getText(android.R.string.cancel));
- cancelBtn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- finish();
- }
- });
- TextView applyBtn = customView.findViewById(android.R.id.button2);
- int applyResId = getResources().getIdentifier(Helpers.isNightMode(getValidContext()) ? "action_mode_title_button_confirm_dark" : "action_mode_title_button_confirm_light", "drawable", "miui");
- if (applyResId == 0) applyResId = getResources().getIdentifier(Helpers.isNightMode(getValidContext()) ? "action_mode_immersion_done_dark" : "action_mode_immersion_done_light", "drawable", "miui");
- applyBtn.setBackgroundResource(applyResId);
- applyBtn.setText(null);
- applyBtn.setContentDescription(getText(android.R.string.ok));
- applyBtn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- saveSharedPrefs();
- finish();
- }
- });
- } else {
- actionBar.setTitle(titleId);
- }
-
- if (Helpers.showNewMods)
- for (String mod: Helpers.newMods) {
- Preference pref = findPreference(mod);
- if (pref != null) ((PreferenceState)pref).markAsNew();
- }
-
- if (highlight != null && getView() != null && savedInstanceState == null) try {
- ListView listView = getView().findViewById(android.R.id.list);
- int order = 0;
- for (ModData mod: Helpers.allModsList)
- if (mod.key.equals(highlight)) {
- order = mod.order;
- break;
- }
- highlight = null;
- listView.clearFocus();
- int fOrder = order;
- listView.postDelayed(new Runnable() {
- @Override
- public void run() {
- listView.setOnScrollListener(new AbsListView.OnScrollListener() {
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {}
-
- @Override
- public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
- int first = view.getFirstVisiblePosition();
- int last = view.getLastVisiblePosition();
- if (fOrder >= first && fOrder <= last) {
- view.setOnScrollListener(null);
- View item = view.getChildAt(fOrder - first);
- if (item == null) return;
- TextView title = item.findViewById(android.R.id.title);
- if (title != null) Helpers.applyShimmer(title);
- }
- }
- });
- listView.smoothScrollToPositionFromTop(fOrder, getResources().getDisplayMetrics().heightPixels / 3);
- }
- }, Math.round(animDur * Settings.Global.getFloat(getValidContext().getContentResolver(), Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f)));
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- public View onInflateView(LayoutInflater inflater, ViewGroup group, Bundle bundle) {
- if (settingsType == Helpers.SettingsType.Preference)
- return baseResId != 0 ? inflater.inflate(baseResId, group, false) : super.onInflateView(inflater, group, bundle);
-
- View view = inflater.inflate(padded ? R.layout.prefs_common_padded : R.layout.prefs_common, group, false);
- inflater.inflate(resId, (FrameLayout)view);
- return view;
- }
-
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- view.setTranslationZ(order);
- }
-
- public void saveSharedPrefs() {
- if (getView() == null) Log.e("miuizer", "View not yet ready!");
- ArrayList nViews = Helpers.getChildViewsRecursive(getView().findViewById(R.id.container), false);
- for (View nView : nViews)
- if (nView != null) try {
- if (nView.getTag() != null)
- if (nView instanceof TextView)
- Helpers.prefs.edit().putString((String)nView.getTag(), ((TextView)nView).getText().toString()).apply();
- else if (nView instanceof SpinnerExFake) {
- Helpers.prefs.edit().putString((String)nView.getTag(), ((SpinnerExFake)nView).getValue()).apply();
- ((SpinnerExFake)nView).applyOthers();
- } else if (nView instanceof SpinnerEx)
- Helpers.prefs.edit().putInt((String)nView.getTag(), ((SpinnerEx)nView).getSelectedArrayValue()).apply();
- else if (nView instanceof ColorCircle)
- Helpers.prefs.edit().putInt((String)nView.getTag(), ((ColorCircle)nView).getColor()).apply();
- } catch (Throwable e) {
- Log.e("miuizer", "Cannot save sub preference!");
- }
- }
-
- public void loadSharedPrefs() {
- if (getView() == null) Log.e("miuizer", "View not yet ready!");
- ArrayList nViews = Helpers.getChildViewsRecursive(getView().findViewById(R.id.container), false);
- for (View nView: nViews)
- if (nView != null) try {
- if (nView.getTag() != null)
- if (nView instanceof TextView) {
- ((TextView)nView).setText(Helpers.prefs.getString((String)nView.getTag(), ""));
- if (nView instanceof ClearableEditText) nView.setBackgroundResource(getResources().getIdentifier(Helpers.isNightMode(getValidContext()) ? "edit_text_bg_dark" : "edit_text_bg_light", "drawable", "miui"));
- }
- } catch (Throwable e) {
- Log.e("miuizer", "Cannot load sub preference!");
- }
- }
-
- public Preference.OnPreferenceClickListener openAppsEdit = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openApps(preference.getKey());
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openAppsBWEdit = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openAppsBW(preference.getKey());
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openShareEdit = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openShare(preference.getKey());
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openOpenWithEdit = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openOpenWith(preference.getKey());
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openLauncherActions = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openMultiAction(preference, MultiAction.Actions.LAUNCHER);
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openControlsActions = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openMultiAction(preference, MultiAction.Actions.CONTROLS);
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openNavbarActions = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openMultiAction(preference, MultiAction.Actions.NAVBAR);
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openRecentsActions = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openMultiAction(preference, MultiAction.Actions.RECENTS);
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openStatusbarActions = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openMultiAction(preference, MultiAction.Actions.STATUSBAR);
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openLockScreenActions = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openMultiAction(preference, MultiAction.Actions.LOCKSCREEN);
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openLaunchActions = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openMultiAction(preference, MultiAction.Actions.LAUNCH);
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openSortableList = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openSortableItemList(preference);
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openActivitiesList = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openActivitiesItemList(preference);
- return true;
- }
- };
-
- public Preference.OnPreferenceClickListener openColorSelector = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openColorSelector(preference);
- return true;
- }
- };
-
- void openApps(String key) {
- Bundle args = new Bundle();
- args.putString("key", key);
- args.putBoolean("multi", true);
- AppSelector appSelector = new AppSelector();
- appSelector.setTargetFragment(this, 0);
- openSubFragment(appSelector, args, Helpers.SettingsType.Edit, Helpers.ActionBarType.HomeUp, R.string.select_apps, R.layout.prefs_app_selector);
- }
-
- void openAppsBW(String key) {
- Bundle args = new Bundle();
- args.putString("key", key);
- args.putBoolean("multi", true);
- args.putBoolean("bw", true);
- AppSelector appSelector = new AppSelector();
- appSelector.setTargetFragment(this, 0);
- openSubFragment(appSelector, args, Helpers.SettingsType.Edit, Helpers.ActionBarType.HomeUp, R.string.select_apps, R.layout.prefs_app_selector);
- }
-
- void openShare(String key) {
- Bundle args = new Bundle();
- args.putString("key", key);
- args.putBoolean("multi", true);
- args.putBoolean("share", true);
- AppSelector appSelector = new AppSelector();
- appSelector.setTargetFragment(this, 0);
- openSubFragment(appSelector, args, Helpers.SettingsType.Edit, Helpers.ActionBarType.HomeUp, R.string.select_apps, R.layout.prefs_app_selector);
- }
-
- void openOpenWith(String key) {
- Bundle args = new Bundle();
- args.putString("key", key);
- args.putBoolean("multi", true);
- args.putBoolean("openwith", true);
- AppSelector appSelector = new AppSelector();
- appSelector.setTargetFragment(this, 0);
- openSubFragment(appSelector, args, Helpers.SettingsType.Edit, Helpers.ActionBarType.HomeUp, R.string.select_apps, R.layout.prefs_app_selector);
- }
-
- void openMultiAction(Preference pref, MultiAction.Actions actions) {
- Bundle args = new Bundle();
- args.putString("key", pref.getKey());
- args.putInt("actions", actions.ordinal());
- openSubFragment(new MultiAction(), args, Helpers.SettingsType.Edit, Helpers.ActionBarType.Edit, pref.getTitleRes(), R.layout.prefs_multiaction);
- }
-
- public void openStandaloneApp(Preference pref, Fragment targetFrag, int resultId) {
- Bundle args = new Bundle();
- args.putString("key", pref.getKey());
- args.putBoolean("standalone", true);
- AppSelector appSelector = new AppSelector();
- appSelector.setTargetFragment(targetFrag, resultId);
- openSubFragment(appSelector, args, Helpers.SettingsType.Edit, Helpers.ActionBarType.HomeUp, R.string.select_app, R.layout.prefs_app_selector);
- }
-
- public void openPrivacyAppEdit(Fragment targetFrag, int resultId) {
- Bundle args = new Bundle();
- args.putBoolean("privacy", true);
- AppSelector appSelector = new AppSelector();
- appSelector.setTargetFragment(targetFrag, resultId);
- openSubFragment(appSelector, args, Helpers.SettingsType.Edit, Helpers.ActionBarType.HomeUp, R.string.select_apps, R.layout.prefs_app_selector);
- }
-
- public void openLockedAppEdit(Fragment targetFrag, int resultId) {
- Bundle args = new Bundle();
- args.putBoolean("applock", true);
- AppSelector appSelector = new AppSelector();
- appSelector.setTargetFragment(targetFrag, resultId);
- openSubFragment(appSelector, args, Helpers.SettingsType.Edit, Helpers.ActionBarType.HomeUp, R.string.select_apps, R.layout.prefs_app_selector);
- }
-
- public void openLaunchableList(Preference pref, Fragment targetFrag, int resultId) {
- Bundle args = new Bundle();
- args.putString("key", pref.getKey());
- args.putBoolean("custom_titles", true);
- AppSelector appSelector = new AppSelector();
- appSelector.setTargetFragment(targetFrag, resultId);
- openSubFragment(appSelector, args, Helpers.SettingsType.Edit, Helpers.ActionBarType.HomeUp, R.string.launcher_renameapps_list_title, R.layout.prefs_app_selector);
- }
-
- public void openColorSelector(Preference pref) {
- Bundle args = new Bundle();
- args.putString("key", pref.getKey());
- openSubFragment(new ColorSelector(), args, Helpers.SettingsType.Edit, Helpers.ActionBarType.Edit, pref.getTitleRes(), R.layout.fragment_selectcolor);
- }
-
- public void openSortableItemList(Preference pref) {
- Bundle args = new Bundle();
- args.putString("key", pref.getKey());
- args.putInt("titleResId", pref.getTitleRes());
- openSubFragment(new SortableList(), args, Helpers.SettingsType.Edit, Helpers.ActionBarType.HomeUp, pref.getTitleRes(), R.layout.prefs_sortable_list);
- }
-
- public void openActivitiesItemList(Preference pref) {
- Bundle args = new Bundle();
- args.putBoolean("activities", true);
- args.putString("key", pref.getKey());
- args.putInt("titleResId", pref.getTitleRes());
- openSubFragment(new SortableList(), args, Helpers.SettingsType.Edit, Helpers.ActionBarType.HomeUp, pref.getTitleRes(), R.layout.prefs_sortable_list);
- }
-
- public void selectSub(String cat, String sub) {
- PreferenceScreen screen = (PreferenceScreen)findPreference(cat);
- int cnt = screen.getPreferenceCount();
- for (int i = cnt - 1; i >= 0; i--) {
- Preference pref = screen.getPreference(i);
- if (!pref.getKey().equals(sub))
- screen.removePreference(pref);
- else {
- PreferenceCategoryEx category = (PreferenceCategoryEx)pref;
- if (category.isDynamic())
- getActionBar().setTitle(pref.getTitle() + " ⟲");
- else
- getActionBar().setTitle(pref.getTitleRes());
- category.hide();
- }
- }
- }
-
- public void finish() {
- //View view = getView();
- //if (isAnimating && view != null) ((ViewGroup)view.getParent()).removeView(view);
- if (isAnimating) return;
- if (Helpers.shimmerAnim != null) Helpers.shimmerAnim.cancel();
- Helpers.hideKeyboard(getActivity(), getView());
- FragmentManager fragmentManager = getFragmentManager();
- if (fragmentManager == null || !isResumed()) {
- Activity act = getActivity();
- if (act != null) act.getFragmentManager().popBackStack();
- } else {
- fragmentManager.popBackStackImmediate();
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/SubFragmentWithSearch.java b/app/src/main/java/name/mikanoshi/customiuizer/SubFragmentWithSearch.java
deleted file mode 100644
index d1deb302..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/SubFragmentWithSearch.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package name.mikanoshi.customiuizer;
-
-import android.annotation.SuppressLint;
-import android.graphics.drawable.ColorDrawable;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.view.ActionMode;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.ListAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import miui.view.SearchActionMode;
-
-import name.mikanoshi.customiuizer.utils.AppDataAdapter;
-import name.mikanoshi.customiuizer.utils.Helpers;
-import name.mikanoshi.customiuizer.utils.LockedAppAdapter;
-import name.mikanoshi.customiuizer.utils.PrivacyAppAdapter;
-import name.mikanoshi.customiuizer.utils.ResolveInfoAdapter;
-
-public class SubFragmentWithSearch extends SubFragment {
-
- public ListView listView = null;
- View searchView = null;
- LinearLayout search = null;
- ActionMode actionMode = null;
- boolean isSearchFocused = false;
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- getActionBar().setBackgroundDrawable(new ColorDrawable(Helpers.getSystemBackgroundColor(getValidContext())));
- if (getView() == null) return;
-
- SearchActionMode.Callback actionModeCallback = new SearchActionMode.Callback() {
- @Override
- public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- if (searchView == null || listView == null) {
- if (mode != null) mode.finish();
- return false;
- }
-
- SearchActionMode samode = (SearchActionMode)mode;
- samode.setAnchorView(searchView);
- samode.setAnimateView(listView);
- samode.getSearchInput().setOnFocusChangeListener(new View.OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- isSearchFocused = hasFocus;
- }
- });
- samode.getSearchInput().setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- isSearchFocused = v.hasFocus();
- }
- });
- samode.getSearchInput().setOnEditorActionListener(new TextView.OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
- Helpers.hideKeyboard(getActivity(), v);
- listView.requestFocus();
- return true;
- }
- return false;
- }
- });
- samode.getSearchInput().addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {}
-
- @Override
- public void afterTextChanged(Editable s) {
- applyFilter(s.toString().trim());
- }
- });
-
- return true;
- }
-
- @Override
- public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- if (searchView == null || listView == null) {
- if (mode != null) mode.finish();
- return false;
- }
-
- SearchActionMode samode = (SearchActionMode)mode;
- samode.setAnchorView(searchView);
- samode.setAnimateView(listView);
-
- return true;
- }
-
- @Override
- public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- return true;
- }
-
- @Override
- public void onDestroyActionMode(ActionMode mode) {
- TextView input = search == null ? null : search.findViewById(android.R.id.input);
- if (input != null) input.setText("");
- applyFilter("");
- getActionBar().show();
- actionMode = null;
- }
- };
-
- searchView = getView().findViewById(R.id.searchView);
- setActionModeStyle(searchView);
-
- search = searchView.findViewById(android.R.id.inputArea);
- search.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- actionMode = startActionMode(actionModeCallback);
- hideSplitView();
- }
- });
-
- listView = getView().findViewById(android.R.id.list);
- listView.setOnTouchListener(new View.OnTouchListener() {
- @Override
- @SuppressLint("ClickableViewAccessibility")
- public boolean onTouch(View v, MotionEvent event) {
- if (actionMode != null && isSearchFocused) {
- isSearchFocused = false;
- Helpers.hideKeyboard(getActivity(), v);
- }
- return false;
- }
- });
-
- if (actionMode != null) actionMode.invalidate();
- }
-
- void applyFilter(String filter) {
- if (listView == null) return;
- ListAdapter adapter = listView.getAdapter();
- if (adapter == null) return;
- if (adapter instanceof AppDataAdapter)
- ((AppDataAdapter)listView.getAdapter()).getFilter().filter(filter);
- else if (adapter instanceof PrivacyAppAdapter)
- ((PrivacyAppAdapter)listView.getAdapter()).getFilter().filter(filter);
- else if (adapter instanceof LockedAppAdapter)
- ((LockedAppAdapter)listView.getAdapter()).getFilter().filter(filter);
- else if (adapter instanceof ResolveInfoAdapter)
- ((ResolveInfoAdapter)listView.getAdapter()).getFilter().filter(filter);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/crashreport/Dialog.java b/app/src/main/java/name/mikanoshi/customiuizer/crashreport/Dialog.java
deleted file mode 100644
index 4aa190f4..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/crashreport/Dialog.java
+++ /dev/null
@@ -1,587 +0,0 @@
-package name.mikanoshi.customiuizer.crashreport;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.Serializable;
-import java.io.StringWriter;
-import java.lang.reflect.Field;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.zip.GZIPOutputStream;
-
-import org.acra.ACRA;
-import org.acra.ReportField;
-import org.acra.config.CoreConfiguration;
-import org.acra.data.CrashReportData;
-import org.acra.file.BulkReportDeleter;
-import org.acra.file.CrashReportPersister;
-import org.acra.sender.ReportSenderException;
-import org.json.JSONObject;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnCancelListener;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.os.Bundle;
-import android.os.Environment;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnTouchListener;
-import android.view.WindowManager;
-import android.view.inputmethod.EditorInfo;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import android.widget.Toast;
-import android.widget.EditText;
-import android.widget.FrameLayout.LayoutParams;
-
-import miui.app.ProgressDialog;
-
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.mods.GlobalActions;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-import static org.acra.ReportField.USER_COMMENT;
-import static org.acra.ReportField.USER_EMAIL;
-
-public class Dialog extends Activity {
-
- private ProgressDialog loader;
- private CrashReportData crashData;
- private CoreConfiguration config;
- private File reportFile;
- private final StringBuilder debugLog = new StringBuilder();
- private EditText desc;
- String errorText = null;
-
- private boolean isNetworkAvailable() {
- ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo activeNetworkInfo = connectivityManager == null ? null : connectivityManager.getActiveNetworkInfo();
- return activeNetworkInfo != null && activeNetworkInfo.isConnected();
- }
-
- void showFinishDialog(boolean isOk, String details) {
- AlertDialog.Builder dlg = new AlertDialog.Builder(this);
- dlg.setTitle(R.string.crash_result);
- dlg.setCancelable(true);
- if (isOk)
- dlg.setMessage(R.string.crash_ok);
- else {
- String errorTxt = getResources().getString(R.string.crash_error);
- if (details != null) errorTxt += ": " + details;
- dlg.setMessage(errorTxt);
- }
- dlg.setOnCancelListener(new OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- finish();
- }
- });
- dlg.setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- finish();
- }
- });
- dlg.show();
- }
-
- private String getProp(String prop) {
- String res = "";
- Process ifc = null;
- try {
- ifc = Runtime.getRuntime().exec("getprop " + prop);
- BufferedReader bis = new BufferedReader(new InputStreamReader(ifc.getInputStream()), 2048);
- res = bis.readLine();
- } catch (Throwable t) {} finally {
- if (ifc != null) ifc.destroy();
- }
- return res;
- }
-
- private void sendCrash() {
- crashData.put(USER_COMMENT, desc.getText().toString());
-
- loader.setMessage(getResources().getString(R.string.crash_sending_report));
- loader.show();
-
- new Thread(() -> {
- final boolean res = sendReport();
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- loader.hide();
- if (res) {
- Helpers.emptyFile(Helpers.getProtectedContext(Dialog.this).getFilesDir().getAbsolutePath() + "/uncaught_exceptions", true);
- cancelReports();
- showFinishDialog(true, null);
- } else {
- showFinishDialog(false, errorText == null ? "REQUEST_ERROR" : errorText);
- }
- }
- });
- }).start();
- }
-
- protected boolean sendReport() {
- try {
- byte[] jsonData = crashData.toJSON().getBytes(StandardCharsets.UTF_8);
- if (jsonData.length == 0) {
- errorText = "ZERO_LENGTH";
- return false;
- }
-
- //final String basicAuth = "Basic " + Base64.encodeToString("login:pass".getBytes(), Base64.NO_WRAP);
- URL url = new URL("https://code.highspec.ru/crashreports/reporter.php");
- HttpURLConnection conn = (HttpURLConnection)url.openConnection();
- conn.setReadTimeout(10000);
- conn.setConnectTimeout(10000);
- conn.setRequestMethod("POST");
- conn.setRequestProperty("Accept", "application/json");
- conn.setRequestProperty("Content-Type", "application/json");
- conn.setRequestProperty("Content-Encoding", "gzip");
- conn.setDoInput(true);
- conn.setDoOutput(true);
- conn.setUseCaches(false);
- conn.setDefaultUseCaches(false);
- conn.connect();
-
- try (OutputStream os = conn.getOutputStream()) {
- try (GZIPOutputStream dataStream = new GZIPOutputStream(os)) {
- dataStream.write(jsonData);
- dataStream.flush();
- } catch (Throwable t) {}
- } catch (Throwable t) {}
-
-// StringBuilder builder = new StringBuilder();
-// try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
-// String tmp;
-// while ((tmp = in.readLine()) != null) builder.append(tmp);
-// }
-// Log.e("miuizer", "Response: " + builder.toString());
-
- if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) throw new ReportSenderException(String.valueOf(conn.getResponseMessage()));
- //Log.e("HTTP", "Report server response code: " + String.valueOf(conn.getResponseCode()));
- //Log.e("HTTP", "Report server response: " + conn.getResponseMessage());
- conn.disconnect();
- return true;
- } catch (Throwable t) {
- errorText = t.getMessage();
- t.printStackTrace();
- return false;
- }
- }
-
- protected final void cancelReports() {
- (new Thread(() -> (new BulkReportDeleter(this)).deleteReports(false, 0))).start();
- }
-
- protected void cancelReportsAndFinish() {
- cancelReports();
- finish();
- }
-
- int densify(int size) {
- return Math.round(getResources().getDisplayMetrics().density * size);
- }
-
- @Override
- protected final void onCreate(Bundle savedInstanceState) {
- overridePendingTransition(0, 0);
- Helpers.setMiuiTheme(this, R.style.ApplyInvisible, true);
- super.onCreate(savedInstanceState);
-
- if (getIntent().getBooleanExtra("FORCE_CANCEL", false)) {
- cancelReportsAndFinish();
- return;
- }
-
- Serializable sConfig = getIntent().getSerializableExtra(DialogInteraction.EXTRA_REPORT_CONFIG);
- Serializable sReportFile = getIntent().getSerializableExtra(DialogInteraction.EXTRA_REPORT_FILE);
- if (sConfig instanceof CoreConfiguration && sReportFile instanceof File) {
- config = (CoreConfiguration) sConfig;
- reportFile = (File)sReportFile;
- } else {
- ACRA.log.w(ACRA.LOG_TAG, "Illegal or incomplete call of CrashReportDialog.");
- finish();
- }
-
- loader = new ProgressDialog(this);
- loader.setMessage(getResources().getString(R.string.crash_collecting_report));
- loader.setCancelable(false);
- loader.setCanceledOnTouchOutside(false);
- loader.show();
-
- File sdcardLog = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + Helpers.externalFolder + Helpers.logFile);
- if (sdcardLog.exists()) {
- debugLog.append("Log on external storage found, removing\n");
- sdcardLog.delete();
- }
- if (!Helpers.usingNewSharedPrefs()) {
- debugLog.append("Asking System UI to collect Xposed log\n");
- sendBroadcast(new Intent(GlobalActions.ACTION_PREFIX + "CollectXposedLog"));
- }
-
- final Activity act = this;
- new Thread(new Runnable() {
- public void run() {
- try { Thread.sleep(1500); } catch (Throwable t) {}
- act.runOnUiThread(Dialog.this::showReportDialog);
- }
- }).start();
- }
-
- @SuppressLint({"SetTextI18n", "ClickableViewAccessibility"})
- void showReportDialog() {
- int title = R.string.warning;
- int neutralText = R.string.crash_ignore;
- int text = R.string.crash_dialog;
- LinearLayout dialogView = new LinearLayout(this);
- dialogView.setOrientation(LinearLayout.VERTICAL);
-
- PackageManager pkgMgr = getPackageManager();
- String xposedLog = null;
- try {
- File errorLogFile = null;
- File sdcardLog = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + Helpers.externalFolder + Helpers.logFile);
- try {
- if (Helpers.usingNewSharedPrefs()) {
- String errorLogFilename = pkgMgr.getInstallerPackageName("EdXposedLog");
- if (errorLogFilename != null) {
- errorLogFile = new File(errorLogFilename);
- debugLog.append("Log found in misc: ").append(errorLogFilename).append("\n");
- }
- } else {
- String errorLog = Helpers.getXposedInstallerErrorLog(this);
- debugLog.append("Installer log path: ").append(errorLog).append("\n");
- if (sdcardLog.exists() && sdcardLog.canRead()) {
- debugLog.append("Log found on external storage: ").append(sdcardLog.getAbsolutePath()).append("\n");
- errorLogFile = sdcardLog;
- } else if (errorLog != null) {
- errorLogFile = new File(errorLog);
- if (errorLogFile.exists() && errorLogFile.canRead())
- debugLog.append("Log found in installer: ").append(errorLog).append("\n");
- }
- }
- } catch (Throwable ignore) {}
-
- if (errorLogFile != null)
- try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(errorLogFile)))) {
- String line;
- StringBuilder sb = new StringBuilder();
- while ((line = reader.readLine()) != null) sb.append(line).append("\n");
- xposedLog = sb.toString();
- } catch (Throwable t) {
- t.printStackTrace();
- debugLog.append("Error reading log: ").append(t.getMessage()).append("\n");
- } else debugLog.append("No accessible Xposed log found!\n");
-
- if (sdcardLog.exists()) sdcardLog.delete();
- } catch (Throwable t) {}
-
- SharedPreferences prefs;
- try {
- prefs = Helpers.getSharedPrefs(this, true);
- } catch (Throwable t) {
- Log.e("miuizer", "Failed to use protected storage!");
- prefs = Helpers.getSharedPrefs(this, false);
- }
-
- CrashReportPersister persister = new CrashReportPersister();
- try {
- crashData = persister.load(reportFile);
- crashData.put(USER_EMAIL, prefs.getString("acra.user.email", ""));
- } catch (Throwable t) {
- t.printStackTrace();
- cancelReports();
- showFinishDialog(false, "REPORT_READ_ERROR");
- return;
- }
-
- try {
- //Log.e("AndroidRuntime", crashData.getString(ReportField.STACK_TRACE));
-
- String ROM = getProp("ro.modversion");
- String MIUI = getProp("ro.miui.ui.version.name");
-
- String kernel = System.getProperty("os.version");
- if (kernel == null) kernel = "";
-
- JSONObject buildData = (JSONObject)crashData.get("BUILD");
- buildData.put("ROM_VERSION", ROM);
- buildData.put("MIUI_VERSION", MIUI);
- buildData.put("KERNEL_VERSION", kernel);
- crashData.put("BUILD", buildData);
- crashData.put("DEBUG_LOG", debugLog.toString());
- crashData.put("TARGET_API", getApplicationContext().getApplicationInfo().targetSdkVersion);
-
- StringBuilder sb = new StringBuilder();
- try (FileInputStream in = new FileInputStream(Helpers.getProtectedContext(this).getFilesDir().getAbsolutePath() + "/uncaught_exceptions")) {
- try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in))) {
- String line;
- while ((line = bufferedReader.readLine()) != null) sb.append(line).append("\n");
- } catch (Throwable t) {}
- } catch (Throwable t) {}
-
- String edxpVersion = null;
- if (Helpers.usingNewSharedPrefs()) try {
- String lsposed = Helpers.isLSPosedManagerInstalled(this);
- edxpVersion = lsposed != null ? lsposed : pkgMgr.getInstallerPackageName("EdXposedVersion");
- if (edxpVersion == null || edxpVersion.startsWith("unknown")) {
- File versionFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + Helpers.externalFolder + Helpers.versionFile);
- if (versionFile.exists())
- try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(versionFile)))) { edxpVersion = reader.readLine(); }
- }
- } catch (Throwable ignore) {}
-
- if (edxpVersion == null) {
- final ArrayList xposedPropFiles = new ArrayList(Arrays.asList(
- "/system/framework/edconfig.jar", // EdXposed
- "/system/xposed.prop", // Classic
- "/magisk/xposed/system/xposed.prop",
- "/magisk/PurifyXposed/system/xposed.prop",
- "/su/xposed/system/xposed.prop",
- "/vendor/xposed.prop",
- "/xposed/xposed.prop",
- "/xposed.prop",
- "/su/xposed/xposed.prop"
- ));
-
- File[] files = new File("/system/framework").listFiles();
- if (files != null && files.length > 0)
- for (File file: files) try {
- long fsize = file.length();
- if (fsize < 128) {
- xposedPropFiles.add(0, file.getAbsolutePath());
- break;
- }
- } catch (Throwable ignore) {}
-
- for (String prop: xposedPropFiles) {
- File propFile = new File(prop);
- if (propFile.exists() && propFile.canRead()) {
- edxpVersion = Helpers.getXposedPropVersion(propFile, false);
- break;
- }
- }
- }
- if (edxpVersion != null) crashData.put("XPOSED_VERSION", edxpVersion);
-
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_HOME);
- ResolveInfo launcherInfo = pkgMgr.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
- if (launcherInfo != null) {
- PackageInfo packageInfo = pkgMgr.getPackageInfo(launcherInfo.activityInfo.packageName, 0);
- if (packageInfo != null) crashData.put("LAUNCHER_VERSION", launcherInfo.activityInfo.loadLabel(pkgMgr) + " " + packageInfo.versionName);
- }
-
- if (edxpVersion == null || edxpVersion.startsWith("unknown")) try {
- PackageInfo taichiInfo = pkgMgr.getPackageInfo("me.weishu.exp", 0);
- if (taichiInfo != null)
- crashData.put("XPOSED_VERSION", taichiInfo.applicationInfo.loadLabel(pkgMgr) + " " + taichiInfo.versionName);
- } catch (Throwable t) {}
-
- crashData.put("SHARED_PREFERENCES", new JSONObject(prefs.getAll()));
- if (!sb.toString().isEmpty())
- crashData.put("UNCAUGHT_EXCEPTIONS", sb.toString());
-
- if (xposedLog == null || xposedLog.trim().equals(""))
- crashData.put(ReportField.CUSTOM_DATA, "Xposed log is empty...");
- else
- crashData.put(ReportField.CUSTOM_DATA, xposedLog);
- } catch (Throwable t) {
- StringWriter sw = new StringWriter();
- t.printStackTrace(new PrintWriter(sw));
- crashData.put(ReportField.CUSTOM_DATA, "Retrieval failed. Stack trace:\n" + sw);
- }
-
- int payloadSize;
- try {
- try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
- try (GZIPOutputStream dataStream = new GZIPOutputStream(os)) {
- dataStream.write(crashData.toJSON().getBytes(StandardCharsets.UTF_8));
- dataStream.flush();
- }
- payloadSize = os.size();
- }
- } catch (Throwable t) {
- t.printStackTrace();
- cancelReports();
- showFinishDialog(false, "JSON_PAYLOAD_ERROR");
- return;
- }
-
- if (payloadSize == 0) {
- cancelReports();
- showFinishDialog(false, "EMPTY_PAYLOAD_ERROR");
- return;
- }
-
- try {
- TextView mainText = new TextView(this);
- mainText.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
- mainText.setGravity(Gravity.START);
- mainText.setPadding(0, 0, 0, densify(10));
- mainText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
- mainText.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
-
- TextView descText = new TextView(this);
- descText.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
- descText.setGravity(Gravity.START);
- descText.setPadding(0, 0, 0, densify(5));
- descText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
- descText.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
-
- desc = new EditText(this);
- desc.setGravity(Gravity.TOP | Gravity.START);
- desc.setInputType(EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE);
- desc.setSingleLine(false);
- desc.setPadding(densify(5), densify(5), densify(5), densify(5));
-
- boolean isManualReport = crashData.getString(ReportField.STACK_TRACE).contains("Report requested by developer");
- if (isManualReport) {
- title = R.string.crash_confirm;
- text = R.string.crash_dialog_manual;
- neutralText = R.string.cancel;
- descText.setText(R.string.crash_dialog_manual_desc);
-
- LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, densify(80));
- lp.setMargins(0, densify(5), 0, densify(10));
- desc.setLayoutParams(lp);
- } else {
- descText.setText(R.string.crash_dialog_manual_desc2);
-
- LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, densify(60));
- lp.setMargins(0, densify(5), 0, densify(10));
- desc.setLayoutParams(lp);
- desc.setFocusable(false);
- desc.setFocusableInTouchMode(false);
- desc.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- v.setFocusable(true);
- v.setFocusableInTouchMode(true);
- v.performClick();
- return false;
- }
- });
- }
-
- mainText.setText(text);
-
- TextView feedbackNote = new TextView(this);
- feedbackNote.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
- feedbackNote.setGravity(Gravity.START);
- feedbackNote.setPadding(0, 0, 0, 0);
- feedbackNote.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
- feedbackNote.setText(R.string.crash_dialog_note);
-
- dialogView.addView(mainText);
- dialogView.addView(descText);
- dialogView.addView(desc);
-
- String email = Helpers.prefs.getString("acra.user.email", "");
- if (Objects.equals(email, "")) dialogView.addView(feedbackNote);
-
- mainText.setText(mainText.getText() + "\n" + getResources().getString(R.string.crash_dialog_manual_size) + ": " + Math.round(payloadSize / 1024.0f) + " KB");
- } catch (Throwable t) {}
-
- AlertDialog.Builder alert = new AlertDialog.Builder(this);
- alert.setTitle(title);
- alert.setView(dialogView);
- alert.setOnCancelListener(new OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- cancelReportsAndFinish();
- }
- });
- alert.setNeutralButton(neutralText, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- cancelReportsAndFinish();
- }
- });
- alert.setPositiveButton(R.string.crash_send, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {}
- });
- loader.hide();
- final AlertDialog alertDlg = alert.show();
- alertDlg.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (desc != null && desc.getText().toString().trim().equals("")) {
- Toast.makeText(Dialog.this, R.string.crash_needs_desc, Toast.LENGTH_LONG).show();
- } else if (!isNetworkAvailable()) {
- Toast.makeText(Dialog.this, R.string.crash_needs_inet, Toast.LENGTH_LONG).show();
- } else {
- Helpers.hideKeyboard(null, v);
- alertDlg.dismiss();
- sendCrash();
- }
- }
- });
- }
-
- protected final CoreConfiguration getConfig() {
- return config;
- }
-
- @SuppressWarnings({"deprecation", "JavaReflectionMemberAccess"})
- private void updateBlurRatio() {
- try {
- View rootView = getWindow().getDecorView();
- if (rootView.getLayoutParams() instanceof WindowManager.LayoutParams) {
- WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams)rootView.getLayoutParams();
- layoutParams.flags |= WindowManager.LayoutParams.FLAG_BLUR_BEHIND;
- Field blurRatio = WindowManager.LayoutParams.class.getDeclaredField("blurRatio");
- blurRatio.setAccessible(true);
- blurRatio.set(layoutParams, Helpers.isNightMode(this) ? 0.5f : 0.75f);
- getWindowManager().updateViewLayout(rootView, layoutParams);
- }
- } catch (Throwable t) {}
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- updateBlurRatio();
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
- updateBlurRatio();
- }
-
- @Override
- public void onDetachedFromWindow() {
- if (loader != null && loader.isShowing()) loader.dismiss();
- super.onDetachedFromWindow();
- }
-
- @Override
- public void finish() {
- super.finish();
- overridePendingTransition(0, 0);
- }
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/crashreport/DialogInteraction.java b/app/src/main/java/name/mikanoshi/customiuizer/crashreport/DialogInteraction.java
deleted file mode 100644
index 175d28a6..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/crashreport/DialogInteraction.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package name.mikanoshi.customiuizer.crashreport;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-
-import org.acra.ACRA;
-import org.acra.config.CoreConfiguration;
-import org.acra.interaction.ReportInteraction;
-import org.acra.prefs.SharedPreferencesFactory;
-
-import java.io.File;
-
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-import static org.acra.ACRA.LOG_TAG;
-
-public class DialogInteraction implements ReportInteraction {
- static final String EXTRA_REPORT_FILE = "REPORT_FILE";
- static final String EXTRA_REPORT_CONFIG = "REPORT_CONFIG";
-
- public DialogInteraction() {
- super();
- }
-
- @Override
- public boolean performInteraction(Context context, CoreConfiguration config, File reportFile) {
- try {
- final SharedPreferences prefs = new SharedPreferencesFactory(Helpers.getProtectedContext(context), config).create();
- if (prefs.getBoolean(ACRA.PREF_ALWAYS_ACCEPT, false)) return true;
- if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Creating CrashReportDialog for " + reportFile);
- final Intent dialogIntent = createCrashReportDialogIntent(context, config, reportFile);
- dialogIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
- context.startActivity(dialogIntent);
- } catch (Throwable t) {}
- return false;
- }
-
- private Intent createCrashReportDialogIntent(Context context, CoreConfiguration config, File reportFile) {
- if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "Creating DialogIntent for " + reportFile);
- final Intent dialogIntent = new Intent(context, Dialog.class);
- dialogIntent.putExtra(EXTRA_REPORT_FILE, reportFile);
- dialogIntent.putExtra(EXTRA_REPORT_CONFIG, config);
- return dialogIntent;
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/holidays/CoinGenerator.java b/app/src/main/java/name/mikanoshi/customiuizer/holidays/CoinGenerator.java
deleted file mode 100644
index a7678372..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/holidays/CoinGenerator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package name.mikanoshi.customiuizer.holidays;
-
-import android.content.Context;
-
-import com.github.jinatonic.confetti.ConfettoGenerator;
-import com.github.jinatonic.confetti.confetto.Confetto;
-import com.github.matteobattilana.weather.PrecipType;
-import com.github.matteobattilana.weather.confetti.ConfettoInfo;
-
-import java.util.Random;
-
-public class CoinGenerator implements ConfettoGenerator {
- private final ConfettoInfo confettoInfo;
- private final Context context;
-
- public CoinGenerator(Context ctx) {
- super();
- this.context = ctx;
- this.confettoInfo = new ConfettoInfo(PrecipType.CLEAR);
- }
-
- public Confetto generateConfetto(Random random) {
- return new CoinParticle(this.context, this.confettoInfo);
- }
-
- public final ConfettoInfo getConfettoInfo() {
- return this.confettoInfo;
- }
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/holidays/CoinParticle.java b/app/src/main/java/name/mikanoshi/customiuizer/holidays/CoinParticle.java
deleted file mode 100644
index f6872d5d..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/holidays/CoinParticle.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package name.mikanoshi.customiuizer.holidays;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.view.Surface;
-import android.view.WindowManager;
-
-import com.github.jinatonic.confetti.confetto.Confetto;
-import com.github.matteobattilana.weather.confetti.ConfettoInfo;
-
-import java.util.Random;
-
-import name.mikanoshi.customiuizer.R;
-
-@SuppressWarnings("FieldCanBeLocal")
-public class CoinParticle extends Confetto {
- private final Context mContext;
- private float startX;
- private float startY;
- private int signX;
- private int signY;
- private int distance;
- private int maxAlpha;
- private final ConfettoInfo confettoInfo;
- private final Bitmap coin;
- private final float coinScale;
- private final int[] coins = new int[] {
- R.drawable.coin1, R.drawable.coin2, R.drawable.coin3, R.drawable.coin4, R.drawable.coin5, R.drawable.coin6, R.drawable.coin7, R.drawable.coin8, R.drawable.coin9, R.drawable.coin10,
- R.drawable.coin11, R.drawable.coin12, R.drawable.coin13, R.drawable.coin14, R.drawable.coin15, R.drawable.coin16, R.drawable.coin17, R.drawable.coin18, R.drawable.coin19, R.drawable.coin20,
- R.drawable.coin21, R.drawable.coin22
- };
-
- private void randomizeStartPoint() {
- int width = mContext.getResources().getDisplayMetrics().widthPixels;
- int height = mContext.getResources().getDisplayMetrics().heightPixels;
- float gapX = width / 20.0f;
- float gapY = height / 15.0f;
-
- int rotation = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
- boolean isLandscape = rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270;
- Random rand = new Random();
- float selector = rand.nextFloat();
- if (selector < 0.25f) {
- startX = rand.nextFloat() * (isLandscape ? gapY : gapX);
- startY = rand.nextFloat() * (isLandscape ? width : height);
- } else if (selector >= 0.25f && selector < 0.5f) {
- startX = width - rand.nextFloat() * (isLandscape ? gapY : gapX);
- startY = rand.nextFloat() * (isLandscape ? width : height);
- } else if (selector >= 0.5f && selector < 0.75f) {
- startX = rand.nextFloat() * (isLandscape ? height : width);
- startY = rand.nextFloat() * (isLandscape ? gapX : gapY);
- } else {
- startX = rand.nextFloat() * (isLandscape ? height : width);
- startY = height - rand.nextFloat() * (isLandscape ? gapX : gapY);
- }
- signX = rand.nextInt(3) - 1;
- signY = rand.nextInt(3) - 1;
- maxAlpha = rand.nextInt(40) + 30;
- distance = rand.nextInt(76) + 75;
- }
-
- CoinParticle(Context context, ConfettoInfo confettoInfo) {
- super();
- this.confettoInfo = confettoInfo;
- mContext = context;
- coinScale = 1.2f - new Random().nextFloat() * 0.2f;
- coin = BitmapFactory.decodeResource(context.getResources(), coins[new Random().nextInt(coins.length)]);
- randomizeStartPoint();
- }
-
- public int getHeight() {
- return 0;
- }
-
- public int getWidth() {
- return 0;
- }
-
- public void reset() {
- super.reset();
- randomizeStartPoint();
- }
-
- protected void configurePaint(Paint paint) {
- super.configurePaint(paint);
- paint.setColor(-1);
- paint.setAntiAlias(true);
- }
-
- protected void drawInternal(Canvas canvas, Matrix matrix, Paint paint, float x, float y, float rotation, float percentageAnimated) {
- matrix.postScale(coinScale, coinScale);
- matrix.postRotate(rotation, coin.getWidth() / 2f, coin.getHeight() / 2f);
- matrix.postTranslate(startX + signX * distance * percentageAnimated, startY + signY * distance * percentageAnimated);
- if (percentageAnimated < 0.1f)
- paint.setAlpha(Math.round(maxAlpha * percentageAnimated / 0.1f));
- else if (percentageAnimated > 0.9f)
- paint.setAlpha(Math.round(maxAlpha * (1.0f - percentageAnimated) / 0.1f));
- else
- paint.setAlpha(maxAlpha);
- canvas.drawBitmap(coin, matrix, paint);
- }
-
- public final ConfettoInfo getConfettoInfo() {
- return this.confettoInfo;
- }
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/holidays/FilthGenerator.java b/app/src/main/java/name/mikanoshi/customiuizer/holidays/FilthGenerator.java
deleted file mode 100644
index 9c8edbe2..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/holidays/FilthGenerator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package name.mikanoshi.customiuizer.holidays;
-
-import android.content.Context;
-
-import com.github.jinatonic.confetti.ConfettoGenerator;
-import com.github.jinatonic.confetti.confetto.Confetto;
-import com.github.matteobattilana.weather.PrecipType;
-import com.github.matteobattilana.weather.confetti.ConfettoInfo;
-
-import java.util.Random;
-
-public class FilthGenerator implements ConfettoGenerator {
- private final ConfettoInfo confettoInfo;
- private final Context context;
-
- public FilthGenerator(Context ctx) {
- super();
- this.context = ctx;
- this.confettoInfo = new ConfettoInfo(PrecipType.CLEAR);
- }
-
- public Confetto generateConfetto(Random random) {
- return new FilthyParticle(this.context, this.confettoInfo);
- }
-
- public final ConfettoInfo getConfettoInfo() {
- return this.confettoInfo;
- }
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/holidays/FilthyParticle.java b/app/src/main/java/name/mikanoshi/customiuizer/holidays/FilthyParticle.java
deleted file mode 100644
index 669c660d..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/holidays/FilthyParticle.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package name.mikanoshi.customiuizer.holidays;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.view.Surface;
-import android.view.WindowManager;
-
-import com.github.jinatonic.confetti.confetto.Confetto;
-import com.github.matteobattilana.weather.confetti.ConfettoInfo;
-
-import java.util.Random;
-
-import name.mikanoshi.customiuizer.R;
-
-@SuppressWarnings("FieldCanBeLocal")
-public class FilthyParticle extends Confetto {
- private final Context mContext;
- private float startX;
- private float startY;
- private int signX;
- private int signY;
- private int distance;
- private int maxAlpha;
- private final ConfettoInfo confettoInfo;
- private final Bitmap filth;
- private final float filthScale;
- private final int[] viruses = new int[] { R.drawable.virus1, R.drawable.virus2, R.drawable.virus3 };
-
- private void randomizeStartPoint() {
- int width = mContext.getResources().getDisplayMetrics().widthPixels;
- int height = mContext.getResources().getDisplayMetrics().heightPixels;
- float gapX = width / 20.0f;
- float gapY = height / 15.0f;
-
- int rotation = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
- boolean isLandscape = rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270;
- Random rand = new Random();
- float selector = rand.nextFloat();
- if (selector < 0.25f) {
- startX = rand.nextFloat() * (isLandscape ? gapY : gapX);
- startY = rand.nextFloat() * (isLandscape ? width : height);
- } else if (selector >= 0.25f && selector < 0.5f) {
- startX = width - rand.nextFloat() * (isLandscape ? gapY : gapX);
- startY = rand.nextFloat() * (isLandscape ? width : height);
- } else if (selector >= 0.5f && selector < 0.75f) {
- startX = rand.nextFloat() * (isLandscape ? height : width);
- startY = rand.nextFloat() * (isLandscape ? gapX : gapY);
- } else {
- startX = rand.nextFloat() * (isLandscape ? height : width);
- startY = height - rand.nextFloat() * (isLandscape ? gapX : gapY);
- }
- signX = rand.nextInt(3) - 1;
- signY = rand.nextInt(3) - 1;
- maxAlpha = rand.nextInt(50) + 40;
- distance = rand.nextInt(76) + 75;
- }
-
- FilthyParticle(Context context, ConfettoInfo confettoInfo) {
- super();
- this.confettoInfo = confettoInfo;
- mContext = context;
- filthScale = 0.65f - new Random().nextFloat() * 0.15f;
- filth = BitmapFactory.decodeResource(context.getResources(), viruses[new Random().nextInt(viruses.length)]);
- randomizeStartPoint();
- }
-
- public int getHeight() {
- return 0;
- }
-
- public int getWidth() {
- return 0;
- }
-
- public void reset() {
- super.reset();
- randomizeStartPoint();
- }
-
- protected void configurePaint(Paint paint) {
- super.configurePaint(paint);
- paint.setColor(-1);
- paint.setAntiAlias(true);
- }
-
- protected void drawInternal(Canvas canvas, Matrix matrix, Paint paint, float x, float y, float rotation, float percentageAnimated) {
- matrix.postScale(filthScale, filthScale);
- matrix.postRotate(rotation, filth.getWidth() / 2f, filth.getHeight() / 2f);
- matrix.postTranslate(startX + signX * distance * percentageAnimated, startY + signY * distance * percentageAnimated);
- if (percentageAnimated < 0.1f)
- paint.setAlpha(Math.round(maxAlpha * percentageAnimated / 0.1f));
- else if (percentageAnimated > 0.9f)
- paint.setAlpha(Math.round(maxAlpha * (1.0f - percentageAnimated) / 0.1f));
- else
- paint.setAlpha(maxAlpha);
- canvas.drawBitmap(filth, matrix, paint);
- }
-
- public final ConfettoInfo getConfettoInfo() {
- return this.confettoInfo;
- }
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/holidays/FlowerGenerator.java b/app/src/main/java/name/mikanoshi/customiuizer/holidays/FlowerGenerator.java
deleted file mode 100644
index f5850f0b..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/holidays/FlowerGenerator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package name.mikanoshi.customiuizer.holidays;
-
-import android.content.Context;
-
-import com.github.jinatonic.confetti.ConfettoGenerator;
-import com.github.jinatonic.confetti.confetto.Confetto;
-import com.github.matteobattilana.weather.PrecipType;
-import com.github.matteobattilana.weather.confetti.ConfettoInfo;
-
-import java.util.Random;
-
-public class FlowerGenerator implements ConfettoGenerator {
- private final ConfettoInfo confettoInfo;
- private final Context context;
-
- public FlowerGenerator(Context ctx) {
- super();
- this.context = ctx;
- this.confettoInfo = new ConfettoInfo(PrecipType.SNOW);
- }
-
- public Confetto generateConfetto(Random random) {
- return new FlowerParticle(this.context, this.confettoInfo);
- }
-
- public final ConfettoInfo getConfettoInfo() {
- return this.confettoInfo;
- }
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/holidays/FlowerParticle.java b/app/src/main/java/name/mikanoshi/customiuizer/holidays/FlowerParticle.java
deleted file mode 100644
index babf4ee5..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/holidays/FlowerParticle.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package name.mikanoshi.customiuizer.holidays;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.view.Surface;
-import android.view.WindowManager;
-
-import com.github.jinatonic.confetti.confetto.Confetto;
-import com.github.matteobattilana.weather.confetti.ConfettoInfo;
-
-import java.util.Random;
-
-import name.mikanoshi.customiuizer.R;
-
-@SuppressWarnings("FieldCanBeLocal")
-public class FlowerParticle extends Confetto {
- private final ConfettoInfo confettoInfo;
- private final Bitmap petal;
- private float petalScale;
- private final int[] petals = new int[] { R.drawable.confetti1, R.drawable.confetti1, R.drawable.confetti2, R.drawable.confetti2, R.drawable.confetti3, R.drawable.confetti3, R.drawable.petal };
-
- FlowerParticle(Context context, ConfettoInfo confettoInfo) {
- super();
- this.confettoInfo = confettoInfo;
- petalScale = 0.6f - (float)Math.random() * 0.15f;
- petal = BitmapFactory.decodeResource(context.getResources(), petals[new Random().nextInt(petals.length)]);
-
- int rotation = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
- if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) petalScale *= 1.5;
- }
-
- public int getHeight() {
- return 0;
- }
-
- public int getWidth() {
- return 0;
- }
-
- public void reset() {
- super.reset();
- }
-
- protected void configurePaint(Paint paint) {
- super.configurePaint(paint);
- paint.setColor(-1);
- paint.setAntiAlias(true);
- }
-
- protected void drawInternal(Canvas canvas, Matrix matrix, Paint paint, float x, float y, float rotation, float percentageAnimated) {
- switch (confettoInfo.getPrecipType()) {
- case CLEAR:
- break;
- case SNOW:
- matrix.postScale(petalScale, petalScale);
- matrix.postRotate(rotation, petal.getWidth() / 2f, petal.getHeight() / 2f);
- matrix.postTranslate(x, y);
- canvas.drawBitmap(petal, matrix, paint);
- break;
- }
- }
-
- public final ConfettoInfo getConfettoInfo() {
- return this.confettoInfo;
- }
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/holidays/HolidayHelper.java b/app/src/main/java/name/mikanoshi/customiuizer/holidays/HolidayHelper.java
deleted file mode 100644
index c0457469..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/holidays/HolidayHelper.java
+++ /dev/null
@@ -1,141 +0,0 @@
-package name.mikanoshi.customiuizer.holidays;
-
-import android.app.Activity;
-import android.view.Surface;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.RelativeLayout;
-
-import com.github.jinatonic.confetti.ConfettiManager;
-import com.github.jinatonic.confetti.ConfettoGenerator;
-
-import com.github.matteobattilana.weather.PrecipType;
-import com.github.matteobattilana.weather.WeatherView;
-
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Field;
-
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.utils.GravitySensor;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class HolidayHelper {
-
- private static WeakReference weatherView;
- private static WeakReference angleListener;
-
- public static void setWeatherGenerator(ConfettoGenerator generator) {
- try {
- ConfettiManager manager = weatherView.get().getConfettiManager();
- Field confettoGenerator = ConfettiManager.class.getDeclaredField("confettoGenerator");
- confettoGenerator.setAccessible(true);
- confettoGenerator.set(manager, generator);
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- public static void setup(Activity activity) {
- Helpers.detectHoliday();
-
- WeatherView view = activity.findViewById(R.id.weather_view);
- ImageView header = activity.findViewById(R.id.holiday_header);
-
- view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
- weatherView = new WeakReference<>(view);
- GravitySensor listener = null;
- if (Helpers.currentHoliday == Helpers.Holidays.NEWYEAR) {
- int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
- view.setPrecipType(PrecipType.SNOW);
- view.setSpeed(50);
- view.setEmissionRate(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270 ? 8 : 4);
- view.setFadeOutPercent(0.75f);
- view.setAngle(0);
- RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)view.getLayoutParams();
- lp.height = activity.getResources().getDisplayMetrics().heightPixels / (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270 ? 2 : 3);
- view.setLayoutParams(lp);
- setWeatherGenerator(new SnowGenerator(activity));
- view.resetWeather();
- view.setVisibility(View.VISIBLE);
- view.getConfettiManager().setRotationalVelocity(0, 45);
-
- listener = new GravitySensor(activity, view);
- listener.setOrientation(rotation);
- listener.setSpeed(50);
- listener.start();
-
- header.setImageResource(R.drawable.newyear_header);
- header.setVisibility(View.VISIBLE);
- } else if (Helpers.currentHoliday == Helpers.Holidays.LUNARNEWYEAR) {
- int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
- view.setPrecipType(PrecipType.SNOW);
- view.setSpeed(35);
- view.setEmissionRate(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270 ? 4 : 2);
- view.setFadeOutPercent(0.75f);
- view.setAngle(0);
- RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)view.getLayoutParams();
- lp.height = activity.getResources().getDisplayMetrics().heightPixels / (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270 ? 3 : 4);
- view.setLayoutParams(lp);
- setWeatherGenerator(new FlowerGenerator(activity));
- view.resetWeather();
- view.setVisibility(View.VISIBLE);
- view.getConfettiManager().setRotationalVelocity(0, 45);
-
- listener = new GravitySensor(activity, view);
- listener.setOrientation(rotation);
- listener.setSpeed(35);
- listener.start();
-
- header.setImageResource(R.drawable.lunar_newyear_header);
- header.setVisibility(View.VISIBLE);
- } else if (Helpers.currentHoliday == Helpers.Holidays.PANDEMIC) {
- view.setPrecipType(PrecipType.CLEAR);
- view.setSpeed(0);
- view.setEmissionRate(0.6f);
- view.setFadeOutPercent(1.0f);
- view.setAngle(0);
- setWeatherGenerator(new FilthGenerator(activity));
- view.resetWeather();
- view.setVisibility(View.VISIBLE);
- view.getConfettiManager().setRotationalVelocity(0, 15).setTTL(30000);
- } else if (Helpers.currentHoliday == Helpers.Holidays.CRYPTO) {
- view.setPrecipType(PrecipType.CLEAR);
- view.setSpeed(0);
- view.setEmissionRate(0.6f);
- view.setFadeOutPercent(1.0f);
- view.setAngle(0);
- setWeatherGenerator(new CoinGenerator(activity));
- view.resetWeather();
- view.setVisibility(View.VISIBLE);
- view.getConfettiManager().setRotationalVelocity(0, 15).setTTL(30000);
-
- header.setImageResource(R.drawable.crypto_header);
- header.setVisibility(View.VISIBLE);
- } else {
- ((ViewGroup)view.getParent()).removeView(view);
- ((ViewGroup)header.getParent()).removeView(header);
- }
- angleListener = new WeakReference<>(listener);
- }
-
- public static void onPause() {
- GravitySensor listener = angleListener.get();
- if (listener != null) listener.onPause();
- WeatherView view = weatherView.get();
- if (view != null) view.getConfettiManager().terminate();
- }
-
- public static void onResume() {
- GravitySensor listener = angleListener.get();
- if (listener != null) listener.onResume();
- WeatherView view = weatherView.get();
- if (view != null) view.getConfettiManager().animate();
- }
-
- public static void onDestroy() {
- GravitySensor listener = angleListener.get();
- if (listener != null) listener.stop();
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/holidays/SnowGenerator.java b/app/src/main/java/name/mikanoshi/customiuizer/holidays/SnowGenerator.java
deleted file mode 100644
index 5f52aeff..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/holidays/SnowGenerator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package name.mikanoshi.customiuizer.holidays;
-
-import android.content.Context;
-
-import com.github.jinatonic.confetti.ConfettoGenerator;
-import com.github.jinatonic.confetti.confetto.Confetto;
-import com.github.matteobattilana.weather.PrecipType;
-import com.github.matteobattilana.weather.confetti.ConfettoInfo;
-
-import java.util.Random;
-
-public class SnowGenerator implements ConfettoGenerator {
- private final ConfettoInfo confettoInfo;
- private final Context context;
-
- public SnowGenerator(Context ctx) {
- super();
- this.context = ctx;
- this.confettoInfo = new ConfettoInfo(PrecipType.SNOW);
- }
-
- public Confetto generateConfetto(Random random) {
- return new SnowParticle(this.context, this.confettoInfo);
- }
-
- public final ConfettoInfo getConfettoInfo() {
- return this.confettoInfo;
- }
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/holidays/SnowParticle.java b/app/src/main/java/name/mikanoshi/customiuizer/holidays/SnowParticle.java
deleted file mode 100644
index c4b9f73a..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/holidays/SnowParticle.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package name.mikanoshi.customiuizer.holidays;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-
-import com.github.jinatonic.confetti.confetto.Confetto;
-import com.github.matteobattilana.weather.confetti.ConfettoInfo;
-
-import name.mikanoshi.customiuizer.R;
-
-public class SnowParticle extends Confetto {
- private Float prevX;
- private Float prevY;
- private final ConfettoInfo confettoInfo;
- private final Bitmap snowflake;
- private final float snowScale;
- //private float rainStretch;
-
- SnowParticle(Context context, ConfettoInfo confettoInfo) {
- super();
- this.confettoInfo = confettoInfo;
- snowScale = 0.6f - (float)Math.random() * 0.3f;
- //rainStretch = 1.5f + (float)Math.random() - 0.5f;
- snowflake = BitmapFactory.decodeResource(context.getResources(), R.drawable.snowflake);
- }
-
- public int getHeight() {
- return 0;
- }
-
- public int getWidth() {
- return 0;
- }
-
- public void reset() {
- super.reset();
- this.prevX = null;
- this.prevY = null;
- }
-
- protected void configurePaint(Paint paint) {
- super.configurePaint(paint);
- paint.setColor(-1);
- paint.setAntiAlias(true);
- }
-
- protected void drawInternal(Canvas canvas, Matrix matrix, Paint paint, float x, float y, float rotation, float percentageAnimated) {
- if (prevX == null || prevY == null) {
- prevX = x;
- prevY = y;
- }
-
- switch (confettoInfo.getPrecipType()) {
- case CLEAR:
- break;
-// case RAIN:
-// float dX = x - prevX;
-// float dY = y - prevY;
-// float x1 = prevX - dX * rainStretch;
-// float y1 = prevY - dY * rainStretch;
-// float x2 = x + dX * rainStretch;
-// float y2 = y + dY * rainStretch;
-// paint.setShader(new LinearGradient(x1, y1, x2, y2, new int[] { Color.TRANSPARENT, 0xb29aa3ad, 0xb29aa3ad, Color.TRANSPARENT }, new float[] { 0f, 0.45f, 0.55f, 1f }, Shader.TileMode.CLAMP));
-// canvas.drawLine(x1, y1, x2, y2, paint);
-// break;
- case SNOW:
- matrix.postScale(snowScale, snowScale);
- matrix.postRotate(rotation, snowflake.getWidth() / 2f, snowflake.getHeight() / 2f);
- matrix.postTranslate(x, y);
- canvas.drawBitmap(snowflake, matrix, paint);
- break;
- }
- prevX = x;
- prevY = y;
- }
-
- public final ConfettoInfo getConfettoInfo() {
- return this.confettoInfo;
- }
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/mods/Controls.java b/app/src/main/java/name/mikanoshi/customiuizer/mods/Controls.java
deleted file mode 100644
index 7d7f8afb..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/mods/Controls.java
+++ /dev/null
@@ -1,1116 +0,0 @@
-package name.mikanoshi.customiuizer.mods;
-
-import android.annotation.SuppressLint;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.graphics.Color;
-import android.graphics.drawable.Drawable;
-import android.inputmethodservice.InputMethodService;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-import android.os.SystemClock;
-import android.provider.Settings;
-import android.telecom.TelecomManager;
-import android.telephony.TelephonyManager;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.Toast;
-
-import java.lang.reflect.Method;
-
-import static java.lang.System.currentTimeMillis;
-
-import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
-import de.robv.android.xposed.XC_MethodReplacement;
-import de.robv.android.xposed.XposedBridge;
-import de.robv.android.xposed.XposedHelpers;
-
-import name.mikanoshi.customiuizer.MainModule;
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.utils.Helpers;
-import name.mikanoshi.customiuizer.utils.Helpers.MethodHook;
-
-public class Controls {
-
- private static boolean isPowerPressed = false;
- private static boolean isPowerLongPressed = false;
- private static boolean isVolumePressed = false;
- private static boolean isVolumeLongPressed = false;
- private static boolean isWaitingForPowerLongPressed = false;
- private static boolean isWaitingForVolumeLongPressed = false;
- private static boolean wasRaise2WakeEnabled = false;
- private static Handler mHandler;
-
- private static boolean isTorchEnabled(Context mContext) {
- return Settings.Global.getInt(mContext.getContentResolver(), "torch_state", 0) != 0;
- }
-
- private static void setTorch(Context context, boolean state) {
- if (state) {
- int wakeup = Settings.System.getInt(context.getContentResolver(), "pick_up_gesture_wakeup_mode", 0);
- wasRaise2WakeEnabled = wakeup == 1;
- if (wasRaise2WakeEnabled) Settings.System.putInt(context.getContentResolver(), "pick_up_gesture_wakeup_mode", 0);
- }
- Intent intent = new Intent("miui.intent.action.TOGGLE_TORCH");
- intent.putExtra("miui.intent.extra.IS_ENABLE", state);
- context.sendBroadcast(intent);
- }
-
- private static final BroadcastReceiver mScreenOnReceiver = new BroadcastReceiver() {
- public void onReceive(final Context context, Intent intent) {
- if (isTorchEnabled(context)) setTorch(context, false);
- if (Helpers.mWakeLock != null && Helpers.mWakeLock.isHeld()) Helpers.mWakeLock.release();
- if (wasRaise2WakeEnabled) {
- wasRaise2WakeEnabled = false;
- Settings.System.putInt(context.getContentResolver(), "pick_up_gesture_wakeup_mode", 1);
- }
- }
- };
-
- public static void PowerKeyRes() {
- MainModule.resHooks.setObjectReplacement("android", "bool", "config_supportLongPressPowerWhenNonInteractive", true);
- }
-
- public static void PowerKeyHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "init", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- mContext.registerReceiver(mScreenOnReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));
- }
- });
-
-// Helpers.findAndHookMethod("com.android.server.input.InputManagerService", lpparam.classLoader, "interceptKeyBeforeQueueing", KeyEvent.class, int.class, new MethodHook() {
-// @Override
-// protected void before(final MethodHookParam param) throws Throwable {
-// KeyEvent keyEvent = (KeyEvent)param.args[0];
-// Helpers.log("PowerKeyHook", "InputManagerService interceptKeyBeforeQueueing: | KeyCode: " + keyEvent.getKeyCode() + " | Action: " + keyEvent.getAction() + " | RepeatCount: " + keyEvent.getRepeatCount()+ " | Flags: " + keyEvent.getFlags());
-// }
-// });
-//
-// Helpers.findAndHookMethod("com.android.server.policy.BaseMiuiPhoneWindowManager", lpparam.classLoader, "interceptKeyBeforeQueueingInternal", KeyEvent.class, int.class, boolean.class, new MethodHook() {
-// @Override
-// protected void before(final MethodHookParam param) throws Throwable {
-// KeyEvent keyEvent = (KeyEvent)param.args[0];
-// Helpers.log("PowerKeyHook", "interceptKeyBeforeQueueingInternal: " + param.args[2] + " | KeyCode: " + keyEvent.getKeyCode() + " | Action: " + keyEvent.getAction() + " | RepeatCount: " + keyEvent.getRepeatCount()+ " | Flags: " + keyEvent.getFlags());
-// }
-// });
-
- Helpers.findAndHookMethod("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "interceptKeyBeforeQueueing", KeyEvent.class, int.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- // Power and volkeys are pressed at the same time
- if (isVolumePressed) return;
- KeyEvent keyEvent = (KeyEvent)param.args[0];
-
- int keycode = keyEvent.getKeyCode();
- int action = keyEvent.getAction();
- int flags = keyEvent.getFlags();
-
- // Ignore repeated KeyEvents simulated on Power Key Up
- if ((flags & KeyEvent.FLAG_VIRTUAL_HARD_KEY) == KeyEvent.FLAG_VIRTUAL_HARD_KEY) return;
- if ((flags & KeyEvent.FLAG_FROM_SYSTEM) != KeyEvent.FLAG_FROM_SYSTEM || keycode != KeyEvent.KEYCODE_POWER) return;
-
- // Power long press
- final Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- final PowerManager mPowerManager = (PowerManager)XposedHelpers.getObjectField(param.thisObject, "mPowerManager");
- if (mPowerManager.isInteractive()) return;
- //Helpers.log("PowerKeyHook", "interceptKeyBeforeQueueing: " + param.args[1] + ", isTracking: " + keyEvent.isTracking() + " | Source: " + keyEvent.getSource() + " | KeyCode: " + keyEvent.getKeyCode() + " | Action: " + keyEvent.getAction() + " | RepeatCount: " + keyEvent.getRepeatCount()+ " | Flags: " + keyEvent.getFlags());
- if (action == KeyEvent.ACTION_DOWN) {
- isPowerPressed = true;
- isPowerLongPressed = false;
-
- mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- int longPressDelay = (Helpers.getSharedBoolPref(mContext, "pref_key_controls_powerflash_delay", false) ? ViewConfiguration.getLongPressTimeout() * 3 : ViewConfiguration.getLongPressTimeout()) + 500;
- // Post only one delayed runnable that waits for long press timeout
- if (!isWaitingForPowerLongPressed)
- mHandler.postDelayed(new Runnable() {
- @Override
- @SuppressLint("Wakelock")
- public void run() {
- if (isPowerPressed) {
- isPowerLongPressed = true;
-
- if (Helpers.mWakeLock == null)
- Helpers.mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "miuizer:flashlight");
-
- if (!isTorchEnabled(mContext) || !Helpers.mWakeLock.isHeld()) {
- setTorch(mContext, true);
- if (!Helpers.mWakeLock.isHeld()) Helpers.mWakeLock.acquire(600000);
- } else {
- setTorch(mContext, true);
- if (Helpers.mWakeLock.isHeld()) Helpers.mWakeLock.release();
- }
- }
- isPowerPressed = false;
- isWaitingForPowerLongPressed = false;
- }
- }, longPressDelay);
-
- isWaitingForPowerLongPressed = true;
- param.setResult(0);
- }
-
- if (action == KeyEvent.ACTION_UP) {
- if (isPowerPressed && !isPowerLongPressed) try {
- if (isTorchEnabled(mContext)) setTorch(mContext, false);
- if (Helpers.mWakeLock != null && Helpers.mWakeLock.isHeld()) Helpers.mWakeLock.release();
- XposedHelpers.callMethod(mPowerManager, "wakeUp", SystemClock.uptimeMillis());
- param.setResult(0);
- } catch (Throwable t) {
- XposedBridge.log(t);
- } else if (wasRaise2WakeEnabled && !isTorchEnabled(mContext)) {
- wasRaise2WakeEnabled = false;
- Settings.System.putInt(mContext.getContentResolver(), "pick_up_gesture_wakeup_mode", 1);
- }
- isPowerPressed = false;
- isWaitingForPowerLongPressed = false;
- }
- }
- });
- }
-
- public static void VolumeMediaButtonsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "interceptKeyBeforeQueueing", KeyEvent.class, int.class, new MethodHook() {
- @Override
- @SuppressLint("MissingPermission")
- protected void before(final MethodHookParam param) throws Throwable {
- // Power and volkeys are pressed at the same time
- if (isPowerPressed) return;
- final KeyEvent keyEvent = (KeyEvent)param.args[0];
-
- int keycode = keyEvent.getKeyCode();
- int action = keyEvent.getAction();
- int flags = keyEvent.getFlags();
-
- // Ignore repeated KeyEvents simulated on volume Key Up
- if ((flags & KeyEvent.FLAG_VIRTUAL_HARD_KEY) == KeyEvent.FLAG_VIRTUAL_HARD_KEY) return;
- if ((flags & KeyEvent.FLAG_FROM_SYSTEM) != KeyEvent.FLAG_FROM_SYSTEM || (keycode != KeyEvent.KEYCODE_VOLUME_UP && keycode != KeyEvent.KEYCODE_VOLUME_DOWN)) return;
-
- // Volume long press
- final Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- final PowerManager mPowerManager = (PowerManager)XposedHelpers.getObjectField(param.thisObject, "mPowerManager");
- if (mPowerManager.isInteractive()) return;
- //Helpers.log("VolumeMediaButtonsHook", "interceptKeyBeforeQueueing: KeyCode: " + keyEvent.getKeyCode() + " | Action: " + keyEvent.getAction() + " | RepeatCount: " + keyEvent.getRepeatCount()+ " | Flags: " + keyEvent.getFlags() + " | " + mPowerManager.isInteractive());
- if (action == KeyEvent.ACTION_DOWN) {
- isVolumePressed = true;
- isVolumeLongPressed = false;
-
- mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- // Post only one delayed runnable that waits for long press timeout
- if (mHandler != null && !isWaitingForVolumeLongPressed)
- mHandler.postDelayed(new Runnable() {
- public void run() {
- if (isVolumePressed && GlobalActions.isMediaActionsAllowed(mContext)) {
- isVolumeLongPressed = true;
- switch (keyEvent.getKeyCode()) {
- case KeyEvent.KEYCODE_VOLUME_UP:
- int pref_mediaUp = Integer.parseInt(Helpers.getSharedStringPref(mContext, "pref_key_controls_volumemedia_up", "0"));
- if (pref_mediaUp == 0) break;
- GlobalActions.sendDownUpKeyEvent(mContext, pref_mediaUp, true);
- break;
- case KeyEvent.KEYCODE_VOLUME_DOWN:
- int pref_mediaDown = Integer.parseInt(Helpers.getSharedStringPref(mContext, "pref_key_controls_volumemedia_down", "0"));
- if (pref_mediaDown == 0) break;
- GlobalActions.sendDownUpKeyEvent(mContext, pref_mediaDown, true);
- break;
- default:
- break;
- }
- }
- isVolumePressed = false;
- isWaitingForVolumeLongPressed = false;
- }
- }, ViewConfiguration.getLongPressTimeout());
-
- isWaitingForVolumeLongPressed = true;
- param.setResult(0);
- }
-
- if (action == KeyEvent.ACTION_UP) {
- isVolumePressed = false;
- // Kill all callbacks (removing only posted Runnable is not working... no idea)
- if (mHandler != null) mHandler.removeCallbacksAndMessages(null);
- if (!isVolumeLongPressed) {
- AudioManager am = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
- TelecomManager tm = (TelecomManager)mContext.getSystemService(Context.TELECOM_SERVICE);
- WakeLock mBroadcastWakeLock = (WakeLock)XposedHelpers.getObjectField(param.thisObject, "mBroadcastWakeLock");
- int k = AudioManager.ADJUST_RAISE;
- if (keycode != KeyEvent.KEYCODE_VOLUME_UP) k = AudioManager.ADJUST_LOWER;
- mBroadcastWakeLock.acquire(5000);
- // If music stream is playing, adjust its volume
- if (am.isMusicActive()) am.adjustStreamVolume(AudioManager.STREAM_MUSIC, k, 0);
- // If voice call is active while screen off by proximity sensor, adjust its volume
- else if (tm.isInCall()) am.adjustStreamVolume(AudioManager.STREAM_VOICE_CALL, k, 0);
- // If volume keys to wake option active, wake the device
- else if (Settings.System.getInt(mContext.getContentResolver(), "volumekey_wake_screen", 0) == 1)
- XposedHelpers.callMethod(mPowerManager, "wakeUp", SystemClock.uptimeMillis());
- if (mBroadcastWakeLock.isHeld()) mBroadcastWakeLock.release();
- }
- param.setResult(0);
- isWaitingForVolumeLongPressed = false;
- }
- }
- });
- }
-
- public static void VolumeMediaPlayerHook() {
- Helpers.findAndHookMethod("android.media.MediaPlayer", null, "pause", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- Context mContext = Helpers.findContext();
- int mStreamType = (int)XposedHelpers.findMethodExact(XposedHelpers.findClass("android.media.MediaPlayer", null), "getAudioStreamType").invoke(param.thisObject);
- if (mContext != null && (mStreamType == AudioManager.STREAM_MUSIC || mStreamType == 0x80000000)) {
- Intent intent = new Intent(GlobalActions.ACTION_PREFIX + "SaveLastMusicPausedTime");
- intent.setPackage("android");
- mContext.sendBroadcast(intent);
- }
- }
- });
- }
-
- public static void VolumeCursorHook() {
- Helpers.findAndHookMethod("android.inputmethodservice.InputMethodService", null, "onKeyDown", int.class, KeyEvent.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- InputMethodService ims = (InputMethodService)param.thisObject;
- int code = (int)param.args[0];
- if ((code == KeyEvent.KEYCODE_VOLUME_UP || code == KeyEvent.KEYCODE_VOLUME_DOWN) && ims.isInputViewShown()) {
- String pkgName = Settings.Global.getString(ims.getContentResolver(), Helpers.modulePkg + ".foreground.package");
- if (MainModule.mPrefs.getStringSet("controls_volumecursor_apps").contains(pkgName)) return;
- boolean swapDir = MainModule.mPrefs.getBoolean("controls_volumecursor_reverse");
- ims.sendDownUpKeyEvents(code == (swapDir ? KeyEvent.KEYCODE_VOLUME_DOWN : KeyEvent.KEYCODE_VOLUME_UP) ? KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT);
- param.setResult(true);
- }
- }
- });
-
- Helpers.findAndHookMethod("android.inputmethodservice.InputMethodService", null, "onKeyUp", int.class, KeyEvent.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- InputMethodService ims = (InputMethodService)param.thisObject;
- int code = (int)param.args[0];
- if ((code == KeyEvent.KEYCODE_VOLUME_UP || code == KeyEvent.KEYCODE_VOLUME_DOWN) && ims.isInputViewShown()) {
- String pkgName = Settings.Global.getString(ims.getContentResolver(), Helpers.modulePkg + ".foreground.package");
- if (!MainModule.mPrefs.getStringSet("controls_volumecursor_apps").contains(pkgName)) param.setResult(true);
- }
- }
- });
- }
-
- private static boolean handleNavBarAction(Context context, String key) {
- int action = Helpers.getSharedIntPref(context, key + "_action", 1);
- if (action >= 85 && action <= 88) {
- if (GlobalActions.isMediaActionsAllowed(context))
- GlobalActions.sendDownUpKeyEvent(context, action, false);
- return true;
- } else if (action == 1) {
- try {
- Toast.makeText(Helpers.getModuleContext(context), R.string.controls_navbar_noaction, Toast.LENGTH_SHORT).show();
- } catch (Throwable ignore) {}
- return false;
- } else {
- return GlobalActions.handleAction(context, key);
- }
- }
-
- private static void addCustomNavBarKeys(boolean isVertical, Context mContext, LinearLayout navButtons, Class> kbrCls) {
- String pkgName = "com.android.systemui";
- float density = mContext.getResources().getDisplayMetrics().density;
- int two = Math.round(2 * density);
- int margin = Math.round(MainModule.mPrefs.getInt("controls_navbarmargin", 0) * density);
-
- Drawable dot1;
- Drawable dot2;
- try {
- Context modCtx = Helpers.getModuleContext(mContext);
- Resources modRes = Helpers.getModuleRes(mContext);
- dot1 = modRes.getDrawable(R.drawable.ic_sysbar_dot_bottomleft, modCtx.getTheme());
- dot2 = modRes.getDrawable(R.drawable.ic_sysbar_dot_topright, modCtx.getTheme());
- } catch (Throwable t) {
- XposedBridge.log(t);
- return;
- }
-
- int diff1 = (dot1.getIntrinsicWidth() - dot1.getIntrinsicHeight()) / 2;
- int diff2 = (dot2.getIntrinsicWidth() - dot2.getIntrinsicHeight()) / 2;
- LinearLayout leftbtn = new LinearLayout(mContext);
- ImageView left = new ImageView(mContext);
-
- LinearLayout.LayoutParams lplc;
- if (isVertical)
- lplc = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- else
- lplc = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT);
- left.setLayoutParams(lplc);
-
- LinearLayout.LayoutParams lpl = new LinearLayout.LayoutParams(lplc);
- if (isVertical)
- lpl.bottomMargin += margin;
- else
- lpl.leftMargin += margin;
- leftbtn.setLayoutParams(lpl);
-
- left.setScaleType(ImageView.ScaleType.CENTER);
- left.setImageDrawable(dot1);
- left.setScaleX(0.7f);
- left.setScaleY(0.7f);
- left.setAlpha(0.9f);
- left.setPadding(isVertical ? 0 : two, isVertical ? two + diff1 : 0, isVertical ? 0 : two, isVertical ? two + diff1 : 0);
- left.setTag("custom_left" + (isVertical ? "_vert" : "_horiz"));
- if (kbrCls != null) try {
- Drawable lripple = (Drawable)kbrCls.getConstructor(Context.class, View.class).newInstance(mContext, leftbtn);
- leftbtn.setBackground(lripple);
- } catch (Throwable ignore) {}
- leftbtn.setClickable(true);
- leftbtn.setHapticFeedbackEnabled(true);
- leftbtn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- handleNavBarAction(v.getContext(), "pref_key_controls_navbarleft");
- }
- });
- leftbtn.setOnLongClickListener(new View.OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- return handleNavBarAction(v.getContext(), "pref_key_controls_navbarleftlong");
- }
- });
- leftbtn.addView(left);
-
- LinearLayout rightbtn = new LinearLayout(mContext);
- ImageView right = new ImageView(mContext);
- LinearLayout.LayoutParams lprc;
- if (isVertical)
- lprc = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- else
- lprc = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT);
- right.setLayoutParams(lprc);
-
- LinearLayout.LayoutParams lpr = new LinearLayout.LayoutParams(lprc);
- if (isVertical)
- lpr.topMargin += margin;
- else
- lpr.rightMargin += margin;
- rightbtn.setLayoutParams(lpr);
-
- right.setScaleType(ImageView.ScaleType.CENTER);
- right.setImageDrawable(dot2);
- right.setScaleX(0.7f);
- right.setScaleY(0.7f);
- right.setAlpha(0.9f);
- right.setPadding(isVertical ? 0 : two, isVertical ? two + diff2 : 0, isVertical ? 0 : two, isVertical ? two + diff2 : 0);
- right.setTag("custom_right" + (isVertical ? "_vert" : "_horiz"));
- if (kbrCls != null) try {
- Drawable rripple = (Drawable)kbrCls.getConstructor(Context.class, View.class).newInstance(mContext, rightbtn);
- rightbtn.setBackground(rripple);
- } catch (Throwable ignore) {}
- rightbtn.setClickable(true);
- rightbtn.setHapticFeedbackEnabled(true);
- rightbtn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- handleNavBarAction(v.getContext(), "pref_key_controls_navbarright");
- }
- });
- rightbtn.setOnLongClickListener(new View.OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- return handleNavBarAction(v.getContext(), "pref_key_controls_navbarrightlong");
- }
- });
- rightbtn.addView(right);
-
- View startPadding = navButtons.findViewById(navButtons.getResources().getIdentifier("start_padding", "id", pkgName));
- View sidePadding = navButtons.findViewById(navButtons.getResources().getIdentifier("side_padding", "id", pkgName));
-
- LinearLayout.LayoutParams lp1 = (LinearLayout.LayoutParams)startPadding.getLayoutParams();
- LinearLayout.LayoutParams lp2 = (LinearLayout.LayoutParams)sidePadding.getLayoutParams();
-
- boolean hasLeftAction = MainModule.mPrefs.getInt("controls_navbarleft_action", 1) > 1 || MainModule.mPrefs.getInt("controls_navbarleftlong_action", 1) > 1;
- boolean hasRightAction = MainModule.mPrefs.getInt("controls_navbarright_action", 1) > 1 || MainModule.mPrefs.getInt("controls_navbarrightlong_action", 1) > 1;
-
- float part = Helpers.is11() ? 0.55f : 0.5f;
- if (isVertical) {
- if (hasRightAction) {
- navButtons.addView(rightbtn, 0);
- lp2.weight = Math.round(lp2.weight * part);
- sidePadding.setLayoutParams(lp2);
- sidePadding.setPadding(sidePadding.getPaddingLeft(), sidePadding.getPaddingTop() / 3, sidePadding.getPaddingRight(), sidePadding.getPaddingBottom());
- }
- if (hasLeftAction) {
- navButtons.addView(leftbtn, navButtons.getChildCount());
- lp1.weight = Math.round(lp1.weight * part);
- startPadding.setLayoutParams(lp1);
- }
- } else {
- if (hasLeftAction) {
- navButtons.addView(leftbtn, 0);
- lp1.weight = Math.round(lp1.weight * part);
- startPadding.setLayoutParams(lp1);
- }
- if (hasRightAction) {
- navButtons.addView(rightbtn, navButtons.getChildCount());
- lp2.weight = Math.round(lp2.weight * part);
- sidePadding.setLayoutParams(lp2);
- sidePadding.setPadding(sidePadding.getPaddingLeft(), sidePadding.getPaddingTop(), sidePadding.getPaddingRight() / 3, sidePadding.getPaddingBottom());
- }
- }
- }
-
- public static void NavBarButtonsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "createNavigationBar", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Class> kbrCls = XposedHelpers.findClassIfExists("com.android.systemui.statusbar.policy.KeyButtonRipple", lpparam.classLoader);
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (mContext == null) {
- Helpers.log("NavBarButtonsHook", "Cannot find context");
- return;
- }
- LinearLayout mNavigationBarView = (LinearLayout)XposedHelpers.getObjectField(param.thisObject, "mNavigationBarView");
- if (mNavigationBarView == null) {
- Helpers.log("NavBarButtonsHook", "Cannot find navbar layout");
- return;
- }
- ViewGroup rot0 = mNavigationBarView.findViewById(mNavigationBarView.getResources().getIdentifier("rot0", "id", lpparam.packageName));
- ViewGroup rot90 = mNavigationBarView.findViewById(mNavigationBarView.getResources().getIdentifier("rot90", "id", lpparam.packageName));
- LinearLayout navButtons0 = rot0.findViewById(mNavigationBarView.getResources().getIdentifier("nav_buttons", "id", lpparam.packageName));
- LinearLayout navButtons90 = rot90.findViewById(mNavigationBarView.getResources().getIdentifier("nav_buttons", "id", lpparam.packageName));
-
- addCustomNavBarKeys(false, mContext, navButtons0, kbrCls);
- addCustomNavBarKeys(true, mContext, navButtons90, kbrCls);
- }
- });
-
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.NavigationBarView", lpparam.classLoader, "switchSuit", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- LinearLayout navbar = (LinearLayout)param.thisObject;
- boolean isDark = (boolean)param.args[1];
- ImageView hleft = navbar.findViewWithTag("custom_left_horiz");
- ImageView vleft = navbar.findViewWithTag("custom_left_vert");
- ImageView hright = navbar.findViewWithTag("custom_right_horiz");
- ImageView vright = navbar.findViewWithTag("custom_right_vert");
-
- Context modCtx = Helpers.getModuleContext(navbar.getContext());
- Resources modRes = Helpers.getModuleRes(navbar.getContext());
- if (isDark) {
- Drawable darkImg1 = modRes.getDrawable(R.drawable.ic_sysbar_dot_bottomleft_dark, modCtx.getTheme());
- Drawable darkImg2 = modRes.getDrawable(R.drawable.ic_sysbar_dot_topright_dark, modCtx.getTheme());
- if (hleft != null) hleft.setImageDrawable(darkImg1);
- if (vleft != null) vleft.setImageDrawable(darkImg1);
- if (hright != null) hright.setImageDrawable(darkImg2);
- if (vright != null) vright.setImageDrawable(darkImg2);
- } else {
- Drawable lightImg1 = modRes.getDrawable(R.drawable.ic_sysbar_dot_bottomleft, modCtx.getTheme());
- Drawable lightImg2 = modRes.getDrawable(R.drawable.ic_sysbar_dot_topright, modCtx.getTheme());
- if (hleft != null) hleft.setImageDrawable(lightImg1);
- if (vleft != null) vleft.setImageDrawable(lightImg1);
- if (hright != null) hright.setImageDrawable(lightImg2);
- if (vright != null) vright.setImageDrawable(lightImg2);
- }
- }
- });
- }
-
- @SuppressLint("MissingPermission")
- private static boolean handleCallAction(int action) {
- TelecomManager tm = (TelecomManager)miuiPWMContext.getSystemService(Context.TELECOM_SERVICE);
- if (tm == null) return false;
- if (!tm.isInCall()) return false;
- int callState = (int)XposedHelpers.callMethod(tm, "getCallState");
- if (callState == TelephonyManager.CALL_STATE_RINGING) {
- int accept = MainModule.mPrefs.getStringAsInt("controls_fingerprint_accept", 1);
- int reject = MainModule.mPrefs.getStringAsInt("controls_fingerprint_reject", 1);
- if (action == accept) {
- XposedHelpers.callMethod(tm, "acceptRingingCall");
- return true;
- } else if (action == reject) {
- XposedHelpers.callMethod(tm, "endCall");
- return true;
- }
- } else if (callState == TelephonyManager.CALL_STATE_OFFHOOK) {
- int hangup = MainModule.mPrefs.getStringAsInt("controls_fingerprint_hangup", 1);
- if (action == hangup) {
- XposedHelpers.callMethod(tm, "endCall");
- return true;
- }
- }
- return MainModule.mPrefs.getBoolean("controls_fingerprintskip2");
- }
-
- @SuppressLint("StaticFieldLeak")
- private static Context miuiPWMContext;
- private static Handler miuiPWMHandler;
- private static boolean hasDoubleTap = false;
- private static boolean wasScreenOn = false;
- private static boolean wasFingerprintUsed = false;
- private static boolean isFingerprintPressed = false;
- private static boolean isFingerprintLongPressed = false;
- private static boolean isFingerprintLongPressHandled = false;
- private static final Runnable singlePressFingerprint = new Runnable() {
- @Override
- public void run() {
- if (miuiPWMContext == null || miuiPWMHandler == null) return;
- miuiPWMHandler.removeCallbacks(longPressFingerprint);
- if (!handleCallAction(2)) GlobalActions.handleAction(miuiPWMContext, "pref_key_controls_fingerprint1");
- }
- };
- private static final Runnable longPressFingerprint = new Runnable() {
- @Override
- public void run() {
- if (isFingerprintPressed) {
- isFingerprintLongPressed = true;
- isFingerprintLongPressHandled = handleCallAction(4);
- Helpers.performStrongVibration(miuiPWMContext, true);
- }
- }
- };
-
- public static void FingerprintEventsHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.policy.BaseMiuiPhoneWindowManager", lpparam.classLoader, "initInternal", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- new Helpers.SharedPrefObserver(mContext, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String type = uri.getPathSegments().get(1);
- String key = uri.getPathSegments().get(2);
- if (!key.contains("pref_key_controls_fingerprint")) return;
-
- switch (type) {
- case "string":
- MainModule.mPrefs.put(key, Helpers.getSharedStringPref(mContext, key, ""));
- break;
- case "integer":
- MainModule.mPrefs.put(key, Helpers.getSharedIntPref(mContext, key, 1));
- break;
- case "boolean":
- MainModule.mPrefs.put(key, Helpers.getSharedBoolPref(mContext, key, false));
- break;
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.findAndHookMethod("com.android.server.policy.MiuiPhoneWindowManager", lpparam.classLoader, "processFingerprintNavigationEvent", KeyEvent.class, boolean.class, new MethodHook() {
- @Override
- @SuppressLint("MissingPermission")
- protected void before(MethodHookParam param) throws Throwable {
- if (MainModule.mPrefs.getBoolean("controls_fingerprintskip")) {
- Object mFocusedWindow = XposedHelpers.getObjectField(param.thisObject, "mFocusedWindow");
- if ((boolean)param.args[1] && mFocusedWindow != null) {
- String ownPkg = (String)XposedHelpers.callMethod(mFocusedWindow, "getOwningPackage");
- if ("com.android.camera".equals(ownPkg)) return;
- }
- }
-
- miuiPWMContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- miuiPWMHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
- if (miuiPWMContext == null || miuiPWMHandler == null) return;
-
- boolean isInCall = false;
- if (miuiPWMContext != null) {
- TelecomManager tm = (TelecomManager)miuiPWMContext.getSystemService(Context.TELECOM_SERVICE);
- isInCall = tm != null && tm.isInCall();
- }
-
- KeyEvent keyEvent = (KeyEvent)param.args[0];
- if (keyEvent.getKeyCode() != KeyEvent.KEYCODE_DPAD_CENTER || keyEvent.getAction() != KeyEvent.ACTION_DOWN) return;
-
- isFingerprintPressed = true;
- wasScreenOn = (boolean)XposedHelpers.callMethod(param.thisObject, "isScreenOn");
- wasFingerprintUsed = Settings.System.getInt(miuiPWMContext.getContentResolver(), "is_fingerprint_active", 0) == 1;
-
- hasDoubleTap = false;
- if (wasScreenOn && !wasFingerprintUsed) {
- int delay = MainModule.mPrefs.getInt("controls_fingerprintlong_delay", 0);
- if (isInCall) {
- int accept = MainModule.mPrefs.getStringAsInt("controls_fingerprint_accept", 1);
- int reject = MainModule.mPrefs.getStringAsInt("controls_fingerprint_reject", 1);
- int hangup = MainModule.mPrefs.getStringAsInt("controls_fingerprint_hangup", 1);
- hasDoubleTap = accept == 3 || reject == 3 || hangup == 3;
- if (accept == 4 || reject == 4 || hangup == 4)
- miuiPWMHandler.postDelayed(longPressFingerprint, delay < 200 ? ViewConfiguration.getLongPressTimeout() : delay);
- } else {
- int dtaction = MainModule.mPrefs.getInt("controls_fingerprint2_action", 1);
- hasDoubleTap = dtaction > 1;
- if (MainModule.mPrefs.getInt("controls_fingerprintlong_action", 1) > 1)
- miuiPWMHandler.postDelayed(longPressFingerprint, delay < 200 ? ViewConfiguration.getLongPressTimeout() : delay);
- }
- }
-
- if (XposedHelpers.getAdditionalInstanceField(param.thisObject, "touchTime") == null)
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "touchTime", 0L);
- }
-
- @Override
- @SuppressLint("MissingPermission")
- protected void after(MethodHookParam param) throws Throwable {
- if (MainModule.mPrefs.getBoolean("controls_fingerprintskip")) {
- Object mFocusedWindow = XposedHelpers.getObjectField(param.thisObject, "mFocusedWindow");
- if ((boolean)param.args[1] && mFocusedWindow != null) {
- String ownPkg = (String)XposedHelpers.callMethod(mFocusedWindow, "getOwningPackage");
- if ("com.android.camera".equals(ownPkg)) return;
- }
- }
-
- KeyEvent keyEvent = (KeyEvent)param.args[0];
- if (keyEvent.getKeyCode() != KeyEvent.KEYCODE_DPAD_CENTER || keyEvent.getAction() != KeyEvent.ACTION_UP) return;
-
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- long lastTouchTime = (long)XposedHelpers.getAdditionalInstanceField(param.thisObject, "touchTime");
- long currentTouchTime = currentTimeMillis();
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "touchTime", currentTouchTime);
-
- int delay = MainModule.mPrefs.getInt("controls_fingerprint2_delay", 50);
- int dttimeout = delay < 200 ? ViewConfiguration.getDoubleTapTimeout() : delay;
- if (wasScreenOn && !wasFingerprintUsed) {
- if (hasDoubleTap && currentTouchTime - lastTouchTime < dttimeout) {
- mHandler.removeCallbacks(singlePressFingerprint);
- mHandler.removeCallbacks(longPressFingerprint);
- if (!handleCallAction(3)) GlobalActions.handleAction(mContext, "pref_key_controls_fingerprint2");
- wasScreenOn = false;
- } else if (isFingerprintLongPressed) {
- if (!isFingerprintLongPressHandled) GlobalActions.handleAction(mContext, "pref_key_controls_fingerprintlong");
- isFingerprintLongPressHandled = false;
- wasScreenOn = false;
- } else {
- mHandler.removeCallbacks(longPressFingerprint);
- mHandler.removeCallbacks(singlePressFingerprint);
- if (hasDoubleTap)
- mHandler.postDelayed(singlePressFingerprint, dttimeout);
- else
- mHandler.post(singlePressFingerprint);
- }
- }
-
- isFingerprintLongPressed = false;
- isFingerprintPressed = false;
- }
- });
-
- String fpService = Helpers.isQPlus() ? "com.android.server.biometrics.BiometricServiceBase" : "com.android.server.fingerprint.FingerprintService";
- Helpers.hookAllMethods(fpService, lpparam.classLoader, "startClient", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Settings.System.putInt(mContext.getContentResolver(), "is_fingerprint_active", 1);
- }
- });
-
- Helpers.hookAllMethods(fpService, lpparam.classLoader, "removeClient", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Settings.System.putInt(mContext.getContentResolver(), "is_fingerprint_active", 0);
- }
- });
- }
-
-// public static void FingerprintHook(LoadPackageParam lpparam) {
-// Helpers.findAndHookMethod("com.android.server.devicepolicy.DevicePolicyManagerService", lpparam.classLoader, "reportSuccessfulFingerprintAttempt", int.class, new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// Helpers.log("reportSuccessfulFingerprintAttempt");
-// Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
-// }
-// });
-// }
-
- public static void FSGesturesSysHook() {
- Helpers.findAndHookMethod("android.provider.MiuiSettings$Global", null, "getBoolean", ContentResolver.class, String.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (!"force_fsg_nav_bar".equals(param.args[1])) return;
-
- ContentResolver resolver = (ContentResolver)param.args[0];
- Context mContext = (Context)XposedHelpers.getObjectField(resolver, "mContext");
-
- if ("com.android.systemui".equals(mContext.getPackageName()))
- for (StackTraceElement el: Thread.currentThread().getStackTrace())
- if ("com.android.systemui.recents.BaseRecentsImpl".equals(el.getClassName())) {
- param.setResult(true);
- return;
- }
- }
- });
- }
-
- public static void FSGesturesHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.fsgesture.GestureStubView", lpparam.classLoader, "onTouchEvent", MotionEvent.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- MotionEvent event = (MotionEvent)param.args[0];
- if (event.getAction() != MotionEvent.ACTION_DOWN) return;
- View stub = (View)param.thisObject;
- String pkgName = Settings.Global.getString(stub.getContext().getContentResolver(), Helpers.modulePkg + ".foreground.package");
- if (MainModule.mPrefs.getStringSet("controls_fsg_horiz_apps").contains(pkgName)) param.setResult(false);
- }
- });
- }
-
- @SuppressLint("StaticFieldLeak")
- private static Context basePWMContext;
- private static Object basePWMObject;
- private static Method markShortcutTriggered;
-
- private static final Runnable mBackLongPressAction = new Runnable() {
- @Override
- public void run() {
- try {
- if (basePWMContext == null || basePWMObject == null) return;
- if (GlobalActions.handleAction(basePWMContext, "pref_key_controls_backlong")) Helpers.performStrongVibration(basePWMContext);
- if (Helpers.getSharedIntPref(basePWMContext, "pref_key_controls_backlong_action", 1) != 1) markShortcutTriggered.invoke(basePWMObject);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- private static final Runnable mHomeLongPressAction = new Runnable() {
- @Override
- public void run() {
- try {
- if (basePWMContext == null || basePWMObject == null) return;
- if (GlobalActions.handleAction(basePWMContext, "pref_key_controls_homelong")) Helpers.performStrongVibration(basePWMContext);
- if (Helpers.getSharedIntPref(basePWMContext, "pref_key_controls_homelong_action", 1) != 1) markShortcutTriggered.invoke(basePWMObject);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- private static final Runnable mMenuLongPressAction = new Runnable() {
- @Override
- public void run() {
- try {
- if (basePWMContext == null || basePWMObject == null) return;
- if (GlobalActions.handleAction(basePWMContext, "pref_key_controls_menulong")) Helpers.performStrongVibration(basePWMContext);
- if (Helpers.getSharedIntPref(basePWMContext, "pref_key_controls_menulong_action", 1) != 1) markShortcutTriggered.invoke(basePWMObject);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
-
- public static void NavBarActionsHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.policy.BaseMiuiPhoneWindowManager", lpparam.classLoader, "initInternal", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- new Helpers.SharedPrefObserver(mContext, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String type = uri.getPathSegments().get(1);
- if (!type.equals("integer")) return;
- String key = uri.getPathSegments().get(2);
- if (key.contains("pref_key_controls_backlong") || key.contains("pref_key_controls_homelong") || key.contains("pref_key_controls_menulong")) {
- if (key.contains("_action"))
- MainModule.mPrefs.put(key, Helpers.getSharedIntPref(mContext, key, 1));
- else if (key.contains("_toggle"))
- MainModule.mPrefs.put(key, Helpers.getSharedIntPref(mContext, key, 0));
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.hookAllMethods("com.android.server.policy.BaseMiuiPhoneWindowManager", lpparam.classLoader, "postKeyLongPress", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if (basePWMObject == null) basePWMObject = param.thisObject;
- if (basePWMContext == null) basePWMContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (markShortcutTriggered == null) markShortcutTriggered = XposedHelpers.findMethodExact("com.android.server.policy.BaseMiuiPhoneWindowManager", lpparam.classLoader, "markShortcutTriggered");
-
- int key = (int)param.args[0];
- if (key == KeyEvent.KEYCODE_BACK && MainModule.mPrefs.getInt("controls_backlong_action", 1) > 1) {
- ((Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler")).postDelayed(mBackLongPressAction, ViewConfiguration.getLongPressTimeout());
- param.setResult(null);
- } else if (key == KeyEvent.KEYCODE_HOME && MainModule.mPrefs.getInt("controls_homelong_action", 1) > 1) {
- ((Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler")).postDelayed(mHomeLongPressAction, ViewConfiguration.getLongPressTimeout());
- param.setResult(null);
- } else if (key == KeyEvent.KEYCODE_APP_SWITCH && MainModule.mPrefs.getInt("controls_menulong_action", 1) > 1) {
- ((Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler")).postDelayed(mMenuLongPressAction, ViewConfiguration.getLongPressTimeout());
- param.setResult(null);
- }
- }
- });
-
- Helpers.hookAllMethods("com.android.server.policy.BaseMiuiPhoneWindowManager", lpparam.classLoader, "removeKeyLongPress", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- int key = (int)param.args[0];
- if (key == KeyEvent.KEYCODE_BACK)
- ((Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler")).removeCallbacks(mBackLongPressAction);
- else if (key == KeyEvent.KEYCODE_HOME)
- ((Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler")).removeCallbacks(mHomeLongPressAction);
- else if (key == KeyEvent.KEYCODE_APP_SWITCH)
- ((Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler")).removeCallbacks(mMenuLongPressAction);
- }
- });
- }
-
- public static void NavbarHeightRes() {
- int opt = MainModule.mPrefs.getInt("controls_navbarheight", 19);
- int heightDpi = opt == 19 ? 47 : opt;
- MainModule.resHooks.setDensityReplacement("*", "dimen", "navigation_bar_height", heightDpi);
- MainModule.resHooks.setDensityReplacement("*", "dimen", "navigation_bar_height_landscape", heightDpi);
- MainModule.resHooks.setDensityReplacement("*", "dimen", "navigation_bar_frame_height", heightDpi);
- MainModule.resHooks.setDensityReplacement("*", "dimen", "navigation_bar_frame_height_landscape", heightDpi);
- MainModule.resHooks.setDensityReplacement("*", "dimen", "navigation_bar_gesture_height", heightDpi);
- MainModule.resHooks.setDensityReplacement("*", "dimen", "navigation_bar_width", heightDpi);
- MainModule.resHooks.setDensityReplacement("com.android.systemui", "dimen", "navigation_bar_size", heightDpi);
- //MainModule.resHooks.setDensityReplacement("com.android.systemui", "dimen", "navigation_extra_key_width", heightDpi);
- }
-
- public static void FingerprintHapticSuccessHook(LoadPackageParam lpparam) {
- String authClient = Helpers.isQPlus() ? "com.android.server.biometrics.AuthenticationClient" : "com.android.server.fingerprint.AuthenticationClient";
- Helpers.hookAllMethods(authClient, lpparam.classLoader, "onAuthenticated", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (!((boolean)param.getResult())) return;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
-// boolean isScreenOn = (boolean)XposedHelpers.callMethod(param.thisObject, "isScreenOn");
-// if (!isScreenOn) {
-// WakeLock wl = ((PowerManager)mContext.getSystemService(Context.POWER_SERVICE)).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "miuizer:fingerprint_haptic_feedback");
-// wl.acquire(2000);
-// }
-
- boolean ignoreSystem = MainModule.mPrefs.getBoolean("controls_fingerprintsuccess_ignore");
- int opt = Integer.parseInt(MainModule.mPrefs.getString("controls_fingerprintsuccess", "1"));
- if (opt == 2)
- Helpers.performLightVibration(mContext, ignoreSystem);
- else if (opt == 3)
- Helpers.performStrongVibration(mContext, ignoreSystem);
- }
- });
- }
-
- public static void FingerprintHapticFailureHook(LoadPackageParam lpparam) {
- if (Helpers.isNougat())
- Helpers.findAndHookMethod("com.android.server.fingerprint.FingerprintUtils", lpparam.classLoader, "vibrateFingerprintError", Context.class, XC_MethodReplacement.returnConstant(null));
- else {
- String monitorClass = Helpers.isQPlus() ? "com.android.server.biometrics.ClientMonitor" : "com.android.server.fingerprint.ClientMonitor";
- Helpers.hookAllMethods("com.android.server.VibratorService", lpparam.classLoader, "vibrate", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
- for (StackTraceElement el : stackTrace)
- if (monitorClass.equals(el.getClassName()) && "vibrateError".equals(el.getMethodName())) {
- param.setResult(null);
- return;
- }
- }
- });
- }
- }
-
- public static void FingerprintScreenOnHook(LoadPackageParam lpparam) {
- String authClient = Helpers.isQPlus() ? "com.android.server.biometrics.AuthenticationClient" : "com.android.server.fingerprint.AuthenticationClient";
- Helpers.hookAllMethods(authClient, lpparam.classLoader, "onAuthenticated", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if ((boolean)param.getResult()) return;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- PowerManager mPowerManager = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
- if (mPowerManager.isInteractive()) return;
- if (!GlobalActions.wakeUp(mContext)) Helpers.log("FingerprintScreenOnHook", "Failed to wake up device");
- }
- });
- }
-
- public static void BackGestureAreaHeightHook(LoadPackageParam lpparam, boolean isNative) {
- if (!Helpers.findAndHookMethodSilently(isNative ? "com.android.systemui.fsgesture.GestureStubView" : "com.miui.home.recents.GestureStubView", lpparam.classLoader, "getGestureStubWindowParam", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- WindowManager.LayoutParams lp = (WindowManager.LayoutParams)param.getResult();
- int pct = MainModule.mPrefs.getInt("controls_fsg_coverage", 60);
- lp.height = Math.round(lp.height / 60.0f * pct);
- param.setResult(lp);
- }
- })) if (isNative) Helpers.log("BackGestureAreaHeightHook", "Cannot hook GestureStubView");
- }
-
- public static void BackGestureAreaWidthHook(LoadPackageParam lpparam, boolean isNative) {
- if (!Helpers.findAndHookMethodSilently(isNative ? "com.android.systemui.fsgesture.GestureStubView" : "com.miui.home.recents.GestureStubView", lpparam.classLoader, "initScreenSizeAndDensity", int.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- int pct = MainModule.mPrefs.getInt("controls_fsg_width", 100);
- if (pct == 100) return;
- int mGestureStubDefaultSize = XposedHelpers.getIntField(param.thisObject, "mGestureStubDefaultSize");
- int mGestureStubSize = XposedHelpers.getIntField(param.thisObject, "mGestureStubSize");
- mGestureStubDefaultSize = Math.round(mGestureStubDefaultSize * pct / 100f);
- mGestureStubSize = Math.round(mGestureStubSize * pct / 100f);
- XposedHelpers.setIntField(param.thisObject, "mGestureStubDefaultSize", mGestureStubDefaultSize);
- XposedHelpers.setIntField(param.thisObject, "mGestureStubSize", mGestureStubSize);
- }
- })) if (isNative) Helpers.log("BackGestureAreaWidthHook", "Cannot hook GestureStubView1");
-
- if (!Helpers.findAndHookMethodSilently(isNative ? "com.android.systemui.fsgesture.GestureStubView" : "com.miui.home.recents.GestureStubView", lpparam.classLoader, "setSize", int.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- int pct = MainModule.mPrefs.getInt("controls_fsg_width", 100);
- if (pct == 100) return;
- int mGestureStubDefaultSize = XposedHelpers.getIntField(param.thisObject, "mGestureStubDefaultSize");
- if ((int)param.args[0] == mGestureStubDefaultSize) return;
- param.args[0] = Math.round((int)param.args[0] * pct / 100f);
- }
- })) if (isNative) Helpers.log("BackGestureAreaWidthHook", "Cannot hook GestureStubView2");
- }
-
- public static void HideNavBarHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "addNavigationBar", XC_MethodReplacement.DO_NOTHING);
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "changeNavBarViewState", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- XposedHelpers.callMethod(param.thisObject, "removeNavBarView");
- XposedHelpers.callMethod(param.thisObject, "updateStatusBarPading");
- param.setResult(null);
- }
- });
- }
-
- public static void ImeBackAltIconHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "setImeWindowStatus", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Object mNavigationBarView = XposedHelpers.getObjectField(param.thisObject, "mNavigationBarView");
- if (mNavigationBarView != null) XposedHelpers.callMethod(mNavigationBarView, "setNavigationIconHints", param.args[1], false);
- }
- });
- }
-
- public static void PowerDoubleTapActionHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.policy.BaseMiuiPhoneWindowManager", lpparam.classLoader, "launchApp", Intent.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Intent intent = (Intent)param.args[0];
- if (intent == null) return;
- if (!"android.media.action.STILL_IMAGE_CAMERA".equals(intent.getAction())) return;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (GlobalActions.handleAction(mContext, "pref_key_controls_powerdt", true)) param.setResult(true);
- }
- });
- }
-
- public static void NoScreenshotChordRes() {
- MainModule.resHooks.setObjectReplacement("android", "bool", "config_enableScreenshotChord", false);
- }
-
- public static void NoFingerprintWakeHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.policy.MiuiPhoneWindowManager", lpparam.classLoader, "processBackFingerprintDpcenterEvent", KeyEvent.class, boolean.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- boolean isScreenOn = (boolean)param.args[1];
- if (!isScreenOn) param.setResult(null);
- }
- });
- }
-
- public static void AssistGestureActionHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.assist.AssistManager", lpparam.classLoader, "startAssist", Bundle.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- Bundle bundle = (Bundle)param.args[0];
- if (bundle == null || bundle.getInt("triggered_by", 0) != 83 || bundle.getInt("invocation_type", 0) != 1) return;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (GlobalActions.handleAction(mContext, "pref_key_controls_fsg_assist")) {
- Helpers.performLightVibration(mContext);
- param.setResult(null);
- }
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.assist.AssistManager", lpparam.classLoader, "startAssist", Bundle.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- Bundle bundle = (Bundle)param.args[0];
- if (bundle == null || bundle.getInt("triggered_by", 0) != 83 || bundle.getInt("invocation_type", 0) != 1) return;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (GlobalActions.handleAction(mContext, "pref_key_controls_fsg_assist")) {
- Helpers.performLightVibration(mContext);
- param.setResult(null);
- }
- }
- });
-
- Helpers.hookAllConstructors("com.android.systemui.assist.ui.DefaultUiController", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)param.args[0];
- Handler mHandler = new Handler(mContext.getMainLooper());
-
- new Helpers.SharedPrefObserver(mContext, mHandler, "pref_key_controls_fsg_assist_action", 1) {
- @Override
- public void onChange(String name, int defValue) {
- Object mInvocationLightsView = XposedHelpers.getObjectField(param.thisObject, "mInvocationLightsView");
- if (mInvocationLightsView == null) return;
- int opt = Helpers.getSharedIntPref(mContext, name, defValue);
- if (opt > 1)
- XposedHelpers.callMethod(mInvocationLightsView, "setColors", Color.parseColor("#424A60"), Color.parseColor("#EC7C6D"), Color.parseColor("#EC7C6D"), Color.parseColor("#424A60"));
- else
- XposedHelpers.callMethod(mInvocationLightsView, "setColors", -16776961, -65536, -256, -16711936);
- }
- }.onChange(false);
- }
- });
- }
-
-// public static void AIButtonHook(LoadPackageParam lpparam) {
-// Helpers.findAndHookMethod("com.android.server.policy.BaseMiuiPhoneWindowManager", lpparam.classLoader, "startAiKeyService", String.class, new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// Helpers.log("AIButtonHook", "startAiKeyService: " + param.args[0]);
-// }
-// });
-// }
-
-// public static void SwapVolumeKeysHook(LoadPackageParam lpparam) {
-// Helpers.findAndHookMethod("com.android.server.audio.AudioService", lpparam.classLoader, "adjustSuggestedStreamVolume", int.class, int.class, int.class, String.class, String.class, int.class, new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// //Helpers.log("adjustStreamVolume: " + String.valueOf(param.args[0]) + ", " + String.valueOf(param.args[1]) + ", " + String.valueOf(param.args[2]) + ", " + String.valueOf(param.args[3]) + ", " + String.valueOf(param.args[4]) + ", " + String.valueOf(param.args[5]));
-// if ((Integer)param.args[0] != 0) try {
-// Context context = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
-// int rotation = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
-// if (rotation == Surface.ROTATION_90) param.args[0] = -1 * (Integer)param.args[0];
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// }
-// }
-// });
-// }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/mods/GlobalActions.java b/app/src/main/java/name/mikanoshi/customiuizer/mods/GlobalActions.java
deleted file mode 100644
index 86fc1153..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/mods/GlobalActions.java
+++ /dev/null
@@ -1,1713 +0,0 @@
-package name.mikanoshi.customiuizer.mods;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.ActivityManager.RecentTaskInfo;
-import android.app.Application;
-import android.app.Instrumentation;
-import android.bluetooth.BluetoothAdapter;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.graphics.LinearGradient;
-import android.graphics.Shader;
-import android.graphics.Typeface;
-import android.media.AudioManager;
-import android.net.wifi.WifiManager;
-import android.nfc.NfcAdapter;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.Process;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.preference.PreferenceActivity.Header;
-import android.provider.Settings;
-import android.telephony.TelephonyManager;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.WindowManager;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-
-import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
-import de.robv.android.xposed.XposedBridge;
-import de.robv.android.xposed.XposedHelpers;
-
-import miui.os.SystemProperties;
-
-import name.mikanoshi.customiuizer.GateWaySettings;
-import name.mikanoshi.customiuizer.MainModule;
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.utils.Helpers;
-import name.mikanoshi.customiuizer.utils.Helpers.MethodHook;
-
-import static de.robv.android.xposed.XposedHelpers.findClass;
-import static de.robv.android.xposed.XposedHelpers.findClassIfExists;
-import static de.robv.android.xposed.XposedHelpers.findField;
-import static de.robv.android.xposed.XposedHelpers.findMethodExact;
-import static java.lang.System.currentTimeMillis;
-
-@SuppressWarnings("WeakerAccess")
-public class GlobalActions {
-
- public static Object mStatusBar = null;
-// public static FloatingSelector floatSel = null;
- public static final String ACTION_PREFIX = "name.mikanoshi.customiuizer.mods.action.";
- public static final String EVENT_PREFIX = "name.mikanoshi.customiuizer.mods.event.";
-
- public static boolean handleAction(Context context, String key) {
- return handleAction(context, key, false);
- }
-
- public static boolean handleAction(Context context, String key, boolean skipLock) {
- if (key == null || key.isEmpty()) return false;
- int action = Helpers.getSharedIntPref(context, key + "_action", 1);
- if (action <= 1) return false;
- if (action >= 85 && action <= 88) {
- if (GlobalActions.isMediaActionsAllowed(context))
- GlobalActions.sendDownUpKeyEvent(context, action, false);
- return true;
- }
- switch (action) {
- case 2: return expandNotifications(context);
- case 3: return expandEQS(context);
- case 4: return lockDevice(context);
- case 5: return goToSleep(context);
- case 6: return takeScreenshot(context);
- case 7: return openRecents(context);
- case 8: return launchAppIntent(context, key, skipLock);
- case 9: return launchShortcutIntent(context, key, skipLock);
- case 20: return launchActivityIntent(context, key, skipLock);
- case 10: return toggleThis(context, Helpers.getSharedIntPref(context, key + "_toggle", 0));
- case 11: return switchToPrevApp(context);
- case 12: return openPowerMenu(context);
- case 13: return clearMemory(context);
- case 14: return toggleColorInversion(context);
- case 15: return goBack(context);
- case 16: return simulateMenu(context);
- case 17: return openVolumeDialog(context);
- case 18: return volumeUp(context);
- case 19: return volumeDown(context);
- case 21: return switchKeyboard(context);
- case 22: return switchOneHandedLeft(context);
- case 23: return switchOneHandedRight(context);
- case 24: return forceClose(context);
- default: return false;
- }
- }
-
- public static int getActionResId(int action) {
- switch (action) {
- case 0:
- case 1: return R.string.notselected;
- case 2: return R.string.array_global_actions_notif;
- case 3: return R.string.array_global_actions_eqs;
- case 4: return R.string.array_global_actions_lock;
- case 5: return R.string.array_global_actions_sleep;
- case 6: return R.string.array_global_actions_screenshot;
- case 7: return R.string.array_global_actions_recents;
- case 11: return R.string.array_global_actions_back;
- case 12: return R.string.array_global_actions_powermenu_short;
- case 13: return R.string.array_global_actions_clearmemory;
- case 14: return R.string.array_global_actions_invertcolors;
- case 15: return R.string.array_global_actions_goback;
- case 16: return R.string.array_global_actions_menu;
- case 17: return R.string.array_global_actions_volume;
- case 18: return R.string.array_global_actions_volume_up;
- case 19: return R.string.array_global_actions_volume_down;
- case 21: return R.string.array_global_actions_switchkeyboard;
- case 22: return R.string.array_global_actions_onehanded_left;
- case 23: return R.string.array_global_actions_onehanded_right;
- case 24: return R.string.array_global_actions_forceclose;
- default: return 0;
- }
- }
-
- private static final BroadcastReceiver mSBReceiver = new BroadcastReceiver() {
- @SuppressLint("WrongConstant")
- public void onReceive(final Context context, Intent intent) {
- try {
- Resources modRes = Helpers.getModuleRes(context);
- String action = intent.getAction();
- if (action == null) return;
-
-// if (action.equals(ACTION_PREFIX + "ShowQuickRecents")) {
-// if (floatSel == null) floatSel = new FloatingSelector(context);
-// floatSel.show();
-// } else if (action.equals(ACTION_PREFIX + "HideQuickRecents")) {
-// if (floatSel != null) floatSel.hide();
-// }
-
- if (action.equals(ACTION_PREFIX + "RestartSystemUI")) {
- Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);
- }
-
- if (action.equals(ACTION_PREFIX + "CopyToExternal")) try {
- String dir = Environment.getExternalStorageDirectory().getAbsolutePath() + Helpers.externalFolder;
- new File(dir).mkdirs();
-
- int copyAction = intent.getIntExtra("action", 0);
- if (copyAction == 1) {
- Helpers.copyFile(intent.getStringExtra("from"), dir + Helpers.wallpaperFile);
- Intent lockIntent = new Intent("miui.intent.action.SET_LOCK_WALLPAPER");
- lockIntent.setPackage("com.android.thememanager");
- lockIntent.putExtra("lockWallpaperPath", dir + Helpers.wallpaperFile);
- context.sendBroadcast(lockIntent);
- } else if (copyAction == 2) {
- File xposedVersion = new File(dir + Helpers.versionFile);
- xposedVersion.createNewFile();
- try (OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(xposedVersion, false))) {
- out.write(intent.getStringExtra("data"));
- }
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- if (action.equals(ACTION_PREFIX + "CollectXposedLog")) try {
- String errorLogPath = Helpers.getXposedInstallerErrorLog(context);
- if (errorLogPath != null)
- try (InputStream in = new FileInputStream(errorLogPath)) {
- String dir = Environment.getExternalStorageDirectory().getAbsolutePath() + Helpers.externalFolder;
- new File(dir).mkdirs();
- File sdcardLog = new File(dir + Helpers.logFile);
- sdcardLog.createNewFile();
- try (OutputStream out = new FileOutputStream(sdcardLog, false)) {
- byte[] buf = new byte[1024];
- int len;
- while ((len = in.read(buf)) > 0) out.write(buf, 0, len);
- }
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- if (action.equals(ACTION_PREFIX + "ClearMemory")) {
- Intent clearIntent = new Intent("com.android.systemui.taskmanager.Clear");
- clearIntent.putExtra("show_toast", true);
- //clearIntent.putExtra("clean_type", -1);
- context.sendBroadcast(clearIntent);
- }
-
- if (mStatusBar != null) {
- if (action.equals(ACTION_PREFIX + "ExpandNotifications")) try {
- Object mNotificationPanel = XposedHelpers.getObjectField(mStatusBar, "mNotificationPanel");
- boolean mPanelExpanded = (boolean)XposedHelpers.getObjectField(mNotificationPanel, "mPanelExpanded");
- boolean mQsExpanded = (boolean)XposedHelpers.getObjectField(mNotificationPanel, "mQsExpanded");
- boolean expandOnly = intent.getBooleanExtra("expand_only", false);
- if (mPanelExpanded) {
- if (!expandOnly)
- if (mQsExpanded)
- XposedHelpers.callMethod(mStatusBar, "closeQs");
- else
- XposedHelpers.callMethod(mStatusBar, "animateCollapsePanels");
- } else {
- XposedHelpers.callMethod(mStatusBar, "animateExpandNotificationsPanel");
- }
- } catch (Throwable t) {
- // Expand only
- long token = Binder.clearCallingIdentity();
- XposedHelpers.callMethod(context.getSystemService("statusbar"), "expandNotificationsPanel");
- Binder.restoreCallingIdentity(token);
- }
-
- if (action.equals(ACTION_PREFIX + "ExpandSettings")) try {
- boolean forceExpand = intent.getBooleanExtra("forceExpand", false);
- if (Helpers.is12()) {
- Object controller = XposedHelpers.callStaticMethod(findClass("com.android.systemui.Dependency", context.getClassLoader()), "get", findClassIfExists("com.android.systemui.miui.statusbar.policy.ControlPanelController", context.getClassLoader()));
- boolean isUseControlCenter = (boolean)XposedHelpers.callMethod(controller, "isUseControlCenter");
- if (isUseControlCenter) {
- if (forceExpand || (boolean)XposedHelpers.callMethod(controller, "isQSFullyCollapsed"))
- XposedHelpers.callMethod(controller, "openPanel");
- else
- XposedHelpers.callMethod(controller, "collapsePanel", true);
- return;
- }
- }
-
- Object mNotificationPanel = XposedHelpers.getObjectField(mStatusBar, "mNotificationPanel");
- boolean mPanelExpanded = (boolean)XposedHelpers.getObjectField(mNotificationPanel, "mPanelExpanded");
- boolean mQsExpanded = (boolean)XposedHelpers.getObjectField(mNotificationPanel, "mQsExpanded");
- if (!forceExpand && mPanelExpanded) {
- if (mQsExpanded)
- XposedHelpers.callMethod(mStatusBar, "animateCollapsePanels");
- else
- XposedHelpers.callMethod(mNotificationPanel, "setQsExpanded", true);
- } else {
- XposedHelpers.callMethod(mStatusBar, "animateExpandSettingsPanel", (Object)null);
- }
- } catch (Throwable t) {
- // Expand only
- long token = Binder.clearCallingIdentity();
- XposedHelpers.callMethod(context.getSystemService("statusbar"), "expandSettingsPanel");
- Binder.restoreCallingIdentity(token);
- }
-
- if (action.equals(ACTION_PREFIX + "OpenRecents")) try {
- Object mRecents = XposedHelpers.getObjectField(mStatusBar, "mRecents");
- XposedHelpers.callMethod(mRecents, "toggleRecentApps");
- } catch (Throwable t) {
- // Open only
- Intent recents = new Intent("com.android.systemui.recents.TOGGLE_RECENTS");
- recents.setComponent(new ComponentName ("com.android.systemui", "com.android.systemui.recents.RecentsActivity"));
- recents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(recents);
- }
-
- if (action.equals(ACTION_PREFIX + "OpenVolumeDialog")) try {
- Object mVolumeComponent = XposedHelpers.getObjectField(mStatusBar, "mVolumeComponent");
- Object mExtension = XposedHelpers.getObjectField(mVolumeComponent, "mExtension");
- Object miuiVolumeDialog = XposedHelpers.callMethod(mExtension, "get");
-
- if (miuiVolumeDialog == null) {
- Helpers.log("OpenVolumeDialog", "MIUI volume dialog is NULL!");
- return;
- }
-
- Handler mHandler = (Handler)XposedHelpers.getObjectField(miuiVolumeDialog, "mHandler");
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- boolean mShowing = XposedHelpers.getBooleanField(miuiVolumeDialog, "mShowing");
- boolean mExpanded = XposedHelpers.getBooleanField(miuiVolumeDialog, "mExpanded");
- View mExpandButton = (View)XposedHelpers.getObjectField(miuiVolumeDialog, "mExpandButton");
- View.OnClickListener mClickExpand = (View.OnClickListener)XposedHelpers.getObjectField(miuiVolumeDialog, "mClickExpand");
-
- AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
- boolean isInCall = am.getMode() == AudioManager.MODE_IN_CALL || am.getMode() == AudioManager.MODE_IN_COMMUNICATION;
- if (mShowing) {
- if (mExpanded || isInCall)
- XposedHelpers.callMethod(miuiVolumeDialog, "dismissH", 1);
- else
- mClickExpand.onClick(mExpandButton);
- } else {
- Object mController = XposedHelpers.getObjectField(miuiVolumeDialog, "mController");
- if (isInCall) {
- XposedHelpers.callMethod(mController, "setActiveStream", 0);
- XposedHelpers.setBooleanField(miuiVolumeDialog, "mNeedReInit", true);
- } else if (am.isMusicActive()) {
- XposedHelpers.callMethod(mController, "setActiveStream", 3);
- XposedHelpers.setBooleanField(miuiVolumeDialog, "mNeedReInit", true);
- }
- XposedHelpers.callMethod(miuiVolumeDialog, "showH", 1);
- }
- }
- });
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- if (action.equals(ACTION_PREFIX + "ToggleHotspot")) {
- Object mHotspotController = XposedHelpers.callStaticMethod(findClass("com.android.systemui.Dependency", context.getClassLoader()), "get", findClassIfExists("com.android.systemui.statusbar.policy.HotspotController", context.getClassLoader()));
- if (mHotspotController == null) return;
- boolean mHotspotSupported = (boolean)XposedHelpers.callMethod(mHotspotController, "isHotspotSupported");
- if (!mHotspotSupported) return;
- boolean mHotspotEnabled = (boolean)XposedHelpers.callMethod(mHotspotController, "isHotspotEnabled");
- if (mHotspotEnabled)
- Toast.makeText(context, modRes.getString(R.string.toggle_hotspot_off), Toast.LENGTH_SHORT).show();
- else
- Toast.makeText(context, modRes.getString(R.string.toggle_hotspot_on), Toast.LENGTH_SHORT).show();
- XposedHelpers.callMethod(mHotspotController, "setHotspotEnabled", !mHotspotEnabled);
- }
-
- Object mToggleManager = XposedHelpers.getObjectField(mStatusBar, "mToggleManager");
- if (mToggleManager == null) return;
- if (action.equals(ACTION_PREFIX + "ToggleGPS")) {
- boolean mGpsEnable = (boolean)XposedHelpers.getObjectField(mToggleManager, "mGpsEnable");
- if (mGpsEnable)
- Toast.makeText(context, modRes.getString(R.string.toggle_gps_off), Toast.LENGTH_SHORT).show();
- else
- Toast.makeText(context, modRes.getString(R.string.toggle_gps_on), Toast.LENGTH_SHORT).show();
- XposedHelpers.callMethod(mToggleManager, "toggleGps");
- }
- if (action.equals(ACTION_PREFIX + "ToggleFlashlight")) {
- boolean mTorchEnable = (boolean)XposedHelpers.getObjectField(mToggleManager, "mTorchEnable");
- if (mTorchEnable)
- Toast.makeText(context, modRes.getString(R.string.toggle_flash_off), Toast.LENGTH_SHORT).show();
- else
- Toast.makeText(context, modRes.getString(R.string.toggle_flash_on), Toast.LENGTH_SHORT).show();
- XposedHelpers.callMethod(mToggleManager, "toggleTorch");
- }
-
- //Intent intent = new Intent("com.miui.app.ExtraStatusBarManager.action_TRIGGER_TOGGLE");
- //intent.putExtra("com.miui.app.ExtraStatusBarManager.extra_TOGGLE_ID", 10);
- //mContext.sendBroadcast(intent);
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
-
- private static final BroadcastReceiver mGlobalReceiver = new BroadcastReceiver() {
- @SuppressWarnings("ConstantConditions")
- @SuppressLint({"MissingPermission", "WrongConstant", "NewApi"})
- public void onReceive(final Context context, Intent intent) {
- try {
-
- Resources modRes = Helpers.getModuleRes(context);
- String action = intent.getAction();
- if (action == null) return;
- // Actions
- if (action.equals(ACTION_PREFIX + "FastReboot")) {
- SystemProperties.set("ctl.restart", "surfaceflinger");
- SystemProperties.set("ctl.restart", "zygote");
- }
- if (action.equals(ACTION_PREFIX + "RunParasitic")) {
- Intent intent2 = new Intent();
- intent2.setAction("android.intent.action.MAIN");
- intent2.addCategory("org.lsposed.manager.LAUNCH_MANAGER");
- intent2.setClassName("com.android.shell", "com.android.shell.BugreportWarningActivity");
- intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- context.startActivity(intent2);
- }
- if (action.equals(ACTION_PREFIX + "WakeUp")) {
- XposedHelpers.callMethod(context.getSystemService(Context.POWER_SERVICE), "wakeUp", SystemClock.uptimeMillis());
- }
- if (action.equals(ACTION_PREFIX + "GoToSleep")) {
- XposedHelpers.callMethod(context.getSystemService(Context.POWER_SERVICE), "goToSleep", SystemClock.uptimeMillis());
- }
- if (action.equals(ACTION_PREFIX + "LockDevice")) {
- XposedHelpers.callMethod(context.getSystemService(Context.POWER_SERVICE), "goToSleep", SystemClock.uptimeMillis());
- Class> clsWMG = XposedHelpers.findClass("android.view.WindowManagerGlobal", null);
- Object wms = XposedHelpers.callStaticMethod(clsWMG, "getWindowManagerService");
- XposedHelpers.callMethod(wms, "lockNow", (Object)null);
- }
- if (action.equals(ACTION_PREFIX + "TakeScreenshot")) {
- context.sendBroadcast(new Intent("android.intent.action.CAPTURE_SCREENSHOT"));
- }
- /*
- if (action.equals(ACTION_PREFIX + "KillForegroundAppShedule")) {
- if (mHandler == null) return;
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- removeTask(context, true);
- }
- }, 1000);
- }
- */
-// if (action.equals(ACTION_PREFIX + "KillForegroundApp")) {
-// removeTask(context);
-// }
-
- if (action.equals(ACTION_PREFIX + "GoBack")) {
- new Thread(new Runnable() {
- @Override
- public void run() {
- new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
- }
- }).start();
- }
-
- if (action.equals(ACTION_PREFIX + "SwitchToPrevApp")) {
- PackageManager pm = context.getPackageManager();
- Intent intent_home = new Intent(Intent.ACTION_MAIN);
- intent_home.addCategory(Intent.CATEGORY_HOME);
- intent_home.addCategory(Intent.CATEGORY_DEFAULT);
- List launcherList = pm.queryIntentActivities(intent_home, 0);
-
- ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
- @SuppressWarnings("deprecation")
- List rti = am.getRecentTasks(Integer.MAX_VALUE, 0);
-
- Intent recentIntent;
- for (RecentTaskInfo rtitem: rti) try {
- //noinspection deprecation
- if (am.getRunningTasks(1).get(0).topActivity == rtitem.topActivity) continue;
-
- boolean isLauncher = false;
- recentIntent = new Intent(rtitem.baseIntent);
- if (rtitem.origActivity != null) recentIntent.setComponent(rtitem.origActivity);
- ComponentName resolvedAct = recentIntent.resolveActivity(pm);
-
- if (resolvedAct != null)
- for (ResolveInfo launcher: launcherList)
- if (!launcher.activityInfo.packageName.equals("com.android.settings") && launcher.activityInfo.packageName.equals(resolvedAct.getPackageName())) {
- isLauncher = true;
- break;
- }
-
- if (!isLauncher) {
-// if (Helpers.getHtcHaptic(context)) {
-// Vibrator vibe = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
-// if (XMain.pref.getBoolean("pref_key_controls_longpresshaptic_enable", false))
-// vibe.vibrate(XMain.pref.getInt("pref_key_controls_longpresshaptic", 21));
-// else
-// vibe.vibrate(21);
-// }
- if (rtitem.id >= 0)
- am.moveTaskToFront(rtitem.id, 0);
- else
- context.startActivity(recentIntent);
- break;
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
-
- if (action.equals(ACTION_PREFIX + "LaunchIntent")) {
- Intent launchIntent = intent.getParcelableExtra("intent");
- if (launchIntent != null) {
- int user = 0;
- if (launchIntent.hasExtra("user")) {
- user = launchIntent.getIntExtra("user", 0);
- launchIntent.removeExtra("user");
- }
- if (user != 0)
- XposedHelpers.callMethod(context, "startActivityAsUser", launchIntent, XposedHelpers.newInstance(UserHandle.class, user));
- else
- context.startActivity(launchIntent);
- }
- }
-
- if (action.equals(ACTION_PREFIX + "VolumeUp")) {
- AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
- audioManager.adjustVolume(AudioManager.ADJUST_RAISE, 1 << 12 /* FLAG_FROM_KEY */ | AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_ALLOW_RINGER_MODES | AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_VIBRATE);
- }
-
- if (action.equals(ACTION_PREFIX + "VolumeDown")) {
- AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
- audioManager.adjustVolume(AudioManager.ADJUST_LOWER, 1 << 12 /* FLAG_FROM_KEY */ | AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_ALLOW_RINGER_MODES | AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_VIBRATE);
- }
-
- if (action.equals(ACTION_PREFIX + "OpenPowerMenu")) {
- Class> clsWMG = XposedHelpers.findClass("android.view.WindowManagerGlobal", null);
- Object wms = XposedHelpers.callStaticMethod(clsWMG, "getWindowManagerService");
- XposedHelpers.callMethod(wms, "showGlobalActions");
- }
-
- if (action.equals(ACTION_PREFIX + "SwitchKeyboard")) {
- context.sendBroadcast(
- Helpers.isNougat() ?
- new Intent("android.settings.SHOW_INPUT_METHOD_PICKER") :
- new Intent("com.android.server.InputMethodManagerService.SHOW_INPUT_METHOD_PICKER").setPackage("android")
- );
- }
-
- if (action.equals(ACTION_PREFIX + "SwitchOneHandedLeft")) {
- Intent handyIntent = new Intent("miui.action.handymode.changemode");
- handyIntent.putExtra("mode", 1);
- context.sendBroadcast(handyIntent);
- }
-
- if (action.equals(ACTION_PREFIX + "SwitchOneHandedRight")) {
- Intent handyIntent = new Intent("miui.action.handymode.changemode");
- handyIntent.putExtra("mode", 2);
- context.sendBroadcast(handyIntent);
- }
-
- if (action.equals(ACTION_PREFIX + "ToggleColorInversion")) {
- int opt = Settings.Secure.getInt(context.getContentResolver(), "accessibility_display_inversion_enabled");
- boolean hasConflict = SystemProperties.getInt("ro.df.effect.conflict", 0) == 1 || SystemProperties.getInt("ro.vendor.df.effect.conflict", 0) == 1;
- Object dfMgr = XposedHelpers.callStaticMethod(XposedHelpers.findClass("miui.hardware.display.DisplayFeatureManager", null), "getInstance");
- if (hasConflict && opt == 0) XposedHelpers.callMethod(dfMgr, "setScreenEffect", 15, 1);
- Settings.Secure.putInt(context.getContentResolver(), "accessibility_display_inversion_enabled", opt == 0 ? 1 : 0);
- if (hasConflict && opt != 0) XposedHelpers.callMethod(dfMgr, "setScreenEffect", 15, 0);
- }
-
- // Toggles
- if (action.equals(ACTION_PREFIX + "ToggleWiFi")) {
- WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
- if (wifiManager.isWifiEnabled()) {
- wifiManager.setWifiEnabled(false);
- Toast.makeText(context, modRes.getString(R.string.toggle_wifi_off), Toast.LENGTH_SHORT).show();
- } else {
- wifiManager.setWifiEnabled(true);
- Toast.makeText(context, modRes.getString(R.string.toggle_wifi_on), Toast.LENGTH_SHORT).show();
- }
- }
- if (action.equals(ACTION_PREFIX + "ToggleBluetooth")) {
- BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- if (mBluetoothAdapter.isEnabled()) {
- mBluetoothAdapter.disable();
- Toast.makeText(context, modRes.getString(R.string.toggle_bt_off), Toast.LENGTH_SHORT).show();
- } else {
- mBluetoothAdapter.enable();
- Toast.makeText(context, modRes.getString(R.string.toggle_bt_on), Toast.LENGTH_SHORT).show();
- }
- }
- if (action.equals(ACTION_PREFIX + "ToggleNFC")) {
- Class> clsNfcAdapter = XposedHelpers.findClass("android.nfc.NfcAdapter", null);
- NfcAdapter mNfcAdapter = (NfcAdapter)XposedHelpers.callStaticMethod(clsNfcAdapter, "getNfcAdapter", context);
- if (mNfcAdapter == null) return;
-
- Method enableNFC = clsNfcAdapter.getDeclaredMethod("enable");
- Method disableNFC = clsNfcAdapter.getDeclaredMethod("disable");
- enableNFC.setAccessible(true);
- disableNFC.setAccessible(true);
-
- if (mNfcAdapter.isEnabled()) {
- disableNFC.invoke(mNfcAdapter);
- Toast.makeText(context, modRes.getString(R.string.toggle_nfc_off), Toast.LENGTH_SHORT).show();
- } else {
- enableNFC.invoke(mNfcAdapter);
- Toast.makeText(context, modRes.getString(R.string.toggle_nfc_on), Toast.LENGTH_SHORT).show();
- }
- }
- if (action.equals(ACTION_PREFIX + "ToggleSoundProfile")) {
- AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
- int currentMode = am.getRingerMode();
- if (currentMode == 0) {
- am.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
- Toast.makeText(context, modRes.getString(R.string.toggle_sound_vibrate), Toast.LENGTH_SHORT).show();
- } else if (currentMode == 1) {
- am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- Toast.makeText(context, modRes.getString(R.string.toggle_sound_normal), Toast.LENGTH_SHORT).show();
- } else if (currentMode == 2) {
- am.setRingerMode(AudioManager.RINGER_MODE_SILENT);
- Toast.makeText(context, modRes.getString(R.string.toggle_sound_silent), Toast.LENGTH_SHORT).show();
- }
- }
- if (action.equals(ACTION_PREFIX + "ToggleAutoBrightness")) {
- if (Settings.System.getInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, 0) == 0) {
- Settings.System.putInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, 1);
- Toast.makeText(context, modRes.getString(R.string.toggle_autobright_on), Toast.LENGTH_SHORT).show();
- } else {
- Settings.System.putInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, 0);
- Toast.makeText(context, modRes.getString(R.string.toggle_autobright_off), Toast.LENGTH_SHORT).show();
- }
- }
- if (action.equals(ACTION_PREFIX + "ToggleAutoRotation")) {
- if (Settings.System.getInt(context.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0) == 0) {
- Settings.System.putInt(context.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 1);
- Toast.makeText(context, modRes.getString(R.string.toggle_autorotate_on), Toast.LENGTH_SHORT).show();
- } else {
- Settings.System.putInt(context.getContentResolver(), Settings.System.USER_ROTATION, ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation());
- Settings.System.putInt(context.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0);
- Toast.makeText(context, modRes.getString(R.string.toggle_autorotate_off), Toast.LENGTH_SHORT).show();
- }
- }
- if (action.equals(ACTION_PREFIX + "ToggleMobileData")) {
- TelephonyManager telManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
- Method setMTE = TelephonyManager.class.getDeclaredMethod("setDataEnabled", boolean.class);
- @SuppressWarnings("ALL")
- Method getMTE = TelephonyManager.class.getDeclaredMethod("getDataEnabled");
- setMTE.setAccessible(true);
- getMTE.setAccessible(true);
-
- if ((Boolean)getMTE.invoke(telManager)) {
- setMTE.invoke(telManager, false);
- Toast.makeText(context, modRes.getString(R.string.toggle_mobiledata_off), Toast.LENGTH_SHORT).show();
- } else {
- setMTE.invoke(telManager, true);
- Toast.makeText(context, modRes.getString(R.string.toggle_mobiledata_on), Toast.LENGTH_SHORT).show();
- }
- }
-
-// if (action.equals(ACTION_PREFIX + "QueryXposedService")) try {
-// Class> smCls = XposedHelpers.findClass("android.os.ServiceManager", null);
-// Object activity_service = XposedHelpers.callStaticMethod(smCls, "getService", "activity");
-//
-// Binder heartBeat = new Binder();
-// Parcel data = Parcel.obtain();
-// Parcel reply = Parcel.obtain();
-// data.writeInterfaceToken("LSPosed");
-// data.writeInt(2);
-// data.writeString("lsp-cli:" + UUID.randomUUID().toString());
-// data.writeStrongBinder(heartBeat);
-//
-// ArrayList resArr = new ArrayList(1);
-// if ((boolean)XposedHelpers.callMethod(activity_service, "transact", 1598837584, data, reply, 0)) {
-// reply.readException();
-// IBinder serviceBinder = reply.readStrongBinder();
-// if (serviceBinder == null) Helpers.log("XposedService", "binder null"); else {
-// Helpers.log("XposedService", "serviceBinder: " + serviceBinder);
-// //var service = ILSPApplicationService.Stub.asInterface(serviceBinder);
-// //if (service.requestInjectedManagerBinder(resArr) == null) {
-// // System.out.println("not a manager");
-// // return null;
-// //}
-// //if (resArr.size() > 0)
-// // return ILSPManagerService.Stub.asInterface(resArr.get(0));
-// //else
-// // System.out.println("arr size 0");
-// }
-// } else {
-// Helpers.log("XposedService", "transact fail: " + reply.dataSize());
-// }
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// }
-
-// String className = "com.htc.app.HtcShutdownThread";
-// if (Helpers.isLP()) className = "com.android.internal.policy.impl.HtcShutdown.HtcShutdownThread";
-//
-// if (action.equals(ACTION_PREFIX + "APMReboot")) {
-// setStaticObjectField(findClass(className, null), "mRebootReason", "oem-11");
-// setStaticBooleanField(findClass(className, null), "mReboot", true);
-// setStaticBooleanField(findClass(className, null), "mRebootSafeMode", false);
-// callStaticMethod(findClass(className, null), "shutdownInner", context, false);
-// }
-// if (action.equals(ACTION_PREFIX + "APMRebootRecovery")) {
-// setStaticObjectField(findClass(className, null), "mRebootReason", "recovery");
-// setStaticBooleanField(findClass(className, null), "mReboot", true);
-// setStaticBooleanField(findClass(className, null), "mRebootSafeMode", false);
-// callStaticMethod(findClass(className, null), "shutdownInner", context, false);
-// }
-// if (action.equals(ACTION_PREFIX + "APMRebootBootloader")) {
-// setStaticObjectField(findClass(className, null), "mRebootReason", "bootloader");
-// setStaticBooleanField(findClass(className, null), "mReboot", true);
-// setStaticBooleanField(findClass(className, null), "mRebootSafeMode", false);
-// callStaticMethod(findClass(className, null), "shutdownInner", context, false);
-// }
-//
- } catch(Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
-//
-// private static void removeTask(Context context) {
-// try {
-// final ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
-// @SuppressWarnings("deprecation")
-// final List taskInfo = am.getRunningTasks(1);
-// final Method removeTask;
-// if (Helpers.isLP2())
-// removeTask = am.getClass().getMethod("removeTask", new Class[] { int.class });
-// else
-// removeTask = am.getClass().getMethod("removeTask", new Class[] { int.class, int.class });
-// final Method forceStopPackage = am.getClass().getMethod("forceStopPackage", new Class[] { String.class });
-// removeTask.setAccessible(true);
-// forceStopPackage.setAccessible(true);
-// String thisPkg = taskInfo.get(0).topActivity.getPackageName();
-//
-// boolean isLauncher = false;
-// boolean isAllowed = true;
-// PackageManager pm = context.getPackageManager();
-// Intent intent_home = new Intent(Intent.ACTION_MAIN);
-// intent_home.addCategory(Intent.CATEGORY_HOME);
-// intent_home.addCategory(Intent.CATEGORY_DEFAULT);
-// List launcherList = pm.queryIntentActivities(intent_home, 0);
-//
-// for (ResolveInfo launcher: launcherList)
-// if (launcher.activityInfo.packageName.equals(thisPkg)) isLauncher = true;
-// if (thisPkg.equalsIgnoreCase("com.htc.android.worldclock")) isAllowed = false;
-//
-// if (isLauncher) {
-// XposedHelpers.callMethod(((PowerManager)context.getSystemService(Context.POWER_SERVICE)), "goToSleep", SystemClock.uptimeMillis());
-// } else if (isAllowed) {
-// // Removes from recents also
-// if (Helpers.isLP2())
-// removeTask.invoke(am, Integer.valueOf(taskInfo.get(0).id));
-// else
-// removeTask.invoke(am, Integer.valueOf(taskInfo.get(0).id), Integer.valueOf(1));
-// // Force closes all package parts
-// forceStopPackage.invoke(am, thisPkg);
-// }
-//
-// if (isLauncher || isAllowed) {
-// if (Helpers.getHtcHaptic(context)) {
-// Vibrator vibe = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
-// if (XMain.pref.getBoolean("pref_key_controls_longpresshaptic_enable", false))
-// vibe.vibrate(XMain.pref.getInt("pref_key_controls_longpresshaptic", 30));
-// else
-// vibe.vibrate(30);
-// }
-// }
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// }
-// }
-
- public static void miuizerHook(LoadPackageParam lpparam) {
- try {
- XposedHelpers.setStaticBooleanField(findClass(Helpers.modulePkg + ".utils.Helpers", lpparam.classLoader), "miuizerModuleActive", true);
- XposedHelpers.setStaticObjectField(findClass(Helpers.modulePkg + ".utils.Helpers", lpparam.classLoader), "xposedVersion", XposedBridge.getXposedVersion());
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- Helpers.emptyFile(lpparam.appInfo.dataDir + "/files/uncaught_exceptions", false);
- }
-
-// public static boolean useOwnRepo = false;
-
- public static void miuizerEdXposedManagerHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethodsSilently("org.meowcat.edxposed.manager.ModulesFragment$ModuleAdapter", lpparam.classLoader, "getView", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View view = (View)param.getResult();
- if (view == null) return;
- TextView pkgName = view.findViewById(view.getResources().getIdentifier("package_name", "id", "org.meowcat.edxposed.manager"));
- TextView title = view.findViewById(view.getResources().getIdentifier("title", "id", "org.meowcat.edxposed.manager"));
- if (title == null) return;
- Boolean tag = (Boolean)title.getTag();
- if (Helpers.modulePkg.contentEquals(pkgName.getText())) {
- if (tag == null || !tag) {
- title.setTag(true);
- title.setTypeface(title.getTypeface(), Typeface.BOLD);
- if (title.getLayout() == null)
- title.measure(View.MeasureSpec.makeMeasureSpec(title.getResources().getDisplayMetrics().widthPixels, View.MeasureSpec.AT_MOST), 0);
- int baseColor = (title.getCurrentTextColor() & 0x00FFFFFF) | 0xFF000000;
- title.getPaint().setShader(new LinearGradient(
- (int)title.getLayout().getPrimaryHorizontal(5), 0,
- (int)title.getLayout().getPrimaryHorizontal(9), 0,
- new int[]{ baseColor, 0xFFFE9D8C, 0xFFFD7ABD, 0xFFE178E0, 0xFFD375F6, 0xFF9190F5, 0xFF5FA2FD, baseColor },
- new float[]{ 0.0f, 0.01f, 0.2f, 0.4f, 0.6f, 0.8f, 0.99f, 1.0f }, Shader.TileMode.CLAMP)
- );
- }
- } else if (tag != null) {
- title.setTag(null);
- title.setTypeface(title.getTypeface(), Typeface.NORMAL);
- title.getPaint().setShader(null);
- }
- }
- });
-
- Helpers.hookAllMethods("org.meowcat.edxposed.manager.XposedApp", lpparam.classLoader, "onCreate", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Class> constCls = findClassIfExists("org.meowcat.edxposed.manager.Constants", lpparam.classLoader);
- if (constCls == null) return;
- String edxpVersion = (String)XposedHelpers.callStaticMethod(constCls, "getInstalledXposedVersion");
- if (edxpVersion != null) try {
- Intent copyIntent = new Intent(ACTION_PREFIX + "CopyToExternal");
- copyIntent.putExtra("action", 2);
- copyIntent.putExtra("data", edxpVersion);
- ((Application)param.thisObject).sendBroadcast(copyIntent);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- Helpers.makeNewEdXposedPathReadable((String)XposedHelpers.callStaticMethod(constCls, "getBaseDir"));
- }
- });
-
-// if (app == null || !Helpers.getSharedBoolPref(app, "pref_key_miuizer_ownrepo", false)) return;
-//
-// Helpers.hookAllMethods("de.robv.android.xposed.installer.XposedApp", lpparam.classLoader, "onCreate", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// useOwnRepo = Helpers.getSharedBoolPref((Application)param.thisObject, "pref_key_miuizer_ownrepo", false);
-// }
-// });
-//
-// Helpers.hookAllMethods("org.meowcat.edxposed.manager.StatusInstallerFragment", lpparam.classLoader, "onCreateView", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// if (!useOwnRepo) return;
-// ViewGroup view = (ViewGroup)param.getResult();
-// if (view == null || view.findViewWithTag("OWN_REPO") != null) return;
-//
-// Context context = view.getContext();
-// float density = context.getResources().getDisplayMetrics().density;
-//
-// int apiResId = context.getResources().getIdentifier("api", "id", "org.meowcat.edxposed.manager");
-// TextView api = view.findViewById(apiResId);
-// if (api == null) return;
-// ViewGroup container = (ViewGroup)api.getParent().getParent().getParent();
-// if (container == null) return;
-//
-// Drawable selectableItemBackground = null;
-// int listPreferredItemHeightSmall = 118;
-// try {
-// int[] bkgArr = new int[] { android.R.attr.selectableItemBackground, android.R.attr.listPreferredItemHeightSmall };
-// TypedArray typedArray = context.obtainStyledAttributes(bkgArr);
-// selectableItemBackground = typedArray.getDrawable(0);
-// listPreferredItemHeightSmall = typedArray.getDimensionPixelSize(1, 118);
-// typedArray.recycle();
-// } catch (Throwable ignore) {}
-//
-// LinearLayout container1 = new LinearLayout(context);
-// container1.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
-// if (selectableItemBackground != null)
-// container1.setBackground(selectableItemBackground);
-// container1.setOrientation(LinearLayout.HORIZONTAL);
-// container1.setClickable(true);
-// container1.setFocusable(true);
-// container1.setGravity(Gravity.CENTER_VERTICAL);
-// container1.setPaddingRelative(Math.round(16 * density), container1.getPaddingTop(), Math.round(16 * density), container1.getPaddingBottom());
-// container1.setMinimumHeight(listPreferredItemHeightSmall);
-//
-// ImageView icon = new ImageView(context);
-// icon.setLayoutParams(new LinearLayout.LayoutParams(Math.round(24 * density), Math.round(24 * density)));
-// icon.setImageDrawable(Helpers.getModuleRes(context).getDrawable(R.drawable.ic_miuizer_settings11, context.getTheme()));
-// container1.addView(icon);
-//
-// LinearLayout container2 = new LinearLayout(context);
-// ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
-// lp.leftMargin = Math.round(32 * density);
-// container2.setLayoutParams(lp);
-// container2.setOrientation(LinearLayout.VERTICAL);
-// container2.setGravity(Gravity.CENTER_VERTICAL);
-// container2.setPaddingRelative(container2.getPaddingStart(), Math.round(8 * density), container2.getPaddingEnd(), Math.round(8 * density));
-//
-// TextView ownRepo = new TextView(context);
-// ownRepo.setText(Helpers.getModuleRes(view.getContext()).getString(R.string.miuizer_ownrepo_note));
-// ownRepo.setTextSize(TypedValue.COMPLEX_UNIT_PX, api.getTextSize());
-// ownRepo.setTextColor(api.getCurrentTextColor());
-// ownRepo.setTag("OWN_REPO");
-//
-// container2.addView(ownRepo);
-//
-// container1.addView(container2);
-// container.addView(container1);
-// }
-// });
-//
-// Helpers.findAndHookMethod("org.meowcat.edxposed.manager.util.RepoLoader", lpparam.classLoader, "refreshRepositories", new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// if (!useOwnRepo) return;
-// String DEFAULT_REPOSITORIES = (String)XposedHelpers.getStaticObjectField(param.thisObject.getClass(), "DEFAULT_REPOSITORIES");
-// if (!DEFAULT_REPOSITORIES.contains(Helpers.xposedRepo))
-// XposedHelpers.setStaticObjectField(param.thisObject.getClass(), "DEFAULT_REPOSITORIES", Helpers.xposedRepo + "|" + DEFAULT_REPOSITORIES);
-// }
-// });
-//
-// Helpers.hookAllMethods("org.meowcat.edxposed.manager.repo.RepoDb", lpparam.classLoader, "insertModule", new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// if (!useOwnRepo) return;
-// String pkgName = (String)XposedHelpers.getObjectField(param.args[1], "packageName");
-// if (!Helpers.modulePkg.equals(pkgName)) return;
-// SQLiteDatabase sDb = (SQLiteDatabase)XposedHelpers.getStaticObjectField(findClass("org.meowcat.edxposed.manager.repo.RepoDb", lpparam.classLoader), "sDb");
-// Cursor query = sDb.query("modules", new String[]{ "repo_id" }, "pkgname = ?", new String[]{ Helpers.modulePkg }, null, null, null, "1");
-// if (query.getCount() > 0) param.setResult(null);
-// query.close();
-// }
-// });
- }
-
- private static int settingsIconResId;
- public static void miuizerSettingsRes() {
- settingsIconResId = MainModule.resHooks.addResource("ic_miuizer_settings", Helpers.is11() ? R.drawable.ic_miuizer_settings11 : R.drawable.ic_miuizer_settings10);
- }
-
- public static void miuizerSettingsHook(LoadPackageParam lpparam) {
- Method[] methods = XposedHelpers.findMethodsByExactParameters(findClass("com.android.settings.MiuiSettings", lpparam.classLoader), void.class, List.class);
- for (Method method: methods)
- if (Modifier.isPublic(method.getModifiers()))
- Helpers.hookMethod(method, new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void after(final MethodHookParam param) throws Throwable {
- if (param.args[0] == null) return;
-
- Context mContext = ((Activity)param.thisObject).getBaseContext();
- int opt = Integer.parseInt(Helpers.getSharedStringPref(mContext, "pref_key_miuizer_settingsiconpos", "2"));
- if (opt == 0) return;
-
- Resources modRes = Helpers.getModuleRes(mContext);
- Header header = new Header();
- header.id = 666;
- header.intent = new Intent().setClassName(Helpers.modulePkg, GateWaySettings.class.getCanonicalName());
- header.iconRes = settingsIconResId;
- header.title = modRes.getString(R.string.app_name);
- Bundle bundle = new Bundle();
- ArrayList users = new ArrayList();
- users.add((UserHandle)XposedHelpers.newInstance(UserHandle.class, 0));
- bundle.putParcelableArrayList("header_user", users);
- header.extras = bundle;
-
- int security = mContext.getResources().getIdentifier("security_status", "id", mContext.getPackageName());
- int advanced = mContext.getResources().getIdentifier("other_advanced_settings", "id", mContext.getPackageName());
- int feedback = mContext.getResources().getIdentifier("bug_report_settings", "id", mContext.getPackageName());
- int themes = mContext.getResources().getIdentifier("theme_settings", "id", mContext.getPackageName());
- int special = mContext.getResources().getIdentifier("other_special_feature_settings", "id", mContext.getPackageName());
-
- List headers = (List)param.args[0];
- int position = 0;
- boolean is11 = Helpers.is11();
- for (Header head: headers) {
- if (!is11) {
- if (opt == 2 && head.id == advanced) { headers.add(position, header); return; }
- if (opt == 3 && head.id == feedback) { headers.add(position, header); return; }
- }
- position++;
- if (opt == 1 && head.id == security) { headers.add(position, header); return; }
- if (is11) {
- if (opt == 2 && head.id == themes) { headers.add(position, header); return; }
- if (opt == 3 && head.id == special) { headers.add(position, header); return; }
- }
- }
- if (headers.size() > 25 )
- headers.add(25, header);
- else
- headers.add(header);
- }
- });
- }
-
- public static void miuizerSettings12Hook(LoadPackageParam lpparam) {
- Method[] methods = XposedHelpers.findMethodsByExactParameters(findClass("com.android.settings.MiuiSettings", lpparam.classLoader), void.class, List.class);
- for (Method method: methods)
- if (Modifier.isPublic(method.getModifiers()))
- Helpers.hookMethod(method, new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void after(final MethodHookParam param) throws Throwable {
- if (param.args[0] == null) return;
-
- Context mContext = ((Activity)param.thisObject).getBaseContext();
- int opt = Integer.parseInt(Helpers.getSharedStringPref(mContext, "pref_key_miuizer_settingsiconpos", "2"));
- if (opt == 0) return;
-
- Resources modRes = Helpers.getModuleRes(mContext);
- Class> headerCls = XposedHelpers.findClassIfExists("com.android.settingslib.miuisettings.preference.PreferenceActivity$Header", lpparam.classLoader);
- if (headerCls == null) return;
-
- Object header = XposedHelpers.newInstance(headerCls);
- XposedHelpers.setLongField(header, "id", 666);
- XposedHelpers.setObjectField(header, "intent", new Intent().setClassName(Helpers.modulePkg, GateWaySettings.class.getCanonicalName()));
- XposedHelpers.setIntField(header, "iconRes", settingsIconResId);
- XposedHelpers.setObjectField(header, "title", modRes.getString(R.string.app_name));
- Bundle bundle = new Bundle();
- ArrayList users = new ArrayList();
- users.add((UserHandle)XposedHelpers.newInstance(UserHandle.class, 0));
- bundle.putParcelableArrayList("header_user", users);
- XposedHelpers.setObjectField(header, "extras", bundle);
-
- int security = mContext.getResources().getIdentifier("security_status", "id", mContext.getPackageName());
- int themes = mContext.getResources().getIdentifier("theme_settings", "id", mContext.getPackageName());
- int special = mContext.getResources().getIdentifier("other_special_feature_settings", "id", mContext.getPackageName());
-
- List headers = (List)param.args[0];
- int position = 0;
- for (Object head: headers) {
- position++;
- long id = XposedHelpers.getLongField(head, "id");
- if (opt == 1 && id == security) { headers.add(position, header); return; }
- if (opt == 2 && id == themes) { headers.add(position, header); return; }
- if (opt == 3 && id == special) { headers.add(position, header); return; }
- }
- if (headers.size() > 25 )
- headers.add(25, header);
- else
- headers.add(header);
- }
- });
- }
-
- public static void setupSystemHelpers() {
- Helpers.findAndHookMethod(Application.class, "onCreate", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- final Context ctx = (Application)param.thisObject;
- if (ctx == null || ctx.getPackageName().equals(Helpers.modulePkg)) return;
- if (Thread.getDefaultUncaughtExceptionHandler() != null)
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently(Thread.getDefaultUncaughtExceptionHandler().getClass(), "uncaughtException", Thread.class, Throwable.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if (param.args[1] != null) try {
- Intent intent = new Intent("name.mikanoshi.customiuizer.SAVEEXCEPTION");
- intent.putExtra("throwable", (Throwable)param.args[1]);
- intent.setPackage(Helpers.modulePkg);
- ctx.sendBroadcast(intent);
- } catch (Throwable t) {}
- }
- });
- }
- });
-
- // Handle exception for null WeakReference
- Helpers.hookAllMethodsSilently("com.miui.internal.widget.SearchActionModeView", null, "notifyAnimationStart", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (param.hasThrowable()) param.setThrowable(null);
- }
- });
-
- Helpers.hookAllMethodsSilently("com.miui.internal.widget.SearchActionModeView", null, "notifyAnimationUpdate", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (param.hasThrowable()) param.setThrowable(null);
- }
- });
-
- Helpers.hookAllMethodsSilently("com.miui.internal.widget.SearchActionModeView", null, "notifyAnimationEnd", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (param.hasThrowable()) param.setThrowable(null);
- }
- });
- }
-
- public static void setupForegroundMonitor(LoadPackageParam lpparam) {
- String windowClass = Helpers.isQPlus() ? "com.android.server.wm.DisplayPolicy" : "com.android.server.policy.PhoneWindowManager";
- Helpers.hookAllMethods(windowClass, lpparam.classLoader, "focusChangedLw", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if (param.args[1] == null) return;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (mContext != null) try {
- WindowManager.LayoutParams mAttrs = (WindowManager.LayoutParams)XposedHelpers.callMethod(param.args[1], "getAttrs");
- boolean isFullScreen = mAttrs.flags != 0 && !"com.android.systemui".equals(mAttrs.packageName) && (mAttrs.flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == WindowManager.LayoutParams.FLAG_FULLSCREEN;
- Settings.Global.putString(mContext.getContentResolver(), Helpers.modulePkg + ".foreground.package", mAttrs.packageName);
- Settings.Global.putInt(mContext.getContentResolver(), Helpers.modulePkg + ".foreground.fullscreen", isFullScreen ? 1 : 0);
- } catch (Throwable t) {
- Helpers.log("ForegroundMonitor", t);
- }
- }
- });
-
-// Helpers.hookAllMethods("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "init", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
-// mContext.registerReceiver(new BroadcastReceiver() {
-// public void onReceive(final Context context, Intent intent) {
-// Settings.Global.putString(context.getContentResolver(), Helpers.modulePkg + ".foreground.package", intent.getStringExtra("package"));
-// Settings.Global.putInt(context.getContentResolver(), Helpers.modulePkg + ".foreground.fullscreen", intent.getBooleanExtra("fullscreen", false) ? 1 : 0);
-// }
-// }, new IntentFilter(GlobalActions.EVENT_PREFIX + "CHANGE_FOCUSED_APP"));
-// }
-// });
- }
-
-// public static void setupMonitors() {
-// Helpers.findAndHookMethod(Activity.class, "onResume", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// Activity act = (Activity)param.thisObject;
-// if (act == null) return;
-// int flags = act.getWindow().getAttributes().flags;
-// boolean isFullScreen = flags != 0 && !"com.android.systemui".equals(act.getPackageName()) && (flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == WindowManager.LayoutParams.FLAG_FULLSCREEN;
-// Intent intent = new Intent(GlobalActions.EVENT_PREFIX + "CHANGE_FOCUSED_APP");
-// intent.putExtra("package", act.getPackageName());
-// intent.putExtra("fullscreen", isFullScreen);
-// intent.setPackage("android");
-// act.sendBroadcast(intent);
-// }
-// });
-// }
-
- public static void setupGlobalActions(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.server.accessibility.AccessibilityManagerService", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mGlobalContext = (Context)param.args[0];
-
- IntentFilter intentfilter = new IntentFilter();
-
- // Actions
- intentfilter.addAction(ACTION_PREFIX + "WakeUp");
- intentfilter.addAction(ACTION_PREFIX + "GoToSleep");
- intentfilter.addAction(ACTION_PREFIX + "LockDevice");
- intentfilter.addAction(ACTION_PREFIX + "TakeScreenshot");
- intentfilter.addAction(ACTION_PREFIX + "KillForegroundApp");
- intentfilter.addAction(ACTION_PREFIX + "SwitchToPrevApp");
- intentfilter.addAction(ACTION_PREFIX + "GoBack");
- intentfilter.addAction(ACTION_PREFIX + "OpenPowerMenu");
- intentfilter.addAction(ACTION_PREFIX + "SwitchKeyboard");
- intentfilter.addAction(ACTION_PREFIX + "SwitchOneHandedLeft");
- intentfilter.addAction(ACTION_PREFIX + "SwitchOneHandedRight");
- intentfilter.addAction(ACTION_PREFIX + "ToggleColorInversion");
- intentfilter.addAction(ACTION_PREFIX + "VolumeUp");
- intentfilter.addAction(ACTION_PREFIX + "VolumeDown");
- intentfilter.addAction(ACTION_PREFIX + "LaunchIntent");
- //intentfilter.addAction(ACTION_PREFIX + "KillForegroundAppShedule");
-
- // Toggles
- intentfilter.addAction(ACTION_PREFIX + "ToggleWiFi");
- intentfilter.addAction(ACTION_PREFIX + "ToggleBluetooth");
- intentfilter.addAction(ACTION_PREFIX + "ToggleNFC");
- intentfilter.addAction(ACTION_PREFIX + "ToggleSoundProfile");
- intentfilter.addAction(ACTION_PREFIX + "ToggleAutoBrightness");
- intentfilter.addAction(ACTION_PREFIX + "ToggleAutoRotation");
- intentfilter.addAction(ACTION_PREFIX + "ToggleMobileData");
-
- // Tools
- intentfilter.addAction(ACTION_PREFIX + "FastReboot");
- intentfilter.addAction(ACTION_PREFIX + "RunParasitic");
- //intentfilter.addAction(ACTION_PREFIX + "QueryXposedService");
-
- mGlobalContext.registerReceiver(mGlobalReceiver, intentfilter);
- }
- });
-
- Helpers.hookAllMethods("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "init", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- IntentFilter intentfilter = new IntentFilter();
- intentfilter.addAction(ACTION_PREFIX + "SaveLastMusicPausedTime");
- intentfilter.addAction(ACTION_PREFIX + "RestartLauncher");
- mContext.registerReceiver(new BroadcastReceiver() {
- public void onReceive(final Context context, Intent intent) {
- String action = intent.getAction();
- if (action == null) return;
-
- try {
- if (action.equals(ACTION_PREFIX + "SaveLastMusicPausedTime")) {
- Settings.System.putLong(context.getContentResolver(), "last_music_paused_time", currentTimeMillis());
- } else if (action.equals(ACTION_PREFIX + "RestartLauncher")) {
- ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
- XposedHelpers.callMethod(am, "forceStopPackage", "com.miui.home");
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- }, intentfilter);
- }
- });
-
- Helpers.hookAllMethods("com.android.server.policy.BaseMiuiPhoneWindowManager", lpparam.classLoader, "initInternal", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- IntentFilter intentfilter = new IntentFilter();
- intentfilter.addAction(ACTION_PREFIX + "SimulateMenu");
- intentfilter.addAction(ACTION_PREFIX + "ForceClose");
- final Object thisObject = param.thisObject;
- mContext.registerReceiver(new BroadcastReceiver() {
- public void onReceive(final Context context, Intent intent) {
- String action = intent.getAction();
- if (action == null) return;
-
- if (action.equals(ACTION_PREFIX + "SimulateMenu")) try {
- Field fRequestShowMenu = findField(thisObject.getClass().getSuperclass(), "mRequestShowMenu");
- fRequestShowMenu.setAccessible(true);
- fRequestShowMenu.set(thisObject, true);
- Method markShortcutTriggered = findMethodExact(thisObject.getClass().getSuperclass(), "markShortcutTriggered");
- markShortcutTriggered.setAccessible(true);
- markShortcutTriggered.invoke(thisObject);
- Method injectEvent = findMethodExact(thisObject.getClass().getSuperclass(), "injectEvent", int.class);
- injectEvent.setAccessible(true);
- injectEvent.invoke(thisObject, 82);
- } catch (Throwable t1) {
- try {
- Handler mHandler = (Handler)XposedHelpers.getObjectField(thisObject, "mHandler");
- mHandler.sendMessageDelayed(mHandler.obtainMessage(1, "show_menu"), ViewConfiguration.getLongPressTimeout());
- } catch (Throwable t2) {
- XposedBridge.log(t2);
- }
- }
-
- if (action.equals(ACTION_PREFIX + "ForceClose")) try {
- Method closeApp = findMethodExact(thisObject.getClass().getSuperclass(), "closeApp", boolean.class);
- closeApp.setAccessible(true);
- closeApp.invoke(thisObject, false);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- }, intentfilter);
- }
- });
-
- Helpers.findAndHookMethod("com.android.server.pm.PackageManagerService", lpparam.classLoader, "getInstallerPackageName", String.class, new MethodHook() {
- @Override
- @SuppressLint("SetWorldReadable")
- protected void before(MethodHookParam param) throws Throwable {
- String req = (String)param.args[0];
- if ("EdXposedVersion".equals(req)) {
- String edxpPath = Helpers.getNewEdXposedPath();
- if (edxpPath == null) return;
- String edxpVersion = Helpers.getXposedPropVersion(new File("/data/misc/" + edxpPath + "/framework/edconfig.jar"), true);
- param.setResult(edxpVersion);
- } else if ("EdXposedLog".equals(req)) {
- param.setResult(Helpers.makeNewEdXposedPathReadable());
- } else if ("EdXposedScope".equals(req)) {
- String edxpPath = Helpers.getNewEdXposedPath();
- if (edxpPath == null) return;
- File file = new File("/data/misc/" + edxpPath + "/0/conf/" + Helpers.modulePkg + ".conf");
- param.setResult(file.exists() ? "true" : "false");
- }
- }
- });
-
-// Helpers.hookAllMethods("com.android.server.policy.MiuiPhoneWindowManager", lpparam.classLoader, "init", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
-// IntentFilter intentfilter = new IntentFilter();
-// intentfilter.addAction(ACTION_PREFIX + "OpenFingerprintActionDialog");
-// final Object thisObject = param.thisObject;
-// mContext.registerReceiver(new BroadcastReceiver() {
-// public void onReceive(final Context context, Intent intent) {
-// String action = intent.getAction();
-// if (action == null) return;
-//
-// try {
-// XposedHelpers.callMethod(thisObject, "bringUpActionChooseDlg");
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// }
-// }
-// }, intentfilter);
-// }
-// });
-
-// Helpers.hookAllMethods("com.android.server.am.ActivityStackSupervisor", lpparam.classLoader, "getComponentRestrictionForCallingPackage", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// ActivityInfo ai = (ActivityInfo)param.args[0];
-// if (ai != null && ai.name.equals("com.miui.privacyapps.ui.PrivacyAppsOperationTutorialActivity")) param.setResult(0);
-// }
-// });
- }
-
- public static void setupStatusBar(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "start", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- mStatusBar = param.thisObject;
- Context mStatusBarContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- IntentFilter intentfilter = new IntentFilter();
-
- intentfilter.addAction(ACTION_PREFIX + "ExpandNotifications");
- intentfilter.addAction(ACTION_PREFIX + "ExpandSettings");
- intentfilter.addAction(ACTION_PREFIX + "OpenRecents");
- intentfilter.addAction(ACTION_PREFIX + "OpenVolumeDialog");
-
- intentfilter.addAction(ACTION_PREFIX + "ToggleGPS");
- intentfilter.addAction(ACTION_PREFIX + "ToggleHotspot");
- intentfilter.addAction(ACTION_PREFIX + "ToggleFlashlight");
- intentfilter.addAction(ACTION_PREFIX + "ShowQuickRecents");
- intentfilter.addAction(ACTION_PREFIX + "HideQuickRecents");
-
- intentfilter.addAction(ACTION_PREFIX + "ClearMemory");
- intentfilter.addAction(ACTION_PREFIX + "CollectXposedLog");
- intentfilter.addAction(ACTION_PREFIX + "RestartSystemUI");
- intentfilter.addAction(ACTION_PREFIX + "CopyToExternal");
-
- mStatusBarContext.registerReceiver(mSBReceiver, intentfilter);
- }
- });
-
-// Helpers.findAndHookMethod("com.android.systemui.statusbar.HeaderView", lpparam.classLoader, "onFinishInflate", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// TextView mClock = (TextView)XposedHelpers.getObjectField(param.thisObject, "mClock");
-// RelativeLayout.LayoutParams clp = (RelativeLayout.LayoutParams)mClock.getLayoutParams();
-// clp.height = 0;
-// mClock.setLayoutParams(clp);
-//
-// RelativeLayout heaverView = (RelativeLayout)param.thisObject;
-// TextView temp = new TextView(heaverView.getContext());
-// RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
-// lp.addRule(RelativeLayout.ABOVE, heaverView.getContext().getResources().getIdentifier("date_time", "id", "com.android.systemui"));
-// lp.addRule(RelativeLayout.ALIGN_LEFT);
-// lp.setMarginStart(heaverView.getContext().getResources().getDimensionPixelSize(heaverView.getContext().getResources().getIdentifier("expanded_notification_weather_temperature_right", "dimen", "com.android.systemui")));
-// temp.setLayoutParams(lp);
-// temp.setText("CPU 666° Battery 999° PCB 333°");
-// temp.setTextAppearance(heaverView.getContext().getResources().getIdentifier("TextAppearance.StatusBar.Expanded.Weather", "style", "com.android.systemui"));
-// heaverView.setGravity(Gravity.TOP);
-// heaverView.addView(temp);
-// }
-// });
-//
-// Helpers.findAndHookMethod("com.android.systemui.CustomizedUtils", lpparam.classLoader, "getNotchExpandedHeaderViewHeight", Context.class, int.class, new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// param.setResult((int)param.getResult() + 65);
-// }
-// });
- }
-
- // Actions
- public static boolean expandNotifications(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "ExpandNotifications"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean expandEQS(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "ExpandSettings"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean lockDevice(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "LockDevice"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean wakeUp(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "WakeUp"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean goToSleep(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "GoToSleep"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- enum IntentType {
- APP, ACTIVITY, SHORTCUT
- }
-
- public static Intent getIntent(Context context, String pref, IntentType intentType, boolean skipLock) {
- try {
- if (intentType == IntentType.APP) pref += "_app";
- else if (intentType == IntentType.ACTIVITY) pref += "_activity";
- else if (intentType == IntentType.SHORTCUT) pref += "_shortcut_intent";
-
- String prefValue = Helpers.getSharedStringPref(context, pref, null);
- if (prefValue == null) return null;
-
- Intent intent = new Intent();
- if (intentType == IntentType.SHORTCUT) {
- intent = Intent.parseUri(prefValue, 0);
- } else {
- String[] pkgAppArray = prefValue.split("\\|");
- if (pkgAppArray.length < 2) return null;
- ComponentName name = new ComponentName(pkgAppArray[0], pkgAppArray[1]);
- intent.setComponent(name);
- int user = Helpers.getSharedIntPref(context, pref + "_user", 0);
- if (user != 0) intent.putExtra("user", user);
- }
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
-
- if (intentType == IntentType.APP) {
- intent.setAction(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- }
-
- if (skipLock) {
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
- intent.putExtra("ShowCameraWhenLocked", true);
- intent.putExtra("StartActivityWhenLocked", true);
- }
-
- return intent;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return null;
- }
- }
-
- public static boolean takeScreenshot(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "TakeScreenshot"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
-// public static boolean killForegroundApp(Context context) {
-// try {
-// context.sendBroadcast(new Intent(ACTION_PREFIX + "KillForegroundApp"));
-// return true;
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// return false;
-// }
-// }
-
- public static boolean simulateMenu(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "SimulateMenu"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean forceClose(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "ForceClose"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean openRecents(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "OpenRecents"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean launchAppIntent(Context context, String key, boolean skipLock) {
- return launchIntent(context, getIntent(context, key, IntentType.APP, skipLock));
- }
-
- public static boolean launchActivityIntent(Context context, String key, boolean skipLock) {
- return launchIntent(context, getIntent(context, key, IntentType.ACTIVITY, skipLock));
- }
-
- public static boolean launchShortcutIntent(Context context, String key, boolean skipLock) {
- return launchIntent(context, getIntent(context, key, IntentType.SHORTCUT, skipLock));
- }
-
- public static boolean launchIntent(Context context, Intent intent) {
- if (intent == null) return false;
- Intent bIntent = new Intent(ACTION_PREFIX + "LaunchIntent");
- bIntent.putExtra("intent", intent);
- context.sendBroadcast(bIntent);
- return true;
- }
-
- public static boolean openVolumeDialog(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "OpenVolumeDialog"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean volumeUp(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "VolumeUp"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean volumeDown(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "VolumeDown"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean goBack(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "GoBack"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean switchToPrevApp(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "SwitchToPrevApp"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean openPowerMenu(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "OpenPowerMenu"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean switchKeyboard(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "SwitchKeyboard"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean switchOneHandedLeft(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "SwitchOneHandedLeft"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean switchOneHandedRight(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "SwitchOneHandedRight"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean toggleColorInversion(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "ToggleColorInversion"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static boolean clearMemory(Context context) {
- try {
- context.sendBroadcast(new Intent(ACTION_PREFIX + "ClearMemory"));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
-// public static boolean showQuickRecents(Context context) {
-// try {
-// context.sendBroadcast(new Intent(ACTION_PREFIX + "ShowQuickRecents"));
-// return true;
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// return false;
-// }
-// }
-//
-// public static boolean hideQuickRecents(Context context) {
-// try {
-// context.sendBroadcast(new Intent(ACTION_PREFIX + "HideQuickRecents"));
-// return true;
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// return false;
-// }
-// }
-
- public static boolean toggleThis(Context context, int what) {
- try {
- String whatStr;
- switch (what) {
- case 1: whatStr = "WiFi"; break;
- case 2: whatStr = "Bluetooth"; break;
- case 3: whatStr = "GPS"; break;
- case 4: whatStr = "NFC"; break;
- case 5: whatStr = "SoundProfile"; break;
- case 6: whatStr = "AutoBrightness"; break;
- case 7: whatStr = "AutoRotation"; break;
- case 8: whatStr = "Flashlight"; break;
- case 9: whatStr = "MobileData"; break;
- case 10: whatStr = "Hotspot"; break;
- default: return false;
- }
- context.sendBroadcast(new Intent(ACTION_PREFIX + "Toggle" + whatStr));
- return true;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
-// public static ColorFilter createColorFilter(boolean fromModule) {
-// int brightness = 0;
-// int saturation = 0;
-// int hue = 0;
-//
-// if (Helpers.isLP()) {
-// brightness = 100;
-// saturation = -100;
-// hue = 0;
-// } else if (fromModule) {
-// if (XMain.pref != null) {
-// brightness = XMain.pref.getInt("pref_key_colorfilter_brightValue", 100) - 100;
-// saturation = XMain.pref.getInt("pref_key_colorfilter_satValue", 100) - 100;
-// hue = XMain.pref.getInt("pref_key_colorfilter_hueValue", 180) - 180;
-// }
-// } else {
-// if (Helpers.prefs != null) {
-// brightness = Helpers.prefs.getInt("pref_key_colorfilter_brightValue", 100) - 100;
-// saturation = Helpers.prefs.getInt("pref_key_colorfilter_satValue", 100) - 100;
-// hue = Helpers.prefs.getInt("pref_key_colorfilter_hueValue", 180) - 180;
-// }
-// }
-//
-// if (brightness == 0 && saturation == 0 && hue == 0)
-// return null;
-// else if (brightness == 100 && saturation == -100)
-// return ColorFilterGenerator.adjustColor(100, 100, -100, -180);
-// else
-// return ColorFilterGenerator.adjustColor(brightness, 0, saturation, hue);
-// }
-//
-// public static void sendMediaButton(Context mContext, KeyEvent keyEvent) {
-// try {
-// if (Build.VERSION.SDK_INT >= 19) {
-// AudioManager am = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
-// if (mContext != null) am.dispatchMediaKeyEvent(keyEvent);
-// } else {
-// // Get binder from ServiceManager.checkService(String)
-// IBinder iBinder = (IBinder) Class.forName("android.os.ServiceManager").getDeclaredMethod("checkService", String.class).invoke(null, Context.AUDIO_SERVICE);
-// // Get audioService from IAudioService.Stub.asInterface(IBinder)
-// Object audioService = Class.forName("android.media.IAudioService$Stub").getDeclaredMethod("asInterface", IBinder.class).invoke(null, iBinder);
-// // Dispatch keyEvent using IAudioService.dispatchMediaKeyEvent(KeyEvent)
-// Class.forName("android.media.IAudioService").getDeclaredMethod("dispatchMediaKeyEvent", KeyEvent.class).invoke(audioService, keyEvent);
-// }
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// }
-// }
-
- public static boolean isMediaActionsAllowed(Context mContext) {
- AudioManager am = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
- boolean isMusicActive = am.isMusicActive();
- boolean isMusicActiveRemotely = (Boolean)XposedHelpers.callMethod(am, "isMusicActiveRemotely");
- boolean isAllowed = isMusicActive || isMusicActiveRemotely;
- if (!isAllowed) {
- long mCurrentTime = currentTimeMillis();
- long mLastPauseTime = Settings.System.getLong(mContext.getContentResolver(), "last_music_paused_time", mCurrentTime);
- if (mCurrentTime - mLastPauseTime < 10 * 60 * 1000) isAllowed = true;
- }
- return isAllowed;
- }
-
- public static void sendDownUpKeyEvent(Context mContext, int keyCode, boolean vibrate) {
- AudioManager am = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
- am.dispatchMediaKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keyCode));
- am.dispatchMediaKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keyCode));
-
- if (vibrate && Helpers.getSharedBoolPref(mContext, "pref_key_controls_volumemedia_vibrate", true))
- Helpers.performStrongVibration(mContext, Helpers.getSharedBoolPref(mContext, "pref_key_controls_volumemedia_vibrate_ignore", false));
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/mods/Launcher.java b/app/src/main/java/name/mikanoshi/customiuizer/mods/Launcher.java
deleted file mode 100644
index 74e0e22b..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/mods/Launcher.java
+++ /dev/null
@@ -1,1710 +0,0 @@
-package name.mikanoshi.customiuizer.mods;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.ActivityOptions;
-import android.app.Application;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.pm.ActivityInfo;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.graphics.Color;
-import android.graphics.LinearGradient;
-import android.graphics.Rect;
-import android.graphics.Shader;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.PaintDrawable;
-import android.graphics.drawable.ShapeDrawable;
-import android.graphics.drawable.shapes.RectShape;
-import android.hardware.Sensor;
-import android.hardware.SensorManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.text.Editable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.util.TypedValue;
-import android.view.GestureDetector;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.widget.GridView;
-import android.widget.ImageView;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-
-import java.lang.reflect.Method;
-import java.util.HashSet;
-
-import de.robv.android.xposed.XC_MethodHook;
-import de.robv.android.xposed.XC_MethodReplacement;
-import de.robv.android.xposed.XposedBridge;
-import de.robv.android.xposed.XposedHelpers;
-import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
-
-import name.mikanoshi.customiuizer.MainModule;
-import name.mikanoshi.customiuizer.utils.Helpers;
-import name.mikanoshi.customiuizer.utils.Helpers.MethodHook;
-import name.mikanoshi.customiuizer.utils.ShakeManager;
-
-public class Launcher {
-
-// private static GestureDetector mDetector;
- private static GestureDetector mDetectorHorizontal;
-
- @SuppressWarnings("ResultOfMethodCallIgnored")
- public static void HomescreenSwipesHook(final LoadPackageParam lpparam) {
-// // Detect vertical swipes
-// Helpers.findAndHookMethod("com.miui.home.launcher.ForceTouchLayer", lpparam.classLoader, "onInterceptTouchEvent", MotionEvent.class, new MethodHook() {
-// @Override
-// protected void before(final MethodHookParam param) throws Throwable {
-// Context helperContext = ((ViewGroup)param.thisObject).getContext();
-//
-// if (helperContext == null) return;
-// if (mDetector == null) mDetector = new GestureDetector(helperContext, new SwipeListener(helperContext));
-//
-// MotionEvent ev = (MotionEvent)param.args[0];
-// if (ev == null) return;
-// mDetector.onTouchEvent(ev);
-// }
-// });
-
-// if (MainModule.pref_swipedown != 1)
-// Helpers.findAndHookMethod("com.miui.launcher.utils.LauncherUtils", lpparam.classLoader, "expandStatusBar", Context.class, XC_MethodReplacement.DO_NOTHING);
-//
-// if (MainModule.pref_swipeup != 1)
-// Helpers.findAndHookMethod("com.miui.home.launcher.DeviceConfig", lpparam.classLoader, "allowedSlidingUpToStartGolbalSearch", Context.class, new MethodHook() {
-// @Override
-// protected void before(final MethodHookParam param) throws Throwable {
-// param.setResult(false);
-// }
-// });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.Workspace", lpparam.classLoader, "onVerticalGesture", int.class, MotionEvent.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- if ((boolean)XposedHelpers.callMethod(param.thisObject, "isInNormalEditingMode")) return;
- String key = null;
- Context helperContext = ((ViewGroup)param.thisObject).getContext();
- int numOfFingers = 1;
- if (param.args[1] != null) numOfFingers = ((MotionEvent)param.args[1]).getPointerCount();
- if ((int)param.args[0] == 11) {
- if (numOfFingers == 1)
- key = "pref_key_launcher_swipedown";
- else if (numOfFingers == 2)
- key = "pref_key_launcher_swipedown2";
- if (GlobalActions.handleAction(helperContext, key)) param.setResult(true);
- } else if ((int)param.args[0] == 10) {
- if (numOfFingers == 1)
- key = "pref_key_launcher_swipeup";
- else if (numOfFingers == 2)
- key = "pref_key_launcher_swipeup2";
- if (GlobalActions.handleAction(helperContext, key)) param.setResult(true);
- }
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.Launcher", lpparam.classLoader, "onCreate", Bundle.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- final Activity act = (Activity)param.thisObject;
- Handler mHandler = (Handler)XposedHelpers.getObjectField(act, "mHandler");
- new Helpers.SharedPrefObserver(act, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String type = uri.getPathSegments().get(1);
- String key = uri.getPathSegments().get(2);
- if (key.contains("pref_key_launcher_swipedown"))
- switch (type) {
- case "string":
- MainModule.mPrefs.put(key, Helpers.getSharedStringPref(act, key, ""));
- break;
- case "integer":
- MainModule.mPrefs.put(key, Helpers.getSharedIntPref(act, key, 1));
- break;
- case "boolean":
- MainModule.mPrefs.put(key, Helpers.getSharedBoolPref(act, key, false));
- break;
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.findAndHookMethodSilently("com.miui.home.launcher.uioverrides.StatusBarSwipeController", lpparam.classLoader, "canInterceptTouch", MotionEvent.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- if (MainModule.mPrefs.getInt("launcher_swipedown_action", 1) > 1) param.setResult(false);
- }
- });
-
- // content_center, global_search, notification_bar
- Helpers.findAndHookMethodSilently("com.miui.home.launcher.allapps.LauncherMode", lpparam.classLoader, "getPullDownGesture", Context.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if (Helpers.getSharedIntPref((Context)param.args[0], "pref_key_launcher_swipedown_action", 1) > 1) param.setResult("no_action");
- }
- });
-
- // content_center, global_search
- Helpers.findAndHookMethodSilently("com.miui.home.launcher.allapps.LauncherMode", lpparam.classLoader, "getSlideUpGesture", Context.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- if (Helpers.getSharedIntPref((Context)param.args[0], "pref_key_launcher_swipeup_action", 1) > 1) param.setResult("no_action");
- }
- });
-
- if (Helpers.findAndHookMethodSilently("com.miui.home.launcher.DeviceConfig", lpparam.classLoader, "isGlobalSearchEnable", Context.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- if (Helpers.getSharedIntPref((Context)param.args[0], "pref_key_launcher_swipeup_action", 1) > 1) param.setResult(false);
- }
- })) {
- Helpers.findAndHookMethodSilently("com.miui.home.launcher.search.SearchEdgeLayout", lpparam.classLoader, "isTopSearchEnable", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- View view = (View)param.thisObject;
- if (Helpers.getSharedIntPref(view.getContext(), "pref_key_launcher_swipedown_action", 1) > 1) param.setResult(false);
- }
- });
- Helpers.findAndHookMethodSilently("com.miui.home.launcher.search.SearchEdgeLayout", lpparam.classLoader, "isBottomGlobalSearchEnable", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- View view = (View)param.thisObject;
- if (Helpers.getSharedIntPref(view.getContext(), "pref_key_launcher_swipeup_action", 1) > 1) param.setResult(false);
- }
- });
- Helpers.findAndHookMethodSilently("com.miui.home.launcher.DeviceConfig", lpparam.classLoader, "isGlobalSearchBottomEffectEnable", Context.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- if (Helpers.getSharedIntPref((Context)param.args[0], "pref_key_launcher_swipeup_action", 1) > 1) param.setResult(false);
- }
- });
- } else if (!Helpers.findAndHookMethodSilently("com.miui.home.launcher.DeviceConfig", lpparam.classLoader, "allowedSlidingUpToStartGolbalSearch", Context.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- if (Helpers.getSharedIntPref((Context)param.args[0], "pref_key_launcher_swipeup_action", 1) > 1) param.setResult(false);
- }
- })) if (lpparam.packageName.equals("com.miui.home")) Helpers.log("HomescreenSwipesHook", "Cannot disable swipe up search");
- }
-
-// // Listener for vertical swipe gestures
-// private static class SwipeListener extends GestureDetector.SimpleOnGestureListener {
-//
-// private int SWIPE_MIN_DISTANCE = 300;
-// private int SWIPE_MAX_OFF_PATH = 250;
-// private int SWIPE_THRESHOLD_VELOCITY = 200;
-//
-// final Context helperContext;
-//
-// SwipeListener(Context context) {
-// helperContext = context;
-// float density = helperContext.getResources().getDisplayMetrics().density;
-// SWIPE_MIN_DISTANCE = Math.round(100 * density);
-// SWIPE_MAX_OFF_PATH = Math.round(85 * density);
-// SWIPE_THRESHOLD_VELOCITY = Math.round(65 * density);
-// }
-//
-// @Override
-// public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
-// if (e1 == null || e2 == null) return false;
-// if (Math.abs(e1.getX() - e2.getX()) > SWIPE_MAX_OFF_PATH) return false;
-//
-// if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
-// //MainModule.pref.reload();
-// XposedBridge.log("Swiped DOWN! " + String.valueOf(MainModule.pref.getInt("pref_key_launcher_swipedown_action", 1)));
-// return GlobalActions.handleAction(MainModule.pref.getInt("pref_key_launcher_swipedown_action", 1), 1, MainModule.pref.getInt("pref_key_launcher_swipedown_toggle", 0), helperContext);
-// }
-//
-// if (e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
-// //MainModule.pref.reload();
-// XposedBridge.log("Swiped UP! " + String.valueOf(MainModule.pref.getInt("pref_key_launcher_swipeup_action", 1)));
-// return GlobalActions.handleAction(MainModule.pref.getInt("pref_key_launcher_swipeup_action", 1), 2, MainModule.pref.getInt("pref_key_launcher_swipeup_toggle", 0), helperContext);
-// }
-//
-// return false;
-// }
-// }
-
- public static void HotSeatSwipesHook(final LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.HotSeats", lpparam.classLoader, "dispatchTouchEvent", MotionEvent.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- MotionEvent ev = (MotionEvent)param.args[0];
- if (ev == null) return;
-
- ViewGroup hotSeat = (ViewGroup)param.thisObject;
- Context helperContext = hotSeat.getContext();
- if (helperContext == null) return;
- if (mDetectorHorizontal == null) mDetectorHorizontal = new GestureDetector(helperContext, new SwipeListenerHorizontal(hotSeat));
- mDetectorHorizontal.onTouchEvent(ev);
- }
- });
-
-// Helpers.findAndHookMethod("com.htc.launcher.DragLayer", lpparam.classLoader, "onInterceptTouchEvent", MotionEvent.class, new MethodHook() {
-// @Override
-// protected void before(final MethodHookParam param) throws Throwable {
-// MotionEvent ev = (MotionEvent)param.args[0];
-// if (ev == null) return;
-//
-// FrameLayout dragLayer = (FrameLayout)param.thisObject;
-// launcher = XposedHelpers.getObjectField(dragLayer, "m_launcher");
-// Context helperContext = dragLayer.getContext();
-// if (helperContext == null) return;
-// if (mDetectorVertical == null) mDetectorVertical = new GestureDetector(helperContext, new SwipeListenerVertical(helperContext));
-// if (mDetectorVertical.onTouchEvent(ev)) param.setResult(true);
-// }
-// });
- }
-
- // Listener for horizontal swipes on hotseats
- private static class SwipeListenerHorizontal extends GestureDetector.SimpleOnGestureListener {
-
- private final int SWIPE_MIN_DISTANCE_HORIZ;
- private final int SWIPE_THRESHOLD_VELOCITY;
-
- final Context helperContext;
-
- SwipeListenerHorizontal(Object cellLayout) {
- helperContext = ((ViewGroup)cellLayout).getContext();
- float density = helperContext.getResources().getDisplayMetrics().density;
- SWIPE_MIN_DISTANCE_HORIZ = Math.round(75 * density);
- SWIPE_THRESHOLD_VELOCITY = Math.round(33 * density);
- }
-
- @Override
- public boolean onDown(MotionEvent e) {
- return false;
- }
-
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
- if (e1 == null || e2 == null) return false;
-
- if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE_HORIZ && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
- return GlobalActions.handleAction(helperContext, "pref_key_launcher_swiperight");
-
- if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE_HORIZ && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
- return GlobalActions.handleAction(helperContext, "pref_key_launcher_swipeleft");
-
- return false;
- }
- }
-
- public static void ShakeHook(final LoadPackageParam lpparam) {
- final String shakeMgrKey = "MIUIZER_SHAKE_MGR";
-
- Helpers.findAndHookMethod("com.miui.home.launcher.Launcher", lpparam.classLoader, "onResume", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- ShakeManager shakeMgr = (ShakeManager)XposedHelpers.getAdditionalInstanceField(param.thisObject, shakeMgrKey);
- if (shakeMgr == null) {
- shakeMgr = new ShakeManager((Context)param.thisObject);
- XposedHelpers.setAdditionalInstanceField(param.thisObject, shakeMgrKey, shakeMgr);
- }
- Activity launcherActivity = (Activity)param.thisObject;
- SensorManager sensorMgr = (SensorManager)launcherActivity.getSystemService(Context.SENSOR_SERVICE);
- shakeMgr.reset();
- sensorMgr.registerListener(shakeMgr, sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.Launcher", lpparam.classLoader, "onPause", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if (XposedHelpers.getAdditionalInstanceField(param.thisObject, shakeMgrKey) == null) return;
- Activity launcherActivity = (Activity)param.thisObject;
- SensorManager sensorMgr = (SensorManager)launcherActivity.getSystemService(Context.SENSOR_SERVICE);
- sensorMgr.unregisterListener((ShakeManager)XposedHelpers.getAdditionalInstanceField(param.thisObject, shakeMgrKey));
- }
- });
- }
-
- private static Class> wallpaperUtilsCls = null;
- public static void FolderShadeHook(final LoadPackageParam lpparam) {
- wallpaperUtilsCls = XposedHelpers.findClassIfExists("com.miui.home.launcher.WallpaperUtils", lpparam.classLoader);
-
- MethodHook hook = new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- View folder = (View)param.thisObject;
- new Thread() {
- @Override
- public void run() {
- try {
- Context context = folder.getContext();
- int opt = Integer.parseInt(Helpers.getSharedStringPref(context, "pref_key_launcher_foldershade", "1"));
- int level = Helpers.getSharedIntPref(context, "pref_key_launcher_foldershade_level", 40);
- final Drawable bkg;
- if (opt == 2) {
- boolean isLight = false;
- if (wallpaperUtilsCls != null) try { isLight = (boolean)XposedHelpers.callStaticMethod(wallpaperUtilsCls, "hasAppliedLightWallpaper"); } catch (Throwable ignore) {}
- int bgcolor = (isLight ? 0x00ffffff : 0x00000000) | (Math.round(255 * level / 100f) * 0x1000000);
- bkg = new ColorDrawable(bgcolor);
- } else if (opt == 3) {
- PaintDrawable pd = new PaintDrawable();
- pd.setShape(new RectShape());
- pd.setShaderFactory(new ShapeDrawable.ShaderFactory() {
- @Override
- public Shader resize(int width, int height) {
- boolean isLight = false;
- if (wallpaperUtilsCls != null) try { isLight = (boolean)XposedHelpers.callStaticMethod(wallpaperUtilsCls, "hasAppliedLightWallpaper"); } catch (Throwable ignore) {}
- int bgcolor1 = (isLight ? 0x00ffffff : 0x00000000) | (Math.round(255 / 6f * level / 100f) * 0x1000000);
- int bgcolor2 = (isLight ? 0x00ffffff : 0x00000000) | (Math.round(255 * level / 100f) * 0x1000000);
- return new LinearGradient(0, 0, 0, height,
- new int[]{ bgcolor1, bgcolor2, bgcolor2, bgcolor1 },
- new float[]{ 0.0f, 0.25f, 0.65f, 1.0f },
- Shader.TileMode.CLAMP
- );
- }
- });
- bkg = pd;
- } else bkg = null;
- new Handler(context.getMainLooper()).post(new Runnable() {
- @Override
- public void run() {
- MainModule.mPrefs.put("pref_key_launcher_foldershade", String.valueOf(opt));
- MainModule.mPrefs.put("pref_key_launcher_foldershade_level", level);
- folder.setBackground(bkg);
- }
- });
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- }.start();
- }
- };
- Helpers.hookAllConstructors("com.miui.home.launcher.FolderCling", lpparam.classLoader, hook);
- Helpers.findAndHookMethod("com.miui.home.launcher.FolderCling", lpparam.classLoader, "onWallpaperColorChanged", hook);
- Helpers.findAndHookMethod("com.miui.home.launcher.FolderCling", lpparam.classLoader, "updateLayout", boolean.class, hook);
-
- Helpers.findAndHookMethod("com.miui.home.launcher.Folder", lpparam.classLoader, "setBackgroundAlpha", float.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- int opt = MainModule.mPrefs.getStringAsInt("launcher_foldershade", 1);
- if (opt == 1) return;
- Object mLauncher = XposedHelpers.getObjectField(param.thisObject, "mLauncher");
- if (mLauncher == null) return;
- View folderCling = (View)XposedHelpers.callMethod(mLauncher, "getFolderCling");
- if (folderCling == null) return;
- Drawable bkg = folderCling.getBackground();
- if (bkg != null) bkg.setAlpha(Math.round((float)param.args[0] * 255));
- }
- });
- }
-
- public static void NoClockHideHook(final LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.Workspace", lpparam.classLoader, "isScreenHasClockGadget", long.class, XC_MethodReplacement.returnConstant(false));
- }
-
- private static void modifyTitle(Object thisObject) {
- boolean isApplicatoin = (boolean)XposedHelpers.callMethod(thisObject, "isApplicatoin");
- if (!isApplicatoin) return;
- String pkgName = (String)XposedHelpers.callMethod(thisObject, "getPackageName");
- String actName = (String)XposedHelpers.callMethod(thisObject, "getClassName");
- UserHandle user = (UserHandle)XposedHelpers.getObjectField(thisObject, "user");
- String newTitle = MainModule.mPrefs.getString("launcher_renameapps_list:" + pkgName + "|" + actName + "|" + user.hashCode(), "");
- if (!TextUtils.isEmpty(newTitle)) XposedHelpers.setObjectField(thisObject, "mLabel", newTitle);
- }
-
- public static void RenameShortcutsHook(final LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.Launcher", lpparam.classLoader, "onCreate", Bundle.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Activity act = (Activity)param.thisObject;
- Handler mHandler = (Handler)XposedHelpers.getObjectField(act, "mHandler");
- new Helpers.SharedPrefObserver(act, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String type = uri.getPathSegments().get(1);
- if (!type.equals("string")) return;
- String key = uri.getPathSegments().get(2);
- if (!key.contains("pref_key_launcher_renameapps_list")) return;
- CharSequence newTitle = Helpers.getSharedStringPref(act, key, "");
- MainModule.mPrefs.put(key, newTitle);
- HashSet> mAllLoadedApps;
- if (XposedHelpers.findFieldIfExists(param.thisObject.getClass(), "mAllLoadedShortcut") != null)
- mAllLoadedApps = (HashSet>)XposedHelpers.getObjectField(param.thisObject, "mAllLoadedShortcut");
- else if (XposedHelpers.findFieldIfExists(param.thisObject.getClass(), "mAllLoadedApps") != null)
- mAllLoadedApps = (HashSet>)XposedHelpers.getObjectField(param.thisObject, "mAllLoadedApps");
- else
- mAllLoadedApps = (HashSet>)XposedHelpers.getObjectField(param.thisObject, "mLoadedAppsAndShortcut");
- if (mAllLoadedApps != null)
- for (Object shortcut: mAllLoadedApps) {
- boolean isApplicatoin = (boolean)XposedHelpers.callMethod(shortcut, "isApplicatoin");
- if (!isApplicatoin) continue;
- String pkgName = (String)XposedHelpers.callMethod(shortcut, "getPackageName");
- String actName = (String)XposedHelpers.callMethod(shortcut, "getClassName");
- UserHandle user = (UserHandle)XposedHelpers.getObjectField(shortcut, "user");
- if (("pref_key_launcher_renameapps_list:" + pkgName + "|" + actName + "|" + user.hashCode()).equals(key)) {
- CharSequence newStr = TextUtils.isEmpty(newTitle) ? (CharSequence)XposedHelpers.getAdditionalInstanceField(shortcut, "mLabelOrig") : newTitle;
- XposedHelpers.setObjectField(shortcut, "mLabel", newStr);
- if (lpparam.packageName.equals("com.miui.home")) {
- XposedHelpers.callMethod(shortcut, "updateBuddyIconView", act);
- } else {
- Object buddyIconView = XposedHelpers.callMethod(shortcut, "getBuddyIconView");
- if (buddyIconView != null) XposedHelpers.callMethod(buddyIconView, "updateInfo", param.thisObject, shortcut);
- }
- break;
- }
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.hookAllConstructors("com.miui.home.launcher.ShortcutInfo", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mLabelOrig", XposedHelpers.getObjectField(param.thisObject, "mLabel"));
- if (param.args != null && param.args.length > 0) modifyTitle(param.thisObject);
- }
- });
-
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.miui.home.launcher.ShortcutInfo", lpparam.classLoader, "loadSettingsInfo", Context.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mLabelOrig", XposedHelpers.getObjectField(param.thisObject, "mLabel"));
- modifyTitle(param.thisObject);
- }
- });
-
- if (!Helpers.findAndHookMethodSilently("com.miui.home.launcher.ShortcutInfo", lpparam.classLoader, "setLabelAndUpdateDB", CharSequence.class, Context.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mLabelOrig", param.args[0]);
- modifyTitle(param.thisObject);
- }
- })) if (!Helpers.findAndHookMethodSilently("com.miui.home.launcher.ShortcutInfo", lpparam.classLoader, "setLabel", CharSequence.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mLabelOrig", param.args[0]);
- modifyTitle(param.thisObject);
- }
- })) Helpers.findAndHookMethod("com.miui.home.launcher.ShortcutInfo", lpparam.classLoader, "setLabel", CharSequence.class, Context.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mLabelOrig", param.args[0]);
- modifyTitle(param.thisObject);
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.ShortcutInfo", lpparam.classLoader, "load", Context.class, Cursor.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- modifyTitle(param.thisObject);
- }
- });
-
- Helpers.hookAllMethodsSilently("com.miui.home.launcher.AppInfo", lpparam.classLoader, "resetTitle", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- modifyTitle(param.thisObject);
- }
- });
- }
-
- public static void CloseFolderOnLaunchHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.Launcher", lpparam.classLoader, "launch", "com.miui.home.launcher.ShortcutInfo", View.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if (MainModule.mPrefs.getStringAsInt("launcher_closefolders", 1) != 2) return;
- boolean mHasLaunchedAppFromFolder = XposedHelpers.getBooleanField(param.thisObject, "mHasLaunchedAppFromFolder");
- if (mHasLaunchedAppFromFolder) XposedHelpers.callMethod(param.thisObject, "closeFolder");
- }
- });
-
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.miui.home.launcher.common.CloseFolderStateMachine", lpparam.classLoader, "onPause", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- if (MainModule.mPrefs.getStringAsInt("launcher_closefolders", 1) == 3) param.setResult(null);
- }
- });
- }
-
- @SuppressWarnings("ResultOfMethodCallIgnored")
- public static void FSGesturesHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.DeviceConfig", lpparam.classLoader, "usingFsGesture", XC_MethodReplacement.returnConstant(true));
-
- Helpers.findAndHookMethodSilently("com.miui.home.recents.BaseRecentsImpl", lpparam.classLoader, "createAndAddNavStubView", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- boolean fsg = (boolean)XposedHelpers.getAdditionalStaticField(XposedHelpers.findClass("com.miui.home.recents.BaseRecentsImpl", lpparam.classLoader), "REAL_FORCE_FSG_NAV_BAR");
- if (!fsg) param.setResult(null);
- }
- });
-
- Helpers.findAndHookMethodSilently("com.miui.home.recents.BaseRecentsImpl", lpparam.classLoader, "updateFsgWindowState", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- boolean fsg = (boolean)XposedHelpers.getAdditionalStaticField(XposedHelpers.findClass("com.miui.home.recents.BaseRecentsImpl", lpparam.classLoader), "REAL_FORCE_FSG_NAV_BAR");
- if (fsg) return;
-
- Object mNavStubView = XposedHelpers.getObjectField(param.thisObject, "mNavStubView");
- Object mWindowManager = XposedHelpers.getObjectField(param.thisObject, "mWindowManager");
- if (mWindowManager != null && mNavStubView != null) {
- XposedHelpers.callMethod(mWindowManager, "removeView", mNavStubView);
- XposedHelpers.setObjectField(param.thisObject, "mNavStubView", null);
- }
- }
- });
-
- Helpers.findAndHookMethodSilently("com.miui.launcher.utils.MiuiSettingsUtils", lpparam.classLoader, "getGlobalBoolean", ContentResolver.class, String.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (!"force_fsg_nav_bar".equals(param.args[1])) return;
-
- for (StackTraceElement el: Thread.currentThread().getStackTrace())
- if ("com.miui.home.recents.BaseRecentsImpl".equals(el.getClassName())) {
- XposedHelpers.setAdditionalStaticField(XposedHelpers.findClass("com.miui.home.recents.BaseRecentsImpl", lpparam.classLoader), "REAL_FORCE_FSG_NAV_BAR", param.getResult());
- param.setResult(true);
- return;
- }
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.recents.GestureStubView", lpparam.classLoader, "onTouchEvent", MotionEvent.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- MotionEvent event = (MotionEvent)param.args[0];
- if (event.getAction() != MotionEvent.ACTION_DOWN) return;
- View stub = (View)param.thisObject;
- String pkgName = Settings.Global.getString(stub.getContext().getContentResolver(), Helpers.modulePkg + ".foreground.package");
- if (MainModule.mPrefs.getStringSet("controls_fsg_horiz_apps").contains(pkgName)) param.setResult(false);
- }
- });
- }
-
- public static void FixStatusBarModeHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.Launcher", lpparam.classLoader, "changeStatusBarMode", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- Activity act = (Activity)param.thisObject;
- boolean mDuringMinusOneStartActivityForResult = XposedHelpers.getBooleanField(act, "mDuringMinusOneStartActivityForResult");
- boolean isMinusScreenShowing = (boolean)XposedHelpers.callMethod(act, "isMinusScreenShowing");
- if (!mDuringMinusOneStartActivityForResult) {
- if (isMinusScreenShowing) {
- XposedHelpers.setBooleanField(act, "mNeedChangeStatusBarMode", true);
- } else {
- XposedHelpers.callStaticMethod(XposedHelpers.findClass("com.miui.launcher.utils.MiuiWindowManagerUtils", lpparam.classLoader),
- "changeStatusBarMode",
- act.getWindow(),
- XposedHelpers.callStaticMethod(XposedHelpers.findClass("com.miui.home.launcher.WallpaperUtils", lpparam.classLoader), "hasLightBgForStatusBar")
- );
- XposedHelpers.setBooleanField(act, "mNeedChangeStatusBarMode", false);
- }
- }
- param.setResult(null);
- }
- });
- }
-
- @SuppressWarnings({"FieldCanBeLocal", "FieldMayBeFinal"})
- public static class DoubleTapController {
- private final long MAX_DURATION = 500;
- private float mActionDownRawX;
- private float mActionDownRawY;
- private int mClickCount;
- private final Context mContext;
- private float mFirstClickRawX;
- private float mFirstClickRawY;
- private long mLastClickTime;
- private int mTouchSlop;
-
- DoubleTapController(Context context) {
- this.mContext = context;
- this.mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop() * 2;
- }
-
- boolean isDoubleTapEvent(MotionEvent motionEvent) {
- int action = motionEvent.getActionMasked();
- if (action == MotionEvent.ACTION_DOWN) {
- this.mActionDownRawX = motionEvent.getRawX();
- this.mActionDownRawY = motionEvent.getRawY();
- return false;
- } else if (action != MotionEvent.ACTION_UP) {
- return false;
- } else {
- float rawX = motionEvent.getRawX();
- float rawY = motionEvent.getRawY();
- if (Math.abs(rawX - this.mActionDownRawX) <= ((float) this.mTouchSlop) && Math.abs(rawY - this.mActionDownRawY) <= ((float) this.mTouchSlop)) {
- if (SystemClock.elapsedRealtime() - this.mLastClickTime > MAX_DURATION || rawY - this.mFirstClickRawY > (float)this.mTouchSlop || rawX - this.mFirstClickRawX > (float)this.mTouchSlop) {
- this.mClickCount = 0;
- }
- this.mClickCount++;
- if (this.mClickCount == 1) {
- this.mFirstClickRawX = rawX;
- this.mFirstClickRawY = rawY;
- this.mLastClickTime = SystemClock.elapsedRealtime();
- return false;
- } else if (Math.abs(rawY - this.mFirstClickRawY) <= ((float) this.mTouchSlop) && Math.abs(rawX - this.mFirstClickRawX) <= ((float) this.mTouchSlop) && SystemClock.elapsedRealtime() - this.mLastClickTime <= MAX_DURATION) {
- this.mClickCount = 0;
- return true;
- }
- }
- this.mClickCount = 0;
- return false;
- }
- }
-
- void onDoubleTapEvent() {
- GlobalActions.handleAction(mContext, "pref_key_launcher_doubletap");
- }
- }
-
- public static void LauncherDoubleTapHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.miui.home.launcher.Workspace", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Object mDoubleTapControllerEx = XposedHelpers.getAdditionalInstanceField(param.thisObject, "mDoubleTapControllerEx");
- if (mDoubleTapControllerEx != null) return;
- mDoubleTapControllerEx = new DoubleTapController((Context)param.args[0]);
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mDoubleTapControllerEx", mDoubleTapControllerEx);
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.Workspace", lpparam.classLoader, "dispatchTouchEvent", MotionEvent.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- DoubleTapController mDoubleTapControllerEx = (DoubleTapController)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mDoubleTapControllerEx");
- if (mDoubleTapControllerEx == null) return;
- if (!mDoubleTapControllerEx.isDoubleTapEvent((MotionEvent)param.args[0])) return;
- int mCurrentScreenIndex = XposedHelpers.getIntField(param.thisObject, lpparam.packageName.equals("com.miui.home") ? "mCurrentScreenIndex" : "mCurrentScreen");
- Object cellLayout = XposedHelpers.callMethod(param.thisObject, "getCellLayout", mCurrentScreenIndex);
- if ((boolean)XposedHelpers.callMethod(cellLayout, "lastDownOnOccupiedCell")) return;
- if ((boolean)XposedHelpers.callMethod(param.thisObject, "isInNormalEditingMode")) return;
- mDoubleTapControllerEx.onDoubleTapEvent();
- }
- });
- }
-
- public static void TitleShadowHook(LoadPackageParam lpparam) {
- if (lpparam.packageName.equals("com.miui.home"))
- Helpers.findAndHookMethod("com.miui.home.launcher.WallpaperUtils", lpparam.classLoader, "getIconTitleShadowColor", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- int color = (int)param.getResult();
- if (color == Color.TRANSPARENT) return;
- param.setResult(Color.argb(Math.round(Color.alpha(color) + (255 - Color.alpha(color)) / 1.9f), Color.red(color), Color.green(color), Color.blue(color)));
- }
- }); else
- Helpers.findAndHookMethod("com.miui.home.launcher.WallpaperUtils", lpparam.classLoader, "getTitleShadowColor", int.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- int color = (int)param.getResult();
- if (color == Color.TRANSPARENT) return;
- param.setResult(Color.argb(Math.round(Color.alpha(color) + (255 - Color.alpha(color)) / 1.9f), Color.red(color), Color.green(color), Color.blue(color)));
- }
- });
- }
-
- public static void HideNavBarHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.DeviceConfig", lpparam.classLoader, "loadScreenSize", Context.class, Resources.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- Settings.Global.putInt(((Context)param.args[0]).getContentResolver(), "force_immersive_nav_bar", 1);
- }
- });
- }
-
- private static void showSeekBar(View workspace) {
- if (!"Workspace".equals(workspace.getClass().getSimpleName())) return;
- boolean isInEditingMode = (boolean)XposedHelpers.callMethod(workspace, "isInNormalEditingMode");
- View mScreenSeekBar = (View)XposedHelpers.getObjectField(workspace, "mScreenSeekBar");
- if (mScreenSeekBar == null) {
- Helpers.log("HideSeekPointsHook", "Cannot find seekbar");
- return;
- }
- Context mContext = workspace.getContext();
- Handler mHandler = (Handler)XposedHelpers.getAdditionalInstanceField(workspace, "mHandlerEx");
- if (mHandler == null) {
- mHandler = new Handler(mContext.getMainLooper()) {
- @Override
- public void handleMessage(Message msg) {
- View seekBar = (View)msg.obj;
- if (seekBar != null)
- seekBar.animate().alpha(0.0f).setDuration(600).withEndAction(new Runnable() {
- @Override
- public void run() {
- seekBar.setVisibility(View.GONE);
- }
- });
- }
- };
- XposedHelpers.setAdditionalInstanceField(workspace, "mHandlerEx", mHandler);
- }
- if (mHandler == null) {
- Helpers.log("HideSeekPointsHook", "Cannot create handler");
- return;
- }
- if (mHandler.hasMessages(666)) mHandler.removeMessages(666);
- mScreenSeekBar.animate().cancel();
- if (!isInEditingMode && MainModule.mPrefs.getBoolean("launcher_hideseekpoints_edit")) {
- mScreenSeekBar.setAlpha(0.0f);
- mScreenSeekBar.setVisibility(View.GONE);
- return;
- }
- mScreenSeekBar.setVisibility(View.VISIBLE);
- mScreenSeekBar.animate().alpha(1.0f).setDuration(300);
- if (!isInEditingMode) {
- Message msg = Message.obtain(mHandler, 666);
- msg.obj = mScreenSeekBar;
- mHandler.sendMessageDelayed(msg, 1500);
- }
- }
-
- public static void HideSeekPointsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.ScreenView", lpparam.classLoader, "updateSeekPoints", int.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- showSeekBar((View)param.thisObject);
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.ScreenView", lpparam.classLoader, "addView", View.class, int.class, ViewGroup.LayoutParams.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- showSeekBar((View)param.thisObject);
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.ScreenView", lpparam.classLoader, "removeScreen", int.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- showSeekBar((View)param.thisObject);
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.ScreenView", lpparam.classLoader, "removeScreensInLayout", int.class, int.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- showSeekBar((View)param.thisObject);
- }
- });
- }
-
- public static void InfiniteScrollHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.ScreenView", lpparam.classLoader, "getSnapToScreenIndex", int.class, int.class, int.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if (param.args[0] != param.getResult()) return;
- int screenCount = (int)XposedHelpers.callMethod(param.thisObject, "getScreenCount");
- if ((int)param.args[2] == -1 && (int)param.args[0] == 0)
- param.setResult(screenCount);
- else if ((int)param.args[2] == 1 && (int)param.args[0] == screenCount - 1)
- param.setResult(0);
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.ScreenView", lpparam.classLoader, "getSnapUnitIndex", int.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- int mCurrentScreenIndex = XposedHelpers.getIntField(param.thisObject, lpparam.packageName.equals("com.miui.home") ? "mCurrentScreenIndex" : "mCurrentScreen");
- if (mCurrentScreenIndex != (int)param.getResult()) return;
- int screenCount = (int)XposedHelpers.callMethod(param.thisObject, "getScreenCount");
- if ((int)param.getResult() == 0)
- param.setResult(screenCount);
- else if ((int)param.getResult() == screenCount - 1)
- param.setResult(0);
- }
- });
- }
-
- public static void UnlockGridsRes() {
- MainModule.resHooks.setObjectReplacement("com.miui.home", "integer", "config_cell_count_x", 3);
- MainModule.resHooks.setObjectReplacement("com.miui.home", "integer", "config_cell_count_y", 4);
- MainModule.resHooks.setObjectReplacement("com.miui.home", "integer", "config_cell_count_x_min", 3);
- MainModule.resHooks.setObjectReplacement("com.miui.home", "integer", "config_cell_count_y_min", 4);
- MainModule.resHooks.setObjectReplacement("com.miui.home", "integer", "config_cell_count_x_max", 10);
- MainModule.resHooks.setObjectReplacement("com.miui.home", "integer", "config_cell_count_y_max", 10);
- }
-
- public static void UnlockGridsHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethodsSilently("com.miui.home.launcher.compat.LauncherCellCountCompatDevice", lpparam.classLoader, "shouldUseDeviceValue", XC_MethodReplacement.returnConstant(false));
- }
-
- public static void FolderColumnsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.Folder", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- int cols = MainModule.mPrefs.getInt("launcher_folder_cols", 1);
-
- GridView mContent = (GridView)XposedHelpers.getObjectField(param.thisObject, "mContent");
- mContent.setNumColumns(cols);
-
- if (MainModule.mPrefs.getBoolean("launcher_folderwidth")) {
- ViewGroup.LayoutParams lp = mContent.getLayoutParams();
- lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
- mContent.setLayoutParams(lp);
- }
-
- if (cols > 3 && MainModule.mPrefs.getBoolean("launcher_folderspace")) {
- ViewGroup mBackgroundView = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mBackgroundView");
- if (mBackgroundView != null)
- mBackgroundView.setPadding(
- mBackgroundView.getPaddingLeft() / 3,
- mBackgroundView.getPaddingTop(),
- mBackgroundView.getPaddingRight() / 3,
- mBackgroundView.getPaddingBottom()
- );
- }
- }
- });
-
- Helpers.hookAllMethods("com.miui.home.launcher.Folder", lpparam.classLoader, "onLayout", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if (!MainModule.mPrefs.getBoolean("launcher_folderwidth")) return;
- GridView mContent = (GridView)XposedHelpers.getObjectField(param.thisObject, "mContent");
- ImageView mFakeIcon = (ImageView)XposedHelpers.getObjectField(param.thisObject, "mFakeIcon");
- mFakeIcon.layout(mContent.getLeft(), mContent.getTop(), mContent.getRight(), mContent.getTop() + mContent.getWidth());
- }
- });
- }
-
- public static void IconScaleHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.ShortcutIcon", lpparam.classLoader, "restoreToInitState", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- ViewGroup mIconContainer = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mIconContainer");
- if (mIconContainer == null || mIconContainer.getChildAt(0) == null) return;
- float multx = (float)Math.sqrt(MainModule.mPrefs.getInt("launcher_iconscale", 100) / 100f);
- mIconContainer.getChildAt(0).setScaleX(multx);
- mIconContainer.getChildAt(0).setScaleY(multx);
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.ItemIcon", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- float multx = (float)Math.sqrt(MainModule.mPrefs.getInt("launcher_iconscale", 100) / 100f);
-
- ViewGroup mIconContainer = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mIconContainer");
- if (mIconContainer != null && mIconContainer.getChildAt(0) != null) {
- mIconContainer.getChildAt(0).setScaleX(multx);
- mIconContainer.getChildAt(0).setScaleY(multx);
- mIconContainer.setClipToPadding(false);
- mIconContainer.setClipChildren(false);
- }
-
- if (multx > 1) {
- final TextView mMessage = (TextView)XposedHelpers.getObjectField(param.thisObject, "mMessage");
- if (mMessage != null)
- mMessage.addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {}
-
- @Override
- public void afterTextChanged(Editable s) {
- int maxWidth = mMessage.getResources().getDimensionPixelSize(mMessage.getResources().getIdentifier("icon_message_max_width", "dimen", lpparam.packageName));
- mMessage.measure(View.MeasureSpec.makeMeasureSpec(maxWidth, View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(maxWidth, View.MeasureSpec.AT_MOST));
- mMessage.setTranslationX(-mMessage.getMeasuredWidth() * (multx - 1) / 2f);
- mMessage.setTranslationY(mMessage.getMeasuredHeight() * (multx - 1) / 2f);
- }
- });
- }
-
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mMessageAnimationOrig", XposedHelpers.getObjectField(param.thisObject, "mMessageAnimation"));
- XposedHelpers.setObjectField(param.thisObject, "mMessageAnimation", new Runnable() {
- @Override
- public void run() {
- try {
- Runnable mMessageAnimationOrig = (Runnable)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mMessageAnimationOrig");
- mMessageAnimationOrig.run();
- boolean mIsShowMessageAnimation = XposedHelpers.getBooleanField(param.thisObject, "mIsShowMessageAnimation");
- if (mIsShowMessageAnimation) {
- View mMessage = (View)XposedHelpers.getObjectField(param.thisObject, "mMessage");
- mMessage.animate().cancel();
- mMessage.animate().scaleX(multx).scaleY(multx).setStartDelay(0).start();
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- });
-
-// if (mult <= 1) return;
-// TextView mMessage = (TextView)XposedHelpers.getObjectField(param.thisObject, "mMessage");
-// if (mMessage != null) {
-// int width = mMessage.getResources().getDimensionPixelSize(mMessage.getResources().getIdentifier("icon_message_max_width", "dimen", lpparam.packageName));
-// mMessage.setTranslationX(-width/2f * (1f - 1f / mult));
-// mMessage.setTranslationY(width/2f * (1f - 1f / mult));
-// }
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.ItemIcon", lpparam.classLoader, "getIconLocation", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- float multx = (float)Math.sqrt(MainModule.mPrefs.getInt("launcher_iconscale", 100) / 100f);
- Rect rect = (Rect)param.getResult();
- if (rect == null) return;
- rect.right = rect.left + Math.round(rect.width() * multx);
- rect.bottom = rect.top + Math.round(rect.height() * multx);
- param.setResult(rect);
- }
- });
-
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.miui.home.launcher.gadget.ClearButton", lpparam.classLoader, "onCreate", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- ViewGroup mIconContainer = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mIconContainer");
- if (mIconContainer == null || mIconContainer.getChildAt(0) == null) return;
- float multx = (float)Math.sqrt(MainModule.mPrefs.getInt("launcher_iconscale", 100) / 100f);
- mIconContainer.getChildAt(0).setScaleX(multx);
- mIconContainer.getChildAt(0).setScaleY(multx);
- }
- });
-
-// Helpers.findAndHookMethod("com.miui.home.launcher.Folder", lpparam.classLoader, "onOpen", boolean.class, new MethodHook() {
-// @Override
-// protected void after(final MethodHookParam param) throws Throwable {
-// XposedHelpers.setFloatField(param.thisObject, "mItemIconToPreviewIconScale", -1.0f);
-// }
-// });
-//
-// Helpers.findAndHookMethod("com.miui.home.launcher.Folder", lpparam.classLoader, "changeItemsInFolderDuringOpenAndCloseAnimation", float.class, new MethodHook() {
-// @Override
-// protected void after(final MethodHookParam param) throws Throwable {
-// float multx = (float)Math.sqrt(MainModule.mPrefs.getInt("launcher_iconscale", 100) / 100f);
-// ViewGroup mContent = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mContent");
-// for (int i = 0; i < mContent.getChildCount(); i++) {
-// String cls = mContent.getChildAt(i).getClass().getSimpleName();
-// if ("ItemIcon".equals(cls) || "ShortcutIcon".equals(cls) || "FolderIcon".equals(cls)) {
-// View iconContainer = (View)XposedHelpers.callMethod(mContent.getChildAt(i), "getIconContainer");
-// float mult = (float)param.args[0] * multx;
-// iconContainer.setScaleX(mult);
-// iconContainer.setScaleY(mult);
-// }
-// }
-// }
-// });
- }
-
- public static void TitleFontSizeHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.ItemIcon", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- TextView mTitle = (TextView)XposedHelpers.getObjectField(param.thisObject, "mTitle");
- if (mTitle != null) mTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, MainModule.mPrefs.getInt("launcher_titlefontsize", 5));
- }
- });
-
- if (lpparam.packageName.equals("com.mi.android.globallauncher"))
- Helpers.hookAllMethods("com.miui.home.launcher.ItemIcon", lpparam.classLoader, "setTitleColorMode", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- TextView mTitle = (TextView)XposedHelpers.getObjectField(param.thisObject, "mTitle");
- if (mTitle != null) mTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, MainModule.mPrefs.getInt("launcher_titlefontsize", 5));
- }
- });
-
- Helpers.hookAllMethods("com.miui.home.launcher.ShortcutIcon", lpparam.classLoader, "fromXml", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Object buddyIcon = XposedHelpers.callMethod(param.args[3], "getBuddyIconView", param.args[2]);
- if (buddyIcon == null) return;
- TextView mTitle = (TextView)XposedHelpers.getObjectField(buddyIcon, "mTitle");
- if (mTitle != null) mTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, MainModule.mPrefs.getInt("launcher_titlefontsize", 5));
- }
- });
-
- if (lpparam.packageName.equals("com.miui.home")) {
- Helpers.hookAllMethods("com.miui.home.launcher.ShortcutIcon", lpparam.classLoader, "createShortcutIcon", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Object buddyIcon = param.getResult();
- if (buddyIcon == null) return;
- TextView mTitle = (TextView)XposedHelpers.getObjectField(buddyIcon, "mTitle");
- if (mTitle != null) mTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, MainModule.mPrefs.getInt("launcher_titlefontsize", 5));
- }
- });
-
- Helpers.hookAllMethods("com.miui.home.launcher.common.Utilities", lpparam.classLoader, "adaptTitleStyleToWallpaper", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- TextView mTitle = (TextView)param.args[1];
- if (mTitle != null && mTitle.getId() == mTitle.getResources().getIdentifier("icon_title", "id", "com.miui.home"))
- mTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, MainModule.mPrefs.getInt("launcher_titlefontsize", 5));
- }
- });
- }
- }
-
- public static void TitleTopMarginHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.ItemIcon", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- ViewGroup mTitleContainer = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mTitleContainer");
- if (mTitleContainer == null) return;
- ViewGroup.LayoutParams lp = mTitleContainer.getLayoutParams();
- int opt = Math.round((MainModule.mPrefs.getInt("launcher_titletopmargin", 0) - 11) * mTitleContainer.getResources().getDisplayMetrics().density);
- if (lp instanceof RelativeLayout.LayoutParams) {
- ((RelativeLayout.LayoutParams)lp).topMargin = opt;
- mTitleContainer.setLayoutParams(lp);
- } else {
- mTitleContainer.setTranslationY(opt);
- mTitleContainer.setClipChildren(false);
- mTitleContainer.setClipToPadding(false);
- ((ViewGroup)mTitleContainer.getParent()).setClipChildren(false);
- ((ViewGroup)mTitleContainer.getParent()).setClipToPadding(false);
- }
- }
- });
- }
-
- public static void PrivacyFolderHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.Launcher", lpparam.classLoader, "startSecurityHide", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- if (GlobalActions.handleAction((Activity)param.thisObject, "pref_key_launcher_spread")) {
- param.setResult(null);
- return;
- }
- boolean opt = Helpers.getSharedBoolPref((Activity)param.thisObject, "pref_key_launcher_privacyapps_gest", false);
- if (opt) param.setResult(null);
- }
- });
- }
-
- public static void HideTitlesHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.ItemIcon", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- View mTitleContainer = (View)XposedHelpers.getObjectField(param.thisObject, "mTitleContainer");
- if (mTitleContainer != null) mTitleContainer.setVisibility(View.GONE);
- }
- });
- }
-
- public static void HorizontalSpacingRes() {
- int opt = MainModule.mPrefs.getInt("launcher_horizmargin", 0) - 21;
- MainModule.resHooks.setDensityReplacement("com.miui.home", "dimen", "workspace_cell_padding_side", opt);
- MainModule.resHooks.setDensityReplacement("com.mi.android.globallauncher", "dimen", "workspace_cell_padding_side", opt);
- }
-
- public static void TopSpacingRes() {
- int opt = MainModule.mPrefs.getInt("launcher_topmargin", 0) - 21;
- MainModule.resHooks.setDensityReplacement("com.miui.home", "dimen", "workspace_cell_padding_top", opt);
- MainModule.resHooks.setDensityReplacement("com.mi.android.globallauncher", "dimen", "workspace_cell_padding_top", opt);
- }
-
- public static void IndicatorHeightRes() {
- int opt = MainModule.mPrefs.getInt("launcher_indicatorheight", 9);
- MainModule.resHooks.setDensityReplacement("com.miui.home", "dimen", "slide_bar_height", opt);
- MainModule.resHooks.setDensityReplacement("com.mi.android.globallauncher", "dimen", "slide_bar_height", opt);
- }
-
- public static void GoogleDiscoverHook(final LoadPackageParam lpparam) {
- try {
- XposedHelpers.setStaticBooleanField(XposedHelpers.findClass("com.miui.home.launcher.DeviceConfig", lpparam.classLoader), "IS_USE_GOOGLE_MINUS_SCREEN", true);
- } catch (Throwable ignore) {}
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.miui.home.launcher.DeviceConfig", lpparam.classLoader, "isUseGoogleMinusScreen", XC_MethodReplacement.returnConstant(true));
- }
-
- @SuppressWarnings("unchecked")
- public static void GoogleMinusScreenHook(final LoadPackageParam lpparam) {
- try {
- Class> configCls = XposedHelpers.findClass("com.miui.home.launcher.DeviceConfig", lpparam.classLoader);
- if (configCls == null) {
- Helpers.log("GoogleMinusScreenHook", "Cannot find config class");
- return;
- }
-
- HashSet SELECT_MINUS_SCREEN_CLIENT_ID = (HashSet)XposedHelpers.getStaticObjectField(configCls, "SELECT_MINUS_SCREEN_CLIENT_ID");
- SELECT_MINUS_SCREEN_CLIENT_ID.add("");
-
- //HashSet USE_GOOGLE_MINUS_SCREEN_REGIONS = (HashSet)XposedHelpers.getStaticObjectField(configCls, "USE_GOOGLE_MINUS_SCREEN_REGIONS");
- //String CURRENT_REGION = (String)XposedHelpers.getStaticObjectField(configCls, "CURRENT_REGION");
- //USE_GOOGLE_MINUS_SCREEN_REGIONS.add(CURRENT_REGION);
-
- XposedHelpers.setStaticBooleanField(configCls, "CAN_SWITCH_MINUS_SCREEN", true);
- XposedHelpers.setStaticBooleanField(configCls, "ONLY_USE_GOOGLE_MINUS_SCREEN", false);
- Class> appCls = XposedHelpers.findClassIfExists("com.miui.home.launcher.Application", lpparam.classLoader);
- if (appCls != null) try {
- Application app = (Application)XposedHelpers.callStaticMethod(appCls, "getInstance");
- XposedHelpers.setStaticBooleanField(configCls, "IS_USE_GOOGLE_MINUS_SCREEN", "personal_assistant_google".equals(Settings.System.getString(app.getContentResolver(), "switch_personal_assistant")));
- } catch (Throwable ignore) {}
- } catch (Throwable t) {
- Helpers.log("GoogleMinusScreenHook", t);
- }
- }
-
- public static void ShowHotseatTitlesRes() {
- MainModule.resHooks.setObjectReplacement("com.miui.home", "bool", "config_hide_hotseats_app_title", false);
- MainModule.resHooks.setObjectReplacement("com.mi.android.globallauncher", "bool", "config_hide_hotseats_app_title", false);
- }
-
- public static void ShowHotseatTitlesHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.miui.home.launcher.DeviceConfig", lpparam.classLoader, "calcHotSeatsHeight", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context context = (Context)param.args[0];
- if (context == null) return;
- int height = (int)param.getResult();
- boolean sIsImmersiveNavigationBar = XposedHelpers.getStaticBooleanField(XposedHelpers.findClass("com.miui.home.launcher.DeviceConfig", lpparam.classLoader), "sIsImmersiveNavigationBar");
- if (sIsImmersiveNavigationBar) param.setResult(Math.round(height + 8 * context.getResources().getDisplayMetrics().density));
- }
- });
- }
-
- public static void FolderBlurHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.Launcher", lpparam.classLoader, "onCreate", Bundle.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- final Activity act = (Activity)param.thisObject;
- Handler mHandler = (Handler)XposedHelpers.getObjectField(act, "mHandler");
- new Helpers.SharedPrefObserver(act, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String type = uri.getPathSegments().get(1);
- String key = uri.getPathSegments().get(2);
- if (key.contains("pref_key_launcher_folder"))
- switch (type) {
- case "string":
- MainModule.mPrefs.put(key, Helpers.getSharedStringPref(act, key, ""));
- break;
- case "integer":
- MainModule.mPrefs.put(key, Helpers.getSharedIntPref(act, key, 1));
- break;
- case "boolean":
- MainModule.mPrefs.put(key, Helpers.getSharedBoolPref(act, key, false));
- break;
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Class> buCls = XposedHelpers.findClassIfExists("com.miui.home.launcher.common.BlurUtils", lpparam.classLoader);
- if (buCls != null) {
- Helpers.findAndHookMethod("com.miui.home.launcher.common.BlurUtils", lpparam.classLoader, "isUserBlurWhenOpenFolder", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- param.setResult(true);
- }
- });
-
- Method[] methods = buCls.getDeclaredMethods();
- Method fastBlur = null;
- for (Method method: methods)
- if ("fastBlur".equals(method.getName())) {
- fastBlur = method;
- if (method.getParameterTypes().length == 4) break;
- }
-
- if (fastBlur == null) Helpers.log("FolderBlurHook", "Cannot find fastBlur util method!"); else
- Helpers.hookMethod(fastBlur, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if (MainModule.mPrefs.getBoolean("launcher_folderwallblur_disable")) {
- param.args[0] = 0.0f;
- return;
- }
- float ratio = MainModule.mPrefs.getInt("launcher_folderwallblur_radius", 0) / 100f;
- if (ratio > 0) param.args[0] = (float)param.args[0] * ratio;
- }
- });
-
- return;
- }
-
- Helpers.findAndHookMethod("com.miui.home.launcher.blur.BlockingBlurController", lpparam.classLoader, "setBlurEnabled", boolean.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if (MainModule.mPrefs.getBoolean("launcher_folderblur_disable")) param.args[0] = false;
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.view.BlurFrameLayout", lpparam.classLoader, "setBlurAlpha", float.class, new MethodHook(10) {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- float ratio = MainModule.mPrefs.getInt("launcher_folderblur_opacity", 0) / 100f;
- if (ratio > 0) param.args[0] = ratio + (float)param.args[0] * (1.0f - ratio);
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.view.BlurFrameLayout", lpparam.classLoader, "setBlurRadius", float.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- float ratio = 5 * MainModule.mPrefs.getInt("launcher_folderblur_radius", 0) / 100f;
- if (ratio > 0) param.args[0] = ratio;
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.common.Utilities", lpparam.classLoader, "fastBlur", float.class, Window.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if (MainModule.mPrefs.getBoolean("launcher_folderwallblur_disable")) {
- param.args[0] = 0.0f;
- return;
- }
- float ratio = MainModule.mPrefs.getInt("launcher_folderwallblur_radius", 0) / 100f;
- if (ratio > 0) param.args[0] = (float)param.args[0] * ratio;
- }
- });
- }
-
- public static void StatusBarHeightHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.miui.home.launcher.Workspace", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ViewGroup workspace = (ViewGroup)param.thisObject;
- workspace.setPadding(
- workspace.getPaddingLeft(),
- workspace.getResources().getDimensionPixelSize(workspace.getResources().getIdentifier("status_bar_height", "dimen", "android")),
- workspace.getPaddingRight(),
- workspace.getPaddingBottom()
- );
- }
- });
- }
-
- private static float scaleStiffness(float val, float scale) {
- return (scale < 1.0f ? 2f / scale : 1.0f / scale) * val;
- }
-
- public static void FixAnimHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.miui.home.launcher.animate.SpringAnimator", lpparam.classLoader, "getSpringForce", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- float scale = Helpers.getAnimationScale(2);
- if (scale == 1.0f) return;
- if (scale == 0) scale = 0.01f;
- param.args[2] = scaleStiffness((float)param.args[2], scale);
- }
- });
-
- MethodHook hook = new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- float scale = Helpers.getAnimationScale(2);
- if (scale == 1.0f) return;
- if (scale == 0) scale = 0.01f;
- XposedHelpers.setFloatField(param.thisObject, "mCenterXStiffness", scaleStiffness(XposedHelpers.getFloatField(param.thisObject, "mCenterXStiffness"), scale));
- XposedHelpers.setFloatField(param.thisObject, "mCenterYStiffness", scaleStiffness(XposedHelpers.getFloatField(param.thisObject, "mCenterYStiffness"), scale));
- XposedHelpers.setFloatField(param.thisObject, "mWidthStiffness", scaleStiffness(XposedHelpers.getFloatField(param.thisObject, "mWidthStiffness"), scale));
- XposedHelpers.setFloatField(param.thisObject, "mRadiusStiffness", scaleStiffness(XposedHelpers.getFloatField(param.thisObject, "mRadiusStiffness"), scale));
- XposedHelpers.setFloatField(param.thisObject, "mAlphaStiffness", scaleStiffness(XposedHelpers.getFloatField(param.thisObject, "mAlphaStiffness"), scale));
- try {
- XposedHelpers.setFloatField(param.thisObject, "mRatioStiffness", scaleStiffness(XposedHelpers.getFloatField(param.thisObject, "mRatioStiffness"), scale));
- } catch (Throwable t) {
- XposedHelpers.setFloatField(param.thisObject, "mRadioStiffness", scaleStiffness(XposedHelpers.getFloatField(param.thisObject, "mRadioStiffness"), scale));
- }
- }
- };
-
- if (!Helpers.hookAllMethodsSilently("com.miui.home.recents.util.RectFSpringAnim", lpparam.classLoader, "start", hook))
- Helpers.hookAllMethods("com.miui.home.recents.util.RectFSpringAnim", lpparam.classLoader, "initAllAnimations", hook);
-
-// if (XposedHelpers.findClassIfExists("com.android.systemui.shared.recents.system.RemoteAnimationAdapterCompat", lpparam.classLoader) != null)
-// Helpers.hookAllConstructors("com.android.systemui.shared.recents.system.RemoteAnimationAdapterCompat", lpparam.classLoader, new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// float scale = Helpers.getAnimationScale(2);
-// if (scale == 1.0f) return;
-// param.args[1] = (long)((long)param.args[1] * scale);
-// param.args[2] = (long)((long)param.args[2] * scale);
-// }
-// });
- }
-
- public static void BottomSpacingRes() {
- int opt = MainModule.mPrefs.getInt("launcher_bottommargin", 0);
- MainModule.resHooks.setDensityReplacement("com.miui.home", "dimen", "hotseats_padding_bottom", opt);
- }
-
- public static void BottomSpacingHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.miui.home.launcher.DeviceConfig", lpparam.classLoader, "calcHotSeatsHeight", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context context = (Context)param.args[0];
- if (context == null) return;
- int height = (int)param.getResult();
- int opt = MainModule.mPrefs.getInt("launcher_bottommargin", 0);
- param.setResult(Math.round(height + opt * context.getResources().getDisplayMetrics().density));
- }
- });
- }
-
- public static void HorizontalWidgetSpacingHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.miui.home.launcher.DeviceConfig", lpparam.classLoader, "getMiuiWidgetSizeSpec", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (param.args.length < 4) return;
- Context context = Helpers.findContext();
- long spec = (long)param.getResult();
- long width = spec >> 32;
- long height = spec - ((spec >> 32) << 32);
- int opt = Math.round((MainModule.mPrefs.getInt("launcher_horizwidgetmargin", 0) - 21) * context.getResources().getDisplayMetrics().density) * 2;
- width -= opt;
- param.setResult((width << 32) | height);
- }
- });
-
- Helpers.hookAllMethods("com.miui.home.launcher.MIUIWidgetUtil", lpparam.classLoader, "getMiuiWidgetPadding", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- param.setResult(new Rect());
- }
- });
- }
-
- public static void FixAppInfoLaunchHook(LoadPackageParam lpparam) {
- if (lpparam.packageName.equals("com.mi.android.globallauncher"))
- Helpers.hookAllMethods("com.miui.home.launcher.util.Utilities", lpparam.classLoader, "startDetailsActivityForInfo", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Object itemInfo = param.args[0];
- ComponentName component;
- try {
- component = (ComponentName)XposedHelpers.callMethod(itemInfo, "getComponentName");
- } catch (Throwable t1) {
- try {
- component = (ComponentName)XposedHelpers.callMethod(XposedHelpers.getObjectField(itemInfo, "intent"), "getComponent");
- } catch (Throwable t2) {
- try {
- component = (ComponentName)XposedHelpers.getObjectField(itemInfo, "providerName");
- } catch (Throwable t3) {
- component = (ComponentName)XposedHelpers.getObjectField(XposedHelpers.getObjectField(itemInfo, "providerInfo"), "provider");
- }
- }
- }
- if (component == null) return;
- Context context = (Context)param.args[1];
- if (context == null) return;
- UserHandle userHandle = (UserHandle)XposedHelpers.callMethod(param.args[0], "getUser");
- Helpers.openAppInfo(context, component.getPackageName(), userHandle != null ? userHandle.hashCode() : 0);
- param.setResult(true);
- }
- });
- else
- Helpers.hookAllMethods("com.miui.home.launcher.shortcuts.ShortcutMenuManager", lpparam.classLoader, "startAppDetailsActivity", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- ComponentName component = (ComponentName)XposedHelpers.callMethod(param.args[0], "getComponentName");
- if (component == null) return;
- View view = (View)param.args[1];
- if (view == null) return;
- UserHandle userHandle = (UserHandle)XposedHelpers.callMethod(param.args[0], "getUserHandle");
- Helpers.openAppInfo(view.getContext(), component.getPackageName(), userHandle != null ? userHandle.hashCode() : 0);
- param.setResult(null);
- }
- });
- }
-
- public static void NoWidgetOnlyHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.CellLayout", lpparam.classLoader, "setScreenType", int.class, new MethodHook() {
- @Override
- protected void before(XC_MethodHook.MethodHookParam param) throws Throwable {
- param.args[0] = 0;
- }
- });
- }
-
- public static void NoUnlockAnimationHook(LoadPackageParam lpparam) {
- if (!Helpers.findAndHookMethodSilently("com.miui.home.launcher.common.Utilities", lpparam.classLoader, "notShowUserPresentAnimation", Context.class, XC_MethodReplacement.returnConstant(true)))
- Helpers.hookAllMethods("com.miui.launcher.utils.MiuiSettingsUtils", lpparam.classLoader, "isSystemAnimationOpen", XC_MethodReplacement.returnConstant(false));
- }
-
- public static void NoZoomAnimationHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.miui.home.recents.util.SpringAnimationUtils", lpparam.classLoader, "startShortcutMenuLayerFadeOutAnim", XC_MethodReplacement.DO_NOTHING);
- Helpers.hookAllMethods("com.miui.home.recents.util.SpringAnimationUtils", lpparam.classLoader, "startShortcutMenuLayerFadeInAnim", XC_MethodReplacement.DO_NOTHING);
- }
-
- public static void UseOldLaunchAnimationHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.miui.home.recents.QuickstepAppTransitionManagerImpl", lpparam.classLoader, "hasControlRemoteAppTransitionPermission", XC_MethodReplacement.returnConstant(false));
- Helpers.hookAllMethods("com.miui.home.recents.QuickstepAppTransitionManagerImpl", lpparam.classLoader, "registerRemoteAnimations", XC_MethodReplacement.DO_NOTHING);
- Helpers.hookAllMethods("com.miui.home.recents.QuickstepAppTransitionManagerImpl", lpparam.classLoader, "getActivityLaunchOptions", new MethodHook() {
- @Override
- protected void after(XC_MethodHook.MethodHookParam param) throws Throwable {
- View view = (View)param.args[1];
- Rect rect = (Rect)param.args[2];
-
- boolean isLaunchingFromRecents = (boolean)XposedHelpers.callMethod(param.thisObject, "isLaunchingFromRecents", view, null);
- if (isLaunchingFromRecents) return;
-
- if (view == null) {
- param.setResult(null);
- return;
- }
-
- if (rect != null) {
- int[] arr = new int[2];
- view.getLocationOnScreen(arr);
- param.setResult(XposedHelpers.callStaticMethod(ActivityOptions.class, "makeClipRevealAnimation", view, rect.left - arr[0], rect.top - arr[1], rect.width(), rect.height(), true));
- } else {
- param.setResult(XposedHelpers.callStaticMethod(ActivityOptions.class, "makeClipRevealAnimation", view, 0, 0, view.getWidth(), view.getHeight(), false));
- }
- }
- });
- }
-
- public static void ReverseLauncherPortraitHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.Launcher", lpparam.classLoader, "onCreate", Bundle.class, new MethodHook() {
- @Override
- @SuppressLint("SourceLockedOrientationActivity")
- protected void after(XC_MethodHook.MethodHookParam param) throws Throwable {
- Activity act = (Activity)param.thisObject;
- act.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
- }
- });
- }
-
- public static void MaxHotseatIconsCountHook(LoadPackageParam lpparam) {
- String methodName = lpparam.packageName.equals("com.mi.android.globallauncher") ? "getHotseatCount" : "getHotseatMaxCount";
- Helpers.findAndHookMethod("com.miui.home.launcher.DeviceConfig", lpparam.classLoader, methodName, XC_MethodReplacement.returnConstant(666));
-
-// Helpers.findAndHookMethod("com.miui.home.launcher.RecentsAndFSGestureUtils", lpparam.classLoader, "isUseFsGestureV2Device", new MethodHook() {
-// @Override
-// protected void after(XC_MethodHook.MethodHookParam param) throws Throwable {
-// XposedBridge.log("isUseFsGestureV2Device: " + param.getResult());
-// }
-// });
-//
-// Helpers.findAndHookMethod("com.miui.home.launcher.RecentsAndFSGestureUtils", lpparam.classLoader, "isUseGestureVersion3", Context.class, new MethodHook() {
-// @Override
-// protected void after(XC_MethodHook.MethodHookParam param) throws Throwable {
-// XposedBridge.log("isUseGestureVersion3: " + param.getResult());
-// }
-// });
-//
-// Helpers.findAndHookMethod("com.miui.home.launcher.RecentsAndFSGestureUtils", lpparam.classLoader, "isSupportRecentsAndFsGesture", new MethodHook() {
-// @Override
-// protected void after(XC_MethodHook.MethodHookParam param) throws Throwable {
-// XposedBridge.log("isSupportRecentsAndFsGesture: " + param.getResult());
-// //param.setResult(false);
-// }
-// });
- }
-
- public static void RecentsBlurRatioHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.miui.home.recents.views.RecentsView", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- try {
- XposedHelpers.setFloatField(param.thisObject, "mDefaultScrimAlpha", 0.15f);
- XposedHelpers.setObjectField(param.thisObject, "mBackgroundScrim", new ColorDrawable(Color.argb(38, 0, 0, 0)).mutate());
- } catch (Throwable ignore) {}
- }
- });
-
- Helpers.hookAllConstructors("com.miui.home.recents.RecentsViewStateController", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)param.args[0];
- Handler mHandler = new Handler(mContext.getMainLooper());
-
- new Helpers.SharedPrefObserver(mContext, mHandler, "pref_key_system_recents_blur", 100) {
- @Override
- public void onChange(String name, int defValue) {
- MainModule.mPrefs.put(name, Helpers.getSharedIntPref(mContext, name, 100));
- }
- };
- }
- });
-
- Class> utilsClass = XposedHelpers.findClassIfExists("com.miui.home.launcher.common.BlurUtils", lpparam.classLoader);
- if (utilsClass == null) utilsClass = XposedHelpers.findClassIfExists("com.miui.home.launcher.common.Utilities", lpparam.classLoader);
- if (utilsClass == null) {
- Helpers.log("RecentsBlurRatioHook", "Cannot find blur utility class");
- return;
- }
-
- Helpers.hookAllMethods(utilsClass, "fastBlur", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = (float)param.args[0] * MainModule.mPrefs.getInt("system_recents_blur", 100) / 100f;
- }
- });
- }
-
- public static void CloseFolderOrDrawerOnLaunchShortcutMenuHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.shortcuts.AppShortcutMenuItem", lpparam.classLoader, "getOnClickListener", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- final View.OnClickListener listener = (View.OnClickListener)param.getResult();
- param.setResult(new View.OnClickListener() {
- public final void onClick(View view) {
- listener.onClick(view);
- Class> appCls = XposedHelpers.findClassIfExists("com.miui.home.launcher.Application", lpparam.classLoader);
- if (appCls == null) return;
- Object launcher = XposedHelpers.callStaticMethod(appCls, "getLauncher");
- if (launcher == null) return;
- if (MainModule.mPrefs.getBoolean("launcher_closedrawer")) XposedHelpers.callMethod(launcher, "hideAppView");
- if (MainModule.mPrefs.getStringAsInt("launcher_closefolders", 1) > 1) XposedHelpers.callMethod(launcher, "closeFolder");
- }
- });
- }
- });
- }
-
- public static void CloseDrawerOnLaunchHook(LoadPackageParam lpparam) {
- MethodHook hook = new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- XposedHelpers.callMethod(XposedHelpers.getObjectField(param.thisObject, "mLauncher"), "hideAppView");
- }
- };
- Helpers.findAndHookMethod("com.miui.home.launcher.allapps.category.fragment.AppsListFragment", lpparam.classLoader, "onClick", View.class, hook);
- Helpers.findAndHookMethod("com.miui.home.launcher.allapps.category.fragment.RecommendCategoryAppListFragment", lpparam.classLoader, "onClick", View.class, hook);
- }
-
- public static void LauncherPinchHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.home.launcher.Launcher", lpparam.classLoader, "onCreate", Bundle.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- final Activity act = (Activity)param.thisObject;
- Handler mHandler = (Handler)XposedHelpers.getObjectField(act, "mHandler");
- new Helpers.SharedPrefObserver(act, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String type = uri.getPathSegments().get(1);
- String key = uri.getPathSegments().get(2);
- if (key.contains("pref_key_launcher_pinch"))
- switch (type) {
- case "string":
- MainModule.mPrefs.put(key, Helpers.getSharedStringPref(act, key, ""));
- break;
- case "integer":
- MainModule.mPrefs.put(key, Helpers.getSharedIntPref(act, key, 1));
- break;
- case "boolean":
- MainModule.mPrefs.put(key, Helpers.getSharedBoolPref(act, key, false));
- break;
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.Workspace", lpparam.classLoader, "onPinching", float.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- float dampingScale = (float)XposedHelpers.callMethod(param.thisObject, "getDampingScale", param.args[0]);
- float screenScaleRatio = (float)XposedHelpers.callMethod(param.thisObject, "getScreenScaleRatio");
- if (dampingScale < screenScaleRatio)
- if (MainModule.mPrefs.getInt("launcher_pinch_action", 1) > 1) param.setResult(false);
- }
- });
-
- Helpers.findAndHookMethod("com.miui.home.launcher.Workspace", lpparam.classLoader, "onPinchingEnd", float.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- float dampingScale = (float)XposedHelpers.callMethod(param.thisObject, "getDampingScale", param.args[0]);
- float screenScaleRatio = (float)XposedHelpers.callMethod(param.thisObject, "getScreenScaleRatio");
- if (dampingScale < screenScaleRatio)
- if (GlobalActions.handleAction(((View)param.thisObject).getContext(), "pref_key_launcher_pinch")) {
- XposedHelpers.callMethod(param.thisObject, "finishCurrentGesture");
-
- Class> pinchingStateEnum = XposedHelpers.findClass("com.miui.home.launcher.Workspace$PinchingState", lpparam.classLoader);
- Object stateFollow = XposedHelpers.getStaticObjectField(pinchingStateEnum, "FOLLOW");
- Object stateReadyToEdit = XposedHelpers.getStaticObjectField(pinchingStateEnum, "READY_TO_EDIT");
-
- Object mState = XposedHelpers.getObjectField(param.thisObject, "mState");
- XposedHelpers.setObjectField(param.thisObject, "mState", stateFollow);
- if (mState == stateReadyToEdit)
- XposedHelpers.callMethod(XposedHelpers.getObjectField(param.thisObject, "mLauncher"), "changeEditingEntryViewToHotseats");
- XposedHelpers.callMethod(param.thisObject, "resetCellScreenScale", param.args[0]);
-
- param.setResult(null);
- }
- }
- });
- }
-
-// public static void NoInternationalBuildHook(LoadPackageParam lpparam) {
-// XposedHelpers.setStaticBooleanField(XposedHelpers.findClass("miui.os.Build", null), "IS_INTERNATIONAL_BUILD", false);
-// }
-
-// public static void ReplaceClockAppHook(LoadPackageParam lpparam) {
-// Helpers.findAndHookMethod("com.miui.home.launcher.common.Utilities", lpparam.classLoader, "startActivity", Context.class, String.class, View.class, new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// if (param.args[1] == null || !((String)param.args[1]).contains("DeskClockTabActivity")) return;
-//
-// Context mContext = (Context)param.args[0];
-// String pkgAppName = Helpers.getSharedStringPref(mContext, "pref_key_system_clock_app", "");
-// if (pkgAppName == null || pkgAppName.equals("")) return;
-//
-// String[] pkgAppArray = pkgAppName.split("\\|");
-// if (pkgAppArray.length < 2) return;
-//
-// ComponentName name = new ComponentName(pkgAppArray[0], pkgAppArray[1]);
-// Intent intent = new Intent(Intent.ACTION_MAIN);
-// intent.addCategory(Intent.CATEGORY_LAUNCHER);
-// intent.setComponent(name);
-//
-// param.args[1] = intent.toUri(0);
-// }
-// });
-//
-// Helpers.findAndHookMethod("com.miui.home.launcher.common.Utilities", lpparam.classLoader, "getDeskClockTabActivityIntent", new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// }
-// });
-// }
-
-// public static void ReplaceCalendarAppHook(LoadPackageParam lpparam) {
-// Class> seCls = findClassIfExists("miui.maml.elements.ScreenElement", lpparam.classLoader);
-// if (seCls == null) {
-// Helpers.log("ReplaceCalendarAppHook", "Cannot find ScreenElement class");
-// return;
-// }
-// Helpers.findAndHookMethod("miui.maml.ActionCommand", lpparam.classLoader, "create", Element.class, seCls, new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// Element el = (Element)param.args[0];
-// if (el == null || !el.getNodeName().equals("IntentCommand")) return;
-// if (el.getAttribute("package").equals("com.android.calendar") && el.getAttribute("class").contains("AllInOneActivity")) try {
-// Context mContext = (Context)XposedHelpers.getObjectField(XposedHelpers.callMethod(param.args[1], "getContext"), "mContext");
-// String pkgAppName = Helpers.getSharedStringPref(mContext, "pref_key_system_calendar_app", "");
-// if (pkgAppName == null || pkgAppName.equals("")) return;
-//
-// String[] pkgAppArray = pkgAppName.split("\\|");
-// if (pkgAppArray.length < 2) return;
-//
-// el.setAttribute("package", pkgAppArray[0]);
-// el.setAttribute("class", pkgAppArray[1]);
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// }
-// }
-// });
-// }
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/mods/PackagePermissions.java b/app/src/main/java/name/mikanoshi/customiuizer/mods/PackagePermissions.java
deleted file mode 100644
index 6ed6e801..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/mods/PackagePermissions.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package name.mikanoshi.customiuizer.mods;
-
-import android.content.pm.ApplicationInfo;
-import android.content.pm.ResolveInfo;
-
-import static de.robv.android.xposed.XposedHelpers.findClass;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
-import de.robv.android.xposed.XposedHelpers;
-
-import name.mikanoshi.customiuizer.utils.Helpers;
-import name.mikanoshi.customiuizer.utils.Helpers.MethodHook;
-
-public class PackagePermissions {
-
- private static final ArrayList systemPackages = new ArrayList();
-
-// @SuppressWarnings("unchecked")
-// private static void doBefore(MethodHookParam param) {
-// ArrayList requestedPermissions = (ArrayList)getObjectField(param.args[0], "requestedPermissions");
-// param.setObjectExtra("orig_requested_permissions", requestedPermissions);
-// //ArrayList requestedPermissionsRequired = (ArrayList)getObjectField(param.args[0], "requestedPermissionsRequired");
-// //param.setObjectExtra("orig_requested_permissions_required", requestedPermissionsRequired);
-//
-// String pkgName = (String)getObjectField(param.args[0], "packageName");
-// if (pkgName.equalsIgnoreCase(Helpers.modulePkg)) {
-// requestedPermissions.add("miui.permission.READ_LOGS");
-// requestedPermissions.add("miui.permission.DUMP_CACHED_LOG");
-// }
-//
-// setObjectField(param.args[0], "requestedPermissions", requestedPermissions);
-// //setObjectField(param.args[0], "requestedPermissionsRequired", requestedPermissionsRequired);
-// }
-//
-// @SuppressWarnings("unchecked")
-// private static void doAfter(MethodHookParam param) {
-// ArrayList origRequestedPermissions = (ArrayList) param.getObjectExtra("orig_requested_permissions");
-// if (origRequestedPermissions != null) setObjectField(param.args[0], "requestedPermissions", origRequestedPermissions);
-// //ArrayList origRequestedPermissionsRequired = (ArrayList) param.getObjectExtra("orig_requested_permissions_required");
-// //if (origRequestedPermissionsRequired != null) setObjectField(param.args[0], "requestedPermissionsRequired", origRequestedPermissionsRequired);
-// }
-
- public static void hook(LoadPackageParam lpparam) {
- systemPackages.add(Helpers.modulePkg);
- //systemPackages.add("com.miui.packageinstaller");
- //systemPackages.add("pl.solidexplorer2");
-
- // Allow signature level permissions for module
- if (!Helpers.findAndHookMethodSilently("com.android.server.pm.permission.PermissionManagerService", lpparam.classLoader, "grantSignaturePermission",
- String.class, "android.content.pm.PackageParser.Package", "com.android.server.pm.permission.BasePermission", "com.android.server.pm.permission.PermissionsState",
- new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- String pkgName = (String)XposedHelpers.getObjectField(param.args[1], "packageName");
- if (systemPackages.contains(pkgName)) param.setResult(true);
- }
- }
- )) Helpers.findAndHookMethod("com.android.server.pm.PackageManagerService", lpparam.classLoader, "grantSignaturePermission",
- String.class, "android.content.pm.PackageParser.Package", "com.android.server.pm.BasePermission", "com.android.server.pm.PermissionsState",
- new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- String pkgName = (String)XposedHelpers.getObjectField(param.args[1], "packageName");
- if (systemPackages.contains(pkgName)) param.setResult(true);
- }
- }
- );
-
- if (!Helpers.findAndHookMethodSilently("com.android.server.pm.PackageManagerServiceUtils", lpparam.classLoader, "verifySignatures",
- "com.android.server.pm.PackageSetting", "com.android.server.pm.PackageSetting", "android.content.pm.PackageParser.SigningDetails", boolean.class, boolean.class,
- new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- String pkgName = (String)XposedHelpers.getObjectField(param.args[0], "name");
- if (systemPackages.contains(pkgName)) param.setResult(true);
- }
- }
- )) Helpers.findAndHookMethod("com.android.server.pm.PackageManagerService", lpparam.classLoader, "verifySignaturesLP",
- "com.android.server.pm.PackageSetting", "android.content.pm.PackageParser.Package",
- new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- String pkgName = (String)XposedHelpers.getObjectField(param.args[1], "packageName");
- if (systemPackages.contains(pkgName)) param.setResult(true);
- }
- }
- );
-
-// // Add custom permissions for module
-// if (!Helpers.findAndHookMethodSilently("com.android.server.pm.permission.PermissionManagerService", lpparam.classLoader, "grantRequestedRuntimePermissions",
-// "android.content.pm.PackageParser$Package", int[].class, String[].class, int.class, "com.android.server.pm.permission.PermissionManagerServiceInternal.PermissionCallback",
-// new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// doBefore(param);
-// }
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// doAfter(param);
-// }
-// }
-// )) if (!Helpers.findAndHookMethodSilently("com.android.server.pm.permission.PermissionManagerService", lpparam.classLoader, "grantPermissions",
-// "android.content.pm.PackageParser$Package", boolean.class, String.class, "com.android.server.pm.permission.PermissionManagerInternal.PermissionCallback",
-// new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// doBefore(param);
-// }
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// doAfter(param);
-// }
-// }
-// )) Helpers.findAndHookMethod("com.android.server.pm.PackageManagerService", lpparam.classLoader, "grantPermissionsLPw",
-// "android.content.pm.PackageParser$Package", boolean.class, String.class,
-// new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// doBefore(param);
-// }
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// doAfter(param);
-// }
-// }
-// );
-
- // Make module appear as system app
- Helpers.hookAllMethods("com.android.server.pm.PackageManagerService", lpparam.classLoader, "queryIntentActivitiesInternal", new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void after(MethodHookParam param) throws Throwable {
- List infos = (List)param.getResult();
- if (infos != null)
- for (ResolveInfo info: infos)
- if (info != null && info.activityInfo != null && systemPackages.contains(info.activityInfo.packageName))
- XposedHelpers.setObjectField(info, "system", true);
- }
- });
-
-// // Causes module removal by system on updates
-// Helpers.hookAllMethods("com.android.server.pm.PackageManagerService", lpparam.classLoader, "getApplicationInfoInternal", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// ApplicationInfo info = (ApplicationInfo)param.getResult();
-// if (info != null && systemPackages.contains(info.packageName)) {
-// info.flags |= ApplicationInfo.FLAG_SYSTEM;
-// param.setResult(info);
-// }
-// }
-// });
-
- Helpers.findAndHookMethod("android.content.pm.ApplicationInfo", lpparam.classLoader, "isSystemApp", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ApplicationInfo ai = (ApplicationInfo)param.thisObject;
- if (ai != null && systemPackages.contains(ai.packageName)) param.setResult(true);
- }
- });
-
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("android.content.pm.ApplicationInfo", lpparam.classLoader, "isSignedWithPlatformKey", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ApplicationInfo ai = (ApplicationInfo)param.thisObject;
- if (ai != null && systemPackages.contains(ai.packageName)) param.setResult(true);
- }
- });
-
- // Do not restrict background activity
- if (!Helpers.isNougat())
- Helpers.hookAllMethods("com.android.server.am.ActivityManagerService", lpparam.classLoader, "appRestrictedInBackgroundLocked", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (Helpers.modulePkg.equals(param.args[1])) param.setResult(0);
- }
- });
-
- if (!Helpers.isNougat())
- Helpers.hookAllMethods("com.android.server.am.ActivityManagerService", lpparam.classLoader, "appServicesRestrictedInBackgroundLocked", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (Helpers.modulePkg.equals(param.args[1])) param.setResult(0);
- }
- });
-
- Helpers.hookAllMethodsSilently("com.android.server.wm.ActivityRecordInjector", lpparam.classLoader, "canShowWhenLocked", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.setResult(true);
- }
- });
-
- try {
- Class> dpgpiClass = findClass("com.android.server.pm.DefaultPermissionGrantPolicyInjector", lpparam.classLoader);
- String[] MIUI_SYSTEM_APPS = (String[])XposedHelpers.getStaticObjectField(dpgpiClass, "MIUI_SYSTEM_APPS");
- ArrayList mySystemApps = new ArrayList(Arrays.asList(MIUI_SYSTEM_APPS));
- mySystemApps.addAll(systemPackages);
- XposedHelpers.setStaticObjectField(dpgpiClass, "MIUI_SYSTEM_APPS", mySystemApps.toArray(new String[0]));
- } catch (Throwable t) {}
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/mods/System.java b/app/src/main/java/name/mikanoshi/customiuizer/mods/System.java
deleted file mode 100644
index 0982d633..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/mods/System.java
+++ /dev/null
@@ -1,7965 +0,0 @@
-package name.mikanoshi.customiuizer.mods;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.ActivityOptions;
-import android.app.Dialog;
-import android.app.KeyguardManager;
-import android.app.MiuiNotification;
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.app.TaskStackBuilder;
-import android.app.WallpaperManager;
-import android.appwidget.AppWidgetProviderInfo;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.ColorMatrix;
-import android.graphics.ColorMatrixColorFilter;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Point;
-import android.graphics.PointF;
-import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener;
-import android.hardware.SensorManager;
-import android.hardware.usb.UsbManager;
-import android.media.AudioAttributes;
-import android.media.AudioManager;
-import android.media.MediaMetadata;
-import android.media.MediaPlayer;
-import android.media.SoundPool;
-import android.media.session.MediaController;
-import android.media.session.PlaybackState;
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkInfo;
-import android.net.TrafficStats;
-import android.net.Uri;
-import android.net.wifi.WifiManager;
-import android.os.BadParcelableException;
-import android.os.BatteryManager;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Parcelable;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.telephony.PhoneStateListener;
-import android.text.Layout;
-import android.text.SpannableString;
-import android.text.TextUtils;
-import android.text.format.DateFormat;
-import android.text.format.DateUtils;
-import android.text.style.AbsoluteSizeSpan;
-import android.text.style.TypefaceSpan;
-import android.util.ArrayMap;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.Pair;
-import android.util.SparseArray;
-import android.util.SparseIntArray;
-import android.util.TypedValue;
-import android.view.Display;
-import android.view.Gravity;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.SurfaceView;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.ViewOutlineProvider;
-import android.view.Window;
-import android.view.WindowManager;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
-import android.view.animation.Interpolator;
-import android.widget.AbsListView;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.HorizontalScrollView;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.Magnifier;
-import android.widget.RelativeLayout;
-import android.widget.RemoteViews;
-import android.widget.ScrollView;
-import android.widget.SeekBar;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.net.NetworkInterface;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.NumberFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.TimeZone;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.TimeUnit;
-
-import static java.lang.System.currentTimeMillis;
-import static java.lang.System.nanoTime;
-
-import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
-import de.robv.android.xposed.callbacks.XCallback;
-import de.robv.android.xposed.XC_MethodHook.MethodHookParam;
-import de.robv.android.xposed.XC_MethodReplacement;
-import de.robv.android.xposed.XposedBridge;
-import de.robv.android.xposed.XposedHelpers;
-import static de.robv.android.xposed.XposedHelpers.findClass;
-import static de.robv.android.xposed.XposedHelpers.findClassIfExists;
-import static de.robv.android.xposed.XposedHelpers.findMethodExactIfExists;
-
-import miui.os.SystemProperties;
-
-import name.mikanoshi.customiuizer.MainModule;
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.utils.AudioVisualizer;
-import name.mikanoshi.customiuizer.utils.BatteryIndicator;
-import name.mikanoshi.customiuizer.utils.Helpers;
-import name.mikanoshi.customiuizer.utils.Helpers.MethodHook;
-import name.mikanoshi.customiuizer.utils.Helpers.MimeType;
-import name.mikanoshi.customiuizer.utils.SoundData;
-import static name.mikanoshi.customiuizer.mods.GlobalActions.ACTION_PREFIX;
-
-import org.json.JSONObject;
-
-public class System {
-
- public static void ScreenAnimHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.display.DisplayPowerController", lpparam.classLoader, "initialize", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- try {
- XposedHelpers.setObjectField(param.thisObject, "mColorFadeEnabled", true);
- XposedHelpers.setObjectField(param.thisObject, "mColorFadeFadesConfig", true);
- } catch (Throwable ignore) {}
- }
-
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- //ObjectAnimator mColorFadeOnAnimator = (ObjectAnimator)XposedHelpers.getObjectField(param.thisObject, "mColorFadeOnAnimator");
- //mColorFadeOnAnimator.setDuration(250);
- ObjectAnimator mColorFadeOffAnimator = (ObjectAnimator)XposedHelpers.getObjectField(param.thisObject, "mColorFadeOffAnimator");
- //mColorFadeOffAnimator.setDuration(Helpers.getSharedIntPref(mContext, "pref_key_system_screenanim_duration", 0));
- if (mColorFadeOffAnimator != null) {
- int val = MainModule.mPrefs.getInt("system_screenanim_duration", 0);
- if (val == 0) val = 250;
- mColorFadeOffAnimator.setDuration(val);
- }
- new Helpers.SharedPrefObserver(mContext, mHandler, "pref_key_system_screenanim_duration", 0) {
- @Override
- public void onChange(String name, int defValue) {
- if (mColorFadeOffAnimator == null) return;
- int val = Helpers.getSharedIntPref(mContext, name, defValue);
- if (val == 0) val = 250;
- mColorFadeOffAnimator.setDuration(val);
- }
- };
- }
- });
- }
-
- public static void NoLightUpOnChargeHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.power.PowerManagerService", lpparam.classLoader, "wakeUpNoUpdateLocked", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- String reason = param.args[1] instanceof String ? (String)param.args[1] : (String)param.args[2];
- if (reason == null) return;
-
- if (Integer.parseInt(MainModule.mPrefs.getString("system_nolightuponcharges", "1")) == 3 &&
- (reason.equals("android.server.power:POWER") || reason.startsWith("android.server.power:PLUGGED"))) {
- param.setResult(false);
- return;
- }
- if (Integer.parseInt(MainModule.mPrefs.getString("system_nolightuponcharges", "1")) == 2 && (
- reason.equals("android.server.power:POWER") ||
- reason.startsWith("android.server.power:PLUGGED") ||
- reason.equals("com.android.systemui:RAPID_CHARGE") ||
- reason.equals("com.android.systemui:WIRELESS_CHARGE") ||
- reason.equals("com.android.systemui:WIRELESS_RAPID_CHARGE")
- )) param.setResult(false);
- //Helpers.log("wakeUpNoUpdateLocked: " + param.args[0] + " | " + param.args[1] + " | " + param.args[2] + " | " + param.args[3] + " | " + param.args[4]);
- }
- });
- }
-
- public static void NoLightUpOnHeadsetHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.power.PowerManagerService", lpparam.classLoader, "wakeUpNoUpdateLocked", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- String reason = param.args[1] instanceof String ? (String)param.args[1] : (String)param.args[2];
- if ("com.android.systemui:HEADSET".equals(reason)) param.setResult(false);
- }
- });
- }
-
- public static void ScramblePINHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.keyguard.KeyguardPINView", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View[][] mViews = (View[][])XposedHelpers.getObjectField(param.thisObject, "mViews");
- ArrayList mRandomViews = new ArrayList();
- for (int row = 1; row <= 4; row++)
- for (int col = 0; col <= 2; col++)
- if (mViews[row][col] != null)
- mRandomViews.add(mViews[row][col]);
- Collections.shuffle(mRandomViews);
-
- View pinview = (View)param.thisObject;
- ViewGroup row1 = pinview.findViewById(pinview.getResources().getIdentifier("row1", "id", "com.android.systemui"));
- ViewGroup row2 = pinview.findViewById(pinview.getResources().getIdentifier("row2", "id", "com.android.systemui"));
- ViewGroup row3 = pinview.findViewById(pinview.getResources().getIdentifier("row3", "id", "com.android.systemui"));
- ViewGroup row4 = pinview.findViewById(pinview.getResources().getIdentifier("row4", "id", "com.android.systemui"));
-
- row1.removeAllViews();
- row2.removeAllViews();
- row3.removeAllViews();
- row4.removeAllViews();
-
- mViews[1] = new View[]{ mRandomViews.get(0), mRandomViews.get(1), mRandomViews.get(2)};
- row1.addView(mRandomViews.get(0));
- row1.addView(mRandomViews.get(1));
- row1.addView(mRandomViews.get(2));
-
- mViews[2] = new View[]{ mRandomViews.get(3), mRandomViews.get(4), mRandomViews.get(5)};
- row2.addView(mRandomViews.get(3));
- row2.addView(mRandomViews.get(4));
- row2.addView(mRandomViews.get(5));
-
- mViews[3] = new View[]{ mRandomViews.get(6), mRandomViews.get(7), mRandomViews.get(8)};
- row3.addView(mRandomViews.get(6));
- row3.addView(mRandomViews.get(7));
- row3.addView(mRandomViews.get(8));
-
- mViews[4] = new View[]{ null, mRandomViews.get(9), null};
- row4.addView(mRandomViews.get(9));
-
- XposedHelpers.setObjectField(param.thisObject, "mViews", mViews);
- }
- });
- }
-
- public static void NoPasswordHook() {
- String isAllowed = Helpers.isQPlus() ? "isBiometricAllowedForUser" : "isFingerprintAllowedForUser";
- //Helpers.findAndHookMethod("com.android.internal.widget.LockPatternUtils$StrongAuthTracker", null, "handleStrongAuthRequiredChanged", int.class, int.class, XC_MethodReplacement.DO_NOTHING);
- Helpers.findAndHookMethod("com.android.internal.widget.LockPatternUtils$StrongAuthTracker", null, isAllowed, int.class, XC_MethodReplacement.returnConstant(true));
- Helpers.findAndHookMethod("com.android.internal.widget.LockPatternUtils", null, isAllowed, int.class, XC_MethodReplacement.returnConstant(true));
- }
-
-// public static void NoPasswordKeyguardHook(LoadPackageParam lpparam) {
-// Helpers.findAndHookMethod("com.android.keyguard.KeyguardUpdateMonitor$StrongAuthTracker", lpparam.classLoader, "isUnlockingWithFingerprintAllowed", XC_MethodReplacement.returnConstant(true));
-// Helpers.findAndHookMethod("com.android.keyguard.KeyguardUpdateMonitor$StrongAuthTracker", lpparam.classLoader, "isUnlockingWithFingerprintAllowed", int.class, XC_MethodReplacement.returnConstant(true));
-// Helpers.findAndHookMethod("com.android.keyguard.KeyguardUpdateMonitor", lpparam.classLoader, "isUnlockWithFingerprintPossible", int.class, XC_MethodReplacement.returnConstant(true));
-// }
-
- public static void EnhancedSecurityHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "interceptPowerKeyDown", KeyEvent.class, boolean.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mPWMContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- KeyguardManager kgMgr = (KeyguardManager)mPWMContext.getSystemService(Context.KEYGUARD_SERVICE);
- if (kgMgr.isKeyguardLocked() && kgMgr.isKeyguardSecure()) {
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
- if (mHandler != null) {
- Runnable mEndCallLongPress = (Runnable)XposedHelpers.getObjectField(param.thisObject, "mEndCallLongPress");
- if (mEndCallLongPress != null) mHandler.removeCallbacks(mEndCallLongPress);
- }
- }
- }
- });
-
- Helpers.findAndHookMethod("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "powerLongPress", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Context mPWMContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- KeyguardManager kgMgr = (KeyguardManager)mPWMContext.getSystemService(Context.KEYGUARD_SERVICE);
- if (kgMgr.isKeyguardLocked() && kgMgr.isKeyguardSecure()) param.setResult(null);
- }
- });
-
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "showGlobalActions", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Context mPWMContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- KeyguardManager kgMgr = (KeyguardManager)mPWMContext.getSystemService(Context.KEYGUARD_SERVICE);
- if (kgMgr.isKeyguardLocked() && kgMgr.isKeyguardSecure()) param.setResult(null);
- }
- });
-
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "showGlobalActionsInternal", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Context mPWMContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- KeyguardManager kgMgr = (KeyguardManager)mPWMContext.getSystemService(Context.KEYGUARD_SERVICE);
- if (kgMgr.isKeyguardLocked() && kgMgr.isKeyguardSecure()) param.setResult(null);
- }
- });
- }
-
- @SuppressWarnings("RedundantIfStatement")
- private static boolean isAuthOnce() {
- int req = MainModule.mPrefs.getStringAsInt("system_noscreenlock_req", 1);
- if (req <= 1) return true;
- if (req == 2 && !isUnlockedWithFingerprint && !isUnlockedWithStrong) return false;
- if (req == 3 && !isUnlockedWithStrong) return false;
- return true;
- }
-
- private static boolean isTrusted(Context mContext, ClassLoader classLoader) {
- return isTrustedWiFi(mContext) || isTrustedBt(classLoader);
- }
-
- private static boolean isTrustedWiFi(Context mContext) {
- WifiManager wifiManager = (WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);
- if (wifiManager == null) return false;
- if (!wifiManager.isWifiEnabled()) return false;
- Set trustedNetworks = MainModule.mPrefs.getStringSet("system_noscreenlock_wifi");
- return Helpers.containsStringPair(trustedNetworks, wifiManager.getConnectionInfo().getBSSID());
- }
-
- private static boolean isTrustedBt(ClassLoader classLoader) {
- try {
- BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- if (!mBluetoothAdapter.isEnabled()) return false;
- Set trustedDevices = MainModule.mPrefs.getStringSet("system_noscreenlock_bt");
- Object mController = XposedHelpers.callStaticMethod(findClass("com.android.systemui.Dependency", classLoader), "get", findClass("com.android.systemui.statusbar.policy.BluetoothController", classLoader));
- Collection> cachedDevices = (Collection>)XposedHelpers.callMethod(mController, "getCachedDevicesCopy");
- if (cachedDevices != null)
- for (Object device: cachedDevices) {
- BluetoothDevice mDevice = (BluetoothDevice)XposedHelpers.getObjectField(device, "mDevice");
- if (mDevice == null) continue;
- if (mDevice.getBondState() == BluetoothDevice.BOND_BONDED &&
- (boolean)XposedHelpers.callMethod(device, "isConnected") &&
- Helpers.containsStringPair(trustedDevices, mDevice.getAddress())) return true;
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- return false;
- }
-
- private static boolean isUnlocked(Context mContext, ClassLoader classLoader) {
- Class> kmvClas = findClass("com.android.systemui.keyguard.KeyguardViewMediator", classLoader);
- XposedHelpers.setAdditionalStaticField(kmvClas, "isScreenLockDisabled", false);
- if (!isAuthOnce()) return false;
- int opt = MainModule.mPrefs.getStringAsInt("system_noscreenlock", 1);
- if (forcedOption == 1) opt = 2;
- boolean isTrusted = false;
- if (opt == 3) isTrusted = isTrusted(mContext, classLoader);
- if (opt == 2 || opt == 3 && isTrusted) {
- XposedHelpers.setAdditionalStaticField(kmvClas, "isScreenLockDisabled", true);
- return true;
- } else return false;
- }
-
- private static void checkBTConnections(Context mContext) {
- if (mContext == null)
- Helpers.log("checkBTConnections", "mContext is NULL!");
- else
- mContext.sendBroadcast(new Intent(ACTION_PREFIX + "UnlockBTConnection"));
- }
-
-// private static void setLockScreenDisabled(ClassLoader classLoader, Object thisObject, boolean state) {
-// try {
-// Class> kumCls = findClass("com.android.keyguard.KeyguardUpdateMonitor", classLoader);
-// int user = (int)XposedHelpers.callStaticMethod(kumCls, "getCurrentUser");
-// Object mLockPatternUtils = XposedHelpers.getObjectField(thisObject, "mLockPatternUtils");
-// XposedHelpers.callMethod(mLockPatternUtils, "setLockScreenDisabled", state, user);
-// Helpers.log("setLockScreenDisabled = " + state + ", " + user);
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// }
-// }
-
- private static boolean isUnlockedInnerCall = false;
- private static boolean isUnlockedWithFingerprint = false;
- private static boolean isUnlockedWithStrong = false;
- private static int forcedOption = -1;
- public static void NoScreenLockHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.keyguard.KeyguardUpdateMonitor", lpparam.classLoader, "reportSuccessfulStrongAuthUnlockAttempt", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (isUnlockedInnerCall) {
- isUnlockedInnerCall = false;
- return;
- }
- isUnlockedWithStrong = true;
- }
- });
-
- Helpers.findAndHookMethod("com.android.keyguard.KeyguardUpdateMonitorCallback", lpparam.classLoader, "onFingerprintAuthenticated", int.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- isUnlockedWithFingerprint = true;
- }
- });
-
- Helpers.findAndHookMethod("com.android.keyguard.KeyguardHostView", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- mContext.registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- try {
- Object mSecurityContainer = XposedHelpers.getObjectField(param.thisObject, "mSecurityContainer");
- Object mCallback = XposedHelpers.getObjectField(mSecurityContainer, "mCallback");
- XposedHelpers.callMethod(mCallback, "reportUnlockAttempt", 0, true, 0);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- }, new IntentFilter(ACTION_PREFIX + "UnlockStrongAuth"));
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.keyguard.KeyguardViewMediator", lpparam.classLoader, "doKeyguardLocked", Bundle.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if (forcedOption == 0) return;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (!isUnlocked(mContext, lpparam.classLoader)) return;
-
- boolean skip = MainModule.mPrefs.getBoolean("system_noscreenlock_skip");
- if (skip) {
- param.setResult(null);
- XposedHelpers.callMethod(param.thisObject, "keyguardDone");
- }
- isUnlockedInnerCall = true;
- XposedHelpers.callMethod(XposedHelpers.getObjectField(param.thisObject, "mUpdateMonitor"), "reportSuccessfulStrongAuthUnlockAttempt");
- Intent unlockIntent = new Intent(ACTION_PREFIX + "UnlockStrongAuth");
- mContext.sendBroadcast(unlockIntent);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.keyguard.KeyguardViewMediator", lpparam.classLoader, "setupLocked", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- IntentFilter filter = new IntentFilter();
- filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
- filter.addAction(ACTION_PREFIX + "UnlockSetForced");
- filter.addAction(ACTION_PREFIX + "UnlockBTConnection");
- mContext.registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
-
- if (action.equals(ACTION_PREFIX + "UnlockSetForced"))
- forcedOption = intent.getIntExtra("system_noscreenlock_force", -1);
-
- boolean isShowing = (boolean)XposedHelpers.callMethod(param.thisObject, "isShowing");
- if (!isShowing) return;
- if (!isAuthOnce()) return;
-
- boolean isTrusted = false;
- if (forcedOption == 0) isTrusted = false;
- else if (forcedOption == 1) isTrusted = true;
- else if (MainModule.mPrefs.getStringAsInt("system_noscreenlock", 1) == 3)
- if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
- NetworkInfo netInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
- if (netInfo.getState() != NetworkInfo.State.CONNECTED && netInfo.getState() != NetworkInfo.State.DISCONNECTED) return;
- if (netInfo.isConnected()) isTrusted = isTrustedWiFi(mContext);
- } else if (action.equals(ACTION_PREFIX + "UnlockBTConnection")) {
- isTrusted = isTrustedBt(lpparam.classLoader);
- }
-
- XposedHelpers.setAdditionalStaticField(param.thisObject, "isScreenLockDisabled", isTrusted);
- if (isTrusted) {
- boolean skip = MainModule.mPrefs.getBoolean("system_noscreenlock_skip");
- if (skip)
- XposedHelpers.callMethod(param.thisObject, "keyguardDone");
- else
- XposedHelpers.callMethod(param.thisObject, "resetStateLocked");
- isUnlockedInnerCall = true;
- XposedHelpers.callMethod(XposedHelpers.getObjectField(param.thisObject, "mUpdateMonitor"), "reportSuccessfulStrongAuthUnlockAttempt");
- Intent unlockIntent = new Intent(ACTION_PREFIX + "UnlockStrongAuth");
- mContext.sendBroadcast(unlockIntent);
- } else try {
- Object mStatusBar = XposedHelpers.getObjectField(param.thisObject, "mStatusBar");
- if (mStatusBar == null) return;
- XposedHelpers.callMethod(mStatusBar, "updatePublicMode");
- boolean isAnyProfilePublicMode = (boolean)XposedHelpers.callMethod(mStatusBar, "isAnyProfilePublicMode");
- Object mStackScroller = XposedHelpers.getObjectField(mStatusBar, "mStackScroller");
- XposedHelpers.callMethod(mStackScroller, "setHideSensitive", isAnyProfilePublicMode, true);
- XposedHelpers.callMethod(mStatusBar, "updateNotificationViewsOnly");
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- }, filter);
-
- new Helpers.SharedPrefObserver(mContext, new Handler(mContext.getMainLooper())) {
- @Override
- public void onChange(Uri uri) {
- try {
- String type = uri.getPathSegments().get(1);
- String key = uri.getPathSegments().get(2);
- if (!key.contains("pref_key_system_noscreenlock")) return;
-
- switch (type) {
- case "string":
- MainModule.mPrefs.put(key, Helpers.getSharedStringPref(mContext, key, ""));
- break;
- case "stringset":
- MainModule.mPrefs.put(key, Helpers.getSharedStringSetPref(mContext, key));
- break;
- case "integer":
- MainModule.mPrefs.put(key, Helpers.getSharedIntPref(mContext, key, 1));
- break;
- case "boolean":
- MainModule.mPrefs.put(key, Helpers.getSharedBoolPref(mContext, key, false));
- break;
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.findAndHookMethod("com.android.keyguard.KeyguardSecurityModel", lpparam.classLoader, "getSecurityMode", int.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (forcedOption == 0) return;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- boolean skip = MainModule.mPrefs.getBoolean("system_noscreenlock_skip");
- if (skip) return;
- if (!isUnlocked(mContext, lpparam.classLoader)) return;
-
- Class> securityModeEnum = XposedHelpers.findClass("com.android.keyguard.KeyguardSecurityModel$SecurityMode", lpparam.classLoader);
- Object securityModeNone = XposedHelpers.getStaticObjectField(securityModeEnum, "None");
- Object securityModePassword = XposedHelpers.getStaticObjectField(securityModeEnum, "Password");
- Object securityModePattern = XposedHelpers.getStaticObjectField(securityModeEnum, "Pattern");
- Object securityModePin = XposedHelpers.getStaticObjectField(securityModeEnum, "PIN");
-
- Object secModeResult = param.getResult();
- if (securityModePassword.equals(secModeResult) ||
- securityModePattern.equals(secModeResult) ||
- securityModePin.equals(secModeResult))
- param.setResult(securityModeNone);
- }
- });
-
- Class> startClass = findClassIfExists("com.android.keyguard.faceunlock.FaceUnlockManager", lpparam.classLoader);
- Method startMethod = XposedHelpers.findMethodExactIfExists(startClass, "startFaceUnlock");
- if (!Helpers.is12() && startMethod == null) startClass = findClassIfExists("com.android.keyguard.KeyguardUpdateMonitor", lpparam.classLoader);
- if (startClass == null) Helpers.log("NoScreenLockHook", "Face unlock class not found");
-
- if (startClass != null) {
- Helpers.hookAllMethods(startClass, "startFaceUnlock", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- boolean skip = MainModule.mPrefs.getBoolean("system_noscreenlock_nofaceunlock");
- if (!skip) return;
- if (Helpers.is12() && param.args.length == 0) return;
- Boolean isScreenLockDisabled = (Boolean)XposedHelpers.getAdditionalStaticField(findClass("com.android.systemui.keyguard.KeyguardViewMediator", lpparam.classLoader), "isScreenLockDisabled");
- isScreenLockDisabled = isScreenLockDisabled != null && isScreenLockDisabled;
- if (isScreenLockDisabled) param.setResult(null);
- }
- });
-
- Method showMsgMethod = findMethodExactIfExists(startClass, "isShowMessageWhenFaceUnlockSuccess");
- if (showMsgMethod == null) findMethodExactIfExists(startClass, "isFaceUnlockSuccessAndShowMessage");
- if (showMsgMethod == null) {
- Helpers.log("NoScreenLockHook", "Show notification message method not found");
- } else {
- Helpers.hookAllMethods(startClass, showMsgMethod.getName(), new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- boolean skip = MainModule.mPrefs.getBoolean("system_noscreenlock_nofaceunlock");
- if (!skip || !(boolean)param.getResult()) return;
- boolean isScreenLockDisabled = (boolean)XposedHelpers.getAdditionalStaticField(findClass("com.android.systemui.keyguard.KeyguardViewMediator", lpparam.classLoader), "isScreenLockDisabled");
- if (isScreenLockDisabled) param.setResult(false);
- }
- });
- }
- }
-
- Helpers.hookAllConstructors("com.android.systemui.statusbar.policy.BluetoothControllerImpl", lpparam.classLoader, new MethodHook(10) {
- @Override
- protected void after(MethodHookParam param) {
- Context mContext = (Context)param.args[0];
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mContextMy", mContext);
- mContext.registerReceiver(new BroadcastReceiver() {
- public void onReceive(final Context context, Intent intent) {
- ArrayList deviceList = new ArrayList();
- Intent updateIntent = new Intent(GlobalActions.EVENT_PREFIX + "CACHEDDEVICESUPDATE");
- Collection> cachedDevices = (Collection>)XposedHelpers.callMethod(param.thisObject, "getCachedDevicesCopy");
- if (cachedDevices != null)
- for (Object device: cachedDevices) {
- BluetoothDevice mDevice = (BluetoothDevice)XposedHelpers.getObjectField(device, "mDevice");
- if (mDevice != null) deviceList.add(mDevice);
- }
- updateIntent.putParcelableArrayListExtra("device_list", deviceList);
- updateIntent.setPackage(Helpers.modulePkg);
- mContext.sendBroadcast(updateIntent);
- }
- }, new IntentFilter(ACTION_PREFIX + "FetchCachedDevices"));
- }
- });
-
- if (!Helpers.findAndHookMethodSilently("com.android.systemui.statusbar.policy.BluetoothControllerImpl", lpparam.classLoader, "updateConnectionState", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) {
- checkBTConnections((Context)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mContextMy"));
- }
- })) Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.BluetoothControllerImpl", lpparam.classLoader, "updateConnected", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) {
- checkBTConnections((Context)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mContextMy"));
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.BluetoothControllerImpl", lpparam.classLoader, "onBluetoothStateChanged", int.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) {
- int state = (int)param.args[0];
- if (state != 10) checkBTConnections((Context)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mContextMy"));
- }
- });
- }
-
- private static ImageView createIcon(Context ctx, int baseSize) {
- float density = ctx.getResources().getDisplayMetrics().density;
- ImageView iv = new ImageView(ctx);
- try {
- iv.setImageDrawable(ctx.getPackageManager().getApplicationIcon(ctx.getPackageName()));
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
- int size = Math.round(baseSize * density);
- LinearLayout.LayoutParams lpi = new LinearLayout.LayoutParams(size, size);
- lpi.setMargins(0, 0, Math.round(8 * density), 0);
- lpi.gravity = Gravity.CENTER;
- iv.setLayoutParams(lpi);
-
- return iv;
- }
-
- private static TextView createLabel(Context ctx, TextView toastText) {
- TextView tv = new TextView(ctx);
- tv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- tv.setText(ctx.getApplicationInfo().loadLabel(ctx.getPackageManager()));
- tv.setTextColor(Helpers.is11() ? (Helpers.isNightMode(ctx) ? Color.WHITE : Color.BLACK) : Color.WHITE);
- tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, toastText.getTextSize());
- tv.setTypeface(toastText.getTypeface());
- tv.setSingleLine(true);
- tv.setAlpha(0.6f);
- return tv;
- }
-
- private static void modifyIconLabelToast(MethodHookParam param) {
- Context ctx = (Context)param.args[0];
- float density = ctx.getResources().getDisplayMetrics().density;
-
- int option = Integer.parseInt(Helpers.getSharedStringPref(ctx, "pref_key_system_iconlabletoasts", "1"));
- if (option == 1) return;
-
- Object res = param.getResult();
- if (res == null) return;
- LinearLayout toast = (LinearLayout)XposedHelpers.getObjectField(res, "mNextView");
- if (toast == null) return;
- toast.setGravity(Gravity.START);
- toast.setPadding(toast.getPaddingLeft() - Math.round(5 * density), toast.getPaddingTop() - Math.round(3 * density), toast.getPaddingRight(), toast.getPaddingBottom() - Math.round(3 * density));
-
- TextView toastText = toast.findViewById(android.R.id.message);
- if (toastText == null) return;
- if (Helpers.is11()) {
- toast.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
- toastText.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
- toastText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13);
- toastText.setLetterSpacing(0.015f);
- } else {
- toastText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
- }
- LinearLayout.LayoutParams lpt = (LinearLayout.LayoutParams)toastText.getLayoutParams();
- lpt.gravity = Gravity.START;
-
- switch (option) {
- case 2:
- ImageView iv;
- LinearLayout textOnly = new LinearLayout(ctx);
- textOnly.setOrientation(LinearLayout.VERTICAL);
- if (Helpers.is11()) {
- textOnly.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
- textOnly.setPadding(0, Math.round(5 * density), 0, Math.round(6 * density));
- iv = createIcon(ctx, 22);
- } else {
- textOnly.setGravity(Gravity.START);
- iv = createIcon(ctx, 21);
- }
-
- toast.removeAllViews();
- textOnly.addView(toastText);
- toast.setOrientation(LinearLayout.HORIZONTAL);
- toast.addView(iv);
- toast.addView(textOnly);
- break;
- case 3:
- TextView tv = createLabel(ctx, toastText);
- LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)tv.getLayoutParams();
- lp.leftMargin = Math.round(5 * density);
- lp.rightMargin = Math.round(5 * density);
- if (Helpers.is11()) lp.topMargin = Math.round(5 * density);
- tv.setLayoutParams(lp);
- lp = (LinearLayout.LayoutParams)toastText.getLayoutParams();
- lp.leftMargin = Math.round(5 * density);
- lp.rightMargin = Math.round(5 * density);
- if (Helpers.is11()) lp.bottomMargin = Math.round(5 * density);
- toastText.setLayoutParams(lp);
- toast.setOrientation(LinearLayout.VERTICAL);
- toast.addView(tv, 0);
- break;
- case 4:
- LinearLayout textLabel = new LinearLayout(ctx);
- textLabel.setOrientation(LinearLayout.VERTICAL);
- if (Helpers.is11()) {
- textLabel.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
- textLabel.setPadding(0, Math.round(5 * density), 0, Math.round(6 * density));
- } else {
- textLabel.setGravity(Gravity.START);
- }
- ImageView iv2 = createIcon(ctx, 42);
- TextView tv2 = createLabel(ctx, toastText);
-
- toast.removeAllViews();
- textLabel.addView(tv2);
- textLabel.addView(toastText);
- toast.setOrientation(LinearLayout.HORIZONTAL);
- toast.addView(iv2);
- toast.addView(textLabel);
- break;
- }
- XposedHelpers.setObjectField(res, "mNextView", toast);
- param.setResult(res);
- }
-
- public static void IconLabelToastsHook() {
- if (!Helpers.findAndHookMethodSilently("android.widget.Toast", null, "makeText", Context.class, Looper.class, CharSequence.class, int.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- modifyIconLabelToast(param);
- }
- })) Helpers.findAndHookMethod("android.widget.Toast", null, "makeText", Context.class, CharSequence.class, int.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- modifyIconLabelToast(param);
- }
- });
-
- Helpers.findAndHookMethod("android.widget.ToastInjector", null, "addAppName", Context.class, CharSequence.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Context context = (Context)param.args[0];
- int opt = Integer.parseInt(Helpers.getSharedStringPref(context, "pref_key_system_iconlabletoasts", "1"));
- if (opt != 1) param.setResult(param.args[1]);
- }
- });
- }
-
- public static void DoubleTapToSleepHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View view = (View)param.thisObject;
- XposedHelpers.setAdditionalInstanceField(view, "currentTouchTime", 0L);
- XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", 0F);
- XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", 0F);
-
- view.setOnTouchListener(new View.OnTouchListener() {
- @Override
- @SuppressLint("ClickableViewAccessibility")
- public boolean onTouch(View v, MotionEvent event) {
- if (event.getAction() != MotionEvent.ACTION_DOWN) return false;
-
- long currentTouchTime = (long)XposedHelpers.getAdditionalInstanceField(view, "currentTouchTime");
- float currentTouchX = (float)XposedHelpers.getAdditionalInstanceField(view, "currentTouchX");
- float currentTouchY = (float)XposedHelpers.getAdditionalInstanceField(view, "currentTouchY");
-
- long lastTouchTime = currentTouchTime;
- float lastTouchX = currentTouchX;
- float lastTouchY = currentTouchY;
- currentTouchTime = currentTimeMillis();
- currentTouchX = event.getX();
- currentTouchY = event.getY();
-
- if (currentTouchTime - lastTouchTime < 250L && Math.abs(currentTouchX - lastTouchX) < 100F && Math.abs(currentTouchY - lastTouchY) < 100F) {
- KeyguardManager keyguardMgr = (KeyguardManager)v.getContext().getSystemService(Context.KEYGUARD_SERVICE);
- if (keyguardMgr.isKeyguardLocked()) GlobalActions.goToSleep(v.getContext());
- currentTouchTime = 0L;
- currentTouchX = 0F;
- currentTouchY = 0F;
- }
-
- XposedHelpers.setAdditionalInstanceField(view, "currentTouchTime", currentTouchTime);
- XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", currentTouchX);
- XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", currentTouchY);
-
- return false;
- }
- });
- }
- });
- }
-
- private static int notifVolumeOnResId;
- private static int notifVolumeOffResId;
- public static void NotificationVolumeDialogRes() {
- MainModule.resHooks.setResReplacement("com.android.systemui", "dimen", "miui_volume_content_width_expanded", R.dimen.miui_volume_content_width_expanded);
- MainModule.resHooks.setResReplacement("com.android.systemui", "dimen", "miui_volume_ringer_layout_width_expanded", R.dimen.miui_volume_ringer_layout_width_expanded);
- notifVolumeOnResId = MainModule.resHooks.addResource("ic_miui_volume_notification", R.drawable.ic_miui_volume_notification);
- notifVolumeOffResId = MainModule.resHooks.addResource("ic_miui_volume_notification_mute", R.drawable.ic_miui_volume_notification_mute);
- }
-
- private static int settingsNotifResId;
- private static int settingsSystemResId;
- private static int callsResId;
- public static void NotificationVolumeSettingsRes() {
- settingsNotifResId = MainModule.resHooks.addResource("ic_audio_notification", R.drawable.ic_audio_notification);
- settingsSystemResId = MainModule.resHooks.addResource("ic_audio_system", R.drawable.ic_audio_system);
- callsResId = MainModule.resHooks.addResource("ring_volume_option_newtitle", R.string.calls);
- }
-
- public static void NotificationVolumeServiceHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.audio.AudioService", lpparam.classLoader, "updateStreamVolumeAlias", boolean.class, String.class, new MethodHook() {
- protected void after(MethodHookParam param) throws Throwable {
- int[] mStreamVolumeAlias = (int[])XposedHelpers.getObjectField(param.thisObject, "mStreamVolumeAlias");
- mStreamVolumeAlias[1] = 1;
- mStreamVolumeAlias[5] = 5;
- XposedHelpers.setObjectField(param.thisObject, "mStreamVolumeAlias", mStreamVolumeAlias);
- }
- });
-
- Helpers.findAndHookMethod("com.android.server.audio.AudioService$VolumeStreamState", lpparam.classLoader, "readSettings", new MethodHook() {
- protected void before(MethodHookParam param) throws Throwable {
- int mStreamType = XposedHelpers.getIntField(param.thisObject, "mStreamType");
- if (mStreamType != 1) return;
- synchronized (param.method.getDeclaringClass()) {
- Class> audioSystem = findClass("android.media.AudioSystem", null);
- int DEVICE_OUT_ALL = XposedHelpers.getStaticIntField(audioSystem, "DEVICE_OUT_ALL");
- int DEVICE_OUT_DEFAULT = XposedHelpers.getStaticIntField(audioSystem, "DEVICE_OUT_DEFAULT");
- int[] DEFAULT_STREAM_VOLUME = (int[])XposedHelpers.getStaticObjectField(audioSystem, "DEFAULT_STREAM_VOLUME");
- int remainingDevices = DEVICE_OUT_ALL;
- for (int i = 0; remainingDevices != 0; i++) {
- int device = 1 << i;
- if ((device & remainingDevices) == 0) continue;
- remainingDevices &= ~device;
- String name = (String)XposedHelpers.callMethod(param.thisObject, "getSettingNameForDevice", device);
- Object mContentResolver = XposedHelpers.getObjectField(XposedHelpers.getSurroundingThis(param.thisObject), "mContentResolver");
- int index = (int)XposedHelpers.callStaticMethod(Settings.System.class, "getIntForUser", mContentResolver, name, device == DEVICE_OUT_DEFAULT ? DEFAULT_STREAM_VOLUME[mStreamType] : -1, -2);
- if (index != -1) {
- SparseIntArray mIndexMap = (SparseIntArray)XposedHelpers.getObjectField(param.thisObject, "mIndexMap");
- mIndexMap.put(device, (Integer)XposedHelpers.callMethod(param.thisObject, "getValidIndex", 10 * index));
- XposedHelpers.setObjectField(param.thisObject, "mIndexMap", mIndexMap);
- }
- }
- }
- param.setResult(null);
- }
- });
-
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.android.server.audio.AudioService", lpparam.classLoader, "shouldZenMuteStream", int.class, new MethodHook() {
- protected void after(MethodHookParam param) throws Throwable {
- int mStreamType = (int)param.args[0];
- if (mStreamType == 5 && !(boolean)param.getResult()) {
- int mZenMode = (int)XposedHelpers.callMethod(XposedHelpers.getObjectField(param.thisObject, "mNm"), "getZenMode");
- if (mZenMode == 1) param.setResult(true);
- }
- }
- });
- }
-
- public static void NotificationVolumeDialogHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.miui.volume.MiuiVolumeDialogImpl", lpparam.classLoader, "initDialog", new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void before(MethodHookParam param) throws Throwable {
- List mColumns = (List)XposedHelpers.getObjectField(param.thisObject, "mColumns");
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mNoColumns", mColumns == null || mColumns.isEmpty());
- }
-
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- boolean mNoColumns = (boolean)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mNoColumns");
- if (mNoColumns) XposedHelpers.callMethod(param.thisObject, "addColumn", 5, notifVolumeOnResId, notifVolumeOffResId, true);
- }
- });
- }
-
- public static void NotificationVolumeSettingsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.settings.MiuiSoundSettings", lpparam.classLoader, "onCreate", Bundle.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Object fragment = param.thisObject;
- Context context = (Context)XposedHelpers.callMethod(fragment, "getActivity");
- Resources modRes = Helpers.getModuleRes(context);
- int order = 6;
-
- Class> vsbCls;
- Method[] initSeekBar;
- String addPreference = "addPreference";
- try {
- vsbCls = XposedHelpers.findClassIfExists("com.android.settings.sound.VolumeSeekBarPreference", lpparam.classLoader);
- initSeekBar = XposedHelpers.findMethodsByExactParameters(fragment.getClass(), void.class, String.class, int.class, int.class);
- if (vsbCls == null || initSeekBar.length == 0) {
- Helpers.log("NotificationVolumeSettingsHook", "Unable to find class/method in Settings to hook");
- return;
- } else {
- initSeekBar[0].setAccessible(true);
- }
- if (Helpers.is12()) {
- Class> pgCls = XposedHelpers.findClassIfExists("androidx.preference.PreferenceGroup", lpparam.classLoader);
- Class> pCls = XposedHelpers.findClassIfExists("androidx.preference.Preference", lpparam.classLoader);
- Method[] methods = XposedHelpers.findMethodsByExactParameters(pgCls, void.class, pCls);
- for (Method method: methods)
- if (Modifier.isPublic(method.getModifiers())) {
- addPreference = method.getName();
- break;
- }
- }
- } catch (Throwable t) {
- Helpers.log("NotificationVolumeSettingsHook", "Unable to find class/method in Settings to hook");
- return;
- }
-
- Object media = XposedHelpers.callMethod(fragment, "findPreference", "media_volume");
- if (media != null) order = (int)XposedHelpers.callMethod(media, "getOrder");
-
- Object prefScreen = XposedHelpers.callMethod(fragment, "getPreferenceScreen");
- Object pref = XposedHelpers.newInstance(vsbCls, context);
- XposedHelpers.callMethod(pref, "setKey", "notification_volume");
- XposedHelpers.callMethod(pref, "setTitle", modRes.getString(R.string.system_mods_notifications));
- XposedHelpers.callMethod(pref, "setPersistent", true);
- XposedHelpers.callMethod(prefScreen, addPreference, pref);
- initSeekBar[0].invoke(fragment, "notification_volume", 5, Helpers.is12() ? context.getResources().getIdentifier("ic_audio_notification", "drawable", context.getPackageName()) : settingsNotifResId);
- XposedHelpers.callMethod(pref, "setOrder", order);
-
- pref = XposedHelpers.newInstance(vsbCls, context);
- XposedHelpers.callMethod(pref, "setKey", "system_volume");
- XposedHelpers.callMethod(pref, "setTitle", modRes.getString(R.string.system_volume));
- XposedHelpers.callMethod(pref, "setPersistent", true);
- XposedHelpers.callMethod(prefScreen, addPreference, pref);
- initSeekBar[0].invoke(fragment, "system_volume", 1, Helpers.is12() ? context.getResources().getIdentifier("ic_audio_vol", "drawable", context.getPackageName()) : settingsSystemResId);
- XposedHelpers.callMethod(pref, "setOrder", order);
-
- if (Helpers.is12()) {
- Object mRingVolume = XposedHelpers.callMethod(param.thisObject, "findPreference", "ring_volume");
- XposedHelpers.callMethod(mRingVolume, "setTitle", callsResId);
- }
- }
- });
- }
-
- private static String putSecondsIn(CharSequence clockChr) {
- NumberFormat df = new DecimalFormat("00");
- String clockStr = clockChr.toString();
- String clockStrLower = clockStr.toLowerCase();
- int colons = clockStr.length() - clockStr.replace(":", "").length();
- if (colons >= 2) return clockStr;
- //return clockStr.replaceAll("(\\d{1,2}:\\d{1,2}:)\\d{1,2}(?i)(\\s?)((am|pm)?)", "$1" + df.format(Calendar.getInstance().get(Calendar.SECOND)) + "$2$3").trim();
- if (clockStrLower.endsWith("am") || clockStrLower.endsWith("pm"))
- return clockStr.replaceAll("(?i)(\\s?)(am|pm)", ":" + df.format(Calendar.getInstance().get(Calendar.SECOND)) + "$1$2").trim();
- else
- return clockStr.trim() + ":" + df.format(Calendar.getInstance().get(Calendar.SECOND));
- }
-
- public static void ClockSecondsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "updateClock", new MethodHook(XCallback.PRIORITY_HIGHEST) {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- TextView clock = (TextView)param.thisObject;
- if (clock.getId() != clock.getResources().getIdentifier("clock", "id", "com.android.systemui")) return;
- long now = SystemClock.elapsedRealtime();
- Long last = (Long)XposedHelpers.getAdditionalInstanceField(clock, "mLastUpdateTime");
- if (last == null || now - last > 900)
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mLastUpdateTime", now);
- else
- param.setResult(null);
- }
-
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- TextView clock = (TextView)param.thisObject;
- if (clock.getId() == clock.getResources().getIdentifier("clock", "id", "com.android.systemui"))
- clock.setText(putSecondsIn(clock.getText()));
- }
- });
-
- Helpers.hookAllConstructors("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) {
- final TextView clock = (TextView)param.thisObject;
- if (clock.getId() != clock.getResources().getIdentifier("clock", "id", "com.android.systemui")) return;
- if (XposedHelpers.getAdditionalInstanceField(clock, "mSecondsTimer") != null) return;
- final Handler mClockHandler = new Handler(clock.getContext().getMainLooper());
- int opt = MainModule.mPrefs.getStringAsInt("system_clockseconds_sync", 0);
- long delay = 1000 - SystemClock.elapsedRealtime() % 1000;
- delay += opt == 1 ? 50 : 950;
- Timer timer = new Timer();
- timer.scheduleAtFixedRate(new TimerTask() {
- @Override
- public void run() {
- mClockHandler.post(new Runnable() {
- @Override
- public void run() {
- XposedHelpers.callMethod(clock, "updateClock");
- }
- });
- }
- }, delay, 1000);
- XposedHelpers.setAdditionalInstanceField(clock, "mSecondsTimer", timer);
- }
- });
- }
-
- public static void ExpandNotificationsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "updateRowStates", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ViewGroup mStackScroller = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mStackScroller");
- for (int i = mStackScroller.getChildCount() - 1; i >= 0; i--) {
- View enotificationrow = mStackScroller.getChildAt(i);
- if (enotificationrow != null && enotificationrow.getClass().getSimpleName().equalsIgnoreCase("ExpandableNotificationRow")) try {
- Object notification = XposedHelpers.getObjectField(XposedHelpers.callMethod(enotificationrow, "getEntry"), "notification");
- String pkgName = (String)XposedHelpers.callMethod(notification, "getPackageName");
- int opt = Integer.parseInt(MainModule.mPrefs.getString("system_expandnotifs", "1"));
- boolean isSelected = MainModule.mPrefs.getStringSet("system_expandnotifs_apps").contains(pkgName);
- if (opt == 2 && !isSelected || opt == 3 && isSelected)
- XposedHelpers.callMethod(enotificationrow, "setSystemExpanded", true);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- }
- });
- }
-
- public static void PopupNotificationsHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "addNotification", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (param.args[0] == null) return;
-
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (MainModule.mPrefs.getBoolean("system_popupnotif_fs"))
- if (Settings.Global.getInt(mContext.getContentResolver(), Helpers.modulePkg + ".foreground.fullscreen", 0) == 1) return;
-
- Set selectedApps = Helpers.getSharedStringSetPref(mContext, "pref_key_system_popupnotif_apps");
- String pkgName = (String)XposedHelpers.callMethod(param.args[0], "getPackageName");
- if (selectedApps.contains(pkgName)) {
- Intent expandNotif = new Intent(ACTION_PREFIX + "ExpandNotifications");
- expandNotif.putExtra("expand_only", true);
- mContext.sendBroadcast(expandNotif);
- }
- }
- });
- }
-
- public static void RecentsBlurRatioHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.systemui.recents.views.RecentsView", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)param.args[0];
- Handler mHandler = new Handler(mContext.getMainLooper());
-
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mCustomBlurModifier", MainModule.mPrefs.getInt("system_recents_blur", 100));
- new Helpers.SharedPrefObserver(mContext, mHandler, "pref_key_system_recents_blur", 100) {
- @Override
- public void onChange(String name, int defValue) {
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mCustomBlurModifier", Helpers.getSharedIntPref(mContext, name, defValue));
- }
- };
-
- XposedHelpers.setFloatField(param.thisObject, "mDefaultScrimAlpha", 0.15f);
- XposedHelpers.setObjectField(param.thisObject, "mBackgroundScrim", new ColorDrawable(Color.argb(38, 0, 0, 0)).mutate());
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.recents.views.RecentsView", lpparam.classLoader, "updateBlurRatio", float.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = (float)param.args[0] * (int)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mCustomBlurModifier") / 100f;
- }
- });
- }
-
- public static void DrawerBlurRatioHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.systemui.statusbar.phone.StatusBarWindowManager", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)param.args[0];
- Handler mHandler = new Handler(mContext.getMainLooper());
-
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mCustomBlurModifier", MainModule.mPrefs.getInt("system_drawer_blur", 100));
- new Helpers.SharedPrefObserver(mContext, mHandler, "pref_key_system_drawer_blur", 100) {
- @Override
- public void onChange(String name, int defValue) {
- int opt = Helpers.getSharedIntPref(mContext, name, defValue);
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mCustomBlurModifier", opt);
- if (Helpers.is12()) {
- Object mControlPanelWindowManager = XposedHelpers.callStaticMethod(findClass("com.android.systemui.Dependency", lpparam.classLoader), "get", findClass("com.android.systemui.miui.statusbar.phone.ControlPanelWindowManager", lpparam.classLoader));
- XposedHelpers.setAdditionalInstanceField(mControlPanelWindowManager, "mCustomBlurModifier", opt);
- }
- }
- };
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBarWindowManager", lpparam.classLoader, "setBlurRatio", float.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = (float)param.args[0] * (int)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mCustomBlurModifier") / 100f;
- }
- });
-
- if (!Helpers.findAndHookMethodSilently("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "onBlurRatioChanged", float.class, new MethodHook(1000) {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = XposedHelpers.callMethod(param.thisObject, "getAppearFraction");
- }
- })) Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "updateStatusBarWindowBlur", new MethodHook(100) {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- int mStatusBarState = XposedHelpers.getIntField(param.thisObject, "mStatusBarState");
- if (mStatusBarState != 0) return;
- View mThemeBackgroundView = (View)XposedHelpers.getObjectField(param.thisObject, "mThemeBackgroundView");
- if (mThemeBackgroundView != null)
- mThemeBackgroundView.setAlpha((float)XposedHelpers.callMethod(param.thisObject, "getAppearFraction"));
- }
- });
-
- if (Helpers.is12()) {
- Helpers.hookAllConstructors("com.android.systemui.miui.statusbar.phone.ControlPanelWindowManager", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mCustomBlurModifier", MainModule.mPrefs.getInt("system_drawer_blur", 100));
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.miui.statusbar.phone.ControlPanelWindowManager", lpparam.classLoader, "applyBlurRatio", float.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = (float)param.args[0] * (int)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mCustomBlurModifier") / 100f;
- }
- });
- }
- }
-
- public static void DrawerThemeBackgroundHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)param.args[0];
- Handler mHandler = new Handler(mContext.getMainLooper());
-
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mCustomOpacityModifier", MainModule.mPrefs.getInt("system_drawer_opacity", 100));
- new Helpers.SharedPrefObserver(mContext, mHandler, "pref_key_system_drawer_opacity", 100) {
- @Override
- public void onChange(String name, int defValue) {
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mCustomOpacityModifier", Helpers.getSharedIntPref(mContext, name, defValue));
- }
- };
- }
- });
-
- if (!Helpers.findAndHookMethodSilently("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "onBlurRatioChanged", float.class, new MethodHook(100) {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = (float)param.args[0] * (int)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mCustomOpacityModifier") / 100f;
- }
- })) Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "updateStatusBarWindowBlur", new MethodHook(1000) {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- int mStatusBarState = XposedHelpers.getIntField(param.thisObject, "mStatusBarState");
- if (mStatusBarState != 0) return;
- View mThemeBackgroundView = (View)XposedHelpers.getObjectField(param.thisObject, "mThemeBackgroundView");
- if (mThemeBackgroundView != null)
- mThemeBackgroundView.setAlpha(mThemeBackgroundView.getAlpha() * (int)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mCustomOpacityModifier") / 100f);
- }
- });
- }
-
- private static boolean is4GPlus = false;
- public static void HideNetworkTypeHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.SignalClusterView$PhoneState", lpparam.classLoader, "updateMobileType", String.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- int opt = Integer.parseInt(MainModule.mPrefs.getString("system_mobiletypeicon", "1"));
- TextView mMobileType = (TextView)XposedHelpers.getObjectField(param.thisObject, "mMobileType");
- TextView mSignalDualNotchMobileType = (TextView)XposedHelpers.getObjectField(XposedHelpers.getSurroundingThis(param.thisObject), "mSignalDualNotchMobileType");
- boolean isMobileConnected = false;
- if (opt == 2) {
- ConnectivityManager mgr = (ConnectivityManager)mMobileType.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
- Network net = mgr.getActiveNetwork();
- if (net != null) {
- NetworkCapabilities netCaps = mgr.getNetworkCapabilities(net);
- if (netCaps != null)
- isMobileConnected = netCaps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
- }
- }
- if (opt == 3 || (opt == 2 && !isMobileConnected)) {
- mMobileType.setText("");
- mSignalDualNotchMobileType.setText("");
- }
-
-// try {
-// View parent = (View)((View)XposedHelpers.getSurroundingThis(param.thisObject)).getParent().getParent().getParent().getParent();
-// parent != null && parent.getId() != parent.getResources().getIdentifier("header_content", "id", lpparam.packageName)
-// Helpers.log(parent + ", " + parent.getId() + " != " + mMobileType.getResources().getIdentifier("header_content", "id", lpparam.packageName));
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// }
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.SignalClusterView$PhoneState", lpparam.classLoader, "updateMobileTypeForNormal", boolean.class, String.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- is4GPlus = (boolean)param.args[0];
- param.args[0] = true;
- }
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- param.setResult(is4GPlus);
- }
- });
- }
-
- public static void TrafficSpeedSpacingHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.NetworkSpeedView", lpparam.classLoader, "onAttachedToWindow", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- TextView meter = (TextView)param.thisObject;
- if (meter == null) return;
- LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)meter.getLayoutParams();
- int margin = Math.round(meter.getResources().getDisplayMetrics().density * 4);
- lp.rightMargin = margin;
- lp.leftMargin = margin;
- meter.setLayoutParams(lp);
- }
- });
- }
-
- public static void ChargeAnimationHook(LoadPackageParam lpparam) {
- Class> ccCls;
- try {
- ccCls = XposedHelpers.findClass("com.android.keyguard.charge.MiuiWirelessChargeController", lpparam.classLoader);
- } catch (Throwable t1) {
- try {
- ccCls = XposedHelpers.findClass("com.android.keyguard.charge.MiuiChargeController", lpparam.classLoader);
- } catch (Throwable t2) {
- XposedBridge.log(t1);
- XposedBridge.log(t2);
- return;
- }
- }
-
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently(ccCls, "showWirelessChargeAnimation", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
- Runnable mScreenOffRunnable = (Runnable)XposedHelpers.getObjectField(param.thisObject, "mScreenOffRunnable");
- WakeLock mScreenOnWakeLock = (WakeLock)XposedHelpers.getObjectField(param.thisObject, "mScreenOnWakeLock");
-
- if (mContext != null && mHandler != null && mScreenOffRunnable != null && mScreenOnWakeLock != null) {
- if (mScreenOnWakeLock.isHeld()) {
- int timeout = Helpers.getSharedIntPref(mContext, "pref_key_system_chargeanimtime", 20) * 1000;
- mHandler.postDelayed(mScreenOnWakeLock::release, timeout);
- mHandler.removeCallbacks(mScreenOffRunnable);
- mHandler.postDelayed(mScreenOffRunnable, timeout);
- }
- } else Helpers.log("ChargeAnimationHook1", "Something is NULL! :)");
- }
- });
-
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently(ccCls, "showRapidChargeAnimation", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
- Runnable mScreenOffRunnable = (Runnable)XposedHelpers.getObjectField(param.thisObject, "mScreenOffRunnable");
- WakeLock mScreenOnWakeLock = (WakeLock)XposedHelpers.getObjectField(param.thisObject, "mScreenOnWakeLock");
-
- if (mContext != null && mHandler != null && mScreenOffRunnable != null && mScreenOnWakeLock != null) {
- if (mScreenOnWakeLock.isHeld()) {
- int timeout = Helpers.getSharedIntPref(mContext, "pref_key_system_chargeanimtime", 20) * 1000;
- mHandler.postDelayed(mScreenOnWakeLock::release, timeout);
- mHandler.removeCallbacks(mScreenOffRunnable);
- mHandler.postDelayed(mScreenOffRunnable, timeout);
- }
- } else Helpers.log("ChargeAnimationHook2", "Something is NULL! :)");
- }
- });
-
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently(ccCls, "showWirelessRapidChargeAnimation", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
- Runnable mScreenOffRunnable = (Runnable)XposedHelpers.getObjectField(param.thisObject, "mScreenOffRunnable");
- WakeLock mScreenOnWakeLock = (WakeLock)XposedHelpers.getObjectField(param.thisObject, "mScreenOnWakeLock");
-
- if (mContext != null && mHandler != null && mScreenOffRunnable != null && mScreenOnWakeLock != null) {
- if (mScreenOnWakeLock.isHeld()) {
- int timeout = Helpers.getSharedIntPref(mContext, "pref_key_system_chargeanimtime", 20) * 1000;
- mHandler.postDelayed(mScreenOnWakeLock::release, timeout);
- mHandler.removeCallbacks(mScreenOffRunnable);
- mHandler.postDelayed(mScreenOffRunnable, timeout);
- }
- } else Helpers.log("ChargeAnimationHook3", "Something is NULL! :)");
- }
- });
- }
-
- public static void VolumeStepsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.audio.AudioService", lpparam.classLoader, "createStreamStates", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) {
- Class> audioCls = findClass("com.android.server.audio.AudioService", lpparam.classLoader);
- int[] maxStreamVolume = (int[])XposedHelpers.getStaticObjectField(audioCls, "MAX_STREAM_VOLUME");
- int mult = MainModule.mPrefs.getInt("system_volumesteps", 0);
- if (mult <= 0) return;
- for (int i = 0; i < maxStreamVolume.length; i++)
- maxStreamVolume[i] = Math.round(maxStreamVolume[i] * mult / 100.0f);
- XposedHelpers.setStaticObjectField(audioCls, "MAX_STREAM_VOLUME", maxStreamVolume);
- }
- });
- }
-
- private static int minBrightnessLevel;
- private static int maxBrightnessLevel;
- private static int constrainValue(int val) {
- if (val < 0) return val;
-
- boolean limitmin = MainModule.mPrefs.getBoolean("system_autobrightness_limitmin");
- boolean limitmax = MainModule.mPrefs.getBoolean("system_autobrightness_limitmax");
- int min_pct = MainModule.mPrefs.getInt("system_autobrightness_min", 25);
- int max_pct = MainModule.mPrefs.getInt("system_autobrightness_max", 75);
-
- int range, min, max;
- range = maxBrightnessLevel - minBrightnessLevel;
- if (maxBrightnessLevel != 255 || MainModule.mPrefs.getBoolean("system_autobrightness_hlg")) {
- min = Helpers.convertGammaToLinear(minBrightnessLevel + (int)(range * min_pct / 100f), minBrightnessLevel, maxBrightnessLevel);
- max = Helpers.convertGammaToLinear(minBrightnessLevel + (int)(range * max_pct / 100f), minBrightnessLevel, maxBrightnessLevel);
- } else {
- min = minBrightnessLevel + (int)(range * min_pct / 100f);
- max = minBrightnessLevel + (int)(range * max_pct / 100f);
- }
-
- if (max <= min) max = min + 1;
- if (limitmin && val < min) val = min;
- if (limitmax && val > max) val = max;
- return val;
- }
-
- public static void AutoBrightnessRangeHook(LoadPackageParam lpparam) {
- Class> bmsCls = findClassIfExists("com.android.server.display.BrightnessMappingStrategy", lpparam.classLoader);
- if (bmsCls != null) {
- Helpers.hookAllConstructors("com.android.server.display.BrightnessMappingStrategy$SimpleMappingStrategy", lpparam.classLoader, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- int[] values = (int[])param.args[1];
- for (int i = 0; i < values.length; i++)
- values[i] = constrainValue(values[i]);
- param.args[1] = values;
- }
- });
-
- Helpers.hookAllConstructors("com.android.server.display.BrightnessMappingStrategy$PhysicalMappingStrategy", lpparam.classLoader, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- int[] values = (int[])param.args[2];
- for (int i = 0; i < values.length; i++)
- values[i] = constrainValue(values[i]);
- param.args[2] = values;
- }
- });
- }
-
- if (!Helpers.isPiePlus())
- Helpers.findAndHookMethod("com.android.server.display.AutomaticBrightnessController", lpparam.classLoader, "updateAutoBrightness", boolean.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- int val = XposedHelpers.getIntField(param.thisObject, "mScreenAutoBrightness");
- int newVal = constrainValue(val);
- if (val >= 0 && val != newVal) {
- //XposedBridge.log("updateAutoBrightness: " + val + " -> " + newVal);
- XposedHelpers.setIntField(param.thisObject, "mScreenAutoBrightness", newVal);
- if ((boolean)param.args[0]) {
- //XposedHelpers.callStaticMethod(findClass("com.android.server.display.AutomaticBrightnessControllerInjector", lpparam.classLoader), "recordAutoBrightnessChange", newVal);
- Object mCallbacks = XposedHelpers.getObjectField(param.thisObject, "mCallbacks");
- XposedHelpers.callMethod(mCallbacks, "updateBrightness");
- }
- }
- }
- });
- else
- Helpers.hookAllMethods("com.android.server.display.AutomaticBrightnessControllerInjector", lpparam.classLoader, "changeBrightness", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- int val = (int)param.getResult();
- if (val >= 0) param.setResult(constrainValue(val));
- }
- });
-
- Helpers.hookAllConstructors("com.android.server.display.AutomaticBrightnessController", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- XposedHelpers.setLongField(param.thisObject, "mBrighteningLightDebounceConfig", 500L);
- XposedHelpers.setLongField(param.thisObject, "mDarkeningLightDebounceConfig", 500L);
- }
- });
-
- Helpers.hookAllConstructors("com.android.server.display.DisplayPowerController", lpparam.classLoader, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- Context context = (Context)param.args[0];
- Resources res = context.getResources();
- minBrightnessLevel = res.getInteger(res.getIdentifier("config_screenBrightnessSettingMinimum", "integer", "android"));
- maxBrightnessLevel = res.getInteger(res.getIdentifier("config_screenBrightnessSettingMaximum", "integer", "android"));
- }
- });
- }
-
- private static long measureTime = 0;
- private static long txBytesTotal = 0;
- private static long rxBytesTotal = 0;
- private static long txSpeed = 0;
- private static long rxSpeed = 0;
-
- private static Pair getTrafficBytes(Object thisObject) {
- long tx = -1L;
- long rx = -1L;
-
- try {
- for (Enumeration list = NetworkInterface.getNetworkInterfaces(); list.hasMoreElements();) {
- NetworkInterface iface = list.nextElement();
- if (iface.isUp() && !iface.isVirtual() && !iface.isLoopback() && !iface.isPointToPoint() && !"".equals(iface.getName())) {
- tx += (long)XposedHelpers.callStaticMethod(TrafficStats.class, "getTxBytes", iface.getName());
- rx += (long)XposedHelpers.callStaticMethod(TrafficStats.class, "getRxBytes", iface.getName());
- }
- }
- return new Pair(tx, rx);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- try {
- Context mContext = (Context)XposedHelpers.getObjectField(thisObject, "mContext");
- Uri mNetworkUri = (Uri)XposedHelpers.getObjectField(thisObject, "mNetworkUri");
- Cursor query = mContext.getContentResolver().query(mNetworkUri, null, null, null, null);
- if (query != null) {
- try {
- if (query.moveToFirst()) {
- tx = query.getLong(query.getColumnIndex("total_tx_byte"));
- rx = query.getLong(query.getColumnIndex("total_rx_byte"));
- }
- } catch (Exception e) {
- tx = 1L; rx = 1L;
- } catch (Throwable th) {
- query.close();
- }
- query.close();
- } else {
- tx = TrafficStats.getTotalTxBytes();
- rx = TrafficStats.getTotalRxBytes();
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- tx = TrafficStats.getTotalTxBytes();
- rx = TrafficStats.getTotalRxBytes();
- }
-
- return new Pair(tx, rx);
- }
-
- @SuppressLint("DefaultLocale")
- private static String humanReadableByteCount(Context ctx, long bytes) {
- try {
- Resources modRes = Helpers.getModuleRes(ctx);
- if (bytes < 1024) return bytes + " " + modRes.getString(R.string.Bs);
- int exp = (int) (Math.log(bytes) / Math.log(1024));
- char pre = modRes.getString(R.string.speedunits).charAt(exp-1);
- DecimalFormat df = new DecimalFormat("0.#", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
- df.setMinimumFractionDigits(0);
- df.setMaximumFractionDigits(1);
- return df.format(bytes / Math.pow(1024, exp)) + " " + String.format("%s" + modRes.getString(R.string.Bs), pre);
- } catch (Throwable t) {
- XposedBridge.log(t);
- return "";
- }
- }
-
- public static void NetSpeedIntervalHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.NetworkSpeedView", lpparam.classLoader, "onAttachedToWindow", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Settings.System.putInt(mContext.getContentResolver(), "status_bar_network_speed_interval", MainModule.mPrefs.getInt("system_netspeedinterval", 4) * 1000);
- }
- });
- }
-
- public static void DetailedNetSpeedHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.NetworkSpeedView", lpparam.classLoader, "onTextChanged", XC_MethodReplacement.DO_NOTHING);
- Helpers.hookAllConstructors("com.android.systemui.statusbar.NetworkSpeedView", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- TextView meter = (TextView)param.thisObject;
- float density = meter.getResources().getDisplayMetrics().density;
- int font = Integer.parseInt(MainModule.mPrefs.getString("system_detailednetspeed_font", "3"));
- int icons = Integer.parseInt(MainModule.mPrefs.getString("system_detailednetspeed_icon", "2"));
- float size = 8.0f;
- float spacing = 0.7f;
- int top = 0;
- switch (font) {
- case 1: size = 10.0f; spacing = 0.75f; top = Math.round(density); break;
- case 2: size = 9.0f; break;
- case 3: size = 8.0f; break;
- case 4: size = 7.0f; break;
- }
- meter.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size);
- meter.setSingleLine(false);
- meter.setLines(2);
- meter.setMaxLines(2);
- meter.setLineSpacing(0, icons == 1 ? 0.85f : spacing);
- meter.setPadding(Math.round(meter.getPaddingLeft() + 3 * density), meter.getPaddingTop() - top, meter.getPaddingRight(), meter.getPaddingBottom());
- }
- });
-
- Class> nscCls = XposedHelpers.findClassIfExists("com.android.systemui.statusbar.NetworkSpeedController", lpparam.classLoader);
- if (nscCls == null) nscCls = XposedHelpers.findClassIfExists("com.android.systemui.statusbar.NetworkSpeedView", lpparam.classLoader);
- if (nscCls == null) {
- Helpers.log("DetailedNetSpeedHook", "No NetworkSpeed view or controller");
- return;
- }
-
- Helpers.hookAllConstructors(nscCls, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Handler mHandler = new Handler(Looper.getMainLooper()) {
- public void handleMessage(Message message) {
- if (message.what == 200000) try {
- boolean show = message.arg1 != 0;
- XposedHelpers.callMethod(param.thisObject, "setVisibilityToViewList", show ? View.VISIBLE : View.GONE);
- if (show) XposedHelpers.callMethod(param.thisObject, "setTextToViewList", "-");
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- XposedHelpers.setObjectField(param.thisObject, "mHandler", mHandler);
- }
- });
-
- Helpers.findAndHookMethod(nscCls, "getTotalByte", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Pair bytes = getTrafficBytes(param.thisObject);
- txBytesTotal = bytes.first;
- rxBytesTotal = bytes.second;
- measureTime = nanoTime();
- }
- });
-
- Method asyncMethod = XposedHelpers.findMethodExactIfExists(nscCls, "updateNetworkSpeedAsync");
- Helpers.findAndHookMethod(nscCls, asyncMethod != null ? "updateNetworkSpeedAsync" : "updateNetworkSpeed", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- boolean isConnected = false;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- ConnectivityManager mConnectivityManager = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo activeNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
- if (activeNetworkInfo != null)
- if (activeNetworkInfo.isConnected()) isConnected = true;
- if (isConnected) {
- long nanoTime = nanoTime();
- long newTime = nanoTime - measureTime;
- measureTime = nanoTime;
- if (newTime == 0) newTime = Math.round(4 * Math.pow(10, 9));
- Pair bytes = getTrafficBytes(param.thisObject);
- long newTxBytes = bytes.first;
- long newRxBytes = bytes.second;
- long newTxBytesFixed = newTxBytes - txBytesTotal;
- long newRxBytesFixed = newRxBytes - rxBytesTotal;
- if (newTxBytesFixed < 0 || txBytesTotal == 0) newTxBytesFixed = 0;
- if (newRxBytesFixed < 0 || rxBytesTotal == 0) newRxBytesFixed = 0;
- txSpeed = Math.round(newTxBytesFixed / (newTime / Math.pow(10, 9)));
- rxSpeed = Math.round(newRxBytesFixed / (newTime / Math.pow(10, 9)));
- txBytesTotal = newTxBytes;
- rxBytesTotal = newRxBytes;
- } else {
- txSpeed = 0;
- rxSpeed = 0;
- }
- }
- });
-
- Helpers.findAndHookMethod(nscCls, "setTextToViewList", CharSequence.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- boolean hideLow = MainModule.mPrefs.getBoolean("system_detailednetspeed_low");
- boolean reduceVis = MainModule.mPrefs.getBoolean("system_detailednetspeed_zero");
- int lowLevel = MainModule.mPrefs.getInt("system_detailednetspeed_lowlevel", 1) * 1024;
- int icons = Integer.parseInt(MainModule.mPrefs.getString("system_detailednetspeed_icon", "2"));
-
- String txarrow = "";
- String rxarrow = "";
- if (icons == 2) {
- txarrow = txSpeed < lowLevel ? "△" : "▲";
- rxarrow = rxSpeed < lowLevel ? "▽" : "▼";
- } else if (icons == 3) {
- txarrow = txSpeed < lowLevel ? " ☖" : " ☗";
- rxarrow = rxSpeed < lowLevel ? " ⛉" : " ⛊";
- }
-
- String tx = hideLow && txSpeed < lowLevel ? "" : humanReadableByteCount(mContext, txSpeed) + txarrow;
- String rx = hideLow && rxSpeed < lowLevel ? "" : humanReadableByteCount(mContext, rxSpeed) + rxarrow;
- param.args[0] = tx + "\n" + rx;
- if (reduceVis) try {
- CopyOnWriteArrayList> mViewList = (CopyOnWriteArrayList>)XposedHelpers.getObjectField(param.thisObject, "mViewList");
- for (Object tv: mViewList)
- if (tv != null) ((TextView)tv).setAlpha(rxSpeed == 0 && txSpeed == 0 ? 0.3f : 1.0f);
- } catch (Throwable t1) {
- try {
- ArrayList> mViewList = (ArrayList>)XposedHelpers.getObjectField(param.thisObject, "mViewList");
- for (Object tv: mViewList)
- if (tv != null) ((TextView)tv).setAlpha(rxSpeed == 0 && txSpeed == 0 ? 0.3f : 1.0f);
- } catch (Throwable t2) {
- ArrayList> sViewList = (ArrayList>)XposedHelpers.getObjectField(param.thisObject, "sViewList");
- for (Object tv : sViewList)
- if (tv != null) ((TextView)tv).setAlpha(rxSpeed == 0 && txSpeed == 0 ? 0.3f : 1.0f);
- }
- }
- //Helpers.log("DetailedNetSpeedHook", "setTextToViewList: " + tx + ", " + rx);
- //Helpers.log("DetailedNetSpeedHook", "class: " + param.thisObject.getClass().getSimpleName());
- }
- });
- }
-
- private static Bitmap processAlbumArt(Context context, Bitmap bitmap) {
- if (context == null || bitmap == null) return bitmap;
- int rescale = Integer.parseInt(Helpers.getSharedStringPref(context, "pref_key_system_albumartonlock_scale", "1"));
- boolean grayscale = Helpers.getSharedBoolPref(context, "pref_key_system_albumartonlock_gray", false);
- if (rescale == 1 && !grayscale) return bitmap;
-
- Paint paint = new Paint();
- Matrix transformation = new Matrix();
- int width = 0;
- int height = 0;
-
- if (grayscale) {
- width = bitmap.getWidth();
- height = bitmap.getHeight();
-
- ColorMatrix matrix = new ColorMatrix();
- matrix.setSaturation(0);
- paint.setColorFilter(new ColorMatrixColorFilter(matrix));
- }
-
- if (rescale != 1) {
- Display display = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
- Point point = new Point();
- display.getRealSize(point);
- width = point.x;
- height = point.y;
-
- float originalWidth = bitmap.getWidth();
- float originalHeight = bitmap.getHeight();
- float scale = rescale == 2 ? Math.min(width / originalWidth, height / originalHeight) : Math.max(width / originalWidth, height / originalHeight);
- float xTranslation = (width - originalWidth * scale) / 2.0f;
- float yTranslation = (height - originalHeight * scale) / 2.0f;
-
- transformation.postTranslate(xTranslation, yTranslation);
- transformation.preScale(scale, scale);
-
- paint.setFilterBitmap(true);
- }
-
- Bitmap processed = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(processed);
- canvas.drawBitmap(bitmap, transformation, paint);
- return processed;
- }
-
- public static void LockScreenAlbumArtHook(LoadPackageParam lpparam) {
- Method getLockWallpaperPreview = null;
- Class> utilClsTmp = XposedHelpers.findClassIfExists("com.android.keyguard.wallpaper.KeyguardWallpaperUtils", lpparam.classLoader);
- if (utilClsTmp != null)
- getLockWallpaperPreview = XposedHelpers.findMethodExactIfExists(utilClsTmp, "getLockWallpaperPreview", Context.class);
- if (getLockWallpaperPreview == null) {
- utilClsTmp = XposedHelpers.findClassIfExists("com.android.keyguard.MiuiKeyguardUtils", lpparam.classLoader);
- if (utilClsTmp != null)
- getLockWallpaperPreview = XposedHelpers.findMethodExactIfExists(utilClsTmp, "getLockWallpaperPreview", Context.class);
- }
-
- if (utilClsTmp == null || getLockWallpaperPreview == null) {
- Helpers.log("LockScreenAlbumArtHook", "Method getLockWallpaperPreview not found");
- return;
- }
-
- Method getLockWallpaper = XposedHelpers.findMethodExactIfExists(utilClsTmp, "getLockWallpaper", Context.class);
- Method getLockWallpaperCache = XposedHelpers.findMethodExactIfExists(utilClsTmp, "getLockWallpaperCache", Context.class);
-
- if (getLockWallpaper == null && getLockWallpaperCache == null) {
- Helpers.log("LockScreenAlbumArtHook", "No getLockWallpaper(Cache) methods found");
- return;
- }
-
- final Class> utilCls = utilClsTmp;
-
- Helpers.hookMethod(getLockWallpaperPreview, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Bitmap mAlbumArt = (Bitmap)XposedHelpers.getAdditionalStaticField(utilCls, "mAlbumArt");
- if (mAlbumArt != null) param.setResult(new BitmapDrawable(((Context)param.args[0]).getResources(), mAlbumArt));
- }
- });
-
- if (getLockWallpaper != null)
- Helpers.hookMethod(getLockWallpaper, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Bitmap mAlbumArt = (Bitmap)XposedHelpers.getAdditionalStaticField(utilCls, "mAlbumArt");
- if (mAlbumArt != null) param.setResult(new Pair(new File(""), new BitmapDrawable(((Context)param.args[0]).getResources(), mAlbumArt)));
- }
- });
-
- if (getLockWallpaperCache != null)
- Helpers.hookMethod(getLockWallpaperCache, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Bitmap mAlbumArt = (Bitmap)XposedHelpers.getAdditionalStaticField(utilCls, "mAlbumArt");
- if (mAlbumArt != null) param.setResult(new Pair(new File(""), new BitmapDrawable(((Context)param.args[0]).getResources(), mAlbumArt)));
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "updateMediaMetaData", boolean.class, boolean.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- // com.miui.internal.policy.impl.AwesomeLockScreenImp.WallpaperScreenElement
- if (new File("/data/system/theme/lockscreen").exists()) {
- XposedHelpers.setAdditionalStaticField(utilCls, "mAlbumArtSource", null);
- XposedHelpers.setAdditionalStaticField(utilCls, "mAlbumArt", null);
- return;
- }
-
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- MediaMetadata mMediaMetadata = (MediaMetadata)XposedHelpers.getObjectField(param.thisObject, "mMediaMetadata");
- Bitmap art = null;
- if (mMediaMetadata != null) {
- art = mMediaMetadata.getBitmap(MediaMetadata.METADATA_KEY_ART);
- if (art == null) art = mMediaMetadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART);
- if (art == null) art = mMediaMetadata.getBitmap(MediaMetadata.METADATA_KEY_DISPLAY_ICON);
- }
- Bitmap mAlbumArt = (Bitmap)XposedHelpers.getAdditionalStaticField(utilCls, "mAlbumArtSource");
- try {
- if (art == null && mAlbumArt == null) return;
- if (art != null && art.sameAs(mAlbumArt)) return;
- } catch (Throwable ignore) {}
- XposedHelpers.setAdditionalStaticField(utilCls, "mAlbumArtSource", art);
-
- int blur = Helpers.getSharedIntPref(mContext, "pref_key_system_albumartonlock_blur", 0);
- XposedHelpers.setAdditionalStaticField(utilCls, "mAlbumArt", processAlbumArt(mContext, art != null && blur > 0 ? Helpers.fastBlur(art, blur + 1) : art));
-
- Intent setWallpaper = new Intent("com.miui.keyguard.setwallpaper");
- setWallpaper.putExtra("set_lock_wallpaper_result", true);
- mContext.sendBroadcast(setWallpaper);
- }
- });
-
-// Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "setKeyguardOtherViewVisibility", int.class, new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// (int)param.args[0] == 1 ? View.VISIBLE : View.GONE
-// }
-// });
- }
-
- public static void BetterPopupsHideDelaySysHook() {
- Helpers.findAndHookMethod(MiuiNotification.class, "getFloatTime", XC_MethodReplacement.returnConstant(0));
- }
-
- public static void BetterPopupsHideDelayHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.systemui.statusbar.policy.HeadsUpManager", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- int delay = MainModule.mPrefs.getInt("system_betterpopups_delay", 0) * 1000;
- if (delay == 0) delay = 5000;
- XposedHelpers.setIntField(param.thisObject, "mMinimumDisplayTime", delay);
- XposedHelpers.setIntField(param.thisObject, "mHeadsUpNotificationDecay", delay);
- new Helpers.SharedPrefObserver(mContext, mHandler, "pref_key_system_betterpopups_delay", 0) {
- @Override
- public void onChange(String name, int defValue) {
- int delay = Helpers.getSharedIntPref(mContext, name, defValue) * 1000;
- if (delay == 0) delay = 5000;
- XposedHelpers.setIntField(param.thisObject, "mMinimumDisplayTime", delay);
- XposedHelpers.setIntField(param.thisObject, "mHeadsUpNotificationDecay", delay);
- }
- };
- }
- });
- }
-
- public static void BetterPopupsNoHideHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.HeadsUpManager", lpparam.classLoader, "removeHeadsUpNotification", XC_MethodReplacement.DO_NOTHING);
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.HeadsUpManager", lpparam.classLoader, "removeOldHeadsUpNotification", XC_MethodReplacement.DO_NOTHING);
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.HeadsUpManager$HeadsUpEntry", lpparam.classLoader, "updateEntry", boolean.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- XposedHelpers.setObjectField(param.thisObject, "mRemoveHeadsUpRunnable", new Runnable() {
- @Override
- public void run() {}
- });
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.HeadsUpManager", lpparam.classLoader, "onExpandingFinished", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- XposedHelpers.setBooleanField(param.thisObject, "mReleaseOnExpandFinish", true);
- }
- });
-
-// Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.HeadsUpManager", lpparam.classLoader, "onReorderingAllowed", new MethodHook() {
-// @Override
-// protected void before(final MethodHookParam param) throws Throwable {
-// Helpers.log("BetterPopupsNoHideHook", "onReorderingAllowed");
-// }
-// });
- }
-
- public static void BetterPopupsSwipeDownHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.HeadsUpTouchHelper", lpparam.classLoader, "onInterceptTouchEvent", MotionEvent.class, new MethodHook() {
- @Override
- @SuppressWarnings("ConstantConditions")
- protected void after(final MethodHookParam param) throws Throwable {
- MotionEvent me = (MotionEvent)param.args[0];
- if (me.getActionMasked() == MotionEvent.ACTION_DOWN) {
- boolean mAllowSwipingDown = true;
- if (Helpers.is12()) try {
- Object mPickedChild = XposedHelpers.getObjectField(param.thisObject, "mPickedChild");
- if (mPickedChild != null) {
- View mMiniBar = (View)XposedHelpers.callMethod(mPickedChild, "getMiniWindowBar");
- if (mMiniBar != null && mMiniBar.getVisibility() == View.VISIBLE) mAllowSwipingDown = false;
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mAllowSwipingDown", mAllowSwipingDown);
- }
- if (me.getActionMasked() == MotionEvent.ACTION_MOVE) {
- Object mAllowSwipingDown = XposedHelpers.getAdditionalInstanceField(param.thisObject, "mAllowSwipingDown");
- if (mAllowSwipingDown instanceof Boolean && !(boolean)mAllowSwipingDown) return;
- boolean mTouchingHeadsUpView = (boolean)XposedHelpers.getObjectField(param.thisObject, "mTouchingHeadsUpView");
- if (!mTouchingHeadsUpView) return;
- float mTouchSlop = (float)XposedHelpers.getObjectField(param.thisObject, "mTouchSlop");
- float mInitialTouchY = (float)XposedHelpers.getObjectField(param.thisObject, "mInitialTouchY");
- if (me.getY() - mInitialTouchY > mTouchSlop) {
- XposedHelpers.setObjectField(param.thisObject, "mTouchingHeadsUpView", false);
-
- ViewGroup mStackScroller = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mStackScroller");
- Context mContext = mStackScroller != null ? mStackScroller.getContext() : null;
- if (mContext == null) {
- Helpers.log("BetterPopupsSwipeDownHook", "Cannot get context!");
- return;
- }
-
- Intent expandNotif = new Intent(ACTION_PREFIX + "ExpandNotifications");
- expandNotif.putExtra("expand_only", true);
- mContext.sendBroadcast(expandNotif);
- }
- }
- }
- });
- }
-
- public static void RotationAnimationRes() {
- int opt = Integer.parseInt(MainModule.mPrefs.getString("system_rotateanim", "1"));
- int enter = 0;
- int exit = 0;
- if (opt == 2) {
- enter = R.anim.no_enter;
- exit = R.anim.no_exit;
- } else if (opt == 3) {
- enter = R.anim.xfade_enter;
- exit = R.anim.xfade_exit;
- }
-
- MainModule.resHooks.setResReplacement("android", "anim", "screen_rotate_0_enter", enter);
- MainModule.resHooks.setResReplacement("android", "anim", "screen_rotate_0_exit", exit);
- MainModule.resHooks.setResReplacement("android", "anim", "screen_rotate_180_enter", enter);
- MainModule.resHooks.setResReplacement("android", "anim", "screen_rotate_180_exit", exit);
- MainModule.resHooks.setResReplacement("android", "anim", "screen_rotate_minus_90_enter", enter);
- MainModule.resHooks.setResReplacement("android", "anim", "screen_rotate_minus_90_exit", exit);
- MainModule.resHooks.setResReplacement("android", "anim", "screen_rotate_plus_90_enter", enter);
- MainModule.resHooks.setResReplacement("android", "anim", "screen_rotate_plus_90_exit", exit);
- }
-
- public static void RotationAnimatinoHook(LoadPackageParam lpparam) {
- MethodHook animEnter = new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- int opt = Integer.parseInt(MainModule.mPrefs.getString("system_rotateanim", "1"));
- Animation anim = (Animation)param.getResult();
- if (opt == 2) {
- anim.setDuration(0);
- param.setResult(anim);
- } else if (opt == 3) {
- Animation alphaAnim = new AlphaAnimation(1.0f, 1.0f);
- alphaAnim.setInterpolator((Interpolator)XposedHelpers.getStaticObjectField(XposedHelpers.findClass("com.android.server.wm.ScreenRotationAnimationInjector", lpparam.classLoader), "QUART_EASE_OUT_INTERPOLATOR"));
- alphaAnim.setDuration(300);
- alphaAnim.setFillAfter(true);
- alphaAnim.setFillBefore(true);
- alphaAnim.setFillEnabled(true);
- param.setResult(alphaAnim);
- }
- }
- };
-
- MethodHook animExit = new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- int opt = Integer.parseInt(MainModule.mPrefs.getString("system_rotateanim", "1"));
- Animation anim = (Animation)param.getResult();
- if (opt == 2) {
- anim.setDuration(0);
- } else if (opt == 3) {
- AlphaAnimation alphaAnim = new AlphaAnimation(1.0f, 0.0f);
- alphaAnim.setInterpolator((Interpolator)XposedHelpers.getStaticObjectField(XposedHelpers.findClass("com.android.server.wm.ScreenRotationAnimationInjector", lpparam.classLoader), "QUART_EASE_OUT_INTERPOLATOR"));
- alphaAnim.setDuration(300);
- alphaAnim.setFillAfter(true);
- alphaAnim.setFillBefore(true);
- alphaAnim.setFillEnabled(true);
- param.setResult(alphaAnim);
- }
- }
- };
-
- Helpers.findAndHookMethod("com.android.server.wm.ScreenRotationAnimationInjector", lpparam.classLoader, "createRotation180Enter", animEnter);
- Helpers.findAndHookMethod("com.android.server.wm.ScreenRotationAnimationInjector", lpparam.classLoader, "createRotation180Exit", animExit);
- Helpers.hookAllMethods("com.android.server.wm.ScreenRotationAnimationInjector", lpparam.classLoader, "createRotationEnter", animEnter);
- Helpers.hookAllMethods("com.android.server.wm.ScreenRotationAnimationInjector", lpparam.classLoader, "createRotationEnterWithBackColor", animEnter);
- Helpers.hookAllMethods("com.android.server.wm.ScreenRotationAnimationInjector", lpparam.classLoader, "createRotationExit", animExit);
- }
-
- public static void NoVersionCheckHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.pm.PackageManagerService", lpparam.classLoader, "checkDowngrade", XC_MethodReplacement.DO_NOTHING);
- }
-
- public static void ColorizedNotificationTitlesHook() {
- Helpers.hookAllMethods("android.app.Notification.Builder", null, "bindNotificationHeader", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (!Helpers.isNougat()) try {
- Object mN = XposedHelpers.getObjectField(param.thisObject, "mN");
- if (mN != null)
- if ((boolean)XposedHelpers.callMethod(mN, "isColorizedMedia")) return;
- } catch (Throwable ignore) {}
-
- RemoteViews rv = (RemoteViews)param.args[0];
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- int contrastColor;
- if (Helpers.isQPlus())
- contrastColor = (int)XposedHelpers.callMethod(param.thisObject, "resolveContrastColor", param.args[1]);
- else
- contrastColor = (int)XposedHelpers.callMethod(param.thisObject, "resolveContrastColor");
- if (rv != null && mContext != null)
- rv.setTextColor(mContext.getResources().getIdentifier("app_name_text", "id", "android"), contrastColor);
- }
- });
-
-// Helpers.hookAllMethods("android.app.Notification.Builder", null, "bindHeaderAppName", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// XposedBridge.log("bindHeaderAppName");
-// }
-// });
-//
-// Helpers.findAndHookMethod("android.app.Notification.Builder", null, "bindHeaderAppName", RemoteViews.class, "android.app.Notification.StandardTemplateParams", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// XposedBridge.log("bindHeaderAppName2");
-// }
-// });
- }
-
- public static int abHeight = 39;
-
- public static void CompactNotificationsRes() {
- MainModule.resHooks.setDensityReplacement("android", "dimen", "notification_action_height", abHeight);
- MainModule.resHooks.setDensityReplacement("android", "dimen", "android_notification_action_height", abHeight);
- MainModule.resHooks.setDensityReplacement("android", "dimen", "notification_action_list_height", abHeight);
- MainModule.resHooks.setDensityReplacement("com.android.systemui", "dimen", "notification_row_extra_padding", 0);
- }
-
- public static void CompactNotificationsHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.notification.NotificationViewWrapper", lpparam.classLoader, "wrap", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (param.args.length > 3) return;
- Object res = param.getResult();
- if (res == null) return;
- View mView = (View)XposedHelpers.getObjectField(res, "mView");
- if (mView == null) return;
- //if (mView.getId() != mView.getResources().getIdentifier("status_bar_latest_event_content", "id", "android")) return;
- FrameLayout container = mView.findViewById(mView.getResources().getIdentifier("actions_container", "id", "android"));
- if (container == null) return;
- float density = mView.getResources().getDisplayMetrics().density;
- int height = Math.round(density * abHeight);
- ViewGroup actions = (ViewGroup)container.getChildAt(0);
- FrameLayout.LayoutParams lp1 = (FrameLayout.LayoutParams)actions.getLayoutParams();
- lp1.height = height;
- actions.setLayoutParams(lp1);
- actions.setPadding(0, 0, 0, 0);
- for (int c = 0; c < actions.getChildCount(); c++) {
- View button = actions.getChildAt(c);
- ViewGroup.MarginLayoutParams lp2 = (ViewGroup.MarginLayoutParams)button.getLayoutParams();
- lp2.height = height;
- lp2.bottomMargin = 0;
- lp2.topMargin = 0;
- }
- }
- });
-
- if (Helpers.is12()) {
- MethodHook hook = new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View view = (View)param.args[0];
- FrameLayout container = view.findViewById(view.getResources().getIdentifier("actions_container", "id", "android"));
- if (container == null || container.getVisibility() != View.VISIBLE) return;
- ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)view.getLayoutParams();
- if ("MiuiStyleProcessor".equals(param.thisObject.getClass().getSimpleName())) {
- float density = container.getResources().getDisplayMetrics().density;
- lp.bottomMargin = Math.round(lp.bottomMargin * 0.666f);
- ViewGroup.LayoutParams lpc = container.getLayoutParams();
- lpc.height = Math.round(density * abHeight);
- container.setLayoutParams(lpc);
- } else {
- lp.bottomMargin = 0;
- }
- view.setLayoutParams(lp);
- }
- };
- Helpers.findAndHookMethod("com.android.systemui.statusbar.notification.NotificationTemplateViewWrapper$GoogleStyleProcessor", lpparam.classLoader, "setGoogleContentMargins", View.class, hook);
- Helpers.findAndHookMethod("com.android.systemui.statusbar.notification.NotificationTemplateViewWrapper$MiuiStyleProcessor", lpparam.classLoader, "setMiuiContentMargins", View.class, hook);
- }
- }
-
- public static void HideFromRecentsHook(LoadPackageParam lpparam) {
- String taskRecordClass = Helpers.isQPlus() ? "com.android.server.wm.TaskRecord" : "com.android.server.am.TaskRecord";
- Helpers.hookAllConstructors(taskRecordClass, lpparam.classLoader, new MethodHook() {
- @Override
- @SuppressLint("WrongConstant")
- protected void after(final MethodHookParam param) throws Throwable {
- //boolean mBooted = XposedHelpers.getBooleanField(param.args[0], "mBooted");
- //if (!mBooted) return;
-
- String pkgName = null;
- ComponentName origActivity = (ComponentName)XposedHelpers.getObjectField(param.thisObject, "origActivity");
- ComponentName realActivity = (ComponentName)XposedHelpers.getObjectField(param.thisObject, "realActivity");
- String mCallingPackage = (String)XposedHelpers.getObjectField(param.thisObject, "mCallingPackage");
-
- if (realActivity != null) pkgName = realActivity.getPackageName();
- if (pkgName == null && origActivity != null) pkgName = origActivity.getPackageName();
- if (pkgName == null) pkgName = mCallingPackage;
-
- //Context mContext = (Context)XposedHelpers.getObjectField(param.args[0], "mContext");
- //Set selectedApps = Helpers.getSharedStringSetPref(mContext, "pref_key_system_hidefromrecents_apps");
- Set selectedApps = MainModule.mPrefs.getStringSet("system_hidefromrecents_apps");
- if (selectedApps.contains(pkgName)) {
- Intent intent = (Intent)XposedHelpers.getObjectField(param.thisObject, "intent");
- Intent affinityIntent = (Intent)XposedHelpers.getObjectField(param.thisObject, "affinityIntent");
- if (intent != null) intent.addFlags(8388608);
- if (affinityIntent != null) affinityIntent.addFlags(8388608);
- }
- }
- });
- }
-
- private static final List hookedTiles = new ArrayList();
-
- @SuppressLint("MissingPermission")
- public static void QSHapticHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.qs.tileimpl.QSFactoryImpl", lpparam.classLoader, "createTileInternal", String.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Object tile = param.getResult();
- if (tile == null) return;
- String tileClass = tile.getClass().getCanonicalName();
- if (!hookedTiles.contains(tileClass)) {
- Helpers.findAndHookMethod(tileClass, lpparam.classLoader, "handleClick", new MethodHook(20) {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- boolean ignoreSystem = Helpers.getSharedBoolPref(mContext, "pref_key_system_qshaptics_ignore", false);
- int opt = Integer.parseInt(Helpers.getSharedStringPref(mContext, "pref_key_system_qshaptics", "1"));
- if (opt == 2)
- Helpers.performLightVibration(mContext, ignoreSystem);
- else if (opt == 3)
- Helpers.performStrongVibration(mContext, ignoreSystem);
- }
- });
- hookedTiles.add(tileClass);
- }
- }
- });
- }
-
- public static void AutoGroupNotificationsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.notification.GroupHelper", lpparam.classLoader, "adjustAutogroupingSummary", int.class, String.class, String.class, boolean.class, new MethodHook() {
- @Override
- @SuppressWarnings({"unchecked", "SuspiciousMethodCalls"})
- protected void before(final MethodHookParam param) throws Throwable {
- int opt = Integer.parseInt(MainModule.mPrefs.getString("system_autogroupnotif", "1"));
- if (opt == 2) {
- param.setResult(null);
- return;
- }
- Map>> mUngroupedNotifications = (Map>>)XposedHelpers.getObjectField(param.thisObject, "mUngroupedNotifications");
- Map> obj = mUngroupedNotifications.get(param.args[0]);
- if (obj != null) {
- LinkedHashSet list = obj.get(param.args[1]);
- if (list != null && list.size() < opt) param.setResult(null);
- }
- }
- });
-
- Helpers.findAndHookMethod("com.android.server.notification.GroupHelper", lpparam.classLoader, "adjustNotificationBundling", List.class, boolean.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- List> list = (List>)param.args[0];
- int opt = Integer.parseInt(MainModule.mPrefs.getString("system_autogroupnotif", "1"));
- if (opt == 2 || (list != null && list.size() < opt)) param.setResult(null);
- }
- });
- }
-
- public static void NoMoreIconHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.NotificationIconAreaController", lpparam.classLoader, "setIconsVisibility", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- Object mMoreIcon = XposedHelpers.getObjectField(param.thisObject, "mMoreIcon");
- if (mMoreIcon != null) XposedHelpers.setBooleanField(param.thisObject, "mForceHideMoreIcon", true);
- }
- });
- }
-
- public static void ShowNotificationsAfterUnlockHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.miui.statusbar.ExpandedNotification", lpparam.classLoader, "hasShownAfterUnlock", XC_MethodReplacement.returnConstant(false));
- Helpers.findAndHookMethod("com.android.systemui.miui.statusbar.ExpandedNotification", lpparam.classLoader, "setHasShownAfterUnlock", boolean.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- XposedHelpers.setBooleanField(param.thisObject, "mHasShownAfterUnlock", false);
- }
- });
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.android.systemui.statusbar.notification.MiuiNotificationCompat", lpparam.classLoader, "isKeptOnKeyguard", Notification.class, XC_MethodReplacement.returnConstant(true));
- }
-
- private static int appInfoIconResId;
- private static int forceCloseIconResId;
- public static void NotificationRowMenuRes() {
- appInfoIconResId = MainModule.resHooks.addResource("ic_appinfo", Helpers.is12()? R.drawable.ic_appinfo12 : R.drawable.ic_appinfo);
- forceCloseIconResId = MainModule.resHooks.addResource("ic_forceclose", Helpers.is12()? R.drawable.ic_forceclose12 : R.drawable.ic_forceclose);
- if (!Helpers.is12())
- MainModule.resHooks.setDensityReplacement("com.android.systemui", "dimen", "notification_menu_icon_size", 36);
- MainModule.resHooks.setDensityReplacement("com.android.systemui", "dimen", "notification_menu_icon_padding", 0);
- }
-
- public static void NotificationRowMenuHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.NotificationMenuRow", lpparam.classLoader, "createMenuViews", boolean.class, new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- ArrayList mMenuItems = (ArrayList)XposedHelpers.getObjectField(param.thisObject, "mMenuItems");
- Class> nmiCls = findClass("com.android.systemui.statusbar.NotificationMenuRow.NotificationMenuItem", lpparam.classLoader);
- Object infoBtn = null;
- Object forceCloseBtn = null;
- int nInfoResId = mContext.getResources().getIdentifier("notification_info", "layout", lpparam.packageName);
- try {
- infoBtn = XposedHelpers.newInstance(nmiCls, mContext, "Application info", nInfoResId, appInfoIconResId);
- forceCloseBtn = XposedHelpers.newInstance(nmiCls, mContext, "Force close", nInfoResId, forceCloseIconResId);
- } catch (Throwable t1) {
- try {
- infoBtn = XposedHelpers.newInstance(nmiCls, mContext, "Application info", LayoutInflater.from(mContext).inflate(nInfoResId, null, false), appInfoIconResId);
- forceCloseBtn = XposedHelpers.newInstance(nmiCls, mContext, "Force close", LayoutInflater.from(mContext).inflate(nInfoResId, null, false), forceCloseIconResId);
- } catch (Throwable t2) {
- XposedBridge.log(t2);
- }
- }
- if (infoBtn == null || forceCloseBtn == null) return;
-
- mMenuItems.add(infoBtn);
- mMenuItems.add(forceCloseBtn);
- XposedHelpers.setObjectField(param.thisObject, "mMenuItems", mMenuItems);
- FrameLayout mMenuContainer = (FrameLayout)XposedHelpers.getObjectField(param.thisObject, "mMenuContainer");
- if (mMenuContainer != null)
- if (Helpers.is12()) {
- View mInfoBtn = (View)XposedHelpers.callMethod(infoBtn, "getMenuView");
- View mForceCloseBtn = (View)XposedHelpers.callMethod(forceCloseBtn, "getMenuView");
- mInfoBtn.setOnClickListener((View.OnClickListener)param.thisObject);
- mForceCloseBtn.setOnClickListener((View.OnClickListener)param.thisObject);
- XposedHelpers.callMethod(mMenuContainer, "addMenuView", mInfoBtn);
- XposedHelpers.callMethod(mMenuContainer, "addMenuView",mForceCloseBtn);
- } else {
- XposedHelpers.callMethod(param.thisObject, "addMenuView", infoBtn, mMenuContainer);
- XposedHelpers.callMethod(param.thisObject, "addMenuView", forceCloseBtn, mMenuContainer);
- //XposedHelpers.callMethod(param.thisObject, "setMenuLocation");
- }
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.NotificationMenuRow", lpparam.classLoader, "onClick", View.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- View view = (View)param.args[0];
- if (view == null || view.getTag() == null || !(view.getTag() instanceof Integer)) return;
-
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Object mParent = XposedHelpers.getObjectField(param.thisObject, "mParent");
- Object notification = XposedHelpers.callMethod(mParent, "getStatusBarNotification");
- String pkgName = (String)XposedHelpers.callMethod(notification, "getPackageName");
- int uid = (int)XposedHelpers.callMethod(notification, "getAppUid");
- int user = 0;
- try {
- user = (int)XposedHelpers.callStaticMethod(UserHandle.class, "getUserId", uid);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- int iconResId = (int)view.getTag();
- if (iconResId == appInfoIconResId) {
- param.setResult(null);
- Helpers.openAppInfo(mContext, pkgName, user);
- mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
- } else if (iconResId == forceCloseIconResId) {
- param.setResult(null);
- ActivityManager am = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
- if (user != 0)
- XposedHelpers.callMethod(am, "forceStopPackageAsUser", pkgName, user);
- else
- XposedHelpers.callMethod(am, "forceStopPackage", pkgName);
- CharSequence appName = pkgName;
- try {
- appName = mContext.getPackageManager().getApplicationLabel(mContext.getPackageManager().getApplicationInfo(pkgName, 0));
- } catch (Throwable ignore) {}
- Toast.makeText(mContext, Helpers.getModuleRes(mContext).getString(R.string.force_closed, appName), Toast.LENGTH_SHORT).show();
- }
- }
- });
-
- if (!Helpers.is12()) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.NotificationMenuRow", lpparam.classLoader, "onHeightUpdate", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- FrameLayout mMenuContainer = (FrameLayout)XposedHelpers.getObjectField(param.thisObject, "mMenuContainer");
- if (mMenuContainer != null) mMenuContainer.setTranslationY(0);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.NotificationMenuRow", lpparam.classLoader, "setMenuLocation", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- param.setResult(null);
- float mHorizSpaceForIcon = XposedHelpers.getFloatField(param.thisObject, "mHorizSpaceForIcon");
- boolean mSnapping = XposedHelpers.getBooleanField(param.thisObject, "mSnapping");
- FrameLayout mMenuContainer = (FrameLayout)XposedHelpers.getObjectField(param.thisObject, "mMenuContainer");
- Object mParent = XposedHelpers.getObjectField(param.thisObject, "mParent");
- if (mMenuContainer == null || mParent == null) return;
- int width = (int)XposedHelpers.callMethod(mParent, "getWidth");
- int height = (int)XposedHelpers.callMethod(mParent, "getIntrinsicHeight");
- boolean hasExtraTopPadding = (boolean)XposedHelpers.callMethod(mParent, "hasExtraTopPadding");
- int extraTopPadding = hasExtraTopPadding ? (int)XposedHelpers.callMethod(mParent, "getPaddingTop") : 0;
- float density = mMenuContainer.getResources().getDisplayMetrics().density;
- float padding = 10 * density;
- float startingHeight = height / 2.0f - mHorizSpaceForIcon - padding - extraTopPadding;
- Object sbNotification = XposedHelpers.callMethod(mParent, "getStatusBarNotification");
- int mImportance = XposedHelpers.getIntField(sbNotification, "mImportance");
- if (!mSnapping && mMenuContainer.isAttachedToWindow()) {
- int childCount = mMenuContainer.getChildCount();
- int row = 0;
- int col = 0;
- if (mImportance == 1) mHorizSpaceForIcon = 24 * density;
- for (int i = 0; i < childCount; i++)
- if (mImportance == 1) {
- View childAt = mMenuContainer.getChildAt(i);
- childAt.setX((float)width - padding - (mHorizSpaceForIcon + padding) * (col + 1));
- childAt.setY(height / 2.0f - mHorizSpaceForIcon / 2.0f - padding / 2.0f - extraTopPadding);
- col++;
- } else {
- View childAt = mMenuContainer.getChildAt(i);
- childAt.setX((float)width - (mHorizSpaceForIcon + (col == 0 ? 2 * padding : 1.5f * padding)) * (col + 1));
- childAt.setY(startingHeight + mHorizSpaceForIcon * row + padding);
- col++;
- if (i % 2 == 1) {
- col = 0;
- row++;
- }
- }
- }
- }
- });
- }
- }
-
- @SuppressWarnings("unchecked")
- private static boolean checkVibration(String pkgName, Object thisObject) {
- try {
- int opt = (int)XposedHelpers.getAdditionalInstanceField(thisObject, "mVibrationMode");
- Set selectedApps = (Set)XposedHelpers.getAdditionalInstanceField(thisObject, "mVibrationApps");
- boolean isSelected = selectedApps != null && selectedApps.contains(pkgName);
- return opt == 2 && !isSelected || opt == 3 && isSelected;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static void SelectiveVibrationHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.VibratorService", lpparam.classLoader, "systemReady", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = new Handler(mContext.getMainLooper());
-
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mVibrationMode", Integer.parseInt(MainModule.mPrefs.getString("system_vibration", "1")));
- new Helpers.SharedPrefObserver(mContext, mHandler, "pref_key_system_vibration", "1") {
- @Override
- public void onChange(String name, String defValue) {
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mVibrationMode", Integer.parseInt(Helpers.getSharedStringPref(mContext, name, defValue)));
- }
- };
-
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mVibrationApps", MainModule.mPrefs.getStringSet("system_vibration_apps"));
- new Helpers.SharedPrefObserver(mContext, mHandler, "pref_key_system_vibration_apps") {
- @Override
- public void onChange(String name) {
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mVibrationApps", Helpers.getSharedStringSetPref(mContext, name));
- }
- };
- }
- });
-
- Helpers.hookAllMethods("com.android.server.VibratorService", lpparam.classLoader, "vibrate", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- //XposedBridge.log(Arrays.toString(new Throwable().getStackTrace()));
- String pkgName = (String)param.args[1];
- if (pkgName == null) return;
- if (checkVibration(pkgName, param.thisObject)) param.setResult(null);
- }
- });
-
- if (Helpers.isNougat())
- Helpers.hookAllMethods("com.android.server.VibratorService", lpparam.classLoader, "vibratePattern", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- String pkgName = (String)param.args[1];
- if (pkgName == null) return;
- if (checkVibration(pkgName, param.thisObject)) param.setResult(null);
- }
- });
- }
-
- public static void QQSGridRes() {
- int cols = MainModule.mPrefs.getInt("system_qqsgridcolumns", 2);
- int colsResId = R.integer.quick_quick_settings_num_rows_5;
- switch (cols) {
- case 3: colsResId = R.integer.quick_quick_settings_num_rows_3; break;
- case 4: colsResId = R.integer.quick_quick_settings_num_rows_4; break;
- case 5: colsResId = R.integer.quick_quick_settings_num_rows_5; break;
- case 6: colsResId = R.integer.quick_quick_settings_num_rows_6; break;
- case 7: colsResId = R.integer.quick_quick_settings_num_rows_7; break;
- }
- MainModule.resHooks.setObjectReplacement("com.android.systemui", "integer", "quick_settings_qqs_count_portrait", cols);
- MainModule.resHooks.setResReplacement("com.android.systemui", "integer", "quick_settings_qqs_count", colsResId);
- }
-
- public static void QSGridRes() {
- int cols = MainModule.mPrefs.getInt("system_qsgridcolumns", 2);
- int rows = MainModule.mPrefs.getInt("system_qsgridrows", 1);
- int colsRes = R.integer.quick_settings_num_columns_3;
- int rowsRes = R.integer.quick_settings_num_rows_4;
-
- switch (cols) {
- case 3: colsRes = R.integer.quick_settings_num_columns_3; break;
- case 4: colsRes = R.integer.quick_settings_num_columns_4; break;
- case 5: colsRes = R.integer.quick_settings_num_columns_5; break;
- case 6: colsRes = R.integer.quick_settings_num_columns_6; break;
- case 7: colsRes = R.integer.quick_settings_num_columns_7; break;
- }
-
- switch (rows) {
- case 2: rowsRes = R.integer.quick_settings_num_rows_2; break;
- case 3: rowsRes = R.integer.quick_settings_num_rows_3; break;
- case 4: rowsRes = R.integer.quick_settings_num_rows_4; break;
- case 5: rowsRes = R.integer.quick_settings_num_rows_5; break;
- }
-
- if (cols > 2) MainModule.resHooks.setResReplacement("com.android.systemui", "integer", "quick_settings_num_columns", colsRes);
- if (rows > 1) MainModule.resHooks.setResReplacement("com.android.systemui", "integer", "quick_settings_num_rows", rowsRes);
- }
-
- private static void updateLabelsVisibility(Object mRecord, int mRows, int orientation) {
- if (mRecord == null) return;
- Object tileView = XposedHelpers.getObjectField(mRecord, "tileView");
- if (tileView != null) {
- ViewGroup mLabelContainer = (ViewGroup)XposedHelpers.getObjectField(tileView, "mLabelContainer");
- if (mLabelContainer != null)
- mLabelContainer.setVisibility(
- MainModule.mPrefs.getBoolean("system_qsnolabels") ||
- orientation == Configuration.ORIENTATION_PORTRAIT && mRows >= 5 ||
- orientation == Configuration.ORIENTATION_LANDSCAPE && mRows >= 3 ? View.GONE : View.VISIBLE
- );
- }
- }
-
- public static void QSGridLabelsHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.qs.TileLayout", lpparam.classLoader, "addTile", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- updateLabelsVisibility(param.args[0], XposedHelpers.getIntField(param.thisObject, "mRows"), ((ViewGroup)param.thisObject).getResources().getConfiguration().orientation);
- }
- });
-
- Helpers.hookAllMethods("com.android.systemui.qs.PagedTileLayout", lpparam.classLoader, "addTile", new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void before(MethodHookParam param) throws Throwable {
- ArrayList mPages = (ArrayList)XposedHelpers.getObjectField(param.thisObject, "mPages");
- if (mPages == null) return;
- int mRows = 0;
- if (mPages.size() > 0) mRows = XposedHelpers.getIntField(mPages.get(0), "mRows");
- updateLabelsVisibility(param.args[0], mRows, ((ViewGroup)param.thisObject).getResources().getConfiguration().orientation);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.qs.TileLayout", lpparam.classLoader, "updateResources", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (MainModule.mPrefs.getInt("system_qsgridrows", 1) != 2) return;
- if (!(boolean)param.getResult()) return;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (mContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) return;
- XposedHelpers.setIntField(param.thisObject, "mContentHeight", Math.round(XposedHelpers.getIntField(param.thisObject, "mContentHeight") / 1.5f));
- ((ViewGroup)param.thisObject).requestLayout();
- }
- });
-
- if (MainModule.mPrefs.getInt("system_qsgridrows", 1) == 4)
- Helpers.findAndHookMethod("com.android.systemui.qs.tileimpl.QSTileView", lpparam.classLoader, "createLabel", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ViewGroup mLabelContainer = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mLabelContainer");
- if (mLabelContainer != null) mLabelContainer.setPadding(
- mLabelContainer.getPaddingLeft(),
- Math.round(mLabelContainer.getResources().getDisplayMetrics().density * 2),
- mLabelContainer.getPaddingRight(),
- mLabelContainer.getPaddingBottom()
- );
- }
- });
- }
-
- public static void NoDuckingHook(LoadPackageParam lpparam) {
- //Helpers.hookAllMethods("com.android.server.audio.PlaybackActivityMonitor", lpparam.classLoader, "duckPlayers", XC_MethodReplacement.returnConstant(true));
- //Helpers.hookAllMethods("com.android.server.audio.PlaybackActivityMonitor$DuckingManager", lpparam.classLoader, "addDuck", XC_MethodReplacement.DO_NOTHING);
- Helpers.hookAllMethods("com.android.server.audio.FocusRequester", lpparam.classLoader, "handleFocusLoss", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if ((int)param.args[0] == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) param.setResult(null);
- }
- });
- }
-
- public static void OrientationLockHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "systemReady", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- new Helpers.SharedPrefObserver(mContext, mHandler, "pref_key_qs_autorotate_state", 0) {
- @Override
- public void onChange(String name, int defValue) {
- MainModule.mPrefs.put(name, Helpers.getSharedIntPref(mContext, name, defValue));
- }
- };
- }
- });
-
- String windowClass = Helpers.isQPlus() ? "com.android.server.wm.DisplayRotation" : "com.android.server.policy.PhoneWindowManager";
- String rotMethod = Helpers.isQPlus() ? "rotationForOrientation" : "rotationForOrientationLw";
- Helpers.hookAllMethods(windowClass, lpparam.classLoader, rotMethod, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- //Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- //Helpers.log("rotationForOrientationLw: " + param.args[0] + ", " + param.args[1] + " = " + param.getResult());
- if ((int)param.args[0] == -1) {
- int opt = MainModule.mPrefs.getInt("qs_autorotate_state", 0);
- int prevOrient = (int)param.args[1];
- if (opt == 1) {
- if (prevOrient != 0 && prevOrient != 2) prevOrient = 0;
- if ((int)param.getResult() == 1 || (int)param.getResult() == 3) param.setResult(prevOrient);
- } else if (opt == 2) {
- if (prevOrient != 1 && prevOrient != 3) prevOrient = 1;
- if ((int)param.getResult() == 0 || (int)param.getResult() == 2) param.setResult(prevOrient);
- }
- }
- }
- });
- }
-
- public static void StatusBarHeightRes() {
- int opt = MainModule.mPrefs.getInt("system_statusbarheight", 19);
- int heightDpi = opt == 19 ? 27 : opt;
- MainModule.resHooks.setDensityReplacement("*", "dimen", "status_bar_height", heightDpi);
- MainModule.resHooks.setDensityReplacement("*", "dimen", "status_bar_height_portrait", heightDpi);
- MainModule.resHooks.setDensityReplacement("*", "dimen", "status_bar_height_landscape", heightDpi);
- }
-
- private static void applyHeight(Object thisObject) {
- if (thisObject == null) return;
- ViewGroup view = (ViewGroup)thisObject;
- ViewGroup.LayoutParams lp = view.getLayoutParams();
- Resources res = view.getResources();
- lp.height = res.getDimensionPixelSize(res.getIdentifier("status_bar_height", "dimen", "android"));
- view.setLayoutParams(lp);
- }
-
- public static void StatusBarHeightHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.KeyguardStatusBarView", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- applyHeight(param.thisObject);
- }
- });
-
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.PhoneStatusBarView", lpparam.classLoader, "setBar", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- applyHeight(param.thisObject);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.SignalClusterView", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- try {
- ViewGroup mSignalDualNotchGroup = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mSignalDualNotchGroup");
- applyHeight(mSignalDualNotchGroup.findViewById(mSignalDualNotchGroup.getResources().getIdentifier("notch_mobile", "id", lpparam.packageName)));
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- try {
- ViewGroup mSignalSimpleDualMobileContainer = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mSignalSimpleDualMobileContainer");
- applyHeight(mSignalSimpleDualMobileContainer);
- } catch (Throwable ignore) {}
- }
- });
- }
-
- @SuppressWarnings("ConstantConditions")
- public static void HideMemoryCleanHook(LoadPackageParam lpparam, boolean isInLauncher) {
- String raClass = isInLauncher ? "com.miui.home.recents.views.RecentsContainer" : "com.android.systemui.recents.RecentsActivity";
- if (isInLauncher && findClassIfExists(raClass, lpparam.classLoader) == null) return;
- Helpers.findAndHookMethod(raClass, lpparam.classLoader, "setupVisible", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ViewGroup mMemoryAndClearContainer = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mMemoryAndClearContainer");
- if (mMemoryAndClearContainer != null) mMemoryAndClearContainer.setVisibility(View.GONE);
- }
- });
- }
-
- public static void ExtendedPowerMenuHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.server.policy.MiuiGlobalActions", lpparam.classLoader, new MethodHook() {
- @Override
- @SuppressWarnings("ResultOfMethodCallIgnored")
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)param.args[0];
- String powermenuPath = Helpers.getCacheFilePath("extended_power_menu");
- File powermenu = powermenuPath == null ? null : new File(powermenuPath);
- if (powermenu == null) {
- Helpers.log("ExtendedPowerMenuHook", "No writable path found!");
- return;
- }
- if (powermenu.exists()) powermenu.delete();
-
- InputStream inputStream;
- FileOutputStream outputStream;
- byte[] fileBytes;
- Resources resources = Helpers.getModuleRes(mContext);
- inputStream = resources.openRawResource(resources.getIdentifier("extended_power_menu", "raw", Helpers.modulePkg));
- fileBytes = new byte[inputStream.available()];
- inputStream.read(fileBytes);
- outputStream = new FileOutputStream(powermenu);
- outputStream.write(fileBytes);
- outputStream.close();
- inputStream.close();
-
- if (!powermenu.exists()) {
- Helpers.log("ExtendedPowerMenuHook", "MAML file not found in cache");
- return;
- }
-
- Class> ResourceManager = XposedHelpers.findClass("miui.maml.ResourceManager", lpparam.classLoader);
- Class> ZipResourceLoader = XposedHelpers.findClass("miui.maml.util.ZipResourceLoader", lpparam.classLoader);
- Class> ScreenContext = XposedHelpers.findClass("miui.maml.ScreenContext", lpparam.classLoader);
- Class> ScreenElementRoot = XposedHelpers.findClass("miui.maml.ScreenElementRoot", lpparam.classLoader);
-
- XposedHelpers.setObjectField(param.thisObject, "mResourceManager", XposedHelpers.newInstance(ResourceManager, XposedHelpers.newInstance(ZipResourceLoader, powermenu.getPath())));
- Object mResourceManager = XposedHelpers.getObjectField(param.thisObject, "mResourceManager");
- Object mScreenElementRoot = XposedHelpers.newInstance(ScreenElementRoot, XposedHelpers.newInstance(ScreenContext, mContext, mResourceManager));
- XposedHelpers.setObjectField(param.thisObject, "mScreenElementRoot", mScreenElementRoot);
- XposedHelpers.callMethod(mScreenElementRoot, "setOnExternCommandListener", XposedHelpers.getObjectField(param.thisObject, "mCommandListener"));
- XposedHelpers.callMethod(mScreenElementRoot, "setKeepResource", true);
- XposedHelpers.callMethod(mScreenElementRoot, "load");
- XposedHelpers.callMethod(mScreenElementRoot, "init");
- }
- });
- }
-
- public static void ExtendedPowerMenuHook() {
- Helpers.findAndHookMethod("miui.maml.ScreenElementRoot", null, "issueExternCommand", String.class, Double.class, String.class, new MethodHook() {
- @Override
- @SuppressLint("MissingPermission")
- protected void before(MethodHookParam param) throws Throwable {
- String cmd = (String)param.args[0];
- Object scrContext = XposedHelpers.getObjectField(param.thisObject, "mContext");
- Context mContext = (Context)XposedHelpers.getObjectField(scrContext, "mContext");
-// Handler mHandler = (Handler)XposedHelpers.getObjectField(scrContext, "mHandler");
- PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
- Object mService = XposedHelpers.getObjectField(pm, "mService");
- Object mSystemExternCommandListener = XposedHelpers.getObjectField(param.thisObject, "mSystemExternCommandListener");
-
- boolean custom = false;
- if ("recovery".equals(cmd)) {
- XposedHelpers.callMethod(mService, "reboot", false, "recovery", false);
- custom = true;
- } else if ("bootloader".equals(cmd)) {
- XposedHelpers.callMethod(mService, "reboot", false, "bootloader", false);
- custom = true;
- } else if ("softreboot".equals(cmd)) {
- SystemProperties.set("ctl.restart", "surfaceflinger");
- SystemProperties.set("ctl.restart", "zygote");
- custom = true;
- } else if ("killsysui".equals(cmd)) {
- mContext.sendBroadcast(new Intent(ACTION_PREFIX + "RestartSystemUI"));
-// final WallpaperManager wm = (WallpaperManager)mContext.getSystemService(Context.WALLPAPER_SERVICE);
-// Drawable drawable = wm.getDrawable();
-// ActivityManager am = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
-// XposedHelpers.callMethod(am, "forceStopPackage", "com.android.systemui");
-// mHandler.postDelayed(new Runnable() {
-// @Override
-// public void run() {
-// if (drawable != null && drawable.getClass() == BitmapDrawable.class) try {
-// wm.setBitmap(((BitmapDrawable)drawable).getBitmap());
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// }
-// }
-// }, 1000);
- custom = true;
- } else if ("killlauncher".equals(cmd)) {
- ActivityManager am = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_HOME);
- ResolveInfo launcherInfo = mContext.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
- if (launcherInfo != null) {
- String pkgName = launcherInfo.activityInfo.packageName;
- if (pkgName != null) XposedHelpers.callMethod(am, "forceStopPackage", pkgName);
- }
- custom = true;
- }
-
- if (custom) {
- if (mSystemExternCommandListener != null) XposedHelpers.callMethod(mSystemExternCommandListener, "onCommand", param.args[0], param.args[1], param.args[2]);
- param.setResult(null);
- }
- }
- });
- }
-
- public static void HideDismissViewHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "inflateDismissView", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View mDismissView = (View)XposedHelpers.getObjectField(param.thisObject, "mDismissView");
- if (mDismissView != null) mDismissView.setVisibility(View.GONE);
- }
- });
-
- if (!Helpers.findAndHookMethodSilently("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "updateDismissView", boolean.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View mDismissView = (View)XposedHelpers.getObjectField(param.thisObject, "mDismissView");
- if (mDismissView != null) mDismissView.setVisibility(View.GONE);
- }
- })) Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "updateDismissView", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View mDismissView = (View)XposedHelpers.getObjectField(param.thisObject, "mDismissView");
- if (mDismissView != null) mDismissView.setVisibility(View.GONE);
- }
- });
- }
-
- public static void ReplaceShortcutAppHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.HeaderView", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View mShortcut = (View)XposedHelpers.getObjectField(param.thisObject, "mShortcut");
- mShortcut.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- int user = Helpers.getSharedIntPref(v.getContext(), "pref_key_system_shortcut_app_user", 0);
- String pkgAppName = Helpers.getSharedStringPref(v.getContext(), "pref_key_system_shortcut_app", "");
- if (pkgAppName == null || pkgAppName.equals("")) try {
- View.OnClickListener mOnClickListener = (View.OnClickListener)XposedHelpers.getObjectField(param.thisObject, "mOnClickListener");
- if (mOnClickListener != null) mOnClickListener.onClick(v);
- } catch (Throwable t) {
- XposedHelpers.callMethod(param.thisObject, "onClick", v);
- }
-
- String[] pkgAppArray = pkgAppName.split("\\|");
- if (pkgAppArray.length < 2) return;
-
- ComponentName name = new ComponentName(pkgAppArray[0], pkgAppArray[1]);
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- intent.setComponent(name);
-
- Object mActStarter = XposedHelpers.getObjectField(param.thisObject, "mActStarter");
- if (user != 0) try {
- XposedHelpers.callMethod(mActStarter, "collapsePanels");
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- XposedHelpers.callMethod(mContext, "startActivityAsUser", intent, XposedHelpers.newInstance(UserHandle.class, user));
- } catch (Throwable t) {
- XposedBridge.log(t);
- } else {
- XposedHelpers.callMethod(mActStarter, "startActivity", intent, true);
- }
- }
- });
- }
- });
- }
-
- public static void ReplaceClockAppHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.HeaderView", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View mClock = (View)XposedHelpers.getObjectField(param.thisObject, "mClock");
- View mDateView = (View)XposedHelpers.getObjectField(param.thisObject, "mDateView");
- View mView = mClock.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? mDateView : mClock;
- mView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- int user = Helpers.getSharedIntPref(v.getContext(), "pref_key_system_clock_app_user", 0);
- String pkgAppName = Helpers.getSharedStringPref(v.getContext(), "pref_key_system_clock_app", "");
- if (pkgAppName == null || pkgAppName.equals("")) try {
- View.OnClickListener mOnClickListener = (View.OnClickListener)XposedHelpers.getObjectField(param.thisObject, "mOnClickListener");
- if (mOnClickListener != null) mOnClickListener.onClick(v);
- } catch (Throwable t) {
- XposedHelpers.callMethod(param.thisObject, "onClick", v);
- }
-
- String[] pkgAppArray = pkgAppName.split("\\|");
- if (pkgAppArray.length < 2) return;
-
- ComponentName name = new ComponentName(pkgAppArray[0], pkgAppArray[1]);
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- intent.setComponent(name);
-
- Object mActStarter = XposedHelpers.getObjectField(param.thisObject, "mActStarter");
- if (user != 0) try {
- XposedHelpers.callMethod(mActStarter, "collapsePanels");
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- XposedHelpers.callMethod(mContext, "startActivityAsUser", intent, XposedHelpers.newInstance(UserHandle.class, user));
- } catch (Throwable t) {
- XposedBridge.log(t);
- } else {
- XposedHelpers.callMethod(mActStarter, "startActivity", intent, true);
- }
- }
- });
- }
- });
- }
-
- public static void ReplaceCalendarAppHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.HeaderView", lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View mDateView = (View)XposedHelpers.getObjectField(param.thisObject, "mDateView");
- if (mDateView.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) return;
- mDateView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- int user = Helpers.getSharedIntPref(v.getContext(), "pref_key_system_calendar_app_user", 0);
- String pkgAppName = Helpers.getSharedStringPref(v.getContext(), "pref_key_system_calendar_app", "");
- if (pkgAppName == null || pkgAppName.equals("")) try {
- View.OnClickListener mOnClickListener = (View.OnClickListener)XposedHelpers.getObjectField(param.thisObject, "mOnClickListener");
- if (mOnClickListener != null) mOnClickListener.onClick(v);
- } catch (Throwable t) {
- XposedHelpers.callMethod(param.thisObject, "onClick", v);
- }
-
- String[] pkgAppArray = pkgAppName.split("\\|");
- if (pkgAppArray.length < 2) return;
-
- ComponentName name = new ComponentName(pkgAppArray[0], pkgAppArray[1]);
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- intent.setComponent(name);
-
- Object mActStarter = XposedHelpers.getObjectField(param.thisObject, "mActStarter");
- if (user != 0) try {
- XposedHelpers.callMethod(mActStarter, "collapsePanels");
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- XposedHelpers.callMethod(mContext, "startActivityAsUser", intent, XposedHelpers.newInstance(UserHandle.class, user));
- } catch (Throwable t) {
- XposedBridge.log(t);
- } else {
- XposedHelpers.callMethod(mActStarter, "startActivity", intent, true);
- }
- }
- });
- }
- });
- }
-
- private static final int NOCOLOR = 0x01010101;
- private static int actionBarColor = NOCOLOR;
-
- private static boolean isIgnored(Context context) {
- return MainModule.mPrefs.getStringSet("system_statusbarcolor_apps").contains(context.getPackageName());
- }
-
- private static int getActionBarColor(Window window, int oldColor) {
- if (actionBarColor != NOCOLOR) return actionBarColor;
-
- TypedValue outValue = new TypedValue();
- window.getContext().getTheme().resolveAttribute(android.R.attr.actionBarStyle, outValue, true);
- TypedArray abStyle = window.getContext().getTheme().obtainStyledAttributes(outValue.resourceId, new int[] { android.R.attr.background });
- Drawable bg = abStyle.getDrawable(0);
- abStyle.recycle();
-
- if (bg instanceof ColorDrawable)
- return ((ColorDrawable)bg).getColor();
- else
- return oldColor;
- }
-
- @SuppressWarnings("unchecked")
- private static void hookToolbar(Object thisObject, Drawable bg) {
- if (!(bg instanceof ColorDrawable)) return;
- actionBarColor = ((ColorDrawable)bg).getColor();
- Object mDecorToolbar = XposedHelpers.getObjectField(thisObject, "mDecorToolbar");
- ViewGroup mToolbar = (ViewGroup)XposedHelpers.getObjectField(mDecorToolbar, "mToolbar");
- Context mDecorContext = mToolbar.getRootView().getContext();
- if (mDecorContext != null) {
- WeakReference mActivityContext = (WeakReference)XposedHelpers.getObjectField(mDecorContext, "mActivityContext");
- Context mContext = mActivityContext.get();
- if (mContext != null && !isIgnored(mContext))
- ((Activity)mContext).getWindow().setStatusBarColor(actionBarColor);
- }
- }
-
- private static void hookWindowDecor(Object thisObject, Drawable bg) {
- if (!(bg instanceof ColorDrawable)) return;
- actionBarColor = ((ColorDrawable)bg).getColor();
- Activity mActivity = (Activity)XposedHelpers.getObjectField(thisObject, "mActivity");
- if (mActivity != null && !isIgnored(mActivity))
- mActivity.getWindow().setStatusBarColor(actionBarColor);
- }
-
- public static void StatusBarBackgroundHook() {
- Helpers.findAndHookMethod("com.android.internal.policy.PhoneWindow", null, "generateLayout", "com.android.internal.policy.DecorView", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Window wnd = (Window)param.thisObject;
- if (isIgnored(wnd.getContext())) return;
- int mStatusBarColor = XposedHelpers.getIntField(param.thisObject, "mStatusBarColor");
- if (mStatusBarColor == -16777216) return;
- int newColor = getActionBarColor(wnd, mStatusBarColor);
- if (newColor != mStatusBarColor)
- XposedHelpers.callMethod(param.thisObject, "setStatusBarColor", newColor);
- }
- });
-
- Helpers.findAndHookMethod("com.android.internal.policy.PhoneWindow", null, "setStatusBarColor", int.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Window wnd = (Window)param.thisObject;
- if (isIgnored(wnd.getContext())) return;
- if (actionBarColor != NOCOLOR) param.args[0] = actionBarColor;
- else if (Color.alpha((int)param.args[0]) < 255) param.args[0] = Color.TRANSPARENT;
- }
- });
-
- Helpers.findAndHookMethod("com.android.internal.app.ToolbarActionBar", null, "setBackgroundDrawable", Drawable.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- hookToolbar(param.thisObject, (Drawable)param.args[0]);
- }
- });
-
- Helpers.findAndHookMethod("com.android.internal.app.WindowDecorActionBar", null, "setBackgroundDrawable", Drawable.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- hookWindowDecor(param.thisObject, (Drawable)param.args[0]);
- }
- });
- }
-
- public static void StatusBarBackgroundCompatHook(LoadPackageParam lpparam) {
- boolean androidx = false;
-
- // androidx
- Method sbdMethod = null;
- Class> tabCls = findClassIfExists("androidx.appcompat.app.ToolbarActionBar", lpparam.classLoader);
- if (tabCls != null) sbdMethod = findMethodExactIfExists(tabCls, "setBackgroundDrawable", Drawable.class);
- if (sbdMethod != null) androidx = true;
- if (sbdMethod != null)
- Helpers.hookMethod(sbdMethod, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- hookToolbar(param.thisObject, (Drawable)param.args[0]);
- }
- });
-
- sbdMethod = null;
- Class> wdabCls = findClassIfExists("androidx.appcompat.app.WindowDecorActionBar", lpparam.classLoader);
- if (wdabCls != null) sbdMethod = findMethodExactIfExists(wdabCls, "setBackgroundDrawable", Drawable.class);
- if (sbdMethod != null) androidx = true;
- if (sbdMethod != null)
- Helpers.hookMethod(sbdMethod, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- hookWindowDecor(param.thisObject, (Drawable)param.args[0]);
- }
- });
-
- // old appcompat lib
- if (!androidx) {
- sbdMethod = null;
- Class> tabv7Cls = findClassIfExists("android.support.v7.internal.app.ToolbarActionBar", lpparam.classLoader);
- if (tabv7Cls != null) sbdMethod = findMethodExactIfExists(tabv7Cls, "setBackgroundDrawable", Drawable.class);
- if (sbdMethod != null)
- Helpers.hookMethod(sbdMethod, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- hookToolbar(param.thisObject, (Drawable)param.args[0]);
- }
- });
-
- sbdMethod = null;
- Class> wdabv7Cls = findClassIfExists("android.support.v7.internal.app.WindowDecorActionBar", lpparam.classLoader);
- if (wdabv7Cls != null) sbdMethod = findMethodExactIfExists(wdabv7Cls, "setBackgroundDrawable", Drawable.class);
- if (sbdMethod != null)
- Helpers.hookMethod(sbdMethod, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- hookWindowDecor(param.thisObject, (Drawable)param.args[0]);
- }
- });
- }
- }
-
- private static boolean checkToast(Context mContext, String pkgName) {
- try {
- int opt = Integer.parseInt(Helpers.getSharedStringPref(mContext, "pref_key_system_blocktoasts", "1"));
- Set selectedApps = Helpers.getSharedStringSetPref(mContext, "pref_key_system_blocktoasts_apps");
- boolean isSelected = selectedApps != null && selectedApps.contains(pkgName);
- return opt == 2 && !isSelected || opt == 3 && isSelected;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static void SelectiveToastsHook() {
- Helpers.findAndHookMethod("android.widget.Toast", null, "show", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- String pkgName = (String)XposedHelpers.callMethod(mContext, "getOpPackageName");
- if (pkgName == null) return;
- if (checkToast(mContext, pkgName)) param.setResult(null);
- }
- });
- }
-
- @SuppressWarnings("ConstantConditions")
- public static void CustomRecommendedHook(LoadPackageParam lpparam, boolean isInLauncher) {
- String rrvClass = isInLauncher ? "com.miui.home.recents.views.RecentsRecommendView" : "com.android.systemui.recents.views.RecentsRecommendView";
- if (isInLauncher && findClassIfExists(rrvClass, lpparam.classLoader) == null) return;
- Helpers.findAndHookConstructor(rrvClass, lpparam.classLoader, Context.class, AttributeSet.class, int.class, int.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)param.args[0];
- Handler mHandler = new Handler(mContext.getMainLooper());
-
- new Helpers.SharedPrefObserver(mContext, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String key = uri.getPathSegments().get(2);
- if (key.contains("pref_key_system_recommended"))
- XposedHelpers.callMethod(param.thisObject, "onFinishInflate");
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.findAndHookMethod(rrvClass, lpparam.classLoader, "initItem", int.class, int.class, int.class, new MethodHook() {
- @Override
- @SuppressLint("WrongConstant")
- protected void after(MethodHookParam param) throws Throwable {
- LinearLayout view = (LinearLayout)param.thisObject;
- Context context = view.getContext();
- Resources resources = view.getResources();
- Resources modRes = Helpers.getModuleRes(context);
- int itemFirstResId = resources.getIdentifier("first_item", "id", lpparam.packageName);
- int itemSecondResId = resources.getIdentifier("second_item", "id", lpparam.packageName);
- int itemThirdResId = resources.getIdentifier("third_item", "id", lpparam.packageName);
- int itemFourthResId = resources.getIdentifier("fourth_item", "id", lpparam.packageName);
- int itemIconResId = resources.getIdentifier("item_icon", "id", lpparam.packageName);
- int itemTitleResId = resources.getIdentifier("item_title", "id", lpparam.packageName);
-
- int action = 1;
- String title = null;
- if ((int)param.args[0] == itemFirstResId) {
- action = Helpers.getSharedIntPref(context, "pref_key_system_recommended_first_action", 1);
- title = Helpers.getActionName(context, "pref_key_system_recommended_first");
- } else if ((int)param.args[0] == itemSecondResId) {
- action = Helpers.getSharedIntPref(context, "pref_key_system_recommended_second_action", 1);
- title = Helpers.getActionName(context, "pref_key_system_recommended_second");
- } else if ((int)param.args[0] == itemThirdResId) {
- action = Helpers.getSharedIntPref(context, "pref_key_system_recommended_third_action", 1);
- title = Helpers.getActionName(context, "pref_key_system_recommended_third");
- } else if ((int)param.args[0] == itemFourthResId) {
- action = Helpers.getSharedIntPref(context, "pref_key_system_recommended_fourth_action", 1);
- title = Helpers.getActionName(context, "pref_key_system_recommended_fourth");
- }
- if (action <= 1) return;
-
- int icon = R.drawable.recents_icon_custom;
- if (action == 8 || action == 9 || action == 20) icon = R.drawable.recents_icon_launch;
- else if (action == 10) icon = R.drawable.recents_icon_toggle;
-
- View item = view.findViewById((int)param.args[0]);
- ImageView item_icon = item.findViewById(itemIconResId);
- item_icon.setMinimumWidth(item_icon.getDrawable().getIntrinsicWidth());
- item_icon.setMinimumHeight(item_icon.getDrawable().getIntrinsicHeight());
- item_icon.setImageDrawable(modRes.getDrawable(icon, view.getContext().getTheme()));
- TextView item_title = item.findViewById(itemTitleResId);
- item_title.setText(title == null ? "-" : title);
- if (((String)item_title.getText()).contains(" ")) {
- item_title.setSingleLine(false);
- item_title.setMaxLines(2);
- } else {
- item_title.setMaxLines(1);
- item_title.setSingleLine(true);
- }
- item_title.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY);
- item_title.setEllipsize(TextUtils.TruncateAt.END);
- }
- });
-
- Helpers.findAndHookMethod(rrvClass, lpparam.classLoader, "onClick", View.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- View view = ((View)param.args[0]);
- if (view == null) return;
-
- Context context = view.getContext();
- Resources resources = view.getResources();
- int itemFirstResId = resources.getIdentifier("first_item", "id", lpparam.packageName);
- int itemSecondResId = resources.getIdentifier("second_item", "id", lpparam.packageName);
- int itemThirdResId = resources.getIdentifier("third_item", "id", lpparam.packageName);
- int itemFourthResId = resources.getIdentifier("fourth_item", "id", lpparam.packageName);
-
- String key = null;
- if (view.getId() == itemFirstResId)
- key = "pref_key_system_recommended_first";
- else if (view.getId() == itemSecondResId)
- key = "pref_key_system_recommended_second";
- else if (view.getId() == itemThirdResId)
- key = "pref_key_system_recommended_third";
- else if (view.getId() == itemFourthResId)
- key = "pref_key_system_recommended_fourth";
-
- int action = Helpers.getSharedIntPref(context, key + "_action", 1);
- if (action <= 1) return;
-
- // Close recents after app/shortcut launch
- if (action == 8 || action == 9 || action == 20) {
- GlobalActions.IntentType intentType = GlobalActions.IntentType.APP;
- if (action == 9)
- intentType = GlobalActions.IntentType.SHORTCUT;
- else if (action == 20)
- intentType = GlobalActions.IntentType.ACTIVITY;
- Intent intent = GlobalActions.getIntent(context, key, intentType, false);
- if (intent != null) {
- param.setResult(null);
- TaskStackBuilder.create(context.getApplicationContext()).addNextIntentWithParentStack(intent).startActivities();
- return;
- }
- }
-
- // Do not close after other actions
- if (GlobalActions.handleAction(context, key)) param.setResult(null);
- }
- });
- }
-
- public static void UnblockThirdLaunchersHook(LoadPackageParam lpparam) {
- String thirdCls = Helpers.is11() ? "com.miui.securitycenter.provider.ThirdMonitorProvider" : "com.miui.securitycenter.provider.ThirdDesktopProvider";
- Helpers.hookAllMethods(thirdCls, lpparam.classLoader, "call", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Bundle bundle = new Bundle();
- bundle.putInt("mode", 1);
- bundle.putStringArrayList("list", new ArrayList());
- param.setResult(bundle);
- }
- });
- }
-
- public static void CleanShareMenuHook() {
- Helpers.hookAllMethods("miui.securityspace.XSpaceResolverActivityHelper.ResolverActivityRunner", null, "run", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Intent mOriginalIntent = (Intent)XposedHelpers.getObjectField(param.thisObject, "mOriginalIntent");
- if (mOriginalIntent == null) return;
- String action = mOriginalIntent.getAction();
- if (action == null) return;
- if (!action.equals(Intent.ACTION_SEND) && !action.equals(Intent.ACTION_SENDTO) && !action.equals(Intent.ACTION_SEND_MULTIPLE)) return;
- if (mOriginalIntent.getDataString() != null && mOriginalIntent.getDataString().contains(":")) return;
-
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- String mAimPackageName = (String)XposedHelpers.getObjectField(param.thisObject, "mAimPackageName");
- if (mContext == null || mAimPackageName == null) return;
- Set selectedApps = Helpers.getSharedStringSetPref(mContext, "pref_key_system_cleanshare_apps");
- View mRootView = (View)XposedHelpers.getObjectField(param.thisObject, "mRootView");
- int appResId1 = mContext.getResources().getIdentifier("app1", "id", "android.miui");
- int appResId2 = mContext.getResources().getIdentifier("app2", "id", "android.miui");
- boolean removeOriginal = selectedApps.contains(mAimPackageName) || selectedApps.contains(mAimPackageName + "|0");
- boolean removeDual = selectedApps.contains(mAimPackageName + "|999");
- View originalApp = mRootView.findViewById(appResId1);
- View dualApp = mRootView.findViewById(appResId2);
- if (removeOriginal)dualApp.performClick();
- else if (removeDual) originalApp.performClick();
- }
- });
- }
-
- public static void CleanShareMenuServiceHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.pm.PackageManagerService", lpparam.classLoader, "systemReady", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- new Helpers.SharedPrefObserver(mContext, mHandler, "pref_key_system_cleanshare_apps") {
- @Override
- public void onChange(String name) {
- MainModule.mPrefs.put(name, Helpers.getSharedStringSetPref(mContext, name));
- }
- };
- }
- });
-
- MethodHook hook = new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void after(MethodHookParam param) throws Throwable {
- try {
- if (param.args[0] == null) return;
- Intent origIntent = (Intent)param.args[0];
- Intent intent = (Intent)origIntent.clone();
- String action = intent.getAction();
- if (action == null) return;
- if (!action.equals(Intent.ACTION_SEND) && !action.equals(Intent.ACTION_SENDTO) && !action.equals(Intent.ACTION_SEND_MULTIPLE)) return;
- if (intent.getDataString() != null && intent.getDataString().contains(":")) return;
- if (intent.hasExtra("CustoMIUIzer") && intent.getBooleanExtra("CustoMIUIzer", false)) return;
- Set selectedApps = MainModule.mPrefs.getStringSet("system_cleanshare_apps");
- List resolved = (List)param.getResult();
- ResolveInfo resolveInfo;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- PackageManager pm = mContext.getPackageManager();
- Iterator itr = resolved.iterator();
- while (itr.hasNext()) {
- resolveInfo = itr.next();
- boolean removeOriginal = selectedApps.contains(resolveInfo.activityInfo.packageName) || selectedApps.contains(resolveInfo.activityInfo.packageName + "|0");
- boolean removeDual = selectedApps.contains(resolveInfo.activityInfo.packageName + "|999");
- boolean hasDual = false;
- try {
- hasDual = XposedHelpers.callMethod(pm, "getPackageInfoAsUser", resolveInfo.activityInfo.packageName, 0, 999) != null;
- } catch (Throwable ignore) {}
- if ((removeOriginal && !hasDual) || removeOriginal && hasDual && removeDual) itr.remove();
- }
- param.setResult(resolved);
- } catch (Throwable t) {
- if (!(t instanceof BadParcelableException)) XposedBridge.log(t);
- }
- }
- };
-
- if (!Helpers.findAndHookMethodSilently("com.android.server.pm.PackageManagerService", lpparam.classLoader, "queryIntentActivitiesInternal", Intent.class, String.class, int.class, int.class, int.class, boolean.class, boolean.class, hook))
- Helpers.findAndHookMethod("com.android.server.pm.PackageManagerService", lpparam.classLoader, "queryIntentActivitiesInternal", Intent.class, String.class, int.class, int.class, hook);
- }
-
- private static boolean hideMimeType(int mimeFlags, String mimeType) {
- int dataType = MimeType.OTHERS;
- if (mimeType != null)
- if (mimeType.startsWith("image/")) dataType = MimeType.IMAGE;
- else if (mimeType.startsWith("audio/")) dataType = MimeType.AUDIO;
- else if (mimeType.startsWith("video/")) dataType = MimeType.VIDEO;
- else if (mimeType.startsWith("text/") ||
- mimeType.startsWith("application/pdf") ||
- mimeType.startsWith("application/msword") ||
- mimeType.startsWith("application/vnd.ms-") ||
- mimeType.startsWith("application/vnd.openxmlformats-")) dataType = MimeType.DOCUMENT;
- else if (mimeType.startsWith("application/vnd.android.package-archive") ||
- mimeType.startsWith("application/zip") ||
- mimeType.startsWith("application/x-zip") ||
- mimeType.startsWith("application/octet-stream") ||
- mimeType.startsWith("application/rar") ||
- mimeType.startsWith("application/x-rar") ||
- mimeType.startsWith("application/x-tar") ||
- mimeType.startsWith("application/x-bzip") ||
- mimeType.startsWith("application/gzip") ||
- mimeType.startsWith("application/x-lz") ||
- mimeType.startsWith("application/x-compress") ||
- mimeType.startsWith("application/x-7z") ||
- mimeType.startsWith("application/java-archive")) dataType = MimeType.ARCHIVE;
- else if (mimeType.startsWith("link/")) dataType = MimeType.LINK;
- return (mimeFlags & dataType) == dataType;
- }
-
- private static String getContentType(Context context, Intent intent) {
- String scheme = intent.getScheme();
- boolean linkSchemes = "http".equals(scheme) || "https".equals(scheme) || "vnd.youtube".equals(scheme);
- String mimeType = intent.getType();
- if (mimeType == null && linkSchemes) mimeType = "link/*";
- if (mimeType == null && intent.getData() != null) try {
- mimeType = context.getContentResolver().getType(intent.getData());
- } catch (Throwable ignore) {}
- return mimeType;
- }
-
- private static Pair isRemoveApp(boolean dynamic, Context context, String pkgName, Set selectedApps, String mimeType) {
- String key = "system_cleanopenwith_apps";
- int mimeFlags0;
- int mimeFlags999;
- if (dynamic) {
- mimeFlags0 = Helpers.getSharedIntPref(context, "pref_key_" + key + "_" + pkgName + "|0", MimeType.ALL);
- mimeFlags999 = Helpers.getSharedIntPref(context, "pref_key_" + key + "_" + pkgName + "|999", MimeType.ALL);
- } else {
- mimeFlags0 = MainModule.mPrefs.getInt(key + "_" + pkgName + "|0", MimeType.ALL);
- mimeFlags999 = MainModule.mPrefs.getInt(key + "_" + pkgName + "|999", MimeType.ALL);
- }
- boolean removeOriginal = (selectedApps.contains(pkgName) || selectedApps.contains(pkgName + "|0")) && hideMimeType(mimeFlags0, mimeType);
- boolean removeDual = selectedApps.contains(pkgName + "|999") && hideMimeType(mimeFlags999, mimeType);
- return new Pair(removeOriginal, removeDual);
- }
-
- public static void CleanOpenWithMenuHook() {
- Helpers.hookAllMethods("miui.securityspace.XSpaceResolverActivityHelper.ResolverActivityRunner", null, "run", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Intent mOriginalIntent = (Intent)XposedHelpers.getObjectField(param.thisObject, "mOriginalIntent");
- if (mOriginalIntent == null) return;
- String action = mOriginalIntent.getAction();
- if (!Intent.ACTION_VIEW.equals(action)) return;
- //if (mOriginalIntent.getDataString() != null && mOriginalIntent.getDataString().contains(":")) return;
-
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- String mAimPackageName = (String)XposedHelpers.getObjectField(param.thisObject, "mAimPackageName");
- if (mContext == null || mAimPackageName == null) return;
- Set selectedApps = Helpers.getSharedStringSetPref(mContext, "pref_key_system_cleanopenwith_apps");
- String mimeType = getContentType(mContext, mOriginalIntent);
- Pair isRemove = isRemoveApp(true, mContext, mAimPackageName, selectedApps, mimeType);
-
- View mRootView = (View)XposedHelpers.getObjectField(param.thisObject, "mRootView");
- int appResId1 = mContext.getResources().getIdentifier("app1", "id", "android.miui");
- int appResId2 = mContext.getResources().getIdentifier("app2", "id", "android.miui");
- View originalApp = mRootView.findViewById(appResId1);
- View dualApp = mRootView.findViewById(appResId2);
- if (isRemove.first) dualApp.performClick();
- else if (isRemove.second) originalApp.performClick();
- }
- });
- }
-
- public static void CleanOpenWithMenuServiceHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.pm.PackageManagerService", lpparam.classLoader, "systemReady", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- new Helpers.SharedPrefObserver(mContext, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String type = uri.getPathSegments().get(1);
- String key = uri.getPathSegments().get(2);
- if (!key.contains("pref_key_system_cleanopenwith_apps")) return;
-
- switch (type) {
- case "stringset":
- MainModule.mPrefs.put(key, Helpers.getSharedStringSetPref(mContext, key));
- break;
- case "integer":
- MainModule.mPrefs.put(key, Helpers.getSharedIntPref(mContext, key, 0));
- break;
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- MethodHook hook = new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void after(MethodHookParam param) throws Throwable {
- try {
- if (param.args[0] == null) return;
- Intent origIntent = (Intent)param.args[0];
- Intent intent = (Intent)origIntent.clone();
- String action = intent.getAction();
- //XposedBridge.log(action + ": " + intent.getType() + " | " + intent.getDataString());
- if (!Intent.ACTION_VIEW.equals(action)) return;
- if (intent.hasExtra("CustoMIUIzer") && intent.getBooleanExtra("CustoMIUIzer", false)) return;
- String scheme = intent.getScheme();
- boolean validSchemes = "http".equals(scheme) || "https".equals(scheme) || "vnd.youtube".equals(scheme);
- if (intent.getType() == null && !validSchemes) return;
-
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- String mimeType = getContentType(mContext, intent);
- //XposedBridge.log("mimeType: " + mimeType);
-
- String key = "system_cleanopenwith_apps";
- Set selectedApps = MainModule.mPrefs.getStringSet(key);
- List resolved = (List)param.getResult();
- ResolveInfo resolveInfo;
- PackageManager pm = mContext.getPackageManager();
- Iterator itr = resolved.iterator();
- while (itr.hasNext()) {
- resolveInfo = itr.next();
- Pair isRemove = isRemoveApp(false, mContext, resolveInfo.activityInfo.packageName, selectedApps, mimeType);
- boolean hasDual = false;
- try {
- hasDual = XposedHelpers.callMethod(pm, "getPackageInfoAsUser", resolveInfo.activityInfo.packageName, 0, 999) != null;
- } catch (Throwable ignore) {}
- if ((isRemove.first && !hasDual) || isRemove.first && hasDual && isRemove.second) itr.remove();
- }
-
- param.setResult(resolved);
- } catch (Throwable t) {
- if (!(t instanceof BadParcelableException)) XposedBridge.log(t);
- }
- }
- };
-
- if (!Helpers.findAndHookMethodSilently("com.android.server.pm.PackageManagerService", lpparam.classLoader, "queryIntentActivitiesInternal", Intent.class, String.class, int.class, int.class, int.class, boolean.class, boolean.class, hook))
- Helpers.findAndHookMethod("com.android.server.pm.PackageManagerService", lpparam.classLoader, "queryIntentActivitiesInternal", Intent.class, String.class, int.class, int.class, hook);
- }
-
- public static void VolumeTimerValuesRes() {
- MainModule.resHooks.setResReplacement("com.android.systemui", "array", "miui_volume_timer_segments", R.array.miui_volume_timer_segments);
- MainModule.resHooks.setResReplacement("com.android.systemui", "array", "miui_volume_timer_segments_title", R.array.miui_volume_timer_segments_title);
- }
-
- public static void AppLockHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.miui.server.SecurityManagerService", lpparam.classLoader, "removeAccessControlPassLocked", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if (!"*".equals(param.args[1])) return;
- int mode = (int)XposedHelpers.callMethod(param.thisObject, "getAccessControlLockMode", param.args[0]);
- if (mode != 1) param.setResult(null);
- }
- });
- }
-
- @SuppressWarnings("unchecked")
- private static void saveLastCheck(Object thisObject, String pkgName, int userId) {
- boolean enabled = false;
- if (pkgName != null && !"com.miui.home".equals(pkgName)) enabled = (boolean)XposedHelpers.callMethod(thisObject, "getApplicationAccessControlEnabledAsUser", pkgName, userId);
- Object userState = XposedHelpers.callMethod(thisObject, "getUserStateLocked", userId);
- XposedHelpers.setAdditionalInstanceField(userState, "mAccessControlLastCheckSaved",
- enabled ? new ArrayMap((ArrayMap)XposedHelpers.getObjectField(userState, "mAccessControlLastCheck")) : null
- );
- }
-
- @SuppressWarnings({"unchecked"})
- private static void checkLastCheck(Object thisObject, int userId) {
- Object userState = XposedHelpers.callMethod(thisObject, "getUserStateLocked", userId);
- ArrayMap mAccessControlLastCheckSaved = (ArrayMap)XposedHelpers.getAdditionalInstanceField(userState, "mAccessControlLastCheckSaved");
- if (mAccessControlLastCheckSaved == null) return;
- ArrayMap mAccessControlLastCheck = (ArrayMap)XposedHelpers.getObjectField(userState, "mAccessControlLastCheck");
- if (mAccessControlLastCheck.size() == 0) return;
- long timeout = MainModule.mPrefs.getInt("system_applock_timeout", 1) * 60L * 1000L;
- for (Map.Entry pair: mAccessControlLastCheck.entrySet()) {
- String pkg = pair.getKey();
- Long time = pair.getValue();
- if (mAccessControlLastCheckSaved.containsKey(pkg)) {
- Long oldTime = mAccessControlLastCheckSaved.get(pkg);
- if (!time.equals(oldTime)) {
- mAccessControlLastCheck.put(pkg, time + (timeout - 60000L));
- XposedHelpers.setObjectField(userState, "mAccessControlLastCheck", mAccessControlLastCheck);
- }
- } else {
- mAccessControlLastCheck.put(pkg, time + (timeout - 60000L));
- XposedHelpers.setObjectField(userState, "mAccessControlLastCheck", mAccessControlLastCheck);
- }
- }
- }
-
- public static void AppLockTimeoutHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.server.SecurityManagerService", lpparam.classLoader, "addAccessControlPassForUser", String.class, int.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- saveLastCheck(param.thisObject, (String)param.args[0], (int)param.args[1]);
- }
-
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- checkLastCheck(param.thisObject, (int)param.args[1]);
- }
- });
-
- Helpers.findAndHookMethod("com.miui.server.SecurityManagerService", lpparam.classLoader, "checkAccessControlPassLocked", String.class, Intent.class, int.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- saveLastCheck(param.thisObject, (String)param.args[0], (int)param.args[2]);
- }
-
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- checkLastCheck(param.thisObject, (int)param.args[2]);
- }
- });
-
- Helpers.findAndHookMethod("com.miui.server.SecurityManagerService", lpparam.classLoader, "activityResume", Intent.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Intent intent = (Intent)param.args[0];
- if (intent.getComponent() != null)
- saveLastCheck(param.thisObject, intent.getComponent().getPackageName(), 0);
- }
-
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Intent intent = (Intent)param.args[0];
- if (intent.getComponent() != null)
- checkLastCheck(param.thisObject, 0);
- }
- });
- }
-
- private static AudioVisualizer audioViz = null;
- private static boolean isKeyguardShowing = false;
- private static boolean isNotificationPanelExpanded = false;
- private static MediaController mMediaController = null;
- private static void updateAudioVisualizerState(Context context) {
- if (audioViz == null || context == null) return;
- AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
- boolean isMusicPlaying = am != null && am.isMusicActive();
- boolean isPlaying = false;
- if (mMediaController == null || mMediaController.getPlaybackState() == null || mMediaController.getPlaybackState().getState() != PlaybackState.STATE_PLAYING) {
- if (!audioViz.showWithControllerOnly) isPlaying = isMusicPlaying;
- } else {
- isPlaying = isMusicPlaying && mMediaController.getPlaybackState().getState() == PlaybackState.STATE_PLAYING;
- }
- audioViz.updateViewState(isPlaying, isKeyguardShowing, isNotificationPanelExpanded);
- }
- public static void AudioVisualizerHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "makeStatusBarView", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- ViewGroup mNotificationPanel = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mNotificationPanel");
- if (mNotificationPanel == null) {
- Helpers.log("AudioVisualizerHook", "Cannot find mNotificationPanel");
- return;
- }
-
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- ViewGroup visFrame = new FrameLayout(mContext);
- visFrame.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
- audioViz = new AudioVisualizer(mContext);
- audioViz.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, Gravity.BOTTOM));
- audioViz.setClickable(false);
- visFrame.addView(audioViz);
- visFrame.setClickable(false);
- View wallpaper = mNotificationPanel.findViewById(mContext.getResources().getIdentifier("wallpaper", "id", lpparam.packageName));
- View themebkg = mNotificationPanel.findViewById(mContext.getResources().getIdentifier("theme_background", "id", lpparam.packageName));
- View awesome = mNotificationPanel.findViewById(mContext.getResources().getIdentifier("awesome_lock_screen_container", "id", lpparam.packageName));
-
- int order = 0;
- if (awesome != null) order = Math.max(order, mNotificationPanel.indexOfChild(awesome));
- if (themebkg != null) order = Math.max(order, mNotificationPanel.indexOfChild(themebkg));
- if (wallpaper != null) order = Math.max(order, mNotificationPanel.indexOfChild(wallpaper));
- mNotificationPanel.addView(visFrame, order + 1);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "onScreenTurnedOff", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if (audioViz != null) audioViz.updateScreenOn(false);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "updateKeyguardState", boolean.class, boolean.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Object mStatusBarKeyguardViewManager = XposedHelpers.getObjectField(param.thisObject, "mStatusBarKeyguardViewManager");
- boolean isKeyguardShowingNew = (boolean)XposedHelpers.callMethod(mStatusBarKeyguardViewManager, "isShowing");
- if (isKeyguardShowing != isKeyguardShowingNew) {
- isKeyguardShowing = isKeyguardShowingNew;
- isNotificationPanelExpanded = false;
- updateAudioVisualizerState((Context)XposedHelpers.getObjectField(param.thisObject, "mContext"));
- }
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "onExpandingFinished", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- boolean isNotificationPanelExpandedNew = XposedHelpers.getBooleanField(param.thisObject, "mPanelExpanded");
- if (isNotificationPanelExpanded != isNotificationPanelExpandedNew) {
- isNotificationPanelExpanded = isNotificationPanelExpandedNew;
- updateAudioVisualizerState((Context)XposedHelpers.getObjectField(param.thisObject, "mContext"));
- }
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "updateMediaMetaData", boolean.class, boolean.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- if (audioViz == null) return;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- PowerManager powerMgr = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
- boolean isScreenOn = powerMgr.isInteractive();
- if (!isScreenOn) {
- audioViz.updateScreenOn(false);
- return;
- } else audioViz.isScreenOn = true;
-
- MediaMetadata mMediaMetadata = (MediaMetadata)XposedHelpers.getObjectField(param.thisObject, "mMediaMetadata");
- Bitmap art = null;
- if (mMediaMetadata != null) {
- art = mMediaMetadata.getBitmap(MediaMetadata.METADATA_KEY_ART);
- if (art == null) art = mMediaMetadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART);
- if (art == null) art = mMediaMetadata.getBitmap(MediaMetadata.METADATA_KEY_DISPLAY_ICON);
- }
- if (art == null) {
- WallpaperManager wallpaperMgr = WallpaperManager.getInstance(mContext);
- Drawable wallpaperDrawable = wallpaperMgr.getDrawable();
- if (wallpaperDrawable instanceof BitmapDrawable)
- art = ((BitmapDrawable)wallpaperDrawable).getBitmap();
- }
-
- mMediaController = (MediaController)XposedHelpers.getObjectField(param.thisObject, "mMediaController");
- updateAudioVisualizerState(mContext);
- audioViz.updateMusicArt(art);
- }
- });
- }
-
- private static String audioFocusPkg = null;
-
- @SuppressWarnings("unchecked")
- private static void removeListener(Object thisObject) {
- ArrayList mRecords = (ArrayList)XposedHelpers.getObjectField(thisObject, "mRecords");
- if (mRecords == null) return;
- for (Object record: mRecords) {
- String callingPackage = (String)XposedHelpers.getObjectField(record, "callingPackage");
- int events = XposedHelpers.getIntField(record, "events");
- if ((events & PhoneStateListener.LISTEN_CALL_STATE) == PhoneStateListener.LISTEN_CALL_STATE &&
- callingPackage != null && MainModule.mPrefs.getStringSet("system_ignorecalls_apps").contains(callingPackage)) {
- events &= ~PhoneStateListener.LISTEN_CALL_STATE;
- XposedHelpers.setIntField(record, "events", events);
- }
- }
- }
-
- public static void NoCallInterruptionHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.audio.AudioService", lpparam.classLoader, "requestAudioFocus", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if ("AudioFocus_For_Phone_Ring_And_Calls".equals(param.args[4]) && audioFocusPkg != null && MainModule.mPrefs.getStringSet("system_ignorecalls_apps").contains(audioFocusPkg))
- param.setResult(1);
- }
-
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- int res = (int)param.getResult();
- if (res != AudioManager.AUDIOFOCUS_REQUEST_FAILED && !"AudioFocus_For_Phone_Ring_And_Calls".equals(param.args[4]))
- audioFocusPkg = (String)param.args[5];
- }
- });
-
- Helpers.findAndHookMethod("com.android.server.TelephonyRegistry", lpparam.classLoader, "notifyCallState", int.class, String.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- removeListener(param.thisObject);
- }
- });
-
- Helpers.findAndHookMethod("com.android.server.TelephonyRegistry", lpparam.classLoader, "notifyCallStateForPhoneId", int.class, int.class, int.class, String.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- removeListener(param.thisObject);
- }
- });
- }
-
- public static void AllRotationsRes() {
- MainModule.resHooks.setObjectReplacement("android", "bool", "config_allowAllRotations", MainModule.mPrefs.getStringAsInt("system_allrotations2", 1) == 2);
- }
-
- public static void AllRotationsHook(LoadPackageParam lpparam) {
- if (Helpers.isQPlus())
- Helpers.hookAllConstructors("com.android.server.wm.DisplayRotation", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- XposedHelpers.setIntField(param.thisObject, "mAllowAllRotations", MainModule.mPrefs.getStringAsInt("system_allrotations2", 1) == 2 ? 1 : 0);
- }
- });
- else
- Helpers.hookAllMethods("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "init", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- XposedHelpers.setIntField(param.thisObject, "mAllowAllRotations", MainModule.mPrefs.getStringAsInt("system_allrotations2", 1) == 2 ? 1 : 0);
- }
- });
- }
-
- private static boolean mUSBConnected = false;
- public static void USBConfigHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.power.PowerManagerService", lpparam.classLoader, "systemReady", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (mContext != null)
- mContext.registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- try {
- boolean mConnected = intent.getBooleanExtra("connected", false);
- if (mConnected && mConnected != mUSBConnected) try {
- int mPlugType = XposedHelpers.getIntField(param.thisObject, "mPlugType");
- if (mPlugType != BatteryManager.BATTERY_PLUGGED_USB) return;
- String func = MainModule.mPrefs.getString("system_defaultusb", "none");
- if ("none".equals(func) || "1".equals(func)) return;
- UsbManager usbMgr = (UsbManager)mContext.getSystemService(Context.USB_SERVICE);
- if ((boolean)XposedHelpers.callMethod(usbMgr, "isFunctionEnabled", func))
- return;
- XposedHelpers.callMethod(usbMgr, "setCurrentFunction", func, MainModule.mPrefs.getBoolean("system_defaultusb_unsecure"));
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- mUSBConnected = mConnected;
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- }, new IntentFilter("android.hardware.usb.action.USB_STATE"));
- }
- });
-
- if (!Helpers.isNougat() && MainModule.mPrefs.getBoolean("system_defaultusb_unsecure")) {
- if (!Helpers.findAndHookMethodSilently("com.android.server.usb.UsbDeviceManager$UsbHandler", lpparam.classLoader, "isUsbDataTransferActive", long.class, XC_MethodReplacement.returnConstant(true)))
- Helpers.findAndHookMethod("com.android.server.usb.UsbDeviceManager$UsbHandler", lpparam.classLoader, "isUsbDataTransferActive", XC_MethodReplacement.returnConstant(true));
- Helpers.findAndHookMethod("com.android.server.usb.UsbDeviceManager$UsbHandler", lpparam.classLoader, "handleMessage", Message.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Message msg = (Message)param.args[0];
- int setUnlockedFunc = 12;
- try {
- setUnlockedFunc = XposedHelpers.getStaticIntField(findClass("com.android.server.usb.UsbDeviceManager", lpparam.classLoader), "MSG_SET_SCREEN_UNLOCKED_FUNCTIONS");
- } catch (Throwable t) {
- }
- if (msg.what == setUnlockedFunc) {
- msg.obj = 0L;
- param.args[0] = msg;
- }
- }
- });
- }
- }
-
- public static void USBConfigSettingsHook(LoadPackageParam lpparam) {
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.android.settings.connecteddevice.usb.UsbModeChooserReceiver", lpparam.classLoader, "onReceive", Context.class, Intent.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- String func = MainModule.mPrefs.getString("system_defaultusb", "none");
- if (!"none".equals(func) && !"1".equals(func)) param.setResult(null);
- }
- });
- }
-
- public static void HideIconsBattery1Hook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.BatteryMeterView", lpparam.classLoader, "update", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ImageView mBatteryIconView = (ImageView)XposedHelpers.getObjectField(param.thisObject, "mBatteryIconView");
- mBatteryIconView.setVisibility(View.GONE);
- }
- });
- }
-
- public static void HideIconsBattery2Hook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.BatteryMeterView", lpparam.classLoader, "update", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- TextView mBatteryTextDigitView = (TextView)XposedHelpers.getObjectField(param.thisObject, "mBatteryTextDigitView");
- mBatteryTextDigitView.setVisibility(View.GONE);
- }
- });
- }
-
- public static void HideIconsBattery3Hook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.BatteryMeterView", lpparam.classLoader, "updateChargingIconView", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ImageView mBatteryChargingView = (ImageView)XposedHelpers.getObjectField(param.thisObject, "mBatteryChargingView");
- mBatteryChargingView.setVisibility(View.GONE);
- try {
- ImageView mBatteryChargingInView = (ImageView)XposedHelpers.getObjectField(param.thisObject, "mBatteryChargingInView");
- mBatteryChargingInView.setVisibility(View.GONE);
- } catch (Throwable ignore) {}
- }
- });
- }
-
- private static boolean lastState = false;
- private static void updateAlarmVisibility(Object thisObject, boolean state) {
- try {
- Object mIconController = XposedHelpers.getObjectField(thisObject, "mIconController");
- if (!state) {
- XposedHelpers.callMethod(mIconController, "setIconVisibility", "alarm_clock", false);
- return;
- }
-
- Context mContext = (Context)XposedHelpers.getObjectField(thisObject, "mContext");
- long nowTime = java.lang.System.currentTimeMillis();
- long nextTime;
- try {
- nextTime = (long)XposedHelpers.getAdditionalInstanceField(thisObject, "mNextAlarmTime");
- } catch (Throwable t) {
- nextTime = Helpers.getNextMIUIAlarmTime(mContext);
- }
- if (nextTime == 0) nextTime = Helpers.getNextStockAlarmTime(mContext);
-
- long diffMSec = nextTime - nowTime;
- if (diffMSec < 0) diffMSec += 7 * 24 * 60 *60 * 1000;
- float diffHours = (diffMSec - 59 * 1000) / (1000f * 60f * 60f);
-
- XposedHelpers.callMethod(mIconController, "setIconVisibility", "alarm_clock", diffHours <= MainModule.mPrefs.getInt("system_statusbaricons_alarmn", 0));
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
-
- public static void HideIconsSelectiveAlarmHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.systemui.statusbar.phone.PhoneStatusBarPolicy", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mNextAlarmTime", Helpers.getNextMIUIAlarmTime(mContext));
- ContentResolver resolver = mContext.getContentResolver();
- ContentObserver alarmObserver = new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange) {
- if (selfChange) return;
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mNextAlarmTime", Helpers.getNextMIUIAlarmTime(mContext));
- updateAlarmVisibility(param.thisObject, lastState);
- }
- };
- resolver.registerContentObserver(Settings.System.getUriFor("next_alarm_clock_formatted"), false, alarmObserver);
-
- IntentFilter filter = new IntentFilter();
- filter.addAction("android.intent.action.TIME_TICK");
- filter.addAction("android.intent.action.TIME_SET");
- filter.addAction("android.intent.action.TIMEZONE_CHANGED");
- filter.addAction("android.intent.action.LOCALE_CHANGED");
- final Object thisObject = param.thisObject;
- mContext.registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- updateAlarmVisibility(thisObject, lastState);
- }
- }, filter);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.PhoneStatusBarPolicy", lpparam.classLoader, "updateAlarm", boolean.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- lastState = (boolean)param.args[0];
- updateAlarmVisibility(param.thisObject, lastState);
- }
- });
- }
-
- public static void HideIconsBluetoothHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.PhoneStatusBarPolicy", lpparam.classLoader, "updateBluetooth", String.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- int opt = Integer.parseInt(MainModule.mPrefs.getString("system_statusbaricons_bluetooth", "1"));
- boolean isBluetoothConnected = (boolean)XposedHelpers.callMethod(XposedHelpers.getObjectField(param.thisObject, "mBluetooth"), "isBluetoothConnected");
- if (opt == 3 || (opt == 2 && !isBluetoothConnected)) {
- Object mIconController = XposedHelpers.getObjectField(param.thisObject, "mIconController");
- XposedHelpers.callMethod(mIconController, "setIconVisibility", "bluetooth", false);
- }
- }
- });
- }
-
- public static void HideIconsSignalHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.SignalClusterView", lpparam.classLoader, "apply", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View[] mMobileSignalGroup = (View[])XposedHelpers.getObjectField(param.thisObject, "mMobileSignalGroup");
- for (View mMobileSignal: mMobileSignalGroup) if (mMobileSignal != null) mMobileSignal.setVisibility(View.GONE);
- }
- });
- }
-
- public static void HideIconsVPNHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.SignalClusterView", lpparam.classLoader, "apply", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View mVpn = (View)XposedHelpers.getObjectField(param.thisObject, "mVpn");
- if (mVpn != null) mVpn.setVisibility(View.GONE);
- }
- });
- }
-
- public static void HideIconsNoSIMsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.SignalClusterView", lpparam.classLoader, "apply", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- try {
- View mNoSimsCombo = (View)XposedHelpers.getObjectField(param.thisObject, "mNoSimsCombo");
- if (mNoSimsCombo != null) mNoSimsCombo.setVisibility(View.GONE);
- } catch (Throwable t) {
- View mNoSims = (View)XposedHelpers.getObjectField(param.thisObject, "mNoSims");
- if (mNoSims != null) mNoSims.setVisibility(View.GONE);
- }
- }
- });
- }
-
- public static void HideIconsNoWiFiHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.SignalClusterView", lpparam.classLoader, "apply", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View mWifiGroup = (View)XposedHelpers.getObjectField(param.thisObject, "mWifiGroup");
- if (mWifiGroup != null) mWifiGroup.setVisibility(View.GONE);
- }
- });
- }
-
- public static void HideIconsVoWiFiHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.SignalClusterView", lpparam.classLoader, "apply", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View[] mVowifi = (View[])XposedHelpers.getObjectField(param.thisObject, "mVowifi");
- if (mVowifi == null) return;
- if (mVowifi[0] != null) mVowifi[0].setVisibility(View.GONE);
- if (mVowifi[1] != null) mVowifi[1].setVisibility(View.GONE);
- }
- });
- }
-
- public static void HideIconsHotspotHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.SignalClusterView", lpparam.classLoader, "onHotspotChanged", boolean.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View mWifiAp = (View)XposedHelpers.getObjectField(param.thisObject, "mWifiAp");
- if (mWifiAp != null) mWifiAp.setVisibility(View.GONE);
- }
- });
- }
-
- private static boolean checkSlot(String slotName) {
- try {
- return "headset".equals(slotName) && MainModule.mPrefs.getBoolean("system_statusbaricons_headset") ||
- "volume".equals(slotName) && MainModule.mPrefs.getBoolean("system_statusbaricons_sound") ||
- "quiet".equals(slotName) && MainModule.mPrefs.getBoolean("system_statusbaricons_dnd") ||
- "mute".equals(slotName) && MainModule.mPrefs.getBoolean("system_statusbaricons_mute") ||
- "speakerphone".equals(slotName) && MainModule.mPrefs.getBoolean("system_statusbaricons_speaker") ||
- "call_record".equals(slotName) && MainModule.mPrefs.getBoolean("system_statusbaricons_record") ||
- "alarm_clock".equals(slotName) && MainModule.mPrefs.getBoolean("system_statusbaricons_alarm") ||
- "managed_profile".equals(slotName) && MainModule.mPrefs.getBoolean("system_statusbaricons_profile");
- } catch (Throwable t) {
- XposedBridge.log(t);
- return false;
- }
- }
-
- public static void HideIconsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBarIconControllerImpl", lpparam.classLoader, "setIconVisibility", String.class, boolean.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if (checkSlot((String)param.args[0])) param.args[1] = false;
- }
- });
- }
-
- public static void HideIconsSystemHook() {
- Helpers.findAndHookMethod("android.app.StatusBarManager", null, "setIconVisibility", String.class, boolean.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if (checkSlot((String)param.args[0])) param.args[1] = false;
- }
- });
- }
-
- public static void BatteryIndicatorHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "makeStatusBarView", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- FrameLayout mStatusBarWindow = (FrameLayout)XposedHelpers.getObjectField(param.thisObject, "mStatusBarWindow");
- BatteryIndicator indicator = new BatteryIndicator(mContext);
- View panel = mStatusBarWindow.findViewById(mContext.getResources().getIdentifier("notification_panel", "id", lpparam.packageName));
- mStatusBarWindow.addView(indicator, panel != null ? mStatusBarWindow.indexOfChild(panel) + 1 : Math.max(mStatusBarWindow.getChildCount() - 1, 8));
- indicator.setAdjustViewBounds(false);
- indicator.init(param.thisObject);
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mBatteryIndicator", indicator);
- Object mNotificationIconAreaController = XposedHelpers.getObjectField(param.thisObject, "mNotificationIconAreaController");
- XposedHelpers.setAdditionalInstanceField(mNotificationIconAreaController, "mBatteryIndicator", indicator);
- Object mBatteryController = XposedHelpers.getObjectField(param.thisObject, "mBatteryController");
- XposedHelpers.setAdditionalInstanceField(mBatteryController, "mBatteryIndicator", indicator);
- XposedHelpers.callMethod(mBatteryController, "fireBatteryLevelChanged");
- XposedHelpers.callMethod(mBatteryController, "firePowerSaveChanged");
- XposedHelpers.callMethod(mBatteryController, "fireExtremePowerSaveChanged");
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "setPanelExpanded", boolean.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- boolean isKeyguardShowing = (boolean)XposedHelpers.callMethod(param.thisObject, "isKeyguardShowing");
- BatteryIndicator indicator = (BatteryIndicator)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mBatteryIndicator");
- if (indicator != null) indicator.onExpandingChanged(!isKeyguardShowing && (boolean)param.args[0]);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "setQsExpanded", boolean.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- boolean isKeyguardShowing = (boolean)XposedHelpers.callMethod(param.thisObject, "isKeyguardShowing");
- if (!isKeyguardShowing) return;
- BatteryIndicator indicator = (BatteryIndicator)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mBatteryIndicator");
- if (indicator != null) indicator.onExpandingChanged((boolean)param.args[0]);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "updateKeyguardState", boolean.class, boolean.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- boolean isKeyguardShowing = (boolean)XposedHelpers.callMethod(param.thisObject, "isKeyguardShowing");
- BatteryIndicator indicator = (BatteryIndicator)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mBatteryIndicator");
- if (indicator != null) indicator.onKeyguardStateChanged(isKeyguardShowing);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.NotificationIconAreaController", lpparam.classLoader, "onDarkChanged", Rect.class, float.class, int.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- BatteryIndicator indicator = (BatteryIndicator)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mBatteryIndicator");
- if (indicator != null) indicator.onDarkModeChanged((float)param.args[1], (int)param.args[2]);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.BatteryControllerImpl", lpparam.classLoader, "fireBatteryLevelChanged", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- BatteryIndicator indicator = (BatteryIndicator)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mBatteryIndicator");
- int mLevel = XposedHelpers.getIntField(param.thisObject, "mLevel");
- boolean mCharging = XposedHelpers.getBooleanField(param.thisObject, "mCharging");
- boolean mCharged = XposedHelpers.getBooleanField(param.thisObject, "mCharged");
- if (indicator != null) indicator.onBatteryLevelChanged(mLevel, mCharging, mCharged);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.BatteryControllerImpl", lpparam.classLoader, "firePowerSaveChanged", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- BatteryIndicator indicator = (BatteryIndicator)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mBatteryIndicator");
- if (indicator != null) indicator.onPowerSaveChanged(XposedHelpers.getBooleanField(param.thisObject, "mIsPowerSaveMode"));
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.BatteryControllerImpl", lpparam.classLoader, "fireExtremePowerSaveChanged", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- BatteryIndicator indicator = (BatteryIndicator)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mBatteryIndicator");
- if (indicator != null) indicator.onExtremePowerSaveChanged(XposedHelpers.getBooleanField(param.thisObject, "mIsExtremePowerSaveMode"));
- }
- });
- }
-
- private static boolean obtainMagnifierShowCoordinates(Object mEditor, int type, final MotionEvent event, final PointF showPosInView) {
- TextView mTextView = (TextView)XposedHelpers.getObjectField(mEditor, "mTextView");
- final int offset;
- final int otherHandleOffset;
- switch (type) {
- case 0:
- offset = mTextView.getSelectionStart();
- otherHandleOffset = -1;
- break;
- case 1:
- offset = mTextView.getSelectionStart();
- otherHandleOffset = mTextView.getSelectionEnd();
- break;
- case 2:
- offset = mTextView.getSelectionEnd();
- otherHandleOffset = mTextView.getSelectionStart();
- break;
- default:
- offset = -1;
- otherHandleOffset = -1;
- break;
- }
-
- if (offset == -1) return false;
-
- final Layout layout = mTextView.getLayout();
- final int lineNumber = layout.getLineForOffset(offset);
- final boolean sameLineSelection = otherHandleOffset != -1 && lineNumber == layout.getLineForOffset(otherHandleOffset);
- final boolean rtl = sameLineSelection && (offset < otherHandleOffset) != (mTextView.getLayout().getPrimaryHorizontal(offset) < mTextView.getLayout().getPrimaryHorizontal(otherHandleOffset));
-
- final int[] textViewLocationOnScreen = new int[2];
- mTextView.getLocationOnScreen(textViewLocationOnScreen);
- final float touchXInView = event.getRawX() - textViewLocationOnScreen[0];
- float leftBound = mTextView.getTotalPaddingLeft() - mTextView.getScrollX();
- float rightBound = mTextView.getTotalPaddingLeft() - mTextView.getScrollX();
-
- if (sameLineSelection && ((type == 2) ^ rtl))
- leftBound += mTextView.getLayout().getPrimaryHorizontal(otherHandleOffset);
- else
- leftBound += mTextView.getLayout().getLineLeft(lineNumber);
-
- if (sameLineSelection && ((type == 1) ^ rtl))
- rightBound += mTextView.getLayout().getPrimaryHorizontal(otherHandleOffset);
- else
- rightBound += mTextView.getLayout().getLineRight(lineNumber);
-
- showPosInView.x = Math.max(leftBound - 1, Math.min(rightBound + 1, touchXInView));
- showPosInView.y = (mTextView.getLayout().getLineTop(lineNumber) + mTextView.getLayout().getLineBottom(lineNumber)) / 2.0f + mTextView.getTotalPaddingTop() - mTextView.getScrollY();
- return true;
- }
-
- @SuppressLint("NewApi")
- private static void processHandleMotionEvent(Object handleView, int type, MotionEvent ev) {
- int action = ev.getActionMasked();
- if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) {
- Object mEditor = XposedHelpers.getSurroundingThis(handleView);
- Magnifier mMagnifier = (Magnifier)XposedHelpers.getAdditionalInstanceField(mEditor, "mMagnifier");
- if (mMagnifier == null) return;
- PointF coords = new PointF();
- if (obtainMagnifierShowCoordinates(mEditor, type, ev, coords))
- mMagnifier.show(coords.x, coords.y);
- else
- mMagnifier.dismiss();
- } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
- Magnifier mMagnifier = (Magnifier)XposedHelpers.getAdditionalInstanceField(XposedHelpers.getSurroundingThis(handleView), "mMagnifier");
- if (mMagnifier != null) mMagnifier.dismiss();
- }
- }
-
- public static void TextMagnifierHook() {
- Helpers.findAndHookMethod("android.widget.Magnifier", null, "obtainContentCoordinates", float.class, float.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Point mClampedCenterZoomCoords = (Point)XposedHelpers.getObjectField(param.thisObject, "mClampedCenterZoomCoords");
- if (Helpers.isQPlus()) {
- Object mView = XposedHelpers.getObjectField(param.thisObject, "mView");
- float f = (float)param.args[0];
- int x;
- if (mView instanceof SurfaceView) {
- x = Math.round(f);
- } else {
- int[] mViewCoordinatesInSurface = (int[])XposedHelpers.getObjectField(param.thisObject, "mViewCoordinatesInSurface");
- x = Math.round(f + (float)mViewCoordinatesInSurface[0]);
- }
- mClampedCenterZoomCoords.x = x;
- } else {
- Point mCenterZoomCoords = (Point)XposedHelpers.getObjectField(param.thisObject, "mCenterZoomCoords");
- mClampedCenterZoomCoords.x = mCenterZoomCoords.x;
- }
- }
- });
-
- Helpers.findAndHookConstructor("android.widget.Editor", null, TextView.class, new MethodHook() {
- @Override
- @SuppressLint("NewApi")
- protected void after(final MethodHookParam param) throws Throwable {
- TextView mTextView = (TextView)XposedHelpers.getObjectField(param.thisObject, "mTextView");
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mMagnifier", new Magnifier(mTextView));
- }
- });
-
- Helpers.findAndHookMethod("android.widget.Editor$InsertionHandleView", null, "onTouchEvent", MotionEvent.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- processHandleMotionEvent(param.thisObject, 0, (MotionEvent)param.args[0]);
- }
- });
-
- Helpers.findAndHookMethod("android.widget.Editor$SelectionHandleView", null, "onTouchEvent", MotionEvent.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- processHandleMotionEvent(param.thisObject, "SelectionEndHandleView".equals(param.thisObject.getClass().getSimpleName()) ? 2 : 1, (MotionEvent)param.args[0]);
- }
- });
- }
-
- public static void ForceCloseHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.server.policy.BaseMiuiPhoneWindowManager", lpparam.classLoader, new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void after(final MethodHookParam param) throws Throwable {
- HashSet mSystemKeyPackages = (HashSet)XposedHelpers.getObjectField(param.thisObject, "mSystemKeyPackages");
- mSystemKeyPackages.remove("com.miui.securitycenter");
- mSystemKeyPackages.remove("com.miui.securityadd");
- mSystemKeyPackages.remove("com.android.phone");
- mSystemKeyPackages.remove("com.android.mms");
- mSystemKeyPackages.remove("com.android.contacts");
- mSystemKeyPackages.remove("com.miui.home");
- mSystemKeyPackages.remove("com.jeejen.family.miui");
- mSystemKeyPackages.remove("com.miui.backup");
- mSystemKeyPackages.remove("com.xiaomi.mihomemanager");
- mSystemKeyPackages.addAll(MainModule.mPrefs.getStringSet("system_forceclose_apps"));
- }
- });
- }
-
- public static void DisableAnyNotificationBlockHook() {
- Helpers.hookAllConstructors("android.app.NotificationChannel", null, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- XposedHelpers.setBooleanField(param.thisObject, "mBlockableSystem", true);
- }
- });
-
- Helpers.findAndHookMethod("android.app.NotificationChannel", null, "setBlockableSystem", boolean.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- XposedHelpers.setBooleanField(param.thisObject, "mBlockableSystem", true);
- }
- });
- }
-
- public static void DisableAnyNotificationHook() {
- Helpers.findAndHookMethod("miui.util.NotificationFilterHelper", null, "isNotificationForcedEnabled", Context.class, String.class, XC_MethodReplacement.returnConstant(false));
- Helpers.findAndHookMethod("miui.util.NotificationFilterHelper", null, "isNotificationForcedEnabled", Context.class, String.class, String.class, XC_MethodReplacement.returnConstant(false));
- Helpers.findAndHookMethod("miui.util.NotificationFilterHelper", null, "isNotificationForcedFor", Context.class, String.class, XC_MethodReplacement.returnConstant(false));
- Helpers.findAndHookMethod("miui.util.NotificationFilterHelper", null, "canSystemNotificationBeBlocked", String.class, XC_MethodReplacement.returnConstant(true));
- Helpers.findAndHookMethod("miui.util.NotificationFilterHelper", null, "containNonBlockableChannel", String.class, XC_MethodReplacement.returnConstant(false));
- Helpers.findAndHookMethod("miui.util.NotificationFilterHelper", null, "getNotificationForcedEnabledList", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- param.setResult(new HashSet());
- }
- });
- }
-
- private static boolean modifyCameraImage(Context mContext, View mKeyguardRightView, boolean mDarkMode) {
- if (MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_right_off")) {
- restoreCameraImage(mKeyguardRightView);
- return false;
- }
-
- final String key = "pref_key_system_lockscreenshortcuts_right";
-
- int action = Helpers.getSharedIntPref(mContext, key + "_action", 1);
- if (action <= 1) {
- restoreCameraImage(mKeyguardRightView);
- return false;
- }
-
- String str = Helpers.getActionName(mContext, key);
- if (str == null) {
- restoreCameraImage(mKeyguardRightView);
- return false;
- }
-
- Drawable icon = Helpers.getActionImage(mContext, key);
- mKeyguardRightView.setBackgroundColor(Color.TRANSPARENT);
- mKeyguardRightView.setForeground(icon);
- mKeyguardRightView.setForegroundGravity(Gravity.CENTER);
-
- float density = mContext.getResources().getDisplayMetrics().density;
- int size = Math.round(mContext.getResources().getConfiguration().smallestScreenWidthDp * density);
-
- Bitmap bmp = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bmp);
- Paint paint = new Paint();
- paint.setAntiAlias(true);
- paint.setShadowLayer(2 * density, 0, 0, mDarkMode ? Color.argb(90, 255, 255, 255) : Color.argb(90, 0, 0, 0));
- paint.setTextSize(20 * density);
- paint.setStyle(Paint.Style.STROKE);
- paint.setStrokeWidth(density);
- paint.setColor(mDarkMode ? Color.WHITE : Color.BLACK);
- paint.setAlpha(90);
-
- Rect bounds = new Rect();
- paint.getTextBounds(str, 0, str.length(), bounds);
- float x = size / 2f - bounds.width() / 2f;
- float y = size / 2f + bounds.height() / 2f + (icon == null ? 0 : icon.getIntrinsicHeight() / 2f + 30 * density);
- canvas.drawText(str, x, y, paint);
- paint.setStyle(Paint.Style.FILL);
-// paint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
- paint.clearShadowLayer();
- paint.setColor(mDarkMode ? Color.BLACK : Color.WHITE);
- paint.setAlpha(mDarkMode ? 160 : 230);
- canvas.drawText(str, x, y, paint);
-
- BitmapDrawable bmpDrawable = new BitmapDrawable(mContext.getResources(), bmp);
- if (mKeyguardRightView instanceof ImageView) {
- ((ImageView)mKeyguardRightView).setScaleType(ImageView.ScaleType.CENTER);
- ((ImageView)mKeyguardRightView).setImageDrawable(bmpDrawable);
- } else {
- bmpDrawable.setGravity(Gravity.CENTER);
- mKeyguardRightView.setBackground(bmpDrawable);
- }
-
- return true;
- }
-
- private static void restoreCameraImage(View mKeyguardRightView) {
- mKeyguardRightView.setBackgroundColor(Color.BLACK);
- mKeyguardRightView.setForeground(null);
- if (mKeyguardRightView instanceof ImageView)
- ((ImageView)mKeyguardRightView).setScaleType(ImageView.ScaleType.FIT_END);
- }
-
- private static void initLeftView(final Object thisObject) {
- Context mContext = (Context)XposedHelpers.getObjectField(thisObject, "mContext");
- try { XposedHelpers.setObjectField(thisObject, "mMiWalletCardNum", new TextView(mContext)); } catch (Throwable ignore) {}
- try { XposedHelpers.setObjectField(thisObject, "mRemoteControllerNum", new TextView(mContext)); } catch (Throwable ignore) {}
- try { XposedHelpers.setObjectField(thisObject, "mSmartHomeNum", new TextView(mContext)); } catch (Throwable ignore) {}
-
- Handler mHandler = (Handler)XposedHelpers.getAdditionalInstanceField(thisObject, "mHandler");
- mHandler.removeMessages(1);
- Message msg = new Message();
- msg.what = 1;
- msg.obj = thisObject;
- mHandler.sendMessageDelayed(msg, 1000);
- }
-
- private static Object notificationPanelView = null;
- public static void LockScreenShortcutHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.KeyguardBottomAreaView$DefaultLeftButton", lpparam.classLoader, "getIcon", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Object img = param.getResult();
- if (MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_left_off"))
- XposedHelpers.setObjectField(img, "drawable", null);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.KeyguardBottomAreaView$DefaultRightButton", lpparam.classLoader, "getIcon", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Object img = param.getResult();
- if (MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_right_off")) {
- XposedHelpers.setObjectField(img, "drawable", null);
- return;
- }
-
- Object thisObject = XposedHelpers.getSurroundingThis(param.thisObject);
- Context mContext = (Context)XposedHelpers.getObjectField(thisObject, "mContext");
- boolean opt = MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_right_image");
- if (!opt) return;
- boolean mDarkMode = XposedHelpers.getBooleanField(thisObject, "mDarkMode");
- boolean isNewLS = findClassIfExists("com.android.keyguard.KeyguardCameraView", lpparam.classLoader) != null;
- XposedHelpers.setObjectField(img, "drawable", Helpers.getModuleRes(mContext).getDrawable(mDarkMode ?
- (isNewLS ? R.drawable.keyguard_bottom_miuizer_img_dark : R.drawable.keyguard_bottom_miuizer_oldimg_dark) :
- (isNewLS ? R.drawable.keyguard_bottom_miuizer_img_light : R.drawable.keyguard_bottom_miuizer_oldimg_light), mContext.getTheme()
- ));
- }
- });
-
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.KeyguardBottomAreaView", lpparam.classLoader, "initTipsView", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- boolean opt = MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_right_image");
- if (!opt) return;
- TextView mRightAffordanceViewTips = (TextView)XposedHelpers.getObjectField(param.thisObject, "mRightAffordanceViewTips");
- if (mRightAffordanceViewTips != null) mRightAffordanceViewTips.setText(Helpers.getModuleRes(mRightAffordanceViewTips.getContext()).getString(R.string.system_lockscreenshortcuts_right_image_hint));
- }
- });
-
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.KeyguardBottomAreaView", lpparam.classLoader, "launchCamera", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (GlobalActions.handleAction(mContext, "pref_key_system_lockscreenshortcuts_right", true)) {
- param.setResult(null);
- final View mNotificationPanelView = (View)XposedHelpers.getObjectField(param.thisObject, "mNotificationPanelView");
- mNotificationPanelView.postDelayed(new Runnable() {
- @Override
- public void run() {
- XposedHelpers.callMethod(mNotificationPanelView, "resetViews");
- }
- }, 500);
- }
- }
- });
-
- if (findClassIfExists("com.android.keyguard.KeyguardCameraView", lpparam.classLoader) != null) {
- Helpers.hookAllMethods("com.android.keyguard.KeyguardCameraView", lpparam.classLoader, "setDarkMode", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- XposedHelpers.callMethod(param.thisObject, "updatePreViewBackground");
- }
- });
-
- Helpers.findAndHookMethod("com.android.keyguard.KeyguardCameraView", lpparam.classLoader, "updatePreView", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- View mPreViewContainer = (View)XposedHelpers.getObjectField(param.thisObject, "mPreViewContainer");
- if ("active".equals(mPreViewContainer.getTag())) {
- XposedHelpers.setFloatField(param.thisObject, "mIconCircleAlpha", 0.0f);
- ((View)param.thisObject).invalidate();
- }
- }
- });
-
- Helpers.findAndHookMethod("com.android.keyguard.KeyguardCameraView", lpparam.classLoader, "updatePreViewBackground", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
-
- boolean mDarkMode = XposedHelpers.getBooleanField(param.thisObject, "mDarkMode");
- ImageView mIconView = (ImageView)XposedHelpers.getObjectField(param.thisObject, "mIconView");
- if (mIconView != null)
- if (MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_right_image"))
- mIconView.setImageDrawable(Helpers.getModuleRes(mContext).getDrawable(mDarkMode ? R.drawable.keyguard_bottom_miuizer_img_dark : R.drawable.keyguard_bottom_miuizer_img_light, mContext.getTheme()));
- else
- mIconView.setImageDrawable(mContext.getDrawable(mDarkMode ? mContext.getResources().getIdentifier("keyguard_bottom_camera_img_dark", "drawable", lpparam.packageName) : mContext.getResources().getIdentifier("keyguard_bottom_camera_img", "drawable", lpparam.packageName)));
-
- View mPreView = (View)XposedHelpers.getObjectField(param.thisObject, "mPreView");
- View mPreViewContainer = (View)XposedHelpers.getObjectField(param.thisObject, "mPreViewContainer");
- View mBackgroundView = (View)XposedHelpers.getObjectField(param.thisObject, "mBackgroundView");
- Paint mIconCircleStrokePaint = (Paint)XposedHelpers.getObjectField(param.thisObject, "mIconCircleStrokePaint");
- ViewOutlineProvider mPreViewOutlineProvider = (ViewOutlineProvider)XposedHelpers.getObjectField(param.thisObject, "mPreViewOutlineProvider");
- boolean result = modifyCameraImage(mContext, mPreView, mDarkMode);
- if (result) param.setResult(null);
- if (mPreViewContainer != null) {
- mPreViewContainer.setBackgroundColor(result ? Color.TRANSPARENT : Color.BLACK);
- mPreViewContainer.setOutlineProvider(result ? null : mPreViewOutlineProvider);
- mPreViewContainer.setTag(result ? "active" : "inactive");
- }
- if (mBackgroundView != null) mBackgroundView.setBackgroundColor(result ? Color.TRANSPARENT : Color.BLACK);
- if (mIconCircleStrokePaint != null) mIconCircleStrokePaint.setColor(result ? Color.TRANSPARENT : Color.WHITE);
- }
- });
-
- Helpers.findAndHookMethod("com.android.keyguard.KeyguardCameraView", lpparam.classLoader, "handleMoveDistanceChanged", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- View mIconView = (View)XposedHelpers.getObjectField(param.thisObject, "mIconView");
- if (MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_right_off")) {
- if (mIconView != null) mIconView.setVisibility(View.GONE);
- param.setResult(null);
- } else if (mIconView != null) mIconView.setVisibility(View.VISIBLE);
- }
- });
-
- Helpers.findAndHookMethod("com.android.keyguard.KeyguardCameraView", lpparam.classLoader, "startFullScreenAnim", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- int action = MainModule.mPrefs.getInt("system_lockscreenshortcuts_right_action", 1);
- if (action <= 1) return;
- AnimatorSet mAnimatorSet = (AnimatorSet)XposedHelpers.getObjectField(param.thisObject, "mAnimatorSet");
- if (mAnimatorSet == null) return;
- param.setResult(null);
- mAnimatorSet.pause();
- mAnimatorSet.removeAllListeners();
- mAnimatorSet.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- GlobalActions.handleAction(mContext, "pref_key_system_lockscreenshortcuts_right", true);
- Object mCallBack = XposedHelpers.getObjectField(param.thisObject, "mCallBack");
- if (mCallBack != null) XposedHelpers.callMethod(mCallBack, "onCompletedAnimationEnd");
- XposedHelpers.setBooleanField(param.thisObject, "mIsPendingStartCamera", false);
- XposedHelpers.callMethod(param.thisObject, "dismiss");
- View mBackgroundView = (View)XposedHelpers.getObjectField(param.thisObject, "mBackgroundView");
- if (mBackgroundView != null) mBackgroundView.setAlpha(1.0f);
- }
- });
- mAnimatorSet.resume();
- }
- });
- } else {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "updateWallpaper", boolean.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if ((boolean)param.args[0]) try {
- XposedHelpers.callMethod(param.thisObject, "setCameraImage", false);
- } catch (Throwable t1) {
- XposedHelpers.callMethod(param.thisObject, "setCameraImage");
- }
- }
- });
-
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "setCameraImage", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- View mView = (View)XposedHelpers.getObjectField(param.thisObject, "mKeyguardRightView");
- Object mUpdateMonitor = XposedHelpers.getObjectField(param.thisObject, "mUpdateMonitor");
- boolean mDarkMode = (boolean)XposedHelpers.callMethod(mUpdateMonitor, "isLightWallpaperBottom");
- if (modifyCameraImage(mContext, mView, mDarkMode)) {
- try {
- XposedHelpers.setBooleanField(param.thisObject, "mGetCameraImageSucceed", false);
- } catch (Throwable ignore) {}
- param.setResult(null);
- }
- }
- });
- }
-
- Helpers.hookAllConstructors("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- notificationPanelView = param.thisObject;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- new Helpers.SharedPrefObserver(mContext, new Handler(mContext.getMainLooper())) {
- @Override
- public void onChange(Uri uri) {
- try {
- String type = uri.getPathSegments().get(1);
- String key = uri.getPathSegments().get(2);
- if (!key.contains("pref_key_system_lockscreenshortcuts")) return;
-
- switch (type) {
- case "string":
- MainModule.mPrefs.put(key, Helpers.getSharedStringPref(mContext, key, ""));
- break;
- case "integer":
- MainModule.mPrefs.put(key, Helpers.getSharedIntPref(mContext, key, 1));
- break;
- case "boolean":
- MainModule.mPrefs.put(key, Helpers.getSharedBoolPref(mContext, key, false));
- break;
- }
-
- if (key.contains("pref_key_system_lockscreenshortcuts_right"))
- try {
- XposedHelpers.callMethod(notificationPanelView, "setCameraImage", false);
- } catch (Throwable t1) {
- try {
- XposedHelpers.callMethod(notificationPanelView, "setCameraImage");
- } catch (Throwable t2) {}
- }
-
- if (key.contains("pref_key_system_lockscreenshortcuts_left")) {
- Object leftView = null;
- try {
- leftView = XposedHelpers.getObjectField(XposedHelpers.getObjectField(notificationPanelView, "mKeyguardLeftView"), "mKeyguardMoveLeftView");
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- if (leftView != null) try {
- XposedHelpers.callMethod(leftView, "reloadListItems");
- } catch (Throwable t1) {
- try {
- XposedHelpers.callMethod(leftView, "updateShortcuts");
- } catch (Throwable t2) {
- try {
- XposedHelpers.callMethod(leftView, "initKeyguardLeftItems");
- } catch (Throwable t3) {
- try {
- XposedHelpers.callMethod(leftView, "initKeyguardLeftItemInfos");
- } catch (Throwable t4) {
- XposedBridge.log(t4);
- }
- }
- }
- }
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.KeyguardMoveHelper", lpparam.classLoader, "setTranslation", float.class, boolean.class, boolean.class, boolean.class, boolean.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- int mCurrentScreen = XposedHelpers.getIntField(param.thisObject, "mCurrentScreen");
- if (mCurrentScreen != 1) return;
- if ((float)param.args[0] < 0 && MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_right_off")) param.args[0] = 0.0f;
- else if ((float)param.args[0] > 0 && MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_left_off")) param.args[0] = 0.0f;
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.KeyguardMoveHelper", lpparam.classLoader, "fling", float.class, boolean.class, boolean.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- int mCurrentScreen = XposedHelpers.getIntField(param.thisObject, "mCurrentScreen");
- if (mCurrentScreen != 1) return;
- if ((float)param.args[0] < 0 && MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_right_off")) param.setResult(null);
- else if ((float)param.args[0] > 0 && MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_left_off")) param.setResult(null);
- }
- });
-
- View.OnClickListener mListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- int action = MainModule.mPrefs.getInt(v.getTag() + "_action", 1);
- boolean skip = MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_left_skiplock");
- if (!skip && (action == 8 || action == 9 || action == 20))
- XposedHelpers.callStaticMethod(findClass("com.android.systemui.SystemUICompat", lpparam.classLoader), "dismissKeyguardOnNextActivity");
- GlobalActions.handleAction(v.getContext(), "pref_key_" + v.getTag(), skip);
- }
- };
-
- class LeftControlCenterHandler extends Handler {
-
- LeftControlCenterHandler(Looper looper) {
- super(looper);
- }
-
- public void handleMessage(Message msg) {
- if (msg.what == 1) try {
- ViewGroup leftView = (ViewGroup)msg.obj;
- Context mContext = (Context)XposedHelpers.getObjectField(leftView, "mContext");
- int listResId = mContext.getResources().getIdentifier("keyguard_move_left", "id", lpparam.packageName);
- ViewGroup oldList = leftView.findViewById(listResId);
- RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)oldList.getLayoutParams();
- ScrollView container = new ScrollView(oldList.getContext());
- container.setVerticalScrollBarEnabled(false);
- ViewGroup parent = ((ViewGroup)oldList.getParent());
- LinearLayout leftList = new LinearLayout(oldList.getContext());
- parent.removeView(oldList);
- leftList.setLayoutParams(new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT, ScrollView.LayoutParams.WRAP_CONTENT));
- leftList.setOrientation(LinearLayout.VERTICAL);
-
- try {
- float density = mContext.getResources().getDisplayMetrics().density;
- int align = MainModule.mPrefs.getStringAsInt("system_lockscreenshortcuts_left_align", 2);
- int margin = Math.round(density * 40);
- lp.topMargin = lp.bottomMargin;
- if (lp.topMargin < margin) lp.topMargin = margin;
- if (lp.bottomMargin < margin) lp.bottomMargin = margin;
- boolean center = MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_left_center");
- lp.leftMargin = Math.round((center ? 36.33f : 20) * density);
- lp.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
- if (align == 1)
- lp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
- else
- lp.removeRule(RelativeLayout.ALIGN_PARENT_TOP);
- container.setLayoutParams(lp);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- container.addView(leftList);
- container.setId(listResId);
- parent.addView(container);
-
- LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- int layoutResId = mContext.getResources().getIdentifier("miui_keyguard_left_view_control_center_item", "layout", lpparam.packageName);
- if (layoutResId == 0) layoutResId = mContext.getResources().getIdentifier("miui_keyguard_left_view_item", "layout", lpparam.packageName);
- int imgResId = mContext.getResources().getIdentifier("keyguard_left_list_item_img", "id", lpparam.packageName);
- int nameResId = mContext.getResources().getIdentifier("keyguard_left_list_item_name", "id", lpparam.packageName);
- //int numberResId = mContext.getResources().getIdentifier("keyguard_left_list_item_number", "id", lpparam.packageName);
- int margin = mContext.getResources().getDimensionPixelSize(mContext.getResources().getIdentifier("keyguard_move_left_item_margin", "dimen", lpparam.packageName));
-
- String key = "system_lockscreenshortcuts_left";
- String itemStr = MainModule.mPrefs.getString(key, "");
- if (itemStr == null || itemStr.isEmpty()) return;
- String[] itemArr = itemStr.trim().split("\\|");
-
- int i = 0;
- for (String uuid: itemArr) {
- LinearLayout item = (LinearLayout)inflater.inflate(layoutResId, leftList, false);
- item.setTag(key + "_" + uuid);
- leftList.addView(item);
-
- ImageView img = item.findViewById(imgResId);
- int size = (int)(32 * img.getResources().getDisplayMetrics().density);
- ViewGroup.LayoutParams lp1 = img.getLayoutParams();
- lp1.width = size;
- lp1.height = size;
- img.setLayoutParams(lp1);
- Drawable image = Helpers.getActionImage(mContext, "pref_key_" + key + "_" + uuid);
- img.setImageDrawable(image != null ? image : mContext.getPackageManager().getApplicationIcon(Helpers.modulePkg));
- img.setBackgroundResource(0);
-
- TextView title = item.findViewById(nameResId);
- title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
- title.setText(Helpers.getActionName(mContext, "pref_key_" + key + "_" + uuid));
-
- LinearLayout.LayoutParams lp2 = (LinearLayout.LayoutParams)item.getLayoutParams();
- if (i > 0) lp2.topMargin = margin;
- lp2.height = LinearLayout.LayoutParams.WRAP_CONTENT;
- item.setLayoutParams(lp2);
-
- int padding = (int)(14 * img.getResources().getDisplayMetrics().density);
- item.setPadding(padding, padding, padding, padding);
-
- i++;
- item.setOnClickListener(mListener);
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- }
-
- String leftViewCls = "com.android.keyguard.negative.MiuiKeyguardMoveLeftControlCenterView";
- if (XposedHelpers.findClassIfExists(leftViewCls, lpparam.classLoader) == null)
- leftViewCls = "com.android.keyguard.MiuiKeyguardMoveLeftView";
-
- Helpers.findAndHookConstructor(leftViewCls, lpparam.classLoader, Context.class, AttributeSet.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = new LeftControlCenterHandler(mContext.getMainLooper());
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mHandler", mHandler);
- }
- });
-
- if (!Helpers.findAndHookMethodSilently(leftViewCls, lpparam.classLoader, "reloadListItems", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- initLeftView(param.thisObject);
- param.setResult(null);
- }
- })) if (!Helpers.findAndHookMethodSilently(leftViewCls, lpparam.classLoader, "updateShortcuts", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- initLeftView(param.thisObject);
- param.setResult(null);
- }
- })) if (!Helpers.findAndHookMethodSilently(leftViewCls, lpparam.classLoader, "initKeyguardLeftItems", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- initLeftView(param.thisObject);
- param.setResult(null);
- }
- })) Helpers.findAndHookMethod(leftViewCls, lpparam.classLoader, "initKeyguardLeftItemInfos", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- initLeftView(param.thisObject);
- param.setResult(null);
- }
- });
-
- if (!Helpers.findAndHookMethodSilently(leftViewCls, lpparam.classLoader, "onClick", View.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if (handleStockShortcut((View)param.args[0])) param.setResult(null);
- }
- })) Helpers.findAndHookMethod(leftViewCls, lpparam.classLoader, "onFinishInflate", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View mSmartHomeLinearLayout = (View)XposedHelpers.getObjectField(param.thisObject, "mSmartHomeLinearLayout");
- View mRemoteCenterLinearLayout = (View)XposedHelpers.getObjectField(param.thisObject, "mRemoteCenterLinearLayout");
- final View.OnClickListener mListener = (View.OnClickListener)XposedHelpers.getObjectField(param.thisObject, "mListener");
- View.OnClickListener mNewListener = new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- if (!handleStockShortcut(view))
- if (mListener != null) mListener.onClick(view);
- }
- };
- mSmartHomeLinearLayout.setOnClickListener(mNewListener);
- mRemoteCenterLinearLayout.setOnClickListener(mNewListener);
- }
- });
- }
-
- private static boolean handleStockShortcut(View view) {
- if (view == null) return false;
- boolean skip = MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_left_skiplock");
- if (!skip) return false;
- Context context = view.getContext();
- int id = view.getId();
- try {
- if (id == view.getResources().getIdentifier("keyguard_remote_controller_info", "id", context.getPackageName())) {
- Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.duokan.phone.remotecontroller");
- if (intent == null) return false;
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- if (MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_left_skiplock")) {
- intent.putExtra("ShowCameraWhenLocked", true);
- intent.putExtra("StartActivityWhenLocked", true);
- }
- context.startActivity(intent);
- return true;
- } else if (id == view.getResources().getIdentifier("keyguard_smarthome_info", "id", context.getPackageName())) {
- Intent intent = new Intent();
- intent.setPackage("com.xiaomi.smarthome");
- intent.setData(Uri.parse("http://home.mi.com/main"));
- intent.setAction("android.intent.action.VIEW");
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.putExtra("source", 11);
- if (MainModule.mPrefs.getBoolean("system_lockscreenshortcuts_left_skiplock")) {
- intent.putExtra("ShowCameraWhenLocked", true);
- intent.putExtra("StartActivityWhenLocked", true);
- }
- context.startActivity(intent);
- return true;
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- return false;
- }
-
- public static void LockScreenSecureLaunchHook() {
- Helpers.findAndHookMethod(Activity.class, "onCreate", Bundle.class, new MethodHook() {
- @SuppressWarnings("ConstantConditions")
- protected void after(MethodHookParam param) throws Throwable {
- Activity act = (Activity)param.thisObject;
- if (act == null) return;
- Intent intent = act.getIntent();
- if (intent == null) return;
- boolean mFromSecureKeyguard = intent.getBooleanExtra("StartActivityWhenLocked", false);
- boolean mStartedFromLockScreen = false;
- try {
- mStartedFromLockScreen = (boolean)XposedHelpers.getAdditionalInstanceField(act.getApplication(), "wasStartedFromLockScreen");
- } catch (Throwable ignore) {}
- if (mFromSecureKeyguard || mStartedFromLockScreen) {
- XposedHelpers.setAdditionalInstanceField(act.getApplication(), "wasStartedFromLockScreen", true);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
- act.setShowWhenLocked(true);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
- act.setInheritShowWhenLocked(true);
- } else {
- act.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
- }
- }
- }
- });
- }
-
- private static Handler stateHandler;
-
- public static class StateRunnable implements Runnable {
- Context context;
- MediaController controller;
-
- StateRunnable(Context ctx, MediaController ctrl) {
- context = ctx;
- controller = ctrl;
- }
-
- @Override
- public void run() {
- try {
- if (stateHandler != null) stateHandler.postDelayed(this, 1000);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- }
-
- public static class SeekBarReceiver extends BroadcastReceiver {
- View parent;
- TextView posDur;
- SeekBar seekBar;
-
- SeekBarReceiver(View view, SeekBar sBar, TextView pos) {
- parent = view;
- posDur = pos;
- seekBar = sBar;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {}
- }
-
- public static class MediaControllerReceiver extends BroadcastReceiver {
- MediaController.TransportControls transportControls;
-
- MediaControllerReceiver(MediaController.TransportControls transport) {
- transportControls = transport;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {}
- }
-
- private static void sendSeekBarUpdate(Context mContext, MediaController controller) {
- try {
- if (mContext == null) return;
- String pkgName = (String)XposedHelpers.callMethod(controller, "getPackageName");
- Intent intent = new Intent(ACTION_PREFIX + "UpdateMediaPosition:" + pkgName);
- MediaMetadata medaData = controller.getMetadata();
- if (medaData == null) return;
- intent.putExtra(MediaMetadata.METADATA_KEY_DURATION, medaData.getLong(MediaMetadata.METADATA_KEY_DURATION));
- intent.putExtra("android.media.metadata.POSITION", controller.getPlaybackState().getPosition());
- mContext.sendBroadcast(intent);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
-
- public static void MediaNotificationSeekBarHook() {
- MethodHook hook = new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- stateHandler = new Handler();
- MediaController mController = (MediaController)XposedHelpers.callMethod(param.thisObject, "getController");
- MediaController.TransportControls mTransportControls = (MediaController.TransportControls)XposedHelpers.getObjectField(mController, "mTransportControls");
- MediaControllerReceiver mSeekToReceiver = new MediaControllerReceiver(mTransportControls) {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (transportControls == null) return;
- long position = intent.getLongExtra("android.media.metadata.POSITION", 0L);
- transportControls.seekTo(position);
- }
- };
- StateRunnable mStateRunnable = new StateRunnable((Context)param.args[0], mController) {
- @Override
- public void run() {
- if (context != null && controller != null) try {
- sendSeekBarUpdate(context, controller);
- PlaybackState state = controller.getPlaybackState();
- if (state != null && state.getState() != PlaybackState.STATE_PLAYING) return;
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- super.run();
- }
- };
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mSeekToReceiver", mSeekToReceiver);
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mStateRunnable", mStateRunnable);
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mContext", param.args[0]);
- }
- };
-
- if (Helpers.isQPlus())
- Helpers.findAndHookConstructor("android.media.session.MediaSession", null, Context.class, String.class, Bundle.class, hook);
- else
- Helpers.findAndHookConstructor("android.media.session.MediaSession", null, Context.class, String.class, int.class, hook);
-
- Helpers.findAndHookMethod("android.media.session.MediaSession", null, "setActive", boolean.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- boolean mActive = XposedHelpers.getBooleanField(param.thisObject, "mActive");
- boolean newActive = (boolean)param.args[0];
- if (mActive == newActive) return;
-
- Context mContext = (Context)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mContext");
- if (mContext == null) return;
-
- MediaControllerReceiver mSeekToReceiver = (MediaControllerReceiver)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mSeekToReceiver");
- if (newActive)
- mContext.registerReceiver(mSeekToReceiver, new IntentFilter(ACTION_PREFIX + "SeekToMediaPosition:" + mContext.getPackageName()));
- else
- mContext.unregisterReceiver(mSeekToReceiver);
- }
- });
-
- Helpers.findAndHookMethod("android.media.session.MediaSession", null, "setPlaybackState", PlaybackState.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mContext");
- if (mContext == null) return;
- MediaController mController = (MediaController)XposedHelpers.callMethod(param.thisObject, "getController");
- if (mController == null) return;
- StateRunnable mStateRunnable = (StateRunnable)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mStateRunnable");
- if (mStateRunnable == null) return;
-
- stateHandler.removeCallbacks(mStateRunnable);
- if (((PlaybackState)param.args[0]).getState() == PlaybackState.STATE_PLAYING)
- stateHandler.postDelayed(mStateRunnable, 100);
- else
- sendSeekBarUpdate(mContext, mController);
- }
- });
- }
-
- @SuppressLint("DefaultLocale")
- private static String msToStr(long timeMillis) {
- return String.format("%d:%02d", TimeUnit.MILLISECONDS.toMinutes(timeMillis), TimeUnit.MILLISECONDS.toSeconds(timeMillis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timeMillis)));
- }
-
- public static void MediaNotificationSeekBarSysUIHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.notification.NotificationViewWrapper", lpparam.classLoader, "wrap", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (param.args.length > 3) return;
- Object res = param.getResult();
- if (res == null) return;
- String cls = res.getClass().getSimpleName();
- if (!"NotificationMediaTemplateViewWrapper".equals(cls) && !"NotificationMediaCustomTemplateViewWrapper".equals(cls)) return;
- View mView = (View)XposedHelpers.getObjectField(res, "mView");
- Object mRow = XposedHelpers.getObjectField(res, "mRow");
- if (mView == null || mRow == null || !"bigMediaNarrow".equals(mView.getTag())) return;
- if (mView.getId() != mView.getResources().getIdentifier("status_bar_latest_event_content", "id", "android")) return;
- LinearLayout mediaLayout = mView.findViewById(mView.getResources().getIdentifier("notification_main_column", "id", "android"));
- if (mediaLayout == null || mediaLayout.findViewWithTag("notifmediaseekbar") != null) return;
-
- mediaLayout.setClipToPadding(false);
- mediaLayout.setClipChildren(false);
-
- float density = mView.getResources().getDisplayMetrics().density;
- String pkgName = (String)XposedHelpers.callMethod(XposedHelpers.callMethod(mRow, "getStatusBarNotification"), "getPackageName");
-
- Context ctx = mView.getContext();
- FrameLayout container = new FrameLayout(ctx);
- container.setTag("notifmediaseekbar");
- container.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- container.setClipToPadding(false);
- container.setClipChildren(false);
- container.setPadding(0, Math.round(10 * density), 0, 0);
- //container.setTranslationY(-Math.round(7 * density));
-
- final TextView posDur = new TextView(ctx);
- FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
- lp.gravity = Gravity.END;
- posDur.setLayoutParams(lp);
- posDur.setGravity(Gravity.END);
- posDur.setTranslationY(-Math.round(15 * density));
- posDur.setPadding(0, 0, Math.round(16 * density), 0);
- try {
- posDur.setTextColor(mView.getResources().getColor(mView.getResources().getIdentifier("media_notification_app_name_text_color", "color", "android"), ctx.getTheme()));
- posDur.setTextSize(TypedValue.COMPLEX_UNIT_PX, mView.getResources().getDimensionPixelSize(mView.getResources().getIdentifier("media_notification_app_name_text_size", "dimen", "android")));
- } catch (Throwable t) {
- TextView appName = mView.findViewById(mView.getResources().getIdentifier("media_app_name", "id", "android"));
- if (appName != null) {
- posDur.setTextColor(appName.getCurrentTextColor());
- posDur.setTextSize(TypedValue.COMPLEX_UNIT_PX, appName.getTextSize());
- }
- }
-
- final SeekBar seekBar = new SeekBar(ctx);
-
- boolean opt = MainModule.mPrefs.getBoolean("system_notifmediaseekbar_full");
- if (opt) {
- seekBar.setPadding(Math.round(15 * density), Math.round(5 * density), Math.round(15 * density), Math.round(5 * density));
- } else {
- seekBar.setProgressDrawable(Helpers.getModuleRes(ctx).getDrawable(R.drawable.seekbar, ctx.getTheme()));
- seekBar.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, Math.round(10 * density)));
- seekBar.setThumb(null);
- seekBar.setBackground(null);
- seekBar.setPadding(Math.round(16 * density), 0, Math.round(16 * density), 0);
- }
- seekBar.setMax(100);
- seekBar.setProgress(0);
- seekBar.setTag(false);
- seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- if (fromUser) posDur.setText(msToStr(progress).concat(" / ").concat(msToStr(seekBar.getMax())));
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- seekBar.setTag(true);
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- seekBar.setTag(false);
- Intent intent = new Intent(ACTION_PREFIX + "SeekToMediaPosition:" + pkgName);
- intent.putExtra("android.media.metadata.POSITION", Long.valueOf(seekBar.getProgress()));
- seekBar.getContext().sendBroadcast(intent);
- }
- });
- long rnd = Math.round(Math.random() * 1000);
- seekBar.setContentDescription(String.valueOf(rnd));
-
- container.addView(seekBar);
- container.addView(posDur);
- mediaLayout.addView(container, 1, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
-
- SeekBarReceiver seekBarUpdate = new SeekBarReceiver(mView, seekBar, posDur) {
- @Override
- public void onReceive(Context context, Intent intent) {
- try {
- if (!parent.isAttachedToWindow() || !seekBar.isAttachedToWindow()) {
- context.unregisterReceiver(this);
- seekBar = null;
- parent = null;
- return;
- }
- if (seekBar == null || (boolean)seekBar.getTag() || intent == null || intent.getExtras() == null) return;
- long dur = intent.getLongExtra(MediaMetadata.METADATA_KEY_DURATION, 0L);
- long pos = intent.getLongExtra("android.media.metadata.POSITION", 0L);
- seekBar.setMax((int)dur);
- seekBar.setProgress((int)pos);
- posDur.setText(msToStr(pos).concat(" / ").concat(msToStr(dur)));
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- mView.getContext().registerReceiver(seekBarUpdate, new IntentFilter(ACTION_PREFIX + "UpdateMediaPosition:" + pkgName));
- }
- });
- }
-
- public static void Network4GtoLTEHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.policy.TelephonyIcons", lpparam.classLoader, "getNetworkTypeName", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- String net = (String)param.getResult();
- if ("4G".equals(net)) param.setResult("LTE");
- else if ("4G+".equals(net)) param.setResult("LTE+");
- }
- });
- }
-
- private static final TextView[] lux = { null, null, null };
- private static class LuxListener implements SensorEventListener {
- @Override
- public void onSensorChanged(SensorEvent event) {
- long cTime = currentTimeMillis();
- String caption = null;
-
- if (lux[0] != null && lux[0].isAttachedToWindow()) try {
- Long last = (Long)lux[0].getTag();
- if (last != null && cTime - last < 750) return;
- caption = Helpers.getModuleRes(lux[0].getContext()).getString(R.string.lux, String.valueOf(Math.round(event.values[0])));
- lux[0].setText(caption);
- lux[0].setTag(cTime);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- if (lux[1] != null && lux[1].isAttachedToWindow()) try {
- Long last = (Long)lux[1].getTag();
- if (last != null && cTime - last < 750) return;
- if (caption == null)
- caption = Helpers.getModuleRes(lux[1].getContext()).getString(R.string.lux, String.valueOf(Math.round(event.values[0])));
- lux[1].setText(caption);
- lux[1].setTag(cTime);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- if (lux[2] != null && lux[2].isAttachedToWindow()) try {
- Long last = (Long)lux[2].getTag();
- if (last != null && cTime - last < 750) return;
- if (caption == null)
- caption = Helpers.getModuleRes(lux[2].getContext()).getString(R.string.lux, String.valueOf(Math.round(event.values[0])));
- lux[2].setText(caption);
- lux[2].setTag(cTime);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
-
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy) {}
- }
-
-// private static View getBrightnessSlider(Object statusBar) {
-// try {
-// View mStatusBarWindow = (View)XposedHelpers.getObjectField(statusBar, "mStatusBarWindow");
-// if (mStatusBarWindow == null) return null;
-// ViewGroup mQSFragment = mStatusBarWindow.findViewById(mStatusBarWindow.getResources().getIdentifier("qs_frame", "id", "com.android.systemui"));
-// if (mQSFragment == null || mQSFragment.getChildCount() == 0) return null;
-// Object mContainer = mQSFragment.getChildAt(0);
-// if (mContainer == null) return null;
-// return (View)XposedHelpers.callMethod(mContainer, "getBrightnessView");
-// } catch (Throwable t) {
-// XposedBridge.log(t);
-// return null;
-// }
-// }
-
- private static void registerLuxListener(Object statusBar) {
- try {
- Context mContext = (Context)XposedHelpers.getObjectField(statusBar, "mContext");
- PowerManager powerMgr = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
- if (!powerMgr.isInteractive()) return;
- boolean sBootCompleted = XposedHelpers.getBooleanField(statusBar, "sBootCompleted");
- if (!sBootCompleted) return;
- SensorManager sensorMgr = (SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);
- LuxListener mLuxListener = (LuxListener)XposedHelpers.getAdditionalInstanceField(statusBar, "mLuxListener");
- sensorMgr.registerListener(mLuxListener, sensorMgr.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_NORMAL);
- XposedHelpers.setAdditionalInstanceField(statusBar, "mListenerEnabled", true);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
-
- private static void unregisterLuxListener(Object statusBar) {
- try {
- Context mContext = (Context)XposedHelpers.getObjectField(statusBar, "mContext");
- SensorManager sensorMgr = (SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);
- LuxListener mLuxListener = (LuxListener)XposedHelpers.getAdditionalInstanceField(statusBar, "mLuxListener");
- sensorMgr.unregisterListener(mLuxListener);
- XposedHelpers.setAdditionalInstanceField(statusBar, "mListenerEnabled", false);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
-
- public static void setTextColors(Context context, TextView textView) {
- textView.setTextColor(Helpers.isNightMode(context) ? 0xFFDDDDDD : 0xFF606060);
- if (Helpers.isNightMode(context))
- textView.setShadowLayer(context.getResources().getDisplayMetrics().density, 1f, 1f, 0xEE222224);
- else
- textView.setShadowLayer(0, 0, 0, Color.WHITE);
- }
-
- public static void BrightnessLuxHook(LoadPackageParam lpparam) {
- MethodHook hook = new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context context = (Context)param.args[0];
- ViewGroup container = (ViewGroup)param.thisObject;
- int port = context.getResources().getIdentifier("qs_brightness", "id", lpparam.packageName);
- int land = context.getResources().getIdentifier("qs_brightness_land", "id", lpparam.packageName);
- if (container.getId() != port && container.getId() != land) return;
-
- TextView clux = new TextView(context);
- RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
- lp.alignWithParent = true;
- lp.addRule(RelativeLayout.CENTER_IN_PARENT);
- clux.setLayoutParams(lp);
- clux.setGravity(Gravity.CENTER);
-
- boolean isAlt = MainModule.mPrefs.getBoolean("system_showlux_style");
- setTextColors(context, clux);
- if (isAlt) {
- clux.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
- clux.setAlpha(0.33f);
- }
-
- container.addView(clux);
-
- if (Helpers.is12() && "QCToggleSliderView".equals(param.thisObject.getClass().getSimpleName())) {
- if (container.getId() == land)
- lux[2] = clux;
- else
- lux[1] = clux;
- } else {
- lux[0] = clux;
- }
- }
- };
-
- Helpers.findAndHookConstructor("com.android.systemui.settings.ToggleSliderView", lpparam.classLoader, Context.class, AttributeSet.class, int.class, hook);
- if (Helpers.is12())
- Helpers.findAndHookConstructor("com.android.systemui.miui.controlcenter.QCToggleSliderView", lpparam.classLoader, Context.class, AttributeSet.class, int.class, hook);
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "makeStatusBarView", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- LuxListener mLuxListener = new LuxListener();
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mLuxListener", mLuxListener);
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mListenerEnabled", false);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "setPanelExpanded", boolean.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- boolean isExpanded = (boolean)param.args[0];
- boolean mListenerEnabled = (boolean)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mListenerEnabled");
-
- if (isExpanded && !mListenerEnabled)
- registerLuxListener(param.thisObject);
- else if (!isExpanded && mListenerEnabled)
- unregisterLuxListener(param.thisObject);
- }
- });
-
- if (Helpers.is12()) {
- Helpers.findAndHookMethod("com.android.systemui.miui.controlcenter.QSControlCenterPanel", lpparam.classLoader, "setListening", boolean.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- boolean isExpanded = (boolean)param.args[0];
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Object mApplication = XposedHelpers.callMethod(mContext.getApplicationContext(), "getSystemUIApplication");
- Object mStatusBar = XposedHelpers.callMethod(mApplication, "getComponent", findClassIfExists("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader));
- boolean mListenerEnabled = (boolean)XposedHelpers.getAdditionalInstanceField(mStatusBar, "mListenerEnabled");
- if (isExpanded && !mListenerEnabled)
- registerLuxListener(mStatusBar);
- else if (!isExpanded && mListenerEnabled)
- unregisterLuxListener(mStatusBar);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.miui.controlcenter.QSControlCenterPanel", lpparam.classLoader, "updateResources", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (lux[1] != null) setTextColors(mContext, lux[1]);
- if (lux[2] != null) setTextColors(mContext, lux[2]);
- }
- });
- }
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "onScreenTurnedOff", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- unregisterLuxListener(param.thisObject);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "onScreenTurnedOn", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- boolean mPanelExpanded = XposedHelpers.getBooleanField(param.thisObject, "mPanelExpanded");
- boolean mListenerEnabled = (boolean)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mListenerEnabled");
- if (mPanelExpanded && !mListenerEnabled) registerLuxListener(param.thisObject);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "onBootCompleted", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- boolean mPanelExpanded = XposedHelpers.getBooleanField(param.thisObject, "mPanelExpanded");
- boolean mListenerEnabled = (boolean)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mListenerEnabled");
- if (mPanelExpanded && !mListenerEnabled) registerLuxListener(param.thisObject);
- }
- });
- }
-
- @SuppressLint("StaticFieldLeak")
- private static TextView mPct = null;
- private static void initPct(ViewGroup container, int source) {
- Context context = container.getContext();
- Resources res = container.getResources();
- if (mPct == null) {
- mPct = new TextView(context);
- mPct.setTag("mirrorBrightnessPct");
- mPct.setTextSize(TypedValue.COMPLEX_UNIT_SP, 40);
- mPct.setGravity(Gravity.CENTER);
- mPct.setTypeface(Typeface.create("sans-serif-light", Typeface.NORMAL));
- float density = res.getDisplayMetrics().density;
- FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
- lp.topMargin = Math.round(MainModule.mPrefs.getInt("system_showpct_top", 26) * density);
- lp.gravity = Gravity.CENTER_HORIZONTAL|Gravity.TOP;
- mPct.setPadding(Math.round(20 * density), Math.round(10 * density), Math.round(18 * density), Math.round(12 * density));
- mPct.setLayoutParams(lp);
- } else {
- ViewGroup parent = (ViewGroup)mPct.getParent();
- if (parent != null) parent.removeView(mPct);
- }
- container.addView(mPct);
- mPct.setTag(source);
- int panelResId = res.getIdentifier("panel_round_corner_bg", "drawable", "com.android.systemui");
- mPct.setBackground(res.getDrawable(panelResId, context.getTheme()));
- int colorResId = res.getIdentifier("qs_tile_icon_disabled_color", "color", "com.android.systemui");
- mPct.setTextColor(res.getColor(colorResId, container.getContext().getTheme()));
- mPct.setAlpha(0.0f);
- mPct.setVisibility(View.GONE);
- }
-
- public static void BrightnessPctHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.BrightnessMirrorController", lpparam.classLoader, "showMirror", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- ViewGroup mStatusBarWindow = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mStatusBarWindow");
- if (mStatusBarWindow == null) {
- Helpers.log("BrightnessPctHook", "mStatusBarWindow is null");
- return;
- }
- initPct(mStatusBarWindow, 1);
- mPct.setVisibility(View.VISIBLE);
- mPct.animate().alpha(1.0f).setDuration(300).start();
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.BrightnessMirrorController", lpparam.classLoader, "hideMirror", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if (mPct != null) mPct.setVisibility(View.GONE);
- }
- });
-
- if (Helpers.is12()) {
- Helpers.findAndHookMethod("com.android.systemui.miui.controlcenter.policy.QCBrightnessMirrorController", lpparam.classLoader, "showMirror", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- ViewGroup mControlPanelContentView = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mControlPanelContentView");
- if (mControlPanelContentView == null) {
- Helpers.log("BrightnessPctHook", "mControlPanelContentView is null");
- return;
- }
- initPct((ViewGroup)mControlPanelContentView.getParent(), 1);
- mPct.setVisibility(View.VISIBLE);
- mPct.animate().alpha(1.0f).setDuration(300).start();
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.miui.controlcenter.policy.QCBrightnessMirrorController", lpparam.classLoader, "hideMirror", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if (mPct != null) mPct.setVisibility(View.GONE);
- }
- });
- }
-
- Helpers.hookAllMethods("com.android.systemui.settings.BrightnessController", lpparam.classLoader, "onChanged", new MethodHook() {
- @Override
- @SuppressLint("SetTextI18n")
- protected void after(final MethodHookParam param) throws Throwable {
- if (mPct == null || (int)mPct.getTag() != 1) return;
- int currentLevel = (int)(param.args[2] instanceof Integer ? param.args[2] : param.args[3]);
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- int maxLevel = mContext.getResources().getInteger(mContext.getResources().getIdentifier("config_screenBrightnessSettingMaximum", "integer", "android"));
- mPct.setText(((currentLevel * 100) / maxLevel) + "%");
- }
- });
- }
-
- public static void HideProximityWarningHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.policy.MiuiScreenOnProximityLock", lpparam.classLoader, "showHint", XC_MethodReplacement.DO_NOTHING);
- }
-
- public static void HideIconsVoLTERes() {
- MainModule.resHooks.setObjectReplacement("com.android.systemui", "bool", "status_bar_hide_volte", true);
- }
-
- public static void HideIconsVoLTEHook(LoadPackageParam lpparam) {
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.android.systemui.MCCUtils", lpparam.classLoader, "isHideVolte", Context.class, String.class, XC_MethodReplacement.returnConstant(true));
- }
-
- public static void HideLockScreenClockHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "setKeyguardStatusViewVisibility", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- View mKeyguardClockView = (View)XposedHelpers.getObjectField(param.thisObject, "mKeyguardClockView");
- if (mKeyguardClockView == null) {
- Helpers.log("HideLockScreenClockHook", "mKeyguardClockView is null");
- return;
- }
- ((ViewGroup)mKeyguardClockView).getChildAt(0).setVisibility(View.INVISIBLE);
- mKeyguardClockView.animate().cancel();
- XposedHelpers.setBooleanField(param.thisObject, "mKeyguardStatusViewAnimating", false);
- mKeyguardClockView.setAlpha(0.0f);
- mKeyguardClockView.setVisibility(View.INVISIBLE);
- }
- });
- }
-
- public static void NoSilentVibrateHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.miui.volume.MiuiVolumeDialogImpl", lpparam.classLoader, "vibrateH", XC_MethodReplacement.DO_NOTHING);
- }
-
- public static void FirstVolumePressHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.audio.AudioService$VolumeController", lpparam.classLoader, "suppressAdjustment", int.class, int.class, boolean.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- int streamType = (int)param.args[0];
- if (streamType != AudioManager.STREAM_MUSIC) return;
- boolean isMuteAdjust = (boolean)param.args[2];
- if (isMuteAdjust) return;
- Object mController = XposedHelpers.getObjectField(param.thisObject, "mController");
- if (mController == null) return;
- param.setResult(false);
- }
- });
- }
-
- public static void HideThemeBackgroundBrightnessHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.BrightnessMirrorController", lpparam.classLoader, "showMirror", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Object mNotificationPanel = XposedHelpers.getObjectField(param.thisObject, "mNotificationPanel");
- if (mNotificationPanel == null) return;
- View mThemeBackgroundView = (View)XposedHelpers.getObjectField(mNotificationPanel, "mThemeBackgroundView");
- if (mThemeBackgroundView != null) mThemeBackgroundView.setVisibility(View.GONE);
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.BrightnessMirrorController", lpparam.classLoader, "hideMirror", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Object mNotificationPanel = XposedHelpers.getObjectField(param.thisObject, "mNotificationPanel");
- if (mNotificationPanel == null) return;
- View mThemeBackgroundView = (View)XposedHelpers.getObjectField(mNotificationPanel, "mThemeBackgroundView");
- if (mThemeBackgroundView != null) mThemeBackgroundView.setVisibility(View.VISIBLE);
- }
- });
- }
-
- public static void NoSignatureVerifyHook() {
- if (Helpers.isNougat()) return;
- Helpers.hookAllMethods("android.content.pm.PackageParser.SigningDetails", null, "checkCapability", XC_MethodReplacement.returnConstant(true));
- Helpers.hookAllMethods("android.content.pm.PackageParser.SigningDetails", null, "checkCapabilityRecover", XC_MethodReplacement.returnConstant(true));
- }
-
- public static void NoSignatureVerifyServiceHook(LoadPackageParam lpparam) {
- if (!Helpers.hookAllMethodsSilently("com.android.server.pm.PackageManagerServiceUtils", lpparam.classLoader, "compareSignatures", XC_MethodReplacement.returnConstant(0))) {
- Helpers.hookAllMethodsSilently("com.android.server.pm.PackageManagerService", lpparam.classLoader, "compareSignatures", XC_MethodReplacement.returnConstant(0));
- Helpers.hookAllMethodsSilently("com.android.server.pm.PackageManagerService", lpparam.classLoader, "compareSignaturesCompat", XC_MethodReplacement.returnConstant(0));
- Helpers.hookAllMethodsSilently("com.android.server.pm.PackageManagerService", lpparam.classLoader, "compareSignaturesRecover", XC_MethodReplacement.returnConstant(0));
- }
-
- Helpers.hookAllMethods("com.android.server.pm.PackageManagerServiceInjector", lpparam.classLoader, "isAllowedInstall", XC_MethodReplacement.returnConstant(true));
- Helpers.hookAllMethodsSilently("com.android.server.pm.PackageManagerService", lpparam.classLoader, "canSkipFullPackageVerification", XC_MethodReplacement.returnConstant(true));
- Helpers.hookAllMethodsSilently("com.android.server.pm.PackageManagerService", lpparam.classLoader, "canSkipFullApkVerification", XC_MethodReplacement.returnConstant(true));
- }
-
- @SuppressWarnings("ResultOfMethodCallIgnored")
- public static void NoSignatureVerifyMiuiHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethodSilently("com.android.packageinstaller.InstallAppProgress.a", lpparam.classLoader, "a", Boolean.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = true;
- }
- });
-
- Helpers.findAndHookMethodSilently("com.android.packageinstaller.InstallAppProgress.a", lpparam.classLoader, "onPostExecute", Boolean.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = true;
- }
- });
-
- Helpers.findAndHookMethodSilently("com.android.packageinstaller.IncrementInstallProgress.a", lpparam.classLoader, "a", Boolean.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = true;
- }
- });
-
- Helpers.findAndHookMethodSilently("com.android.packageinstaller.IncrementInstallProgress.a", lpparam.classLoader, "onPostExecute", Boolean.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = true;
- }
- });
- }
-
- public static void ScreenDimTimeHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.power.PowerManagerService", lpparam.classLoader, "readConfigurationLocked", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- float opt = MainModule.mPrefs.getInt("system_dimtime", 0) / 100f;
- XposedHelpers.setIntField(param.thisObject, "mMaximumScreenDimDurationConfig", 600000);
- XposedHelpers.setFloatField(param.thisObject, "mMaximumScreenDimRatioConfig", opt);
-// Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
-// int minScreenOffTimeout = mContext.getResources().getInteger(mContext.getResources().getIdentifier("config_minimumScreenOffTimeout", "integer", "android"));
- }
- });
-
-// Helpers.hookAllMethods("com.android.server.power.PowerManagerService", lpparam.classLoader, "getScreenOffTimeoutLocked", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// //XposedBridge.log("getScreenOffTimeoutLocked (mSleepTimeoutSetting): " + param.args[0]);
-// //XposedBridge.log("mMaximumScreenOffTimeoutFromDeviceAdmin: " + XposedHelpers.getLongField(param.thisObject, "mMaximumScreenOffTimeoutFromDeviceAdmin"));
-// XposedBridge.log("mUserActivityTimeoutOverrideFromWindowManager: " + XposedHelpers.getLongField(param.thisObject, "mUserActivityTimeoutOverrideFromWindowManager"));
-// }
-// });
-//
-// Helpers.hookAllMethods("com.android.server.power.PowerManagerService", lpparam.classLoader, "updateUserActivitySummaryLocked", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// if ((int)param.args[1] == 1) return;
-// XposedBridge.log("updateUserActivitySummaryLocked: " + param.args[0] + ", " + param.args[1]);
-// }
-// });
- }
-
- public static void NoOverscrollHook() {
- if (Helpers.isQPlus())
- Helpers.findAndHookMethod("android.widget.AbsListView", null, "initAbsListView", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- ((AbsListView)param.thisObject).setOverScrollMode(View.OVER_SCROLL_NEVER);
- }
- });
- else
- Helpers.findAndHookMethod("android.widget.AbsListView", null, "setOverScrollMode", int.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = View.OVER_SCROLL_NEVER;
- }
- });
- }
-
- public static void NoOverscrollAppHook(LoadPackageParam lpparam) {
- MethodHook hookParam = new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = false;
- }
- };
-
- Class> sblCls = findClassIfExists("miuix.springback.view.SpringBackLayout", lpparam.classLoader);
- if (sblCls != null) {
- Helpers.hookAllConstructors(sblCls, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- try {
- XposedHelpers.callMethod(param.thisObject, "setSpringBackEnable", false);
- } catch (Throwable t) {
- try { XposedHelpers.setBooleanField(param.thisObject, "mSpringBackEnable", false); } catch (Throwable ignore) {}
- }
- }
- });
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently(sblCls, "setSpringBackEnable", boolean.class, hookParam);
- }
-
- Class> rrvCls = findClassIfExists("androidx.recyclerview.widget.RemixRecyclerView", lpparam.classLoader);
- if (rrvCls != null) {
- Helpers.hookAllConstructors(rrvCls, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ((View)param.thisObject).setOverScrollMode(View.OVER_SCROLL_NEVER);
- try {
- XposedHelpers.callMethod(param.thisObject, "setSpringEnabled", false);
- } catch (Throwable t) {
- try { XposedHelpers.setBooleanField(param.thisObject, "mSpringEnabled", false); } catch (Throwable ignore) {}
- }
- }
- });
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently(rrvCls, "setSpringEnabled", boolean.class, hookParam);
- }
- }
-
- private static Dialog mDialog = null;
- private static float blurCollapsed = 0.0f;
- private static float blurExpanded = 0.0f;
-
- @SuppressWarnings("deprecation")
- private static void updateBlurRatio(Object thisObject) {
- if (mDialog == null || mDialog.getWindow() == null) return;
- View rootView = mDialog.getWindow().getDecorView();
- if (rootView.isAttachedToWindow() && rootView.getLayoutParams() instanceof WindowManager.LayoutParams) {
- WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams)rootView.getLayoutParams();
- layoutParams.flags |= WindowManager.LayoutParams.FLAG_BLUR_BEHIND;
- boolean isExpanded = (boolean)XposedHelpers.callMethod(thisObject, "isExpanded");
- XposedHelpers.setFloatField(layoutParams, "blurRatio", isExpanded ? blurExpanded : blurCollapsed);
- mDialog.getWindow().getWindowManager().updateViewLayout(rootView, layoutParams);
- }
- }
-
- public static void BlurVolumeDialogBackgroundHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.miui.volume.MiuiVolumeDialogView", lpparam.classLoader, "onAttachedToWindow", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- updateBlurRatio(param.thisObject);
- }
- });
-
- Helpers.hookAllMethods("com.android.systemui.miui.volume.MiuiVolumeDialogView", lpparam.classLoader, "onExpandStateUpdated", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- updateBlurRatio(param.thisObject);
- }
- });
-
- Helpers.hookAllMethods("com.android.systemui.miui.volume.MiuiVolumeDialogImpl", lpparam.classLoader, "initDialog", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = new Handler(mContext.getMainLooper());
-
- mDialog = (Dialog)XposedHelpers.getObjectField(param.thisObject, "mDialog");
- blurCollapsed = MainModule.mPrefs.getInt("system_volumeblur_collapsed", 0) / 100f;
- blurExpanded = MainModule.mPrefs.getInt("system_volumeblur_expanded", 0) / 100f;
- new Helpers.SharedPrefObserver(mContext, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String key = uri.getPathSegments().get(2);
- if (key.equals("pref_key_system_volumeblur_collapsed")) blurCollapsed = Helpers.getSharedIntPref(mContext, key, 0) / 100f;
- if (key.equals("pref_key_system_volumeblur_expanded")) blurExpanded = Helpers.getSharedIntPref(mContext, key, 0) / 100f;
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
- }
-
- public static void BlurVolumeDialogBackgroundRes() {
- MainModule.resHooks.setObjectReplacement("com.android.systemui", "fraction", "miui_volume_dim_behind_collapsed", 0.0f);
- MainModule.resHooks.setObjectReplacement("com.android.systemui", "fraction", "miui_volume_dim_behind_expanded", 0.0f);
- }
-
- public static void RemoveSecureHook() {
- Helpers.findAndHookMethod(Window.class, "setFlags", int.class, int.class, new MethodHook() {
- protected void before(MethodHookParam param) throws Throwable {
- int flags = (int)param.args[0];
- int mask = (int)param.args[1];
- flags &= ~WindowManager.LayoutParams.FLAG_SECURE;
- mask &= ~WindowManager.LayoutParams.FLAG_SECURE;
- param.args[0] = flags;
- param.args[1] = mask;
- }
- });
-
- MethodHook paramFlagsHook = new MethodHook() {
- protected void before(MethodHookParam param) throws Throwable {
- if (!(param.args[1] instanceof WindowManager.LayoutParams)) return;
- WindowManager.LayoutParams params = (WindowManager.LayoutParams)param.args[1];
- params.flags &= ~WindowManager.LayoutParams.FLAG_SECURE;
- }
- };
- Helpers.hookAllMethods("android.view.WindowManagerGlobal", null, "addView", paramFlagsHook);
- Helpers.hookAllMethods("android.view.WindowManagerGlobal", null, "updateViewLayout", paramFlagsHook);
-
- Helpers.findAndHookMethod(SurfaceView.class, "setSecure", boolean.class, new MethodHook() {
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = false;
- }
- });
- }
-
- public static void AllowAllKeyguardHook(LoadPackageParam lpparam) {
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.android.systemui.statusbar.notification.MiuiNotificationCompat", lpparam.classLoader, "isEnableKeyguard", Notification.class, XC_MethodReplacement.returnConstant(true));
- }
-
- public static void AllowAllKeyguardSysHook() {
- Helpers.findAndHookMethod(MiuiNotification.class, "setEnableKeyguard", boolean.class, new MethodHook() {
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = true;
- }
- });
-
- Helpers.findAndHookMethod(MiuiNotification.class, "isEnableKeyguard", XC_MethodReplacement.returnConstant(true));
- }
-
- public static void AllowAllFloatHook(LoadPackageParam lpparam) {
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.android.systemui.statusbar.notification.MiuiNotificationCompat", lpparam.classLoader, "isEnableFloat", Notification.class, XC_MethodReplacement.returnConstant(true));
- }
-
- public static void AllowAllFloatSysHook() {
- Helpers.findAndHookMethod(MiuiNotification.class, "setEnableFloat", boolean.class, new MethodHook() {
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = true;
- }
- });
-
- Helpers.findAndHookMethod(MiuiNotification.class, "isEnableFloat", XC_MethodReplacement.returnConstant(true));
- }
-
- public static void AllowDirectReplyHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "setLockScreenAllowRemoteInput", boolean.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = true;
- }
- });
- }
-
- public static void HideQSHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "setBarState", int.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Object mNotificationPanel = XposedHelpers.getObjectField(param.thisObject, "mNotificationPanel");
- final View mQsFrame = (View)XposedHelpers.getObjectField(mNotificationPanel, "mQsFrame");
- if ((int)param.args[0] == 2) {
- ViewGroup.LayoutParams lp = mQsFrame.getLayoutParams();
- lp.height = 1;
- mQsFrame.setLayoutParams(lp);
- } else {
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- ViewGroup.LayoutParams lp = mQsFrame.getLayoutParams();
- lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
- mQsFrame.setLayoutParams(lp);
- }
- }, 300);
- }
- }
- });
- }
-
- public static void RemoveDrawerBackgroundHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "drawChild", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mStatusBarStateOrig", XposedHelpers.getIntField(param.thisObject, "mStatusBarState"));
- XposedHelpers.setIntField(param.thisObject, "mStatusBarState", 0);
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mKeyguardShowingOrig", XposedHelpers.getBooleanField(param.thisObject, "mKeyguardShowing"));
- XposedHelpers.setBooleanField(param.thisObject, "mKeyguardShowing", false);
- }
-
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- XposedHelpers.setIntField(param.thisObject, "mStatusBarState", (int)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mStatusBarStateOrig"));
- XposedHelpers.setBooleanField(param.thisObject, "mKeyguardShowing", (boolean)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mKeyguardShowingOrig"));
- }
- });
- }
-
- public static void LockScreenTimeoutHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.StatusBarWindowManager", lpparam.classLoader, "applyUserActivityTimeout", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Object mLpChanged = XposedHelpers.getObjectField(param.thisObject, "mLpChanged");
- if (mLpChanged == null) return;
- long userActivityTimeout = XposedHelpers.getLongField(mLpChanged, "userActivityTimeout");
- if (userActivityTimeout > 0)
- XposedHelpers.setLongField(mLpChanged, "userActivityTimeout", MainModule.mPrefs.getInt("system_lstimeout", 9) * 1000L);
- }
- });
- }
-
- private static final SimpleDateFormat formatter = new SimpleDateFormat("H:m", Locale.ENGLISH);
- public static void MuffledVibrationHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.VibratorService", lpparam.classLoader, "systemReady", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = new Handler(mContext.getMainLooper());
- new Helpers.SharedPrefObserver(mContext, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String key = uri.getPathSegments().get(2);
- if (key.contains("pref_key_system_vibration_amp_")) MainModule.mPrefs.put(key, Helpers.getSharedIntPref(mContext, key, 100));
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.hookAllMethods("com.android.server.VibratorService", lpparam.classLoader, "doVibratorOn", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- float ratio_ringer = MainModule.mPrefs.getInt("system_vibration_amp_ringer", 100) / 100f;
- float ratio_notif = MainModule.mPrefs.getInt("system_vibration_amp_notif", 100) / 100f;
- float ratio_other = MainModule.mPrefs.getInt("system_vibration_amp_other", 100) / 100f;
-
- boolean isRingtone = false;
- boolean isNotification = false;
- Object mCurrentVibration = XposedHelpers.getObjectField(param.thisObject, "mCurrentVibration");
- if (mCurrentVibration != null) try {
- isRingtone = (boolean)XposedHelpers.callMethod(mCurrentVibration, "isRingtone");
- isNotification = (boolean)XposedHelpers.callMethod(mCurrentVibration, "isNotification");
- } catch (Throwable t) {
- int mUsageHint = XposedHelpers.getIntField(mCurrentVibration, "mUsageHint");
- isRingtone = mUsageHint == 6;
- isNotification = mUsageHint == 5 || mUsageHint == 7 || mUsageHint == 8 || mUsageHint == 9;
- }
-
- float ratio;
- if (isRingtone) ratio = ratio_ringer;
- else if (isNotification) ratio = ratio_notif;
- else ratio = ratio_other;
- if (ratio == 1.0f) return;
-
- String key = "system_vibration_amp_period";
- int start_hour = MainModule.mPrefs.getInt(key + "_start_hour", 0);
- int start_minute = MainModule.mPrefs.getInt(key + "_start_minute", 0);
- int end_hour = MainModule.mPrefs.getInt(key + "_end_hour", 0);
- int end_minute = MainModule.mPrefs.getInt(key + "_end_minute", 0);
-
- formatter.setTimeZone(TimeZone.getDefault());
- Date start = formatter.parse(start_hour + ":" + start_minute);
- Date end = formatter.parse(end_hour + ":" + end_minute);
- Date now = formatter.parse(formatter.format(new Date()));
-
- boolean insidePeriod = start.before(end) ? now.after(start) && now.before(end) : now.before(end) || now.after(start);
- if (!insidePeriod) return;
-
- boolean mSupportsAmplitudeControl = false;
- try {
- mSupportsAmplitudeControl = XposedHelpers.getBooleanField(param.thisObject, "mSupportsAmplitudeControl");
- } catch (Throwable ignored) {}
-
- if (mSupportsAmplitudeControl)
- param.args[1] = Math.round(((int)param.args[1] == -1 ? XposedHelpers.getIntField(param.thisObject, "mDefaultVibrationAmplitude") : (int)param.args[1]) * ratio);
- else
- param.args[0] = Math.max(3, (long)Math.round((long)param.args[0] * ratio));
- }
- });
-
-// if (Helpers.isNougat())
-// Helpers.hookAllMethods("com.android.server.VibratorService", lpparam.classLoader, "vibratePattern", new MethodHook() {
-// @Override
-// protected void before(final MethodHookParam param) throws Throwable {
-//
-// }
-// });
- }
-
- public static void ResizableWidgetsHook() {
- Helpers.findAndHookMethod("android.appwidget.AppWidgetHostView", null, "getAppWidgetInfo", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- AppWidgetProviderInfo widgetInfo = (AppWidgetProviderInfo)param.getResult();
- if (widgetInfo == null) return;
- widgetInfo.resizeMode = AppWidgetProviderInfo.RESIZE_BOTH;
- widgetInfo.minHeight = 0;
- widgetInfo.minWidth = 0;
- widgetInfo.minResizeHeight = 0;
- widgetInfo.minResizeWidth = 0;
- param.setResult(widgetInfo);
- }
- });
-
- Helpers.findAndHookMethod("android.appwidget.AppWidgetManager", null, "getAppWidgetInfo", int.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- AppWidgetProviderInfo widgetInfo = (AppWidgetProviderInfo)param.getResult();
- if (widgetInfo == null) return;
- widgetInfo.resizeMode = AppWidgetProviderInfo.RESIZE_BOTH;
- widgetInfo.minHeight = 0;
- widgetInfo.minWidth = 0;
- widgetInfo.minResizeHeight = 0;
- widgetInfo.minResizeWidth = 0;
- param.setResult(widgetInfo);
- }
- });
- }
-
- @SuppressWarnings("ConstantConditions")
- private static void hookUpdateTime(Object thisObject) {
- try {
- TextView mCurrentDate = null;
- TextView mCurrentDateLarge = null;
- try { mCurrentDate = (TextView)XposedHelpers.getObjectField(thisObject, "mCurrentDate"); } catch (Throwable ignore) {}
- try { mCurrentDateLarge = (TextView)XposedHelpers.getObjectField(thisObject, "mCurrentDateLarge"); } catch (Throwable ignore) {}
- if (mCurrentDate == null && mCurrentDateLarge == null) return;
- Context mContext = mCurrentDate != null ? mCurrentDate.getContext() : mCurrentDateLarge.getContext();
-
- long timestamp = Helpers.getNextMIUIAlarmTime(mContext);
- if (timestamp == 0 && MainModule.mPrefs.getBoolean("system_lsalarm_all"))
- timestamp = Helpers.getNextStockAlarmTime(mContext);
- if (timestamp == 0) return;
-
- StringBuilder alarmStr = new StringBuilder();
- alarmStr.append("\n").append(Helpers.getModuleRes(mContext).getString(R.string.system_statusbaricons_alarm_title)).append(" ");
- int format = MainModule.mPrefs.getStringAsInt("system_lsalarm_format", 1);
- if (format == 1 || format == 3) {
- SimpleDateFormat dateFormat = new SimpleDateFormat(DateFormat.getBestDateTimePattern(Locale.getDefault(), DateFormat.is24HourFormat(mContext) ? "EHmm" : "EHmma"), Locale.getDefault());
- dateFormat.setTimeZone(TimeZone.getDefault());
- Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- calendar.setTimeInMillis(timestamp);
- alarmStr.append(dateFormat.format(calendar.getTime()));
- }
- if (format == 2 || format == 3) {
- StringBuilder timeStr = new StringBuilder(DateUtils.getRelativeTimeSpanString(timestamp, currentTimeMillis(), 0, DateUtils.FORMAT_ABBREV_RELATIVE));
- timeStr.setCharAt(0, Character.toLowerCase(timeStr.charAt(0)));
- alarmStr.append(format == 3 ? " (" + timeStr + ")" : timeStr);
- }
- int pos = Settings.System.getInt(mContext.getContentResolver(), "selected_keyguard_clock_position", 0);
- if (mCurrentDate != null) {
- mCurrentDate.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
- mCurrentDate.setLineSpacing(0, 1.5f);
- mCurrentDate.append(alarmStr);
- if (pos != 2 && pos != 4) mCurrentDate.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
- }
- if (mCurrentDateLarge != null) {
- int resId = mCurrentDateLarge.getResources().getIdentifier("miui_clock_date_text_size", "dimen", "com.android.systemui");
- int fontSize = resId == 0 ? Math.round(mCurrentDateLarge.getResources().getDisplayMetrics().density * 14.0f) : mCurrentDateLarge.getResources().getDimensionPixelSize(resId);
- alarmStr.insert(1, "\n\n ");
- SpannableString span = new SpannableString(alarmStr);
- span.setSpan(new AbsoluteSizeSpan(fontSize, false), 0, alarmStr.length(), 0);
- span.setSpan(new TypefaceSpan("sans-serif"), 0, alarmStr.length(), 0);
- mCurrentDateLarge.append(span);
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
-
- public static void LockScreenAlaramHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.keyguard.KeyguardUpdateMonitor", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- new Helpers.SharedPrefObserver(mContext, new Handler(mContext.getMainLooper())) {
- @Override
- public void onChange(Uri uri) {
- try {
- String key = uri.getPathSegments().get(2);
- if ("pref_key_system_lsalarm_all".equals(key)) MainModule.mPrefs.put(key, Helpers.getSharedBoolPref(mContext, key, false));
- if ("pref_key_system_lsalarm_format".equals(key)) MainModule.mPrefs.put(key, Helpers.getSharedStringPref(mContext, key, "1"));
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- if (Helpers.is12())
- Helpers.findAndHookMethod("com.android.keyguard.clock.MiuiKeyguardSingleClock", lpparam.classLoader, "updateTime", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Object mMiuiBaseClock = XposedHelpers.getObjectField(param.thisObject, "mMiuiBaseClock");
- if (mMiuiBaseClock != null) hookUpdateTime(mMiuiBaseClock);
- }
- });
- else if (!Helpers.findAndHookMethodSilently("com.android.keyguard.MiuiKeyguardBaseClock", lpparam.classLoader, "updateTime", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- hookUpdateTime(param.thisObject);
- }
- })) Helpers.findAndHookMethod("com.android.keyguard.MiuiKeyguardClock", lpparam.classLoader, "updateTime", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- hookUpdateTime(param.thisObject);
- }
- });
- }
-
- private static boolean isSlidingStart = false;
- private static boolean isSliding = false;
- private static float tapStartX = 0;
- private static float tapStartY = 0;
- private static float tapStartPointers = 0;
- private static float tapStartBrightness = 0;
- private static float currentTouchX = 0;
- private static long currentTouchTime = 0;
-
- public static void StatusBarGesturesHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "makeStatusBarView", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- new Helpers.SharedPrefObserver(mContext, new Handler(mContext.getMainLooper())) {
- @Override
- public void onChange(Uri uri) {
- try {
- String key = uri.getPathSegments().get(2);
- if ("pref_key_system_statusbarcontrols_single".equals(key) || "pref_key_system_statusbarcontrols_dual".equals(key))
- MainModule.mPrefs.put(key, Helpers.getSharedStringPref(mContext, key, "1"));
- else if ("pref_key_system_statusbarcontrols_sens_bright".equals(key) || "pref_key_system_statusbarcontrols_sens_vol".equals(key))
- MainModule.mPrefs.put(key, Helpers.getSharedStringPref(mContext, key, "2"));
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.PanelView", lpparam.classLoader, "setExpandedHeightInternal", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- float mExpandedFraction = XposedHelpers.getFloatField(param.thisObject, "mExpandedFraction");
- if (mExpandedFraction > 0.33f) {
- currentTouchTime = 0;
- currentTouchX = 0;
- }
- }
- });
-
- final Class> buCls = XposedHelpers.findClassIfExists("com.android.settingslib.display.BrightnessUtils", lpparam.classLoader);
- MethodHook hook = new MethodHook() {
- @Override
- @SuppressLint("SetTextI18n")
- protected void before(final MethodHookParam param) throws Throwable {
- boolean isInControlCenter = Helpers.is12() && "ControlPanelWindowView".equals(param.thisObject.getClass().getSimpleName());
- Context mContext = isInControlCenter ? ((View)param.thisObject).getContext() : (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Resources res = mContext.getResources();
- int sbHeight = res.getDimensionPixelSize(res.getIdentifier("status_bar_height", "dimen", "android"));
- MotionEvent event = (MotionEvent)param.args[0];
- switch (event.getActionMasked()) {
- case MotionEvent.ACTION_DOWN:
- tapStartX = event.getX();
- tapStartY = event.getY();
- isSlidingStart = isInControlCenter ? tapStartY <= sbHeight : !XposedHelpers.getBooleanField(param.thisObject, "mPanelExpanded");
- tapStartPointers = 1;
- tapStartBrightness = Settings.System.getInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 0);
- if (MainModule.mPrefs.getBoolean("system_showpct")) {
- ViewGroup mStatusBarWindow = isInControlCenter ? (ViewGroup)param.thisObject : (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mStatusBarWindow");
- if (mStatusBarWindow == null)
- Helpers.log("StatusBarGesturesHook", "mStatusBarWindow is null");
- else
- initPct(mStatusBarWindow, 2);
- }
- break;
- case MotionEvent.ACTION_POINTER_DOWN:
- tapStartPointers = event.getPointerCount();
- break;
- case MotionEvent.ACTION_UP:
- long lastTouchTime = currentTouchTime;
- float lastTouchX = currentTouchX;
- currentTouchTime = currentTimeMillis();
- currentTouchX = event.getX();
- if (currentTouchTime - lastTouchTime < 250L && Math.abs(currentTouchX - lastTouchX) < 100F) {
- GlobalActions.handleAction(mContext, "pref_key_system_statusbarcontrols_dt");
- currentTouchTime = 0L;
- currentTouchX = 0F;
- }
- case MotionEvent.ACTION_POINTER_UP:
- case MotionEvent.ACTION_CANCEL:
- isSlidingStart = false;
- isSliding = false;
- if (mPct != null) mPct.setVisibility(View.GONE);
- break;
- case MotionEvent.ACTION_MOVE:
- if (!isSlidingStart) return;
- DisplayMetrics metrics = res.getDisplayMetrics();
- if (event.getY() - tapStartY > sbHeight) return;
- float delta = event.getX() - tapStartX;
- if (delta == 0) return;
- if (!isSliding && Math.abs(delta) > metrics.widthPixels / 10f) isSliding = true;
- if (!isSliding) return;
- int opt = MainModule.mPrefs.getStringAsInt(tapStartPointers == 2 ? "system_statusbarcontrols_dual" : "system_statusbarcontrols_single", 1);
- if (opt == 2) {
- ContentResolver resolver = mContext.getContentResolver();
- int sens = MainModule.mPrefs.getStringAsInt("system_statusbarcontrols_sens_bright", 2);
- int minLevel = res.getInteger(res.getIdentifier("config_screenBrightnessSettingMinimum", "integer", "android"));
- int maxLevel = res.getInteger(res.getIdentifier("config_screenBrightnessSettingMaximum", "integer", "android"));
- boolean isHLG = maxLevel != 255;
- float ratio = delta / metrics.widthPixels;
- if (isHLG) ratio = (ratio >= 0 ? 1 : -1) * (sens == 1 ? 0.66f : (sens == 3 ? 1.66f : 1.0f)) * (float)Math.pow(ratio, 2);
- int nextLevel = Math.min(maxLevel, Math.max(minLevel, Math.round(tapStartBrightness + (maxLevel - minLevel) * ratio)));
- if (!Helpers.isPiePlus()) try {
- int brightnessMode = Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE, 0);
- if (brightnessMode == android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
- float adj = nextLevel * 2.0f / (maxLevel - minLevel) - 1.0f;
- XposedHelpers.callStaticMethod(findClass("com.android.systemui.SystemUICompat", lpparam.classLoader), "setTemporaryScreenAutoBrightness", adj);
- Settings.System.putFloat(resolver, "screen_auto_brightness_adj", adj);
- } else {
- XposedHelpers.callStaticMethod(findClass("com.android.systemui.SystemUICompat", lpparam.classLoader), "setTemporaryScreenBrightness", nextLevel);
- }
- } catch (Throwable ignore) {}
- Settings.System.putInt(resolver, Settings.System.SCREEN_BRIGHTNESS, nextLevel);
- if (MainModule.mPrefs.getBoolean("system_showpct") && mPct != null) {
- if (mPct.getVisibility() == View.GONE) {
- mPct.setVisibility(View.VISIBLE);
- mPct.animate().alpha(1.0f).setDuration(300).start();
- }
- int nextLevelGamma = nextLevel;
- if (isHLG && buCls != null)
- nextLevelGamma = (int)XposedHelpers.callStaticMethod(buCls, "convertLinearToGamma", nextLevel, minLevel, maxLevel);
- if ((int)mPct.getTag() == 2) mPct.setText(((nextLevelGamma * 100) / maxLevel) + "%");
- }
- } else if (opt == 3) {
- int sens = MainModule.mPrefs.getStringAsInt("system_statusbarcontrols_sens_vol", 2);
- if (Math.abs(delta) < metrics.widthPixels / ((sens == 1 ? 0.66f : (sens == 3 ? 1.66f : 1.0f)) * 20 * metrics.density)) return;
- tapStartX = event.getX();
- AudioManager audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
- audioManager.adjustVolume(delta > 0 ? AudioManager.ADJUST_RAISE : AudioManager.ADJUST_LOWER, 1 << 12 /* FLAG_FROM_KEY */ | AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_ALLOW_RINGER_MODES | AudioManager.FLAG_VIBRATE);
- }
- break;
- }
- }
- };
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "interceptTouchEvent", MotionEvent.class, hook);
- if (Helpers.is12())
- Helpers.findAndHookMethod("com.android.systemui.miui.statusbar.phone.ControlPanelWindowView", lpparam.classLoader, "onTouchEvent", MotionEvent.class, hook);
- }
-
- public static void ScreenshotConfigHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.systemui.screenshot.SaveImageInBackgroundTask", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- try {
- OutputStream mOutputStream = (OutputStream)XposedHelpers.getObjectField(param.thisObject, "mOutputStream");
- if (mOutputStream != null) mOutputStream.close();
- String filePath = (String)XposedHelpers.getObjectField(param.thisObject, "mImageFilePath");
- new File(filePath).delete();
- } catch (Throwable ignore) {}
-
- Context context = (Context)param.args[0];
- int folder = Integer.parseInt(Helpers.getSharedStringPref(context, "pref_key_system_screenshot_path", "1"));
- String dir = Helpers.getSharedStringPref(context, "pref_key_system_screenshot_mypath", "");
-
- File mScreenshotDir;
- if (folder > 1) {
- if (folder == 4 && !TextUtils.isEmpty(dir))
- mScreenshotDir = new File(dir);
- else
- mScreenshotDir = new File(Environment.getExternalStoragePublicDirectory(folder == 2 ? Environment.DIRECTORY_PICTURES : Environment.DIRECTORY_DCIM), "Screenshots");
- if (!mScreenshotDir.exists()) mScreenshotDir.mkdirs();
- } else {
- mScreenshotDir = (File)XposedHelpers.getObjectField(param.thisObject, "mScreenshotDir");
- }
-
- boolean hasTemp = false;
- String mTempImageFilePath = null;
- try {
- mTempImageFilePath = (String)XposedHelpers.getObjectField(param.thisObject, "mTempImageFilePath");
- hasTemp = true;
- } catch (Throwable ignore) {}
-
- String mImageFileName = (String)XposedHelpers.getObjectField(param.thisObject, "mImageFileName");
- String mImageFilePath = String.format("%s/%s", mScreenshotDir, mImageFileName);
- if (hasTemp) mTempImageFilePath = String.format("%s/%s", mScreenshotDir, "." + mImageFileName);
-
- int quality = Helpers.getSharedIntPref(context, "pref_key_system_screenshot_quality", 100);
- int format = Integer.parseInt(Helpers.getSharedStringPref(context, "pref_key_system_screenshot_format", "2"));
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mScreenshotQuality", quality);
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mScreenshotFormat", format);
- String ext = format <= 2 ? ".jpg" : (format == 3 ? ".png" : ".webp");
- mImageFileName = mImageFileName.replace(".png", "").replace(".jpg", "").replace(".webp", "") + ext;
- mImageFilePath = mImageFilePath.replace(".png", "").replace(".jpg", "").replace(".webp", "") + ext;
-
- XposedHelpers.setObjectField(param.thisObject, "mImageFileName", mImageFileName);
- XposedHelpers.setObjectField(param.thisObject, "mImageFilePath", mImageFilePath);
- Object mNotifyMediaStoreData = XposedHelpers.getObjectField(param.thisObject, "mNotifyMediaStoreData");
- XposedHelpers.setObjectField(mNotifyMediaStoreData, "imageFileName", mImageFileName);
- XposedHelpers.setObjectField(mNotifyMediaStoreData, "imageFilePath", mImageFilePath);
- if (hasTemp) {
- XposedHelpers.setObjectField(param.thisObject, "mTempImageFilePath", mTempImageFilePath);
- XposedHelpers.setObjectField(mNotifyMediaStoreData, "tempImageFilePath", mTempImageFilePath);
- }
- }
- });
-
- Helpers.hookAllMethods("com.android.systemui.screenshot.SaveImageInBackgroundTask", lpparam.classLoader, "doInBackground", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Object[] data = (Object[])param.args[0];
- if (data == null || data.length != 1) return;
- Bitmap image = (Bitmap)XposedHelpers.getObjectField(data[0], "image");
- if (image == null) return;
-
- int format = 2;
- int quality = 100;
- try {
- format = (int)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mScreenshotFormat");
- quality = (int)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mScreenshotQuality");
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- FileOutputStream mCustomOutputStream;
- try {
- String mTempImageFilePath = (String)XposedHelpers.getObjectField(param.thisObject, "mTempImageFilePath");
- File shot = new File(mTempImageFilePath);
- if (shot.exists()) shot.delete();
- mCustomOutputStream = new FileOutputStream(mTempImageFilePath);
- } catch (Throwable t) {
- String mImageFilePath = (String)XposedHelpers.getObjectField(param.thisObject, "mImageFilePath");
- File shot = new File(mImageFilePath);
- if (shot.exists()) shot.delete();
- mCustomOutputStream = new FileOutputStream(mImageFilePath);
- }
-
- Bitmap.CompressFormat compress = format <= 2 ? Bitmap.CompressFormat.JPEG : (format == 3 ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.WEBP);
- image.compress(compress, quality, mCustomOutputStream);
- mCustomOutputStream.flush();
- mCustomOutputStream.close();
-
- try {
- XposedHelpers.setObjectField(param.thisObject, "mOutputStream", new ByteArrayOutputStream());
- } catch (Throwable ignore) {}
- }
-
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// Object data = param.getResult();
-// if (data != null) XposedHelpers.setIntField(data, "result", 0);
-// }
- });
- }
-
- public static void NoNetworkSpeedSeparatorHook(LoadPackageParam lpparam) {
-// Helpers.hookAllMethods("com.android.systemui.statusbar.phone.StatusBarFactory", lpparam.classLoader, "getCollapsedStatusBarFragmentController", new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// Class> cls = XposedHelpers.findClass("com.android.systemui.statusbar.phone.StatusBarTypeController$CutoutType", lpparam.classLoader);
-// XposedBridge.log("new: " + cls.getEnumConstants()[3]);
-// param.args[0] = cls.getEnumConstants()[3];
-// }
-// });
-
- Helpers.hookAllConstructors("com.android.systemui.statusbar.NetworkSpeedSplitter", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ((TextView)param.thisObject).setText("");
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.statusbar.NetworkSpeedSplitter", lpparam.classLoader, "init", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ((TextView)param.thisObject).setText("");
- }
- });
- }
-
- public static void ToastTimeHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.notification.NotificationManagerService", lpparam.classLoader, "showNextToastLocked", new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.callMethod(param.thisObject, "getContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
- ArrayList mToastQueue = (ArrayList)XposedHelpers.getObjectField(param.thisObject, "mToastQueue");
- if (mContext == null || mHandler == null || mToastQueue == null || mToastQueue.size() == 0) return;
- int mod = (Helpers.getSharedIntPref(mContext, "pref_key_system_toasttime", 0) - 4) * 1000;
- for (Object record: mToastQueue)
- if (record != null && mHandler.hasMessages(2, record)) {
- mHandler.removeCallbacksAndMessages(record);
- int duration = XposedHelpers.getIntField(record, "duration");
- int delay = Math.max(1000, (duration == 1 ? 3500 : 2000) + mod);
- mHandler.sendMessageDelayed(Message.obtain(mHandler, 2, record), delay);
- }
- }
- });
-
- Helpers.findAndHookMethod("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "systemReady", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- new Helpers.SharedPrefObserver(mContext, mHandler, "pref_key_system_toasttime", 0) {
- @Override
- public void onChange(String name, int defValue) {
- MainModule.mPrefs.put(name, Helpers.getSharedIntPref(mContext, name, defValue));
- }
- };
- }
- });
-
- String windowClass = Helpers.isQPlus() ? "com.android.server.wm.DisplayPolicy" : "com.android.server.policy.PhoneWindowManager";
- Helpers.hookAllMethods(windowClass, lpparam.classLoader, "adjustWindowParamsLw", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- Object lp = param.args.length == 1 ? param.args[0] : param.args[1];
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mPrevHideTimeout", XposedHelpers.getLongField(lp, "hideTimeoutMilliseconds"));
- }
-
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Object lp = param.args.length == 1 ? param.args[0] : param.args[1];
- long mPrevHideTimeout = (long)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mPrevHideTimeout");
- long mHideTimeout = XposedHelpers.getLongField(lp, "hideTimeoutMilliseconds");
- if (mPrevHideTimeout == -1 || mHideTimeout == -1) return;
-
- long dur = 0;
- if (mPrevHideTimeout == 1000 || mPrevHideTimeout == 4000 || mPrevHideTimeout == 5000 || mPrevHideTimeout == 7000 || mPrevHideTimeout != mHideTimeout)
- dur = Math.max(1000, 3500 + (MainModule.mPrefs.getInt("system_toasttime", 0) - 4) * 1000);
- if (dur != 0) XposedHelpers.setLongField(lp, "hideTimeoutMilliseconds", dur);
- }
- });
- }
-
- public static void ClearAllTasksHook(LoadPackageParam lpparam) {
- String wpuClass = Helpers.isQPlus() ? "com.android.server.wm.WindowProcessUtils" : "com.android.server.am.ProcessUtils";
- Helpers.hookAllMethods(wpuClass, lpparam.classLoader, "getPerceptibleRecentAppList", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- param.setResult(null);
- }
- });
- }
-
- private static int hours3ResId;
- private static int hours4ResId;
- private static int hours5ResId;
- private static int hours6ResId;
- private static int hours8ResId;
- private static int hours10ResId;
- private static int hours12ResId;
- private static int foreverResId;
- public static void MoreSnoozeOptionsRes() {
- hours3ResId = MainModule.resHooks.addResource("time_3h", R.string.time_3h);
- hours4ResId = MainModule.resHooks.addResource("time_4h", R.string.time_4h);
- hours5ResId = MainModule.resHooks.addResource("time_5h", R.string.time_5h);
- hours6ResId = MainModule.resHooks.addResource("time_6h", R.string.time_6h);
- hours8ResId = MainModule.resHooks.addResource("time_8h", R.string.time_8h);
- hours10ResId = MainModule.resHooks.addResource("time_10h", R.string.time_10h);
- hours12ResId = MainModule.resHooks.addResource("time_12h", R.string.time_12h);
- foreverResId = MainModule.resHooks.addResource("time_forever", R.string.time_forever);
- }
-
- public static void MoreSnoozeOptionsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.NotificationSnooze", lpparam.classLoader, "getDefaultSnoozeOptions", new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void after(MethodHookParam param) throws Throwable {
- ArrayList options = (ArrayList)param.getResult();
- if (options == null) return;
- options.add(XposedHelpers.callMethod(param.thisObject, "createOption", hours3ResId, 180));
- options.add(XposedHelpers.callMethod(param.thisObject, "createOption", hours4ResId, 240));
- options.add(XposedHelpers.callMethod(param.thisObject, "createOption", hours5ResId, 300));
- options.add(XposedHelpers.callMethod(param.thisObject, "createOption", hours6ResId, 360));
- options.add(XposedHelpers.callMethod(param.thisObject, "createOption", hours8ResId, 480));
- options.add(XposedHelpers.callMethod(param.thisObject, "createOption", hours10ResId, 600));
- options.add(XposedHelpers.callMethod(param.thisObject, "createOption", hours12ResId, 720));
- options.add(XposedHelpers.callMethod(param.thisObject, "createOption", foreverResId, 1024));
- }
- });
-
- if (Helpers.is12())
- Helpers.findAndHookMethod("com.android.systemui.statusbar.NotificationSnooze", lpparam.classLoader, "createOptionViews", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- LinearLayout mSnoozeOptionContainer = (LinearLayout)XposedHelpers.getObjectField(param.thisObject, "mSnoozeOptionContainer");
- ViewGroup parent = ((ViewGroup)mSnoozeOptionContainer.getParent());
- if (parent.getClass() == ScrollView.class) return;
- parent.removeView(mSnoozeOptionContainer);
- HorizontalScrollView scrollView = new HorizontalScrollView(mSnoozeOptionContainer.getContext());
- scrollView.setOverScrollMode(View.OVER_SCROLL_NEVER);
- scrollView.setVerticalScrollBarEnabled(false);
- scrollView.setHorizontalScrollBarEnabled(false);
- scrollView.addView(mSnoozeOptionContainer);
- parent.addView(scrollView);
- ViewGroup.LayoutParams lp1 = scrollView.getLayoutParams();
- lp1.width = ViewGroup.LayoutParams.MATCH_PARENT;
- lp1.height = ViewGroup.LayoutParams.WRAP_CONTENT;
- scrollView.setLayoutParams(lp1);
- ViewGroup.MarginLayoutParams lp2 = (ViewGroup.MarginLayoutParams)mSnoozeOptionContainer.getLayoutParams();
- lp2.setMarginStart(0);
- lp2.width = ViewGroup.LayoutParams.MATCH_PARENT;
- lp2.height = ViewGroup.LayoutParams.WRAP_CONTENT;
- mSnoozeOptionContainer.setLayoutParams(lp2);
- }
- });
- }
-
- public static void MoreSnoozeOptionsServiceHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.notification.SnoozeHelper", lpparam.classLoader, "scheduleRepost", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if ((long)param.args[3] == 1024 * 60000) param.setResult(null);
- }
- @Override
- @SuppressWarnings("unchecked")
- protected void after(MethodHookParam param) throws Throwable {
- if ((long)param.args[3] == 1024 * 60000) return;
- ArrayMap mSnoozedNotificationDelays = (ArrayMap)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mSnoozedNotificationDelays");
- if (mSnoozedNotificationDelays == null) mSnoozedNotificationDelays = new ArrayMap();
- mSnoozedNotificationDelays.put((String)param.args[1], currentTimeMillis() + (long)param.args[3]);
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mSnoozedNotificationDelays", mSnoozedNotificationDelays);
- }
- });
-
- Helpers.findAndHookMethod("com.android.server.notification.SnoozeHelper", lpparam.classLoader, "repost", String.class, int.class, new MethodHook() {
- @Override
- @SuppressWarnings({"unchecked", "SuspiciousMethodCalls"})
- protected void after(MethodHookParam param) throws Throwable {
- ArrayMap mSnoozedNotificationDelays = (ArrayMap)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mSnoozedNotificationDelays");
- if (mSnoozedNotificationDelays != null) mSnoozedNotificationDelays.remove(param.args[0]);
- }
- });
-
- Helpers.hookAllConstructors("com.android.server.notification.SnoozeHelper", lpparam.classLoader, new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void after(MethodHookParam param) throws Throwable {
- IntentFilter filter = new IntentFilter();
- filter.addAction(ACTION_PREFIX + "GetSnoozedNotifications");
- filter.addAction(ACTION_PREFIX + "UnsnoozeNotification");
- filter.addAction(ACTION_PREFIX + "CancelNotification");
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- mContext.registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- ArrayMap>> mSnoozedNotifications = (ArrayMap>>)XposedHelpers.getObjectField(param.thisObject, "mSnoozedNotifications");
- ArrayMap mSnoozedNotificationDelays = (ArrayMap)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mSnoozedNotificationDelays");
-
- if (action.equals(ACTION_PREFIX + "CancelNotification")) try {
- ArrayMap> packages = mSnoozedNotifications.get(intent.getIntExtra("user", 0));
- if (packages == null) return;
- ArrayMap notificatios = packages.get(intent.getStringExtra("package"));
- if (notificatios == null) return;
- if (notificatios.containsKey(intent.getStringExtra("key")))
- XposedHelpers.setBooleanField(notificatios.get(intent.getStringExtra("key")), "isCanceled", intent.getBooleanExtra("canceled", false));
- return;
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- if (action.equals(ACTION_PREFIX + "UnsnoozeNotification")) try {
- XposedHelpers.callMethod(param.thisObject, "repost", intent.getStringExtra("key"), intent.getIntExtra("user", 0));
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- try {
- Bundle notifications = new Bundle();
- int user;
- String pkg;
- for (int i = 0; i < mSnoozedNotifications.size(); i++ ) {
- user = mSnoozedNotifications.keyAt(i);
- ArrayMap> mSnoozedNotification = mSnoozedNotifications.get(mSnoozedNotifications.keyAt(i));
- for (int j = 0; j < mSnoozedNotification.size(); j++ ) {
- pkg = mSnoozedNotification.keyAt(j);
- ArrayMap mSnoozed = mSnoozedNotification.get(mSnoozedNotification.keyAt(j));
- for (int k = 0; k < mSnoozed.size(); k++) {
- String key = mSnoozed.keyAt(k);
- Bundle notif = new Bundle();
- notif.putInt("user", user);
- notif.putString("package", pkg);
- notif.putString("key", key);
- Object record = mSnoozed.get(key);
- notif.putBoolean("canceled", XposedHelpers.getBooleanField(record, "isCanceled"));
- notif.putLong("created", XposedHelpers.getLongField(record, "mCreationTimeMs"));
- notif.putLong("updated", XposedHelpers.getLongField(record, "mUpdateTimeMs"));
- if (mSnoozedNotificationDelays != null && mSnoozedNotificationDelays.get(key) != null)
- notif.putLong("reposted", mSnoozedNotificationDelays.get(key));
- Object sbn = XposedHelpers.getObjectField(record, "sbn");
- Notification notification = (Notification)XposedHelpers.getObjectField(sbn, "notification");
- if (notification != null) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
- notif.putString("channel", notification.getChannelId());
- notif.putInt("color", notification.color);
- if (notification.getLargeIcon() != null)
- notif.putParcelable("icon", notification.getLargeIcon());
- if (notification.extras != null) {
- notif.putString("title", notification.extras.getCharSequence(Notification.EXTRA_TITLE).toString());
- CharSequence text = notification.extras.getCharSequence(Notification.EXTRA_BIG_TEXT, null);
- if (text == null || "" == text) text = notification.extras.getCharSequence(Notification.EXTRA_TEXT, null);
- if (text != null && "" != text) {
- String[] lines = text.toString().split("\\n");
- notif.putString("text", lines[0] + (lines.length == 1 ? "" : "..."));
- }
- Parcelable[] messages = notification.extras.getParcelableArray(Notification.EXTRA_MESSAGES);
- if (messages != null) notif.putInt("messages", messages.length);
- }
- }
- notifications.putBundle(mSnoozed.keyAt(k), notif);
- }
- }
- }
- Intent snoozedIntent = new Intent(GlobalActions.EVENT_PREFIX + "UpdateSnoozedNotifications");
- snoozedIntent.setPackage(Helpers.modulePkg);
- snoozedIntent.putExtras(notifications);
- mContext.sendBroadcast(snoozedIntent);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- }, filter);
- }
- });
- }
-
- public static void InactiveBrightnessSliderHook(LoadPackageParam lpparam) {
- MethodHook hook = new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- int opt = MainModule.mPrefs.getStringAsInt("system_inactivebrightness", 1);
- if (opt == 2) {
- SeekBar mSlider = (SeekBar)XposedHelpers.getObjectField(param.thisObject, "mSlider");
- if (mSlider != null)
- mSlider.setOnTouchListener(new View.OnTouchListener(){
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- return true;
- }
- });
- } else if (opt == 3) try {
- View sliderView = (View)param.thisObject;
- ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)sliderView.getLayoutParams();
- lp.height = 0;
- lp.topMargin = Math.round(2 * sliderView.getResources().getDisplayMetrics().density);
- lp.bottomMargin = 0;
- sliderView.setLayoutParams(lp);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- Helpers.findAndHookMethod("com.android.systemui.settings.ToggleSliderView", lpparam.classLoader, "onAttachedToWindow", hook);
- if (Helpers.is12())
- Helpers.findAndHookMethod("com.android.systemui.miui.controlcenter.QCToggleSliderView", lpparam.classLoader, "onAttachedToWindow", hook);
- }
-
- private static final float[] startPos = new float[2];
- private static void processLSEvent(MethodHookParam param) {
- MotionEvent event = (MotionEvent)param.args[0];
- if (event.getPointerCount() > 1) return;
- int action = event.getActionMasked();
- if (action != MotionEvent.ACTION_DOWN && action != MotionEvent.ACTION_UP) return;
-
- ViewGroup mKeyguardBottomArea = (ViewGroup)XposedHelpers.getObjectField(param.thisObject, "mKeyguardBottomArea");
- if (mKeyguardBottomArea == null) return;
- ViewGroup mIndicationArea = (ViewGroup)XposedHelpers.getObjectField(mKeyguardBottomArea, "mIndicationArea");
- if (!Helpers.isReallyVisible(mIndicationArea)) return;
-
- int[] coord = new int[2];
- mIndicationArea.getLocationOnScreen(coord);
- Rect rect = new Rect(coord[0], coord[1], coord[0] + mIndicationArea.getWidth(), coord[1] + mIndicationArea.getHeight());
- if (!rect.contains((int)event.getX(), (int)event.getY())) return;
-
- if (action == MotionEvent.ACTION_DOWN) {
- startPos[0] = event.getX();
- startPos[1] = event.getY();
- } else if (action == MotionEvent.ACTION_UP) try {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- int slop = ViewConfiguration.get(mContext).getScaledTouchSlop();
- if (Math.abs(event.getX() - startPos[0]) > slop || Math.abs(event.getY() - startPos[1]) > slop) return;
- Object mStatusBar = XposedHelpers.getObjectField(param.thisObject, "mStatusBar");
- XposedHelpers.callMethod(mStatusBar, "showBouncer");
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
-
- public static void TapToUnlockHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "onTouchEvent", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- processLSEvent(param);
- }
- });
-
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.NotificationPanelView", lpparam.classLoader, "onInterceptTouchEvent", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- processLSEvent(param);
- }
- });
- }
-
- public static void NoSafeVolumeWarningRes() {
- MainModule.resHooks.setObjectReplacement("android", "bool", "config_safe_media_volume_enabled", false);
- MainModule.resHooks.setObjectReplacement("android", "bool", "config_safe_media_disable_on_volume_up", false);
- }
-
- public static void NoLowBatteryWarningHook() {
- Helpers.hookAllMethods(Settings.System.class, "getIntForUser", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- String key = (String)param.args[1];
- if ("low_battery_dialog_disabled".equals(key)) param.setResult(1);
- }
- });
- }
-
- public static void TempHideOverlayHook() {
- Helpers.hookAllMethods("android.view.WindowManagerGlobal", null, "addView", new MethodHook() {
- @Override
- @SuppressWarnings("ConstantConditions")
- protected void after(final MethodHookParam param) throws Throwable {
- if (param.args[0] == null || !(param.args[1] instanceof WindowManager.LayoutParams) || param.getThrowable() != null) return;
- WindowManager.LayoutParams params = (WindowManager.LayoutParams)param.args[1];
- final View view = (View)param.args[0];
- if (params.type != WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY && params.type != WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) return;
-
- XposedHelpers.setAdditionalInstanceField(view, "mSavedVisibility", view.getVisibility());
- view.getContext().registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (view == null) return;
- boolean state = intent.getBooleanExtra("IsFinished", true);
- if (state) {
- view.setVisibility((int)XposedHelpers.getAdditionalInstanceField(view, "mSavedVisibility"));
- } else if (view.getVisibility() != View.GONE) {
- XposedHelpers.setAdditionalInstanceField(view, "mSavedVisibility", view.getVisibility());
- view.setVisibility(View.GONE);
- }
- }
- }, new IntentFilter("miui.intent.TAKE_SCREENSHOT"));
- }
- });
- }
-
- public static void ScreenshotFloatTimeHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.screenshot.GlobalScreenshot", lpparam.classLoader, "startGotoThumbnailAnimation", Runnable.class, new MethodHook() {
- @Override
- @SuppressWarnings("ConstantConditions")
- protected void after(MethodHookParam param) throws Throwable {
- boolean mIsShowLongScreenShotGuide = false;
- try {
- mIsShowLongScreenShotGuide = XposedHelpers.getBooleanField(param.thisObject, "mIsShowLongScreenShotGuide");
- } catch (Throwable ignore) {}
- if (mIsShowLongScreenShotGuide) return;
- int opt = MainModule.mPrefs.getInt("system_screenshot_floattime", 0);
- if (opt <= 0) return;
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
- Runnable mQuitThumbnailRunnable = (Runnable)XposedHelpers.getObjectField(param.thisObject, "mQuitThumbnailRunnable");
- mHandler.removeCallbacks(mQuitThumbnailRunnable);
- mHandler.postDelayed(mQuitThumbnailRunnable, opt * 1000L);
- }
- });
- }
-
- public static void ScrambleAppLockPINHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.miui.applicationlock.widget.MiuiNumericInputView", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- LinearLayout keys = (LinearLayout)param.thisObject;
- ArrayList mRandomViews = new ArrayList();
- View bottom0 = null; View bottom2 = null;
- for (int row = 0; row <= 3; row++) {
- ViewGroup cols = (ViewGroup)keys.getChildAt(row);
- for (int col = 0; col <= 2; col++) {
- if (row == 3)
- if (col == 0) {
- bottom0 = cols.getChildAt(col);
- continue;
- } else if (col == 2) {
- bottom2 = cols.getChildAt(col);
- continue;
- }
- mRandomViews.add(cols.getChildAt(col));
- }
- cols.removeAllViews();
- }
-
- Collections.shuffle(mRandomViews);
-
- int cnt = 0;
- for (int row = 0; row <= 3; row++)
- for (int col = 0; col <= 2; col++) {
- ViewGroup cols = (ViewGroup)keys.getChildAt(row);
- if (row == 3)
- if (col == 0) {
- cols.addView(bottom0);
- continue;
- } else if (col == 2) {
- cols.addView(bottom2);
- continue;
- }
- cols.addView(mRandomViews.get(cnt));
- cnt++;
- }
- }
- });
- }
-
- public static void ChargingInfoServiceHook(LoadPackageParam lpparam) {
- if (!Helpers.hookAllMethodsSilently("com.android.server.BatteryService$BatteryPropertiesRegistrar", lpparam.classLoader, "getProperty", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- int req = (int)param.args[0];
- if (req < 1000) return;
- long value = Long.MIN_VALUE;
- if (req == 1001)
- value = XposedHelpers.getIntField(XposedHelpers.getSurroundingThis(param.thisObject), "mLastBatteryVoltage");
- else if (req == 1002)
- value = XposedHelpers.getIntField(XposedHelpers.getSurroundingThis(param.thisObject), "mLastBatteryTemperature");
- else if (req == 1003)
- value = XposedHelpers.getIntField(XposedHelpers.getSurroundingThis(param.thisObject), "mLastBatteryHealth");
- XposedHelpers.callMethod(param.args[1], "setLong", value);
- param.setResult(0);
- }
- })) Helpers.findAndHookMethod("com.android.server.BatteryService", lpparam.classLoader, "processValuesLocked", boolean.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- try {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- ContentResolver provider = mContext.getContentResolver();
- Settings.Global.putInt(provider, Helpers.modulePkg + ".battery.voltage", XposedHelpers.getIntField(param.thisObject, "mLastBatteryVoltage"));
- Settings.Global.putInt(provider, Helpers.modulePkg + ".battery.temperature", XposedHelpers.getIntField(param.thisObject, "mLastBatteryTemperature"));
- Settings.Global.putInt(provider, Helpers.modulePkg + ".battery.health", XposedHelpers.getIntField(param.thisObject, "mLastBatteryHealth"));
- } catch (Throwable ignore) {}
- }
- });
- }
-
- public static void ChargingInfoHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.keyguard.KeyguardUpdateMonitor", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)param.args[0];
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- new Helpers.SharedPrefObserver(mContext, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String type = uri.getPathSegments().get(1);
- String key = uri.getPathSegments().get(2);
- if (!key.contains("pref_key_system_charginginfo_")) return;
-
- switch (type) {
- case "string":
- MainModule.mPrefs.put(key, Helpers.getSharedStringPref(mContext, key, ""));
- break;
- case "integer":
- MainModule.mPrefs.put(key, Helpers.getSharedIntPref(mContext, key, 1));
- break;
- case "boolean":
- MainModule.mPrefs.put(key, Helpers.getSharedBoolPref(mContext, key, false));
- break;
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.hookAllMethods("com.android.keyguard.charge.ChargeUtils", lpparam.classLoader, "getChargingHintText", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context context = (Context)param.args[0];
- int charge = (int)param.args[2];
- String hint = (String)param.getResult();
- String PROVIDER_POWER_CENTER = (String)XposedHelpers.getStaticObjectField(findClass("com.android.keyguard.charge.ChargeUtils", lpparam.classLoader), "PROVIDER_POWER_CENTER");
-
- Bundle bundle = null;
- try {
- bundle = context.getContentResolver().call(Uri.parse(PROVIDER_POWER_CENTER), "getBatteryCurrent", null, null);
- } catch (Exception ignore) {}
-
- if (bundle != null && charge < 100) {
- boolean showCurr = MainModule.mPrefs.getBoolean("system_charginginfo_current");
- boolean showVolt = MainModule.mPrefs.getBoolean("system_charginginfo_voltage");
- boolean showWatt = MainModule.mPrefs.getBoolean("system_charginginfo_wattage");
- boolean showTemp = MainModule.mPrefs.getBoolean("system_charginginfo_temp");
-
- ArrayList values = new ArrayList<>();
- BatteryManager btrMgr = (BatteryManager)context.getSystemService(Context.BATTERY_SERVICE);
- int currVal = Math.abs(bundle.getInt("current_now"));
- long voltVal = btrMgr.getLongProperty(1001);
- if (voltVal == Long.MIN_VALUE) voltVal = Settings.Global.getInt(context.getContentResolver(), Helpers.modulePkg + ".battery.voltage", 0);
- if (voltVal == Long.MIN_VALUE) voltVal = 0;
- long tempVal = btrMgr.getLongProperty(1002);
- if (tempVal == Long.MIN_VALUE) tempVal = Settings.Global.getInt(context.getContentResolver(), Helpers.modulePkg + ".battery.temperature", 0);
- if (tempVal == Long.MIN_VALUE) tempVal = 0;
-
- if (showCurr) values.add(currVal + " mA");
- if (showVolt) values.add(String.format(Locale.getDefault(), "%.1f", voltVal / 1000f) + " V");
- if (showWatt) values.add(String.format(Locale.getDefault(), "%.1f", voltVal / 1000f * currVal / 1000f) + " W");
- if (showTemp) values.add(Math.round(tempVal / 10f) + " °C");
- if (values.size() == 0) return;
- String info = TextUtils.join(" · ", values);
-
- int opt = MainModule.mPrefs.getStringAsInt("system_charginginfo_view", 1);
- if (opt == 1)
- param.setResult(hint + "\n" + info);
- else if (opt == 2)
- param.setResult(hint + " · " + info);
- else if (opt == 3)
- param.setResult(info + " · " + hint);
- }
- }
- });
-
- Helpers.hookAllConstructors("com.android.systemui.statusbar.phone.KeyguardIndicationTextView", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- int opt = MainModule.mPrefs.getStringAsInt("system_charginginfo_view", 1);
- if (opt != 1) return;
- TextView indicator = (TextView)param.thisObject;
- if (indicator != null) indicator.setSingleLine(false);
- }
- });
- }
-
- public static void UseNativeRecentsHook(LoadPackageParam lpparam) {
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("com.android.systemui.recents.misc.SystemServicesProxy", lpparam.classLoader, "isRecentsWithinLauncher", Context.class, XC_MethodReplacement.returnConstant(false));
- }
-
- public static void UseNativeRecentsFixHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.wm.TaskRecord", lpparam.classLoader, "isVisible", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if ((boolean)param.getResult()) return;
- StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
- for (StackTraceElement el: stackTrace)
- if (el != null) if ("getPerceptibleRecentAppList".equals(el.getMethodName())) {
- param.setResult(true);
- return;
- }
- }
- });
- }
-
- public static void NoUnlockAnimationHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.miui.ActivityObserverImpl", lpparam.classLoader, "isTopActivityLauncher", XC_MethodReplacement.returnConstant(false));
- }
-
- public static void NoSOSHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.keyguard.EmergencyButton", lpparam.classLoader, "updateEmergencyCallButton", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Button mSOS = (Button)param.thisObject;
- if (mSOS.getVisibility() == View.VISIBLE) mSOS.setEnabled(false);
- }
- });
- }
-
- public static void NoDarkForceHook(LoadPackageParam lpparam) {
- MethodHook hook = new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ContentResolver contentResolver = ((Context)XposedHelpers.callMethod(param.thisObject, "getContext")).getContentResolver();
- XposedHelpers.callStaticMethod(Settings.System.class, "putIntForUser", contentResolver, "smart_dark_enable", 0, XposedHelpers.callStaticMethod(UserHandle.class, "getCallingUserId"));
- XposedHelpers.callStaticMethod(XposedHelpers.findClassIfExists("android.os.SystemProperties", lpparam.classLoader), "set", "debug.hwui.force_dark", "false");
- }
- };
- Helpers.findAndHookMethod("com.android.server.UiModeManagerService", lpparam.classLoader, "setForceDark", Context.class, hook);
- Helpers.findAndHookMethod("com.android.server.UiModeManagerService", lpparam.classLoader, "setDarkProp", int.class, int.class, hook);
- }
-
- public static void MaxNotificationIconsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.NotificationIconContainer", lpparam.classLoader, "getMaxIconCount", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- int opt = MainModule.mPrefs.getStringAsInt("system_maxsbicons", 0);
- param.setResult(opt == -1 ? 9999 : opt);
- }
- });
-
-// Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.NotificationIconContainer", lpparam.classLoader, "calculateIconTranslations", new MethodHook() {
-// @Override
-// @SuppressWarnings("unchecked")
-// protected void after(MethodHookParam param) throws Throwable {
-// HashMap mIconStates = (HashMap)XposedHelpers.getObjectField(param.thisObject, "mIconStates");
-// if (mIconStates.size() == 0) return;
-// int opt = MainModule.mPrefs.getStringAsInt("system_maxsbicons", 0);
-// ViewGroup container = (ViewGroup)param.thisObject;
-// for (int i = 0; i < container.getChildCount(); i++)
-// if (opt == -1 || i < opt) {
-// Object mIconState = mIconStates.get(container.getChildAt(i));
-// if (mIconState == null) continue;
-// XposedHelpers.setIntField(mIconState, "visibleState", 0);
-// XposedHelpers.setFloatField(mIconState, "iconAppearAmount", 1.0f);
-// XposedHelpers.setFloatField(mIconState, "xTranslation", (float)XposedHelpers.callMethod(param.thisObject, "getActualPaddingStart"));
-// }
-// }
-// });
-
-// for (Member method: Math.class.getMethods())
-// if (method.getName().equals("min")) Helpers.log("min method found! " + method);
-
-// Set unhooks = XposedBridge.hookAllMethods(Math.class, "min", new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// Helpers.log("Math.min: " + param.args[1].getClass().getSimpleName() + ", " + param.args[1]);
-// }
-// });
-// Helpers.log("unhooks: " + unhooks.size());
- }
-
- public static void MoreNotificationsHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.NotificationData", lpparam.classLoader, "shouldRemove", new MethodHook() {
- @Override
- @SuppressWarnings({"unchecked", "SynchronizationOnLocalVariableOrMethodParameter"})
- protected void before(MethodHookParam param) throws Throwable {
- if (param.args[1] == null) return;
- ArrayMap mEntries = (ArrayMap)XposedHelpers.getObjectField(param.thisObject, "mEntries");
- if (mEntries == null) return;
- Object notification;
- String pkgName;
- String srcPkgName = (String)XposedHelpers.callMethod(XposedHelpers.getObjectField(param.args[1], "notification"), "getPackageName");
- int cnt = 0;
- synchronized (mEntries) {
- for (int i = 0; i < mEntries.size(); i++) {
- notification = XposedHelpers.getObjectField(mEntries.valueAt(i), "notification");
- if (notification == null) continue;
- pkgName = (String)XposedHelpers.callMethod(notification, "getPackageName");
- if (pkgName.equals(srcPkgName)) cnt++;
- }
- }
- if (cnt < 24) param.setResult(null);
- }
- });
- }
-
- public static void VolumeDialogDNDSwitchHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.miui.volume.MiuiRingerModeLayout.RingerButtonHelper", lpparam.classLoader, "updateState", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- boolean mExpanded = XposedHelpers.getBooleanField(param.thisObject, "mExpanded");
- if (mExpanded) return;
- View mStandardView = (View)XposedHelpers.getObjectField(param.thisObject, "mStandardView");
- View mDndView = (View)XposedHelpers.getObjectField(param.thisObject, "mDndView");
- if (mStandardView != null) mStandardView.setVisibility(View.GONE);
- if (mDndView != null) mDndView.setVisibility(View.VISIBLE);
- }
- });
- }
-
- public static void NoMediaMuteInDNDHook() {
- Helpers.hookAllMethods("android.media.AudioServiceInjector", null, "handleZenModeChangedForMusic", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if ((int)param.args[2] == 1 || (int)param.args[3] == 1) param.setResult(null);
- }
- });
- }
-
- public static void VolumeDialogAutohideDelayHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.miui.volume.MiuiVolumeDialogImpl", lpparam.classLoader, "computeTimeoutH", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- boolean mHovering = XposedHelpers.getBooleanField(param.thisObject, "mHovering");
- if (mHovering) {
- param.setResult(16000);
- return;
- }
- Object mSafetyWarning = XposedHelpers.getObjectField(param.thisObject, "mSafetyWarning");
- if (mSafetyWarning != null) {
- int opt = MainModule.mPrefs.getInt("system_volumedialogdelay_expanded", 0);
- param.setResult(opt > 0 ? opt : 5000);
- return;
- }
- boolean mExpanded = XposedHelpers.getBooleanField(param.thisObject, "mExpanded");
- int opt = MainModule.mPrefs.getInt(mExpanded ? "system_volumedialogdelay_expanded" : "system_volumedialogdelay_collapsed", 0);
- if (opt > 0) param.setResult(opt);
- }
- });
- }
-
- public static ArrayList mLastPlayedSounds = new ArrayList();
-
- public static void AudioSilencerServiceHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.policy.PhoneWindowManager", lpparam.classLoader, "init", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- IntentFilter filter = new IntentFilter();
- filter.addAction(ACTION_PREFIX + "SavePlayedSound");
- filter.addAction(ACTION_PREFIX + "FetchPlayedSounds");
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- mContext.registerReceiver(new BroadcastReceiver() {
- public void onReceive(final Context context, Intent intent) {
- String action = intent.getAction();
- if (action != null) try {
- if (action.equals(ACTION_PREFIX + "SavePlayedSound")) {
- SoundData data = intent.getParcelableExtra("data");
- mLastPlayedSounds.add(0, data);
- if (mLastPlayedSounds.size() > 10)
- mLastPlayedSounds = new ArrayList(mLastPlayedSounds.subList(0, 10));
- } else if (action.equals(ACTION_PREFIX + "FetchPlayedSounds")) {
- Intent soundsIntent = new Intent(GlobalActions.EVENT_PREFIX + "FetchPlayedSoundsData");
- soundsIntent.putParcelableArrayListExtra("sounds", mLastPlayedSounds);
- soundsIntent.setPackage(Helpers.modulePkg);
- mContext.sendBroadcast(soundsIntent);
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- }, filter);
- }
- });
- }
-
- public static void SavePlayedSound(Context context, SoundData data) {
- Intent saveSoundIntent = new Intent(ACTION_PREFIX + "SavePlayedSound");
- saveSoundIntent.putExtra("data", data);
- saveSoundIntent.setPackage("android");
- context.sendBroadcast(saveSoundIntent);
- }
-
- @SuppressWarnings({"unchecked"})
- public static void AudioSilencerHook() {
- Helpers.hookAllConstructors(SoundPool.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (XposedHelpers.getAdditionalInstanceField(param.thisObject, "mSourceSoundData") == null) {
- SparseArray mSourceSoundData = new SparseArray();
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mSourceSoundData", mSourceSoundData);
- }
- }
- });
-
- Helpers.hookAllMethods(SoundPool.class, "load", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- SparseArray mSourceSoundData = (SparseArray)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mSourceSoundData");
- Context callerContext = Helpers.findContext();
- if (callerContext == null) return;
- String caller = callerContext.getPackageName();
- if (param.args[0] instanceof Context) {
- Context mContext = (Context)param.args[0];
- mSourceSoundData.put((int)param.getResult(), new SoundData(caller, "resource", mContext.getResources().getResourceName((int)param.args[1])));
- } else if (param.args[0] instanceof String) {
- mSourceSoundData.put((int)param.getResult(), new SoundData(caller, "file", (String)param.args[0]));
- }
- }
- });
-
- Helpers.hookAllMethods(SoundPool.class, "play", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- SparseArray mSourceSoundData = (SparseArray)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mSourceSoundData");
- if (mSourceSoundData != null) {
- Context mContext = Helpers.findContext();
- if (mContext == null) return;
- SoundData data = mSourceSoundData.get((Integer)param.args[0]);
- SavePlayedSound(mContext, data);
- Set silencedSounds = Helpers.getSharedStringSetPref(mContext, "pref_key_system_audiosilencer_sounds");
- if (silencedSounds.contains(data.toPref())) param.setResult(null);
- }
- }
- });
-
- Helpers.hookAllMethods(MediaPlayer.class, "setDataSource", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- if (Modifier.isPrivate(param.method.getModifiers())) return;
- Context callerContext = Helpers.findContext();
- if (callerContext == null) return;
- String caller = callerContext.getPackageName();
- SoundData soundData = null;
- if (param.args.length > 1 && param.args[0] instanceof Context && param.args[1] instanceof Uri)
- soundData = new SoundData(caller, "uri", ((Uri)param.args[1]).getPath());
- else if (param.args[0] instanceof String)
- soundData = new SoundData(caller, "file", (String)param.args[0]);
- if (soundData != null)
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mSourceSoundData", soundData);
- }
- });
-
- Helpers.hookAllMethods(MediaPlayer.class, "start", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- SoundData mSourceSoundData = (SoundData)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mSourceSoundData");
- if (mSourceSoundData != null) {
- Context mContext = Helpers.findContext();
- if (mContext == null) return;
- SavePlayedSound(mContext, mSourceSoundData);
- Set silencedSounds = Helpers.getSharedStringSetPref(mContext, "pref_key_system_audiosilencer_sounds");
- if (silencedSounds.contains(mSourceSoundData.toPref())) param.setResult(null);
- }
- }
- });
- }
-
- public static void BetterPopupsAllowFloatHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.systemui.miui.statusbar.policy.AppMiniWindowManager", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
-
- new Helpers.SharedPrefObserver(mContext, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String key = uri.getPathSegments().get(2);
- if (key.contains("pref_key_system_betterpopups_allowfloat_apps"))
- MainModule.mPrefs.put(key, Helpers.getSharedStringSetPref(mContext, key));
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.findAndHookMethod("com.android.systemui.miui.statusbar.policy.AppMiniWindowManager", lpparam.classLoader, "canNotificationSlide", Context.class, "com.android.systemui.miui.statusbar.ExpandedNotification", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Object notification = XposedHelpers.callMethod(param.args[1], "getNotification");
- PendingIntent intent = (PendingIntent)XposedHelpers.callMethod(param.thisObject, "getIntent", notification);
- if (intent == null) return;
- Set selectedApps = MainModule.mPrefs.getStringSet("system_betterpopups_allowfloat_apps");
- Set selectedAppsBlack = MainModule.mPrefs.getStringSet("system_betterpopups_allowfloat_apps_black");
- if (selectedApps.contains(intent.getCreatorPackage())) param.setResult(true);
- else if (selectedAppsBlack.contains(intent.getCreatorPackage())) param.setResult(false);
- }
- });
- }
-
- public static void NoFloatingWindowBlacklistHook() {
- MethodHook clearHook = new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void after(MethodHookParam param) throws Throwable {
- List blackList = (List)param.getResult();
- if (blackList != null) blackList.clear();
- param.setResult(blackList);
- }
- };
- Helpers.findAndHookMethod("android.util.MiuiMultiWindowAdapter", null, "getFreeformBlackList", clearHook);
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently("android.util.MiuiMultiWindowAdapter", null, "getFreeformBlackListFromCloud", Context.class, clearHook);
- // Unlock on all devices
- Helpers.findAndHookMethod("android.util.MiuiMultiWindowUtils", null, "supportFreeform", XC_MethodReplacement.returnConstant(true));
- }
-
- public static ConcurrentHashMap> fwApps = new ConcurrentHashMap>();
-
- public static String getTaskPackageName(Object thisObject, int taskId) {
- return getTaskPackageName(thisObject, taskId, false, null);
- }
-
- public static String getTaskPackageName(Object thisObject, int taskId, ActivityOptions options) {
- return getTaskPackageName(thisObject, taskId, true, options);
- }
-
- public static String getTaskPackageName(Object thisObject, int taskId, boolean withOptions, ActivityOptions options) {
- Object mRootActivityContainer = XposedHelpers.getObjectField(thisObject, "mRootActivityContainer");
- if (mRootActivityContainer == null) return null;
- Object task = withOptions ?
- XposedHelpers.callMethod(mRootActivityContainer, "anyTaskForId", taskId, 2, options, true) :
- XposedHelpers.callMethod(mRootActivityContainer, "anyTaskForId", taskId, 0);
- if (task == null) return null;
- Intent intent = (Intent)XposedHelpers.getObjectField(task, "intent");
- return intent == null ? null : intent.getComponent().getPackageName();
- }
-
- public static String serializeFwApps() {
- StringBuilder data = new StringBuilder();
- for (Map.Entry> entry: fwApps.entrySet()) {
- Pair val = entry.getValue();
- data.append(entry.getKey());
- data.append(":");
- data.append(val.first);
- data.append(":");
- data.append(val.second == null ? "-" : val.second.flattenToString());
- data.append("|");
- }
- return data.toString().replaceFirst("\\|$", "");
- }
-
- public static void unserializeFwApps(String data) {
- fwApps.clear();
- if (data == null || "".equals(data)) return;
- String[] dataArr = data.split("\\|");
- for (String appData: dataArr) {
- if ("".equals(appData)) continue;
- String[] appDataArr = appData.split(":");
- fwApps.put(appDataArr[0], new Pair(Float.parseFloat(appDataArr[1]), "-".equals(appDataArr[2]) ? null : Rect.unflattenFromString(appDataArr[2])));
- }
- }
-
- public static void storeFwAppsInSetting(Context context) {
- Settings.Global.putString(context.getContentResolver(), Helpers.modulePkg + ".fw.apps", serializeFwApps());
- }
-
- public static void restoreFwAppsInSetting(Context context) {
- unserializeFwApps(Settings.Global.getString(context.getContentResolver(), Helpers.modulePkg + ".fw.apps"));
- }
-
- public static void StickyFloatingWindowsHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.wm.ActivityStarterInjector", lpparam.classLoader, "modifyLaunchActivityOptionIfNeed", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (param.args.length != 8) return;
- Intent intent = (Intent)param.args[5];
- if (intent == null || intent.getComponent() == null) return;
- ActivityOptions options = (ActivityOptions)param.getResult();
- int windowingMode = options == null ? -1 : (int)XposedHelpers.callMethod(options, "getLaunchWindowingMode");
- String pkgName = intent.getComponent().getPackageName();
- if (windowingMode != 5 && fwApps.containsKey(pkgName)) try {
- Class> mmwuCls = findClassIfExists("android.util.MiuiMultiWindowUtils", null);
- if (mmwuCls == null) {
- Helpers.log("StickyFloatingWindowsHook", "Cannot find MiuiMultiWindowUtils class");
- return;
- }
- Context mContext = (Context)XposedHelpers.getObjectField(param.args[0], "mContext");
- //options = (ActivityOptions)XposedHelpers.callStaticMethod(mmwuCls, "getActivityOptions", mContext, pkgName, true, false);
- if (options == null) options = ActivityOptions.makeBasic();
- XposedHelpers.callMethod(options, "setLaunchWindowingMode", 5);
- XposedHelpers.callMethod(options, "setMiuiConfigFlag", 2);
-
- Float scale;
- Rect rect;
- Pair values = fwApps.get(pkgName);
- if (values == null || values.first == 0f || values.second == null) {
- scale = XposedHelpers.getStaticFloatField(mmwuCls, "sScale");
- rect = (Rect)XposedHelpers.callStaticMethod(mmwuCls, "getFreeformRect", mContext);
- } else {
- scale = values.first;
- rect = values.second;
- }
- options.setLaunchBounds(rect);
- try {
- Object injector = XposedHelpers.callMethod(options, "getActivityOptionsInjector");
- XposedHelpers.callMethod(injector, "setFreeformScale", scale);
- } catch (Throwable ignore) {}
-
- param.setResult(options);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- });
-
- Helpers.hookAllMethods("com.android.server.wm.ActivityStackSupervisor", lpparam.classLoader, "startActivityFromRecents", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Object safeOptions = param.args[3];
- ActivityOptions options = (ActivityOptions)XposedHelpers.callMethod(safeOptions, "getOptions", param.thisObject);
- int windowingMode = options == null ? -1 : (int)XposedHelpers.callMethod(options, "getLaunchWindowingMode");
- if (windowingMode != 5) return;
- String pkgName = getTaskPackageName(param.thisObject, (int)param.args[2], options);
- if (pkgName != null) {
- fwApps.put(pkgName, new Pair(0f, null));
- storeFwAppsInSetting((Context)XposedHelpers.getObjectField(XposedHelpers.getObjectField(param.thisObject, "mService"), "mContext"));
- }
- }
- });
-
- Helpers.hookAllMethods("com.android.server.wm.MiuiFreeFormGestureController", lpparam.classLoader, "notifyFullScreenWidnowModeStart", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- String pkgName = (String)XposedHelpers.getObjectField(param.thisObject, "mFreeFormPackageName");
- if (fwApps.remove(pkgName) != null)
- storeFwAppsInSetting((Context)XposedHelpers.getObjectField(XposedHelpers.getObjectField(param.thisObject, "mService"), "mContext"));
- }
- });
-
-// Helpers.hookAllMethods("com.android.server.wm.MiuiFreeFormGesturePointerEventListener", lpparam.classLoader, "startShowFullScreenWindow", new MethodHook() {
-// @Override
-// protected void before(MethodHookParam param) throws Throwable {
-// Object mGestureController = XposedHelpers.getObjectField(param.thisObject, "mGestureController");
-// XposedBridge.log("FULLSCREEN: " + XposedHelpers.getObjectField(mGestureController, "mFreeFormPackageName"));
-// }
-// });
-
- Helpers.findAndHookMethod("com.android.server.wm.ActivityTaskManagerService", lpparam.classLoader, "onSystemReady", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- mContext.registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- try {
- String pkgName = intent.getStringExtra("package");
- if (pkgName != null) {
- fwApps.put(pkgName, new Pair(0f, null));
- storeFwAppsInSetting(mContext);
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- }, new IntentFilter(ACTION_PREFIX + "RememberFloatingWindow"));
- restoreFwAppsInSetting(mContext);
- }
- });
-
- Helpers.hookAllMethods("com.android.server.wm.ActivityTaskManagerService", lpparam.classLoader, "resizeTask", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- float sScale = XposedHelpers.getStaticFloatField(findClass("android.util.MiuiMultiWindowUtils", null), "sScale");
- String pkgName = getTaskPackageName(param.thisObject, (int)param.args[0]);
- if (pkgName != null && fwApps.containsKey(pkgName)) {
- fwApps.put(pkgName, new Pair(sScale, new Rect((Rect)param.args[1])));
- storeFwAppsInSetting((Context)XposedHelpers.getObjectField(param.thisObject, "mContext"));
- }
- }
- });
- }
-
- public static void StickyFloatingWindowsLauncherHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.miui.home.smallwindow.BaseDelegateAdapter", lpparam.classLoader, "startFreeformActivity",new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- String pkgName = (String)param.args[1];
- if (pkgName == null) return;
- Intent intent = new Intent(ACTION_PREFIX + "RememberFloatingWindow");
- intent.putExtra("package", pkgName);
- ((Context)param.args[0]).sendBroadcast(intent);
- }
- });
- }
-
- public static void MessagingStyleLinesSysHook() {
- Helpers.findAndHookMethod("android.app.Notification.MessagingStyle", null, "makeMessagingView", boolean.class, boolean.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if ((boolean)param.args[0] && (boolean)param.args[1]) return;
- RemoteViews remote = (RemoteViews)param.getResult();
- Context mContext = (Context)XposedHelpers.getObjectField(XposedHelpers.getObjectField(param.thisObject, "mBuilder"), "mContext");
- remote.setInt(mContext.getResources().getIdentifier("notification_messaging", "id", "android"), "setMaxDisplayedLines", MainModule.mPrefs.getInt("system_messagingstylelines", Integer.MAX_VALUE));
- }
- });
- }
-
- public static void MessagingStyleLinesHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.android.systemui.statusbar.notification.NotificationMessagingTemplateViewWrapper", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Object mMessagingLinearLayout = XposedHelpers.getObjectField(param.thisObject, "mMessagingLinearLayout");
- int mMaxDisplayedLines = XposedHelpers.getIntField(mMessagingLinearLayout, "mMaxDisplayedLines");
- if (mMaxDisplayedLines == Integer.MAX_VALUE) XposedHelpers.callMethod(mMessagingLinearLayout, "setMaxDisplayedLines", MainModule.mPrefs.getInt("system_messagingstylelines", Integer.MAX_VALUE));
- }
- });
- }
-
- public static void MultiWindowPlusNativeHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.recents.views.RecentMenuView", lpparam.classLoader, "onBusEvent", "com.android.systemui.recents.events.activity.ShowTaskMenuEvent", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- ImageView mMenuItemMultiWindow = (ImageView)XposedHelpers.getObjectField(param.thisObject, "mMenuItemMultiWindow");
- ImageView mMenuItemSmallWindow = (ImageView)XposedHelpers.getObjectField(param.thisObject, "mMenuItemSmallWindow");
- mMenuItemMultiWindow.setEnabled(true);
- mMenuItemMultiWindow.setImageAlpha(255);
- mMenuItemSmallWindow.setEnabled(true);
- mMenuItemSmallWindow.setImageAlpha(255);
- }
- });
-
-// Helpers.findAndHookMethod("com.android.systemui.recents.RecentsActivity", lpparam.classLoader, "updateDockBtnVisible", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// View mDockBtn = (View)XposedHelpers.getObjectField(param.thisObject, "mDockBtn");
-// mDockBtn.setVisibility(View.VISIBLE);
-// }
-// });
- }
-
- public static void MultiWindowPlusHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.miui.home.recents.views.RecentMenuView", lpparam.classLoader, "onMessageEvent", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mHandler");
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- ImageView mMenuItemMultiWindow = (ImageView)XposedHelpers.getObjectField(param.thisObject, "mMenuItemMultiWindow");
- ImageView mMenuItemSmallWindow = (ImageView)XposedHelpers.getObjectField(param.thisObject, "mMenuItemSmallWindow");
- mMenuItemMultiWindow.setEnabled(true);
- mMenuItemMultiWindow.setImageAlpha(255);
- mMenuItemSmallWindow.setEnabled(true);
- mMenuItemSmallWindow.setImageAlpha(255);
- }
- }, 200);
- }
- });
- }
-
- public static void SecureControlCenterHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "updateKeyguardState", boolean.class, boolean.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Object mStatusBarWindow = XposedHelpers.callMethod(param.thisObject, "getStatusBarWindow");
- if (mStatusBarWindow == null) return;
- Object mControllerPanel = XposedHelpers.getObjectField(mStatusBarWindow, "mControllerPanel");
- if (mControllerPanel == null) return;
- Object mControlCenter = XposedHelpers.getObjectField(mControllerPanel, "mControlCenter");
- if (mControlCenter == null) return;
- KeyguardManager kgMgr = (KeyguardManager)XposedHelpers.getObjectField(param.thisObject, "mKeyguardManager");
- XposedHelpers.setAdditionalInstanceField(mControlCenter, "isOnSecureKeyguard", kgMgr.isKeyguardLocked() && kgMgr.isKeyguardSecure());
- }
- });
-
- Helpers.hookAllMethods("com.android.systemui.miui.statusbar.ControlCenter", lpparam.classLoader, "panelEnabled", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- boolean isOnSecureKeyguard = false;
- try { isOnSecureKeyguard = (boolean)XposedHelpers.getAdditionalInstanceField(param.thisObject, "isOnSecureKeyguard"); } catch (Throwable ignore) {}
- if (isOnSecureKeyguard) param.setResult(false);
- }
- });
- }
-
- public static void MinimalNotificationViewHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "updateNotification", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if (param.args.length != 3) return;
- Object expandableRow = XposedHelpers.getObjectField(param.args[0], "row");
- Object mNotificationData = XposedHelpers.getObjectField(param.thisObject, "mNotificationData");
- boolean newLowPriority = (boolean)XposedHelpers.callMethod(mNotificationData, "isAmbient", XposedHelpers.callMethod(param.args[1], "getKey")) && !(boolean)XposedHelpers.callMethod(XposedHelpers.callMethod(param.args[1], "getNotification"), "isGroupSummary");
- boolean hasEntry = XposedHelpers.callMethod(mNotificationData, "get", XposedHelpers.getObjectField(param.args[0], "key")) != null;
- boolean isLowPriority = (boolean)XposedHelpers.callMethod(expandableRow, "isLowPriority");
- XposedHelpers.callMethod(expandableRow, "setIsLowPriority", newLowPriority);
- boolean hasLowPriorityChanged = hasEntry && isLowPriority != newLowPriority;
- XposedHelpers.callMethod(expandableRow, "setLowPriorityStateUpdated", hasLowPriorityChanged);
- XposedHelpers.callMethod(expandableRow, "updateNotification", param.args[0]);
- }
- });
- }
-
- public static void NotificationChannelSettingsHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "onClickMenuSettings", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if ((boolean)param.args[2]) return;
- Object entry = XposedHelpers.callMethod(param.args[0], "getEntry");
- String id = (String)XposedHelpers.callMethod(XposedHelpers.getObjectField(entry, "channel"), "getId");
- if ("miscellaneous".equals(id)) return;
- Object notification = XposedHelpers.getObjectField(entry, "notification");
- Class> nuCls = findClassIfExists("com.android.systemui.miui.statusbar.notification.NotificationUtil", lpparam.classLoader);
- if (nuCls != null) {
- boolean isHybrid = (boolean)XposedHelpers.callStaticMethod(nuCls, "isHybrid", notification);
- if (isHybrid) return;
- }
- String pkgName;
- int user;
- if ((boolean)XposedHelpers.callMethod(notification, "isSubstituteNotification")) {
- pkgName = (String)XposedHelpers.callMethod(notification, "getBasePkg");
- user = -1;
- } else {
- pkgName = (String)XposedHelpers.callMethod(notification, "getPackageName");
- user = (int)XposedHelpers.callMethod(notification, "getAppUid");
- }
- Intent intent = new Intent("android.intent.action.MAIN");
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.setClassName("com.android.settings", "com.android.settings.Settings$ChannelNotificationSettingsActivity");
- intent.putExtra("package", pkgName);
- intent.putExtra("android.provider.extra.CHANNEL_ID", id);
- intent.putExtra("uid", user);
- try {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- XposedHelpers.callMethod(mContext, "startActivityAsUser", intent, android.os.Process.myUserHandle());
- } catch (Throwable ignore) {}
- }
- });
- }
-
- public static void SkipAppLockHook(LoadPackageParam lpparam) {
- Helpers.hookAllConstructors("com.miui.server.AccessController", lpparam.classLoader, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- Handler mHandler = (Handler)XposedHelpers.getObjectField(param.thisObject, "mWorkHandler");
-
- new Helpers.SharedPrefObserver(mContext, mHandler) {
- @Override
- public void onChange(Uri uri) {
- try {
- String type = uri.getPathSegments().get(1);
- String key = uri.getPathSegments().get(2);
- if (key.contains("pref_key_system_applock_skip_activities") && "string".equals(type))
- MainModule.mPrefs.put(key, Helpers.getSharedStringPref(mContext, key, ""));
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- }
- });
-
- Helpers.hookAllMethods("com.miui.server.AccessController", lpparam.classLoader, "skipActivity", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Intent intent = (Intent)param.args[0];
- if (intent == null || intent.getComponent() == null) return;
- String pkgName = intent.getComponent().getPackageName();
- String actName = intent.getComponent().getClassName();
- Helpers.log("SkipAppLock", actName);
- String key = "system_applock_skip_activities";
- String itemStr = MainModule.mPrefs.getString(key, "");
- if (itemStr == null || itemStr.isEmpty()) return;
- String[] itemArr = itemStr.trim().split("\\|");
- for (String uuid: itemArr) {
- String pkgAct = MainModule.mPrefs.getString(key + "_" + uuid + "_activity", "");
- if (pkgAct.equals(pkgName + "|" + actName)) param.setResult(true);
- }
- }
- });
- }
-
- private static final List securedTiles = new ArrayList();
-
- public static void SecureQSTilesHook(LoadPackageParam lpparam) {
- Class> tileHostCls = XposedHelpers.findClassIfExists("com.android.systemui.qs.QSTileHost", lpparam.classLoader);
- Method initMethod = XposedHelpers.findMethodExactIfExists(tileHostCls, "init");
-
- MethodHook hook = new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- BroadcastReceiver mAfterUnlockReceiver = new BroadcastReceiver() {
- @Override
- @SuppressWarnings("unchecked")
- public void onReceive(Context context, Intent intent) {
- try {
- String tileName = intent.getStringExtra("tileName");
- boolean expandAfter = intent.getBooleanExtra("expandAfter", false);
- boolean usingCenter = intent.getBooleanExtra("usingCenter", false);
- if ("edit".equals(tileName) || expandAfter) {
- Intent expandIntent = new Intent(ACTION_PREFIX + "ExpandSettings");
- expandIntent.putExtra("forceExpand", true);
- context.sendBroadcast(expandIntent);
- }
- LinkedHashMap mTiles = (LinkedHashMap)XposedHelpers.getObjectField(param.thisObject, "mTiles");
- //for (Map.Entry mTile: mTiles.entrySet())
- //XposedBridge.log(mTile.getKey() + " = " + mTile.getValue());
- Object tile = mTiles.get(tileName);
- if (tile == null)
- if (usingCenter) {
- Object mController = XposedHelpers.callStaticMethod(findClass("com.android.systemui.Dependency", lpparam.classLoader), "get", findClassIfExists("com.android.systemui.miui.statusbar.policy.ControlPanelController", lpparam.classLoader));
- Object mControlCenter = XposedHelpers.getObjectField(mController, "mControlCenter");
- Object mControlPanelContentView = XposedHelpers.getObjectField(mControlCenter, "mControlPanelContentView");
- Object mControlCenterPanel = XposedHelpers.callMethod(mControlPanelContentView, "getControlCenterPanel");
- Object mBigTile = null;
- if ("bt".equals(tileName)) mBigTile = XposedHelpers.getObjectField(mControlCenterPanel, "mBigTile1");
- else if ("cell".equals(tileName)) mBigTile = XposedHelpers.getObjectField(mControlCenterPanel, "mBigTile2");
- else if ("wifi".equals(tileName)) mBigTile = XposedHelpers.getObjectField(mControlCenterPanel, "mBigTile3");
- if (mBigTile != null) tile = XposedHelpers.getObjectField(mBigTile, "mQSTile");
- if (tile == null) return;
- } else return;
- XposedHelpers.setAdditionalInstanceField(tile, "mCalledAfterUnlock", true);
- XposedHelpers.callMethod(tile, "handleClick");
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mAfterUnlockReceiver", mAfterUnlockReceiver);
- mContext.registerReceiver(mAfterUnlockReceiver, new IntentFilter(ACTION_PREFIX + "HandleQSTileClick"));
- }
- };
-
- if (initMethod != null) {
- Helpers.findAndHookMethod(tileHostCls, "init", hook);
- Helpers.findAndHookMethod(tileHostCls, "destroy", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- BroadcastReceiver mAfterUnlockReceiver = (BroadcastReceiver)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mAfterUnlockReceiver");
- if (mAfterUnlockReceiver != null) mContext.unregisterReceiver(mAfterUnlockReceiver);
- }
- });
- } else Helpers.hookAllConstructors(tileHostCls, hook);
-
- Helpers.findAndHookMethod("com.android.systemui.qs.tileimpl.QSFactoryImpl", lpparam.classLoader, "createTileInternal", String.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Object tile = param.getResult();
- if (tile == null) return;
- String tileClass = tile.getClass().getCanonicalName();
- final String tileName = (String)param.args[0];
- String name = (String)param.args[0];
- if (name.startsWith("intent(")) name = "intent";
- else if (name.startsWith("custom(")) name = "custom";
- final HashSet secureTitles = new HashSet();
- if (MainModule.mPrefs.getBoolean("system_secureqs_wifi")) secureTitles.add("wifi");
- if (MainModule.mPrefs.getBoolean("system_secureqs_bt")) secureTitles.add("bt");
- if (MainModule.mPrefs.getBoolean("system_secureqs_mobiledata")) secureTitles.add("cell");
- if (MainModule.mPrefs.getBoolean("system_secureqs_airplane")) secureTitles.add("airplane");
- if (MainModule.mPrefs.getBoolean("system_secureqs_location")) secureTitles.add("gps");
- if (MainModule.mPrefs.getBoolean("system_secureqs_hotspot")) secureTitles.add("hotspot");
- if (MainModule.mPrefs.getBoolean("system_secureqs_nfc")) secureTitles.add("nfc");
- if (MainModule.mPrefs.getBoolean("system_secureqs_sync")) secureTitles.add("sync");
- if (MainModule.mPrefs.getBoolean("system_secureqs_edit")) secureTitles.add("edit");
- if (MainModule.mPrefs.getBoolean("system_secureqs_custom")) {
- secureTitles.add("intent");
- secureTitles.add("custom");
- }
- if (secureTitles.contains(name) && !securedTiles.contains(tileClass)) {
- MethodHook hook = new MethodHook(10) {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- Boolean mCalledAfterUnlock = (Boolean)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mCalledAfterUnlock");
- if (mCalledAfterUnlock != null && mCalledAfterUnlock) {
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mCalledAfterUnlock", false);
- return;
- }
- Boolean isScreenLockDisabled = (Boolean)XposedHelpers.getAdditionalStaticField(findClass("com.android.systemui.keyguard.KeyguardViewMediator", lpparam.classLoader), "isScreenLockDisabled");
- isScreenLockDisabled = isScreenLockDisabled != null && isScreenLockDisabled;
- if (isScreenLockDisabled) return;
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- KeyguardManager kgMgr = (KeyguardManager)mContext.getSystemService(Context.KEYGUARD_SERVICE);
- if (!kgMgr.isKeyguardLocked() || !kgMgr.isKeyguardSecure()) return;
- Handler mHandler = new Handler(mContext.getMainLooper());
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- try {
- Object mApplication = XposedHelpers.callMethod(mContext.getApplicationContext(), "getSystemUIApplication");
- Object mStatusBar = XposedHelpers.callMethod(mApplication, "getComponent", findClassIfExists("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader));
- boolean usingControlCenter = false;
- if (Helpers.is12()) {
- Object mController = XposedHelpers.callStaticMethod(findClass("com.android.systemui.Dependency", lpparam.classLoader), "get", findClassIfExists("com.android.systemui.miui.statusbar.policy.ControlPanelController", lpparam.classLoader));
- usingControlCenter = (boolean)XposedHelpers.callMethod(mController, "isUseControlCenter");
- if (usingControlCenter) XposedHelpers.callMethod(mController, "collapsePanel", true);
- }
- boolean keepOpened = MainModule.mPrefs.getBoolean("system_secureqs_keepopened");
- final boolean usingCenter = usingControlCenter;
- final boolean expandAfter = usingControlCenter && keepOpened;
- if (!usingControlCenter && keepOpened)
- XposedHelpers.setBooleanField(mStatusBar, "mLeaveOpenOnKeyguardHide", true);
- XposedHelpers.callMethod(mStatusBar, "postQSRunnableDismissingKeyguard", new Runnable() {
- public void run() {
- Intent intent = new Intent(ACTION_PREFIX + "HandleQSTileClick");
- intent.putExtra("tileName", tileName);
- intent.putExtra("expandAfter", expandAfter);
- intent.putExtra("usingCenter", usingCenter);
- mContext.sendBroadcast(intent);
- }
- });
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- });
- param.setResult(null);
- }
- };
- Helpers.findAndHookMethod(tileClass, lpparam.classLoader, "handleClick", hook);
- //noinspection ResultOfMethodCallIgnored
- Helpers.findAndHookMethodSilently(tileClass, lpparam.classLoader, "handleSecondaryClick", hook);
- securedTiles.add(tileClass);
- }
- }
- });
- }
-
- public static void HideLockScreenHintHook(LoadPackageParam lpparam) {
- MethodHook hook = new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Object controller = XposedHelpers.getSurroundingThis(param.thisObject);
- XposedHelpers.setObjectField(controller, "mUpArrowIndication", null);
- XposedHelpers.callMethod(controller, "updateIndication");
- }
- };
- Helpers.hookAllMethods("com.android.systemui.statusbar.KeyguardIndicationController$BaseKeyguardCallback", lpparam.classLoader, "onRefreshBatteryInfo", hook);
- if (!Helpers.hookAllMethodsSilently("com.android.systemui.statusbar.KeyguardIndicationController$BaseKeyguardCallback", lpparam.classLoader, "onStartedWakingUp", hook))
- Helpers.hookAllMethodsSilently("com.android.systemui.statusbar.KeyguardIndicationController$BaseKeyguardCallback", lpparam.classLoader, "onScreenTurnedOn", hook);
- }
-
- public static void HideLockScreenStatusBarHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.phone.StatusBar", lpparam.classLoader, "makeStatusBarView", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- View mKeyguardStatusBar = (View)XposedHelpers.getObjectField(param.thisObject, "mKeyguardStatusBar");
- if (mKeyguardStatusBar != null) mKeyguardStatusBar.setTranslationY(-999f);
- }
- });
- }
-
- public static void MuteVisibleNotificationsHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.media.NotificationPlayer$CreationAndCompletionThread", lpparam.classLoader, "run", new MethodHook() {
- @Override
- @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
- protected void before(final MethodHookParam param) throws Throwable {
- Object mCmd = XposedHelpers.getObjectField(param.thisObject, "mCmd");
- if (mCmd == null) return;
- int code = XposedHelpers.getIntField(mCmd, "code");
- if (code != 1) return;
- AudioAttributes attributes = (AudioAttributes)XposedHelpers.getObjectField(mCmd, "attributes");
- if (attributes.getUsage() == AudioAttributes.USAGE_NOTIFICATION || attributes.getUsage() == AudioAttributes.USAGE_NOTIFICATION_RINGTONE || attributes.getUsage() == AudioAttributes.USAGE_UNKNOWN)
- if (attributes.getContentType() == AudioAttributes.CONTENT_TYPE_SONIFICATION || attributes.getContentType() == AudioAttributes.CONTENT_TYPE_UNKNOWN) {
- Context context = (Context)XposedHelpers.getObjectField(mCmd, "context");
- PowerManager powerMgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
- if (powerMgr.isInteractive()) {
- Thread thread = (Thread)param.thisObject;
- synchronized (thread) { thread.notify(); }
- param.setResult(null);
- }
- }
- }
- });
- }
-
- public static void NetworkIndicatorRes() {
- int opt = MainModule.mPrefs.getStringAsInt("system_networkindicator", 1);
- MainModule.resHooks.setObjectReplacement("com.android.systemui", "bool", "config_showActivity", opt == 2);
- MainModule.resHooks.setObjectReplacement("com.android.systemui", "bool", "config_showWifiActivity", opt == 2);
- }
-
- public static void ClearBrightnessMirrorHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.BrightnessMirrorController", lpparam.classLoader, "showMirror", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- View mBrightnessMirror = (View)XposedHelpers.getObjectField(param.thisObject, "mBrightnessMirror");
- mBrightnessMirror.setElevation(0);
- mBrightnessMirror.setBackgroundColor(Color.TRANSPARENT);
- }
- });
- }
-
- public static void SetLockscreenWallpaperHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.wallpaper.WallpaperManagerService", lpparam.classLoader, "setWallpaper", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if (param.getThrowable() != null || param.getResult() == null || (int)param.args[5] == 1 || "com.android.thememanager".equals(param.args[1])) return;
-
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (mContext == null) return;
-
- int handleIncomingUser = 0;
- try {
- handleIncomingUser = (int)XposedHelpers.callStaticMethod(ActivityManager.class, "handleIncomingUser", Binder.getCallingPid(), Binder.getCallingUid(), param.args[7], false, true, "changing wallpaper", null);
- } catch (Throwable ignore) {}
- Object wallpaperData = XposedHelpers.callMethod(param.thisObject, "getWallpaperSafeLocked", handleIncomingUser, param.args[5]);
- File wallpaper = (File)XposedHelpers.getObjectField(wallpaperData, "wallpaperFile");
-
- new Handler(mContext.getMainLooper()).postDelayed(new Runnable() {
- @Override
- public void run() {
- if (!wallpaper.exists()) return;
-
- if (Helpers.is10()) {
- Intent copyIntent = new Intent(ACTION_PREFIX + "CopyToExternal");
- copyIntent.putExtra("action", 1);
- copyIntent.putExtra("from", wallpaper.getAbsolutePath());
- mContext.sendBroadcast(copyIntent);
- }
-
- JSONObject data = new JSONObject();
- JSONObject ex = new JSONObject();
- try {
- ex
- .put("link_type", "0")
- .put("title_size", "26")
- .put("item_id", "wallpaper1")
- .put("title_color", "#ffffffff")
- .put("index_in_album", "1")
- .put("tag_list", "CustoMIUIzer,mod")
- .put("content_color", "#ffffffff")
- .put("total_of_album", "1")
- .put("img_level", "0")
- .put("album_id", "1")
- .put("title_customized", "0")
- .put("lks_entry_text", "Some wallpaper");
-
- data
- .put("authority", "name.mikanoshi.customiuizer.mods.set_lockscreen_wallpaper")
- .put("content", "Wallpaper set by some app")
- .put("contentColorValue", 0)
- .put("cp", "CustoMIUIzer")
- .put("cpColorValue", 0)
- .put("definition", -1)
- .put("ex", ex.toString())
- .put("fromColorValue", 0)
- .put("hasAcc", false)
- .put("indexInAlbum", -1)
- .put("isAd", false)
- .put("isCustom", false)
- .put("isFd", false)
- .put("isFrontCover", false)
- .put("key", "wallpaper1")
- .put("like", false)
- .put("linkType", 0)
- .put("noApply", false)
- .put("noDislike", false)
- .put("noSave", false)
- .put("noShare", false)
- .put("pos", 0)
- .put("supportLike", true)
- .put("title", "Some wallpaper")
- .put("titleColorValue", 0)
- .put("titleTextSize", -1)
- .put("totalOfAlbum", -1)
- .put("wallpaperUri", wallpaper.toURI());
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- Intent setIntent = new Intent("android.miui.UPDATE_LOCKSCREEN_WALLPAPER");
- setIntent.putExtra("wallpaperInfo", data.toString());
- setIntent.putExtra("apply", true);
- mContext.sendBroadcast(setIntent);
- }
- }, 2000);
- }
- });
- }
-
- public static void BetterPopupsCenteredHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.systemui.statusbar.policy.HeadsUpManager", lpparam.classLoader, "getHeadsUpTopMargin", Context.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context context = (Context)param.args[0];
- Resources res = context.getResources();
- int maxPopupHeight = res.getDimensionPixelSize(res.getIdentifier("notification_max_heads_up_height", "dimen", "com.android.systemui"));
- if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) maxPopupHeight /= 3;
- param.setResult(Math.round(context.getResources().getDisplayMetrics().heightPixels / 2.0f - maxPopupHeight / 2.0f));
- }
- });
- }
-
-// @SuppressWarnings("unchecked")
-// public static void MultiWindowHook() {
-// HashMap sAppList = (HashMap)XposedHelpers.getStaticObjectField(findClass("android.util.MiuiMultiWindowUtils", null), "sAppList");
-// sAppList.put(Helpers.modulePkg, 4);
-// XposedHelpers.setStaticObjectField(findClass("android.util.MiuiMultiWindowUtils", null), "sAppList", sAppList);
-// }
-//
-// public static void MultiWindowServiceHook(LoadPackageParam lpparam) {
-// Helpers.hookAllMethods("com.android.server.am.ActivityStarterInjector", lpparam.classLoader, "checkFreeformSupport", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// XposedHelpers.setObjectField(param.args[0], "mSupportsFreeformWindowManagement", true);
-// }
-// });
-//
-// Helpers.findAndHookMethod("com.android.server.am.ActivityStackSupervisorInjector", lpparam.classLoader, "supportsFreeform", XC_MethodReplacement.returnConstant(true));
-//
-// Helpers.hookAllMethods("com.android.server.am.ActivityDisplay", lpparam.classLoader, "resolveWindowingMode", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// Object mSupervisor = XposedHelpers.getObjectField(param.thisObject, "mSupervisor");
-// Object mService = XposedHelpers.getObjectField(mSupervisor, "mService");
-// Object mSupportsMultiWindow = XposedHelpers.getObjectField(mService, "mSupportsMultiWindow");
-// Object mSupportsSplitScreenMultiWindow = XposedHelpers.getObjectField(mService, "mSupportsSplitScreenMultiWindow");
-// Object mSupportsFreeformWindowManagement = XposedHelpers.getObjectField(mService, "mSupportsFreeformWindowManagement");
-// Object mSupportsPictureInPicture = XposedHelpers.getObjectField(mService, "mSupportsPictureInPicture");
-// XposedBridge.log("mSupportsMultiWindow: " + mSupportsMultiWindow);
-// XposedBridge.log("mSupportsSplitScreenMultiWindow: " + mSupportsSplitScreenMultiWindow);
-// XposedBridge.log("mSupportsFreeformWindowManagement: " + mSupportsFreeformWindowManagement);
-// XposedBridge.log("mSupportsPictureInPicture: " + mSupportsPictureInPicture);
-// XposedBridge.log("resolveWindowingMode: " + param.args[0] + ", " + param.args[1] + ", " + param.args[2] + ", " + param.args[3] + " = " + param.getResult());
-// }
-// });
-//
-// Helpers.hookAllMethods("com.android.server.pm.PackageManagerService", lpparam.classLoader, "hasSystemFeature", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// if ("android.software.freeform_window_management".equals(param.args[0])) param.setResult(true);
-// }
-// });
-// }
-//
-// public static void QSFooterHook(LoadPackageParam lpparam) {
-// Helpers.findAndHookMethod("com.android.systemui.qs.QSContainerImpl", lpparam.classLoader, "onFinishInflate", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// FrameLayout qs = (FrameLayout)param.thisObject;
-// Context context = qs.getContext();
-// Resources res = context.getResources();
-// LinearLayout mQSFooterContainer = (LinearLayout)XposedHelpers.getObjectField(param.thisObject, "mQSFooterContainer");
-// LayoutInflater inflater = (LayoutInflater)Helpers.getModuleContext(context).getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-//
-// View dataView = inflater.inflate(R.layout.qs_footer, mQSFooterContainer, false);
-// dataView.setTag("mydata");
-// LinearLayout.LayoutParams lp0 = (LinearLayout.LayoutParams)dataView.getLayoutParams();
-// int margin = res.getDimensionPixelSize(res.getIdentifier("qs_divider_margin_horizontal", "dimen", context.getPackageName()));
-// int height = res.getDimensionPixelSize(res.getIdentifier("qs_footer_height", "dimen", context.getPackageName()));
-// lp0.setMarginStart(margin);
-// lp0.topMargin = - height / 6;
-// lp0.bottomMargin = height / 4;
-// dataView.setLayoutParams(lp0);
-//
-// ImageView icon = dataView.findViewById(R.id.qs_icon);
-// icon.setImageDrawable(Helpers.getModuleRes(context).getDrawable(R.drawable.ic_gps_task, context.getTheme()));
-// ViewGroup.LayoutParams lp1 = icon.getLayoutParams();
-// int iconSize = res.getDimensionPixelSize(res.getIdentifier("qs_footer_data_usage_icon_size", "dimen", context.getPackageName()));
-// lp1.width = iconSize;
-// lp1.height = iconSize;
-// icon.setLayoutParams(lp1);
-//
-// TextView data = dataView.findViewById(R.id.qs_data);
-// LinearLayout.LayoutParams lp2 = (LinearLayout.LayoutParams)data.getLayoutParams();
-// margin = res.getDimensionPixelSize(res.getIdentifier("qs_footer_line_margin_start", "dimen", context.getPackageName()));
-// lp2.setMarginStart(margin);
-// lp2.setMarginEnd(margin);
-// data.setLayoutParams(lp2);
-// data.setText("Some data...");
-//
-// int textColor = res.getColor(res.getIdentifier("qs_footer_data_usage_text_color", "color", context.getPackageName()), context.getTheme());
-// int textSize = res.getDimensionPixelSize(res.getIdentifier("qs_tile_label_text_size", "dimen", context.getPackageName()));
-// data.setTextColor(textColor);
-// data.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
-//
-// mQSFooterContainer.addView(dataView);
-// }
-// });
-//
-// Helpers.findAndHookMethod("com.android.systemui.qs.QSContainerImpl", lpparam.classLoader, "updateQSDataUsage", boolean.class, new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// LinearLayout mQSFooterContainer = (LinearLayout)XposedHelpers.getObjectField(param.thisObject, "mQSFooterContainer");
-// View dataView = mQSFooterContainer.findViewWithTag("mydata");
-// mQSFooterContainer.removeView(dataView);
-// mQSFooterContainer.addView(dataView);
-// }
-// });
-// }
-//
-// public static void VolumeDialogTimeoutHook(LoadPackageParam lpparam) {
-// Helpers.findAndHookMethod("com.android.systemui.miui.volume.MiuiVolumeDialogImpl", lpparam.classLoader, "computeTimeoutH", new MethodHook() {
-// @Override
-// protected void after(MethodHookParam param) throws Throwable {
-// param.setResult(Math.max((int)param.getResult(), 10000));
-// }
-// });
-// }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/mods/Various.java b/app/src/main/java/name/mikanoshi/customiuizer/mods/Various.java
deleted file mode 100644
index 5ae04a15..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/mods/Various.java
+++ /dev/null
@@ -1,1055 +0,0 @@
-package name.mikanoshi.customiuizer.mods;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.AlarmManager;
-import android.app.Application;
-import android.app.Fragment;
-import android.app.PendingIntent;
-import android.content.ClipData;
-import android.content.ClipboardManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.database.ContentObserver;
-import android.media.AudioAttributes;
-import android.media.AudioManager;
-import android.media.Ringtone;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.BadParcelableException;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.UserHandle;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.provider.Settings;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.SpannableStringBuilder;
-import android.text.TextUtils;
-import android.text.style.RelativeSizeSpan;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.TableLayout;
-import android.widget.TableRow;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.TimeZone;
-
-import de.robv.android.xposed.XC_MethodHook;
-import de.robv.android.xposed.XC_MethodReplacement;
-import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
-import de.robv.android.xposed.XposedBridge;
-import de.robv.android.xposed.XposedHelpers;
-
-import miui.app.ActionBar;
-import miui.app.AlertDialog;
-
-import name.mikanoshi.customiuizer.MainModule;
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.utils.Helpers;
-import name.mikanoshi.customiuizer.utils.Helpers.MethodHook;
-
-import static de.robv.android.xposed.XposedHelpers.findClass;
-import static de.robv.android.xposed.XposedHelpers.findClassIfExists;
-import static java.lang.System.currentTimeMillis;
-
-public class Various {
-
- public static PackageInfo mLastPackageInfo;
- public static Object mSupportFragment = null;
- public static void AppInfoHook(LoadPackageParam lpparam) {
- Class> amaCls = XposedHelpers.findClassIfExists("com.miui.appmanager.AMAppInfomationActivity", lpparam.classLoader);
- if (amaCls == null) {
- Helpers.log("AppInfoHook", "Cannot find activity class!");
- return;
- }
-
- boolean oldMethodFound = false;
- for (Member method: amaCls.getDeclaredMethods())
- if (method.getName().equals("onLoadFinished")) oldMethodFound = true;
-
- if (findClassIfExists("androidx.fragment.app.Fragment", lpparam.classLoader) != null)
- Helpers.findAndHookConstructor("androidx.fragment.app.Fragment", lpparam.classLoader, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- try {
- Field piField = XposedHelpers.findFirstFieldByExactType(param.thisObject.getClass(), PackageInfo.class);
- if (piField != null) mSupportFragment = param.thisObject;
- } catch (Throwable ignore) {}
- }
- });
-
- if (Helpers.is12() || !oldMethodFound)
- Helpers.findAndHookMethod(amaCls, "onCreate", Bundle.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Handler handler = new Handler(Looper.getMainLooper());
- handler.post(new Runnable() {
- @Override
- public void run() {
- final Activity act = (Activity)param.thisObject;
- Object contentFrag = act.getFragmentManager().findFragmentById(android.R.id.content);
- Object frag = contentFrag != null ? contentFrag : mSupportFragment;
- if (frag == null) {
- Helpers.log("AppInfoHook", "Unable to find fragment");
- return;
- }
-
- final Resources modRes;
- try {
- modRes = Helpers.getModuleRes(act);
- Field piField = XposedHelpers.findFirstFieldByExactType(frag.getClass(), PackageInfo.class);
- mLastPackageInfo = (PackageInfo)piField.get(frag);
- Method[] addPref = XposedHelpers.findMethodsByExactParameters(frag.getClass(), void.class, String.class, String.class, String.class);
- if (mLastPackageInfo == null || addPref.length == 0) {
- Helpers.log("AppInfoHook", "Unable to find field/class/method in SecurityCenter to hook");
- return;
- } else {
- addPref[0].setAccessible(true);
- }
- addPref[0].invoke(frag, "apk_versioncode", modRes.getString(R.string.appdetails_apk_version_code), String.valueOf(mLastPackageInfo.versionCode));
- addPref[0].invoke(frag, "apk_filename", modRes.getString(R.string.appdetails_apk_file), mLastPackageInfo.applicationInfo.sourceDir);
- addPref[0].invoke(frag, "data_path", modRes.getString(R.string.appdetails_data_path), mLastPackageInfo.applicationInfo.dataDir);
- addPref[0].invoke(frag, "app_uid", modRes.getString(R.string.appdetails_app_uid), String.valueOf(mLastPackageInfo.applicationInfo.uid));
- addPref[0].invoke(frag, "target_sdk", modRes.getString(R.string.appdetails_sdk), String.valueOf(mLastPackageInfo.applicationInfo.targetSdkVersion));
- handler.post(new Runnable() {
- @Override
- public void run() {
- try {
- addPref[0].invoke(frag, "open_in_store", modRes.getString(R.string.appdetails_playstore), "");
- addPref[0].invoke(frag, "launch_app", modRes.getString(R.string.appdetails_launch), "");
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- });
- } catch (Throwable t) {
- XposedBridge.log(t);
- return;
- }
-
- XposedBridge.hookAllMethods(frag.getClass(), "onPreferenceTreeClick", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- String key = (String)XposedHelpers.callMethod(param.args[0], "getKey");
- String title = (String)XposedHelpers.callMethod(param.args[0], "getTitle");
- switch (key) {
- case "apk_filename":
- ((ClipboardManager)act.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText(title, mLastPackageInfo.applicationInfo.sourceDir));
- Toast.makeText(act, act.getResources().getIdentifier("app_manager_copy_pkg_to_clip", "string", act.getPackageName()), Toast.LENGTH_SHORT).show();
- param.setResult(true);
- break;
- case "data_path":
- ((ClipboardManager)act.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText(title, mLastPackageInfo.applicationInfo.dataDir));
- Toast.makeText(act, act.getResources().getIdentifier("app_manager_copy_pkg_to_clip", "string", act.getPackageName()), Toast.LENGTH_SHORT).show();
- param.setResult(true);
- break;
- case "open_in_store":
- try {
- Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + mLastPackageInfo.packageName));
- launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- act.startActivity(launchIntent);
- } catch (android.content.ActivityNotFoundException anfe) {
- Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + mLastPackageInfo.packageName));
- launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- act.startActivity(launchIntent);
- }
- param.setResult(true);
- break;
- case "launch_app":
- Intent launchIntent = act.getPackageManager().getLaunchIntentForPackage(mLastPackageInfo.packageName);
- if (launchIntent == null) {
- Toast.makeText(act, modRes.getString(R.string.appdetails_nolaunch), Toast.LENGTH_SHORT).show();
- } else {
- int user = 0;
- try {
- int uid = act.getIntent().getIntExtra("am_app_uid", -1);
- user = (int)XposedHelpers.callStaticMethod(UserHandle.class, "getUserId", uid);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- if (user != 0) try {
- XposedHelpers.callMethod(act, "startActivityAsUser", launchIntent, XposedHelpers.newInstance(UserHandle.class, user));
- } catch (Throwable t) {
- XposedBridge.log(t);
- } else {
- act.startActivity(launchIntent);
- }
- }
- param.setResult(true);
- break;
- }
- }
- });
- }
- });
- }
- });
- else
- Helpers.hookAllMethods(amaCls, "onLoadFinished", new MethodHook() {
- @Override
- @SuppressWarnings("deprecation")
- protected void after(final MethodHookParam param) throws Throwable {
- final PreferenceActivity act = (PreferenceActivity)param.thisObject;
- Field piField = XposedHelpers.findFirstFieldByExactType(act.getClass(), PackageInfo.class);
- final PackageInfo mPackageInfo = (PackageInfo)piField.get(act);
- final Resources modRes = Helpers.getModuleRes(act);
- Method[] addPref = XposedHelpers.findMethodsByExactParameters(act.getClass(), void.class, String.class, String.class, String.class);
- if (mPackageInfo == null || addPref.length == 0) {
- Helpers.log("AppInfoHook", "Unable to find field/class/method in SecurityCenter to hook");
- return;
- } else {
- addPref[0].setAccessible(true);
- }
- addPref[0].invoke(act, "apk_versioncode", modRes.getString(R.string.appdetails_apk_version_code), String.valueOf(mPackageInfo.versionCode));
- addPref[0].invoke(act, "apk_filename", modRes.getString(R.string.appdetails_apk_file), mPackageInfo.applicationInfo.sourceDir);
- addPref[0].invoke(act, "data_path", modRes.getString(R.string.appdetails_data_path), mPackageInfo.applicationInfo.dataDir);
- addPref[0].invoke(act, "app_uid", modRes.getString(R.string.appdetails_app_uid), String.valueOf(mPackageInfo.applicationInfo.uid));
- addPref[0].invoke(act, "target_sdk", modRes.getString(R.string.appdetails_sdk), String.valueOf(mPackageInfo.applicationInfo.targetSdkVersion));
- addPref[0].invoke(act, "open_in_store", modRes.getString(R.string.appdetails_playstore), "");
- addPref[0].invoke(act, "launch_app", modRes.getString(R.string.appdetails_launch), "");
-
- act.findPreference("apk_filename").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- ((ClipboardManager)act.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText(preference.getTitle(), mPackageInfo.applicationInfo.sourceDir));
- Toast.makeText(act, act.getResources().getIdentifier("app_manager_copy_pkg_to_clip", "string", act.getPackageName()), Toast.LENGTH_SHORT).show();
- return true;
- }
- });
-
- act.findPreference("data_path").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- ((ClipboardManager)act.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText(preference.getTitle(), mPackageInfo.applicationInfo.dataDir));
- Toast.makeText(act, act.getResources().getIdentifier("app_manager_copy_pkg_to_clip", "string", act.getPackageName()), Toast.LENGTH_SHORT).show();
- return true;
- }
- });
-
- act.findPreference("open_in_store").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- try {
- Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + mPackageInfo.packageName));
- launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- act.startActivity(launchIntent);
- } catch (android.content.ActivityNotFoundException anfe) {
- Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + mPackageInfo.packageName));
- launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- act.startActivity(launchIntent);
- }
- return true;
- }
- });
-
- act.findPreference("launch_app").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- Intent launchIntent = act.getPackageManager().getLaunchIntentForPackage(mPackageInfo.packageName);
- if (launchIntent == null) {
- Toast.makeText(act, modRes.getString(R.string.appdetails_nolaunch), Toast.LENGTH_SHORT).show();
- } else {
- int user = 0;
- try {
- int uid = act.getIntent().getIntExtra("am_app_uid", -1);
- user = (int)XposedHelpers.callStaticMethod(UserHandle.class, "getUserId", uid);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- if (user != 0) try {
- XposedHelpers.callMethod(act, "startActivityAsUser", launchIntent, XposedHelpers.newInstance(UserHandle.class, user));
- } catch (Throwable t) {
- XposedBridge.log(t);
- } else {
- act.startActivity(launchIntent);
- }
- }
- return true;
- }
- });
- }
- });
- }
-
- public static Bundle checkBundle(Context context, Bundle bundle) {
- if (context == null) {
- Helpers.log("AppsDefaultSortHook", "Context is null!");
- return null;
- }
- if (bundle == null) bundle = new Bundle();
- int order = Integer.parseInt(Helpers.getSharedStringPref(context, "pref_key_various_appsort", "0"));
- bundle.putInt("current_sory_type", order); // Xiaomi noob typos :)
- bundle.putInt("current_sort_type", order); // Future proof, they may fix it someday :D
- return bundle;
- }
-
- public static void AppsDefaultSortHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.appmanager.AppManagerMainActivity", lpparam.classLoader, "onCreate", Bundle.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- param.args[0] = checkBundle((Context)param.thisObject, (Bundle)param.args[0]);
-
- // Bruteforce class on MIUI 12.5
- if (Helpers.is125()) {
- String fragCls = null;
- Class> xfragCls = findClassIfExists("androidx.fragment.app.Fragment", lpparam.classLoader);
- Field[] fields = param.thisObject.getClass().getDeclaredFields();
- for (Field field: fields)
- if (Fragment.class.isAssignableFrom(field.getType()) ||
- (xfragCls != null && xfragCls.isAssignableFrom(field.getType()))) {
- fragCls = field.getType().getCanonicalName();
- break;
- }
-
- if (fragCls != null)
- Helpers.hookAllMethods(fragCls, lpparam.classLoader, "onActivityCreated", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- try {
- param.args[0] = checkBundle((Context)XposedHelpers.callMethod(param.thisObject, "getContext"), (Bundle)param.args[0]);
- } catch (Throwable t) {
- Helpers.log("AppsDefaultSortHook", t.getMessage());
- }
- }
- });
- }
- }
- });
-
-// Helpers.findAndHookMethod("com.miui.appmanager.AppManagerMainActivity", lpparam.classLoader, "onSaveInstanceState", Bundle.class, new MethodHook() {
-// @Override
-// protected void after(final MethodHookParam param) throws Throwable {
-// Bundle bundle = (Bundle)param.args[0];
-// if (bundle == null) bundle = new Bundle();
-// bundle.putInt("current_sory_type", 1); // Xiaomi noob typos :)
-// bundle.putInt("current_sort_type", 1); // Future proof, they may fix it someday :D
-// Helpers.log("onSaveInstanceState: " + String.valueOf(bundle));
-// }
-// });
- }
-
- private static void setAppState(final Activity act, String pkgName, MenuItem item, boolean enable) {
- try {
- PackageManager pm = act.getPackageManager();
- pm.setApplicationEnabledSetting(pkgName, enable ? PackageManager.COMPONENT_ENABLED_STATE_DEFAULT : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
- int state = pm.getApplicationEnabledSetting(pkgName);
- boolean isEnabledOrDefault = (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
- if ((enable && isEnabledOrDefault) || (!enable && !isEnabledOrDefault)) {
- item.setTitle(act.getResources().getIdentifier(enable ? "app_manager_disable_text" : "app_manager_enable_text", "string", "com.miui.securitycenter"));
- Toast.makeText(act, act.getResources().getIdentifier(enable ? "app_manager_enabled" : "app_manager_disabled", "string", "com.miui.securitycenter"), Toast.LENGTH_SHORT).show();
- } else {
- Toast.makeText(act, Helpers.getModuleRes(act).getString(R.string.disable_app_fail), Toast.LENGTH_LONG).show();
- }
- new Handler().postDelayed(act::invalidateOptionsMenu, 500);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
-
- public static void AppsDisableServiceHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.server.pm.PackageManagerServiceInjector", lpparam.classLoader, "isAllowedDisable", XC_MethodReplacement.returnConstant(true));
- }
-
- public static void AppsDisableHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.appmanager.ApplicationsDetailsActivity", lpparam.classLoader, "onCreateOptionsMenu", Menu.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Activity act = (Activity)param.thisObject;
- Menu menu = (Menu)param.args[0];
- MenuItem dis = menu.add(0, 666, 1, act.getResources().getIdentifier("app_manager_disable_text", "string", lpparam.packageName));
- dis.setIcon(act.getResources().getIdentifier("action_button_stop", "drawable", lpparam.packageName));
- dis.setEnabled(true);
- dis.setShowAsAction(1);
- //XposedHelpers.setAdditionalInstanceField(param.thisObject, "mDisableButton", dis);
-
- PackageManager pm = act.getPackageManager();
- Field piField = XposedHelpers.findFirstFieldByExactType(act.getClass(), PackageInfo.class);
- PackageInfo mPackageInfo = (PackageInfo)piField.get(act);
- ApplicationInfo appInfo = pm.getApplicationInfo(mPackageInfo.packageName, PackageManager.GET_META_DATA);
- boolean isSystem = (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
- boolean isUpdatedSystem = (appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
-
- dis.setTitle(act.getResources().getIdentifier(appInfo.enabled ? "app_manager_disable_text" : "app_manager_enable_text", "string", lpparam.packageName));
-
- if (!appInfo.enabled || (isSystem && !isUpdatedSystem)) {
- MenuItem item = menu.findItem(2);
- if (item != null) item.setVisible(false);
- }
- }
- });
-
- Helpers.findAndHookMethod("com.miui.appmanager.ApplicationsDetailsActivity", lpparam.classLoader, "onOptionsItemSelected", MenuItem.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- MenuItem item = (MenuItem)param.args[0];
- if (item == null || item.getItemId() != 666) return;
-
- Activity act = (Activity)param.thisObject;
- Resources modRes = Helpers.getModuleRes(act);
- Field piField = XposedHelpers.findFirstFieldByExactType(act.getClass(), PackageInfo.class);
- PackageInfo mPackageInfo = (PackageInfo)piField.get(act);
- if ("com.android.settings".equals(mPackageInfo.packageName) || "com.google.android.packageinstaller".equals(mPackageInfo.packageName) || "com.android.packageinstaller".equals(mPackageInfo.packageName)) {
- Toast.makeText(act, modRes.getString(R.string.disable_app_settings), Toast.LENGTH_SHORT).show();
- return;
- }
-
- PackageManager pm = act.getPackageManager();
- ApplicationInfo appInfo = pm.getApplicationInfo(mPackageInfo.packageName, PackageManager.GET_META_DATA);
- boolean isSystem = (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
- int state = pm.getApplicationEnabledSetting(mPackageInfo.packageName);
- boolean isEnabledOrDefault = (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
- if (isEnabledOrDefault) {
- if (isSystem) {
- String title = modRes.getString(R.string.disable_app_title);
- String text = modRes.getString(R.string.disable_app_text);
- new AlertDialog.Builder(act).setTitle(title).setMessage(text).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- setAppState(act, mPackageInfo.packageName, item, false);
- }
- }).setNegativeButton(android.R.string.cancel, null).show();
- } else setAppState(act, mPackageInfo.packageName, item, false);
- } else setAppState(act, mPackageInfo.packageName, item, true);
- param.setResult(true);
- }
- });
- }
-
- public static void AppsRestrictHook(LoadPackageParam lpparam) {
- Method[] mGetAppInfo = XposedHelpers.findMethodsByExactParameters(findClass("com.miui.appmanager.AppManageUtils", lpparam.classLoader), ApplicationInfo.class, Object.class, String.class, int.class, int.class);
- if (mGetAppInfo.length == 0)
- Helpers.log("AppsRestrictHook", "Cannot find getAppInfo method!");
- else
- Helpers.hookMethod(mGetAppInfo[0], new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if ((int)param.args[2] == 128 && (int)param.args[3] == 0) {
- ApplicationInfo appInfo = (ApplicationInfo)param.getResult();
- appInfo.flags &= ~ApplicationInfo.FLAG_SYSTEM;
- param.setResult(appInfo);
- }
- }
- });
-
- Helpers.findAndHookMethod("com.miui.networkassistant.ui.fragment.ShowAppDetailFragment", lpparam.classLoader, "initFirewallData", new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- Object mAppInfo = XposedHelpers.getObjectField(param.thisObject, "mAppInfo");
- if (mAppInfo != null) XposedHelpers.setBooleanField(mAppInfo, "isSystemApp", false);
- }
- });
-
- Helpers.hookAllMethods("com.miui.networkassistant.service.FirewallService", lpparam.classLoader, "setSystemAppWifiRuleAllow", XC_MethodReplacement.DO_NOTHING);
- }
-
- @SuppressWarnings("unchecked")
- public static void AppsRestrictPowerHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.miui.powerkeeper.provider.PowerKeeperConfigureManager", lpparam.classLoader, "pkgHasIcon", String.class, XC_MethodReplacement.returnConstant(true));
- //Helpers.hookAllMethods("com.miui.powerkeeper.provider.PowerKeeperConfigureManager", lpparam.classLoader, "isControlApp", XC_MethodReplacement.returnConstant(true));
-
- Helpers.findAndHookMethod("com.miui.powerkeeper.provider.PreSetGroup", lpparam.classLoader, "initGroup", new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- HashMap mGroupHeadUidMap = (HashMap)XposedHelpers.getStaticObjectField(findClass("com.miui.powerkeeper.provider.PreSetGroup", lpparam.classLoader), "mGroupHeadUidMap");
- mGroupHeadUidMap.clear();
- }
- });
-
- Helpers.findAndHookMethod("com.miui.powerkeeper.provider.PreSetApp", lpparam.classLoader, "isPreSetApp", String.class, XC_MethodReplacement.returnConstant(false));
- Helpers.hookAllMethods("com.miui.powerkeeper.utils.Utils", lpparam.classLoader, "pkgHasIcon", XC_MethodReplacement.returnConstant(true));
- }
-
- public static void AlarmCompatHook() {
- Helpers.findAndHookMethod(Settings.System.class, "getStringForUser", ContentResolver.class, String.class, int.class, new MethodHook() {
- @Override
- protected void before(final MethodHookParam param) throws Throwable {
- ContentResolver resolver = (ContentResolver)param.args[0];
- String pkgName = (String)XposedHelpers.callMethod(resolver, "getPackageName");
- String key = (String)param.args[1];
- if ("next_alarm_formatted".equals(key) && MainModule.mPrefs.getStringSet("various_alarmcompat_apps").contains(pkgName))
- param.args[1] = "next_alarm_clock_formatted";
- }
- });
- }
-
- public static void AlarmCompatServiceHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.AlarmManagerService", lpparam.classLoader, "onBootPhase", int.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- if ((int)param.args[0] != 500 /*PHASE_SYSTEM_SERVICES_READY*/) return;
-
- Context mContext = (Context)XposedHelpers.callMethod(param.thisObject, "getContext");
- if (mContext == null) {
- Helpers.log("AlarmCompatServiceHook", "Context is NULL");
- return;
- }
- ContentResolver resolver = mContext.getContentResolver();
- ContentObserver alarmObserver = new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange) {
- if (selfChange) return;
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mNextAlarmTime", Helpers.getNextMIUIAlarmTime(mContext));
- }
- };
- alarmObserver.onChange(false);
- resolver.registerContentObserver(Settings.System.getUriFor("next_alarm_clock_formatted"), false, alarmObserver);
- }
- });
-
- Helpers.findAndHookMethod("com.android.server.AlarmManagerService", lpparam.classLoader, "getNextAlarmClockImpl", int.class, new MethodHook() {
- @Override
- protected void after(final MethodHookParam param) throws Throwable {
- Context mContext = (Context)XposedHelpers.callMethod(param.thisObject, "getContext");
- String pkgName = mContext.getPackageManager().getNameForUid(Binder.getCallingUid());
- Object mNextAlarmTime = XposedHelpers.getAdditionalInstanceField(param.thisObject, "mNextAlarmTime");
- if (mNextAlarmTime != null && MainModule.mPrefs.getStringSet("various_alarmcompat_apps").contains(pkgName))
- param.setResult((long)mNextAlarmTime == 0 ? null : new AlarmManager.AlarmClockInfo((long)mNextAlarmTime, null));
- }
- });
- }
-
- public static void ShowCallUIHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.android.incallui.InCallPresenter", lpparam.classLoader, "startUi", new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- if (!(boolean)param.getResult() || !"INCOMING".equals(param.args[0].toString())) return;
- try {
- boolean isCarMode = (boolean)XposedHelpers.callStaticMethod(XposedHelpers.findClass("com.android.incallui.util.Utils.CarMode", lpparam.classLoader), "isCarMode");
- if (isCarMode) return;
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- if (MainModule.mPrefs.getStringAsInt("various_showcallui", 0) == 1)
- if (Settings.Global.getInt(mContext.getContentResolver(), Helpers.modulePkg + ".foreground.fullscreen", 0) == 1) return;
-
- XposedHelpers.callMethod(param.thisObject, "showInCall", false, false);
- Object mStatusBarNotifier = XposedHelpers.getObjectField(param.thisObject, "mStatusBarNotifier");
- if (mStatusBarNotifier != null) XposedHelpers.callMethod(mStatusBarNotifier, "cancelInCall");
- param.setResult(true);
- }
- });
- }
-
- public static void InCallBrightnessHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.incallui.InCallActivity", lpparam.classLoader, "onCreate", Bundle.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Activity act = (Activity)param.thisObject;
-
- int opt = Integer.parseInt(Helpers.getSharedStringPref(act, "pref_key_various_calluibright_type", "0"));
- if (opt == 1 || opt == 2) {
- Object presenter = XposedHelpers.callStaticMethod(XposedHelpers.findClass("com.android.incallui.InCallPresenter", lpparam.classLoader), "getInstance");
- if (presenter == null) {
- Helpers.log("InCallBrightnessHook", "InCallPresenter is null");
- return;
- }
-
- String state = String.valueOf(XposedHelpers.callMethod(presenter, "getInCallState"));
- if (opt == 1 && !"INCOMING".equals(state)) return;
- else if (opt == 2 && !"OUTGOING".equals(state) && !"PENDING_OUTGOING".equals(state)) return;
- }
-
- String key = "pref_key_various_calluibright_night";
- boolean checkNight = Helpers.getSharedBoolPref(act, key, false);
- if (checkNight) {
- int start_hour = Helpers.getSharedIntPref(act, key + "_start_hour", 0);
- int start_minute = Helpers.getSharedIntPref(act, key + "_start_minute", 0);
- int end_hour = Helpers.getSharedIntPref(act, key + "_end_hour", 0);
- int end_minute = Helpers.getSharedIntPref(act, key + "_end_minute", 0);
-
- SimpleDateFormat formatter = new SimpleDateFormat("H:m", Locale.ENGLISH);
- formatter.setTimeZone(TimeZone.getDefault());
- Date start = formatter.parse(start_hour + ":" + start_minute);
- Date end = formatter.parse(end_hour + ":" + end_minute);
- Date now = formatter.parse(formatter.format(new Date()));
- if (start == null || end == null || now == null) return;
-
- boolean isNight = start.before(end) ? now.after(start) && now.before(end) : now.before(end) || now.after(start);
- if (isNight) return;
- }
-
- WindowManager.LayoutParams params = act.getWindow().getAttributes();
- int val = Helpers.getSharedIntPref(act, "pref_key_various_calluibright_val", 0);
- if (val == 0) return;
- params.screenBrightness = val / 100f;
- act.getWindow().setAttributes(params);
- }
- });
- }
-
- public static void CallReminderHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.server.telecom.MiuiMissedCallNotifierImpl", lpparam.classLoader, "startRepeatReminder", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.setResult(null);
- if ((int)XposedHelpers.callMethod(param.thisObject, "getRepeatTimes") > 0) {
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
- AlarmManager alarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
- int interval = Helpers.getSharedIntPref(mContext, "pref_key_various_callreminder_interval", 5);
- PendingIntent repeatAlarmPendingIntent = (PendingIntent)XposedHelpers.callMethod(param.thisObject, "getRepeatAlarmPendingIntent");
- alarmManager.cancel(repeatAlarmPendingIntent);
- alarmManager.setExact(AlarmManager.RTC_WAKEUP, currentTimeMillis() + interval * 60 * 1000L, repeatAlarmPendingIntent);
- }
- }
- });
-
- Helpers.findAndHookMethod("com.android.server.telecom.MiuiMissedCallNotifierImpl", lpparam.classLoader, "onRepeatReminder", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.setResult(null);
- Context mContext = (Context)XposedHelpers.getObjectField(param.thisObject, "mContext");
-
- Object remindTime = XposedHelpers.callMethod(param.thisObject, "getMinAndIncreaseMissCallRemindTime", true);
- int repeatTimes = remindTime == null ? -1 : (int)XposedHelpers.callMethod(param.thisObject, "getRepeatTimes") - XposedHelpers.getIntField(remindTime, "remindTimes");
- if (repeatTimes >= 0) {
- String uriStr = Helpers.getSharedStringPref(mContext, "pref_key_various_callreminder_sound", "");
- if (!TextUtils.isEmpty(uriStr)) {
- Uri uri = Uri.parse(uriStr);
- Ringtone ringtone = RingtoneManager.getRingtone(mContext, uri);
- if (ringtone != null) {
- if (ringtone.isPlaying()) ringtone.stop();
- ringtone.setAudioAttributes(new AudioAttributes.Builder().setLegacyStreamType(AudioManager.STREAM_NOTIFICATION).build());
- ringtone.play();
- XposedHelpers.setAdditionalInstanceField(param.thisObject, "mCurrentRingtone", ringtone);
- }
- }
-
- Helpers.performCustomVibration(mContext,
- Integer.parseInt(Helpers.getSharedStringPref(mContext, "pref_key_various_callreminder_vibration", "0")),
- Helpers.getSharedStringPref(mContext, "pref_key_various_callreminder_vibration_own", "")
- );
- }
-
- if (repeatTimes > 0) {
- int interval = Helpers.getSharedIntPref(mContext, "pref_key_various_callreminder_interval", 5);
- ((AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE)).setExact(AlarmManager.RTC_WAKEUP, currentTimeMillis() + interval * 60 * 1000, (PendingIntent)XposedHelpers.callMethod(param.thisObject, "getRepeatAlarmPendingIntent"));
- } else {
- XposedHelpers.callMethod(param.thisObject, "cancelRepeatReminder");
- }
- }
- });
-
- Helpers.findAndHookMethod("com.android.server.telecom.MiuiMissedCallNotifierImpl", lpparam.classLoader, "cancelMissedCallNotification", String.class, boolean.class, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Ringtone ringtone = (Ringtone)XposedHelpers.getAdditionalInstanceField(param.thisObject, "mCurrentRingtone");
- if (ringtone != null && ringtone.isPlaying()) ringtone.stop();
- }
- });
- }
-
- private static TextView createTitleTextView(Context context, ViewGroup.LayoutParams lp, int resId) {
- TextView tv = new TextView(context);
- tv.setMaxLines(1);
- tv.setSingleLine(true);
- tv.setGravity(Gravity.START);
- tv.setLayoutParams(lp);
- tv.setTextAppearance(resId != -1 ? resId : android.R.style.TextAppearance_DeviceDefault);
- return tv;
- }
-
- private static TextView createValueTextView(Context context, ViewGroup.LayoutParams lp, int resId, int gravity) {
- TextView tv = new TextView(context);
- tv.setMaxLines(1);
- tv.setSingleLine(true);
- tv.setGravity(gravity);
- tv.setEllipsize(TextUtils.TruncateAt.START);
- tv.setLayoutParams(lp);
- tv.setTextAppearance(resId != -1 ? resId : android.R.style.TextAppearance_DeviceDefault);
- return tv;
- }
-
- public static void AppInfoDuringInstallHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.packageinstaller.PackageInstallerActivity", lpparam.classLoader, "startInstallConfirm", new MethodHook() {
- @Override
- @SuppressLint("SetTextI18n")
- protected void after(MethodHookParam param) throws Throwable {
- Activity act = (Activity)param.thisObject;
- PackageInfo mPkgInfo = (PackageInfo)XposedHelpers.getObjectField(param.thisObject, "mPkgInfo");
- if (mPkgInfo == null) return;
-
- float density = act.getResources().getDisplayMetrics().density;
-
- TypedArray a = act.obtainStyledAttributes(new int[]{android.R.attr.textAppearance});
- int resId = a.getResourceId(0, -1);
- a.recycle();
-
- PackageInfo mAppInfo = null;
- try {
- PackageManager mPm = (PackageManager)XposedHelpers.getObjectField(param.thisObject, "mPm");
- mAppInfo = mPm.getPackageInfo(mPkgInfo.packageName, 0);
- } catch (Throwable ignore) {}
-
- Resources modRes = Helpers.getModuleRes(act);
-
- LinearLayout container = new LinearLayout(act);
- LinearLayout.LayoutParams lpCont = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- lpCont.setMargins(Math.round(16.0f * density), Math.round(8.0f * density), Math.round(16.0f * density), Math.round(4.0f * density));
- container.setLayoutParams(lpCont);
- container.setOrientation(LinearLayout.VERTICAL);
-
- LinearLayout name = new LinearLayout(act);
- name.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- name.setOrientation(LinearLayout.HORIZONTAL);
-
- LinearLayout.LayoutParams lpInfoTitle = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- lpInfoTitle.setMargins(0, 0, Math.round(20.0f * density), 0);
- TextView infoTitle = createTitleTextView(act, lpInfoTitle, resId);
- infoTitle.setText(modRes.getString(R.string.various_installappinfo_package));
- LinearLayout.LayoutParams lpInfo = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- lpInfo.weight = 1;
- TextView info = createValueTextView(act, lpInfo, resId, Gravity.END);
- info.setText(mPkgInfo.applicationInfo.packageName);
-
- name.addView(infoTitle);
- name.addView(info);
-
- TableLayout table = new TableLayout(act);
- LinearLayout.LayoutParams lpTable = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- table.setLayoutParams(lpTable);
- table.setColumnStretchable(0, false);
- table.setColumnStretchable(1, true);
- table.setColumnStretchable(2, false);
- table.setColumnShrinkable(0, false);
- table.setColumnShrinkable(1, true);
- table.setColumnShrinkable(2, false);
-
- TableLayout.LayoutParams lpRow = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT);
- lpRow.gravity = Gravity.BOTTOM;
- TableRow row1 = new TableRow(act); row1.setLayoutParams(lpRow);
- TableRow row2 = new TableRow(act); row2.setLayoutParams(lpRow);
- TableRow row3 = new TableRow(act); row3.setLayoutParams(lpRow);
-
- TableRow.LayoutParams lp0 = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
- lp0.column = 0;
- lp0.setMargins(0, 0, Math.round(20.0f * density), 0);
- TableRow.LayoutParams lp1 = new TableRow.LayoutParams(0, TableRow.LayoutParams.MATCH_PARENT);
- lp1.column = 1;
- lp1.weight = 1;
- FrameLayout.LayoutParams lp2 = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
- lp2.gravity = Gravity.BOTTOM | Gravity.END;
- lp2.setMargins(0, 0, Math.round(20.0f * density), 0);
- TableRow.LayoutParams lp3 = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
- lp3.column = 2;
-
- TextView infoTitle1 = createTitleTextView(act, lp0, resId);
- infoTitle1.setText(modRes.getString(R.string.various_installappinfo_vername));
- TextView infoTitle2 = createTitleTextView(act, lp0, resId);
- infoTitle2.setText(modRes.getString(R.string.various_installappinfo_vercode));
- TextView infoTitle3 = createTitleTextView(act, lp0, resId);
- infoTitle3.setText(modRes.getString(R.string.various_installappinfo_sdk));
-
- FrameLayout dummy1 = new FrameLayout(act); dummy1.setLayoutParams(lp1);
- FrameLayout dummy2 = new FrameLayout(act); dummy2.setLayoutParams(lp1);
- FrameLayout dummy3 = new FrameLayout(act); dummy3.setLayoutParams(lp1);
-
- String current = modRes.getString(R.string.various_installappinfo_current);
-
- TextView info1current = createValueTextView(act, lp2, resId, Gravity.START);
- if (mAppInfo != null) {
- SpannableString span = new SpannableString(current + " " + mAppInfo.versionName);
- span.setSpan(new RelativeSizeSpan(0.7f), 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- info1current.setText(span);
- } else info1current.setText(" ");
-
- TextView info2current = createValueTextView(act, lp2, resId, Gravity.START);
- if (mAppInfo != null) {
- SpannableString span = new SpannableString(current + " " + mAppInfo.versionCode);
- span.setSpan(new RelativeSizeSpan(0.7f), 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- info2current.setText(span);
- } else info2current.setText(" ");
-
- TextView info3current = createValueTextView(act, lp2, resId, Gravity.START);
- if (mAppInfo != null) {
- SpannableString span = new SpannableString(current + " " + mAppInfo.applicationInfo.minSdkVersion + "-" + mAppInfo.applicationInfo.targetSdkVersion);
- span.setSpan(new RelativeSizeSpan(0.7f), 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- info3current.setText(span);
- } else info3current.setText(" ");
-
- TextView info1 = createValueTextView(act, lp3, resId, Gravity.END);
- info1.setText(mPkgInfo.versionName);
- TextView info2 = createValueTextView(act, lp3, resId, Gravity.END);
- info2.setText(String.valueOf(mPkgInfo.versionCode));
- TextView info3 = createValueTextView(act, lp3, resId, Gravity.END);
- info3.setText(mPkgInfo.applicationInfo.minSdkVersion + "-" + mPkgInfo.applicationInfo.targetSdkVersion);
-
- row1.addView(infoTitle1);
- row2.addView(infoTitle2);
- row3.addView(infoTitle3);
-
- row1.addView(dummy1); dummy1.addView(info1current);
- row2.addView(dummy2); dummy2.addView(info2current);
- row3.addView(dummy3); dummy3.addView(info3current);
-
- row1.addView(info1);
- row2.addView(info2);
- row3.addView(info3);
-
- table.addView(row1);
- table.addView(row2);
- table.addView(row3);
-
- container.addView(name);
- container.addView(table);
-
- boolean isDialog = false;
- try { isDialog = "com.android.internal.app.AlertActivity".equals(act.getClass().getSuperclass().getCanonicalName()); } catch (Throwable ignore) {}
- ViewGroup parent = (ViewGroup)act.findViewById(act.getResources().getIdentifier("install_confirm_question", "id", "com.android.packageinstaller")).getParent();
- if (parent.getChildCount() == 1) parent = ((ViewGroup)parent.getParent());
- if (!isDialog) {
- parent.addView(container, parent.getChildCount() - 1);
- } else {
- ViewGroup fParent = parent;
- parent.post(new Runnable() {
- @Override
- public void run() {
- try {
- if (fParent.getMeasuredHeight() == 0)
- fParent.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
- ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)container.getLayoutParams();
- lp.topMargin += fParent.getMeasuredHeight();
- lp.leftMargin = 0;
- lp.rightMargin = 0;
- container.setLayoutParams(lp);
- fParent.addView(container, fParent.getChildCount() - 1);
- } catch (Throwable ignore) {}
- }
- });
- }
- }
- });
- }
-
- public static void AppInfoDuringMiuiInstallHook(LoadPackageParam lpparam) {
- Method[] methods = XposedHelpers.findMethodsByExactParameters(findClass("com.android.packageinstaller.PackageInstallerActivity", lpparam.classLoader), void.class, String.class);
- if (methods.length == 0) {
- Helpers.log("AppInfoDuringMiuiInstallHook", "Cannot find appropriate method");
- return;
- }
- for (Method method: methods)
- Helpers.hookMethod(method, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- Activity act = (Activity)param.thisObject;
- TextView version = act.findViewById(act.getResources().getIdentifier("install_version", "id", lpparam.packageName));
- Field fPkgInfo = XposedHelpers.findFirstFieldByExactType(param.thisObject.getClass(), PackageInfo.class);
- PackageInfo mPkgInfo = (PackageInfo)fPkgInfo.get(param.thisObject);
- if (version == null || mPkgInfo == null) return;
-
- TextView source = act.findViewById(act.getResources().getIdentifier("install_source", "id", lpparam.packageName));
- source.setGravity(Gravity.CENTER_HORIZONTAL);
- source.setText(mPkgInfo.packageName);
-
- PackageInfo mAppInfo = null;
- try {
- mAppInfo = act.getPackageManager().getPackageInfo(mPkgInfo.packageName, 0);
- } catch (Throwable ignore) {}
-
- //String size = "";
- //String[] texts = version.getText().toString().split("\\|");
- //if (texts.length >= 2) size = texts[1].trim();
-
- Resources modRes = Helpers.getModuleRes(act);
-
- SpannableStringBuilder builder = new SpannableStringBuilder();
- //if (!TextUtils.isEmpty(size)) builder.append(size).append("\n");
- builder.append(modRes.getString(R.string.various_installappinfo_vername)).append(":\t\t");
- if (mAppInfo != null) builder.append(mAppInfo.versionName).append(" ➟ ");
- builder.append(mPkgInfo.versionName).append("\n");
- builder.append(modRes.getString(R.string.various_installappinfo_vercode)).append(":\t\t");
- if (mAppInfo != null) builder.append(String.valueOf(mAppInfo.versionCode)).append(" ➟ ");
- builder.append(String.valueOf(mPkgInfo.versionCode)).append("\n");
- builder.append(modRes.getString(R.string.various_installappinfo_sdk)).append(":\t\t");
- if (mAppInfo != null) builder.append(String.valueOf(mAppInfo.applicationInfo.minSdkVersion)).append("-").append(String.valueOf(mAppInfo.applicationInfo.targetSdkVersion)).append(" ➟ ");
- builder.append(String.valueOf(mPkgInfo.applicationInfo.minSdkVersion)).append("-").append(String.valueOf(mPkgInfo.applicationInfo.targetSdkVersion));
-
- version.setGravity(Gravity.CENTER_HORIZONTAL);
- version.setSingleLine(false);
- version.setMaxLines(10);
- version.setText(builder);
- version.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13.09f);
- }
- });
- }
-
- public static void MiuiPackageInstallerServiceHook(LoadPackageParam lpparam) {
- MethodHook hook = new MethodHook() {
- @Override
- @SuppressWarnings({"unchecked", "ConstantConditions"})
- protected void after(MethodHookParam param) throws Throwable {
- try {
- if (param.args[0] == null) return;
- Intent origIntent = (Intent)param.args[0];
- Intent intent = (Intent)origIntent.clone();
- String action = intent.getAction();
- if (!Intent.ACTION_INSTALL_PACKAGE.equals(action)) return;
- //XposedBridge.log(intent.getPackage() + ": " + intent.getType() + " | " + intent.getDataString());
- boolean res = false;
- try {
- res = XposedHelpers.callMethod(param.thisObject, "getPackageInfo", "com.miui.packageinstaller", 0, 0) != null;
- } catch (Throwable e) {}
- if (!res) return;
-
- List resolved = new ArrayList((List)param.getResult());
- ResolveInfo resolveInfo;
- Iterator itr = resolved.iterator();
- while (itr.hasNext()) {
- resolveInfo = itr.next();
- if (resolveInfo.activityInfo != null && !"com.miui.packageinstaller".equals(resolveInfo.activityInfo.packageName)) itr.remove();
- }
-
- if (resolved.size() > 0) param.setResult(resolved);
- } catch (Throwable t) {
- if (!(t instanceof BadParcelableException)) XposedBridge.log(t);
- }
- }
- };
-
- if (!Helpers.findAndHookMethodSilently("com.android.server.pm.PackageManagerService", lpparam.classLoader, "queryIntentActivitiesInternal", Intent.class, String.class, int.class, int.class, int.class, boolean.class, boolean.class, hook))
- Helpers.findAndHookMethod("com.android.server.pm.PackageManagerService", lpparam.classLoader, "queryIntentActivitiesInternal", Intent.class, String.class, int.class, int.class, hook);
- }
-
- public static void MiuiPackageInstallerHook(LoadPackageParam lpparam) {
- Helpers.findAndHookMethod("com.android.packageinstaller.PackageInstallerActivity", lpparam.classLoader, "onCreate", Bundle.class, new MethodHook() {
- @Override
- @SuppressWarnings("unchecked")
- protected void before(MethodHookParam param) throws Throwable {
- Activity act = (Activity)param.thisObject;
- List packs = act.getPackageManager().getInstalledApplications(PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DISABLED_COMPONENTS);
- for (Field field: param.thisObject.getClass().getDeclaredFields())
- if (field.getType() == List.class) {
- field.setAccessible(true);
- ArrayList whiteList = (ArrayList)field.get(param.thisObject);
- if (whiteList == null || whiteList.size() <= 1) continue;
- for (ApplicationInfo pack: packs)
- if (!whiteList.contains(pack.packageName)) whiteList.add(pack.packageName);
- }
- }
- });
- }
-
- public static final HashSet miuiApps = new HashSet(Arrays.asList(
- "com.android.camera",
- "com.android.soundrecorder",
- "com.android.cellbroadcastreceiver",
- "com.android.providers.downloads.ui"
- //"com.android.stk" ???
- ));
-
- public static void CollapseMIUITitlesHook(LoadPackageParam lpparam, XC_MethodHook.MethodHookParam param, int opt) {
- Application app = (Application)param.thisObject;
- String pkgName = app.getPackageName();
-
- boolean isMIUIapp = pkgName.startsWith("com.miui") || pkgName.startsWith("com.xiaomi") || miuiApps.contains(pkgName);
- if (!isMIUIapp) isMIUIapp = app.checkSelfPermission("miui.permission.USE_INTERNAL_GENERAL_API") == PackageManager.PERMISSION_GRANTED;
- if (!isMIUIapp) return;
-
- Class> abvCls = XposedHelpers.findClassIfExists("com.miui.internal.widget.AbsActionBarView", lpparam.classLoader);
- if (abvCls != null)
- Helpers.hookAllConstructors(abvCls, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- XposedHelpers.setIntField(param.thisObject, "mExpandState", ActionBar.STATE_COLLAPSE);
- XposedHelpers.setIntField(param.thisObject, "mInnerExpandState", ActionBar.STATE_COLLAPSE);
- if (opt == 3) XposedHelpers.setBooleanField(param.thisObject, "mResizable", false);
- }
- });
-
- abvCls = XposedHelpers.findClassIfExists("miuix.appcompat.internal.app.widget.ActionBarView", lpparam.classLoader);
- if (abvCls != null)
- Helpers.hookAllConstructors(abvCls, new MethodHook() {
- @Override
- protected void after(MethodHookParam param) throws Throwable {
- try {
- XposedHelpers.callMethod(param.thisObject, "setExpandState", ActionBar.STATE_COLLAPSE);
- if (opt == 3) XposedHelpers.callMethod(param.thisObject, "setResizable", false);
- } catch (Throwable ignore) {
- XposedBridge.log(ignore);
- }
- }
- });
- }
-
- public static void GboardPaddingHook() {
- Helpers.findAndHookMethod(findClass("android.os.SystemProperties", null), "get", String.class, new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- String key = (String)param.args[0];
- if (key.equals("ro.com.google.ime.kb_pad_port_b")) {
- int opt = MainModule.mPrefs.getInt("various_gboardpadding_port", 0);
- if (opt > 0) param.setResult(String.valueOf(opt));
- } else if (key.equals("ro.com.google.ime.kb_pad_land_b")) {
- int opt = MainModule.mPrefs.getInt("various_gboardpadding_land", 0);
- if (opt > 0) param.setResult(String.valueOf(opt));
- }
- }
- });
- }
-
- public static void ScreenRecorderFramerateHook(LoadPackageParam lpparam) {
- Helpers.hookAllMethods("com.miui.screenrecorder.config.ScreenRecorderConfig", lpparam.classLoader, "setFramesValue", new MethodHook() {
- @Override
- protected void before(MethodHookParam param) throws Throwable {
- param.args[0] = 90;
- }
- });
- }
-
-// public static void LargeCallerPhotoHook(LoadPackageParam lpparam) {
-// Helpers.findAndHookMethod("com.android.incallui.CallCardFragment", lpparam.classLoader, "setCallCardImage", Drawable.class, boolean.class, new MethodHook() {
-// @Override
-// protected void before(final MethodHookParam param) throws Throwable {
-// param.args[1] = true;
-// }
-// });
-//
-// Helpers.findAndHookMethod("com.android.incallui.CallCardFragment", lpparam.classLoader, "showBigAvatar", boolean.class, Drawable.class, new MethodHook() {
-// @Override
-// protected void before(final MethodHookParam param) throws Throwable {
-// //Helpers.log("showBigAvatar: " + String.valueOf(param.args[0]) + " | " + String.valueOf(param.args[1]));
-// if (param.args[1] == null)
-// param.setResult(null);
-// else
-// param.args[0] = true;
-// }
-// });
-// }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/prefs/CheckBoxPreferenceEx.java b/app/src/main/java/name/mikanoshi/customiuizer/prefs/CheckBoxPreferenceEx.java
deleted file mode 100644
index 344edc12..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/prefs/CheckBoxPreferenceEx.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package name.mikanoshi.customiuizer.prefs;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.preference.CheckBoxPreference;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class CheckBoxPreferenceEx extends CheckBoxPreference implements PreferenceState {
-
- private final Resources res = getContext().getResources();
- private final int primary = res.getColor(R.color.preference_primary_text, getContext().getTheme());
- private final int secondary = res.getColor(R.color.preference_secondary_text, getContext().getTheme());
- private final int childpadding = res.getDimensionPixelSize(R.dimen.preference_item_child_padding);
- private final int[] paddings = new int[] {0, 0, 0, 0};
-
- private final boolean child;
- private final boolean dynamic;
- private boolean newmod = false;
- private boolean unsupported = false;
-
- public CheckBoxPreferenceEx(Context context, AttributeSet attrs) {
- super(context, attrs);
- final TypedArray xmlAttrs = context.obtainStyledAttributes(attrs, R.styleable.CheckBoxPreferenceEx);
- dynamic = xmlAttrs.getBoolean(R.styleable.CheckBoxPreferenceEx_dynamic, false);
- child = xmlAttrs.getBoolean(R.styleable.CheckBoxPreferenceEx_child, false);
- xmlAttrs.recycle();
- }
-
- @Override
- @SuppressLint("SetTextI18n")
- public View getView(View view, ViewGroup parent) {
- View finalView = super.getView(view, parent);
- TextView title = finalView.findViewById(android.R.id.title);
- title.setTextColor(isEnabled() ? primary : secondary);
- title.setText(getTitle() + (unsupported ? " ⨯" : (dynamic ? " ⟲" : "")));
- if (newmod) Helpers.applyNewMod(title);
-
- if (paddings[0] == 0) paddings[0] = finalView.getPaddingLeft();
- if (paddings[1] == 0) paddings[1] = finalView.getPaddingTop();
- if (paddings[2] == 0) paddings[2] = finalView.getPaddingRight();
- if (paddings[3] == 0) paddings[3] = finalView.getPaddingBottom();
- finalView.setPadding(paddings[0] + (child ? childpadding : 0), paddings[1], paddings[2], paddings[3]);
-
- return finalView;
- }
-
- @Override
- protected View onCreateView(ViewGroup parent) {
- View view = super.onCreateView(parent);
-
- TextView title = view.findViewById(android.R.id.title);
- title.setMaxLines(3);
- title.setTextColor(primary);
-
- TextView summary = view.findViewById(android.R.id.summary);
- summary.setTextColor(secondary);
-
- return view;
- }
-
- public void setUnsupported(boolean value) {
- unsupported = value;
- setEnabled(!value);
- }
-
- @Override
- public void markAsNew() {
- newmod = true;
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/prefs/ListPreferenceEx.java b/app/src/main/java/name/mikanoshi/customiuizer/prefs/ListPreferenceEx.java
deleted file mode 100644
index 7e0610e1..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/prefs/ListPreferenceEx.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package name.mikanoshi.customiuizer.prefs;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.os.Bundle;
-import android.preference.ListPreference;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.widget.CheckedTextView;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class ListPreferenceEx extends ListPreference implements PreferenceState {
-
- private CharSequence sValue;
- private final Resources res = getContext().getResources();
- private final int primary = res.getColor(R.color.preference_primary_text, getContext().getTheme());
- private final int secondary = res.getColor(R.color.preference_secondary_text, getContext().getTheme());
- private final int childpadding = res.getDimensionPixelSize(R.dimen.preference_item_child_padding);
- private final int[] paddings = new int[] {0, 0, 0, 0};
-
- private final boolean child;
- private final boolean dynamic;
- private boolean newmod = false;
- private boolean unsupported = false;
- private final boolean valueAsSummary;
-
- public ListPreferenceEx(Context context, AttributeSet attrs) {
- super(context, attrs);
- final TypedArray xmlAttrs = context.obtainStyledAttributes(attrs, R.styleable.ListPreferenceEx);
- child = xmlAttrs.getBoolean(R.styleable.ListPreferenceEx_child, false);
- dynamic = xmlAttrs.getBoolean(R.styleable.ListPreferenceEx_dynamic, false);
- valueAsSummary = xmlAttrs.getBoolean(R.styleable.ListPreferenceEx_valueAsSummary, false);
- xmlAttrs.recycle();
- }
-
- @Override
- public void setValue(String value) {
- super.setValue(value);
- int index = findIndexOfValue(value);
- if (index < 0 || index > getEntries().length - 1) return;
- sValue = getEntries()[index];
- }
-
- public void setUnsupported(boolean value) {
- unsupported = value;
- setEnabled(!value);
- }
-
- @Override
- @SuppressLint("SetTextI18n")
- public View getView(View view, ViewGroup parent) {
- View finalView = super.getView(view, parent);
- TextView title = finalView.findViewById(android.R.id.title);
- TextView summary = finalView.findViewById(android.R.id.summary);
- TextView valSummary = finalView.findViewById(android.R.id.hint);
-
- summary.setVisibility(valueAsSummary || getSummary() == null || getSummary().equals("") ? View.GONE : View.VISIBLE);
- valSummary.setVisibility(valueAsSummary ? View.VISIBLE : View.GONE);
- valSummary.setText(valueAsSummary ? sValue : "");
- if (valueAsSummary && Helpers.is11()) valSummary.setTextColor(Helpers.isNightMode(getContext()) ? secondary : primary);
- title.setTextColor(isEnabled() ? primary : secondary);
- title.setText(getTitle() + (unsupported ? " ⨯" : (dynamic ? " ⟲" : "")));
- if (newmod) Helpers.applyNewMod(title);
-
- if (paddings[0] == 0) paddings[0] = finalView.getPaddingLeft();
- if (paddings[1] == 0) paddings[1] = finalView.getPaddingTop();
- if (paddings[2] == 0) paddings[2] = finalView.getPaddingRight();
- if (paddings[3] == 0) paddings[3] = finalView.getPaddingBottom();
- finalView.setPadding(paddings[0] + (child ? childpadding : 0), paddings[1], paddings[2], paddings[3]);
-
- return finalView;
- }
-
- @Override
- protected View onCreateView(ViewGroup parent) {
- ViewGroup view = (ViewGroup)super.onCreateView(parent);
-
- TextView title = view.findViewById(android.R.id.title);
- title.setMaxLines(3);
- title.setTextColor(primary);
-
- TextView summary = view.findViewById(android.R.id.summary);
- summary.setTextColor(secondary);
-
- TextView valSummary = new TextView(getContext());
- valSummary.setTextSize(TypedValue.COMPLEX_UNIT_PX, summary.getTextSize());
- valSummary.setTextColor(summary.getCurrentTextColor());
- valSummary.setPadding(summary.getPaddingLeft(), summary.getPaddingTop(), res.getDimensionPixelSize(R.dimen.preference_summary_padding_right), summary.getPaddingBottom());
- valSummary.setId(android.R.id.hint);
- view.addView(valSummary, 2);
-
- return view;
- }
-
- @Override
- protected void showDialog(Bundle state) {
- super.showDialog(state);
- final Window window = getDialog().getWindow();
- if (window == null) return;
-
- final int listResID = res.getIdentifier("select_dialog_listview", "id", "miui");
- final ListView listView = window.findViewById(listResID);
- if (listView != null)
- listView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
- @Override
- public void onChildViewAdded(View parent, View child) {
- if (child == null) return;
- if (child instanceof CheckedTextView) try {
- if (((CheckedTextView)child).isChecked())
- ((CheckedTextView)child).setTextColor(res.getColor(res.getIdentifier("highlight_normal_light", "color", "miui"), getContext().getTheme()));
- else if (Helpers.isNightMode(getContext()))
- ((CheckedTextView)child).setTextColor(res.getColor(res.getIdentifier("list_text_color_normal_dark", "color", "miui"), getContext().getTheme()));
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- @Override
- public void onChildViewRemoved(View parent, View child) {}
- });
- }
-
- @Override
- public void markAsNew() {
- newmod = true;
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/prefs/PreferenceCategoryEx.java b/app/src/main/java/name/mikanoshi/customiuizer/prefs/PreferenceCategoryEx.java
deleted file mode 100644
index cdaf75b3..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/prefs/PreferenceCategoryEx.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package name.mikanoshi.customiuizer.prefs;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.preference.Preference;
-import android.preference.PreferenceCategory;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import name.mikanoshi.customiuizer.R;
-
-public class PreferenceCategoryEx extends PreferenceCategory {
-
- private final boolean dynamic;
- private final boolean empty;
- private boolean hidden;
- private boolean unsupported = false;
-
- public PreferenceCategoryEx(Context context, AttributeSet attrs) {
- super(context, attrs);
- final TypedArray xmlAttrs = context.obtainStyledAttributes(attrs, R.styleable.PreferenceCategoryEx);
- dynamic = xmlAttrs.getBoolean(R.styleable.PreferenceCategoryEx_dynamic, false);
- empty = xmlAttrs.getBoolean(R.styleable.PreferenceCategoryEx_empty, false);
- hidden = xmlAttrs.getBoolean(R.styleable.PreferenceCategoryEx_hidden, false);
- xmlAttrs.recycle();
- }
-
- @Override
- public boolean onPrepareAddPreference(Preference preference) {
- preference.onParentChanged(this, shouldDisableDependents());
- return true;
- }
-
- @Override
- @SuppressLint("SetTextI18n")
- public View getView(View view, ViewGroup parent) {
- View finalView = super.getView(view, parent);
- TextView title = finalView.findViewById(android.R.id.title);
- title.setText(getTitle() + (unsupported ? " ⨯" : (dynamic ? " ⟲" : "")));
- title.setVisibility(hidden || empty ? View.GONE : View.VISIBLE);
- if (hidden) {
- finalView.setBackground(null);
- finalView.setPadding(
- finalView.getPaddingLeft(),
- finalView.getPaddingTop() + Math.round(getContext().getResources().getDisplayMetrics().density * 10),
- finalView.getPaddingRight(),
- finalView.getPaddingBottom()
- );
- }
- return finalView;
- }
-
- public void setUnsupported(boolean value) {
- unsupported = value;
- setEnabled(!value);
- }
-
- public boolean isDynamic() {
- return dynamic;
- }
-
- public void hide() {
- hidden = true;
- this.notifyChanged();
- }
-
- public void show() {
- hidden = false;
- this.notifyChanged();
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/prefs/PreferenceEx.java b/app/src/main/java/name/mikanoshi/customiuizer/prefs/PreferenceEx.java
deleted file mode 100644
index 3c15d401..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/prefs/PreferenceEx.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package name.mikanoshi.customiuizer.prefs;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.preference.Preference;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import java.util.LinkedHashSet;
-
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class PreferenceEx extends Preference implements PreferenceState {
-
- private final Resources res = getContext().getResources();
- private final int primary = res.getColor(R.color.preference_primary_text, getContext().getTheme());
- private final int secondary = res.getColor(R.color.preference_secondary_text, getContext().getTheme());
- private final int childpadding = res.getDimensionPixelSize(R.dimen.preference_item_child_padding);
- private final int[] paddings = new int[] {0, 0, 0, 0};
-
- private final boolean child;
- private final boolean dynamic;
- private final boolean warning;
- private final boolean countAsSummary;
- private String customSummary = null;
- private boolean notice;
- private boolean newmod = false;
- private boolean unsupported = false;
-
- public PreferenceEx(Context context, AttributeSet attrs) {
- super(context, attrs);
- final TypedArray xmlAttrs = context.obtainStyledAttributes(attrs, R.styleable.PreferenceEx);
- dynamic = xmlAttrs.getBoolean(R.styleable.PreferenceEx_dynamic, false);
- child = xmlAttrs.getBoolean(R.styleable.PreferenceEx_child, false);
- warning = xmlAttrs.getBoolean(R.styleable.PreferenceEx_warning, false);
- notice = xmlAttrs.getBoolean(R.styleable.PreferenceEx_notice, false);
- countAsSummary = xmlAttrs.getBoolean(R.styleable.PreferenceEx_countAsSummary, false);
- xmlAttrs.recycle();
- }
-
- @Override
- @SuppressLint("SetTextI18n")
- public View getView(View view, ViewGroup parent) {
- View finalView = super.getView(view, parent);
- TextView title = finalView.findViewById(android.R.id.title);
- TextView summary = finalView.findViewById(android.R.id.summary);
- TextView valSummary = finalView.findViewById(android.R.id.hint);
-
- summary.setVisibility(customSummary != null || countAsSummary || getSummary() == null || getSummary().equals("") ? View.GONE : View.VISIBLE);
- valSummary.setVisibility(customSummary != null || countAsSummary ? View.VISIBLE : View.GONE);
- if (customSummary != null)
- valSummary.setText(customSummary);
- else if (countAsSummary) {
- int count = Helpers.prefs.getStringSet(getKey(), new LinkedHashSet()).size() + Helpers.prefs.getStringSet(getKey() + "_black", new LinkedHashSet()).size();
- valSummary.setText(String.valueOf(count));
- } else
- valSummary.setText(null);
- if (warning)
- title.setTextColor(Helpers.markColor);
- else
- title.setTextColor(isEnabled() ? primary : secondary);
- title.setText(getTitle() + (unsupported ? " ⨯" : (dynamic ? " ⟲" : "")));
- if (newmod) Helpers.applyNewMod(title);
-
- if (notice) try {
- ImageView arrow = finalView.findViewById(finalView.getResources().getIdentifier("arrow_right", "id", "miui"));
- if (arrow != null) arrow.setVisibility(View.GONE);
- } catch (Throwable ignore) {}
-
- if (paddings[0] == 0) paddings[0] = finalView.getPaddingLeft();
- if (paddings[1] == 0) paddings[1] = finalView.getPaddingTop();
- if (paddings[2] == 0) paddings[2] = finalView.getPaddingRight();
- if (paddings[3] == 0) paddings[3] = finalView.getPaddingBottom();
- finalView.setPadding(paddings[0] + (child ? childpadding : 0), paddings[1], paddings[2], paddings[3]);
-
- return finalView;
- }
-
- public void setCustomSummary(String text) {
- customSummary = text;
- notifyChanged();
- }
-
- @Override
- protected View onCreateView(ViewGroup parent) {
- ViewGroup view = (ViewGroup)super.onCreateView(parent);
-
- TextView title = view.findViewById(android.R.id.title);
- title.setMaxLines(3);
- title.setTextColor(primary);
-
- TextView summary = view.findViewById(android.R.id.summary);
- summary.setTextColor(secondary);
-
- TextView valSummary = new TextView(getContext());
- valSummary.setTextSize(TypedValue.COMPLEX_UNIT_PX, summary.getTextSize());
- valSummary.setTextColor(summary.getCurrentTextColor());
- valSummary.setPadding(summary.getPaddingLeft(), summary.getPaddingTop(), res.getDimensionPixelSize(R.dimen.preference_summary_padding_right), summary.getPaddingBottom());
- valSummary.setId(android.R.id.hint);
- view.addView(valSummary, 2);
-
- return view;
- }
-
- @Override
- public void markAsNew() {
- newmod = true;
- }
-
- public void setNotice(boolean value) {
- notice = value;
- setEnabled(!value);
- }
-
- public void setUnsupported(boolean value) {
- unsupported = value;
- setEnabled(!value);
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/prefs/PreferenceState.java b/app/src/main/java/name/mikanoshi/customiuizer/prefs/PreferenceState.java
deleted file mode 100644
index 469aaa0f..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/prefs/PreferenceState.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package name.mikanoshi.customiuizer.prefs;
-
-public interface PreferenceState {
- void markAsNew();
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/qs/DarkModeService.java b/app/src/main/java/name/mikanoshi/customiuizer/qs/DarkModeService.java
deleted file mode 100644
index 2ac8728e..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/qs/DarkModeService.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package name.mikanoshi.customiuizer.qs;
-
-import android.app.UiModeManager;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Icon;
-import android.service.quicksettings.Tile;
-import android.service.quicksettings.TileService;
-import android.widget.Toast;
-
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class DarkModeService extends TileService {
-
- void updateTile() {
- Tile tile = this.getQsTile();
- if (tile == null) return;
-
- Icon newIcon;
- int newState;
-
- UiModeManager uiManager = (UiModeManager)getSystemService(Context.UI_MODE_SERVICE);
- if (uiManager.getNightMode() == UiModeManager.MODE_NIGHT_YES) {
- newIcon = Icon.createWithResource(getApplicationContext(), R.drawable.ic_qs_darkmode_enabled);
- newState = Tile.STATE_ACTIVE;
- } else {
- newIcon = Icon.createWithResource(getApplicationContext(), R.drawable.ic_qs_darkmode_disabled);
- newState = Tile.STATE_INACTIVE;
- }
-
- tile.setIcon(newIcon);
- tile.setState(newState);
- tile.updateTile();
- }
-
- private void switchTileState() {
- try {
- if (!checkUIModePermission()) {
- Toast.makeText(this, R.string.qs_toggle_darkmode_noperm, Toast.LENGTH_LONG).show();
- } else {
- UiModeManager uiManager = (UiModeManager)getSystemService(Context.UI_MODE_SERVICE);
- uiManager.setNightMode(uiManager.getNightMode() != UiModeManager.MODE_NIGHT_YES ? UiModeManager.MODE_NIGHT_YES : UiModeManager.MODE_NIGHT_NO);
- }
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- @Override
- public void onTileAdded() {
- updateTile();
- }
-
- @Override
- public void onTileRemoved() {}
-
- @Override
- public void onClick() {
- switchTileState();
- updateTile();
- }
-
- @Override
- public void onStartListening() {
- updateTile();
- }
-
- @Override
- public void onStopListening() {}
-
- private boolean checkUIModePermission() {
- PackageManager pm = getPackageManager();
- return pm.checkPermission("android.permission.MODIFY_DAY_NIGHT_MODE", Helpers.modulePkg) == PackageManager.PERMISSION_GRANTED;
- }
-
-}
-
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/subs/CategorySelector.java b/app/src/main/java/name/mikanoshi/customiuizer/subs/CategorySelector.java
deleted file mode 100644
index edceef6d..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/subs/CategorySelector.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package name.mikanoshi.customiuizer.subs;
-
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceScreen;
-
-import name.mikanoshi.customiuizer.MainFragment;
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.SubFragment;
-import name.mikanoshi.customiuizer.prefs.PreferenceEx;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class CategorySelector extends SubFragment {
-
- String cat = null;
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- Bundle args = getArguments();
- cat = args.getString("cat");
-
- if ("pref_key_system".equals(cat)) {
- if (!Helpers.is12()) {
- Preference pref = findPreference("pref_key_system_cat_floatingwindows");
- if (pref != null) ((PreferenceScreen)findPreference("pref_key_cat")).removePreference(pref);
- }
- }
-
- PreferenceScreen screen = (PreferenceScreen)findPreference("pref_key_cat");
- int cnt = screen.getPreferenceCount();
- for (int i = 0; i < cnt; i++)
- screen.getPreference(i).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- if (!(preference instanceof PreferenceEx)) return false;
- Bundle bundle = new Bundle();
- bundle.putString("sub", preference.getKey());
- MainFragment mainFrag = ((MainFragment)getTargetFragment());
- switch (cat) {
- case "pref_key_system":
- openSubFragment(mainFrag.prefSystem, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.system_mods, R.xml.prefs_system);
- break;
- case "pref_key_launcher":
- openSubFragment(mainFrag.prefLauncher, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.launcher_title, R.xml.prefs_launcher);
- break;
- case "pref_key_controls":
- openSubFragment(mainFrag.prefControls, bundle, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.controls_mods, R.xml.prefs_controls);
- break;
- }
- return true;
- }
- });
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/subs/Launcher.java b/app/src/main/java/name/mikanoshi/customiuizer/subs/Launcher.java
deleted file mode 100644
index 5f35b0f3..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/subs/Launcher.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package name.mikanoshi.customiuizer.subs;
-
-import android.Manifest;
-import android.content.pm.PackageManager;
-import android.os.Bundle;
-import android.preference.Preference;
-import android.widget.SeekBar;
-
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.SubFragment;
-import name.mikanoshi.customiuizer.prefs.CheckBoxPreferenceEx;
-import name.mikanoshi.customiuizer.prefs.SeekBarPreference;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class Launcher extends SubFragment {
-
- String sub = "";
-
- @Override
- @SuppressWarnings("ConstantConditions")
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- Bundle args = getArguments();
- sub = args.getString("sub");
- if (sub == null) sub = "";
-
- selectSub("pref_key_launcher", sub);
-
- Preference.OnPreferenceClickListener openPrivacyAppEdit = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openPrivacyAppEdit(Launcher.this, 0);
- return true;
- }
- };
-
- Preference.OnPreferenceClickListener openLaunchableList = new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openLaunchableList(preference, Launcher.this, 0);
- return true;
- }
- };
-
- int opt = Integer.parseInt(Helpers.prefs.getString("pref_key_launcher_mods", "1"));
-
- switch (sub) {
- case "pref_key_launcher_cat_folders":
- SeekBarPreference folderCols = (SeekBarPreference)findPreference("pref_key_launcher_folder_cols");
- findPreference("pref_key_launcher_folderwidth").setEnabled(Helpers.prefs.getInt("pref_key_launcher_folder_cols", 1) > 1);
- findPreference("pref_key_launcher_folderspace").setEnabled(Helpers.prefs.getInt("pref_key_launcher_folder_cols", 1) > 3);
- folderCols.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {}
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- findPreference("pref_key_launcher_folderwidth").setEnabled(seekBar.getProgress() > 0);
- findPreference("pref_key_launcher_folderspace").setEnabled(seekBar.getProgress() > 2);
- }
- });
- findPreference("pref_key_launcher_foldershade_level").setEnabled(!"1".equals(Helpers.prefs.getString("pref_key_launcher_foldershade", "1")));
- findPreference("pref_key_launcher_foldershade").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- findPreference("pref_key_launcher_foldershade_level").setEnabled(!"1".equals(newValue));
- return true;
- }
- });
- findPreference("pref_key_launcher_folderblur_cat").setEnabled(opt == 1);
- findPreference("pref_key_launcher_folderblur_cat").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- openSubFragment(new Launcher_FolderBlur(), null, Helpers.SettingsType.Preference, Helpers.ActionBarType.HomeUp, R.string.launcher_folderblur_title, R.xml.prefs_launcher_folderblur);
- return true;
- }
- });
- break;
- case "pref_key_launcher_cat_gestures":
- findPreference("pref_key_launcher_swipedown").setOnPreferenceClickListener(openLauncherActions);
- findPreference("pref_key_launcher_swipedown2").setOnPreferenceClickListener(openLauncherActions);
- findPreference("pref_key_launcher_swipeup").setOnPreferenceClickListener(openLauncherActions);
- findPreference("pref_key_launcher_swipeup2").setOnPreferenceClickListener(openLauncherActions);
- findPreference("pref_key_launcher_swiperight").setOnPreferenceClickListener(openLauncherActions);
- findPreference("pref_key_launcher_swipeleft").setOnPreferenceClickListener(openLauncherActions);
- findPreference("pref_key_launcher_shake").setOnPreferenceClickListener(openLauncherActions);
- findPreference("pref_key_launcher_doubletap").setOnPreferenceClickListener(openLauncherActions);
- findPreference("pref_key_launcher_pinch").setOnPreferenceClickListener(openLauncherActions);
- findPreference("pref_key_launcher_spread").setOnPreferenceClickListener(openLauncherActions);
- findPreference("pref_key_launcher_swipeup").setEnabled(opt == 1);
- break;
- case "pref_key_launcher_cat_privacyapps":
- findPreference("pref_key_launcher_cat_privacyapps").setEnabled(opt == 1);
- findPreference("pref_key_launcher_privacyapps_list").setOnPreferenceClickListener(openPrivacyAppEdit);
-
- if (!checkPermissions()) {
- Preference pref = findPreference("pref_key_launcher_privacyapps_list");
- pref.setSummary(R.string.launcher_privacyapps_fail);
- pref.setEnabled(false);
- }
-
- break;
- case "pref_key_launcher_cat_titles":
- findPreference("pref_key_launcher_renameapps_list").setOnPreferenceClickListener(openLaunchableList);
- break;
- case "pref_key_launcher_cat_bugfixes":
- //findPreference("pref_key_launcher_fixstatusbarmode").setEnabled(opt == 1);
- findPreference("pref_key_launcher_fixanim").setEnabled(opt == 1);
- break;
- case "pref_key_launcher_cat_other":
- findPreference("pref_key_launcher_unlockgrids").setEnabled(opt == 1);
- findPreference("pref_key_launcher_hideseekpoints").setEnabled(opt == 1);
- findPreference("pref_key_launcher_bottommargin").setEnabled(opt == 1);
- findPreference("pref_key_launcher_nounlockanim").setEnabled(opt == 1);
- findPreference("pref_key_launcher_oldlaunchanim").setEnabled(opt == 1);
- findPreference("pref_key_launcher_googlediscover").setEnabled(opt == 1);
- findPreference("pref_key_launcher_googleminus").setEnabled(opt == 1);
- findPreference("pref_key_launcher_closedrawer").setEnabled(opt == 1);
- Preference pref = findPreference("pref_key_launcher_googleminus");
- pref.setEnabled(opt == 1);
- if (!miui.os.Build.IS_INTERNATIONAL_BUILD) {
- ((CheckBoxPreferenceEx)pref).setUnsupported(true);
- pref.setSummary(R.string.launcher_googleminus_note);
- }
- break;
- }
- }
-
- private boolean checkPermissions() {
- PackageManager pm = getActivity().getPackageManager();
- return pm.checkPermission(Manifest.permission.WRITE_SECURE_SETTINGS, Helpers.modulePkg) == PackageManager.PERMISSION_GRANTED &&
- pm.checkPermission(Helpers.ACCESS_SECURITY_CENTER, Helpers.modulePkg) == PackageManager.PERMISSION_GRANTED;
- }
-
-// public boolean onCreateOptionsMenu(Menu menu) {
-// getMenuInflater().inflate(R.menu.menu_launcher, menu);
-// return true;
-// }
-//
-// @Override
-// public boolean onOptionsItemSelected(MenuItem item) {
-// if (item.getItemId() == R.id.restartlauncher)
-// try {
-// getActivity().sendBroadcast(new Intent(GlobalActions.ACTION_PREFIX + "RestartLauncher"));
-// } catch (Throwable e) {
-// e.printStackTrace();
-// }
-// return super.onOptionsItemSelected(item);
-// }
-//
-// private void setupImmersiveMenu() {
-// ActionBar actionBar = getActionBar();
-// if (actionBar != null) actionBar.showSplitActionBar(false, false);
-// setImmersionMenuEnabled(true);
-// }
-//
-// @Override
-// public void onResume() {
-// super.onResume();
-// setupImmersiveMenu();
-// }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/subs/Launcher_FolderBlur.java b/app/src/main/java/name/mikanoshi/customiuizer/subs/Launcher_FolderBlur.java
deleted file mode 100644
index f5cff676..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/subs/Launcher_FolderBlur.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package name.mikanoshi.customiuizer.subs;
-
-import android.os.Bundle;
-
-import name.mikanoshi.customiuizer.SubFragment;
-import name.mikanoshi.customiuizer.prefs.PreferenceCategoryEx;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class Launcher_FolderBlur extends SubFragment {
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- int ver = Helpers.getMIUILauncherVersion(getContext());
- ((PreferenceCategoryEx)findPreference("pref_key_launcher_folderbackblur")).setUnsupported(ver > 41601600);
- ((PreferenceCategoryEx)findPreference("pref_key_launcher_folderwallblur")).setUnsupported(ver > 41601600 && ver < 422003000);
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/subs/System_AudioSilencer.java b/app/src/main/java/name/mikanoshi/customiuizer/subs/System_AudioSilencer.java
deleted file mode 100644
index baf86ecd..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/subs/System_AudioSilencer.java
+++ /dev/null
@@ -1,254 +0,0 @@
-package name.mikanoshi.customiuizer.subs;
-
-import android.annotation.SuppressLint;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.os.Handler;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewStub;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.Locale;
-import java.util.Set;
-import java.util.TimeZone;
-
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.SubFragment;
-import name.mikanoshi.customiuizer.mods.GlobalActions;
-import name.mikanoshi.customiuizer.utils.Helpers;
-import name.mikanoshi.customiuizer.utils.SoundData;
-
-public class System_AudioSilencer extends SubFragment {
-
- String key;
- Handler handler;
- ListView listView1;
- ListView listView2;
- SoundAdapter silencedAdapter;
- SoundAdapter playedAdapter;
- ArrayList silencedList = new ArrayList();
- ArrayList playedList = new ArrayList();
- BroadcastReceiver soundsReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- playedList = intent.getParcelableArrayListExtra("sounds");
- if (playedList == null) playedList = new ArrayList();
- playedAdapter.notifyDataSetChanged();
- silencedAdapter.notifyDataSetChanged();
- updateProgressBar(true);
- }
- };
- SimpleDateFormat formatter = new SimpleDateFormat("H:mm:ss", Locale.getDefault());
-
- private void loadSilenced() {
- silencedList.clear();
- Set silencedSet = Helpers.prefs.getStringSet(key, new LinkedHashSet());
- if (silencedSet != null)
- for (String data: silencedSet)
- silencedList.add(SoundData.fromPref(data));
- }
-
- private void saveSilenced() {
- Set silencedSet = new LinkedHashSet();
- for (SoundData data: silencedList)
- silencedSet.add(data.toPref());
- Helpers.prefs.edit().putStringSet(key, silencedSet.size() == 0 ? null : silencedSet).apply();
- silencedAdapter.notifyDataSetChanged();
- playedAdapter.notifyDataSetChanged();
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- Bundle args = getArguments();
- key = args.getString("key");
-
- loadSilenced();
-
- silencedAdapter = new SoundAdapter(getContext(), true);
- playedAdapter = new SoundAdapter(getContext(), false);
- handler = new Handler();
- formatter.setTimeZone(TimeZone.getDefault());
-
- if (getView() != null) {
- listView1 = getView().findViewById(android.R.id.text1);
- listView2 = getView().findViewById(android.R.id.text2);
-
- TextView cat1 = getView().findViewById(R.id.sounds_silenced);
- TextView cat2 = getView().findViewById(R.id.sounds_played);
- int resId = getResources().getIdentifier("preference_category_background", "drawable", "miui");
- cat1.setBackgroundResource(resId);
- cat2.setBackgroundResource(resId);
-
- @SuppressLint("CutPasteId") ViewStub locationStub = getView().findViewById(R.id.refresh_list);
- locationStub.setLayoutResource(R.layout.pref_item);
- locationStub.inflate();
-
- @SuppressLint("CutPasteId") View refresh = getView().findViewById(R.id.refresh_list);
- ((TextView)refresh.findViewById(android.R.id.title)).setText(R.string.system_audiosilencer_last_title);
- ((TextView)refresh.findViewById(android.R.id.summary)).setText(R.string.system_audiosilencer_last_summ);
- Helpers.setMiuiPrefItem(refresh);
- refresh.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- playedList.clear();
- silencedAdapter.notifyDataSetChanged();
- playedAdapter.notifyDataSetChanged();
- updateProgressBar(false);
- fetchPlayedSounds();
- }
- });
- }
- listView1.setAdapter(silencedAdapter);
- listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView> parent, View view, int position, long id) {
- SoundData data = silencedAdapter.getItem(position);
- silencedList.remove(data);
- saveSilenced();
- }
- });
- listView2.setAdapter(playedAdapter);
- listView2.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView> parent, View view, int position, long id) {
- SoundData data = playedAdapter.getItem(position);
- silencedList.add(data);
- saveSilenced();
- }
- });
- updateProgressBar(false);
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- this.padded = false;
- super.onCreate(savedInstanceState);
- }
-
- Runnable getPlayedSounds = this::fetchPlayedSounds;
-
- void fetchPlayedSounds() {
- Intent intent = new Intent(GlobalActions.ACTION_PREFIX + "FetchPlayedSounds");
- intent.setPackage("android");
- getActivity().sendBroadcast(intent);
- }
-
- void updateProgressBar(boolean forceHide) {
- if (getView() != null) getView().findViewById(R.id.progress_bar).setVisibility(forceHide || playedList.size() > 0 ? View.GONE : View.VISIBLE);
- }
-
- void registerReceivers() {
- unregisterReceivers();
- getActivity().registerReceiver(soundsReceiver, new IntentFilter(GlobalActions.EVENT_PREFIX + "FetchPlayedSoundsData"));
- handler.postDelayed(getPlayedSounds, 1000);
- }
-
- void unregisterReceivers() {
- try {
- handler.removeCallbacks(getPlayedSounds);
- getActivity().unregisterReceiver(soundsReceiver);
- } catch (Throwable t) {}
- }
-
- @Override
- public void onDestroy() {
- unregisterReceivers();
- super.onDestroy();
- }
-
- @Override
- public void onPause() {
- unregisterReceivers();
- super.onPause();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- registerReceivers();
- }
-
- public class SoundAdapter extends BaseAdapter {
- private final boolean isSelected;
- private final LayoutInflater mInflater;
-
- SoundAdapter(Context context, boolean selected) {
- isSelected = selected;
- mInflater = LayoutInflater.from(context);
- }
-
- public int getCount() {
- if (isSelected)
- return silencedList.size();
- else
- return playedList.size();
- }
-
- public SoundData getItem(int position) {
- return isSelected ? silencedList.get(position) : playedList.get(position);
- }
-
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public boolean isEnabled(int position) {
- return isSelected || !silencedList.contains(playedList.get(position));
- }
-
- public View getView(final int position, View convertView, ViewGroup parent) {
- View row;
- if (convertView != null) {
- row = convertView;
- } else {
- row = mInflater.inflate(R.layout.pref_item_detailed, parent, false);
- Helpers.setMiuiPrefItem(row);
- }
-
- TextView itemPackage = row.findViewById(android.R.id.title);
- TextView itemUid = row.findViewById(android.R.id.summary);
- TextView itemType = row.findViewById(android.R.id.text1);
- TextView itemTime = row.findViewById(android.R.id.text2);
-
- SoundData data = getItem(position);
- if (data != null) {
- itemPackage.setText(data.caller);
- itemUid.setText(data.uid);
- itemType.setText("file".equals(data.type) ? getResources().getString(R.string.type_file) : "resource".equals(data.type) ? getResources().getString(R.string.type_res) : "uri".equals(data.type) ? "URI" : "");
- itemTime.setText(isSelected ? "" : formatter.format(data.time));
- }
-
- if (isEnabled(position)) {
- row.setEnabled(true);
- itemPackage.setTextColor(getResources().getColor(R.color.preference_primary_text_color, getActivity().getTheme()));
- itemPackage.setAlpha(1.0f);
- itemUid.setAlpha(1.0f);
- itemType.setAlpha(1.0f);
- itemTime.setAlpha(1.0f);
- } else {
- row.setEnabled(false);
- itemPackage.setTextColor(getResources().getColor(R.color.preference_secondary_text_color, getActivity().getTheme()));
- itemPackage.setAlpha(0.5f);
- itemUid.setAlpha(0.5f);
- itemType.setAlpha(0.5f);
- itemTime.setAlpha(0.5f);
- }
- return row;
- }
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/subs/System_PopupNotif.java b/app/src/main/java/name/mikanoshi/customiuizer/subs/System_PopupNotif.java
deleted file mode 100644
index 35272138..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/subs/System_PopupNotif.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package name.mikanoshi.customiuizer.subs;
-
-import android.os.Bundle;
-
-import name.mikanoshi.customiuizer.SubFragment;
-
-public class System_PopupNotif extends SubFragment {
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- findPreference("pref_key_system_popupnotif_apps").setOnPreferenceClickListener(openAppsEdit);
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/subs/Various_CallReminder.java b/app/src/main/java/name/mikanoshi/customiuizer/subs/Various_CallReminder.java
deleted file mode 100644
index ebf2e187..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/subs/Various_CallReminder.java
+++ /dev/null
@@ -1,171 +0,0 @@
-package name.mikanoshi.customiuizer.subs;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.media.Ringtone;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.VibrationEffect;
-import android.os.Vibrator;
-import android.preference.Preference;
-import android.text.InputType;
-import android.text.TextUtils;
-import android.text.method.DigitsKeyListener;
-import android.view.Gravity;
-import android.view.View;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.SubFragment;
-import name.mikanoshi.customiuizer.prefs.ListPreferenceEx;
-import name.mikanoshi.customiuizer.prefs.PreferenceEx;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class Various_CallReminder extends SubFragment {
-
- String uriStr = "";
- String key_sound = "pref_key_various_callreminder_sound";
- String key_vibration = "pref_key_various_callreminder_vibration";
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- PreferenceEx pref = (PreferenceEx)findPreference(key_sound);
- uriStr = Helpers.prefs.getString(key_sound, "");
- pref.setCustomSummary(TextUtils.isEmpty(uriStr) ? getResources().getString(R.string.various_callreminder_nosound) : getRingtoneName(Uri.parse(uriStr)));
- pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALL);
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, Uri.parse(uriStr));
- startActivityForResult(intent, 0);
- return true;
- }
- });
-
- findPreference(key_vibration + "_own").setEnabled("7".equals(Helpers.prefs.getString(key_vibration, "0")));
- ListPreferenceEx pref2 = (ListPreferenceEx)findPreference(key_vibration);
- pref2.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- findPreference(key_vibration + "_own").setEnabled("7".equals(newValue));
- Helpers.performCustomVibration(getContext(), Integer.parseInt((String)newValue), "");
- return true;
- }
- });
-
- findPreference(key_vibration + "_own").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
- builder.setTitle(preference.getTitle());
-
- final TextView msg = new TextView(getActivity());
- msg.setText(R.string.various_callreminder_vibration_own_msg);
- msg.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
- msg.setGravity(Gravity.CENTER_HORIZONTAL);
- msg.setPadding(0, 0, 0, Math.round(15 * getResources().getDisplayMetrics().density));
-
- final EditText input = new EditText(getActivity());
- input.setId(android.R.id.edit);
- input.setInputType(InputType.TYPE_CLASS_NUMBER);
- input.setKeyListener(DigitsKeyListener.getInstance("0123456789,"));
- input.setText(Helpers.prefs.getString(key_vibration + "_own", ""));
-
- LinearLayout layout = new LinearLayout(getActivity());
- layout.setOrientation(LinearLayout.VERTICAL);
- layout.addView(msg);
- layout.addView(input);
- builder.setView(layout);
-
- builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {}
- });
-
- builder.setNeutralButton(R.string.system_batteryindicator_test_title, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {}
- });
-
- builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.cancel();
- }
- });
-
- final AlertDialog dialog = builder.create();
- dialog.show();
-
- dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- EditText edit = dialog.findViewById(android.R.id.edit);
- String patternStr = edit.getText().toString();
- Helpers.prefs.edit().putString(key_vibration + "_own", patternStr).apply();
- dialog.dismiss();
- }
- });
-
- dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (Helpers.isNougat()) return;
- EditText edit = dialog.findViewById(android.R.id.edit);
- Vibrator vibrator = (Vibrator)getContext().getSystemService(Context.VIBRATOR_SERVICE);
- try {
- vibrator.vibrate(VibrationEffect.createWaveform(Helpers.getVibrationPattern(edit.getText().toString()), -1));
- } catch (Throwable t) {
- //noinspection deprecation
- vibrator.vibrate(200);
- }
- }
- });
-
- return true;
- }
- });
- }
-
- String getRingtoneName(Uri uri) {
- try {
- Ringtone ringtone = RingtoneManager.getRingtone(getActivity(), uri);
- String name = ringtone.getTitle(getActivity());
- name = name.substring(0, name.lastIndexOf("."));
- return name;
- } catch (Throwable t) {
- return "";
- }
- }
-
- @Override
- public void onActivityResult(int requestCode, int resultCode, final Intent data) {
- if (resultCode == Activity.RESULT_OK && requestCode == 0) {
- Uri sound = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
- String title;
- if (sound != null) {
- title = getRingtoneName(sound);
- uriStr = sound.toString();
- Helpers.prefs.edit().putString(key_sound, sound.toString()).apply();
- } else {
- title = getResources().getString(R.string.various_callreminder_nosound);
- uriStr = "";
- Helpers.prefs.edit().putString(key_sound, "").apply();
- }
- ((PreferenceEx)findPreference(key_sound)).setCustomSummary(title);
- }
- super.onActivityResult(requestCode, resultCode, data);
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/subs/Various_HiddenFeatures.java b/app/src/main/java/name/mikanoshi/customiuizer/subs/Various_HiddenFeatures.java
deleted file mode 100644
index f539ac2f..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/subs/Various_HiddenFeatures.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package name.mikanoshi.customiuizer.subs;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.preference.Preference;
-
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.SubFragment;
-import name.mikanoshi.customiuizer.prefs.PreferenceEx;
-import name.mikanoshi.customiuizer.utils.Helpers;
-
-public class Various_HiddenFeatures extends SubFragment {
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
-
- final Activity act = getActivity();
-
- Preference updater = findPreference("pref_key_various_sysappsupdater");
- if (Helpers.isSysAppUpdaterInstalled(act)) updater.setSummary(R.string.various_sysappsupdater_summ2);
- updater.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- if (!Helpers.launchActivity(act, "com.xiaomi.discover", "com.xiaomi.market.ui.UpdateAppsActivity", true))
- Helpers.openURL(act, "https://www.apkmirror.com/apk/xiaomi-inc/system-app-updater/");
- return true;
- }
- });
-
- PreferenceEx aosp = (PreferenceEx)findPreference("pref_key_various_memorystats");
- aosp.setCustomSummary("AOSP");
- aosp.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- Helpers.launchActivity(act, "com.android.settings", "com.android.settings.Settings$MemorySettingsActivity");
- return true;
- }
- });
-
- aosp = (PreferenceEx)findPreference("pref_key_various_appusagestats");
- aosp.setCustomSummary("AOSP");
- aosp.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- Helpers.launchActivity(act, "com.android.settings", "com.android.settings.UsageStatsActivity");
- return true;
- }
- });
-
- aosp = (PreferenceEx)findPreference("pref_key_various_aospsearch");
- aosp.setCustomSummary("AOSP");
- aosp.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- Helpers.launchActivity(act, "com.android.settings.intelligence", "com.android.settings.intelligence.search.SearchActivity");
- return true;
- }
- });
-
- aosp = (PreferenceEx)findPreference("pref_key_various_aospnotif");
- aosp.setCustomSummary("AOSP");
- aosp.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- if (!Helpers.launchActivity(act, "com.android.settings", "com.android.settings.Settings$AppAndNotificationDashboardActivity", true))
- Helpers.launchActivity(act, "com.android.settings", "com.android.settings.Settings$ConfigureNotificationSettingsActivity");
- return true;
- }
- });
-
- aosp = (PreferenceEx)findPreference("pref_key_various_aospnotiflog");
- aosp.setCustomSummary("AOSP");
- aosp.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- Helpers.launchActivity(act, "com.android.settings", "com.android.settings.Settings$NotificationStationActivity");
- return true;
- }
- });
-
- findPreference("pref_key_various_clearspeaker").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- Helpers.launchActivity(act, "com.android.settings", "com.android.settings.Settings$SpeakerSettingsActivity");
- return true;
- }
- });
-
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/utils/BatteryIndicator.java b/app/src/main/java/name/mikanoshi/customiuizer/utils/BatteryIndicator.java
deleted file mode 100644
index ba3174ed..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/utils/BatteryIndicator.java
+++ /dev/null
@@ -1,378 +0,0 @@
-package name.mikanoshi.customiuizer.utils;
-
-import android.animation.ArgbEvaluator;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Configuration;
-import android.graphics.Color;
-import android.graphics.LinearGradient;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Shader;
-import android.graphics.drawable.ShapeDrawable;
-import android.graphics.drawable.shapes.RectShape;
-import android.graphics.drawable.shapes.RoundRectShape;
-import android.net.Uri;
-import android.os.Handler;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-
-import de.robv.android.xposed.XposedBridge;
-import de.robv.android.xposed.XposedHelpers;
-
-public class BatteryIndicator extends ImageView {
- protected int mDisplayWidth;
- protected boolean mIsBeingCharged;
- protected boolean mIsExtremePowerSave;
- protected boolean mIsPowerSave;
- protected final int mLowLevelSystem = getResources().getInteger(getResources().getIdentifier("config_lowBatteryWarningLevel", "integer", "android"));
- protected int mPowerLevel;
- protected int mTestPowerLevel;
- private int mFullColor = Color.GREEN;
- private int mLowColor = Color.RED;
- private int mPowerSaveColor = Color.rgb(245, 166, 35);
- private int mChargingColor = Color.YELLOW;
- private int mLowLevel = mLowLevelSystem;
- private int mHeight = 5;
- private int mGlow = 0;
- private int mTransparency = 0;
- private int mPadding = 0;
- private int mVisibility = View.VISIBLE;
- private ColorMode mColorMode = ColorMode.DISCRETE;
- private boolean mTesting = false;
- private boolean mRounded = false;
- private boolean mCentered = false;
- private boolean mExpanded = false;
- private boolean mOnKeyguard = false;
- private boolean mBottom = false;
- private boolean mLimited = false;
- private int mTintColor = Color.argb(153, 0, 0, 0);
- private Object mStatusBar = null;
-
- enum ColorMode {
- DUMMY, DISCRETE, GRADUAL, RAINBOW
- }
-
- public BatteryIndicator(Context context) {
- super(context);
- updateDisplaySize();
- }
-
- public BatteryIndicator(Context context, AttributeSet attributeSet) {
- super(context, attributeSet);
- updateDisplaySize();
- }
-
- public void init(Object statusBar) {
- mStatusBar = statusBar;
-
- try {
- ShapeDrawable shape = new ShapeDrawable();
- Paint paint = shape.getPaint();
- paint.setStyle(Paint.Style.FILL);
- paint.setAntiAlias(true);
- shape.setIntrinsicWidth(9999);
- setImageDrawable(shape);
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- updateParameters();
- new Helpers.SharedPrefObserver(getContext(), new Handler(getContext().getMainLooper())) {
- @Override
- public void onChange(Uri uri) {
- try {
- String key = uri.getPathSegments().get(2);
- if (!mTesting && key.contains("pref_key_system_batteryindicator")) {
- updateParameters();
- update();
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
- };
- getContext().registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- removeCallbacks(step);
- startTest();
- }
- }, new IntentFilter("name.mikanoshi.customiuizer.mods.BatteryIndicatorTest"));
- }
-
- Runnable step = new Runnable() {
- @Override
- public void run() {
- mTestPowerLevel--;
- if (mTestPowerLevel >= 0) {
- update();
- postDelayed(step, mTestPowerLevel == mLowLevel - 1 ? 300 : 20);
- } else {
- removeCallbacks(step);
- mTesting = false;
- postDelayed(new Runnable() {
- @Override
- public void run() {
- updateParameters();
- update();
- }
- }, 1000);
- }
- }
- };
-
- private void startTest() {
- mTesting = true;
- mTestPowerLevel = 100;
- post(step);
- }
-
-// int lightPos = 0;
-// Runnable chargingAnim = new Runnable() {
-// @Override
-// public void run() {
-// if (!mTesting) {
-// lightPos += 3;
-// if (lightPos > 180) lightPos = 0;
-// int val = (int)(90 * Math.exp(-Math.pow(lightPos - 90, 2) / 180f));
-// Paint p = ((ShapeDrawable)getDrawable()).getPaint();
-// int color = p.getColor();
-//
-// int runColor = Color.WHITE;
-// if (mColorMode == ColorMode.LIGHTDARK)
-// runColor = Color.argb(
-// Color.alpha(color),
-// Math.max(0, Math.min(255, Math.round(Color.red(color) + val / 180f * (Color.red(~color) - Color.red(color))))),
-// Math.max(0, Math.min(255, Math.round(Color.green(color) + val / 180f * (Color.green(~color) - Color.green(color))))),
-// Math.max(0, Math.min(255, Math.round(Color.blue(color) + val / 180f * (Color.blue(~color) - Color.blue(color)))))
-// );
-// else if (mColorMode != ColorMode.RAINBOW)
-// runColor = Color.argb(
-// Color.alpha(color),
-// Math.max(0, Math.min(255, Color.red(color) + val)),
-// Math.max(0, Math.min(255, Color.green(color) + val)),
-// Math.max(0, Math.min(255, Color.blue(color) + val))
-// );
-// p.setColorFilter(new PorterDuffColorFilter(runColor, PorterDuff.Mode.SRC_ATOP));
-// invalidate();
-// }
-// if (!mIsCharged) postDelayed(chargingAnim, 33);
-// }
-// };
-//
-// private void startChargingAnim() {
-// post(chargingAnim);
-// }
-//
-// private void stopChargingAnim() {
-// removeCallbacks(chargingAnim);
-// ((ShapeDrawable)getDrawable()).getPaint().setColorFilter(null);
-// invalidate();
-// }
-
- private void postUpdate() {
- post(BatteryIndicator.this::update);
- }
-
- public void onExpandingChanged(boolean expanded) {
- if (mExpanded == expanded) return;
- mExpanded = expanded;
- update();
- }
-
- public void onKeyguardStateChanged(boolean showing) {
- if (mOnKeyguard == showing) return;
- mOnKeyguard = showing;
- update();
- }
-
- public void onDarkModeChanged(float intensity, int tintColor) {
- //if (intensity != 0.0f && intensity != 1.0f) return;
- if (mTintColor == tintColor) return;
- mTintColor = tintColor;
- update();
- }
-
- public void onBatteryLevelChanged(int powerLevel, boolean isCharging, boolean isCharged) {
- if (this.mPowerLevel == powerLevel && this.mIsBeingCharged == isCharging && !isCharged) return;
- this.mPowerLevel = powerLevel;
- this.mIsBeingCharged = isCharging && !isCharged;
-// if (isCharging != this.mIsCharged) {
-// this.mIsCharged = isCharging;
-// if (!this.mIsCharged)
-// startChargingAnim();
-// else
-// stopChargingAnim();
-// }
- update();
- }
-
- public void onPowerSaveChanged(boolean isPowerSave) {
- if (this.mIsPowerSave == isPowerSave) return;
- this.mIsPowerSave = isPowerSave;
- update();
- }
-
- public void onExtremePowerSaveChanged(boolean isExtremePowerSave) {
- if (this.mIsExtremePowerSave == isExtremePowerSave ) return;
- this.mIsExtremePowerSave = isExtremePowerSave;
- update();
- }
-
- @Override
- protected void onConfigurationChanged(Configuration configuration) {
- super.onConfigurationChanged(configuration);
- updateDisplaySize();
- postUpdate();
- }
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
- if (changed) {
- updateDisplaySize();
- postUpdate();
- }
- }
-
- public void update() {
- if (mLimited) this.setVisibility(mExpanded || mOnKeyguard ? mVisibility : View.GONE);
- clearAnimation();
- updateDrawable();
- }
-
- public void updateDisplaySize() {
- this.mDisplayWidth = getMeasuredWidth();
- }
-
- protected void updateParameters() {
- mColorMode = ColorMode.values()[Integer.parseInt(Helpers.getSharedStringPref(getContext(), "pref_key_system_batteryindicator_color", "1"))];
- mFullColor = Helpers.getSharedIntPref(getContext(), "pref_key_system_batteryindicator_colorval1", Color.GREEN);
- mLowColor = Helpers.getSharedIntPref(getContext(), "pref_key_system_batteryindicator_colorval2", Color.RED);
- mPowerSaveColor = Helpers.getSharedIntPref(getContext(), "pref_key_system_batteryindicator_colorval3", Color.rgb(245, 166, 35));
- mChargingColor = Helpers.getSharedIntPref(getContext(), "pref_key_system_batteryindicator_colorval4", Color.YELLOW);
- mLowLevel = Helpers.getSharedIntPref(getContext(), "pref_key_system_batteryindicator_lowlevel", mLowLevelSystem);
- mHeight = Helpers.getSharedIntPref(getContext(), "pref_key_system_batteryindicator_height", 5);
- mGlow = Helpers.getSharedIntPref(getContext(), "pref_key_system_batteryindicator_glow", 0);
- mRounded = Helpers.getSharedBoolPref(getContext(), "pref_key_system_batteryindicator_rounded", false);
- mBottom = Integer.parseInt(Helpers.getSharedStringPref(getContext(), "pref_key_system_batteryindicator_align", "1")) == 2;
- mCentered = Helpers.getSharedBoolPref(getContext(), "pref_key_system_batteryindicator_centered", false);
- mLimited = Helpers.getSharedBoolPref(getContext(), "pref_key_system_batteryindicator_limitvis", false);
- mTransparency = Helpers.getSharedIntPref(getContext(), "pref_key_system_batteryindicator_transp", 0);
- mPadding = Helpers.getSharedIntPref(getContext(), "pref_key_system_batteryindicator_padding", 0);
- mVisibility = Helpers.getSharedBoolPref(getContext(), "pref_key_system_batteryindicator", false) ? View.VISIBLE : View.GONE;
- FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams)getLayoutParams();
- lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
- lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
- lp.gravity = mBottom ? Gravity.BOTTOM : Gravity.TOP;
- setLayoutParams(lp);
- try { this.setImageAlpha(255 - Math.round(255 * mTransparency / 100f)); } catch (Throwable ignore) {};
- this.setVisibility(mVisibility);
- this.setScaleType(mCentered ? ScaleType.CENTER : ScaleType.MATRIX);
- Matrix matrix = new Matrix();
- matrix.setTranslate(0, 0);
- matrix.setScale(1, 1);
- this.setImageMatrix(new Matrix());
- }
-
- protected void updateDrawable() {
- try {
- int level = this.mTesting ? this.mTestPowerLevel : this.mPowerLevel;
- int color = this.mFullColor;
- if (!this.mTesting && this.mIsBeingCharged)
- color = this.mChargingColor;
- else if (!this.mTesting && (this.mIsPowerSave || this.mIsExtremePowerSave))
- color = this.mPowerSaveColor;
- else if (level <= this.mLowLevel)
- color = this.mLowColor;
-
- ShapeDrawable shape = (ShapeDrawable)getDrawable();
- shape.setShaderFactory(null);
- Paint paint = shape.getPaint();
- paint.setShader(null);
-
- if (color == Color.TRANSPARENT && mStatusBar != null)
- try {
- if (mExpanded) {
- color = Color.WHITE;
- } else {
- if (mOnKeyguard) {
- boolean isLightWallpaperStatusBar = (boolean)XposedHelpers.callMethod(XposedHelpers.getObjectField(mStatusBar, "mUpdateMonitor"), "isLightWallpaperStatusBar");
- color = (isLightWallpaperStatusBar ? Color.argb(153, 0, 0, 0) : Color.WHITE);
- } else {
- color = mTintColor;
- }
- }
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
-
- int mDisplayPadding = Math.round(mPadding / 100f * this.mDisplayWidth);
-
- if (mColorMode == ColorMode.GRADUAL) {
- color = level <= this.mLowLevel || (!this.mTesting && (this.mIsBeingCharged || this.mIsPowerSave || this.mIsExtremePowerSave)) ? color : (int)new ArgbEvaluator().evaluate(1f - (level - this.mLowLevel) / (100f - this.mLowLevel), color, mLowColor);
- } else if (mColorMode == ColorMode.RAINBOW) {
- int steps = 15;
- float jump = 300f / (float)steps;
- float[] pos = new float[steps];
- int[] rainbow = new int[steps];
- for (int i = 0; i < steps; i++) {
- pos[i] = i / (float)(steps - 1);
- float c = (mCentered ? 240 : 0) + jump * i;
- if (c > 360) c -= 360;
- rainbow[i] = Color.HSVToColor(255, new float[]{ c, 1.0f, 1.0f});
- }
- shape.setShaderFactory(new ShapeDrawable.ShaderFactory() {
- @Override
- public Shader resize(int width, int height) {
- if (mCentered)
- return new LinearGradient(width / 2f - (mDisplayWidth - mDisplayPadding * 2) / 2f, height / 2f, (mDisplayWidth - mDisplayPadding * 2), height / 2f, rainbow, pos, Shader.TileMode.CLAMP);
- else
- return new LinearGradient(0, height / 2f, (mDisplayWidth - mDisplayPadding * 2), height / 2f, rainbow, pos, Shader.TileMode.CLAMP);
- }
- });
- }
- paint.setColor(color);
- shape.setShape(mRounded ? new RoundRectShape(new float[] { mHeight, mHeight, mHeight, mHeight, mHeight, mHeight, mHeight, mHeight }, null, null) : new RectShape());
-
- int mWidth = Math.round((this.mDisplayWidth - mDisplayPadding * 2) * level / 100f);
- float mDensity = getResources().getDisplayMetrics().density;
- int sbHeight = getResources().getDimensionPixelSize(getResources().getIdentifier("status_bar_height", "dimen", "android"));
- if (mGlow == 0) {
- paint.clearShadowLayer();
- if (mBottom)
- setPadding(mDisplayPadding, 0, mDisplayPadding, -mHeight);
- else
- setPadding(mDisplayPadding, -mHeight, mDisplayPadding, 0);
- shape.setIntrinsicHeight(mHeight * 2);
- shape.setIntrinsicWidth(mWidth);
- } else {
- int shadowPadding = sbHeight - mHeight;
- paint.setShadowLayer(
- (mGlow / 100f) * (sbHeight - 9 * mDensity),
- (mCentered || mDisplayPadding > 0) ? 0 : shadowPadding / 2f,
- mBottom ? mHeight - 10 : 10 - mHeight,
- Color.argb(Math.min(Math.round(mGlow / 100f * 255), Math.round(255 - mTransparency / 100f * 255)), Color.red(color), Color.green(color), Color.blue(color))
- );
- if (mDisplayPadding == 0)
- setPadding(mCentered ? 0 : -shadowPadding, mBottom ? shadowPadding : -shadowPadding, mCentered ? 0 : Math.min(mDisplayWidth - mWidth, shadowPadding), mBottom ? -shadowPadding : shadowPadding);
- else
- setPadding(mDisplayPadding, mBottom ? shadowPadding : -shadowPadding, mDisplayPadding, mBottom ? -shadowPadding : shadowPadding);
- shape.setIntrinsicHeight(sbHeight);
- shape.setIntrinsicWidth(mWidth + (mCentered ? 0 : (mDisplayPadding == 0 ? shadowPadding : 0)));
- }
-
- invalidate();
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/utils/GravitySensor.java b/app/src/main/java/name/mikanoshi/customiuizer/utils/GravitySensor.java
deleted file mode 100644
index 885a9b59..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/utils/GravitySensor.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package name.mikanoshi.customiuizer.utils;
-
-import android.content.Context;
-import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener;
-import android.hardware.SensorManager;
-import android.view.Surface;
-
-import com.github.matteobattilana.weather.WeatherView;
-
-public final class GravitySensor implements SensorEventListener {
- private final SensorManager sensorManager;
- private float[] magneticValues;
- private float[] accelerometerValues;
- private int orientation;
- private int speed;
- private boolean started;
- private final Context context;
- private final WeatherView weatherView;
-
- public GravitySensor(Context context, WeatherView weatherView) {
- super();
- this.context = context;
- this.weatherView = weatherView;
- this.sensorManager = (SensorManager)this.context.getSystemService(Context.SENSOR_SERVICE);
- }
-
- public final boolean getStarted() {
- return this.started;
- }
-
- public void setOrientation(int orient) {
- this.orientation = orient;
- }
-
- public void setSpeed(int spd) {
- this.speed = spd;
- }
-
- public void onAccuracyChanged(Sensor sensor, int accuracy) {}
-
- public void onSensorChanged(SensorEvent event) {
- if (event == null || event.sensor == null) return;
- switch (event.sensor.getType()) {
- case 1: this.accelerometerValues = event.values; break;
- case 2: this.magneticValues = event.values; break;
- }
- if (this.magneticValues == null || this.accelerometerValues == null) return;
-
- float[] rotationMatrix = new float[9];
- SensorManager.getRotationMatrix(rotationMatrix, null, this.accelerometerValues, this.magneticValues);
- float[] remappedRotationMatrix = new float[9];
- SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, remappedRotationMatrix);
- float[] orientationAngles = new float[3];
- SensorManager.getOrientation(remappedRotationMatrix, orientationAngles);
- //double pitch = Math.toDegrees((double)orientationAngles[1]);
- double roll = Math.toDegrees(orientationAngles[2]) + Math.random() * 20 - 10;
- if (this.orientation == Surface.ROTATION_90) roll += 90;
- else if (this.orientation == Surface.ROTATION_270) roll -= 90;
- else if (this.orientation == Surface.ROTATION_180) roll += roll > 0 ? 180 : -180;
- if (roll > 90) roll -= 180; else if (roll < -90) roll += 180;
- this.weatherView.setAngle((int)roll);
- this.weatherView.setSpeed(this.speed + (int)Math.round(Math.random() * 20 - 10));
- }
-
- private void registerListener() {
- this.sensorManager.registerListener(this, this.sensorManager.getDefaultSensor(1), 2);
- this.sensorManager.registerListener(this, this.sensorManager.getDefaultSensor(2), 2);
- }
-
- private void unregisterListener() {
- this.sensorManager.unregisterListener(this);
- }
-
- public final void start() {
- this.started = true;
- this.registerListener();
- }
-
- public final void stop() {
- this.started = false;
- this.unregisterListener();
- }
-
- public final void onResume() {
- if (this.started) {
- this.registerListener();
- }
- }
-
- public final void onPause() {
- this.unregisterListener();
- }
-
- public final Context getContext() {
- return this.context;
- }
-
- public final WeatherView getWeatherView() {
- return this.weatherView;
- }
-
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/utils/GuidePopup.java b/app/src/main/java/name/mikanoshi/customiuizer/utils/GuidePopup.java
deleted file mode 100644
index 84456bdf..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/utils/GuidePopup.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package name.mikanoshi.customiuizer.utils;
-
-import android.content.Context;
-import android.text.TextUtils;
-import android.util.TypedValue;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import miui.widget.ArrowPopupWindow;
-import name.mikanoshi.customiuizer.R;
-
-public class GuidePopup extends ArrowPopupWindow {
- private LinearLayout layout;
-
- public GuidePopup(Context context) {
- super(context);
- }
-
- private void setText(String text) {
- if (TextUtils.isEmpty(text)) return;
-
- String[] txt = text.split("\n");
- if (txt.length == 0) return;
-
- LayoutInflater infalter = this.getLayoutInflater();
- for (String str: txt) {
- TextView textView = (TextView)infalter.inflate(getContext().getResources().getIdentifier("guide_popup_text_view", "layout", "miui"), null);
- textView.setText(str);
- textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13.5f);
- if (Helpers.isNightMode(getContext()))
- textView.setTextColor(getContext().getResources().getColor(R.color.guide_popup_text, getContext().getTheme()));
- textView.setSingleLine(true);
- textView.setMaxHeight(Integer.MAX_VALUE);
- textView.setMaxWidth(Integer.MAX_VALUE);
- this.layout.addView(textView);
- }
- }
-
- protected void onPrepareWindow() {
- super.onPrepareWindow();
- this.setFocusable(true);
- this.layout = (LinearLayout)this.getLayoutInflater().inflate(getContext().getResources().getIdentifier("guide_popup_content_view", "layout", "miui"), null, false);
- this.setContentView(this.layout);
- this.mArrowPopupView.enableShowingAnimation(false);
- }
-
- public void setGuideText(int resId) {
- this.setGuideText(this.getContext().getString(resId));
- }
-
- private void setGuideText(String text) {
- this.setText(text);
- }
-
- public void show(View anchor) {
- this.show(anchor, 0, 0);
- }
-
- public void show(View anchor, int x, int y) {
- super.show(anchor, x, y);
- }
-}
-
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/utils/HelperReceiver.java b/app/src/main/java/name/mikanoshi/customiuizer/utils/HelperReceiver.java
deleted file mode 100644
index 2a93545d..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/utils/HelperReceiver.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package name.mikanoshi.customiuizer.utils;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStreamWriter;
-import java.io.StringWriter;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-public class HelperReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(final Context ctx, Intent intent) {
- if (intent.getAction() == null) return;
-
- if (intent.getAction().equals("name.mikanoshi.customiuizer.SAVEEXCEPTION")) {
- try {
- Throwable thw = (Throwable)intent.getSerializableExtra("throwable");
- if (thw == null) return;
- StringWriter stackTrace = new StringWriter();
-
- File f = new File(ctx.getFilesDir().getAbsolutePath() + "/uncaught_exceptions");
- if (!f.exists()) f.createNewFile();
-
- try (FileOutputStream fOut = new FileOutputStream(f, true)) {
- try (OutputStreamWriter output = new OutputStreamWriter(fOut)) {
- output.write(stackTrace + "\n\n");
- }
- }
- } catch (Throwable t) {}
- } else if (intent.getAction().equals(Intent.ACTION_LOCKED_BOOT_COMPLETED)) {
- Helpers.fixPermissionsAsync(ctx);
- }
- }
-}
diff --git a/app/src/main/java/name/mikanoshi/customiuizer/utils/Helpers.java b/app/src/main/java/name/mikanoshi/customiuizer/utils/Helpers.java
deleted file mode 100644
index 841bb6cf..00000000
--- a/app/src/main/java/name/mikanoshi/customiuizer/utils/Helpers.java
+++ /dev/null
@@ -1,2289 +0,0 @@
-package name.mikanoshi.customiuizer.utils;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.TimeZone;
-
-import android.Manifest;
-import android.animation.Animator;
-import android.animation.ValueAnimator;
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.AlarmManager;
-import android.app.Application;
-import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.content.res.XmlResourceParser;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Color;
-import android.graphics.LinearGradient;
-import android.graphics.Matrix;
-import android.graphics.Rect;
-import android.graphics.Shader;
-import android.graphics.Typeface;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Build;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.PowerManager.WakeLock;
-import android.os.UserHandle;
-import android.os.VibrationEffect;
-import android.os.Vibrator;
-import android.preference.PreferenceCategory;
-import android.preference.PreferenceScreen;
-import android.provider.Settings;
-import android.text.InputType;
-import android.text.Spannable;
-import android.text.SpannableStringBuilder;
-import android.text.TextUtils;
-import android.text.format.DateFormat;
-import android.text.style.ForegroundColorSpan;
-import android.text.style.RelativeSizeSpan;
-import android.text.style.StyleSpan;
-import android.util.Log;
-import android.util.LruCache;
-import android.util.Pair;
-import android.util.TypedValue;
-import android.view.HapticFeedbackConstants;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import org.xmlpull.v1.XmlPullParser;
-
-import de.robv.android.xposed.XC_MethodHook;
-import de.robv.android.xposed.XposedBridge;
-import de.robv.android.xposed.XposedHelpers;
-
-import miui.app.AlertDialog;
-import miui.os.SystemProperties;
-import miui.util.HapticFeedbackUtil;
-
-import name.mikanoshi.customiuizer.MainModule;
-import name.mikanoshi.customiuizer.R;
-import name.mikanoshi.customiuizer.SharedPrefsProvider;
-import name.mikanoshi.customiuizer.mods.GlobalActions;
-import name.mikanoshi.customiuizer.prefs.PreferenceCategoryEx;
-
-@SuppressWarnings("WeakerAccess")
-public class Helpers {
-
- @SuppressLint("StaticFieldLeak")
- public static Context mModuleContext = null;
- public static final String modulePkg = "name.mikanoshi.customiuizer";
- public static final String prefsName = "customiuizer_prefs";
- public static final String prefsPath = "/data/user_de/0/" + modulePkg + "/shared_prefs";
- public static final String prefsFile = prefsPath + "/" + prefsName + ".xml";
- public static final String externalFolder = "/CustoMIUIzer/";
- public static final String backupFile = "settings_backup";
- public static final String logFile = "xposed_log";
- public static final String versionFile = "xposed_version";
- public static final String wallpaperFile = "lockscreen_wallpaper";
- //public static final String xposedRepo = "https://code.highspec.ru/repo/full.xml.gz";
- public static final String ANDROID_NS = "http://schemas.android.com/apk/res/android";
- public static final String MIUIZER_NS = "http://schemas.android.com/apk/res-auto";
- public static final String ACCESS_SECURITY_CENTER = "com.miui.securitycenter.permission.ACCESS_SECURITY_CENTER_PROVIDER";
- public static final String NEW_MODS_SEARCH_QUERY = "\uD83C\uDD95";
- public static SharedPreferences prefs = null;
- public static String prefsPathCurrent = null;
- public static String prefsFileCurrent = null;
- public static ArrayList shareAppsList = null;
- public static ArrayList openWithAppsList = null;
- public static ArrayList installedAppsList = null;
- public static ArrayList launchableAppsList = null;
- public static ArrayList allModsList = new ArrayList();
- public static int xposedVersion = 0;
- public static final int markColor = Color.rgb(205, 73, 97);
- public static final int markColorVibrant = Color.rgb(222, 45, 73);
- public static final int REQUEST_PERMISSIONS_BACKUP = 1;
- public static final int REQUEST_PERMISSIONS_RESTORE = 2;
- public static final int REQUEST_PERMISSIONS_WIFI = 3;
- public static final int REQUEST_PERMISSIONS_REPORT = 4;
- public static LruCache memoryCache = new LruCache((int)(Runtime.getRuntime().maxMemory() / 1024) / 2) {
- @Override
- protected int sizeOf(String key, Bitmap icon) {
- if (icon != null)
- return icon.getAllocationByteCount() / 1024;
- else
- return 130 * 130 * 4 / 1024;
- }
- };
- public static WakeLock mWakeLock;
- public static ValueAnimator shimmerAnim;
- public static boolean showNewMods = true;
- public static boolean miuizerModuleActive = false;
- public static final HashSet newMods = new HashSet(Arrays.asList(
- "pref_key_various_hiddenfeatures_cat",
- "pref_key_launcher_nozoomanim",
- "pref_key_launcher_horizwidgetmargin"
- ));
- public static final HashMap l10nProgress = new HashMap() {{
- put("de", "86.6");
- put("es", "98.7");
- put("it", "98");
- put("pt-BR", "94.7");
- put("ru-RU", "100");
- put("tr", "86.6");
- put("uk-UK", "87.6");
- put("zh-CN", "98.1");
- put("fr", "24.9");
- put("id", "13.1");
- put("sk", "4.2");
- }};
-
- public static final HashSet xposedManagers = new HashSet(Arrays.asList(
- "org.lsposed.manager",
- "io.github.lsposed.manager",
- "org.meowcat.edxposed.manager",
- "com.solohsu.android.edxp.manager",
- "de.robv.android.xposed.installer",
- "me.weishu.exp"
- ));
-
- public static final ArrayList shortcutIcons = new ArrayList();
- public static Holidays currentHoliday = Holidays.NONE;
-
- public enum Holidays {
- NONE, NEWYEAR, LUNARNEWYEAR, PANDEMIC, CRYPTO
- }
-
- public enum SettingsType {
- Preference, Edit
- }
-
- public enum AppAdapterType {
- Default, Standalone, Mutli, CustomTitles, Activities
- }
-
- public enum ActionBarType {
- HomeUp, Edit
- }
-
- public static class MimeType {
- public static int IMAGE = 1;
- public static int AUDIO = 2;
- public static int VIDEO = 4;
- public static int DOCUMENT = 8;
- public static int ARCHIVE = 16;
- public static int LINK = 32;
- public static int OTHERS = 64;
- public static int ALL = IMAGE | AUDIO | VIDEO | DOCUMENT | ARCHIVE | LINK | OTHERS;
- }
-
- public static int getSystemBackgroundColor(Context context) {
- int black = Color.BLACK;
- int white = Color.WHITE;
- try {
- black = context.getResources().getColor(context.getResources().getIdentifier("black", "color", "miui"), context.getTheme());
- white = context.getResources().getColor(context.getResources().getIdentifier("white", "color", "miui"), context.getTheme());
- } catch (Throwable ignore) {}
- return isNightMode(context) ? black : white;
- }
-
- public static void setMiuiTheme(Activity act, int overrideTheme) {
- setMiuiTheme(act, overrideTheme, false);
- }
-
- public static void setMiuiTheme(Activity act, int overrideTheme, boolean noBackground) {
- int themeResId = 0;
- try { themeResId = act.getResources().getIdentifier("Theme.DayNight", "style", "miui"); } catch (Throwable ignore) {}
- if (themeResId == 0) themeResId = act.getResources().getIdentifier(isNightMode(act) ? "Theme.Dark" : "Theme.Light", "style", "miui");
- act.setTheme(themeResId);
- if (!is11()) act.getTheme().applyStyle(R.style.ActivityAnimation10, true);
- act.getTheme().applyStyle(overrideTheme, true);
- act.getWindow().setBackgroundDrawable(noBackground ? null : new ColorDrawable(getSystemBackgroundColor(act)));
- }
-
- public static void setMiuiCheckbox(CheckBox checkbox) {
- checkbox.setBackground(null);
- int btnResID = checkbox.getResources().getIdentifier(isNightMode(checkbox.getContext()) ? "btn_checkbox_dark" : "btn_checkbox_light", "drawable", "miui");
- try {
- checkbox.setButtonDrawable(btnResID == 0 ? R.drawable.btn_checkbox : btnResID);
- } catch (Throwable t) {
- checkbox.setButtonDrawable(R.drawable.btn_checkbox);
- }
- }
-
- public static void setMiuiPrefItem(View item) {
- item.setBackgroundResource(is11() ? R.drawable.list_item_bg : R.drawable.am_list_item_background);
- TextView title = item.findViewById(android.R.id.title);
- if (is12()) {
- int resId = item.getResources().getIdentifier("preference_item_bg", "drawable", "miui");
- if (resId != 0) item.setBackgroundResource(resId);
- resId = item.getResources().getIdentifier("normal_text_size", "dimen", "miui");
- if (resId != 0 && title != null) {
- title.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
- title.setTextSize(TypedValue.COMPLEX_UNIT_PX, item.getResources().getDimensionPixelSize(resId));
- }
- resId = item.getResources().getIdentifier("secondary_text_size", "dimen", "miui");
- if (resId != 0) {
- TextView summary = item.findViewById(android.R.id.summary);
- TextView text1 = item.findViewById(android.R.id.text1);
- TextView text2 = item.findViewById(android.R.id.text2);
- int size = item.getResources().getDimensionPixelSize(resId);
- if (summary != null) summary.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
- if (text1 != null) text1.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
- if (text2 != null) text2.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
- }
- }
- if (title != null && "header".equals(title.getTag())) {
- int resIdSize = item.getResources().getIdentifier("preference_category_text_size", "dimen", "miui");
- if (resIdSize != 0) title.setTextSize(TypedValue.COMPLEX_UNIT_PX, item.getResources().getDimensionPixelSize(resIdSize));
- }
-
- int resIdLeft = item.getResources().getIdentifier("preference_item_padding_left", "dimen", "miui");
- int resIdRight = item.getResources().getIdentifier("preference_item_padding_right", "dimen", "miui");
- int resIdTop = item.getResources().getIdentifier("preference_item_padding_top", "dimen", "miui");
- int resIdBottom = item.getResources().getIdentifier("preference_item_padding_bottom", "dimen", "miui");
- int paddingLeft = resIdLeft == 0 ? item.getPaddingLeft() : item.getResources().getDimensionPixelSize(resIdLeft);
- int paddingRight = resIdRight == 0 ? item.getPaddingRight() : item.getResources().getDimensionPixelSize(resIdRight);
- int paddingTop = resIdTop == 0 ? item.getPaddingTop() : item.getResources().getDimensionPixelSize(resIdTop);
- int paddingBottom = resIdBottom == 0 ? item.getPaddingBottom() : item.getResources().getDimensionPixelSize(resIdBottom);
- item.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
- }
-
- @SuppressWarnings("ConstantConditions")
- public static void detectHoliday() {
- currentHoliday = Holidays.NONE;
- String opt = prefs.getString("pref_key_miuizer_holiday", "0");
- int holiday = Integer.parseInt(opt);
- if (holiday > 0) currentHoliday = Holidays.values()[holiday];
- if (holiday == 0) {
- Calendar cal = Calendar.getInstance();
- int month = cal.get(Calendar.MONTH);
- int monthDay = cal.get(Calendar.DAY_OF_MONTH);
- int year = cal.get(Calendar.YEAR);
-
- // Lunar NY
- if ((month == 0 && monthDay > 15) || month == 1) currentHoliday = Holidays.LUNARNEWYEAR;
- // NY
- else if (month == 0 || month == 11) currentHoliday = Holidays.NEWYEAR;
- // COVID19
- else if (year <= 2020) currentHoliday = Holidays.PANDEMIC;
- // Crypto
- else if (year == 2021 || year == 2022) currentHoliday = Holidays.CRYPTO;
- }
- }
-
- public static boolean is10() {
- return SystemProperties.getInt("ro.miui.ui.version.code", 7) <= 8;
- }
-
- public static boolean is11() {
- return SystemProperties.getInt("ro.miui.ui.version.code", 8) >= 9;
- }
-
- public static boolean is12() {
- return SystemProperties.getInt("ro.miui.ui.version.code", 9) >= 10;
- }
-
- public static boolean is125() {
- return SystemProperties.getInt("ro.miui.ui.version.code", 10) >= 11;
- }
-
- public static boolean isNightMode(Context context) {
- return (context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
- }
-
- public static boolean isNougat() {
- return Build.VERSION.SDK_INT < Build.VERSION_CODES.O;
- }
-
- public static boolean isPiePlus() {
- return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P;
- }
-
- public static boolean isQPlus() {
- return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
- }
-
- public static boolean isRPlus() {
- return Build.VERSION.SDK_INT >= 30;
- }
-
- public static boolean isDeviceEncrypted(Context context) {
- DevicePolicyManager policyMgr = (DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE);
- int encryption = policyMgr.getStorageEncryptionStatus();
- return
- encryption == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE ||
- encryption == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVATING ||
- encryption == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER;
- }
-
-// public static boolean isLauncherIconVisible(Context context) {
-// return context.getPackageManager().getComponentEnabledSetting(new ComponentName(context, GateWayLauncher.class)) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
-// }
-
- public static boolean isXposedInstallerInstalled(Context context) {
- boolean skip = prefs.getBoolean("pref_key_miuizer_assumelsposed", false);
- if (skip) return true;
-
- PackageManager pm = context.getPackageManager();
-
- for (String manager: xposedManagers) try {
- pm.getPackageInfo(manager, PackageManager.GET_ACTIVITIES);
- return true;
- } catch (PackageManager.NameNotFoundException e) {}
-
- return false;
- }
-
- public static String isLSPosedManagerInstalled(Context context) {
- boolean lsposed = prefs.getBoolean("pref_key_miuizer_assumelsposed", false);
- if (lsposed) return "Assumed LSPosed";
- try {
- PackageInfo info = context.getPackageManager().getPackageInfo("org.lsposed.manager", 0);
- return info.versionName + " (" + info.versionCode + ")";
- } catch (PackageManager.NameNotFoundException e) {
- return null;
- }
- }
-
-// public static boolean isUnsupportedManager(Context context) {
-// try {
-// return context.getPackageManager().getPackageInfo("org.meowcat.edxposed.manager", 0).versionCode > 45700;
-// } catch (PackageManager.NameNotFoundException e) {
-// return true;
-// }
-// }
-
- public static boolean areXposedResourceHooksDisabled() {
- File d1 = new File("/data/user_de/0/org.meowcat.edxposed.manager/conf/disable_resources");
- File d2 = new File("/data/user_de/0/com.solohsu.android.edxp.manager/conf/disable_resources");
- File d3 = new File("/data/user_de/0/de.robv.android.xposed.installer/conf/disable_resources");
- return d1.exists() || d2.exists() || d3.exists();
- }
-
- public static boolean areXposedBlacklistsEnabled() {
- File d1 = new File("/data/user_de/0/org.meowcat.edxposed.manager/conf/blackwhitelist");
- File d2 = new File("/data/user_de/0/com.solohsu.android.edxp.manager/conf/blackwhitelist");
- File d3 = new File("/data/user_de/0/de.robv.android.xposed.installer/conf/blackwhitelist");
- return d1.exists() || d2.exists() || d3.exists();
- }
-
- public static boolean isXposedScopeEnabled(Context context) {
- try {
- return "true".equals(context.getPackageManager().getInstallerPackageName("EdXposedScope"));
- } catch (Throwable t) {
- return false;
- }
- }
-
- public static boolean openXposedApp(Context context) {
- for (String manager: xposedManagers) try {
- Intent intent = context.getPackageManager().getLaunchIntentForPackage(manager);
- if (intent == null) continue;
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- context.startActivity(intent);
- return true;
- } catch (Throwable ignore) {}
-
- boolean lsposed = prefs.getBoolean("pref_key_miuizer_assumelsposed", false);
- if (lsposed) try {
- context.sendBroadcast(new Intent(GlobalActions.ACTION_PREFIX + "RunParasitic"));
- return true;
- } catch (Throwable ignore) {}
-
- Toast.makeText(context, R.string.xposed_not_found, Toast.LENGTH_LONG).show();
- return false;
- }
-
- public static String getNewEdXposedPath() {
- File[] files = new File("/data/misc").listFiles();
- String edxpPath = null;
- if (files != null && files.length > 0)
- for (File file: files)
- if (file.getName().startsWith("edxp_")) {
- edxpPath = file.getName();
- break;
- }
- return edxpPath;
- }
-
- public static String makeNewEdXposedPathReadable() {
- return makeNewEdXposedPathReadable(null);
- }
-
- @SuppressLint("SetWorldReadable")
- public static String makeNewEdXposedPathReadable(String path) {
- try {
- String baseDir;
- if (path == null) {
- String edxpPath = getNewEdXposedPath();
- if (edxpPath == null) return null;
- baseDir = "/data/misc/" + edxpPath + "/0/log";
- } else {
- baseDir = path + "log";
- }
- File file;
- file = new File(baseDir);
- if (!file.exists()) return null;
- try { file.setExecutable(true, false); } catch (Throwable t) { XposedBridge.log(t); }
- file = new File(baseDir + "/all.log");
- if (!file.exists()) file = new File(baseDir + "/error.log");
- if (!file.exists()) file = new File(baseDir + "/modules.log");
- if (!file.exists()) return null;
- try { file.setReadable(true, false); } catch (Throwable t) { XposedBridge.log(t); }
- return file.getAbsolutePath();
- } catch (Throwable t) {
- return null;
- }
- }
-
- public static String getXposedPropVersion(File propFile, boolean fromHook) {
- String version = "unknown";
- try (FileInputStream inputStream = new FileInputStream(propFile)) {
- try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
- while (true) {
- String readLine = null;
- try {
- readLine = bufferedReader.readLine();
- } catch (Throwable t) {
- t.printStackTrace();
- }
- if (readLine == null) break;
-
- String[] split = readLine.split("=", 2);
- if (split.length == 2) {
- String line = split[0].trim();
- if (line.charAt(0) != '#' && "version".equals(line)) {
- version = split[1].trim();
- break;
- }
- }
- }
- } catch (Throwable t) {
- t.printStackTrace();
- }
- } catch (Throwable t) {
- t.printStackTrace();
- }
- if (fromHook) xposedVersion = XposedBridge.getXposedVersion();
- return "unknown".equals(version) ? version + " (" + xposedVersion + ")" : version;
- }
-
- public static String getXposedInstallerErrorLog(Context context) {
- String baseDir = null;
- File file;
- PackageManager pm = context.getPackageManager();
-
- try {
- pm.getPackageInfo("org.meowcat.edxposed.manager", PackageManager.GET_ACTIVITIES);
- baseDir = "/data/user_de/0/org.meowcat.edxposed.manager/";
- file = new File(baseDir + "log/all.log");
- if (file.exists()) return baseDir + "log/all.log";
- file = new File(baseDir + "log/error.log");
- if (file.exists()) return baseDir + "log/error.log";
- } catch (Throwable ignore) {}
-
- try {
- pm.getPackageInfo("com.solohsu.android.edxp.manager", PackageManager.GET_ACTIVITIES);
- baseDir = "/data/user_de/0/com.solohsu.android.edxp.manager/";
- file = new File(baseDir + "log/all.log");
- if (file.exists()) return baseDir + "log/all.log";
- file = new File(baseDir + "log/error.log");
- if (file.exists()) return baseDir + "log/error.log";
- } catch (Throwable ignore) {}
-
- try {
- pm.getPackageInfo("de.robv.android.xposed.installer", PackageManager.GET_ACTIVITIES);
- baseDir = "/data/user_de/0/de.robv.android.xposed.installer/";
- file = new File(baseDir + "log/error.log");
- if (file.exists()) return baseDir + "log/error.log";
- baseDir = null;
- } catch (Throwable ignore) {}
-
- if (baseDir == null)
- return null;
- else
- return baseDir + "log/error.log";
- }
-
- public static boolean isSysAppUpdaterInstalled(Context context) {
- PackageManager pm = context.getPackageManager();
- boolean res = false;
- try {
- pm.getPackageInfo("com.xiaomi.discover", PackageManager.GET_ACTIVITIES);
- res = true;
- } catch (PackageManager.NameNotFoundException e) {}
- return res;
- }
-
- public static void launchActivity(Activity act, String pkg, String cmp) {
- launchActivity(act, pkg, cmp, false);
- }
- public static boolean launchActivity(Activity act, String pkg, String cmp, boolean silent) {
- PackageManager pm = act.getPackageManager();
- try {
- pm.getPackageInfo(pkg, PackageManager.GET_ACTIVITIES);
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_DEFAULT);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- intent.setComponent(new ComponentName(pkg, cmp));
- act.startActivity(intent);
- act.overridePendingTransition(R.anim.activity_open_enter, R.anim.activity_open_exit);
- return true;
- } catch (Throwable t) {
- if (!silent) Toast.makeText(act, R.string.various_hiddenfeatures_not_found, Toast.LENGTH_LONG).show();
- return false;
- }
- }
-// public static boolean isScreenOn(Context context) {
-// DisplayManager dispMgr = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
-// for (Display display: dispMgr.getDisplays())
-// if (display.getState() != Display.STATE_OFF) return true;
-// return false;
-// }
-
- public static void hideKeyboard(Activity act, View view) {
- try {
- Context context = act == null ? view.getContext() : act;
- InputMethodManager inputManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
- if (inputManager == null) return;
- IBinder token = null;
- View currentFocusedView = act == null ? view : act.getCurrentFocus();
- if (currentFocusedView != null)
- token = currentFocusedView.getWindowToken();
- if (token != null)
- inputManager.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- public static void showOKDialog(Context context, int title, int text) {
- AlertDialog.Builder alert = new AlertDialog.Builder(context);
- alert.setTitle(title);
- alert.setMessage(text);
- alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {}
- });
- alert.show();
- }
-
- public interface InputCallback {
- void onInputFinished(String key, String text);
- }
-
- public static void showInputDialog(Context context, final String key, int titleRes, InputCallback callback) {
- AlertDialog.Builder builder = new AlertDialog.Builder(context);
- builder.setTitle(titleRes);
- final EditText input = new EditText(context);
- input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL);
- input.setText(prefs.getString(key, ""));
- builder.setView(input);
- builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- callback.onInputFinished(key, input.getText().toString());
- }
- });
- builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.cancel();
- }
- });
- builder.show();
- }
-
- public static boolean checkStorageReadable(Context context) {
- String state = Environment.getExternalStorageState();
- if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY) || state.equals(Environment.MEDIA_MOUNTED)) {
- return true;
- } else {
- showOKDialog(context, R.string.warning, R.string.storage_unavailable);
- return false;
- }
- }
-
- public static boolean checkStoragePerm(Activity act, int action) {
- if (act.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
- act.requestPermissions(new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE }, action);
- return false;
- } else return true;
- }
-
- public static boolean checkSettingsPerm(Activity act) {
- return act.checkSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) == PackageManager.PERMISSION_GRANTED;
- }
-
- public static boolean checkCoarsePerm(Activity act, int action) {
- if (act.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
- act.requestPermissions(new String[]{ Manifest.permission.ACCESS_COARSE_LOCATION }, action);
- return false;
- } else return true;
- }
-
- public static boolean checkFinePerm(Activity act, int action) {
- if (act.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
- act.requestPermissions(new String[]{ Manifest.permission.ACCESS_FINE_LOCATION }, action);
- return false;
- } else return true;
- }
-
- public static boolean preparePathForBackup(Activity act, String path) {
- if (!checkStoragePerm(act, REQUEST_PERMISSIONS_BACKUP)) return false;
-
- String state = Environment.getExternalStorageState();
- switch (state) {
- case Environment.MEDIA_MOUNTED_READ_ONLY:
- showOKDialog(act, R.string.warning, R.string.storage_read_only);
- return false;
- case Environment.MEDIA_MOUNTED:
- File file = new File(path);
- if (!file.exists() && !file.mkdirs()) {
- showOKDialog(act, R.string.warning, R.string.storage_cannot_mkdir);
- return false;
- }
- return true;
- default:
- showOKDialog(act, R.string.warning, R.string.storage_unavailable);
- return false;
- }
- }
-
- public static void emptyFile(String pathToFile, boolean forceClear) {
- File f = new File(pathToFile);
- if (f.exists() && (f.length() > 150 * 1024 || forceClear)) {
- try (FileOutputStream fOut = new FileOutputStream(f, false)) {
- try (OutputStreamWriter output = new OutputStreamWriter(fOut)) {
- output.write("");
- } catch (Throwable ignore) {}
- } catch (Throwable ignore) {}
- }
- }
-
- @SuppressWarnings("ConstantConditions")
- public static long getNextMIUIAlarmTime(Context context) {
- String nextAlarm = Settings.System.getString(context.getContentResolver(), "next_alarm_clock_formatted");
- long nextTime = 0;
- if (!TextUtils.isEmpty(nextAlarm)) try {
- TimeZone timeZone = TimeZone.getTimeZone("UTC");
- SimpleDateFormat dateFormat = new SimpleDateFormat(DateFormat.getBestDateTimePattern(Locale.getDefault(), DateFormat.is24HourFormat(context) ? "EHm" : "Ehma"), Locale.getDefault());
- dateFormat.setTimeZone(timeZone);
- long nextTimePart = dateFormat.parse(nextAlarm).getTime();
-
- Calendar cal = Calendar.getInstance(timeZone);
- cal.setFirstDayOfWeek(Calendar.MONDAY);
- cal.setTimeInMillis(nextTimePart);
- int targetDay = cal.get(Calendar.DAY_OF_WEEK);
- int targetHour = cal.get(Calendar.HOUR_OF_DAY);
- int targetMinute = cal.get(Calendar.MINUTE);
-
- cal = Calendar.getInstance();
- int diff = targetDay - cal.get(Calendar.DAY_OF_WEEK);
- if (diff < 0) diff += 7;
-
- cal.add(Calendar.DAY_OF_MONTH, diff);
- cal.set(Calendar.HOUR_OF_DAY, targetHour);
- cal.set(Calendar.MINUTE, targetMinute);
- cal.clear(Calendar.SECOND);
- cal.clear(Calendar.MILLISECOND);
-
- nextTime = cal.getTimeInMillis();
- } catch (Throwable t) {
- XposedBridge.log(t);
- }
- return nextTime;
- }
-
- public static long getNextStockAlarmTime(Context context) {
- AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
- if (alarmMgr == null) return 0;
- AlarmManager.AlarmClockInfo aci = alarmMgr.getNextAlarmClock();
- return aci == null ? 0 : aci.getTriggerTime();
- }
-
- @SuppressWarnings("ConstantConditions")
- public static void updateNewModsMarking(Context context) {
- updateNewModsMarking(context, Integer.parseInt(prefs.getString("pref_key_miuizer_marknewmods", "2")));
- }
-
- public static void updateNewModsMarking(Context context, int opt) {
- try {
- ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(modulePkg, 0);
- long appInstalled = System.currentTimeMillis() - new File(appInfo.sourceDir).lastModified();
-// Log.e("miuizer", "installed: " + appInstalled + " msecs or " + appInstalled / (1000 * 60 * 60) + " hrs");
- if (opt == 0)
- showNewMods = false;
- else if (opt == 4)
- showNewMods = true;
- else
- showNewMods = appInstalled < (opt == 1 ? 1 : (opt == 2 ? 3 : 7)) * 24 * 60 * 60 * 1000;
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- public static void applyNewMod(TextView title) {
- CharSequence titleStr = title.getText();
- String newModStr = title.getResources().getString(R.string.miuizer_new_mod) + " ";
- int start = titleStr.length() + 3;
- int end = start + newModStr.length();
- SpannableStringBuilder ssb = new SpannableStringBuilder(title.getText() + " " + newModStr);
- ssb.setSpan(new ForegroundColorSpan(markColor), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- ssb.setSpan(new StyleSpan(Typeface.ITALIC), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- ssb.setSpan(new RelativeSizeSpan(0.75f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- title.setText(ssb);
- }
-
- public static void applyShimmer(TextView title) {
- if (title.getPaint().getShader() != null) return;
- int width = title.getResources().getDisplayMetrics().widthPixels;
- Shader shimmer = new LinearGradient(0, 0, width, 0, new int[]{ 0xFF5DA5FF, 0xFF9B8AFB, 0xFFD176F2, 0xFFFE88B2, 0xFFD176F2, 0xFF9B8AFB }, new float[]{ 0.0f, 0.2f, 0.4f, 0.6f, 0.8f, 1.0f }, Shader.TileMode.REPEAT);
- Matrix matrix = new Matrix();
- matrix.setTranslate(0, 0);
- shimmer.setLocalMatrix(matrix);
- title.getPaint().setShader(shimmer);
-
- if (shimmerAnim != null) shimmerAnim.cancel();
- shimmerAnim = ValueAnimator.ofFloat(0, width, width / 1.8f, width * 1.3f);
- shimmerAnim.removeAllUpdateListeners();
- shimmerAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- matrix.setTranslate((float)animation.getAnimatedValue(), 0);
- Shader shader = title.getPaint().getShader();
- if (shader == null)
- shimmerAnim.cancel();
- else
- shader.setLocalMatrix(matrix);
- title.invalidate();
- }
- });
- shimmerAnim.removeAllListeners();
- shimmerAnim.addListener(new Animator.AnimatorListener() {
- @Override
- public void onAnimationEnd(Animator animation) {
- title.getPaint().setShader(null);
- title.invalidate();
- }
-
- @Override
- public void onAnimationStart(Animator animation) {}
-
- @Override
- public void onAnimationCancel(Animator animation) {}
-
- @Override
- public void onAnimationRepeat(Animator animation) {}
- });
- shimmerAnim.setStartDelay(0);
- shimmerAnim.setDuration(10000);
- shimmerAnim.start();
- }
-
- public static void openURL(Context context, String url) {
- if (context == null) return;
- Intent uriIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
- if (uriIntent.resolveActivity(context.getPackageManager()) != null)
- context.startActivity(uriIntent);
- else
- showOKDialog(context, R.string.warning, R.string.no_browser);
- }
-
- public static void openAppInfo(Context context, String pkg, int user) {
- try {
- Intent intent = new Intent("miui.intent.action.APP_MANAGER_APPLICATION_DETAIL");
- intent.setPackage("com.miui.securitycenter");
- intent.putExtra("package_name", pkg);
- if (user != 0) intent.putExtra("miui.intent.extra.USER_ID", user);
- context.startActivity(intent);
- } catch (Throwable t) {
- try {
- Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- intent.setData(Uri.parse("package:" + pkg));
- if (user != 0)
- XposedHelpers.callMethod(context, "startActivityAsUser", intent, XposedHelpers.newInstance(UserHandle.class, user));
- else
- context.startActivity(intent);
- } catch (Throwable t2) {
- XposedBridge.log(t2);
- }
- }
- }
-
- public static boolean isReallyVisible(final View view) {
- if (view == null || !view.isShown() || view.getAlpha() == 0) return false;
- final Rect actualPosition = new Rect();
- view.getGlobalVisibleRect(actualPosition);
- return actualPosition.intersect(new Rect(0, 0, view.getResources().getDisplayMetrics().widthPixels, view.getResources().getDisplayMetrics().heightPixels));
- }
-
- public static ArrayList getChildViewsRecursive(View view) {
- return getChildViewsRecursive(view, true);
- }
-
- public static ArrayList getChildViewsRecursive(View view, boolean includeContainers) {
- if (view instanceof ViewGroup) {
- ArrayList list2 = new ArrayList();
- ViewGroup viewgroup = (ViewGroup)view;
- int i = 0;
- do {
- if (i >= viewgroup.getChildCount()) return list2;
- View view1 = viewgroup.getChildAt(i);
- ArrayList list3 = new ArrayList();
- if (includeContainers) list3.add(view);
- list3.addAll(getChildViewsRecursive(view1));
- list2.addAll(list3);
- i++;
- } while (true);
- } else {
- ArrayList list1 = new ArrayList();
- list1.add(view);
- return list1;
- }
- }
-
- private static String getModTitle(Resources res, String title) {
- if (title == null) return null;
- int titleResId = Integer.parseInt(title.substring(1));
- if (titleResId <= 0) return null;
- return res.getString(titleResId);
- }
-
- private static boolean checkMultiUserPermission(Context context) {
- return context.getPackageManager().checkPermission("android.permission.INTERACT_ACROSS_USERS", modulePkg) == PackageManager.PERMISSION_GRANTED;
- }
-
- @SuppressWarnings({"JavaReflectionInvocation", "ConstantConditions"})
- @SuppressLint({"PrivateApi", "DiscouragedPrivateApi"})
- public static float getAnimationScale(int type) {
- try {
- Class> smClass = Class.forName("android.os.ServiceManager");
- Method getService = smClass.getDeclaredMethod("getService", String.class);
- getService.setAccessible(true);
- Object manager = getService.invoke(smClass, "window");
-
- Class> wmsClass = Class.forName("android.view.IWindowManager$Stub");
- Method asInterface = wmsClass.getDeclaredMethod("asInterface", IBinder.class);
- asInterface.setAccessible(true);
- Object wm = asInterface.invoke(wmsClass, manager);
-
- Method getAnimationScale = wm.getClass().getDeclaredMethod("getAnimationScale", int.class);
- getAnimationScale.setAccessible(true);
- return (float)getAnimationScale.invoke(wm, type);
- } catch (Throwable t) {
- t.printStackTrace();
- return 1.0f;
- }
- }
-
- @SuppressWarnings({"JavaReflectionInvocation", "ConstantConditions"})
- @SuppressLint({"PrivateApi", "DiscouragedPrivateApi"})
- public static void setAnimationScale(int type, float value) {
- try {
- Class> smClass = Class.forName("android.os.ServiceManager");
- Method getService = smClass.getDeclaredMethod("getService", String.class);
- getService.setAccessible(true);
- Object manager = getService.invoke(smClass, "window");
-
- Class> wmsClass = Class.forName("android.view.IWindowManager$Stub");
- Method asInterface = wmsClass.getDeclaredMethod("asInterface", IBinder.class);
- asInterface.setAccessible(true);
- Object wm = asInterface.invoke(wmsClass, manager);
-
- Method setAnimationScale = wm.getClass().getDeclaredMethod("setAnimationScale", int.class, float.class);
- setAnimationScale.setAccessible(true);
- setAnimationScale.invoke(wm, type, value);
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- @SuppressLint("DiscouragedPrivateApi")
- private static Method getPackageInfoAsUser(Context context) {
- try {
- return context.getPackageManager().getClass().getDeclaredMethod("getPackageInfoAsUser", String.class, int.class, int.class);
- } catch (Throwable t) {
- t.printStackTrace();
- return null;
- }
- }
-
- public static int getMIUILauncherVersion(Context context) {
- try {
- PackageInfo packageInfo = context.getPackageManager().getPackageInfo("com.miui.home", 0);
- return packageInfo.versionCode;
- } catch (Throwable t) {
- return 0;
- }
- }
-
- public static void getInstalledApps(Context context) {
- final PackageManager pm = context.getPackageManager();
- boolean includeDualApps = checkMultiUserPermission(context);
- Method getPackageInfoAsUser = getPackageInfoAsUser(context);
- if (getPackageInfoAsUser == null) includeDualApps = false;
-
- List packs = pm.getInstalledApplications(PackageManager.GET_META_DATA | PackageManager.MATCH_DISABLED_COMPONENTS);
- installedAppsList = new ArrayList();
- AppData app;
- for (ApplicationInfo pack: packs) try {
- app = new AppData();
- app.enabled = pack.enabled;
- app.label = pack.loadLabel(pm).toString();
- app.pkgName = pack.packageName;
- app.actName = "-";
- installedAppsList.add(app);
- if (includeDualApps) try {
- if (getPackageInfoAsUser.invoke(pm, app.pkgName, 0, 999) != null) {
- AppData appDual = new AppData();
- appDual.enabled = pack.enabled;
- appDual.label = pack.loadLabel(pm).toString();
- appDual.pkgName = pack.packageName;
- appDual.actName = "-";
- appDual.user = 999;
- installedAppsList.add(appDual);
- }
- } catch (Throwable ignore) {}
- } catch (Throwable e) {
- e.printStackTrace();
- }
- installedAppsList.sort(new Comparator() {
- public int compare(AppData app1, AppData app2) {
- return app1.label.compareToIgnoreCase(app2.label);
- }
- });
- }
-
- @SuppressLint("DiscouragedPrivateApi")
- public static void getLaunchableApps(Context context) {
- final PackageManager pm = context.getPackageManager();
- boolean includeDualApps = checkMultiUserPermission(context);
- Method getPackageInfoAsUser = getPackageInfoAsUser(context);
- if (getPackageInfoAsUser == null) includeDualApps = false;
-
- final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
- mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
- List packs = pm.queryIntentActivities(mainIntent, 0);
- launchableAppsList = new ArrayList();
- AppData app;
- for (ResolveInfo pack: packs) try {
- app = new AppData();
- app.pkgName = pack.activityInfo.applicationInfo.packageName;
- app.actName = pack.activityInfo.name;
- app.enabled = pack.activityInfo.enabled;
- app.label = pack.loadLabel(pm).toString();
- launchableAppsList.add(app);
- if (includeDualApps) try {
- if (getPackageInfoAsUser.invoke(pm, app.pkgName, 0, 999) != null) {
- AppData appDual = new AppData();
- appDual.pkgName = pack.activityInfo.applicationInfo.packageName;
- appDual.actName = pack.activityInfo.name;
- appDual.enabled = pack.activityInfo.enabled;
- appDual.label = pack.loadLabel(pm).toString();
- appDual.user = 999;
- launchableAppsList.add(appDual);
- }
- } catch (Throwable ignore) {}
- } catch (Throwable t) {
- t.printStackTrace();
- }
- launchableAppsList.sort(new Comparator() {
- public int compare(AppData app1, AppData app2) {
- return app1.label.compareToIgnoreCase(app2.label);
- }
- });
- }
-
- public static void getShareApps(Context context) {
- PackageManager pm = context.getPackageManager();
- boolean includeDualApps = checkMultiUserPermission(context);
- Method getPackageInfoAsUser = getPackageInfoAsUser(context);
- if (getPackageInfoAsUser == null) includeDualApps = false;
-
- final Intent mainIntent = new Intent();
- mainIntent.setAction(Intent.ACTION_SEND);
- mainIntent.setType("*/*");
- mainIntent.putExtra("CustoMIUIzer", true);
- List packs = pm.queryIntentActivities(mainIntent, PackageManager.MATCH_ALL | PackageManager.MATCH_DISABLED_COMPONENTS);
- shareAppsList = new ArrayList();
- AppData app;
- for (ResolveInfo pack: packs) try {
- boolean exists = false;
- for (AppData shareApp: shareAppsList)
- if (shareApp.pkgName.equals(pack.activityInfo.applicationInfo.packageName)) {
- exists = true;
- break;
- }
- if (exists) continue;
- app = new AppData();
- app.pkgName = pack.activityInfo.applicationInfo.packageName;
- app.actName = "-";
- app.enabled = pack.activityInfo.applicationInfo.enabled;
- app.label = pack.activityInfo.applicationInfo.loadLabel(pm).toString();
- shareAppsList.add(app);
- if (includeDualApps) try {
- if (getPackageInfoAsUser.invoke(pm, app.pkgName, 0, 999) != null) {
- AppData appDual = new AppData();
- appDual.pkgName = pack.activityInfo.applicationInfo.packageName;
- appDual.actName = "-";
- appDual.enabled = pack.activityInfo.applicationInfo.enabled;
- appDual.label = pack.activityInfo.applicationInfo.loadLabel(pm).toString();
- appDual.user = 999;
- shareAppsList.add(appDual);
- }
- } catch (Throwable ignore) {}
- } catch (Throwable e) {
- e.printStackTrace();
- }
- shareAppsList.sort(new Comparator() {
- public int compare(AppData app1, AppData app2) {
- return app1.label.compareToIgnoreCase(app2.label);
- }
- });
- }
-
- public static void getOpenWithApps(Context context) {
- PackageManager pm = context.getPackageManager();
- boolean includeDualApps = checkMultiUserPermission(context);
- Method getPackageInfoAsUser = getPackageInfoAsUser(context);
- if (getPackageInfoAsUser == null) includeDualApps = false;
-
- Intent mainIntent = new Intent();
- mainIntent.setAction(Intent.ACTION_VIEW);
- mainIntent.setDataAndType(Uri.parse("content://" + SharedPrefsProvider.AUTHORITY + "/test/5"), "*/*");
- mainIntent.putExtra("CustoMIUIzer", true);
- List packs = pm.queryIntentActivities(mainIntent, PackageManager.MATCH_ALL | PackageManager.MATCH_DISABLED_COMPONENTS);
-
- mainIntent = new Intent();
- mainIntent.setAction(Intent.ACTION_VIEW);
- mainIntent.setData(Uri.parse("https://google.com"));
- mainIntent.putExtra("CustoMIUIzer", true);
- List packs2 = pm.queryIntentActivities(mainIntent, PackageManager.MATCH_ALL);
-
- mainIntent = new Intent();
- mainIntent.setAction(Intent.ACTION_VIEW);
- mainIntent.setData(Uri.parse("vnd.youtube:n9AcG0glVu4"));
- mainIntent.putExtra("CustoMIUIzer", true);
- List packs3 = pm.queryIntentActivities(mainIntent, PackageManager.MATCH_ALL);
-
- packs.addAll(packs2);
- packs.addAll(packs3);
-
- openWithAppsList = new ArrayList();
- AppData app;
- for (ResolveInfo pack: packs) try {
- boolean exists = false;
- for (AppData openWithApp: openWithAppsList)
- if (openWithApp.pkgName.equals(pack.activityInfo.applicationInfo.packageName)) {
- exists = true;
- break;
- }
- if (exists) continue;
- app = new AppData();
- app.pkgName = pack.activityInfo.applicationInfo.packageName;
- app.actName = "-";
- app.enabled = pack.activityInfo.applicationInfo.enabled;
- app.label = pack.activityInfo.applicationInfo.loadLabel(pm).toString();
- openWithAppsList.add(app);
- if (includeDualApps) try {
- if (getPackageInfoAsUser.invoke(pm, app.pkgName, 0, 999) != null) {
- AppData appDual = new AppData();
- appDual.pkgName = pack.activityInfo.applicationInfo.packageName;
- appDual.actName = "-";
- appDual.enabled = pack.activityInfo.applicationInfo.enabled;
- appDual.label = pack.activityInfo.applicationInfo.loadLabel(pm).toString();
- appDual.user = 999;
- openWithAppsList.add(appDual);
- }
- } catch (Throwable ignore) {}
- } catch (Throwable e) {
- e.printStackTrace();
- }
- openWithAppsList.sort(new Comparator() {
- public int compare(AppData app1, AppData app2) {
- return app1.label.compareToIgnoreCase(app2.label);
- }
- });
- }
-
- public static CharSequence getAppName(Context context, String pkgActName) {
- return getAppName(context, pkgActName, false);
- }
-
- public static CharSequence getAppName(Context context, String pkgActName, boolean forcePkg) {
- PackageManager pm = context.getPackageManager();
- String not_selected = context.getResources().getString(R.string.notselected);
- String[] pkgActArray = pkgActName.split("\\|");
- ApplicationInfo ai;
-
- if (!pkgActName.equals(not_selected))
- if (pkgActArray.length >= 1 && pkgActArray[0] != null) try {
- if (!forcePkg && pkgActArray.length >= 2 && pkgActArray[1] != null && !pkgActArray[1].trim().equals("")) {
- return pm.getActivityInfo(new ComponentName(pkgActArray[0], pkgActArray[1]), 0).loadLabel(pm).toString();
- } else if (!pkgActArray[0].trim().equals("")) {
- ai = pm.getApplicationInfo(pkgActArray[0], 0);
- return pm.getApplicationLabel(ai);
- }
- } catch (Throwable e) {
- e.printStackTrace();
- }
- return null;
- }
-
- public static Drawable getAppIcon(Context context, String pkgActName) {
- return getAppIcon(context, pkgActName, false);
- }
-
- public static Drawable getAppIcon(Context context, String pkgActName, boolean forcePkg) {
- PackageManager pm = context.getPackageManager();
- String not_selected = context.getResources().getString(R.string.notselected);
- String[] pkgActArray = pkgActName.split("\\|");
-
- if (!pkgActName.equals(not_selected))
- if (pkgActArray.length >= 1 && pkgActArray[0] != null) try {
- if (!forcePkg && pkgActArray.length >= 2 && pkgActArray[1] != null && !pkgActArray[1].trim().equals(""))
- return pm.getActivityIcon(new ComponentName(pkgActArray[0], pkgActArray[1]));
- else if (!pkgActArray[0].trim().equals(""))
- return pm.getApplicationIcon(pkgActArray[0]);
- } catch (Throwable e) {
- e.printStackTrace();
- }
- return null;
- }
-
- public static Drawable getShortcutIcon(Context context, String key) {
- Drawable shortcutIcon = null;
- String shortcutIconPath = getProtectedContext(context).getFilesDir() + "/shortcuts/" + key + "_shortcut.png";
- File shortcutIconFile = new File(shortcutIconPath);
- if (shortcutIconFile.exists())
- shortcutIcon = new BitmapDrawable(context.getResources(), BitmapFactory.decodeFile(shortcutIconFile.getAbsolutePath()));
- Drawable[] layers = { shortcutIcon };
- LayerDrawable insetShortcutIcon = new LayerDrawable(layers);
- int padding = (int)(5 * context.getResources().getDisplayMetrics().density);
- insetShortcutIcon.setLayerInset(0, padding, padding, padding, padding);
- return insetShortcutIcon;
- }
-
- public static String getActionName(Context context, String key) {
- try {
- int action = getSharedIntPref(context, key + "_action", 1);
- Resources modRes = getModuleRes(context);
- int resId = GlobalActions.getActionResId(action);
- if (resId != 0)
- return modRes.getString(resId);
- else if (action == 8)
- return (String)getAppName(getModuleContext(context), getSharedStringPref(context, key + "_app", ""), true);
- else if (action == 9)
- return getSharedStringPref(context, key + "_shortcut_name", "");
- else if (action == 10) {
- int what = getSharedIntPref(context, key + "_toggle", 0);
- switch (what) {
- case 1: return modRes.getString(R.string.array_global_toggle_wifi);
- case 2: return modRes.getString(R.string.array_global_toggle_bt);
- case 3: return modRes.getString(R.string.array_global_toggle_gps);
- case 4: return modRes.getString(R.string.array_global_toggle_nfc);
- case 5: return modRes.getString(R.string.array_global_toggle_sound);
- case 6: return modRes.getString(R.string.array_global_toggle_brightness);
- case 7: return modRes.getString(R.string.array_global_toggle_rotation);
- case 8: return modRes.getString(R.string.array_global_toggle_torch);
- case 9: return modRes.getString(R.string.array_global_toggle_mobiledata);
- default: return null;
- }
- } else if (action == 20) {
- Context ctx = getModuleContext(context);
- String pref = getSharedStringPref(context, key + "_activity", "");
- String name = (String)getAppName(ctx, pref);
- if (name == null || name.isEmpty()) name = (String)getAppName(ctx, pref, true);
- return name;
- } else
- return null;
- } catch (Throwable t) {
- XposedBridge.log(t);
- return null;
- }
- }
-
- @SuppressWarnings("ConstantConditions")
- public static Pair getActionNameLocal(Context context, String key) {
- try {
- int action = prefs.getInt(key + "_action", 1);
- Resources modRes = context.getResources();
- Pair