From 0625baf5ec5a5fabe49d321b0e9af0ca7381f300 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Thu, 25 Oct 2018 13:42:46 +0300 Subject: [PATCH] new notification compat for persisnent notification --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 6 +- .../activities/MainActivity.java | 8 +- .../activities/RecordingActivity.java | 18 ++- .../audiorecorder/app/AudioApplication.java | 2 + .../services/RecordingService.java | 33 +++-- app/src/main/res/layout/remoteview_header.xml | 135 ++++++++++++++++++ 7 files changed, 169 insertions(+), 35 deletions(-) create mode 100644 app/src/main/res/layout/remoteview_header.xml diff --git a/app/build.gradle b/app/build.gradle index 9df2ffb..e14be1c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,5 +57,5 @@ android { dependencies { testImplementation 'junit:junit:4.12' - implementation 'com.github.axet:android-audio-library:1.0.127' // implementation project(':android-audio-library') + implementation 'com.github.axet:android-audio-library:1.0.129' // implementation project(':android-audio-library') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8527b14..23cd998 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,6 +35,7 @@ + @@ -75,7 +76,6 @@ android:name="com.github.axet.androidlibrary.services.StorageProvider" android:authorities="com.github.axet.audiorecorder" android:exported="false" - android:grantUriPermissions="true"> + android:grantUriPermissions="true" /> - - + \ No newline at end of file diff --git a/app/src/main/java/com/github/axet/audiorecorder/activities/MainActivity.java b/app/src/main/java/com/github/axet/audiorecorder/activities/MainActivity.java index e0aa11c..6ecfde2 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/activities/MainActivity.java +++ b/app/src/main/java/com/github/axet/audiorecorder/activities/MainActivity.java @@ -131,9 +131,8 @@ public class MainActivity extends AppCompatThemeActivity { getMenuInflater().inflate(R.menu.menu_main, menu); KeyguardManager myKM = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); - if (myKM.inKeyguardRestrictedInputMode()) { + if (myKM.inKeyguardRestrictedInputMode()) menu.findItem(R.id.action_settings).setVisible(false); - } MenuItem item = menu.findItem(R.id.action_show_folder); Intent intent = StorageProvider.getProvider().openFolderIntent(storage.getStoragePath()); @@ -202,11 +201,6 @@ public class MainActivity extends AppCompatThemeActivity { final SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(this); - if (shared.getBoolean(AudioApplication.PREFERENCE_CONTROLS, false)) - showLocked(getWindow()); - else - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); - invalidateOptionsMenu(); // update storage folder intent try { diff --git a/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java b/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java index 5e9b7ba..19642ce 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java +++ b/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java @@ -119,10 +119,10 @@ public class RecordingActivity extends AppCompatThemeActivity { MediaSessionCompat msc; public static void startActivity(Context context, boolean pause) { + Log.d(TAG, "startActivity"); Intent i = new Intent(context, RecordingActivity.class); - if (pause) { + if (pause) i.setAction(RecordingActivity.START_PAUSE); - } i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); context.startActivity(i); @@ -277,6 +277,7 @@ public class RecordingActivity extends AppCompatThemeActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Log.d(TAG, "onCreate"); showLocked(getWindow()); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); @@ -540,7 +541,12 @@ public class RecordingActivity extends AppCompatThemeActivity { void stopRecording() { if (thread != null) { - interrupt.set(true); + interrupt.set(true); // soft interrupt + try { + thread.join(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } thread = null; } pitch.stop(); @@ -854,7 +860,7 @@ public class RecordingActivity extends AppCompatThemeActivity { interrupt = new AtomicBoolean(false); - thread = new Thread(new Runnable() { + thread = new Thread("RecordingThread") { @Override public void run() { if (old != null) { @@ -977,7 +983,7 @@ public class RecordingActivity extends AppCompatThemeActivity { } } } - }, "RecordingThread"); + }; thread.start(); RecordingService.startService(this, Storage.getDocumentName(targetUri), thread != null, encoder != null, duration); @@ -1104,9 +1110,7 @@ public class RecordingActivity extends AppCompatThemeActivity { @Override public void run() { // success Storage.delete(encoder.in); // delete raw recording - last.run(); - d.cancel(); } }, new Runnable() { diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/AudioApplication.java b/app/src/main/java/com/github/axet/audiorecorder/app/AudioApplication.java index 957478a..20ee121 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/app/AudioApplication.java +++ b/app/src/main/java/com/github/axet/audiorecorder/app/AudioApplication.java @@ -8,6 +8,7 @@ import android.content.SharedPreferences; import android.os.Build; import android.support.v4.app.NotificationManagerCompat; import android.support.v7.preference.PreferenceManager; +import android.util.Log; import android.view.View; import com.github.axet.androidlibrary.widgets.NotificationChannelCompat; @@ -38,6 +39,7 @@ public class AudioApplication extends com.github.axet.audiolibrary.app.MainAppli @Override public void onCreate() { super.onCreate(); + Log.d(TAG, "onCreate"); channelStatus = new NotificationChannelCompat(this, "status", "Status", NotificationManagerCompat.IMPORTANCE_LOW); diff --git a/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java b/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java index 4cf69ce..effa8bc 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java +++ b/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java @@ -18,7 +18,6 @@ import android.view.View; import com.github.axet.androidlibrary.widgets.ProximityShader; import com.github.axet.androidlibrary.widgets.RemoteNotificationCompat; -import com.github.axet.androidlibrary.widgets.RemoteViewsCompat; import com.github.axet.audiolibrary.app.Storage; import com.github.axet.audiorecorder.R; import com.github.axet.audiorecorder.activities.MainActivity; @@ -28,12 +27,7 @@ import com.github.axet.audiorecorder.app.AudioApplication; import java.io.File; /** - * RecordingActivity more likly to be removed from memory when paused then service. Notification button - * does not handle getActvity without unlocking screen. The only option is to have Service. - *

- * So, lets have it. - *

- * Maybe later this class will be converted for fully feature recording service with recording thread. + * Sometimes RecordingActivity started twice when launched from lockscreen. We need service and move recording into Application object. */ public class RecordingService extends Service { public static final String TAG = RecordingService.class.getSimpleName(); @@ -113,7 +107,7 @@ public class RecordingService extends Service { storage = new Storage(this); - showNotificationAlarm(true, new Intent()); + showNotification(true, new Intent()); } @Override @@ -123,7 +117,7 @@ public class RecordingService extends Service { if (intent != null) { String a = intent.getAction(); if (a == null) { - showNotificationAlarm(true, intent); + showNotification(true, intent); } else if (a.equals(PAUSE_BUTTON)) { Intent i = new Intent(RecordingActivity.PAUSE_BUTTON); sendBroadcast(i); @@ -157,7 +151,7 @@ public class RecordingService extends Service { public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestory"); - showNotificationAlarm(false, null); + showNotification(false, null); } @SuppressLint("RestrictedApi") @@ -167,10 +161,6 @@ public class RecordingService extends Service { boolean encoding = intent.getBooleanExtra("encoding", false); String duration = intent.getStringExtra("duration"); - PendingIntent main = PendingIntent.getService(this, 0, - new Intent(this, RecordingService.class).setAction(SHOW_ACTIVITY).putExtra("targetFile", targetFile).putExtra("recording", recording), - PendingIntent.FLAG_UPDATE_CURRENT); - PendingIntent pe = PendingIntent.getService(this, 0, new Intent(this, RecordingService.class).setAction(PAUSE_BUTTON), PendingIntent.FLAG_UPDATE_CURRENT); @@ -179,11 +169,12 @@ public class RecordingService extends Service { new Intent(this, RecordingService.class).setAction(RECORD_BUTTON), PendingIntent.FLAG_UPDATE_CURRENT); - RemoteNotificationCompat.Builder builder = new RemoteNotificationCompat.Builder(this, R.layout.notifictaion); + RemoteNotificationCompat.Builder builder; String title; String text; if (targetFile == null) { + builder = new RemoteNotificationCompat.Low(this, R.layout.notifictaion); title = getString(R.string.app_name); Uri f = storage.getStoragePath(); long free = storage.getFree(f); @@ -191,7 +182,10 @@ public class RecordingService extends Service { text = AudioApplication.formatFree(this, free, sec); builder.setViewVisibility(R.id.notification_record, View.VISIBLE); builder.setViewVisibility(R.id.notification_pause, View.GONE); + PendingIntent main = PendingIntent.getActivity(this, 0, new Intent(this, RecordingService.class), PendingIntent.FLAG_UPDATE_CURRENT); + builder.setContentIntent(main); } else { + builder = new RemoteNotificationCompat.Builder(this, R.layout.notifictaion); if (recording) title = getString(R.string.recording_title); else @@ -201,6 +195,12 @@ public class RecordingService extends Service { text = ".../" + targetFile; builder.setViewVisibility(R.id.notification_record, View.GONE); builder.setViewVisibility(R.id.notification_pause, View.VISIBLE); + PendingIntent main = PendingIntent.getService(this, 0, + new Intent(this, RecordingService.class).setAction(SHOW_ACTIVITY) + .putExtra("targetFile", targetFile) + .putExtra("recording", recording), + PendingIntent.FLAG_UPDATE_CURRENT); + builder.setMainIntent(main); } if (encoding) { @@ -218,7 +218,6 @@ public class RecordingService extends Service { .setImageViewTint(R.id.icon_circle, R.attr.colorButtonNormal) .setTitle(title) .setText(text) - .setMainIntent(main) .setWhen(notification) .setOngoing(true) .setSmallIcon(R.drawable.ic_mic); @@ -226,7 +225,7 @@ public class RecordingService extends Service { return builder.build(); } - public void showNotificationAlarm(boolean show, Intent intent) { + public void showNotification(boolean show, Intent intent) { NotificationManagerCompat nm = NotificationManagerCompat.from(this); if (!show) { stopForeground(false); diff --git a/app/src/main/res/layout/remoteview_header.xml b/app/src/main/res/layout/remoteview_header.xml new file mode 100644 index 0000000..9abe339 --- /dev/null +++ b/app/src/main/res/layout/remoteview_header.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +