Fix: Parcelable
This commit is contained in:
parent
d7ea4352ac
commit
ad96f39646
1
NeoLang/.gitignore
vendored
Normal file
1
NeoLang/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/build
|
32
NeoLang/build.gradle
Normal file
32
NeoLang/build.gradle
Normal file
@ -0,0 +1,32 @@
|
||||
apply plugin: 'java-library'
|
||||
apply plugin: 'kotlin'
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||
compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
|
||||
}
|
||||
|
||||
sourceCompatibility = "1.7"
|
||||
targetCompatibility = "1.7"
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.1.3'
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
compileKotlin {
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
}
|
||||
compileTestKotlin {
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
}
|
4
NeoLang/example/main.neo
Normal file
4
NeoLang/example/main.neo
Normal file
@ -0,0 +1,4 @@
|
||||
NeoLang {
|
||||
version : 1
|
||||
x-letter : ${NeoLang@version} >= 2
|
||||
}
|
10
NeoLang/src/main/java/io/neolang/Version.kt
Normal file
10
NeoLang/src/main/java/io/neolang/Version.kt
Normal file
@ -0,0 +1,10 @@
|
||||
package io.neolang
|
||||
|
||||
/**
|
||||
* @author kiva
|
||||
*/
|
||||
object Version {
|
||||
const val MAJOR = 0
|
||||
const val MINOR = 1
|
||||
const val PATCH = 0
|
||||
}
|
10
NeoLang/src/main/java/io/neolang/token/Token.kt
Normal file
10
NeoLang/src/main/java/io/neolang/token/Token.kt
Normal file
@ -0,0 +1,10 @@
|
||||
package io.neolang.token
|
||||
|
||||
/**
|
||||
* @author kiva
|
||||
*/
|
||||
class Token {
|
||||
lateinit var type: TokenType
|
||||
lateinit var value: Any
|
||||
lateinit var nextToken: Token
|
||||
}
|
40
NeoLang/src/main/java/io/neolang/token/TokenType.kt
Normal file
40
NeoLang/src/main/java/io/neolang/token/TokenType.kt
Normal file
@ -0,0 +1,40 @@
|
||||
package io.neolang.token
|
||||
|
||||
/**
|
||||
* @author kiva
|
||||
*/
|
||||
enum class TokenType {
|
||||
TYPE_IDENTIFIER,
|
||||
TYPE_STRING,
|
||||
TYPE_INTEGER,
|
||||
TYPE_BOOLEAN,
|
||||
|
||||
KEYWORD_DOLLAR, /* $ */
|
||||
KEYWORD_USE /* @ */,
|
||||
|
||||
OPERATOR_BEGIN,
|
||||
OPT_ADD, /* + */
|
||||
OPT_SUB, /* - */
|
||||
OPT_NAV, /* - (负号) */
|
||||
OPT_MUL, /* * */
|
||||
OPT_DIV, /* / */
|
||||
OPT_MOD, /* % */
|
||||
OPT_XOR, /* ^ */
|
||||
OPT_AND, /* & */
|
||||
OPT_OR, /* | */
|
||||
LEFT_SHIFT, /* << */
|
||||
RIGHT_SHIFT, /* >> */
|
||||
OPERATOR_END,
|
||||
|
||||
LOGICAL_OPERATOR_BEGIN,
|
||||
OPT_LAND, /* && */
|
||||
OPT_LOR, /* || */
|
||||
OPT_LE, /* <= */
|
||||
OPT_LT, /* < */
|
||||
OPT_GE, /* >= */
|
||||
OPT_GT, /* > */
|
||||
OPT_EQ, /* == */
|
||||
OPT_NEQ, /* != */
|
||||
OPT_NOT, /* ! */
|
||||
LOGICAL_OPERATOR_END,
|
||||
}
|
@ -17,8 +17,8 @@ android {
|
||||
applicationId "io.neoterm"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 25
|
||||
versionCode 8
|
||||
versionName "1.1.6"
|
||||
versionCode 9
|
||||
versionName "1.1.7"
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
resConfigs "zh"
|
||||
externalNativeBuild {
|
||||
|
33
app/proguard-rules.pro
vendored
33
app/proguard-rules.pro
vendored
@ -24,6 +24,10 @@
|
||||
# hide the original source file name.
|
||||
#-renamesourcefileattribute SourceFile
|
||||
|
||||
-dontpreverify
|
||||
-printmapping proguardMapping.txt
|
||||
|
||||
|
||||
-keep class io.neoterm.backend.JNI {
|
||||
*;
|
||||
}
|
||||
@ -51,14 +55,14 @@
|
||||
# <init>(java.lang.Throwable);
|
||||
#}
|
||||
|
||||
#rxjava
|
||||
-dontwarn rx.**
|
||||
#-keep class rx.** { *; }
|
||||
|
||||
#skf4j
|
||||
-dontwarn org.slf4j.**
|
||||
|
||||
-dontwarn sun.misc.**
|
||||
|
||||
# RxJava
|
||||
#-keep class rx.** { *; }
|
||||
-dontwarn rx.**
|
||||
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
|
||||
long producerIndex;
|
||||
long consumerIndex;
|
||||
@ -69,3 +73,24 @@
|
||||
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
|
||||
rx.internal.util.atomic.LinkedQueueNode consumerNode;
|
||||
}
|
||||
|
||||
|
||||
# Parcelable
|
||||
-keep class * implements android.os.Parcelable {
|
||||
public static final android.os.Parcelable$Creator *;
|
||||
}
|
||||
-keepclassmembers class * implements android.os.Parcelable {
|
||||
public <fields>;
|
||||
private <fields>;
|
||||
}
|
||||
|
||||
# Serializable
|
||||
-keepclassmembers class * implements java.io.Serializable {
|
||||
static final long serialVersionUID;
|
||||
private static final java.io.ObjectStreamField[] serialPersistentFields;
|
||||
private void writeObject(java.io.ObjectOutputStream);
|
||||
private void readObject(java.io.ObjectInputStream);
|
||||
java.lang.Object writeReplace();
|
||||
java.lang.Object readResolve();
|
||||
}
|
||||
|
||||
|
@ -11,10 +11,9 @@ import android.util.Pair;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@ -24,8 +23,8 @@ import java.util.zip.ZipInputStream;
|
||||
|
||||
import io.neoterm.R;
|
||||
import io.neoterm.backend.EmulatorDebug;
|
||||
import io.neoterm.preference.NeoPreference;
|
||||
import io.neoterm.preference.NeoTermPath;
|
||||
import io.neoterm.utils.FileUtils;
|
||||
|
||||
public final class BaseFileInstaller {
|
||||
public interface ResultListener {
|
||||
@ -64,8 +63,9 @@ public final class BaseFileInstaller {
|
||||
final byte[] buffer = new byte[8096];
|
||||
final List<Pair<String, String>> symlinks = new ArrayList<>(50);
|
||||
|
||||
final URL zipUrl = determineZipUrl();
|
||||
HttpURLConnection connection = (HttpURLConnection) zipUrl.openConnection();
|
||||
HttpURLConnection connection = openBaseFileConnection();
|
||||
connection.setConnectTimeout(8000);
|
||||
connection.setReadTimeout(8000);
|
||||
totalBytes = connection.getContentLength();
|
||||
|
||||
try (ZipInputStream zipInput = new ZipInputStream(connection.getInputStream())) {
|
||||
@ -171,12 +171,22 @@ public final class BaseFileInstaller {
|
||||
}.start();
|
||||
}
|
||||
|
||||
private static URL determineZipUrl() throws MalformedURLException {
|
||||
String archName = determineArchName();
|
||||
String baseUrl = NeoTermPath.INSTANCE.getSERVER_BOOT_URL();
|
||||
return new URL(baseUrl + "/" + archName + ".zip");
|
||||
private static HttpURLConnection openBaseFileConnection() throws IOException {
|
||||
String arch = determineArchName();
|
||||
String baseUrl = NeoTermPath.INSTANCE.getDEFAULT_SOURCE();
|
||||
|
||||
// Use the same source
|
||||
NeoPreference.INSTANCE.store(R.string.key_package_source, baseUrl);
|
||||
|
||||
return (HttpURLConnection) new URL(baseUrl + "/boot/" + arch + ".zip").openConnection();
|
||||
}
|
||||
|
||||
// private static URL determineZipUrl() throws MalformedURLException {
|
||||
// String archName = determineArchName();
|
||||
// String baseUrl = NeoTermPath.INSTANCE.getSERVER_BOOT_URL();
|
||||
// return new URL(baseUrl + "/" + archName + ".zip");
|
||||
// }
|
||||
|
||||
private static String determineArchName() {
|
||||
for (String androidArch : Build.SUPPORTED_ABIS) {
|
||||
switch (androidArch) {
|
||||
@ -186,8 +196,8 @@ public final class BaseFileInstaller {
|
||||
return "arm";
|
||||
case "x86_64":
|
||||
return "x86_64";
|
||||
case "x86":
|
||||
return "i686";
|
||||
// case "x86":
|
||||
// return "i686";
|
||||
}
|
||||
}
|
||||
throw new RuntimeException("Unable to determine arch from Build.SUPPORTED_ABIS = " +
|
||||
|
@ -3,6 +3,7 @@ package io.neoterm.preference
|
||||
import android.Manifest
|
||||
import android.app.Activity
|
||||
import android.app.AlertDialog
|
||||
import android.content.ActivityNotFoundException
|
||||
import android.content.DialogInterface
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
@ -28,17 +29,23 @@ object NeoPermission {
|
||||
Manifest.permission.READ_CONTACTS)) {
|
||||
AlertDialog.Builder(context).setMessage("需要存储权限来访问存储设备上的文件")
|
||||
.setPositiveButton(android.R.string.ok, { _: DialogInterface, _: Int ->
|
||||
ActivityCompat.requestPermissions(context,
|
||||
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
|
||||
requestCode)
|
||||
doRequestPermission(context, requestCode)
|
||||
})
|
||||
.show()
|
||||
|
||||
} else {
|
||||
ActivityCompat.requestPermissions(context,
|
||||
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
|
||||
requestCode)
|
||||
doRequestPermission(context, requestCode)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun doRequestPermission(context: Activity, requestCode: Int) {
|
||||
try {
|
||||
ActivityCompat.requestPermissions(context,
|
||||
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
|
||||
requestCode)
|
||||
} catch (ignore: ActivityNotFoundException) {
|
||||
// for MIUI, we ignore it.
|
||||
}
|
||||
}
|
||||
}
|
@ -22,8 +22,8 @@ object NeoTermPath {
|
||||
const val SOURCE_FILE = "$USR_PATH/etc/apt/sources.list"
|
||||
const val PACKAGE_LIST_DIR = "$USR_PATH/var/lib/apt/lists"
|
||||
|
||||
private const val RELEASE_SOURCE = "https://mirrors.geekpie.org/neoterm"
|
||||
private const val DEBUG_SOURCE = "http://192.243.117.135"
|
||||
const val RELEASE_SOURCE = "https://mirrors.geekpie.org/neoterm"
|
||||
const val DEBUG_SOURCE = "http://neoterm.studio"
|
||||
|
||||
val DEFAULT_SOURCE: String
|
||||
val SERVER_BASE_URL: String
|
||||
@ -32,6 +32,6 @@ object NeoTermPath {
|
||||
init {
|
||||
DEFAULT_SOURCE = if (BuildConfig.DEBUG) DEBUG_SOURCE else RELEASE_SOURCE
|
||||
SERVER_BASE_URL = DEFAULT_SOURCE
|
||||
SERVER_BOOT_URL = "${SERVER_BASE_URL}/boot"
|
||||
SERVER_BOOT_URL = "$SERVER_BASE_URL/boot"
|
||||
}
|
||||
}
|
@ -30,6 +30,7 @@ import io.neoterm.preference.NeoTermPath
|
||||
import io.neoterm.ui.pm.adapter.PackageAdapter
|
||||
import io.neoterm.ui.pm.model.PackageModel
|
||||
import io.neoterm.utils.FileUtils
|
||||
import io.neoterm.utils.PackageUtils
|
||||
import io.neoterm.view.TerminalDialog
|
||||
import java.io.File
|
||||
import java.net.URL
|
||||
@ -171,9 +172,7 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen
|
||||
|
||||
private fun changeSourceInternal(source: String) {
|
||||
NeoPreference.store(R.string.key_package_source, source)
|
||||
|
||||
val sourceFile = File(NeoTermPath.SOURCE_FILE)
|
||||
FileUtils.writeFile(sourceFile, generateSourceFile(source).toByteArray())
|
||||
PackageUtils.syncSource()
|
||||
executeAptUpdate()
|
||||
}
|
||||
|
||||
@ -220,15 +219,6 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen
|
||||
}.start()
|
||||
}
|
||||
|
||||
private fun generateSourceFile(source: String): String {
|
||||
return StringBuilder().append("# Generated by NeoTerm-Preference\n")
|
||||
.append("deb ")
|
||||
.append(source)
|
||||
.append(" stable main")
|
||||
.append("\n")
|
||||
.toString()
|
||||
}
|
||||
|
||||
private fun filter(models: List<PackageModel>, query: String?): List<PackageModel> {
|
||||
val filteredModelList = ArrayList<PackageModel>()
|
||||
if (query != null) {
|
||||
|
@ -21,6 +21,7 @@ import io.neoterm.customize.pm.NeoPackageManagerUtils
|
||||
import io.neoterm.customize.setup.BaseFileInstaller
|
||||
import io.neoterm.preference.NeoPreference
|
||||
import io.neoterm.preference.NeoTermPath
|
||||
import io.neoterm.utils.PackageUtils
|
||||
import io.neoterm.view.TerminalDialog
|
||||
import java.util.*
|
||||
|
||||
@ -92,6 +93,7 @@ class SetupActivity : AppCompatActivity() {
|
||||
resultListener = BaseFileInstaller.ResultListener { error ->
|
||||
if (error == null) {
|
||||
setResult(Activity.RESULT_OK)
|
||||
PackageUtils.syncSource()
|
||||
executeAptUpdate()
|
||||
} else {
|
||||
AlertDialog.Builder(this@SetupActivity)
|
||||
@ -100,6 +102,7 @@ class SetupActivity : AppCompatActivity() {
|
||||
.setNegativeButton(R.string.use_system_shell, { _, _ ->
|
||||
setResult(Activity.RESULT_CANCELED)
|
||||
nextButton.visibility = View.VISIBLE
|
||||
finish()
|
||||
})
|
||||
.setPositiveButton(R.string.retry, { dialog, _ ->
|
||||
dialog.dismiss()
|
||||
@ -156,10 +159,12 @@ class SetupActivity : AppCompatActivity() {
|
||||
val packageName = item.title
|
||||
val pm = NeoPackageManager.get()
|
||||
val packageInfo = pm.getPackageInfo(packageName)
|
||||
val packageDesc = packageInfo.description
|
||||
toast.cancel()
|
||||
toast.setText(packageDesc)
|
||||
toast.show()
|
||||
if (packageInfo != null) {
|
||||
val packageDesc = packageInfo.description
|
||||
toast.cancel()
|
||||
toast.setText(packageDesc)
|
||||
toast.show()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBubbleDeselected(item: PickerItem) {
|
||||
|
26
app/src/main/java/io/neoterm/utils/PackageUtils.kt
Normal file
26
app/src/main/java/io/neoterm/utils/PackageUtils.kt
Normal file
@ -0,0 +1,26 @@
|
||||
package io.neoterm.utils
|
||||
|
||||
import io.neoterm.R
|
||||
import io.neoterm.preference.NeoPreference
|
||||
import io.neoterm.preference.NeoTermPath
|
||||
import java.io.File
|
||||
|
||||
/**
|
||||
* @author kiva
|
||||
*/
|
||||
object PackageUtils {
|
||||
fun syncSource() {
|
||||
val source = NeoPreference.loadString(R.string.key_package_source, NeoTermPath.DEFAULT_SOURCE)
|
||||
val sourceFile = File(NeoTermPath.SOURCE_FILE)
|
||||
FileUtils.writeFile(sourceFile, generateSourceFile(source).toByteArray())
|
||||
}
|
||||
|
||||
private fun generateSourceFile(source: String): String {
|
||||
return StringBuilder().append("# Generated by NeoTerm-Preference\n")
|
||||
.append("deb ")
|
||||
.append(source)
|
||||
.append(" stable main")
|
||||
.append("\n")
|
||||
.toString()
|
||||
}
|
||||
}
|
@ -1 +1 @@
|
||||
include ':app', ':chrome-tabs'
|
||||
include ':app', ':chrome-tabs', ':NeoLang'
|
||||
|
Loading…
Reference in New Issue
Block a user