KeyHandler: Add customization options
Change-Id: I5f50f5d442342b2082bf47e11b1351e578fa0144
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright (C) 2021 The LineageOS Project
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package org.lineageos.settings.device
|
||||
|
||||
import android.R
|
||||
import android.preference.PreferenceActivity
|
||||
import android.os.Bundle
|
||||
|
||||
class ButtonSettingsActivity : PreferenceActivity() {
|
||||
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
fragmentManager.beginTransaction().replace(
|
||||
R.id.content,
|
||||
ButtonSettingsFragment()
|
||||
).commit()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2021 The LineageOS Project
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package org.lineageos.settings.device
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.MenuItem
|
||||
import androidx.preference.PreferenceFragment
|
||||
|
||||
class ButtonSettingsFragment : PreferenceFragment() {
|
||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||
addPreferencesFromResource(R.xml.button_panel)
|
||||
activity.actionBar!!.setDisplayHomeAsUpEnabled(true)
|
||||
}
|
||||
|
||||
override fun addPreferencesFromResource(preferencesResId: Int) {
|
||||
super.addPreferencesFromResource(preferencesResId)
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
when (item.itemId) {
|
||||
R.id.home -> {
|
||||
activity.finish()
|
||||
return true
|
||||
}
|
||||
}
|
||||
return super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (C) 2021 The LineageOS Project
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package org.lineageos.settings.device
|
||||
|
||||
import android.database.Cursor
|
||||
import android.database.MatrixCursor
|
||||
import android.provider.SearchIndexableResource
|
||||
import android.provider.SearchIndexablesProvider
|
||||
import android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_CLASS_NAME
|
||||
import android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_ICON_RESID
|
||||
import android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_INTENT_ACTION
|
||||
import android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_INTENT_TARGET_CLASS
|
||||
import android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_INTENT_TARGET_PACKAGE
|
||||
import android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_RANK
|
||||
import android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_RESID
|
||||
import android.provider.SearchIndexablesContract.INDEXABLES_RAW_COLUMNS
|
||||
import android.provider.SearchIndexablesContract.INDEXABLES_XML_RES_COLUMNS
|
||||
import android.provider.SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS
|
||||
|
||||
class ConfigPanelSearchIndexablesProvider : SearchIndexablesProvider() {
|
||||
override fun onCreate(): Boolean = true
|
||||
|
||||
override fun queryXmlResources(projection: Array<String?>?): Cursor {
|
||||
val cursor = MatrixCursor(INDEXABLES_XML_RES_COLUMNS)
|
||||
INDEXABLE_RES.forEach {
|
||||
cursor.addRow(generateResourceRef(it))
|
||||
}
|
||||
return cursor
|
||||
}
|
||||
|
||||
override fun queryRawData(projection: Array<String?>?): Cursor {
|
||||
return MatrixCursor(INDEXABLES_RAW_COLUMNS)
|
||||
}
|
||||
|
||||
override fun queryNonIndexableKeys(projection: Array<String?>?): Cursor {
|
||||
return MatrixCursor(NON_INDEXABLES_KEYS_COLUMNS)
|
||||
}
|
||||
|
||||
private fun generateResourceRef(sir: SearchIndexableResource): Array<Any?> {
|
||||
val ref = arrayOfNulls<Any>(7)
|
||||
ref[COLUMN_INDEX_XML_RES_RANK] = sir.rank
|
||||
ref[COLUMN_INDEX_XML_RES_RESID] = sir.xmlResId
|
||||
ref[COLUMN_INDEX_XML_RES_CLASS_NAME] = null
|
||||
ref[COLUMN_INDEX_XML_RES_ICON_RESID] = sir.iconResId
|
||||
ref[COLUMN_INDEX_XML_RES_INTENT_ACTION] = "com.android.settings.action.EXTRA_SETTINGS"
|
||||
ref[COLUMN_INDEX_XML_RES_INTENT_TARGET_PACKAGE] = "org.lineageos.settings.device"
|
||||
ref[COLUMN_INDEX_XML_RES_INTENT_TARGET_CLASS] = sir.className
|
||||
return ref
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TAG = "ConfigPanelSearchIndexablesProvider"
|
||||
|
||||
private val INDEXABLE_RES = arrayOf<SearchIndexableResource>(
|
||||
SearchIndexableResource(
|
||||
1, R.xml.button_panel, ButtonSettingsActivity::class.java.name, 0
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -15,33 +15,57 @@ import com.android.internal.os.DeviceKeyHandler
|
||||
class KeyHandler(context: Context) : DeviceKeyHandler {
|
||||
private val audioManager = context.getSystemService(AudioManager::class.java)
|
||||
private val vibrator = context.getSystemService(Vibrator::class.java)
|
||||
private val packageContext = context.createPackageContext(
|
||||
KeyHandler::class.java.getPackage()!!.name, 0
|
||||
)
|
||||
private val sharedPreferences
|
||||
get() = packageContext.getSharedPreferences(
|
||||
packageContext.packageName + "_preferences",
|
||||
Context.MODE_PRIVATE or Context.MODE_MULTI_PROCESS
|
||||
)
|
||||
|
||||
override fun handleKeyEvent(event: KeyEvent): KeyEvent {
|
||||
if (event.action == KeyEvent.ACTION_DOWN) {
|
||||
when (event.scanCode) {
|
||||
MODE_NORMAL -> {
|
||||
audioManager.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL)
|
||||
vibrator.vibrate(MODE_NORMAL_EFFECT)
|
||||
POSITION_TOP -> {
|
||||
val mode = sharedPreferences.getString(ALERT_SLIDER_TOP_KEY, "0")!!.toInt()
|
||||
audioManager.setRingerModeInternal(mode)
|
||||
vibrateIfNeeded(mode)
|
||||
}
|
||||
MODE_VIBRATION -> {
|
||||
audioManager.setRingerModeInternal(AudioManager.RINGER_MODE_VIBRATE)
|
||||
vibrator.vibrate(MODE_VIBRATION_EFFECT)
|
||||
POSITION_MIDDLE -> {
|
||||
val mode = sharedPreferences.getString(ALERT_SLIDER_MIDDLE_KEY, "1")!!.toInt()
|
||||
audioManager.setRingerModeInternal(mode)
|
||||
vibrateIfNeeded(mode)
|
||||
}
|
||||
MODE_SILENCE -> {
|
||||
audioManager.setRingerModeInternal(AudioManager.RINGER_MODE_SILENT)
|
||||
POSITION_BOTTOM -> {
|
||||
val mode = sharedPreferences.getString(ALERT_SLIDER_BOTTOM_KEY, "2")!!.toInt()
|
||||
audioManager.setRingerModeInternal(mode)
|
||||
vibrateIfNeeded(mode)
|
||||
}
|
||||
}
|
||||
}
|
||||
return event
|
||||
}
|
||||
|
||||
private fun vibrateIfNeeded(mode: Int) {
|
||||
when (mode) {
|
||||
AudioManager.RINGER_MODE_VIBRATE -> vibrator.vibrate(MODE_VIBRATION_EFFECT)
|
||||
AudioManager.RINGER_MODE_NORMAL -> vibrator.vibrate(MODE_NORMAL_EFFECT)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TAG = "KeyHandler"
|
||||
|
||||
// Slider key codes
|
||||
private const val MODE_NORMAL = 601
|
||||
private const val MODE_VIBRATION = 602
|
||||
private const val MODE_SILENCE = 603
|
||||
private const val POSITION_TOP = 601
|
||||
private const val POSITION_MIDDLE = 602
|
||||
private const val POSITION_BOTTOM = 603
|
||||
|
||||
// Preference keys
|
||||
private const val ALERT_SLIDER_TOP_KEY = "config_top_position"
|
||||
private const val ALERT_SLIDER_MIDDLE_KEY = "config_middle_position"
|
||||
private const val ALERT_SLIDER_BOTTOM_KEY = "config_bottom_position"
|
||||
|
||||
// Vibration effects
|
||||
private val MODE_NORMAL_EFFECT = VibrationEffect.get(VibrationEffect.EFFECT_HEAVY_CLICK)
|
||||
|
||||
Reference in New Issue
Block a user