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

View File

@@ -1,6 +1,8 @@
package org.autojs.autojs.ui.project; package org.autojs.autojs.ui.project;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.design.widget.TextInputEditText; import android.support.design.widget.TextInputEditText;
@@ -12,7 +14,6 @@ import android.widget.ImageView;
import android.widget.Toast; import android.widget.Toast;
import com.stardust.autojs.project.ProjectConfig; import com.stardust.autojs.project.ProjectConfig;
import com.stardust.autojs.runtime.api.Dialogs;
import com.stardust.pio.PFiles; import com.stardust.pio.PFiles;
import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.AfterViews;
@@ -22,14 +23,18 @@ import org.androidannotations.annotations.ViewById;
import org.autojs.autojs.R; import org.autojs.autojs.R;
import org.autojs.autojs.model.explorer.ExplorerDirPage; import org.autojs.autojs.model.explorer.ExplorerDirPage;
import org.autojs.autojs.model.explorer.ExplorerFileItem; 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.explorer.Explorers;
import org.autojs.autojs.model.project.ProjectTemplate; import org.autojs.autojs.model.project.ProjectTemplate;
import org.autojs.autojs.network.GlideApp;
import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder; import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder;
import org.autojs.autojs.ui.BaseActivity; 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 org.autojs.autojs.ui.widget.SimpleTextWatcher;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -44,6 +49,8 @@ public class ProjectConfigActivity extends BaseActivity {
public static final String EXTRA_DIRECTORY = "directory"; public static final String EXTRA_DIRECTORY = "directory";
private static final int REQUEST_CODE = 12477;
@ViewById(R.id.project_location) @ViewById(R.id.project_location)
EditText mProjectLocation; EditText mProjectLocation;
@@ -70,6 +77,7 @@ public class ProjectConfigActivity extends BaseActivity {
private File mParentDirectory; private File mParentDirectory;
private ProjectConfig mProjectConfig; private ProjectConfig mProjectConfig;
private boolean mNewProject; private boolean mNewProject;
private Bitmap mIconBitmap;
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -118,6 +126,12 @@ public class ProjectConfigActivity extends BaseActivity {
mVersionName.setText(mProjectConfig.getVersionName()); mVersionName.setText(mProjectConfig.getVersionName());
mMainFileName.setText(mProjectConfig.getMainScriptFile()); mMainFileName.setText(mProjectConfig.getMainScriptFile());
mProjectLocation.setVisibility(View.GONE); 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()) { if (!checkInputs()) {
return; 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) { if (mNewProject) {
String location = mProjectLocation.getText().toString(); new ProjectTemplate(mProjectConfig, mDirectory)
new ProjectTemplate(mProjectConfig, new File(location))
.newProject() .newProject()
.subscribe(ignored -> { .subscribe(ignored -> {
Explorers.workspace().notifyChildrenChanged(new ExplorerDirPage(mParentDirectory, null)); 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() { private void syncProjectConfig() {
mProjectConfig.setName(mAppName.getText().toString()); mProjectConfig.setName(mAppName.getText().toString());
mProjectConfig.setVersionCode(Integer.parseInt(mVersionCode.getText().toString())); mProjectConfig.setVersionCode(Integer.parseInt(mVersionCode.getText().toString()));
mProjectConfig.setVersionName(mVersionName.getText().toString()); mProjectConfig.setVersionName(mVersionName.getText().toString());
mProjectConfig.setMainScriptFile(mMainFileName.getText().toString()); mProjectConfig.setMainScriptFile(mMainFileName.getText().toString());
mProjectConfig.setPackageName(mPackageName.getText().toString()); mProjectConfig.setPackageName(mPackageName.getText().toString());
if (mNewProject) {
String location = mProjectLocation.getText().toString();
mDirectory = new File(location);
}
//mProjectConfig.getLaunchConfig().setHideLogs(true); //mProjectConfig.getLaunchConfig().setHideLogs(true);
} }
@@ -184,4 +221,43 @@ public class ProjectConfigActivity extends BaseActivity {
editText.setError(hint + getString(R.string.text_should_not_be_empty)); editText.setError(hint + getString(R.string.text_should_not_be_empty));
return false; 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.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ShortcutManager; import android.content.pm.ShortcutManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@@ -16,6 +19,7 @@ import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import org.autojs.autojs.R; import org.autojs.autojs.R;
import org.autojs.autojs.tool.BitmapTool;
import org.autojs.autojs.ui.BaseActivity; import org.autojs.autojs.ui.BaseActivity;
import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.AfterViews;
@@ -24,6 +28,7 @@ import org.androidannotations.annotations.ViewById;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
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;
@@ -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 { private class AppItem {
Drawable icon; Drawable icon;
ApplicationInfo info; ApplicationInfo info;

View File

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