diff --git a/app/src/main/assets/templates/0.zip b/app/src/main/assets/templates/0.zip index 009c1751b..99b2ead44 100644 Binary files a/app/src/main/assets/templates/0.zip and b/app/src/main/assets/templates/0.zip differ diff --git a/app/src/main/assets/templates/1.zip b/app/src/main/assets/templates/1.zip index e6a5e42c1..9e2b85a75 100644 Binary files a/app/src/main/assets/templates/1.zip and b/app/src/main/assets/templates/1.zip differ diff --git a/app/src/main/assets/templates/2.zip b/app/src/main/assets/templates/2.zip index e54fc0e3b..02b84b3d2 100644 Binary files a/app/src/main/assets/templates/2.zip and b/app/src/main/assets/templates/2.zip differ diff --git a/app/src/main/assets/templates/3.zip b/app/src/main/assets/templates/3.zip index 73d6d4550..b1e32997a 100644 Binary files a/app/src/main/assets/templates/3.zip and b/app/src/main/assets/templates/3.zip differ diff --git a/app/src/main/assets/templates/4.zip b/app/src/main/assets/templates/4.zip index c4e79a063..d38ae5714 100644 Binary files a/app/src/main/assets/templates/4.zip and b/app/src/main/assets/templates/4.zip differ diff --git a/app/src/main/assets/templates/5.zip b/app/src/main/assets/templates/5.zip new file mode 100644 index 000000000..552889e3a Binary files /dev/null and b/app/src/main/assets/templates/5.zip differ diff --git a/app/src/main/assets/templates/6.zip b/app/src/main/assets/templates/6.zip new file mode 100644 index 000000000..f831a1fa1 Binary files /dev/null and b/app/src/main/assets/templates/6.zip differ diff --git a/app/src/main/assets/templates/7.zip b/app/src/main/assets/templates/7.zip new file mode 100644 index 000000000..b1c687bda Binary files /dev/null and b/app/src/main/assets/templates/7.zip differ diff --git a/app/src/main/assets/templates/8.zip b/app/src/main/assets/templates/8.zip new file mode 100644 index 000000000..7a394bf63 Binary files /dev/null and b/app/src/main/assets/templates/8.zip differ diff --git a/app/src/main/java/com/itsaky/androidide/AboutActivity.java b/app/src/main/java/com/itsaky/androidide/AboutActivity.java index fcb5ff312..cb6887a28 100755 --- a/app/src/main/java/com/itsaky/androidide/AboutActivity.java +++ b/app/src/main/java/com/itsaky/androidide/AboutActivity.java @@ -152,8 +152,9 @@ public class AboutActivity extends StudioActivity { licenses.add( new License("JavaPoet", "Apache License 2.0", "https://github.com/square/JavaPoet")); licenses.add( - new License("Zip4j", "Apache License 2.0", "https://github.com/srikanth-lingala/zip4j")); - + new License("Zip4j", "Apache License 2.0", "https://github.com/srikanth-lingala/zip4j")); + licenses.add(new License("Android Studio", "Apache License 2.0", "https://cs.android.com/android-studio")); + StringBuilder sb = new StringBuilder(); for (License license : licenses) { sb.append("\u2022 "); diff --git a/app/src/main/java/com/itsaky/androidide/fragments/WizardFragment.java b/app/src/main/java/com/itsaky/androidide/fragments/WizardFragment.java index be0e00c95..8a2a24d14 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/WizardFragment.java +++ b/app/src/main/java/com/itsaky/androidide/fragments/WizardFragment.java @@ -13,9 +13,9 @@ import android.widget.AutoCompleteTextView; import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; import androidx.transition.TransitionManager; -import androidx.lifecycle.ViewModelProvider; import com.google.android.material.transition.MaterialFadeThrough; import com.google.android.material.transition.MaterialSharedAxis; @@ -29,13 +29,10 @@ import com.itsaky.androidide.databinding.SetupFooterBinding; import com.itsaky.androidide.databinding.WizardDetailsBinding; import com.itsaky.androidide.databinding.WizardTemplatesBinding; import com.itsaky.androidide.fragments.sheets.ProgressSheet; -import com.itsaky.androidide.interfaces.ProjectWriterCallback; import com.itsaky.androidide.managers.PreferenceManager; -import com.itsaky.androidide.models.NewProjectDetails; import com.itsaky.androidide.models.ProjectTemplate; -import com.itsaky.androidide.tasks.TaskExecutor; -import com.itsaky.androidide.tasks.callables.ProjectCreatorCallable; import com.itsaky.androidide.utils.AndroidUtils; +import com.itsaky.androidide.utils.DialogUtils; import com.itsaky.androidide.utils.Environment; import com.itsaky.androidide.utils.FileUtil; import com.itsaky.androidide.utils.SingleTextWatcher; @@ -45,10 +42,11 @@ import com.itsaky.toaster.Toaster; import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; import java.util.Objects; -public class WizardFragment extends BaseFragment implements ProjectWriterCallback { +public class WizardFragment extends BaseFragment { public static final String TAG = "WizardFragmentTag"; public static final String PREF_PACKAGE_DOMAIN_KEY = "pref_package_domain"; @@ -134,6 +132,36 @@ public class WizardFragment extends BaseFragment implements ProjectWriterCallbac } }); + mViewModel + .getStatusMessage() + .observe( + getViewLifecycleOwner(), + (message) -> { + if (mProgressSheet == null) { + createProgressSheet(); + } + setMessage(message); + }); + + mViewModel + .getErrorState() + .observe( + getViewLifecycleOwner(), + (message) -> { + if (mProgressSheet != null && mProgressSheet.isShowing()) { + mProgressSheet.dismiss(); + } + StudioApp.getInstance().toast(message, Toaster.Type.ERROR); + }); + + mViewModel + .getFileCreatedState() + .observe( + getViewLifecycleOwner(), + (file) -> { + if (file != null) onSuccess(file); + }); + mAdapter.setOnItemClickListener( (item, pos) -> { mCurrentTemplate = item; @@ -197,9 +225,8 @@ public class WizardFragment extends BaseFragment implements ProjectWriterCallbac private boolean validateDetails() { + verifyAppName(detailsBinding.tilAppName.getEditText().getText(), false); verifyPackageName(detailsBinding.tilPackageName.getEditText().getText()); - verifyAppName(detailsBinding.tilAppName.getEditText().getText()); - if (detailsBinding.tilPackageName.isErrorEnabled()) { return false; } @@ -221,12 +248,22 @@ public class WizardFragment extends BaseFragment implements ProjectWriterCallbac final int targetSdk = getTargetSdk(); final String savePath = detailsBinding.etSaveLocation.getText().toString().trim(); final String projectLanguage = detailsBinding.etLanguage.getText().toString(); + final String cppToolChain = + getCppToolchans().get(detailsBinding.etToolchain.getText().toString()); PreferenceManager manager = StudioApp.getInstance().getPrefManager(); manager.putInt(PREF_MIN_SDK_INDEX_KEY, minSdkIndex); manager.putInt(PREF_TERGET_SDK_INDEX_KEY, targetSdkIndex); manager.putString(PREF_PACKAGE_DOMAIN_KEY, AndroidUtils.getPackageDomain(packageName)); - createProject(appName, packageName, minSdk, targetSdk, projectLanguage, savePath); + mViewModel.createProject( + mCurrentTemplate, + appName, + packageName, + minSdk, + targetSdk, + projectLanguage, + cppToolChain, + savePath); } } @@ -251,6 +288,15 @@ public class WizardFragment extends BaseFragment implements ProjectWriterCallbac "API 32: Android 12.1L (S)"); } + private LinkedHashMap getCppToolchans() { + LinkedHashMap cppStandartType = new LinkedHashMap<>(); + cppStandartType.put("Toolchain Default", ""); + cppStandartType.put("C++11", "-std=c++11"); + cppStandartType.put("C++14", "-std=c++14"); + cppStandartType.put("C++17", "-std=c++17"); + return cppStandartType; + } + private void onNavigateBack() { if (!mLast) { getParentFragmentManager().popBackStack(); @@ -278,6 +324,7 @@ public class WizardFragment extends BaseFragment implements ProjectWriterCallbac templatesBinding.getRoot().setVisibility(View.GONE); detailsBinding.getRoot().setVisibility(View.GONE); templatesBinding.getRoot().setVisibility(View.VISIBLE); + detailsBinding.tilToolchain.setVisibility(View.GONE); footerBinding.nextButton.setVisibility(View.GONE); footerBinding.nextButton.setText(R.string.next); footerBinding.exitButton.setText(R.string.exit); @@ -300,11 +347,6 @@ public class WizardFragment extends BaseFragment implements ProjectWriterCallbac detailsBinding.etAppName.setText("My Application"); String domain = manager.getString(PREF_PACKAGE_DOMAIN_KEY, "com.example"); detailsBinding.etPackageName.setText(domain + ".myapplication"); - detailsBinding.etLanguage.setAdapter( - new ArrayAdapter<>( - requireContext(), - androidx.appcompat.R.layout.support_simple_spinner_dropdown_item, - languages)); if (languages.size() == 1) { detailsBinding.tilLanguage.setEnabled(false); @@ -312,10 +354,31 @@ public class WizardFragment extends BaseFragment implements ProjectWriterCallbac detailsBinding.tilLanguage.setEnabled(true); } + detailsBinding.etLanguage.setAdapter( + new ArrayAdapter<>( + requireContext(), + androidx.appcompat.R.layout.support_simple_spinner_dropdown_item, + languages)); + detailsBinding.etLanguage.setListSelection(0); + + if (mCurrentTemplate.isCpp()) { + detailsBinding.tilToolchain.setVisibility(View.VISIBLE); + detailsBinding.etToolchain.setAdapter( + new ArrayAdapter<>( + requireContext(), + androidx.appcompat.R.layout.support_simple_spinner_dropdown_item, + getCppToolchans().keySet().toArray(new String[getCppToolchans().size()]))); + + detailsBinding.etToolchain.setListSelection(0); + detailsBinding.etToolchain.setText(getSelectedItem(0, detailsBinding.etToolchain), false); + + showDialogNdkNotSupportedOfficially(); + } + detailsBinding.etLanguage.setText(getSelectedItem(0, detailsBinding.etLanguage), false); minSdkIndex = manager.getInt(PREF_MIN_SDK_INDEX_KEY, 5); - + // google recommended use latest target sdk version targetSdkIndex = manager.getInt(PREF_TERGET_SDK_INDEX_KEY, getSdks().size() - 1); detailsBinding.etMinSdk.setListSelection(minSdkIndex); @@ -352,7 +415,7 @@ public class WizardFragment extends BaseFragment implements ProjectWriterCallbac new SingleTextWatcher() { @Override public void afterTextChanged(Editable editable) { - verifyAppName(editable); + verifyAppName(editable, true); } }); @@ -436,7 +499,7 @@ public class WizardFragment extends BaseFragment implements ProjectWriterCallbac } } - private void verifyAppName(Editable editable) { + private void verifyAppName(Editable editable, boolean isAddToPackage) { String name = editable.toString().trim(); if (TextUtils.isEmpty(name)) { detailsBinding.tilAppName.setError(getString(R.string.wizard_error_name_empty)); @@ -447,58 +510,24 @@ public class WizardFragment extends BaseFragment implements ProjectWriterCallbac } else { detailsBinding.tilAppName.setErrorEnabled(false); } - - setPackageName(name); + if (isAddToPackage) { + setPackageName(name); + } setSaveLocation(); } - @Override - public void beforeBegin() { - if (mProgressSheet == null) { - createProgressSheet(); - } - - setMessage(R.string.msg_begin_project_write); - } - - @Override - public void onProcessTask(String taskName) { - setMessage(taskName); - } - - @Override public void onSuccess(File root) { - if (mProgressSheet == null) { - createProgressSheet(); - } - - if (mProgressSheet.isShowing()) { + if (mProgressSheet != null && mProgressSheet.isShowing()) { mProgressSheet.dismiss(); } StudioApp.getInstance().toast(R.string.project_created_successfully, Toaster.Type.SUCCESS); - if (getActivity() != null && mListener != null) { - requireActivity() - .runOnUiThread( - () -> { - getParentFragmentManager().popBackStack(); - mListener.openProject(root); - }); + if (mListener != null) { + getParentFragmentManager().popBackStack(); + mListener.openProject(root); } } - @Override - public void onFailed(String reason) { - if (mProgressSheet == null) { - createProgressSheet(); - } - - if (mProgressSheet.isShowing()) { - mProgressSheet.dismiss(); - } - StudioApp.getInstance().toast(reason, Toaster.Type.ERROR); - } - private void createProgressSheet() { mProgressSheet = new ProgressSheet(); mProgressSheet.setShowShadow(false); @@ -511,22 +540,16 @@ public class WizardFragment extends BaseFragment implements ProjectWriterCallbac private void setMessage(String msg) { mProgressSheet.setMessage(msg); } - - private void createProject( - String appName, - String packageName, - int minSdk, - int targetSdk, - String language, - String savePath) { - new TaskExecutor() - .executeAsync( - new ProjectCreatorCallable( - mCurrentTemplate, - new NewProjectDetails(appName, packageName, minSdk, targetSdk, language, savePath), - this), - r -> {}); - } + + private void showDialogNdkNotSupportedOfficially(){ + DialogUtils.newMaterialDialogBuilder(requireContext()) + .setPositiveButton(android.R.string.ok, null) + .setTitle(R.string.title_warning) + .setMessage(R.string.msg_ndk_currently_unsupported) + .setCancelable(false) + .create() + .show(); + } public interface OnProjectCreatedListener { void openProject(File project); diff --git a/app/src/main/java/com/itsaky/androidide/models/NewProjectDetails.java b/app/src/main/java/com/itsaky/androidide/models/NewProjectDetails.java index c686e6bd0..1cfd6749f 100755 --- a/app/src/main/java/com/itsaky/androidide/models/NewProjectDetails.java +++ b/app/src/main/java/com/itsaky/androidide/models/NewProjectDetails.java @@ -25,15 +25,24 @@ public class NewProjectDetails { public int targetSdk; public String language; public String savePath; + public String cppFlags; public NewProjectDetails() {} - public NewProjectDetails(String name, String packageName, int minSdk, int targetSdk, String language, String savePath) { + public NewProjectDetails( + String name, + String packageName, + int minSdk, + int targetSdk, + String language, + String cppFlags, + String savePath) { this.name = name; this.packageName = packageName; this.minSdk = minSdk; this.targetSdk = targetSdk; this.language = language; + this.cppFlags = cppFlags; this.savePath = savePath; } @@ -72,4 +81,13 @@ public class NewProjectDetails { public int getTargetSdk() { return targetSdk; } + + public NewProjectDetails setCppFlags(String cppFlags) { + this.cppFlags = cppFlags; + return this; + } + + public String getCppFlags() { + return cppFlags; + } } diff --git a/app/src/main/java/com/itsaky/androidide/models/ProjectTemplate.java b/app/src/main/java/com/itsaky/androidide/models/ProjectTemplate.java index 7567db7c3..ee9610f90 100755 --- a/app/src/main/java/com/itsaky/androidide/models/ProjectTemplate.java +++ b/app/src/main/java/com/itsaky/androidide/models/ProjectTemplate.java @@ -29,6 +29,7 @@ public class ProjectTemplate { private String description; private boolean isSupportJava; private boolean isSupportKotlin; + private boolean isCpp; @DrawableRes private int imageId; @@ -89,7 +90,6 @@ public class ProjectTemplate { return this.isSupportJava; } - public ProjectTemplate setSupportJava(boolean isSupportJava) { this.isSupportJava = isSupportJava; return this; @@ -103,4 +103,13 @@ public class ProjectTemplate { this.isSupportKotlin = isSupportKotlin; return this; } + + public boolean isCpp() { + return this.isCpp; + } + + public ProjectTemplate setIsCpp(boolean isCpp) { + this.isCpp = isCpp; + return this; + } } diff --git a/app/src/main/java/com/itsaky/androidide/utils/ProjectWriter.java b/app/src/main/java/com/itsaky/androidide/utils/ProjectWriter.java index e852adfec..53b2dd158 100755 --- a/app/src/main/java/com/itsaky/androidide/utils/ProjectWriter.java +++ b/app/src/main/java/com/itsaky/androidide/utils/ProjectWriter.java @@ -50,11 +50,14 @@ public class ProjectWriter { private static final String XML_TEMPLATE_PATH = "templates/xml"; private static final String SOURCE_PATH_REGEX = "/.*/src/.*/java|kt"; - private static final String FILE_EXT_REGEX = ".*/java|kt|gradle|xml"; + private static final String FILE_EXT_REGEX = ".*/java|kt|gradle|xml|txt|cpp"; private static final String APP_NAME = "$app_name", PACKAGE_NAME = "$package_name", MIN_SDK = "$min_sdk", - TARGET_SDK = "$target_sdk"; + TARGET_SDK = "$target_sdk", + PACKAGE_NAME_CPP = "{$package_name_cpp}", + CPP_FLAGS = "$cpp_flags", + LIBRARY_NAME = "$library_name"; @NonNull public static String createMenu() { @@ -211,12 +214,23 @@ public class ProjectWriter { Matcher extMatcher = Pattern.compile(FILE_EXT_REGEX).matcher(name); if (extMatcher.find()) { String fileContent = FileIOUtils.readFile2String(unzipFile); + + fileContent = customReplaceAll(fileContent, APP_NAME, details.name); fileContent = - fileContent - .replace(APP_NAME, details.name) - .replace(PACKAGE_NAME, details.packageName) - .replace(MIN_SDK, String.valueOf(details.minSdk)) - .replace(TARGET_SDK, String.valueOf(details.targetSdk)); + customReplaceAll( + fileContent, + PACKAGE_NAME_CPP, + String.valueOf(details.packageName.replace("_", "_1").replace('.', '_'))); + fileContent = customReplaceAll(fileContent, PACKAGE_NAME, details.packageName); + fileContent = customReplaceAll(fileContent, MIN_SDK, String.valueOf(details.minSdk)); + fileContent = + customReplaceAll(fileContent, TARGET_SDK, String.valueOf(details.targetSdk)); + fileContent = customReplaceAll(fileContent, CPP_FLAGS, details.cppFlags); + fileContent = + customReplaceAll( + fileContent, + LIBRARY_NAME, + details.packageName.substring(details.packageName.lastIndexOf('.') + 1)); if (!FileIOUtils.writeFileFromString(unzipFile, fileContent, false)) { notifyFailed(instance.getString(R.string.failed_write_file, unzipFile.getName())); } @@ -229,6 +243,32 @@ public class ProjectWriter { } } + public static String customReplaceAll(String str, String oldStr, String newStr) { + + if ("".equals(str) || "".equals(oldStr) || oldStr.equals(newStr)) { + return str; + } + if (newStr == null) { + newStr = ""; + } + final int strLength = str.length(); + final int oldStrLength = oldStr.length(); + StringBuilder builder = new StringBuilder(str); + + for (int i = 0; i < strLength; i++) { + int index = builder.indexOf(oldStr, i); + + if (index == -1) { + if (i == 0) { + return str; + } + return builder.toString(); + } + builder = builder.replace(index, index + oldStrLength, newStr); + } + return builder.toString(); + } + private static void notifyBegin() { ThreadUtils.runOnUiThread( () -> { diff --git a/app/src/main/java/com/itsaky/androidide/viewmodel/WizardViewModel.java b/app/src/main/java/com/itsaky/androidide/viewmodel/WizardViewModel.java index 29fdf8a20..f12e7c5cb 100644 --- a/app/src/main/java/com/itsaky/androidide/viewmodel/WizardViewModel.java +++ b/app/src/main/java/com/itsaky/androidide/viewmodel/WizardViewModel.java @@ -10,8 +10,13 @@ import androidx.lifecycle.MutableLiveData; import com.blankj.utilcode.util.CollectionUtils; import com.itsaky.androidide.R; +import com.itsaky.androidide.interfaces.ProjectWriterCallback; +import com.itsaky.androidide.models.NewProjectDetails; import com.itsaky.androidide.models.ProjectTemplate; +import com.itsaky.androidide.tasks.TaskExecutor; +import com.itsaky.androidide.tasks.callables.ProjectCreatorCallable; +import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; @@ -21,6 +26,9 @@ public class WizardViewModel extends AndroidViewModel { private MutableLiveData> mProjectTemplatesList = new MutableLiveData<>(CollectionUtils.newArrayList()); private MutableLiveData mLoadingState = new MutableLiveData<>(true); + private MutableLiveData mErrorMessageState = new MutableLiveData<>(); + private MutableLiveData mMessageState = new MutableLiveData<>(); + private MutableLiveData mCreatedProject = new MutableLiveData<>(null); public WizardViewModel(@NonNull Application application) { super(application); @@ -43,7 +51,7 @@ public class WizardViewModel extends AndroidViewModel { .setDescription( getApplication().getApplicationContext(), R.string.template_description_empty) - .setImageId(R.drawable.template_empty), + .setImageId(R.drawable.template_empty_activity), basic = new ProjectTemplate() .setId(1) @@ -54,7 +62,7 @@ public class WizardViewModel extends AndroidViewModel { .setDescription( getApplication().getApplicationContext(), R.string.template_description_basic) - .setImageId(R.drawable.template_basic), + .setImageId(R.drawable.template_basic_activity), drawer = new ProjectTemplate() .setId(2) @@ -66,33 +74,70 @@ public class WizardViewModel extends AndroidViewModel { .setDescription( getApplication().getApplicationContext(), R.string.template_description_navigation_drawer) - .setImageId(R.drawable.template_navigation_drawer), - libgdx = + .setImageId(R.drawable.template_blank_activity_drawer), + bottomTabs = new ProjectTemplate() .setId(3) .setSupportJava(true) + .setSupportKotlin(true) .setName( - getApplication().getApplicationContext(), R.string.template_libgdx) - .setDescription( getApplication().getApplicationContext(), - R.string.template_description_libgdx) - .setImageId(R.drawable.template_libgdx), - compose = + R.string.template_navigation_tabs) + .setImageId(R.drawable.template_bottom_navigation_activity), + tabs = new ProjectTemplate() .setId(4) + .setSupportJava(true) + .setSupportKotlin(true) + .setName(getApplication().getApplicationContext(), R.string.template_tabs) + .setImageId(R.drawable.template_blank_activity_tabs), + fragmentViewModel = + new ProjectTemplate() + .setId(5) + .setSupportJava(true) + .setSupportKotlin(true) + .setName( + getApplication().getApplicationContext(), + R.string.template_fragment_and_viewmodel) + .setImageId(R.drawable.template_empty_activity), + cppWizard = + new ProjectTemplate() + .setId(6) + .setSupportJava(true) + .setSupportKotlin(true) + .setIsCpp(true) + .setName(getApplication().getApplicationContext(), R.string.template_cpp) + .setImageId(R.drawable.template_cpp_configure), + compose = + new ProjectTemplate() + .setId(7) .setSupportKotlin(true) .setName( getApplication().getApplicationContext(), R.string.template_compose) .setDescription( getApplication().getApplicationContext(), R.string.template_description_compose) - .setImageId(R.drawable.template_kotlin); - + .setImageId(R.drawable.template_compose_empty_activity), + libgdx = + new ProjectTemplate() + .setId(8) + .setSupportJava(true) + .setName( + getApplication().getApplicationContext(), R.string.template_libgdx) + .setDescription( + getApplication().getApplicationContext(), + R.string.template_description_libgdx) + .setImageId(R.drawable.template_game_activity); + mTemplates.add(empty); mTemplates.add(basic); mTemplates.add(drawer); - mTemplates.add(libgdx); + mTemplates.add(bottomTabs); + mTemplates.add(tabs); + mTemplates.add(fragmentViewModel); + mTemplates.add(cppWizard); mTemplates.add(compose); + mTemplates.add(libgdx); mProjectTemplatesList.postValue(mTemplates); mLoadingState.postValue(false); @@ -106,4 +151,57 @@ public class WizardViewModel extends AndroidViewModel { public LiveData getLoadingState() { return mLoadingState; } + + public LiveData getErrorState() { + return mErrorMessageState; + } + + public LiveData getFileCreatedState() { + return mCreatedProject; + } + + public LiveData getStatusMessage() { + return mMessageState; + } + + public void createProject( + ProjectTemplate currentTemplate, + String appName, + String packageName, + int minSdk, + int targetSdk, + String language, + String cppFlags, + String savePath) { + new TaskExecutor() + .executeAsync( + new ProjectCreatorCallable( + currentTemplate, + new NewProjectDetails( + appName, packageName, minSdk, targetSdk, language, cppFlags, savePath), + new ProjectWriterCallback() { + + @Override + public void beforeBegin() { + mMessageState.setValue( + getApplication().getString(R.string.msg_begin_project_write)); + } + + @Override + public void onProcessTask(String arg0) { + mMessageState.setValue(arg0); + } + + @Override + public void onSuccess(File arg0) { + mCreatedProject.setValue(arg0); + } + + @Override + public void onFailed(String arg0) { + mErrorMessageState.setValue(arg0); + } + }), + r -> {}); + } } diff --git a/app/src/main/res/drawable-xxxhdpi/template_basic.png b/app/src/main/res/drawable-xxxhdpi/template_basic.png deleted file mode 100755 index 79e31ae1d..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/template_basic.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/template_basic_activity.png b/app/src/main/res/drawable-xxxhdpi/template_basic_activity.png new file mode 100644 index 000000000..c9e6a1d3c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/template_basic_activity.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/template_blank_activity_drawer.png b/app/src/main/res/drawable-xxxhdpi/template_blank_activity_drawer.png new file mode 100644 index 000000000..1f4303b07 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/template_blank_activity_drawer.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/template_blank_activity_tabs.png b/app/src/main/res/drawable-xxxhdpi/template_blank_activity_tabs.png new file mode 100644 index 000000000..a0be7c4a3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/template_blank_activity_tabs.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/template_bottom_navigation_activity.png b/app/src/main/res/drawable-xxxhdpi/template_bottom_navigation_activity.png new file mode 100644 index 000000000..70f786623 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/template_bottom_navigation_activity.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/template_compose_empty_activity.png b/app/src/main/res/drawable-xxxhdpi/template_compose_empty_activity.png new file mode 100644 index 000000000..22dce62a9 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/template_compose_empty_activity.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/template_cpp_configure.png b/app/src/main/res/drawable-xxxhdpi/template_cpp_configure.png new file mode 100644 index 000000000..1c8d41256 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/template_cpp_configure.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/template_empty.png b/app/src/main/res/drawable-xxxhdpi/template_empty.png deleted file mode 100755 index 8e307cd59..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/template_empty.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/template_empty_activity.png b/app/src/main/res/drawable-xxxhdpi/template_empty_activity.png new file mode 100644 index 000000000..aed0ae662 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/template_empty_activity.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/template_game_activity.png b/app/src/main/res/drawable-xxxhdpi/template_game_activity.png new file mode 100644 index 000000000..eb9731f0a Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/template_game_activity.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/template_kotlin.png b/app/src/main/res/drawable-xxxhdpi/template_kotlin.png deleted file mode 100755 index 54ac39618..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/template_kotlin.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/template_libgdx.png b/app/src/main/res/drawable-xxxhdpi/template_libgdx.png deleted file mode 100644 index 1c556532b..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/template_libgdx.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/template_navigation_drawer.jpg b/app/src/main/res/drawable-xxxhdpi/template_navigation_drawer.jpg deleted file mode 100755 index 5899faab3..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/template_navigation_drawer.jpg and /dev/null differ diff --git a/app/src/main/res/layout/wizard_details.xml b/app/src/main/res/layout/wizard_details.xml index 322c39af4..64f498dcb 100644 --- a/app/src/main/res/layout/wizard_details.xml +++ b/app/src/main/res/layout/wizard_details.xml @@ -75,8 +75,8 @@ android:id="@+id/et_save_location" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="textNoSuggestions" - android:ellipsize="start" /> + android:ellipsize="start" + android:inputType="textNoSuggestions" /> + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2f5d39703..ff82d5abd 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,4 @@ + @@ -21,7 +22,7 @@ Share with Friends IDE preferences Discussions on Telegram - I have nothing to show you… + I have nothing to show you… Terminal Reset App Logs @@ -31,12 +32,12 @@ Unable to perform quick fix - Performing code action… + Performing code action… Since API %d Removed in API %d Deprecated in API %d - Finding references… - Finding definition… + Finding references… + Finding definition… Definition not found No references found Diagnostics @@ -46,7 +47,7 @@ Get ready for something awesome ! Picked file is not a directory! Please choose only one directory - Please wait for a moment … + Please wait for a moment … Device Not Supported Unfortunately, your device is not supported at the moment. We are sorry for the inconvenience.\n\nSupported CPU ABIs: aarch64 and armeabi-v7a @@ -66,16 +67,16 @@ Quick run Gradle files have changed. Please rebuild your project to sync dependencies and configurations. Preparing - Preparing. First build may take up to 10–15 minutes! + Preparing. First build may take up to 10–15 minutes! Gradle Wrapper is not available!\nInstalling default one. Gradle v7.4 will be downloaded if necessary. - Getting Daemon status, please wait… + Getting Daemon status, please wait… Gradle daemon status Install APK(s) Clear output Run Gradle First Build - This is the first time build after you installed AndroidIDE. First build usually takes time as Gradle downloads all dependencies and plugins. This process may take about 10–15 minutes. But this totally depends on your network connection.\n\nPlease be patient … + This is the first time build after you installed AndroidIDE. First build usually takes time as Gradle downloads all dependencies and plugins. This process may take about 10–15 minutes. But this totally depends on your network connection.\n\nPlease be patient … Create project @@ -107,6 +108,13 @@ LibGDX game project set up to render an image as an example. Jetpack Compose Basic Jetpack Compose hello world project. + Bottom Navigation Activity + Creates a new activity with bottom navigation + Tabbed Activity + Creates a new blank activity with tabs + Fragment + ViewModel + Native C++ + Creates a new project with an Empty Activity configured to use JNI Save @@ -119,7 +127,7 @@ Separated by \'|\' Please enter text Select modules to search - Finding in project, please wait… + Finding in project, please wait… Search results Copying files Writing files @@ -179,6 +187,7 @@ Undo Redo + Copy Text to search @@ -215,7 +224,6 @@ Please choose default font size of editor : This will delete caches directory created by Gradle. If you delete it, the next build may take a bit longer than normal as Gradle will download required files again.\nIMPORTANT: This will also delete AAPT2. You will need to reinstall it otherwise you\'ll end up with a build failure.\n\nAre you sure you want to delete caches? - Unable to initialize SDK Info Unable to preview layout @@ -264,7 +272,7 @@ Bootstrap installation failed with the following exception. Translations Installing compiler module - Compiler module is being installed, please wait… + Compiler module is being installed, please wait… Compiler module installation failed. The error was:\n%s Compiler module installed successfully! Expand selection @@ -278,7 +286,6 @@ If enabled, then typing a lower case or upper case letters will suggest class names as well as scope members. Font ligatures Enable/disable font ligatures - Yes No Unable to start intent for installing APK @@ -301,12 +308,12 @@ Use for visible password input type flag in editor. This makes sure that no suggestions are proposed by soft keyboard. Previous Replacing… - Gradle build service started Gradle build service AndroidIDE\'s Gradle build service is running in the background. - Cancel build + Warning + NDK is currently not officially supported. This template works only after you setup NDK Initializing project Project initialized Project initialization failed @@ -314,19 +321,19 @@ Running task: \'%1$s\' Replacement Sync project - Name cannot be empty. Name cannot contain illegal characters Save location Project Language Templates loading… + C++ Standard Next Exit - JDK 11 tag pointers fix Set LD_PRELOAD to libhook.so to fix tag pointers issue for JDK 11 in Android 11 [DEPRECATED - Prefer using JDK 17]. Custom Gradle installation Specify a custom Gradle installation to use for build. This OVERRIDES the version specified in gradle-wrapper.properties. Gradle installation path Leave empty to use Gradle wrapper. + \ No newline at end of file