diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml new file mode 100644 index 00000000..d9be5dcd --- /dev/null +++ b/.github/workflows/build_and_deploy.yml @@ -0,0 +1,80 @@ +name: Build and deploy + +on: + push: + branches: + - 'ci_setup' + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK + uses: actions/setup-java@v2 + with: + java-version: 21 + distribution: temurin + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.7.2 + bundler-cache: true + + - name: Set up Android SDK + uses: android-actions/setup-android@v3 + + - name: Decode keystore + uses: timheuer/base64-to-file@v1 + id: android_keystore + with: + fileName: "release.jks" + encodedString: ${{ secrets.KEYSTORE_FILE }} + + - name: Prepare Gradle environment + run: | + echo "apply from: 'ci_signing.gradle'" >> mastodon/build.gradle + echo "sdk.dir=$ANDROID_SDK_ROOT" > local.properties + + - name: Build and deploy to Google Play + run: bundle exec fastlane deploy + env: + KEYSTORE_FILE: ${{ steps.android_keystore.outputs.filePath }} + KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} + SUPPLY_JSON_KEY_DATA: ${{ secrets.GOOGLE_SERVICE_ACCOUNT_KEY }} + SUPPLY_VALIDATE_ONLY: true + SUPPLY_SKIP_UPLOAD_METADATA: true + SUPPLY_SKIP_UPLOAD_CHANGELOGS: true + + - name: Build release apk + run: ./gradlew assembleRelease + env: + KEYSTORE_FILE: ${{ steps.android_keystore.outputs.filePath }} + KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} + + - name: Upload release apk + uses: actions/upload-artifact@v4 + with: + name: mastodon-release.apk + path: mastodon/build/outputs/apk/release/mastodon-release.apk + + - name: Build githubRelease apk + run: ./gradlew assembleGithubRelease + env: + KEYSTORE_FILE: ${{ steps.android_keystore.outputs.filePath }} + KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} + + - name: Upload githubRelease apk + uses: actions/upload-artifact@v4 + with: + name: mastodon-githubRelease.apk + path: mastodon/build/outputs/apk/githubRelease/mastodon-githubRelease.apk + + - name: Upload mappings + uses: actions/upload-artifact@v4 + with: + name: mappings + path: mastodon/build/outputs/mapping/*/mapping.txt \ No newline at end of file diff --git a/.gitignore b/.gitignore index 593af090..151ef3a2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ .cxx local.properties *.jks +/fastlane/report.xml diff --git a/Gemfile b/Gemfile new file mode 100644 index 00000000..7a118b49 --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "fastlane" diff --git a/build.gradle b/build.gradle index c4715843..1f5a65bd 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { mavenCentral() } dependencies { - classpath "com.android.tools.build:gradle:7.4.2" + classpath "com.android.tools.build:gradle:8.2.2" classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/fastlane/Appfile b/fastlane/Appfile new file mode 100644 index 00000000..549a499f --- /dev/null +++ b/fastlane/Appfile @@ -0,0 +1,2 @@ +json_key_file("") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one +package_name("org.joinmastodon.android") # e.g. com.krausefx.app diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 00000000..9cbe7f69 --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,36 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Uncomment the line if you want fastlane to automatically update itself +# update_fastlane + +default_platform(:android) + +platform :android do + desc "Runs all the tests" + lane :test do + gradle(task: "test") + end + + desc "Deploy a new version to the Google Play" + lane :deploy do + gradle( + task: "bundle", + build_type: "release", + ) + upload_to_play_store( + changes_not_sent_for_review: true, + skip_upload_images: true, + skip_upload_screenshots: true + ) + end +end diff --git a/fastlane/README.md b/fastlane/README.md new file mode 100644 index 00000000..5649d3a4 --- /dev/null +++ b/fastlane/README.md @@ -0,0 +1,40 @@ +fastlane documentation +---- + +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +```sh +xcode-select --install +``` + +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) + +# Available Actions + +## Android + +### android test + +```sh +[bundle exec] fastlane android test +``` + +Runs all the tests + +### android deploy + +```sh +[bundle exec] fastlane android deploy +``` + +Deploy a new version to the Google Play + +---- + +This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/fastlane/metadata/android/en-US/changelogs/86.txt b/fastlane/metadata/android/en-US/changelogs/86.txt new file mode 100644 index 00000000..4be56205 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/86.txt @@ -0,0 +1,3 @@ +- You can now easily share and scan QR codes to quickly find each other +- We've updated the look of the tab bar to better match current platform guidelines +- Various minor usability improvements \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e9cd6f21..adb8ebf8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sat Jun 03 23:40:27 MSK 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/mastodon/build.gradle b/mastodon/build.gradle index 4939669e..755a67d9 100644 --- a/mastodon/build.gradle +++ b/mastodon/build.gradle @@ -66,6 +66,7 @@ android { } buildFeatures{ aidl true + buildConfig true } dependenciesInfo{ // Disables dependency metadata when building APKs. @@ -73,6 +74,7 @@ android { // Disables dependency metadata when building Android App Bundles. includeInBundle false } + namespace 'org.joinmastodon.android' } dependencies { diff --git a/mastodon/ci_signing.gradle b/mastodon/ci_signing.gradle new file mode 100644 index 00000000..bddf4ff0 --- /dev/null +++ b/mastodon/ci_signing.gradle @@ -0,0 +1,20 @@ +// Included into build.gradle when running in a CI pipeline + +android{ + signingConfigs{ + release{ + keyAlias "key0" + keyPassword System.getenv("KEYSTORE_PASSWORD") + storeFile file(System.getenv("KEYSTORE_FILE")) + storePassword System.getenv("KEYSTORE_PASSWORD") + } + } + buildTypes{ + release{ + signingConfig signingConfigs.release + } + githubRelease{ + signingConfig signingConfigs.release + } + } +} \ No newline at end of file diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java index ed01e888..f40283f0 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java @@ -112,7 +112,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene content.setOrientation(LinearLayout.VERTICAL); FrameLayout fragmentContainer=new FrameLayout(getActivity()); - fragmentContainer.setId(R.id.fragment_wrap); + fragmentContainer.setId(me.grishka.appkit.R.id.fragment_wrap); content.addView(fragmentContainer, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f)); inflater.inflate(R.layout.tab_bar, content); @@ -131,10 +131,10 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene if(savedInstanceState==null){ getChildFragmentManager().beginTransaction() - .add(R.id.fragment_wrap, homeTimelineFragment) - .add(R.id.fragment_wrap, searchFragment).hide(searchFragment) - .add(R.id.fragment_wrap, notificationsFragment).hide(notificationsFragment) - .add(R.id.fragment_wrap, profileFragment).hide(profileFragment) + .add(me.grishka.appkit.R.id.fragment_wrap, homeTimelineFragment) + .add(me.grishka.appkit.R.id.fragment_wrap, searchFragment).hide(searchFragment) + .add(me.grishka.appkit.R.id.fragment_wrap, notificationsFragment).hide(notificationsFragment) + .add(me.grishka.appkit.R.id.fragment_wrap, profileFragment).hide(profileFragment) .commit(); String defaultTab=getArguments().getString("tab"); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileAboutFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileAboutFragment.java index 061e981c..a5678804 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileAboutFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileAboutFragment.java @@ -310,7 +310,7 @@ public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareF public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState){ super.onSelectedChanged(viewHolder, actionState); if(actionState==ItemTouchHelper.ACTION_STATE_DRAG){ - viewHolder.itemView.setTag(R.id.item_touch_helper_previous_elevation, viewHolder.itemView.getElevation()); // prevents the default behavior of changing elevation in onDraw() + viewHolder.itemView.setTag(me.grishka.appkit.R.id.item_touch_helper_previous_elevation, viewHolder.itemView.getElevation()); // prevents the default behavior of changing elevation in onDraw() viewHolder.itemView.animate().translationZ(V.dp(1)).setDuration(200).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java index 3d68461d..700548b3 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -930,7 +930,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList Toolbar toolbar=getToolbar(); if(canGoBack()){ - Drawable back=getToolbarContext().getDrawable(R.drawable.ic_arrow_back).mutate(); + Drawable back=getToolbarContext().getDrawable(me.grishka.appkit.R.drawable.ic_arrow_back).mutate(); back.setTint(UiUtils.getThemeColor(getToolbarContext(), R.attr.colorM3OnSurfaceVariant)); toolbar.setNavigationIcon(back); toolbar.setNavigationContentDescription(0); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverFragment.java index cb53a04e..a1934c14 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverFragment.java @@ -180,7 +180,7 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop, searchBack.setImportantForAccessibility(searchActive ? View.IMPORTANT_FOR_ACCESSIBILITY_YES : View.IMPORTANT_FOR_ACCESSIBILITY_NO); searchBack.setOnClickListener(v->exitSearch()); if(searchActive){ - searchBack.setImageResource(R.drawable.ic_arrow_back); + searchBack.setImageResource(me.grishka.appkit.R.drawable.ic_arrow_back); pager.setVisibility(View.GONE); tabLayout.setVisibility(View.GONE); searchView.setVisibility(View.VISIBLE); @@ -228,7 +228,7 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop, pager.setVisibility(View.GONE); tabLayout.setVisibility(View.GONE); searchView.setVisibility(View.VISIBLE); - searchBack.setImageResource(R.drawable.ic_arrow_back); + searchBack.setImageResource(me.grishka.appkit.R.drawable.ic_arrow_back); searchBack.setEnabled(true); searchBack.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); tabsDivider.setVisibility(View.GONE); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchQueryFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchQueryFragment.java index 2712ee97..3ff7fc79 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchQueryFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchQueryFragment.java @@ -166,7 +166,7 @@ public class SearchQueryFragment extends MastodonRecyclerFragmentdropdownController.popSubmenuController()); backItem.setAccessibilityDelegate(new View.AccessibilityDelegate(){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/views/ReorderableLinearLayout.java b/mastodon/src/main/java/org/joinmastodon/android/ui/views/ReorderableLinearLayout.java index 4c071f60..46c33d66 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/views/ReorderableLinearLayout.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/views/ReorderableLinearLayout.java @@ -284,7 +284,7 @@ public class ReorderableLinearLayout extends LinearLayout implements CustomViewH private int getMaxDragScroll(){ if(cachedMaxScrollSpeed==-1){ - cachedMaxScrollSpeed=getResources().getDimensionPixelSize(R.dimen.item_touch_helper_max_drag_scroll_per_frame); + cachedMaxScrollSpeed=getResources().getDimensionPixelSize(me.grishka.appkit.R.dimen.item_touch_helper_max_drag_scroll_per_frame); } return cachedMaxScrollSpeed; }