Try : Insurtech, Application Development

AgriTech(1)

Augmented Reality(21)

Clean Tech(9)

Customer Journey(17)

Design(45)

Solar Industry(8)

User Experience(68)

Edtech(10)

Events(34)

HR Tech(3)

Interviews(10)

Life@mantra(11)

Logistics(6)

Manufacturing(4)

Strategy(18)

Testing(9)

Android(48)

Backend(32)

Dev Ops(11)

Enterprise Solution(33)

Technology Modernization(9)

Frontend(29)

iOS(43)

Javascript(15)

AI in Insurance(41)

Insurtech(67)

Product Innovation(59)

Solutions(22)

E-health(12)

HealthTech(25)

mHealth(5)

Telehealth Care(4)

Telemedicine(5)

Artificial Intelligence(154)

Bitcoin(8)

Blockchain(19)

Cognitive Computing(8)

Computer Vision(8)

Data Science(23)

FinTech(51)

Banking(7)

Intelligent Automation(27)

Machine Learning(48)

Natural Language Processing(14)

expand Menu Filters

Optimizing Android Apps on Variable Network Speeds

Most of the apps today are developed and designed which can perform on all types of networks. While some of us are probably enjoying great connectivity courtesy of our carriers at our school/office/coffees shop wi-fi, there are still some people suffering from poor mobile connections, particularly in emerging markets. If you are developing an Android app you may already fetching information from internet. While doing so there is a chance that internet connection is not available on users handset, connection is slow or fast. Hence its always a good idea to create an app that can perform accordingly on all types of networks.

Facebook has made it known that their goal is to be able to reach and give access to as many markets as possible, and this includes those that still use 2G connections. In this post, we will share how this is possible by Network Connection Class

Network Connection Class allows you to check the quality of the internet connection of the current user, it is an android library. It is a simple code that will help you identify what kind of internet connection a user has on his/her device. Network Connection Class currently only measures the user’s downstream bandwidth. Latency is also an important factor, but in our tests, we’ve found that bandwidth is a good proxy for both.

The connection gets classified into several Connection Classes that makes it easy to develop against. The library does this by listening to the existing internet traffic done by your app and notifying you when the user’s connection quality changes. Developers can then use this Connection Class information and adjust the application’s behavior (request lower quality images or video, throttle type-ahead, etc).

The Network Connection Class library takes care of spikes using a moving average of the incoming samples, and also applies some hysteresis (both with a minimum number of samples and amount the average has to cross a boundary before triggering a bucket change):

Code Sample:
Connection Class provides an interface for classes to add themselves as listeners for when the network’s connection quality changes. In the subscriber class, implement ConnectionClassStateChangeListener:

[section_tc][column_tc span=’12’][blockquote_tc style=’style4′ class=”blog-code”]package com.example.android.connectionclasstest;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.facebook.network.connectionclass.ConnectionClassManager;
import com.facebook.network.connectionclass.ConnectionQuality;
import com.facebook.network.connectionclass.DeviceBandwidthSampler;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class MainActivity extends AppCompatActivity {

private static final String TAG = “ConnectionClass-Sample”;
private ConnectionClassManager mConnectionClassManager;
private DeviceBandwidthSampler mDeviceBandwidthSampler;
private TextView mTextView;
private ImageView mImageView;
private ImageLoader imageLoader;
private ProgressBar mRunningBar;
private ConnectionChangedListener mListener;
private int mTries = 0;
private ConnectionQuality mConnectionClass = ConnectionQuality.UNKNOWN;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageLoader = ImageLoader.getInstance();
imageLoader.init(ImageLoaderConfiguration.createDefault(getBaseContext()));
mConnectionClassManager = ConnectionClassManager.getInstance();
mDeviceBandwidthSampler = DeviceBandwidthSampler.getInstance();
mRunningBar = (ProgressBar) findViewById(R.id.runnigBar);
mTextView = (TextView) findViewById(R.id.connectionClass);
mImageView = (ImageView) findViewById(R.id.imageView);
findViewById(R.id.testButton).setOnClickListener(DownloadImage);
mTextView.setText(mConnectionClassManager.getCurrentBandwidthQuality().toString());
mListener = new ConnectionChangedListener();
findViewById(R.id.upload).setOnClickListener(UploadImage);
findViewById(R.id.vdButton).setOnClickListener(PlayVideo);
}

@Override
protected void onPause() {
super.onPause();
mConnectionClassManager.remove(mListener);
}

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

mConnectionClassManager.register(mListener);
}
String connectionQuality=null;

private class ConnectionChangedListener
implements ConnectionClassManager.ConnectionClassStateChangeListener {

@Override
public void onBandwidthStateChange(ConnectionQuality bandwidthState) {
mConnectionClass = bandwidthState;
runOnUiThread(new Runnable() {
@Override
public void run() {

connectionQuality = mConnectionClass.toString();
switch (connectionQuality){
case “POOR”:
double val1 = mConnectionClassManager.getDownloadKBitsPerSecond();
mTextView.setText(“Quality is “+connectionQuality+” “+val1 +” and Bandwidth under 150 kbps so poor quality Image downloaded”);
android.support.design.widget.Snackbar.make(findViewById(R.id.main),”Quality is “+connectionQuality+ val1 +”\n and Bandwidth under 150 kbps so poor\n quality image is downloading”, android.support.design.widget.Snackbar.LENGTH_LONG).show();
new DnloadImage().execute(“http://storage.googleapis.com/ix_choosemuse/uploads/2016/02/android-logo.png”); // 80 kb
break;

case “MODERATE”:
double val2 = mConnectionClassManager.getDownloadKBitsPerSecond();
mTextView.setText(“Quality is “+connectionQuality+” “+val2 +” and Bandwidth between 150 to 550 kbps so moderate quality Image downloaded”);
android.support.design.widget.Snackbar.make(findViewById(R.id.main),”Quality is “+connectionQuality+ val2 +”\n and Bandwidth between 150 to 550 kbps so moderate\n quality Image is downloading”, android.support.design.widget.Snackbar.LENGTH_LONG).show();
new DnloadImage().execute(“http://static.giantbomb.com/uploads/original/15/157771/2312725-a10.jpeg”); // 454 kb
break;

case “GOOD”:
double val3 = mConnectionClassManager.getDownloadKBitsPerSecond();
android.support.design.widget.Snackbar.make(findViewById(R.id.main),”Quality is “+connectionQuality+ val3 +”\n and Bandwidth between 550 to 2000 kbps so good\n quality Image is downloading”, android.support.design.widget.Snackbar.LENGTH_LONG).show();
mTextView.setText(“Quality is “+connectionQuality+” “+val3 +” and Bandwidth between 550 to 2000 kbps so good quality Image downloaded”);
new DnloadImage().execute(“http://techclones.com/wp-content/uploads/2013/09/Best-Dark-HD-Wallpaper-Android1.png”); // 1.04 mb
break;

case “EXCELLENT”:
double val4 = mConnectionClassManager.getDownloadKBitsPerSecond();
mTextView.setText(“Quality is “+connectionQuality+” “+val4 +” and Bandwidth over 2000 kbps so excellent quality Image downloaded”);
android.support.design.widget.Snackbar.make(findViewById(R.id.main),”Quality is “+connectionQuality+ val4 +”\n and Bandwidth over 2000 kbps so high\n quality Image is downlaoding”, android.support.design.widget.Snackbar.LENGTH_LONG).show();
new DnloadImage().execute(“http://static.giantbomb.com/uploads/original/15/157771/2312721-a7.png”); // 2.49 mb
break;

case “UNKNOWN”:
mTextView.setText(“Sorry we are getting nothing”);
break;
}
}
});
}
}

private final View.OnClickListener DownloadImage = new View.OnClickListener() {
@Override
public void onClick(View v) {
mRunningBar.setVisibility(View.VISIBLE);
mTries=0;
String quality = mConnectionClass.toString();
Toast.makeText(MainActivity.this, “Quality ->”+quality, Toast.LENGTH_SHORT).show();
new DnloadImage().execute(“”);
}
};

private final View.OnClickListener UploadImage = new View.OnClickListener() {
@Override
public void onClick(View v) {
//showFileChooser();
Intent intent = new Intent(MainActivity.this, UplaodActivity.class);
startActivity(intent);
}
};

private final View.OnClickListener PlayVideo = new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, VideoActivity.class);
startActivity(intent);
}
};

private class DnloadImage extends AsyncTask<String, Void, Bitmap> {

@Override
protected void onPreExecute() {
mDeviceBandwidthSampler.startSampling();
mRunningBar.setVisibility(View.VISIBLE);
}

@Override
protected Bitmap doInBackground(String… url) {
String imageURL = url[0];
try {
ByteArrayInputStream byteArrayInputStream;
// Bitmap bitmap;
URLConnection connection = new URL(imageURL).openConnection();
connection.setUseCaches(false);
connection.connect();
InputStream input = connection.getInputStream();

try {
Bitmap bitmap = BitmapFactory.decodeStream(input);
return bitmap;
} finally {
input.close();
}
} catch (IOException e) {
Log.e(TAG, “Error while downloading image.”);
}
return null;
}

@Override
protected void onPostExecute(Bitmap bp) {
mDeviceBandwidthSampler.stopSampling();
Toast.makeText(MainActivity.this,””+mTries,Toast.LENGTH_SHORT).show();

if (mConnectionClass == ConnectionQuality.UNKNOWN && mTries < 10) {
mTries++;
new DnloadImage().execute(“https://familysearch.org/learn/wiki/en/images/9/9d/Links-Folder-icon.png”);
}
if (!mDeviceBandwidthSampler.isSampling()) {
mImageView.setImageBitmap(bp);
//imageLoader.getInstance().displayImage(mURL,mImageView);
mRunningBar.setVisibility(View.GONE);

}
}
}
}[/blockquote_tc][/column_tc][/section_tc]

The main way to provide the ConnectionClassManager data is to use the DeviceBandwidthSampler. The DeviceBandwidthSampler samples the device’s underlying network stats, when you tell it you’re performing some sort of network activity (downloading photos, playing a video, etc).

To know more about the Network Connection Class and its implementation, feel free to say hello@mantralabsglobal.com. We would surely respond to your queries.

 

Cancel

Knowledge thats worth delivered in your inbox

NPS in Insurance Claims: What Insurance Leaders Are Doing Differently

Claims are the moment of truth. Are you turning them into moments of loyalty?

In insurance, your app interface might win you downloads. Your pricing might drive conversions.
But it’s the claims experience that decides whether a customer stays—or leaves for good.

According to a survey by NPS Prism, promoters are 2.3 times more likely to renew their insurance policies than passives or detractors—highlighting the strong link between customer advocacy and retention.

NPS in insurance industry is a strong predictor of customer retention. Many insurers are now prioritizing NPS to improve their claims experience.

So, what are today’s high-NPS insurers doing differently? Spoiler: it’s not just about faster payouts.

We’ve worked with claims teams that had best-in-class automation—but still had low NPS. Why? Because the process felt like a black box.
Customers didn’t know where their claim stood. They weren’t sure what to do next. And when money was at stake, silence created anxiety and dissatisfaction.

Great customer experience (CX) in claims isn’t just about speed—it’s about giving customers a sense of control through clear communication and clarity.

The Traditional Claims Journey

  • Forms → Uploads → Phone calls → Waiting
  • No real-time updates
  • No guidance after claim initiation
  • Paper documents and email ping-pong

The result? Frustrated customers and overwhelmed call centers.

The CX Gap: It’s Not Just Speed—It’s Transparency

Customers don’t always expect instant decisions. What they want:

  • To know what’s happening with their claim
  • To understand what’s expected of them
  • To feel heard and supported during the process

How NPS Leaders Are Winning Loyalty with CX-Driven Claims and High NPS

Image Source: NPS Prism

1. Real-Time Status Updates

Transparency to the customer via mobile app, email, or WhatsApp—keeping them in the loop with clear milestones. 

2. Proactive Nudges

Auto-reminders, such as “upload your medical bill” or “submit police report,” help close matters much faster and avoid back-and-forth.

3. AI-Powered Document Uploads

Single-click scans with OCR + AI pull data instantly—no typing, no errors.

4. In-the-Moment Feedback Loops

Simple post-resolution surveys collect sentiment and alert on issues in real time.

For e.g., Lemonade uses emotional AI to detect customer sentiment during the claims process, enabling empathetic responses that boost satisfaction and trust.

Smart Nudges from Real-Time Journey Tracking

For a leading insurance firm, we mapped the entire in-app user journey—from buying or renewing a policy to initiating a claim or checking discounts. This helped identify exactly where users dropped off. Based on real-time activity, we triggered personalized notifications and offers—driving better engagement and claim completion rates.

Tech Enablement

  • Claims Orchestration Layer: Incorporates legacy systems, third-party tools, and front-end apps for a unified experience.
  • AI & ML Models: For document validation, fraud detection, and claim routing, sentiment analysis is used. Businesses utilizing emotional AI report a 25% increase in customer satisfaction and a 30% decrease in complaints, resulting in more personalized and empathetic interactions.
  • Self-Service Portals: Customers can check their status, update documents, and track payouts—all without making a phone call.

Business Impact

What do insurers gain from investing in CX?

A faster claim is good. But a fair, clear, and human one wins loyalty.

And companies that consistently track and act on CX metrics are better positioned to retain customers and build long-term loyalty.

At Mantra Labs, we help insurers build end-to-end, tech-enabled claims journeys that delight customers and drive operational efficiency.
From intelligent document processing to AI-led nudges, we design for empathy at scale.

Want a faster and more transparent claims experience?

Let’s design it together.
Talk to our insurance transformation team today.

Cancel

Knowledge thats worth delivered in your inbox

Loading More Posts ...
Go Top
ml floating chatbot