Make a cool intro for your Android app.

Overview

AppIntro

Join the chat at https://kotlinlang.slack.com Pre Merge Checks Android Arsenal Awesome Kotlin Badge

AppIntro is an Android Library that helps you build a cool carousel intro for your App. AppIntro has support for requesting permissions and helps you create a great onboarding experience in just a couple of minutes.

appintro icon appintro sample

Getting Started ๐Ÿ‘ฃ

AppIntro is distributed through JitPack.

Adding a dependency

To use it you need to add the following gradle dependency to your build.gradle file of the module where you want to use AppIntro (NOT the root file).

repositories {
    maven { url "https://jitpack.io" }
}
dependencies {
    // AndroidX Capable version
    implementation 'com.github.AppIntro:AppIntro:6.1.0'
    
    // *** OR ***
    
    // Latest version compatible with the old Support Library
    implementation 'com.github.AppIntro:AppIntro:4.2.3'
}

Please note that since AppIntro 5.x, the library supports Android X. If you haven't migrated yet, you probably want to use a previous version of the library that uses the old Support Library packages (or try Jetifier Reverse mode).

Basic usage

To use AppIntro, you simply have to create a new Activity that extends AppIntro like the following:

class MyCustomAppIntro : AppIntro() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Make sure you don't call setContentView!

        // Call addSlide passing your Fragments.
        // You can use AppIntroFragment to use a pre-built fragment
        addSlide(AppIntroFragment.newInstance(
                title = "Welcome...",
                description = "This is the first slide of the example"
        ))
        addSlide(AppIntroFragment.newInstance(
                title = "...Let's get started!",
                description = "This is the last slide, I won't annoy you more :)"
        ))
    }

    override fun onSkipPressed(currentFragment: Fragment?) {
        super.onSkipPressed(currentFragment)
        // Decide what to do when the user clicks on "Skip"
        finish()
    }

    override fun onDonePressed(currentFragment: Fragment?) {
        super.onDonePressed(currentFragment)
        // Decide what to do when the user clicks on "Done"
        finish()
    }
}

Please note that you must NOT call setContentView. The AppIntro superclass is taking care of it for you.

Finally, declare the activity in your Manifest like so:

<activity android:name="com.example.MyCustomAppIntro"
    android:label="My Custom AppIntro" />

We suggest to don't declare MyCustomAppIntro as your first Activity unless you want the intro to launch every time your app starts. Ideally you should show the AppIntro activity only once to the user, and you should hide it once completed (you can use a flag in the SharedPreferences).

Migrating ๐Ÿš—

If you're migrating from AppIntro v5.x to v6.x, please expect multiple breaking changes. You can find documentation on how to update your code on this other migration guide.

Features ๐Ÿงฐ

Don't forget to check the changelog to have a look at all the changes in the latest version of AppIntro.

  • API >= 14 compatible.
  • 100% Kotlin Library.
  • AndroidX Compatible.
  • Support for runtime permissions.
  • Dependent only on AndroidX AppCompat/Annotations, ConstraintLayout and Kotlin JDK.
  • Full RTL support.

Creating Slides ๐Ÿ‘ฉโ€๐ŸŽจ

The entry point to add a new slide is the addSlide(fragment: Fragment) function on the AppIntro class. You can easily use it to add a new Fragment to the carousel.

The library comes with several util classes to help you create your Slide with just a couple lines:

AppIntroFragment

You can use the AppIntroFragment if you just want to customize title, description, image and colors. That's the suggested approach if you want to create a quick intro:

addSlide(AppIntroFragment.newInstance(
    title = "The title of your slide",
    description = "A description that will be shown on the bottom",
    imageDrawable = R.drawable.the_central_icon,
    backgroundDrawable = R.drawable.the_background_image,
    titleColor = Color.YELLOW,
    descriptionColor = Color.RED,
    backgroundColor = Color.BLUE,
    titleTypefaceFontRes = R.font.opensans_regular,
    descriptionTypefaceFontRes = R.font.opensans_regular,
))

All the parameters are optional, so you're free to customize your slide as you wish.

If you need to programmatically create several slides you can also use the SliderPage class. This class can be passed to AppIntroFragment.newInstance(sliderPage: SliderPage) that will create a new slide starting from that instance.

AppIntroCustomLayoutFragment

If you need further control on the customization of your slide, you can use the AppIntroCustomLayoutFragment. This will allow you pass your custom Layout Resource file:

AppIntroCustomLayoutFragment.newInstance(R.layout.intro_custom_layout1)

This allows you to achieve complex layout and include your custom logic in the Intro (see also Slide Policy):

appintro custom-layout

Configure ๐ŸŽจ

AppIntro offers several configuration option to help you customize your onboarding experience.

Slide Transformer

AppIntro comes with a set of Slide Transformer that you can use out of the box to animate your Slide transition.

Slide Transformers Slide Transformers
Fade
fade
Zoom
zoom
Flow
flow
Slide Over
slideover
Depth
depth
Parallax
parallax

You can simply call setTransformer() and pass one of the subclass of the sealed class AppIntroPageTransformerType:

setTransformer(AppIntroPageTransformerType.Fade)
setTransformer(AppIntroPageTransformerType.Zoom)
setTransformer(AppIntroPageTransformerType.Flow)
setTransformer(AppIntroPageTransformerType.SlideOver)
setTransformer(AppIntroPageTransformerType.Depth)

// You can customize your parallax parameters in the constructors. 
setTransformer(AppIntroPageTransformerType.Parallax(
                titleParallaxFactor = 1.0,
                imageParallaxFactor = -1.0,
                descriptionParallaxFactor = 2.0
))

Custom Slide Transformer

You can also provide your custom Slide Transformer (implementing the ViewPager.PageTransformer interface) with:

setCustomTransformer(ViewPager.PageTransformer)

Color Transition

appintro sample

AppIntro offers the possibility to animate the color transition between two slides background. This feature is disabled by default, and you need to enable it on your AppIntro with:

isColorTransitionsEnabled = true

Once you enable it, the color will be animated between slides with a gradient. Make sure you provide a backgroundColor parameter in your slides.

If you're providing custom Fragments, you can let them support the color transition by implementing the SlideBackgroundColorHolder interface.

Multiple Windows Layout

AppIntro is shipped with two top-level layouts that you can use. The default layout (AppIntro) has textual buttons, while the alternative layout has buttons with icons.

To change the Window layout, you can simply change your superclass to AppIntro2. The methods to add and customize the AppIntro are unchanged.

class MyCustomAppIntro : AppIntro2() {
    // Same code as displayed in the `Basic Usage` section of this README
}
Page AppIntro AppIntro2
standard page layout1-start layout2-start
last page layout1-end layout2-end

Indicators

AppIntro supports two indicators out of the box to show the progress of the Intro experience to the user:

  • DotIndicatorController represented with a list of Dot (the default)
  • ProgressIndicatorController represented with a progress bar.
DotIndicator ProgressIndicator
dotted indicator progress indicator

Moreover, you can supply your own indicator by providing an implementation of the IndicatorController interface.

You can customize the indicator with the following API on the AppIntro class:

// Toggle Indicator Visibility                
isIndicatorEnabled = true

// Change Indicator Color 
setIndicatorColor(
    selectedIndicatorColor = getColor(R.color.red),
    unselectedIndicatorColor = getColor(R.color.blue)
)

// Switch from Dotted Indicator to Progress Indicator
setProgressIndicator()

// Supply your custom `IndicatorController` implementation
indicatorController = MyCustomIndicator(/* initialize me */)

If you don't specify any customization, a DotIndicatorController will be shown.

Vibration

AppIntro supports providing haptic vibration feedback on button clicks. Please note that you need to specify the Vibration permission in your app Manifest (the library is not doing it). If you forget to specify the permission, the app will experience a crash.

<uses-permission android:name="android.permission.VIBRATE" />

You can enable and customize the vibration with:

// Enable vibration and set duration in ms
isVibrate = true
vibrateDuration = 50L

Wizard Mode

appintro wizard1 appintro wizard2

AppIntro supports a wizards mode where the Skip button will be replaced with the back arrow. This comes handy if you're presenting a Wizard to your user with a set of skip they need to do, and they might frequently go back and forth.

You can enable it with:

isWizardMode = true

Immersive Mode

appintro immersive1 appintro immersive2

If you want to display your Intro with a fullscreen experience, you can enable the Immersive mode. This will hide both the Status Bar and the Navigation bar and the user will have to scroll from the top of the screen to show them again.

This allows you to have more space for your Intro content and graphics.

You can enable it with:

setImmersiveMode()

System Back button

You can lock the System Back button if you don't want your user to go back from intro. This could be useful if you need to request permission and the Intro experience is not optional.

If this is the case, please set to true the following flag:

isSystemBackButtonLocked = true

System UI (Status Bar and Navigation Bar)

appintro system-ui

You can customize the Status Bar, and the Navigation Bar visibility & color with the following methods:

// Hide/Show the status Bar
showStatusBar(true)
// Control the status bar color
setStatusBarColor(Color.GREEN)
setStatusBarColorRes(R.color.green)

// Control the navigation bar color
setNavBarColor(Color.RED)
setNavBarColorRes(R.color.red)

Permission ๐Ÿ”’

appintro permissions

AppIntro simplifies the process of requesting runtime permissions to your user. You can integrate one or more permission request inside a slide with the askForPermissions method inside your activity.

Please note that:

  • slideNumber is in a One-based numbering (it starts from 1)
  • You can specify more than one permission if needed
  • You can specify if the permission is required. If so, users can't proceed if he denies the permission.
// Ask for required CAMERA permission on the second slide. 
askForPermissions(
    permissions = arrayOf(Manifest.permission.CAMERA),
    slideNumber = 2, 
    required = true)

// Ask for both optional ACCESS_FINE_LOCATION and WRITE_EXTERNAL_STORAGE
// permission on the third slide.
askForPermissions(
    permissions = arrayOf(
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    ),
    slideNumber = 3, 
    required = false)

Should you need further control on the permission request, you can override those two methods on the AppIntro class:

override fun onUserDeniedPermission(permissionName: String) {
    // User pressed "Deny" on the permission dialog
}
override fun onUserDisabledPermission(permissionName: String) {
    // User pressed "Deny" + "Don't ask again" on the permission dialog
}

Slide Policy

If you want to restrict navigation between your slides (i.e. the user has to toggle a checkbox in order to continue), the SlidePolicy feature might help you.

All you have to do is implement SlidePolicy in your slides.

This interface contains the isPolicyRespected property and the onUserIllegallyRequestedNextPage method that you must implement with your custom logic

class MyFragment : Fragment(), SlidePolicy {
    
    // If user should be allowed to leave this slide
    override val isPolicyRespected: Boolean
        get() = false // Your custom logic here.

    override fun onUserIllegallyRequestedNextPage() {
        // User illegally requested next slide.
        // Show a toast or an informative message to the user.
    }
}

You can find a full working example of SlidePolicy in the example app - CustomSlidePolicyFragment.kt

Example App ๐Ÿ’ก

AppIntro comes with a sample app full of examples and use case that you can use as inspiration for your project. You can find it inside the /example folder.

You can get a debug APK of the sample app from the Pre Merge Github Actions job as an output artifact here.

appintro sample app

Translating ๐ŸŒ

Do you want to help AppIntro becoming international ๐ŸŒ ? We are more than happy! AppIntro currently supports the following languages.

To add a new translation just add a pull request with a new strings.xml file inside a values-xx folder (where xx is a two-letter ISO 639-1 language code).

In order to provide the translation, your file needs to contain the following strings:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
    <string name="app_intro_skip_button">[Translation for SKIP]</string>
    <string name="app_intro_next_button">[Translation for NEXT]</string>
    <string name="app_intro_back_button">[Translation for BACK]</string>
    <string name="app_intro_done_button">[Translation for DONE]</string>
    <string name="app_intro_image_content_description">[Translation for "graphics"]</string>
</resources>

An updated version of the English version translation is available here.

If a translation in your language is already available, please check it and eventually fix it (all the strings should be listed, not just a subset).

Snapshots ๐Ÿ“ฆ

Development of AppIntro happens on the master branch. You can get SNAPSHOT versions directly from JitPack if needed.

repositories {
    maven { url "https://jitpack.io" }
}
dependencies {
  implementation "com.github.AppIntro:AppIntro:master-SNAPSHOT"
}

โš ๏ธ Please note that the latest snapshot might be unstable. Use it at your own risk โš ๏ธ

Contributing ๐Ÿค

We're offering support for AppIntro on the #appintro channel on KotlinLang Slack. Come and join the conversation over there. If you don't have access to KotlinLang Slack, you can request access here.

We're looking for contributors! Don't be shy. ๐Ÿ‘ Feel free to open issues/pull requests to help me improve this project.

  • When reporting a new Issue, make sure to attach Screenshots, Videos or GIFs of the problem you are reporting.
  • When submitting a new PR, make sure tests are all green. Write new tests if necessary.

Acknowledgments ๐ŸŒธ

Maintainers

AppIntro is currently developed and maintained by the AppIntro Github Org. When submitting a new PR, please ping one of:

Libraries

AppIntro is not relying on any third party library other than those from AndroidX:

  • androidx.appcompat:appcompat
  • androidx.annotation:annotation
  • androidx.constraintlayout:constraintlayout

License ๐Ÿ“„

    Copyright (C) 2015-2020 AppIntro Developers

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

Apps using AppIntro ๐Ÿ“ฑ

If you are using AppIntro in your app and would like to be listed here, please open a pull request and we will be more than happy to include you:

List of Apps using AppIntro
Issues
  • Add My App Requests -- that's you, come in here~

    Add My App Requests -- that's you, come in here~

    Would you like your app added to our application list?

    Then reply with the following [note the format]:

    App Name: Sample App Link: https://play.google.com/store/apps/details?id=paolorotolo.github.com.appintroexample

    Replace the above url with your application link!! Your Google Play listing must be publicly accessible -- please note in your comment if it is not!

    For those that want to know if I got your request; you'll find this ๐Ÿ‘ when I see it, and then this ๐ŸŽ‰ when it has been added by me~

    Please refrain from using ๐Ÿ‘ or ๐ŸŽ‰ on your own posts for this issue.

    support 
    opened by avluis 100
  • Logo Proposal

    Logo Proposal

    Hello! I find this project very interesting and I'd love to contribute to it by designing a logo. Let me know if you'd want that too and if you have anything specifically imagined for your logo, if not I'll just implement my own ideas :) looking forward to hearing from you!

    opened by newfinal100 55
  • Adding custom typeface feature & wizard development mode

    Adding custom typeface feature & wizard development mode

    This is pull request to add two new features

    1. Making a setup wizard.
    2. Adding support of custom typefaces to title, description, skip button text, done button text.

    Changelog :-

    1. Adding custom typeface feature in default AppIntro & AppIntro2
    2. Adding a static cache for Typefaces to prevent memory leaks due to Typefaces. The developers can just provide the URLs of font files in Assets folder.
    3. Adding Wizard Mode to create setup wizards instead of intros.

    Adding new methods

    //Set custom typeface to both title & description
    AppIntroFragment.newInstance("Title 1","OpenSans-Light.ttf","Description 1","OpenSans-Light.ttf",R.mipmap.ic_launcher, Color.parseColor("#3498db"));
    
    //Setting custom typeface to either title or description
    //To title only
    AppIntroFragment.newInstance("Title 1",getResources().getString(R.string.title_font),"Description 1",null,R.mipmap.ic_launcher, Color.parseColor("#3498db"));
    
    //To description
    AppIntroFragment.newInstance("Title 1",null,"Description 1",getResources().getString(R.string.title_font),R.mipmap.ic_launcher, Color.parseColor("#3498db"));
    
    //To enable Wizard mode
    setWizardMode(true); 
    
    //To set custom typeface to Skip button text.
    setSkipTextTypeface("OpenSans-Light.ttf"); // URL of font files in Assets folder.
    
    //To set custom typeface to Done button text.
    setDoneTextTypeface("OpenSans-Light.ttf"); // URL of font files in Assets folder.
    
    //show/hide backbutton on arriving at last fragment
    setBackButtonVisibilityWithDone(true); //false to hide
    
    

    Example:

    Example Image

    opened by ameykshirsagar 46
  • Unable to swipe between slides

    Unable to swipe between slides

    AppIntro Version: 4.1.0

    Device/Android Version: every device I have tried (e.g. Samsung Galaxy S5mini, LG H440N, any in emulator)

    Issue details / Repro steps / Use case background: In intro with permissions it is necessary to use e.g. android.Manifest.permission.ACCESS_FINE_LOCATION instead of Manifest.permission.ACCESS_FINE_LOCATION

    But adding android causes that I can't swipe between slides. When android is removed, i can swipe but than it can't resolve symbol ACCESS_FINE_LOCATION.

    This bad behavior is also in example project AppIntroExample on Google Play.

    bug 
    opened by romancampula 34
  • Complete UI Overhaul

    Complete UI Overhaul

    Features of this PR

    1. Rework and Resizing of Buttons to match Material Design FAB guidelines
    2. Updated Icons
    3. Added Tooltiptext attribute
    4. Removed a lot of hardcoded dimens/colors and converted into @ resource
    5. removed app_intro_fragment2 as it is basically the same file as app_intro_fragment1
    6. Merge fragment_content and fragment intro
    7. Removed unused dimens
    8. Added New Colors
    9. Modified the default dimensions of the dot indicator to look much better

    And the most important 10.Switched layouts to ConstraintLayout

    Update # 1:

    Added AppIntroStyle in styles.xml: The default style of appintro

    1. Switched every layout to full ConstraintLayout only.
    2. Removed Unused AppIntro2Fragment class
    3. Changed the setbackgroundimage method of AppIntro2 (Breaking Change)(Method still under development)
    4. Added a landscape version of appintro_fragment
    5. Major Refactoring and addition/removal of resources.
    6. Removal of more hardcoded values.
    7. The UI is smoother than before.(With less GPU overdraw)
    8. Removed overScrollAnimation as it does not look good for an Intro
    9. Removed Heading resource from values-v21 as for one single attribute (font family) we required a copy of it.(Pending replacement)

    Update 2

    1. Added a method to set background drawable to the fragment layout.
    2. Removed tooltiptext attribute and added the tooltiptextcompat to support tooltip from API level 14.
    3. Made Viewpager full-screen

    Suggestions are welcome (and required). Things currently broken:

    1. The ProgressBarIndicator in RTL mode.( Please tell me how to fix it)
    2. ~~For some reason setting the layer-list containing vector drawables causes ResourcenotfoundException on older api levels(Tested on API 19 but may apply to others). So we need to programmatically set the values. I am working on it and will update the PR when it is finished.~~ Fixed

    I will be adding support for tablets with another PR after this gets merged successfully [The values for the sizes of buttons were decided after a lot of trial and error on different devices]

    Updated

    Before screenshot_2019-02-25-22-26-08-175_com amqtech opensource appintroexample

    After screenshot_2019-03-03-17-32-58-367_com amqtech opensource appintroexample

    A Preview of the new landscape layout Landscape

    enhancement 
    opened by AnuthaDev 29
  • Would like adjustable font sizes for title and description

    Would like adjustable font sizes for title and description

    AppIntro Version: 4.2.0

    Device/Android Version: Pixel API 25

    Issue details / Repro steps / Use case background: I am trying to customize the description (and title) text so that I can change the font size.

    Your Code:

        // Code from OnCreate Method where we use your your default slide (AppIntroFragment)
    
        frag1 = AppIntroFragment.newInstance("Welcome.", "fonts/bello-pro.ttf", firstText, "fonts/bello-pro.ttf", R.drawable.intro_slide1,  Color.parseColor("#5D6CBA"));
        frag2 = AppIntroFragment.newInstance("Connect With Others.", "fonts/bello-pro.ttf", secondText, "fonts/bello-pro.ttf", R.drawable.intro_slide2, Color.parseColor("#66AC5B"));
        frag3 = AppIntroFragment.newInstance("Create and Join Events.", "fonts/bello-pro.ttf", thirdText, "fonts/bello-pro.ttf", R.drawable.intro_slide3, Color.parseColor("#CC0066"));
    
        addSlide(frag1);
        addSlide(frag2);
        addSlide(frag3);
    
        //Code from Oncreate method ends here
    
       @Override 
       public void onSlideChanged(@Nullable Fragment oldFragment, @Nullable Fragment newFragment) {
        super.onSlideChanged(oldFragment, newFragment);
    
        // Do something when the slide changes.
        descText = (TextView) findViewById(R.id.description);
        descText.setTextSize(40);
    }
    

    Stack trace / LogCat: NONE

    paste stack trace and/or log here
    

    FIRST SCREEN screen shot 2017-08-24 at 12 08 11 am

    SWITCH TO SECOND SCREEN screen shot 2017-08-24 at 1 03 28 am

    SWITCH TO THIRD SCREEN screen shot 2017-08-24 at 1 03 55 am

    SWITCH BACK TO SECOND SCREEN screen shot 2017-08-24 at 1 04 07 am

    SWITCH BACK TO FIRST SCREEN screen shot 2017-08-24 at 1 06 34 am

    NO CHANGES ARE MADE BY SWITCHING SLIDES AFTER THIS

    opened by fahmad2 26
  • [Example App] Fragments are empty

    [Example App] Fragments are empty

    AppIntro Version: latest

    Device/Android Version: Marshmallow

    Issue details / Repro steps / Use case background: open the app

    Your Code:

    Stack trace / LogCat:

    paste stack trace and/or log here
    

    https://drive.google.com/folderview?id=0B1coFw2JziMJTkdtMHo5eTR4dG8

    bug 
    opened by adrcotfas 25
  • NPE on addView at first start of app

    NPE on addView at first start of app

    AppIntro Version: 4.1.0

    Device/Android Version: Reproduced on Nexus 6P API 24, Nexus 5 API 19 Android Studio Emulators

    Issue details / Repro steps / Use case background: I'm trying to have AppIntro show up on first start of the app. Crash occurs as soon as the app loads up. I'm using the template that's provided in this repo to determine if it is the first start of the app.

    Your Code: IntroActivity:

    //Also occurs with AppIntro2
    public class IntroActivity extends AppIntro {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_intro);
            addSlide(new IntroTextFragment());
            //This also does not fix the crash
            //addSlide(AppIntroFragment.newInstance("Welcome to Vipassana Quotes", "This app is recommended " +
            //        "for people who have done Vipassana once already.", R.drawable.ic_notifications_black_24dp, getResources().getColor(R.color.colorPrimary)));
        }
    }
    

    activity_intro.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_intro"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.amitavkhandelwal.vipassanaquotes.intro.IntroActivity">
    
    </RelativeLayout>
    

    IntroTextFragment:

    public class IntroTextFragment extends Fragment {
    
    
        public IntroTextFragment() {
            // Required empty public constructor
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.fragment_intro_text, container, false);
        }
    
    }
    

    MainActivity:

    public class MainActivity extends AppCompatActivity {
    
        public static final String TAG = MainActivity.class.getSimpleName();
        @BindView(R.id.all_quotes_recyclerview) RecyclerView allQuotesRecyclerView;
        private RealmAsyncTask transaction;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            //  Declare a new thread to do a preference check
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    //  Initialize SharedPreferences
                    SharedPreferences getPrefs = PreferenceManager
                            .getDefaultSharedPreferences(getBaseContext());
    
                    //  Create a new boolean and preference and set it to true
                    boolean isFirstStart = getPrefs.getBoolean("firstStart", true);
    
                    //  If the activity has never started before...
                    if (isFirstStart) {
    
                        //  Launch app intro
                        Intent i = new Intent(MainActivity.this, IntroActivity.class);
                        startActivity(i);
    
                        //  Make a new preferences editor
                        SharedPreferences.Editor e = getPrefs.edit();
    
                        //  Edit preference to make it false because we don't want this to run again
                        e.putBoolean("firstStart", false);
    
                        //  Apply changes
                        e.apply();
                    }
                }
            });
    
            // Start the thread
            t.start();
            setContentView(R.layout.activity_main);
            ButterKnife.bind(this);
            transaction = RealmUtils.createRealmDbIfNeeded(this);
    
            QuotesAdapter allQuotesAdapter = new QuotesAdapter(RealmUtils.getAllQuotes());
            allQuotesRecyclerView.setAdapter(allQuotesAdapter);
            LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
            allQuotesRecyclerView.setLayoutManager(layoutManager);
        }
    
        @Override
        public void onStop () {
            if (transaction != null && !transaction.isCancelled()) {
                transaction.cancel();
            }
            super.onStop();
        }
    }
    

    Stack trace / LogCat:

    10-04 11:56:36.765 3045-3045/com.amitavkhandelwal.vipassanaquotes E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                        Process: com.amitavkhandelwal.vipassanaquotes, PID: 3045
                                                                                        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.amitavkhandelwal.vipassanaquotes/com.amitavkhandelwal.vipassanaquotes.intro.IntroActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.FrameLayout.addView(android.view.View)' on a null object reference
                                                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
                                                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
                                                                                            at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
                                                                                            at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                            at android.os.Looper.loop(Looper.java:154)
                                                                                            at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
                                                                                         Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.FrameLayout.addView(android.view.View)' on a null object reference
                                                                                            at com.github.paolorotolo.appintro.AppIntroBase.initController(AppIntroBase.java:236)
                                                                                            at com.github.paolorotolo.appintro.AppIntroBase.onPostCreate(AppIntroBase.java:158)
                                                                                            at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1199)
                                                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2628)
                                                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)ย 
                                                                                            at android.app.ActivityThread.-wrap12(ActivityThread.java)ย 
                                                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)ย 
                                                                                            at android.os.Handler.dispatchMessage(Handler.java:102)ย 
                                                                                            at android.os.Looper.loop(Looper.java:154)ย 
                                                                                            at android.app.ActivityThread.main(ActivityThread.java:6077)ย 
                                                                                            at java.lang.reflect.Method.invoke(Native Method)ย 
                                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)ย 
                                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)ย 
    
    

    Repo that reproduces this issue: https://gitlab.com/amitav13/vipassana-quotes/tree/appintro_crash

    opened by amitav13 22
  • Translation please.....

    Translation please.....

    Translation for SKIP and DONE...

    support 
    opened by javierpe 22
  • Update Sample App

    Update Sample App

    (Ignoring issue template since this issue is just for internal (project members) use only.) The sample app has not been updated on Google Play since May 26th. Might be a good idea to get that updated. Hopefully we can push out an app update along with the next update to the lib (perhaps when we implement RTL layouts).

    @avluis we'll need to update the sample code first, and then have @PaoloRotolo generate the APK and upload it using his key.

    opened by Sammiches327 21
  • Calling goToNextSlide() from Java

    Calling goToNextSlide() from Java

    โš ๏ธ Is your feature request related to a problem? Please describe

    goToNextSlide() has default parameter values however it's impossible to use goToNextSlide from Java because it requires isLastSlide which relies on internal logic.

    From Kotlin document:

    Normally, if you write a Kotlin method with default parameter values, it will be visible in Java only as a full signature, with all parameters present. If you wish to expose multiple overloads to Java callers, you can use the @JvmOverloads annotation.

    ๐Ÿ’ก Describe the solution you'd like

    Please add @JvmOverloads annotation for goToNextSlide so we can use this method from Java without the need to provide isLastSlide.

    ๐Ÿคš Do you want to develop this feature yourself?

    • [ ] Yes
    • [X] No
    opened by alecpetrosky 4
  • slidesNumber is private

    slidesNumber is private

    โš ๏ธ Is your feature request related to a problem? Please describe

    Too strict private properties

    ๐Ÿ’ก Consider to add more protected methods

    I understand many reasons to have some fields private, but for instance slidesNumber should consider be protected. Also there should be possibility to skip to last or specific slide

    opened by hanibalsk 0
  • Java examples

    Java examples

    More examples for java users

    opened by Massi-X 0
  • Fix #926: Add color resource parameters

    Fix #926: Add color resource parameters

    As we discussed here the PR for #926. I had added 3 new resource parameters for color definitions.

    While booth parameter types are from type Integer, I decided to create a newInstance2(...) method. I think this is a more cleaner solution while Kotlin does not support deprecation marks on function parameters.

    I added deprecation marks for the existing values. But is that the right choice? On NavBar and StatusBar color function the library does support both options static color and a resource value:

    // Control the status bar color setStatusBarColor(Color.GREEN) setStatusBarColorRes(R.color.green)

    // Control the navigation bar color setNavBarColor(Color.RED) setNavBarColorRes(R.color.red)

    opened by Fabi755 2
  • Can I keep the

    Can I keep the "arrow" button, but hide the "done" button?

    I want keep the "arrow" in the DotIndicator (Image Bellow), but when I reach the last slide, I don't want that the done button appears. There is a config where I can do this? If I set isButtonsEnabled = false, the Arrow disappears too.

    image

    AppIntro Version: 6.1.0

    Update: And can I move the next/back buttons? I can move the Indicator but not the buttons. Thanks!

    feature request 
    opened by IgorGiroti 6
  • Empty layouts w/o styling + Readme typo/grammatical fixes

    Empty layouts w/o styling + Readme typo/grammatical fixes

    Just some subtle fixes for the README.

    opened by chaneylc 2
  • Samsung display camera cutout background issue

    Samsung display camera cutout background issue

    AppIntro 6.1.0, running in landscape mode on Samsung device does not set background color of camera cutout:

    Screenshot_20210305-120620_Trekarta

    This vertical grey strip on the left is the place where camera hole is on real display.

    When I enable showStatusBar(true) it looks like this:

    Screenshot_20210305-120641_Trekarta

    In portrait mode without showStatusBar(true) it looks the same as in landscape mode. But with showStatusBar(true) it looks perfectly correct (no grey cutouts):

    Screenshot_20210305-120652_Trekarta

    bug help wanted 
    opened by andreynovikov 2
  • Changing light/dark mode not works for color resources

    Changing light/dark mode not works for color resources

    AppIntro Version: current master (SNAPSHOT)

    Device/Android Version: Emulator / Android 11 (API level 30)

    Issue details / Repro steps / Use case background: If the intro is open and the dark mode configuration changes not all colors are changed.

    1. Open intro in light mode
    2. Change theme to dark mode by control center

    The drawables (set by resource ID) will be changed like expected. All background & font colors (that set directly) does not change.

    After the design mode changed the activity will recreated. The slides will added again with new (dark mode) parameters. The colors are set directly and I found that the onActivityCreated AppIntroBaseFragment.kt#L73 method is called while recreating with the "old" parameters and the explicit set colors will be reused.

    The simplest solution is to give a color resource ID instead of the color itself. As more cleaner solution we should improve the instance saving flow to keep them per fragment itself instead to referencing to the activity lifecycle.

    Your Code:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        // Have default + night variants
        // Works fine
        setIndicatorColor(
                selectedIndicatorColor = ContextCompat.getColor(this, R.color.intro_pagination_indicator),
                unselectedIndicatorColor = ContextCompat.getColor(this, R.color.meta_grey)
        )
    
        // Have default + night variants
        // Works fine
        setBackArrowColor(ContextCompat.getColor(this, R.color.accent))
        setNextArrowColor(ContextCompat.getColor(this, R.color.accent))
        setColorDoneText(ContextCompat.getColor(this, R.color.paper))
    
        addSlide(AppIntroFragment.newInstance(
                // ...
    
                // Has default + night variant
                // Works fine
                imageDrawable = R.drawable.ic_logo, 
    
                // Has default + night variant
                // Does NOT work
                titleColor = ContextCompat.getColor(this, R.color.text),
    
                // Has default + night variant
                // Does NOT work
                descriptionColor = ContextCompat.getColor(this, R.color.text),
    
                // Has default + night variant
                // Does NOT work
                backgroundColor = ContextCompat.getColor(this, R.color.paper),
                
                // ...
        ))
    }
    

    Working light:

    Failed dark:

    Expected result:

    I will playing around a little bit and make a PR next days.

    bug 
    opened by Fabi755 5
  • Strict mode usages

    Strict mode usages

    Hello,

    I have observed below strict mode usage with AppIntro 6.x version. My activity is the same as #913

    StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V
    	at android.os.StrictMode.lambda$static$1(StrictMode.java:428)
    	at android.os.-$$Lambda$StrictMode$lu9ekkHJ2HMz0jd3F8K8MnhenxQ.accept(Unknown Source:2)
    	at java.lang.Class.getDeclaredMethodInternal(Native Method)
    	at java.lang.Class.getPublicMethodRecursive(Class.java:2075)
    	at java.lang.Class.getMethod(Class.java:2063)
    	at java.lang.Class.getMethod(Class.java:1690)
    	at h.b.c.n.M(SourceFile:44)
    	at h.b.c.n.v(SourceFile:1)
    	at h.b.c.k.setContentView(SourceFile:1)
    	at com.github.appintro.AppIntroBase.onCreate(SourceFile:7)
    	at com.github.appintro.AppIntro2.onCreate(SourceFile:1)
    	at com.kaankandemirsoftware.iocome.view.ui.startsequence.introduction.IntroductionActivity.onCreate(SourceFile:1)
    	at android.app.Activity.performCreate(Activity.java:7144)
    	at android.app.Activity.performCreate(Activity.java:7135)
    	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
    	at androidx.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:2)
    	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2931)
    	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
    	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
    	at android.os.Handler.dispatchMessage(Handler.java:106)
    	at android.os.Looper.loop(Looper.java:193)
    	at android.app.ActivityThread.main(ActivityThread.java:6718)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
    
    

    2 .

    StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Landroid/graphics/FontFamily;-><init>()V
    	at android.os.StrictMode.lambda$static$1(StrictMode.java:428)
    	at android.os.-$$Lambda$StrictMode$lu9ekkHJ2HMz0jd3F8K8MnhenxQ.accept(Unknown Source:2)
    	at java.lang.Class.getDeclaredConstructorInternal(Native Method)
    	at java.lang.Class.getConstructor0(Class.java:2325)
    	at java.lang.Class.getConstructor(Class.java:1725)
    	at h.h.d.g.<init>(SourceFile:3)
    	at h.h.d.h.<init>(SourceFile:1)
    	at h.h.d.d.<clinit>(SourceFile:3)
    	at androidx.appcompat.widget.AppCompatTextView.setTypeface(SourceFile:2)
    	at android.widget.TextView.resolveStyleAndSetTypeface(TextView.java:2037)
    	at android.widget.TextView.setTypefaceFromAttrs(TextView.java:2008)
    	at android.widget.TextView.applyTextAppearance(TextView.java:3640)
    	at android.widget.TextView.<init>(TextView.java:1498)
    	at android.widget.TextView.<init>(TextView.java:869)
    	at androidx.appcompat.widget.AppCompatTextView.<init>(SourceFile:2)
    	at com.google.android.material.textview.MaterialTextView.<init>(SourceFile:1)
    	at com.google.android.material.theme.MaterialComponentsViewInflater.e(SourceFile:1)
    	at h.b.c.n.onCreateView(SourceFile:42)
    	at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:189)
    	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
    	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
    	at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
    	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    	at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    	at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    	at com.github.appintro.AppIntroBaseFragment.onCreateView(SourceFile:1)
    	at androidx.fragment.app.Fragment.performCreateView(SourceFile:4)
    	at h.l.b.p.V(SourceFile:86)
    	at h.l.b.p.T(SourceFile:4)
    	at h.l.b.a.n(SourceFile:26)
    	at h.l.b.p.E(SourceFile:51)
    	at h.l.b.p.c0(SourceFile:10)
    	at h.l.b.p.D(SourceFile:5)
    	at h.l.b.a.f(SourceFile:3)
    	at h.l.b.u.finishUpdate(SourceFile:4)
    	at h.z.a.b.populate(SourceFile:51)
    	at h.z.a.b.populate(SourceFile:1)
    	at h.z.a.b.onMeasure(SourceFile:25)
    	at android.view.View.measure(View.java:23169)
    	at androidx.constraintlayout.widget.ConstraintLayout$b.b(SourceFile:77)
    	at h.f.b.h.e.X(SourceFile:50)
    	at h.f.b.h.l.h.g(SourceFile:3)
    	at h.f.b.h.l.h.f(SourceFile:15)
    	at h.f.b.h.l.h.g(SourceFile:28)
    	at h.f.b.h.e.P(SourceFile:83)
    	at h.f.b.h.l.b.b(SourceFile:13)
    	at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(SourceFile:224)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at androidx.appcompat.widget.ContentFrameLayout.onMeasure(SourceFile:21)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
    	at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
    	at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
    	at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
    	at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewRootImpl.performMeasure(ViewRoo
    
    StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Landroid/graphics/FontFamily;->abortCreation()V
    	at android.os.StrictMode.lambda$static$1(StrictMode.java:428)
    	at android.os.-$$Lambda$StrictMode$lu9ekkHJ2HMz0jd3F8K8MnhenxQ.accept(Unknown Source:2)
    	at java.lang.Class.getDeclaredMethodInternal(Native Method)
    	at java.lang.Class.getPublicMethodRecursive(Class.java:2075)
    	at java.lang.Class.getMethod(Class.java:2063)
    	at java.lang.Class.getMethod(Class.java:1690)
    	at h.h.d.g.<init>(SourceFile:7)
    	at h.h.d.h.<init>(SourceFile:1)
    	at h.h.d.d.<clinit>(SourceFile:3)
    	at androidx.appcompat.widget.AppCompatTextView.setTypeface(SourceFile:2)
    	at android.widget.TextView.resolveStyleAndSetTypeface(TextView.java:2037)
    	at android.widget.TextView.setTypefaceFromAttrs(TextView.java:2008)
    	at android.widget.TextView.applyTextAppearance(TextView.java:3640)
    	at android.widget.TextView.<init>(TextView.java:1498)
    	at android.widget.TextView.<init>(TextView.java:869)
    	at androidx.appcompat.widget.AppCompatTextView.<init>(SourceFile:2)
    	at com.google.android.material.textview.MaterialTextView.<init>(SourceFile:1)
    	at com.google.android.material.theme.MaterialComponentsViewInflater.e(SourceFile:1)
    	at h.b.c.n.onCreateView(SourceFile:42)
    	at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:189)
    	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
    	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
    	at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
    	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    	at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    	at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    	at com.github.appintro.AppIntroBaseFragment.onCreateView(SourceFile:1)
    	at androidx.fragment.app.Fragment.performCreateView(SourceFile:4)
    at androidx.fragment.app.Fragment.performCreateView(SourceFile:4)
    	at h.l.b.p.V(SourceFile:86)
    	at h.l.b.p.T(SourceFile:4)
    	at h.l.b.a.n(SourceFile:26)
    	at h.l.b.p.E(SourceFile:51)
    	at h.l.b.p.c0(SourceFile:10)
    	at h.l.b.p.D(SourceFile:5)
    	at h.l.b.a.f(SourceFile:3)
    	at h.l.b.u.finishUpdate(SourceFile:4)
    	at h.z.a.b.populate(SourceFile:51)
    	at h.z.a.b.populate(SourceFile:1)
    	at h.z.a.b.onMeasure(SourceFile:25)
    	at android.view.View.measure(View.java:23169)
    	at androidx.constraintlayout.widget.ConstraintLayout$b.b(SourceFile:77)
    	at h.f.b.h.e.X(SourceFile:50)
    	at h.f.b.h.l.h.g(SourceFile:3)
    	at h.f.b.h.l.h.f(SourceFile:15)
    	at h.f.b.h.l.h.g(SourceFile:28)
    	at h.f.b.h.e.P(SourceFile:83)
    	at h.f.b.h.l.b.b(SourceFile:13)
    	at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(SourceFile:224)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at androidx.appcompat.widget.ContentFrameLayout.onMeasure(SourceFile:21)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
    	at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
    	at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
    	at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
    	at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
    	at android.view.View.measure(View.java:23169)
    
    StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Landroid/graphics/FontFamily;->addFontFromAssetManager(Landroid/content/res/AssetManager;Ljava/lang/String;IZIII[Landroid/graphics/fonts/FontVariationAxis;)Z
    	at android.os.StrictMode.lambda$static$1(StrictMode.java:428)
    	at android.os.-$$Lambda$StrictMode$lu9ekkHJ2HMz0jd3F8K8MnhenxQ.accept(Unknown Source:2)
    	at java.lang.Class.getDeclaredMethodInternal(Native Method)
    	at java.lang.Class.getPublicMethodRecursive(Class.java:2075)
    	at java.lang.Class.getMethod(Class.java:2063)
    	at java.lang.Class.getMethod(Class.java:1690)
    	at h.h.d.g.n(SourceFile:1)
    	at h.h.d.g.<init>(SourceFile:4)
    	at h.h.d.h.<init>(SourceFile:1)
    	at h.h.d.d.<clinit>(SourceFile:3)
    	at androidx.appcompat.widget.AppCompatTextView.setTypeface(SourceFile:2)
    	at android.widget.TextView.resolveStyleAndSetTypeface(TextView.java:2037)
    	at android.widget.TextView.setTypefaceFromAttrs(TextView.java:2008)
    	at android.widget.TextView.applyTextAppearance(TextView.java:3640)
    	at android.widget.TextView.<init>(TextView.java:1498)
    	at android.widget.TextView.<init>(TextView.java:869)
    	at androidx.appcompat.widget.AppCompatTextView.<init>(SourceFile:2)
    	at com.google.android.material.textview.MaterialTextView.<init>(SourceFile:1)
    	at com.google.android.material.theme.MaterialComponentsViewInflater.e(SourceFile:1)
    	at h.b.c.n.onCreateView(SourceFile:42)
    	at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:189)
    	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
    	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
    	at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
    	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    	at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    	at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    	at com.github.appintro.AppIntroBaseFragment.onCreateView(SourceFile:1)
    	at androidx.fragment.app.Fragment.performCreateView(SourceFile:4)
    	at h.l.b.p.V(SourceFile:86)
    	at h.l.b.p.T(SourceFile:4)
    	at h.l.b.a.n(SourceFile:26)
    	at h.l.b.p.E(SourceFile:51)
    	at h.l.b.p.c0(SourceFile:10)
    	at h.l.b.p.D(SourceFile:5)
    	at h.l.b.a.f(SourceFile:3)
    	at h.l.b.u.finishUpdate(SourceFile:4)
    	at h.z.a.b.populate(SourceFile:51)
    	at h.z.a.b.populate(SourceFile:1)
    	at h.z.a.b.onMeasure(SourceFile:25)
    	at android.view.View.measure(View.java:23169)
    	at androidx.constraintlayout.widget.ConstraintLayout$b.b(SourceFile:77)
    	at h.f.b.h.e.X(SourceFile:50)
    	at h.f.b.h.l.h.g(SourceFile:3)
    	at h.f.b.h.l.h.f(SourceFile:15)
    	at h.f.b.h.l.h.g(SourceFile:28)
    	at h.f.b.h.e.P(SourceFile:83)
    	at h.f.b.h.l.b.b(SourceFile:13)
    	at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(SourceFile:224)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at androidx.appcompat.widget.ContentFrameLayout.onMeasure(SourceFile:21)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
    	at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
    	at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
    	at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
    	at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.FrameLayout.onMeasure(Fr
    
    StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Landroid/graphics/FontFamily;->addFontFromBuffer(Ljava/nio/ByteBuffer;I[Landroid/graphics/fonts/FontVariationAxis;II)Z
    	at android.os.StrictMode.lambda$static$1(StrictMode.java:428)
    	at android.os.-$$Lambda$StrictMode$lu9ekkHJ2HMz0jd3F8K8MnhenxQ.accept(Unknown Source:2)
    	at java.lang.Class.getDeclaredMethodInternal(Native Method)
    	at java.lang.Class.getPublicMethodRecursive(Class.java:2075)
    	at java.lang.Class.getMethod(Class.java:2063)
    	at java.lang.Class.getMethod(Class.java:1690)
    	at h.h.d.g.o(SourceFile:1)
    	at h.h.d.g.<init>(SourceFile:5)
    	at h.h.d.h.<init>(SourceFile:1)
    	at h.h.d.d.<clinit>(SourceFile:3)
    	at androidx.appcompat.widget.AppCompatTextView.setTypeface(SourceFile:2)
    	at android.widget.TextView.resolveStyleAndSetTypeface(TextView.java:2037)
    	at android.widget.TextView.setTypefaceFromAttrs(TextView.java:2008)
    	at android.widget.TextView.applyTextAppearance(TextView.java:3640)
    	at android.widget.TextView.<init>(TextView.java:1498)
    	at android.widget.TextView.<init>(TextView.java:869)
    	at androidx.appcompat.widget.AppCompatTextView.<init>(SourceFile:2)
    	at com.google.android.material.textview.MaterialTextView.<init>(SourceFile:1)
    	at com.google.android.material.theme.MaterialComponentsViewInflater.e(SourceFile:1)
    	at h.b.c.n.onCreateView(SourceFile:42)
    	at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:189)
    	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
    	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
    	at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
    	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    	at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    	at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    	at com.github.appintro.AppIntroBaseFragment.onCreateView(SourceFile:1)
    	at androidx.fragment.app.Fragment.performCreateView(SourceFile:4)
    	at h.l.b.p.V(SourceFile:86)
    	at h.l.b.p.T(SourceFile:4)
    	at h.l.b.a.n(SourceFile:26)
    	at h.l.b.p.E(SourceFile:51)
    	at h.l.b.p.c0(SourceFile:10)
    	at h.l.b.p.D(SourceFile:5)
    	at h.l.b.a.f(SourceFile:3)
    	at h.l.b.u.finishUpdate(SourceFile:4)
    	at h.z.a.b.populate(SourceFile:51)
    	at h.z.a.b.populate(SourceFile:1)
    	at h.z.a.b.onMeasure(SourceFile:25)
    	at android.view.View.measure(View.java:23169)
    	at androidx.constraintlayout.widget.ConstraintLayout$b.b(SourceFile:77)
    	at h.f.b.h.e.X(SourceFile:50)
    	at h.f.b.h.l.h.g(SourceFile:3)
    	at h.f.b.h.l.h.f(SourceFile:15)
    	at h.f.b.h.l.h.g(SourceFile:28)
    	at h.f.b.h.e.P(SourceFile:83)
    	at h.f.b.h.l.b.b(SourceFile:13)
    	at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(SourceFile:224)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at androidx.appcompat.widget.ContentFrameLayout.onMeasure(SourceFile:21)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
    	at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
    	at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
    	at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
    	at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
    	at android.view.View.measure(View.java:23169)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at com.android.int
    
    StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Landroid/graphics/FontFamily;->freeze()Z
    	at android.os.StrictMode.lambda$static$1(StrictMode.java:428)
    	at android.os.-$$Lambda$StrictMode$lu9ekkHJ2HMz0jd3F8K8MnhenxQ.accept(Unknown Source:2)
    	at java.lang.Class.getDeclaredMethodInternal(Native Method)
    	at java.lang.Class.getPublicMethodRecursive(Class.java:2075)
    	at java.lang.Class.getMethod(Class.java:2063)
    	at java.lang.Class.getMethod(Class.java:1690)
    	at h.h.d.g.<init>(SourceFile:6)
    	at h.h.d.h.<init>(SourceFile:1)
    	at h.h.d.d.<clinit>(SourceFile:3)
    	at androidx.appcompat.widget.AppCompatTextView.setTypeface(SourceFile:2)
    	at android.widget.TextView.resolveStyleAndSetTypeface(TextView.java:2037)
    	at android.widget.TextView.setTypefaceFromAttrs(TextView.java:2008)
    	at android.widget.TextView.applyTextAppearance(TextView.java:3640)
    	at android.widget.TextView.<init>(TextView.java:1498)
    	at android.widget.TextView.<init>(TextView.java:869)
    	at androidx.appcompat.widget.AppCompatTextView.<init>(SourceFile:2)
    	at com.google.android.material.textview.MaterialTextView.<init>(SourceFile:1)
    	at com.google.android.material.theme.MaterialComponentsViewInflater.e(SourceFile:1)
    	at h.b.c.n.onCreateView(SourceFile:42)
    	at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:189)
    	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
    	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
    	at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
    	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    	at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    	at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    	at com.github.appintro.AppIntroBaseFragment.onCreateView(SourceFile:1)
    	at androidx.fragment.app.Fragment.performCreateView(SourceFile:4)
    
    help wanted 
    opened by KaanRF 1
  • Use fragments instead of activities

    Use fragments instead of activities

    It could be created another module of this nice library which uses fragments instead of activities. Here AppIntro is changed to be a fragment.

    wip 
    opened by nasko700 1
Releases(6.1.0)
  • 6.1.0(Feb 3, 2021)

    This is a new minor release of AppIntro. This library comes with several new features and several bugfixes.

    Summary of Changes

    • Target SDK is now 30.
    • Text visualization has been improved with Autosizing TextViews and URL autolinking.
    • AppIntro now offers better support for tablets (sw600dp).
    • Slide indicator has been improved with better color blending and it won't be shown if you have only one slide.
    • The AppIntro sample app has been completely rewritten with more examples (for Java, SlidePolicy and more).
    • 14 translations have been added or improved.

    The full changelog is available in the CHANGELOG file

    To update make sure you:

    1. Add the JitPack repository to your build file
    repositories {
        maven { url "jitpack.io" }
    }
    
    1. Bump the dependency
    dependencies {
        implementation 'com.github.AppIntro:AppIntro:6.1.0'
    }
    
    Source code(tar.gz)
    Source code(zip)
  • 6.0.0(May 4, 2020)

    This is a new major release of AppIntro. Please note that this release contains multiple new features (see below), several bugfixes, as well as multiple breaking changes. To get a deeper overview of the breaking changes, please read the migration document.

    Summary of Changes

    • The library is now 100% in Kotlin! ๐ŸŽ‰.
    • Target SDK is now 29.
    • The UI was completely revamped and refactored.
    • You can now request permissions on AppIntro without having to lock the slide.
    • The library has now 14 more translations.

    The full changelog is available in the CHANGELOG file

    How to update

    This release contains several breaking change. Please read them all in the migration document

    1. Add the JitPack repository to your build file
    repositories {
        maven { url "https://jitpack.io" }
    }
    
    1. Add the dependency
    dependencies {
        implementation 'com.github.AppIntro:AppIntro:6.0.0'
    }
    
    Source code(tar.gz)
    Source code(zip)
    appintro-6.0.0-sources.jar(27.87 KB)
    appintro-6.0.0.aar(108.87 KB)
    appintro-6.0.0.pom.xml(1.50 KB)
  • v5.1.0(Oct 23, 2018)

    Changelog

    • Fixed issue that caused a build failure on Kotlin projects (#597);
    • Added support for Android 8.0 custom Fonts API (#590);
    • Updated Translations;
    • Miscellaneous bug fixes and performance improvements;

    How to update

    1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories:
    allprojects {
        repositories {
    	...
    	maven { url 'https://jitpack.io' }
        }
    }
    
    1. Add the dependency
    dependencies {
             implementation 'com.github.paolorotolo:appintro:v5.1.0'
    }
    
    Source code(tar.gz)
    Source code(zip)
  • v5.0.1(Oct 16, 2018)

    Changelog

    • Fixed incorrect behaviour when android:supportsRtl="true" was present in app's Manifest;
    • Fixed RTL support;
    • Update Translations;
    • Miscellaneous bug fixes and performance improvements;

    How to update

    1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories:
    allprojects {
        repositories {
    	...
    	maven { url 'https://jitpack.io' }
        }
    }
    
    1. Add the dependency
    dependencies {
             implementation 'com.github.paolorotolo:AppIntro:v5.0.1'
    }
    
    Source code(tar.gz)
    Source code(zip)
  • v5.0.0(Oct 7, 2018)

    Changelog

    • Migrate to AndroidX;
    • Target SDK 28;
    • Update Translations;
    • Miscellaneous bug fixes and performance improvements;

    How to update

    1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories:
    allprojects {
        repositories {
    	...
    	maven { url 'https://jitpack.io' }
        }
    }
    
    1. Add the dependency
    dependencies {
             implementation 'com.github.paolorotolo:AppIntro:v5.0.0'
    }
    
    Source code(tar.gz)
    Source code(zip)
  • v4.2.3(Feb 13, 2018)

    Changelog

    • BREAKING: MinSdkVersion raised to 14;
    • FIX: PagerIndicatorEnabled is updated only at start (#478);
    • FIX: redundant and wrong calls to onUserIllegallyRequestedNextPage;
    • New translations;

    How to update

    1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories:
    allprojects {
        repositories {
    	...
    	maven { url 'https://jitpack.io' }
        }
    }
    
    1. Add the dependency
    dependencies {
        compile 'com.github.apl-devs:appintro:v4.2.3'
    }
    
    Source code(tar.gz)
    Source code(zip)
  • v4.2.2(Jul 29, 2017)

    How to update

    1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories:
    allprojects {
        repositories {
    	...
    	maven { url 'https://jitpack.io' }
        }
    }
    
    1. Add the dependency
    dependencies {
        compile 'com.github.apl-devs:appintro:v4.2.2'
    }
    

    Changelog

    Bugfixes

    • Fix broken permission request behavior (#472)

    Thanks to all contributors who made this release possible!

    Source code(tar.gz)
    Source code(zip)
  • v4.2.1(Jul 22, 2017)

    How to update

    Time for a quick update! As per the last release, we switched from Maven to JitPack.io. Updating AppIntro is very simple.

    1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories:
    allprojects {
        repositories {
    	...
    	maven { url 'https://jitpack.io' }
        }
    }
    
    1. Add the dependency
    dependencies {
        compile 'com.github.apl-devs:appintro:v4.2.1'
    }
    

    Changelog

    Features

    Bugfixes

    • Fix permission request on last slide (#416)
    • Code cleanup/refactoring! (#428)
    • Fix IndexOutOfBoundsException when no slides are passed (#455)

    Thanks to all contributors who made this release possible!

    Source code(tar.gz)
    Source code(zip)
  • v4.2.0(May 26, 2017)

    How to update

    In this release we switched from Maven to JitPack.io. Updating AppIntro is even more simple.

    1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories:
    	allprojects {
    		repositories {
    			...
    			maven { url 'https://jitpack.io' }
    		}
    	}
    
    1. Add the dependency
    	dependencies {
    	        compile 'com.github.apl-devs:appintro:v4.2.0'
    	}
    

    Changelog

    Features

    • Add Translations (French, Indonesian, Russian, Turkish, Arabic);
    • Add RTL Support;
    • Add back button navigation;
    • Add showSeparator() method;
    • Allow users to change Bar color in AppIntro 2;
    • Refreshed Example app;
    • Dependencies update;

    Bugfixes

    • Check NPE on views (#361);
    • Fix issues with ProGuard (#337);
    • Fix Custom Typefaces issues (#318);
    • Fix page indicator when the page change listener is overridden (#316);

    Thanks to all contributors who made this release possible!

    Source code(tar.gz)
    Source code(zip)
  • v4.1.0(Sep 27, 2016)

    How to update

    Add this to your build.gradle:

    repositories {
        mavenCentral()
    }
    
    dependencies {
      compile 'com.github.paolorotolo:appintro:4.1.0'
    }
    

    Changelog:

    • Long Description Support @SandroMachado #234
    • Changes to Skip Button Visibility @RafaG #241
    • Added Wizard Mode & Custom Typeface Support @ameykshirsagar #267
    • Improve compatibility with Vector Drawables @xsorifc28 #271 & @K0bin #296
    • Add German Translations @K0bin #291
    • Add Spanish Translations @voghDev #292
    • Documentation updates @maxee #302
    Source code(tar.gz)
    Source code(zip)
  • v4.0.0(May 29, 2016)

    How to update

    Add this to your build.gradle:

    repositories {
        mavenCentral()
    }
    
    dependencies {
      compile 'com.github.paolorotolo:appintro:4.0.0'
    }
    

    Changelog:

    • Users can now override onCreate();
    • New method: setNextArrowColor() [@championswimmer];
    • Implemented basic support to restore fragments (e.g. on orientation change) [@maxee];
    • Implemented support for immersive mode [@maxee];
    • Implemented extended slide policy [@maxee];
    • New skip button for DefaultIntro2 [@timobaehr];
    • Bug fixes and improvements;
    Source code(tar.gz)
    Source code(zip)
    example-release.apk(1.60 MB)
  • v3.3.0(Nov 28, 2015)

    How to update

    Add this to your build.gradle:

    repositories {
        mavenCentral()
    }
    
    dependencies {
      compile 'com.github.paolorotolo:appintro:3.3.0'
    }
    

    Changelog:

    • Added support for swipe locking (@danluong)
    • Added support for custom animation times (@BugsBunnyBR)
    • Added support for showing/hiding statusbar (@Andrew-Quebe)
    • Added support for changing nav bar color (@Andrew-Quebe)
    • Fixed #72
    • Fixed #74
    • Added support for Android 6.0 permissions (@Andrew-Quebe, @PaoloRotolo)

    Source code(tar.gz)
    Source code(zip)
    appintro-example.apk(1.51 MB)
  • v3.2.0(Aug 4, 2015)

    How to update

    Add this to your build.gradle:

    repositories {
        mavenCentral()
    }
    
    dependencies {
      compile 'com.github.paolorotolo:appintro:3.2.0'
    }
    

    Changelog:

    • Hide the indicator when there is only one slide [https://github.com/PaoloRotolo/AppIntro/commit/3ba5854f7e41b9883cbd0745bacc0d6eef204ef7];
    • Remove deprecation warning for Resources.getDrawable(int) [https://github.com/PaoloRotolo/AppIntro/commit/45e61d31bfb049cdd8f671b68e22285576d957d2];
    • Extend AppCompatActivity, update support libs [https://github.com/PaoloRotolo/AppIntro/commit/ded7efa471054b21a7e701f22c1bfcf0377fd075];
    • New getPager() method [https://github.com/PaoloRotolo/AppIntro/commit/a7fd4025eb7bc08e9049812b7a5df6ea9b116bc4];
    • Fix for page indicator being off center [https://github.com/PaoloRotolo/AppIntro/commit/9cd45d8e5d43d360e69fa39a782fe280498760b0];
    • Fixed button background color on < Lollipop [https://github.com/PaoloRotolo/AppIntro/commit/7278ff3e658711576371f977a7a235f086009de3];
    • Removed deprecated library NineOldAndroids (minSdkVersion = 14) [https://github.com/PaoloRotolo/AppIntro/commit/8e3f3ac2f63c26496002b954f474f6d134a4a98a];
    Source code(tar.gz)
    Source code(zip)
    appintro-3.2.0-sources.jar(10.93 KB)
    appintro-example-3.2.0.apk(1.38 MB)
Owner
AppIntro Team
Developers of AppIntro library
AppIntro Team
KaMP Kit by Touchlab is a collection of code and tools designed to get your mobile team started quickly with Kotlin Multiplatform.

KaMP Kit Welcome to the KaMP Kit! About Goal The goal of the KaMP Kit is to facilitate your evaluation of Kotlin Multiplatform (aka KMP). It is a coll

Touchlab 1.2k Aug 2, 2021
AbstractMvp 0.8 0.0 Kotlin is a library that provides abstract components for MVP architecture realization, with problems solutions that are exist in classic MVP.

MinSDK 14+ AbstractMvp AbstractMvp is a library that provides abstract components for MVP architecture realization, with problems solutions that are e

Robert 11 Feb 3, 2021
LifecycleMvp 1.2 0.0 Kotlin is MVP architecture implementation with Android Architecture Components and Kotlin language features

MinSDK 14+ Download Gradle Add to project level build.gradle allprojects { repositories { ... maven { url 'https://jitpack.io' }

Robert 21 Feb 3, 2021
:bouquet: An easy way to persist and run code block only as many times as necessary on Android.

Only ?? An easy way to persist and run code block only as many times as necessary on Android. Download Gradle Add below codes to your root build.gradl

Jaewoong Eum 471 Jul 21, 2021
:bouquet: An easy way to persist and run code block only as many times as necessary on Android.

Only ?? An easy way to persist and run code block only as many times as necessary on Android. Download Gradle Add below codes to your root build.gradl

Jaewoong Eum 468 Apr 14, 2021
An Easy-to-use Kotlin based Customizable Modules Collection with Material Layouts by BlackBeared.

Fusion By BlackBeared An Easy-to-use Kotlin based Customizable Library with Material Layouts by @blackbeared. Features Custom Floating Action Buttons

Sandip Savaliya 40 Mar 24, 2021
Opinionated Redux-like implementation backed by Kotlin Coroutines and Kotlin Multiplatform Mobile

CoRed CoRed is Redux-like implementation that maintains the benefits of Redux's core idea without the boilerplate. No more action types, action creato

Kittinun Vantasin 16 Aug 1, 2021
A Kotlin library for interacting with Discord via IPC

KDiscordIPC A Kotlin library for interacting with Discord via IPC Features Fully documented codebase macOS and Linux support (including M1 Macs, Windo

Conor Byrne 5 Jul 23, 2021
A highly customizable calendar library for Android, powered by RecyclerView.

CalendarView A highly customizable calendar library for Android, powered by RecyclerView. With this library, your calendar will look however you want

Kizito Nwose 2.7k Aug 4, 2021
YouTube Player library for Android and Chromecast, stable and customizable.

android-youtube-player android-youtube-player is a stable and customizable open source YouTube player for Android. It provides a simple View that can

Pierfrancesco Soffritti 2.4k Aug 4, 2021
Easy lightweight SharedPreferences library for Android in Kotlin using delegated properties

Easy lightweight SharedPreferences library for Android in Kotlin using delegated properties Idea Delegated properties in Kotlin allow you to execute a

null 23 Mar 21, 2019
๐Ÿ’ก๐Ÿš€โญ๏ธ A generalized adapter for RecyclerView on Android which makes it easy to add heterogeneous items to a list

Mystique is a Kotlin library for Androidโ€™s RecyclerView which allows you to create homogeneous and heterogeneous lists effortlessly using an universal

Rahul Chowdhury 46 Apr 11, 2020
๐Ÿž The ultimate breadcrumbs view for Android!

KrumbsView The ultimate breadcrumbs view for Android! Inspired by JotterPad's breadcrumbs. Features: Custom typeface (from /assets and /res/font folde

Adriel Cafรฉ 171 May 13, 2021