fix: exposed uri error
This commit is contained in:
BIN
.idea/caches/build_file_checksums.ser
generated
BIN
.idea/caches/build_file_checksums.ser
generated
Binary file not shown.
@@ -70,6 +70,7 @@ android {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
flatDir {
|
flatDir {
|
||||||
dirs 'libs'
|
dirs 'libs'
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="android.support.v4.content.FileProvider"
|
android:name=".external.fileprovider.AppFileProvider"
|
||||||
android:authorities="org.autojs.autojs.fileprovider"
|
android:authorities="org.autojs.autojs.fileprovider"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:grantUriPermissions="true">
|
android:grantUriPermissions="true">
|
||||||
|
|||||||
16
app/src/main/java/org/autojs/autojs/external/fileprovider/AppFileProvider.java
vendored
Normal file
16
app/src/main/java/org/autojs/autojs/external/fileprovider/AppFileProvider.java
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package org.autojs.autojs.external.fileprovider;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.support.v4.content.FileProvider;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public class AppFileProvider extends FileProvider {
|
||||||
|
|
||||||
|
public static final String AUTHORITY = "org.autojs.autojs.fileprovider";
|
||||||
|
|
||||||
|
public static Uri getUriForFile(Context context, File file){
|
||||||
|
return FileProvider.getUriForFile(context, AUTHORITY, file);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,11 +12,13 @@ import com.stardust.autojs.execution.ScriptExecutionListener;
|
|||||||
import com.stardust.autojs.execution.SimpleScriptExecutionListener;
|
import com.stardust.autojs.execution.SimpleScriptExecutionListener;
|
||||||
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
|
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
|
||||||
import com.stardust.autojs.script.ScriptSource;
|
import com.stardust.autojs.script.ScriptSource;
|
||||||
|
import com.stardust.util.IntentUtil;
|
||||||
|
|
||||||
import org.autojs.autojs.Pref;
|
import org.autojs.autojs.Pref;
|
||||||
import org.autojs.autojs.R;
|
import org.autojs.autojs.R;
|
||||||
import org.autojs.autojs.autojs.AutoJs;
|
import org.autojs.autojs.autojs.AutoJs;
|
||||||
import org.autojs.autojs.external.ScriptIntents;
|
import org.autojs.autojs.external.ScriptIntents;
|
||||||
|
import org.autojs.autojs.external.fileprovider.AppFileProvider;
|
||||||
import org.autojs.autojs.external.shortcut.Shortcut;
|
import org.autojs.autojs.external.shortcut.Shortcut;
|
||||||
import org.autojs.autojs.external.shortcut.ShortcutActivity;
|
import org.autojs.autojs.external.shortcut.ShortcutActivity;
|
||||||
import org.autojs.autojs.ui.edit.EditActivity;
|
import org.autojs.autojs.ui.edit.EditActivity;
|
||||||
@@ -71,8 +73,7 @@ public class Scripts {
|
|||||||
|
|
||||||
|
|
||||||
public static void openByOtherApps(String path) {
|
public static void openByOtherApps(String path) {
|
||||||
Uri uri = Uri.parse("file://" + path);
|
IntentUtil.viewFile(GlobalAppContext.get(), path, "text/plain", AppFileProvider.AUTHORITY);
|
||||||
GlobalAppContext.get().startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, "text/plain").addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void openByOtherApps(File file) {
|
public static void openByOtherApps(File file) {
|
||||||
@@ -111,8 +112,8 @@ public class Scripts {
|
|||||||
public static ScriptExecution run(ScriptSource source) {
|
public static ScriptExecution run(ScriptSource source) {
|
||||||
try {
|
try {
|
||||||
return AutoJs.getInstance().getScriptEngineService().execute(source, new ExecutionConfig()
|
return AutoJs.getInstance().getScriptEngineService().execute(source, new ExecutionConfig()
|
||||||
.executePath(Pref.getScriptDirPath())
|
.executePath(Pref.getScriptDirPath())
|
||||||
.requirePath(Pref.getScriptDirPath()));
|
.requirePath(Pref.getScriptDirPath()));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Toast.makeText(GlobalAppContext.get(), e.getMessage(), Toast.LENGTH_LONG).show();
|
Toast.makeText(GlobalAppContext.get(), e.getMessage(), Toast.LENGTH_LONG).show();
|
||||||
|
|||||||
@@ -5,10 +5,8 @@ import android.os.Bundle;
|
|||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.design.widget.FloatingActionButton;
|
import android.support.design.widget.FloatingActionButton;
|
||||||
import android.support.v7.widget.RecyclerView;
|
|
||||||
|
|
||||||
import com.stardust.app.GlobalAppContext;
|
import com.stardust.app.GlobalAppContext;
|
||||||
import com.stardust.util.BackPressedHandler;
|
|
||||||
import com.stardust.util.IntentUtil;
|
import com.stardust.util.IntentUtil;
|
||||||
|
|
||||||
import org.androidannotations.annotations.AfterViews;
|
import org.androidannotations.annotations.AfterViews;
|
||||||
@@ -16,6 +14,7 @@ import org.androidannotations.annotations.EFragment;
|
|||||||
import org.androidannotations.annotations.ViewById;
|
import org.androidannotations.annotations.ViewById;
|
||||||
import org.autojs.autojs.Pref;
|
import org.autojs.autojs.Pref;
|
||||||
import org.autojs.autojs.R;
|
import org.autojs.autojs.R;
|
||||||
|
import org.autojs.autojs.external.fileprovider.AppFileProvider;
|
||||||
import org.autojs.autojs.model.explorer.ExplorerDirPage;
|
import org.autojs.autojs.model.explorer.ExplorerDirPage;
|
||||||
import org.autojs.autojs.model.explorer.Explorers;
|
import org.autojs.autojs.model.explorer.Explorers;
|
||||||
import org.autojs.autojs.model.script.Scripts;
|
import org.autojs.autojs.model.script.Scripts;
|
||||||
@@ -28,7 +27,6 @@ import org.autojs.autojs.ui.main.ViewPagerFragment;
|
|||||||
import org.autojs.autojs.ui.project.ProjectConfigActivity;
|
import org.autojs.autojs.ui.project.ProjectConfigActivity;
|
||||||
import org.autojs.autojs.ui.project.ProjectConfigActivity_;
|
import org.autojs.autojs.ui.project.ProjectConfigActivity_;
|
||||||
import org.autojs.autojs.ui.viewmodel.ExplorerItemList;
|
import org.autojs.autojs.ui.viewmodel.ExplorerItemList;
|
||||||
import org.autojs.autojs.ui.widget.ExpandableRecyclerView;
|
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
import org.greenrobot.eventbus.Subscribe;
|
import org.greenrobot.eventbus.Subscribe;
|
||||||
|
|
||||||
@@ -66,7 +64,7 @@ public class MyScriptListFragment extends ViewPagerFragment implements FloatingA
|
|||||||
if (item.isEditable()) {
|
if (item.isEditable()) {
|
||||||
Scripts.edit(item.toScriptFile());
|
Scripts.edit(item.toScriptFile());
|
||||||
} else {
|
} else {
|
||||||
IntentUtil.viewFile(GlobalAppContext.get(), item.getPath());
|
IntentUtil.viewFile(GlobalAppContext.get(), item.getPath(), AppFileProvider.AUTHORITY);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<external-path name="external_files" path="."/>
|
<external-path name="external_files" path="."/>
|
||||||
|
<files-path name="sample" path="sample"/>
|
||||||
|
<root-path name="root_files" path="." />
|
||||||
</paths>
|
</paths>
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
||||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||||
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
|
||||||
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
|
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public class OpenCVHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void initIfNeeded(Activity activity, InitializeCallback callback) {
|
public static void initIfNeeded(Activity activity, InitializeCallback callback) {
|
||||||
if(mInitialized){
|
if (mInitialized) {
|
||||||
callback.onInitFinish();
|
callback.onInitFinish();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -55,17 +55,18 @@ public class OpenCVHelper {
|
|||||||
public void onManagerConnected(int status) {
|
public void onManagerConnected(int status) {
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case 0:
|
case 0:
|
||||||
|
finish();
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
default:
|
default:
|
||||||
Log.e(LOG_TAG, "OpenCV loading failed!");
|
Log.e(LOG_TAG, "OpenCV loading failed!");
|
||||||
new MaterialDialog.Builder(mActivity)
|
new MaterialDialog.Builder(mActivity)
|
||||||
.title("OpenCV error")
|
.title("OpenCV error")
|
||||||
.content("OpenCV was not initialised correctly. Application will be shut down")
|
.content("OpenCV was not initialised correctly. Application will be shut down")
|
||||||
.cancelable(false)
|
.cancelable(false)
|
||||||
.positiveText("OK")
|
.positiveText("OK")
|
||||||
.onPositive((dialog, which) -> finish())
|
.onPositive((dialog, which) -> finish())
|
||||||
.show();
|
.show();
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
Log.e(LOG_TAG, "Package installation failed!");
|
Log.e(LOG_TAG, "Package installation failed!");
|
||||||
@@ -117,6 +118,8 @@ public class OpenCVHelper {
|
|||||||
.negativeText("Exit")
|
.negativeText("Exit")
|
||||||
.onNegative(((dialog, which) -> callback.cancel()))
|
.onNegative(((dialog, which) -> callback.cancel()))
|
||||||
.show();
|
.show();
|
||||||
|
default:
|
||||||
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,9 +7,7 @@ import android.content.pm.ApplicationInfo;
|
|||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.webkit.MimeTypeMap;
|
|
||||||
|
|
||||||
import com.stardust.autojs.annotation.ScriptInterface;
|
import com.stardust.autojs.annotation.ScriptInterface;
|
||||||
import com.stardust.util.IntentUtil;
|
import com.stardust.util.IntentUtil;
|
||||||
@@ -18,8 +16,6 @@ import com.stardust.util.MimeTypes;
|
|||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static com.stardust.pio.PFiles.getExtension;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/4/2.
|
* Created by Stardust on 2017/4/2.
|
||||||
*/
|
*/
|
||||||
@@ -28,9 +24,16 @@ public class AppUtils {
|
|||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private volatile WeakReference<Activity> mCurrentActivity = new WeakReference<>(null);
|
private volatile WeakReference<Activity> mCurrentActivity = new WeakReference<>(null);
|
||||||
|
private final String mFileProviderAuthority;
|
||||||
|
|
||||||
public AppUtils(Context context) {
|
public AppUtils(Context context) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
|
mFileProviderAuthority = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppUtils(Context context, String fileProviderAuthority) {
|
||||||
|
mContext = context;
|
||||||
|
mFileProviderAuthority = fileProviderAuthority;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ScriptInterface
|
@ScriptInterface
|
||||||
@@ -99,22 +102,14 @@ public class AppUtils {
|
|||||||
public void viewFile(String path) {
|
public void viewFile(String path) {
|
||||||
if (path == null)
|
if (path == null)
|
||||||
throw new NullPointerException("path == null");
|
throw new NullPointerException("path == null");
|
||||||
path = "file://" + path;
|
IntentUtil.viewFile(mContext, path, mFileProviderAuthority);
|
||||||
String mimeType = MimeTypes.fromFileOr(path, "*/*");
|
|
||||||
mContext.startActivity(new Intent(Intent.ACTION_VIEW)
|
|
||||||
.setDataAndType(Uri.parse(path), mimeType)
|
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ScriptInterface
|
@ScriptInterface
|
||||||
public void editFile(String path) {
|
public void editFile(String path) {
|
||||||
if (path == null)
|
if (path == null)
|
||||||
throw new NullPointerException("path == null");
|
throw new NullPointerException("path == null");
|
||||||
path = "file://" + path;
|
IntentUtil.editFile(mContext, path, mFileProviderAuthority);
|
||||||
String mimeType = MimeTypes.fromFileOr(path, "*/*");
|
|
||||||
mContext.startActivity(new Intent(Intent.ACTION_EDIT)
|
|
||||||
.setDataAndType(Uri.parse(path), mimeType)
|
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ScriptInterface
|
@ScriptInterface
|
||||||
|
|||||||
11
build.gradle
11
build.gradle
@@ -1,3 +1,5 @@
|
|||||||
|
import groovy.json.JsonSlurper
|
||||||
|
|
||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
@@ -27,12 +29,5 @@ task clean(type: Delete) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
versions = [
|
versions = new JsonSlurper().parse(file('./project-versions.json'))
|
||||||
appVersionCode: 423,
|
|
||||||
appVersionName: '4.0.3 Alpha4',
|
|
||||||
target : 28,
|
|
||||||
mini : 17,
|
|
||||||
compile : 28,
|
|
||||||
buildTool : '28.0.3'
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":423},"path":"commonRelease-4.0.3 Alpha4.apk","properties":{"packageId":"org.autojs.autojs","split":"","minSdkVersion":"17"}}]
|
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":424,"versionName":"4.0.3 Alpha5","enabled":true,"outputFile":"commonRelease-4.0.3 Alpha5.apk","fullName":"commonRelease","baseName":"common-release"},"path":"commonRelease-4.0.3 Alpha5.apk","properties":{}}]
|
||||||
@@ -5,6 +5,7 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.v4.content.FileProvider;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
@@ -93,11 +94,37 @@ public class IntentUtil {
|
|||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void viewFile(Context context, String path) {
|
public static void viewFile(Context context, String path, String fileProviderAuthority) {
|
||||||
path = "file://" + path;
|
|
||||||
String mimeType = MimeTypes.fromFileOr(path, "*/*");
|
String mimeType = MimeTypes.fromFileOr(path, "*/*");
|
||||||
|
viewFile(context, path, mimeType, fileProviderAuthority);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void viewFile(Context context, String path, String mimeType, String fileProviderAuthority) {
|
||||||
|
Uri uri;
|
||||||
|
if (fileProviderAuthority == null) {
|
||||||
|
uri = Uri.parse("file://" + path);
|
||||||
|
} else {
|
||||||
|
uri = FileProvider.getUriForFile(context, fileProviderAuthority, new File(path));
|
||||||
|
}
|
||||||
context.startActivity(new Intent(Intent.ACTION_VIEW)
|
context.startActivity(new Intent(Intent.ACTION_VIEW)
|
||||||
.setDataAndType(Uri.parse(path), mimeType)
|
.setDataAndType(uri, mimeType)
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
|
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||||
|
.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void editFile(Context context, String path, String fileProviderAuthority) {
|
||||||
|
String mimeType = MimeTypes.fromFileOr(path, "*/*");
|
||||||
|
Uri uri;
|
||||||
|
if (fileProviderAuthority == null) {
|
||||||
|
uri = Uri.parse("file://" + path);
|
||||||
|
} else {
|
||||||
|
uri = FileProvider.getUriForFile(context, fileProviderAuthority, new File(path));
|
||||||
|
}
|
||||||
|
context.startActivity(new Intent(Intent.ACTION_EDIT)
|
||||||
|
.setDataAndType(uri, mimeType)
|
||||||
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
|
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||||
|
.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
|
|||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
|
||||||
|
|||||||
@@ -36,6 +36,39 @@ android {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
task buildApkPlugin {
|
||||||
|
doLast {
|
||||||
|
def pluginProjectDirPath = '..\\..\\AutoJsApkBuilderPlugin'
|
||||||
|
def pluginProjectDir = file(pluginProjectDirPath)
|
||||||
|
if(!pluginProjectDir.exists() || !pluginProjectDir.isDirectory()){
|
||||||
|
println 'pluginProjectDir not exists'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
copy {
|
||||||
|
from file('build\\outputs\\apk\\release\\')
|
||||||
|
into new File(pluginProjectDir, 'app\\src\\main\\assets')
|
||||||
|
include "inrt-release-unsigned.apk"
|
||||||
|
rename "inrt-release-unsigned.apk", 'template.apk'
|
||||||
|
}
|
||||||
|
exec {
|
||||||
|
workingDir pluginProjectDir
|
||||||
|
commandLine 'gradlew.bat', 'assembleRelease'
|
||||||
|
}
|
||||||
|
copy {
|
||||||
|
from new File(pluginProjectDir, 'app\\build\\outputs\\apk\\release')
|
||||||
|
into file('..\\common\\release')
|
||||||
|
include '*-release.apk'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.whenTaskAdded { task ->
|
||||||
|
if (task.name == 'assembleRelease') {
|
||||||
|
task.finalizedBy 'buildApkPlugin'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
flatDir {
|
flatDir {
|
||||||
dirs 'libs'
|
dirs 'libs'
|
||||||
|
|||||||
@@ -75,9 +75,7 @@ public class SplashActivity extends AppCompatActivity {
|
|||||||
runScript();
|
runScript();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int[] grantResults = new int[permissions.length];
|
runScript();
|
||||||
Arrays.fill(grantResults, PERMISSION_GRANTED);
|
|
||||||
onRequestPermissionsResult(PERMISSION_REQUEST_CODE, permissions, grantResults);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
8
project-versions.json
Normal file
8
project-versions.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"appVersionCode": 424,
|
||||||
|
"appVersionName": "4.0.3 Alpha5",
|
||||||
|
"target": 28,
|
||||||
|
"mini": 17,
|
||||||
|
"compile": 28,
|
||||||
|
"buildTool": "28.0.3"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user