package net.oschina.gitapp.ui; import java.io.IOException; import java.util.HashMap; import net.oschina.gitapp.AppContext; import net.oschina.gitapp.AppException; import net.oschina.gitapp.R; import net.oschina.gitapp.api.ApiClient; import net.oschina.gitapp.bean.LuckMsg; import net.oschina.gitapp.bean.RandomProject; import net.oschina.gitapp.bean.URLs; import net.oschina.gitapp.common.StringUtils; import net.oschina.gitapp.common.UIHelper; import net.oschina.gitapp.ui.baseactivity.BaseActionBarActivity; import net.oschina.gitapp.util.ShakeListener; import net.oschina.gitapp.util.ShakeListener.OnShakeListener; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.media.AudioManager; import android.media.SoundPool; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Vibrator; import android.text.Html; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationSet; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; public class ShakeActivity extends BaseActionBarActivity implements OnClickListener { private final int DURATION_TIME = 600; private AppContext mAppContext; private ShakeListener mShakeListener = null; private Vibrator mVibrator; private TextView mLuckMsg; private RelativeLayout mImgUp; private RelativeLayout mImgDn; private LinearLayout mLoaging; private RelativeLayout mShakeResProject;// 摇到项目 private ImageView mProjectFace; private TextView mProjectTitle; private TextView mProjectDescription; private TextView mProjectLanguage; private TextView mProjectStarNums; private TextView mProjectForkNums; private RelativeLayout mShakeResAward;// 摇到奖品 private ImageView mShakeResAwardImg; private TextView mShakeResAwardMsg; private RandomProject mProject; private SoundPool sndPool; private HashMap<Integer, Integer> soundPoolMap = new HashMap<Integer, Integer>(); private Bitmap mBitmap; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shake); mAppContext = getGitApplication(); initView(); // 加载近期的活动信息 loadLuckMsg(); mVibrator = (Vibrator) getApplication().getSystemService( VIBRATOR_SERVICE); loadSound(); mShakeListener = new ShakeListener(this); // 监听到手机摇动 mShakeListener.setOnShakeListener(new OnShakeListener() { public void onShake() { startAnim(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.shake_menu, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.shake_menu_share: showShare(); break; case R.id.shake_menu_edit_shippingaddress: showShippingAddressActivity(); break; default: break; } return super.onOptionsItemSelected(item); } private void showShare() { if (mProject == null) { UIHelper.getDialog(ShakeActivity.this, "温馨提示", "请先摇一摇再分享吧", "知道了").show(); } else { String title = "摇项目,等你来!"; String url = URLs.URL_HOST + mProject.getOwner().getUsername() + URLs.URL_SPLITTER + mProject.getName(); String shareContent = "我在Git@OSC客户端中摇到《" + mProject.getOwner().getName() + "的项目" + mProject.getName() + "》你也来试试手气吧"; UIHelper.showShareOption(getActivity(), title, url, shareContent, mBitmap); } } private void initView() { mLuckMsg = (TextView) findViewById(R.id.shake_luck_msg); mImgUp = (RelativeLayout) findViewById(R.id.shakeImgUp); mImgDn = (RelativeLayout) findViewById(R.id.shakeImgDown); mLoaging = (LinearLayout) findViewById(R.id.shake_loading); mShakeResProject = (RelativeLayout) findViewById(R.id.shakeres_paroject); mProjectFace = (ImageView) findViewById(R.id.exploreproject_listitem_userface); mProjectTitle = (TextView) findViewById(R.id.exploreproject_listitem_title); mProjectDescription = (TextView) findViewById(R.id.exploreproject_listitem_description); mProjectLanguage = (TextView) findViewById(R.id.exploreproject_listitem_language); mProjectStarNums = (TextView) findViewById(R.id.exploreproject_listitem_star); mProjectForkNums = (TextView) findViewById(R.id.exploreproject_listitem_fork); mShakeResAward = (RelativeLayout) findViewById(R.id.shakeres_award); mShakeResAwardImg = (ImageView) findViewById(R.id.shake_award_img); mShakeResAwardMsg = (TextView) findViewById(R.id.shake_award_msg); mShakeResProject.setOnClickListener(this); } private void loadSound() { sndPool = new SoundPool(2, AudioManager.STREAM_SYSTEM, 5); new Thread() { public void run() { try { soundPoolMap.put( 0, sndPool.load( getAssets().openFd( "sound/shake_sound_male.mp3"), 1)); soundPoolMap.put(1, sndPool.load( getAssets().openFd("sound/shake_match.mp3"), 1)); } catch (IOException e) { e.printStackTrace(); } } }.start(); } public void startAnim() { AnimationSet animup = new AnimationSet(true); TranslateAnimation mytranslateanimup0 = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, -0.5f); mytranslateanimup0.setDuration(DURATION_TIME); TranslateAnimation mytranslateanimup1 = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, +0.5f); mytranslateanimup1.setDuration(DURATION_TIME); mytranslateanimup1.setStartOffset(DURATION_TIME); animup.addAnimation(mytranslateanimup0); animup.addAnimation(mytranslateanimup1); mImgUp.startAnimation(animup); AnimationSet animdn = new AnimationSet(true); TranslateAnimation mytranslateanimdn0 = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, +0.5f); mytranslateanimdn0.setDuration(DURATION_TIME); TranslateAnimation mytranslateanimdn1 = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, -0.5f); mytranslateanimdn1.setDuration(DURATION_TIME); mytranslateanimdn1.setStartOffset(DURATION_TIME); animdn.addAnimation(mytranslateanimdn0); animdn.addAnimation(mytranslateanimdn1); mImgDn.startAnimation(animdn); // 动画监听,开始时显示加载状态, mytranslateanimdn0.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { mShakeResProject.setVisibility(View.GONE); mShakeListener.stop(); sndPool.play(soundPoolMap.get(0), (float) 0.2, (float) 0.2, 0, 0, (float) 0.6); } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { loadProject(); } }); } public void startVibrato() { mVibrator.vibrate(new long[] { 500, 200, 500, 200 }, -1); } @Override protected void onDestroy() { super.onDestroy(); if (mShakeListener != null) { mShakeListener.stop(); } } @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.shakeres_paroject: if (mProject != null) { UIHelper.showProjectDetail(ShakeActivity.this, null, mProject.getId()); } break; default: break; } } private void beforeLoading() { mLoaging.setVisibility(View.VISIBLE); mShakeResProject.setVisibility(View.GONE); mShakeResAward.setVisibility(View.GONE); } private void afterLoading() { mLoaging.setVisibility(View.GONE); sndPool.play(soundPoolMap.get(1), (float) 0.2, (float) 0.2, 0, 0, (float) 0.6); mVibrator.cancel(); mShakeListener.start(); } private void loadProject() { new AsyncTask<Void, Void, Message>() { @Override protected Message doInBackground(Void... params) { Message msg = new Message(); try { msg.obj = mAppContext.getRandomProject(); msg.what = 1; } catch (AppException e) { msg.what = -1; msg.obj = e; e.printStackTrace(); } return msg; } @Override protected void onPreExecute() { super.onPreExecute(); beforeLoading(); } @Override protected void onPostExecute(Message msg) { super.onPostExecute(msg); afterLoading(); if (msg.what == 1) { mProject = (RandomProject) msg.obj; if (mProject !=null && mProject.getRand_num() == 0) { mShakeResProject.setVisibility(View.VISIBLE); // 没中奖的处理方式 mProjectTitle.setText(mProject.getOwner().getName() + "/" + mProject.getName()); mProjectDescription.setText(mProject.getDescription()); mProjectStarNums.setText(mProject.getStars_count() + ""); mProjectForkNums.setText(mProject.getForks_count() + ""); if (mProject.getLanguage() != null) { mProjectLanguage.setText(mProject.getLanguage()); } else { mProjectLanguage.setVisibility(View.GONE); findViewById(R.id.exploreproject_listitem_language_image).setVisibility(View.GONE); } mProjectFace.setImageResource(R.drawable.widget_dface_loading); String faceUrl = mProject.getOwner().getNew_portrait(); if (faceUrl.endsWith(".gif") || StringUtils.isEmpty(faceUrl)) { mProjectFace.setImageResource(R.drawable.mini_avatar); } else { UIHelper.showUserFace(mProjectFace, faceUrl); } Handler handle = new Handler(); handle.postDelayed(new Runnable() { @Override public void run() { mBitmap = UIHelper.takeScreenShot(getActivity()); } }, 500); } else if (mProject !=null) { mShakeListener.stop(); mShakeResAward.setVisibility(View.VISIBLE); UIHelper.showUserFace(mShakeResAwardImg, mProject.getImg()); mShakeResAwardMsg.setText(mProject.getMsg()); AlertDialog.Builder dialog = new Builder(ShakeActivity.this); dialog.setCancelable(false); dialog.setTitle("恭喜您,摇到奖品啦!!!"); dialog.setMessage(Html.fromHtml("获得:" + mProject.getMsg() + "<br><br>温馨提示:<br>请完善您的收货信息,方便我们给您邮寄奖品")); dialog.setNegativeButton("我知道了", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mShakeListener.start(); showShippingAddressActivity(); } }); dialog.setPositiveButton("分享", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String url = "http://t.cn/RhLDd4k"; Bitmap bitmap = UIHelper.takeScreenShot(getActivity()); UIHelper.showShareOption(getActivity(), "我摇到奖品啦", url, mProject.getMsg(), bitmap); } }); dialog.show(); } } else { UIHelper.ToastMessage(mAppContext, "红薯跟你开了个玩笑,没有为你找到项目"); } } }.execute(); } /** * 显示编辑用户收货地址的操作 */ private void showShippingAddressActivity() { if (!mAppContext.isLogin()) { UIHelper.showLoginActivity(getActivity()); return; } Intent intent = new Intent(ShakeActivity.this, ShippingAddressActivity.class); startActivity(intent); } private void loadLuckMsg() { new AsyncTask<Void, Void, LuckMsg>() { @Override protected LuckMsg doInBackground(Void... params) { LuckMsg res = null; try { res = ApiClient.getLuckMsg(mAppContext); } catch (AppException e) { e.printStackTrace(); } return res; } @Override protected void onPostExecute(LuckMsg res) { super.onPostExecute(res); if (res != null && res.getMessage() != null) { mLuckMsg.setVisibility(View.VISIBLE); mLuckMsg.setText(res.getMessage()); } } @Override protected void onPreExecute() { super.onPreExecute(); } }.execute(); } }