package com.quinn.githubknife.ui.activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AlertDialog;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import com.github.quinn.iconlibrary.icons.OctIcon;
import com.quinn.githubknife.R;
import com.quinn.githubknife.presenter.RepoAndEventPreviewPresenter;
import com.quinn.githubknife.presenter.RepoAndEventPreviewPresenterImpl;
import com.quinn.githubknife.presenter.UserInfoPresenter;
import com.quinn.githubknife.presenter.UserInfoPresenterImpl;
import com.quinn.githubknife.ui.BaseActivity;
import com.quinn.githubknife.ui.fragments.FollowerFragment;
import com.quinn.githubknife.ui.fragments.FollowingFragment;
import com.quinn.githubknife.ui.fragments.StarredRepoFragment;
import com.quinn.githubknife.ui.fragments.UserRepoFragment;
import com.quinn.githubknife.ui.widget.AnimateFirstDisplayListener;
import com.quinn.githubknife.ui.widget.UserLabel;
import com.quinn.githubknife.utils.BitmapUtils;
import com.quinn.githubknife.utils.Constants;
import com.quinn.githubknife.utils.L;
import com.quinn.githubknife.utils.ToastUtils;
import com.quinn.githubknife.view.RepoAndEventPreviewView;
import com.quinn.githubknife.view.UserInfoView;
import com.quinn.httpknife.github.Repository;
import com.quinn.httpknife.github.User;
import com.tencent.mm.sdk.modelmsg.SendMessageToWX;
import com.tencent.mm.sdk.modelmsg.WXImageObject;
import com.tencent.mm.sdk.modelmsg.WXMediaMessage;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class UserInfoActivity extends BaseActivity implements UserInfoView,RepoAndEventPreviewView {
private static final String TAG = UserInfoActivity.class.getSimpleName();
private User user;
@Bind(R.id.toolbar)
Toolbar toolbar;
@Bind(R.id.collapsing_toolbar)
CollapsingToolbarLayout collapsingToolbar;
@Bind(R.id.backdrop)
ImageView backDrop;
@Bind(R.id.relation)
FloatingActionButton relationBtn;
@Bind(R.id.starLabel)
UserLabel starLabel;
@Bind(R.id.followersLabel)
UserLabel followersLabel;
@Bind(R.id.followingsLabel)
UserLabel followingsLabel;
@Bind(R.id.nickname)
TextView nickname;
@Bind(R.id.scrollWrap)
View scrollWrap;
@Bind(R.id.emailLayout)
View emailLayout;
@Bind(R.id.blogLayout)
View blogLayout;
@Bind(R.id.companyLayout)
View companyLayout;
@Bind(R.id.locationLayout)
View locationLayout;
@Bind(R.id.joinLayout)
View joinLayout;
@Bind(R.id.repo_preivew_one)
View preview_1;
@Bind(R.id.repo_preivew_two)
View preview_2;
@Bind(R.id.repo_preivew_three)
View preview_3;
@Bind(R.id.repoCount)
TextView repoCount;
@Bind(R.id.repo_preview_title)
View repoPreviewTitle;
private List<Repository> preivewRepo = new ArrayList<Repository>();
@Override
public void repoItems(List items) {
for(int i = 0; i < preview_holder.length && i < items.size(); i++){
preview_holder[i].textKey.setText(((Repository)items.get(i)).getName());
preview_holder[i].textValue.setText("" + ((Repository) items.get(i)).getStargazers_count());
if(((Repository) items.get(0)).isFork() == false){
BitmapUtils.setIconFont(this, preview_holder[i].icon, OctIcon.REPO, R.color.theme_color);
}else{
BitmapUtils.setIconFont(this, preview_holder[i].icon, OctIcon.FORK, R.color.theme_color);
}
preivewRepo.add((Repository)items.get(i));
}
if(items.size() < 3){
if(items.size() == 1){
preview_2.setVisibility(View.GONE);
preview_3.setVisibility(View.GONE);
}
if(items.size() == 2){
preview_3.setVisibility(View.GONE);
}
if(items.size() == 0){
repoPreviewTitle.setVisibility(View.GONE);
}
}
}
@Override
public void eventItems(List items) {
}
@Override
public void loadRepoError() {
}
@Override
public void loadEventError() {
}
public static class IconKeyValueViewHolder {
@Bind(R.id.textIcon) public ImageView icon;
@Bind(R.id.textKey) public TextView textKey;
@Bind(R.id.textValue) public TextView textValue;
}
public static class RepoPreviewHolder {
@Bind(R.id.textIcon) public ImageView icon;
@Bind(R.id.textKey) public TextView textKey;
@Bind(R.id.star) public ImageView star;
@Bind(R.id.textValue) public TextView textValue;
}
IconKeyValueViewHolder emailHolder = new IconKeyValueViewHolder();
IconKeyValueViewHolder blogHolder = new IconKeyValueViewHolder();
IconKeyValueViewHolder companyHolder = new IconKeyValueViewHolder();
IconKeyValueViewHolder joinHolder = new IconKeyValueViewHolder();
IconKeyValueViewHolder locationHolder = new IconKeyValueViewHolder();
RepoPreviewHolder[] preview_holder = new RepoPreviewHolder[3];
FollowState followState;
enum FollowState {
UNKNOWN,
FOLLOWED,
UNFOLLOWED
}
private UserInfoPresenter presenter;
private RepoAndEventPreviewPresenter previewPresenter;
public static void launch(Context context, Bundle bundle) {
Intent intent = new Intent(context, UserInfoActivity.class);
if (bundle != null)
intent.putExtras(bundle);
context.startActivity(intent);
}
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_info);
ButterKnife.bind(this);
ButterKnife.bind(joinHolder, joinLayout);
ButterKnife.bind(emailHolder, emailLayout);
ButterKnife.bind(companyHolder, companyLayout);
ButterKnife.bind(blogHolder, blogLayout);
ButterKnife.bind(locationHolder, locationLayout);
preview_holder[0] = new RepoPreviewHolder();
preview_holder[1] = new RepoPreviewHolder();
preview_holder[2] = new RepoPreviewHolder();
ButterKnife.bind(preview_holder[0],preview_1);
ButterKnife.bind(preview_holder[1],preview_2);
ButterKnife.bind(preview_holder[2],preview_3);
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
user = (User) bundle.getSerializable("user");
} else if (savedInstanceState != null) {
user = (User) savedInstanceState.getSerializable("user");
}
presenter = new UserInfoPresenterImpl(this, this);
previewPresenter = new RepoAndEventPreviewPresenterImpl(this, this);
presenter.user(user.getLogin());
previewPresenter.previewRepo(1, user.getLogin());
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
collapsingToolbar.setTitle(user.getLogin());
paletteToolbar();
BitmapUtils.setIconFont(this, emailHolder.icon, OctIcon.EMAIL, R.color.theme_color);
BitmapUtils.setIconFont(this, blogHolder.icon, OctIcon.BLOG, R.color.theme_color);
BitmapUtils.setIconFont(this, companyHolder.icon, OctIcon.COMPANY, R.color.theme_color);
BitmapUtils.setIconFont(this, locationHolder.icon, OctIcon.LOCATE, R.color.theme_color);
BitmapUtils.setIconFont(this, joinHolder.icon, OctIcon.JOIN, R.color.theme_color);
emailHolder.textKey.setText(R.string.email);
blogHolder.textKey.setText(R.string.blog);
companyHolder.textKey.setText(R.string.company);
joinHolder.textKey.setText(R.string.join);
locationHolder.textKey.setText(R.string.location);
emailHolder.textValue.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG); //下划线
emailHolder.textValue.getPaint().setAntiAlias(true);//抗锯齿
blogHolder.textValue.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG); //下划线
blogHolder.textValue.getPaint().setAntiAlias(true);//抗锯齿
BitmapUtils.setIconFont(this, preview_holder[0].star, OctIcon.STAR, R.color.theme_color);
BitmapUtils.setIconFont(this, preview_holder[1].star, OctIcon.STAR, R.color.theme_color);
BitmapUtils.setIconFont(this, preview_holder[2].star, OctIcon.STAR, R.color.theme_color);
emailHolder.textValue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendEmail();
}
});
blogHolder.textValue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
directToBlog();
}
});
DisplayMetrics displaymetrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int screenHeight = displaymetrics.heightPixels;
int actionBarHeight = 0;
TypedValue tv = new TypedValue();
if (this.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
scrollWrap.setMinimumHeight(screenHeight - actionBarHeight);
//状态栏透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
}
api = WXAPIFactory.createWXAPI(this, null);
api.registerApp(Constants.WECHAT_SDK_APPID);
}
private void test() {
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
WXImageObject imgObj = new WXImageObject(bmp);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 200, 200, true);
bmp.recycle();
msg.thumbData = BitmapUtils.bmpToByteArray(thumbBmp, true); //
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = System.currentTimeMillis() + "";
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;
api.sendReq(req);
}
public void paletteToolbar(){
//collapsingToolbar.setcon
imageLoader.displayImage(user.getAvatar_url(), backDrop, option, new AnimateFirstDisplayListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);
Palette.generateAsync(loadedImage, 24, new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
Palette.Swatch vibrant = palette.getVibrantSwatch();
Palette.Swatch darkVibrant = palette.getDarkVibrantSwatch();
Palette.Swatch lightVibrant = palette.getLightVibrantSwatch();
Palette.Swatch muted = palette.getMutedSwatch();
Palette.Swatch darkMuted = palette.getDarkMutedSwatch();
Palette.Swatch lightMuted = palette.getLightMutedSwatch();
Palette.Swatch swatch = vibrant;
swatch = (swatch == null) ? muted : swatch;
swatch = (swatch == null) ? darkVibrant : swatch;
swatch = (swatch == null) ? darkMuted : swatch;
swatch = (swatch == null) ? lightVibrant : swatch;
swatch = (swatch == null) ? lightMuted : swatch;
collapsingToolbar.setContentScrim(new ColorDrawable(swatch.getRgb()));
}
});
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_user_info, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
case R.id.action_refresh:
presenter.user(user.getLogin());
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void loadUser(User user) {
if (user == null)
return;
/**
* 处理返回为空的
*/
String nicknameStr= this.user.getLogin();
if(TextUtils.isEmpty(user.getName())){
nickname.setText(this.user.getLogin());
}else{
nickname.setText(user.getName());
}
followersLabel.setValue("" + user.getFollowers());
followingsLabel.setValue("" + user.getFollowing());
if(TextUtils.isEmpty(user.getEmail())){
emailLayout.setVisibility(View.GONE);
}else {
emailHolder.textValue.setText("" + user.getEmail());
}
if(TextUtils.isEmpty(user.getCompany())){
companyLayout.setVisibility(View.GONE);
}else {
companyHolder.textValue.setText("" + user.getCompany());
}
if(TextUtils.isEmpty(user.getBlog())){
blogLayout.setVisibility(View.GONE);
}else {
try {
blogHolder.textValue.setText(user.getBlog().substring(0, 30) + "...");
}catch (StringIndexOutOfBoundsException e){
blogHolder.textValue.setText("" + user.getBlog());
}
}
if(TextUtils.isEmpty(user.getLocation())){
locationLayout.setVisibility(View.GONE);
}else {
try {
locationHolder.textValue.setText(user.getLocation().substring(0, 27) + "...");
}catch (StringIndexOutOfBoundsException e){
locationHolder.textValue.setText("" + user.getLocation());
}
}
repoCount.setText("" + user.getPublic_repos());
Date date = user.getCreated_at();
joinHolder.textValue.setText(date.toLocaleString());
presenter.hasFollow(user.getLogin());
}
@Override
public void setFollowState(boolean isFollow) {
if (isFollow) {
relationBtn.setImageDrawable(getResources().getDrawable(R.drawable.unfollow));
followState = FollowState.FOLLOWED;
} else {
relationBtn.setImageDrawable(getResources().getDrawable(R.drawable.follow));
followState = FollowState.UNFOLLOWED;
}
presenter.starredCount(user.getLogin());
}
@Override
public void setStarredCount(int count) {
starLabel.setValue("" + count);
}
@Override
public void onError(String msg) {
ToastUtils.showMsg(this, msg);
}
@OnClick(R.id.followerWrap)
void viewFollower() {
viewDetail(FollowerFragment.TAG);
}
@OnClick(R.id.followingWrap)
void viewFollowing() {
viewDetail(FollowingFragment.TAG);
}
@OnClick(R.id.starWrap)
void viewStarred() {
viewDetail(StarredRepoFragment.TAG);
}
@OnClick(R.id.repo_preview_title)
void viewAllRepo(){
viewDetail(UserRepoFragment.TAG);
}
@OnClick(R.id.relation)
void changeRelation() {
L.i(TAG, "try to changeRelation");
AlertDialog.Builder builder =
new AlertDialog.Builder(this);
switch (followState) {
case UNFOLLOWED:
L.i(TAG, "try to follow " + user.getLogin());
builder.setTitle("Follow Someone");
builder.setMessage("Sure to follow " + user.getLogin() + "?");
builder.setPositiveButton("follow", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
presenter.follow(user.getLogin());
}
});
builder.setNegativeButton("Cancel", null);
builder.show();
break;
case FOLLOWED:
L.i(TAG, "try to unfollow " + user.getLogin());
builder.setTitle("Unfollow Someone");
builder.setMessage("Sure to unfollow " + user.getLogin() + "?");
builder.setPositiveButton("Unfollow", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
presenter.unFollow(user.getLogin());
}
});
builder.setNegativeButton("Cancel", null);
builder.show();
break;
case UNKNOWN:
break;
}
}
void directToBlog(){
if(blogHolder.textValue.getText().toString().isEmpty() == false)
redirectToBrowser(blogHolder.textValue.getText().toString());
}
public void sendEmail(){
if(emailHolder.textValue.getText().toString().isEmpty() == false)
sendEmail(emailHolder.textValue.getText().toString());
}
public void viewDetail(String contentType) {
Bundle bundle = new Bundle();
bundle.putSerializable("user", user.getLogin());
bundle.putString("fragment", contentType);
FoActivity.launch(this, bundle);
}
@OnClick(R.id.repo_preivew_one)
public void viewRepo1(){
RepoActivity.launch(this,preivewRepo.get(0));
}
@OnClick(R.id.repo_preivew_two)
public void viewRepo2(){
RepoActivity.launch(this,preivewRepo.get(1));
}
@OnClick(R.id.repo_preivew_three)
public void viewRepo3(){
RepoActivity.launch(this,preivewRepo.get(2));
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("user", user);
}
}