From 2bed96532f1af9d59e262455fa90f1a0130cb33b Mon Sep 17 00:00:00 2001 From: LittleTurtle2333 Date: Mon, 28 Mar 2022 03:14:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=8A=B6=E6=80=81=E6=A0=8F?= =?UTF-8?q?=E6=97=B6=E9=92=9F=E5=B1=85=E5=8F=B3=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/SettingsActivity.kt | 46 ++- .../hook/app/systemui/StatusBarLayout.kt | 273 +++++++++++------- app/src/main/res/values/strings.xml | 4 + 3 files changed, 207 insertions(+), 116 deletions(-) diff --git a/app/src/main/java/com/lt2333/simplicitytools/activity/SettingsActivity.kt b/app/src/main/java/com/lt2333/simplicitytools/activity/SettingsActivity.kt index 9c21ae77..fb96ea8e 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/activity/SettingsActivity.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/activity/SettingsActivity.kt @@ -508,13 +508,47 @@ class SettingsActivity : MIUIActivity() { ) add(LineV()) add(TitleTextV(resId = R.string.status_bar_layout)) + val statusBarLayoutMode: HashMap = hashMapOf() + statusBarLayoutMode[0] = getString(R.string.default1) + statusBarLayoutMode[1] = getString(R.string.clock_center) + statusBarLayoutMode[2] = getString(R.string.clock_right) add( - TextSummaryWithSwitchV( - TextSummaryV( - textId = R.string.status_bar_time_center, - tipsId = R.string.status_bar_layout_summary - ), - SwitchV("status_bar_time_center") + TextWithSpinnerV( + TextV(resId = R.string.status_bar_layout_mode), + SpinnerV( + arrayListOf().apply { + add(MIUIPopupData(statusBarLayoutMode[0].toString()) { + OwnSP.ownSP.edit().run { + putInt( + "status_bar_layout_mode", + 0 + ) + apply() + } + }) + add(MIUIPopupData(statusBarLayoutMode[1].toString()) { + OwnSP.ownSP.edit().run { + putInt( + "status_bar_layout_mode", + 1 + ) + apply() + } + }) + add(MIUIPopupData(statusBarLayoutMode[2].toString()) { + OwnSP.ownSP.edit().run { + putInt( + "status_bar_layout_mode", + 2 + ) + apply() + } + }) + }, currentValue = statusBarLayoutMode[OwnSP.ownSP.getInt( + "status_bar_layout_mode", + 0 + )].toString() + ) ) ) val layoutCompatibilityModeBinding = getDataBinding( 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 4c03b130..a014e874 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 @@ -12,6 +12,7 @@ import android.widget.FrameLayout import android.widget.LinearLayout import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout +import cn.fkj233.ui.activity.dp2px import com.lt2333.simplicitytools.util.XSPUtils import com.lt2333.simplicitytools.util.findClass import com.lt2333.simplicitytools.util.getObjectField @@ -19,7 +20,7 @@ import com.lt2333.simplicitytools.util.hookAfterMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister @SuppressLint("StaticFieldLeak") -object StatusBarLayout: HookRegister() { +object StatusBarLayout : HookRegister() { private var mLeftLayout: LinearLayout? = null private var mRightLayout: LinearLayout? = null @@ -32,138 +33,190 @@ object StatusBarLayout: HookRegister() { private var statusBarBottom = 0 override fun init() { - if (!XSPUtils.getBoolean("status_bar_time_center", false)) return + val mode = XSPUtils.getInt("status_bar_layout_mode", 0) - val collapsedStatusBarFragmentClass = - "com.android.systemui.statusbar.phone.CollapsedStatusBarFragment".findClass(getDefaultClassLoader()) + when (mode) { + //默认 + 0 -> return + //时钟居中 + 1 -> { + 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 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 notificationIconAreaInner: ViewGroup = - MiuiPhoneStatusBarView.findViewById(notificationIconAreaInnerId) - val systemIconArea: ViewGroup = - MiuiPhoneStatusBarView.findViewById(systemIconAreaId) + 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 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 notificationIconAreaInner: ViewGroup = + MiuiPhoneStatusBarView.findViewById(notificationIconAreaInnerId) + val systemIconArea: ViewGroup = + MiuiPhoneStatusBarView.findViewById(systemIconAreaId) - (clock.parent as ViewGroup).removeView(clock) - (phoneStatusBarLeftContainer.parent as ViewGroup).removeView( - phoneStatusBarLeftContainer - ) - (notificationIconAreaInner.parent as ViewGroup).removeView( - notificationIconAreaInner - ) - (systemIconArea.parent as ViewGroup).removeView(systemIconArea) + (clock.parent as ViewGroup).removeView(clock) + (phoneStatusBarLeftContainer.parent as ViewGroup).removeView( + phoneStatusBarLeftContainer + ) + (notificationIconAreaInner.parent as ViewGroup).removeView( + notificationIconAreaInner + ) + (systemIconArea.parent as ViewGroup).removeView(systemIconArea) - val mConstraintLayoutLp = ConstraintLayout.LayoutParams( - ConstraintLayout.LayoutParams.MATCH_PARENT, - ConstraintLayout.LayoutParams.MATCH_PARENT - ) + val mConstraintLayoutLp = ConstraintLayout.LayoutParams( + ConstraintLayout.LayoutParams.MATCH_PARENT, + ConstraintLayout.LayoutParams.MATCH_PARENT + ) - val mConstraintLayout = - ConstraintLayout(context).also { it.layoutParams = mConstraintLayoutLp } + val mConstraintLayout = + ConstraintLayout(context).also { it.layoutParams = mConstraintLayoutLp } - mConstraintLayout.addView(notificationIconAreaInner) + mConstraintLayout.addView(notificationIconAreaInner) - val fullscreen_notification_icon_area_lp = LinearLayout.LayoutParams( - ConstraintLayout.LayoutParams.MATCH_PARENT, - ConstraintLayout.LayoutParams.MATCH_PARENT - ) + val fullscreen_notification_icon_area_lp = LinearLayout.LayoutParams( + ConstraintLayout.LayoutParams.MATCH_PARENT, + ConstraintLayout.LayoutParams.MATCH_PARENT + ) - notificationIconAreaInner.layoutParams = fullscreen_notification_icon_area_lp + notificationIconAreaInner.layoutParams = fullscreen_notification_icon_area_lp - //增加一个左对齐布局 - 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 + //增加一个左对齐布局 + 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(mConstraintLayout) + //增加一个居中布局 + 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(mConstraintLayout) - mCenterLayout!!.addView(clock) - mRightLayout!!.addView(systemIconArea) - statusBarContents.addView(mLeftLayout, 0) - statusBarContents.addView(mCenterLayout) - statusBarContents.addView(mRightLayout) + mCenterLayout!!.addView(clock) + mRightLayout!!.addView(systemIconArea) + statusBarContents.addView(mLeftLayout, 0) + statusBarContents.addView(mCenterLayout) + statusBarContents.addView(mRightLayout) - statusBarLeft = statusBar!!.paddingLeft - statusBarTop = statusBar!!.paddingTop - statusBarRight = statusBar!!.paddingRight - statusBarBottom = statusBar!!.paddingBottom + 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 + 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 miuiPhoneStatusBarViewClass = + "com.android.systemui.statusbar.phone.MiuiPhoneStatusBarView".findClass( + getDefaultClassLoader() + ) - val customRightMargin = XSPUtils.getInt("status_bar_right_margin", 0) - if (customRightMargin != 0) { - statusBarRight = customRightMargin + miuiPhoneStatusBarViewClass.hookAfterMethod("updateNotificationIconAreaInnnerParent") { + val viewGroup = it.thisObject as ViewGroup + val fullscreen_notification_icon_area_lp = FrameLayout.LayoutParams( + ConstraintLayout.LayoutParams.MATCH_PARENT, + ConstraintLayout.LayoutParams.MATCH_PARENT + ) + viewGroup.layoutParams = fullscreen_notification_icon_area_lp + } + 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) + } } - updateLayout(context) } + //时钟居右 + 2 -> { + 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 phoneStatusBarViewClass = - "com.android.systemui.statusbar.phone.PhoneStatusBarView".findClass(getDefaultClassLoader()) + val statusBarId: Int = + res.getIdentifier("status_bar", "id", "com.android.systemui") + val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui") + val batteryId: Int = res.getIdentifier("battery", "id", "com.android.systemui") - phoneStatusBarViewClass.hookAfterMethod("updateLayoutForCutout") { - if (XSPUtils.getBoolean("layout_compatibility_mode", false)) { - val context = (it.thisObject as ViewGroup).context - updateLayout(context) + statusBar = MiuiPhoneStatusBarView.findViewById(statusBarId) + if (statusBar == null) return@hookAfterMethod + val clock: TextView = MiuiPhoneStatusBarView.findViewById(clockId) + val battery: ViewGroup = MiuiPhoneStatusBarView.findViewById(batteryId) + + (clock.parent as ViewGroup).removeView(clock) + battery!!.addView(clock) + clock.setPadding(dp2px(context,5f),0,0,0) + } } } - val miuiPhoneStatusBarViewClass = - "com.android.systemui.statusbar.phone.MiuiPhoneStatusBarView".findClass(getDefaultClassLoader()) - - miuiPhoneStatusBarViewClass.hookAfterMethod("updateNotificationIconAreaInnnerParent") { - val viewGroup = it.thisObject as ViewGroup - val fullscreen_notification_icon_area_lp = FrameLayout.LayoutParams( - ConstraintLayout.LayoutParams.MATCH_PARENT, - ConstraintLayout.LayoutParams.MATCH_PARENT - ) - viewGroup.layoutParams = fullscreen_notification_icon_area_lp - } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ecf1186c..ee204f4a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -193,4 +193,8 @@ Cast Force all apps support open on another device Dual row center align + Default + Clock Center + Clock Right + Status bar layout mode