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