diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml
new file mode 100644
index 0000000..0c0c338
--- /dev/null
+++ b/.idea/deploymentTargetDropDown.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/migrations.xml b/.idea/migrations.xml
new file mode 100644
index 0000000..f8051a6
--- /dev/null
+++ b/.idea/migrations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CatFlipScreen.apk b/CatFlipScreen.apk
index 768e4d7..21d050b 100644
Binary files a/CatFlipScreen.apk and b/CatFlipScreen.apk differ
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 9727fc8..275719f 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -4,6 +4,14 @@ plugins {
}
android {
+ signingConfigs {
+ getByName("debug") {
+ storeFile = file("/home/talmid/Downloads/keystore/platform.keystore")
+ storePassword = "password"
+ keyAlias = "platform"
+ keyPassword = "password"
+ }
+ }
namespace = "net.mezimmah.catflipscreen"
compileSdk = 34
@@ -12,7 +20,7 @@ android {
minSdk = 30
targetSdk = 34
versionCode = 1
- versionName = "1.0"
+ versionName = "1.1"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
@@ -27,6 +35,7 @@ android {
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
+ signingConfig = signingConfigs.getByName("debug")
}
}
compileOptions {
@@ -52,8 +61,8 @@ android {
dependencies {
implementation("androidx.core:core-ktx:1.12.0")
- implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
- implementation("androidx.activity:activity-compose:1.8.1")
+ implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
+ implementation("androidx.activity:activity-compose:1.8.2")
implementation(platform("androidx.compose:compose-bom:2023.03.00"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
@@ -61,7 +70,7 @@ dependencies {
implementation("androidx.compose.material3:material3")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("androidx.preference:preference-ktx:1.2.1")
- implementation("com.google.android.material:material:1.10.0")
+ implementation("com.google.android.material:material:1.11.0")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
diff --git a/app/release/app-release.apk b/app/release/app-release.apk
index 768e4d7..21d050b 100644
Binary files a/app/release/app-release.apk and b/app/release/app-release.apk differ
diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json
index a22ad07..cf1fb1f 100644
--- a/app/release/output-metadata.json
+++ b/app/release/output-metadata.json
@@ -12,7 +12,7 @@
"filters": [],
"attributes": [],
"versionCode": 1,
- "versionName": "1.0",
+ "versionName": "1.1",
"outputFile": "app-release.apk"
}
],
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a80e801..c95d2ed 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,6 +11,9 @@
+
+
+
+
@@ -44,12 +48,10 @@
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
-
android:showOnLockScreen="true"
android:theme="@style/Theme.AppCompat">
-
diff --git a/app/src/main/java/net/mezimmah/catflipscreen/CatFlipScreenApplication.kt b/app/src/main/java/net/mezimmah/catflipscreen/CatFlipScreenApplication.kt
index 7ef62e6..73c9c71 100644
--- a/app/src/main/java/net/mezimmah/catflipscreen/CatFlipScreenApplication.kt
+++ b/app/src/main/java/net/mezimmah/catflipscreen/CatFlipScreenApplication.kt
@@ -28,6 +28,7 @@ class CatFlipScreenApplication : Application() {
const val CHANNEL_NAME = "Auto Start Service Channel"
const val BROADCAST_BATTERY_CHANGED = "BROADCAST_BATTERY_CHANGED"
const val BROADCAST_AUDIO_MODE_CHANGED = "BROADCAST_AUDIO_MODE_CHANGED"
+ const val BROADCAST_TELEPHONY_ACTION = "BROADCAST_TELEPHONY_ACTION"
}
}
\ No newline at end of file
diff --git a/app/src/main/java/net/mezimmah/catflipscreen/FlipScreenService.kt b/app/src/main/java/net/mezimmah/catflipscreen/FlipScreenService.kt
index 5708d4e..40f798e 100644
--- a/app/src/main/java/net/mezimmah/catflipscreen/FlipScreenService.kt
+++ b/app/src/main/java/net/mezimmah/catflipscreen/FlipScreenService.kt
@@ -18,11 +18,11 @@ import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.localbroadcastmanager.content.LocalBroadcastManager
-
class FlipScreenService : Service() {
override fun onBind(intent: Intent): IBinder? {
TODO("Return the communication channel to the service.")
+ @Suppress("UNREACHABLE_CODE")
return null
}
@@ -67,9 +67,9 @@ class FlipScreenService : Service() {
0, notificationIntent, PendingIntent.FLAG_IMMUTABLE
)
val notification: Notification = NotificationCompat.Builder(this, CatFlipScreenApplication.CHANNEL_ID)
- .setContentTitle("Auto Start Service")
+ .setContentTitle("External Screen")
.setContentText(input)
- .setSmallIcon(android.R.drawable.ic_dialog_alert)
+ .setSmallIcon(R.drawable.icons8_phone_50)
.setContentIntent(pendingIntent)
.build()
val mNotificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
@@ -109,8 +109,7 @@ class FlipScreenService : Service() {
} catch (e: Exception) {
Log.w(
"StatusBar",
- "Couldn't show presentation! Display was removed in the meantime.",
- e
+ "Couldn't show presentation! Display was removed in the meantime.", e
)
}
}
diff --git a/app/src/main/java/net/mezimmah/catflipscreen/MainActivity.kt b/app/src/main/java/net/mezimmah/catflipscreen/MainActivity.kt
index 24c2e59..431f2cd 100644
--- a/app/src/main/java/net/mezimmah/catflipscreen/MainActivity.kt
+++ b/app/src/main/java/net/mezimmah/catflipscreen/MainActivity.kt
@@ -2,8 +2,11 @@ package net.mezimmah.catflipscreen
import android.content.Intent
import android.content.SharedPreferences
+import android.content.pm.PackageManager
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.app.ActivityCompat
+import androidx.core.content.ContextCompat
import androidx.preference.PreferenceFragmentCompat
@@ -21,7 +24,27 @@ class MainActivity : AppCompatActivity() {
startForegroundService(Intent(this, FlipScreenService::class.java))
}
+ override fun onResume() {
+ super.onResume()
+ askForPermission(android.Manifest.permission.READ_PHONE_STATE)
+ askForPermission(android.Manifest.permission.READ_CALL_LOG)
+ }
+ private fun askForPermission(permission: String) {
+ @Suppress("DEPRECATED_IDENTITY_EQUALS")
+ if (ContextCompat.checkSelfPermission(this@MainActivity,
+ permission) !==
+ PackageManager.PERMISSION_GRANTED) {
+ if (ActivityCompat.shouldShowRequestPermissionRationale(this@MainActivity,
+ permission)) {
+ ActivityCompat.requestPermissions(this@MainActivity,
+ arrayOf(permission), 1)
+ } else {
+ ActivityCompat.requestPermissions(this@MainActivity,
+ arrayOf(permission), 1)
+ }
+ }
+ }
class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.root_preferences, rootKey)
@@ -36,7 +59,5 @@ class MainActivity : AppCompatActivity() {
preferenceScreen.sharedPreferences
?.registerOnSharedPreferenceChangeListener(this)
}
-
}
-
}
diff --git a/app/src/main/java/net/mezimmah/catflipscreen/MyReceiver.kt b/app/src/main/java/net/mezimmah/catflipscreen/MyReceiver.kt
index 47a5e6a..6ee8a42 100644
--- a/app/src/main/java/net/mezimmah/catflipscreen/MyReceiver.kt
+++ b/app/src/main/java/net/mezimmah/catflipscreen/MyReceiver.kt
@@ -4,14 +4,32 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.Intent.ACTION_BOOT_COMPLETED
+import android.telephony.TelephonyManager
import android.util.Log
+import androidx.localbroadcastmanager.content.LocalBroadcastManager
class MyReceiver : BroadcastReceiver() {
-
override fun onReceive(context: Context, intent: Intent) {
- when (intent.action) {
- ACTION_BOOT_COMPLETED -> startFlipScreenService(context)
+ if (intent.action.equals(ACTION_BOOT_COMPLETED)) {
+ startFlipScreenService(context)
+ return
+ }
+ val state = intent.getStringExtra(TelephonyManager.EXTRA_STATE)
+ when (state) {
+ TelephonyManager.EXTRA_STATE_RINGING -> {
+ val i = Intent(CatFlipScreenApplication.BROADCAST_TELEPHONY_ACTION)
+ @Suppress("DEPRECATION")
+ i.putExtra("number", intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER))
+ LocalBroadcastManager.getInstance(context)
+ .sendBroadcast(i)
+ }
+ TelephonyManager.EXTRA_STATE_IDLE -> {
+ val i = Intent(CatFlipScreenApplication.BROADCAST_TELEPHONY_ACTION)
+ i.putExtra("number", "")
+ LocalBroadcastManager.getInstance(context)
+ .sendBroadcast(i)
+ }
}
}
diff --git a/app/src/main/java/net/mezimmah/catflipscreen/PresentationScreen.kt b/app/src/main/java/net/mezimmah/catflipscreen/PresentationScreen.kt
index 3355205..e91f613 100644
--- a/app/src/main/java/net/mezimmah/catflipscreen/PresentationScreen.kt
+++ b/app/src/main/java/net/mezimmah/catflipscreen/PresentationScreen.kt
@@ -3,6 +3,8 @@ package net.mezimmah.catflipscreen
import android.app.Presentation
import android.content.BroadcastReceiver
import android.content.Context
+import android.content.Context.AUDIO_SERVICE
+import android.content.Context.CONNECTIVITY_SERVICE
import android.content.Intent
import android.content.IntentFilter
import android.media.AudioManager
@@ -15,6 +17,7 @@ import android.os.Bundle
import android.view.Display
import android.view.View
import android.widget.ImageView
+import android.widget.LinearLayout
import android.widget.TextView
import androidx.localbroadcastmanager.content.LocalBroadcastManager
@@ -29,6 +32,9 @@ class PresentationScreen(outerContext: Context?, display: Display?) :
private var networkIconView: ImageView? = null
private var wifiIconView: ImageView? = null
private var audioLevelIconView: ImageView? = null
+ private var missedCallsIconView: ImageView? = null
+ private var telephonyCalling: TextView? = null
+ private var telephonyLayout: LinearLayout? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -52,12 +58,15 @@ class PresentationScreen(outerContext: Context?, display: Display?) :
networkIconView = findViewById(R.id.screen_status_bar_network_signal)
wifiIconView = findViewById(R.id.screen_status_bar_wifi_signal)
audioLevelIconView = findViewById(R.id.screen_status_bar_audio_level)
+ telephonyCalling = findViewById(R.id.screen_telephony_number)
+ telephonyLayout = findViewById(R.id.screen_telephony_calling_layout)
+ missedCallsIconView = findViewById(R.id.screen_status_bar_missed_calls)
}
private fun getSystemServices() {
- am = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager?
+ am = context.getSystemService(AUDIO_SERVICE) as AudioManager?
connectivityManager =
- context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+ context.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
}
private fun registerReceivers() {
@@ -71,6 +80,9 @@ class PresentationScreen(outerContext: Context?, display: Display?) :
CatFlipScreenApplication.BROADCAST_AUDIO_MODE_CHANGED -> {
updateAudioMode()
}
+ CatFlipScreenApplication.BROADCAST_TELEPHONY_ACTION -> {
+ updateCallStatus(intent)
+ }
}
}
}
@@ -78,6 +90,8 @@ class PresentationScreen(outerContext: Context?, display: Display?) :
.registerReceiver(broadCastReceiver, IntentFilter(CatFlipScreenApplication.BROADCAST_BATTERY_CHANGED))
LocalBroadcastManager.getInstance(context)
.registerReceiver(broadCastReceiver, IntentFilter(CatFlipScreenApplication.BROADCAST_AUDIO_MODE_CHANGED))
+ LocalBroadcastManager.getInstance(context)
+ .registerReceiver(broadCastReceiver, IntentFilter(CatFlipScreenApplication.BROADCAST_TELEPHONY_ACTION))
// Register receiver for the network updates
val networkRequest = NetworkRequest.Builder()
@@ -170,4 +184,10 @@ class PresentationScreen(outerContext: Context?, display: Display?) :
}
}
}
+
+ private fun updateCallStatus(intent: Intent) {
+ val number = intent.getStringExtra("number")
+ telephonyCalling?.text = number
+ telephonyLayout?.visibility = if (number.isNullOrBlank()) View.INVISIBLE else View.VISIBLE
+ }
}
diff --git a/app/src/main/res/drawable/icons8_incoming_call_50.png b/app/src/main/res/drawable/icons8_incoming_call_50.png
new file mode 100644
index 0000000..939cb99
Binary files /dev/null and b/app/src/main/res/drawable/icons8_incoming_call_50.png differ
diff --git a/app/src/main/res/drawable/icons8_missed_call_64.png b/app/src/main/res/drawable/icons8_missed_call_64.png
new file mode 100644
index 0000000..cb8a5bb
Binary files /dev/null and b/app/src/main/res/drawable/icons8_missed_call_64.png differ
diff --git a/app/src/main/res/drawable/icons8_phone_50.png b/app/src/main/res/drawable/icons8_phone_50.png
new file mode 100644
index 0000000..d121686
Binary files /dev/null and b/app/src/main/res/drawable/icons8_phone_50.png differ
diff --git a/app/src/main/res/layout/layout_screen.xml b/app/src/main/res/layout/layout_screen.xml
index d4ee3ec..0477182 100644
--- a/app/src/main/res/layout/layout_screen.xml
+++ b/app/src/main/res/layout/layout_screen.xml
@@ -1,5 +1,6 @@
+
@@ -80,4 +90,31 @@
android:textColor="@color/white"
android:textSize="10sp" />
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/settings_activity.xml b/app/src/main/res/layout/settings_activity.xml
index de6591a..3663af7 100644
--- a/app/src/main/res/layout/settings_activity.xml
+++ b/app/src/main/res/layout/settings_activity.xml
@@ -5,5 +5,6 @@
+ android:layout_height="match_parent" >
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c4c2caa..a0c3d82 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -21,6 +21,7 @@
Turn on your external screen, this will restart your phone
%
Audio Level Icon
+ Missed Calls Icon
Wifi Signal Icon
Network Signal Icon
Battery Status Icon
diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml
index 927a8c8..b7c7544 100644
--- a/app/src/main/res/xml/root_preferences.xml
+++ b/app/src/main/res/xml/root_preferences.xml
@@ -21,7 +21,7 @@
+ app:title=""
+ app:summary="In order for this app to work properly please enable all permissions in the app settings." />
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index 5873551..f09cb3b 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,5 +1,5 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
- id("com.android.application") version "8.1.4" apply false
+ id("com.android.application") version "8.2.2" apply false
id("org.jetbrains.kotlin.android") version "1.8.10" apply false
}
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 798f570..f3cf832 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Wed Nov 22 10:46:25 EST 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists