mirror of
https://github.com/LittleTurtle2333/SimplicityTools.git
synced 2026-07-12 19:31:17 +08:00
新增状态栏时钟居右布局
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user