mirror of
https://github.com/2009scape/2009Scape-mobile.git
synced 2025-12-10 10:20:32 -07:00
Dummy Launcher (Need to set the main activity back to the default of TestStorageActivity to unpack the runtime before the DummyLauncher works.
This commit is contained in:
parent
844a90431b
commit
dada3194c3
33 changed files with 979 additions and 196 deletions
136
AndroidManifest-back.xml
Normal file
136
AndroidManifest-back.xml
Normal file
|
|
@ -0,0 +1,136 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<uses-feature android:glEsVersion="0x00020000" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.type.pc"
|
||||||
|
android:required="false" />
|
||||||
|
|
||||||
|
<uses-permission
|
||||||
|
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="28" />
|
||||||
|
<uses-permission
|
||||||
|
android:name="android.permission.READ_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="28" />
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
|
<queries>
|
||||||
|
<package android:name="net.kdt.pojavlaunch.ffmpeg" />
|
||||||
|
</queries>
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".PojavApplication"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:allowNativeHeapPointerTagging="false"
|
||||||
|
android:appCategory="game"
|
||||||
|
android:hasFragileUserData="true"
|
||||||
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
android:isGame="true"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:process=":launcher"
|
||||||
|
android:resizeableActivity="true"
|
||||||
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
|
android:theme="@style/AppTheme">
|
||||||
|
<activity
|
||||||
|
android:name=".DummyLauncher"
|
||||||
|
android:exported="true"
|
||||||
|
android:screenOrientation="landscape"
|
||||||
|
>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<activity
|
||||||
|
android:name=".MissingStorageActivity"
|
||||||
|
android:exported="false" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="android.max_aspect"
|
||||||
|
android:value="ratio_float" />
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".TestStorageActivity"
|
||||||
|
android:exported="true"
|
||||||
|
android:label="@string/app_short_name"
|
||||||
|
android:launchMode="singleTop">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<activity
|
||||||
|
android:name=".LauncherActivity"
|
||||||
|
android:label="@string/app_short_name" />
|
||||||
|
<activity
|
||||||
|
android:name=".ImportControlActivity"
|
||||||
|
android:configChanges="keyboard|keyboardHidden"
|
||||||
|
android:exported="true"
|
||||||
|
android:launchMode="singleInstance"
|
||||||
|
android:windowSoftInputMode="stateVisible">
|
||||||
|
<intent-filter
|
||||||
|
android:label="@string/import_control_label"
|
||||||
|
android:scheme="content"
|
||||||
|
tools:ignore="AppLinkUrlError">
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
|
||||||
|
<data android:mimeType="application/json" />
|
||||||
|
<data android:mimeType="text/json" />
|
||||||
|
<data android:mimeType="text/plain" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<activity
|
||||||
|
android:name=".FatalErrorActivity"
|
||||||
|
android:configChanges="keyboardHidden|orientation|screenSize|keyboard|navigation"
|
||||||
|
android:theme="@style/Theme.AppCompat.DayNight.Dialog" />
|
||||||
|
<activity
|
||||||
|
android:name=".ExitActivity"
|
||||||
|
android:configChanges="keyboardHidden|orientation|screenSize|keyboard|navigation"
|
||||||
|
android:theme="@style/Theme.AppCompat.DayNight.Dialog" />
|
||||||
|
<activity
|
||||||
|
android:name=".JavaGUILauncherActivity"
|
||||||
|
android:configChanges="keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|keyboard|navigation|uiMode"
|
||||||
|
android:screenOrientation="sensorLandscape" />
|
||||||
|
<activity
|
||||||
|
android:name=".CustomControlsActivity"
|
||||||
|
android:configChanges="keyboardHidden|orientation|screenSize|keyboard|navigation"
|
||||||
|
android:exported="false"
|
||||||
|
android:screenOrientation="sensorLandscape">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name=".CustomControlsActivity" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<activity
|
||||||
|
android:name=".MainActivity"
|
||||||
|
android:configChanges="keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|keyboard|navigation|uiMode"
|
||||||
|
android:launchMode="standard"
|
||||||
|
android:process=":game"
|
||||||
|
android:screenOrientation="sensorLandscape" />
|
||||||
|
|
||||||
|
<provider
|
||||||
|
android:name=".scoped.FolderProvider"
|
||||||
|
android:authorities="@string/storageProviderAuthorities"
|
||||||
|
android:exported="true"
|
||||||
|
android:grantUriPermissions="true"
|
||||||
|
android:permission="android.permission.MANAGE_DOCUMENTS">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.content.action.DOCUMENTS_PROVIDER" />
|
||||||
|
</intent-filter>
|
||||||
|
</provider>
|
||||||
|
|
||||||
|
<service android:name=".services.ProgressService" />
|
||||||
|
<service
|
||||||
|
android:name=".services.GameService"
|
||||||
|
android:process=":game" />
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
|
|
@ -199,4 +199,6 @@ dependencies {
|
||||||
// implementation 'net.sourceforge.streamsupport:streamsupport-cfuture:1.7.0'
|
// implementation 'net.sourceforge.streamsupport:streamsupport-cfuture:1.7.0'
|
||||||
|
|
||||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
|
implementation 'androidx.appcompat:appcompat:1.6.1'
|
||||||
|
implementation 'com.google.android.material:material:1.5.0'
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,13 +40,12 @@
|
||||||
android:value="ratio_float" />
|
android:value="ratio_float" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".TestStorageActivity"
|
android:name=".DummyLauncher"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:label="@string/app_short_name"
|
android:label="@string/app_short_name"
|
||||||
android:launchMode="singleTop">
|
android:launchMode="singleTop">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
@ -119,7 +118,4 @@
|
||||||
android:name=".services.GameService"
|
android:name=".services.GameService"
|
||||||
android:process=":game" />
|
android:process=":game" />
|
||||||
</application>
|
</application>
|
||||||
<queries>
|
|
||||||
<package android:name="net.kdt.pojavlaunch.ffmpeg"/>
|
|
||||||
</queries>
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|
@ -1 +1 @@
|
||||||
1687691695196
|
1690130848255
|
||||||
|
|
@ -1 +1 @@
|
||||||
1688133008591
|
1690130848291
|
||||||
|
|
@ -1 +1 @@
|
||||||
1689180036097
|
1690130848323
|
||||||
10
app_pojavlauncher/src/main/assets/config.json
Normal file
10
app_pojavlauncher/src/main/assets/config.json
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"ip_management": "play.2009scape.org",
|
||||||
|
"ip_address": "play.2009scape.org",
|
||||||
|
"world": 1,
|
||||||
|
"server_port": 43594,
|
||||||
|
"wl_port": 43595,
|
||||||
|
"js5_port": 43595,
|
||||||
|
"mouseWheelZoom": true,
|
||||||
|
"pluginsFolder": "plugins"
|
||||||
|
}
|
||||||
BIN
app_pojavlauncher/src/main/assets/plugins/GroundItems.zip
Normal file
BIN
app_pojavlauncher/src/main/assets/plugins/GroundItems.zip
Normal file
Binary file not shown.
BIN
app_pojavlauncher/src/main/assets/plugins/LoginTimer.zip
Normal file
BIN
app_pojavlauncher/src/main/assets/plugins/LoginTimer.zip
Normal file
Binary file not shown.
Binary file not shown.
BIN
app_pojavlauncher/src/main/assets/plugins/RememberMyLogin.zip
Normal file
BIN
app_pojavlauncher/src/main/assets/plugins/RememberMyLogin.zip
Normal file
Binary file not shown.
Binary file not shown.
BIN
app_pojavlauncher/src/main/assets/plugins/XPDropPlugin.zip
Normal file
BIN
app_pojavlauncher/src/main/assets/plugins/XPDropPlugin.zip
Normal file
Binary file not shown.
Binary file not shown.
|
|
@ -10,8 +10,8 @@ import java.util.*;
|
||||||
import net.kdt.pojavlaunch.utils.*;
|
import net.kdt.pojavlaunch.utils.*;
|
||||||
|
|
||||||
public class AWTCanvasView extends TextureView implements TextureView.SurfaceTextureListener, Runnable {
|
public class AWTCanvasView extends TextureView implements TextureView.SurfaceTextureListener, Runnable {
|
||||||
public static final int AWT_CANVAS_WIDTH = 720;
|
public static final int AWT_CANVAS_WIDTH = 765;
|
||||||
public static final int AWT_CANVAS_HEIGHT = 600;
|
public static final int AWT_CANVAS_HEIGHT = 503;
|
||||||
private static final int MAX_SIZE = 100;
|
private static final int MAX_SIZE = 100;
|
||||||
private static final double NANOS = 1000000000.0;
|
private static final double NANOS = 1000000000.0;
|
||||||
private boolean mIsDestroyed = false;
|
private boolean mIsDestroyed = false;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,160 @@
|
||||||
|
package net.kdt.pojavlaunch;
|
||||||
|
|
||||||
|
import static net.kdt.pojavlaunch.Tools.launchGLJRE;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.drawable.ColorDrawable;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.view.Window;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
|
|
||||||
|
import net.kdt.pojavlaunch.value.MinecraftAccount;
|
||||||
|
import net.kdt.pojavlaunch.value.launcherprofiles.MinecraftProfile;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
public class DummyLauncher extends AppCompatActivity {
|
||||||
|
|
||||||
|
private FloatingActionButton fab;
|
||||||
|
private Button playHD;
|
||||||
|
private Button playSD;
|
||||||
|
private static final int FILE_SELECT_CODE_JSON = 0;
|
||||||
|
private static final int FILE_SELECT_CODE_ZIP = 1;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_dummy_launcher);
|
||||||
|
fab = findViewById(R.id.myFab);
|
||||||
|
playHD = findViewById(R.id.playHD);
|
||||||
|
playSD = findViewById(R.id.playSD);
|
||||||
|
|
||||||
|
playHD.setOnClickListener(view -> {
|
||||||
|
Log.i("downthecrop","hello from play HD touch");
|
||||||
|
// Launch MainActivity.java here and call runCraft()
|
||||||
|
Intent intent = new Intent(DummyLauncher.this, MainActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
playSD.setOnClickListener(view -> {
|
||||||
|
Log.i("downthecrop","hello from play SD touch");
|
||||||
|
Intent intent = new Intent(DummyLauncher.this, JavaGUILauncherActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
fab.setOnClickListener(view -> showBottomDialog());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
|
private void showBottomDialog() {
|
||||||
|
final Dialog dialog = new Dialog(this);
|
||||||
|
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||||
|
dialog.setContentView(R.layout.bottomsheetlayout);
|
||||||
|
dialog.show();
|
||||||
|
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||||
|
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
|
||||||
|
dialog.getWindow().setGravity(Gravity.BOTTOM);
|
||||||
|
|
||||||
|
final Button loadConfig = dialog.findViewById(R.id.loadConfig);
|
||||||
|
final Button loadPlugin = dialog.findViewById(R.id.loadPlugin);
|
||||||
|
|
||||||
|
loadConfig.setOnTouchListener((v, event) -> {
|
||||||
|
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||||
|
showFileChooser(FILE_SELECT_CODE_JSON);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
loadPlugin.setOnTouchListener((v, event) -> {
|
||||||
|
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||||
|
showFileChooser(FILE_SELECT_CODE_ZIP);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showFileChooser(int requestCode) {
|
||||||
|
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||||
|
|
||||||
|
switch(requestCode){
|
||||||
|
case FILE_SELECT_CODE_JSON:
|
||||||
|
intent.setType("application/json");
|
||||||
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
|
break;
|
||||||
|
case FILE_SELECT_CODE_ZIP:
|
||||||
|
intent.setType("application/zip");
|
||||||
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
intent.setType("*/*");
|
||||||
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
startActivityForResult(
|
||||||
|
Intent.createChooser(intent, "Select a File to Upload"),
|
||||||
|
requestCode);
|
||||||
|
} catch (android.content.ActivityNotFoundException ex) {
|
||||||
|
// Potentially direct the user to the Market with a Dialog
|
||||||
|
Toast.makeText(this, "Please install a File Manager.",
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
|
if (requestCode == FILE_SELECT_CODE_JSON) {
|
||||||
|
if (resultCode == RESULT_OK) {
|
||||||
|
Uri uri = data.getData();
|
||||||
|
|
||||||
|
// TODO: Change destination based on file type
|
||||||
|
File config = new File(Tools.DIR_DATA, "config.json");
|
||||||
|
try {
|
||||||
|
Log.d("TAG", "Starting copy: " + uri.getPath());
|
||||||
|
InputStream inputStream = getContentResolver().openInputStream(uri);
|
||||||
|
FileOutputStream fileOutputStream = new FileOutputStream(config);
|
||||||
|
byte buf[] = new byte[1024];
|
||||||
|
int len;
|
||||||
|
while ((len = inputStream.read(buf)) > 0) {
|
||||||
|
fileOutputStream.write(buf, 0, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
Toast.makeText(this, "Config loaded. Please restart the app.",
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
|
||||||
|
fileOutputStream.close();
|
||||||
|
inputStream.close();
|
||||||
|
|
||||||
|
// TODO: unzip the plugin here
|
||||||
|
} catch (IOException e1) {
|
||||||
|
Log.d("error", "Error with file " + e1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -7,6 +7,7 @@ import android.content.ClipboardManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.GestureDetector;
|
import android.view.GestureDetector;
|
||||||
|
import android.view.KeyEvent;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
@ -24,6 +25,7 @@ import net.kdt.pojavlaunch.multirt.MultiRTUtils;
|
||||||
import net.kdt.pojavlaunch.multirt.Runtime;
|
import net.kdt.pojavlaunch.multirt.Runtime;
|
||||||
import net.kdt.pojavlaunch.prefs.LauncherPreferences;
|
import net.kdt.pojavlaunch.prefs.LauncherPreferences;
|
||||||
import net.kdt.pojavlaunch.utils.JREUtils;
|
import net.kdt.pojavlaunch.utils.JREUtils;
|
||||||
|
import net.kdt.pojavlaunch.utils.KeyEncoder;
|
||||||
import net.kdt.pojavlaunch.utils.MathUtils;
|
import net.kdt.pojavlaunch.utils.MathUtils;
|
||||||
|
|
||||||
import org.lwjgl.glfw.CallbackBridge;
|
import org.lwjgl.glfw.CallbackBridge;
|
||||||
|
|
@ -149,23 +151,13 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
||||||
try {
|
try {
|
||||||
|
|
||||||
placeMouseAt(CallbackBridge.physicalWidth / 2f, CallbackBridge.physicalHeight / 2f);
|
placeMouseAt(CallbackBridge.physicalWidth / 2f, CallbackBridge.physicalHeight / 2f);
|
||||||
|
|
||||||
final File modFile = (File) getIntent().getExtras().getSerializable("modFile");
|
|
||||||
final String javaArgs = getIntent().getExtras().getString("javaArgs");
|
|
||||||
String jreName = LauncherPreferences.PREF_DEFAULT_RUNTIME;
|
String jreName = LauncherPreferences.PREF_DEFAULT_RUNTIME;
|
||||||
if(modFile != null) {
|
|
||||||
int javaVersion = getJavaVersion(modFile);
|
|
||||||
if(javaVersion != -1) {
|
|
||||||
String autoselectRuntime = MultiRTUtils.getNearestJreName(javaVersion);
|
|
||||||
if (autoselectRuntime != null) jreName = autoselectRuntime;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
final Runtime runtime = MultiRTUtils.forceReread(jreName);
|
final Runtime runtime = MultiRTUtils.forceReread(jreName);
|
||||||
|
|
||||||
mSkipDetectMod = getIntent().getExtras().getBoolean("skipDetectMod", false);
|
mSkipDetectMod = false;
|
||||||
if(getIntent().getExtras().getBoolean("openLogOutput", false)) openLogOutput(null);
|
|
||||||
if (mSkipDetectMod) {
|
if (mSkipDetectMod) {
|
||||||
new Thread(() -> launchJavaRuntime(runtime, modFile, javaArgs), "JREMainThread").start();
|
new Thread(() -> launchJavaRuntime(runtime, ""), "JREMainThread").start();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -173,7 +165,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
||||||
openLogOutput(null);
|
openLogOutput(null);
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
try {
|
try {
|
||||||
final int exit = doCustomInstall(runtime, modFile, javaArgs);
|
final int exit = launchJavaRuntime(runtime, "");
|
||||||
Logger.appendToLog(getString(R.string.toast_optifine_success));
|
Logger.appendToLog(getString(R.string.toast_optifine_success));
|
||||||
if (exit != 0) return;
|
if (exit != 0) return;
|
||||||
runOnUiThread(() -> {
|
runOnUiThread(() -> {
|
||||||
|
|
@ -254,6 +246,14 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean dispatchKeyEvent(KeyEvent event) {
|
||||||
|
if(event.getAction() == KeyEvent.ACTION_DOWN){
|
||||||
|
KeyEncoder.sendEncodedChar(event.getKeyCode(),(char)event.getUnicodeChar());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public void placeMouseAt(float x, float y) {
|
public void placeMouseAt(float x, float y) {
|
||||||
mMousePointerImageView.setX(x);
|
mMousePointerImageView.setX(x);
|
||||||
mMousePointerImageView.setY(y);
|
mMousePointerImageView.setY(y);
|
||||||
|
|
@ -287,33 +287,23 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
||||||
Toast.LENGTH_SHORT).show();
|
Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int launchJavaRuntime(Runtime runtime, File modFile, String javaArgs) {
|
public int launchJavaRuntime(Runtime runtime, String javaArgs) {
|
||||||
|
runtime = MultiRTUtils.forceReread("Internal");
|
||||||
JREUtils.redirectAndPrintJRELog();
|
JREUtils.redirectAndPrintJRELog();
|
||||||
try {
|
try {
|
||||||
List<String> javaArgList = new ArrayList<>();
|
List<String> javaArgList = new ArrayList<>();
|
||||||
|
File gamedir = new File(Tools.DIR_DATA);
|
||||||
|
|
||||||
// Enable Caciocavallo
|
// Enable Caciocavallo
|
||||||
Tools.getCacioJavaArgs(javaArgList,runtime.javaVersion == 8);
|
Tools.getCacioJavaArgs(javaArgList,runtime.javaVersion == 8);
|
||||||
|
javaArgList.add("-DconfigFile="+Tools.DIR_DATA + "/config.json");
|
||||||
if (javaArgs != null) {
|
javaArgList.add("-DpluginDir="+ Tools.DIR_DATA + "/plugins/");
|
||||||
javaArgList.addAll(Arrays.asList(javaArgs.split(" ")));
|
javaArgList.add("-jar");
|
||||||
} else {
|
javaArgList.add(Tools.DIR_DATA+"/rt4.jar");
|
||||||
javaArgList.add("-jar");
|
|
||||||
javaArgList.add(modFile.getAbsolutePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (LauncherPreferences.PREF_JAVA_SANDBOX) {
|
|
||||||
Collections.reverse(javaArgList);
|
|
||||||
javaArgList.add("-Xbootclasspath/a:" + Tools.DIR_DATA + "/security/pro-grade.jar");
|
|
||||||
javaArgList.add("-Djava.security.manager=net.sourceforge.prograde.sm.ProGradeJSM");
|
|
||||||
javaArgList.add("-Djava.security.policy=" + Tools.DIR_DATA + "/security/java_sandbox.policy");
|
|
||||||
Collections.reverse(javaArgList);
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger.appendToLog("Info: Java arguments: " + Arrays.toString(javaArgList.toArray(new String[0])));
|
Logger.appendToLog("Info: Java arguments: " + Arrays.toString(javaArgList.toArray(new String[0])));
|
||||||
|
|
||||||
return JREUtils.launchJavaVM(this, runtime,null,javaArgList, LauncherPreferences.PREF_CUSTOM_JAVA_ARGS);
|
return JREUtils.launchJavaVM(this, runtime,gamedir,javaArgList, LauncherPreferences.PREF_CUSTOM_JAVA_ARGS);
|
||||||
} catch (Throwable th) {
|
} catch (Throwable th) {
|
||||||
Tools.showError(this, th, true);
|
Tools.showError(this, th, true);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -324,7 +314,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc
|
||||||
|
|
||||||
private int doCustomInstall(Runtime runtime, File modFile, String javaArgs) {
|
private int doCustomInstall(Runtime runtime, File modFile, String javaArgs) {
|
||||||
mSkipDetectMod = true;
|
mSkipDetectMod = true;
|
||||||
return launchJavaRuntime(runtime, modFile, javaArgs);
|
return launchJavaRuntime(runtime, javaArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void toggleKeyboard(View view) {
|
public void toggleKeyboard(View view) {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package net.kdt.pojavlaunch;
|
package net.kdt.pojavlaunch;
|
||||||
|
|
||||||
import static net.kdt.pojavlaunch.Architecture.ARCH_X86;
|
|
||||||
import static net.kdt.pojavlaunch.Tools.currentDisplayMetrics;
|
import static net.kdt.pojavlaunch.Tools.currentDisplayMetrics;
|
||||||
import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_SUSTAINED_PERFORMANCE;
|
import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_SUSTAINED_PERFORMANCE;
|
||||||
import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_USE_ALTERNATE_SURFACE;
|
import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_USE_ALTERNATE_SURFACE;
|
||||||
|
|
@ -170,7 +169,6 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe
|
||||||
case 1: openLogOutput(); break;
|
case 1: openLogOutput(); break;
|
||||||
case 2: dialogSendCustomKey(); break;
|
case 2: dialogSendCustomKey(); break;
|
||||||
case 3: adjustMouseSpeedLive(); break;
|
case 3: adjustMouseSpeedLive(); break;
|
||||||
case 4: adjustGyroSensitivityLive(); break;
|
|
||||||
case 5: openCustomControls(); break;
|
case 5: openCustomControls(); break;
|
||||||
}
|
}
|
||||||
drawerLayout.closeDrawers();
|
drawerLayout.closeDrawers();
|
||||||
|
|
@ -187,8 +185,7 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe
|
||||||
if (PREF_VIRTUAL_MOUSE_START) {
|
if (PREF_VIRTUAL_MOUSE_START) {
|
||||||
touchpad.post(() -> touchpad.switchState());
|
touchpad.post(() -> touchpad.switchState());
|
||||||
}
|
}
|
||||||
|
runCraft();
|
||||||
runCraft(finalVersion, mVersionInfo);
|
|
||||||
}catch (Throwable e){
|
}catch (Throwable e){
|
||||||
Tools.showError(getApplicationContext(), e, true);
|
Tools.showError(getApplicationContext(), e, true);
|
||||||
}
|
}
|
||||||
|
|
@ -317,40 +314,11 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe
|
||||||
return Build.VERSION.SDK_INT >= 26;
|
return Build.VERSION.SDK_INT >= 26;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void runCraft(String versionId, JMinecraftVersionList.Version version) throws Throwable {
|
private void runCraft() throws Throwable {
|
||||||
if(Tools.LOCAL_RENDERER == null) {
|
if(Tools.LOCAL_RENDERER == null) {
|
||||||
Tools.LOCAL_RENDERER = LauncherPreferences.PREF_RENDERER;
|
Tools.LOCAL_RENDERER = LauncherPreferences.PREF_RENDERER;
|
||||||
}
|
}
|
||||||
MinecraftAccount minecraftAccount = PojavProfile.getCurrentProfileContent(this, null);
|
Tools.launchGLJRE(this);
|
||||||
Logger.appendToLog("--------- beginning with launcher debug");
|
|
||||||
printLauncherInfo(versionId);
|
|
||||||
if (Tools.LOCAL_RENDERER.equals("vulkan_zink")) {
|
|
||||||
checkVulkanZinkIsSupported();
|
|
||||||
}
|
|
||||||
JREUtils.redirectAndPrintJRELog();
|
|
||||||
LauncherProfiles.update();
|
|
||||||
int requiredJavaVersion = 8;
|
|
||||||
if(version.javaVersion != null) requiredJavaVersion = version.javaVersion.majorVersion;
|
|
||||||
Tools.launchMinecraft(this, minecraftAccount, minecraftProfile, versionId, requiredJavaVersion);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void printLauncherInfo(String gameVersion) {
|
|
||||||
Logger.appendToLog("Info: Launcher version: " + BuildConfig.VERSION_NAME);
|
|
||||||
Logger.appendToLog("Info: Architecture: " + Architecture.archAsString(Tools.DEVICE_ARCHITECTURE));
|
|
||||||
Logger.appendToLog("Info: Device model: " + Build.MANUFACTURER + " " +Build.MODEL);
|
|
||||||
Logger.appendToLog("Info: API version: " + Build.VERSION.SDK_INT);
|
|
||||||
Logger.appendToLog("Info: Selected Minecraft version: " + gameVersion);
|
|
||||||
Logger.appendToLog("Info: Custom Java arguments: \"" + LauncherPreferences.PREF_CUSTOM_JAVA_ARGS + "\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkVulkanZinkIsSupported() {
|
|
||||||
if (Tools.DEVICE_ARCHITECTURE == ARCH_X86
|
|
||||||
|| Build.VERSION.SDK_INT < 25
|
|
||||||
|| !getPackageManager().hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_LEVEL)
|
|
||||||
|| !getPackageManager().hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION)) {
|
|
||||||
Logger.appendToLog("Error: Vulkan Zink renderer is not supported!");
|
|
||||||
throw new RuntimeException(getString(R.string. mcn_check_fail_vulkan_support));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void dialogSendCustomKey() {
|
private void dialogSendCustomKey() {
|
||||||
|
|
@ -420,7 +388,6 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe
|
||||||
if(touchCharInput != null) touchCharInput.switchKeyboardState();
|
if(touchCharInput != null) touchCharInput.switchKeyboardState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int tmpMouseSpeed;
|
int tmpMouseSpeed;
|
||||||
public void adjustMouseSpeedLive() {
|
public void adjustMouseSpeedLive() {
|
||||||
AlertDialog.Builder b = new AlertDialog.Builder(this);
|
AlertDialog.Builder b = new AlertDialog.Builder(this);
|
||||||
|
|
@ -431,12 +398,10 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe
|
||||||
sb.setMax(275);
|
sb.setMax(275);
|
||||||
tmpMouseSpeed = (int) ((LauncherPreferences.PREF_MOUSESPEED*100));
|
tmpMouseSpeed = (int) ((LauncherPreferences.PREF_MOUSESPEED*100));
|
||||||
sb.setProgress(tmpMouseSpeed-25);
|
sb.setProgress(tmpMouseSpeed-25);
|
||||||
tv.setText(getString(R.string.percent_format, tmpGyroSensitivity));
|
|
||||||
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
|
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
|
||||||
tmpMouseSpeed = i+25;
|
tmpMouseSpeed = i+25;
|
||||||
tv.setText(getString(R.string.percent_format, tmpGyroSensitivity));
|
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void onStartTrackingTouch(SeekBar seekBar) {}
|
public void onStartTrackingTouch(SeekBar seekBar) {}
|
||||||
|
|
@ -456,47 +421,6 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe
|
||||||
});
|
});
|
||||||
b.show();
|
b.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
int tmpGyroSensitivity;
|
|
||||||
public void adjustGyroSensitivityLive() {
|
|
||||||
if(!LauncherPreferences.PREF_ENABLE_GYRO) {
|
|
||||||
Toast.makeText(this, R.string.toast_turn_on_gyro, Toast.LENGTH_LONG).show();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
AlertDialog.Builder b = new AlertDialog.Builder(this);
|
|
||||||
b.setTitle(R.string.preference_gyro_sensitivity_title);
|
|
||||||
View v = LayoutInflater.from(this).inflate(R.layout.dialog_live_mouse_speed_editor,null);
|
|
||||||
final SeekBar sb = v.findViewById(R.id.mouseSpeed);
|
|
||||||
final TextView tv = v.findViewById(R.id.mouseSpeedTV);
|
|
||||||
sb.setMax(275);
|
|
||||||
tmpGyroSensitivity = (int) ((LauncherPreferences.PREF_GYRO_SENSITIVITY*100));
|
|
||||||
sb.setProgress(tmpGyroSensitivity -25);
|
|
||||||
tv.setText(getString(R.string.percent_format, tmpGyroSensitivity));
|
|
||||||
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
|
|
||||||
tmpGyroSensitivity = i+25;
|
|
||||||
tv.setText(getString(R.string.percent_format, tmpGyroSensitivity));
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void onStartTrackingTouch(SeekBar seekBar) {}
|
|
||||||
@Override
|
|
||||||
public void onStopTrackingTouch(SeekBar seekBar) {}
|
|
||||||
});
|
|
||||||
b.setView(v);
|
|
||||||
b.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
|
|
||||||
LauncherPreferences.PREF_GYRO_SENSITIVITY = ((float) tmpGyroSensitivity)/100f;
|
|
||||||
LauncherPreferences.DEFAULT_PREF.edit().putInt("gyroSensitivity", tmpGyroSensitivity).apply();
|
|
||||||
dialogInterface.dismiss();
|
|
||||||
System.gc();
|
|
||||||
});
|
|
||||||
b.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> {
|
|
||||||
dialogInterface.dismiss();
|
|
||||||
System.gc();
|
|
||||||
});
|
|
||||||
b.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void setUri(Context context, String input, Intent intent) {
|
private static void setUri(Context context, String input, Intent intent) {
|
||||||
if(input.startsWith("file:")) {
|
if(input.startsWith("file:")) {
|
||||||
int truncLength = 5;
|
int truncLength = 5;
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import static org.lwjgl.glfw.CallbackBridge.windowWidth;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.res.Resources;
|
||||||
import android.graphics.SurfaceTexture;
|
import android.graphics.SurfaceTexture;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
|
@ -20,6 +21,7 @@ import android.util.Log;
|
||||||
import android.view.InputDevice;
|
import android.view.InputDevice;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
|
import android.view.ScaleGestureDetector;
|
||||||
import android.view.Surface;
|
import android.view.Surface;
|
||||||
import android.view.SurfaceHolder;
|
import android.view.SurfaceHolder;
|
||||||
import android.view.SurfaceView;
|
import android.view.SurfaceView;
|
||||||
|
|
@ -48,6 +50,10 @@ import fr.spse.gamepad_remapper.RemapperView;
|
||||||
public class MinecraftGLSurface extends View implements GrabListener {
|
public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
/* Gamepad object for gamepad inputs, instantiated on need */
|
/* Gamepad object for gamepad inputs, instantiated on need */
|
||||||
private Gamepad mGamepad = null;
|
private Gamepad mGamepad = null;
|
||||||
|
|
||||||
|
float startX = 0;
|
||||||
|
float startY = 0;
|
||||||
|
ScaleGestureDetector scaleGestureDetector;
|
||||||
/* The RemapperView.Builder object allows you to set which buttons to remap */
|
/* The RemapperView.Builder object allows you to set which buttons to remap */
|
||||||
private final RemapperManager mInputManager = new RemapperManager(getContext(), new RemapperView.Builder(null)
|
private final RemapperManager mInputManager = new RemapperManager(getContext(), new RemapperView.Builder(null)
|
||||||
.remapA(true)
|
.remapA(true)
|
||||||
|
|
@ -125,7 +131,6 @@ public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
}
|
}
|
||||||
if(msg.what == MSG_DROP_ITEM_BUTTON_CHECK) {
|
if(msg.what == MSG_DROP_ITEM_BUTTON_CHECK) {
|
||||||
if(CallbackBridge.isGrabbing()){
|
if(CallbackBridge.isGrabbing()){
|
||||||
sendKeyPress(LwjglGlfwKeycode.GLFW_KEY_Q);
|
|
||||||
mHandler.sendEmptyMessageDelayed(MSG_DROP_ITEM_BUTTON_CHECK, 600);
|
mHandler.sendEmptyMessageDelayed(MSG_DROP_ITEM_BUTTON_CHECK, 600);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -146,7 +151,9 @@ public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Initialize the view and all its settings */
|
/** Initialize the view and all its settings */
|
||||||
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
public void start(){
|
public void start(){
|
||||||
|
scaleGestureDetector = new ScaleGestureDetector(this.getContext(), new ScaleListener());
|
||||||
if(LauncherPreferences.PREF_USE_ALTERNATE_SURFACE){
|
if(LauncherPreferences.PREF_USE_ALTERNATE_SURFACE){
|
||||||
SurfaceView surfaceView = new SurfaceView(getContext());
|
SurfaceView surfaceView = new SurfaceView(getContext());
|
||||||
mSurface = surfaceView;
|
mSurface = surfaceView;
|
||||||
|
|
@ -210,8 +217,6 @@ public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
|
|
||||||
((ViewGroup)getParent()).addView(textureView);
|
((ViewGroup)getParent()).addView(textureView);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -222,6 +227,10 @@ public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("accessibility")
|
@SuppressWarnings("accessibility")
|
||||||
public boolean onTouchEvent(MotionEvent e) {
|
public boolean onTouchEvent(MotionEvent e) {
|
||||||
|
scaleGestureDetector.onTouchEvent(e);
|
||||||
|
|
||||||
|
Log.i("downthecrop","ya I still see these events");
|
||||||
|
|
||||||
// Kinda need to send this back to the layout
|
// Kinda need to send this back to the layout
|
||||||
if(((ControlLayout)getParent()).getModifiable()) return false;
|
if(((ControlLayout)getParent()).getModifiable()) return false;
|
||||||
|
|
||||||
|
|
@ -243,7 +252,7 @@ public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
CallbackBridge.mouseX = (e.getX() * mScaleFactor);
|
CallbackBridge.mouseX = (e.getX() * mScaleFactor);
|
||||||
CallbackBridge.mouseY = (e.getY() * mScaleFactor);
|
CallbackBridge.mouseY = (e.getY() * mScaleFactor);
|
||||||
//One android click = one MC click
|
//One android click = one MC click
|
||||||
if(mSingleTapDetector.onTouchEvent(e)){
|
if(mSingleTapDetector.onTouchEvent(e)){ // Touch Mode
|
||||||
CallbackBridge.putMouseEventWithCoords(LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_LEFT, CallbackBridge.mouseX, CallbackBridge.mouseY);
|
CallbackBridge.putMouseEventWithCoords(LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_LEFT, CallbackBridge.mouseX, CallbackBridge.mouseY);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -254,6 +263,23 @@ public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
|
|
||||||
switch (e.getActionMasked()) {
|
switch (e.getActionMasked()) {
|
||||||
case MotionEvent.ACTION_MOVE:
|
case MotionEvent.ACTION_MOVE:
|
||||||
|
// Maybe here we do camera panning?
|
||||||
|
// Calculate the distance moved
|
||||||
|
float dx = (e.getX()) - startX;
|
||||||
|
float dy = (e.getY()) - startY;
|
||||||
|
|
||||||
|
// Do something with dx and dy here, like adjusting the camera position
|
||||||
|
try {
|
||||||
|
panCamera(dx, dy);
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update start position
|
||||||
|
startX = e.getX();
|
||||||
|
startY = e.getY();
|
||||||
|
|
||||||
|
|
||||||
int pointerCount = e.getPointerCount();
|
int pointerCount = e.getPointerCount();
|
||||||
|
|
||||||
// In-menu interactions
|
// In-menu interactions
|
||||||
|
|
@ -307,8 +333,8 @@ public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MotionEvent.ACTION_DOWN: // 0
|
case MotionEvent.ACTION_DOWN: // 0
|
||||||
sendMouseButton(LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_LEFT, true);
|
startX = e.getX();
|
||||||
sendMouseButton(LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_LEFT, false);
|
startY = e.getY();
|
||||||
hudKeyHandled = handleGuiBar((int)e.getX(), (int) e.getY());
|
hudKeyHandled = handleGuiBar((int)e.getX(), (int) e.getY());
|
||||||
boolean isTouchInHotbar = hudKeyHandled != -1;
|
boolean isTouchInHotbar = hudKeyHandled != -1;
|
||||||
if (isTouchInHotbar) {
|
if (isTouchInHotbar) {
|
||||||
|
|
@ -339,6 +365,10 @@ public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MotionEvent.ACTION_UP: // 1
|
case MotionEvent.ACTION_UP: // 1
|
||||||
|
// End of drag, reset the start position
|
||||||
|
startX = 0;
|
||||||
|
startY = 0;
|
||||||
|
break;
|
||||||
case MotionEvent.ACTION_CANCEL: // 3
|
case MotionEvent.ACTION_CANCEL: // 3
|
||||||
mShouldBeDown = false;
|
mShouldBeDown = false;
|
||||||
mCurrentPointerID = -1;
|
mCurrentPointerID = -1;
|
||||||
|
|
@ -394,6 +424,28 @@ public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void panCamera(float dx, float dy) throws InterruptedException {
|
||||||
|
//Log.i("downthecrop-pan","dx: " +dx + " dy: " + dy);
|
||||||
|
final float threshold = 8.0f; // adjust this value as needed to control the sensitivity of the panning
|
||||||
|
|
||||||
|
// Check horizontal panning
|
||||||
|
if(dx > threshold) {
|
||||||
|
// Finger moved to the right, pan camera to the right
|
||||||
|
AWTInputBridge.sendKey((char)AWTInputEvent.VK_RIGHT, AWTInputEvent.VK_RIGHT);
|
||||||
|
} else if(dx < -threshold) {
|
||||||
|
AWTInputBridge.sendKey((char)AWTInputEvent.VK_LEFT, AWTInputEvent.VK_LEFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check vertical panning
|
||||||
|
if(dy > threshold) {
|
||||||
|
// Finger moved down, pan camera up
|
||||||
|
AWTInputBridge.sendKey((char)AWTInputEvent.VK_UP, AWTInputEvent.VK_UP);
|
||||||
|
} else if(dy < -threshold) {
|
||||||
|
// Finger moved up, pan camera down
|
||||||
|
AWTInputBridge.sendKey((char)AWTInputEvent.VK_DOWN, AWTInputEvent.VK_DOWN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The event for mouse/joystick movements
|
* The event for mouse/joystick movements
|
||||||
*/
|
*/
|
||||||
|
|
@ -481,7 +533,6 @@ public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
//Even weirder, is is unknown why a key or another is selected to trigger a keyEvent
|
//Even weirder, is is unknown why a key or another is selected to trigger a keyEvent
|
||||||
if((event.getFlags() & KeyEvent.FLAG_SOFT_KEYBOARD) == KeyEvent.FLAG_SOFT_KEYBOARD){
|
if((event.getFlags() & KeyEvent.FLAG_SOFT_KEYBOARD) == KeyEvent.FLAG_SOFT_KEYBOARD){
|
||||||
if(eventKeycode == KeyEvent.KEYCODE_ENTER) return true; //We already listen to it.
|
if(eventKeycode == KeyEvent.KEYCODE_ENTER) return true; //We already listen to it.
|
||||||
touchCharInput.dispatchKeyEvent(event);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -537,6 +588,32 @@ public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onScale(ScaleGestureDetector detector) {
|
||||||
|
Log.i("downthecrop","SCALE EVENT!");
|
||||||
|
float scaleFactor = detector.getScaleFactor();
|
||||||
|
if (scaleFactor > 1) { //Send F4 To Zoom Out
|
||||||
|
AWTInputBridge.sendKey((char)AWTInputEvent.VK_F3, AWTInputEvent.VK_F3);
|
||||||
|
} else { //116 F3 To Zoom In
|
||||||
|
AWTInputBridge.sendKey((char)AWTInputEvent.VK_F4,AWTInputEvent.VK_F4);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onScaleBegin(ScaleGestureDetector detector) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onScaleEnd(ScaleGestureDetector detector) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @return the hotbar key, given the position. -1 if no key are pressed */
|
/** @return the hotbar key, given the position. -1 if no key are pressed */
|
||||||
public int handleGuiBar(int x, int y) {
|
public int handleGuiBar(int x, int y) {
|
||||||
|
|
@ -632,6 +709,10 @@ public class MinecraftGLSurface extends View implements GrabListener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int dpToPx(int dp) {
|
||||||
|
return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
|
||||||
|
}
|
||||||
|
|
||||||
/** A small interface called when the listener is ready for the first time */
|
/** A small interface called when the listener is ready for the first time */
|
||||||
public interface SurfaceReadyListener {
|
public interface SurfaceReadyListener {
|
||||||
void isReady();
|
void isReady();
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,8 @@ import androidx.fragment.app.FragmentTransaction;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
|
|
||||||
|
import net.kdt.pojavlaunch.extra.ExtraConstants;
|
||||||
|
import net.kdt.pojavlaunch.extra.ExtraCore;
|
||||||
import net.kdt.pojavlaunch.multirt.MultiRTUtils;
|
import net.kdt.pojavlaunch.multirt.MultiRTUtils;
|
||||||
import net.kdt.pojavlaunch.multirt.Runtime;
|
import net.kdt.pojavlaunch.multirt.Runtime;
|
||||||
import net.kdt.pojavlaunch.plugins.FFmpegPlugin;
|
import net.kdt.pojavlaunch.plugins.FFmpegPlugin;
|
||||||
|
|
@ -62,8 +64,11 @@ import org.apache.commons.codec.binary.Hex;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.lwjgl.glfw.CallbackBridge;
|
import org.lwjgl.glfw.CallbackBridge;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.BufferedOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
@ -76,12 +81,17 @@ import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipInputStream;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
@SuppressWarnings("IOStreamConstructor")
|
@SuppressWarnings("IOStreamConstructor")
|
||||||
public final class Tools {
|
public final class Tools {
|
||||||
public static final Handler MAIN_HANDLER = new Handler(Looper.getMainLooper());
|
public static final Handler MAIN_HANDLER = new Handler(Looper.getMainLooper());
|
||||||
public static String APP_NAME = "null";
|
public static String APP_NAME = "null";
|
||||||
|
|
||||||
|
|
||||||
|
public static final String RT4_MAIN_CLASS = "rt4.client";
|
||||||
public static final Gson GLOBAL_GSON = new GsonBuilder().setPrettyPrinting().create();
|
public static final Gson GLOBAL_GSON = new GsonBuilder().setPrettyPrinting().create();
|
||||||
|
|
||||||
public static final String URL_HOME = "https://pojavlauncherteam.github.io";
|
public static final String URL_HOME = "https://pojavlauncherteam.github.io";
|
||||||
|
|
@ -155,63 +165,24 @@ public final class Tools {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void launchMinecraft(final Activity activity, MinecraftAccount minecraftAccount,
|
public static void launchGLJRE(final Activity activity) throws Throwable {
|
||||||
MinecraftProfile minecraftProfile, String versionId, int versionJavaRequirement) throws Throwable {
|
|
||||||
int freeDeviceMemory = getFreeDeviceMemory(activity);
|
|
||||||
if(LauncherPreferences.PREF_RAM_ALLOCATION > freeDeviceMemory) {
|
|
||||||
Object memoryErrorLock = new Object();
|
|
||||||
activity.runOnUiThread(() -> {
|
|
||||||
androidx.appcompat.app.AlertDialog.Builder b = new androidx.appcompat.app.AlertDialog.Builder(activity)
|
|
||||||
.setMessage(activity.getString(R.string.memory_warning_msg, freeDeviceMemory ,LauncherPreferences.PREF_RAM_ALLOCATION))
|
|
||||||
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {synchronized(memoryErrorLock){memoryErrorLock.notifyAll();}})
|
|
||||||
.setOnCancelListener((i) -> {synchronized(memoryErrorLock){memoryErrorLock.notifyAll();}});
|
|
||||||
b.show();
|
|
||||||
});
|
|
||||||
synchronized (memoryErrorLock) {
|
|
||||||
memoryErrorLock.wait();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Runtime runtime = MultiRTUtils.forceReread(Tools.pickRuntime(minecraftProfile, versionJavaRequirement));
|
|
||||||
JMinecraftVersionList.Version versionInfo = Tools.getVersionInfo(versionId);
|
|
||||||
LauncherProfiles.update();
|
|
||||||
File gamedir = Tools.getGameDirPath(minecraftProfile);
|
|
||||||
|
|
||||||
|
Runtime runtime = MultiRTUtils.forceReread("Internal");
|
||||||
|
File gamedir = new File(Tools.DIR_DATA);
|
||||||
|
|
||||||
// Pre-process specific files
|
ExtraCore.setValue(ExtraConstants.OPEN_GL_VERSION, "2");
|
||||||
disableSplash(gamedir);
|
|
||||||
String[] launchArgs = getMinecraftClientArgs(minecraftAccount, versionInfo, gamedir);
|
|
||||||
|
|
||||||
// Select the appropriate openGL version
|
|
||||||
OldVersionsUtils.selectOpenGlVersion(versionInfo);
|
|
||||||
|
|
||||||
|
|
||||||
String launchClassPath = generateLaunchClassPath(versionInfo, versionId);
|
|
||||||
|
|
||||||
List<String> javaArgList = new ArrayList<>();
|
List<String> javaArgList = new ArrayList<>();
|
||||||
javaArgList.add("-Dorg.lwjgl.util.NoChecks=true");
|
javaArgList.add("-Dorg.lwjgl.util.NoChecks=true");
|
||||||
|
|
||||||
getCacioJavaArgs(javaArgList, runtime.javaVersion == 8);
|
getCacioJavaArgs(javaArgList, runtime.javaVersion == 8);
|
||||||
|
|
||||||
if (versionInfo.logging != null) {
|
javaArgList.add("-DpluginDir="+ Tools.DIR_DATA + "/plugins/");
|
||||||
String configFile = Tools.DIR_DATA + "/security/" + versionInfo.logging.client.file.id.replace("client", "log4j-rce-patch");
|
javaArgList.add("-DconfigFile="+Tools.DIR_DATA + "/config.json");
|
||||||
if (!new File(configFile).exists()) {
|
|
||||||
configFile = Tools.DIR_GAME_NEW + "/" + versionInfo.logging.client.file.id;
|
|
||||||
}
|
|
||||||
javaArgList.add("-Dlog4j.configurationFile=" + configFile);
|
|
||||||
}
|
|
||||||
javaArgList.addAll(Arrays.asList(getMinecraftJVMArgs(versionId, gamedir)));
|
|
||||||
javaArgList.add("-cp");
|
javaArgList.add("-cp");
|
||||||
|
|
||||||
javaArgList.add(getLWJGL3ClassPath()+":"+Tools.DIR_DATA+"/rt4.jar");
|
javaArgList.add(getLWJGL3ClassPath()+":"+Tools.DIR_DATA+"/rt4.jar");
|
||||||
|
javaArgList.add(RT4_MAIN_CLASS);
|
||||||
//javaArgList.add(versionInfo.mainClass);
|
|
||||||
//javaArgList.addAll(Arrays.asList(launchArgs));
|
|
||||||
// ctx.appendlnToLog("full args: "+javaArgList.toString());
|
|
||||||
//javaArgList.add("HelloWorld"); //For hello.jar LWJGL test (red screen)
|
|
||||||
javaArgList.add("rt4.client"); //runescape mainclass
|
|
||||||
String args = LauncherPreferences.PREF_CUSTOM_JAVA_ARGS;
|
String args = LauncherPreferences.PREF_CUSTOM_JAVA_ARGS;
|
||||||
if(Tools.isValidString(minecraftProfile.javaArgs)) args = minecraftProfile.javaArgs;
|
|
||||||
FFmpegPlugin.discover(activity);
|
|
||||||
JREUtils.launchJavaVM(activity, runtime, gamedir, javaArgList, args);
|
JREUtils.launchJavaVM(activity, runtime, gamedir, javaArgList, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -764,10 +735,76 @@ public final class Tools {
|
||||||
File file = new File(nameOutput);
|
File file = new File(nameOutput);
|
||||||
DownloadUtils.downloadFile(urlInput, file);
|
DownloadUtils.downloadFile(urlInput, file);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface DownloaderFeedback {
|
public interface DownloaderFeedback {
|
||||||
void updateProgress(int curr, int max);
|
void updateProgress(int curr, int max);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class ZipTool
|
||||||
|
{
|
||||||
|
private ZipTool(){}
|
||||||
|
public static void zip(List<File> files, File zipFile) throws IOException {
|
||||||
|
final int BUFFER_SIZE = 2048;
|
||||||
|
|
||||||
|
BufferedInputStream origin = null;
|
||||||
|
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
|
||||||
|
|
||||||
|
try {
|
||||||
|
byte data[] = new byte[BUFFER_SIZE];
|
||||||
|
|
||||||
|
for (File file : files) {
|
||||||
|
FileInputStream fileInputStream = new FileInputStream( file );
|
||||||
|
|
||||||
|
origin = new BufferedInputStream(fileInputStream, BUFFER_SIZE);
|
||||||
|
|
||||||
|
try {
|
||||||
|
ZipEntry entry = new ZipEntry(file.getName());
|
||||||
|
|
||||||
|
out.putNextEntry(entry);
|
||||||
|
|
||||||
|
int count;
|
||||||
|
while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) {
|
||||||
|
out.write(data, 0, count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
origin.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static void unzip(File zipFile, File targetDirectory) throws IOException {
|
||||||
|
final int BUFFER_SIZE = 1024;
|
||||||
|
ZipInputStream zis = new ZipInputStream(
|
||||||
|
new BufferedInputStream(new FileInputStream(zipFile)));
|
||||||
|
try {
|
||||||
|
ZipEntry ze;
|
||||||
|
int count;
|
||||||
|
byte[] buffer = new byte[BUFFER_SIZE];
|
||||||
|
while ((ze = zis.getNextEntry()) != null) {
|
||||||
|
File file = new File(targetDirectory, ze.getName());
|
||||||
|
File dir = ze.isDirectory() ? file : file.getParentFile();
|
||||||
|
if (!dir.isDirectory() && !dir.mkdirs())
|
||||||
|
throw new FileNotFoundException("Failed to ensure directory: " +
|
||||||
|
dir.getAbsolutePath());
|
||||||
|
if (ze.isDirectory())
|
||||||
|
continue;
|
||||||
|
FileOutputStream fout = new FileOutputStream(file);
|
||||||
|
try {
|
||||||
|
while ((count = zis.read(buffer)) != -1)
|
||||||
|
fout.write(buffer, 0, count);
|
||||||
|
} finally {
|
||||||
|
fout.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
zis.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static boolean compareSHA1(File f, String sourceSHA) {
|
public static boolean compareSHA1(File f, String sourceSHA) {
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import static net.kdt.pojavlaunch.prefs.LauncherPreferences.DEFAULT_PREF;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.GestureDetector;
|
import android.view.GestureDetector;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
@ -80,10 +81,21 @@ public class Touchpad extends FrameLayout implements GrabListener{
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case MotionEvent.ACTION_POINTER_DOWN: // 5
|
case MotionEvent.ACTION_POINTER_DOWN: // 5
|
||||||
|
|
||||||
|
// Check if there are two fingers on the screen
|
||||||
|
if (event.getPointerCount() == 2) {
|
||||||
|
// Right-click event when a second finger touches the screen
|
||||||
|
// Simulating right-click by sending GLFW_MOUSE_BUTTON_RIGHT event
|
||||||
|
Log.i("downthecrop","Hi from a rightclick event!");
|
||||||
|
CallbackBridge.putMouseEventWithCoords(LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_RIGHT, CallbackBridge.mouseX, CallbackBridge.mouseY);
|
||||||
|
}
|
||||||
|
|
||||||
mScrollLastInitialX = event.getX();
|
mScrollLastInitialX = event.getX();
|
||||||
mScrollLastInitialY = event.getY();
|
mScrollLastInitialY = event.getY();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
case MotionEvent.ACTION_DOWN:
|
case MotionEvent.ACTION_DOWN:
|
||||||
mPrevX = x;
|
mPrevX = x;
|
||||||
mPrevY = y;
|
mPrevY = y;
|
||||||
|
|
|
||||||
|
|
@ -3,16 +3,22 @@ package net.kdt.pojavlaunch.customcontrols.keyboard;
|
||||||
|
|
||||||
import static android.content.Context.INPUT_METHOD_SERVICE;
|
import static android.content.Context.INPUT_METHOD_SERVICE;
|
||||||
|
|
||||||
|
import static org.lwjgl.glfw.CallbackBridge.sendKeyPress;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import net.kdt.pojavlaunch.AWTInputBridge;
|
||||||
|
import net.kdt.pojavlaunch.LwjglGlfwKeycode;
|
||||||
import net.kdt.pojavlaunch.R;
|
import net.kdt.pojavlaunch.R;
|
||||||
|
import net.kdt.pojavlaunch.utils.KeyEncoder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is intended for sending characters used in chat via the virtual keyboard
|
* This class is intended for sending characters used in chat via the virtual keyboard
|
||||||
|
|
@ -41,21 +47,18 @@ public class TouchCharInput extends androidx.appcompat.widget.AppCompatEditText
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
|
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
|
||||||
super.onTextChanged(text, start, lengthBefore, lengthAfter);
|
if(lengthBefore == lengthAfter || lengthAfter == 30) return;
|
||||||
if(mIsDoingInternalChanges)return;
|
Log.i("TouchCharInput","New Event (before/after)!: "+ lengthBefore + " : " + lengthAfter);
|
||||||
if(mCharacterSender != null){
|
boolean isBackSpace = (lengthBefore > lengthAfter);
|
||||||
for(int i=0; i < lengthBefore; ++i){
|
if(isBackSpace) {
|
||||||
mCharacterSender.sendBackspace();
|
sendKeyPress(LwjglGlfwKeycode.GLFW_KEY_BACKSPACE);
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
for(int i=start, count = 0; count < lengthAfter; ++i){
|
char c = text.charAt(text.length()-1);
|
||||||
mCharacterSender.sendChar(text.charAt(i));
|
Log.i("TouchCharInput","New Event!: "+c);
|
||||||
++count;
|
if(mCharacterSender != null) {
|
||||||
}
|
sendKeyPress(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Reset the keyboard state
|
|
||||||
if(text.length() < 1) clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ public class LauncherPreferences {
|
||||||
public static boolean PREF_ARC_CAPES = false;
|
public static boolean PREF_ARC_CAPES = false;
|
||||||
public static boolean PREF_USE_ALTERNATE_SURFACE = true;
|
public static boolean PREF_USE_ALTERNATE_SURFACE = true;
|
||||||
public static boolean PREF_JAVA_SANDBOX = true;
|
public static boolean PREF_JAVA_SANDBOX = true;
|
||||||
public static int PREF_SCALE_FACTOR = 100;
|
public static int PREF_SCALE_FACTOR = 50;
|
||||||
public static boolean PREF_ENABLE_GYRO = false;
|
public static boolean PREF_ENABLE_GYRO = false;
|
||||||
public static float PREF_GYRO_SENSITIVITY = 1f;
|
public static float PREF_GYRO_SENSITIVITY = 1f;
|
||||||
public static int PREF_GYRO_SAMPLE_RATE = 16;
|
public static int PREF_GYRO_SAMPLE_RATE = 16;
|
||||||
|
|
@ -91,7 +91,7 @@ public class LauncherPreferences {
|
||||||
PREF_ARC_CAPES = DEFAULT_PREF.getBoolean("arc_capes",false);
|
PREF_ARC_CAPES = DEFAULT_PREF.getBoolean("arc_capes",false);
|
||||||
PREF_USE_ALTERNATE_SURFACE = DEFAULT_PREF.getBoolean("alternate_surface", false);
|
PREF_USE_ALTERNATE_SURFACE = DEFAULT_PREF.getBoolean("alternate_surface", false);
|
||||||
PREF_JAVA_SANDBOX = DEFAULT_PREF.getBoolean("java_sandbox", true);
|
PREF_JAVA_SANDBOX = DEFAULT_PREF.getBoolean("java_sandbox", true);
|
||||||
PREF_SCALE_FACTOR = DEFAULT_PREF.getInt("resolutionRatio", 100);
|
PREF_SCALE_FACTOR = DEFAULT_PREF.getInt("resolutionRatio", 50);
|
||||||
PREF_ENABLE_GYRO = DEFAULT_PREF.getBoolean("enableGyro", false);
|
PREF_ENABLE_GYRO = DEFAULT_PREF.getBoolean("enableGyro", false);
|
||||||
PREF_GYRO_SENSITIVITY = ((float)DEFAULT_PREF.getInt("gyroSensitivity", 100))/100f;
|
PREF_GYRO_SENSITIVITY = ((float)DEFAULT_PREF.getInt("gyroSensitivity", 100))/100f;
|
||||||
PREF_GYRO_SAMPLE_RATE = DEFAULT_PREF.getInt("gyroSampleRate", 16);
|
PREF_GYRO_SAMPLE_RATE = DEFAULT_PREF.getInt("gyroSampleRate", 16);
|
||||||
|
|
|
||||||
|
|
@ -65,8 +65,7 @@ public class AsyncAssetManager {
|
||||||
try {
|
try {
|
||||||
Tools.copyAssetFile(ctx, "options.txt", Tools.DIR_GAME_NEW, false);
|
Tools.copyAssetFile(ctx, "options.txt", Tools.DIR_GAME_NEW, false);
|
||||||
Tools.copyAssetFile(ctx, "default.json", Tools.CTRLMAP_PATH, false);
|
Tools.copyAssetFile(ctx, "default.json", Tools.CTRLMAP_PATH, false);
|
||||||
|
Tools.copyAssetFile(ctx, "launcher_profiles.json", Tools.DIR_GAME_NEW, false);
|
||||||
Tools.copyAssetFile(ctx, "launcher_profiles.json", Tools.DIR_GAME_NEW, false);
|
|
||||||
Tools.copyAssetFile(ctx,"resolv.conf",Tools.DIR_DATA, false);
|
Tools.copyAssetFile(ctx,"resolv.conf",Tools.DIR_DATA, false);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e("AsyncAssetManager", "Failed to unpack critical components !");
|
Log.e("AsyncAssetManager", "Failed to unpack critical components !");
|
||||||
|
|
@ -87,8 +86,12 @@ public class AsyncAssetManager {
|
||||||
unpackComponent(ctx, "security", true);
|
unpackComponent(ctx, "security", true);
|
||||||
unpackComponent(ctx, "arc_dns_injector", true);
|
unpackComponent(ctx, "arc_dns_injector", true);
|
||||||
unpackComponent(ctx, "forge_installer", true);
|
unpackComponent(ctx, "forge_installer", true);
|
||||||
Tools.copyAssetFile(ctx,"hello.jar",Tools.DIR_DATA, true);
|
|
||||||
Tools.copyAssetFile(ctx,"rt4.jar",Tools.DIR_DATA, true);
|
Tools.copyAssetFile(ctx,"rt4.jar",Tools.DIR_DATA, true);
|
||||||
|
Tools.copyAssetFile(ctx,"config.json",Tools.DIR_DATA, true);
|
||||||
|
|
||||||
|
// Unzip the plugins for use.
|
||||||
|
extractAllPlugins(ctx); // Can comment this out to keep the plugins saved, rewrites them ever time it launches...
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e("AsyncAssetManager", "Failed o unpack components !",e );
|
Log.e("AsyncAssetManager", "Failed o unpack components !",e );
|
||||||
}
|
}
|
||||||
|
|
@ -96,6 +99,22 @@ public class AsyncAssetManager {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void extractAllPlugins(Context ctx) throws IOException {
|
||||||
|
String pluginsPath = "plugins"; // The folder where your plugins reside in the assets
|
||||||
|
AssetManager am = ctx.getAssets();
|
||||||
|
String[] plugins = am.list(pluginsPath);
|
||||||
|
if(plugins != null) {
|
||||||
|
for(String plugin : plugins) {
|
||||||
|
Tools.copyAssetFile(ctx, pluginsPath + "/" + plugin, Tools.DIR_DATA, true);
|
||||||
|
Tools.ZipTool.unzip(
|
||||||
|
new File(Tools.DIR_DATA + "/" + plugin),
|
||||||
|
new File(Tools.DIR_DATA + "/plugins/")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static void unpackComponent(Context ctx, String component, boolean privateDirectory) throws IOException {
|
private static void unpackComponent(Context ctx, String component, boolean privateDirectory) throws IOException {
|
||||||
AssetManager am = ctx.getAssets();
|
AssetManager am = ctx.getAssets();
|
||||||
String rootDir = privateDirectory ? Tools.DIR_DATA : Tools.DIR_GAME_HOME;
|
String rootDir = privateDirectory ? Tools.DIR_DATA : Tools.DIR_GAME_HOME;
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import static net.kdt.pojavlaunch.Tools.currentDisplayMetrics;
|
||||||
import static net.kdt.pojavlaunch.Tools.shareLog;
|
import static net.kdt.pojavlaunch.Tools.shareLog;
|
||||||
import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_DUMP_SHADERS;
|
import static net.kdt.pojavlaunch.prefs.LauncherPreferences.PREF_DUMP_SHADERS;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.app.*;
|
import android.app.*;
|
||||||
import android.content.*;
|
import android.content.*;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
|
@ -256,6 +257,7 @@ public class JREUtils {
|
||||||
// return ldLibraryPath;
|
// return ldLibraryPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("StringFormatInvalid")
|
||||||
public static int launchJavaVM(final Activity activity, final Runtime runtime, File gameDirectory, final List<String> JVMArgs, final String userArgsString) throws Throwable {
|
public static int launchJavaVM(final Activity activity, final Runtime runtime, File gameDirectory, final List<String> JVMArgs, final String userArgsString) throws Throwable {
|
||||||
String runtimeHome = MultiRTUtils.getRuntimeHome(runtime.name).getAbsolutePath();
|
String runtimeHome = MultiRTUtils.getRuntimeHome(runtime.name).getAbsolutePath();
|
||||||
|
|
||||||
|
|
@ -315,7 +317,8 @@ public class JREUtils {
|
||||||
List<String> userArguments = parseJavaArguments(userArgumentsString);
|
List<String> userArguments = parseJavaArguments(userArgumentsString);
|
||||||
String resolvFile;
|
String resolvFile;
|
||||||
resolvFile = new File(Tools.DIR_DATA,"resolv.conf").getAbsolutePath();
|
resolvFile = new File(Tools.DIR_DATA,"resolv.conf").getAbsolutePath();
|
||||||
|
// TODO: MOVE THIS TO OUR NEW SETTINGS
|
||||||
|
LauncherPreferences.PREF_SCALE_FACTOR = 50;
|
||||||
ArrayList<String> overridableArguments = new ArrayList<>(Arrays.asList(
|
ArrayList<String> overridableArguments = new ArrayList<>(Arrays.asList(
|
||||||
"-Djava.home=" + runtimeHome,
|
"-Djava.home=" + runtimeHome,
|
||||||
"-Djava.io.tmpdir=" + Tools.DIR_CACHE.getAbsolutePath(),
|
"-Djava.io.tmpdir=" + Tools.DIR_CACHE.getAbsolutePath(),
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,112 @@
|
||||||
|
package net.kdt.pojavlaunch.utils;
|
||||||
|
|
||||||
|
import net.kdt.pojavlaunch.AWTInputBridge;
|
||||||
|
|
||||||
|
/*
|
||||||
|
About Key Events. Because the Android Spec doesn't require
|
||||||
|
soft keyboards to dispatch key events not all keyboard implementations
|
||||||
|
across Android will trigger these actions.
|
||||||
|
|
||||||
|
Currently we use the following function to translate keycodes for
|
||||||
|
special character, capital letters, and digits.
|
||||||
|
|
||||||
|
keycode 123 (F12) is used as a single digit capslock button which
|
||||||
|
when sent to the miniclient before a char will act accordingly.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class KeyEncoder {
|
||||||
|
|
||||||
|
static String specialChars = "/*!@#$%^&*()\"{}_[+:;=-_]'|\\?/<>,.";
|
||||||
|
static char modifier = 123;
|
||||||
|
static char backspaceAndroid = 67;
|
||||||
|
public static char backspaceUnicode = 8;
|
||||||
|
|
||||||
|
public static void sendEncodedChar(int keyCode, char iC){
|
||||||
|
System.out.println(keyCode);
|
||||||
|
if(keyCode == 75)
|
||||||
|
AWTInputBridge.sendKey((char)222,222);
|
||||||
|
else if(keyCode == backspaceAndroid){
|
||||||
|
AWTInputBridge.sendKey(backspaceUnicode,backspaceUnicode);
|
||||||
|
} else if(specialChars.contains(""+iC)){
|
||||||
|
// Send special character to client
|
||||||
|
char c = iC;
|
||||||
|
switch(c){
|
||||||
|
case '!':
|
||||||
|
c = '1';
|
||||||
|
break;
|
||||||
|
case '@':
|
||||||
|
c = '2';
|
||||||
|
break;
|
||||||
|
case '#':
|
||||||
|
c = '3';
|
||||||
|
break;
|
||||||
|
case '$':
|
||||||
|
c = '4';
|
||||||
|
break;
|
||||||
|
case '%':
|
||||||
|
c = '5';
|
||||||
|
break;
|
||||||
|
case '^':
|
||||||
|
c = '6';
|
||||||
|
break;
|
||||||
|
case '&':
|
||||||
|
c = '7';
|
||||||
|
break;
|
||||||
|
case '*':
|
||||||
|
c = '8';
|
||||||
|
break;
|
||||||
|
case '(':
|
||||||
|
c = '9';
|
||||||
|
break;
|
||||||
|
case ')':
|
||||||
|
c = '0';
|
||||||
|
break;
|
||||||
|
case '_':
|
||||||
|
c = '-';
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
c = '=';
|
||||||
|
break;
|
||||||
|
case '{':
|
||||||
|
c = '[';
|
||||||
|
break;
|
||||||
|
case '}':
|
||||||
|
c = ']';
|
||||||
|
break;
|
||||||
|
case ':':
|
||||||
|
c = ';';
|
||||||
|
break;
|
||||||
|
case '"':
|
||||||
|
c = '\'';
|
||||||
|
break;
|
||||||
|
case '<':
|
||||||
|
c = ',';
|
||||||
|
break;
|
||||||
|
case '>':
|
||||||
|
c = '.';
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
c = '/';
|
||||||
|
break;
|
||||||
|
case '|':
|
||||||
|
c = '\\';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(c != iC){
|
||||||
|
AWTInputBridge.sendKey(modifier,modifier);
|
||||||
|
}
|
||||||
|
AWTInputBridge.sendKey(c,c);
|
||||||
|
} else if(Character.isDigit(iC)){
|
||||||
|
AWTInputBridge.sendKey(iC,iC);
|
||||||
|
} else if (iC == Character.toUpperCase(iC)){
|
||||||
|
// We send F12 as a modifier to avoid needing to worry about shift.
|
||||||
|
// Client takes this modifier and does a toUpperCase().
|
||||||
|
AWTInputBridge.sendKey(modifier,modifier);
|
||||||
|
AWTInputBridge.sendKey(Character.toUpperCase(iC),Character.toUpperCase(iC));
|
||||||
|
} else if(iC == Character.toLowerCase(iC)){
|
||||||
|
AWTInputBridge.sendKey(Character.toUpperCase(iC),Character.toUpperCase(iC));
|
||||||
|
} else {
|
||||||
|
AWTInputBridge.sendKey(iC,keyCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
app_pojavlauncher/src/main/res/drawable/detail_select.png
Normal file
BIN
app_pojavlauncher/src/main/res/drawable/detail_select.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.8 MiB |
20
app_pojavlauncher/src/main/res/drawable/dialoguebkg.xml
Normal file
20
app_pojavlauncher/src/main/res/drawable/dialoguebkg.xml
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<solid
|
||||||
|
android:color="#ffff"/>
|
||||||
|
|
||||||
|
<corners
|
||||||
|
android:topLeftRadius="40dp"
|
||||||
|
android:topRightRadius="40dp" />
|
||||||
|
<padding
|
||||||
|
android:left="10dp"
|
||||||
|
android:right="10dp"
|
||||||
|
android:top="10dp"
|
||||||
|
android:bottom="10dp"/>
|
||||||
|
|
||||||
|
<stroke
|
||||||
|
android:width="2dp"
|
||||||
|
android:color="#000"/>
|
||||||
|
|
||||||
|
</shape>
|
||||||
BIN
app_pojavlauncher/src/main/res/drawable/plack.png
Normal file
BIN
app_pojavlauncher/src/main/res/drawable/plack.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 44 KiB |
BIN
app_pojavlauncher/src/main/res/drawable/temp_frame.png
Normal file
BIN
app_pojavlauncher/src/main/res/drawable/temp_frame.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 56 KiB |
|
|
@ -10,10 +10,12 @@
|
||||||
android:background="@drawable/no_focus_shown"
|
android:background="@drawable/no_focus_shown"
|
||||||
android:keepScreenOn="true">
|
android:keepScreenOn="true">
|
||||||
|
|
||||||
|
<!--You can add padding here just paddingLeft, paddingRight-->
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/content_frame"
|
android:id="@+id/content_frame"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent"
|
||||||
|
>
|
||||||
|
|
||||||
<net.kdt.pojavlaunch.customcontrols.ControlLayout
|
<net.kdt.pojavlaunch.customcontrols.ControlLayout
|
||||||
android:id="@+id/main_control_layout"
|
android:id="@+id/main_control_layout"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="#231c09"
|
||||||
|
tools:context=".DummyLauncher">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView4"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="31dp"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:srcCompat="@drawable/plack" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView2"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:srcCompat="@drawable/detail_select" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.Guideline
|
||||||
|
android:id="@+id/guideline"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
app:layout_constraintGuide_percent="0.5" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/playHD"
|
||||||
|
android:layout_width="230dp"
|
||||||
|
android:layout_height="193dp"
|
||||||
|
android:layout_marginStart="64dp"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
android:visibility="visible"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/imageView2"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/guideline"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/imageView2" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/playSD"
|
||||||
|
android:layout_width="339dp"
|
||||||
|
android:layout_height="191dp"
|
||||||
|
android:layout_marginEnd="-44dp"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
android:visibility="visible"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/imageView2"
|
||||||
|
app:layout_constraintEnd_toEndOf="@+id/guideline"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/imageView2"
|
||||||
|
app:layout_constraintVertical_bias="0.504" />
|
||||||
|
|
||||||
|
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||||
|
android:id="@+id/myFab"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:clickable="true"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="@+id/imageView2"
|
||||||
|
tools:srcCompat="@tools:sample/avatars" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
212
app_pojavlauncher/src/main/res/layout/bottomsheetlayout.xml
Normal file
212
app_pojavlauncher/src/main/res/layout/bottomsheetlayout.xml
Normal file
|
|
@ -0,0 +1,212 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@drawable/dialoguebkg">
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical" >
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/createText"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="12dp"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:text="Settings"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textColor="#000000"
|
||||||
|
android:textSize="25dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/mouseSpeed"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:padding="10dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="30dp"
|
||||||
|
android:text="Mouse Speed"
|
||||||
|
android:textColor="#000000"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/userName"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="10dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="30dp"
|
||||||
|
android:text="Auto Login"
|
||||||
|
android:textColor="#000000"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="30dp"
|
||||||
|
android:layout_marginRight="30dp"
|
||||||
|
android:hint="Username"
|
||||||
|
android:background="#6F000000"
|
||||||
|
android:textColor="#ffffff"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="30dp"
|
||||||
|
android:layout_marginRight="30dp"
|
||||||
|
android:hint="Password"
|
||||||
|
android:inputType="textPassword"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:background="#6F000000"
|
||||||
|
android:textColor="#ffffff"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/plugins"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:padding="10dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="30dp"
|
||||||
|
android:text="Plugins"
|
||||||
|
android:textColor="#000000"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/plugin2"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:padding="10dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="30dp"
|
||||||
|
android:text="Plugin1"
|
||||||
|
android:textColor="#000000"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/plugin1"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:padding="10dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="30dp"
|
||||||
|
android:text="Plugin2"
|
||||||
|
android:textColor="#000000"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
<Switch
|
||||||
|
android:id="@+id/switch1"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="Switch" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:padding="10dp">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/loadPlugin"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="30dp"
|
||||||
|
android:text="Load Plugin (Zipped)"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:padding="10dp">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/loadConfig"
|
||||||
|
android:layout_width="197dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="30dp"
|
||||||
|
android:text="Load Config File"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="70dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center|top"
|
||||||
|
android:scaleType="centerCrop"
|
||||||
|
app:srcCompat="@drawable/ic_gamepad_pointer" />
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue