Mindustry/android/src/io/anuke/mindustry/AndroidLauncher.java

187 lines
7.5 KiB
Java
Raw Normal View History

2018-07-28 23:52:02 +07:00
package io.anuke.mindustry;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
2018-12-28 03:47:17 +07:00
import android.provider.Settings.Secure;
2018-07-28 23:52:02 +07:00
import android.telephony.TelephonyManager;
2018-12-28 03:47:17 +07:00
import io.anuke.arc.Core;
import io.anuke.arc.backends.android.surfaceview.AndroidApplication;
import io.anuke.arc.backends.android.surfaceview.AndroidApplicationConfiguration;
import io.anuke.arc.files.FileHandle;
import io.anuke.arc.function.Consumer;
import io.anuke.arc.function.Predicate;
import io.anuke.arc.scene.ui.layout.UnitScl;
2018-12-28 03:47:17 +07:00
import io.anuke.arc.util.Strings;
import io.anuke.arc.util.serialization.Base64Coder;
2018-07-28 23:52:02 +07:00
import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.game.Saves.SaveSlot;
import io.anuke.mindustry.io.SaveIO;
import io.anuke.mindustry.net.*;
2018-07-28 23:52:02 +07:00
import io.anuke.mindustry.ui.dialogs.FileChooser;
2019-04-08 20:03:18 +07:00
import java.io.*;
2018-07-28 23:52:02 +07:00
import java.util.ArrayList;
import static io.anuke.mindustry.Vars.*;
2018-12-28 03:47:17 +07:00
public class AndroidLauncher extends AndroidApplication{
2018-07-28 23:52:02 +07:00
public static final int PERMISSION_REQUEST_CODE = 1;
boolean doubleScaleTablets = true;
FileChooser chooser;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
config.useImmersiveMode = true;
2018-11-13 05:37:25 +07:00
config.depth = 0;
2018-07-28 23:52:02 +07:00
Platform.instance = new Platform(){
2019-04-01 00:16:43 +07:00
@Override
public void hide(){
2019-04-01 05:26:52 +07:00
moveTaskToBack(true);
2019-04-01 00:16:43 +07:00
}
2018-07-28 23:52:02 +07:00
@Override
public String getUUID(){
try{
2018-10-31 06:15:12 +07:00
String s = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);
2018-07-28 23:52:02 +07:00
int len = s.length();
byte[] data = new byte[len / 2];
for(int i = 0; i < len; i += 2){
2019-04-08 20:03:18 +07:00
data[i / 2] = (byte)((Character.digit(s.charAt(i), 16) << 4)
2018-07-28 23:52:02 +07:00
+ Character.digit(s.charAt(i + 1), 16));
}
String result = new String(Base64Coder.encode(data));
if(result.equals("AAAAAAAAAOA=")) throw new RuntimeException("Bad UUID.");
return result;
}catch(Exception e){
return super.getUUID();
}
}
@Override
public void shareFile(FileHandle file){
}
@Override
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, Predicate<String> filetype){
chooser = new FileChooser(text, file -> filetype.test(file.extension().toLowerCase()), open, cons);
2018-07-28 23:52:02 +07:00
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
2018-07-28 23:52:02 +07:00
chooser.show();
chooser = null;
}else{
ArrayList<String> perms = new ArrayList<>();
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
}
2019-04-02 05:51:49 +07:00
requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE);
2018-07-28 23:52:02 +07:00
}
}
@Override
public void beginForceLandscape(){
2019-03-16 07:32:08 +07:00
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
2018-07-28 23:52:02 +07:00
}
@Override
public void endForceLandscape(){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
2018-07-28 23:52:02 +07:00
}
@Override
public boolean canDonate(){
return true;
}
};
2018-07-28 23:52:02 +07:00
if(doubleScaleTablets && isTablet(this.getContext())){
UnitScl.dp.addition = 0.5f;
2018-07-28 23:52:02 +07:00
}
2018-07-28 23:52:02 +07:00
config.hideStatusBar = true;
Net.setClientProvider(new ArcNetClient());
Net.setServerProvider(new ArcNetServer());
2018-07-28 23:52:02 +07:00
initialize(new Mindustry(), config);
checkFiles(getIntent());
}
@Override
2019-03-25 06:58:51 +07:00
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
2018-07-28 23:52:02 +07:00
if(requestCode == PERMISSION_REQUEST_CODE){
for(int i : grantResults){
if(i != PackageManager.PERMISSION_GRANTED) return;
}
if(chooser != null){
chooser.show();
}
}
}
private void checkFiles(Intent intent){
try{
Uri uri = intent.getData();
if(uri != null){
File myFile = null;
String scheme = uri.getScheme();
if(scheme.equals("file")){
String fileName = uri.getEncodedPath();
myFile = new File(fileName);
}else if(!scheme.equals("content")){
//error
return;
}
boolean save = uri.getPath().endsWith(saveExtension);
boolean map = uri.getPath().endsWith(mapExtension);
InputStream inStream;
if(myFile != null) inStream = new FileInputStream(myFile);
else inStream = getContentResolver().openInputStream(uri);
2019-07-03 05:52:04 +07:00
Core.app.post(() -> Core.app.post(() -> {
2018-07-28 23:52:02 +07:00
if(save){ //open save
System.out.println("Opening save.");
2018-12-28 03:47:17 +07:00
FileHandle file = Core.files.local("temp-save." + saveExtension);
2018-07-28 23:52:02 +07:00
file.write(inStream, false);
if(SaveIO.isSaveValid(file)){
try{
2018-10-08 20:41:01 +07:00
SaveSlot slot = control.saves.importSave(file);
2018-07-28 23:52:02 +07:00
ui.load.runLoadSave(slot);
}catch(IOException e){
ui.showError(Core.bundle.format("save.import.fail", Strings.parseException(e, true)));
2018-07-28 23:52:02 +07:00
}
}else{
2019-02-16 00:32:01 +07:00
ui.showError("$save.import.invalid");
2018-07-28 23:52:02 +07:00
}
}else if(map){ //open map
2019-03-13 00:46:40 +07:00
FileHandle file = Core.files.local("temp-map." + mapExtension);
file.write(inStream, false);
2018-12-28 03:47:17 +07:00
Core.app.post(() -> {
2018-07-28 23:52:02 +07:00
System.out.println("Opening map.");
if(!ui.editor.isShown()){
ui.editor.show();
}
2019-03-13 00:46:40 +07:00
ui.editor.beginEditMap(file);
2018-07-28 23:52:02 +07:00
});
}
2019-07-03 05:52:04 +07:00
}));
2018-07-28 23:52:02 +07:00
}
}catch(IOException e){
e.printStackTrace();
}
}
private boolean isTablet(Context context){
2019-04-08 20:03:18 +07:00
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
2019-04-02 05:51:49 +07:00
return manager != null && manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE;
2018-07-28 23:52:02 +07:00
}
}