Qiscus provide everything you need to power up your app with chats. And it's now made simple.

Overview

Introduction

Qiscus Chat SDK (Software Development Kit) is a product provided by Qiscus that enables you to embed an in-app chat/chat feature in your applications quickly and easily. With our chat SDK, you can implement chat feature without dealing with the complexity of real-time communication infrastructure. We provide a powerful API to let you implement chat feature into your apps in the most seamless development process.

Qiscus Chat SDK provides many features such as:

  • 1-on-1 chat
  • Group chat
  • Channel chat
  • Typing indicator
  • Image and file attachment
  • Online presence
  • Delivery receipt
  • Read receipt
  • Delete message
  • Offline message
  • Block user
  • Custom real-time event
  • Server-side integration with Server API and Webhook
  • Embed bot engine in your app
  • Enable push notification
  • Export and import messages from your app

Try Sample App

We have provided a sample app to help you get to know with our chat SDK. This sample app is built with full functionalities so that you can figure out the flow and main activities using Qiscus Chat SDK. Now you can freely customize your own UI. You can also build your own app on top of our sample app. For further details you can download this sample.

git clone https://github.com/qiscus/qiscus-chat-sdk-android-sample.git

This sample app uses sample APP ID, which means, by using this sample app, you will share the data with others. In case you want to try by your own, you can change the APP ID into your own APP ID. You can find your APP ID in your dashboard. Click here to access your dashboard

Getting Started

Step 1: Get Your APP ID

First, you need to create your application in dashboard, by accessing Qiscus Chat Dashboard. You can create more than one App ID.

Step 2: Install Qiscus Chat SDK

Qiscus Chat SDK requires minimum Android API 16 (Jelly Bean). To integrate your app with Qiscus, it can be done in 2 (two) steps. First, you need to add URL reference in your .gradle project. This reference is a guide for .gradle to get Qiscus Chat SDK from the right repository. Below is how to do that:

allprojects { 
      repositories { 
           ... 
           maven { url "https://artifactory.qiscus.com/artifactory/qiscus-library-open-source" } 
      } 
}

Second, you need to add SDK dependencies inside your app .gradle. Then, you need to synchronize to compile the Qiscus Chat SDK for your app.

dependencies { 
       ... 
       implementation 'com.qiscus.sdk:chat-core:1.3.30'
}

Step 3: Initialization Qiscus Chat SDK

You need to initiate your APP ID for your chat app before carry out to authentication. This initialization only needs to be done once in the app lifecycle. Initialization can be implemented in the initial startup. Here is how you can do that:

public class SampleApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        QiscusCore.initWithAppId(this, APPID);

  }
 }

The initialization should be called once across an Android app . The best practice you can put in application class.

Step 4: Authenticate to Qiscus

To use Qiscus Chat SDK features, a user need to authenticate to Qiscus Server, for further detail you might figure out Authentication section. This authentication is done by calling setUser() function. This function will retrieve or create user credential based on the unique userId, for example:

QiscusCore.setUser(userId, userKey)
      .withUsername(username)
      .withAvatarUrl(avatarUrl)
      .withExtras(extras)
      .save(new QiscusCore.SetUserListener() {
          @Override
          public void onSuccess(QiscusAccount qiscusAccount) {
              //on success
          }
          @Override
          public void onError(Throwable throwable) {
              //on error 
      });

Where:

userId (string, unique): A user identifier that will be used to identify a user and used whenever another user need to chat with this user. It can be anything, whether is is user's email, your user database index, etc. As long as it is unique and a string.

userKey (string): userKey for authentication purpose, so even if a stranger knows your user Id, he cannot access the user data.

username (string): Username for display name inside Chat Room purposes.

avatarURL (string, optional): to display user's avatar, fallback to default avatar if not provided.

You can learn from the figure below to understand what really happened when calling setUser() function:



Updating User Profile

After your user account is created, sometimes you may need to update a user information, such as changing user avatar. You can use method QiscusCore.updateUser() to make changes to your account.

QiscusCore.updateUser(userName, avatarUrl, new QiscusCore.SetUserListener() {
            @Override
            public void onSuccess(QiscusAccount qiscusAccount) {
                //do anything after it successfully updated
            }

            @Override
            public void onError(Throwable throwable) {
                //do anything if error occurs
            }
        });

Clear User Data and disconnect

As mentioned in previous section, when you did setUser(), user's data will be stored locally. When user need to disconnect from Qiscus Chat SDK service, you need to clear the user data that is related to Qiscus Chat SDK, such as token, profile, messages, rooms, etc, from local device. You can do this by calling clearUser() method :

QiscusCore.clearUser();

Create Chat Room

Chat Room is a place where 2 or more users can chat each other. There are 3 type of Chat Room that can be created using Qiscus Chat SDK: 1-on-1 Chat Room, Group Chat Room, and Channel. For some cases, a room can be identified by room unique id or room name.

1-on-1 Chat Room

We assume that you already know a targeted user you want to chat with. Make sure that your targeted user has been registered in Qiscus Chat SDK through setUser() method, as explained in the previous section. To start a conversation with your targeted user, it can be done with getChatRoom() method. Qiscus Chat SDK, then, will serve you a new Chat Room, asynchronously. When the room is succesfully created, Qiscus Chat SDK will return a Chat Room package through onSuccess() listener.

QiscusApi.getInstance().chatUser(userId, options)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(chatRoom -> {
                    // on success         
                }, throwable -> {
                    // on error        
                });

Where:

userId: A User identifier that will be used to identify a user and used whenever another user needs to chat with this user. It can be anything, whether is user's email, your user database index, etc. As long as it is unique and a string.

distinctId: (deprecated) you can fill “ ” (empty string).

options: metadata that can be as additional information to Chat Room, which consists key-value, for example, key: background, and value: red.

Group Chat Room

When you want your many users to chat together in a 1-on-1 chat room, you need to create Group Room. Basically Group Room has the same concept as 1-on-1 Chat Room, but the different is that Group Room will target array of userIds in a single method. Here how you can create Group Room:

QiscusApi.getInstance().createGroupChat(roomName, userIds, avatarUrl, options);
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(chatRoom -> {
                    // on success
                }, throwable -> {
                    // on error
                });

Channel

Creating Channel Chat Room is ideal for a use case that requires a lot of number participants, more than 100.

You need to set uniqueId to identify a Channel Chat Room. If a Chat Room with predefined uniqueId doesn't exist, it will create a new one with requester as the only one participant. Otherwise, if Chat Room with predefined uniqueId already exists, it will return that room and add requester as a participant.

When the room doesn't exist at the very first call and you do not send avatarUrl and/or roomName, it will use the default value. But, after the second call (room does exist) and you send avatarUrl and/or roomName, it will be updated to that value. For example the implementation creating channel:

QiscusApi.getInstance().createChannel(uniqueId, roomName, avatarUrl, options)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(chatRoom -> {
                    // on success
                }, throwable -> {
                    // on error
                });

Room Participant Management

In some cases, you may need to add additional participants into your room chat or even removing any participant.

Get Chat Room List

To get all room list you can call QiscusApi.getInstance().getChatRooms(int page, int limit, boolean showMembers), page start from 1, limit indicate the max rooms per page, showMembers is flag for load room members also or not. Here sample code:

QiscusApi.getInstance().getAllChatRooms(showParticipant, showRemoved, showEmpty, page, limit)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(chatRooms -> {
        //on success
    }, throwable -> {
        //on error
    });

Add Participant in Chat Room

You can add more than a participant in Chat Room by calling addRoomMember method. You can also pass multiple userIds. Once a participant succeeds to join the Chat Room, they will get a new Chat Room in their Chat Room list.

QiscusApi.getInstance().addParticipants(roomId, userId)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(chatRoom -> {
           // on success
        }, throwable -> {
            //on error        
        });

Remove Participant in Chat Room

You can remove more than a participant in Chat Room by calling removeRoomMember method. You can also pass multiple userId. Once a participant is removed from the Chat Room, they will not find related Chat Room in their Chat Room list.

QiscusApi.getInstance().removeParticipants(roomId, userId)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(chatRoom -> {
           //success
        }, throwable -> {
            //error        
        });

Enable Push Notification

First install FCM to your apps, you can follow this steps. You can skip this step, if your apps already use FCM. Then put your api key to qiscus dashboard. Now lets integrate with Qiscus client sdk, first enable FCM at Qiscus chat config.

Qiscus.getChatConfig().setEnableFcmPushNotification(true);

After that, you need to change your firebase service to extend 'Qiscus firebase service' instead of firebase service class.

public class MyFirebaseIdService extends QiscusFirebaseIdService {
    @Override
    public void onTokenRefresh() {
        super.onTokenRefresh(); // Must call super
        
        // Below is your own apps specific code
        // e.g register the token to your backend
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        sendTokenToMyBackend(refreshedToken);
    }
}

public class MyFirebaseMessagingService extends QiscusFirebaseService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (handleMessageReceived(remoteMessage)) { // For qiscus
            return;
        }

        //Your FCM PN here
    }
}

If extension is not possible or desirable, use the following code the ensure Qiscus handle the FCM.

public class MyFirebaseIdService extends FirebaseInstanceIdService {
    @Override
    public void onTokenRefresh() {
        super.onTokenRefresh();
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();

        // Register token to qiscus
        QiscusCore.setFcmToken(refreshedToken);

        // Below is your own apps specific code
        // e.g register the token to your backend
        sendTokenToMyBackend(refreshedToken);
    }
}

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (QiscusFirebaseService.handleMessageReceived(remoteMessage)) { // For qiscus
            return;
        }

        // Your FCM PN here
    }
}

Event Handler

Qiscus Chat SDK provides a simple way to let applications publish and listen to some real-time events. You can publish typing, read, user status, custom event so that you can handle freely in the event handler. This lets you inform users that another participant is actively engaged in communicating with them.

Qiscus Chat SDK is using EventBus for broadcasting event to the entire applications. You can learn more about EventBus on this website. What you need to do is register the object which will receive event from EventBus. You can call it like this:

EventBus.getDefault().register(this);

Once you don't need to listen to the event anymore, you have to unregister the receiver by calling this method:

EventBus.getDefault().unregister(this);

This is an example on how to register an activity to receive event from EventBus:

public class MyActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        setContentView(R.layout.activity_my);

        // listen room event
        QiscusPusherApi.getInstance().subscribeChatRoom(qiscusChatRoom);

        // listen user status
        QiscusPusherApi.getInstance().subscribeUserOnlinePresence("userId");
    }

    @Override
    protected void onResume() {
        super.onResume();
        EventBus.getDefault().register(this); // register to EventBus
    }

    @Override
    protected void onPause() {
        super.onPause();
        EventBus.getDefault().unregister(this); // unregister from EventBus
    }

    @Subscribe
    public void onReceiveComment(QiscusCommentReceivedEvent event) {
        event.getQiscusComment(); // to get the comment    
    }

    @Subscribe
    public void onReceiveRoomEvent(QiscusChatRoomEvent roomEvent) {
        switch (roomEvent.getEvent()) {
            case TYPING:
                roomEvent.getRoomId(); // this is the room id                
                roomEvent.getUser(); // this is the qiscus user id                
                roomEvent.isTyping(); // true if the user is typing                
                break;
            case DELIVERED:
                roomEvent.getRoomId(); // this is the room id                
                roomEvent.getUser(); // this is the qiscus user id                
                roomEvent.getCommentId(); // the comment id was delivered                
                break;
            case READ:
                roomEvent.getRoomId(); // this is the room id                
                roomEvent.getUser(); // this is the qiscus user id                
                roomEvent.getCommentId(); // the comment id was read               
                break;
            case CUSTOM:
                //here, you can listen custom event
                roomEvent.getRoomId(); // this is the room id
                roomEvent.getUser(); // this is the qiscus user id
                roomEvent.getEventData(); //event data (JSON)
                break;
        }
    }

    @Subscribe
    public void onUserStatusChanged(QiscusUserStatusEvent event) {
        event.getUser(); // this is the qiscus user id    
        event.isOnline(); // true if user is online    
        event.getLastActive(); // Date of last active user
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // stop listening room event
        QiscusPusherApi.getInstance().unsubsribeChatRoom(qiscusChatRoom);

        // stop listening user status
        QiscusPusherApi.getInstance().unsubscribeUserOnlinePresence("qiscus_user_id");
    }
}

Using Proguard

ProGuard is the most popular optimizer for Java bytecode. It makes your Java and Android applications smaller and faster. Read here for more detail about Proguard. If you are using Proguard in your application, make sure you add Proguard rules of Qiscus from Qiscus Proguard Rules to your Proguard rules.

RXJava Support

For you who prefer to code with RXJava, Qiscus Chat SDK does support RXJava. So, you can do anything as you do with Native Java. For example, to set a user, as has been explained in Basic Authentication section, you can do the same with RXJava. Here an example of how you can set user with it:

// Setup qiscus account with rxjava example
Qiscus.setUser("[email protected]", "password")
      .withUsername("Tony Stark")
      .withAvatarUrl("http://avatar.url.com/handsome.jpg")
      .save()
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(qiscusAccount -> {
          //do anything if success
      }, throwable -> {
          //do anything if error occurs
      });
Comments
  • java.lang.NoClassDefFoundError: com.vanniktech.emoji.one.EmojiOneProvider Against Android API 19 (4.4.2)

    java.lang.NoClassDefFoundError: com.vanniktech.emoji.one.EmojiOneProvider Against Android API 19 (4.4.2)

    I encountered the following error as I tested version 2.8.0 against Android API 19 - 4.4.2. (com.qiscus.sdk:chat:2.8.0)

    This error occurs at line: Qiscus.init(this, "MY_APP_ID");

    Error Log: FATAL EXCEPTION: main Process: com.smartapplications.smartapp, PID: 27042 java.lang.NoClassDefFoundError: com.vanniktech.emoji.one.EmojiOneProvider at com.qiscus.sdk.Qiscus.initWithCustomServer(Qiscus.java:138) at com.qiscus.sdk.Qiscus.init(Qiscus.java:98) at com.smartapplications.smartapp.SmartApp.onCreate(SmartApp.java:37) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4582) at android.app.ActivityThread.access$1500(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1402) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5333) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) at dalvik.system.NativeStart.main(Native Method)

    opened by EdwardQuixote 7
  • Upload old chat-core releases to artifactory.qiscus.com

    Upload old chat-core releases to artifactory.qiscus.com

    I am getting the following error when trying to install chat-core:1.3.2

    > Could not GET 'https://dl.bintray.com/qiscustech/maven/com/qiscus/sdk/chat-core/1.3.2/chat-core-1.3.2.pom';. Received status code 403 from server: Forbidden

    Bintray was official deprecated as per the official announcement https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/

    In this commit you have moved away from Bintray to Artifactory https://github.com/qiscus/qiscus-sdk-android/commit/7847a5e05b50d0b897dbbf608c6c29e42b7ba395

    The current documentation shows this snippet:

    allprojects { 
        repositories {  
             maven { url "https://artifactory.qiscus.com/artifactory/qiscus-library-open-source" } 
        } 
    }
    

    However, this URL https://artifactory.qiscus.com/artifactory/qiscus-library-open-source/com/qiscus/sdk/chat-core/ has no releases before 1.3.27. Could you please upload the old releases?

    Screen Shot 2021-05-06 at 14 11 58
    opened by paulbehrisch 6
  • add feature quick reply from notification

    add feature quick reply from notification

    1. Default dari feature ini ada false. untuk menggunakannya melalui qiscus config Qiscus.getChatConfig().setEnableReplyNotification(true)
    2. Reply ini support untuk Android N, sedangkan versi dibawah Android N akan masuk ke chat activity
    opened by rajapulau 5
  • Insecure Storage of Sensitive Data

    Insecure Storage of Sensitive Data

    Hi Team,

    During testing of an application we came to know that they are storing qiscus.cfg.xml files through which some of keys are been disclosed.

    In Line #1005 It is also mentioned: LocalDataManager() { sharedPreferences = QiscusCore.getApps().getSharedPreferences("qiscus.cfg", Context.MODE_PRIVATE); gson = new Gson(); token = isLogged() ? getAccountInfo().getToken() : "";

    Isn't it a security threat ? As an attacker can steal the qiscus authorization tokens from here.

    opened by BalvinderSingh23 4
  • NullPointerException at QiscusSyncJobService.java:143

    NullPointerException at QiscusSyncJobService.java:143

    I meet this issue for a long time, even after upgrade to the latest qiscusCore version 1.3.30 qiscus crash crash info I've looked at the SDK source code and saw this line got crashed: private void stopSync() { if (timer != null) { timer.cancel(); timer.purge(); timer = null; } } The stopSync only got called in log out and onDestroy service. In fact, this release note should fix that issue https://github.com/qiscus/qiscus-sdk-android/releases/tag/1.3.20 but I'm using 1.3.30 and it still occurred.

    opened by quyvv 4
  • Glide 4 Conflict

    Glide 4 Conflict

    Hi qiscus!

    i have issue about glide library.. my app is crashes when load image from qiscus.. is there any solution from that issue ?? i used glide 4.

    Thank You!

    opened by fadhilnurmahardi 4
  • Force close on notification click

    Force close on notification click

    Hello, I just try to create a simple app using qiscus.

    When I click on the new chat notification, the app always force closed. The logcat says that the app did not call the setuser method, although it did call the setuser method. Besides, how could the app receive a notification if the setuser method is not called yet ?

    I use sdk ver 2.7.2 error happened in android 6 and 7

    Following is the error log. Thank you in advance.

    FATAL EXCEPTION: main Process: com.mahasadhu.testchat, PID: 3860 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mahasadhu.testchat/com.qiscus.sdk.ui.QiscusChatActivity}: java.lang.RuntimeException: Please set Qiscus user before start the chatting! 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.RuntimeException: Please set Qiscus user before start the chatting! at com.qiscus.sdk.Qiscus.checkUserSetup(Qiscus.java:425) at com.qiscus.sdk.Qiscus.getQiscusAccount(Qiscus.java:224) at com.qiscus.sdk.ui.QiscusChatActivity.onViewReady(QiscusChatActivity.java:87) at com.qiscus.sdk.ui.QiscusBaseChatActivity.onCreate(QiscusBaseChatActivity.java:85) at android.app.Activity.performCreate(Activity.java:6662) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 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) 

    opened by mahasadhu 4
  • Error: Program type already present: android.arch.lifecycle.ViewModelStore

    Error: Program type already present: android.arch.lifecycle.ViewModelStore

    I am getting this error after including qiscus in me existing project. I thought it was conflict of glide so I tried to exclude glide by using: implementation ('com.qiscus.sdk:chat-core:1.2.12'){ exclude group: 'com.github.bumptech.glide', module: 'glide' }

    but still I am getting same error my current dependecies are as follow:

    implementation fileTree(include: ['*.jar'], dir: 'libs') //Chat dependencies implementation ('com.qiscus.sdk:chat-core:1.2.12'){ exclude group: 'com.github.bumptech.glide', module: 'glide' } //noinspection GradleCompatible implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:support-v4:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:design:28.0.0' implementation 'com.android.support:cardview-v7:28.0.0' implementation 'com.google.android.gms:play-services-maps:15.0.1' implementation 'com.google.android.gms:play-services-places:15.0.1' implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' //noinspection GradleCompatible implementation 'com.google.firebase:firebase-auth:16.0.5' implementation 'com.google.android.gms:play-services-auth:16.0.1' implementation 'com.google.firebase:firebase-database:16.0.4' implementation 'com.google.firebase:firebase-core:16.0.5' implementation 'com.google.firebase:firebase-storage:16.0.4' implementation 'com.firebaseui:firebase-ui-database:3.1.1' implementation 'com.google.firebase:firebase-messaging:17.3.4' implementation 'com.google.firebase:firebase-dynamic-links:16.1.3' implementation 'com.crashlytics.sdk.android:crashlytics:2.9.5' implementation 'com.android.support:support-annotations:27.1.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.github.bumptech.glide:glide:4.8.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'

    implementation 'de.hdodenhof:circleimageview:2.2.0'
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'com.jsibbold:zoomage:1.1.0-SNAPSHOT'
    implementation 'com.facebook.android:facebook-login:4.34.0'
    implementation 'com.squareup.picasso:picasso:2.71828'
    implementation 'org.greenrobot:eventbus:3.1.1'
    implementation 'com.firebase:geofire-android:2.3.1'
    implementation 'com.github.greenfrvr:hashtag-view:1.3.1'
    implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.10.0'
    implementation 'me.saket:better-link-movement-method:2.2.0'
    implementation 'org.ocpsoft.prettytime:prettytime:4.0.1.Final'
    implementation 'com.squareup.okhttp:okhttp:2.6.0'
    implementation 'com.squareup.retrofit:retrofit:1.9.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.3.1'
    implementation 'com.squareup.okhttp3:okhttp:3.8.1'
    implementation 'com.jakewharton.retrofit:retrofit1-okhttp3-client:1.0.2'
    
    implementation 'id.zelory:compressor:2.1.0'
    implementation 'joda-time:joda-time:2.10.1'
    
    implementation('com.google.api-client:google-api-client-android:1.20.0') {
        exclude module: 'guava-jdk5'
    }
    

    can you please give me any solution for this issue?

    opened by MoinHashmi 3
  • QiscusApi.getInstance().getChatRoom(roomId) returns nothing

    QiscusApi.getInstance().getChatRoom(roomId) returns nothing

    I got no return value from running QiscusApi.getInstance().getChatRoom(roomId). Below is the code that I used.

    QiscusApi.getInstance()
                    .getChatRoom(id)
                    .subscribeOn(Schedulers.io())
                    .doOnNext(chatRoom -> QiscusCore.getDataStore().addOrUpdate(chatRoom))
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(onSuccess::call, onError::call);
    
    opened by anuress 3
  • room sender color interceptor

    room sender color interceptor

    to intercept sender color name example

    Qiscus.getChatConfig().setRoomSenderNameColorInterceptor(qiscusComment -> R.color.accent);
    
    //or you can set the logic inside
    
    Qiscus.getChatConfig().setRoomSenderNameColorInterceptor(qiscusComment -> {
                if (anu) {
                    return R.color.colorAnu;
                } else if (anu2) {
                    return R.color.colorAnu2;
                } else {
                    return R.color.colorAnu3;
                }
            });
    
    //replybar color
    Qiscus.getChatConfig()
                    .setRoomReplybarColorInterceptor(qiscusComment -> R.color.qiscus_contact_background);
    
    //clear chats
    ArrayList<String> strings = new ArrayList<>();
            strings.add("uniqueid");
    
            QiscusApi.getInstance()
                    .clearChatRoomMessages(strings)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(aVoid -> Toast.makeText(MainActivity.this, "Berhasil", Toast.LENGTH_SHORT).show(), Throwable::printStackTrace);
    
    opened by andhikayuana 3
  • Could not find com.schinizer:rxunfurl:0.2.0

    Could not find com.schinizer:rxunfurl:0.2.0

    Hello everyone,

    When I remove jCenter from my project, the dependencies could not found for following library:

    > Could not find com.schinizer:rxunfurl:0.2.0.
        Searched in the following locations:
          - https://dl.google.com/dl/android/maven2/com/schinizer/rxunfurl/0.2.0/rxunfurl-0.2.0.pom
          - https://repo.maven.apache.org/maven2/com/schinizer/rxunfurl/0.2.0/rxunfurl-0.2.0.pom
          - https://jitpack.io/com/schinizer/rxunfurl/0.2.0/rxunfurl-0.2.0.pom
          - https://artifactory.qiscus.com/artifactory/qiscus-library-open-source/com/schinizer/rxunfurl/0.2.0/rxunfurl-0.2.0.pom
          - https://cardinalcommerceprod.jfrog.io/artifactory/android/com/schinizer/rxunfurl/0.2.0/rxunfurl-0.2.0.pom
        Required by:
            project :app > com.qiscus.sdk:chat-core:1.6.0
    
    opened by iffanmajid 2
  • PendingIntents attached to actions with remote inputs must be mutable

    PendingIntents attached to actions with remote inputs must be mutable

    Qiscus Chat SDK (buildIn) 2.31.3

    App crashed when chat notification arrived.

    Error: PendingIntents attached to actions with remote inputs must be mutable

    Stacktrace: at androidx.core.app.NotificationManagerCompat.notify(NotificationManagerCompat.java:223) at androidx.core.app.NotificationManagerCompat.notify(NotificationManagerCompat.java:205) at com.qiscus.sdk.util.QiscusPushNotificationUtil.lambda$pushNotification$6(QiscusPushNotificationUtil.java:344) at com.qiscus.sdk.util.-$$Lambda$QiscusPushNotificationUtil$uk81Wpi_y-UBE25yWqUnDqr9M24.run(Unknown Source:6)

    Please update the buildin sdk to latest version of chat-core.

    opened by dieehard 1
Releases(1.6.1)
  • 1.6.1(Dec 13, 2022)

  • 1.6.0(Oct 25, 2022)

    Changelog :

    • New Flow expired token

    implementation call API refresh token if the auto-refresh token is false from BE (by default is true), request contact us for setting auto-refresh false

    for implementation manually calling the API refresh token, can use this code.

    @Subscribe
        public void onRefreshToken(QiscusRefreshTokenEvent event) {
            if (event.isTokenExpired()) {
                 if auto refresh token false from be, you need to call api refresh token manually
                //callRefreshToken();
            } else if (event.isUnauthorized()) {
                //need to force logout
                logoutUser();
            } else {
                // do somethings
            }
        }
        
     private void callRefreshToken() {
            QiscusCore.refreshToken(new QiscusCore.SetRefreshTokenListener() {
                @Override
                public void onSuccess(QiscusRefreshToken refreshToken) {
                
                }
    
                @Override
                public void onError(Throwable throwable) {
                
                }
            });
        }
    
        private void logoutUser() {
            if (QiscusCore.hasSetupUser()) {
                Qiscus.clearUser();
            }
        }
    

    ***Note :

    • Please contact us, if you want to implement the flow expired token and manually or automatic call the API refresh token
    Source code(tar.gz)
    Source code(zip)
  • 1.5.1(Sep 29, 2022)

  • 1.5.0(Sep 20, 2022)

    Changelog :

    • Support ExpiredToken

    for example :

    • if you get error when call API qiscusCore with error code 403, please call api refreshToken
     QiscusAccount account = QiscusCore.getQiscusAccount();
            QiscusApi.getInstance().refreshToken(account.getEmail(), account.getRefreshToken())
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(QiscusCore::saveRefreshToken, throwable -> {
                        QiscusErrorLogger.print(throwable);
                    });
     
    
    Source code(tar.gz)
    Source code(zip)
  • 1.4.4(Aug 18, 2022)

    Changelog :

    • Prevent crash android.permission.SCHEDULE_EXACT_ALARM set false from user

    Note:

    • Please show the popup customer to enable SCHEDULE_EXACT_ALARM permission, because Qiscus Core SDK (Application) can't create a popup, only from activity can create the popup
    • If SCHEDULE_EXACT_ALARM permission is set to false, new messages will be delayed (only from sync and PN for realtime new messages)

    for example to show popup :

    AlarmManager alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                if (!alarmMgr.canScheduleExactAlarms()) {
    
                    AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
                    alertBuilder.setCancelable(true);
                    alertBuilder.setTitle("Permission necessary");
                    alertBuilder.setMessage("Schedule Exact Alarm permission is necessary for realtime");
                    alertBuilder.setPositiveButton(android.R.string.yes, (dialog, which) -> {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                            Intent intent = new Intent(
                                    ACTION_REQUEST_SCHEDULE_EXACT_ALARM,
                                    Uri.parse("package:" + this.getPackageName())
                            );
    
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            this.getApplicationContext().startActivity(intent);
                        }
                    });
    
                    AlertDialog alert = alertBuilder.create();
                    alert.show();
    
                }
            }
    
    Source code(tar.gz)
    Source code(zip)
  • 1.4.3(Aug 11, 2022)

  • 1.4.2(Jul 20, 2022)

  • 1.4.1(Jul 14, 2022)

  • 1.4.0(Jun 21, 2022)

    Changelog :

    • Fix security issue in sdk (https://github.com/qiscus/qiscus-sdk-android/issues/97)

    Requirement :

    • minSdkVersion 21

    ***Note : if you are already using the sdk version at least 1.4.0 , if you downgrade to the previous version (1.3.xx), please force logout when opening apps, because there is a difference in data

    Source code(tar.gz)
    Source code(zip)
  • 2.31.3(Apr 19, 2022)

  • 1.3.37(Apr 19, 2022)

  • 2.31.2(Dec 16, 2021)

  • 1.3.36(Dec 16, 2021)

  • 2.31.1(Nov 2, 2021)

    Changelog :

    • Support Android 12

    ****Note : Please check your code to support android 12, from link https://developer.android.com/about/versions/12/behavior-changes-12

    Source code(tar.gz)
    Source code(zip)
  • 1.3.35(Nov 2, 2021)

    Changelog :

    • Support Android 12

    ****Note :

    • Set targetSDKVersion = 31
    • Set compileSDKVersion = 31
    • Please check your code to support android 12, from link https://developer.android.com/about/versions/12/behavior-changes-12

    e.g. when using PendingIntent:

     PendingIntent pendingIntent;
            Intent openIntent = new Intent(context, QiscusPushNotificationClickReceiver.class);
            openIntent.putExtra("data", comment);
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                pendingIntent = PendingIntent.getBroadcast(context, QiscusNumberUtil.convertToInt(comment.getRoomId()),
                        openIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
            } else {
                pendingIntent = PendingIntent.getBroadcast(context, QiscusNumberUtil.convertToInt(comment.getRoomId()),
                        openIntent, PendingIntent.FLAG_CANCEL_CURRENT);
            }
    
    

    eg when using intent-filter in manifest, set android:exported false or true

      <activity android:name=".MainActivity"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
    Source code(tar.gz)
    Source code(zip)
  • 1.3.34(Aug 31, 2021)

  • 1.3.33(Aug 12, 2021)

    Changelog :

    • Fix close realtime connection without affecting sync interval

    ****Note : On normal occurence, sync interval will be changed to 5 seconds from 30 seconds when realtime connection are closed but if closeRealtimeConnection() are called, it will still on 30 seconds interval

    Source code(tar.gz)
    Source code(zip)
  • 2.31.0(Aug 9, 2021)

  • 1.3.32(Aug 3, 2021)

    Changelog :

    • Remove audio record in manifest
    • Implement feature open and close realtimeConnection (Manually)

    Example : for open realtime connection

    QiscusCore.openRealtimeConnection();
    

    for close realtime connection

    QiscusCore.closeRealtimeConnection();
    

    **** Please resubscribe to chatRoom/refresh activity when using manually open realtimeConnection in chatRoom after realtimeConnection is connected from eventbus onMqttEvent(QiscusMqttStatusEvent event)

    @Subscribe
    public void onMqttEvent(QiscusMqttStatusEvent event) {
        //boolean isConnected = event == QiscusMqttStatusEvent.CONNECTED;
        //resubscribe
    }
    
    Source code(tar.gz)
    Source code(zip)
  • 2.30.21(Jun 22, 2021)

  • 1.3.31(Jun 22, 2021)

    Changelog :

    • Fix crash in sync service
    • Update firebaseMessaging v22.0.0, and firebaseCore v19.0.0

    ***Note :

    If you get error in firebase when running using this version, and you are using firebaseMessaging version lower 22.0.0 in MainAPP, please update your code to get deviceToken from fcm

    for example :

    FirebaseMessaging.getInstance().getToken()
                    .addOnCompleteListener(new OnCompleteListener<String>() {
                        @Override
                        public void onComplete(@NonNull Task<String> task) {
                            if (!task.isSuccessful()) {
                                Log.e("Qiscus", "getCurrentDeviceToken Failed : " +
                                        task.getException());
                                return;
                            }
                            if (task.getResult() != null) {
                                String currentToken = task.getResult();
                                MyApplication.getInstance().getComponent().getUserRepository().
                                        setDeviceToken(currentToken);
                                QiscusCore.registerDeviceToken(currentToken);
                            }
                        }
                    });
    
    Source code(tar.gz)
    Source code(zip)
  • 2.30.20(Apr 29, 2021)

    Changelog :

    • Support android 10 & 11 for fix issue can't download or upload file_attachment
    • Remove request manage external storage in manifest
    Source code(tar.gz)
    Source code(zip)
  • 1.3.30(Apr 29, 2021)

    Changelog :

    • Support android 10 & 11 for fix issue can't download or upload file_attachment
    • Remove request manage external storage in manifest
    • Migrate the chat-core library from Bintray to Artifactory

    ****Note :

    • If you use feature compress image, please update your code for example
    public static File compressImage(File imageFile) {
    
            FileOutputStream out = null;
            String filename = "";
            int androidVersion = Build.VERSION.SDK_INT;
            if (androidVersion >= 29) {
                filename =  QiscusFileUtil.generateFilePath(imageFile.getName(), ".jpg", Environment.DIRECTORY_PICTURES);
            } else {
                filename = QiscusFileUtil.generateFilePath(imageFile.getName(), ".jpg");
            }
            try {
                out = new FileOutputStream(filename);
    
                //write the compressed bitmap at the destination specified by filename.
                QiscusImageUtil.getScaledBitmap(Uri.fromFile(imageFile)).compress(Bitmap.CompressFormat.JPEG,
                        QiscusCore.getChatConfig().getQiscusImageCompressionConfig().getQuality(), out);
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                } catch (IOException ignored) {
                    //Do nothing
                }
            }
    
            File compressedImage = new File(filename);
            QiscusFileUtil.notifySystem(compressedImage);
    
            return compressedImage;
        }
    
    • code for take camera
    public static File createImageFile() throws IOException {
           if (androidVersion >= 29) {
                String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
                String imageFileName = "JPEG_" + timeStamp + "_";
                File storageDir = QiscusCore.getApps().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
                File image = File.createTempFile(
                        imageFileName,  /* prefix */
                        ".jpg",         /* suffix */
                        storageDir      /* directory */
                );
    
                QiscusCacheManager.getInstance().cacheLastImagePath("file:" + image.getAbsolutePath());
                return image;
            } else {
                String timeStamp = new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.US).format(new Date());
                String imageFileName = "JPEG-" + timeStamp + "-";
                File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
                File image = File.createTempFile(imageFileName, ".jpg", storageDir);
                QiscusCacheManager.getInstance().cacheLastImagePath("file:" + image.getAbsolutePath());
                return image;
            }
        }
    
    • To integrate your app with Qiscus, it can be done in 2 (two) steps. First, you need to add URL reference in your .gradle project. This reference is a guide for .gradle to get Qiscus Chat SDK from the right repository. Below is how to do that:
    allprojects {
        repositories {
            maven {
                url "https://artifactory.qiscus.com/artifactory/qiscus-library-open-source"
            }
        }
    }
    

    Second, you need to add SDK dependencies inside your app .gradle. Then, you need to synchronize to compile the Qiscus Chat SDK for your app.

    dependencies {
        implementation 'com.qiscus.sdk:chat-core:1.3.30'
    }
    

    You can see our sample for update this migration in this link :

    https://github.com/qiscus/qiscus-chat-sdk-android-sample.git
    
    Source code(tar.gz)
    Source code(zip)
  • 2.30.19(Apr 27, 2021)

  • 1.3.29(Apr 27, 2021)

  • 2.30.18(Mar 30, 2021)

    Changelog :

    • All feature from SDK Chat-Core version 1.3.28
    • Migrate the chat Library (BuildIn) from Bintray to Artifactory

    To integrate your app with Qiscus, it can be done in 2 (two) steps. First, you need to add URL reference in your .gradle project. This reference is a guide for .gradle to get Qiscus Chat SDK from the right repository. Below is how to do that:

    allprojects {
        repositories {
            maven {
                url "https://artifactory.qiscus.com/artifactory/qiscus-library-open-source"
            }
        }
    }
    

    Second, you need to add SDK dependencies inside your app .gradle. Then, you need to synchronize to compile the Qiscus Chat SDK for your app.

    dependencies {
        implementation 'com.qiscus.sdk:chat:2.30.18'
    }
    
    Source code(tar.gz)
    Source code(zip)
  • 1.3.28(Mar 30, 2021)

    Changelog :

    • Remove duplicate manifest
    • Add new parameters userId, includeExtensions, excludeExtensions in getFileList() api
    • Migrate the chat-core library from Bintray to Artifactory

    To integrate your app with Qiscus, it can be done in 2 (two) steps. First, you need to add URL reference in your .gradle project. This reference is a guide for .gradle to get Qiscus Chat SDK from the right repository. Below is how to do that:

    allprojects {
        repositories {
            maven {
                url "https://artifactory.qiscus.com/artifactory/qiscus-library-open-source"
            }
        }
    }
    

    Second, you need to add SDK dependencies inside your app .gradle. Then, you need to synchronize to compile the Qiscus Chat SDK for your app.

    dependencies {
        implementation 'com.qiscus.sdk:chat-core:1.3.28'
    }
    

    You can see our sample for update this migration in this link :

    https://github.com/qiscus/qiscus-chat-sdk-android-sample.git
    
    Source code(tar.gz)
    Source code(zip)
  • 1.3.27(Jan 25, 2021)

    Changelog :

    • Implement feature update message
    • Handle Android API 30 when saving local storage

    For example send update message

     Subscription subscription = QiscusApi.getInstance().updateMessage(qiscusComment)
                    .doOnNext(this::commentEditSuccess)
                    .doOnError(throwable -> {
                        QiscusErrorLogger.print(throwable);
                        throwable.printStackTrace();
                    })
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .compose(bindToLifecycle())
                    .subscribe(commentSend -> {
                        if (commentSend.getRoomId() == room.getId()) {
                            view.onSuccessSendEditComment(commentSend);
                        }
                    }, throwable -> {
                        QiscusErrorLogger.print(throwable);
                        throwable.printStackTrace();
                    });
    

    code when you receive update message

        @Subscribe
        public void onCommentUpdateEvent(QiscusCommentUpdateEvent event) {
            if (event.getQiscusComment().getRoomId() == room.getId()) {
                //if comment isType image, you need to delete local file. 
                //QiscusCore.getDataStore().deleteLocalPath(qiscusComment.getId());
    
                onGotUpdateComment(event.getQiscusComment());
            }
        }
    
    

    ****Note :

    • If you want to use this feature, please contact us (https://support.qiscus.com/hc/en-us/requests/new)
    • If you use feature compress image, please update your code for example
    public static File compressImage(File imageFile) {
    
            FileOutputStream out = null;
            String filename = "";
            int androidVersion = Build.VERSION.SDK_INT;
            if (androidVersion >= 29) {
                filename =  QiscusFileUtil.generateFilePath(imageFile.getName(), ".jpg", Environment.DIRECTORY_PICTURES);
            } else {
                filename = QiscusFileUtil.generateFilePath(imageFile.getName(), ".jpg");
            }
            try {
                out = new FileOutputStream(filename);
    
                //write the compressed bitmap at the destination specified by filename.
                QiscusImageUtil.getScaledBitmap(Uri.fromFile(imageFile)).compress(Bitmap.CompressFormat.JPEG,
                        QiscusCore.getChatConfig().getQiscusImageCompressionConfig().getQuality(), out);
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                } catch (IOException ignored) {
                    //Do nothing
                }
            }
    
            File compressedImage = new File(filename);
            QiscusFileUtil.notifySystem(compressedImage);
    
            return compressedImage;
        }
    
    Source code(tar.gz)
    Source code(zip)
  • 1.3.26(Dec 16, 2020)

  • 1.3.25(Dec 1, 2020)

Owner
Qiscus - Multichannel Conversational Platform
Enabling Conversations
Qiscus - Multichannel Conversational Platform
CodingChallenge: A simple SDK. Which can provide you information related to Start Wars APi

CodingChallenge CodingChallenge is a simple SDK. Which can provide you informati

Wajahat Hussain 1 Feb 18, 2022
Amazon S3 multipart file upload for Android, made simple

Simpl3r Amazon S3 multipart file upload for Android, made simple This library provides a simple high level Android API for robust and resumable multip

Jeff Gilfelt 182 Nov 15, 2022
Accept PayPal and credit cards in your Android app

Important: PayPal Mobile SDKs are Deprecated. The APIs powering them will remain operational long enough for merchants to migrate, but the SDKs themse

PayPal 802 Dec 22, 2022
A very simple way to implement In App Purchases on Android.

The Google-developed Android In App Purchases library can seem quite confusing and too much code to do something as simple as making in-app purchases

Maickonn Richard 1 Sep 29, 2021
Simple Discord <-> Minecraft chat integration using webhooks

Minecraft Chat Simple Discord <-> Minecraft chat integration using webhooks Instalacja Plugin należy wrzucić do folderu plugins oraz ustawić URL webho

Oskar 10 Aug 31, 2022
Android Weather Library: android weather lib to develop weather based app fast and easily

WeatherLib Android weather lib is an android weather aggregator. The lib helps you getting weather data from the most importat weather provider. It su

Surviving with android (by Francesco Azzola) 641 Dec 23, 2022
A sample project of implementing Liveness Detection and Identity OCR on Android app using Kredibel Vision SDK

Vision Sample (Android) A sample project of implementing Liveness Detection and Identity OCR on Android app using Kredibel Vision SDK. You can checkou

null 10 Nov 27, 2022
Library for Android In-App Billing (Version 3+)

Checkout (Android In-App Billing Library) Description Checkout is an implementation of Android In-App Billing API (v3+). Its main goal is to make inte

Sergey Solovyev 1k Nov 26, 2022
Free forever Marketing SDK with a dashboard for in-app SplashScreen banners with built-in analytics

AdaptivePlus Android SDK AdaptivePlus is the control center for marketing campaigns in mobile applications Requirements minSdkVersion 16 Examples prov

Adaptive.Plus 16 Dec 14, 2021
This App is sending Face capture data over network, built around the latest Android Arcore SDK.

AndroidArcoreFacesStreaming From any Android phone ArCore compatible, using this app will send over TCP 5680 bytes messages: The first 5616 bytes is a

Maxime Dupart 30 Nov 16, 2022
How to Integrate SAWO SDK to an Android app

How to Integrate SAWO SDK to an Android app Add following line to root build.gradle repositories block maven { url 'https://jitpack.io' } Add this to

Latiful Mousom 0 Nov 20, 2021
The client app for Android

handl-service-provider-application “Service Booking Platform ” is an advanced pl

null 0 Dec 20, 2021
Android SDK for eyeson video service incl. demo app

eyeson Android SDK Android SDK for eyeson video service incl. demo app Prerequisites A webservice to host and maintain eyeson meetings is required. Th

eyeson 3 Nov 16, 2022
Powerful custom Android Camera with granular control over the video quality and filesize, restricting recordings to landscape only.

LandscapeVideoCamera Highly flexible Android Camera which offers granular control over the video quality and filesize, while restricting recordings to

Jeroen Mols 1.2k Dec 29, 2022
SocialAuth repository which contains socialauth android version and samples

SocialAuth Android is an Android version of popular SocialAuth Java library. Now you do not need to integrate multiple SDKs if you want to integrate y

3Pillar Global Open Source 318 Dec 30, 2022
Air Native Extension (iOS and Android) for the Facebook mobile SDK

Air Native Extension for Facebook (iOS + Android) This is an AIR Native Extension for the Facebook SDK on iOS and Android. It has been developed by Fr

Freshplanet 219 Nov 25, 2022
Donations library for Android. Supports Google Play Store, Flattr, PayPal, and Bitcoin

Android Donations Lib Android Donations Lib supports donations by Google Play Store, Flattr, PayPal, and Bitcoin. It is used in projects, such as Open

Sufficiently Secure 346 Jan 8, 2023
Donations library for Android. Supports Google Play Store, Flattr, PayPal, and Bitcoin

Android Donations Lib Android Donations Lib supports donations by Google Play Store, Flattr, PayPal, and Bitcoin. It is used in projects, such as Open

Sufficiently Secure 345 Dec 21, 2022
Powerful custom Android Camera with granular control over the video quality and filesize, restricting recordings to landscape only.

LandscapeVideoCamera Highly flexible Android Camera which offers granular control over the video quality and filesize, while restricting recordings to

Jeroen Mols 1.2k Nov 22, 2022