Exit cleanly when user cancels or has error with first disk image.

Also change around intent patterns again.
This commit is contained in:
James Sanford 2012-11-07 18:35:12 -08:00
parent 125b778575
commit 681644ea73
5 changed files with 61 additions and 38 deletions

View File

@ -27,43 +27,49 @@
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.zip" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.ZIP" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Yeah, this is pretty much awful. Blame PatternMatcher -->
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.2mg" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.dsk" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.nib" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.hdv" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.po" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.do" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.2mg" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.dsk" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.nib" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.hdv" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.po" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.do" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.2MG" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.DSK" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.NIB" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.HDV" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.PO" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.DO" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.2MG" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.DSK" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.NIB" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.HDV" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.PO" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.DO" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.2mg.gz" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.dsk.gz" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.nib.gz" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.hdv.gz" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.po.gz" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.do.gz" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.2mg.gz" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.dsk.gz" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.nib.gz" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.hdv.gz" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.po.gz" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.do.gz" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.2MG.gz" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.DSK.gz" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.NIB.gz" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.HDV.gz" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.PO.gz" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.DO.gz" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.2MG.gz" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.DSK.gz" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.NIB.gz" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.HDV.gz" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.PO.gz" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.DO.gz" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.2MG.GZ" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.DSK.GZ" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.NIB.GZ" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.HDV.GZ" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.PO.GZ" />
<data android:scheme="file" android:host="*" android:mimeType="*/*" android:pathPattern=".*\\.DO.GZ" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.2MG.GZ" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.DSK.GZ" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.NIB.GZ" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.HDV.GZ" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.PO.GZ" />
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.DO.GZ" />
</intent-filter>

View File

@ -54,6 +54,7 @@ public class KegsMain extends SherlockFragmentActivity implements KegsKeyboard.S
private boolean mPaused = false;
final ArrayDeque<Runnable> mResumeQueue = new ArrayDeque<Runnable>();
final Runnable mErrorFinish = new Runnable() { public void run() { finish(); } };
private DiskLoader mDiskLoader = null;
@ -156,14 +157,28 @@ public class KegsMain extends SherlockFragmentActivity implements KegsKeyboard.S
});
}
public void onImageCancelled(final boolean result, final DiskImage image) {
if (getThread().nowWaitingForPowerOn()) {
// Emulator never powered on and the user aborted.
finish();
}
}
public void onImageReady(final boolean result, final DiskImage image) {
mDiskLoader = null;
withUIActive(new Runnable() {
public void run() {
dismissFragment(FRAGMENT_LOADING);
if (!result) {
// TODO: Consider not showing the error if it was cancelled.
new ErrorDialogFragment(R.string.image_error, null).show(getSupportFragmentManager(), FRAGMENT_ERROR);
final Runnable cancel;
if (getThread().nowWaitingForPowerOn()) {
// Emulator never powered on and we failed, exit when user clicks OK.
cancel = mErrorFinish;
} else {
cancel = null;
}
new ErrorDialogFragment(R.string.image_error, cancel).show(
getSupportFragmentManager(), FRAGMENT_ERROR);
} else if (image.action != DiskImage.ASK) {
loadDiskImage(image);
} else {
@ -286,8 +301,8 @@ public class KegsMain extends SherlockFragmentActivity implements KegsKeyboard.S
}
if (!success) {
if (!isCancelled()) {
final Runnable runnable = new Runnable() { public void run() { finish(); } };
new ErrorDialogFragment(R.string.rom_error, runnable).show(getSupportFragmentManager(), FRAGMENT_ERROR);
new ErrorDialogFragment(R.string.rom_error, mErrorFinish).show(
getSupportFragmentManager(), FRAGMENT_ERROR);
}
} else {
boot();

View File

@ -14,12 +14,12 @@ class DiskImage {
public static final int ASSET = 0;
public static final int DOWNLOAD = 1;
public static final int LOCALFILE = 2;
public static final int ERROR = 3;
// action
public static final int BOOT = 0;
public static final int SWAP = 1;
public static final int ASK = 2;
public static final int CANCEL = 3;
public String filename;
public String drive;

View File

@ -13,6 +13,7 @@ import java.util.zip.ZipEntry;
class DiskLoader extends AsyncTask<Void, Void, Boolean> {
interface ImageReady {
void onImageReady(boolean result, DiskImage image);
void onImageCancelled(boolean result, DiskImage image);
}
private ImageReady mNotify;
@ -60,7 +61,8 @@ class DiskLoader extends AsyncTask<Void, Void, Boolean> {
}
private Boolean extractImage() {
if (mImage.origin == DiskImage.ERROR) {
if (mImage.action == DiskImage.CANCEL) {
cancel(true);
return false;
}
@ -134,7 +136,7 @@ class DiskLoader extends AsyncTask<Void, Void, Boolean> {
}
protected void onCancelled(final Boolean result) {
mNotify.onImageReady(result, mImage);
mNotify.onImageCancelled(result, mImage);
}
protected void onPostExecute(final Boolean result) {

View File

@ -63,7 +63,7 @@ public class ZipDiskFragment extends SherlockDialogFragment {
// TODO: Ick. All this just so that whoever opened this fragment
// will get a DiskLoader callback.
mImage.filename = "";
mImage.origin = DiskImage.ERROR;
mImage.action = DiskImage.CANCEL;
((KegsMain)getActivity()).runDiskLoader(mImage);
}