package com.sun.bingo.ui.activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.framework.dialog.TipDialog;
import com.framework.dialog.ToastTip;
import com.shamanland.fab.FloatingActionButton;
import com.sina.weibo.sdk.api.TextObject;
import com.sina.weibo.sdk.api.WebpageObject;
import com.sina.weibo.sdk.api.WeiboMultiMessage;
import com.sina.weibo.sdk.api.share.BaseResponse;
import com.sina.weibo.sdk.api.share.IWeiboHandler;
import com.sina.weibo.sdk.api.share.IWeiboShareAPI;
import com.sina.weibo.sdk.api.share.SendMultiMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.WeiboShareSDK;
import com.sina.weibo.sdk.constant.WBConstants;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.net.RequestListener;
import com.sina.weibo.sdk.net.openapi.RefreshTokenApi;
import com.sina.weibo.sdk.utils.Utility;
import com.sun.bingo.R;
import com.sun.bingo.constant.ConstantParams;
import com.sun.bingo.control.NavigateManager;
import com.sun.bingo.model.BingoEntity;
import com.sun.bingo.model.SinaRefreshTokenEntity;
import com.sun.bingo.model.UserEntity;
import com.sun.bingo.ui.fragment.FavoriteFragment;
import com.sun.bingo.ui.fragment.MyBingoFragment;
import com.sun.bingo.ui.fragment.SquareBingoFragment;
import com.sun.bingo.util.FastJsonUtil;
import com.sun.bingo.util.ShareUtil;
import com.sun.bingo.util.UserEntityUtil;
import com.sun.bingo.util.theme.ColorChooserDialog;
import com.sun.bingo.util.update.DownloadApk;
import butterknife.BindView;
import butterknife.ButterKnife;
import cn.bmob.v3.BmobUser;
public class MainActivity extends BaseActivity implements ColorChooserDialog.Callback, IWeiboHandler.Response {
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.fl_container)
FrameLayout flContainer;
@BindView(R.id.floating_action_button)
FloatingActionButton floatingActionButton;
@BindView(R.id.main_navigation_layout)
NavigationView mainNavigationLayout;
@BindView(R.id.main_drawer_layout)
DrawerLayout mainDrawerLayout;
private String[] titles;
private int mCurrentPosition = 0;
private long lastTime = 0;
private ImageView ivUserAvatar;
private TextView tvNickName;
private TextView tvUserSign;
private boolean isShareUrl = true;
private IWeiboShareAPI mWeiboShareAPI; // 新浪微博分享接口实例
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initSinaShare(savedInstanceState);
checkBmobUser();
initData();
initView();
initListener();
}
@Override
protected void onResume() {
super.onResume();
checkBmobUser();
checkClipboard();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
mWeiboShareAPI.handleWeiboResponse(intent, this);
}
private void initSinaShare(Bundle savedInstanceState) {
mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(this, ConstantParams.SINA_APP_KEY);
mWeiboShareAPI.registerApp();
if (savedInstanceState != null) {
mWeiboShareAPI.handleWeiboResponse(getIntent(), this);
}
}
/**
* 第三方应用发送请求消息到微博,唤起微博分享界面。
* 同时可以分享文本、图片以及其它媒体资源(网页、音乐、视频、声音中的一种)。
*/
public void sendMultiMessageToSina(BingoEntity entity) {
if (!mWeiboShareAPI.isWeiboAppSupportAPI()) {
Toast.makeText(this, "暂不支持新浪微博分享", Toast.LENGTH_SHORT).show();
return ;
}
// 1. 初始化微博的分享消息
WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
if (mWeiboShareAPI.getWeiboAppSupportAPI() >= 10351) {
TextObject textObject = new TextObject();
textObject.text = "【Bingo下载页面:https://fir.im/Bingo】 \n "+entity.getDescribe();
weiboMessage.textObject = textObject;
}
weiboMessage.mediaObject = getWebpageObj(entity);
// 2. 初始化从第三方到微博的消息请求
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
// 用transaction唯一标识一个请求
request.transaction = String.valueOf(System.currentTimeMillis());
request.multiMessage = weiboMessage;
// 3. 发送请求消息到微博,唤起微博分享界面
mWeiboShareAPI.sendRequest(mActivity, request);
}
// 创建新浪微博网页分享对象
private WebpageObject getWebpageObj(BingoEntity entity) {
WebpageObject mediaObject = new WebpageObject();
mediaObject.identify = Utility.generateGUID();
mediaObject.title = "来自Bingo分享";
mediaObject.description = entity.getDescribe();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
// 设置 Bitmap 类型的图片到视频对象里。 注意:最终压缩过的缩略图大小不得超过 32kb。
mediaObject.setThumbImage(bitmap);
mediaObject.actionUrl = entity.getWebsite();
mediaObject.defaultText = "Bingo分享";
return mediaObject;
}
@Override
public void onResponse(BaseResponse baseResponse) {
if(baseResponse!= null){
switch (baseResponse.errCode) {
case WBConstants.ErrorCode.ERR_OK:
break;
case WBConstants.ErrorCode.ERR_CANCEL:
break;
case WBConstants.ErrorCode.ERR_FAIL:
ToastTip.show("分享失败 " + baseResponse.errMsg);
break;
}
}
}
private void initVersion() {
new DownloadApk(this).checkVersion(false);
}
// 检查Bmob用户是否登录
private void checkBmobUser() {
myEntity = BmobUser.getCurrentUser(this, UserEntity.class);
if (myEntity == null) {
NavigateManager.gotoLoginActivity(this);
finish();
}
}
// 检查剪贴板上是否有http链接
private void checkClipboard() {
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clipData = clipboardManager.getPrimaryClip();
if (clipData == null) return ;
ClipData.Item item = clipData.getItemAt(0);
final String text = item.getText().toString();
if (!TextUtils.isEmpty(text) && text.startsWith("http") && isShareUrl && !text.equals(getSettingsSharedPreferences().newBingoUrl())) {
TipDialog tipDialog = new TipDialog(this);
tipDialog.show("将复制的URL分享到Bingo", text, "立即分享", "暂不", new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
isShareUrl = false;
NavigateManager.gotoEditNewBingoActivity(mActivity, text);
}
@Override
public void onNegative(MaterialDialog dialog) {
super.onNegative(dialog);
isShareUrl = false;
getSettingsSharedPreferences().newBingoUrl(text);
}
});
}
}
private void initData() {
titles = new String[3];
titles[0] = getString(R.string.menu_square_bingo);
titles[1] = getString(R.string.menu_my_bingo);
titles[2] = getString(R.string.menu_my_favorite);
myEntity = BmobUser.getCurrentUser(this, UserEntity.class);
if (myEntity != null) {
initVersion();
sinaRefreshTokenRequest();
}
}
private void initView() {
initToolBar(toolbar, false, R.string.app_name);
ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, mainDrawerLayout, toolbar, 0, 0);
drawerToggle.syncState();
controlShowFragment(0);
setOvalShapeViewBackground(floatingActionButton);
ivUserAvatar = ButterKnife.findById(mainNavigationLayout.getHeaderView(0), R.id.iv_user_avatar);
tvNickName = ButterKnife.findById(mainNavigationLayout.getHeaderView(0), R.id.tv_nick_name);
tvUserSign = ButterKnife.findById(mainNavigationLayout.getHeaderView(0), R.id.tv_user_sign);
if (myEntity != null) {
UserEntityUtil.setUserAvatarView(mContext, myEntity.getUserAvatar(), ivUserAvatar);
UserEntityUtil.setTextViewData(tvNickName, myEntity.getNickName());
UserEntityUtil.setTextViewData(tvUserSign, myEntity.getUserSign());
}
}
private void initListener() {
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NavigateManager.gotoEditNewBingoActivity(mActivity, null);
}
});
mainNavigationLayout.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.nav_square_bingo:
controlShowFragment(0);
break;
case R.id.nav_my_bingo:
controlShowFragment(1);
break;
case R.id.nav_favorite_bingo:
controlShowFragment(2);
break;
case R.id.nav_switch_theme:
changeTheme();
break;
case R.id.nav_feedback:
ShareUtil.feedback(MainActivity.this);
break;
case R.id.nav_send_to_friend:
ShareUtil.sendToFriend(MainActivity.this);
break;
case R.id.nav_share:
ShareUtil.share(MainActivity.this);
break;
}
menuItem.setChecked(true);
return true;
}
});
ivUserAvatar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NavigateManager.gotoProfileActivity(MainActivity.this, false);
}
});
}
// 新浪微博刷新Token请求
private void sinaRefreshTokenRequest() {
if (TextUtils.isEmpty(getAccountSharedPreferences().refresh_token())) {
return ;
}
RefreshTokenApi.create(this).refreshToken(ConstantParams.SINA_APP_KEY, getAccountSharedPreferences().refresh_token(), new RequestListener() {
@Override
public void onComplete(String s) {
if (!TextUtils.isEmpty(s)) {
SinaRefreshTokenEntity entity = FastJsonUtil.parseJson(s, SinaRefreshTokenEntity.class);
if (entity != null) {
getAccountSharedPreferences().uid(entity.getUid());
getAccountSharedPreferences().access_token(entity.getAccess_token());
getAccountSharedPreferences().refresh_token(entity.getRefresh_token());
getAccountSharedPreferences().expires_in(entity.getExpires_in());
}
}
}
@Override
public void onWeiboException(WeiboException e) {
e.printStackTrace();
}
});
}
private void controlShowFragment(int position) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment oldFragment = fragmentManager.findFragmentByTag(makeTag(mCurrentPosition));
if (oldFragment != null) {
fragmentTransaction.hide(oldFragment);
}
mCurrentPosition = position;
Fragment currentFragment = fragmentManager.findFragmentByTag(makeTag(position));
if (currentFragment != null) {
fragmentTransaction.show(currentFragment);
} else {
fragmentTransaction.add(R.id.fl_container, getFragment(position), makeTag(position));
}
fragmentTransaction.commitAllowingStateLoss();
if (mainDrawerLayout.isShown()) {
mainDrawerLayout.closeDrawers();
}
toolbar.setTitle(titles[position]);
}
private String makeTag(int position) {
return R.id.fl_container + "" + position;
}
private Fragment getFragment(int position) {
Fragment fragment;
switch (position) {
case 0:
fragment = new SquareBingoFragment();
break;
case 1:
fragment = new MyBingoFragment();
break;
case 2:
fragment = new FavoriteFragment();
break;
default:
fragment = new SquareBingoFragment();
break;
}
return fragment;
}
@Override
protected void onSaveInstanceState(Bundle outState) {
//空操作解决Fragment重叠问题
}
//设置主题
private void changeTheme() {
new ColorChooserDialog().show(this, getSettingsSharedPreferences().themeValue());
}
@Override
public void onColorSelection(int index, int color, int darker) {
getSettingsSharedPreferences().themeValue(index);
recreate();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.item_menu_app:
NavigateManager.gotoSpecifiedActivity(mContext, AboutActivity.class);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onBackPressed() {
if (mainDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
mainDrawerLayout.closeDrawers();
return ;
}
if (System.currentTimeMillis() - lastTime < 2000) {
super.onBackPressed();
} else {
lastTime = System.currentTimeMillis();
ToastTip.show(getString(R.string.toast_exit_tip));
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case NavigateManager.PROFILE_REQUEST_CODE:
if (myEntity != null) {
myEntity = BmobUser.getCurrentUser(MainActivity.this, UserEntity.class);
UserEntityUtil.setUserAvatarView(mContext, myEntity.getUserAvatar(), ivUserAvatar);
UserEntityUtil.setTextViewData(tvNickName, myEntity.getNickName());
UserEntityUtil.setTextViewData(tvUserSign, myEntity.getUserSign());
}
break;
}
}
}