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,10 +1,14 @@
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.ManifestEditor;
import com.stardust.autojs.apkbuilder.util.StreamUtils;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.ui.build.BuildActivity;
import org.androidannotations.annotations.Click;
import java.io.File;
import java.io.FileInputStream;
@@ -12,6 +16,7 @@ import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.Callable;
/**
* Created by Stardust on 2017/10/24.
@@ -37,19 +42,44 @@ public class AutoJsApkBuilder extends ApkBuilder {
int versionCode;
String jsPath;
String packageName;
Callable<Bitmap> icon;
public AppConfig(String packageName, String appName, String versionName, int versionCode, String jsPath) {
this.packageName = packageName;
public AppConfig setAppName(String appName) {
this.appName = appName;
return this;
}
public AppConfig setVersionName(String versionName) {
this.versionName = versionName;
return this;
}
public AppConfig setVersionCode(int versionCode) {
this.versionCode = versionCode;
return this;
}
public AppConfig setJsPath(String 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 ManifestEditor mManifestEditor;
private String mWorkspacePath;
private AppConfig mAppConfig;
public AutoJsApkBuilder(InputStream apkInputStream, File outApkFile, String workspacePath) {
super(apkInputStream, outApkFile, workspacePath);
@@ -86,7 +116,9 @@ public class AutoJsApkBuilder extends ApkBuilder {
}
public AutoJsApkBuilder withConfig(AppConfig config) throws IOException {
mManifestEditor = editManifest().setAppName(config.appName)
mAppConfig = config;
mManifestEditor = editManifest()
.setAppName(config.appName)
.setVersionName(config.versionName)
.setVersionCode(config.versionCode)
.setPackageName(config.packageName);
@@ -101,7 +133,14 @@ public class AutoJsApkBuilder extends ApkBuilder {
App.getApp().getUiHandler().post(() -> mProgressCallback.onBuild(AutoJsApkBuilder.this));
}
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();
}

View File

@@ -4,6 +4,7 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import com.stardust.BuildConfig;
import com.stardust.pio.UncheckedIOException;
import com.stardust.util.DeveloperUtils;
@@ -25,6 +26,9 @@ public class ApkBuilderPluginHelper {
public static InputStream openTemplateApk(Context context) {
try {
if (BuildConfig.DEBUG) {
return context.getAssets().open(TEMPLATE_APK_PATH);
}
return context.getPackageManager().getResourcesForApplication(PLUGIN_PACKAGE_NAME)
.getAssets().open(TEMPLATE_APK_PATH);
} catch (IOException e) {

View File

@@ -1,11 +1,15 @@
package com.stardust.scriptdroid.ui.build;
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.TextInputLayout;
import android.text.TextUtils;
import android.util.Log;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
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.storage.file.StorageFileProvider;
import com.stardust.scriptdroid.model.script.ScriptFile;
import com.stardust.scriptdroid.tool.BitmapTool;
import com.stardust.scriptdroid.ui.BaseActivity;
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.util.IntentUtil;
@@ -26,6 +33,7 @@ import org.androidannotations.annotations.ViewById;
import java.io.File;
import java.io.InputStream;
import java.util.concurrent.Callable;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -58,7 +66,12 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
@ViewById(R.id.version_code)
TextInputEditText mVersionCode;
@ViewById(R.id.icon)
ImageView mIcon;
private MaterialDialog mProgressDialog;
private boolean mIsDefaultIcon = true;
@AfterViews
void setupViews() {
@@ -125,6 +138,12 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
.show();
}
@Click(R.id.icon)
void selectIcon() {
ShortcutIconSelectActivity_.intent(this)
.startForResult(31209);
}
@Click(R.id.fab)
void buildApk() {
if (!ApkBuilderPluginHelper.checkPlugin(this)) {
@@ -173,7 +192,16 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
return new AutoJsApkBuilder(templateApk, outApk, tmpDir.getPath())
.setProgressCallback(BuildActivity.this)
.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()
.sign()
.cleanWorkspace();
@@ -235,4 +263,33 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
public void onClean(AutoJsApkBuilder builder) {
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);
});
}
}