diff --git a/app/src/main/java/com/boringdroid/systemui/provider/VolumeProvider.kt b/app/src/main/java/com/boringdroid/systemui/provider/VolumeProvider.kt new file mode 100644 index 00000000..d4a2ad4c --- /dev/null +++ b/app/src/main/java/com/boringdroid/systemui/provider/VolumeProvider.kt @@ -0,0 +1,61 @@ +package com.boringdroid.systemui.provider + +import android.media.AudioSystem +import com.boringdroid.systemui.data.AudioDevice +import com.boringdroid.systemui.view.TopBarControlWindow.Companion.TAG +import kotlin.text.isEmpty +import kotlin.text.split + +class VolumeProvider { + + var audioDevice: AudioDevice? = null + + fun getVolume(): Int{ + val streamMinVolume = 0 + val streamMaxVolume = 100 + val devices = getDevices(false) + if (devices.isNotEmpty()) audioDevice = devices[0] + val curVolume = audioDevice?.volume ?: 0F + val currentVolume = (curVolume * streamMaxVolume).toInt() + return currentVolume + } + + // Returns results such as : + // alsa_output.pci-0000_04_00.1.hdmi-stereo hdmi-output-0=HDMI / DisplayPort=0.440000=0;alsa_output.platform-PHYT0006_00.stereo-fallback analog-output-headphones=模拟耳机=0.450000=0 + private fun getDevices(type: Boolean): ArrayList { + try { + val devicesResult = AudioSystem.getDevs(type) + val audioDeviceList = ArrayList() + + // When there is no device, the result is empty, + // then you should return the audioDevices in advance. + if (devicesResult == null || devicesResult.isEmpty()) return audioDeviceList + val deviceResult = devicesResult.split(';') + deviceResult.forEachIndexed { index, device -> + val audioDevice = parseDevice(device, type, index == 0) + if (audioDevice != null) audioDeviceList.add(audioDevice) + } + return audioDeviceList + } catch (e: Exception) { + com.boringdroid.systemui.Log.e(TAG, "getDevs Exception: ${e.message}") + return ArrayList() + } + } + + private fun parseDevice(result: String, type: Boolean, isSelected: Boolean): AudioDevice? { + try { + val deviceInfo = result.split('=') + val audioDevice = AudioDevice(deviceInfo[0], deviceInfo[1], type, isSelected) + // If the size of the returned data is 4, it means that volume and isMuted exist. + if (deviceInfo.size == 4) { + audioDevice.needInfo = false + audioDevice.volume = deviceInfo[2].toFloat() + audioDevice.isMuted = ("1" == deviceInfo[3]) + } + return audioDevice + } catch (e: Exception) { + com.boringdroid.systemui.Log.e(TAG, "parseDevs exception: ${e.message}") + return null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/boringdroid/systemui/view/AppOverviewWindow.kt b/app/src/main/java/com/boringdroid/systemui/view/AppOverviewWindow.kt index bd9830c6..930b8f1e 100644 --- a/app/src/main/java/com/boringdroid/systemui/view/AppOverviewWindow.kt +++ b/app/src/main/java/com/boringdroid/systemui/view/AppOverviewWindow.kt @@ -17,6 +17,7 @@ import android.text.Editable import android.text.TextWatcher import android.util.Log import android.view.KeyEvent +import android.view.KeyEvent.KEYCODE_ENTER import android.view.KeyEvent.KEYCODE_TAB import android.view.LayoutInflater import android.view.View @@ -77,6 +78,7 @@ class AppOverviewWindow( var wallpaperManager :WallpaperManager ?= null var wallpaperBitmap : Bitmap ?= null var blurWallPaperRadius : Float ?= 0.0f + var div : Int = 1 companion object { const val WINDOW_PADDING = 100 @@ -117,7 +119,7 @@ class AppOverviewWindow( getContext().resources.getDimensionPixelSize(R.dimen.overview_margin_bottom) val dimensionPixelSize = getContext().resources.getDimensionPixelSize(R.dimen.overview_app_height) - val div = (screenHeight - dimensionPixelSize1 - dimensionPixelSize2 + 30 ).div(dimensionPixelSize) + div = (screenHeight - dimensionPixelSize1 - dimensionPixelSize2 + 30 ).div(dimensionPixelSize) Log.d(TAG, "initViews: $dimensionPixelSize1 $dimensionPixelSize2 $screenHeight $dimensionPixelSize $div") appPages = apps.chunked(NUMBER_OF_COLUMNS * div) as MutableList> appsPagerAdapter = AppsPagerAdapter(appPages, this) @@ -174,6 +176,8 @@ class AppOverviewWindow( } else if(keyCode == KEYCODE_TAB && event.action == KeyEvent.ACTION_UP) { focusView?.requestFocus() return@setOnKeyListener true + } else if(keyCode == KEYCODE_ENTER && event.action == KeyEvent.ACTION_UP){ + return@setOnKeyListener true } else { return@setOnKeyListener false } @@ -229,10 +233,6 @@ class AppOverviewWindow( override fun onAnimationEnd(animation: Animator) { if(isEnter){ blurWallPaper(OVERVIEW_BG_RADIUS * 1.0f) -// getContentView()?.postDelayed(300, -// { -// blurWallPaper(OVERVIEW_BG_RADIUS * 1.0f) -// }) } else { destroy() } @@ -310,29 +310,13 @@ class AppOverviewWindow( override fun onPageScrollStateChanged(state: Int) { Log.d("ViewPager", "onPageScrollStateChanged() called with: state = $state") indicatorMi?.onPageScrollStateChanged(state) -// if(state == 0){ appsVp?.blockScroll = false -// } } }) } override fun dismiss() { -// val anim = AnimationUtils.loadAnimation(getContext(), R.anim.lp_exit) -// -// anim.setAnimationListener(object : Animation.AnimationListener { -// override fun onAnimationStart(animation: Animation) { -// } -// -// override fun onAnimationEnd(animation: Animation) { - destroy() -// } - -// override fun onAnimationRepeat(animation: Animation) { -// } -// }) -// -// appsVp?.startAnimation(anim) + destroy() } fun destroy(){ @@ -361,8 +345,7 @@ class AppOverviewWindow( fun updateAppList(apps: MutableList) { this.apps.clear() this.apps.addAll(apps) -// apps.forEach { app-> Log.d(TAG, "updateAppList: app:$app") } - appPages = apps.chunked(MAX_TASKS_ONE_PAGE) as MutableList> + appPages = apps.chunked(NUMBER_OF_COLUMNS * div) as MutableList> appsVp?.adapter = AppsPagerAdapter(appPages, this) appsVp?.adapter?.notifyDataSetChanged() updateChannel() @@ -402,7 +385,6 @@ class AppsPagerAdapter( } override fun getItemPosition(`object`: Any): Int { -// val recycleView = `object` as LoadedOverviewRecycleView val view = `object` as View val recycleView = view.findViewById(R.id.loaded_overview_recycle_view) as LoadedOverviewRecycleView val list : MutableList? = recycleView.list diff --git a/app/src/main/java/com/boringdroid/systemui/view/TopBarControlWindow.kt b/app/src/main/java/com/boringdroid/systemui/view/TopBarControlWindow.kt index 21fdcf88..7724583d 100644 --- a/app/src/main/java/com/boringdroid/systemui/view/TopBarControlWindow.kt +++ b/app/src/main/java/com/boringdroid/systemui/view/TopBarControlWindow.kt @@ -59,6 +59,7 @@ class TopBarControlWindow( private val dm: DisplayManager = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager private val SETTINGS_PACKAGE = "com.android.settings" private val Wifi_ACTION = SETTINGS_PACKAGE+".CONNECTIVITY_CHANGE" + var topBarVolumeImage: ImageView?= null var topbarController: TopbarLayoutController ?=null @@ -105,7 +106,7 @@ class TopBarControlWindow( super.showPopupWindow() runWindowAnim(WindowGravity.top, true) initViews() - initVolumeSeekbar() +// initVolumeSeekbar() initVolumes() initBrightnessSeekbar() } @@ -130,6 +131,22 @@ class TopBarControlWindow( volumeSeekBar?.max = streamMaxVolume volumeSeekBar?.progress = currentVolume volumeSeekBar?.setOnSeekBarChangeListener(volumeChangeListener) + if (currentVolume == 0) { + volumeImage?.setImageResource(R.drawable.icon_volume_mute) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_mute) + } else if (currentVolume < volumeSeekBar?.max!!.div(3)) { +// volumeBtn?.setImageResource(R.drawable.icon_volume_min) + volumeImage?.setImageResource(R.drawable.icon_volume_min) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_min) + } else if (currentVolume < (volumeSeekBar?.max!!.div(3) * 2)) { +// volumeBtn?.setImageResource(R.drawable.icon_volume_mid) + volumeImage?.setImageResource(R.drawable.icon_volume_middle) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_middle) + } else { +// volumeBtn?.setImageResource(R.drawable.icon_volume_max) + volumeImage?.setImageResource(R.drawable.icon_volume_max) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_max) + } } private fun initVolumeSeekbar() { @@ -156,17 +173,21 @@ class TopBarControlWindow( Log.w(TAG, "progress: $progress ") // val am = context!!.getSystemService(Context.AUDIO_SERVICE) as AudioManager // am.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0) - if(progress == 0){ + if (progress == 0) { volumeImage?.setImageResource(R.drawable.icon_volume_mute) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_mute) } else if (progress < volumeSeekBar?.max!!.div(3)) { // volumeBtn?.setImageResource(R.drawable.icon_volume_min) volumeImage?.setImageResource(R.drawable.icon_volume_min) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_min) } else if (progress < (volumeSeekBar?.max!!.div(3) * 2)) { // volumeBtn?.setImageResource(R.drawable.icon_volume_mid) volumeImage?.setImageResource(R.drawable.icon_volume_middle) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_middle) } else { // volumeBtn?.setImageResource(R.drawable.icon_volume_max) volumeImage?.setImageResource(R.drawable.icon_volume_max) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_max) } if(audioDevice == null || TextUtils.isEmpty(audioDevice?.physicalName )){ diff --git a/app/src/main/java/com/boringdroid/systemui/view/TopBarLayout.kt b/app/src/main/java/com/boringdroid/systemui/view/TopBarLayout.kt index f26eadfb..11558675 100644 --- a/app/src/main/java/com/boringdroid/systemui/view/TopBarLayout.kt +++ b/app/src/main/java/com/boringdroid/systemui/view/TopBarLayout.kt @@ -47,6 +47,7 @@ import com.boringdroid.systemui.SystemUIOverlay.Companion import com.boringdroid.systemui.data.DesktopNotification import com.boringdroid.systemui.data.WindowAttr import com.boringdroid.systemui.provider.AllAppsProvider +import com.boringdroid.systemui.provider.VolumeProvider import com.boringdroid.systemui.receiver.BatteryReceiver import com.boringdroid.systemui.receiver.DynamicReceiver.NotificationListener import com.boringdroid.systemui.receiver.NotificationReceiver @@ -193,6 +194,20 @@ class TopBarLayout(context: Context?, attrs: AttributeSet?) : if(needUpdateBattery){ onBatteryChanged(percentage, status, plugged) } + initVolume() + } + + private fun initVolume() { + val volume = VolumeProvider().getVolume() + if (volume == 0) { + volumeBtn?.setImageResource(R.drawable.icon_volume_mute) + } else if (volume < 100.div(3)) { + volumeBtn?.setImageResource(R.drawable.icon_volume_min) + } else if (volume < (100.div(3) * 2)) { + volumeBtn?.setImageResource(R.drawable.icon_volume_middle) + } else { + volumeBtn?.setImageResource(R.drawable.icon_volume_max) + } } internal inner class GlobalSearchRecevier : BroadcastReceiver(){ @@ -233,6 +248,7 @@ class TopBarLayout(context: Context?, attrs: AttributeSet?) : } } volumeWindow?.enterView = imageView + volumeWindow?.topBarVolumeImage = volumeBtn windowList.add(volumeWindow!!) } @@ -391,6 +407,7 @@ class TopBarLayout(context: Context?, attrs: AttributeSet?) : this@TopBarLayout.controlBtn?.background = null } } + controlWindow?.topBarVolumeImage = volumeBtn controlWindow?.enterView = imageView controlWindow?.topbarController = this windowList.add(controlWindow!!) diff --git a/app/src/main/java/com/boringdroid/systemui/view/TopBarVolumeWindow.kt b/app/src/main/java/com/boringdroid/systemui/view/TopBarVolumeWindow.kt index 54cb6c3c..c139711c 100644 --- a/app/src/main/java/com/boringdroid/systemui/view/TopBarVolumeWindow.kt +++ b/app/src/main/java/com/boringdroid/systemui/view/TopBarVolumeWindow.kt @@ -41,6 +41,7 @@ class TopBarVolumeWindow( private var inRv: LoadedSoundRecycleView ?= null private var isInput: Boolean = false private var fromUser: Boolean = false + var topBarVolumeImage: ImageView?= null companion object { @@ -102,6 +103,22 @@ class TopBarVolumeWindow( volumeSeekBar?.max = streamMaxVolume volumeSeekBar?.progress = currentVolume volumeTv?.text = "$currentVolume" + if (currentVolume == 0) { + volumeImage?.setImageResource(R.drawable.icon_volume_mute) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_mute) + } else if (currentVolume < volumeSeekBar?.max!!.div(3)) { +// volumeBtn?.setImageResource(R.drawable.icon_volume_min) + volumeImage?.setImageResource(R.drawable.icon_volume_min) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_min) + } else if (currentVolume < (volumeSeekBar?.max!!.div(3) * 2)) { +// volumeBtn?.setImageResource(R.drawable.icon_volume_mid) + volumeImage?.setImageResource(R.drawable.icon_volume_middle) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_middle) + } else { +// volumeBtn?.setImageResource(R.drawable.icon_volume_max) + volumeImage?.setImageResource(R.drawable.icon_volume_max) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_max) + } } @@ -150,15 +167,19 @@ class TopBarVolumeWindow( // am.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0) if (progress == 0) { volumeImage?.setImageResource(R.drawable.icon_volume_mute) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_mute) } else if (progress < volumeSeekBar?.max!!.div(3)) { // volumeBtn?.setImageResource(R.drawable.icon_volume_min) volumeImage?.setImageResource(R.drawable.icon_volume_min) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_min) } else if (progress < (volumeSeekBar?.max!!.div(3) * 2)) { // volumeBtn?.setImageResource(R.drawable.icon_volume_mid) volumeImage?.setImageResource(R.drawable.icon_volume_middle) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_middle) } else { // volumeBtn?.setImageResource(R.drawable.icon_volume_max) volumeImage?.setImageResource(R.drawable.icon_volume_max) + topBarVolumeImage?.setImageResource(R.drawable.icon_volume_max) } if(audioDevice == null || TextUtils.isEmpty(audioDevice?.physicalName )){ diff --git a/app/src/main/res/layout/window_topbar_control.xml b/app/src/main/res/layout/window_topbar_control.xml index e83b1883..c0732f58 100644 --- a/app/src/main/res/layout/window_topbar_control.xml +++ b/app/src/main/res/layout/window_topbar_control.xml @@ -239,6 +239,8 @@ android:layout_marginTop="64dp" android:layout_gravity="center_horizontal" android:gravity="center" + android:breakStrategy="balanced" + android:justificationMode="inter_word" android:textColor="#ff292929" android:textSize="13sp" android:alpha="1"