Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #10560 from JosJuice/android-wii-disc-update
Android: Implement installing system update from disc image
  • Loading branch information
JosJuice committed Apr 7, 2022
2 parents e3ca3e7 + 57733dd commit a8654e2
Show file tree
Hide file tree
Showing 9 changed files with 125 additions and 42 deletions.
Expand Up @@ -21,6 +21,7 @@
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivity;
import org.dolphinemu.dolphinemu.model.GameFile;
import org.dolphinemu.dolphinemu.ui.main.MainPresenter;
import org.dolphinemu.dolphinemu.ui.platform.Platform;
import org.dolphinemu.dolphinemu.utils.AlertDialogItemsBuilder;
import org.dolphinemu.dolphinemu.utils.DirectoryInitialization;
Expand Down Expand Up @@ -101,6 +102,12 @@ public Dialog onCreateDialog(Bundle savedInstanceState)
ConvertActivity.launch(getContext(), path));
}

if (isDisc && isWii)
{
itemsBuilder.add(R.string.properties_system_update, (dialog, i) ->
MainPresenter.launchDiscUpdate(path, requireActivity()));
}

itemsBuilder.add(R.string.properties_edit_game_settings, (dialog, i) ->
SettingsActivity.launch(getContext(), MenuTag.SETTINGS, gameId, revision, isWii));

Expand Down
Expand Up @@ -31,8 +31,8 @@ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState)
new ViewModelProvider(requireActivity()).get(SystemUpdateViewModel.class);
viewModel.setRegion(which);

OnlineUpdateProgressBarDialogFragment progressBarFragment =
new OnlineUpdateProgressBarDialogFragment();
SystemUpdateProgressBarDialogFragment progressBarFragment =
new SystemUpdateProgressBarDialogFragment();
progressBarFragment
.show(getParentFragmentManager(), "OnlineUpdateProgressBarDialogFragment");
progressBarFragment.setCancelable(false);
Expand Down
Expand Up @@ -14,7 +14,7 @@

import org.dolphinemu.dolphinemu.R;

public class OnlineUpdateProgressBarDialogFragment extends DialogFragment
public class SystemUpdateProgressBarDialogFragment extends DialogFragment
{
@NonNull
@Override
Expand Down Expand Up @@ -74,7 +74,7 @@ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState)
return;
}

OnlineUpdateResultFragment progressBarFragment = new OnlineUpdateResultFragment();
SystemUpdateResultFragment progressBarFragment = new SystemUpdateResultFragment();
progressBarFragment.show(getParentFragmentManager(), "OnlineUpdateResultFragment");

getActivity().setRequestedOrientation(orientation);
Expand All @@ -84,28 +84,7 @@ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState)

if (savedInstanceState == null)
{
final String region;
int selectedItem = viewModel.getRegion();

switch (selectedItem)
{
case 0:
region = "EUR";
break;
case 1:
region = "JPN";
break;
case 2:
region = "KOR";
break;
case 3:
region = "USA";
break;
default:
region = "";
break;
}
viewModel.startUpdate(region);
viewModel.startUpdate();
}
return progressDialog;
}
Expand Down
Expand Up @@ -13,7 +13,7 @@
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.utils.WiiUtils;

public class OnlineUpdateResultFragment extends DialogFragment
public class SystemUpdateResultFragment extends DialogFragment
{
private int mResult;

Expand Down
Expand Up @@ -5,6 +5,7 @@
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import org.dolphinemu.dolphinemu.utils.WiiUpdateCallback;
import org.dolphinemu.dolphinemu.utils.WiiUtils;

import java.util.concurrent.ExecutorService;
Expand All @@ -21,6 +22,7 @@ public class SystemUpdateViewModel extends ViewModel

private boolean mCanceled = false;
private int mRegion;
private String mDiscPath;

public SystemUpdateViewModel()
{
Expand All @@ -37,6 +39,16 @@ public int getRegion()
return mRegion;
}

public void setDiscPath(String discPath)
{
mDiscPath = discPath;
}

public String getDiscPath()
{
return mDiscPath;
}

public MutableLiveData<Integer> getProgressData()
{
return mProgressData;
Expand All @@ -62,21 +74,55 @@ public void setCanceled()
mCanceled = true;
}

public void startUpdate(String region)
public void startUpdate()
{
if (!mDiscPath.isEmpty())
{
startDiscUpdate(mDiscPath);
}
else
{
final String region;
switch (mRegion)
{
case 0:
region = "EUR";
break;
case 1:
region = "JPN";
break;
case 2:
region = "KOR";
break;
case 3:
region = "USA";
break;
default:
region = "";
break;
}
startOnlineUpdate(region);
}
}

public void startOnlineUpdate(String region)
{
mCanceled = false;

executor.execute(() ->
{
int result = WiiUtils.doOnlineUpdate(region, ((processed, total, titleId) ->
{
mProgressData.postValue(processed);
mTotalData.postValue(total);
mTitleIdData.postValue(titleId);
int result = WiiUtils.doOnlineUpdate(region, constructCallback());
mResultData.postValue(result);
});
}

return !mCanceled;
}));
public void startDiscUpdate(String path)
{
mCanceled = false;

executor.execute(() ->
{
int result = WiiUtils.doDiscUpdate(path, constructCallback());
mResultData.postValue(result);
});
}
Expand All @@ -88,5 +134,19 @@ public void clear()
mTitleIdData.setValue(0l);
mResultData.setValue(-1);
mCanceled = false;
mRegion = -1;
mDiscPath = "";
}

private WiiUpdateCallback constructCallback()
{
return (processed, total, titleId) ->
{
mProgressData.postValue(processed);
mTotalData.postValue(total);
mTitleIdData.postValue(titleId);

return !mCanceled;
};
}
}
Expand Up @@ -17,7 +17,7 @@
import org.dolphinemu.dolphinemu.activities.EmulationActivity;
import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting;
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
import org.dolphinemu.dolphinemu.features.sysupdate.ui.OnlineUpdateProgressBarDialogFragment;
import org.dolphinemu.dolphinemu.features.sysupdate.ui.SystemUpdateProgressBarDialogFragment;
import org.dolphinemu.dolphinemu.features.sysupdate.ui.SystemMenuNotInstalledDialogFragment;
import org.dolphinemu.dolphinemu.features.sysupdate.ui.SystemUpdateViewModel;
import org.dolphinemu.dolphinemu.model.GameFileCache;
Expand Down Expand Up @@ -280,11 +280,7 @@ private void launchOnlineUpdate()
SystemUpdateViewModel viewModel =
new ViewModelProvider(mActivity).get(SystemUpdateViewModel.class);
viewModel.setRegion(-1);
OnlineUpdateProgressBarDialogFragment progressBarFragment =
new OnlineUpdateProgressBarDialogFragment();
progressBarFragment
.show(mActivity.getSupportFragmentManager(), "OnlineUpdateProgressBarDialogFragment");
progressBarFragment.setCancelable(false);
launchUpdateProgressBarFragment(mActivity);
}
else
{
Expand All @@ -295,6 +291,23 @@ private void launchOnlineUpdate()
}
}

public static void launchDiscUpdate(String path, FragmentActivity activity)
{
SystemUpdateViewModel viewModel =
new ViewModelProvider(activity).get(SystemUpdateViewModel.class);
viewModel.setDiscPath(path);
launchUpdateProgressBarFragment(activity);
}

private static void launchUpdateProgressBarFragment(FragmentActivity activity)
{
SystemUpdateProgressBarDialogFragment progressBarFragment =
new SystemUpdateProgressBarDialogFragment();
progressBarFragment
.show(activity.getSupportFragmentManager(), "SystemUpdateProgressBarDialogFragment");
progressBarFragment.setCancelable(false);
}

private void launchWiiSystemMenu()
{
WiiUtils.isSystemMenuInstalled();
Expand Down
Expand Up @@ -28,6 +28,8 @@

public static native int doOnlineUpdate(String region, WiiUpdateCallback callback);

public static native int doDiscUpdate(String path, WiiUpdateCallback callback);

public static native boolean isSystemMenuInstalled();

public static native String getSystemMenuVersion();
Expand Down
1 change: 1 addition & 0 deletions Source/Android/app/src/main/res/values/strings.xml
Expand Up @@ -433,6 +433,7 @@
<string name="properties_start_with_riivolution">Start with Riivolution Patches</string>
<string name="properties_set_default_iso">Set as Default ISO</string>
<string name="properties_convert">Convert File</string>
<string name="properties_system_update">Perform System Update</string>
<string name="properties_edit_game_settings">Edit Game Settings</string>
<string name="properties_edit_cheats">Edit Cheats</string>
<string name="properties_clear_game_settings">Clear Game Settings and Cheats</string>
Expand Down
23 changes: 22 additions & 1 deletion Source/Android/jni/WiiUtils.cpp
Expand Up @@ -63,7 +63,7 @@ static jint ConvertUpdateResult(WiiUtils::UpdateResult result)
return 8;
default:
ASSERT(false);
return 1;
return 7;
}

static_assert(static_cast<int>(WiiUtils::UpdateResult::NumberOfEntries) == 9);
Expand Down Expand Up @@ -132,6 +132,27 @@ JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_utils_WiiUtils_doOnlineUpd
return ConvertUpdateResult(result);
}

JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_utils_WiiUtils_doDiscUpdate(JNIEnv* env,
jclass,
jstring jPath,
jobject jCallback)
{
const std::string path = GetJString(env, jPath);

jobject jCallbackGlobal = env->NewGlobalRef(jCallback);
Common::ScopeGuard scope_guard([jCallbackGlobal, env] { env->DeleteGlobalRef(jCallbackGlobal); });

const auto callback = [&jCallbackGlobal](int processed, int total, u64 title_id) {
JNIEnv* env = IDCache::GetEnvForThread();
return static_cast<bool>(env->CallBooleanMethod(
jCallbackGlobal, IDCache::GetWiiUpdateCallbackFunction(), processed, total, title_id));
};

WiiUtils::UpdateResult result = WiiUtils::DoDiscUpdate(callback, path);

return ConvertUpdateResult(result);
}

JNIEXPORT jboolean JNICALL
Java_org_dolphinemu_dolphinemu_utils_WiiUtils_isSystemMenuInstalled(JNIEnv* env, jclass)
{
Expand Down

0 comments on commit a8654e2

Please sign in to comment.