package com.knight.arch.ui;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.alibaba.fastjson.JSON;
import com.knight.arch.R;
import com.knight.arch.api.ApiService;
import com.knight.arch.ui.adapter.HotReposDetailsListAdapterHolder;
import com.knight.arch.data.ReposKV;
import com.knight.arch.model.Repository;
import com.knight.arch.module.ReposDetailsModule;
import com.knight.arch.ui.base.InjectableActivity;
import com.knight.arch.ui.misc.DividerItemDecoration;
import com.knight.arch.utils.KeyBoardTools;
import com.knight.arch.utils.L;
import com.umeng.analytics.MobclickAgent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.inject.Inject;
import retrofit.client.Response;
import rx.Observer;
import rx.android.app.AppObservable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
/**
* @author andyiac
* @date 15-8-4
* @web http://blog.andyiac.com/
*/
public class ReposDetailsActivity extends InjectableActivity {
private Repository mRepository;
private RecyclerView mRecyclerView;
private HotReposDetailsListAdapterHolder adapter;
private LinearLayoutManager linearLayoutManager;
private List<ReposKV> mReposData = new ArrayList<>();
private FloatingActionButton mStarFB;
@Inject
ApiService oAuthApiService;
private Observer<Object> observable = new Observer<Object>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
L.e("ReposDetailsActivity === error ====>>>" + e.toString());
}
@Override
public void onNext(Object o) {
int status = ((Response) o).getStatus();
L.e("ReposDetailsActivity====>> star repo");
L.json((Response) o);
if (status == 204) {
setStarFBStatus(true);
}
}
};
// todo 这里的泛型直接使用 Response 就不行
private Observer<Object> checkStarObservable = new Observer<Object>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object response) {
int status = ((Response) response).getStatus();
if (status == 204) {
setStarFBStatus(true);
}
}
};
@Override
protected int provideContentViewId() {
return R.layout.activity_repos_details;
}
@Override
public List<Object> getModules() {
return Arrays.<Object>asList(new ReposDetailsModule(this));
}
public void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
public void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
mRepository = intent.getParcelableExtra("repos_data");
L.json(JSON.toJSONString(mRepository));
if (mRepository != null) {
initData();
}
initView();
initStarFlowButtonStatus();
}
private void initStarFlowButtonStatus() {
// 查看本人是否star过本项目
String reposOwner = mRepository.getOwner().getLogin();
String reposName = mRepository.getName();
String accessToken = this.getSharedPreferences("githot_sp", MODE_PRIVATE).getString("token", "");
if (TextUtils.isEmpty(accessToken)) {
Toast.makeText(this, "please login first", Toast.LENGTH_SHORT).show();
return;
}
// 检查状态
AppObservable.bindActivity(ReposDetailsActivity.this, oAuthApiService.checkIfReposStarred(reposOwner, reposName, accessToken))
.map(new Func1<Response, Object>() {
@Override
public Object call(Response response) {
L.json(response);
return response;
}
})
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(checkStarObservable);
// FB 实例
// mStarFB
//设置状态
}
private void initData() {
mReposData.add(new ReposKV("repository name", mRepository.getName()));
mReposData.add(new ReposKV("description", mRepository.getDescription()));
mReposData.add(new ReposKV("is fork", "" + mRepository.isFork()));
mReposData.add(new ReposKV("stars", String.valueOf(mRepository.getStargazers_count())));
mReposData.add(new ReposKV("forks", String.valueOf(mRepository.getForks_count())));
mReposData.add(new ReposKV("open issues", String.valueOf(mRepository.getOpen_issues_count())));
mReposData.add(new ReposKV("language", String.valueOf(mRepository.getLanguage())));
mReposData.add(new ReposKV("clone url", String.valueOf(mRepository.getClone_url())));
mReposData.add(new ReposKV("owner", mRepository.getOwner().getLogin()));
mReposData.add(new ReposKV("owner type", mRepository.getOwner().getType()));
mReposData.add(new ReposKV("create at", mRepository.getCreated_at()));
mReposData.add(new ReposKV("update at", mRepository.getUpdated_at()));
}
private void initView() {
Toolbar mToolbar = (Toolbar) findViewById(R.id.id_repos_details_toobar);
setSupportActionBar(mToolbar);
ActionBar ab = getSupportActionBar();
if (ab != null) {
ab.setHomeAsUpIndicator(R.mipmap.ic_back_arrow);
ab.setDisplayHomeAsUpEnabled(true);
ab.setTitle(mRepository.getName());
}
adapter = new HotReposDetailsListAdapterHolder(this, mReposData);
mRecyclerView = (RecyclerView) findViewById(R.id.id_repos_details_recycler_view);
mRecyclerView.setAdapter(adapter);
linearLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(linearLayoutManager);
float paddingStart = getResources().getDimension(R.dimen.repos_hot_divider_padding_start);
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST, paddingStart, false));
mStarFB = (FloatingActionButton) findViewById(R.id.id_repos_details_fb);
mStarFB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//判断是否登录
String token = ReposDetailsActivity.this.getSharedPreferences("githot_sp", MODE_PRIVATE).getString("token", "");
if (TextUtils.isEmpty(token)) {
Toast.makeText(ReposDetailsActivity.this, "please login first", Toast.LENGTH_SHORT).show();
return;
}
AppObservable.bindActivity(ReposDetailsActivity.this, oAuthApiService.starRepo(mRepository.getOwner().getLogin(), mRepository.getName(), token))
.map(new Func1<Object, Object>() {
@Override
public Object call(Object object) {
return object;
}
})
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(observable);
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
KeyBoardTools.actionKey(KeyEvent.KEYCODE_BACK);
return true;
}
return super.onOptionsItemSelected(item);
}
//更改FloatingButton 的状态
private void setStarFBStatus(boolean status) {
if (mStarFB == null) {
mStarFB = (FloatingActionButton) findViewById(R.id.id_repos_details_fb);
}
if (status) {
mStarFB.setImageResource(R.mipmap.ic_star);
} else {
mStarFB.setImageResource(R.mipmap.ic_unstar);
}
mStarFB.postInvalidate();
}
}