feat: can set app icon of apk building

This commit is contained in:
hyb1996
2017-12-08 20:08:28 +08:00
parent fbc567355e
commit e8179cae94
17 changed files with 173 additions and 31 deletions

View File

@@ -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"}}]

View File

@@ -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();
} }

View File

@@ -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) {

View File

@@ -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);
});
}
} }

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"/>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB