package com.arrownock.opensource.arrownockers.utils;
import java.lang.reflect.Field;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationSet;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;
import com.arrownock.opensource.arrownockers.R;
import com.arrownock.opensource.arrownockers.chat.SessionActivity;
import com.arrownock.opensource.arrownockers.push.PushWelcomeActivity;
import com.arrownock.opensource.arrownockers.topic.TopicListActivity;
import com.arrownock.opensource.arrownockers.wall.WallNavigationActivity;
import com.capricorn.ArcMenu;
public class MainActivity extends Activity implements OnTouchListener,
OnGestureListener {
private static final String logTag = "MainActivity";
private static final int[] ITEM_DRAWABLES = { R.drawable.icon_push,
R.drawable.icon_im, R.drawable.icon_circle, R.drawable.icon_wall };
private ArcMenu featureArcMenu;
private ImageView ivID;
private TextView tvID;
private TextView tvClock;
private RelativeLayout rlYellowBackground;
private RelativeLayout rlBlueBackground;
private RelativeLayout rlMain;
private RelativeLayout rlSettings;
private boolean pulled = false;
private static boolean hasEverPulled = false;
private float thisDelta = 0.05f;
private static int height;
private static int statusHeight = 0;
private GestureDetector gestureDetector;
private int PULL_UPWARD_DURATION = 950;
public static boolean alive = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
AnUtils.mainActivity = MainActivity.this;
AnUtils.initArrownockComponents(MainActivity.this);
alive = true;
}
@Override
protected void onRestart() {
super.onRestart();
if (AnUtils.getCurrentClientId() == null || AnUtils.getAnId() == null) {
AnUtils.initArrownockComponents(MainActivity.this);
}
alive = true;
paintBackground();
// 跳动提示可以上拉
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
jump(thisDelta);
}
}, 3000);
// 展开菜单
if (!featureArcMenu.mArcLayout.isExpanded()) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
featureArcMenu.controlButton.performClick();
}
}, 800);
}
}
@Override
protected void onStop() {
super.onStop();
alive = false;
}
@Override
protected void onDestroy() {
super.onDestroy();
if (AnIMWrapper.getWrapper() != null) {
AnIMWrapper.getWrapper().disconnect();
}
alive = false;
}
private void initView() {
featureArcMenu = (ArcMenu) findViewById(R.id.feature_menu);
featureArcMenu.bringToFront();
ivID = (ImageView) findViewById(R.id.iv_main_id);
tvID = (TextView) findViewById(R.id.tv_main_id);
if (AnUtils.getCurrentUsername() != null) {
tvID.setText("ID: " + AnUtils.getCurrentUsername());
}
tvClock = (TextView) findViewById(R.id.tv_clock);
tvClock.setText(AnUtils.getMainClockString(new Date()));
rlYellowBackground = (RelativeLayout) findViewById(R.id.iv_yellow);
rlBlueBackground = (RelativeLayout) findViewById(R.id.iv_blue);
rlMain = (RelativeLayout) findViewById(R.id.rl_main);
rlMain.setLongClickable(true);
rlMain.setOnTouchListener(this);
gestureDetector = new GestureDetector(this, this);
DisplayMetrics metrics = getResources().getDisplayMetrics();
height = metrics.heightPixels;
statusHeight = getStatusHeight();
rlSettings = (RelativeLayout) findViewById(R.id.rl_settings);
final LayoutParams settingsParams = (LayoutParams) rlSettings
.getLayoutParams();
settingsParams.topMargin = (int) (0.2 * height - statusHeight);
paintBackground();
setPullAnimation();
initArcMenu(featureArcMenu, ITEM_DRAWABLES);
setHeartbeatAnimation();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
jump(thisDelta);
}
}, 3000);
}
// 主页面跳动
private void jump(float delta) {
if (thisDelta - 0.03f < 0.001f) {
thisDelta = 0.05f;
return;
}
thisDelta = delta;
if (hasEverPulled) {
return;
}
playJumpAnimation(thisDelta);
}
// 跳起动画
private void playJumpAnimation(final float delta) {
float originalY = 0;
float finalY = 0 - height * delta;
AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(new TranslateAnimation(0, 0, originalY,
finalY));
animationSet.setDuration(300);
animationSet.setInterpolator(new AccelerateDecelerateInterpolator());
animationSet.setFillAfter(true);
animationSet.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
playLandAnimation(delta);
}
});
rlMain.startAnimation(animationSet);
}
// 落下动画
private void playLandAnimation(final float delta) {
float originalY = 0 - height * delta;
float finalY = 0;
AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(new TranslateAnimation(0, 0, originalY,
finalY));
animationSet.setDuration(200);
animationSet.setInterpolator(new AccelerateInterpolator());
animationSet.setFillAfter(true);
animationSet.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
jump(0.03f);
}
});
rlMain.startAnimation(animationSet);
}
// 按钮模拟心脏跳动
private void playHeartbeatAnimation() {
AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(new ScaleAnimation(1.0f, 1.8f, 1.0f, 1.8f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f));
animationSet.addAnimation(new AlphaAnimation(1.0f, 0.4f));
animationSet.setDuration(200);
animationSet.setInterpolator(new AccelerateInterpolator());
animationSet.setFillAfter(true);
animationSet.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(new ScaleAnimation(1.8f, 1.0f, 1.8f,
1.0f, Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f));
animationSet.addAnimation(new AlphaAnimation(0.4f, 1.0f));
animationSet.setDuration(600);
animationSet.setInterpolator(new DecelerateInterpolator());
animationSet.setFillAfter(false);
featureArcMenu.controlButton.startAnimation(animationSet);
}
});
featureArcMenu.controlButton.startAnimation(animationSet);
}
// 根据当前时间填充背景颜色
private void paintBackground() {
Date date = new Date();
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(date);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
DisplayMetrics metrics = getResources().getDisplayMetrics();
int width = metrics.widthPixels;
LayoutParams yellowParams = (LayoutParams) rlYellowBackground
.getLayoutParams();
LayoutParams blueParams = (LayoutParams) rlBlueBackground
.getLayoutParams();
if (hour == 0) {
// paint all blue
yellowParams.width = 0;
blueParams.width = LayoutParams.MATCH_PARENT;
} else if (hour == 12) {
// paint all yellow
yellowParams.width = LayoutParams.MATCH_PARENT;
blueParams.width = 0;
} else if (hour > 0 && hour < 12) {
// paint left yellow & right blue
int yellowWidth = hour * width / 12;
yellowParams.width = yellowWidth;
yellowParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
int blueWidth = width - yellowWidth;
blueParams.width = blueWidth;
blueParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
} else if (hour > 12 && hour <= 23) {
// paint left blue & right yellow
int blueWidth = (hour - 12) * width / 12;
blueParams.width = blueWidth;
blueParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
int yellowWidth = width - blueWidth;
yellowParams.width = yellowWidth;
yellowParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
}
rlYellowBackground.setLayoutParams(yellowParams);
rlBlueBackground.setLayoutParams(blueParams);
}
// 上拉/下拉主页面
private void pull(boolean upward) {
if (upward && pulled) {
return;
}
if (!upward && !pulled) {
return;
}
float originalY;
float finalY;
if (!pulled) {
originalY = 0;
finalY = (float) (0 - height + 0.2 * height);
} else {
originalY = (float) (0 - height + 0.2 * height);
finalY = 0;
}
pulled = !pulled;
AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(new TranslateAnimation(0, 0, originalY,
finalY));
animationSet.setDuration(300);
animationSet.setInterpolator(new AccelerateDecelerateInterpolator());
animationSet.setFillAfter(true);
animationSet.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
if (!pulled) {
rlMain.bringToFront();
for (int i = 0; i < featureArcMenu.mArcLayout
.getChildCount(); i++) {
featureArcMenu.mArcLayout.getChildAt(i).setClickable(
true);
}
}
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if (pulled) {
ivID.setRotation(180.0f);
rlSettings.bringToFront();
for (int i = 0; i < featureArcMenu.mArcLayout
.getChildCount(); i++) {
featureArcMenu.mArcLayout.getChildAt(i).setClickable(
false);
}
} else {
ivID.setRotation(360.0f);
}
}
});
rlMain.startAnimation(animationSet);
hasEverPulled = true;
}
// 设置按钮动画
private void setHeartbeatAnimation() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
String lastTimeString = AnUtils.getMainClockString(new Date());
while (true) {
try {
Thread.sleep(1000);
if (!featureArcMenu.mArcLayout.isExpanded()) {
runOnUiThread(new Runnable() {
public void run() {
playHeartbeatAnimation();
}
});
}
final String currentTimeString = AnUtils
.getMainClockString(new Date());
if (!currentTimeString.equals(lastTimeString)) {
lastTimeString = currentTimeString;
runOnUiThread(new Runnable() {
public void run() {
tvClock.setText(currentTimeString);
paintBackground();
}
});
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
}
// 设置主界面上拉动画
private void setPullAnimation() {
AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f));
animationSet.addAnimation(new AlphaAnimation(0.8f, 0.1f));
animationSet.setDuration(PULL_UPWARD_DURATION);
animationSet.setInterpolator(new DecelerateInterpolator());
animationSet.setFillAfter(false);
animationSet.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
});
}
private int getStatusHeight() {
Class<?> c = null;
Object obj = null;
Field field = null;
int x = 0;
int height = 0;
try {
c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
height = getResources().getDimensionPixelSize(x);
} catch (Exception e) {
e.printStackTrace();
}
return height;
}
// 初始化功能按钮
private void initArcMenu(ArcMenu menu, int[] itemDrawables) {
final int itemCount = itemDrawables.length;
for (int i = 0; i < itemCount; i++) {
ImageView item = new ImageView(this);
item.setImageResource(itemDrawables[i]);
final int position = i;
menu.addItem(item, new OnClickListener() {
@Override
public void onClick(View v) {
switch (position) {
case 0:
showPush();
break;
case 1:
showIM();
break;
case 2:
showCircle();
break;
case 3:
showWall();
break;
default:
break;
}
}
});
}
}
private void showPush() {
showFeatureActivity(PushWelcomeActivity.class);
}
private void showIM() {
showFeatureActivity(SessionActivity.class);
}
private void showCircle() {
showFeatureActivity(TopicListActivity.class);
}
private void showWall() {
showFeatureActivity(WallNavigationActivity.class);
}
private void showFeatureActivity(final Class<?> activityClass) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(MainActivity.this, activityClass);
startActivity(intent);
overridePendingTransition(R.anim.zoomin, R.anim.zoomout);
}
}, 300);
}
public void onClearClick(View view) {
DBManager.clear();
AnUtils.showToast(this, "操作成功", Gravity.CENTER, alive);
}
public void onSetCurrentUsername(final String username,
final boolean isError) {
runOnUiThread(new Runnable() {
@Override
public void run() {
tvID.setText("ID: " + username);
if (isError) {
AnUtils.showToast(MainActivity.this, username,
Gravity.CENTER, alive);
}
}
});
}
@Override
public boolean onDown(MotionEvent e) {
pull(false);
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i(logTag, "onFling");
if (e1.getY() - e2.getY() > 100) {
pull(true);
} else if (e2.getY() >= e1.getY()) {
pull(false);
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (pulled) {
if (event.getY() > height * 0.2 - statusHeight) {
return false;
}
}
return gestureDetector.onTouchEvent(event);
}
}