android: frontend: Start a service to keep the persistent notification
This commit is contained in:
parent
cd940db10c
commit
c514e9028b
@ -18,6 +18,7 @@
|
|||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
@ -56,6 +57,8 @@
|
|||||||
android:theme="@style/CitraEmulationBase"
|
android:theme="@style/CitraEmulationBase"
|
||||||
android:launchMode="singleTop"/>
|
android:launchMode="singleTop"/>
|
||||||
|
|
||||||
|
<service android:name="org.citra.citra_emu.utils.ForegroundService"/>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.citra.citra_emu.activities.CustomFilePickerActivity"
|
android:name="org.citra.citra_emu.activities.CustomFilePickerActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package org.citra.citra_emu.activities;
|
package org.citra.citra_emu.activities;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
@ -23,7 +22,6 @@ import androidx.annotation.IntDef;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.core.app.NotificationCompat;
|
|
||||||
import androidx.core.app.NotificationManagerCompat;
|
import androidx.core.app.NotificationManagerCompat;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
@ -39,6 +37,7 @@ import org.citra.citra_emu.utils.ControllerMappingHelper;
|
|||||||
import org.citra.citra_emu.utils.EmulationMenuSettings;
|
import org.citra.citra_emu.utils.EmulationMenuSettings;
|
||||||
import org.citra.citra_emu.utils.FileBrowserHelper;
|
import org.citra.citra_emu.utils.FileBrowserHelper;
|
||||||
import org.citra.citra_emu.utils.FileUtil;
|
import org.citra.citra_emu.utils.FileUtil;
|
||||||
|
import org.citra.citra_emu.utils.ForegroundService;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -109,6 +108,7 @@ public final class EmulationActivity extends AppCompatActivity {
|
|||||||
private EmulationFragment mEmulationFragment;
|
private EmulationFragment mEmulationFragment;
|
||||||
private SharedPreferences mPreferences;
|
private SharedPreferences mPreferences;
|
||||||
private ControllerMappingHelper mControllerMappingHelper;
|
private ControllerMappingHelper mControllerMappingHelper;
|
||||||
|
private Intent foregroundService;
|
||||||
private boolean activityRecreated;
|
private boolean activityRecreated;
|
||||||
private String mSelectedTitle;
|
private String mSelectedTitle;
|
||||||
private String mPath;
|
private String mPath;
|
||||||
@ -121,30 +121,13 @@ public final class EmulationActivity extends AppCompatActivity {
|
|||||||
activity.startActivity(launcher);
|
activity.startActivity(launcher);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showRunningNotification() {
|
|
||||||
// Intent is used to resume emulation if the notification is clicked
|
|
||||||
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
|
|
||||||
new Intent(this, EmulationActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
|
|
||||||
|
|
||||||
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, getString(R.string.app_notification_channel_id))
|
|
||||||
.setSmallIcon(R.drawable.ic_stat_notification_logo)
|
|
||||||
.setContentTitle(getString(R.string.app_name))
|
|
||||||
.setContentText(getString(R.string.app_notification_running))
|
|
||||||
.setPriority(NotificationCompat.PRIORITY_LOW)
|
|
||||||
.setVibrate(null)
|
|
||||||
.setSound(null)
|
|
||||||
.setContentIntent(contentIntent);
|
|
||||||
|
|
||||||
NotificationManagerCompat.from(this).notify(EMULATION_RUNNING_NOTIFICATION, builder.build());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void tryDismissRunningNotification(Activity activity) {
|
public static void tryDismissRunningNotification(Activity activity) {
|
||||||
NotificationManagerCompat.from(activity).cancel(EMULATION_RUNNING_NOTIFICATION);
|
NotificationManagerCompat.from(activity).cancel(EMULATION_RUNNING_NOTIFICATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
tryDismissRunningNotification(this);
|
stopService(foregroundService);
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,7 +179,9 @@ public final class EmulationActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
|
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
|
|
||||||
showRunningNotification();
|
// Start a foreground service to prevent the app from getting killed in the background
|
||||||
|
foregroundService = new Intent(EmulationActivity.this, ForegroundService.class);
|
||||||
|
startForegroundService(foregroundService);
|
||||||
|
|
||||||
// Override Citra core INI with the one set by our in game menu
|
// Override Citra core INI with the one set by our in game menu
|
||||||
NativeLibrary.SwapScreens(EmulationMenuSettings.getSwapScreens(),
|
NativeLibrary.SwapScreens(EmulationMenuSettings.getSwapScreens(),
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2014 Dolphin Emulator Project
|
||||||
|
* Licensed under GPLv2+
|
||||||
|
* Refer to the license.txt file included.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.citra.citra_emu.utils;
|
||||||
|
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.IBinder;
|
||||||
|
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import androidx.core.app.NotificationManagerCompat;
|
||||||
|
|
||||||
|
import org.citra.citra_emu.R;
|
||||||
|
import org.citra.citra_emu.activities.EmulationActivity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A service that shows a permanent notification in the background to avoid the app getting
|
||||||
|
* cleared from memory by the system.
|
||||||
|
*/
|
||||||
|
public class ForegroundService extends Service {
|
||||||
|
private static final int EMULATION_RUNNING_NOTIFICATION = 0x1000;
|
||||||
|
|
||||||
|
private void showRunningNotification() {
|
||||||
|
// Intent is used to resume emulation if the notification is clicked
|
||||||
|
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
|
||||||
|
new Intent(this, EmulationActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
|
||||||
|
|
||||||
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, getString(R.string.app_notification_channel_id))
|
||||||
|
.setSmallIcon(R.drawable.ic_stat_notification_logo)
|
||||||
|
.setContentTitle(getString(R.string.app_name))
|
||||||
|
.setContentText(getString(R.string.app_notification_running))
|
||||||
|
.setPriority(NotificationCompat.PRIORITY_LOW)
|
||||||
|
.setOngoing(true)
|
||||||
|
.setVibrate(null)
|
||||||
|
.setSound(null)
|
||||||
|
.setContentIntent(contentIntent);
|
||||||
|
startForeground(EMULATION_RUNNING_NOTIFICATION, builder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
showRunningNotification();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
|
return START_STICKY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
NotificationManagerCompat.from(this).cancel(EMULATION_RUNNING_NOTIFICATION);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user