android: frontend: Implement persistent notification while emulator is running.

This commit is contained in:
bunnei 2019-08-31 01:48:59 -04:00
parent bd75e7d840
commit 2b3962a86e
7 changed files with 66 additions and 2 deletions

View File

@ -5,7 +5,10 @@
package org.citra.citra_android;
import android.app.Application;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Build;
import org.citra.citra_android.model.GameDatabase;
import org.citra.citra_android.services.DirectoryInitializationService;
@ -15,13 +18,32 @@ public class CitraApplication extends Application {
public static GameDatabase databaseHelper;
private static CitraApplication application;
private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = getString(R.string.app_notification_channel_name);
String description = getString(R.string.app_notification_channel_description);
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(getString(R.string.app_notification_channel_id), name, importance);
channel.setDescription(description);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
@Override
public void onCreate() {
super.onCreate();
application = this;
if (PermissionsHandler.hasWriteAccess(getApplicationContext()))
if (PermissionsHandler.hasWriteAccess(getApplicationContext())) {
DirectoryInitializationService.startService(getApplicationContext());
}
createNotificationChannel();
databaseHelper = new GameDatabase(this);
}

View File

@ -12,6 +12,8 @@ import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.SparseIntArray;
import android.view.InputDevice;
@ -63,6 +65,8 @@ public final class EmulationActivity extends AppCompatActivity {
public static final int MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE = 8;
public static final int MENU_ACTION_SWAP_SCREENS = 9;
public static final int MENU_ACTION_RESET_OVERLAY = 10;
private static final int EMULATION_RUNNING_NOTIFICATION = 0x1000;
private static final String BACKSTACK_NAME_MENU = "menu";
private static final String BACKSTACK_NAME_SUBMENU = "submenu";
private static SparseIntArray buttonsActionsMap = new SparseIntArray();
@ -132,6 +136,27 @@ public final class EmulationActivity extends AppCompatActivity {
options.toBundle());
}
private void showRunningNotification() {
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_MIN)
.setOngoing(true);
NotificationManagerCompat.from(this).notify(EMULATION_RUNNING_NOTIFICATION, builder.build());
}
public static void tryDismissRunningNotification(Activity activity) {
NotificationManagerCompat.from(activity).cancel(EMULATION_RUNNING_NOTIFICATION);
}
@Override
protected void onDestroy() {
tryDismissRunningNotification(this);
super.onDestroy();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -221,6 +246,8 @@ public final class EmulationActivity extends AppCompatActivity {
}
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
showRunningNotification();
}
@Override
@ -308,6 +335,8 @@ public final class EmulationActivity extends AppCompatActivity {
}
public void exitWithAnimation() {
tryDismissRunningNotification(this);
runOnUiThread(() ->
{
Picasso.get()

View File

@ -6,7 +6,6 @@ import android.database.Cursor;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
@ -15,6 +14,7 @@ import android.view.MenuItem;
import android.widget.Toast;
import org.citra.citra_android.R;
import org.citra.citra_android.activities.EmulationActivity;
import org.citra.citra_android.model.GameProvider;
import org.citra.citra_android.services.DirectoryInitializationService;
import org.citra.citra_android.ui.platform.PlatformGamesFragment;
@ -60,6 +60,9 @@ public final class MainActivity extends AppCompatActivity implements MainView {
} else {
mPlatformGamesFragment = (PlatformGamesFragment) getSupportFragmentManager().getFragment(savedInstanceState, "mPlatformGamesFragment");
}
// Dismiss previous notifications (should not happen unless a crash occurred)
EmulationActivity.tryDismissRunningNotification(this);
}
@Override
@ -191,4 +194,10 @@ public final class MainActivity extends AppCompatActivity implements MainView {
private PlatformGamesView getPlatformGamesView() {
return (PlatformGamesView) getSupportFragmentManager().findFragmentById(mFrameLayoutId);
}
@Override
protected void onDestroy() {
EmulationActivity.tryDismissRunningNotification(this);
super.onDestroy();
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -4,6 +4,10 @@
<!-- General application strings -->
<string name="app_name">Citra</string>
<string name="app_disclaimer">This software will run games for the Nintendo 3DS handheld game console. No game titles are included.\n\nBefore you run, please place your rightfully owned 3DS game files onto your device storage.</string>
<string name="app_notification_channel_name">Citra</string>
<string name="app_notification_channel_id">Citra</string>
<string name="app_notification_channel_description">Citra 3DS emulator notifications</string>
<string name="app_notification_running">Citra is running</string>
<!-- Input related strings -->
<string name="controller_circlepad">Circle Pad</string>