Skip to content
Permalink
Browse files
Merge pull request #8891 from JosJuice/file-details
Show file format details in game properties
  • Loading branch information
Tilka committed Jun 25, 2020
2 parents a1a107d + d494e02 commit 26ed3b3
Show file tree
Hide file tree
Showing 26 changed files with 341 additions and 16 deletions.
@@ -449,6 +449,8 @@ public static native String GetConfig(String configFile, String Section, String

public static native boolean InstallWAD(String file);

public static native String FormatSize(long bytes, int decimals);

private static boolean alertResult = false;

public static boolean displayAlertMsg(final String caption, final String text,
@@ -10,6 +10,7 @@
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;

import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.model.GameFile;
import org.dolphinemu.dolphinemu.services.GameFileCacheService;
@@ -50,20 +51,67 @@ public Dialog onCreateDialog(Bundle savedInstanceState)
TextView textGameId = contents.findViewById(R.id.text_game_id);
TextView textRevision = contents.findViewById(R.id.text_revision);

TextView textFileFormat = contents.findViewById(R.id.text_file_format);
TextView textCompression = contents.findViewById(R.id.text_compression);
TextView textBlockSize = contents.findViewById(R.id.text_block_size);

TextView labelFileFormat = contents.findViewById(R.id.label_file_format);
TextView labelCompression = contents.findViewById(R.id.label_compression);
TextView labelBlockSize = contents.findViewById(R.id.label_block_size);

String country = getResources().getStringArray(R.array.countryNames)[gameFile.getCountry()];
String description = gameFile.getDescription();
String fileSize = NativeLibrary.FormatSize(gameFile.getFileSize(), 2);

textTitle.setText(gameFile.getTitle());
textDescription.setText(gameFile.getDescription());
if (description.isEmpty())
{
textDescription.setVisibility(View.GONE);
}

textCountry.setText(country);
textCompany.setText(gameFile.getCompany());
textGameId.setText(gameFile.getGameId());
textRevision.setText(Integer.toString(gameFile.getRevision()));

if (!gameFile.shouldShowFileFormatDetails())
{
labelFileFormat.setText(R.string.game_details_file_size);
textFileFormat.setText(fileSize);

labelCompression.setVisibility(View.GONE);
textCompression.setVisibility(View.GONE);
labelBlockSize.setVisibility(View.GONE);
textBlockSize.setVisibility(View.GONE);
}
else
{
long blockSize = gameFile.getBlockSize();
String compression = gameFile.getCompressionMethod();

textFileFormat.setText(String.format("%1$s (%2$s)", gameFile.getBlobTypeString(), fileSize));

if (compression.isEmpty())
{
textCompression.setText(R.string.game_details_no_compression);
}
else
{
textCompression.setText(gameFile.getCompressionMethod());
}

if (blockSize > 0)
{
textBlockSize.setText(NativeLibrary.FormatSize(blockSize, 0));
}
else
{
labelBlockSize.setVisibility(View.GONE);
textBlockSize.setVisibility(View.GONE);
}
}

PicassoUtils.loadGameBanner(banner, gameFile);

builder.setView(contents);
@@ -38,6 +38,16 @@ private GameFile(long pointer)

public native int getRevision();

public native String getBlobTypeString();

public native long getBlockSize();

public native String getCompressionMethod();

public native boolean shouldShowFileFormatDetails();

public native long getFileSize();

public native int[] getBanner();

public native int getBannerWidth();
@@ -42,7 +42,7 @@
app:layout_constraintTop_toBottomOf="@id/text_description" />

<View
android:id="@+id/divider"
android:id="@+id/divider_1"
android:layout_width="0dp"
android:layout_height="1dp"
android:background="#1F000000"
@@ -59,7 +59,7 @@
android:gravity="start"
android:text="@string/game_details_country"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/divider" />
app:layout_constraintTop_toBottomOf="@id/divider_1" />

<TextView
android:id="@+id/label_company"
@@ -89,15 +89,14 @@
android:gravity="start"
android:text="@string/game_details_revision"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/label_game_id"
app:layout_constraintBottom_toBottomOf="parent" />
app:layout_constraintTop_toBottomOf="@id/label_game_id" />

<androidx.constraintlayout.widget.Barrier
android:id="@+id/label_barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="end"
app:constraint_referenced_ids="label_country,label_company,label_game_id,label_revision" />
app:constraint_referenced_ids="label_country,label_company,label_game_id,label_revision,label_file_format,label_compression,label_block_size" />

<TextView
android:id="@+id/text_country"
@@ -143,4 +142,77 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBaseline_toBaselineOf="@id/label_revision" />

<View
android:id="@+id/divider_2"
android:layout_width="0dp"
android:layout_height="1dp"
android:background="#1F000000"
android:layout_marginTop="32dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/label_revision" />

<TextView
android:id="@+id/label_file_format"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:gravity="start"
android:text="@string/game_details_file_format"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/divider_2" />

<TextView
android:id="@+id/label_compression"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:gravity="start"
android:text="@string/game_details_compression"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/label_file_format" />

<TextView
android:id="@+id/label_block_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:gravity="start"
android:text="@string/game_details_block_size"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/label_compression" />

<TextView
android:id="@+id/text_file_format"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:gravity="end"
tools:text="ISO (4.38 GiB)"
app:layout_constraintStart_toEndOf="@id/label_barrier"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBaseline_toBaselineOf="@id/label_file_format" />

<TextView
android:id="@+id/text_compression"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:gravity="end"
tools:text="No Compression"
app:layout_constraintStart_toEndOf="@id/label_barrier"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBaseline_toBaselineOf="@id/label_compression" />

<TextView
android:id="@+id/text_block_size"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:gravity="end"
tools:text="0 B"
app:layout_constraintStart_toEndOf="@id/label_barrier"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBaseline_toBaselineOf="@id/label_block_size" />

</androidx.constraintlayout.widget.ConstraintLayout>
@@ -317,6 +317,11 @@
<string name="game_details_company">Company</string>
<string name="game_details_game_id">Game ID</string>
<string name="game_details_revision">Revision</string>
<string name="game_details_file_size">File Size</string>
<string name="game_details_file_format">File Format</string>
<string name="game_details_compression">Compression</string>
<string name="game_details_block_size">Block Size</string>
<string name="game_details_no_compression">No Compression</string>

<!-- Emulation Menu -->
<string name="emulation_screenshot">Take Screenshot</string>
@@ -10,6 +10,7 @@

#include <jni.h>

#include "DiscIO/Blob.h"
#include "DiscIO/Enums.h"
#include "UICommon/GameFile.h"
#include "jni/AndroidCommon/AndroidCommon.h"
@@ -62,6 +63,16 @@ JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getDiscNumb
jobject obj);
JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getRevision(JNIEnv* env,
jobject obj);
JNIEXPORT jstring JNICALL
Java_org_dolphinemu_dolphinemu_model_GameFile_getBlobTypeString(JNIEnv* env, jobject obj);
JNIEXPORT jlong JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getBlockSize(JNIEnv* env,
jobject obj);
JNIEXPORT jstring JNICALL
Java_org_dolphinemu_dolphinemu_model_GameFile_getCompressionMethod(JNIEnv* env, jobject obj);
JNIEXPORT jboolean JNICALL
Java_org_dolphinemu_dolphinemu_model_GameFile_shouldShowFileFormatDetails(JNIEnv* env, jobject obj);
JNIEXPORT jlong JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getFileSize(JNIEnv* env,
jobject obj);
JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getBanner(JNIEnv* env,
jobject obj);
JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getBannerWidth(JNIEnv* env,
@@ -143,6 +154,36 @@ JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getRevision
return GetRef(env, obj)->GetRevision();
}

JNIEXPORT jstring JNICALL
Java_org_dolphinemu_dolphinemu_model_GameFile_getBlobTypeString(JNIEnv* env, jobject obj)
{
return ToJString(env, DiscIO::GetName(GetRef(env, obj)->GetBlobType(), true));
}

JNIEXPORT jlong JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getBlockSize(JNIEnv* env,
jobject obj)
{
return GetRef(env, obj)->GetBlockSize();
}

JNIEXPORT jstring JNICALL
Java_org_dolphinemu_dolphinemu_model_GameFile_getCompressionMethod(JNIEnv* env, jobject obj)
{
return ToJString(env, GetRef(env, obj)->GetCompressionMethod());
}

JNIEXPORT jboolean JNICALL
Java_org_dolphinemu_dolphinemu_model_GameFile_shouldShowFileFormatDetails(JNIEnv* env, jobject obj)
{
return GetRef(env, obj)->ShouldShowFileFormatDetails();
}

JNIEXPORT jlong JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getFileSize(JNIEnv* env,
jobject obj)
{
return GetRef(env, obj)->GetFileSize();
}

JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_model_GameFile_getBanner(JNIEnv* env,
jobject obj)
{
@@ -742,6 +742,14 @@ JNIEXPORT jboolean JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_InstallW
return static_cast<jboolean>(WiiUtils::InstallWAD(path));
}

JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_FormatSize(JNIEnv* env,
jobject obj,
jlong bytes,
jint decimals)
{
return ToJString(env, UICommon::FormatSize(bytes, decimals));
}

#ifdef __cplusplus
}
#endif
@@ -12,6 +12,7 @@
#include "Common/CDUtils.h"
#include "Common/CommonTypes.h"
#include "Common/File.h"
#include "Common/MsgHandler.h"

#include "DiscIO/Blob.h"
#include "DiscIO/CISOBlob.h"
@@ -25,6 +26,35 @@

namespace DiscIO
{
std::string GetName(BlobType blob_type, bool translate)
{
const auto translate_str = [translate](const std::string& str) {
return translate ? Common::GetStringT(str.c_str()) : str;
};

switch (blob_type)
{
case BlobType::PLAIN:
return "ISO";
case BlobType::DIRECTORY:
return translate_str("Directory");
case BlobType::GCZ:
return "GCZ";
case BlobType::CISO:
return "CISO";
case BlobType::WBFS:
return "WBFS";
case BlobType::TGC:
return "TGC";
case BlobType::WIA:
return "WIA";
case BlobType::RVZ:
return "RVZ";
default:
return "";
}
}

void SectorReader::SetSectorSize(int blocksize)
{
m_block_size = std::max(blocksize, 0);
@@ -41,6 +41,8 @@ enum class BlobType
RVZ,
};

std::string GetName(BlobType blob_type, bool translate);

class BlobReader
{
public:
@@ -55,6 +57,7 @@ class BlobReader
// Returns 0 if the format does not use blocks
virtual u64 GetBlockSize() const = 0;
virtual bool HasFastRandomAccessInBlock() const = 0;
virtual std::string GetCompressionMethod() const = 0;

// NOT thread-safe - can't call this from multiple threads.
virtual bool Read(u64 offset, u64 size, u8* out_ptr) = 0;
@@ -46,6 +46,7 @@ class CISOFileReader : public BlobReader

u64 GetBlockSize() const override { return m_block_size; }
bool HasFastRandomAccessInBlock() const override { return true; }
std::string GetCompressionMethod() const override { return {}; }

bool Read(u64 offset, u64 nbytes, u8* out_ptr) override;

@@ -58,6 +58,7 @@ class CompressedBlobReader : public SectorReader

u64 GetBlockSize() const override { return m_header.block_size; }
bool HasFastRandomAccessInBlock() const override { return false; }
std::string GetCompressionMethod() const override { return "Deflate"; }

u64 GetBlockCompressedSize(u64 block_num) const;
bool GetBlock(u64 block_num, u8* out_ptr) override;
@@ -168,6 +168,7 @@ class DirectoryBlobReader : public BlobReader

u64 GetBlockSize() const override { return 0; }
bool HasFastRandomAccessInBlock() const override { return true; }
std::string GetCompressionMethod() const override { return {}; }

private:
struct PartitionWithType
@@ -32,6 +32,7 @@ class DriveReader : public SectorReader

u64 GetBlockSize() const override { return ECC_BLOCK_SIZE; }
bool HasFastRandomAccessInBlock() const override { return false; }
std::string GetCompressionMethod() const override { return {}; }

private:
DriveReader(const std::string& drive);

0 comments on commit 26ed3b3

Please sign in to comment.