OFFLINE MODE OF ANDROID APPS - singhajit.com

64
OFFLINE MODE OF ANDROID APPS @Ajit5ingh

Transcript of OFFLINE MODE OF ANDROID APPS - singhajit.com

Page 1: OFFLINE MODE OF ANDROID APPS - singhajit.com

OFFLINE MODE OF ANDROID APPS

@Ajit5ingh

Page 2: OFFLINE MODE OF ANDROID APPS - singhajit.com

ABOUT ME

new Presenter( “Ajit Singh”,

“github.com/ajitsing”, “www.singhajit.com”, “@Ajit5ingh”

)

Page 3: OFFLINE MODE OF ANDROID APPS - singhajit.com

● Why offline mode?

● What it takes to build an offline mode

● Architecture & Code

● Network factors

● Testing

● Bugs & how to solve them

● Wrap up

AGENDA

Page 4: OFFLINE MODE OF ANDROID APPS - singhajit.com

WHY OFFLINE MODE?

● Lets understand by an example ● We can’t always get connected to internet

● Mobile networks are not stable

Page 5: OFFLINE MODE OF ANDROID APPS - singhajit.com

WHAT IT TAKES TO BUILD AN OFFLINE MODE

Page 6: OFFLINE MODE OF ANDROID APPS - singhajit.com

WHAT IT TAKES TO BUILD OFFLINE MODE

● UX

● Data

● Listening to network state updates

● Manage the network state

● Notifying user with the latest network state

Page 7: OFFLINE MODE OF ANDROID APPS - singhajit.com

USER EXPERIENCE

Page 8: OFFLINE MODE OF ANDROID APPS - singhajit.com

CAN NOT DO ANYTHING OFFLINE!

Page 9: OFFLINE MODE OF ANDROID APPS - singhajit.com

CAN DO SOMETHING!

Page 10: OFFLINE MODE OF ANDROID APPS - singhajit.com

CAN DO A LOT!!

Page 11: OFFLINE MODE OF ANDROID APPS - singhajit.com

DATA

DB CACHE

JSON files, sharedPreferences etc..

Page 12: OFFLINE MODE OF ANDROID APPS - singhajit.com

LISTEN FOR NETWORK CHANGE EVENTS

APP

Page 13: OFFLINE MODE OF ANDROID APPS - singhajit.com

IDENTIFYING INTERNET CONNECTIVITY

Figure out current network state using the NetworkStateIdentifier

Page 14: OFFLINE MODE OF ANDROID APPS - singhajit.com

MANAGE NETWORK STATE

Update the network state

Page 15: OFFLINE MODE OF ANDROID APPS - singhajit.com

NOTIFYING USER WITH THE LATEST STATE

Update UI using the latest network state

Page 16: OFFLINE MODE OF ANDROID APPS - singhajit.com

OFFLINE MODE ARCHITECTURE

Page 17: OFFLINE MODE OF ANDROID APPS - singhajit.com

ARCHITECTURE

APP

Page 18: OFFLINE MODE OF ANDROID APPS - singhajit.com

BENEFITS OF THIS ARCHITECTURE

● Event driven architecture

● App always has the copy of latest connectivity state

● Utilising less resources

● User gets notified almost immediately

Page 19: OFFLINE MODE OF ANDROID APPS - singhajit.com

CODE

Page 20: OFFLINE MODE OF ANDROID APPS - singhajit.com

10

User Permission

Page 21: OFFLINE MODE OF ANDROID APPS - singhajit.com

PERMISSION TO ACCESS NETWORK STATE

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Page 22: OFFLINE MODE OF ANDROID APPS - singhajit.com

10

Registering for network status change events

Page 23: OFFLINE MODE OF ANDROID APPS - singhajit.com

LISTEN TO NETWORK CHANGE EVENT

<receiver android:name=".NetworkStateChangeReceiver" android:exported="false"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver>

Deprecated for Apps targeting to API 24

Page 24: OFFLINE MODE OF ANDROID APPS - singhajit.com

LISTEN TO NETWORK CHANGE EVENT BELOW API 21

if (belowLollipop()) { ctx.registerReceiver(receiver, new IntentFilter(CONNECTIVITY_ACTION))

ctx.registerReceiver(receiver, new IntentFilter(WIFI_STATE_CHANGE_ACTION))}

Page 25: OFFLINE MODE OF ANDROID APPS - singhajit.com

LISTEN TO NETWORK CHANGE EVENT BELOW API 21

public class NetworkStateChangeReceiver extends BroadcastReceiver {@Override public void onReceive(Context context, Intent intent) { networkStateManager.refresh(); }

}

Page 26: OFFLINE MODE OF ANDROID APPS - singhajit.com

LISTEN TO NETWORK CHANGE EVENT FOR API 21 & ABOVE

NetworkCallback networkCallback = new NetworkCallback() { @Override public void onAvailable(Network network) { networkStateManager.refresh(); } @Override public void onLost(Network network) { networkStateManager.refresh(); } }; cm.registerNetworkCallback(networkRequest, networkCallback);

Page 27: OFFLINE MODE OF ANDROID APPS - singhajit.com

10

Managing network state

Page 28: OFFLINE MODE OF ANDROID APPS - singhajit.com

NETWORK STATE MANAGER

public void refresh() { updateNetworkState(); broadcastNetworkChangeIntent(); }

networkStateManager.refresh();

Page 29: OFFLINE MODE OF ANDROID APPS - singhajit.com

10

Network state identifier

Page 30: OFFLINE MODE OF ANDROID APPS - singhajit.com

NETWORK CONNECTIVITY IDENTIFIER

NetworkInfo networkInfo = cm.getActiveNetworkInfo(); networkInfo.isConnected();

Page 31: OFFLINE MODE OF ANDROID APPS - singhajit.com

NETWORK FACTORS

Page 32: OFFLINE MODE OF ANDROID APPS - singhajit.com

NETWORK FACTORS

WiFi Mobile Data Low Connectivity

Flight Mode

B A T T E R Y

Power Save Mode

Roaming

Roaming

Page 33: OFFLINE MODE OF ANDROID APPS - singhajit.com

POTENTIAL ISSUES

Page 34: OFFLINE MODE OF ANDROID APPS - singhajit.com

ARE YOU REALLY OFFLINE?

Page 35: OFFLINE MODE OF ANDROID APPS - singhajit.com

AND…

Page 36: OFFLINE MODE OF ANDROID APPS - singhajit.com

10

But Why??

Page 37: OFFLINE MODE OF ANDROID APPS - singhajit.com

WATCH OUT!

NetworkConnectivityIdentifier NetworkCallback

App

Page 38: OFFLINE MODE OF ANDROID APPS - singhajit.com

10

Lets take a look at some of the common mistakes while using

Android Network APIs

Page 39: OFFLINE MODE OF ANDROID APPS - singhajit.com

NETWORK CONNECTIVITY IDENTIFIER

NullPointerException!!

public boolean isConnectedToInternet() { NetworkInfo networkInfo = cm.getActiveNetworkInfo(); return networkInfo.isConnected(); }

Page 40: OFFLINE MODE OF ANDROID APPS - singhajit.com

NETWORK CONNECTIVITY IDENTIFIER

What about multiple networks!!

public boolean isConnectedToInternet() { NetworkInfo networkInfo = cm.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnected(); }

Page 41: OFFLINE MODE OF ANDROID APPS - singhajit.com

NETWORK CONNECTIVITY IDENTIFIER

What about unwanted networks!!

public boolean isConnectedToInternet() { Network[] allNetworks = cm.getAllNetworks(); for (Network network : allNetworks) { NetworkInfo networkInfo = cm.getNetworkInfo(network); if (networkInfo != null) { return networkInfo.isConnected(); } } return false; }

Page 42: OFFLINE MODE OF ANDROID APPS - singhajit.com

NETWORK CONNECTIVITY IDENTIFIER

private boolean isWifiOrMobile(NetworkInfo networkInfo) { List<Integer> networks = asList(TYPE_MOBILE, TYPE_WIFI); return networks.contains(networkInfo.getType()); }

Page 43: OFFLINE MODE OF ANDROID APPS - singhajit.com

WHAT DID WE DO

● Added null check for NetworkInfo

● Handled multiple networks

● Filtered WIFI and Mobile Data networks only

Page 44: OFFLINE MODE OF ANDROID APPS - singhajit.com

BE CAREFUL WITH NETWORK CALLBACK

NetworkCallback networkCallback = new NetworkCallback() { @Override public void onAvailable(Network network) { networkStateManager.setConnectedToInternet(true); } @Override public void onLost(Network network) { networkStateManager.setConnectedToInternet(false); } }; cm.registerNetworkCallback(networkRequest, networkCallback);

Page 45: OFFLINE MODE OF ANDROID APPS - singhajit.com

BE CAREFUL WITH NETWORK CALLBACK

Is it good enough??

NetworkCallback networkCallback = new NetworkCallback() { @Override public void onAvailable(Network network) { networkStateManager.refresh(); } @Override public void onLost(Network network) { networkStateManager.refresh(); } }; cm.registerNetworkCallback(networkRequest, networkCallback);

Page 46: OFFLINE MODE OF ANDROID APPS - singhajit.com

BE CAREFUL WITH NETWORK CALLBACK

NetworkCallback networkCallback = new NetworkCallback() { @Override public void onAvailable(Network network) { networkStateManager.refresh(); }

@Override public void onCapabilitiesChanged(Network n, NetworkCapabilities nc) { networkStateManager.refresh(); }

@Override public void onLost(Network network) { networkStateManager.refresh(); } }; cm.registerNetworkCallback(networkRequest, networkCallback);

Page 47: OFFLINE MODE OF ANDROID APPS - singhajit.com

HAVE WE SOLVED ALL THE PROBLEMS?

● Power Save Mode

● Handling on different devices

● Other random connectivity issues

Page 48: OFFLINE MODE OF ANDROID APPS - singhajit.com

HANDLING ISSUES

Page 49: OFFLINE MODE OF ANDROID APPS - singhajit.com

UNDERSTANDING THE USER BEHAVIOUR

Page 50: OFFLINE MODE OF ANDROID APPS - singhajit.com

INCREASE TRIGGER POINTS

Page 51: OFFLINE MODE OF ANDROID APPS - singhajit.com

GIVE THE USER CHANCE TO GET OUT OF OFFLINE MODE

Activity’s onResume()

Fragment’s onResume() Network

Call?

User Action

Page 52: OFFLINE MODE OF ANDROID APPS - singhajit.com

TESTING

Page 53: OFFLINE MODE OF ANDROID APPS - singhajit.com

TESTING PYRAMID

Page 54: OFFLINE MODE OF ANDROID APPS - singhajit.com

UNIT TESTING

● Network state management logic ● Broadcasting network change event to the app

● Showing offline UI components

Page 55: OFFLINE MODE OF ANDROID APPS - singhajit.com

INSTRUMENTATION TESTING

● Showing offline UI components on broadcast of network

change event

● Content of UI components

● Interactions with offline components

Page 56: OFFLINE MODE OF ANDROID APPS - singhajit.com

AUTOMATION TESTING

Page 57: OFFLINE MODE OF ANDROID APPS - singhajit.com

TESTING USER JOURNEYS

● When user goes online to offline

● When user comes back online

● Interactions with offline components

Page 58: OFFLINE MODE OF ANDROID APPS - singhajit.com

USING ADB TO GO OFFLINE

Page 59: OFFLINE MODE OF ANDROID APPS - singhajit.com

MANUAL TESTING

Page 60: OFFLINE MODE OF ANDROID APPS - singhajit.com

WHY MANUAL TESTING?

● Low connectivity scenarios

● Combination of multiple networks

● Fluctuating network conditions

Page 61: OFFLINE MODE OF ANDROID APPS - singhajit.com

TESTING IN LIFTS

Page 62: OFFLINE MODE OF ANDROID APPS - singhajit.com

TESTING WHILE TRAVELLING

Page 63: OFFLINE MODE OF ANDROID APPS - singhajit.com

● Build something that is useful to the user ● Be careful while using android network API

● Always read the documentation of network APIs

● Understand user behaviour

● Manual testing

● Test with combination of mobile data and wifi

● Use automation testing to test offline UI components

WRAP UP!

Page 64: OFFLINE MODE OF ANDROID APPS - singhajit.com

THANK YOU Questions? Feedback?

@Ajit5ingh www.singhajit.com