feat(ui): project icon setting

This commit is contained in:
hyb1996 2018-10-10 15:26:48 +08:00
parent cce09209a3
commit 54146aa581
4 changed files with 109 additions and 24 deletions

View File

@ -53,6 +53,8 @@ import io.reactivex.schedulers.Schedulers;
@EActivity(R.layout.activity_build)
public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.ProgressCallback {
private static final int REQUEST_CODE = 44401;
public static final String EXTRA_SOURCE = BuildActivity.class.getName() + ".extra_source_file";
private static final String LOG_TAG = "BuildActivity";
@ -194,7 +196,7 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
@Click(R.id.icon)
void selectIcon() {
ShortcutIconSelectActivity_.intent(this)
.startForResult(31209);
.startForResult(REQUEST_CODE);
}
@Click(R.id.fab)
@ -333,27 +335,13 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog
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())
ShortcutIconSelectActivity.getBitmapFromIntent(getApplicationContext(), data)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((bitmap -> {
.subscribe(bitmap -> {
mIcon.setImageBitmap(bitmap);
mIsDefaultIcon = false;
}), error -> {
Log.e(LOG_TAG, "decode stream", error);
});
}, Throwable::printStackTrace);
}

View File

@ -1,6 +1,8 @@
package org.autojs.autojs.ui.project;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.TextInputEditText;
@ -12,7 +14,6 @@ import android.widget.ImageView;
import android.widget.Toast;
import com.stardust.autojs.project.ProjectConfig;
import com.stardust.autojs.runtime.api.Dialogs;
import com.stardust.pio.PFiles;
import org.androidannotations.annotations.AfterViews;
@ -22,14 +23,18 @@ import org.androidannotations.annotations.ViewById;
import org.autojs.autojs.R;
import org.autojs.autojs.model.explorer.ExplorerDirPage;
import org.autojs.autojs.model.explorer.ExplorerFileItem;
import org.autojs.autojs.model.explorer.ExplorerItem;
import org.autojs.autojs.model.explorer.Explorers;
import org.autojs.autojs.model.project.ProjectTemplate;
import org.autojs.autojs.network.GlideApp;
import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder;
import org.autojs.autojs.ui.BaseActivity;
import org.autojs.autojs.ui.shortcut.ShortcutIconSelectActivity;
import org.autojs.autojs.ui.shortcut.ShortcutIconSelectActivity_;
import org.autojs.autojs.ui.widget.SimpleTextWatcher;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
@ -44,6 +49,8 @@ public class ProjectConfigActivity extends BaseActivity {
public static final String EXTRA_DIRECTORY = "directory";
private static final int REQUEST_CODE = 12477;
@ViewById(R.id.project_location)
EditText mProjectLocation;
@ -70,6 +77,7 @@ public class ProjectConfigActivity extends BaseActivity {
private File mParentDirectory;
private ProjectConfig mProjectConfig;
private boolean mNewProject;
private Bitmap mIconBitmap;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@ -118,6 +126,12 @@ public class ProjectConfigActivity extends BaseActivity {
mVersionName.setText(mProjectConfig.getVersionName());
mMainFileName.setText(mProjectConfig.getMainScriptFile());
mProjectLocation.setVisibility(View.GONE);
String icon = mProjectConfig.getIcon();
if (icon != null) {
GlideApp.with(this)
.load(new File(mDirectory, icon))
.into(mIcon);
}
}
}
@ -128,9 +142,22 @@ public class ProjectConfigActivity extends BaseActivity {
if (!checkInputs()) {
return;
}
if (mIconBitmap != null) {
saveIcon(mIconBitmap)
.subscribe(ignored -> saveProjectConfig(), e -> {
e.printStackTrace();
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
});
} else {
saveProjectConfig();
}
}
@SuppressLint("CheckResult")
private void saveProjectConfig() {
if (mNewProject) {
String location = mProjectLocation.getText().toString();
new ProjectTemplate(mProjectConfig, new File(location))
new ProjectTemplate(mProjectConfig, mDirectory)
.newProject()
.subscribe(ignored -> {
Explorers.workspace().notifyChildrenChanged(new ExplorerDirPage(mParentDirectory, null));
@ -158,12 +185,22 @@ public class ProjectConfigActivity extends BaseActivity {
}
}
@Click(R.id.icon)
void selectIcon() {
ShortcutIconSelectActivity_.intent(this)
.startForResult(REQUEST_CODE);
}
private void syncProjectConfig() {
mProjectConfig.setName(mAppName.getText().toString());
mProjectConfig.setVersionCode(Integer.parseInt(mVersionCode.getText().toString()));
mProjectConfig.setVersionName(mVersionName.getText().toString());
mProjectConfig.setMainScriptFile(mMainFileName.getText().toString());
mProjectConfig.setPackageName(mPackageName.getText().toString());
if (mNewProject) {
String location = mProjectLocation.getText().toString();
mDirectory = new File(location);
}
//mProjectConfig.getLaunchConfig().setHideLogs(true);
}
@ -184,4 +221,43 @@ public class ProjectConfigActivity extends BaseActivity {
editText.setError(hint + getString(R.string.text_should_not_be_empty));
return false;
}
@SuppressLint("CheckResult")
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
return;
}
ShortcutIconSelectActivity.getBitmapFromIntent(getApplicationContext(), data)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bitmap -> {
mIcon.setImageBitmap(bitmap);
mIconBitmap = bitmap;
},
Throwable::printStackTrace);
}
@SuppressLint("CheckResult")
private Observable<String> saveIcon(Bitmap b) {
return Observable.just(b)
.map(bitmap -> {
String iconPath = mProjectConfig.getIcon();
if (iconPath == null) {
iconPath = "res/logo.png";
}
File iconFile = new File(mDirectory, iconPath);
PFiles.ensureDir(iconFile.getPath());
FileOutputStream fos = new FileOutputStream(iconFile);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();
return iconPath;
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(iconPath -> mProjectConfig.setIcon(iconPath));
}
}

View File

@ -5,7 +5,10 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ShortcutManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
@ -16,6 +19,7 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import org.autojs.autojs.R;
import org.autojs.autojs.tool.BitmapTool;
import org.autojs.autojs.ui.BaseActivity;
import org.androidannotations.annotations.AfterViews;
@ -24,6 +28,7 @@ import org.androidannotations.annotations.ViewById;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
@ -97,6 +102,23 @@ public class ShortcutIconSelectActivity extends BaseActivity {
}
}
public static Observable<Bitmap> getBitmapFromIntent(Context context, Intent data) {
String packageName = data.getStringExtra(EXTRA_PACKAGE_NAME);
if (packageName != null) {
return Observable.fromCallable(() -> {
Drawable drawable = context.getPackageManager().getApplicationIcon(packageName);
return BitmapTool.drawableToBitmap(drawable);
});
}
Uri uri = data.getData();
if (uri == null) {
return Observable.error(new IllegalArgumentException("invalid intent"));
}
return Observable.fromCallable(() ->
BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri))
);
}
private class AppItem {
Drawable icon;
ApplicationInfo info;

View File

@ -88,7 +88,6 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:showDividers=""
android:orientation="vertical">
<android.support.design.widget.TextInputLayout