package net.dev123.yibo;
import java.util.List;
import net.dev123.commons.http.HttpRequestHelper;
import net.dev123.commons.util.ListUtil;
import net.dev123.mblog.entity.Status;
import net.dev123.yibo.common.CacheManager;
import net.dev123.yibo.common.Constants;
import net.dev123.yibo.common.GlobalVars;
import net.dev123.yibo.common.theme.Theme;
import net.dev123.yibo.common.theme.ThemeUtil;
import net.dev123.yibo.db.LocalAccount;
import net.dev123.yibo.service.adapter.AdapterUtil;
import net.dev123.yibo.service.adapter.CacheAdapter;
import net.dev123.yibo.service.adapter.GroupStatusesListAdapter;
import net.dev123.yibo.service.cache.AdapterCollectionCache;
import net.dev123.yibo.service.cache.Cache;
import net.dev123.yibo.service.cache.ReclaimLevel;
import net.dev123.yibo.service.listener.HomePageOnGestureListener;
import net.dev123.yibo.service.listener.HomePageScreenToggleClickListener;
import net.dev123.yibo.service.listener.HomePageScreenToggleClickListener.ScreenToggle;
import net.dev123.yibo.service.task.InitAppTask;
import net.dev123.yibo.service.task.PassportLoginPointsTask;
import net.dev123.yibo.service.task.VerifyCredentialsTask;
import net.dev123.yibo.widget.Skeleton;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
import com.mobclick.android.MobclickAgent;
public class HomePageActivity extends Activity {
private static final String TAG = HomePageActivity.class.getSimpleName();
private static final int DIALOG_EXIT = 1;
private YiBoApplication yibo = null;
private Skeleton skeleton = null;
private ScreenToggle toggle = null;
private GestureDetector detector;//触摸监听实例
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
yibo = (YiBoApplication) getApplication();
if (Constants.DEBUG) {
Log.v(TAG, "onCreate……" + ", Intent : " + getIntent());
}
boolean isStartup = getIntent().getBooleanExtra("START", false);
if (isStartup && savedInstanceState == null) {
new InitAppTask(this).execute();
} else {
initComponents();
updateContentView(savedInstanceState);
}
HomePageOnGestureListener gestureListener = new HomePageOnGestureListener(this);
detector = new GestureDetector(this, gestureListener);
}
public void initComponents() {
skeleton = new Skeleton(this);
//启动service和注册接收器
Intent serviceIntent = new Intent(this, AutoUpdateService.class);
startService(serviceIntent);
//登陆积分;
new PassportLoginPointsTask(this).execute();
}
public void updateContentView(Bundle savedInstanceState) {
LocalAccount currentAccount = null;
int contentType = Skeleton.TYPE_MY_HOME;
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(Constants.PREFS_KEY_CURRENT_ACCOUNT)) {
long currentAccountId = savedInstanceState.getLong(Constants.PREFS_KEY_CURRENT_ACCOUNT);
currentAccount = GlobalVars.getAccount(currentAccountId);
}
if (savedInstanceState.containsKey("CONTENT_TYPE")) {
contentType = savedInstanceState.getInt("CONTENT_TYPE");
}
}
if (currentAccount == null) {
currentAccount = yibo.getCurrentAccount();
}
if (currentAccount == null) {
Intent accountsIntent = new Intent();
accountsIntent.setClass(this, AccountsActivity.class);
startActivityForResult(accountsIntent, Constants.REQUEST_CODE_ACCOUNTS);
} else {
setContentView(skeleton);
yibo.setCurrentAccount(currentAccount);
skeleton.setCurrentAccount(currentAccount, true);
skeleton.setContentType(contentType);
if (!currentAccount.isVerified()) {
VerifyCredentialsTask task = new VerifyCredentialsTask(this, currentAccount);
task.execute();
}
}
}
@Override
protected void onResume() {
super.onResume();
MobclickAgent.onResume(this);
if (Constants.DEBUG) {
Log.v(TAG, "onResume……" + ", Skeleton is " + skeleton);
}
}
@SuppressWarnings("unchecked")
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (Constants.DEBUG) {
Log.v(TAG, "onActivityResult……" + ", Skeleton is " + skeleton);
}
Bundle bundle = null;
if (data != null) {
bundle = data.getExtras();
}
switch (requestCode) {
case Constants.REQUEST_CODE_ACCOUNTS:
switch (resultCode) {
case Constants.RESULT_CODE_ACCOUNT_SWITCH:
if (skeleton.getParent() == null) {
setContentView(skeleton);
}
LocalAccount account = yibo.getCurrentAccount();
skeleton.setCurrentAccount(account, true);
skeleton.setContentType(Skeleton.TYPE_MY_HOME);
if (account != null && !account.isVerified()) {
VerifyCredentialsTask task = new VerifyCredentialsTask(this, account);
task.execute();
}
break;
case Constants.RESULT_CODE_ACCOUNT_EXIT_APP:
exitApp();
break;
default:
break;
}
break;
case Constants.REQUEST_CODE_MICRO_BLOG:
if (resultCode == Constants.RESULT_CODE_MICRO_BLOG_DELETE) {
Status status = (Status) bundle.getSerializable("STATUS");
if (status != null) {
ListView lvMicroBlog = (ListView) this.findViewById(R.id.lvMicroBlog);
ListAdapter listAdapter = lvMicroBlog.getAdapter();
CacheAdapter<?> adapter = AdapterUtil.getCacheAdapter(listAdapter);
if (adapter != null) {
((CacheAdapter<Status>)adapter).remove(status);
}
}
}
break;
case Constants.REQUEST_CODE_SETTINGS:
if (resultCode != Constants.RESULT_CODE_SUCCESS) {
break;
}
if (yibo.isAutoScreenOrientation()) {
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
} else {
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
//语言设置
Configuration config = new Configuration();
config.locale = GlobalVars.LOCALE;
getResources().updateConfiguration(config, null);
ListView lvMicroBlog = (ListView)findViewById(R.id.lvMicroBlog);
if (lvMicroBlog != null) {
lvMicroBlog.setFastScrollEnabled(yibo.isSliderEnabled());
//字体改变时更新;
ListAdapter adapter = lvMicroBlog.getAdapter();
CacheAdapter<?> cacheAdapter = AdapterUtil.getCacheAdapter(adapter);
if (cacheAdapter != null) {
cacheAdapter.notifyDataSetChanged();
}
}
break;
case Constants.REQUEST_CODE_PROFILE_EDIT:
if (resultCode == Constants.RESULT_CODE_SUCCESS) {
skeleton.setContentType(Skeleton.TYPE_PROFILE);
}
break;
default:
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_options_home, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
switch (item.getItemId()) {
case R.id.menu_accounts:
intent.putExtras(bundle);
intent.setClass(HomePageActivity.this, AccountsActivity.class);
this.startActivityForResult(intent, Constants.REQUEST_CODE_ACCOUNTS);
break;
case R.id.menu_search:
this.onSearchRequested();
break;
case R.id.menu_back2top:
ListView lvMicroBlog = (ListView)this.findViewById(R.id.lvMicroBlog);
if (lvMicroBlog != null) {
lvMicroBlog.setSelection(1);
}
break;
case R.id.menu_setting:
intent.setClass(HomePageActivity.this, SettingActivity.class);
this.startActivityForResult(intent, Constants.REQUEST_CODE_SETTINGS);
break;
case R.id.menu_fullscreen:
GlobalVars.IS_FULLSCREEN = !GlobalVars.IS_FULLSCREEN;
if (GlobalVars.IS_FULLSCREEN) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
showScreenToggle();
item.setTitle(R.string.menu_not_fullscreen);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
hideScreenToggle();
item.setTitle(R.string.menu_fullscreen);
}
// String aboutMsg = getResources().getString(R.string.about);
// aboutMsg = String.format(aboutMsg, GlobalResource.getVersionName(this));
// new AlertDialog.Builder(this)
// .setTitle(this.getString(R.string.title_dialog_about))
// .setMessage(aboutMsg)
// .create()
// .show();
break;
case R.id.menu_quit:
showDialog(DIALOG_EXIT);
break;
default:
break;
}
return true;
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
YiBoApplication.changeLocale(this);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (yibo.isKeyBackExit()) {
showDialog(DIALOG_EXIT);
} else {
this.moveTaskToBack(true);
}
return true;
}
return super.onKeyUp(keyCode, event);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean isGesture = false;
if (GlobalVars.IS_ENABLE_GESTURE
&& detector != null
&& getSkeleton() != null ) {
isGesture = detector.onTouchEvent(ev);
}
//miui rom list slide back support;
isGesture = false;
if (isGesture) {
return isGesture;
} else {
return super.dispatchTouchEvent(ev);
}
}
@Override
protected void onNewIntent(Intent newIntent) {
super.onNewIntent(newIntent);
if (Constants.DEBUG) {
Log.v(TAG, "onNewIntent……" + ", Intent : " + newIntent);
}
LocalAccount account = (LocalAccount)newIntent.getSerializableExtra("ACCOUNT");
if (account == null) {
updateContentView(null);
return;
}
int contentType = newIntent.getIntExtra("CONTENT_TYPE", Skeleton.TYPE_MY_HOME);
yibo.setCurrentAccount(account); // 设置当前帐号
skeleton.setCurrentAccount(account, true);
skeleton.setContentType(contentType);
// move to head
ListView lvMicroBlog = (ListView) this.findViewById(R.id.lvMicroBlog);
if (lvMicroBlog != null) {
ListAdapter adapter = lvMicroBlog.getAdapter();
CacheAdapter<?> cacheAdapter = AdapterUtil.getCacheAdapter(adapter);
//有可能处于分组中
if (contentType == Skeleton.TYPE_MY_HOME
&& cacheAdapter instanceof GroupStatusesListAdapter) {
Cache cache = CacheManager.getInstance().getCache(account);
AdapterCollectionCache adapterCache = (AdapterCollectionCache)cache;
if (adapterCache != null) {
cacheAdapter = adapterCache.getMyHomeListAdapter();
lvMicroBlog.setAdapter(cacheAdapter);
TextView tvTitle = (TextView)this.findViewById(R.id.tvTitle);
String title = "";
if (account.getUser() != null) {
title += account.getUser().getScreenName() + "@";
}
title += account.getServiceProvider().getServiceProviderName();
tvTitle.setText(title);
}
}
if (cacheAdapter != null && cacheAdapter.refresh()) {
cacheAdapter.reclaim(ReclaimLevel.MODERATE);
}
if (lvMicroBlog.getChildCount() > 1) {
lvMicroBlog.setSelection(1);
}
}
}
@Override
protected void onPause() {
super.onPause();
MobclickAgent.onPause(this);
if (Constants.DEBUG) {
Log.v(TAG, "onPause……" + ", Skeleton is " + skeleton);
}
}
protected void onStop() {
super.onStop();
if (Constants.DEBUG) {
Log.v(TAG, "onStop……" + ", Skeleton is " + skeleton);
}
if (!yibo.isShowStatusIcon()) {
return;
}
int taskId = 0;
ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
List<RunningTaskInfo> taskInfoList = am.getRunningTasks(1);
if (ListUtil.isNotEmpty(taskInfoList)) {
RunningTaskInfo taskInfo = taskInfoList.get(0);
taskId = taskInfo.id;
}
if (this.getTaskId() != taskId) {
NotificationManager notificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
Intent notificationIntent = new Intent(this, SplashActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent contentIntent = PendingIntent.getActivity(
this, (int)System.currentTimeMillis(),
notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification();
notification.icon = R.drawable.icon_notification;
notification.flags |= Notification.FLAG_ONGOING_EVENT;
notification.flags |= Notification.FLAG_NO_CLEAR;
String contentTitle = this.getString(R.string.app_name);
String contentText = this.getString(R.string.label_ongoing);
notification.contentIntent = contentIntent;
notification.setLatestEventInfo(this, contentTitle, contentText, contentIntent);
notificationManager.notify(R.string.app_name, notification);
}
}
protected void onStart() {
super.onStart();
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(R.string.app_name);
if (Constants.DEBUG) {
Log.v(TAG, "onStart……" + ", Skeleton is " + skeleton);
}
}
@Override
protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) {
case DIALOG_EXIT:
dialog =
new AlertDialog.Builder(this)
.setTitle(R.string.title_dialog_alert)
.setMessage(R.string.msg_quit)
.setPositiveButton(R.string.btn_confirm, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
exitApp();
}
})
.setNegativeButton(R.string.btn_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.create();
break;
default:
break;
}
return dialog;
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (skeleton == null) {
return;
}
if (skeleton.getCurrentAccount() != null) {
outState.putLong(Constants.PREFS_KEY_CURRENT_ACCOUNT, skeleton.getCurrentAccount().getAccountId());
}
if (skeleton.getContentType() > 0) {
outState.putInt("CONTENT_TYPE", skeleton.getContentType());
}
if (Constants.DEBUG) {
Log.v(TAG, "onSaveInstanceState……" + ", Skeleton is " + skeleton);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (Constants.DEBUG) {
Log.v(TAG, "onDestroy……" + ", Skeleton is " + skeleton);
}
}
public void exitApp() {
setResult(Constants.RESULT_CODE_SPLASH_EXIT);
finish();
Intent serviceIntent = new Intent(this, AutoUpdateService.class);
stopService(serviceIntent);
// 清除通知;
NotificationManager notiManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notiManager.cancelAll();
yibo.setCurrentAccount(null);
CacheManager.getInstance().clear();
GlobalVars.clear();
HttpRequestHelper.shutdown();
android.os.Process.killProcess(android.os.Process.myPid());
}
@Override
public void onLowMemory() {
super.onLowMemory();
if (skeleton != null) {
skeleton.reclaim();
}
CacheManager.getInstance().reclaim(ReclaimLevel.MODERATE);
MobclickAgent.onEvent(this, "on_low_memory");
if (Constants.DEBUG) {
Toast.makeText(this, "low memory!", Toast.LENGTH_SHORT).show();
Log.w(TAG, "low memory, will reclaim!");
}
}
public Skeleton getSkeleton() {
return skeleton;
}
public void setSkeleton(Skeleton skeleton) {
this.skeleton = skeleton;
}
private void showScreenToggle() {
if (skeleton == null) {
return;
}
final Activity context = this;
if (toggle == null) {
skeleton.postDelayed(new Runnable() {
@Override
public void run() {
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View tabToggle = inflater.inflate(R.layout.widget_tab_toggle, null);
Theme theme = ThemeUtil.createTheme(context);
Button btnTabToggle = (Button)tabToggle.findViewById(R.id.btnTabToggle);
btnTabToggle.setBackgroundDrawable(theme.getDrawable("selector_tab_toggle"));
PopupWindow popTabToggle = new PopupWindow(tabToggle, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
popTabToggle.setFocusable(false);
popTabToggle.setOutsideTouchable(true);
View llFooter = context.findViewById(R.id.llFooter);
toggle = new ScreenToggle(popTabToggle, context.getWindow().getDecorView(), null, llFooter);
tabToggle.setOnClickListener(new HomePageScreenToggleClickListener(toggle));
}
},
2000);
}
}
private void hideScreenToggle() {
if (skeleton == null || toggle == null) {
return;
}
toggle.dismiss();
toggle = null;
}
}