Skip to content

Commit 4e3c41b

Browse files
committed
[Feat] (Extension): Add an option to control customGLVersion.
1 parent ca941bd commit 4e3c41b

5 files changed

Lines changed: 203 additions & 20 deletions

File tree

app/src/main/java/com/fcl/plugin/mobileglues/MainActivity.java

Lines changed: 144 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
import java.io.File;
4848
import java.io.IOException;
4949
import java.util.ArrayList;
50+
import java.util.LinkedHashMap;
51+
import java.util.Map;
5052
import java.util.logging.Level;
5153
import java.util.logging.Logger;
5254

@@ -75,6 +77,19 @@
7577
import androidx.annotation.StringRes;
7678

7779
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener, CompoundButton.OnCheckedChangeListener {
80+
private static final Map<String, Integer> GL_VERSION_MAP = new LinkedHashMap<String, Integer>() {{
81+
put("Disabled", 0);
82+
put("OpenGL 4.6", 46);
83+
put("OpenGL 4.5", 45);
84+
put("OpenGL 4.4", 44);
85+
put("OpenGL 4.3", 43);
86+
put("OpenGL 4.2", 42);
87+
put("OpenGL 4.1", 41);
88+
put("OpenGL 4.0", 40);
89+
put("OpenGL 3.3", 33);
90+
put("OpenGL 3.2", 32);
91+
}};
92+
7893
private static final int REQUEST_CODE_SAF = 2000;
7994
public static Uri MGDirectoryUri;
8095
public static Context MainActivityContext;
@@ -122,6 +137,8 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
122137
multidrawModeOptions.add(getString(R.string.option_multidraw_mode_compute));
123138
ArrayAdapter<String> multidrawModeAdapter = new ArrayAdapter<>(this, R.layout.spinner, multidrawModeOptions);
124139
binding.spinnerMultidrawMode.setAdapter(multidrawModeAdapter);
140+
141+
addCustomGLVersionOptions();
125142

126143
ArrayList<String> angleClearWorkaroundOptions = new ArrayList<>();
127144
angleClearWorkaroundOptions.add(getString(R.string.option_angle_clear_workaround_disable));
@@ -375,6 +392,7 @@ private void showOptions() {
375392
binding.spinnerAngle.setOnItemSelectedListener(null);
376393
binding.spinnerNoError.setOnItemSelectedListener(null);
377394
binding.spinnerMultidrawMode.setOnItemSelectedListener(null);
395+
binding.spinnerCustomGlVersion.setOnItemSelectedListener(null);
378396
binding.angleClearWorkaround.setOnItemSelectedListener(null);
379397
binding.switchExtGl43.setOnCheckedChangeListener(null);
380398
binding.switchExtCs.setOnCheckedChangeListener(null);
@@ -383,7 +401,7 @@ private void showOptions() {
383401
config = MGConfig.loadConfig(this);
384402

385403
if (config == null) {
386-
config = new MGConfig(1, 0, 0, 1, 0, 1, 32, 0, 0);
404+
config = new MGConfig(1, 0, 0, 1, 0, 1, 32, 0, 0, 0);
387405
}
388406
if (config.getEnableANGLE() > 3 || config.getEnableANGLE() < 0)
389407
config.setEnableANGLE(0);
@@ -402,10 +420,12 @@ private void showOptions() {
402420
binding.switchExtTimerQuery.setChecked(config.getEnableExtTimerQuery() == 0);
403421
binding.switchExtDirectStateAccess.setChecked(config.getEnableExtDirectStateAccess() == 0);
404422
binding.switchExtCs.setChecked(config.getEnableExtComputeShader() == 1);
423+
setCustomGLVersionSpinnerSelectionByGLVersion(config.getCustomGLVersion());
405424

406425
binding.spinnerAngle.setOnItemSelectedListener(this);
407426
binding.spinnerNoError.setOnItemSelectedListener(this);
408427
binding.spinnerMultidrawMode.setOnItemSelectedListener(this);
428+
binding.spinnerCustomGlVersion.setOnItemSelectedListener(this);
409429
binding.angleClearWorkaround.setOnItemSelectedListener(this);
410430
binding.switchExtGl43.setOnCheckedChangeListener(this);
411431
binding.switchExtTimerQuery.setOnCheckedChangeListener(this);
@@ -453,6 +473,7 @@ public void onTextChanged(CharSequence charSequence, int start, int before, int
453473
binding.spinnerAngle.setOnItemSelectedListener(this);
454474
binding.spinnerNoError.setOnItemSelectedListener(this);
455475
binding.spinnerMultidrawMode.setOnItemSelectedListener(this);
476+
binding.spinnerCustomGlVersion.setOnItemSelectedListener(this);
456477
binding.angleClearWorkaround.setOnItemSelectedListener(this);
457478
binding.switchExtGl43.setOnCheckedChangeListener(this);
458479
binding.switchExtTimerQuery.setOnCheckedChangeListener(this);
@@ -521,7 +542,7 @@ private void checkPermission() {
521542

522543
MGDirectoryUri = treeUri;
523544
MGConfig config = MGConfig.loadConfig(this);
524-
if (config == null) config = new MGConfig(1, 0, 0, 1, 0, 1, 32, 0, 0);
545+
if (config == null) config = new MGConfig(1, 0, 0, 1, 0, 1, 32, 0, 0, 0);
525546
config.saveConfig(this);
526547
showOptions();
527548
}
@@ -598,6 +619,67 @@ public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l)
598619
}
599620
}
600621

622+
if (adapterView == binding.spinnerCustomGlVersion && config != null) {
623+
int previous = config.getCustomGLVersion();
624+
int newValue = getGLVersionBySpinnerIndex(i);
625+
626+
if (newValue == previous) {
627+
return;
628+
}
629+
630+
try {
631+
if (previous == 0) {
632+
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this);
633+
builder.setTitle(getString(R.string.dialog_title_warning))
634+
.setMessage(getText(R.string.warning_enabling_custom_gl_version))
635+
.setNegativeButton(getString(R.string.dialog_negative), (dialog, which) -> {
636+
isSpinnerInitialized = false;
637+
binding.spinnerCustomGlVersion.setSelection(getSpinnerIndexByGLVersion(previous));
638+
isSpinnerInitialized = true;
639+
});
640+
641+
androidx.appcompat.app.AlertDialog dialog = builder.create();
642+
643+
final int cooldownSeconds = 15;
644+
final int[] remainingSeconds = {cooldownSeconds};
645+
646+
dialog.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.ok), (dialogInterface, which) -> {
647+
try {
648+
config.setCustomGLVersion(newValue);
649+
} catch (IOException e) {
650+
Logger.getLogger("MG").log(Level.SEVERE, "Failed to save config! Exception: ", e);
651+
Toast.makeText(MainActivity.this, getString(R.string.warning_save_failed), Toast.LENGTH_SHORT).show();
652+
}
653+
});
654+
655+
dialog.setOnShowListener(dialogInterface -> {
656+
Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
657+
positiveButton.setText(getString(R.string.ok_with_countdown, remainingSeconds[0]));
658+
positiveButton.setEnabled(false);
659+
660+
new CountDownTimer(cooldownSeconds * 1000, 1000) {
661+
public void onTick(long millisUntilFinished) {
662+
remainingSeconds[0] = (int) (millisUntilFinished / 1000);
663+
positiveButton.setText(getString(R.string.ok_with_countdown, remainingSeconds[0]));
664+
}
665+
public void onFinish() {
666+
positiveButton.setText(R.string.ok);
667+
positiveButton.setTextColor(ContextCompat.getColor(MainActivityContext, android.R.color.holo_red_dark));
668+
positiveButton.setEnabled(true);
669+
}
670+
}.start();
671+
});
672+
dialog.setCancelable(false);
673+
dialog.show();
674+
} else {
675+
config.setCustomGLVersion(newValue);
676+
}
677+
} catch (IOException e) {
678+
Logger.getLogger("MG").log(Level.SEVERE, "Failed to save config! Exception: ", e.getCause());
679+
Toast.makeText(this, getString(R.string.warning_save_failed), Toast.LENGTH_SHORT).show();
680+
}
681+
}
682+
601683
if (adapterView == binding.angleClearWorkaround && config != null) {
602684
try {
603685
int previous = config.getAngleDepthClearFixMode();
@@ -811,4 +893,64 @@ private boolean isAdreno740() {
811893
return renderer != null && renderer.toLowerCase().contains("adreno") && renderer.contains("740");
812894
}
813895

896+
private void addCustomGLVersionOptions() {
897+
ArrayList<String> glVersionOptions = new ArrayList<>(GL_VERSION_MAP.keySet());
898+
899+
ArrayAdapter<String> glVersionAdapter = new ArrayAdapter<>(
900+
this,
901+
R.layout.spinner,
902+
glVersionOptions
903+
);
904+
905+
binding.spinnerCustomGlVersion.setAdapter(glVersionAdapter);
906+
}
907+
908+
private void setCustomGLVersionSpinnerSelectionByGLVersion(int glVersion) {
909+
String targetDisplay = "Disabled";
910+
911+
for (Map.Entry<String, Integer> entry : GL_VERSION_MAP.entrySet()) {
912+
if (entry.getValue() == glVersion) {
913+
targetDisplay = entry.getKey();
914+
break;
915+
}
916+
}
917+
918+
// noinspection unchecked
919+
ArrayAdapter<String> adapter = (ArrayAdapter<String>)binding.spinnerCustomGlVersion.getAdapter();
920+
int position = adapter.getPosition(targetDisplay);
921+
922+
binding.spinnerCustomGlVersion.setSelection(Math.max(position, 0));
923+
}
924+
925+
private void setCustomGLVersionBySpinnerIndex(int index) throws IOException {
926+
if (config == null || !isSpinnerInitialized) return;
927+
928+
String selected = (String) binding.spinnerCustomGlVersion.getItemAtPosition(index);
929+
930+
Integer glVersionValue = GL_VERSION_MAP.get(selected);
931+
if (glVersionValue == null) {
932+
glVersionValue = 0;
933+
}
934+
935+
config.setCustomGLVersion(glVersionValue);
936+
}
937+
938+
private int getGLVersionBySpinnerIndex(int index) {
939+
String selected = (String) binding.spinnerCustomGlVersion.getItemAtPosition(index);
940+
Integer glVersionValue = GL_VERSION_MAP.get(selected);
941+
return glVersionValue != null ? glVersionValue : 0;
942+
}
943+
944+
private int getSpinnerIndexByGLVersion(int glVersion) {
945+
String targetDisplay = "Disabled";
946+
for (Map.Entry<String, Integer> entry : GL_VERSION_MAP.entrySet()) {
947+
if (entry.getValue() == glVersion) {
948+
targetDisplay = entry.getKey();
949+
break;
950+
}
951+
}
952+
ArrayAdapter<String> adapter = (ArrayAdapter<String>) binding.spinnerCustomGlVersion.getAdapter();
953+
return adapter.getPosition(targetDisplay);
954+
}
955+
814956
}

app/src/main/java/com/fcl/plugin/mobileglues/settings/MGConfig.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ public class MGConfig {
3030
private int maxGlslCacheSize;
3131
private int multidrawMode;
3232
private int angleDepthClearFixMode;
33+
private int customGLVersion;
3334

3435
public MGConfig(int enableANGLE, int enableNoError, int enableExtGL43,
3536
int enableExtTimerQuery, int enableExtComputeShader, int enableExtDirectStateAccess,
36-
int maxGlslCacheSize, int multidrawMode, int angleDepthClearFixMode) {
37+
int maxGlslCacheSize, int multidrawMode, int angleDepthClearFixMode, int customGLVersion) {
3738
this.enableANGLE = enableANGLE;
3839
this.enableNoError = enableNoError;
3940
this.enableExtGL43 = enableExtGL43;
@@ -43,6 +44,7 @@ public MGConfig(int enableANGLE, int enableNoError, int enableExtGL43,
4344
this.maxGlslCacheSize = maxGlslCacheSize;
4445
this.multidrawMode = multidrawMode;
4546
this.angleDepthClearFixMode = angleDepthClearFixMode;
47+
this.customGLVersion = customGLVersion;
4648
}
4749

4850
public static MGConfig loadConfig(Context context) {
@@ -164,6 +166,15 @@ public void setAngleDepthClearFixMode(int angleDepthClearFixMode) throws IOExcep
164166
saveConfig();
165167
}
166168

169+
public int getCustomGLVersion() {
170+
return customGLVersion;
171+
}
172+
173+
public void setCustomGLVersion(int customGLVersion) throws IOException {
174+
this.customGLVersion = customGLVersion;
175+
saveConfig();
176+
}
177+
167178
private void clearCacheFile() {
168179
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
169180
Uri cacheUri = DocumentsContract.buildDocumentUriUsingTree(MainActivity.MGDirectoryUri,

app/src/main/res/layout/activity_main.xml

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,24 @@
106106
android:layout_height="wrap_content"
107107
android:layout_margin="5dp"
108108
android:minHeight="48dp"
109-
app:layout_constraintBottom_toTopOf="@+id/text_angle_clear_workaround" />
109+
app:layout_constraintBottom_toTopOf="@+id/text_option_gl_version" />
110+
111+
<TextView
112+
android:id="@+id/text_option_gl_version"
113+
android:layout_width="wrap_content"
114+
android:layout_height="wrap_content"
115+
android:layout_margin="5dp"
116+
android:text="@string/option_custom_gl_version"
117+
app:layout_constraintBottom_toTopOf="@+id/spinner_custom_gl_version"
118+
app:layout_constraintStart_toStartOf="parent" />
119+
120+
<Spinner
121+
android:id="@+id/spinner_custom_gl_version"
122+
android:layout_width="match_parent"
123+
android:layout_height="wrap_content"
124+
android:layout_margin="5dp"
125+
android:minHeight="48dp"
126+
app:layout_constraintBottom_toTopOf="@+id/text_angle_clear_workaround" />
110127

111128
<TextView
112129
android:id="@+id/text_angle_clear_workaround"
@@ -165,4 +182,4 @@
165182
android:layout_margin="6dp"
166183
android:text="@string/open_options" />
167184

168-
</androidx.coordinatorlayout.widget.CoordinatorLayout>
185+
</androidx.coordinatorlayout.widget.CoordinatorLayout>

app/src/main/res/values-zh/strings.xml

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@
4646
<string name="option_ext_timer_query">禁用推荐的 timer_query 扩展</string>
4747
<string name="option_ext_direct_state_access">禁用高级的 direct_state_access 扩展</string>
4848

49+
<string name="option_custom_gl_version">自定义目标 OpenGL 版本</string>
50+
<string name="warning_enabling_custom_gl_version"><b><big>重要信息:</big></b>\n\n
51+
• 自定义 OpenGL 版本可能会<b><font color="@android:color/holo_red_dark">造成游戏崩溃或渲染错误,请谨慎使用</font></b>!\n
52+
• 您启用此功能后,我们将<b><font color="@android:color/holo_red_dark">不再受理</font></b>您遇到的所有额外问题!反馈问题前,请注意<b><font color="@android:color/holo_red_dark">禁用此功能</font></b>!\n
53+
• 为确保稳定性,在没有必要的情况(如 Mods 强行检测 OpenGL 版本等)下,请<b>不要启用此功能</b>!</string>
54+
4955
<string name="dialog_positive">确认</string>
5056
<string name="dialog_negative">取消</string>
5157
<string name="dialog_github">GitHub 发布页</string>
@@ -57,8 +63,8 @@
5763
<string name="dialog_permission_msg_android_Q">修改渲染选项需要读写权限,请授予读写权限后再修改。\n您稍后需要选择这个目录:\n%s\n若不存在名为 MG 的文件夹,请自行创建名为 MG 的文件夹。</string>
5864

5965
<string name="dialog_title_warning">警告</string>
60-
<string name="warning_ext_gl43_enable">启用不完整的 OpenGL43 扩展可能会导致部分光影、Mods错误,是否继续?</string>
61-
<string name="warning_ext_cs_enable">启用不完整的 ARB_compute_shader 扩展可能会导致部分光影、Mods错误,是否继续?</string>
66+
<string name="warning_ext_gl43_enable">启用不完整的 OpenGL43 扩展可能会导致部分光影、Mods 错误,是否继续?</string>
67+
<string name="warning_ext_cs_enable">启用不完整的 ARB_compute_shader 扩展可能会导致部分光影、Mods 错误,是否继续?</string>
6268

6369
<string name="warning_adreno_740_angle">在 Adreno 740 设备上启用 ANGLE 极有可能导致严重渲染错误,是否继续?</string>
6470
<string name="warning_enabling_angle_clear_workaround">启用 ANGLE Depth Clear 修复会修复 ANGLE 在 Minecraft 1.21.5+ 原版中的手持物品被遮挡的问题,但会导致性能下降,是否继续?</string>
@@ -74,16 +80,16 @@
7480
• <b>缓存文件:</b> MobileGlues 运行时生成的 GLSL 缓存(用于加快加载速度)将被清空。\n
7581
• <b>日志文件:</b> MobileGlues 运行过程中产生的日志文件将被删除。\n
7682
• <b>文件夹访问权限:</b> MobileGlues 应用当前拥有的对设备存储空间中特定文件夹的读写访问权限将被撤销。\n\n
77-
请注意,此操作是<b><font color="@android:color/holo_red_dark">不可逆</font></b>的。 一旦您点击“确定”,上述所有文件将被永久删除,无法恢复。如果您在未来要重新使用MobileGlues,您将需要重新配置MobileGlues。\n\n
83+
请注意,此操作是<b><font color="@android:color/holo_red_dark">不可逆</font></b>的。 一旦您点击“确定”,上述所有文件将被永久删除,无法恢复。如果您在未来要重新使用 MobileGlues,您将需要重新配置 MobileGlues。\n\n
7884
<b><font color="@android:color/holo_red_dark">确定要继续吗?</font></b></string>
7985
<string name="ok">确定</string>
8086
<string name="ok_with_countdown">确定 (%d 秒)</string>
81-
<string name="removing_mobileglues">正在移除 MobileGlues...</string>
82-
<string name="deleting_config">正在删除配置文件...</string>
83-
<string name="deleting_cache">正在删除缓存文件...</string>
84-
<string name="deleting_logs">正在删除日志文件...</string>
85-
<string name="cleaning_directory">正在清理目录...</string>
86-
<string name="removing_permissions">正在移除权限...</string>
87+
<string name="removing_mobileglues">正在移除 MobileGlues</string>
88+
<string name="deleting_config">正在删除配置文件</string>
89+
<string name="deleting_cache">正在删除缓存文件</string>
90+
<string name="deleting_logs">正在删除日志文件</string>
91+
<string name="cleaning_directory">正在清理目录</string>
92+
<string name="removing_permissions">正在移除权限</string>
8793
<string name="remove_failed">移除失败: %s</string>
8894
<string name="remove_complete_title">移除完成</string>
8995
<string name="remove_complete_message">MobileGlues 相关文件已完全移除。\n若需进一步在您的设备上完全移除 MobileGlues,请卸载此软件。</string>

0 commit comments

Comments
 (0)