Skip to content

Commit

Permalink
Android: Optional AfterDirectoryInitializationRunner failure message
Browse files Browse the repository at this point in the history
This centralizes the code for showing the write_permission_needed
and external_storage_not_mounted toasts.
  • Loading branch information
JosJuice committed Sep 5, 2020
1 parent db06710 commit 2959e76
Show file tree
Hide file tree
Showing 11 changed files with 147 additions and 210 deletions.
Expand Up @@ -11,15 +11,13 @@
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import android.util.Log;
import android.widget.Toast;

import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.model.GameFile;
import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner;
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization;
import org.dolphinemu.dolphinemu.services.GameFileCacheService;
import org.dolphinemu.dolphinemu.ui.main.TvMainActivity;
import org.dolphinemu.dolphinemu.utils.AppLinkHelper;
import org.dolphinemu.dolphinemu.utils.DirectoryStateReceiver;

/**
* Linker between leanback homescreen and app
Expand All @@ -29,7 +27,7 @@ public class AppLinkActivity extends FragmentActivity
private static final String TAG = "AppLinkActivity";

private AppLinkHelper.PlayAction playAction;
private DirectoryStateReceiver directoryStateReceiver;
private AfterDirectoryInitializationRunner mAfterDirectoryInitializationRunner;

@Override
protected void onCreate(Bundle savedInstanceState)
Expand Down Expand Up @@ -67,34 +65,12 @@ protected void onCreate(Bundle savedInstanceState)
*/
private void initResources()
{
IntentFilter directoryStateIntentFilter = new IntentFilter(
DirectoryInitialization.BROADCAST_ACTION);
mAfterDirectoryInitializationRunner = new AfterDirectoryInitializationRunner();
mAfterDirectoryInitializationRunner.run(this, true, () -> tryPlay(playAction));

IntentFilter gameFileCacheIntentFilter = new IntentFilter(
GameFileCacheService.BROADCAST_ACTION);

directoryStateReceiver =
new DirectoryStateReceiver(directoryInitializationState ->
{
if (directoryInitializationState ==
DirectoryInitialization.DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED)
{
tryPlay(playAction);
}
else if (directoryInitializationState ==
DirectoryInitialization.DirectoryInitializationState.EXTERNAL_STORAGE_PERMISSION_NEEDED)
{
Toast.makeText(this, R.string.write_permission_needed, Toast.LENGTH_SHORT)
.show();
}
else if (directoryInitializationState ==
DirectoryInitialization.DirectoryInitializationState.CANT_FIND_EXTERNAL_STORAGE)
{
Toast.makeText(this, R.string.external_storage_not_mounted, Toast.LENGTH_SHORT)
.show();
}
});

BroadcastReceiver gameFileCacheReceiver = new BroadcastReceiver()
{
@Override
Expand All @@ -108,7 +84,6 @@ public void onReceive(Context context, Intent intent)
};

LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(this);
broadcastManager.registerReceiver(directoryStateReceiver, directoryStateIntentFilter);
broadcastManager.registerReceiver(gameFileCacheReceiver, gameFileCacheIntentFilter);

DirectoryInitialization.start(this);
Expand Down Expand Up @@ -160,10 +135,10 @@ private void play(AppLinkHelper.PlayAction action, GameFile game)

private void startGame(GameFile game)
{
if (directoryStateReceiver != null)
if (mAfterDirectoryInitializationRunner != null)
{
LocalBroadcastManager.getInstance(this).unregisterReceiver(directoryStateReceiver);
directoryStateReceiver = null;
mAfterDirectoryInitializationRunner.cancel();
mAfterDirectoryInitializationRunner = null;
}
EmulationActivity.launch(this, game);
}
Expand Down
Expand Up @@ -3,15 +3,13 @@
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.Settings;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentTransaction;
import androidx.lifecycle.ViewModelProvider;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.appcompat.app.AppCompatActivity;

import android.view.Menu;
Expand All @@ -22,8 +20,6 @@
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.ui.main.MainActivity;
import org.dolphinemu.dolphinemu.ui.main.TvMainActivity;
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization;
import org.dolphinemu.dolphinemu.utils.DirectoryStateReceiver;
import org.dolphinemu.dolphinemu.utils.FileBrowserHelper;
import org.dolphinemu.dolphinemu.utils.TvUtil;

Expand Down Expand Up @@ -150,22 +146,6 @@ private boolean areSystemAnimationsEnabled()
return duration != 0 && transition != 0;
}

@Override
public void startDirectoryInitializationService(DirectoryStateReceiver receiver,
IntentFilter filter)
{
LocalBroadcastManager.getInstance(this).registerReceiver(
receiver,
filter);
DirectoryInitialization.start(this);
}

@Override
public void stopListeningToDirectoryInitializationService(DirectoryStateReceiver receiver)
{
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent result)
{
Expand Down Expand Up @@ -212,20 +192,6 @@ public void hideLoading()
dialog.dismiss();
}

@Override
public void showPermissionNeededHint()
{
Toast.makeText(this, R.string.write_permission_needed, Toast.LENGTH_SHORT)
.show();
}

@Override
public void showExternalStorageNotMountedHint()
{
Toast.makeText(this, R.string.external_storage_not_mounted, Toast.LENGTH_SHORT)
.show();
}

@Override
public void showGameIniJunkDeletionQuestion()
{
Expand Down
@@ -1,15 +1,13 @@
package org.dolphinemu.dolphinemu.features.settings.ui;

import android.content.Context;
import android.content.IntentFilter;
import android.os.Bundle;
import android.text.TextUtils;

import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner;
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization;
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization.DirectoryInitializationState;
import org.dolphinemu.dolphinemu.utils.DirectoryStateReceiver;
import org.dolphinemu.dolphinemu.utils.Log;

import java.util.HashSet;
Expand All @@ -25,7 +23,7 @@ public final class SettingsActivityPresenter

private boolean mShouldSave;

private DirectoryStateReceiver directoryStateReceiver;
private AfterDirectoryInitializationRunner mAfterDirectoryInitializationRunner;

private MenuTag menuTag;
private String gameId;
Expand Down Expand Up @@ -85,33 +83,10 @@ private void prepareDolphinDirectoriesIfNeeded()
else
{
mView.showLoading();
IntentFilter statusIntentFilter = new IntentFilter(
DirectoryInitialization.BROADCAST_ACTION);

directoryStateReceiver =
new DirectoryStateReceiver(directoryInitializationState ->
{
if (directoryInitializationState ==
DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED)
{
mView.hideLoading();
loadSettingsUI();
}
else if (directoryInitializationState ==
DirectoryInitializationState.EXTERNAL_STORAGE_PERMISSION_NEEDED)
{
mView.showPermissionNeededHint();
mView.hideLoading();
}
else if (directoryInitializationState ==
DirectoryInitializationState.CANT_FIND_EXTERNAL_STORAGE)
{
mView.showExternalStorageNotMountedHint();
mView.hideLoading();
}
});

mView.startDirectoryInitializationService(directoryStateReceiver, statusIntentFilter);

mAfterDirectoryInitializationRunner = new AfterDirectoryInitializationRunner();
mAfterDirectoryInitializationRunner.setFinishedCallback(mView::hideLoading);
mAfterDirectoryInitializationRunner.run(context, true, this::loadSettingsUI);
}
}

Expand All @@ -128,10 +103,10 @@ public void clearSettings()

public void onStop(boolean finishing)
{
if (directoryStateReceiver != null)
if (mAfterDirectoryInitializationRunner != null)
{
mView.stopListeningToDirectoryInitializationService(directoryStateReceiver);
directoryStateReceiver = null;
mAfterDirectoryInitializationRunner.cancel();
mAfterDirectoryInitializationRunner = null;
}

if (mSettings != null && finishing && mShouldSave)
Expand Down
@@ -1,10 +1,8 @@
package org.dolphinemu.dolphinemu.features.settings.ui;

import android.content.IntentFilter;
import android.os.Bundle;

import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.utils.DirectoryStateReceiver;

/**
* Abstraction for the Activity that manages SettingsFragments.
Expand Down Expand Up @@ -97,33 +95,8 @@ public interface SettingsActivityView
*/
void hideLoading();

/**
* Show a hint to the user that the app needs write to external storage access
*/
void showPermissionNeededHint();

/**
* Show a hint to the user that the app needs the external storage to be mounted
*/
void showExternalStorageNotMountedHint();

/**
* Tell the user that there is junk in the game INI and ask if they want to delete the whole file.
*/
void showGameIniJunkDeletionQuestion();

/**
* Start the DirectoryInitialization and listen for the result.
*
* @param receiver the broadcast receiver for the DirectoryInitialization
* @param filter the Intent broadcasts to be received.
*/
void startDirectoryInitializationService(DirectoryStateReceiver receiver, IntentFilter filter);

/**
* Stop listening to the DirectoryInitialization.
*
* @param receiver The broadcast receiver to unregister.
*/
void stopListeningToDirectoryInitializationService(DirectoryStateReceiver receiver);
}
@@ -1,14 +1,12 @@
package org.dolphinemu.dolphinemu.fragments;

import android.content.Context;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import android.view.LayoutInflater;
import android.view.Surface;
Expand All @@ -17,15 +15,12 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.activities.EmulationActivity;
import org.dolphinemu.dolphinemu.overlay.InputOverlay;
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization;
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization.DirectoryInitializationState;
import org.dolphinemu.dolphinemu.utils.DirectoryStateReceiver;
import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner;
import org.dolphinemu.dolphinemu.utils.Log;

import java.io.File;
Expand All @@ -40,7 +35,7 @@ public final class EmulationFragment extends Fragment implements SurfaceHolder.C

private EmulationState mEmulationState;

private DirectoryStateReceiver directoryStateReceiver;
private AfterDirectoryInitializationRunner mAfterDirectoryInitializationRunner;

private EmulationActivity activity;

Expand Down Expand Up @@ -115,23 +110,19 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
public void onResume()
{
super.onResume();
if (DirectoryInitialization.areDolphinDirectoriesReady())
{
mEmulationState.run(activity.isActivityRecreated());
}
else
{
setupDolphinDirectoriesThenStartEmulation();
}

mAfterDirectoryInitializationRunner = new AfterDirectoryInitializationRunner();
mAfterDirectoryInitializationRunner.run(requireContext(), true,
() -> mEmulationState.run(activity.isActivityRecreated()));
}

@Override
public void onPause()
{
if (directoryStateReceiver != null)
if (mAfterDirectoryInitializationRunner != null)
{
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(directoryStateReceiver);
directoryStateReceiver = null;
mAfterDirectoryInitializationRunner.cancel();
mAfterDirectoryInitializationRunner = null;
}

if (mEmulationState.isRunning())
Expand All @@ -146,41 +137,6 @@ public void onDetach()
super.onDetach();
}

private void setupDolphinDirectoriesThenStartEmulation()
{
IntentFilter statusIntentFilter = new IntentFilter(
DirectoryInitialization.BROADCAST_ACTION);

directoryStateReceiver =
new DirectoryStateReceiver(directoryInitializationState ->
{
if (directoryInitializationState ==
DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED)
{
mEmulationState.run(activity.isActivityRecreated());
}
else if (directoryInitializationState ==
DirectoryInitializationState.EXTERNAL_STORAGE_PERMISSION_NEEDED)
{
Toast.makeText(getContext(), R.string.write_permission_needed, Toast.LENGTH_SHORT)
.show();
}
else if (directoryInitializationState ==
DirectoryInitializationState.CANT_FIND_EXTERNAL_STORAGE)
{
Toast.makeText(getContext(), R.string.external_storage_not_mounted,
Toast.LENGTH_SHORT)
.show();
}
});

// Registers the DirectoryStateReceiver and its intent filters
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
directoryStateReceiver,
statusIntentFilter);
DirectoryInitialization.start(getActivity());
}

public void toggleInputOverlayVisibility()
{
SharedPreferences.Editor editor = mPreferences.edit();
Expand Down

0 comments on commit 2959e76

Please sign in to comment.