diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarLayout.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarLayout.kt index 936fc3ed..25d2dd72 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarLayout.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarLayout.kt @@ -1,6 +1,7 @@ package com.lt2333.simplicitytools.hook.app.systemui import android.annotation.SuppressLint +import android.app.KeyguardManager import android.content.Context import android.content.res.Configuration import android.content.res.Resources @@ -93,13 +94,13 @@ object StatusBarLayout : HookRegister() { ) (systemIconArea.parent as ViewGroup).removeView(systemIconArea) - val mConstraintLayoutLp = ConstraintLayout.LayoutParams( - ConstraintLayout.LayoutParams.MATCH_PARENT, - ConstraintLayout.LayoutParams.MATCH_PARENT - ) - val mConstraintLayout = - ConstraintLayout(context).also { it.layoutParams = mConstraintLayoutLp } + ConstraintLayout(context).also { + it.layoutParams = ConstraintLayout.LayoutParams( + ConstraintLayout.LayoutParams.MATCH_PARENT, + ConstraintLayout.LayoutParams.MATCH_PARENT + ) + } mConstraintLayout.addView(notificationIconAreaInner) @@ -217,7 +218,223 @@ object StatusBarLayout : HookRegister() { } } //时钟居中+图标居左 - 3 -> {} + 3 -> { + val collapsedStatusBarFragmentClass = + "com.android.systemui.statusbar.phone.CollapsedStatusBarFragment".findClass( + getDefaultClassLoader() + ) + + collapsedStatusBarFragmentClass.hookAfterMethod( + "onViewCreated", + View::class.java, + Bundle::class.java + ) { param -> + val MiuiPhoneStatusBarView: ViewGroup = + param.thisObject.getObjectField("mStatusBar") as ViewGroup + val context: Context = MiuiPhoneStatusBarView.context + val res: Resources = MiuiPhoneStatusBarView.resources + val statusBarId: Int = + res.getIdentifier("status_bar", "id", "com.android.systemui") + val statusBarContentsId: Int = + res.getIdentifier("status_bar_contents", "id", "com.android.systemui") + val systemIconAreaId: Int = + res.getIdentifier("system_icon_area", "id", "com.android.systemui") + val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui") + val phoneStatusBarLeftContainerId: Int = + res.getIdentifier( + "phone_status_bar_left_container", + "id", + "com.android.systemui" + ) + val fullscreenNotificationIconAreaId: Int = + res.getIdentifier( + "fullscreen_notification_icon_area", + "id", + "com.android.systemui" + ) + val statusIconsId: Int = + res.getIdentifier( + "statusIcons", + "id", + "com.android.systemui" + ) + val systemIconsId: Int = + res.getIdentifier( + "system_icons", + "id", + "com.android.systemui" + ) + val batteryId: Int = + res.getIdentifier( + "battery", + "id", + "com.android.systemui" + ) + val notificationIconAreaInnerId: Int = + res.getIdentifier( + "notification_icon_area_inner", + "id", + "com.android.systemui" + ) + + statusBar = MiuiPhoneStatusBarView.findViewById(statusBarId) + val statusBarContents: ViewGroup = + MiuiPhoneStatusBarView.findViewById(statusBarContentsId) + if (statusBar == null) return@hookAfterMethod + val clock: TextView = MiuiPhoneStatusBarView.findViewById(clockId) + val phoneStatusBarLeftContainer: ViewGroup = + MiuiPhoneStatusBarView.findViewById(phoneStatusBarLeftContainerId) + val fullscreenNotificationIconArea: ViewGroup = + MiuiPhoneStatusBarView.findViewById(fullscreenNotificationIconAreaId) + val systemIconArea: ViewGroup = + MiuiPhoneStatusBarView.findViewById(systemIconAreaId) + val statusIcons: ViewGroup = + MiuiPhoneStatusBarView.findViewById(statusIconsId) + val systemIcons: ViewGroup = + MiuiPhoneStatusBarView.findViewById(systemIconsId) + val battery: ViewGroup = + MiuiPhoneStatusBarView.findViewById(batteryId) + val notificationIconAreaInner: ViewGroup = + MiuiPhoneStatusBarView.findViewById(notificationIconAreaInnerId) + + (clock.parent as ViewGroup).removeView(clock) + (phoneStatusBarLeftContainer.parent as ViewGroup).removeView( + phoneStatusBarLeftContainer + ) + (systemIconArea.parent as ViewGroup).removeView(systemIconArea) + (statusIcons.parent as ViewGroup).removeView(statusIcons) + (systemIcons.parent as ViewGroup).removeView(systemIcons) + (battery.parent as ViewGroup).removeView(battery) + (notificationIconAreaInner.parent as ViewGroup).removeView( + notificationIconAreaInner + ) + + val mConstraintLayout = + ConstraintLayout(context).also { + it.layoutParams = ConstraintLayout.LayoutParams( + ConstraintLayout.LayoutParams.MATCH_PARENT, + ConstraintLayout.LayoutParams.MATCH_PARENT + ) + } + + mConstraintLayout.addView(notificationIconAreaInner) + mConstraintLayout.addView(battery) + + + battery.layoutParams = ConstraintLayout.LayoutParams( + ConstraintLayout.LayoutParams.WRAP_CONTENT, + ConstraintLayout.LayoutParams.MATCH_PARENT + ).also { + it.endToEnd = 0 + } + + + notificationIconAreaInner.layoutParams = ConstraintLayout.LayoutParams( + 0, + ConstraintLayout.LayoutParams.MATCH_PARENT + ).also { + it.startToEnd = batteryId + it.endToEnd = 0 + } + notificationIconAreaInner.layoutDirection = View.LAYOUT_DIRECTION_RTL + + + //增加一个左对齐布局 + mLeftLayout = LinearLayout(context) + val LeftLp: LinearLayout.LayoutParams = + LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f) + mLeftLayout!!.layoutParams = LeftLp + mLeftLayout!!.gravity = Gravity.START or Gravity.CENTER_VERTICAL + + //增加一个居中布局 + mCenterLayout = LinearLayout(context) + val CenterLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.MATCH_PARENT + ) + mCenterLayout!!.layoutParams = CenterLp + mCenterLayout!!.gravity = Gravity.CENTER or Gravity.CENTER_VERTICAL + + //增加一个右布局 + mRightLayout = LinearLayout(context) + val RightLp: LinearLayout.LayoutParams = + LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f) + mRightLayout!!.layoutParams = RightLp + mRightLayout!!.gravity = Gravity.END or Gravity.CENTER_VERTICAL + + + mLeftLayout!!.addView(phoneStatusBarLeftContainer) + mLeftLayout!!.addView(statusIcons) + statusIcons.layoutDirection = View.LAYOUT_DIRECTION_RTL + + mCenterLayout!!.addView(clock) + + mRightLayout!!.addView(mConstraintLayout) + fullscreenNotificationIconArea.layoutDirection = View.LAYOUT_DIRECTION_RTL + + + statusBarContents.addView(mLeftLayout, 0) + statusBarContents.addView(mCenterLayout) + statusBarContents.addView(mRightLayout) + + + + statusBarLeft = statusBar!!.paddingLeft + statusBarTop = statusBar!!.paddingTop + statusBarRight = statusBar!!.paddingRight + statusBarBottom = statusBar!!.paddingBottom + + + if (XSPUtils.getBoolean("layout_compatibility_mode", false)) { + val customLeftMargin = XSPUtils.getInt("status_bar_left_margin", 0) + if (customLeftMargin != 0) { + statusBarLeft = customLeftMargin + } + + val customRightMargin = XSPUtils.getInt("status_bar_right_margin", 0) + if (customRightMargin != 0) { + statusBarRight = customRightMargin + } + updateLayout(context) + } + } + //兼容模式 + val phoneStatusBarViewClass = + "com.android.systemui.statusbar.phone.PhoneStatusBarView".findClass( + getDefaultClassLoader() + ) + phoneStatusBarViewClass.hookAfterMethod("updateLayoutForCutout") { + if (XSPUtils.getBoolean("layout_compatibility_mode", false)) { + val context = (it.thisObject as ViewGroup).context + updateLayout(context) + } + } + //解决重叠 + val miuiCollapsedStatusBarFragmentClass = + "com.android.systemui.statusbar.phone.MiuiCollapsedStatusBarFragment".findClass( + getDefaultClassLoader() + ) + + miuiCollapsedStatusBarFragmentClass.hookAfterMethod( + "showClock", + Boolean::class.java + ) { + val MiuiPhoneStatusBarView = + XposedHelpers.getObjectField(it.thisObject, "mStatusBar") as ViewGroup + val res = MiuiPhoneStatusBarView.resources + val status_bar_ID = + res.getIdentifier("status_bar", "id", "com.android.systemui") + val status_bar = MiuiPhoneStatusBarView.findViewById(status_bar_ID) + //非锁屏下整个状态栏布局 + val keyguardMgr = + status_bar.context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager + if (keyguardMgr.isKeyguardLocked) { + status_bar!!.visibility = View.GONE + } else { + status_bar!!.visibility = View.VISIBLE + } + } + } } }