Download - Sync on Android
![Page 1: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/1.jpg)
SyncON ANDROID
Jerzy Chalupski
chalup
![Page 2: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/2.jpg)
What we do in general...
![Page 3: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/3.jpg)
What we do ALL THE TIME
sync, sync, sync, sync
![Page 4: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/4.jpg)
SyncON ANDROID
OVERVIEW ARCHITECTURE
CONTENT PROVIDER PITFALLS & PROTIPS
![Page 5: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/5.jpg)
SyncON ANDROID
OVERVIEW ARCHITECTURE
CONTENT PROVIDER PITFALLS & PROTIPS
![Page 6: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/6.jpg)
Not exactly the fresh topic...
„Developing Android REST client applications”
by Virgil Dobjanschi@Google I/O 2010
![Page 7: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/7.jpg)
Not exactly the fresh topic...
„Synchronizacja danych z serwisamiwebowymi w Androidzie”
by Bartosz Filipowicz@KrakDroid 2011
![Page 8: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/8.jpg)
...but there is still much confusion
Not exactly the fresh topic...
„Synchronizacja danych z serwisamiwebowymi w Androidzie”
by Bartosz Filipowicz@KrakDroid 2011
![Page 9: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/9.jpg)
ContentProvider
ContentResolver
SyncManager
SyncAdapter
Authenticator
AccountManager
UI
![Page 10: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/10.jpg)
„Wat? Why do I need to write all this crap, sync is just fetching data from server”
typical reaction
![Page 11: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/11.jpg)
Sync provides data sharing
![Page 12: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/12.jpg)
Sync provides data sharing
offline mode
![Page 13: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/13.jpg)
Sync provides data sharing
offline mode
responsive UI
![Page 14: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/14.jpg)
Sync provides data sharing
offline mode
responsive UI
GREAT UX
![Page 15: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/15.jpg)
SyncON ANDROID
OVERVIEW ARCHITECTURE
CONTENT PROVIDER PITFALLS & PROTIPS
![Page 16: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/16.jpg)
ContentProvider 101: CRUD
CREATE
READ
UPDATE
DELETE
insert()
query()
update()
delete()
![Page 17: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/17.jpg)
ContentProvider 101: URI
content://com.futuresimple.krakdroid.Provider/datasets/1
![Page 18: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/18.jpg)
ContentProvider 101: URI
content://com.futuresimple.krakdroid.Provider/datasets/1
![Page 19: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/19.jpg)
ContentProvider 101: URI
content://com.futuresimple.krakdroid.Provider/datasets/1
![Page 20: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/20.jpg)
ContentProvider 101: URI
content://com.futuresimple.krakdroid.Provider/datasets/1
![Page 21: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/21.jpg)
ContentProvider 101: notifications
content://com.futuresimple.krakdroid.Provider/datasets/1content://com.futuresimple.krakdroid.Provider/solutionscontent://com.futuresimple.krakdroid.Provider/solutions/1content://com.futuresimple.krakdroid.Provider/solutions/1/answers/1content://com.futuresimple.krakdroid.Provider/solutions/1/answers/2content://com.futuresimple.krakdroid.Provider/solutions/2/answers/1
![Page 22: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/22.jpg)
ContentResolver.notifyChange(“content://com.futuresimple.krakdroid.Provider/datasets/1”);
content://com.futuresimple.krakdroid.Provider/datasets/1content://com.futuresimple.krakdroid.Provider/solutionscontent://com.futuresimple.krakdroid.Provider/solutions/1content://com.futuresimple.krakdroid.Provider/solutions/1/answers/1content://com.futuresimple.krakdroid.Provider/solutions/1/answers/2content://com.futuresimple.krakdroid.Provider/solutions/2/answers/1
ContentProvider 101: notifications
![Page 23: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/23.jpg)
ContentResolver.notifyChange(“content://com.futuresimple.krakdroid.Provider/solutions/1/answers/1”);
content://com.futuresimple.krakdroid.Provider/datasets/1content://com.futuresimple.krakdroid.Provider/solutionscontent://com.futuresimple.krakdroid.Provider/solutions/1content://com.futuresimple.krakdroid.Provider/solutions/1/answers/1content://com.futuresimple.krakdroid.Provider/solutions/1/answers/2content://com.futuresimple.krakdroid.Provider/solutions/2/answers/1
ContentProvider 101: notifications
![Page 24: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/24.jpg)
SyncON ANDROID
OVERVIEW ARCHITECTURE
CONTENT PROVIDER PITFALLS & PROTIPS
![Page 25: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/25.jpg)
ContentProvider
ContentResolver
SyncManager
SyncAdapter
Authenticator
AccountManager
UI
![Page 26: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/26.jpg)
AccountManager
addAccount()
ContentResolverSyncManager
SyncAdapter ContentProvider
Authenticator
UI
Sync architectureCREATING NEW ACCOUNT
![Page 27: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/27.jpg)
AccountManager
addAccount()
addAccount()
ContentResolverSyncManager
SyncAdapter ContentProvider
Authenticator
UI
Sync architectureCREATING NEW ACCOUNT
![Page 28: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/28.jpg)
AccountManager
addAccount()
addAccount()
ContentResolverSyncManager
SyncAdapter ContentProvider
Authenticator
UI
Sync architectureCREATING NEW ACCOUNT
![Page 29: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/29.jpg)
AccountManager
ContentResolver
UI
ContentProvider
Sync architecture SHOW SYNCED DATA
Authenticator
query()
query()
SyncManager
SyncAdapter
![Page 30: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/30.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture REQUEST SYNC
Authenticator
getAccountsByType()
![Page 31: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/31.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture REQUEST SYNC
Authenticator
getAccountsByType()
requestSync()
![Page 32: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/32.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture REQUEST SYNC
Authenticator
getAccountsByType()
requestSync()
onPerformSync()
![Page 33: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/33.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture EDIT DATA
Authenticator
insert()
insert()
![Page 34: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/34.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture EDIT DATA
Authenticator
insert()
insert()notifyChange()
![Page 35: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/35.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture EDIT DATA
Authenticator
insert()
insert()notifyChange()
![Page 36: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/36.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture EDIT DATA
Authenticator
getAccountsByType()
insert()
insert()notifyChange()
![Page 37: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/37.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture EDIT DATA
Authenticator
getAccountsByType()
onPerformSync()
insert()
insert()notifyChange()
![Page 38: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/38.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture POST NEW DATA
Authenticator
onPerformSync()
![Page 39: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/39.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture POST NEW DATA
Authenticator
getAuthToken()
onPerformSync()
![Page 40: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/40.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture POST NEW DATA
Authenticator
getAuthToken()
query()query()onPerformSync()
![Page 41: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/41.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture POST NEW DATA
Authenticator
getAuthToken()
query()query()
POST
onPerformSync()
![Page 42: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/42.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture GET NEW DATA
Authenticator
onPerformSync()
![Page 43: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/43.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture GET NEW DATA
Authenticator
getAuthToken()
onPerformSync()
![Page 44: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/44.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture GET NEW DATA
Authenticator
getAuthToken()
GET
onPerformSync()
![Page 45: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/45.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture GET NEW DATA
Authenticator
getAuthToken()
applyBatch()
GET
applyBatch()
onPerformSync()
![Page 46: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/46.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture GET NEW DATA
Authenticator
getAuthToken()
applyBatch()notifyChange()
GET
applyBatch()
onPerformSync()
![Page 47: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/47.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Sync architecture GET NEW DATA
Authenticator
getAuthToken()
applyBatch()notifyChange()
GET
applyBatch()
onPerformSync()
onLoaderFinished()
![Page 48: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/48.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Authenticator Sync architecture WIN #1: NO REMOTE I/O IN UI
![Page 49: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/49.jpg)
AccountManager
ContentResolver
UI
SyncManager
SyncAdapter ContentProvider
Authenticator Sync architecture WIN #2: SYNC SCHEDULING
![Page 50: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/50.jpg)
SyncON ANDROID
OVERVIEW ARCHITECTURE
CONTENT PROVIDER PITFALLS & PROTIPS
![Page 51: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/51.jpg)
IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/1
![Page 52: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/52.jpg)
IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/1
Plan A: Use local IDs! (BaseColumns._ID)
![Page 53: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/53.jpg)
IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/1
Plan A: Use local IDs! (BaseColumns._ID)
ISSUE: still need server-side IDs for relations
![Page 54: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/54.jpg)
IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/1
Plan A: Use local IDs! (BaseColumns._ID)
ISSUE: still need server-side IDs for relationsISSUE: conversions between server and local IDs
![Page 55: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/55.jpg)
IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/15002900
Plan B: OK, use server-side IDs!
![Page 56: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/56.jpg)
IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/15002900
Plan B: OK, use server-side IDs!
ISSUE: what about offline mode?
![Page 57: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/57.jpg)
IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/-42
Plan C: OK, let’s mix things up!
content://com.futuresimple.krakdroid.Provider/datasets/15002900
![Page 58: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/58.jpg)
IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/-42
Plan C: OK, let’s mix things up!
ISSUE: very tricky implementation
content://com.futuresimple.krakdroid.Provider/datasets/15002900
![Page 59: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/59.jpg)
IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/GUID
Plan D: GUID
![Page 60: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/60.jpg)
IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/GUID
Plan D: GUID
ISSUE: needs support on the backend
![Page 61: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/61.jpg)
ContentResolver requestSync() vs. notifyChange()
requestSync(account, authority, extras)
notifyChange(uri, observer, syncToNetwork)
![Page 62: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/62.jpg)
ContentResolver requestSync() vs. notifyChange()
requestSync(account, authority, extras)
notifyChange(uri, observer, syncToNetwork)
![Page 63: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/63.jpg)
Deleting an account
From your app
From system settings
From 3rd party app
![Page 64: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/64.jpg)
Deleting an account
From your app
From system settings
From 3rd party app
“Where should I perform user
data cleanup?”
![Page 65: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/65.jpg)
Deleting an account
@Override getAccountRemovalAllowed()
![Page 66: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/66.jpg)
Deleting an account
@Override getAccountRemovalAllowed()
CONS: depends on current Settings implementation.
PROS: exactly the thing you need.
![Page 67: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/67.jpg)
Deleting an account
<receiver android:name=".auth.AccountBroadcastReceiver" android:enabled="true" > <intent-filter> <action android:name="android.accounts.LOGIN_ACCOUNTS_CHANGED" /> </intent-filter></receiver>
![Page 68: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/68.jpg)
Deleting an account
<receiver android:name=".auth.AccountBroadcastReceiver" android:enabled="true" > <intent-filter> <action android:name="android.accounts.LOGIN_ACCOUNTS_CHANGED" /> </intent-filter></receiver>
CONS: only info about existing accounts.
PROS: peace of mind.
![Page 69: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/69.jpg)
Sync lifecycle
Happy case:
![Page 70: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/70.jpg)
Sync lifecycle
Happy case:
requestSync()
![Page 71: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/71.jpg)
onPerformSync()
Sync lifecycle
requestSync()
Happy case:
![Page 72: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/72.jpg)
onPerformSync()
Sync lifecycle
requestSync() onStatusChanged()
Happy case:
![Page 73: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/73.jpg)
onPerformSync()
Sync lifecycle
Not-so-happy case:
requestSync() onStatusChanged()
![Page 74: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/74.jpg)
onPerformSync()
Sync lifecycle
Not-so-happy case:
onStatusChanged()requestSync()
![Page 75: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/75.jpg)
onPerformSync()
Sync lifecycle
Not-so-happy case:
requestSync() cancelSync()+
onStatusChanged()
![Page 76: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/76.jpg)
Futureproof your sync
![Page 77: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/77.jpg)
Futureproof your sync
1. Be lenient on GET
![Page 78: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/78.jpg)
Futureproof your sync
1. Be lenient on GET
2. Be strict on POST
![Page 79: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/79.jpg)
Futureproof your sync
3. Have resync in v1.0
1. Be lenient on GET
2. Be strict on POST
![Page 80: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/80.jpg)
?
![Page 81: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/81.jpg)
![Page 82: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/82.jpg)
![Page 83: Sync on Android](https://reader033.vdocument.in/reader033/viewer/2022051212/5588f6afd8b42aad418b45fa/html5/thumbnails/83.jpg)
Thanks.