├── .github
├── CONTRIBUTING.md
└── ISSUE_TEMPLATE.md
├── .gitignore
├── README.md
├── Screenshots
├── App_1.png
├── App_2.png
├── App_3.png
├── App_4.png
├── App_5.png
├── Notifications_1.png
├── Notifications_2.png
├── Recents_1.png
├── Recents_2.png
├── Settings_1.png
├── Settings_2.png
└── StatusBarHeader_1.png
├── app
├── .gitignore
├── build.gradle
├── libs-provide
│ └── android_hidden_api_23.jar
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── assets
│ ├── assistant_hooks
│ └── xposed_init
│ ├── java
│ ├── com
│ │ └── android
│ │ │ └── egg
│ │ │ └── neko
│ │ │ ├── Cat.java
│ │ │ ├── Food.java
│ │ │ ├── FoodSelectionActivity.java
│ │ │ ├── NekoDialog.java
│ │ │ ├── NekoLand.java
│ │ │ ├── NekoLockedActivity.java
│ │ │ ├── NekoService.java
│ │ │ └── PrefState.java
│ ├── net
│ │ └── margaritov
│ │ │ └── preference
│ │ │ └── colorpicker
│ │ │ ├── AlphaPatternDrawable.java
│ │ │ ├── ColorPickerDialog.java
│ │ │ ├── ColorPickerPanelView.java
│ │ │ ├── ColorPickerPreference.java
│ │ │ └── ColorPickerView.java
│ └── tk
│ │ └── wasdennnoch
│ │ └── androidn_ify
│ │ ├── PreferenceProvider.java
│ │ ├── XposedHook.java
│ │ ├── android
│ │ └── AndroidHooks.java
│ │ ├── extracted
│ │ ├── android
│ │ │ └── pm
│ │ │ │ └── PackageManager.java
│ │ ├── settingslib
│ │ │ ├── BatteryInfo.java
│ │ │ ├── CircleFramedDrawable.java
│ │ │ ├── UsageGraph.java
│ │ │ ├── UsageView.java
│ │ │ └── Utils.java
│ │ └── systemui
│ │ │ ├── AlphaOptimizedButton.java
│ │ │ ├── AlphaOptimizedFrameLayout.java
│ │ │ ├── AlphaOptimizedImageView.java
│ │ │ ├── ExpandableIndicator.java
│ │ │ ├── FakeShadowView.java
│ │ │ ├── Interpolators.java
│ │ │ ├── MobileDataController.java
│ │ │ ├── NonInterceptingScrollView.java
│ │ │ ├── NotificationActionListLayout.java
│ │ │ ├── NotificationUtils.java
│ │ │ ├── PathInterpolatorBuilder.java
│ │ │ ├── RemoteInputView.java
│ │ │ ├── ResizingSpace.java
│ │ │ ├── ScreenshotSelectorView.java
│ │ │ └── qs
│ │ │ ├── PageIndicator.java
│ │ │ ├── PagedTileLayout.java
│ │ │ ├── QSAnimator.java
│ │ │ ├── QSDetail.java
│ │ │ ├── QSDetailClipper.java
│ │ │ ├── QuickQSPanel.java
│ │ │ ├── TileLayout.java
│ │ │ └── TouchAnimator.java
│ │ ├── google
│ │ └── AssistantHooks.java
│ │ ├── misc
│ │ ├── SafeOnClickListener.java
│ │ ├── SafeOnLongClickListener.java
│ │ ├── SafeOnPreDrawListener.java
│ │ └── SafeRunnable.java
│ │ ├── packageinstaller
│ │ └── PackageInstallerHooks.java
│ │ ├── phone
│ │ └── emergency
│ │ │ ├── EmergencyButtonWrapper.java
│ │ │ └── EmergencyHooks.java
│ │ ├── settings
│ │ ├── SettingsDashboardHooks.java
│ │ ├── SettingsDrawerHooks.java
│ │ ├── SettingsHooks.java
│ │ ├── misc
│ │ │ ├── DashboardOverlay.java
│ │ │ ├── SettingsActivityHelper.java
│ │ │ └── SettingsDrawerAdapter.java
│ │ └── summaries
│ │ │ ├── SummaryTweaks.java
│ │ │ └── categories
│ │ │ ├── DeviceTweaks.java
│ │ │ ├── PersonalTweaks.java
│ │ │ ├── RomTweaks.java
│ │ │ ├── SystemTweaks.java
│ │ │ └── WirelessAndNetworksTweaks.java
│ │ ├── systemui
│ │ ├── SystemUIHooks.java
│ │ ├── notifications
│ │ │ ├── ActivatableNotificationViewHooks.java
│ │ │ ├── ExpandableOutlineViewHelper.java
│ │ │ ├── NotificationHeaderView.java
│ │ │ ├── NotificationHooks.java
│ │ │ ├── NotificationPanelHooks.java
│ │ │ ├── NotificationPanelViewHooks.java
│ │ │ ├── RelativeDateTimeView.java
│ │ │ ├── ScrimHelper.java
│ │ │ ├── ScrimHooks.java
│ │ │ ├── SensitiveNotificationFilter.java
│ │ │ ├── SensitiveNotificationRow.java
│ │ │ ├── StatusBarHeaderHooks.java
│ │ │ ├── stack
│ │ │ │ ├── NotificationStackScrollLayoutHooks.java
│ │ │ │ └── StackScrollAlgorithmHooks.java
│ │ │ └── views
│ │ │ │ ├── MediaNotificationView.java
│ │ │ │ ├── RemoteInputHelper.java
│ │ │ │ └── SensitiveFilterButton.java
│ │ ├── qs
│ │ │ ├── AvailableTileAdapter.java
│ │ │ ├── CMQuickSettingsHooks.java
│ │ │ ├── DetailViewManager.java
│ │ │ ├── KeyguardMonitor.java
│ │ │ ├── QSContainerHelper.java
│ │ │ ├── QSTileHostHooks.java
│ │ │ ├── QuickSettingsHooks.java
│ │ │ ├── TileAdapter.java
│ │ │ ├── TilesManager.java
│ │ │ ├── customize
│ │ │ │ └── QSCustomizer.java
│ │ │ └── tiles
│ │ │ │ ├── AOSPTile.java
│ │ │ │ ├── AndroidN_ifyTile.java
│ │ │ │ ├── BaseTile.java
│ │ │ │ ├── BatteryTile.java
│ │ │ │ ├── LiveDisplayTile.java
│ │ │ │ ├── NekoTile.java
│ │ │ │ ├── PartialScreenshotTile.java
│ │ │ │ ├── QSTile.java
│ │ │ │ ├── hooks
│ │ │ │ ├── BluetoothTileHook.java
│ │ │ │ ├── CellularTileHook.java
│ │ │ │ ├── QSTileHook.java
│ │ │ │ └── WifiTileHook.java
│ │ │ │ └── misc
│ │ │ │ ├── BatteryInfoManager.java
│ │ │ │ ├── BatteryMeterDrawable.java
│ │ │ │ ├── FakeQSTileView.java
│ │ │ │ └── LiveDisplayObserver.java
│ │ ├── recents
│ │ │ ├── doubletap
│ │ │ │ ├── DoubleTapBase.java
│ │ │ │ ├── DoubleTapHwKeys.java
│ │ │ │ └── DoubleTapSwKeys.java
│ │ │ ├── navigate
│ │ │ │ └── RecentsNavigation.java
│ │ │ └── stack
│ │ │ │ └── RecentsStackHooks.java
│ │ ├── screenshot
│ │ │ └── ScreenshotHooks.java
│ │ └── statusbar
│ │ │ ├── LollipopStatusBarHooks.java
│ │ │ └── StatusBarHooks.java
│ │ ├── ui
│ │ ├── AboutActivity.java
│ │ ├── AddTileActivity.java
│ │ ├── AppListActivity.java
│ │ ├── BlacklistAppActivity.java
│ │ ├── LoadAppInfoTask.java
│ │ ├── PlatLogoActivity.java
│ │ ├── SettingsActivity.java
│ │ ├── emergency
│ │ │ ├── EmergencyContactManager.java
│ │ │ ├── EmergencyTabActivity.java
│ │ │ ├── PreferenceKeys.java
│ │ │ ├── ReloadablePreferenceInterface.java
│ │ │ ├── edit
│ │ │ │ ├── EditEmergencyContactsFragment.java
│ │ │ │ ├── EditEmergencyInfoFragment.java
│ │ │ │ ├── EditInfoActivity.java
│ │ │ │ └── LaunchEditInfoActivity.java
│ │ │ ├── preferences
│ │ │ │ ├── AutoCompleteEditTextPreference.java
│ │ │ │ ├── ContactPreference.java
│ │ │ │ ├── EmergencyContactsPreference.java
│ │ │ │ ├── EmergencyEditTextPreference.java
│ │ │ │ ├── EmergencyListPreference.java
│ │ │ │ ├── NameAutoCompletePreference.java
│ │ │ │ └── ViewEmergencyContactsPreference.java
│ │ │ └── view
│ │ │ │ ├── ViewEmergencyContactsFragment.java
│ │ │ │ ├── ViewEmergencyInfoFragment.java
│ │ │ │ └── ViewInfoActivity.java
│ │ ├── misc
│ │ │ ├── AppsAdapter.java
│ │ │ ├── CachedResolveInfo.java
│ │ │ ├── DownloadService.java
│ │ │ ├── OnUpdateReceiver.java
│ │ │ └── UpdateWarningService.java
│ │ └── preference
│ │ │ ├── DropDownPreference.java
│ │ │ ├── SeekBarPreference.java
│ │ │ └── SubPreference.java
│ │ └── utils
│ │ ├── ColorUtils.java
│ │ ├── ConfigUtils.java
│ │ ├── MarginSpan.java
│ │ ├── MiscUtils.java
│ │ ├── NotificationColorUtil.java
│ │ ├── PermissionGranter.java
│ │ ├── PreferenceService.java
│ │ ├── RemoteLpTextView.java
│ │ ├── RemoteMarginLinearLayout.java
│ │ ├── ResourceUtils.java
│ │ ├── RomUtils.java
│ │ ├── SettingsUtils.java
│ │ ├── TestUtils.java
│ │ ├── UpdateUtils.java
│ │ └── ViewUtils.java
│ └── res
│ ├── anim
│ ├── ic_volume_collapse_chevron_02_animation.xml
│ ├── ic_volume_collapse_rectangle_1_animation.xml
│ ├── ic_volume_collapse_rectangle_2_animation.xml
│ ├── ic_volume_expand_chevron_01_animation.xml
│ ├── ic_volume_expand_rectangle_3_animation.xml
│ ├── ic_volume_expand_rectangle_4_animation.xml
│ ├── major_a_b_dot_01_animation.xml
│ ├── major_a_b_dot_animation.xml
│ ├── major_b_a_dot_01_animation.xml
│ ├── major_b_a_dot_animation.xml
│ ├── major_b_c_dot_01_animation.xml
│ ├── major_b_c_dot_animation.xml
│ ├── major_c_b_dot_01_animation.xml
│ ├── major_c_b_dot_animation.xml
│ ├── minor_a_b_dot_02_animation.xml
│ ├── minor_b_a_dot_02_animation.xml
│ ├── minor_b_c_dot_02_animation.xml
│ └── minor_c_b_dot_02_animation.xml
│ ├── animator
│ ├── fade_in.xml
│ ├── fade_out.xml
│ ├── fly_in.xml
│ └── fly_out.xml
│ ├── color
│ ├── remote_input_send.xml
│ └── remote_input_text.xml
│ ├── drawable-nodpi
│ └── ic_namey_mcnameface.png
│ ├── drawable-xhdpi
│ ├── arrow_down_alpha.png
│ └── arrow_up_alpha.png
│ ├── drawable
│ ├── arrow_down.xml
│ ├── arrow_up.xml
│ ├── back.xml
│ ├── belly.xml
│ ├── body.xml
│ ├── bowtie.xml
│ ├── cap.xml
│ ├── collar.xml
│ ├── face_spot.xml
│ ├── food_bits.xml
│ ├── food_chicken.xml
│ ├── food_dish.xml
│ ├── food_donut.xml
│ ├── food_sysuituna.xml
│ ├── foot1.xml
│ ├── foot2.xml
│ ├── foot3.xml
│ ├── foot4.xml
│ ├── head.xml
│ ├── header_dot.xml
│ ├── home.xml
│ ├── ic_about.xml
│ ├── ic_account_circle.xml
│ ├── ic_add.xml
│ ├── ic_add_24dp.xml
│ ├── ic_address_black_24dp.xml
│ ├── ic_allergies_black_24dp.xml
│ ├── ic_android_92.xml
│ ├── ic_bloodtype_black_24dp.xml
│ ├── ic_clear_24dp.xml
│ ├── ic_close.xml
│ ├── ic_collapse_notification.xml
│ ├── ic_crop.xml
│ ├── ic_done_92.xml
│ ├── ic_expand_notification.xml
│ ├── ic_github.xml
│ ├── ic_heart_black_24dp.xml
│ ├── ic_livedisplay_auto.xml
│ ├── ic_livedisplay_day.xml
│ ├── ic_livedisplay_night.xml
│ ├── ic_livedisplay_off.xml
│ ├── ic_livedisplay_outdoor.xml
│ ├── ic_lock.xml
│ ├── ic_lock_open.xml
│ ├── ic_medication_24dp.xml
│ ├── ic_menu.xml
│ ├── ic_mode_edit.xml
│ ├── ic_mode_edit_24dp.xml
│ ├── ic_notes_black_24dp.xml
│ ├── ic_person_black_24dp.xml
│ ├── ic_qs_data_disabled.xml
│ ├── ic_refresh.xml
│ ├── ic_report_problem_92.xml
│ ├── ic_send_24dp.xml
│ ├── ic_settings_20dp.xml
│ ├── ic_share.xml
│ ├── ic_stat_n.xml
│ ├── ic_volume_collapse.xml
│ ├── ic_volume_collapse_animation.xml
│ ├── ic_volume_expand.xml
│ ├── ic_volume_expand_animation.xml
│ ├── ic_xda.xml
│ ├── icon.xml
│ ├── left_ear.xml
│ ├── left_ear_inside.xml
│ ├── left_eye.xml
│ ├── leg1.xml
│ ├── leg2.xml
│ ├── leg2_shadow.xml
│ ├── leg3.xml
│ ├── leg4.xml
│ ├── major_a_b.xml
│ ├── major_a_b_animation.xml
│ ├── major_b_a.xml
│ ├── major_b_a_animation.xml
│ ├── major_b_c.xml
│ ├── major_b_c_animation.xml
│ ├── major_c_b.xml
│ ├── major_c_b_animation.xml
│ ├── minor_a_b.xml
│ ├── minor_a_b_animation.xml
│ ├── minor_b_a.xml
│ ├── minor_b_a_animation.xml
│ ├── minor_b_c.xml
│ ├── minor_b_c_animation.xml
│ ├── minor_c_b.xml
│ ├── minor_c_b_animation.xml
│ ├── mouth.xml
│ ├── nose.xml
│ ├── notification_material_media_action_background.xml
│ ├── platlogo.xml
│ ├── qs_btn_borderless_rect.xml
│ ├── recents_empty.xml
│ ├── remote_input_cursor.xml
│ ├── right_ear.xml
│ ├── right_ear_inside.xml
│ ├── right_eye.xml
│ ├── ripple_dismiss_all.xml
│ ├── ripple_drawable.xml
│ ├── stat_icon.xml
│ ├── stat_sys_data_disabled.xml
│ ├── tail.xml
│ ├── tail_cap.xml
│ ├── tail_shadow.xml
│ └── view_contact_divider.xml
│ ├── interpolator
│ ├── ic_volume_collapse_animation_interpolator_0.xml
│ └── ic_volume_expand_animation_interpolator_0.xml
│ ├── layout-land
│ └── dialog_color_picker.xml
│ ├── layout
│ ├── activity_about.xml
│ ├── activity_add_tile.xml
│ ├── activity_app_list.xml
│ ├── activity_emergency_info.xml
│ ├── activity_settings.xml
│ ├── app_row.xml
│ ├── battery_detail.xml
│ ├── battery_usage_graph.xml
│ ├── cat_view.xml
│ ├── custom_action_bar.xml
│ ├── custom_preference_category_layout.xml
│ ├── dialog_color_picker.xml
│ ├── drawer_category.xml
│ ├── drawer_item.xml
│ ├── drawer_spacer.xml
│ ├── edit_activity_layout.xml
│ ├── edit_text.xml
│ ├── emergency_button.xml
│ ├── emergency_view_activity_layout.xml
│ ├── food_layout.xml
│ ├── neko_activity.xml
│ ├── notification_filter_button.xml
│ ├── notification_template_header.xml
│ ├── notification_template_part_chronometer.xml
│ ├── preference_dialog_autocomplete_edittext.xml
│ ├── preference_user_delete_widget.xml
│ ├── qs_customize_divider.xml
│ ├── qs_customize_panel_content.xml
│ ├── qs_detail.xml
│ ├── qs_right_button.xml
│ ├── qs_up_button.xml
│ ├── recents_empty.xml
│ ├── remote_input.xml
│ ├── settings_with_drawer.xml
│ ├── slider_preference.xml
│ ├── tabs.xml
│ ├── usage_side_label.xml
│ └── usage_view.xml
│ ├── menu
│ ├── edit_info_menu.xml
│ ├── menu_app_list.xml
│ ├── menu_settings.xml
│ └── view_info_menu.xml
│ ├── mipmap-hdpi
│ ├── ic_launcher.png
│ └── ic_launcher_settings.png
│ ├── mipmap-mdpi
│ ├── ic_launcher.png
│ └── ic_launcher_settings.png
│ ├── mipmap-xhdpi
│ ├── ic_launcher.png
│ └── ic_launcher_settings.png
│ ├── mipmap-xxhdpi
│ ├── ic_launcher.png
│ └── ic_launcher_settings.png
│ ├── mipmap-xxxhdpi
│ └── ic_launcher_settings.png
│ ├── values-ar-rSA
│ └── strings.xml
│ ├── values-bn-rBD
│ └── strings.xml
│ ├── values-bs-rBA
│ └── strings.xml
│ ├── values-cs-rCZ
│ └── strings.xml
│ ├── values-da-rDK
│ └── strings.xml
│ ├── values-de-rDE
│ └── strings.xml
│ ├── values-el-rGR
│ └── strings.xml
│ ├── values-es-rES
│ └── strings.xml
│ ├── values-fa-rIR
│ └── strings.xml
│ ├── values-fr-rFR
│ └── strings.xml
│ ├── values-hi-rIN
│ └── strings.xml
│ ├── values-hu-rHU
│ └── strings.xml
│ ├── values-in-rID
│ └── strings.xml
│ ├── values-it-rIT
│ └── strings.xml
│ ├── values-iw-rIL
│ └── strings.xml
│ ├── values-ja-rJP
│ └── strings.xml
│ ├── values-ko-rKR
│ └── strings.xml
│ ├── values-land
│ ├── config.xml
│ └── dimens.xml
│ ├── values-nl-rNL
│ └── strings.xml
│ ├── values-pl-rPL
│ └── strings.xml
│ ├── values-pt-rBR
│ └── strings.xml
│ ├── values-pt-rPT
│ └── strings.xml
│ ├── values-ro-rRO
│ └── strings.xml
│ ├── values-ru-rRU
│ └── strings.xml
│ ├── values-sk-rSK
│ └── strings.xml
│ ├── values-sr-rSP
│ └── strings.xml
│ ├── values-sw410dp
│ └── config.xml
│ ├── values-sw540dp
│ └── config.xml
│ ├── values-sw600dp-land
│ └── config.xml
│ ├── values-th-rTH
│ └── strings.xml
│ ├── values-tr-rTR
│ └── strings.xml
│ ├── values-uk-rUA
│ └── strings.xml
│ ├── values-v21
│ └── styles.xml
│ ├── values-vi-rVN
│ └── strings.xml
│ ├── values-w550dp-land
│ ├── config.xml
│ └── dimens.xml
│ ├── values-zh-rCN
│ └── strings.xml
│ ├── values-zh-rTW
│ └── strings.xml
│ ├── values
│ ├── arrays.xml
│ ├── attrs.xml
│ ├── colors.xml
│ ├── config.xml
│ ├── dimens.xml
│ ├── donottranslate.xml
│ ├── ids.xml
│ ├── integers.xml
│ └── strings.xml
│ └── xml
│ ├── edit_emergency_contacts.xml
│ ├── edit_emergency_info.xml
│ ├── experimental_prefs.xml
│ ├── hide_header_icons_prefs.xml
│ ├── lockscreen_prefs.xml
│ ├── notifications_prefs.xml
│ ├── other_prefs.xml
│ ├── preferences.xml
│ ├── qs_prefs.xml
│ ├── recent_prefs.xml
│ ├── settings_prefs.xml
│ ├── view_emergency_contacts.xml
│ └── view_emergency_info.xml
├── banner.png
├── build.gradle
├── changelog.md
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── ic_launcher_big.png
└── settings.gradle
/.github/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | ## Issue guidelines
2 |
3 | Hey there! You found a problem with the module and found your way here to report it? Great! But there are some things you have to keep in mind before submitting a new issue:
4 |
5 | * **Check for duplicates**. Use the search function to search for keywords matching your issue. If there already is one which sounds similar to your one, please reply there instead of opening a new issue. Only exception are SystemUI crashes as they can be caused by various reasons. If any contributor finds a duplicate (or the same crash) he will close it.
6 |
7 | * **Always attach your Xposed log**. If an app crashes though you'll have to add a logcat. Use Google to learn how to capture a logcat.
8 |
9 | * If you are using a stable version from the Xposed repository, **install a snapshot build** to see if the issue is already fixed. You can find these snapshot in the readme.
10 |
11 | * If the issue is new and not yet fixed in the snapshot builds go ahead and **describe your issue as precise as possible**, add screenshots or videos if necessary.
12 |
13 | Note that there is no time limit in which the issue will be adressed. Some get fixed quickly, others take some time. Don't open a new issue because you think we forgot about the old one - we don't "forget" issues.
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Generated files
2 | *build/
3 |
4 | # Local configuration file (sdk path, etc)
5 | local.properties
6 |
7 | # Intellij project files
8 | *.iml
9 | *.ipr
10 | *.iws
11 | .idea/
12 |
13 | # Gradle
14 | /.gradle/
15 |
16 | # Gedit save files
17 | *.*~
18 |
19 | # Other
20 | .DS_Store
21 | /captures
22 | /app/app-release.apk
23 |
24 | AndroidNify.jks
25 | key.properties
26 |
--------------------------------------------------------------------------------
/Screenshots/App_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/Screenshots/App_1.png
--------------------------------------------------------------------------------
/Screenshots/App_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/Screenshots/App_2.png
--------------------------------------------------------------------------------
/Screenshots/App_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/Screenshots/App_3.png
--------------------------------------------------------------------------------
/Screenshots/App_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/Screenshots/App_4.png
--------------------------------------------------------------------------------
/Screenshots/App_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/Screenshots/App_5.png
--------------------------------------------------------------------------------
/Screenshots/Notifications_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/Screenshots/Notifications_1.png
--------------------------------------------------------------------------------
/Screenshots/Notifications_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/Screenshots/Notifications_2.png
--------------------------------------------------------------------------------
/Screenshots/Recents_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/Screenshots/Recents_1.png
--------------------------------------------------------------------------------
/Screenshots/Recents_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/Screenshots/Recents_2.png
--------------------------------------------------------------------------------
/Screenshots/Settings_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/Screenshots/Settings_1.png
--------------------------------------------------------------------------------
/Screenshots/Settings_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/Screenshots/Settings_2.png
--------------------------------------------------------------------------------
/Screenshots/StatusBarHeader_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/Screenshots/StatusBarHeader_1.png
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/libs-provide/android_hidden_api_23.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wasdennnoch/AndroidN-ify/7fd4fe402e935ad6d421d0b1ad1a0619d0f327c4/app/libs-provide/android_hidden_api_23.jar
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in C:\Program Files\Android\android-sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 | -keep class tk.wasdennnoch.androidn_ify.XposedHook
19 | -keep class tk.wasdennnoch.androidn_ify.ui.SettingsActivity
20 |
--------------------------------------------------------------------------------
/app/src/main/assets/assistant_hooks:
--------------------------------------------------------------------------------
1 | [
2 | 12,
3 | {
4 | "version": "6\\.11\\.2[0-9]\\.21\\.[a-z]+[0-9]*",
5 | "assistant_class": ".shared.h",
6 | "prefs": "bBc",
7 | "set_prefs": "aT",
8 | "fake_config": "sc",
9 | "fake_config_two": "se",
10 | "enable_langs": "sf"
11 | }
12 | ]
13 |
--------------------------------------------------------------------------------
/app/src/main/assets/xposed_init:
--------------------------------------------------------------------------------
1 | tk.wasdennnoch.androidn_ify.XposedHook
--------------------------------------------------------------------------------
/app/src/main/java/com/android/egg/neko/FoodSelectionActivity.java:
--------------------------------------------------------------------------------
1 | package com.android.egg.neko;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 |
6 | public class FoodSelectionActivity extends Activity {
7 |
8 | @Override
9 | protected void onCreate(Bundle savedInstanceState) {
10 | super.onCreate(savedInstanceState);
11 | new NekoDialog(this).show();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/PreferenceProvider.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify;
2 |
3 | import com.crossbowffs.remotepreferences.RemotePreferenceProvider;
4 |
5 | public class PreferenceProvider extends RemotePreferenceProvider {
6 |
7 | public static final String AUTHORITY = "tk.wasdennnoch.androidn_ify.PREFERENCES";
8 | public static final String PREF_NAME = "tk.wasdennnoch.androidn_ify_preferences";
9 |
10 | public PreferenceProvider() {
11 | super(AUTHORITY, new String[]{PREF_NAME});
12 | }
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/extracted/systemui/AlphaOptimizedButton.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.extracted.systemui;
2 |
3 | import android.content.Context;
4 | import android.widget.Button;
5 |
6 | public class AlphaOptimizedButton extends Button {
7 |
8 | public AlphaOptimizedButton(Context context) {
9 | super(context);
10 | }
11 |
12 | @Override
13 | public boolean hasOverlappingRendering() {
14 | return false;
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/misc/SafeOnClickListener.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.misc;
2 |
3 | import android.view.View;
4 |
5 | import tk.wasdennnoch.androidn_ify.XposedHook;
6 |
7 | /**
8 | * An implementation of {@link View.OnClickListener} which catches
9 | * any exception thrown in {@link #onClickSafe(View)}.
10 | */
11 | @SuppressWarnings("WeakerAccess")
12 | public abstract class SafeOnClickListener implements View.OnClickListener {
13 |
14 | private String mLogTag;
15 | private String mLogMessage;
16 |
17 | /**
18 | * Constructs a {@code SafeOnClickListener} which eats any Throwable without logging it.
19 | */
20 | public SafeOnClickListener() {
21 | }
22 |
23 | /**
24 | * Constructs a {@code SafeOnClickListener} which logs thrown Throwables.
25 | *
26 | * @param logTag The tag used to log
27 | * @param logMessage The message to log before the stack trace
28 | */
29 | public SafeOnClickListener(String logTag, String logMessage) {
30 | mLogTag = logTag;
31 | mLogMessage = logMessage;
32 | }
33 |
34 | /**
35 | * Override this method instead of {@link #onClick(View)} to have a crash protection.
36 | */
37 | public abstract void onClickSafe(View v);
38 |
39 | /**
40 | * DON'T OVERRIDE THIS! Override {@link #onClickSafe(View)} instead.
41 | */
42 | @Override
43 | public void onClick(View v) {
44 | try {
45 | onClickSafe(v);
46 | } catch (Throwable t) {
47 | if (mLogTag != null) XposedHook.logE(mLogTag, mLogMessage, t);
48 | }
49 | }
50 |
51 | }
52 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/misc/SafeRunnable.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.misc;
2 |
3 | import tk.wasdennnoch.androidn_ify.XposedHook;
4 |
5 | /**
6 | * An implementation of {@link Runnable} which catches any exception thrown
7 | * in {@link #runSafe()}. Useful in handlers to avoid crashing an app.
8 | */
9 | @SuppressWarnings("WeakerAccess")
10 | public abstract class SafeRunnable implements Runnable {
11 |
12 | private String mLogTag;
13 | private String mLogMessage;
14 |
15 | /**
16 | * Constructs a {@code SafeRunnable} which eats any Throwable without logging it.
17 | */
18 | public SafeRunnable() {
19 | }
20 |
21 | /**
22 | * Constructs a {@code SafeRunnable} which logs thrown Throwables.
23 | *
24 | * @param logTag The tag used to log
25 | * @param logMessage The message to log before the stack trace
26 | */
27 | public SafeRunnable(String logTag, String logMessage) {
28 | mLogTag = logTag;
29 | mLogMessage = logMessage;
30 | }
31 |
32 | /**
33 | * Override this method instead of {@link #run()} to have a crash protection.
34 | */
35 | public abstract void runSafe();
36 |
37 | /**
38 | * DON'T OVERRIDE THIS! Override {@link #runSafe()} instead.
39 | */
40 | @Override
41 | public void run() {
42 | try {
43 | runSafe();
44 | } catch (Throwable t) {
45 | if (mLogTag != null) XposedHook.logE(mLogTag, mLogMessage, t);
46 | }
47 | }
48 |
49 | }
50 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/settings/summaries/categories/PersonalTweaks.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.settings.summaries.categories;
2 |
3 | import android.content.Context;
4 | import android.location.LocationManager;
5 |
6 | import java.util.Locale;
7 |
8 | import de.robv.android.xposed.XposedHelpers;
9 | import tk.wasdennnoch.androidn_ify.R;
10 | import tk.wasdennnoch.androidn_ify.utils.ResourceUtils;
11 |
12 | public class PersonalTweaks {
13 |
14 | public static void hookLocationTile(Object tile, Context context) {
15 | String summary;
16 | LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
17 | boolean gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
18 | boolean network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
19 | if (!gps_enabled && !network_enabled) {
20 | summary = ResourceUtils.getInstance().getString(R.string.disabled);
21 | } else if (gps_enabled && network_enabled) {
22 | summary = ResourceUtils.getInstance().getString(R.string.location_on_high);
23 | } else if (gps_enabled) {
24 | summary = ResourceUtils.getInstance().getString(R.string.location_on_device);
25 | } else {
26 | summary = ResourceUtils.getInstance().getString(R.string.location_on_power);
27 | }
28 |
29 | XposedHelpers.setObjectField(tile, "summary", summary);
30 | }
31 |
32 | public static void hookLanguageTile(Object tile) {
33 | XposedHelpers.setObjectField(tile, "summary", Locale.getDefault().getDisplayName());
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/settings/summaries/categories/RomTweaks.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.settings.summaries.categories;
2 |
3 | import android.content.Context;
4 |
5 | public class RomTweaks {
6 |
7 | public static void hookDisplayAndLightsTile(Object tile, Context context) {
8 | DeviceTweaks.hookDisplayTile(tile, context);
9 | }
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/systemui/notifications/SensitiveNotificationRow.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.systemui.notifications;
2 |
3 | import android.app.Notification;
4 |
5 | import de.robv.android.xposed.XposedHelpers;
6 |
7 | public class SensitiveNotificationRow implements SensitiveNotificationFilter.SensitiveFilterListener {
8 |
9 | private String mPackageName;
10 | private Object mRow;
11 |
12 | private boolean mSensitive;
13 | private boolean mEnabled;
14 | private boolean mPrivate;
15 |
16 | public SensitiveNotificationRow(SensitiveNotificationFilter sensitiveFilter, Object row, Object sbn) {
17 | mPackageName = (String) XposedHelpers.getObjectField(sbn, "pkg");
18 | mRow = row;
19 | mEnabled = sensitiveFilter.isEnabled(mPackageName);
20 |
21 | Notification notification = (Notification) XposedHelpers.getObjectField(sbn, "notification");
22 | mPrivate = notification.visibility == Notification.VISIBILITY_PRIVATE;
23 |
24 | sensitiveFilter.addListener(this, mPackageName);
25 | }
26 |
27 | @Override
28 | public void onPackageChanged(String pkg, boolean enabled) {
29 | if (!pkg.equals(mPackageName)) return;
30 | mEnabled = enabled;
31 | updateSensitive();
32 | }
33 |
34 | public void setSensitive(boolean sensitive) {
35 | mSensitive = sensitive;
36 | updateSensitive();
37 | }
38 |
39 | private void updateSensitive() {
40 | XposedHelpers.setBooleanField(mRow, "mSensitive", (mEnabled && mPrivate) || mSensitive);
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/systemui/qs/CMQuickSettingsHooks.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.systemui.qs;
2 |
3 | import android.view.View;
4 | import android.view.ViewGroup;
5 |
6 | import de.robv.android.xposed.XC_MethodHook;
7 | import de.robv.android.xposed.XposedHelpers;
8 |
9 | class CMQuickSettingsHooks extends QuickSettingsHooks {
10 | CMQuickSettingsHooks(ClassLoader classLoader) {
11 | super(classLoader);
12 | }
13 |
14 | @Override
15 | protected void hookConstructor() {
16 | XposedHelpers.findAndHookMethod(mHookClass, "setupViews", new XC_MethodHook() {
17 | @Override
18 | protected void afterHookedMethod(MethodHookParam param) throws Throwable {
19 | mQsPanel = (ViewGroup) param.thisObject;
20 | mContext = mQsPanel.getContext();
21 | mBrightnessView = (View) XposedHelpers.getObjectField(param.thisObject, "mQsPanelTop");
22 | mFooter = XposedHelpers.getObjectField(param.thisObject, "mFooter");
23 | mDetail = (View) XposedHelpers.getObjectField(param.thisObject, "mDetail");
24 | setupTileLayout();
25 | }
26 | });
27 | }
28 |
29 | @Override
30 | protected String getHookClass() {
31 | return CLASS_QS_DRAG_PANEL;
32 | }
33 |
34 | @Override
35 | protected String getSecondHookClass() {
36 | return CLASS_QS_PANEL;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/systemui/qs/tiles/AndroidN_ifyTile.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.systemui.qs.tiles;
2 |
3 | import android.content.Intent;
4 | import android.graphics.drawable.Drawable;
5 |
6 | import tk.wasdennnoch.androidn_ify.R;
7 | import tk.wasdennnoch.androidn_ify.systemui.qs.TilesManager;
8 | import tk.wasdennnoch.androidn_ify.ui.SettingsActivity;
9 |
10 | public class AndroidN_ifyTile extends QSTile {
11 |
12 | public static final String TILE_SPEC = "androidn_ify";
13 | private final Drawable mIcon;
14 | private final String mLabel;
15 |
16 | public AndroidN_ifyTile(TilesManager tilesManager, Object host, String key) {
17 | super(tilesManager, host, key);
18 | mIcon = mResUtils.getDrawable(R.drawable.ic_stat_n);
19 | mLabel = mResUtils.getString(R.string.app_name);
20 | }
21 |
22 | @Override
23 | public void handleUpdateState(Object state, Object arg) {
24 | mState.icon = mIcon;
25 | mState.label = mLabel;
26 | super.handleUpdateState(state, arg);
27 | }
28 |
29 | @Override
30 | public void handleClick() {
31 | handleLongClick();
32 | }
33 |
34 | @Override
35 | public void handleLongClick() {
36 | Intent intent = new Intent(Intent.ACTION_MAIN);
37 | intent.setClassName("tk.wasdennnoch.androidn_ify", SettingsActivity.class.getName());
38 | startActivityDismissingKeyguard(intent);
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/ui/BlacklistAppActivity.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.ui;
2 |
3 | public class BlacklistAppActivity extends AppListActivity {
4 | @Override
5 | protected String getKey() {
6 | return "notification_blacklist_apps";
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/ui/emergency/ReloadablePreferenceInterface.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2016 The Android Open Source Project
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | package tk.wasdennnoch.androidn_ify.ui.emergency;
17 | /**
18 | * Provides common methods to be called when reloading a preference.
19 | */
20 | public interface ReloadablePreferenceInterface {
21 | /** Reloads the value from the preference and updates the summary with that value. */
22 | void reloadFromPreference();
23 | /**
24 | * Returns whether the persisted string is empty or set to the default value, i.e. the user
25 | * didn't set it.
26 | */
27 | boolean isNotSet();
28 | }
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/ui/misc/CachedResolveInfo.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.ui.misc;
2 |
3 | import android.content.pm.ResolveInfo;
4 | import android.graphics.drawable.Drawable;
5 |
6 | @SuppressWarnings("WeakerAccess")
7 | public class CachedResolveInfo {
8 |
9 | private CharSequence label;
10 | private Drawable icon;
11 | private int color;
12 | public ResolveInfo resolveInfo;
13 |
14 | private String labelSearch;
15 | private String packageNameSearch;
16 |
17 | public void setLabel(CharSequence label) {
18 | this.label = label;
19 | this.labelSearch = label.toString().toLowerCase();
20 | }
21 |
22 | public void setIcon(Drawable icon) {
23 | this.icon = icon;
24 | }
25 |
26 | public void setColor(int color) {
27 | this.color = color;
28 | }
29 |
30 | public CharSequence getLabel() {
31 | return label;
32 | }
33 |
34 | public Drawable getIcon() {
35 | return icon;
36 | }
37 |
38 | public int getColor() {
39 | return color;
40 | }
41 |
42 | public void setResolveInfo(ResolveInfo resolveInfo) {
43 | this.resolveInfo = resolveInfo;
44 | this.packageNameSearch = resolveInfo.activityInfo.packageName.toLowerCase();
45 | }
46 |
47 | public String getPackageName() {
48 | return resolveInfo.activityInfo.packageName;
49 | }
50 |
51 | public boolean search(String query) {
52 | return labelSearch.contains(query) || packageNameSearch.contains(query);
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/ui/misc/OnUpdateReceiver.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.ui.misc;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.content.BroadcastReceiver;
5 | import android.content.Context;
6 | import android.content.Intent;
7 |
8 | import tk.wasdennnoch.androidn_ify.ui.SettingsActivity;
9 |
10 | public class OnUpdateReceiver extends BroadcastReceiver {
11 |
12 | @SuppressWarnings("ConstantConditions")
13 | @SuppressLint("UnsafeProtectedBroadcastReceiver")
14 | @Override
15 | public void onReceive(Context context, Intent intent) {
16 | if (SettingsActivity.isActivated()) {
17 | context.startService(new Intent(context, UpdateWarningService.class));
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/ui/misc/UpdateWarningService.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.ui.misc;
2 |
3 | import android.app.Notification;
4 | import android.app.Service;
5 | import android.content.Intent;
6 | import android.os.IBinder;
7 |
8 | import tk.wasdennnoch.androidn_ify.R;
9 | import tk.wasdennnoch.androidn_ify.XposedHook;
10 |
11 | @SuppressWarnings("deprecation")
12 | public class UpdateWarningService extends Service {
13 |
14 | @Override
15 | public IBinder onBind(Intent intent) {
16 | // TODO: Return the communication channel to the service.
17 | throw new UnsupportedOperationException("Not yet implemented");
18 | }
19 |
20 | @Override
21 | public int onStartCommand(Intent intent, int flags, int startId) {
22 | return START_STICKY;
23 | }
24 |
25 | @Override
26 | public void onCreate() {
27 | Notification.Builder builder = new Notification.Builder(this)
28 | .setSmallIcon(R.drawable.ic_stat_n)
29 | .setContentTitle(getString(R.string.update_warning))
30 | .setContentText(getString(R.string.update_warning_details))
31 | .setStyle(new Notification.BigTextStyle().bigText(getString(R.string.update_warning_details)))
32 | .setPriority(Notification.PRIORITY_MAX)
33 | .setColor(getResources().getColor(R.color.colorAccent));
34 | startForeground(10, builder.build());
35 | sendBroadcast(new Intent(XposedHook.ACTION_MARK_UNSTABLE).setPackage(XposedHook.PACKAGE_SYSTEMUI));
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/ui/preference/SubPreference.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.ui.preference;
2 |
3 | import android.content.Context;
4 | import android.content.res.TypedArray;
5 | import android.preference.Preference;
6 | import android.util.AttributeSet;
7 |
8 | import tk.wasdennnoch.androidn_ify.R;
9 |
10 | public class SubPreference extends Preference {
11 |
12 | private int mContent;
13 |
14 | public SubPreference(Context context, AttributeSet attrs) {
15 | super(context, attrs);
16 | init(context, attrs);
17 | }
18 |
19 | private void init(Context context, AttributeSet attrs) {
20 | TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SubPreference);
21 | for (int i = a.getIndexCount() - 1; i >= 0; i--) {
22 | int attr = a.getIndex(i);
23 | switch (attr) {
24 | case R.styleable.SubPreference_content:
25 | mContent = a.getResourceId(attr, 0);
26 | break;
27 | }
28 | }
29 | a.recycle();
30 | setFragment("");
31 | }
32 |
33 | public int getContent() {
34 | return mContent;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/utils/ColorUtils.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.utils;
2 |
3 | import android.graphics.Bitmap;
4 | import android.graphics.Canvas;
5 | import android.graphics.drawable.Drawable;
6 | import android.support.v7.graphics.Palette;
7 |
8 | public class ColorUtils {
9 |
10 | public static int generateColor(Drawable drawable, int defaultColor) {
11 | Palette palette = Palette.from(convertToBitmap(drawable, 128, 128)).generate();
12 | int color = palette.getVibrantColor(defaultColor);
13 | if (color != defaultColor) return color;
14 | color = palette.getLightVibrantColor(defaultColor);
15 | if (color != defaultColor) return color;
16 | color = palette.getDarkMutedColor(defaultColor);
17 | if (color != defaultColor) return color;
18 | color = palette.getLightMutedColor(defaultColor);
19 | return color;
20 | }
21 |
22 | private static Bitmap convertToBitmap(Drawable drawable, int widthPixels, int heightPixels) {
23 | Bitmap bitmap = Bitmap.createBitmap(widthPixels, heightPixels, Bitmap.Config.ARGB_8888);
24 | Canvas canvas = new Canvas(bitmap);
25 | drawable.setBounds(0, 0, widthPixels, heightPixels);
26 | drawable.draw(canvas);
27 | return bitmap;
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/utils/MarginSpan.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.utils;
2 |
3 | import android.graphics.Canvas;
4 | import android.graphics.Paint;
5 | import android.text.Layout;
6 | import android.text.style.LeadingMarginSpan;
7 |
8 | public class MarginSpan implements LeadingMarginSpan.LeadingMarginSpan2 {
9 | private int margin;
10 | private int lines;
11 |
12 | public MarginSpan(int lines, int margin) {
13 | this.margin = margin;
14 | this.lines = lines;
15 | }
16 |
17 | @Override
18 | public int getLeadingMargin(boolean first) {
19 | if (first) {
20 | return margin;
21 | } else {
22 | return 0;
23 | }
24 | }
25 |
26 | @Override
27 | public void drawLeadingMargin(Canvas c, Paint p, int x, int dir,
28 | int top, int baseline, int bottom, CharSequence text,
29 | int start, int end, boolean first, Layout layout) {}
30 |
31 | @Override
32 | public int getLeadingMarginLineCount() {
33 | return lines;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/utils/MiscUtils.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.utils;
2 |
3 | import android.content.Context;
4 | import android.content.pm.PackageManager;
5 |
6 | import org.json.JSONArray;
7 | import org.json.JSONException;
8 |
9 | import java.io.BufferedReader;
10 | import java.io.IOException;
11 | import java.io.InputStream;
12 | import java.io.InputStreamReader;
13 |
14 | public class MiscUtils {
15 |
16 | public static boolean isGBInstalled(Context context) {
17 | try {
18 | context.getPackageManager().getPackageInfo(ConfigUtils.M ? "com.ceco.marshmallow.gravitybox" : "com.ceco.lollipop.gravitybox", 0);
19 | return true;
20 | } catch (PackageManager.NameNotFoundException e) {
21 | return false;
22 | }
23 | }
24 |
25 | public static String readInputStream(InputStream stream) throws IOException {
26 | StringBuilder result = new StringBuilder();
27 | BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
28 | String line;
29 | while ((line = reader.readLine()) != null) {
30 | result.append(line);
31 | }
32 | return result.toString();
33 | }
34 |
35 | public static JSONArray checkValidJSONArray(String json) throws JSONException {
36 | return new JSONArray(json.replace(" ", ""));
37 | }
38 | }
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/utils/RemoteLpTextView.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.utils;
2 |
3 | import android.content.Context;
4 | import android.support.annotation.Nullable;
5 | import android.util.AttributeSet;
6 | import android.view.RemotableViewMethod;
7 | import android.widget.TextView;
8 |
9 | public class RemoteLpTextView extends TextView {
10 |
11 | public RemoteLpTextView(Context context) {
12 | super(context);
13 | }
14 |
15 | public RemoteLpTextView(Context context, @Nullable AttributeSet attrs) {
16 | super(context, attrs);
17 | }
18 |
19 | public RemoteLpTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
20 | super(context, attrs, defStyleAttr);
21 | }
22 |
23 | public RemoteLpTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
24 | super(context, attrs, defStyleAttr, defStyleRes);
25 | }
26 |
27 | @RemotableViewMethod
28 | public void setWidth(int width) {
29 | ViewUtils.setWidth(this, width);
30 | }
31 |
32 | @RemotableViewMethod
33 | public void setHeight(int height) {
34 | ViewUtils.setHeight(this, height);
35 | }
36 |
37 | @RemotableViewMethod
38 | public void setMarginEnd(int margin) {
39 | ResourceUtils res = ResourceUtils.getInstance(getContext());
40 | ViewUtils.setMarginEnd(this, margin);
41 | }
42 |
43 | @RemotableViewMethod
44 | public void setMarginBottom(int margin) {
45 | ResourceUtils res = ResourceUtils.getInstance(getContext());
46 | ViewUtils.setMarginBottom(this, margin);
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/utils/RemoteMarginLinearLayout.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.utils;
2 |
3 | import android.content.Context;
4 | import android.view.RemotableViewMethod;
5 | import android.widget.LinearLayout;
6 |
7 | public class RemoteMarginLinearLayout extends LinearLayout {
8 |
9 | public RemoteMarginLinearLayout(Context context) {
10 | super(context);
11 | }
12 |
13 | @RemotableViewMethod
14 | public void setMarginEnd(int margin) {
15 | ResourceUtils res = ResourceUtils.getInstance(getContext());
16 | ViewUtils.setMarginEnd(this, res.getDimensionPixelSize(margin));
17 | }
18 |
19 | @RemotableViewMethod
20 | public void setMarginBottom(int margin) {
21 | ResourceUtils res = ResourceUtils.getInstance(getContext());
22 | ViewUtils.setMarginBottom(this, res.getDimensionPixelSize(margin));
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/app/src/main/java/tk/wasdennnoch/androidn_ify/utils/TestUtils.java:
--------------------------------------------------------------------------------
1 | package tk.wasdennnoch.androidn_ify.utils;
2 |
3 | import java.lang.reflect.Method;
4 | import java.lang.reflect.Modifier;
5 |
6 | import de.robv.android.xposed.XposedBridge;
7 | import tk.wasdennnoch.androidn_ify.XposedHook;
8 |
9 | @SuppressWarnings("unused")
10 | public class TestUtils {
11 |
12 | private static final String TAG = "TestUtils";
13 |
14 | public static void logMethods(Class clazz) {
15 | XposedHook.logI(TAG, "LOGGING ALL METHODS OF CLASS " + clazz.getSimpleName());
16 | Method[] methods = clazz.getDeclaredMethods();
17 | for (int i = 0; i < methods.length; i++) {
18 | Method m = methods[i];
19 | String log = " " + (i + 1) + ". - " +
20 | Modifier.toString(m.getModifiers()) + " " +
21 | m.getReturnType().getSimpleName() + " " +
22 | m.getName() + "(";
23 | Class[] parameters = m.getParameterTypes();
24 | for (int j = 0; j < parameters.length; j++) {
25 | log += parameters[j].getSimpleName();
26 | if (j != parameters.length - 1)
27 | log += ", ";
28 | }
29 | log += ");";
30 | XposedBridge.log(log);
31 | }
32 | XposedHook.logI(TAG, "METHOD LOG END");
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/ic_volume_collapse_chevron_02_animation.xml:
--------------------------------------------------------------------------------
1 |
13 |
14 |