android:id="@+id/icon"
android:transitionName="@string/iconTransition"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/shape_launcher_background"
android:tint="@color/common_google_signin_btn_text_light"
android:src="@drawable/button"/>
SplashActivity.java
public class LoadingActivity extends AppCompatActivity {
private LoadingViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loading);
viewModel = ViewModelProviders.of(this).get(LoadingViewModel.class);
ImageView progressImageView = findViewById(R.id.loading);
GlideDrawableImageViewTarget imageViewTarget = new GlideDrawableImageViewTarget(progressImageView);
Glide.with(this).load(R.raw.spinner).into(imageViewTarget);
View WarningMessageView = findViewById(R.id.warningLayout);
viewModel.isLoadedComplete().observe(this, result -> {
if (result == DataLoadState.SUCCESS) {
Intent intent = new Intent(LoadingActivity.this, MainActivity.class);
startActivity(intent, options.toBundle());
finish();
else if (result == DataLoadState.FAIL) {
//Error popup
viewModel.getNetworkConnectedLiveData().observe(this, connected -> {
if (connected) {
progressImageView.setVisibility(View.VISIBLE);
WarningMessageView.setVisibility(View.GONE);
else {
progressImageView.setVisibility(View.GONE);
WarningMessageView.setVisibility(View.VISIBLE);
public class LoadingViewModel extends AndroidViewModel {
private MutableLiveData<DataLoadState> loadedComplete = new MutableLiveData<>();
private MutableLiveData<Boolean> networkConnectedLiveData = new MutableLiveData<>();
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
boolean connected = isNetworkConnected(context);
if (connected) {
context.unregisterReceiver(this);
networkConnectedLiveData.setValue(connected);
public LoadingViewModel(@NonNull Application application) {
super(application);
getDataOfNetwork(application);
loadedComplete.setValue(DataLoadState.NOT_YET);
networkConnectedLiveData.setValue(isNetworkConnected(application));
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
application.registerReceiver(receiver, intentFilter);
private boolean isNetworkConnected(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
private void getDataOfNetwork(Context context) {
NetworkDataProvider
.getInstance()
.getData()
.observeOn(Schedulers.io())
.subscribe(it -> {
loadedComplete.postValue(DataLoadState.SUCCESS);
public LiveData<DataLoadState> isLoadedComplete() {
return loadedComplete;
public LiveData<Boolean> getNetworkConnectedLiveData() {
return networkConnectedLiveData;
public enum DataLoadState {
SUCCESS,
FAIL,
NOT_YET
def lifecycle_version = "2.0.0"
def futures_version = "1.0.0-alpha02"
implementation "androidx.concurrent:concurrent-futures:$futures_version"
implementation 'android.arch.lifecycle:extensions:1.0.0'
implementation "android.arch.lifecycle:common-java8:1.0.0"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'