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.

    Acrobits SDK Features
  • 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.

    Acrobits SDK Documentation
Book a free demo

"*" indicates required fields

This field is for validation purposes and should be left unchanged.