Native solution for common React Native problem of focused views being covered by soft input view.

Overview

react-native-avoid-softinput

Native solution for common React Native problem of focused views being covered by soft input view. It is solved by listening for soft input events and applying translation to react root view (or bottom padding if focused element's parent is scroll view) entirely on native side and only if currently focused view is covered by soft input frame. It supports focused views being positioned in scroll views and regular views (check out example app). It also supports modal content, when content is wrapped in AvoidSoftInputView

Table of Contents

  1. Installation
  2. Usage
  3. Contributing
  4. Licence

Installation

yarn add react-native-avoid-softinput

On iOS run additionally

npx pod-install

⚠️ Library on iOS uses Swift. Make sure that your project has bridging header configured (the easiest way is to create empty .swift file in XCode, which will offer to create bridging header)

Usage

iOS

Enable module:

import React from "react";
import { AvoidSoftInput } from "react-native-avoid-softinput";

//...
React.useEffect(() => {
  AvoidSoftInput.setEnabled(true);
}, []);
//...

Android

Enable module:

Before using module on Android, check if system support (android:windowSoftInputMode="adjustResize" in Android manifest for <activity> tag) is enough for your use case.

If you cannot use system support, then enable module and set android:windowSoftInputMode attribute to adjustNothing either in manifest or programmatically with setAdjustNothing method

⚠️ Do not enable module with adjustResize value set, as it will result in padding being applied to already resized android window

import React from "react";
import { AvoidSoftInput } from "react-native-avoid-softinput";

//...
React.useEffect(() => {
  AvoidSoftInput.setAdjustNothing();
  AvoidSoftInput.setEnabled(true);
}, []);
//...

Additional offset

If you want to increase/decrease amount of translation/padding applied to react root view/scroll view, you can use setAvoidOffset method

import React from "react";
import { AvoidSoftInput } from "react-native-avoid-softinput";

//...
AvoidSoftInput.setAvoidOffset(40); // It will result in applied value 40dp greater than standard one
//...

:warning Value applied to that method is persisted, so if you want to use that in a single use case, remember to clear it (just pass 0 as an argument)

Listening to events

If you want to listen to events when soft input is shown/hidden:

import React from "react";
import { AvoidSoftInput } from "react-native-avoid-softinput";

//...
React.useEffect(() => {
  const unsubscribeShown = AvoidSoftInput.onSoftInputShown(
    ({ softInputHeight }) => {
      console.log("soft input shown", softInputHeight); // Soft input is shown with height
    }
  );
  const unsubscribeHidden = AvoidSoftInput.onSoftInputHidden(() => {
    console.log("soft input hidden"); // Soft input is hidden
  });

  return () => {
    unsubscribeShown.remove();
    unsubscribeHidden.remove();
  };
}, []);
//...

Custom hooks

Library provides custom hooks:

useSoftInputHidden

A shortcut for using AvoidSoftInput.onSoftInputHidden method inside useEffect

import React from "react";
import { useSoftInputHidden } from "react-native-avoid-softinput";

//...
useSoftInputHidden(() => {
  console.log("soft input hidden"); // Soft input is hidden
});
//...

useSoftInputShown

A shortcut for using AvoidSoftInput.onSoftInputShown method inside useEffect

import React from "react";
import { useSoftInputShown } from "react-native-avoid-softinput";

//...
useSoftInputShown(({ softInputHeight }) => {
  console.log("soft input shown", softInputHeight); // Soft input is shown with height
});
//...

useSoftInputState

It returns object with properties determining whether soft input is shown and how much screen it covers

import React from "react";
import { useSoftInputState } from "react-native-avoid-softinput";

//...
const { isSoftInputShown, softInputHeight } = useSoftInputState();
//...

AvoidSoftInputView

If your form is rendered inside modal, wrap your modal content inside AvoidSoftInputView. It will manage whether form's content should be pushed above soft input frame. It accepts regular view props with addition of avoidOffset prop and onSoftInputShown and onSoftInputHidden callbacks

import React from "react";
import { Modal } from "react-native";
import { AvoidSoftInput } from "react-native-avoid-softinput";

const MyComponent = () => {
  //...
  function onSoftInputShown(e) {
    console.log(e.nativeEvent.softInputHeight);
    // Do sth
  }
  //...
  function onSoftInputHidden() {
    // Do sth
  }
  //...
  return (
    //...
    <Modal {...modalProps}>
      <AvoidSoftInputView
        avoidOffset={10}
        onSoftInputShown={onSoftInputShown}
        onSoftInputHidden={onSoftInputHidden}
        style={styles.avoidSoftInputView}
      >
        <View>{/** Rest of form's content */}</View>
      </AvoidSoftInputView>
    </Modal>
    //...
  );
};

android:windowSoftInputMode attribute (Android only)

Library exposes methods for managing android:windowSoftInputMode value:

setAdjustNothing

Sets android:windowSoftInputMode to adjustNothing value

import { AvoidSoftInput } from "react-native-avoid-softinput";

//...
AvoidSoftInput.setAdjustNothing();
//...

setAdjustPan

Sets android:windowSoftInputMode to adjustPan value

import { AvoidSoftInput } from "react-native-avoid-softinput";

//...
AvoidSoftInput.setAdjustPan();
//...

setAdjustResize

Sets android:windowSoftInputMode to adjustResize value

import { AvoidSoftInput } from "react-native-avoid-softinput";

//...
AvoidSoftInput.setAdjustResize();
//...

setAdjustUnspecified

Sets android:windowSoftInputMode to adjustUnspecified value

import { AvoidSoftInput } from "react-native-avoid-softinput";

//...
AvoidSoftInput.setAdjustUnspecified();
//...

setDefaultAppSoftInputMode

sets android:windowSoftInputMode to default value from Android manifest

import { AvoidSoftInput } from "react-native-avoid-softinput";

//...
AvoidSoftInput.setDefaultAppSoftInputMode();
//...

Contributing

See the contributing guide to learn how to contribute to the repository and the development workflow.

License

MIT

Comments
  • AvoidSoftInputView breaks with screen swipe

    AvoidSoftInputView breaks with screen swipe

    Environment

    Library version: 2.4.1 OS version: iPhone 13, iOS 15.4 "@react-navigation/native": "^6.0.8", "@react-navigation/native-stack": "^6.6.1",

    Affected platforms

    • [ ] Android
    • [X] iOS

    Current behavior

    https://user-images.githubusercontent.com/199706/161307457-5d118360-c530-479a-b52e-c69cd62ef98b.mp4

    Expected behavior

    Keyboard avoid view

    Reproduction

    1. Open screen
    2. Focus keyboard
    3. Start swiping back
    4. Cancel swipe Simplified code:
     <View style={styles.container}>
          <AvoidSoftInputView style={styles.container} avoidOffset={16}>
            <ImageBackground
              source={require("./bg.png")}
              imageStyle={styles.bgImage}
              resizeMode="repeat"
              style={styles.bg}
            >
              <FlatList />
            </ImageBackground>
            <View style={styles.bottom}>
              <TextInput />
            </View>
          </AvoidSoftInputView>
          <SafeAreaView style={styles.footer} edges={["bottom"]} />
        </View>
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
      },
      ...
    })
    

    And I have related question: now, when I swipe screen keyboard still present but keyboard avoid view smoothly disappears (and content scrolls down). How I can prevent this behavior?

    bug 
    opened by nucleartux 24
  • [ios] On iOS keyboard focusing/dismissal will very ocassionally cause the root view to shrink its height

    [ios] On iOS keyboard focusing/dismissal will very ocassionally cause the root view to shrink its height

    Environment

    Library version: 2.4.6 OS version: iPhone 8, iOS 15.5 & iOS 16.0

    This has also happened on v2.4.4 of the library and I can confirm that the app behaves as intended when I remove the library from the project.

    I have most commonly seen this behaviour on iPhone models with the home button.

    Affected platforms

    • [ ] Android
    • [X] iOS

    Current behavior

    Sometimes, very very ocassionally, random interactions with the UI - most commonly those interactions are blurring/focusing textfields, dismissing/expanding keyboard but I think it can happen elsewhere too - will cause the root view to shrink its height to half the height of the screen. See the attached picture: CleanShot 2022-08-05 at 19 18 23

    Expected behavior

    The root view's height should not shrink.

    Reproduction

    To be honest, I really, really have no clue how to reproduce this issue. It seems to be entirely random and unpredictable, and hence I cannot identify the reproduction steps to reproduce it reliably. If there's anything else I can do, or information I can provide to help reproduce this issue, let me know.

    bug 
    opened by fobos531 8
  • inconsistent behavior between ios and android ?

    inconsistent behavior between ios and android ?

    Environment

    Library version: 2.4.4 OS version: iPhone 13 ios 15 android 10

    Affected platforms

    • [X] Android
    • [ ] iOS

    Current behavior

    the unfocused screen on android is affected by the keyboard on android but not ios

    https://user-images.githubusercontent.com/19273413/163286962-9e6ea5ae-3b86-4a81-b0ea-1a7e827fbb5d.mp4

    https://user-images.githubusercontent.com/19273413/163286998-efe75dca-9c6e-407b-b0d7-f0aa8150412e.mp4

    Expected behavior

    the unfocused screen should not be affected by the keyboard.

    Reproduction

    • enable the module on android and ios
    • trigger the module with an input on a transparent modal ( native-stack modal screen in my case )
    bug wontfix 
    opened by a-eid 8
  • An ability to customize background color under keyboard?

    An ability to customize background color under keyboard?

    Feature request

    Hi, @mateusz1913

    First of all I wanted to say thank you for this library!

    I'm a little bit curious whether it's possible to customize background color of the view, which is shown under keyboard. Is it possible to make it transparent, for example?

    I'm asking, because on Android this space has a white color and it's not moving along with the keyboard (it's moving a little bit slower). And as a result we see how white space may be shown over the content.

    If it's not clear, what I'm describing - let me know and I can capture video/screenshots and explain it better :)

    enhancement 
    opened by kirillzyusko 8
  • Excessive avoidOffset on Anroid

    Excessive avoidOffset on Anroid

    Environment

    Library version: 2.4.6 OS version: Android 12

    Affected platforms

    • [X] Android
    • [ ] iOS

    Current behavior

    Hello everyone I have code structure something like that:

    useMount(() => {
        AvoidSoftInput.setAdjustNothing();
        return () => {
          AvoidSoftInput.setDefaultAppSoftInputMode();
        };
      });
    
    <SafeAreaView>
          <ScrollView>
            <AvoidSoftInputView avoidOffset={65}>
              <Input
                style={{marginTop: 100, marginHorizontal: 24}}
                placeholder="text"
              />
            </AvoidSoftInputView>
          </ScrollView>
        </SafeAreaView>
    

    I expect when input is situated above the opened keyboard and there is no need to push Input above the keyboard because it`s visible on its own avoidOffset should not be applied. It works this way on IOS but not Android

    https://user-images.githubusercontent.com/41858788/196190187-f7308e21-15be-42e1-8603-c4e0b36a74fb.mov

    https://user-images.githubusercontent.com/41858788/196190198-028a5ab2-fe67-4e8c-8492-21fe48592875.mov

    Expected behavior

    avoidOffset is applied when input has to be pushed above the keyboard

    Reproduction

    bug 
    opened by hahahatey 6
  • Error: Fata Exception : Crash

    Error: Fata Exception : Crash

    Environment

    Library version: ^2.4.3 OS version: android android 10

    Affected platforms

    • [X] Android
    • [ ] iOS

    Current behavior

    Trying to display keyboard => crash

    Fatal Exception: java.lang.NullPointerException: null cannot be cast to non-null type com.facebook.react.uimanager.RootView
           at java.util.Objects.requireNonNull(Objects.java:228)
           at com.reactnativeavoidsoftinput.AvoidSoftInputManager.onSoftInputHeightChange(AvoidSoftInputManager.kt:125)
           at com.reactnativeavoidsoftinput.AvoidSoftInputManager.onSoftInputHeightChange$default(AvoidSoftInputManager.kt:104)
           at com.reactnativeavoidsoftinput.AvoidSoftInputModule.onSoftInputHeightChange(AvoidSoftInputModule.kt:114)
           at com.reactnativeavoidsoftinput.AvoidSoftInputProvider$onSoftInputHeightChange$$inlined$schedule$1.run(Timer.kt:149)
           at java.util.TimerThread.mainLoop(Timer.java:562)
           at java.util.TimerThread.run(Timer.java:512)
    
    ### Expected behavior
    

    Do not crash

    Reproduction

    const onFocusEffect = useCallback(() => {
       if (Platform.OS === 'android') {
         AvoidSoftInput.setAdjustNothing()
         AvoidSoftInput.setEnabled(true)
         AvoidSoftInput.setAvoidOffset(0)
       }
    
       return () => {
         if (Platform.OS === 'android') {
           AvoidSoftInput.setAvoidOffset(0)
           AvoidSoftInput.setEnabled(false)
           AvoidSoftInput.setDefaultAppSoftInputMode()
         }
       }
     }, [])
    
    
     const buttonContainerPaddingValue = useSharedValue(0)
    
     const buttonContainerAnimatedStyle = useAnimatedStyle(() => {
       return {
         paddingBottom: buttonContainerPaddingValue.value
       }
     })
    
     useSoftInputShown(({ softInputHeight }) => {
       buttonContainerPaddingValue.value = withTiming(softInputHeight)
     })
    
     useSoftInputHidden(() => {
       buttonContainerPaddingValue.value = withTiming(0)
     })
    
     useFocusEffect(onFocusEffect)
    
    bug 
    opened by batical 6
  • [Android] compileSdkVersion=33 prevents build

    [Android] compileSdkVersion=33 prevents build

    Environment

    Library version: 2.4.6 OS version: Android 12

    Affected platforms

    • [X] Android
    • [ ] iOS

    Current behavior

    Does not build on android Error messages :

    Task :react-native-avoid-softinput:compileDebugKotlin FAILED

    node_modules/react-native-avoid-softinput/android/src/main/java/com/reactnativeavoidsoftinput/AvoidSoftInputManager.kt: (310, 11): 'onAnimationEnd' overrides nothing

    Type mismatch: inferred type is Animator? but Animator was expected

    Expected behavior

    should build on android with compileSdkVersion=33

    Reproduction

    https://github.com/oliviermtl/avoid-softinput

    bug 
    opened by oliviermtl 5
  • AvoidSoftInputView not working

    AvoidSoftInputView not working

    Environment

    Library version: 2.4.4 OS version: Android emulator

    Affected platforms

    • [X] Android
    • [ ] iOS

    Current behavior

    I have one button in AvoidSoftInputView and one outside. Button don't move above keyboard, and white block cover almost all screen

    https://user-images.githubusercontent.com/97607365/163352163-811c1fde-3743-44c0-895a-fd5c786737ec.mov

    Expected behavior

    works as expected

    Reproduction

    AndroidManifest.xml android:windowSoftInputMode="adjustNothing"

    import React, {useState} from 'react';
    import {Text, ScrollView, View} from '@components';
    import {Pressable, StyleSheet, TextInput} from 'react-native';
    import {fonts} from '@assets';
    import {AvoidSoftInputView} from 'react-native-avoid-softinput';
    
    export const LoginEmail: React.FC = () => {
      const [code, setCode] = useState('');
      const [email, setEmail] = useState('');
      const login = () => {};
      const signUp = () => {};
    
      return (
        <View style={styles.container}>
          <AvoidSoftInputView style={styles.avoidingView}>
            <ScrollView style={styles.container}>
              <Text style={styles.title}>{'Hello'}</Text>
              <Text style={styles.subtitle}>
                {
                  'Some welcome message. Some welcome message. Some welcome message. Some welcome message. Some welcome message. Some welcome message.'
                }
              </Text>
              <TextInput style={styles.input} placeholder={'Code'} value={code} onChangeText={setCode} />
              <TextInput
                style={styles.input}
                placeholder={'Email'}
                value={email}
                onChangeText={setEmail}
                keyboardType={'email-address'}
              />
            </ScrollView>
            <Pressable onPress={login} style={styles.buttonLogin}>
              <Text>{'Login'}</Text>
            </Pressable>
          </AvoidSoftInputView>
          <Pressable onPress={signUp} style={styles.buttonSignup}>
            <Text>{'Sign up'}</Text>
          </Pressable>
        </View>
      );
    };
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
      },
      avoidingView: {
        flex: 1,
        paddingHorizontal: 24,
      },
      title: {
        fontFamily: fonts.poppinsBold,
        fontSize: 24,
        marginTop: 64,
        color: 'purple',
      },
      subtitle: {
        fontSize: 16,
        marginTop: 16,
      },
      input: {
        borderRadius: 4,
        borderWidth: 1,
        marginTop: 40,
      },
      buttonLogin: {
        height: 48,
        borderRadius: 24,
        borderWidth: 1,
        marginVertical: 8,
        alignItems: 'center',
        justifyContent: 'center',
      },
      buttonSignup: {
        height: 48,
        marginHorizontal: 24,
        borderRadius: 24,
    
        alignItems: 'center',
        justifyContent: 'center',
        marginBottom: 24,
      },
    });
    
    bug needs repro link 
    opened by osliver 5
  • android: FATAL EXCEPTION: heightChangeTimer

    android: FATAL EXCEPTION: heightChangeTimer

    Environment

    Library version: ^2.4.3 OS version: android android 10

    Affected platforms

    • [X] Android
    • [ ] iOS

    Current behavior

    when navigating while the keyboard is open, the app crashes also it does happen randomly sometimes.

    crash

    FATAL EXCEPTION: heightChangeTimer
    
    kotlin.TypeCastException: null cannot be cast to non-null type com.facebook.react.uimanager.RootView
    
    FATAL EXCEPTION: heightChangeTimer
    Process: com.zeal.dara, PID: 26493
    kotlin.TypeCastException: null cannot be cast to non-null type com.facebook.react.uimanager.RootView
    	at com.reactnativeavoidsoftinput.AvoidSoftInputManager.onSoftInputHeightChange(AvoidSoftInputManager.kt:125)
    	at com.reactnativeavoidsoftinput.AvoidSoftInputManager.onSoftInputHeightChange$default(AvoidSoftInputManager.kt:104)
    	at com.reactnativeavoidsoftinput.AvoidSoftInputModule.onSoftInputHeightChange(AvoidSoftInputModule.kt:114)
    	at com.reactnativeavoidsoftinput.AvoidSoftInputProvider$onSoftInputHeightChange$$inlined$schedule$1.run(Timer.kt:149)
    	at java.util.TimerThread.mainLoop(Timer.java:562)
    	at java.util.TimerThread.run(Timer.java:512
    

    Expected behavior

    for it to work without crashing.

    Reproduction

      const footerPaddingValue = useSharedValue(0)
    
      const onFocusEffect = React.useCallback(() => {
        AvoidSoftInput.setAdjustNothing()
        AvoidSoftInput.setEnabled(true)
    
        return () => {
          AvoidSoftInput.setEnabled(false)
          AvoidSoftInput.setDefaultAppSoftInputMode()
        }
      }, [])
    
      // @ts-ignore
      onFocusEffect(onFocusEffect)
    
      useSoftInputHeightChanged(({softInputHeight}) => {
        footerPaddingValue.value = withTiming(softInputHeight)
      })
    
      const style = useAnimatedStyle(
        () => ({
          height: WINDOW.height - footerPaddingValue.value,
        }),
        [],
      )
    
      return (
        <A.View style={style}>
        
    	 <TextInput onChangeText={() => {
    	      navigation.dispatch(CommonActions.reset({ })}} 
        />    
        
        </A.View>
      )
    
    
    bug 
    opened by a-eid 4
  • extra space at the bottom when the keyboard is up for both android & ios.

    extra space at the bottom when the keyboard is up for both android & ios.

    Environment

    Library version: ^2.4.1 OS version: iPhone 13, iOS 15.0

    System:
        OS: macOS 11.6.1
        CPU: (8) x64 Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
        Memory: 25.16 MB / 32.00 GB
        Shell: 5.8 - /bin/zsh
      Binaries:
        Node: 16.14.0 - /usr/local/bin/node
        Yarn: 1.22.15 - ~/.yarn/bin/yarn
        npm: 8.3.1 - ~/n/bin/npm
        Watchman: 2022.02.07.00 - /usr/local/bin/watchman
      Managers:
        CocoaPods: 1.11.3 - /Users/ahmedelshentenawy/.rvm/gems/ruby-2.7.4/bin/pod
      SDKs:
        iOS SDK:
          Platforms: DriverKit 21.0.1, iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0
        Android SDK:
          API Levels: 28, 29, 30, 31
          Build Tools: 28.0.3, 29.0.2, 29.0.3, 30.0.2, 30.0.3, 31.0.0
          System Images: android-29 | Google APIs Intel x86 Atom, android-29 | Google Play Intel x86 Atom
          Android NDK: 20.1.5948944
      IDEs:
        Android Studio: Bumblebee 2021.1.1 Patch 1 Bumblebee 2021.1.1 Patch 1
        Xcode: 13.1/13A1030d - /usr/bin/xcodebuild
      Languages:
        Java: 11.0.11 - /usr/bin/javac
      npmPackages:
        @react-native-community/cli: Not Found
        react: Not Found
        react-native: Not Found
        react-native-macos: Not Found
      npmGlobalPackages:
        *react-native*: Not Found
    

    Affected platforms

    • [X] Android
    • [X] iOS

    Current behavior

    extra space at the bottom when the keyboard is up.

    Expected behavior

    there should be no extra space.

    Reproduction

    https://user-images.githubusercontent.com/19273413/161309082-29617cf4-a295-4a78-90ce-d3d94b05f527.mp4

    https://user-images.githubusercontent.com/19273413/161309186-9c30026b-7d32-4114-991c-f8e2337896c9.mp4

     // using the native-stack from RN screens.
      React.useEffect(
        () => {
          const unsubscribe = navigation.addListener('appear', e => {
            AvoidSoftInput.setEnabled(true)
          });
    
          return () => {
            AvoidSoftInput.setEnabled(false)
            unsubscribe();
          };
        },
        [navigation]
      );
    
    bug 
    opened by a-eid 4
  • Support

    Support "New Architecture"

    Feature request

    Start "New Architecture" migration when ~~react-native v0.68 will be stable~~ all "New Architecture" features (Swift/Kotlin support, autolinking, etc.) will be stable-ish

    enhancement 
    opened by mateusz1913 4
Releases(v3.0.4)
Owner
Mateusz Mędrek
Mateusz Mędrek
React Native wrapper to bridge our iOS and Android SDK

React Native wrapper to bridge our iOS and Android SDK

Intercom 94 Jan 1, 2023
A simple library for validating user input in forms using annotations.

ValidationKomensky for Android A simple library for validating user input in forms using annotations. Features: Validate all views at once and show fe

Inmite s.r.o. 512 Nov 20, 2022
High level parsing to ensure your input is in the right shape and satisfies all constraints that business logic requires.

Parsix High level parsing to ensure your input is in the right shape and satisfies all constraints that business logic requires. It is highly inspired

null 190 Oct 16, 2022
Validator - Notify type based validation for input fields.

Validator - Notify type based validation for input fields.

Mustafa Yiğit 57 Dec 8, 2022
General purpose utilities and hash functions for Android and Java (aka java-common)

Essentials Essentials are a collection of general-purpose classes we found useful in many occasions. Beats standard Java API performance, e.g. LongHas

Markus Junginger 1.4k Dec 29, 2022
General purpose utilities and hash functions for Android and Java (aka java-common)

Essentials Essentials are a collection of general-purpose classes we found useful in many occasions. Beats standard Java API performance, e.g. LongHas

Markus Junginger 1.4k Dec 29, 2022
A set of lint rules to check for common mistakes when styling and theming on Android

A set of lint rules to check for common mistakes when styling and theming on Android

GuilhE 6 Aug 29, 2022
A robust native library loader for Android.

ReLinker A robust native library loader for Android. More information can be found in our blog post Min SDK: 9 JavaDoc Overview The Android PackageMan

Keepsafe 2.9k Dec 27, 2022
Routable, an in-app native URL router, for Android

Routable Routable is an in-app native URL router, for Android. Also available for iOS. Usage Set up your app's router and URLs: import com.usepropelle

Clay Allsopp 476 Nov 11, 2022
Fuzzy string matching for Kotlin (JVM, native, JS, Web Assembly) - port of Fuzzy Wuzzy Python lib

FuzzyWuzzy-Kotlin Fuzzy string matching for Kotlin (JVM, iOS) - fork of the Java fork of of Fuzzy Wuzzy Python lib. For use in on JVM, Android, or Kot

WillowTree, LLC 54 Nov 8, 2022
Multiplaform kotlin library for calculating text differences. Based on java-diff-utils, supports JVM, JS and native targets.

kotlin-multiplatform-diff This is a port of java-diff-utils to kotlin with multiplatform support. All credit for the implementation goes to original a

Peter Trifanov 51 Jan 3, 2023
SoLoader is a native code loader for Android.

SoLoader is a native code loader for Android. It takes care of unpacking your native libraries and recursively loads dependencies on platforms that don't support that out of the box.

Meta 1.2k Jan 3, 2023
Gitversion - A native console application to calculate a version based on git commits and tags

GitCommit A native console application to calculate a version based on git commi

Solugo 5 Sep 13, 2022
Native Kotlin library for time-based TOTP and HMAC-based HOTP one-time passwords

A kotlin implementation of HOTP (RFC-4226) and TOTP (RFC-6238). Supports validation and generation of 2-factor authentication codes, recovery codes and randomly secure secrets.

Robin Ohs 6 Dec 19, 2022
Android Utilities Library build in kotlin Provide user 100 of pre defined method to create advanced native android app.

Android Utilities Library build in kotlin Provide user 100 of pre defined method to create advanced native android app.

Shahid Iqbal 4 Nov 29, 2022
A Kotlin native Postgres driver for SqlDelight.

Module postgres-native-sqldelight A native Postgres driver for SqlDelight. Source code Install This package is uploaded to MavenCentral and supports m

Philip Wedemann 19 Dec 30, 2022
Small Android library to help you incorporate MVP, Passive View and Presentation Model patterns in your app

DroidMVP About DroidMVP is a small Android library to help you incorporate the MVP pattern along with Passive View and Presentation Model (yes, those

Andrzej Chmielewski 225 Nov 29, 2022
BinGait is a tool to disassemble and view java class files, developed by BinClub.

BinGait Tool to diassemble java class files created by x4e. Usage To run BinGait, run java -jar target/bingait-shadow.jar and BinGait will launch. If

null 18 Jul 7, 2022
Medich is an application that raises the problem of satisfaction related to BPJS, especially in the lower classes, with Medich being able to solve all these problems

Medich is an application that raises the problem of satisfaction related to BPJS, especially in the lower classes, with Medich being able to solve all these problems. Medich has a Donation feature that will be very useful for the Community

Zainul 5 Dec 18, 2022
🤹 Common Kotlin utilities made for my personal usage, comes with SLF4J utilities, common extensions, common Gradle utilities, and more.

?? common-utils Common Kotlin utilities made for my personal usage, comes with SLF4J utilities, common extensions, ansi-colours, common Gradle utiliti

Noel ʕ •ᴥ•ʔ 6 Dec 2, 2022