package com.aswifter.material.news;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.Toast;
import com.aswifter.material.R;
import com.aswifter.material.common.AppClient;
import com.aswifter.material.common.BaseActivity;
import com.aswifter.material.common.ThreadPool;
import com.bumptech.glide.Glide;
import com.google.android.agera.Receiver;
import com.google.android.agera.Repositories;
import com.google.android.agera.Repository;
import com.google.android.agera.Result;
import com.google.android.agera.Supplier;
import com.google.android.agera.Updatable;
import java.io.IOException;
public class NewsDetailActivity extends BaseActivity implements Updatable {
private WebView webView;
private ImageView titleImageView;
private CollapsingToolbarLayout collapsingToolbarLayout;
private Toolbar toolbar;
private Repository<Result<NewsDetailResponse>> repository;
private NewsDetailSupplier newsDetailSupplier;
private Story story;
public static final String NEWS = "news_key";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_news_detail);
initView();
initRepository();
}
@Override
protected void initView() {
collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onBackPressed();
}
});
titleImageView = (ImageView) findViewById(R.id.ivImage);
webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
story = getIntent().getParcelableExtra(NEWS);
collapsingToolbarLayout.setTitle(story.getTitle());
}
@Override
protected void initRepository() {
newsDetailSupplier = new NewsDetailSupplier();
repository = Repositories.repositoryWithInitialValue(Result.<NewsDetailResponse>absent())
.observe()
.onUpdatesPerLoop()
.goTo(ThreadPool.executor)
.thenGetFrom(newsDetailSupplier)
.compile();
}
@Override
protected void onResume() {
super.onResume();
newsDetailSupplier.setKey(String.valueOf(story.getId()));
repository.addUpdatable(this);
}
@Override
protected void onStop() {
super.onStop();
repository.removeUpdatable(this);
}
@Override
public void update() {
if (repository.get().isPresent()) {
repository.get().ifFailedSendTo(new Receiver<Throwable>() {
@Override
public void accept(@NonNull Throwable value) {
Toast.makeText(NewsDetailActivity.this, "加载失败", Toast.LENGTH_SHORT).show();
}
}).ifSucceededSendTo(new Receiver<NewsDetailResponse>() {
@Override
public void accept(@NonNull final NewsDetailResponse value) {
collapsingToolbarLayout.setTitle(value.getTitle());
Glide.with(NewsDetailActivity.this)
.load(value.getImage())
.asBitmap()
.into(titleImageView);
if (value.getCss() != null && value.getCss().size() > 0) {
final Repository<Result<String>> resultRepository = Repositories.repositoryWithInitialValue(Result.<String>absent())
.observe()
.onUpdatesPerLoop()
.goTo(ThreadPool.executor)
.thenGetFrom(new Supplier<Result<String>>() {
@NonNull
@Override
public Result<String> get() {
String result = null;
try {
String url = value.getCss().get(0);
url = url.substring(url.lastIndexOf('=') + 1);
result = AppClient.httpService.getCSS(url).execute().body();
} catch (Exception e) {
Log.d("NewsDetail", "WebViewError" + e);
}
if (result == null) {
return Result.failure();
} else {
return Result.success(result);
}
}
})
.compile();
resultRepository.addUpdatable(new Updatable() {
@Override
public void update() {
String css = "<link rel=\"stylesheet\" href=\"file:///android_asset/news.css\" type=\"text/css\">";
String html = "<html><head>" + css + "</head><body>" + value.getBody() + "</body></html>";
html = html.replace("<div class=\"img-place-holder\">", "");
webView.loadDataWithBaseURL("file:///android_asset/", html, "text/html", "UTF-8", null);
resultRepository.removeUpdatable(this);
}
});
} else {
webView.loadData(value.getBody(), "text/html", "utf-8");
}
}
});
}
}
class NewsDetailSupplier implements Supplier<Result<NewsDetailResponse>> {
String key;
public void setKey(String key) {
this.key = key;
}
@NonNull
@Override
public Result<NewsDetailResponse> get() {
NewsDetailResponse newsDetailResponse = null;
try {
newsDetailResponse = AppClient.httpService.getNewsDetail(key).execute().body();
} catch (IOException e) {
e.printStackTrace();
}
if (newsDetailResponse == null) {
return Result.failure();
} else {
return Result.success(newsDetailResponse);
}
}
}
}