package com.philosophicalhacker.philhackernews.ui.refresh;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.philosophicalhacker.philhackernews.R;
import butterknife.Bind;
import butterknife.ButterKnife;
import rx.Observable;
import rx.Subscriber;
/**
* Hosts a {@link RefreshableListRepositoryFragment}. We need this class to faciliate communication
* between any hosted Fragments and the SwipeToRefreshLayout within this activity. SwipeToRefreshLayout
* is buggy when contained in a Fragment and its immediate child is ordinarily the view that is being refreshed.
* In our case, however, the refreshable view is contained inside a Fragment, so this class helps set up the
* communication the Activity, which owns the SwipeToRefreshLayout and the Fragment, which owns the refreshable view.
*
* Created by MattDupree on 7/21/15.
*/
public class RefreshableFragmentHostingActivity extends AppCompatActivity implements RefreshStatusListener, OnRefreshableViewCreatedListener {
@Bind(R.id.swipeToRefresh)
CustomChildSwipeRefreshLayout mSwipeRefreshLayout;
//----------------------------------------------------------------------------------
// Lifecycle Methods
//----------------------------------------------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_refreshable_fragment_host);
ButterKnife.bind(this);
}
//----------------------------------------------------------------------------------
// Protected Methods
//----------------------------------------------------------------------------------
protected void configureRefreshableFragment(Refreshable refreshable) {
refreshable.onShouldRefreshObservableCreated(makeRefreshInitiatedObservable());
refreshable.setRefreshStatusListener(this);
refreshable.setOnRefreshableViewCreatedListener(this);
}
//----------------------------------------------------------------------------------
// RefreshStatusListener - Interface Methods
//----------------------------------------------------------------------------------
@Override
public void onRefreshingStatusChanged(@RefreshStatus int status) {
switch (status) {
case RefreshStatusListener.REFRESHING:
/*
Work around for SwipeRefreshLayout bug filed at https://code.google.com/p/android/issues/detail?id=77712
*/
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
}
});
break;
case RefreshStatusListener.NOT_REFRESHING:
/*
Work around for SwipeRefreshLayout bug filed at https://code.google.com/p/android/issues/detail?id=77712
*/
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(false);
}
});
break;
}
}
//----------------------------------------------------------------------------------
// OnRefreshableViewCreatedListener Interface Methods
//----------------------------------------------------------------------------------
@Override
public void onRefreshableViewCreated(View refreshableView) {
mSwipeRefreshLayout.setCustomChild(refreshableView);
}
//----------------------------------------------------------------------------------
// Helpers
//----------------------------------------------------------------------------------
private Observable<Void> makeRefreshInitiatedObservable() {
return Observable.create(new RefreshListenerSettingOnSubscribe(mSwipeRefreshLayout));
}
//----------------------------------------------------------------------------------
// Nested Inner Class
//----------------------------------------------------------------------------------
private static class RefreshListenerSettingOnSubscribe implements Observable.OnSubscribe<Void> {
private SwipeRefreshLayout mSwipeRefreshLayout;
private RefreshListenerSettingOnSubscribe(SwipeRefreshLayout swipeRefreshLayout) {
mSwipeRefreshLayout = swipeRefreshLayout;
}
@Override
public void call(final Subscriber<? super Void> subscriber) {
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
subscriber.onNext(null);
}
});
}
}
}