The Plug and Play Communication SDK

The Most Advanced Mobile
Communication SDK on the Market

Acrobits has deployed more than 140 million endpoints across a wide range of devices and operating systems in just 10 years. Our SDK is the answer to your real-time commercial communications needs.

A Developer-Friendly SDK

The Acrobits SDK simplifies the development process

Add busy lamp field integration to your real-time communications platform to see whether users are in an active call.

DialogInfo *dialogInfo = Softphone::instance()->registration()->getDialogInfo(uri);

if (dialogInfo)
{
    if (dialogInfo->busyLamp)
    {
        busyLampStatusLabel.text = NSLocalizedString(@"On Call", nil);
    }
    else
    {
        busyLampStatusLabel.text = NSLocalizedString(@"Off Call", nil);
    }
}
- (void)onNewEvent:(Softphone::EventHistory::Event::Pointer)event
{
    switch (incomingEvent->eventType)
    {
        case Softphone::EventHistory::EventType::Call:
        {
            Softphone::EventHistory::CallEvent::Pointer callEvent = event.asCall();

            UNMutableNotificationContent *notification = [[UNMutableNotificationContent alloc] init];
            notification.title = @"Groundwire";
            notification.body = [NSString stringWithFormat:NSLocalizedString(@"Incoming call from %@", @"notification"), ali::mac::str::to_nsstring(callEvent->getRemoteUser().getDisplayName())];
            notification.sound = [UNNotificationSound defaultSound];
            
            UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:[[NSUUID UUID] UUIDString] content:notification trigger:nil];
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
            [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error)
            {
                if (!error)
                {
                }
            }];
        }
        break;

        default:
        break;
    }
}
ali::string_literal rewritingRule{"<rewriting>
    <rule>
     <conditions>
       <condition type="doesntStartWith" param="+"/>
       <condition type="longerThan" param="8"/>
     </conditions>
     <actions>
       <action type="prepend" param="+420"/>
     </actions>
   </rule>
</rewriting>"};

int errorIndex = 0;
bool success;

ali::xml::tree rewritingXml;
success = ali::xml::parse(rewritingXml, rewritingRule, &errorIndex);

if (success)
    Softphone::instance()->contacts()->numberRewriting()->setRewriterRules(rewritingXml);
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- (void)joinCall:(Softphone::EventHistory::CallEvent::Pointer)call toGroup:(const ali::string &)group
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
{
    Softphone::instance()->calls()->conferences()->move(call, group);
}

//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- (void)splitCall:(Softphone::EventHistory::CallEvent::Pointer)call
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
{
    ali::string groupId = Softphone::instance()->calls()->conferences()->get(call);
    Softphone::instance()->calls()->conferences()->split(call, true);
}

//-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- (void)splitGroup:(ali::string const&)groupId
//-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
{
    ali::array_set<Softphone::EventHistory::CallEvent::Pointer> calls =
        Softphone::instance()->calls()->conferences()->getCalls(groupId);

    for(auto call : calls)
    {
        Softphone::instance()->calls()->conferences()->split(call, false);
    }
}
Powered by Acrobits
 //Blf status
 val dialogInfo = Instance.Registration.getDialogInfo(accountId,uri);
            String blfString = dialogInfo.busyLamp?"On call":"Off call";
            busyLampStatusLabel.setText(blfString);
//OnCall
// ******************************************************************
    public void onNewCall (@NonNull CallEvent callEvent)
    // ******************************************************************
    {
        val context = AndroidUtil.getContext();
        String messageText = "";
        
        Class<?> activity = CallActivity.class;
        String activityAction = Activity.ACTION_MAIN;
        int notificationId = ID_CALL_IN_PROGRESS;
        var extras = new Bundle();
        String title = context.getString(R.string.app_name);
        Bitmap bitmap = AndroidUtil.getBitmap(R.drawable.icon_notification);
        messageText = AndroidUtil.getString(R.string.notification_bullet,
                                            messageText,
                                            callEvent.getAccountName());

        Intent intent = new Intent(context, activity)
                .setAction(activityAction)
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                .putExtras(extras);

        val builder = new NotificationCompat.Builder(context)
                .setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT))
                .setContentText(messageText)
                .setContentTitle(title)
                .setLargeIcon(bitmap);
              

        val notification = builder.build();
        val manager = (NotificationManager)AndroidUtil.getSystemService(Context.NOTIFICATION_SERVICE);
        manager.notify(notificationId, notification);


    }
//Rewriting
rewritingString = "<rewriting><rule><conditions><condition type=\"doesntStartWith\" param=\"+\"/><condition type=\"longerThan\" param=\"8\"/></conditions> <actions> <action type=\"prepend\" param=\"+420\"/> </actions> </rule> </rewriting>";
        mRewritingXml = Xml.parse(rewritingString);
        if(mRewritingXml!=null)
            Instance.Contacts.NumberRewriting.setRewriterRules(null, mRewritingXml);
/JoinCall
    // ******************************************************************
    public static void join(String firstConferenceId, String secondConferenceId)
    // ******************************************************************
    {
        if(firstConferenceId == null  || secondConferenceId == null)
            return;
        if(firstConferenceId.equals(secondConferenceId))
            return;

        val firstConferenceCalls = Instance.Calls.Conferences.getCalls(secondConferenceId);
        val secConferenceCalls = Instance.Calls.Conferences.getCalls(firstConferenceId);

        val newConferenceId = Instance.Calls.Conferences.generate("newConf");
        for (val event : firstConferenceCalls)
            Instance.Calls.Conferences.move(event, newConferenceId);
        for (val event : secConferenceCalls)
            Instance.Calls.Conferences.move(event, newConferenceId);

        Instance.Calls.Conferences.setActive(newConferenceId);
    }        

//Split Call
 // ******************************************************************
    public static void split(CallEvent callEvent)
    // ******************************************************************
    {
        Instance.Calls.Conferences.split(callEvent,false);
        Instance.Calls.setHeld(callEvent, true);
    }
//Split Conference
    // ******************************************************************
    public static void split(String confId)
    // ******************************************************************
    {
        var confCalls = Instance.Calls.Conferences.getCalls(confId);
        for (int i = 0; i < confCalls.length ; i++)
        {
            val callEvent = confCalls[i];
            Instance.Calls.Conferences.split(callEvent,false);
            Instance.Calls.setHeld(callEvent, true);
        }
    }
Powered by Acrobits
The Most Powerful Feature Set In The MarketThe Most Powerful Features

From checkboxes to ready made APIs, it’s all there!

  • Always Improving

    Features

    We work with all of the major operating systems, support many devices, provide numerous updates each year, and deploy same-day updates for major OS changes.

  • Detailed Documentation

    Documents

    We have created a thorough library of documentation for any ultra-specific or general questions that you may have. Our library makes troubleshooting easy.

Book Your Personalized Demo Today

"Great product and very customizable experience. These guys work with you on larger implementations and support is responsive."

JOE MORDICA - FOUNDER, VOXO (USA)

This demo will show you everything you need to know about the Cloud Softphone platform. Our team will walk you through how the platform works, create a test app with you, and answer any questions that you may have.

This short demo is the best way to ensure that you know how to get the most out of Cloud Softphone, so you can speed up your time to market.