package org.goodev.discourse;
import android.annotation.TargetApi;
import android.app.ActionBar;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.ResultReceiver;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.text.Html;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TextView;
import android.widget.Toast;
import com.uservoice.uservoicesdk.Config;
import com.uservoice.uservoicesdk.UserVoice;
import org.goodev.discourse.api.Api;
import org.goodev.discourse.api.GetUserInfoTask;
import org.goodev.discourse.api.data.Category;
import org.goodev.discourse.api.data.UserDetails;
import org.goodev.discourse.contentprovider.Provider;
import org.goodev.discourse.database.Database;
import org.goodev.discourse.database.tables.CategoriesTable;
import org.goodev.discourse.database.tables.SiteTable;
import org.goodev.discourse.database.tables.UserInfoTable;
import org.goodev.discourse.model.Categories;
import org.goodev.discourse.model.Site;
import org.goodev.discourse.model.UserInfo;
import org.goodev.discourse.ui.CategoriesFragment;
import org.goodev.discourse.ui.CategoryTopicsFragment;
import org.goodev.discourse.ui.FavoritedTopicsFragment;
import org.goodev.discourse.ui.LoginFragment;
import org.goodev.discourse.ui.LoginFragment.LoginCallback;
import org.goodev.discourse.ui.NewTopicsFragment;
import org.goodev.discourse.ui.ProgressFragment;
import org.goodev.discourse.ui.ReadTopicsFragment;
import org.goodev.discourse.ui.TopicsListFragment;
import org.goodev.discourse.ui.UnreadTopicsFragment;
import org.goodev.discourse.ui.dialog.DialogStandardFragment;
import org.goodev.discourse.utils.ImageLoader;
import org.goodev.discourse.utils.L;
import org.goodev.discourse.utils.PrefsUtils;
import org.goodev.discourse.utils.Utils;
import java.lang.reflect.Field;
import java.util.HashMap;
public class MainActivity extends FragmentActivity implements LoaderCallbacks<Cursor>, LoginCallback, OnClickListener {
public static final String RESET_INDEX = "delete from sqlite_sequence where name='%1s';";
// private static final String TAG_LATEST = "latest_frag";
// private static final String TAG_CATEGORY = "cat_frag";
private static final String FRAGMENT_TAG = "tag_frag";
// ----------------loader
private static final int LOADER_ID_SITE = 100;
private final ContentObserver mObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
getSupportLoaderManager().restartLoader(LOADER_ID_SITE, null, MainActivity.this);
}
};
private static final int LOADER_ID_USER = 1001;
private static final int LOADER_ID_CATEGORY = 1002;
private static final String TAG_PRO = "progress";
private static final String TAG_LOGIN = "login";
private final OnCheckedChangeListener mSiteChangeListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
siteChanged(group, checkedId);
}
};
private final Handler mHandler = new Handler();
// ----- Left Drawer
private ImageView mUserIcon;
private TextView mUserDisplayName;
private TextView mUserName;
private DrawerLayout mDrawerLayout;
private View mDrawer;
private ListView mDrawerList;
private ViewGroup mMainContent;
private HeaderAdapter mDrawerAdapter;
private ActionBarDrawerToggle mDrawerToggle;
private CharSequence mTitle;
private CharSequence mDrawerTitle;
private RadioGroup mSiteRadioGroup;
private int mDrawerPosition = ListView.INVALID_POSITION;
// TODO fix this , not load data from database
// 当前选择的 分类 ID或者 导航条目 ID
private long mCategoryId = -2;
private int mNavId = -1;
private Site mCurrentSite;
private String mCurrentSiteUrl;
private Fragment mCurrentFrag;
private LoginFragment mLoginFragment;
private ProgressFragment mProgressFragment;
private UserDetails mUser;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
if (state != null) {
mCurrentSiteUrl = state.getString(Utils.EXTRA_URL, null);
mUser = (UserDetails) state.getSerializable(Utils.EXTRA_OBJ);
mDrawerPosition = state.getInt(Utils.EXTRA_NUMBER, ListView.INVALID_POSITION);
mCurrentFrag = getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
}
initViews();
initLoaders();
setupUserVoiceSdk();
checkShowChangeLog();
}
private void setupUserVoiceSdk() {
Config config = new Config("goodev.uservoice.com");
UserVoice.init(config, this);
config.setShowForum(false);
config.setShowContactUs(true);
config.setShowPostIdea(false);
config.setShowKnowledgeBase(false);
// hack to always show the overflow menu in the action bar
try {
ViewConfiguration viewConfig = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(viewConfig, false);
}
} catch (Exception ex) {
// Ignore
}
}
private void initViews() {
mMainContent = (ViewGroup) findViewById(R.id.content_frame);
if (mCurrentFrag != null) {
mMainContent.removeAllViews();
}
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
// set a custom shadow that overlays the main content when the drawer open
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
mDrawerLayout.setFocusableInTouchMode(false);
mDrawer = findViewById(R.id.left_drawer);
mDrawerList = (ListView) findViewById(R.id.drawer_list);
View listHeaderView = getLayoutInflater().inflate(R.layout.drawer_left_header, mDrawerList, false);
listHeaderView.findViewById(R.id.user_layout).setOnClickListener(this);
mUserDisplayName = (TextView) listHeaderView.findViewById(R.id.user_name);
mUserName = (TextView) listHeaderView.findViewById(R.id.user_login_name);
mUserIcon = (ImageView) listHeaderView.findViewById(R.id.user_icon);
mSiteRadioGroup = (RadioGroup) listHeaderView.findViewById(R.id.site_radio_group);
mSiteRadioGroup.setOnCheckedChangeListener(mSiteChangeListener);
mDrawerList.addHeaderView(listHeaderView);
mDrawerAdapter = new HeaderAdapter(this, new DrawerCategoryAdapter(this));
mDrawerList.setAdapter(mDrawerAdapter);
mDrawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mDrawerList.setItemChecked(position, true);
onDrawerListItemClick(parent.getItemAtPosition(position));
}
});
// enable ActionBar app icon to behave as action to toggle nav drawer
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the sliding drawer and the action bar app icon
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
@Override
public void onDrawerClosed(View view) {
// getActionBar().setTitle(mTitle);
// creates call to onPrepareOptionsMenu()
invalidateOptionsMenu();
}
@Override
public void onDrawerOpened(View drawerView) {
// getActionBar().setTitle(mDrawerTitle);
// creates call to onPrepareOptionsMenu()
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
protected void onDrawerListItemClick(Object data) {
if (data instanceof Cursor) {
mCurrentFrag = new CategoryTopicsFragment();
Categories c = new Categories((Cursor) data);
if (mCategoryId != c.getUid()) {
mCategoryId = c.getUid();
mNavId = -1;
Bundle args = new Bundle();
args.putString(Utils.EXTRA_URL, mCurrentSiteUrl);
L.d("Open Category: %s", c.getName());
args.putString(Utils.EXTRA_TITLE, c.getName());
args.putString(Utils.EXTRA_SLUG, c.getSlug());
args.putLong(Utils.EXTRA_ID, c.getUid());
mCurrentFrag.setArguments(args);
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mCurrentFrag, FRAGMENT_TAG).commit();
}
} else if (data instanceof Integer) {
int id = ((Integer) data).intValue();
if (mNavId != id) {
mNavId = id;
mCategoryId = -2;
if (id == HeaderAdapter.LATEST) {
setLatestTopicsFragment();
} else if (id == HeaderAdapter.CATEGORY) {
setCategoriesFragment();
} else if (id == HeaderAdapter.NEW) {
setNewFragment();
} else if (id == HeaderAdapter.UNREAD) {
setUnreadFragment();
} else if (id == HeaderAdapter.READ) {
setReadFragment();
} else if (id == HeaderAdapter.FAVORITE) {
setFavFragment();
}
// TODO add more
}
}
closeDrawer();
}
private void closeDrawer() {
mDrawerLayout.closeDrawer(mDrawer);
}
private void openCategoryActivity(Categories c) {
Intent intent = new Intent();
intent.setClass(this, CategoryActivity.class);
intent.putExtra(Utils.EXTRA_URL, mCurrentSiteUrl);
intent.putExtra(Utils.EXTRA_TITLE, c.getName());
intent.putExtra(Utils.EXTRA_SLUG, c.getSlug());
intent.putExtra(Utils.EXTRA_ID, c.getUid());
startActivity(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* When using the ActionBarDrawerToggle, you must call it during onPostCreate() and onConfigurationChanged()...
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
if (mDrawerToggle != null)
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
if (mDrawerToggle != null)
mDrawerToggle.syncState();
}
/**
* Backward-compatible version of {@link ActionBar#getThemedContext()} that simply returns the {@link android.app.Activity} if
* <code>getThemedContext</code> is unavailable.
*/
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
private Context getActionBarThemedContextCompat() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return getActionBar().getThemedContext();
} else {
return this;
}
}
/* Called whenever we call invalidateOptionsMenu() */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// If the nav drawer is open, hide action items related to the content
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawer);
// menu.findItem(R.id.action_about).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle != null && mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action buttons
switch (item.getItemId()) {
case R.id.action_settings:
openSettingsActivity();
return true;
case R.id.action_search:
openSearchActivity();
return true;
case R.id.action_faq:
openFaqActivity();
return true;
case R.id.action_feedback:
openFeedbackActivity();
return true;
case R.id.action_create_topic:
openCreateTopicActivity();
return true;
case R.id.action_changelog:
openDialogFragment(new DialogStandardFragment());
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void openCreateTopicActivity() {
if (!App.isLogin()) {
Toast.makeText(this, R.string.create_topic_not_login, Toast.LENGTH_LONG).show();
return;
}
ActivityUtils.openNewEditorActivity(this, null);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(Utils.EXTRA_NUMBER, mDrawerList.getCheckedItemPosition());
outState.putSerializable(Utils.EXTRA_OBJ, mUser);
if (!TextUtils.isEmpty(mCurrentSiteUrl)) {
outState.putString(Utils.EXTRA_URL, mCurrentSiteUrl);
}
}
@Override
protected void onPause() {
super.onPause();
getContentResolver().unregisterContentObserver(mObserver);
}
@Override
protected void onResume() {
super.onResume();
getContentResolver().registerContentObserver(Provider.SITE_CONTENT_URI, true, mObserver);
}
@Override
protected void onResumeFragments() {
super.onResumeFragments();
if (mUser == null && mCurrentSite != null) {
L.i("loading user......... " + mCurrentSiteUrl);
loadUserInfo(mCurrentSite, true);
}
}
private void initLoaders() {
getSupportLoaderManager().initLoader(LOADER_ID_SITE, null, this);
getSupportLoaderManager().initLoader(LOADER_ID_CATEGORY, null, this);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String userSort = UserInfoTable.SITEID + " ASC";
String siteSort = SiteTable.ID + " ASC";
switch (id) {
case LOADER_ID_SITE:
return new CursorLoader(this, Provider.SITE_CONTENT_URI, SiteTable.ALL_COLUMNS, null, null, siteSort);
case LOADER_ID_USER:
return new CursorLoader(this, Provider.USERINFO_CONTENT_URI, UserInfoTable.ALL_COLUMNS, null, null, userSort);
case LOADER_ID_CATEGORY:
return new CursorLoader(this, Provider.CATEGORIES_CONTENT_URI, CategoriesTable.ALL_COLUMNS, null, null, null);
}
return null;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
switch (loader.getId()) {
case LOADER_ID_SITE:
setupSiteGroup(data);
break;
case LOADER_ID_USER:
break;
case LOADER_ID_CATEGORY:
// TODO discourse api修改, http://meta.discourse.org/latest.json 返回值不再包含Caegory信息 所以需要做全局缓存
setupAppCategoryCache(data);
setupDrawerCategory(data);
break;
}
}
private void setupAppCategoryCache(Cursor data) {
HashMap<Long, Category> categories = new HashMap<Long, Category>();
if (data != null && data.moveToFirst()) {
while (!data.isAfterLast()) {
Category c = new Category(data);
categories.put(c.id, c);
data.moveToNext();
}
App.setCategories(categories);
}
}
private void setupDrawerCategory(Cursor data) {
mDrawerAdapter.swapCursor(data);
if (mDrawerPosition != ListView.INVALID_POSITION) {
mDrawerAdapter.setLogin(App.isLogin());
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mDrawerList.setItemChecked(mDrawerPosition, true);
mDrawerPosition = ListView.INVALID_POSITION;
}
}, 500);
} else {
// 第一个为 Navigation header,第二个为 最新topic 分类
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mNavId = 0;
mDrawerList.setItemChecked(2, true);
}
}, 500);
}
}
private RadioButton getSiteButton() {
return (RadioButton) getLayoutInflater().inflate(R.layout.drawer_site_radio_button, mSiteRadioGroup, false);
}
private void setupSiteGroup(Cursor data) {
final RadioGroup group = mSiteRadioGroup;
group.removeAllViews();
String siteUrl = mCurrentSiteUrl;
// if (siteUrl == null) {
// siteUrl = PrefsUtils.getCurrentSiteUrl();
// }
if (data.getCount() == 0) {
setNoSiteContentView();
RadioButton button = getSiteButton();
group.addView(button);
mDrawerAdapter.setHasSite(false);
} else {
mDrawerAdapter.setHasSite(true);
final String lastSite = PrefsUtils.getCurrentSiteUrl();
data.moveToFirst();
while (!data.isAfterLast()) {
RadioButton button = getSiteButton();
Site site = new Site(data);
button.setTag(site);
String url = site.getUrl();
String displayUrl = url;
if (url.endsWith(Utils.SLASH)) {
displayUrl = url.substring(0, url.length() - 1);
}
String title = getString(R.string.radio_btn_text, site.getTitle(), displayUrl);
button.setText(Html.fromHtml(title));
group.addView(button);
if (url.equals(siteUrl)) {
button.setChecked(true);
} else if (url.equals(lastSite)) {
button.setChecked(true);
}
data.moveToNext();
}
if (lastSite == null && siteUrl == null) {
((RadioButton) group.getChildAt(0)).setChecked(true);
}
}
}
private void setNoSiteContentView() {
View button = getLayoutInflater().inflate(R.layout.no_site_tips, mMainContent, false);
mMainContent.addView(button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
openSettingsActivity();
}
});
}
// TODO first try login, then load other data.
protected void siteChanged(RadioGroup group, int checkedId) {
if (checkedId == -1) {
return;
}
RadioButton button = (RadioButton) group.findViewById(checkedId);
Site site = (Site) button.getTag();
if (site != null) {
App.setSiteUrl(site.getUrl());
}
if (site == null) {
group.clearCheck();
openSettingsActivity();
} else if (!site.getUrl().equals(mCurrentSiteUrl)) { // TODO 第一次启动 加载上次查看的url。
mDrawerPosition = ListView.INVALID_POSITION;
mCurrentSite = site;
mCurrentSiteUrl = site.getUrl();
PrefsUtils.setCurrentSiteUrl(mCurrentSiteUrl);
App.setLogin(false);
clearDatabase();
// 登陆完成后,再加载其他信息
loadUserInfo(site, false);
} else {
setupUserInfo(mUser);
}
getActionBar().setSubtitle(mCurrentSiteUrl);
}
private void clearDatabase() {
SQLiteDatabase db = new Database(this).getWritableDatabase();
getContentResolver().delete(Provider.CATEGORIES_CONTENT_URI, null, null);
db.execSQL(String.format(RESET_INDEX, CategoriesTable.TABLE_NAME));
// getContentResolver().delete(Provider.CATEGORY_GROUP_PERMISSIONS_CONTENT_URI, null, null);
// db.execSQL(String.format(RESET_INDEX, Category_group_permissionsTable.TABLE_NAME));
//
// getContentResolver().delete(Provider.CATEGORY_PROPERTIES_CONTENT_URI, null, null);
// db.execSQL(String.format(RESET_INDEX, Category_propertiesTable.TABLE_NAME));
//
// getContentResolver().delete(Provider.FEATURED_USERS_CONTENT_URI, null, null);
// db.execSQL(String.format(RESET_INDEX, Featured_usersTable.TABLE_NAME));
//
// getContentResolver().delete(Provider.SUGGESTED_TOPICS_CONTENT_URI, null, null);
// db.execSQL(String.format(RESET_INDEX, Suggested_topicsTable.TABLE_NAME));
//
// getContentResolver().delete(Provider.TOPICS_CONTENT_URI, null, null);
// db.execSQL(String.format(RESET_INDEX, TopicsTable.TABLE_NAME));
//
// getContentResolver().delete(Provider.TOPICSDETAILS_CONTENT_URI, null, null);
// db.execSQL(String.format(RESET_INDEX, TopicsDetailsTable.TABLE_NAME));
//
// getContentResolver().delete(Provider.TOPICSPARTICIPANTS_CONTENT_URI, null, null);
// db.execSQL(String.format(RESET_INDEX, TopicsParticipantsTable.TABLE_NAME));
//
// getContentResolver().delete(Provider.TOPIC_POSTERS_CONTENT_URI, null, null);
// db.execSQL(String.format(RESET_INDEX, Topic_postersTable.TABLE_NAME));
//
// getContentResolver().delete(Provider.TOPICS_PROPERTIES_CONTENT_URI, null, null);
// db.execSQL(String.format(RESET_INDEX, Topics_propertiesTable.TABLE_NAME));
//
// getContentResolver().delete(Provider.TOPICS_USERS_CONTENT_URI, null, null);
// db.execSQL(String.format(RESET_INDEX, Topics_usersTable.TABLE_NAME));
}
private void updateMainFragment() {
mMainContent.removeAllViews();
setLatestTopicsFragment();
// 第一个为 Navigation header,第二个为 最新topic 分类
mDrawerList.setItemChecked(1, true);
}
private void setLatestTopicsFragment() {
mCurrentFrag = new TopicsListFragment();
updateFragment();
}
private void setCategoriesFragment() {
mCurrentFrag = new CategoriesFragment();
updateFragment();
}
private void setNewFragment() {
mCurrentFrag = new NewTopicsFragment();
updateFragment();
}
private void setUnreadFragment() {
mCurrentFrag = new UnreadTopicsFragment();
updateFragment();
}
private void setReadFragment() {
mCurrentFrag = new ReadTopicsFragment();
updateFragment();
}
private void setFavFragment() {
mCurrentFrag = new FavoritedTopicsFragment();
updateFragment();
}
private void updateFragment() {
Bundle args = new Bundle();
args.putString(Utils.EXTRA_URL, mCurrentSiteUrl);
mCurrentFrag.setArguments(args);
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mCurrentFrag, FRAGMENT_TAG).commit();
}
private void loadSiteCategory() {
Intent intent = Utils.getService(this, mCurrentSiteUrl, Api.TYPE_CATEGORIES);
ResultReceiver rr = new ResultReceiver(null) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode == Activity.RESULT_OK) {
getSupportLoaderManager().restartLoader(LOADER_ID_CATEGORY, null, MainActivity.this);
}
}
};
intent.putExtra(Utils.EXTRA_CALLBACK, rr);
startService(intent);
}
private void loadUserInfo(Site site, boolean nullCancel) {
ContentResolver cr = getContentResolver();
Cursor c = cr.query(Provider.USERINFO_CONTENT_URI, UserInfoTable.ALL_COLUMNS, UserInfoTable.SITEURL + " = \"" + site.getUrl() + "\"", null, null);
UserInfo user = null;
if (c.moveToFirst()) {
user = new UserInfo(c);
}
final String name = user == null ? null : user.getName();
final String password = user == null ? null : user.getPassword();
if (nullCancel && (name == null || password == null)) {
return;
}
mHandler.post(new Runnable() {
@Override
public void run() {
login(mCurrentSiteUrl, name, password);
}
});
if (name != null) {
new GetUserInfoTask(mCurrentSiteUrl, name).execute();
}
}
// TODO 如果用户没有设置登录信息,则依然执行该函数,返回值为null,表示登录失败
private void login(String site, String name, String password) {
FragmentManager manager = getSupportFragmentManager();
if (mLoginFragment != null) {
manager.beginTransaction().remove(mLoginFragment).commit();
}
mLoginFragment = new LoginFragment();
Bundle args = new Bundle();
args.putString(Utils.EXTRA_URL, mCurrentSiteUrl);
args.putString(Utils.EXTRA_NAME, name);
args.putString(Utils.EXTRA_PASSWORD, password);
mLoginFragment.setArguments(args);
manager.beginTransaction().add(mLoginFragment, TAG_LOGIN).commit();
}
@Override
public void onPreExecute() {
mProgressFragment = new ProgressFragment();
mProgressFragment.show(getSupportFragmentManager(), TAG_PRO);
}
@Override
public void onResult(UserDetails data) {
mUser = data;
// 横竖屏切换的时候 该fragment为null
if (mProgressFragment == null) {
mProgressFragment = (ProgressFragment) getSupportFragmentManager().findFragmentByTag(TAG_PRO);
}
if (mLoginFragment == null) {
mLoginFragment = (LoginFragment) getSupportFragmentManager().findFragmentByTag(TAG_LOGIN);
}
L.i("remove dialog PF:" + mProgressFragment + " LF:" + mLoginFragment);
getSupportFragmentManager().beginTransaction().remove(mProgressFragment).remove(mLoginFragment).commit();
mProgressFragment = null;
mLoginFragment = null;
setupUserInfo(data);
boolean login = data != null;
App.setLogin(login);
mDrawerAdapter.setLogin(login);
loadSiteCategory();
updateMainFragment();
}
private void setupUserInfo(UserDetails data) {
if (data == null) {
mUserDisplayName.setText(R.string.not_login);
mUserName.setText(R.string.click_to_login);
mUserIcon.setImageResource(R.drawable.ic_person);
return;
}
App.setUserInfo(data.username, null);
mUserDisplayName.setText(data.name);
mUserName.setText(data.username);
ImageLoader imageLoader = App.getImageLoader(this, getResources());
int size = Api.AVATAR_SIZE_BIG;
String iconUrl = Utils.getAvatarUrl(data.avatar_template, size);
imageLoader.setMaxImageSize(size);
imageLoader.get(iconUrl, mUserIcon);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.user_layout:
if (mUser == null) {
showAddUserDialog();
} else {
openUserActivity();
}
break;
default:
break;
}
}
private void showAddUserDialog() {
openSettingsActivity();
}
private void openFaqActivity() {
Intent intent = new Intent(this, HelpActivity.class);
startActivity(intent);
}
private void openSettingsActivity() {
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
}
private void openSearchActivity() {
Intent intent = new Intent(this, SearchActivity.class);
startActivity(intent);
}
private void openFeedbackActivity() {
UserVoice.launchContactUs(this);
}
private void openUserActivity() {
L.i(mUser.username);
ActivityUtils.openUserActivity(this, mUser.username);
}
@Override
public void onBackPressed() {
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawer);
L.i("back " + drawerOpen);
if (!drawerOpen) {
mDrawerLayout.openDrawer(mDrawer);
Toast.makeText(this, R.string.press_again_exit, Toast.LENGTH_SHORT).show();
} else {
super.onBackPressed();
}
}
private void checkShowChangeLog() {
boolean first = Utils.isFirstRun();
if (first) {
openDialogFragment(new DialogStandardFragment());
}
}
private void openDialogFragment(DialogStandardFragment dialogStandardFragment) {
if (dialogStandardFragment != null) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
Fragment prev = fm.findFragmentByTag("log_dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
dialogStandardFragment.show(ft, "log_dialog");
}
}
}