{"id":13644746,"url":"https://github.com/stephentuso/welcome-android","last_synced_at":"2025-04-08T00:38:53.974Z","repository":{"id":67753482,"uuid":"47442408","full_name":"stephentuso/welcome-android","owner":"stephentuso","description":"A customizable welcome screen","archived":false,"fork":false,"pushed_at":"2022-12-17T06:56:32.000Z","size":6926,"stargazers_count":1760,"open_issues_count":9,"forks_count":279,"subscribers_count":41,"default_branch":"master","last_synced_at":"2025-03-31T23:36:31.898Z","etag":null,"topics":["android-library","android-ui"],"latest_commit_sha":null,"homepage":"https://stephentuso.github.io/welcome-android/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stephentuso.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2015-12-05T04:34:06.000Z","updated_at":"2025-02-13T04:28:09.000Z","dependencies_parsed_at":"2023-06-05T03:15:50.326Z","dependency_job_id":null,"html_url":"https://github.com/stephentuso/welcome-android","commit_stats":null,"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephentuso%2Fwelcome-android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephentuso%2Fwelcome-android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephentuso%2Fwelcome-android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephentuso%2Fwelcome-android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stephentuso","download_url":"https://codeload.github.com/stephentuso/welcome-android/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247755560,"owners_count":20990620,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android-library","android-ui"],"created_at":"2024-08-02T01:02:12.146Z","updated_at":"2025-04-08T00:38:53.949Z","avatar_url":"https://github.com/stephentuso.png","language":"Java","funding_links":[],"categories":["启动页","Libs"],"sub_categories":["\u003cA NAME=\"Component\"\u003e\u003c/A\u003eComponent"],"readme":"Welcome\n=======\n\n[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-Welcome-blue.svg?style=flat)](http://android-arsenal.com/details/1/3610) [![Download](https://api.bintray.com/packages/stephentuso/maven/welcome/images/download.svg)](https://bintray.com/stephentuso/maven/welcome/_latestVersion) [![Build Status](https://travis-ci.org/stephentuso/welcome-android.svg?branch=master)](https://travis-ci.org/stephentuso/welcome-android) [![codecov](https://codecov.io/gh/stephentuso/welcome-android/branch/master/graph/badge.svg)](https://codecov.io/gh/stephentuso/welcome-android) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/f88fea4256a24130959e16d5c30578ce)](https://www.codacy.com/app/tusodev/welcome-android?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=stephentuso/welcome-android\u0026amp;utm_campaign=Badge_Grade)\n\nAn easy to use and customizable welcome screen for Android apps.\n\n![Sample video](https://raw.githubusercontent.com/stephentuso/welcome-android/master/media/sample-video.gif)\n\nLook in the [sample](https://github.com/stephentuso/welcome-android/blob/master/sample/src/main/java/com/stephentuso/welcomeexample/SampleWelcomeActivity.java) to see how the above welcome screen is created.\n\n**Features**\n\n-\tFully customizable\n-\tRTL support\n-\tAbility to use built in layouts or custom fragments\n-\tBuilt in layouts support all screen sizes and orientations\n\nPlease open a new [issue](https://github.com/stephentuso/welcome-android/issues) if you find a bug or have a problem.\n\n[Javadoc](http://stephentuso.github.io/welcome-android/javadoc/)\n\n[Changelog/Releases](https://github.com/stephentuso/welcome-android/releases)\n\n**Major Changes in 1.0.0**\n\nIf you used the library prior to version 1.0, read [1.0.0.md](https://github.com/stephentuso/welcome-android/blob/master/1.0.0.md) for details on all breaking changes.\n\nDemo\n====\n\nA demo app is available on Google play:\n\n\u003ca href='https://play.google.com/store/apps/details?id=com.stephentuso.welcomeexample\u0026utm_source=global_co\u0026utm_medium=prtnr\u0026utm_content=Mar2515\u0026utm_campaign=PartBadge\u0026pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'\u003e\u003cimg width='240' alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png'/\u003e\u003c/a\u003e\n\nThe source code is in the [sample module](https://github.com/stephentuso/welcome-android/blob/master/sample/src/main/).\n\nContributing\n============\n\nFeel free to open a PR to add a feature or fix a bug, all contributions are welcome. Please read the [contribution notes](https://github.com/stephentuso/welcome-android/CONTRIBUTING.md).\n\nAll development takes place on the [dev branch](https://github.com/stephentuso/welcome-android/tree/dev).\n\nTable of Contents\n=================\n\n-\t[Adding to your project](#adding-to-your-project)\n-\t[Basic Usage](#basic-usage)\n\t-\t[Extend WelcomeActivity](#extend-welcomeactivity)\n\t-\t[Show the welcome screen](#show-the-welcome-screen)\n-\t[Skipping/Back button behavior](#skippingback-button-behavior)\n-\t[Included pages](#included-pages)\n\t-\t[TitlePage](#titlepage)\n\t-\t[BasicPage](#basicpage)\n\t-\t[ParallaxPage](#parallaxpage)\n\t-\t[FullscreenParallaxPage](#fullscreenparallaxpage)\n-\t[Custom pages](#custom-pages)\n\t-\t[Custom Done Button](#custom-done-button)\n-\t[Bottom Layouts](#bottom-layouts)\n\t-\t[STANDARD](#standard)\n\t-\t[STANDARD_DONE_IMAGE](#standard_done_image)\n\t-\t[BUTTON_BAR](#button_bar)\n\t-\t[BUTTON_BAR_SINGLE](#button_bar_single)\n\t-\t[INDICATOR_ONLY](#indicator_only)\n\t-\t[NONE](#none)\n-\t[Styling](#styling)\n\t-\t[Themes](#themes)\n\t-\t[Styles](#styles)\n-\t[Welcome screen keys](#welcome-screen-keys)\n-\t[Results](#results)\n-\t[Animations](#animations)\n-\t[License](#license)\n\nAdding to your project\n======================\n\nThis library is available through jCenter.\n\nGradle:\n\n```groovy\ncompile 'com.stephentuso:welcome:1.4.1'\n```\n\nIf you use proguard, add the following to your proguard rules\n\n```\n-keepclassmembers class * extends com.stephentuso.welcome.WelcomeActivity {\n    public static java.lang.String welcomeKey();\n}\n```\n\nBasic Usage\n===========\n\nExtend WelcomeActivity\n----------------------\n\nTo create a welcome screen, add a class to your project that extends `WelcomeActivity` and add it to AndroidManifest:\n\n```xml\n\u003cactivity android:name=\".MyWelcomeActivity\"\n    android:theme=\"@style/WelcomeScreenTheme\"/\u003e\n```\n\n*The theme must be a child theme of WelcomeScreenTheme*\n\nOverride the Activity's `configuration()` method. Use `WelcomeConfiguration.Builder` to set it up:\n\n```java\n@Override\nprotected WelcomeConfiguration configuration() {\n    return new WelcomeConfiguration.Builder(this)\n            .defaultBackgroundColor(R.color.background)\n\t\t\t.page(new TitlePage(R.drawable.logo,\n\t\t\t\t\t\"Title\")\n\t\t\t)\n\t\t\t.page(new BasicPage(R.drawable.image,\n\t\t\t\t\t\"Header\",\n\t\t\t\t\t\"More text.\")\n\t\t\t\t\t.background(R.color.red_background)\n\t\t\t)\n\t\t\t.page(new BasicPage(R.drawable.image,\n\t\t\t\t\t\"Lorem ipsum\",\n\t\t\t\t\t\"dolor sit amet.\")\n\t\t\t)\n            .swipeToDismiss(true)\n            .build();\n}\n```\n\nYou do not need to override `onCreate` or call `setContentView`.\n\n*Note: For now, defaultBackgroundColor() needs to be called before adding pages.*\n\nShow the welcome screen\n-----------------------\n\nWelcome screens are started with `WelcomeHelper`. `onSaveInstanceState` is needed to be sure only one instance of the welcome screen is started. Add the following to the Activity you want to show the welcome screen before (probably your launcher activity):\n\n```java\nWelcomeHelper welcomeScreen;\n\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    ...\n    welcomeScreen = new WelcomeHelper(this, MyWelcomeActivity.class);\n    welcomeScreen.show(savedInstanceState);\n    ...\n}\n\n@Override\nprotected void onSaveInstanceState(Bundle outState) {\n    super.onSaveInstanceState(outState);\n    welcomeScreen.onSaveInstanceState(outState);\n}\n```\n\nIf you have issues with the buttons/indicator being covered by the nav bar, use one of the .SolidNavigation welcome screen themes.\n\nTo force the welcome screen to be shown, for example, to let the user view it again when a button is pressed, create a `WelcomeHelper` as shown above and call `.forceShow()`.\n\nSkipping/Back button behavior\n=============================\n\nBy default, the welcome screen can be skipped, and pressing the back button will navigate to the previous page or close (skip) the welcome screen if on the first page. This can be changed with `Builder.canSkip()`, `backButtonSkips()` (only applies if `canSkip` is true), and `backButtonNavigatesPages()`. If you disable skipping, the welcome screen will not be stored as completed when it closes.\n\nIf you want to require users to navigate through the welcome screen before using the app, call `canSkip(false)` and close your app if the welcome screen's result is `RESULT_CANCELED`.\n\nSee [Results](https://github.com/stephentuso/welcome-android#results) below for how to respond if a welcome screen is canceled.\n\nIncluded pages\n==============\n\nThe classes listed below are subclasses of `WelcomePage` and can be used with the `page` method of `WelcomeConfiguration.Builder`\n\nTitlePage\n---------\n\nA page with an image and a title. A parallax effect can be applied to the image.\n\nConstructor:\n\n```java\nTitlePage(@DrawableRes int drawableResId, String title)\n```\n\nBasicPage\n---------\n\nA page with an image, heading, and description. A parallax effect can be applied to the image.\n\nConstructor:\n\n```java\nBasicPage(@DrawableRes int drawableResId, String title, String description)\n```\n\nParallaxPage\n------------\n\nSimilar to the basic page, but instead of an image you can supply a layout that will have a parallax effect applied to it. The speed at which the layout's children move is determined by their position in the layout, the first will move the slowest and the last will move the fastest.\n\nConstructor:\n\n```java\nParallaxPage(@LayoutRes int layoutResId, String title, String description)\n```\n\nFullscreenParallaxPage\n----------------------\n\nApplies a parallax effect in the same way the normal parallax page does, but the layout you provide fills the whole fragment, and there isn't a header or description.\n\nConstructor:\n\n```java\nFullscreenParallaxPage(@LayoutRes int layoutResId)\n```\n\nCustom pages\n============\n\nYou can add your own fragments to the welcome screen with `FragmentWelcomePage`:\n\n```java\n@Override\nprotected WelcomeConfiguration configuration() {\n    return new WelcomeConfiguration.Builder(this)\n            ...\n            .page(new FragmentWelcomePage() {\n                    @Override\n                    protected Fragment fragment() {\n                        return new ExampleFragment();\n                    }\n                }.background(R.color.red_background))\n            ...\n}\n```\n\nSee [animations](https://github.com/stephentuso/welcome-android#animations) below for adding animations to custom fragments.\n\n### Custom Done Button\n\nIf you want to use a button in a custom fragment instead of the default done button, call `useCustomDoneButton(true)` on the builder and `new WelcomeFinisher(MyFragment.this).finish()` in the button's `OnClickListener`.\n\nBottom Layouts\n==============\n\nThe layout shown beneath the pages can be changed with the `bottomLayout` Builder method, which uses the `WelcomeConfiguration.BottomLayout` enum. The possible values are explained below.\n\n### `STANDARD`\n\nThe default layout, can have skip/previous buttons, the current page indicator, and next/done buttons.\n\n### `STANDARD_DONE_IMAGE`\n\nSame as `STANDARD`, but the done button is an `ImageButton` rather than a `Button`. Uses a check mark as the image by default (that can be changed with styles).\n\n### `BUTTON_BAR`\n\nHas two buttons side by side at the bottom with the current page indicator above them. By default the text is \"Log In\" and \"Sign Up\", but can be changed with styles. In your `WelcomeActivity` subclass, override `onButtonBarFirstPressed` and `onButtonBarSecondPressed` to handle clicks. More documentation will be added later, see `ButtonBarWelcomeActivity` in the sample for an example.\n\n### `BUTTON_BAR_SINGLE`\n\nSame as `BUTTON_BAR`, but with just one button (uses `onButtonBarFirstPressed` for clicks).\n\n### `INDICATOR_ONLY`\n\nJust the current page indicator, no buttons.\n\n### `NONE`\n\nNo layout; no buttons, no indicator\n\nStyling\n=======\n\nThemes\n------\n\nThe provided themes are listed below.\n\nTransparent status/navigation on API 19+. Content does not flow under status bar:\n\n-\t`WelcomeSceenTheme` - The default theme. For use with dark backgrounds; the text, indicator, and buttons are light colored.\n-\t`WelcomeScreenTheme.Light` - For use with light backgrounds; the text, indicator, and buttons are dark colored.\n\nTransparent status bar, solid navigation bar on API 19+. Content does not flow under status bar:\n\n-\t`WelcomeScreenTheme.SolidNavigation`\n-\t`WelcomeScreenTheme.Light.SolidNavigation`\n\nTransparent status bar, solid navigation bar on API 19+. Content flows under status bar:\n\n-\t`WelcomeScreenTheme.SolidNavigation.UnderStatusBar`\n-\t`WelcomeScreenTheme.Light.SolidNavigation.UnderStatusBar`\n\nStyles\n------\n\nTypefaces and a few other things (animations, button visibility) have to be set with `WelcomeConfiguration.Builder`, but everything else that is customizable can be changed with styles.\n\nYou can add styles as shown below. Optional items are in square brackets.\n\n```xml\n\u003cstyle name=\"CustomWelcomeScreenTheme\" parent=\"SEE THEMES ABOVE\"\u003e\n\n    \u003c!---- TEXT STYLES ----\u003e\n\n    \u003c!-- Color of button text and titles/headings (in built in fragments)\n        By default, this is also the color of the done/next button --\u003e\n    \u003citem name=\"android:textColorPrimary\"\u003ecolor\u003c/item\u003e\n\n    \u003c!-- Color of other text\n        By default, this is used for the skip button text color --\u003e\n    \u003citem name=\"android:textColorSecondary\"\u003ecolor\u003c/item\u003e\n\n    \u003c!-- Descriptions/other text --\u003e\n    \u003citem name=\"welcomeNormalTextStyle\"\u003e@style/MyNormalText\u003c/item\u003e\n    \u003c!-- Headings --\u003e\n    \u003citem name=\"welcomeLargeTextStyle\"\u003e@style/MyLargeText\u003c/item\u003e\n    \u003c!-- Titles --\u003e\n    \u003citem name=\"welcomeTitleTextStyle\"\u003e@style/MyTitleText\u003c/item\u003e\n\n\n    \u003c!---- BUTTON STYLES ----\u003e\n\n    \u003c!-- Background is applied to all buttons,\n        to change a specific button background use the individual button styles --\u003e\n    \u003citem name=\"welcomeButtonBackground\"\u003edrawable\u003c/item\u003e\n\n    \u003c!-- Done/skip button text --\u003e\n    \u003citem name=\"welcomeButtonSkipText\"\u003estring\u003c/item\u003e\n    \u003citem name=\"welcomeButtonDoneText\"\u003estring\u003c/item\u003e\n\n    \u003c!-- Button styles for STANDARD and STANDARD_DONE_IMAGE --\u003e\n    \u003citem name=\"welcomeButtonSkipStyle\"\u003e@style/MyButtonSkip\u003c/item\u003e\n    \u003citem name=\"welcomeButtonNextStyle\"\u003e@style/MyButtonNext\u003c/item\u003e\n    \u003citem name=\"welcomeButtonDoneStyle\"\u003e@style/MyButtonDone\u003c/item\u003e\n\n    \u003c!-- Button styles for BUTTON_BAR --\u003e\n    \u003citem name=\"welcomeButtonBarFirstStyle\"\u003e@style/MyButtonFirst\u003c/item\u003e\n    \u003citem name=\"welcomeButtonBarSecondStyle\"\u003e@style/MyButtonSecond\u003c/item\u003e\n\n\n    \u003c!---- OTHER STYLES ----\u003e\n\n    \u003c!-- Current page indicator --\u003e\n    \u003citem name=\"welcomeIndicatorStyle\"\u003e@style/MyWelcomeIndicator\u003c/item\u003e\n\n    \u003c!-- Divider between bottom layout and pages --\u003e\n    \u003citem name=\"welcomeDividerStyle\"\u003e@style/MyWelcomeScreenDivider\u003c/item\u003e\n\n    \u003c!-- The drawable or color to fade to if swipeToDismiss is enabled --\u003e\n    \u003citem name=\"android:windowBackground\"\u003edrawable|color\u003c/item\u003e\n\n    \u003c!-- Add the following if you want to show the action bar.\n        Use Builder.showActionBarBackButton(true) to show\n        the back button. --\u003e\n    \u003citem name=\"windowActionBar\"\u003etrue\u003c/item\u003e\n    \u003citem name=\"windowNoTitle\"\u003efalse\u003c/item\u003e\n\u003c/style\u003e\n\n\u003cstyle name=\"MyWelcomeIndicator\" parent=\"WelcomeScreenPageIndicator[.Light]\"\u003e\n    \u003citem name=\"indicatorColor\"\u003ecolor\u003c/item\u003e\n    \u003citem name=\"currentPageColor\"\u003ecolor\u003c/item\u003e\n    \u003citem name=\"animation\"\u003efade|slide|none\u003c/item\u003e\n\u003c/style\u003e\n\n\u003c!-- Use this to change the next button's image/color\n    To support RTL, add this in values-ldrtl/styles with an image facing left --\u003e\n\u003cstyle name=\"MyButtonNext\" parent=\"WelcomeScreenButton.Next\"\u003e\n    \u003citem name=\"android:src\"\u003edrawable\u003c/item\u003e\n    \u003citem name=\"android:tint\"\u003ecolor\u003c/item\u003e\n\u003c/style\u003e\n\n\u003cstyle name=\"MyButtonSkip\" parent=\"WelcomeScreenButton.Skip\"\u003e\n    \u003citem name=\"android:textColor\"\u003ecolor\u003c/item\u003e\n\u003c/style\u003e\n\n\u003cstyle name=\"MyButtonDone\" parent=\"WelcomeScreenButton.Done\"\u003e\n    \u003c!-- If using BottomLayuout.STANDARD --\u003e\n    \u003citem name=\"android:textColor\"\u003ecolor\u003c/item\u003e\n    \u003c!-- If using BottomLayout.STANDARD_DONE_IMAGE --\u003e\n    \u003citem name=\"android:tint\"\u003ecolor\u003c/item\u003e\n    \u003citem name=\"android:src\"\u003edrawable\u003c/item\u003e\n\u003c/style\u003e\n\n\u003c!-- A divider that is directly above the buttons/indicator.\nThe background color is transparent by default --\u003e\n\u003cstyle name=\"MyWelcomeScreenDivider\" parent=\"WelcomeScreenDivider[.Dark|.Light]\"\u003e\n    \u003citem name=\"android:background\"\u003edrawable|color\u003c/item\u003e\n    \u003citem name=\"android:layout_height\"\u003edimen\u003c/item\u003e\n\u003c/style\u003e\n\n\u003c!-- The following can apply to any of the three text styles --\u003e\n\u003cstyle name=\"MyText\" parent=\"WelcomeScreenText[.Large|.Title][.Centered]\"\u003e\n    \u003c!-- Add any properties that can be applied to a TextView --\u003e\n\u003c/style\u003e\n\n```\n\nWelcome screen keys\n===================\n\nIf you want to use multiple welcome screens (in different parts of your app) or have updated one and want to show it again, you can assign keys (Make sure they are unique!) to welcome screens by adding the following to your welcome screen Activity.\n\n```java\npublic static String welcomeKey() {\n    return \"Your unique key\";\n}\n```\n\n**Note:** Only change this to a new value if you want everyone who has already used your app to see the welcome screen again! This key is used to determine whether or not to show the welcome screen.\n\nResults\n=======\n\nYou can listen for the result of a welcome screen in the Activity that started it by overriding `onActivityResult`:\n\n```java\n@Override\nprotected void onActivityResult(int requestCode, int resultCode, Intent data) {\n    super.onActivityResult(requestCode, resultCode, data);\n\n\n    if (requestCode == WelcomeHelper.DEFAULT_WELCOME_SCREEN_REQUEST) {\n        // The key of the welcome screen is in the Intent\n        String welcomeKey = data.getStringExtra(WelcomeActivity.WELCOME_SCREEN_KEY);\n\n        if (resultCode == RESULT_OK) {\n            // Code here will run if the welcome screen was completed\n        } else {\n            // Code here will run if the welcome screen was canceled\n            // In most cases you'll want to call finish() here\n        }\n\n    }\n\n}\n```\n\nOne use for this is making sure users see the whole welcome screen before using your app - disable skipping and then close your main activity when the welcome screen is canceled.\n\nAnimations\n==========\n\nAnimations that play as pages are scrolled can be added to your custom fragments by implementing [WelcomePage.OnChangeListener](http://stephentuso.github.io/welcome-android/javadoc/com/stephentuso/welcome/WelcomePage.OnChangeListener.html). As an example, a fade effect is shown below.\n\n```java\n@Override\npublic void onScrolled(int pageIndex, float offset, int offsetPixels) {\n    if (Build.VERSION.SDK_INT \u003e= 11 \u0026\u0026 imageView != null) {\n        imageView.setAlpha(1-Math.abs(offset));\n    }\n}\n```\n\nTo add parallax effects similar to the included parallax page, use [WelcomeUtils.applyParallaxEffect()](http://stephentuso.github.io/welcome-android/javadoc/index.html?overview-summary.html) in `onScrolled`. For example:\n\n```java\n@Override\npublic void onScrolled(int pageIndex, float offset, int offsetPixels) {\n    if (parallaxLayout != null)\n        WelcomeUtils.applyParallaxEffect(parallaxLayout, false, offsetPixels, 0.3f, 0.2f);\n}\n```\n\nLicense\n=======\n\n```\nCopyright 2015-2017 Stephen Tuso\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstephentuso%2Fwelcome-android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstephentuso%2Fwelcome-android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstephentuso%2Fwelcome-android/lists"}