universal7885: Format Kotlin code using ktlint

* Also, refactor CameraLightSensor

Signed-off-by: roynatech2544 <whiteshell2544@naver.com>
This commit is contained in:
roynatech2544 2022-04-13 12:32:53 +09:00
commit 3c7ca85990
No known key found for this signature in database
GPG key ID: 50ABF73F0D19445D
35 changed files with 338 additions and 402 deletions

View file

@ -13,38 +13,27 @@ import android.graphics.BitmapFactory
import android.graphics.Color import android.graphics.Color
import android.graphics.ImageFormat import android.graphics.ImageFormat
import android.hardware.camera2.* import android.hardware.camera2.*
import android.hardware.camera2.CameraManager.AvailabilityCallback
import android.media.Image import android.media.Image
import android.media.ImageReader import android.media.ImageReader
import android.net.Uri
import android.os.* import android.os.*
import android.provider.Settings import android.provider.Settings
import android.provider.Settings.SettingNotFoundException import android.provider.Settings.SettingNotFoundException
import android.util.Log import android.util.Log
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat import java.util.concurrent.ScheduledThreadPoolExecutor
import java.util.concurrent.TimeUnit
open class CameraLightSensorService : Service() { class CameraLightSensorService : Service() {
var screenStateFilter: IntentFilter? = null private lateinit var screenStateFilter: IntentFilter
lateinit var mContext: Context lateinit var mContext: Context
private var mRegistered = false
var destroy = false
private var cameraDevice: CameraDevice? = null private var cameraDevice: CameraDevice? = null
private var session: CameraCaptureSession? = null private var session: CameraCaptureSession? = null
private lateinit var manager: CameraManager
@Volatile private lateinit var mCameraHandler: Handler
var avail = true
private var imageReader: ImageReader? = null
private var manager: CameraManager? = null
private var mServiceStarted = false
@Volatile
private var mLock = false
private var mThreadRunning = false
private fun pushNotification(): Notification { private fun pushNotification(): Notification {
val nm = mContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager val nm = mContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
val channel = NotificationChannel( val channel = NotificationChannel(
mContext.basePackageName, "Useless Notification", mContext.basePackageName, "CameraLightSensor",
NotificationManager.IMPORTANCE_NONE NotificationManager.IMPORTANCE_NONE
) )
channel.isBlockable = true channel.isBlockable = true
@ -67,20 +56,7 @@ open class CameraLightSensorService : Service() {
if (DEBUG) Log.d(TAG, "Destroying service") if (DEBUG) Log.d(TAG, "Destroying service")
if (mRegistered) contentResolver!!.unregisterContentObserver(mSettingsObserver) if (mRegistered) contentResolver!!.unregisterContentObserver(mSettingsObserver)
mRegistered = false mRegistered = false
cameraDevice!!.close() imageReader.close()
if (session != null && avail) {
try {
session!!.abortCaptures()
session!!.close()
} catch (e: CameraAccessException) {
Log.e(TAG, e.message)
} catch (e2: IllegalStateException) {
Log.e(TAG, "Session Already Closed")
}
}
manager!!.unregisterAvailabilityCallback(availabilityCallback)
avail = false
destroy = true
stopForeground(true) stopForeground(true)
super.onDestroy() super.onDestroy()
} }
@ -92,14 +68,21 @@ open class CameraLightSensorService : Service() {
private val mScreenStateReceiver: BroadcastReceiver = object : BroadcastReceiver() { private val mScreenStateReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_USER_PRESENT) { if (intent.action == Intent.ACTION_USER_PRESENT) {
onDisplayOn() if (mPoolExecutor == null) {
mServiceStarted = true mPoolExecutor = ScheduledThreadPoolExecutor(4)
mPoolExecutor!!.scheduleWithFixedDelay(
mScheduler, 0, 2, TimeUnit.SECONDS
)
}
} else if (intent.action == Intent.ACTION_SCREEN_OFF) { } else if (intent.action == Intent.ACTION_SCREEN_OFF) {
if (mServiceStarted) onDisplayOff() if (mPoolExecutor != null) {
mServiceStarted = false mPoolExecutor!!.shutdown()
mPoolExecutor = null
} }
} }
} }
}
private val mScheduler = Runnable { readyCamera() }
// Make a listener for settings // Make a listener for settings
private var mSettingsObserver: ContentObserver = private var mSettingsObserver: ContentObserver =
@ -116,11 +99,19 @@ open class CameraLightSensorService : Service() {
) { ) {
registerReceiver(mScreenStateReceiver, screenStateFilter) registerReceiver(mScreenStateReceiver, screenStateFilter)
mRegistered = true mRegistered = true
onDisplayOn() if (mPoolExecutor == null) {
mPoolExecutor = ScheduledThreadPoolExecutor(4)
mPoolExecutor!!.scheduleWithFixedDelay(
mScheduler, 0, 2, TimeUnit.SECONDS
)
}
} else { } else {
if (mRegistered) unregisterReceiver(mScreenStateReceiver) if (mRegistered) unregisterReceiver(mScreenStateReceiver)
mRegistered = false mRegistered = false
onDisplayOff() if (mPoolExecutor != null) {
mPoolExecutor!!.shutdown()
mPoolExecutor = null
}
} }
} catch (e: SettingNotFoundException) { } catch (e: SettingNotFoundException) {
e.printStackTrace() e.printStackTrace()
@ -131,20 +122,6 @@ open class CameraLightSensorService : Service() {
return true return true
} }
} }
private fun onDisplayOn() {
if (DEBUG) Log.d(TAG, "Screen is on. Starting Service...")
avail = true
readyCamera()
}
private fun onDisplayOff() {
if (DEBUG) Log.d(TAG, "Screen is off. Stopping Service...")
thread.interrupt()
avail = false
mThreadRunning = false
}
private var cameraStateCallback: CameraDevice.StateCallback = private var cameraStateCallback: CameraDevice.StateCallback =
object : CameraDevice.StateCallback() { object : CameraDevice.StateCallback() {
override fun onOpened(camera: CameraDevice) { override fun onOpened(camera: CameraDevice) {
@ -164,24 +141,22 @@ open class CameraLightSensorService : Service() {
private var sessionStateCallback: CameraCaptureSession.StateCallback = private var sessionStateCallback: CameraCaptureSession.StateCallback =
object : CameraCaptureSession.StateCallback() { object : CameraCaptureSession.StateCallback() {
override fun onReady(session: CameraCaptureSession) { override fun onReady(session: CameraCaptureSession) {
if (!destroy) {
this@CameraLightSensorService.session = session this@CameraLightSensorService.session = session
try { try {
if (createCaptureRequest() == null) return if (createCaptureRequest() == null) return
try { try {
session.capture(createCaptureRequest(), captureCallback, null) session.capture(createCaptureRequest(), null, mCameraHandler)
} catch (e: CameraAccessException) { } catch (e: CameraAccessException) {
e.printStackTrace() e.printStackTrace()
} catch (e: IllegalStateException) { } catch (e: IllegalStateException) {
Log.w(TAG, "onReady: Session is NULL") Log.w(TAG, "onReady: Session is NULL")
} }
cameraDevice!!.close() session.close()
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "Camera is in use") Log.e(TAG, "Camera is in use")
e.printStackTrace() e.printStackTrace()
} }
} }
}
override fun onConfigured(session: CameraCaptureSession) {} override fun onConfigured(session: CameraCaptureSession) {}
override fun onConfigureFailed(session: CameraCaptureSession) {} override fun onConfigureFailed(session: CameraCaptureSession) {}
} }
@ -198,12 +173,6 @@ open class CameraLightSensorService : Service() {
e.printStackTrace() e.printStackTrace()
} }
img.close() img.close()
if (DEBUG) Log.d(
TAG,
"ImageReader.OnImageAvailableListener: Closing Camera and Sessions.."
)
cameraDevice!!.close()
session!!.close()
} }
} }
@ -212,16 +181,8 @@ open class CameraLightSensorService : Service() {
manager = getSystemService(CAMERA_SERVICE) as CameraManager manager = getSystemService(CAMERA_SERVICE) as CameraManager
try { try {
val pickedCamera = getCamera(manager) val pickedCamera = getCamera(manager)
manager!!.registerAvailabilityCallback(availabilityCallback, null) manager.openCamera(pickedCamera, cameraStateCallback, mCameraHandler)
manager!!.openCamera(pickedCamera, cameraStateCallback, null) imageReader.setOnImageAvailableListener(onImageAvailableListener, mCameraHandler)
imageReader =
ImageReader.newInstance(50, 50, ImageFormat.JPEG, 2 /* images buffered */)
imageReader?.setOnImageAvailableListener(onImageAvailableListener, null)
if (!mThreadRunning) {
val mMyThread = Thread(thread)
mMyThread.start()
mThreadRunning = true
}
if (DEBUG) Log.d(TAG, "imageReader created") if (DEBUG) Log.d(TAG, "imageReader created")
} catch (e: CameraAccessException) { } catch (e: CameraAccessException) {
Log.e(TAG, e.message) Log.e(TAG, e.message)
@ -244,13 +205,15 @@ open class CameraLightSensorService : Service() {
} }
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
mContext = applicationContext val mCameraHandlerThread = HandlerThread("CameraLightSensor")
mCameraHandlerThread.start()
mCameraHandler = Handler(mCameraHandlerThread.looper)
mContext = this
@Suppress("SameParameterValue") @Suppress("SameParameterValue")
startForeground(50, pushNotification(), ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA) startForeground(50, pushNotification(), ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA)
batteryOptimization(mContext)
mRegistered = false mRegistered = false
screenStateFilter = IntentFilter(Intent.ACTION_USER_PRESENT) screenStateFilter = IntentFilter(Intent.ACTION_USER_PRESENT)
screenStateFilter!!.addAction(Intent.ACTION_SCREEN_OFF) screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF)
try { try {
if (Settings.System.getInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE) if (Settings.System.getInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS_MODE)
== Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
@ -264,15 +227,13 @@ open class CameraLightSensorService : Service() {
val setting = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE) val setting = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE)
contentResolver?.registerContentObserver(setting, false, mSettingsObserver) contentResolver?.registerContentObserver(setting, false, mSettingsObserver)
if (DEBUG) Log.d(TAG, "onStartCommand flags $flags startId $startId") if (DEBUG) Log.d(TAG, "onStartCommand flags $flags startId $startId")
destroy = false
avail = true
startForeground(50, pushNotification()) startForeground(50, pushNotification())
return START_STICKY return START_STICKY
} }
override fun onCreate() { override fun onCreate() {
if (DEBUG) Log.d(TAG, "onCreate service") if (DEBUG) Log.d(TAG, "onCreate service")
mContext = applicationContext mContext = this
startForeground(50, pushNotification()) startForeground(50, pushNotification())
super.onCreate() super.onCreate()
} }
@ -280,13 +241,12 @@ open class CameraLightSensorService : Service() {
fun actOnReadyCameraDevice() { fun actOnReadyCameraDevice() {
try { try {
cameraDevice!!.createCaptureSession( cameraDevice!!.createCaptureSession(
listOf(imageReader!!.surface), listOf(imageReader.surface),
sessionStateCallback, sessionStateCallback,
null mCameraHandler
) )
} catch (e: CameraAccessException) { } catch (e: CameraAccessException) {
Log.e(TAG, e.message) Log.e(TAG, e.message)
mLock = false
} }
} }
@ -307,54 +267,9 @@ open class CameraLightSensorService : Service() {
builder.build() builder.build()
} catch (e: CameraAccessException) { } catch (e: CameraAccessException) {
Log.e(TAG, e.message) Log.e(TAG, e.message)
mLock = false
null null
} }
} }
private var availabilityCallback: AvailabilityCallback = object : AvailabilityCallback() {
override fun onCameraOpened(cameraId: String, packageId: String) {
super.onCameraOpened(cameraId, packageId)
Log.i(
TAG, "CameraManager.AvailabilityCallback: Camera " + cameraId
+ " Opened by Package " + packageId
)
mLock = true
if (packageId == mContext.basePackageName) return
avail = false
}
override fun onCameraUnavailable(cameraId: String) {
if (DEBUG) Log.i(TAG, "CameraManager.AvailabilityCallback : Camera NOT Available. ")
avail = false
super.onCameraUnavailable(cameraId)
}
override fun onCameraAvailable(cameraId: String) {
if (DEBUG) Log.i(TAG, "CameraManager.AvailabilityCallback : Camera IS Available. ")
avail = true
mLock = false
super.onCameraAvailable(cameraId)
}
override fun onCameraClosed(cameraId: String) {
super.onCameraClosed(cameraId)
}
}
var captureCallback: CameraCaptureSession.CaptureCallback =
object : CameraCaptureSession.CaptureCallback() {
override fun onCaptureSequenceCompleted(
session: CameraCaptureSession,
sequenceId: Int,
frameNumber: Long
) {
if (DEBUG) Log.d(TAG, "captureCallback: Closing Session")
super.onCaptureSequenceCompleted(session, sequenceId, frameNumber)
cameraDevice!!.close()
session.close()
}
}
private fun calculateBrightnessEstimate(bitmap: Bitmap, pixelSpacing: Int): Int { private fun calculateBrightnessEstimate(bitmap: Bitmap, pixelSpacing: Int): Int {
var r = 0 var r = 0
var g = 0 var g = 0
@ -382,7 +297,8 @@ open class CameraLightSensorService : Service() {
val oldbrightness = val oldbrightness =
Settings.System.getInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS) Settings.System.getInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS)
if (DEBUG) Log.i( if (DEBUG) Log.i(
TAG, "AdjustBrightness: OldVal = " + oldbrightness + " NewVal = " + TAG,
"AdjustBrightness: OldVal = " + oldbrightness + " NewVal = " +
brightness + " Adjusting.." brightness + " Adjusting.."
) )
var newbrightness = brightness var newbrightness = brightness
@ -398,32 +314,13 @@ open class CameraLightSensorService : Service() {
) )
} }
private var thread = Thread {
while (!Thread.currentThread().isInterrupted) {
if (avail && !mLock) {
SystemClock.sleep(DELAY.toLong())
ContextCompat.getMainExecutor(mContext).execute { if (avail) readyCamera() }
}else{
SystemClock.sleep(DELAY.toLong() / 10) // For Fast Detection
}
}
}
companion object { companion object {
private val imageReader =
ImageReader.newInstance(50, 50, ImageFormat.JPEG, 2 /* images buffered */)
protected val TAG: String = CameraLightSensorService::class.java.simpleName protected val TAG: String = CameraLightSensorService::class.java.simpleName
const val DEBUG = false const val DEBUG = false
protected const val CAMERA_CHOICE = CameraCharacteristics.LENS_FACING_FRONT const val CAMERA_CHOICE = CameraCharacteristics.LENS_FACING_FRONT
private const val DELAY = 5 * 1000 // 5 Seconds private var mPoolExecutor: ScheduledThreadPoolExecutor? = null
fun batteryOptimization(context: Context?) { private var mRegistered = false
val intent = Intent()
val packageName = context!!.packageName
val pm = context.getSystemService(POWER_SERVICE) as PowerManager
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
intent.action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
intent.data = Uri.parse("package:$packageName")
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
}
} }
} }

View file

@ -15,13 +15,11 @@ import com.eurekateam.fmradio.enums.PlayState
import com.eurekateam.fmradio.enums.PowerState import com.eurekateam.fmradio.enums.PowerState
import com.eurekateam.fmradio.fragments.MainFragment import com.eurekateam.fmradio.fragments.MainFragment
import com.eurekateam.fmradio.utils.Log import com.eurekateam.fmradio.utils.Log
import java.io.File
class FMRadioService : Service() { class FMRadioService : Service() {
private lateinit var mContext: Context private lateinit var mContext: Context
private lateinit var mAudioManager: AudioManager private lateinit var mAudioManager: AudioManager
private lateinit var mTracks : LongArray private lateinit var mTracks: LongArray
private lateinit var mNativeFMInterface: NativeFMInterface private lateinit var mNativeFMInterface: NativeFMInterface
override fun onBind(intent: Intent?): IBinder? { override fun onBind(intent: Intent?): IBinder? {
return null return null
@ -32,8 +30,7 @@ class FMRadioService : Service() {
mAudioManager = getSystemService(AUDIO_SERVICE) as AudioManager mAudioManager = getSystemService(AUDIO_SERVICE) as AudioManager
mTracks = MainFragment.mTracks mTracks = MainFragment.mTracks
mIndex = MainFragment.getIndex() mIndex = MainFragment.getIndex()
if (mTracks.isEmpty() || mIndex == -1) if (mTracks.isEmpty() || mIndex == -1) {
{
return super.onStartCommand(intent, flags, startId) return super.onStartCommand(intent, flags, startId)
} }
if (intent != null) { if (intent != null) {
@ -43,7 +40,7 @@ class FMRadioService : Service() {
if (mPlayState == PlayState.STATE_PLAYING) { if (mPlayState == PlayState.STATE_PLAYING) {
mPlayState = PlayState.STATE_STOPPED mPlayState = PlayState.STATE_STOPPED
mAudioManager.setParameters(PowerState.FM_POWER_OFF.mAudioParam) mAudioManager.setParameters(PowerState.FM_POWER_OFF.mAudioParam)
}else if (mPlayState == PlayState.STATE_STOPPED){ } else if (mPlayState == PlayState.STATE_STOPPED) {
mPlayState = PlayState.STATE_PLAYING mPlayState = PlayState.STATE_PLAYING
mAudioManager.setParameters(PowerState.FM_POWER_ON.mAudioParam) mAudioManager.setParameters(PowerState.FM_POWER_ON.mAudioParam)
} }
@ -73,9 +70,9 @@ class FMRadioService : Service() {
} }
ACTION_OUTPUT -> { ACTION_OUTPUT -> {
changeOutputDevice(mOutput) changeOutputDevice(mOutput)
if (mOutput == OutputState.OUTPUT_HEADSET){ if (mOutput == OutputState.OUTPUT_HEADSET) {
mOutput = OutputState.OUTPUT_SPEAKER mOutput = OutputState.OUTPUT_SPEAKER
}else if (mOutput == OutputState.OUTPUT_SPEAKER){ } else if (mOutput == OutputState.OUTPUT_SPEAKER) {
mOutput = OutputState.OUTPUT_HEADSET mOutput = OutputState.OUTPUT_HEADSET
} }
} }
@ -90,7 +87,7 @@ class FMRadioService : Service() {
} }
sendMetaData("FM ${mTracks[mIndex].toFloat() / 1000} Mhz") sendMetaData("FM ${mTracks[mIndex].toFloat() / 1000} Mhz")
startForeground(51, pushNotification()) startForeground(51, pushNotification())
if (mOutput == OutputState.OUTPUT_SPEAKER){ if (mOutput == OutputState.OUTPUT_SPEAKER) {
changeOutputDevice(OutputState.OUTPUT_HEADSET) changeOutputDevice(OutputState.OUTPUT_HEADSET)
} }
Log.i("--- FMRadio Background (OUT) ---") Log.i("--- FMRadio Background (OUT) ---")
@ -110,8 +107,10 @@ class FMRadioService : Service() {
val metadata = MediaMetadata.Builder() val metadata = MediaMetadata.Builder()
.putString(MediaMetadata.METADATA_KEY_TITLE, mTitle) .putString(MediaMetadata.METADATA_KEY_TITLE, mTitle)
.putString(MediaMetadata.METADATA_KEY_ARTIST, resources.getString(R.string.app_name)) .putString(MediaMetadata.METADATA_KEY_ARTIST, resources.getString(R.string.app_name))
.putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, .putBitmap(
BitmapFactory.decodeResource(mContext.resources, R.drawable.ic_radio)) MediaMetadata.METADATA_KEY_ALBUM_ART,
BitmapFactory.decodeResource(mContext.resources, R.drawable.ic_radio)
)
.build() .build()
mMediaSession.setMetadata(metadata) mMediaSession.setMetadata(metadata)
} }
@ -138,7 +137,7 @@ class FMRadioService : Service() {
val rewind = PendingIntent.getService(mContext, 0, Intent(ACTION_BEFORE), PendingIntent.FLAG_IMMUTABLE) val rewind = PendingIntent.getService(mContext, 0, Intent(ACTION_BEFORE), PendingIntent.FLAG_IMMUTABLE)
val close = PendingIntent.getService(mContext, 0, Intent(ACTION_QUIT), PendingIntent.FLAG_IMMUTABLE) val close = PendingIntent.getService(mContext, 0, Intent(ACTION_QUIT), PendingIntent.FLAG_IMMUTABLE)
val output = PendingIntent.getService(mContext, 0, Intent(ACTION_OUTPUT), PendingIntent.FLAG_IMMUTABLE) val output = PendingIntent.getService(mContext, 0, Intent(ACTION_OUTPUT), PendingIntent.FLAG_IMMUTABLE)
val mOutputAction : Notification.Action = Notification.Action.Builder( val mOutputAction: Notification.Action = Notification.Action.Builder(
when (mOutput) { when (mOutput) {
OutputState.OUTPUT_HEADSET -> { OutputState.OUTPUT_HEADSET -> {
Icon.createWithResource(this, R.drawable.ic_volume_up) Icon.createWithResource(this, R.drawable.ic_volume_up)
@ -146,7 +145,8 @@ class FMRadioService : Service() {
OutputState.OUTPUT_SPEAKER -> { OutputState.OUTPUT_SPEAKER -> {
Icon.createWithResource(this, R.drawable.ic_headphones) Icon.createWithResource(this, R.drawable.ic_headphones)
} }
}, "Output Configuration", output },
"Output Configuration", output
).build() ).build()
val mPausePlayAction: Notification.Action = Notification.Action.Builder( val mPausePlayAction: Notification.Action = Notification.Action.Builder(
when (mPlayState) { when (mPlayState) {
@ -156,7 +156,8 @@ class FMRadioService : Service() {
PlayState.STATE_STOPPED -> { PlayState.STATE_STOPPED -> {
Icon.createWithResource(this, R.drawable.ic_play) Icon.createWithResource(this, R.drawable.ic_play)
} }
}, "Start/Stop", togglePlay },
"Start/Stop", togglePlay
).build() ).build()
val mRewindAction: Notification.Action = Notification.Action.Builder( val mRewindAction: Notification.Action = Notification.Action.Builder(
@ -186,17 +187,17 @@ class FMRadioService : Service() {
private const val ACTION_BEFORE = "$PACKAGENAME.BEFORE" private const val ACTION_BEFORE = "$PACKAGENAME.BEFORE"
private const val ACTION_QUIT = "$PACKAGENAME.QUIT" private const val ACTION_QUIT = "$PACKAGENAME.QUIT"
private const val ACTION_OUTPUT = "$PACKAGENAME.OUTPUT" private const val ACTION_OUTPUT = "$PACKAGENAME.OUTPUT"
private var mPlayState : PlayState = PlayState.STATE_PLAYING private var mPlayState: PlayState = PlayState.STATE_PLAYING
private var mOutput : OutputState = MainFragment.mHeadset private var mOutput: OutputState = MainFragment.mHeadset
private var fd : Int = -1 private var fd: Int = -1
private var mIndex = -1 private var mIndex = -1
lateinit var mMediaSession : MediaSession lateinit var mMediaSession: MediaSession
} }
private fun changeOutputDevice(output: OutputState){ private fun changeOutputDevice(output: OutputState) {
if (output == OutputState.OUTPUT_SPEAKER){ if (output == OutputState.OUTPUT_SPEAKER) {
mNativeFMInterface.setAudioRoute(false); mNativeFMInterface.setAudioRoute(false)
}else if (output == OutputState.OUTPUT_HEADSET){ } else if (output == OutputState.OUTPUT_HEADSET) {
mNativeFMInterface.setAudioRoute(true); mNativeFMInterface.setAudioRoute(true)
} }
} }
} }

View file

@ -24,9 +24,8 @@ import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.color.DynamicColors import com.google.android.material.color.DynamicColors
import com.google.android.material.textview.MaterialTextView import com.google.android.material.textview.MaterialTextView
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
private lateinit var mIntent : Intent private lateinit var mIntent: Intent
/** /**
* Function to change current [Fragment] to other [Fragment] * Function to change current [Fragment] to other [Fragment]
@ -43,10 +42,10 @@ class MainActivity : AppCompatActivity() {
} }
private val mFMInterface = NativeFMInterface() private val mFMInterface = NativeFMInterface()
private lateinit var mAlertView: View private lateinit var mAlertView: View
private lateinit var mAlertTitle : MaterialTextView private lateinit var mAlertTitle: MaterialTextView
private lateinit var mAlertDesc : MaterialTextView private lateinit var mAlertDesc: MaterialTextView
private lateinit var mAlertImage : AppCompatImageView private lateinit var mAlertImage: AppCompatImageView
private lateinit var mAudioManager : AudioManager private lateinit var mAudioManager: AudioManager
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
System.loadLibrary("fmnative_jni") System.loadLibrary("fmnative_jni")
MainFragment.fd = mFMInterface.openFMDevice() MainFragment.fd = mFMInterface.openFMDevice()
@ -57,7 +56,7 @@ class MainActivity : AppCompatActivity() {
mAlertDesc = mAlertView.findViewById(R.id.alert_desc) mAlertDesc = mAlertView.findViewById(R.id.alert_desc)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_navigation) setContentView(R.layout.activity_navigation)
if (MainFragment.fd == -1){ if (MainFragment.fd == -1) {
Log.e("CANNOT OPEN /dev/radio0!!!") Log.e("CANNOT OPEN /dev/radio0!!!")
mAlertTitle.text = getString(R.string.radio_io_error) mAlertTitle.text = getString(R.string.radio_io_error)
mAlertDesc.text = getString(R.string.radio_io_error_desc) mAlertDesc.text = getString(R.string.radio_io_error_desc)
@ -78,19 +77,23 @@ class MainActivity : AppCompatActivity() {
* @see AudioManager.getDevices * @see AudioManager.getDevices
*/ */
val mAudioDeviceInfo = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS) val mAudioDeviceInfo = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)
for (i in mAudioDeviceInfo.indices){ for (i in mAudioDeviceInfo.indices) {
if (mAudioDeviceInfo[i].type == AudioDeviceInfo.TYPE_WIRED_HEADSET || if (mAudioDeviceInfo[i].type == AudioDeviceInfo.TYPE_WIRED_HEADSET ||
mAudioDeviceInfo[i].type == AudioDeviceInfo.TYPE_WIRED_HEADPHONES) { mAudioDeviceInfo[i].type == AudioDeviceInfo.TYPE_WIRED_HEADPHONES
) {
MainFragment.mHeadSetPlugged = HeadsetState.HEADSET_STATE_CONNECTED MainFragment.mHeadSetPlugged = HeadsetState.HEADSET_STATE_CONNECTED
Log.i("Wired Headphones detected") Log.i("Wired Headphones detected")
} }
} }
if (MainFragment.mHeadSetPlugged != HeadsetState.HEADSET_STATE_CONNECTED){ if (MainFragment.mHeadSetPlugged != HeadsetState.HEADSET_STATE_CONNECTED) {
mAlertTitle.text = getString(R.string.no_headphones_error) mAlertTitle.text = getString(R.string.no_headphones_error)
mAlertDesc.text = getString(R.string.no_headphones_error_desc) mAlertDesc.text = getString(R.string.no_headphones_error_desc)
mAlertImage.setImageIcon(Icon.createWithResource(mAlertView.context, mAlertImage.setImageIcon(
Icon.createWithResource(
mAlertView.context,
R.drawable.ic_headphones R.drawable.ic_headphones
)) )
)
AlertDialog.Builder(mAlertView.context) AlertDialog.Builder(mAlertView.context)
.setCancelable(false) .setCancelable(false)
.setView(mAlertView) .setView(mAlertView)
@ -99,7 +102,7 @@ class MainActivity : AppCompatActivity() {
v.dismiss() v.dismiss()
Handler(Looper.getMainLooper()).postDelayed({ Handler(Looper.getMainLooper()).postDelayed({
finish() finish()
},500) }, 500)
} }
.show() .show()
} }
@ -111,7 +114,7 @@ class MainActivity : AppCompatActivity() {
changeFragment(mRadioMainFragment, MainFragment::class.java.name) changeFragment(mRadioMainFragment, MainFragment::class.java.name)
mIntent = Intent(this, FMRadioService::class.java) mIntent = Intent(this, FMRadioService::class.java)
findViewById<BottomNavigationView>(R.id.bottom_nav_bar).setOnItemSelectedListener { findViewById<BottomNavigationView>(R.id.bottom_nav_bar).setOnItemSelectedListener {
when (it.itemId){ when (it.itemId) {
R.id.radio_main -> changeFragment(mRadioMainFragment, MainFragment::class.java.name) R.id.radio_main -> changeFragment(mRadioMainFragment, MainFragment::class.java.name)
R.id.channel_list -> changeFragment(mRadioChannelListFragment, ChannelListFragment::class.java.name) R.id.channel_list -> changeFragment(mRadioChannelListFragment, ChannelListFragment::class.java.name)
R.id.fav_list -> changeFragment(mFavouriteFragment, FavouriteFragment::class.java.name) R.id.fav_list -> changeFragment(mFavouriteFragment, FavouriteFragment::class.java.name)
@ -128,19 +131,23 @@ class MainActivity : AppCompatActivity() {
if (intent.action == AudioManager.ACTION_HEADSET_PLUG) { if (intent.action == AudioManager.ACTION_HEADSET_PLUG) {
MainFragment.mHeadSetPlugged = HeadsetState.HEADSET_STATE_DISCONNECTED MainFragment.mHeadSetPlugged = HeadsetState.HEADSET_STATE_DISCONNECTED
val mAudioDeviceInfo = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS) val mAudioDeviceInfo = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)
for (i in mAudioDeviceInfo.indices){ for (i in mAudioDeviceInfo.indices) {
if (mAudioDeviceInfo[i].type == AudioDeviceInfo.TYPE_WIRED_HEADSET || if (mAudioDeviceInfo[i].type == AudioDeviceInfo.TYPE_WIRED_HEADSET ||
mAudioDeviceInfo[i].type == AudioDeviceInfo.TYPE_WIRED_HEADPHONES){ mAudioDeviceInfo[i].type == AudioDeviceInfo.TYPE_WIRED_HEADPHONES
) {
MainFragment.mHeadSetPlugged = HeadsetState.HEADSET_STATE_CONNECTED MainFragment.mHeadSetPlugged = HeadsetState.HEADSET_STATE_CONNECTED
} }
} }
if (MainFragment.mHeadSetPlugged != HeadsetState.HEADSET_STATE_CONNECTED){ if (MainFragment.mHeadSetPlugged != HeadsetState.HEADSET_STATE_CONNECTED) {
Log.w("onReceive: Headset Unplugged") Log.w("onReceive: Headset Unplugged")
mAlertTitle.text = getString(R.string.no_headphones_error) mAlertTitle.text = getString(R.string.no_headphones_error)
mAlertDesc.text = getString(R.string.no_headphones_error_desc) mAlertDesc.text = getString(R.string.no_headphones_error_desc)
mAlertImage.setImageIcon(Icon.createWithResource(mAlertView.context, mAlertImage.setImageIcon(
Icon.createWithResource(
mAlertView.context,
R.drawable.ic_headphones R.drawable.ic_headphones
)) )
)
val mAlertDialog = AlertDialog.Builder(mAlertView.context) val mAlertDialog = AlertDialog.Builder(mAlertView.context)
mAlertDialog mAlertDialog
.setCancelable(false) .setCancelable(false)
@ -150,7 +157,7 @@ class MainActivity : AppCompatActivity() {
mAudioManager.setParameters(PowerState.FM_POWER_OFF.mAudioParam) mAudioManager.setParameters(PowerState.FM_POWER_OFF.mAudioParam)
Handler(Looper.getMainLooper()).postDelayed({ Handler(Looper.getMainLooper()).postDelayed({
finish() finish()
},500) }, 500)
} }
.show() .show()
} }

View file

@ -1,15 +1,15 @@
package com.eurekateam.fmradio package com.eurekateam.fmradio
class NativeFMInterface { class NativeFMInterface {
external fun openFMDevice() : Int external fun openFMDevice(): Int
external fun getFMFreq(fd : Int): Long external fun getFMFreq(fd: Int): Long
external fun setFMFreq(fd : Int, freq : Int): Int external fun setFMFreq(fd: Int, freq: Int): Int
external fun setFMVolume(fd: Int, volume: Int /* 1 - 15 */): Int external fun setFMVolume(fd: Int, volume: Int /* 1 - 15 */): Int
external fun setFMMute(fd: Int, mute: Boolean): Int external fun setFMMute(fd: Int, mute: Boolean): Int
external fun getFmUpper(fd: Int): Int external fun getFmUpper(fd: Int): Int
external fun getFMLower(fd: Int): Int external fun getFMLower(fd: Int): Int
external fun getRMSSI(fd: Int): Int external fun getRMSSI(fd: Int): Int
external fun getFMTracks(fd: Int) : LongArray external fun getFMTracks(fd: Int): LongArray
external fun setFMStereo(fd: Int): Int external fun setFMStereo(fd: Int): Int
external fun setFMMono(fd: Int): Int external fun setFMMono(fd: Int): Int
external fun setFMThread(fd: Int, run: Boolean): Int external fun setFMThread(fd: Int, run: Boolean): Int

View file

@ -5,13 +5,12 @@ import android.graphics.*
import android.util.AttributeSet import android.util.AttributeSet
import android.view.View import android.view.View
class PebbleTextView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : View(context, attrs, defStyleAttr) { class PebbleTextView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : View(context, attrs, defStyleAttr) {
constructor (context: Context) : this(context, null) constructor (context: Context) : this(context, null)
constructor (context: Context, attrs: AttributeSet?) : this(context, attrs, 0) constructor (context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
var mText : String = "102.7" var mText: String = "102.7"
var mColor : Int = Color.GREEN var mColor: Int = Color.GREEN
private val mPaint = Paint() private val mPaint = Paint()
private val mRectf = RectF(25F, 25F, 350F, 270F) private val mRectf = RectF(25F, 25F, 350F, 270F)
@ -42,7 +41,8 @@ class PebbleTextView(context: Context, attrs: AttributeSet?, defStyleAttr: Int)
* the text that should be that width * the text that should be that width
*/ */
private fun setTextSizeForWidth( private fun setTextSizeForWidth(
paint: Paint, desiredWidth: Float, paint: Paint,
desiredWidth: Float,
text: String text: String
) { ) {

View file

@ -8,13 +8,13 @@ import android.widget.BaseAdapter
import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.AppCompatImageView
import androidx.core.content.res.ResourcesCompat import androidx.core.content.res.ResourcesCompat
import com.eurekateam.fmradio.* import com.eurekateam.fmradio.*
import com.eurekateam.fmradio.NativeFMInterface
import com.eurekateam.fmradio.fragments.MainFragment import com.eurekateam.fmradio.fragments.MainFragment
import com.eurekateam.fmradio.utils.FileUtilities import com.eurekateam.fmradio.utils.FileUtilities
import com.eurekateam.fmradio.utils.Log import com.eurekateam.fmradio.utils.Log
import com.eurekateam.fmradio.NativeFMInterface
import com.google.android.material.textview.MaterialTextView import com.google.android.material.textview.MaterialTextView
class ListViewAdapter (private val mContext: Context) : BaseAdapter() { class ListViewAdapter(private val mContext: Context) : BaseAdapter() {
private val mFMInterface = NativeFMInterface() private val mFMInterface = NativeFMInterface()
private var mListofViews = HashMap<Int, View>(30) private var mListofViews = HashMap<Int, View>(30)
override fun getCount(): Int { override fun getCount(): Int {
@ -32,10 +32,13 @@ class ListViewAdapter (private val mContext: Context) : BaseAdapter() {
override fun getView(id: Int, mConvertView: View?, parent: ViewGroup?): View { override fun getView(id: Int, mConvertView: View?, parent: ViewGroup?): View {
val mAnotherConvertView = mConvertView val mAnotherConvertView = mConvertView
?: (mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater).inflate( ?: (mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater).inflate(
R.layout.channel_list_items, parent, false) R.layout.channel_list_items, parent, false
)
mAnotherConvertView.findViewById<MaterialTextView>(R.id.channel_list_title).text = mAnotherConvertView.findViewById<MaterialTextView>(R.id.channel_list_title).text =
String.format(mContext.getString(R.string.fm_radio_freq), String.format(
MainFragment.mTracks[id].toFloat() / 1000) mContext.getString(R.string.fm_radio_freq),
MainFragment.mTracks[id].toFloat() / 1000
)
mAnotherConvertView.findViewById<MaterialTextView>(R.id.channel_list_title).setOnClickListener { mAnotherConvertView.findViewById<MaterialTextView>(R.id.channel_list_title).setOnClickListener {
mFMInterface.setFMFreq(MainFragment.fd, MainFragment.mTracks[id].toInt()) mFMInterface.setFMFreq(MainFragment.fd, MainFragment.mTracks[id].toInt())
MainFragment.mFreqCurrent = MainFragment.mTracks[id].toInt() MainFragment.mFreqCurrent = MainFragment.mTracks[id].toInt()
@ -47,19 +50,21 @@ class ListViewAdapter (private val mContext: Context) : BaseAdapter() {
} }
mAnotherConvertView.findViewById<AppCompatImageView>(R.id.star_button_list).let { mAnotherConvertView.findViewById<AppCompatImageView>(R.id.star_button_list).let {
val mStar = ResourcesCompat.getDrawable(mContext.resources, R.drawable.ic_star, mContext.theme) val mStar = ResourcesCompat.getDrawable(mContext.resources, R.drawable.ic_star, mContext.theme)
val mStarFilled = ResourcesCompat.getDrawable(mContext.resources, val mStarFilled = ResourcesCompat.getDrawable(
R.drawable.ic_star_filled, mContext.theme) mContext.resources,
R.drawable.ic_star_filled, mContext.theme
)
val mIndex = MainFragment.mTracks[id].toInt() val mIndex = MainFragment.mTracks[id].toInt()
if (MainFragment.mFavStats[mIndex] == null){ if (MainFragment.mFavStats[mIndex] == null) {
MainFragment.mFavStats.putIfAbsent(mIndex, false) MainFragment.mFavStats.putIfAbsent(mIndex, false)
} }
if (MainFragment.mFavStats[mIndex]!!){ if (MainFragment.mFavStats[mIndex]!!) {
it.setImageDrawable(mStarFilled) it.setImageDrawable(mStarFilled)
}else { } else {
it.setImageDrawable(mStar) it.setImageDrawable(mStar)
} }
} }
if (MainFragment.mFreqCurrent == MainFragment.mTracks[id].toInt()){ if (MainFragment.mFreqCurrent == MainFragment.mTracks[id].toInt()) {
setCurrentFMChannel(id) setCurrentFMChannel(id)
} }
mListofViews[id] = mAnotherConvertView!! mListofViews[id] = mAnotherConvertView!!
@ -68,11 +73,19 @@ class ListViewAdapter (private val mContext: Context) : BaseAdapter() {
private fun setCurrentFMChannel(mPosition: Int) { private fun setCurrentFMChannel(mPosition: Int) {
Log.i("Position: $mPosition") Log.i("Position: $mPosition")
for (mItem in mListofViews){ for (mItem in mListofViews) {
mItem.value.setBackgroundColor(ResourcesCompat.getColor(mContext.resources, mItem.value.setBackgroundColor(
android.R.color.system_accent2_100, mContext.theme)) ResourcesCompat.getColor(
mContext.resources,
android.R.color.system_accent2_100, mContext.theme
)
)
} }
mListofViews[mPosition]?.setBackgroundColor(ResourcesCompat.getColor(mContext.resources, mListofViews[mPosition]?.setBackgroundColor(
android.R.color.system_accent3_400, mContext.theme)) ResourcesCompat.getColor(
mContext.resources,
android.R.color.system_accent3_400, mContext.theme
)
)
} }
} }

View file

@ -12,18 +12,17 @@ import com.eurekateam.fmradio.R
import com.eurekateam.fmradio.fragments.MainFragment import com.eurekateam.fmradio.fragments.MainFragment
import com.eurekateam.fmradio.utils.FileUtilities import com.eurekateam.fmradio.utils.FileUtilities
class PebbleLayoutAdapter(private val mContext: Context) : BaseAdapter() {
class PebbleLayoutAdapter (private val mContext: Context) : BaseAdapter() { private val mFavoriteList: MutableList<Int> = emptyList<Int>().toMutableList()
private val mFavoriteList : MutableList<Int> = emptyList<Int>().toMutableList()
init { init {
for (mItem in MainFragment.mFavStats){ for (mItem in MainFragment.mFavStats) {
if (mItem.value){ if (mItem.value) {
mFavoriteList.add(mItem.key) mFavoriteList.add(mItem.key)
} }
} }
mFavoriteList.sort() mFavoriteList.sort()
var mData = "" var mData = ""
for (i in mFavoriteList){ for (i in mFavoriteList) {
mData += "$i\n" mData += "$i\n"
} }
FileUtilities.writeToFile(FileUtilities.mFavouriteChannelFileName, mData, mContext) FileUtilities.writeToFile(FileUtilities.mFavouriteChannelFileName, mData, mContext)
@ -48,8 +47,10 @@ class PebbleLayoutAdapter (private val mContext: Context) : BaseAdapter() {
) )
mAnotherConvertView.findViewById<PebbleTextView>(R.id.pebble_textview).apply { mAnotherConvertView.findViewById<PebbleTextView>(R.id.pebble_textview).apply {
mText = (mFavoriteList[id].toFloat() / 1000).toString() mText = (mFavoriteList[id].toFloat() / 1000).toString()
mColor = ResourcesCompat.getColor(mContext.resources, android.R.color.system_accent1_400, mColor = ResourcesCompat.getColor(
mContext.theme) mContext.resources, android.R.color.system_accent1_400,
mContext.theme
)
setOnClickListener { setOnClickListener {
mFMInterface.setFMFreq(MainFragment.fd, mFavoriteList[id]) mFMInterface.setFMFreq(MainFragment.fd, mFavoriteList[id])
MainFragment.mFreqCurrent = mFavoriteList[id] MainFragment.mFreqCurrent = mFavoriteList[id]

View file

@ -17,9 +17,10 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
class ChannelListFragment : Fragment(R.layout.activity_channel_list), class ChannelListFragment :
Fragment(R.layout.activity_channel_list),
View.OnClickListener { View.OnClickListener {
private lateinit var mListView : ListView private lateinit var mListView: ListView
private lateinit var mFloatingActionButton: FloatingActionButton private lateinit var mFloatingActionButton: FloatingActionButton
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -50,10 +51,10 @@ class ChannelListFragment : Fragment(R.layout.activity_channel_list),
override fun onClick(v: View?) { override fun onClick(v: View?) {
GlobalScope.launch { GlobalScope.launch {
withContext(Dispatchers.IO){ withContext(Dispatchers.IO) {
MainFragment.mRefreshTracks() MainFragment.mRefreshTracks()
} }
withContext(Dispatchers.Main){ withContext(Dispatchers.Main) {
(requireActivity() as MainActivity).getMySupportFragmentManager().apply { (requireActivity() as MainActivity).getMySupportFragmentManager().apply {
beginTransaction().remove(this@ChannelListFragment).commit() beginTransaction().remove(this@ChannelListFragment).commit()
executePendingTransactions() executePendingTransactions()

View file

@ -6,7 +6,6 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.GridView import android.widget.GridView
import android.widget.ListView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.eurekateam.fmradio.R import com.eurekateam.fmradio.R
import com.eurekateam.fmradio.adapters.PebbleLayoutAdapter import com.eurekateam.fmradio.adapters.PebbleLayoutAdapter

View file

@ -30,23 +30,24 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.text.DecimalFormat import java.text.DecimalFormat
class MainFragment :
class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener, Fragment(R.layout.fragment_main),
View.OnClickListener,
SeekBar.OnSeekBarChangeListener { SeekBar.OnSeekBarChangeListener {
private val mFMInterface = NativeFMInterface() private val mFMInterface = NativeFMInterface()
private lateinit var mVolumeUp : FloatingActionButton private lateinit var mVolumeUp: FloatingActionButton
private lateinit var mVolumeDown : FloatingActionButton private lateinit var mVolumeDown: FloatingActionButton
private lateinit var mSeekBar: AppCompatSeekBar private lateinit var mSeekBar: AppCompatSeekBar
private lateinit var mFavButton : FloatingActionButton private lateinit var mFavButton: FloatingActionButton
private lateinit var mFMFreq : MaterialTextView private lateinit var mFMFreq: MaterialTextView
private val mCleanFormat: DecimalFormat = DecimalFormat("0.#") private val mCleanFormat: DecimalFormat = DecimalFormat("0.#")
private lateinit var mOutputSwitch : FloatingActionButton private lateinit var mOutputSwitch: FloatingActionButton
private lateinit var mBeforeChannelBtn : FloatingActionButton private lateinit var mBeforeChannelBtn: FloatingActionButton
private lateinit var mNextChannelBtn : FloatingActionButton private lateinit var mNextChannelBtn: FloatingActionButton
private lateinit var mPowerBtn : FloatingActionButton private lateinit var mPowerBtn: FloatingActionButton
private lateinit var mAudioManager: AudioManager private lateinit var mAudioManager: AudioManager
private lateinit var mStar : Drawable private lateinit var mStar: Drawable
private lateinit var mStarFilled : Drawable private lateinit var mStarFilled: Drawable
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
@ -54,10 +55,14 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
): View? { ): View? {
val mRootView = inflater.inflate(R.layout.fragment_main, container, false) val mRootView = inflater.inflate(R.layout.fragment_main, container, false)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
mStar = ResourcesCompat.getDrawable(requireContext().resources, mStar = ResourcesCompat.getDrawable(
R.drawable.ic_star, requireContext().theme)!! requireContext().resources,
mStarFilled = ResourcesCompat.getDrawable(requireContext().resources, R.drawable.ic_star, requireContext().theme
R.drawable.ic_star_filled, requireContext().theme)!! )!!
mStarFilled = ResourcesCompat.getDrawable(
requireContext().resources,
R.drawable.ic_star_filled, requireContext().theme
)!!
mAudioManager = requireContext().getSystemService(Context.AUDIO_SERVICE) as AudioManager mAudioManager = requireContext().getSystemService(Context.AUDIO_SERVICE) as AudioManager
mVolumeUp = mRootView.findViewById(R.id.volume_up) mVolumeUp = mRootView.findViewById(R.id.volume_up)
mVolumeDown = mRootView.findViewById(R.id.volume_down) mVolumeDown = mRootView.findViewById(R.id.volume_down)
@ -85,7 +90,7 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
Configuration.UI_MODE_NIGHT_UNDEFINED -> mIsLight = true Configuration.UI_MODE_NIGHT_UNDEFINED -> mIsLight = true
} }
val mTextViewList = listOf(R.id.app_banner, R.id.fm_freq, R.id.freq_misc) val mTextViewList = listOf(R.id.app_banner, R.id.fm_freq, R.id.freq_misc)
for (mResID in mTextViewList){ for (mResID in mTextViewList) {
mRootView.findViewById<MaterialTextView>(mResID).apply { mRootView.findViewById<MaterialTextView>(mResID).apply {
if (mIsLight) if (mIsLight)
setTextColor(resources.getColor(android.R.color.system_accent2_500, requireContext().theme)) setTextColor(resources.getColor(android.R.color.system_accent2_500, requireContext().theme))
@ -100,7 +105,7 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
setBackgroundColor(resources.getColor(android.R.color.system_accent1_700, requireContext().theme)) setBackgroundColor(resources.getColor(android.R.color.system_accent1_700, requireContext().theme))
} }
GlobalScope.launch { GlobalScope.launch {
withContext(Dispatchers.IO){ withContext(Dispatchers.IO) {
if (FileUtilities.checkIfExistFile(FileUtilities.mFavouriteChannelFileName, requireContext())) { if (FileUtilities.checkIfExistFile(FileUtilities.mFavouriteChannelFileName, requireContext())) {
val mFavData = FileUtilities.readFromFile( val mFavData = FileUtilities.readFromFile(
FileUtilities.mFavouriteChannelFileName, requireContext() FileUtilities.mFavouriteChannelFileName, requireContext()
@ -113,13 +118,13 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
var mMute = false var mMute = false
if (mFreqCurrent == -1) { if (mFreqCurrent == -1) {
mAudioManager.setParameters(PowerState.FM_POWER_OFF.mAudioParam) mAudioManager.setParameters(PowerState.FM_POWER_OFF.mAudioParam)
withContext(Dispatchers.Main){ withContext(Dispatchers.Main) {
mUpdateEnableDisable(false, mRootView) mUpdateEnableDisable(false, mRootView)
} }
mMute = true mMute = true
} }
if (FileUtilities.checkIfExistFile(FileUtilities.mFMFreqFileName, requireContext())){ if (FileUtilities.checkIfExistFile(FileUtilities.mFMFreqFileName, requireContext())) {
mFreqCurrent = FileUtilities.readFromFile( mFreqCurrent = FileUtilities.readFromFile(
FileUtilities.mFMFreqFileName, FileUtilities.mFMFreqFileName,
requireContext() requireContext()
@ -129,7 +134,7 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
mFMFreq.text = mCleanFormat.format(mFreqCurrent.toFloat() / 1000) mFMFreq.text = mCleanFormat.format(mFreqCurrent.toFloat() / 1000)
} }
} }
if (FileUtilities.checkIfExistFile(FileUtilities.mFMVolumeFileName, requireContext())){ if (FileUtilities.checkIfExistFile(FileUtilities.mFMVolumeFileName, requireContext())) {
mVolume = FileUtilities.readFromFile( mVolume = FileUtilities.readFromFile(
FileUtilities.mFMVolumeFileName, FileUtilities.mFMVolumeFileName,
requireContext() requireContext()
@ -139,11 +144,11 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
mSeekBar.progress = mVolume mSeekBar.progress = mVolume
} }
} }
withContext(Dispatchers.Main){ withContext(Dispatchers.Main) {
mSeekBar.min = 1 mSeekBar.min = 1
mSeekBar.max = 15 mSeekBar.max = 15
} }
withContext(Dispatchers.IO){ withContext(Dispatchers.IO) {
if (mVolume == -1) { if (mVolume == -1) {
mVolume = 8 mVolume = 8
mFMInterface.setFMVolume(fd, mVolume) mFMInterface.setFMVolume(fd, mVolume)
@ -156,7 +161,7 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
mFMInterface.setFMMute(fd, true) mFMInterface.setFMMute(fd, true)
mFMInterface.setFMFreq(fd, mFMInterface.getFMLower(fd)) mFMInterface.setFMFreq(fd, mFMInterface.getFMLower(fd))
mRefreshTracks() mRefreshTracks()
if (mFreqCurrent != -1){ if (mFreqCurrent != -1) {
mFMInterface.setFMFreq(fd, mFreqCurrent) mFMInterface.setFMFreq(fd, mFreqCurrent)
} else { } else {
mFreqCurrent = mFMInterface.getFMLower(fd) mFreqCurrent = mFMInterface.getFMLower(fd)
@ -165,20 +170,20 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
mFreqCurrent = mFMInterface.getFMFreq(fd).toInt() mFreqCurrent = mFMInterface.getFMFreq(fd).toInt()
mFMInterface.setFMFreq(fd, mFreqCurrent) mFMInterface.setFMFreq(fd, mFreqCurrent)
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
mFMFreq.text = mCleanFormat.format( mFreqCurrent.toFloat() / 1000) mFMFreq.text = mCleanFormat.format(mFreqCurrent.toFloat() / 1000)
} }
if (!mMute) if (!mMute)
mFMInterface.setFMMute(fd, false) mFMInterface.setFMMute(fd, false)
if (mFreqCurrent == -1) if (mFreqCurrent == -1)
mFMInterface.setFMThread(fd, true) mFMInterface.setFMThread(fd, true)
withContext(Dispatchers.Main){ withContext(Dispatchers.Main) {
mFavButton.let { mFavButton.let {
if (mFavStats[mFreqCurrent] == null){ if (mFavStats[mFreqCurrent] == null) {
mFavStats.putIfAbsent(mFreqCurrent, false) mFavStats.putIfAbsent(mFreqCurrent, false)
} }
if (mFavStats[mFreqCurrent]!!){ if (mFavStats[mFreqCurrent]!!) {
it.setImageDrawable(mStarFilled) it.setImageDrawable(mStarFilled)
}else { } else {
it.setImageDrawable(mStar) it.setImageDrawable(mStar)
} }
} }
@ -193,18 +198,18 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
* @param mTextView Whether the target view is touchable [FloatingActionButton] or * @param mTextView Whether the target view is touchable [FloatingActionButton] or
* [MaterialTextView] with useless touch attr * [MaterialTextView] with useless touch attr
*/ */
private fun View.disable(mTextView : Boolean = false) { private fun View.disable(mTextView: Boolean = false) {
alpha = .7f alpha = .7f
if(!mTextView) isEnabled = false if (!mTextView) isEnabled = false
} }
/** /**
* Extension function for [View], for reverting Grayed out, disabled View * Extension function for [View], for reverting Grayed out, disabled View
* @param mTextView Whether the target view is touchable [FloatingActionButton] or * @param mTextView Whether the target view is touchable [FloatingActionButton] or
* [MaterialTextView] with useless touch attr * [MaterialTextView] with useless touch attr
*/ */
private fun View.enable(mTextView : Boolean = false) { private fun View.enable(mTextView: Boolean = false) {
alpha = 1.0f alpha = 1.0f
if(!mTextView) isEnabled = true if (!mTextView) isEnabled = true
} }
/** /**
@ -215,19 +220,19 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
* @see [enable] * @see [enable]
* @see [disable] * @see [disable]
*/ */
private fun mUpdateEnableDisable(mEnabled: Boolean, mView: View = requireView()){ private fun mUpdateEnableDisable(mEnabled: Boolean, mView: View = requireView()) {
val mTextViewList = listOf(R.id.fm_freq, R.id.freq_misc) val mTextViewList = listOf(R.id.fm_freq, R.id.freq_misc)
val mFloatButtonList = listOf( val mFloatButtonList = listOf(
R.id.volume_down, R.id.volume_up, R.id.volume_down, R.id.volume_up,
R.id.before_channel, R.id.next_channel, R.id.fm_output_btn R.id.before_channel, R.id.next_channel, R.id.fm_output_btn
) )
for (i in mTextViewList){ for (i in mTextViewList) {
if (mEnabled) if (mEnabled)
mView.findViewById<View>(i).enable(true) mView.findViewById<View>(i).enable(true)
else else
mView.findViewById<View>(i).disable(true) mView.findViewById<View>(i).disable(true)
} }
for (i in mFloatButtonList){ for (i in mFloatButtonList) {
if (mEnabled) if (mEnabled)
mView.findViewById<View>(i).enable() mView.findViewById<View>(i).enable()
else else
@ -245,21 +250,21 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
R.drawable.ic_volume_up R.drawable.ic_volume_up
) )
) )
val ret = mFMInterface.setAudioRoute(true); val ret = mFMInterface.setAudioRoute(true)
Log.i("mFMInterface.setAudioRoute return $ret"); Log.i("mFMInterface.setAudioRoute return $ret")
}else if (mHeadset == OutputState.OUTPUT_SPEAKER){ } else if (mHeadset == OutputState.OUTPUT_SPEAKER) {
mOutputSwitch.setImageIcon( mOutputSwitch.setImageIcon(
Icon.createWithResource( Icon.createWithResource(
requireContext(), requireContext(),
R.drawable.ic_headphones R.drawable.ic_headphones
) )
) )
val ret = mFMInterface.setAudioRoute(false); val ret = mFMInterface.setAudioRoute(false)
Log.i("mFMInterface.setAudioRoute return $ret"); Log.i("mFMInterface.setAudioRoute return $ret")
} }
if (mHeadset == OutputState.OUTPUT_HEADSET){ if (mHeadset == OutputState.OUTPUT_HEADSET) {
mHeadset = OutputState.OUTPUT_SPEAKER mHeadset = OutputState.OUTPUT_SPEAKER
}else if (mHeadset == OutputState.OUTPUT_SPEAKER){ } else if (mHeadset == OutputState.OUTPUT_SPEAKER) {
mHeadset = OutputState.OUTPUT_HEADSET mHeadset = OutputState.OUTPUT_HEADSET
} }
} }
@ -290,10 +295,11 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
val mTempFreq = mFMInterface.getBeforeChannel(fd) val mTempFreq = mFMInterface.getBeforeChannel(fd)
if (mTempFreq > mFMInterface.getFMLower(fd) && mTempFreq < mFMInterface.getFmUpper( if (mTempFreq > mFMInterface.getFMLower(fd) && mTempFreq < mFMInterface.getFmUpper(
fd fd
)){ )
) {
mFreqCurrent = mTempFreq mFreqCurrent = mTempFreq
} }
if (!mFMInterface.getSysfsSupport()){ if (!mFMInterface.getSysfsSupport()) {
mFMInterface.setFMFreq(fd, mFreqCurrent) mFMInterface.setFMFreq(fd, mFreqCurrent)
} }
mFMInterface.setFMMute(fd, false) mFMInterface.setFMMute(fd, false)
@ -302,21 +308,21 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
mFreqCurrent.toString(), requireContext() mFreqCurrent.toString(), requireContext()
) )
mFavButton.let { mFavButton.let {
if (mFavStats[mFreqCurrent] == null){ if (mFavStats[mFreqCurrent] == null) {
mFavStats.putIfAbsent(mFreqCurrent, false) mFavStats.putIfAbsent(mFreqCurrent, false)
} }
if (mFavStats[mFreqCurrent]!!){ if (mFavStats[mFreqCurrent]!!) {
it.setImageDrawable(mStarFilled) it.setImageDrawable(mStarFilled)
}else { } else {
it.setImageDrawable(mStar) it.setImageDrawable(mStar)
} }
} }
} }
mPowerBtn.id -> { mPowerBtn.id -> {
if (mFMPower){ if (mFMPower) {
mAudioManager.setParameters(PowerState.FM_POWER_OFF.mAudioParam) mAudioManager.setParameters(PowerState.FM_POWER_OFF.mAudioParam)
mFMFreq.text = getText(R.string.inital_freq) mFMFreq.text = getText(R.string.inital_freq)
}else{ } else {
mAudioManager.setParameters(PowerState.FM_POWER_ON.mAudioParam) mAudioManager.setParameters(PowerState.FM_POWER_ON.mAudioParam)
mFMFreq.text = mCleanFormat.format(mFreqCurrent.toFloat() / 1000) mFMFreq.text = mCleanFormat.format(mFreqCurrent.toFloat() / 1000)
} }
@ -328,10 +334,11 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
val mTempFreq = mFMInterface.getNextChannel(fd) val mTempFreq = mFMInterface.getNextChannel(fd)
if (mTempFreq > mFMInterface.getFMLower(fd) && mTempFreq < mFMInterface.getFmUpper( if (mTempFreq > mFMInterface.getFMLower(fd) && mTempFreq < mFMInterface.getFmUpper(
fd fd
)){ )
) {
mFreqCurrent = mTempFreq mFreqCurrent = mTempFreq
} }
if (!mFMInterface.getSysfsSupport()){ if (!mFMInterface.getSysfsSupport()) {
mFMInterface.setFMFreq(fd, mFreqCurrent) mFMInterface.setFMFreq(fd, mFreqCurrent)
} }
mFMInterface.setFMMute(fd, false) mFMInterface.setFMMute(fd, false)
@ -340,26 +347,26 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
mFreqCurrent.toString(), requireContext() mFreqCurrent.toString(), requireContext()
) )
mFavButton.let { mFavButton.let {
if (mFavStats[mFreqCurrent] == null){ if (mFavStats[mFreqCurrent] == null) {
mFavStats.putIfAbsent(mFreqCurrent, false) mFavStats.putIfAbsent(mFreqCurrent, false)
} }
if (mFavStats[mFreqCurrent]!!){ if (mFavStats[mFreqCurrent]!!) {
it.setImageDrawable(mStarFilled) it.setImageDrawable(mStarFilled)
}else { } else {
it.setImageDrawable(mStar) it.setImageDrawable(mStar)
} }
} }
} }
mFavButton.id -> { mFavButton.id -> {
val mIndex = mFreqCurrent val mIndex = mFreqCurrent
if (mFavStats[mIndex] == null){ if (mFavStats[mIndex] == null) {
mFavStats.putIfAbsent(mIndex, false) mFavStats.putIfAbsent(mIndex, false)
} }
mFavStats[mIndex] = !mFavStats[mIndex]!! mFavStats[mIndex] = !mFavStats[mIndex]!!
mFavButton.let { mFavButton.let {
if (mFavStats[mIndex]!!){ if (mFavStats[mIndex]!!) {
it.setImageDrawable(mStarFilled) it.setImageDrawable(mStarFilled)
}else { } else {
it.setImageDrawable(mStar) it.setImageDrawable(mStar)
} }
} }
@ -387,9 +394,9 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
var mHeadset = OutputState.OUTPUT_SPEAKER var mHeadset = OutputState.OUTPUT_SPEAKER
var mFreqCurrent = -1 var mFreqCurrent = -1
private var mFMPower = false private var mFMPower = false
var mHeadSetPlugged : HeadsetState = HeadsetState.HEADSET_STATE_DISCONNECTED var mHeadSetPlugged: HeadsetState = HeadsetState.HEADSET_STATE_DISCONNECTED
var mTracks : LongArray = emptyArray<Long>().toLongArray() var mTracks: LongArray = emptyArray<Long>().toLongArray()
fun mRefreshTracks(){ fun mRefreshTracks() {
NativeFMInterface().setFMFreq(fd, NativeFMInterface().getFMLower(fd)) NativeFMInterface().setFMFreq(fd, NativeFMInterface().getFMLower(fd))
mTracks = NativeFMInterface().getFMTracks(fd) mTracks = NativeFMInterface().getFMTracks(fd)
mTracks = MainFragment().removeZeros(mTracks) mTracks = MainFragment().removeZeros(mTracks)
@ -410,15 +417,14 @@ class MainFragment : Fragment(R.layout.fragment_main), View.OnClickListener,
* @param array The target Long array * @param array The target Long array
* @return Long array with zeros removed * @return Long array with zeros removed
*/ */
private fun removeZeros(array : LongArray): LongArray{ private fun removeZeros(array: LongArray): LongArray {
val mArray : MutableList<Long> = emptyList<Long>().toMutableList() val mArray: MutableList<Long> = emptyList<Long>().toMutableList()
Log.d("removeZeros: Got array size ${array.size}") Log.d("removeZeros: Got array size ${array.size}")
for (i in array.indices){ for (i in array.indices) {
if(array[i] > 0L){ if (array[i] > 0L) {
mArray.add(array[i]) mArray.add(array[i])
} }
} }
return mArray.toLongArray() return mArray.toLongArray()
} }
} }

View file

@ -8,7 +8,7 @@ object FileUtilities {
const val mFMVolumeFileName = "fm_volume_current" const val mFMVolumeFileName = "fm_volume_current"
const val mFavouriteChannelFileName = "fm_fav_freqs" const val mFavouriteChannelFileName = "fm_fav_freqs"
fun writeToFile(fileName : String, data: String, mContext: Context){ fun writeToFile(fileName: String, data: String, mContext: Context) {
var os: OutputStream? = null var os: OutputStream? = null
try { try {
os = FileOutputStream(File(mContext.filesDir.absolutePath + "/" + fileName)) os = FileOutputStream(File(mContext.filesDir.absolutePath + "/" + fileName))
@ -23,7 +23,7 @@ object FileUtilities {
} }
} }
} }
fun readFromFile(fileName: String, mContext: Context): String{ fun readFromFile(fileName: String, mContext: Context): String {
val mFile = File(mContext.filesDir.absolutePath + "/" + fileName) val mFile = File(mContext.filesDir.absolutePath + "/" + fileName)
var os: InputStream? = null var os: InputStream? = null
val mByteArray = ByteArray(mFile.length().toInt()) val mByteArray = ByteArray(mFile.length().toInt())

View file

@ -1,6 +1,5 @@
package com.eurekateam.fmradio.utils package com.eurekateam.fmradio.utils
import android.util.Log import android.util.Log
/** /**
@ -16,7 +15,7 @@ object Log {
Log.e(TAG, getMessage(message)) Log.e(TAG, getMessage(message))
} }
fun d(message: String){ fun d(message: String) {
Log.d(TAG, getMessage(message)) Log.d(TAG, getMessage(message))
} }
private fun getMessage(message: String): String { private fun getMessage(message: String): String {

View file

@ -17,18 +17,26 @@ class BootReceiver : BroadcastReceiver() {
override fun onReceive(p0: Context?, p1: Intent?) { override fun onReceive(p0: Context?, p1: Intent?) {
val mSharedPreferences = p0?.let { PreferenceManager.getDefaultSharedPreferences(it) } val mSharedPreferences = p0?.let { PreferenceManager.getDefaultSharedPreferences(it) }
if (p1 != null && mSharedPreferences != null) { if (p1 != null && mSharedPreferences != null) {
if (p1.action == Intent.ACTION_BOOT_COMPLETED){ if (p1.action == Intent.ACTION_BOOT_COMPLETED) {
System.loadLibrary("samsungparts_jni") System.loadLibrary("samsungparts_jni")
// Battery // Battery
Battery.chargeSysfs = if (mSharedPreferences Battery.chargeSysfs = if (mSharedPreferences
.getBoolean(BatteryFragment.PREF_CHARGE, true)) 0 else 1 .getBoolean(BatteryFragment.PREF_CHARGE, true)
Battery.setFastCharge(if (mSharedPreferences ) 0 else 1
.getBoolean(BatteryFragment.PREF_FASTCHARGE, true)) 0 else 1) Battery.setFastCharge(
if (mSharedPreferences
.getBoolean(BatteryFragment.PREF_FASTCHARGE, true)
) 0 else 1
)
// Dolby // Dolby
DolbyCore.setEnabled(mSharedPreferences DolbyCore.setEnabled(
.getBoolean(DolbyFragment.PREF_DOLBY_ENABLE, false)) mSharedPreferences
DolbyCore.setProfile(mSharedPreferences .getBoolean(DolbyFragment.PREF_DOLBY_ENABLE, false)
.getInt(DolbyFragment.PREF_DOLBY_PROFILE, 0)) )
DolbyCore.setProfile(
mSharedPreferences
.getInt(DolbyFragment.PREF_DOLBY_PROFILE, 0)
)
// FlashLight // FlashLight
Flashlight.setFlash(mSharedPreferences.getInt(FlashLightFragment.PREF_FLASHLIGHT, 5)) Flashlight.setFlash(mSharedPreferences.getInt(FlashLightFragment.PREF_FLASHLIGHT, 5))

View file

@ -17,8 +17,8 @@ package com.eurekateam.samsungextras
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.Bundle
import android.os.Build import android.os.Build
import android.os.Bundle
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
@ -26,13 +26,13 @@ import androidx.preference.SwitchPreference
import com.eurekateam.samsungextras.battery.BatteryActivity import com.eurekateam.samsungextras.battery.BatteryActivity
import com.eurekateam.samsungextras.flashlight.FlashLightActivity import com.eurekateam.samsungextras.flashlight.FlashLightActivity
import com.eurekateam.samsungextras.fps.FPSInfoService import com.eurekateam.samsungextras.fps.FPSInfoService
import com.eurekateam.samsungextras.interfaces.Display.GloveMode
import com.eurekateam.samsungextras.interfaces.Display.DT2W import com.eurekateam.samsungextras.interfaces.Display.DT2W
import com.eurekateam.samsungextras.interfaces.Display.GloveMode
import com.eurekateam.samsungextras.speaker.ClearSpeakerActivity import com.eurekateam.samsungextras.speaker.ClearSpeakerActivity
class DeviceSettings : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener { class DeviceSettings : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener {
private lateinit var mPrefs : SharedPreferences private lateinit var mPrefs: SharedPreferences
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
System.loadLibrary("samsungparts_jni") System.loadLibrary("samsungparts_jni")
setPreferencesFromResource(R.xml.preferences_samsung_parts, rootKey) setPreferencesFromResource(R.xml.preferences_samsung_parts, rootKey)

View file

@ -15,11 +15,11 @@
*/ */
package com.eurekateam.samsungextras.battery package com.eurekateam.samsungextras.battery
import android.R.id.content
import android.R.id.home
import android.os.Bundle import android.os.Bundle
import android.view.MenuItem import android.view.MenuItem
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import android.R.id.content
import android.R.id.home
class BatteryActivity : FragmentActivity() { class BatteryActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {

View file

@ -15,6 +15,7 @@
*/ */
package com.eurekateam.samsungextras.battery package com.eurekateam.samsungextras.battery
import android.content.SharedPreferences
import android.os.Bundle import android.os.Bundle
import android.widget.Toast import android.widget.Toast
import androidx.preference.ListPreference import androidx.preference.ListPreference
@ -22,14 +23,13 @@ import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.preference.SwitchPreference import androidx.preference.SwitchPreference
import android.content.SharedPreferences
import com.eurekateam.samsungextras.R import com.eurekateam.samsungextras.R
import com.eurekateam.samsungextras.interfaces.Battery import com.eurekateam.samsungextras.interfaces.Battery
class BatteryFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener { class BatteryFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener {
private lateinit var mFastChargePref: SwitchPreference private lateinit var mFastChargePref: SwitchPreference
private lateinit var mChargePref: SwitchPreference private lateinit var mChargePref: SwitchPreference
private lateinit var mSharedPreferences : SharedPreferences private lateinit var mSharedPreferences: SharedPreferences
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.battery_settings) addPreferencesFromResource(R.xml.battery_settings)
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
@ -39,7 +39,7 @@ class BatteryFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChang
mChargePref = findPreference(PREF_CHARGE)!! mChargePref = findPreference(PREF_CHARGE)!!
mChargePref.onPreferenceChangeListener = this mChargePref.onPreferenceChangeListener = this
mChargePref.isChecked = mSharedPreferences.getBoolean(PREF_CHARGE, true) mChargePref.isChecked = mSharedPreferences.getBoolean(PREF_CHARGE, true)
val mBatteryInfo : ListPreference = findPreference(BATTERY_INFO)!! val mBatteryInfo: ListPreference = findPreference(BATTERY_INFO)!!
val items = arrayOf<CharSequence>( val items = arrayOf<CharSequence>(
Battery.getGeneralBatteryStats(1).toString() + " mAh", Battery.getGeneralBatteryStats(1).toString() + " mAh",
Battery.getGeneralBatteryStats(2).toString() + " %", Battery.getGeneralBatteryStats(2).toString() + " %",

View file

@ -16,10 +16,9 @@
package com.eurekateam.samsungextras.dolby package com.eurekateam.samsungextras.dolby
import android.os.Bundle
import androidx.fragment.app.FragmentActivity
import android.R.id.content import android.R.id.content
import android.os.Bundle
import androidx.fragment.app.FragmentActivity
class DolbyActivity : FragmentActivity() { class DolbyActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {

View file

@ -18,9 +18,7 @@ package com.eurekateam.samsungextras.dolby
import android.content.Context import android.content.Context
import android.media.audiofx.AudioEffect import android.media.audiofx.AudioEffect
import com.eurekateam.samsungextras.dolby.DolbyFragment.Companion.PREF_DOLBY_MODES import com.eurekateam.samsungextras.dolby.DolbyFragment.Companion.PREF_DOLBY_MODES
import java.util.UUID import java.util.UUID
object DolbyCore { object DolbyCore {
@ -53,9 +51,11 @@ object DolbyCore {
val profile = getProfile() val profile = getProfile()
val resourceName = PREF_DOLBY_MODES.filter { it.value == profile }.keys.first() val resourceName = PREF_DOLBY_MODES.filter { it.value == profile }.keys.first()
return context.resources.getString(context.resources.getIdentifier( return context.resources.getString(
context.resources.getIdentifier(
resourceName, "string", context.packageName resourceName, "string", context.packageName
)) )
)
} }
fun setProfile(profile: Int) { fun setProfile(profile: Int) {

View file

@ -16,24 +16,20 @@
package com.eurekateam.samsungextras.dolby package com.eurekateam.samsungextras.dolby
import android.content.SharedPreferences
import android.os.Bundle import android.os.Bundle
import android.os.PerformanceHintManager
import android.widget.Switch import android.widget.Switch
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.android.settingslib.widget.MainSwitchPreference import com.android.settingslib.widget.MainSwitchPreference
import com.android.settingslib.widget.OnMainSwitchChangeListener import com.android.settingslib.widget.OnMainSwitchChangeListener
import com.android.settingslib.widget.RadioButtonPreference import com.android.settingslib.widget.RadioButtonPreference
import com.eurekateam.samsungextras.R import com.eurekateam.samsungextras.R
import android.content.SharedPreferences
class DolbyFragment : PreferenceFragmentCompat(), OnMainSwitchChangeListener { class DolbyFragment : PreferenceFragmentCompat(), OnMainSwitchChangeListener {
private lateinit var switchBar: MainSwitchPreference private lateinit var switchBar: MainSwitchPreference
private lateinit var mSharedPreferences : SharedPreferences private lateinit var mSharedPreferences: SharedPreferences
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.dolby_settings) addPreferencesFromResource(R.xml.dolby_settings)
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())

View file

@ -19,7 +19,6 @@ package com.eurekateam.samsungextras.dolby
import android.database.Cursor import android.database.Cursor
import android.database.MatrixCursor import android.database.MatrixCursor
import android.provider.SearchIndexableResource 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_CLASS_NAME
import android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_ICON_RESID 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_ACTION
@ -30,6 +29,7 @@ import android.provider.SearchIndexablesContract.COLUMN_INDEX_XML_RES_RESID
import android.provider.SearchIndexablesContract.INDEXABLES_RAW_COLUMNS import android.provider.SearchIndexablesContract.INDEXABLES_RAW_COLUMNS
import android.provider.SearchIndexablesContract.INDEXABLES_XML_RES_COLUMNS import android.provider.SearchIndexablesContract.INDEXABLES_XML_RES_COLUMNS
import android.provider.SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS import android.provider.SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS
import android.provider.SearchIndexablesProvider
import com.eurekateam.samsungextras.R import com.eurekateam.samsungextras.R
class DolbySearchIndexablesProvider : SearchIndexablesProvider() { class DolbySearchIndexablesProvider : SearchIndexablesProvider() {

View file

@ -18,9 +18,7 @@ package com.eurekateam.samsungextras.dolby
import android.service.quicksettings.Tile import android.service.quicksettings.Tile
import android.service.quicksettings.TileService import android.service.quicksettings.TileService
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.eurekateam.samsungextras.dolby.DolbyFragment.Companion.PREF_DOLBY_ENABLE import com.eurekateam.samsungextras.dolby.DolbyFragment.Companion.PREF_DOLBY_ENABLE
class DolbyTile : TileService() { class DolbyTile : TileService() {

View file

@ -16,10 +16,10 @@
package com.eurekateam.samsungextras.flashlight package com.eurekateam.samsungextras.flashlight
import android.R.id.content import android.R.id.content
import android.R.id.home
import android.os.Bundle import android.os.Bundle
import android.view.MenuItem import android.view.MenuItem
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import android.R.id.home
class FlashLightActivity : FragmentActivity() { class FlashLightActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {

View file

@ -15,20 +15,19 @@
*/ */
package com.eurekateam.samsungextras.flashlight package com.eurekateam.samsungextras.flashlight
import android.content.SharedPreferences
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.PerformanceHintManager
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import android.content.SharedPreferences
import com.eurekateam.samsungextras.R import com.eurekateam.samsungextras.R
import com.eurekateam.samsungextras.interfaces.Flashlight import com.eurekateam.samsungextras.interfaces.Flashlight
import com.eurekateam.samsungextras.preferences.CustomSeekBarPreference import com.eurekateam.samsungextras.preferences.CustomSeekBarPreference
class FlashLightFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener { class FlashLightFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener {
private lateinit var mFlashLightPref: CustomSeekBarPreference private lateinit var mFlashLightPref: CustomSeekBarPreference
private lateinit var mSharedPreferences : SharedPreferences private lateinit var mSharedPreferences: SharedPreferences
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.flashlight_settings) addPreferencesFromResource(R.xml.flashlight_settings)
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())

View file

@ -78,8 +78,11 @@ open class FPSInfoService : Service() {
val y = mPaddingTop - mAscent.toInt() val y = mPaddingTop - mAscent.toInt()
val s = fPSInfoString val s = fPSInfoString
canvas.drawText( canvas.drawText(
s, (LEFT - mPaddingLeft - mMaxWidth).toFloat(), ( s, (LEFT - mPaddingLeft - mMaxWidth).toFloat(),
y - 1).toFloat(), mOnlinePaint (
y - 1
).toFloat(),
mOnlinePaint
) )
} }
@ -239,11 +242,11 @@ open class FPSInfoService : Service() {
mCurFPSThread = null mCurFPSThread = null
} }
fun getRunning() : Boolean{ fun getRunning(): Boolean {
return mRunning return mRunning
} }
companion object { companion object {
private var surfaceFlingerFPS: SurfaceFlingerFPS? = null private var surfaceFlingerFPS: SurfaceFlingerFPS? = null
private var mRunning : Boolean = false private var mRunning: Boolean = false
} }
} }

View file

@ -21,7 +21,7 @@ import android.service.quicksettings.TileService
// TODO: Add FPS drawables // TODO: Add FPS drawables
class FPSTileService : TileService() { class FPSTileService : TileService() {
private lateinit var fpsinfo : Intent private lateinit var fpsinfo: Intent
private var isShowing = false private var isShowing = false
override fun onStartListening() { override fun onStartListening() {
super.onStartListening() super.onStartListening()

View file

@ -34,13 +34,18 @@ import androidx.preference.PreferenceViewHolder
import androidx.preference.R import androidx.preference.R
open class CustomSeekBarPreference @JvmOverloads constructor( open class CustomSeekBarPreference @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = TypedArrayUtils.getAttr( context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = TypedArrayUtils.getAttr(
context, context,
R.attr.preferenceStyle, R.attr.preferenceStyle,
android.R.attr.preferenceStyle android.R.attr.preferenceStyle
), defStyleRes: Int = 0 ),
) : Preference(context, attrs, defStyleAttr, defStyleRes), OnSeekBarChangeListener, defStyleRes: Int = 0
View.OnClickListener, OnLongClickListener { ) : Preference(context, attrs, defStyleAttr, defStyleRes),
OnSeekBarChangeListener,
View.OnClickListener,
OnLongClickListener {
private val TAG: String = javaClass.name private val TAG: String = javaClass.name
private var mInterval = 1 private var mInterval = 1
private var mShowSign = false private var mShowSign = false
@ -114,8 +119,10 @@ open class CustomSeekBarPreference @JvmOverloads constructor(
mValueTextView!!.text = context.getString( mValueTextView!!.text = context.getString(
com.eurekateam.samsungextras.R.string.custom_seekbar_value, com.eurekateam.samsungextras.R.string.custom_seekbar_value,
if (!mTrackingTouch || mContinuousUpdates) getTextValue(mValue) + if (!mTrackingTouch || mContinuousUpdates) getTextValue(mValue) +
(if (mDefaultValueExists && mValue == mDefaultValue) " (" + (
context.getString(com.eurekateam.samsungextras.R.string.custom_seekbar_default_value) + ")" else "") else getTextValue( if (mDefaultValueExists && mValue == mDefaultValue) " (" +
context.getString(com.eurekateam.samsungextras.R.string.custom_seekbar_default_value) + ")" else ""
) else getTextValue(
mTrackingValue mTrackingValue
) )
) )
@ -215,7 +222,8 @@ open class CustomSeekBarPreference @JvmOverloads constructor(
if (mMaxValue - mMinValue > mInterval * 2 && mMaxValue + mMinValue < mValue * 2) Math.floorDiv( if (mMaxValue - mMinValue > mInterval * 2 && mMaxValue + mMinValue < mValue * 2) Math.floorDiv(
mMaxValue + mMinValue, mMaxValue + mMinValue,
2 2
) else mMinValue, true ) else mMinValue,
true
) )
} }
com.eurekateam.samsungextras.R.id.plus -> { com.eurekateam.samsungextras.R.id.plus -> {
@ -223,7 +231,8 @@ open class CustomSeekBarPreference @JvmOverloads constructor(
if (mMaxValue - mMinValue > mInterval * 2 && mMaxValue + mMinValue > mValue * 2) -1 * Math.floorDiv( if (mMaxValue - mMinValue > mInterval * 2 && mMaxValue + mMinValue > mValue * 2) -1 * Math.floorDiv(
-1 * (mMaxValue + mMinValue), -1 * (mMaxValue + mMinValue),
2 2
) else mMaxValue, true ) else mMaxValue,
true
) )
} }
} }