From 024791dfbbd0b3bc61be51b5766170d06c4a81e2 Mon Sep 17 00:00:00 2001 From: Andrey Novikov Date: Thu, 15 Feb 2024 09:47:15 +0300 Subject: [PATCH 1/9] Minor refactoring --- .../fragments/LocationInformation.java | 2 +- .../maptrek/ui/TextInputDialogFragment.java | 26 ++++++++++++------- app/src/main/res/layout/dialog_text_input.xml | 7 ++--- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/mobi/maptrek/fragments/LocationInformation.java b/app/src/main/java/mobi/maptrek/fragments/LocationInformation.java index f339e00f..b10a183b 100644 --- a/app/src/main/java/mobi/maptrek/fragments/LocationInformation.java +++ b/app/src/main/java/mobi/maptrek/fragments/LocationInformation.java @@ -102,7 +102,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa ImageButton inputButton = mRootView.findViewById(R.id.inputButton); inputButton.setOnClickListener(v -> { TextInputDialogFragment.Builder builder = new TextInputDialogFragment.Builder(); - mTextInputDialog = builder.setCallbacks(LocationInformation.this) + mTextInputDialog = builder.setCallback(LocationInformation.this) .setHint(container.getContext().getString(R.string.coordinates)) .setShowPasteButton(true) .create(); diff --git a/app/src/main/java/mobi/maptrek/ui/TextInputDialogFragment.java b/app/src/main/java/mobi/maptrek/ui/TextInputDialogFragment.java index ee83bc86..cbefafcb 100644 --- a/app/src/main/java/mobi/maptrek/ui/TextInputDialogFragment.java +++ b/app/src/main/java/mobi/maptrek/ui/TextInputDialogFragment.java @@ -83,7 +83,7 @@ public void onPause() { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - Bundle args = getArguments(); + Bundle args = requireArguments(); String title = args.getString("title", ""); String oldValue = args.getString("oldValue", ""); boolean selectAllOnFocus = args.getBoolean("selectAllOnFocus", false); @@ -107,8 +107,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { } viewBinding.textEdit.setInputType(inputType); - if (!"".equals(oldValue)) - viewBinding.textEdit.setText(oldValue); + viewBinding.textEdit.setText(oldValue); viewBinding.textEdit.setSelectAllOnFocus(selectAllOnFocus); viewBinding.textEdit.requestFocus(); @@ -139,7 +138,10 @@ public void afterTextChanged(Editable s) { viewBinding.pasteButton.setOnClickListener(v -> { if (mClipboard == null) return; - ClipData.Item item = mClipboard.getPrimaryClip().getItemAt(0); + ClipData clipData = mClipboard.getPrimaryClip(); + if (clipData == null) + return; + ClipData.Item item = clipData.getItemAt(0); CharSequence pasteData = item.getText(); if (pasteData != null) viewBinding.textEdit.setText(pasteData); @@ -166,8 +168,11 @@ public void onPrimaryClipChanged() { if (!mShowPasteButton) return; int visibility = View.GONE; - if (mClipboard.hasPrimaryClip() && mClipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) - visibility = View.VISIBLE; + if (mClipboard.hasPrimaryClip()) { + ClipDescription description = mClipboard.getPrimaryClipDescription(); + if (description != null && description.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) + visibility = View.VISIBLE; + } viewBinding.pasteButton.setVisibility(visibility); } @@ -180,6 +185,7 @@ public void setCallback(TextInputDialogCallback callback) { mCallback = callback; } + /** @noinspection UnusedReturnValue, unused */ public static class Builder { private String mTitle; private String mOldValue; @@ -188,7 +194,7 @@ public static class Builder { private Integer mInputType; private Boolean mShowPasteButton; private String mId; - private TextInputDialogCallback mCallbacks; + private TextInputDialogCallback mCallback; public Builder setTitle(String title) { mTitle = title; @@ -225,8 +231,8 @@ public Builder setId(String id) { return this; } - public Builder setCallbacks(TextInputDialogCallback callbacks) { - mCallbacks = callbacks; + public Builder setCallback(TextInputDialogCallback callback) { + mCallback = callback; return this; } @@ -248,7 +254,7 @@ public TextInputDialogFragment create() { args.putBoolean("showPasteButton", mShowPasteButton); if (mId != null) args.putString("id", mId); - dialogFragment.setCallback(mCallbacks); + dialogFragment.setCallback(mCallback); dialogFragment.setArguments(args); return dialogFragment; } diff --git a/app/src/main/res/layout/dialog_text_input.xml b/app/src/main/res/layout/dialog_text_input.xml index a80ac715..f3b7fbe1 100644 --- a/app/src/main/res/layout/dialog_text_input.xml +++ b/app/src/main/res/layout/dialog_text_input.xml @@ -1,11 +1,12 @@ @@ -37,9 +38,9 @@ android:background="?android:attr/selectableItemBackgroundBorderless" android:paddingStart="@dimen/list_item_vertical_padding" android:src="@drawable/ic_content_paste" - android:tint="?attr/actionIconColor" android:visibility="visible" - tools:ignore="RtlSymmetry" /> + app:tint="?attr/actionIconColor" + tools:ignore="ContentDescription,RtlSymmetry" /> From 199042989e72a874bafedb5da7b3d6d85e5c09c7 Mon Sep 17 00:00:00 2001 From: Andrey Novikov Date: Thu, 15 Feb 2024 09:47:59 +0300 Subject: [PATCH 2/9] Handle device rotation --- .../mobi/maptrek/fragments/RouteEdit.java | 70 +++++++++---------- 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/mobi/maptrek/fragments/RouteEdit.java b/app/src/main/java/mobi/maptrek/fragments/RouteEdit.java index 6cd172e9..6a09fdaa 100644 --- a/app/src/main/java/mobi/maptrek/fragments/RouteEdit.java +++ b/app/src/main/java/mobi/maptrek/fragments/RouteEdit.java @@ -72,6 +72,7 @@ public class RouteEdit extends Fragment implements ItemizedLayer.OnItemGestureLi private MapPosition mMapPosition; private RouteLayer mRouteLayer; private ItemizedLayer mPointLayer; + private TextInputDialogFragment textInputDialog; private RouteEditViewModel viewModel; private FragmentRouteEditBinding viewBinding; @@ -154,14 +155,18 @@ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { HelperUtils.showError(getString(R.string.msgTooFewRouteLegs), mFragmentHolder.getCoordinatorLayout()); return; } - TextInputDialogFragment textInputDialog = new TextInputDialogFragment.Builder() + textInputDialog = new TextInputDialogFragment.Builder() .setId(ROUTE_NAME) - .setCallbacks(this) + .setCallback(this) .setTitle(getString(R.string.title_input_name)) .setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES) .create(); textInputDialog.show(getParentFragmentManager(), "titleInput"); }); + + textInputDialog = (TextInputDialogFragment) getParentFragmentManager().findFragmentByTag("titleInput"); + if (textInputDialog != null) + textInputDialog.setCallback(this); } @Override @@ -183,8 +188,8 @@ public void onStart() { Bitmap bitmap = new AndroidBitmap(MarkerFactory.getMarkerSymbol(requireContext(), R.drawable.dot_black, RouteStyle.DEFAULT_COLOR)); MarkerSymbol symbol = new MarkerSymbol(bitmap, MarkerItem.HotspotPlace.CENTER); ArrayList items = new ArrayList<>(viewModel.route.size()); - for (GeoPoint point : viewModel.route.getCoordinates()) { - items.add(new MarkerItem(point, null, null, point)); + for (Route.Instruction instruction : viewModel.route.getInstructions()) { + items.add(new MarkerItem(instruction, instruction.text, null, instruction)); } mPointLayer = new ItemizedLayer<>(mMapHolder.getMap(), items, symbol, MapTrek.density, this); mMapHolder.getMap().layers().add(mPointLayer); @@ -261,6 +266,18 @@ private void updateFinishPoint() { mMapHolder.getMap().updateMap(true); } + private void saveDescription(String text) { + text = text.trim(); + if (text.isEmpty()) + text = null; + if (Objects.equals(text, viewModel.editedInstruction.text)) + return; + viewModel.editedInstruction.text = text; + mPointLayer.getByUid(viewModel.editedInstruction).title = text; + mPointLayer.updateItems(); + mMapHolder.getMap().updateMap(true); + } + private void saveRoute(String name) { if (name.trim().isEmpty()) return; @@ -292,43 +309,13 @@ public void onError(FileDataSource source, Exception e) { @Override public boolean onItemSingleTapUp(int index, MarkerItem item) { + viewModel.editedInstruction = (Route.Instruction) item.getUid(); TextInputDialogFragment.Builder builder = new TextInputDialogFragment.Builder() .setId(POINT_NAME) + .setOldValue(item.title) .setTitle(getString(R.string.description)) - .setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); - - if (item.title != null) - builder.setOldValue(item.title); - - builder.setCallbacks(new TextInputDialogFragment.TextInputDialogCallback() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - @Override - public void afterTextChanged(Editable s) { - } - @Override - public void onTextInputPositiveClick(String id, String inputText) { - String title = inputText.trim(); - if (title.isEmpty()) - title = null; - if (Objects.equals(title, item.title)) - return; - Route.Instruction instruction = (Route.Instruction) item.getUid(); - instruction.text = title; - item.title = title; - mPointLayer.updateItems(); - mMapHolder.getMap().updateMap(true); - } - - @Override - public void onTextInputNegativeClick(String id) { - } - }); - + .setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES) + .setCallback(this); TextInputDialogFragment textInputDialog = builder.create(); textInputDialog.show(getParentFragmentManager(), "titleInput"); return true; @@ -355,14 +342,21 @@ public void afterTextChanged(Editable s) { public void onTextInputPositiveClick(String id, String inputText) { if (ROUTE_NAME.equals(id)) saveRoute(inputText); + if (POINT_NAME.equals(id)) { + saveDescription(inputText); + viewModel.editedInstruction = null; + } } @Override public void onTextInputNegativeClick(String id) { + if (POINT_NAME.equals(id)) + viewModel.editedInstruction = null; } public static class RouteEditViewModel extends ViewModel { private final Route route = new Route(); private final Stack pointHistory = new Stack<>(); + private Route.Instruction editedInstruction; } } From ece6aa752626ad043cd81b306561a5b6d69492de Mon Sep 17 00:00:00 2001 From: Andrey Novikov Date: Thu, 15 Feb 2024 09:57:52 +0300 Subject: [PATCH 3/9] Disable position locking if crosshair is locked --- .../main/java/mobi/maptrek/MainActivity.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/mobi/maptrek/MainActivity.java b/app/src/main/java/mobi/maptrek/MainActivity.java index 7fbe2feb..ffc04a54 100644 --- a/app/src/main/java/mobi/maptrek/MainActivity.java +++ b/app/src/main/java/mobi/maptrek/MainActivity.java @@ -4273,7 +4273,7 @@ private void removeWaypointMarker(Waypoint waypoint) { @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { - if (mMap.getEventLayer().moveEnabled()) { + if (mObjectInteractionEnabled && mMap.getEventLayer().moveEnabled()) { AbstractMapEventLayer eventLayer = mMap.getEventLayer(); eventLayer.enableMove(false); eventLayer.enableRotation(false); @@ -4299,13 +4299,15 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { - AbstractMapEventLayer eventLayer = mMap.getEventLayer(); - eventLayer.enableMove(true); - eventLayer.enableRotation(true); - eventLayer.enableTilt(true); - eventLayer.enableZoom(true); - mCrosshairLayer.unlock(); - mPositionLocked = false; + if (mObjectInteractionEnabled) { + AbstractMapEventLayer eventLayer = mMap.getEventLayer(); + eventLayer.enableMove(true); + eventLayer.enableRotation(true); + eventLayer.enableTilt(true); + eventLayer.enableZoom(true); + mCrosshairLayer.unlock(); + mPositionLocked = false; + } return true; } if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { From b2b60f9280a05f0fa869df896e2c3dc1fa15f002 Mon Sep 17 00:00:00 2001 From: Andrey Novikov Date: Thu, 15 Feb 2024 10:04:59 +0300 Subject: [PATCH 4/9] Simplify UI --- .../maptrek/fragments/DataSourceList.java | 20 +++++++++---------- app/src/main/res/values-ru/strings.xml | 2 -- app/src/main/res/values/strings.xml | 2 -- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/mobi/maptrek/fragments/DataSourceList.java b/app/src/main/java/mobi/maptrek/fragments/DataSourceList.java index 3e82478a..e0ad4988 100644 --- a/app/src/main/java/mobi/maptrek/fragments/DataSourceList.java +++ b/app/src/main/java/mobi/maptrek/fragments/DataSourceList.java @@ -26,6 +26,8 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; import android.webkit.MimeTypeMap; import android.widget.PopupMenu; @@ -41,7 +43,6 @@ import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.snackbar.Snackbar; import com.google.android.material.textview.MaterialTextView; import org.slf4j.Logger; @@ -303,6 +304,8 @@ class DataSourceViewHolder extends BindableViewHolder { @Override void bindView(DataSource dataSource, int position) { + Context context = getContext(); + name.setText(dataSource.name); @ColorInt int color = accentColor; @@ -365,7 +368,7 @@ else if (routesCount > 0 && waypointsCount == 0 && tracksCount == 0) } itemView.setOnClickListener(v -> dataSourceViewModel.selectDataSource(dataSource, DataSourceViewModel.MODE_SELECTOR)); } else { - String size = Formatter.formatShortFileSize(getContext(), file.length()); + String size = Formatter.formatShortFileSize(context, file.length()); if (nativeTracksMode) { description.setText(String.format(Locale.ENGLISH, "%s", size)); icon.setImageResource(R.drawable.ic_track); @@ -378,13 +381,10 @@ else if (routesCount > 0 && waypointsCount == 0 && tracksCount == 0) icon.setImageResource(R.drawable.ic_dataset); } color = disabledColor; - itemView.setOnClickListener(v -> Snackbar.make(viewBinding.getRoot(), R.string.msgDataSourceNotLoaded, Snackbar.LENGTH_SHORT) - .setAction(R.string.actionEnable, view -> { - mDataHolder.setDataSourceAvailability((FileDataSource) dataSource, true); - notifyItemChanged(position); - }) - .setAnchorView(v) - .show()); + itemView.setOnClickListener(v -> { + Animation shake = AnimationUtils.loadAnimation(context, R.anim.shake); + action.startAnimation(shake); + }); } final boolean shown = dataSource.isVisible(); if (shown) @@ -399,7 +399,7 @@ else if (routesCount > 0 && waypointsCount == 0 && tracksCount == 0) } icon.setImageTintList(ColorStateList.valueOf(color)); itemView.setOnLongClickListener(v -> { - PopupMenu popup = new PopupMenu(getContext(), v); + PopupMenu popup = new PopupMenu(context, v); popup.inflate(R.menu.context_menu_data_list); if (dataSource instanceof WaypointDbDataSource) popup.getMenu().findItem(R.id.action_delete).setVisible(false); diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6f066b7d..c99da731 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -96,7 +96,6 @@ Предоставить Загрузить Пропустить - Включить Поделиться местоположением через: Поделиться данными через: @@ -181,7 +180,6 @@ Активирован режим нескольких карт. Используйте двойное нажатие, чтобы отобразить или спрятать карту. Вам необходимо включить точную геолокацию (GPS) в настройках Android, чтобы использовать определение местоположения в реальном времени %s: произошёл сбой при загрузке - Источник данных выключен Офлайн карты Векторные карты содержат подробные топографические данные с изолиниями высот и поддержкой затенений рельефа и не требуют подключения к интернету. Вы также можете добавлять собственные карты для покрытия интересующих вас областей. Ваши карты тоже будут затеняться. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 78c24801..45fcd2ed 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -100,7 +100,6 @@ Grant Download Skip - Enable Create route Share location via: @@ -187,7 +186,6 @@ Multi-maps mode enabled. Use double tap to show and hide maps. You should enable precise location (GPS) in Android settings in order to use real time positioning %s failed to download - Data source is disabled Route should contain at least one leg Offline maps From 3003c69ac63e6fbf9edaf25fadc0e150cf14c784 Mon Sep 17 00:00:00 2001 From: Andrey Novikov Date: Thu, 15 Feb 2024 11:11:43 +0300 Subject: [PATCH 5/9] Fix Espresso test --- app/build.gradle | 2 + .../java/mobi/maptrek/SimpleRunTest.java | 100 ++++++++++-------- 2 files changed, 56 insertions(+), 46 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a3cfe838..fad96a88 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,7 +76,9 @@ dependencies { testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.5.1' androidTestImplementation 'androidx.test:rules:1.5.0' + implementation "androidx.tracing:tracing:1.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel:2.7.0" implementation "androidx.lifecycle:lifecycle-livedata:2.7.0" implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.7.0" diff --git a/app/src/androidTest/java/mobi/maptrek/SimpleRunTest.java b/app/src/androidTest/java/mobi/maptrek/SimpleRunTest.java index 5ff3114e..ebac45d0 100644 --- a/app/src/androidTest/java/mobi/maptrek/SimpleRunTest.java +++ b/app/src/androidTest/java/mobi/maptrek/SimpleRunTest.java @@ -44,6 +44,7 @@ import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.action.ViewActions.longClick; import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition; import static androidx.test.espresso.matcher.RootMatchers.isDialog; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withClassName; @@ -72,8 +73,9 @@ public void beforeTest() { @Test public void mainActivityTest() { + // Close Introduction panel if test is running separately + try { - // Close Introduction panel if test is running separately ViewInteraction appCompatButton = onView( allOf( withId(R.id.skip), @@ -87,6 +89,7 @@ public void mainActivityTest() { } // World map download dialog is displayed - close it + ViewInteraction appCompatButton2 = onView( allOf( withId(android.R.id.button2), @@ -102,13 +105,7 @@ public void mainActivityTest() { allOf( withId(R.id.moreButton), childAtPosition( - allOf( - withId(R.id.actionPanel), - childAtPosition( - withClassName(is("android.widget.RelativeLayout")), - 1 - ) - ), + withId(R.id.actionPanel), 4 ), isDisplayed() @@ -116,39 +113,68 @@ public void mainActivityTest() { ); appCompatImageButton.perform(click()); - // Press 'About' menu item + // Press 'Settings' menu item DataInteraction linearLayout = onData(anything()) .inAdapterView( allOf( withId(android.R.id.list), childAtPosition( - withClassName(is("android.widget.FrameLayout")), - 0 + withClassName(is("android.widget.FrameLayout")), + 0 ) ) ) - .atPosition(0); + .atPosition(1); linearLayout.perform(click()); - // Check for 'Trekarta' title + // Check for 'About' preference item ViewInteraction textView = onView( + allOf( + withId(android.R.id.title), + withText("About"), + isDisplayed() + ) + ); + textView.check(matches(withText("About"))); + + // Press 'About' preference item + + ViewInteraction recyclerView = onView( + allOf( + withId(androidx.preference.R.id.recycler_view), + childAtPosition( + withId(android.R.id.list_container), + 0 + ) + ) + ); + recyclerView.perform(actionOnItemAtPosition(3, click())); + + // Check for 'Trekarta' title + + ViewInteraction imageView = onView( allOf( withId(R.id.title), withContentDescription("Trekarta"), - childAtPosition( - childAtPosition( - IsInstanceOf.instanceOf(android.widget.LinearLayout.class), - 0 - ), - 1 - ), isDisplayed() ) ); - textView.check(matches(withContentDescription("Trekarta"))); + imageView.check(matches(isDisplayed())); + + // Check for 'trekarta.info' link + + ViewInteraction textView2 = onView( + allOf( + withId(R.id.links), + withText("https://trekarta.info/"), + isDisplayed() + ) + ); + textView2.check(matches(withText("https://trekarta.info/"))); + pressBack(); pressBack(); // Press 'Places' button @@ -157,13 +183,7 @@ public void mainActivityTest() { allOf( withId(R.id.placesButton), childAtPosition( - allOf( - withId(R.id.actionPanel), - childAtPosition( - withClassName(is("android.widget.RelativeLayout")), - 1 - ) - ), + withId(R.id.actionPanel), 2 ), isDisplayed() @@ -179,13 +199,7 @@ public void mainActivityTest() { allOf( withId(R.id.mapsButton), childAtPosition( - allOf( - withId(R.id.actionPanel), - childAtPosition( - withClassName(is("android.widget.RelativeLayout")), - 1 - ) - ), + withId(R.id.actionPanel), 3 ), isDisplayed() @@ -200,8 +214,8 @@ public void mainActivityTest() { allOf( withId(android.R.id.list), childAtPosition( - withClassName(is("android.widget.FrameLayout")), - 0 + withClassName(is("android.widget.FrameLayout")), + 0 ) ) ) @@ -210,7 +224,7 @@ public void mainActivityTest() { // Find first legend title - ViewInteraction textView2 = onView( + ViewInteraction textView3 = onView( allOf( withId(R.id.name), withText("Administrative"), @@ -224,7 +238,7 @@ public void mainActivityTest() { isDisplayed() ) ); - textView2.check(matches(withText("Administrative"))); + textView3.check(matches(withText("Administrative"))); pressBack(); @@ -234,13 +248,7 @@ public void mainActivityTest() { allOf( withId(R.id.locationButton), childAtPosition( - allOf( - withId(R.id.actionPanel), - childAtPosition( - withClassName(is("android.widget.RelativeLayout")), - 1 - ) - ), + withId(R.id.actionPanel), 0 ), isDisplayed() From 2d8152f1b265e606bf3724bddee5b74025afc5e2 Mon Sep 17 00:00:00 2001 From: Andrey Novikov Date: Thu, 15 Feb 2024 12:03:11 +0300 Subject: [PATCH 6/9] Update android.yml --- .github/workflows/android.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 288c4577..6b7e4f90 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -15,7 +15,14 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - name: Checkout source code + uses: actions/checkout@v3 + - name: Create local.properties + run: | + echo RELEASE_STORE_FILE=release.keystore > ./local.properties + echo RELEASE_STORE_PASSWORD=${{ secrets.RELEASE_STORE_PASSWORD }} >> ./local.properties + echo RELEASE_KEY_ALIAS=${{ secrets.RELEASE_KEY_ALIAS }} >> ./local.properties + echo RELEASE_KEY_PASSWORD=${{ secrets.RELEASE_KEY_PASSWORD }} >> ./local.properties - name: Set up JDK 17 uses: actions/setup-java@v3 with: @@ -32,7 +39,8 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - name: Checkout source code + uses: actions/checkout@v3 - name: Set up JDK 17 uses: actions/setup-java@v3 with: From 7fa9da6d12e6d71aefc2935cb5b28d0f63f1bbe4 Mon Sep 17 00:00:00 2001 From: Andrey Novikov Date: Thu, 15 Feb 2024 12:12:28 +0300 Subject: [PATCH 7/9] Update android.yml --- .github/workflows/android.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 6b7e4f90..c3dbe282 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -17,12 +17,12 @@ jobs: steps: - name: Checkout source code uses: actions/checkout@v3 - - name: Create local.properties + - name: Update gradle.properties run: | - echo RELEASE_STORE_FILE=release.keystore > ./local.properties - echo RELEASE_STORE_PASSWORD=${{ secrets.RELEASE_STORE_PASSWORD }} >> ./local.properties - echo RELEASE_KEY_ALIAS=${{ secrets.RELEASE_KEY_ALIAS }} >> ./local.properties - echo RELEASE_KEY_PASSWORD=${{ secrets.RELEASE_KEY_PASSWORD }} >> ./local.properties + echo RELEASE_STORE_FILE=release.keystore >> ./gradle.properties + echo RELEASE_STORE_PASSWORD=${{ secrets.RELEASE_STORE_PASSWORD }} >> ./gradle.properties + echo RELEASE_KEY_ALIAS=${{ secrets.RELEASE_KEY_ALIAS }} >> ./gradle.properties + echo RELEASE_KEY_PASSWORD=${{ secrets.RELEASE_KEY_PASSWORD }} >> ./gradle.properties - name: Set up JDK 17 uses: actions/setup-java@v3 with: From 49db95be4089d33aee3503fd726174386ba8727e Mon Sep 17 00:00:00 2001 From: Andrey Novikov Date: Thu, 15 Feb 2024 13:42:37 +0300 Subject: [PATCH 8/9] Fix signing config --- app/build.gradle | 14 ++++++++++---- app/debug.keystore | Bin 0 -> 2618 bytes 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 app/debug.keystore diff --git a/app/build.gradle b/app/build.gradle index fad96a88..2c7bb27b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,11 +29,17 @@ android { } signingConfigs { + debug { + storeFile file("debug.keystore") + storePassword "android" + keyAlias "AndroidDebugKey" + keyPassword "android" + } release { - storeFile file(RELEASE_STORE_FILE) - storePassword RELEASE_STORE_PASSWORD - keyAlias RELEASE_KEY_ALIAS - keyPassword RELEASE_KEY_PASSWORD + storeFile file(project.hasProperty('RELEASE_STORE_FILE') ? RELEASE_STORE_FILE : "debug.keystore") + storePassword project.hasProperty('RELEASE_STORE_PASSWORD') ? RELEASE_STORE_PASSWORD : "android" + keyAlias project.hasProperty('RELEASE_KEY_ALIAS') ? RELEASE_KEY_ALIAS : "AndroidDebugKey" + keyPassword project.hasProperty('RELEASE_KEY_PASSWORD') ? RELEASE_KEY_PASSWORD : "android" } } diff --git a/app/debug.keystore b/app/debug.keystore new file mode 100644 index 0000000000000000000000000000000000000000..c4ad65ce9b8528759051e016529ddbd34f030359 GIT binary patch literal 2618 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 literal 0 HcmV?d00001 From 642586245396730ebf4b5fa9ce99f010df791876 Mon Sep 17 00:00:00 2001 From: Andrey Novikov Date: Thu, 15 Feb 2024 14:03:00 +0300 Subject: [PATCH 9/9] Update android.yml --- .github/workflows/android.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index c3dbe282..027a56b0 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -17,12 +17,12 @@ jobs: steps: - name: Checkout source code uses: actions/checkout@v3 - - name: Update gradle.properties - run: | - echo RELEASE_STORE_FILE=release.keystore >> ./gradle.properties - echo RELEASE_STORE_PASSWORD=${{ secrets.RELEASE_STORE_PASSWORD }} >> ./gradle.properties - echo RELEASE_KEY_ALIAS=${{ secrets.RELEASE_KEY_ALIAS }} >> ./gradle.properties - echo RELEASE_KEY_PASSWORD=${{ secrets.RELEASE_KEY_PASSWORD }} >> ./gradle.properties + #- name: Update gradle.properties + # run: | + # echo RELEASE_STORE_FILE=release.keystore >> ./gradle.properties + # echo RELEASE_STORE_PASSWORD=${{ secrets.RELEASE_STORE_PASSWORD }} >> ./gradle.properties + # echo RELEASE_KEY_ALIAS=${{ secrets.RELEASE_KEY_ALIAS }} >> ./gradle.properties + # echo RELEASE_KEY_PASSWORD=${{ secrets.RELEASE_KEY_PASSWORD }} >> ./gradle.properties - name: Set up JDK 17 uses: actions/setup-java@v3 with: