From 4523cdad91631fa80537560d4f6c532ba6fa265d Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Tue, 22 Mar 2016 23:36:13 +0100 Subject: [PATCH] initial version --- .gitignore | 9 +++ .idea/.name | 1 + .idea/compiler.xml | 22 ++++++ .idea/copyright/profiles_settings.xml | 3 + .idea/gradle.xml | 18 +++++ .idea/misc.xml | 46 ++++++++++++ .idea/modules.xml | 8 ++ .idea/runConfigurations.xml | 12 +++ .idea/vcs.xml | 6 ++ AndroidManifest.xml | 29 ++++++++ build.gradle | 43 +++++++++++ headphones.svg | 70 ++++++++++++++++++ headphones_w.svg | 61 +++++++++++++++ res/drawable/headphones.png | Bin 0 -> 753 bytes res/drawable/headphones_w.png | Bin 0 -> 811 bytes res/layout/activity_main.xml | 28 +++++++ res/values/strings.xml | 5 ++ settings.gradle | 1 + .../cweiske/headphoneindicator/Autostart.java | 18 +++++ .../headphoneindicator/BackgroundService.java | 39 ++++++++++ .../headphoneindicator/MainActivity.java | 65 ++++++++++++++++ .../NotificationReceiver.java | 41 ++++++++++ 22 files changed, 525 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/vcs.xml create mode 100644 AndroidManifest.xml create mode 100644 build.gradle create mode 100644 headphones.svg create mode 100644 headphones_w.svg create mode 100644 res/drawable/headphones.png create mode 100644 res/drawable/headphones_w.png create mode 100644 res/layout/activity_main.xml create mode 100644 res/values/strings.xml create mode 100644 settings.gradle create mode 100644 src/de/cweiske/headphoneindicator/Autostart.java create mode 100644 src/de/cweiske/headphoneindicator/BackgroundService.java create mode 100644 src/de/cweiske/headphoneindicator/MainActivity.java create mode 100644 src/de/cweiske/headphoneindicator/NotificationReceiver.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2ae6c0c --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +/gen diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..bdc75f7 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +HeadphoneIndicator \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..288ea0b --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..1a3eaff --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..0837d2f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..6564d52 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000..278e85a --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..27796ac --- /dev/null +++ b/build.gradle @@ -0,0 +1,43 @@ +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.5.0' + } +} + +apply plugin: 'com.android.application' + +android { + compileSdkVersion 19 + buildToolsVersion "23.0.2" + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['res'] + } + } + defaultConfig { + applicationId "de.cweiske.headphoneindicator" + minSdkVersion 19 + targetSdkVersion 19 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + } + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/headphones.svg b/headphones.svg new file mode 100644 index 0000000..b6366e4 --- /dev/null +++ b/headphones.svg @@ -0,0 +1,70 @@ + + + + + + + + + + +image/svg+xmlOpenclipart diff --git a/headphones_w.svg b/headphones_w.svg new file mode 100644 index 0000000..4cd58cf --- /dev/null +++ b/headphones_w.svg @@ -0,0 +1,61 @@ + + + +image/svg+xmlOpenclipart \ No newline at end of file diff --git a/res/drawable/headphones.png b/res/drawable/headphones.png new file mode 100644 index 0000000000000000000000000000000000000000..b755b1868d29ac972ecdf85ab9212aa755c580e7 GIT binary patch literal 753 zcmV?AJ^}B62f))L4MII|6IcZNkk6v@so!t$7lEZRgqzQja9CeL zb--QVN|E1Q1CN0`@Il_S0;hlrKu?iApm1q-vhLSGH?XwH*%GBi{jgjCEG8WN}^d#ztw;eu*-t@u7KF9 zqOEzaN-1BWhV8aspu2>IylCAe{#S@1JP8JT(YnLLbjVwTq!{o;GXMi+T!SRZfDa6K zz!2_Y$OAeZHqhx=-rplXFFXp@d#+;H17138;FSj~xNHER5%}!jHu?={^5j$-b#U~r z8yPFN9GZbUL7gwj)Fjow3WZNtJMw&ux4=E%i!7}=>G+JoW$q*5{|K=qCFQ2n!pp#n j=(-BLAVrE4DH4PK7-}|R*U6Rt00000NkvXXu0mjf;1fhH literal 0 HcmV?d00001 diff --git a/res/drawable/headphones_w.png b/res/drawable/headphones_w.png new file mode 100644 index 0000000000000000000000000000000000000000..d313c964087b0fe17a7be0f9e024b8eafbab3a60 GIT binary patch literal 811 zcmV+`1JwM9P)bW{jRsKJ};Z=y0R*D%x+SkGnuETpi|ICbU;C-vh%)8(DzB^~`J!c*iQA81m zhJ{Hc=`7F-oC1ymC;VHVfX~1OV93l~7t9Jss+4p?(u}r`8GlaYev9vxG^^cXR#JED zDJ1C#a1XeY<@Pl20>}U#{cAPAN#Fv|nq|%tpwG;H$Fb^VlEwlnxhiQ;QsXw}H%Pi8 z>2H8zOj23Y;>#tC2Liv7)V2$*R!P$Vu5n4_Q5qNt1bimx;2!u&B|Q#sjzlHCKM?4t zq|y+0OC&uCaQBBTzE;w*6X1=c10nL4NP6Y)FH5Qo)4;Gp{!3C_1W&j|(vlNrI4t5i zNox-Al?dOlJ}1svC=2Cpj~mE@nL1fwd6M2c@do!wSRrY}A-opDIWyqITai?;7qTvg zY$@`CW5Q;jK|DuCGzsv><{oVhlU*+IOmKa_n{<7HP z0Zj=u(BuK>1RF?uz-)pI%z40Mf(=Z0z}uu7cmT{LQ2ab_-!rqHz(4{GTs5X literal 0 HcmV?d00001 diff --git a/res/layout/activity_main.xml b/res/layout/activity_main.xml new file mode 100644 index 0000000..6677691 --- /dev/null +++ b/res/layout/activity_main.xml @@ -0,0 +1,28 @@ + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml new file mode 100644 index 0000000..a5ea8fe --- /dev/null +++ b/res/values/strings.xml @@ -0,0 +1,5 @@ + + Headphone indicator + Headphones are plugged in + Headphones are NOT plugged in + diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..fddff8a --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include ':' diff --git a/src/de/cweiske/headphoneindicator/Autostart.java b/src/de/cweiske/headphoneindicator/Autostart.java new file mode 100644 index 0000000..200112d --- /dev/null +++ b/src/de/cweiske/headphoneindicator/Autostart.java @@ -0,0 +1,18 @@ +package de.cweiske.headphoneindicator; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +/** + * Called when the phone finishes booting. + * + * @author Christian Weiske, cweiske@cweiske.de + */ +public class Autostart extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + context.startService(new Intent(context, BackgroundService.class)); + } +} diff --git a/src/de/cweiske/headphoneindicator/BackgroundService.java b/src/de/cweiske/headphoneindicator/BackgroundService.java new file mode 100644 index 0000000..43e8972 --- /dev/null +++ b/src/de/cweiske/headphoneindicator/BackgroundService.java @@ -0,0 +1,39 @@ +package de.cweiske.headphoneindicator; + +import android.app.Service; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.IBinder; + +/** + * Permanent service that runs even when the app itself is stopped + * + * @author Christian Weiske, cweiske@cweiske.de + */ +public class BackgroundService extends Service +{ + protected NotificationReceiver notificationReceiver; + + @Override + public void onCreate() { + super.onCreate(); + IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); + this.notificationReceiver = new NotificationReceiver(); + registerReceiver(this.notificationReceiver, filter); + } + + @Override + public void onDestroy() { + unregisterReceiver(this.notificationReceiver); + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + return START_STICKY; + } +} diff --git a/src/de/cweiske/headphoneindicator/MainActivity.java b/src/de/cweiske/headphoneindicator/MainActivity.java new file mode 100644 index 0000000..b92d3ef --- /dev/null +++ b/src/de/cweiske/headphoneindicator/MainActivity.java @@ -0,0 +1,65 @@ +package de.cweiske.headphoneindicator; + +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.widget.ImageView; +import android.widget.TextView; + +/** + * Shows headphone icon and text, and starts the background service + * + * @author Christian Weiske, cweiske@cweiske.de + */ +public class MainActivity extends Activity { + BroadcastReceiver headsetPlugReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + Bundle extras = intent.getExtras(); + if (extras == null) { + return; + } + if (extras.getInt("state") == 1) { + setPlugged(true); + } else { + setPlugged(false); + } + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + startService(new Intent(this, BackgroundService.class)); + } + + @Override + protected void onResume() { + super.onResume(); + IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); + registerReceiver(this.headsetPlugReceiver, filter); + } + + @Override + protected void onPause() { + super.onPause(); + this.unregisterReceiver(this.headsetPlugReceiver); + } + + public void setPlugged(boolean plugged) + { + ImageView view = (ImageView) findViewById(R.id.image); + TextView label = (TextView) findViewById(R.id.label); + if (plugged) { + view.setImageResource(R.drawable.headphones_w); + label.setText(R.string.plugged); + } else { + view.setImageResource(0); + label.setText(R.string.unplugged); + } + } +} diff --git a/src/de/cweiske/headphoneindicator/NotificationReceiver.java b/src/de/cweiske/headphoneindicator/NotificationReceiver.java new file mode 100644 index 0000000..ff0d4a8 --- /dev/null +++ b/src/de/cweiske/headphoneindicator/NotificationReceiver.java @@ -0,0 +1,41 @@ +package de.cweiske.headphoneindicator; + +import android.app.Notification; +import android.app.NotificationManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; + +/** + * Shows and hides the status bar notification. + * + * @author Christian Weiske, cweiske@cweiske.de + */ +public class NotificationReceiver extends BroadcastReceiver { + static int NOT_ID = 1; + + @Override + public void onReceive(Context context, Intent intent) { + Bundle extras = intent.getExtras(); + if (extras == null) { + return; + } + + NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + if (extras.getInt("state") == 1) { + //plugged + nm.notify( + NOT_ID, + new Notification.Builder(context) + .setSmallIcon(R.drawable.headphones_w) + .setContentTitle(context.getResources().getString(R.string.plugged)) + .setContentText("") + .build() + ); + } else { + //unplugged + nm.cancel(NOT_ID); + } + } +} -- 2.30.2