feat: can set app icon of apk building
@@ -1 +1 @@
|
|||||||
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":231},"path":"release-3.0.0 Alpha31.apk","properties":{"packageId":"com.stardust.scriptdroid","split":"","minSdkVersion":"17"}}]
|
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1},"path":"inrt-release.apk","properties":{"packageId":"com.stardust.auojs.inrt","split":"","minSdkVersion":"17"}}]
|
||||||
@@ -1,10 +1,14 @@
|
|||||||
package com.stardust.scriptdroid.autojs.build;
|
package com.stardust.scriptdroid.autojs.build;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
|
||||||
import com.stardust.autojs.apkbuilder.ApkBuilder;
|
import com.stardust.autojs.apkbuilder.ApkBuilder;
|
||||||
import com.stardust.autojs.apkbuilder.ManifestEditor;
|
import com.stardust.autojs.apkbuilder.ManifestEditor;
|
||||||
import com.stardust.autojs.apkbuilder.util.StreamUtils;
|
import com.stardust.autojs.apkbuilder.util.StreamUtils;
|
||||||
import com.stardust.scriptdroid.App;
|
import com.stardust.scriptdroid.App;
|
||||||
import com.stardust.scriptdroid.ui.build.BuildActivity;
|
|
||||||
|
import org.androidannotations.annotations.Click;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
@@ -12,6 +16,7 @@ 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;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/10/24.
|
* Created by Stardust on 2017/10/24.
|
||||||
@@ -37,19 +42,44 @@ public class AutoJsApkBuilder extends ApkBuilder {
|
|||||||
int versionCode;
|
int versionCode;
|
||||||
String jsPath;
|
String jsPath;
|
||||||
String packageName;
|
String packageName;
|
||||||
|
Callable<Bitmap> icon;
|
||||||
|
|
||||||
public AppConfig(String packageName, String appName, String versionName, int versionCode, String jsPath) {
|
public AppConfig setAppName(String appName) {
|
||||||
this.packageName = packageName;
|
|
||||||
this.appName = appName;
|
this.appName = appName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppConfig setVersionName(String versionName) {
|
||||||
this.versionName = versionName;
|
this.versionName = versionName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppConfig setVersionCode(int versionCode) {
|
||||||
this.versionCode = versionCode;
|
this.versionCode = versionCode;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppConfig setJsPath(String jsPath) {
|
||||||
this.jsPath = jsPath;
|
this.jsPath = jsPath;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppConfig setPackageName(String packageName) {
|
||||||
|
this.packageName = packageName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public AppConfig setIcon(Callable<Bitmap> icon) {
|
||||||
|
this.icon = icon;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ProgressCallback mProgressCallback;
|
private ProgressCallback mProgressCallback;
|
||||||
private ManifestEditor mManifestEditor;
|
private ManifestEditor mManifestEditor;
|
||||||
private String mWorkspacePath;
|
private String mWorkspacePath;
|
||||||
|
private AppConfig mAppConfig;
|
||||||
|
|
||||||
public AutoJsApkBuilder(InputStream apkInputStream, File outApkFile, String workspacePath) {
|
public AutoJsApkBuilder(InputStream apkInputStream, File outApkFile, String workspacePath) {
|
||||||
super(apkInputStream, outApkFile, workspacePath);
|
super(apkInputStream, outApkFile, workspacePath);
|
||||||
@@ -86,7 +116,9 @@ public class AutoJsApkBuilder extends ApkBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public AutoJsApkBuilder withConfig(AppConfig config) throws IOException {
|
public AutoJsApkBuilder withConfig(AppConfig config) throws IOException {
|
||||||
mManifestEditor = editManifest().setAppName(config.appName)
|
mAppConfig = config;
|
||||||
|
mManifestEditor = editManifest()
|
||||||
|
.setAppName(config.appName)
|
||||||
.setVersionName(config.versionName)
|
.setVersionName(config.versionName)
|
||||||
.setVersionCode(config.versionCode)
|
.setVersionCode(config.versionCode)
|
||||||
.setPackageName(config.packageName);
|
.setPackageName(config.packageName);
|
||||||
@@ -101,7 +133,14 @@ public class AutoJsApkBuilder extends ApkBuilder {
|
|||||||
App.getApp().getUiHandler().post(() -> mProgressCallback.onBuild(AutoJsApkBuilder.this));
|
App.getApp().getUiHandler().post(() -> mProgressCallback.onBuild(AutoJsApkBuilder.this));
|
||||||
}
|
}
|
||||||
mManifestEditor.commit();
|
mManifestEditor.commit();
|
||||||
mManifestEditor = null;
|
if (mAppConfig.icon != null) {
|
||||||
|
try {
|
||||||
|
mAppConfig.icon.call().compress(Bitmap.CompressFormat.PNG, 100,
|
||||||
|
new FileOutputStream(new File(mWorkspacePath, "res/mipmap/ic_launcher.png")));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
return (AutoJsApkBuilder) super.build();
|
return (AutoJsApkBuilder) super.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import android.content.Context;
|
|||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
|
||||||
|
import com.stardust.BuildConfig;
|
||||||
import com.stardust.pio.UncheckedIOException;
|
import com.stardust.pio.UncheckedIOException;
|
||||||
import com.stardust.util.DeveloperUtils;
|
import com.stardust.util.DeveloperUtils;
|
||||||
|
|
||||||
@@ -25,6 +26,9 @@ public class ApkBuilderPluginHelper {
|
|||||||
|
|
||||||
public static InputStream openTemplateApk(Context context) {
|
public static InputStream openTemplateApk(Context context) {
|
||||||
try {
|
try {
|
||||||
|
if (BuildConfig.DEBUG) {
|
||||||
|
return context.getAssets().open(TEMPLATE_APK_PATH);
|
||||||
|
}
|
||||||
return context.getPackageManager().getResourcesForApplication(PLUGIN_PACKAGE_NAME)
|
return context.getPackageManager().getResourcesForApplication(PLUGIN_PACKAGE_NAME)
|
||||||
.getAssets().open(TEMPLATE_APK_PATH);
|
.getAssets().open(TEMPLATE_APK_PATH);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
package com.stardust.scriptdroid.ui.build;
|
package com.stardust.scriptdroid.ui.build;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
import android.support.design.widget.TextInputEditText;
|
import android.support.design.widget.TextInputEditText;
|
||||||
import android.support.design.widget.TextInputLayout;
|
import android.support.design.widget.TextInputLayout;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
|
import android.widget.ImageView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
import com.afollestad.materialdialogs.MaterialDialog;
|
||||||
@@ -14,8 +18,11 @@ import com.stardust.scriptdroid.autojs.build.AutoJsApkBuilder;
|
|||||||
import com.stardust.scriptdroid.build.ApkBuilderPluginHelper;
|
import com.stardust.scriptdroid.build.ApkBuilderPluginHelper;
|
||||||
import com.stardust.scriptdroid.storage.file.StorageFileProvider;
|
import com.stardust.scriptdroid.storage.file.StorageFileProvider;
|
||||||
import com.stardust.scriptdroid.model.script.ScriptFile;
|
import com.stardust.scriptdroid.model.script.ScriptFile;
|
||||||
|
import com.stardust.scriptdroid.tool.BitmapTool;
|
||||||
import com.stardust.scriptdroid.ui.BaseActivity;
|
import com.stardust.scriptdroid.ui.BaseActivity;
|
||||||
import com.stardust.scriptdroid.ui.filechooser.FileChooserDialogBuilder;
|
import com.stardust.scriptdroid.ui.filechooser.FileChooserDialogBuilder;
|
||||||
|
import com.stardust.scriptdroid.ui.shortcut.ShortcutIconSelectActivity;
|
||||||
|
import com.stardust.scriptdroid.ui.shortcut.ShortcutIconSelectActivity_;
|
||||||
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
||||||
import com.stardust.util.IntentUtil;
|
import com.stardust.util.IntentUtil;
|
||||||
|
|
||||||
@@ -26,6 +33,7 @@ import org.androidannotations.annotations.ViewById;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
import io.reactivex.Observable;
|
import io.reactivex.Observable;
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||||
@@ -58,7 +66,12 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
|
|||||||
|
|
||||||
@ViewById(R.id.version_code)
|
@ViewById(R.id.version_code)
|
||||||
TextInputEditText mVersionCode;
|
TextInputEditText mVersionCode;
|
||||||
|
|
||||||
|
@ViewById(R.id.icon)
|
||||||
|
ImageView mIcon;
|
||||||
|
|
||||||
private MaterialDialog mProgressDialog;
|
private MaterialDialog mProgressDialog;
|
||||||
|
private boolean mIsDefaultIcon = true;
|
||||||
|
|
||||||
@AfterViews
|
@AfterViews
|
||||||
void setupViews() {
|
void setupViews() {
|
||||||
@@ -125,6 +138,12 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
|
|||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Click(R.id.icon)
|
||||||
|
void selectIcon() {
|
||||||
|
ShortcutIconSelectActivity_.intent(this)
|
||||||
|
.startForResult(31209);
|
||||||
|
}
|
||||||
|
|
||||||
@Click(R.id.fab)
|
@Click(R.id.fab)
|
||||||
void buildApk() {
|
void buildApk() {
|
||||||
if (!ApkBuilderPluginHelper.checkPlugin(this)) {
|
if (!ApkBuilderPluginHelper.checkPlugin(this)) {
|
||||||
@@ -173,7 +192,16 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
|
|||||||
return new AutoJsApkBuilder(templateApk, outApk, tmpDir.getPath())
|
return new AutoJsApkBuilder(templateApk, outApk, tmpDir.getPath())
|
||||||
.setProgressCallback(BuildActivity.this)
|
.setProgressCallback(BuildActivity.this)
|
||||||
.prepare()
|
.prepare()
|
||||||
.withConfig(new AutoJsApkBuilder.AppConfig(packageName, appName, versionName, versionCode, jsPath))
|
.withConfig(new AutoJsApkBuilder.AppConfig()
|
||||||
|
.setAppName(appName)
|
||||||
|
.setJsPath(jsPath)
|
||||||
|
.setPackageName(packageName)
|
||||||
|
.setVersionCode(versionCode)
|
||||||
|
.setVersionName(versionName)
|
||||||
|
.setIcon(mIsDefaultIcon ? null : (Callable<Bitmap>) () ->
|
||||||
|
BitmapTool.drawableToBitmap(mIcon.getDrawable())
|
||||||
|
)
|
||||||
|
)
|
||||||
.build()
|
.build()
|
||||||
.sign()
|
.sign()
|
||||||
.cleanWorkspace();
|
.cleanWorkspace();
|
||||||
@@ -235,4 +263,33 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
|
|||||||
public void onClean(AutoJsApkBuilder builder) {
|
public void onClean(AutoJsApkBuilder builder) {
|
||||||
mProgressDialog.setContent(R.string.apk_builder_clean);
|
mProgressDialog.setContent(R.string.apk_builder_clean);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
|
if (resultCode != RESULT_OK) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String packageName = data.getStringExtra(ShortcutIconSelectActivity.EXTRA_PACKAGE_NAME);
|
||||||
|
if (packageName != null) {
|
||||||
|
try {
|
||||||
|
mIcon.setImageDrawable(getPackageManager().getApplicationIcon(packageName));
|
||||||
|
mIsDefaultIcon = false;
|
||||||
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data.getData() == null)
|
||||||
|
return;
|
||||||
|
Observable.fromCallable(() -> BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData())))
|
||||||
|
.subscribeOn(Schedulers.computation())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe((bitmap -> {
|
||||||
|
mIcon.setImageBitmap(bitmap);
|
||||||
|
mIsDefaultIcon = false;
|
||||||
|
}), error -> {
|
||||||
|
Log.e(LOG_TAG, "decode stream", error);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,32 +162,74 @@
|
|||||||
android:hint="@string/text_package_name"/>
|
android:hint="@string/text_package_name"/>
|
||||||
</android.support.design.widget.TextInputLayout>
|
</android.support.design.widget.TextInputLayout>
|
||||||
|
|
||||||
<android.support.design.widget.TextInputLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="12dp">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<android.support.design.widget.TextInputEditText
|
<LinearLayout
|
||||||
android:id="@+id/version_name"
|
android:layout_width="0dp"
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/text_version_name"
|
android:layout_weight="1"
|
||||||
android:text="1.0.0"/>
|
android:orientation="vertical">
|
||||||
</android.support.design.widget.TextInputLayout>
|
|
||||||
|
<android.support.design.widget.TextInputLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="12dp">
|
||||||
|
|
||||||
|
<android.support.design.widget.TextInputEditText
|
||||||
|
android:id="@+id/version_name"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/text_version_name"
|
||||||
|
android:text="1.0.0"/>
|
||||||
|
</android.support.design.widget.TextInputLayout>
|
||||||
|
|
||||||
|
<android.support.design.widget.TextInputLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="12dp">
|
||||||
|
|
||||||
|
<android.support.design.widget.TextInputEditText
|
||||||
|
android:id="@+id/version_code"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/text_version_code"
|
||||||
|
android:inputType="number"
|
||||||
|
android:text="1"/>
|
||||||
|
</android.support.design.widget.TextInputLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="12dp"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:text="@string/text_icon"
|
||||||
|
android:textColor="#9e9e9e"
|
||||||
|
android:textSize="12sp"/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/icon"
|
||||||
|
android:layout_width="64dp"
|
||||||
|
android:layout_height="64dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:background="@drawable/shortcut_create_dialog_icon_bg"
|
||||||
|
android:padding="12dp"
|
||||||
|
android:src="@drawable/ic_add_white_48dp"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<android.support.design.widget.TextInputLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="12dp">
|
|
||||||
|
|
||||||
<android.support.design.widget.TextInputEditText
|
|
||||||
android:id="@+id/version_code"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:hint="@string/text_version_code"
|
|
||||||
android:inputType="number"
|
|
||||||
android:text="1"/>
|
|
||||||
</android.support.design.widget.TextInputLayout>
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</android.support.v7.widget.CardView>
|
</android.support.v7.widget.CardView>
|
||||||
|
|||||||
@@ -261,7 +261,7 @@
|
|||||||
<string name="text_search">搜索</string>
|
<string name="text_search">搜索</string>
|
||||||
<string name="text_floating_edit">悬浮编辑</string>
|
<string name="text_floating_edit">悬浮编辑</string>
|
||||||
<string name="text_select_icon">选择图标</string>
|
<string name="text_select_icon">选择图标</string>
|
||||||
<string name="text_use_android_n_shortcut">添加到图标快捷方式</string>
|
<string name="text_use_android_n_shortcut">添加到安卓7.0 Shortcut</string>
|
||||||
<string name="text_login_succeed">登录成功</string>
|
<string name="text_login_succeed">登录成功</string>
|
||||||
<string name="text_login_fail">登录失败</string>
|
<string name="text_login_fail">登录失败</string>
|
||||||
<string name="text_reset_password">重置密码</string>
|
<string name="text_reset_password">重置密码</string>
|
||||||
@@ -330,4 +330,5 @@
|
|||||||
<string name="text_copy">复制</string>
|
<string name="text_copy">复制</string>
|
||||||
<string name="format_default_package_name" formatted="true">com.example.script%d</string>
|
<string name="format_default_package_name" formatted="true">com.example.script%d</string>
|
||||||
<string name="text_should_not_be_empty">不能为空</string>
|
<string name="text_should_not_be_empty">不能为空</string>
|
||||||
|
<string name="text_icon">图标</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -10,13 +10,12 @@
|
|||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".App"
|
android:name=".App"
|
||||||
android:allowBackup="true"
|
android:allowBackup="false"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="inrt"
|
android:label="inrt"
|
||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/AppTheme"
|
android:theme="@style/AppTheme"
|
||||||
tools:replace="android:label">
|
tools:replace="android:label, android:allowBackup">
|
||||||
<activity android:name=".MainActivity">
|
<activity android:name=".MainActivity">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |