From: Christian Weiske Date: Tue, 22 Mar 2016 22:36:13 +0000 (+0100) Subject: initial version X-Git-Tag: v1.0.0~12 X-Git-Url: https://git.cweiske.de/headphoneindicator.git/commitdiff_plain/4523cdad91631fa80537560d4f6c532ba6fa265d initial version --- 4523cdad91631fa80537560d4f6c532ba6fa265d 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 0000000..b755b18 Binary files /dev/null and b/res/drawable/headphones.png differ diff --git a/res/drawable/headphones_w.png b/res/drawable/headphones_w.png new file mode 100644 index 0000000..d313c96 Binary files /dev/null and b/res/drawable/headphones_w.png differ 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); + } + } +}