package net.dev123.yibo; import net.dev123.commons.util.StringUtil; import net.dev123.yibo.common.CompatibilityUtil; import net.dev123.yibo.common.Constants; import net.dev123.yibo.common.theme.ThemeUtil; import net.dev123.yibo.db.ConfigSystemDao; import net.dev123.yibo.db.LocalAccount; import net.dev123.yibo.db.LocalAccountDao; import net.dev123.yibo.service.adapter.AccountListAdapter; import net.dev123.yibo.service.listener.AccountPassportClickListener; import net.dev123.yibo.service.listener.SlideFinishOnGestureListener.SlideDirection; import net.dev123.yibo.service.task.ConfigAppSyncTask; import net.dev123.yibo.service.task.PassportSyncTask; import net.dev123.yibo.service.task.QueryPointLevelTask; import net.dev123.yibome.entity.Passport; import net.dev123.yibome.entity.PointLevel; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.database.DataSetObserver; import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class AccountsActivity extends BaseActivity { private static final String TAG = AccountsActivity.class.getSimpleName(); private static final int SWITCH_TO_MENU_ID = Menu.FIRST; private static final int SET_DEFAULT_MENU_ID = Menu.FIRST + 1; private static final int DELETE_MENU_ID = Menu.FIRST + 2; public enum Action { Add, //帐号添加动作 Delete, //帐号删除动作 MakeDefault //设置默认帐号 } private AccountListAdapter alAdapter; private AccountsActivity context; private YiBoApplication yibo; private ConfigSystemDao configSystemDao; private Passport passport; private boolean isPassportLogin; private LocalAccount originCurrentAccount; private boolean isCustomKeyLevel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.accounts); this.setSlideDirection(SlideDirection.LEFT); this.context = AccountsActivity.this; this.yibo = (YiBoApplication)context.getApplication(); this.originCurrentAccount = yibo.getCurrentAccount(); this.configSystemDao = new ConfigSystemDao(context); initComponents(); initAccountsList(); initPassport(); bindEvent(); updateBackButton(); } private void initComponents() { LinearLayout llRoot = (LinearLayout)findViewById(R.id.llRoot); LinearLayout llHeaderBase = (LinearLayout)findViewById(R.id.llHeaderBase); ThemeUtil.setRootBackground(llRoot); ThemeUtil.setSecondaryHeader(llHeaderBase); //通行证头部 LinearLayout llYiBoPassport = (LinearLayout)findViewById(R.id.llYiBoPassport); ImageView ivPassportPicture = (ImageView)findViewById(R.id.ivPassportPicture); TextView tvPassportUsername = (TextView)findViewById(R.id.tvPassportUsername); TextView tvUsageDescription = (TextView)findViewById(R.id.tvUsageDescription); Button btnPassport = (Button)findViewById(R.id.btnPassport); ThemeUtil.setHeaderProfile(llYiBoPassport); ivPassportPicture.setImageDrawable(theme.getDrawable("icon_header_default")); int content = theme.getColor("content"); tvPassportUsername.setTextColor(content); tvUsageDescription.setTextColor(theme.getColor("quote")); ThemeUtil.setBtnActionPositive(btnPassport); //帐号列表 ListView lvAccounts = (ListView)findViewById(R.id.lvAccounts); LinearLayout llAddAccountFrame = (LinearLayout)findViewById(R.id.llAddAccountFrame); LinearLayout llAddAccount = (LinearLayout)findViewById(R.id.llAddAccount); ImageView ivAddAccount = (ImageView)findViewById(R.id.ivAddAccount); TextView tvAddAccount = (TextView)findViewById(R.id.tvAddAccount); ImageView ivAddAccountMore = (ImageView)findViewById(R.id.ivAddAccountMore); lvAccounts.setBackgroundDrawable(theme.getDrawable("bg_frame_normal")); lvAccounts.setPadding(0, 0, 0, 0); ThemeUtil.setListViewStyle(lvAccounts); llAddAccountFrame.setBackgroundDrawable(theme.getDrawable("bg_frame_normal")); int padding1 = theme.dip2px(1); llAddAccountFrame.setPadding(padding1, padding1, padding1, padding1); llAddAccount.setBackgroundDrawable(theme.getDrawable("selector_frame_item_all_corner")); int padding8 = theme.dip2px(8); llAddAccount.setPadding(padding8, padding8, padding8, padding8); ivAddAccount.setImageDrawable(theme.getDrawable("icon_account_add_normal")); tvAddAccount.setTextColor(content); ivAddAccountMore.setImageDrawable(theme.getDrawable("icon_more_detail")); //工具栏 LinearLayout llFooterAction = (LinearLayout)findViewById(R.id.llFooterAction); ImageView ivAccountSync = (ImageView)findViewById(R.id.ivAccountSync); TextView tvAccountSync = (TextView)findViewById(R.id.tvAccountSync); TextView tvLastSyncTime = (TextView)findViewById(R.id.tvLastSyncTime); Button btnAccountSync = (Button)findViewById(R.id.btnAccountSync); llFooterAction.setBackgroundDrawable(theme.getDrawable("bg_footer_action")); int padding12 = theme.dip2px(12); llFooterAction.setPadding(padding12, padding8, padding12, padding8); ivAccountSync.setImageDrawable(theme.getDrawable("icon_account_sync_normal")); tvAccountSync.setTextColor(content); tvLastSyncTime.setTextColor(content); ThemeUtil.setBtnActionNegative(btnAccountSync); TextView tvTitle = (TextView) this.findViewById(R.id.tvTitle); tvTitle.setText(getString(R.string.title_accounts)); } private void initAccountsList() { LinearLayout llAddAccount = (LinearLayout) this.findViewById(R.id.llAddAccount); llAddAccount.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(AccountsActivity.this, AddAccountActivity.class); startActivityForResult(intent, Constants.REQUEST_CODE_ACCOUNT_ADD); CompatibilityUtil.overridePendingTransition(context, R.anim.slide_in_left, android.R.anim.fade_out); } }); final ListView lvAccounts = (ListView) this.findViewById(R.id.lvAccounts); registerForContextMenu(lvAccounts); alAdapter = new AccountListAdapter(this); lvAccounts.setAdapter(alAdapter); setListViewHeightBasedOnChildren(lvAccounts); alAdapter.registerDataSetObserver(new DataSetObserver() { @Override public void onChanged() { setListViewHeightBasedOnChildren(lvAccounts); updateBackButton(); super.onChanged(); } }); lvAccounts.setOnItemClickListener(new ListView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { LocalAccount account = (LocalAccount)parent.getItemAtPosition(position); switchAccount(account); } }); } private void bindEvent() { Button btnBack = (Button)this.findViewById(R.id.btnBack); btnBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { goBack(); } }); Button btnPassport = (Button) findViewById(R.id.btnPassport); btnPassport.setOnClickListener(new AccountPassportClickListener(this)); Button btnSync = (Button) findViewById(R.id.btnAccountSync); if (isPassportLogin) { btnSync.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new PassportSyncTask(context).execute(); } }); } } public void showPassportPoints(PointLevel pl) { if (pl == null) { return; } TextView tvUsageDescription = (TextView)findViewById(R.id.tvUsageDescription); tvUsageDescription.setText(context.getString( R.string.label_passport_points, pl.getPoints(), pl.getTitle())); } public void showUsageDescription() { TextView tvUsageDescription = (TextView) findViewById(R.id.tvUsageDescription); tvUsageDescription.setText(R.string.hint_passport_usage); } public void initPassport() { Button btnPassport = (Button) findViewById(R.id.btnPassport); TextView tvPassportUsername = (TextView) findViewById(R.id.tvPassportUsername); Button btnAccountSync = (Button) findViewById(R.id.btnAccountSync); TextView tvLastSyncTime = (TextView) findViewById(R.id.tvLastSyncTime); passport = configSystemDao.getPassport(); if (passport != null && StringUtil.isNotEmpty(passport.getUsername())) { showPassportPoints(passport.getPointLevel()); tvPassportUsername.setText(passport.getUsername()); btnPassport.setText(R.string.btn_passport_logout); ThemeUtil.setBtnActionPositive(btnAccountSync); btnAccountSync.setEnabled(true); String lastSyncTime = configSystemDao.getString(Constants.LAST_SYNC_TIME); if (StringUtil.isNotEmpty(lastSyncTime)) { lastSyncTime = getString(R.string.label_passport_last_synced_time, lastSyncTime); tvLastSyncTime.setText(lastSyncTime); tvLastSyncTime.setVisibility(View.VISIBLE); } if (passport.getPointLevel() == null || StringUtil.isEmpty(passport.getPointLevel().getPointLevel()) || isNeedQueryPointLevel) { new QueryPointLevelTask(this).execute(); } isPassportLogin = true; isCustomKeyLevel = passport.getPointLevel().getPoints() >= Constants.POINTS_CUSTOM_SOURCE_LEVEL ; } else { showUsageDescription(); tvPassportUsername.setText(R.string.label_passport_username); btnPassport.setText(R.string.btn_passport_login); ThemeUtil.setBtnActionNegative(btnAccountSync); btnAccountSync.setEnabled(false); isPassportLogin = false; isCustomKeyLevel = false; } // isCustomKeyLevel = true; // 调试用 if (isPassportLogin && isCustomKeyLevel) { ConfigAppSyncTask appSyncTask = new ConfigAppSyncTask(this); appSyncTask.execute(); } } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { AdapterContextMenuInfo adapterMenuInfo = (AdapterView.AdapterContextMenuInfo) menuInfo; int position = adapterMenuInfo.position; LocalAccount account = alAdapter.getItem(position); menu.setHeaderTitle(account.getUser().getScreenName() + "/" + account.getServiceProvider().getServiceProviderName()); menu.add(Menu.NONE, SWITCH_TO_MENU_ID, Menu.NONE, R.string.menu_accounts_switch_to); menu.add(Menu.NONE, SET_DEFAULT_MENU_ID, Menu.NONE, R.string.menu_accounts_set_default); menu.add(Menu.NONE, DELETE_MENU_ID, Menu.NONE, R.string.menu_accounts_delete); super.onCreateContextMenu(menu, v, menuInfo); } @Override protected void onNewIntent(Intent intent) { setIntent(intent); } @Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); final int position = menuInfo.position; final LocalAccount account = alAdapter.getItem(position); final AccountListAdapter listAdapter = alAdapter; switch (item.getItemId()) { case SWITCH_TO_MENU_ID: switchAccount(account); break; case SET_DEFAULT_MENU_ID: //设为默认被选中 if (account.isSnsAccount()) { Toast.makeText(context, R.string.msg_accounts_operation_unsupported, Toast.LENGTH_SHORT).show(); break; } if (Constants.DEBUG) { Log.d(TAG, "Set Account " + account + " as default"); } try { listAdapter.editAccount(Action.MakeDefault, account); Toast.makeText(context, R.string.msg_accounts_set_successful, Toast.LENGTH_LONG).show(); } catch (Exception e) { if (Constants.DEBUG) { Log.e(TAG, e.getMessage(), e); } Toast.makeText(context, R.string.msg_accounts_set_failed, Toast.LENGTH_LONG).show(); } break; case DELETE_MENU_ID: //删除帐号被选中 if (Constants.DEBUG) Log.d(TAG, "Delete Account " + account); new AlertDialog.Builder(context) .setTitle(R.string.title_dialog_alert) .setMessage(R.string.msg_accounts_delete_confirm) .setNegativeButton(R.string.btn_cancel, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }) .setPositiveButton(R.string.btn_confirm, new AlertDialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { try { alAdapter.editAccount(Action.Delete, account); Toast.makeText(context, R.string.msg_accounts_delete_successful, Toast.LENGTH_SHORT).show(); } catch (Exception e) { Log.e(TAG, e.getMessage(), e); Toast.makeText(context, R.string.msg_accounts_delete_failed, Toast.LENGTH_SHORT).show(); } } }) .show(); break; default: break; } return true; } private void switchAccount(LocalAccount account) { if (account == null || account.isSnsAccount()) { Toast.makeText(context, R.string.msg_accounts_operation_unsupported, Toast.LENGTH_SHORT).show(); return; } if (Constants.DEBUG) { Log.d(TAG, "Switch To Account " + account); } if (originCurrentAccount == null || !originCurrentAccount.equals(account)) { yibo.setCurrentAccount(account); this.setResult(Constants.RESULT_CODE_ACCOUNT_SWITCH); } this.finish(); CompatibilityUtil.overridePendingTransition(context, R.anim.slide_in_right, android.R.anim.fade_out); } private void switchAccount() { if (alAdapter.getCount() < 1) { this.setResult(Constants.RESULT_CODE_ACCOUNT_EXIT_APP); this.finish(); CompatibilityUtil.overridePendingTransition( context, R.anim.slide_in_right, android.R.anim.fade_out); } else { switchAccount(yibo.getCurrentAccount()); } } @Override public void onBackPressed() { goBack(); } private void goBack() { switchAccount(); // LocalAccountDao accountDao = new LocalAccountDao(this); // if (accountDao.hasUnsyncedAccounts()) { // new AlertDialog.Builder(context) // .setTitle(R.string.title_dialog_alert) // .setMessage(R.string.msg_accounts_unsynced_detected) // .setNegativeButton(R.string.btn_accounts_sync_later, // new AlertDialog.OnClickListener() { // public void onClick(DialogInterface dialog, int which) { // switchAccount(); // } // }) // .setPositiveButton(R.string.btn_accounts_sync_now, // new AlertDialog.OnClickListener() { // @Override // public void onClick(DialogInterface dialog, int which) { // new PassportSyncTask(context).execute(); // } // }) // .show(); // } else { // switchAccount(); // } } private void updateBackButton() { Button btnBack = (Button)this.findViewById(R.id.btnBack); if (alAdapter.getCount() > 0) { btnBack.setVisibility(View.VISIBLE); } else { btnBack.setVisibility(View.INVISIBLE); } } public void updatePassportView() { initPassport(); } public AccountListAdapter getAccountListAdapter() { return alAdapter; } private boolean isNeedQueryPointLevel = true; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Constants.RESULT_CODE_SUCCESS) { switch (requestCode) { case Constants.REQUEST_CODE_PASSPORT_LOGIN: isNeedQueryPointLevel = false; initPassport(); bindEvent(); break; case Constants.REQUEST_CODE_ACCOUNT_ADD: SharedPreferences prefs = context.getSharedPreferences(Constants.PREFS_NAME_APP_TEMP, Context.MODE_PRIVATE); //获取新增加的帐号ID long newAccountId = prefs.getLong(Constants.PREFS_KEY_ACCOUNT_ADDED, 0); //清除SharedPreferences中临时保存的AccountId值 prefs.edit().remove(Constants.PREFS_KEY_ACCOUNT_ADDED).commit(); if (newAccountId > 0) { LocalAccountDao accountDao = new LocalAccountDao(context); LocalAccount account = accountDao.findById(newAccountId); alAdapter.editAccount(Action.Add, account); } alAdapter.notifyDataSetChanged(); break; } } } /** * 设置ListView的高度,只有高度固定,才不会和外层的ScrollView产生冲突。 * ScrollView内部嵌入ListView会引起ListView显示不全(只显示一行半)或无法滚动ListView。 * * @param listView */ private static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } if (listAdapter.getCount() == 0) { listView.setVisibility(View.GONE); return; } else { listView.setVisibility(View.VISIBLE); } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } public boolean isPassportLogin() { return isPassportLogin; } public ConfigSystemDao getConfigSystemDao() { return configSystemDao; } public void setPassportLogin(boolean isPassportLogin) { this.isPassportLogin = isPassportLogin; passport = null; } public Passport getPassport() { return passport; } }