新增状态栏时钟居右布局

This commit is contained in:
LittleTurtle2333
2022-03-28 03:14:02 +08:00
parent 314fc7b46f
commit 2bed96532f
3 changed files with 207 additions and 116 deletions

View File

@@ -508,13 +508,47 @@ class SettingsActivity : MIUIActivity() {
) )
add(LineV()) add(LineV())
add(TitleTextV(resId = R.string.status_bar_layout)) add(TitleTextV(resId = R.string.status_bar_layout))
val statusBarLayoutMode: HashMap<Int, String> = hashMapOf()
statusBarLayoutMode[0] = getString(R.string.default1)
statusBarLayoutMode[1] = getString(R.string.clock_center)
statusBarLayoutMode[2] = getString(R.string.clock_right)
add( add(
TextSummaryWithSwitchV( TextWithSpinnerV(
TextSummaryV( TextV(resId = R.string.status_bar_layout_mode),
textId = R.string.status_bar_time_center, SpinnerV(
tipsId = R.string.status_bar_layout_summary arrayListOf<MIUIPopupData>().apply {
), add(MIUIPopupData(statusBarLayoutMode[0].toString()) {
SwitchV("status_bar_time_center") 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( val layoutCompatibilityModeBinding = getDataBinding(

View File

@@ -12,6 +12,7 @@ import android.widget.FrameLayout
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import cn.fkj233.ui.activity.dp2px
import com.lt2333.simplicitytools.util.XSPUtils import com.lt2333.simplicitytools.util.XSPUtils
import com.lt2333.simplicitytools.util.findClass import com.lt2333.simplicitytools.util.findClass
import com.lt2333.simplicitytools.util.getObjectField import com.lt2333.simplicitytools.util.getObjectField
@@ -19,7 +20,7 @@ import com.lt2333.simplicitytools.util.hookAfterMethod
import com.lt2333.simplicitytools.util.xposed.base.HookRegister import com.lt2333.simplicitytools.util.xposed.base.HookRegister
@SuppressLint("StaticFieldLeak") @SuppressLint("StaticFieldLeak")
object StatusBarLayout: HookRegister() { object StatusBarLayout : HookRegister() {
private var mLeftLayout: LinearLayout? = null private var mLeftLayout: LinearLayout? = null
private var mRightLayout: LinearLayout? = null private var mRightLayout: LinearLayout? = null
@@ -32,138 +33,190 @@ object StatusBarLayout: HookRegister() {
private var statusBarBottom = 0 private var statusBarBottom = 0
override fun init() { override fun init() {
if (!XSPUtils.getBoolean("status_bar_time_center", false)) return val mode = XSPUtils.getInt("status_bar_layout_mode", 0)
val collapsedStatusBarFragmentClass = when (mode) {
"com.android.systemui.statusbar.phone.CollapsedStatusBarFragment".findClass(getDefaultClassLoader()) //默认
0 -> return
//时钟居中
1 -> {
val collapsedStatusBarFragmentClass =
"com.android.systemui.statusbar.phone.CollapsedStatusBarFragment".findClass(
getDefaultClassLoader()
)
collapsedStatusBarFragmentClass.hookAfterMethod( collapsedStatusBarFragmentClass.hookAfterMethod(
"onViewCreated", "onViewCreated",
View::class.java, View::class.java,
Bundle::class.java Bundle::class.java
) { param -> ) { param ->
val MiuiPhoneStatusBarView: ViewGroup = val MiuiPhoneStatusBarView: ViewGroup =
param.thisObject.getObjectField("mStatusBar") as ViewGroup param.thisObject.getObjectField("mStatusBar") as ViewGroup
val context: Context = MiuiPhoneStatusBarView.context val context: Context = MiuiPhoneStatusBarView.context
val res: Resources = MiuiPhoneStatusBarView.resources val res: Resources = MiuiPhoneStatusBarView.resources
val statusBarId: Int = res.getIdentifier("status_bar", "id", "com.android.systemui") val statusBarId: Int =
val statusBarContentsId: Int = res.getIdentifier("status_bar", "id", "com.android.systemui")
res.getIdentifier("status_bar_contents", "id", "com.android.systemui") val statusBarContentsId: Int =
val systemIconAreaId: Int = res.getIdentifier("status_bar_contents", "id", "com.android.systemui")
res.getIdentifier("system_icon_area", "id", "com.android.systemui") val systemIconAreaId: Int =
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui") res.getIdentifier("system_icon_area", "id", "com.android.systemui")
val phoneStatusBarLeftContainerId: Int = val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
res.getIdentifier("phone_status_bar_left_container", "id", "com.android.systemui") val phoneStatusBarLeftContainerId: Int =
val notificationIconAreaInnerId: Int = res.getIdentifier(
res.getIdentifier("notification_icon_area_inner", "id", "com.android.systemui") "phone_status_bar_left_container",
statusBar = MiuiPhoneStatusBarView.findViewById(statusBarId) "id",
val statusBarContents: ViewGroup = "com.android.systemui"
MiuiPhoneStatusBarView.findViewById(statusBarContentsId) )
if (statusBar == null) return@hookAfterMethod val notificationIconAreaInnerId: Int =
val clock: TextView = MiuiPhoneStatusBarView.findViewById(clockId) res.getIdentifier(
val phoneStatusBarLeftContainer: ViewGroup = "notification_icon_area_inner",
MiuiPhoneStatusBarView.findViewById(phoneStatusBarLeftContainerId) "id",
val notificationIconAreaInner: ViewGroup = "com.android.systemui"
MiuiPhoneStatusBarView.findViewById(notificationIconAreaInnerId) )
val systemIconArea: ViewGroup = statusBar = MiuiPhoneStatusBarView.findViewById(statusBarId)
MiuiPhoneStatusBarView.findViewById(systemIconAreaId) 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) (clock.parent as ViewGroup).removeView(clock)
(phoneStatusBarLeftContainer.parent as ViewGroup).removeView( (phoneStatusBarLeftContainer.parent as ViewGroup).removeView(
phoneStatusBarLeftContainer phoneStatusBarLeftContainer
) )
(notificationIconAreaInner.parent as ViewGroup).removeView( (notificationIconAreaInner.parent as ViewGroup).removeView(
notificationIconAreaInner notificationIconAreaInner
) )
(systemIconArea.parent as ViewGroup).removeView(systemIconArea) (systemIconArea.parent as ViewGroup).removeView(systemIconArea)
val mConstraintLayoutLp = ConstraintLayout.LayoutParams( val mConstraintLayoutLp = ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT,
ConstraintLayout.LayoutParams.MATCH_PARENT ConstraintLayout.LayoutParams.MATCH_PARENT
) )
val mConstraintLayout = val mConstraintLayout =
ConstraintLayout(context).also { it.layoutParams = mConstraintLayoutLp } ConstraintLayout(context).also { it.layoutParams = mConstraintLayoutLp }
mConstraintLayout.addView(notificationIconAreaInner) mConstraintLayout.addView(notificationIconAreaInner)
val fullscreen_notification_icon_area_lp = LinearLayout.LayoutParams( val fullscreen_notification_icon_area_lp = LinearLayout.LayoutParams(
ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT,
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) mLeftLayout = LinearLayout(context)
val LeftLp: LinearLayout.LayoutParams = val LeftLp: LinearLayout.LayoutParams =
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f) LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
mLeftLayout!!.layoutParams = LeftLp mLeftLayout!!.layoutParams = LeftLp
mLeftLayout!!.gravity = Gravity.START or Gravity.CENTER_VERTICAL mLeftLayout!!.gravity = Gravity.START or Gravity.CENTER_VERTICAL
//增加一个居中布局 //增加一个居中布局
mCenterLayout = LinearLayout(context) mCenterLayout = LinearLayout(context)
val CenterLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams( val CenterLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT LinearLayout.LayoutParams.MATCH_PARENT
) )
mCenterLayout!!.layoutParams = CenterLp mCenterLayout!!.layoutParams = CenterLp
mCenterLayout!!.gravity = Gravity.CENTER or Gravity.CENTER_VERTICAL mCenterLayout!!.gravity = Gravity.CENTER or Gravity.CENTER_VERTICAL
mRightLayout = LinearLayout(context) mRightLayout = LinearLayout(context)
val RightLp: LinearLayout.LayoutParams = val RightLp: LinearLayout.LayoutParams =
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f) LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
mRightLayout!!.layoutParams = RightLp mRightLayout!!.layoutParams = RightLp
mRightLayout!!.gravity = Gravity.END or Gravity.CENTER_VERTICAL mRightLayout!!.gravity = Gravity.END or Gravity.CENTER_VERTICAL
mLeftLayout!!.addView(phoneStatusBarLeftContainer) mLeftLayout!!.addView(phoneStatusBarLeftContainer)
mLeftLayout!!.addView(mConstraintLayout) mLeftLayout!!.addView(mConstraintLayout)
mCenterLayout!!.addView(clock) mCenterLayout!!.addView(clock)
mRightLayout!!.addView(systemIconArea) mRightLayout!!.addView(systemIconArea)
statusBarContents.addView(mLeftLayout, 0) statusBarContents.addView(mLeftLayout, 0)
statusBarContents.addView(mCenterLayout) statusBarContents.addView(mCenterLayout)
statusBarContents.addView(mRightLayout) statusBarContents.addView(mRightLayout)
statusBarLeft = statusBar!!.paddingLeft statusBarLeft = statusBar!!.paddingLeft
statusBarTop = statusBar!!.paddingTop statusBarTop = statusBar!!.paddingTop
statusBarRight = statusBar!!.paddingRight statusBarRight = statusBar!!.paddingRight
statusBarBottom = statusBar!!.paddingBottom statusBarBottom = statusBar!!.paddingBottom
if (XSPUtils.getBoolean("layout_compatibility_mode", false)) { if (XSPUtils.getBoolean("layout_compatibility_mode", false)) {
val customLeftMargin = XSPUtils.getInt("status_bar_left_margin", 0) val customLeftMargin = XSPUtils.getInt("status_bar_left_margin", 0)
if (customLeftMargin != 0) { if (customLeftMargin != 0) {
statusBarLeft = customLeftMargin 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) miuiPhoneStatusBarViewClass.hookAfterMethod("updateNotificationIconAreaInnnerParent") {
if (customRightMargin != 0) { val viewGroup = it.thisObject as ViewGroup
statusBarRight = customRightMargin 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 = val statusBarId: Int =
"com.android.systemui.statusbar.phone.PhoneStatusBarView".findClass(getDefaultClassLoader()) 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") { statusBar = MiuiPhoneStatusBarView.findViewById(statusBarId)
if (XSPUtils.getBoolean("layout_compatibility_mode", false)) { if (statusBar == null) return@hookAfterMethod
val context = (it.thisObject as ViewGroup).context val clock: TextView = MiuiPhoneStatusBarView.findViewById(clockId)
updateLayout(context) 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
}
} }

View File

@@ -193,4 +193,8 @@
<string name="cast">Cast</string> <string name="cast">Cast</string>
<string name="force_support_send_app">Force all apps support open on another device</string> <string name="force_support_send_app">Force all apps support open on another device</string>
<string name="status_bar_time_double_line_center_align">Dual row center align</string> <string name="status_bar_time_double_line_center_align">Dual row center align</string>
<string name="default1">Default</string>
<string name="clock_center">Clock Center</string>
<string name="clock_right">Clock Right</string>
<string name="status_bar_layout_mode">Status bar layout mode</string>
</resources> </resources>