diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index da0dfc6..412ab32 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -34,18 +34,21 @@
-
-
-
+
+
+
+
+
+
+
diff --git a/app/src/main/java/com/flywithu/carnav/AlarmReceiver.java b/app/src/main/java/com/flywithu/carnav/AlarmReceiver.java
deleted file mode 100644
index bd91f22..0000000
--- a/app/src/main/java/com/flywithu/carnav/AlarmReceiver.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.flywithu.carnav;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Build;
-
-public class AlarmReceiver extends BroadcastReceiver{
-
- @Override
- public void onReceive(Context context, Intent intent) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- Intent in = new Intent(context, RestartService.class);
- context.startForegroundService(in);
- } else {
- Intent in = new Intent(context, RealService.class);
- context.startService(in);
- }
- }
-
-}
diff --git a/app/src/main/java/com/flywithu/carnav/MainActivity.java b/app/src/main/java/com/flywithu/carnav/MainActivity.java
index f7358ac..14a9ec1 100644
--- a/app/src/main/java/com/flywithu/carnav/MainActivity.java
+++ b/app/src/main/java/com/flywithu/carnav/MainActivity.java
@@ -8,15 +8,18 @@ import android.content.IntentFilter;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
+import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.app.NotificationManagerCompat;
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;
import java.util.List;
+import java.util.Set;
public class MainActivity extends AppCompatActivity {
@@ -41,12 +44,41 @@ public class MainActivity extends AppCompatActivity {
}
+
+ private boolean isNotiPermissionAllowed() {
+ Set notiListenerSet = NotificationManagerCompat.getEnabledListenerPackages(this);
+ String myPackageName = getPackageName();
+
+ for (String packageName : notiListenerSet) {
+ if (packageName == null) {
+ continue;
+ }
+ if (packageName.equals(myPackageName)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
+ boolean isPermissionAllowed = isNotiPermissionAllowed();
+
+ if (!isPermissionAllowed) {
+ Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
+ startActivity(intent);
+ } else {
+ ((TextView) findViewById(R.id.textViewNotificationStatus)).setText((isNotiPermissionAllowed()) ? "OK" : "NO");
+ }
+
+
+
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
List availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
if (!availableDrivers.isEmpty()) {
@@ -99,11 +131,9 @@ public class MainActivity extends AppCompatActivity {
UsbSerialPort sPort = null;
sPort = driver.getPorts().get(0);
sPort.open(connection);
- Toast.makeText(getApplicationContext(), "Serial Count:" + String.valueOf(driver.getPorts().size()), Toast.LENGTH_LONG).show();
+ Toast.makeText(getApplicationContext(), "Serial Count:" + driver.getPorts().size(), Toast.LENGTH_LONG).show();
sPort.close();
- sPort = null;
-
goService();
}
diff --git a/app/src/main/java/com/flywithu/carnav/MusicTitle.java b/app/src/main/java/com/flywithu/carnav/MusicTitle.java
index 927eced..f551086 100644
--- a/app/src/main/java/com/flywithu/carnav/MusicTitle.java
+++ b/app/src/main/java/com/flywithu/carnav/MusicTitle.java
@@ -43,7 +43,7 @@ public class MusicTitle {
}
public int getTotal() {
- return 100;
+ return (total > 0) ? this.total : 100;
}
//public void setTotal(int total) {
@@ -54,11 +54,13 @@ public class MusicTitle {
return position;
}
- public void setPosition(int position) {
- this.position = position;
+ public void setTotal(int total) {
+ this.total = total;
}
-
+ public void setPosition(long position) {
+ this.position = (int) position;
+ }
public String getArtist() {
if(artist == null)
diff --git a/app/src/main/java/com/flywithu/carnav/NotificationListenerMusic.java b/app/src/main/java/com/flywithu/carnav/NotificationListenerMusic.java
new file mode 100644
index 0000000..0bd8cec
--- /dev/null
+++ b/app/src/main/java/com/flywithu/carnav/NotificationListenerMusic.java
@@ -0,0 +1,143 @@
+package com.flywithu.carnav;
+
+import android.annotation.TargetApi;
+import android.app.Notification;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.media.MediaMetadata;
+import android.media.session.MediaController;
+import android.media.session.MediaSession;
+import android.media.session.MediaSessionManager;
+import android.media.session.PlaybackState;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.service.notification.NotificationListenerService;
+import android.service.notification.StatusBarNotification;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+
+import java.util.Arrays;
+import java.util.List;
+
+@TargetApi(21)
+public class NotificationListenerMusic extends NotificationListenerService {
+ String[] musicAppFilter = {"com.iloen.melon", "skplanet.musicmate"};
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ ComponentName componentName = new ComponentName(this, getClass());
+ MediaSessionManager manager = (MediaSessionManager) this.getSystemService(Context.MEDIA_SESSION_SERVICE);
+
+ manager.addOnActiveSessionsChangedListener(new MediaSessionManager.OnActiveSessionsChangedListener() {
+ @Override
+ public void onActiveSessionsChanged(@Nullable List controllers) {
+ for (MediaController controller : controllers) {
+ if (controllers != null) {
+ try {
+
+ controller.registerCallback(new MediaController.Callback() {
+ MusicTitle currentSong = new MusicTitle();
+
+ private Intent getMusicIntent() {
+ Intent music = new Intent("com.flywithu.carnav.metachanged");
+ music.putExtra("artist", currentSong.getArtist());
+ music.putExtra("album", currentSong.getAlbum());
+ music.putExtra("track", currentSong.getTrack());
+ music.putExtra("playstate", currentSong.isRunning());
+ music.putExtra("position", currentSong.getPosition());
+ music.putExtra("total", currentSong.getTotal());
+
+ return music;
+ }
+
+ @Override
+ public void onQueueChanged(List queue) {
+ currentSong.setTotal(queue.size());
+ }
+
+ @Override
+ public void onPlaybackStateChanged(@Nullable PlaybackState state) {
+ super.onPlaybackStateChanged(state);
+ currentSong.setRunning(state.getState() == PlaybackState.STATE_PLAYING);
+ currentSong.setPosition(state.getActiveQueueItemId());
+ Log.d("NotificationMusic", "Playback");
+ if (currentSong.getAlbum() != null) {
+ sendBroadcast(getMusicIntent());
+ }
+ }
+
+ @Override
+ public void onMetadataChanged(MediaMetadata metadata) {
+ super.onMetadataChanged(metadata);
+ currentSong.setArtist(metadata.getString(MediaMetadata.METADATA_KEY_ARTIST));
+ currentSong.setTrack(metadata.getString(MediaMetadata.METADATA_KEY_TITLE));
+ currentSong.setAlbum(metadata.getString(MediaMetadata.METADATA_KEY_ALBUM));
+
+
+ sendBroadcast(getMusicIntent());
+ }
+ });
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }, componentName);
+
+ return super.onBind(intent);
+ }
+
+
+ private void checkMusicStatus() {
+ StatusBarNotification[] activeNotifications = getActiveNotifications();
+ for (StatusBarNotification noti : activeNotifications) {
+ if (Arrays.asList(musicAppFilter).contains(noti.getPackageName())) {
+ Notification mytest = noti.getNotification();
+
+ Bundle extras = noti.getNotification().extras;
+
+
+ for (String a : extras.keySet()) {
+ Object value = extras.get(a);
+ if (value instanceof Boolean) {
+ Log.d("NotificationListener", "KEY:" + extras.getBoolean(a));
+ } else if (value instanceof Integer) {
+ Log.d("NotificationListener", "KEY:" + extras.getInt(a));
+ } else {
+ Log.d("NotificationListener", "KEY:" + a + "/" + extras.getString(a));
+ }
+
+ }
+// CharSequence title = extras.getString(Notification.EXTRA_TITLE);
+// CharSequence artist = extras.getCharSequence(Notification.EXTRA_TEXT);
+// Log.d("NotificationListener","NAME:"+noti.getPackageName());
+// Log.i("NotificationListener", "[snowdeer] title:" + title);
+// Log.i("NotificationListener", "[snowdeer] artist:" + artist);
+
+ }
+
+
+ // Log.d("TAG",noti.getNotification().getGroup());
+
+ }
+
+
+ }
+
+ @Override
+ public void onNotificationPosted(StatusBarNotification sbn) {
+ checkMusicStatus();
+
+ }
+
+ @Override
+ public void onNotificationRemoved(StatusBarNotification sbn) {
+ checkMusicStatus();
+ }
+
+
+}
diff --git a/app/src/main/java/com/flywithu/carnav/RealService.java b/app/src/main/java/com/flywithu/carnav/RealService.java
index 33b5eed..667b847 100644
--- a/app/src/main/java/com/flywithu/carnav/RealService.java
+++ b/app/src/main/java/com/flywithu/carnav/RealService.java
@@ -1,7 +1,9 @@
package com.flywithu.carnav;
-import android.app.AlarmManager;
import android.app.Application;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
@@ -10,12 +12,15 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
+import androidx.core.app.NotificationCompat;
+
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;
@@ -24,7 +29,6 @@ import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
-import java.util.Calendar;
import java.util.Date;
import java.util.List;
@@ -34,6 +38,7 @@ public class RealService extends Service {
private static UsbSerialPort sPort = null;
private MusicTitle currentSong = new MusicTitle();
+ Boolean oldmethod = true;
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
@@ -50,27 +55,60 @@ public class RealService extends Service {
}
String action = intent.getAction();
- String cmd = intent.getStringExtra("command");
- Log.v("MUSIC ", action + " / " + cmd);
- String artist = intent.getStringExtra("artist");
- String album = intent.getStringExtra("album");
- String track = intent.getStringExtra("track");
- Long myPosition = intent.getLongExtra("id", 1);
- Log.v("MUSIC", artist + ":" + album + ":" + track);
- boolean isRunning = intent.getBooleanExtra("playstate", false) | intent.getBooleanExtra("playing", false);
-
- currentSong.setRunning(isRunning);
-
- if (isRunning == true) {
- currentSong.setAlbum(album);
- currentSong.setArtist(artist);
- currentSong.setTrack(track);
- currentSong.setPosition(myPosition.intValue());
+ if (action.startsWith("com.flywithu")) {
+ oldmethod = false;
}
+ if (oldmethod == true) {
+ String cmd = intent.getStringExtra("command");
+ Log.v("MUSIC ", action + " / " + cmd);
+ String artist = intent.getStringExtra("artist");
+ String album = intent.getStringExtra("album");
+ String track = intent.getStringExtra("track");
+ Long myPosition = intent.getLongExtra("id", 1);
+ Log.v("MUSIC", artist + ":" + album + ":" + track);
+ boolean isRunning = intent.getBooleanExtra("playstate", false) | intent.getBooleanExtra("playing", false);
+ currentSong.setRunning(isRunning);
+
+ if (isRunning == true) {
+ currentSong.setAlbum(album);
+ currentSong.setArtist(artist);
+ currentSong.setTrack(track);
+ currentSong.setPosition(myPosition.intValue());
+ }
+ } else {
+ currentSong.setAlbum(intent.getStringExtra("album"));
+ currentSong.setArtist(intent.getStringExtra("artist"));
+ currentSong.setTrack(intent.getStringExtra("track"));
+ currentSong.setPosition(0);
+
+
+ }
+
+
}
};
+ private void setNotification() {
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "default");
+ builder.setSmallIcon(R.mipmap.ic_launcher);
+ builder.setContentTitle(null);
+ builder.setContentText(null);
+ Intent notificationIntent = new Intent(this, MainActivity.class);
+ PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
+ builder.setContentIntent(pendingIntent);
+
+ NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ manager.createNotificationChannel(new NotificationChannel("default", "기본 채널", NotificationManager.IMPORTANCE_NONE));
+ }
+
+ Notification notification = builder.build();
+ startForeground(9, notification);
+
+
+ }
+
public RealService() {
}
@@ -195,6 +233,9 @@ public class RealService extends Service {
iF.addAction("com.android.music.playstatechanged");
iF.addAction("com.android.music.playbackcomplete");
iF.addAction("com.android.music.queuechanged");
+ iF.addAction("com.flywithu.carnav.metachanged");
+
+
registerReceiver(mReceiver, iF);
@@ -243,7 +284,7 @@ public class RealService extends Service {
}).start();
- return START_NOT_STICKY;
+ return START_STICKY;
}
@Override
@@ -256,7 +297,6 @@ public class RealService extends Service {
showToast(getApplication(), "stop Error");
}
serviceIntent = null;
- setAlarmTimer();
Thread.currentThread().interrupt();
unregisterReceiver(mReceiver);
showToast(getApplication(), "stop Service");
@@ -266,6 +306,10 @@ public class RealService extends Service {
@Override
public void onCreate() {
super.onCreate();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ setNotification();
+
+ }
}
@Override
@@ -288,16 +332,7 @@ public class RealService extends Service {
});
}
- protected void setAlarmTimer() {
- final Calendar c = Calendar.getInstance();
- c.setTimeInMillis(System.currentTimeMillis());
- c.add(Calendar.SECOND, 1);
- Intent intent = new Intent(this, AlarmReceiver.class);
- PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
- AlarmManager mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- mAlarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), sender);
- }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/flywithu/carnav/RebootReceiver.java b/app/src/main/java/com/flywithu/carnav/RebootReceiver.java
index 24b539e..e4749e8 100644
--- a/app/src/main/java/com/flywithu/carnav/RebootReceiver.java
+++ b/app/src/main/java/com/flywithu/carnav/RebootReceiver.java
@@ -10,7 +10,7 @@ public class RebootReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- Intent in = new Intent(context, RestartService.class);
+ Intent in = new Intent(context, RealService.class);
context.startForegroundService(in);
} else {
Intent in = new Intent(context, RealService.class);
diff --git a/app/src/main/java/com/flywithu/carnav/RestartService.java b/app/src/main/java/com/flywithu/carnav/RestartService.java
deleted file mode 100644
index cf5bc96..0000000
--- a/app/src/main/java/com/flywithu/carnav/RestartService.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.flywithu.carnav;
-
-import android.app.Notification;
-import android.app.NotificationChannel;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.Intent;
-import android.os.Build;
-import android.os.IBinder;
-
-import androidx.core.app.NotificationCompat;
-
-public class RestartService extends Service {
- public RestartService() {
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "default");
- builder.setSmallIcon(R.mipmap.ic_launcher);
- builder.setContentTitle(null);
- builder.setContentText(null);
- Intent notificationIntent = new Intent(this, MainActivity.class);
- PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
- builder.setContentIntent(pendingIntent);
-
- NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- manager.createNotificationChannel(new NotificationChannel("default", "기본 채널", NotificationManager.IMPORTANCE_NONE));
- }
-
- Notification notification = builder.build();
- startForeground(9, notification);
-
- /////////////////////////////////////////////////////////////////////
- Intent in = new Intent(this, RealService.class);
- startService(in);
-
- stopForeground(true);
- stopSelf();
-
- return START_NOT_STICKY;
- }
-
-
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
-
- @Override
- public boolean onUnbind(Intent intent) {
- return super.onUnbind(intent);
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index ca0c0de..840012f 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,18 +1,40 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index b40cc17..9b385a6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,7 +7,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.5.0'
+ classpath 'com.android.tools.build:gradle:3.5.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files