package de.bsd.zwitscher; import android.app.ActionBar; import android.app.Activity; import android.app.FragmentManager; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.widget.DrawerLayout; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.SpinnerAdapter; import de.bsd.zwitscher.account.Account; import de.bsd.zwitscher.account.AccountHolder; import de.bsd.zwitscher.account.AccountNavigationListener; import de.bsd.zwitscher.account.AccountStuffActivity; import de.bsd.zwitscher.account.LoginActivity; import de.bsd.zwitscher.helper.CleanupTask; import de.bsd.zwitscher.helper.FetchTimelinesService; import java.util.ArrayList; import java.util.List; /** * New main activity that takes care of the main UI. * * @author Heiko W. Rupp */ public class MainActivity extends Activity { private ListView mDrawerList; private Account account; private int accountId; private List<Account> accountList; private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle mDrawerToggle; private ProgressBar progressItem; private Menu menu; private int listId; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.main_drawer_layout); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); account = AccountHolder.getInstance(this).getAccount(); // Account should be non-null. If it is null, no default account is available, // so user did not go through the login procedure if (account==null) { // Still null -> initial login failed Intent i = new Intent().setClass(this, LoginActivity.class); startActivity(i); finish(); return; } accountId = account.getId(); Log.i("TabWidget", "Account=" + account); ActionBar actionBar = getActionBar(); // So that the actionbar toggle thingy can work actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); getAccountNames(); // Initialize accountList // We want the account list in the action bar for easy switching if (accountList.size()>1) { actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); SpinnerAdapter accountSpinnerAdapter = getAccountSpinnerAdapter(); actionBar.setListNavigationCallbacks(accountSpinnerAdapter, new AccountNavigationListener(this, accountList, account)); // Don't show the title, as the account list already shows that data actionBar.setDisplayShowTitleEnabled(false); for (int i = 0; i< accountList.size(); i++) { if (accountList.get(i).equals(account)) { actionBar.setSelectedNavigationItem(i); } } } else { getActionBar().setTitle(account.getAccountIdentifier()); } final CharSequence mTitle = account.getAccountIdentifier(); final CharSequence mDrawerTitle = "Select..."; mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { /** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View view) { getActionBar().setTitle(mTitle); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } }; // Set the drawer toggle as the DrawerListener mDrawerLayout.setDrawerListener(mDrawerToggle); // Set up the drawer TODO needs to be synchronized with account change TwitterHelper th = new TwitterHelper(this,account); TweetDB tdb = TweetDB.getInstance(this); List<ZUserList> lists = tdb.getLists(account.getId()); List<ZUserList> items = new ArrayList<ZUserList>(lists.size()+3); items.addAll(ZUserList.generateDefaults(account)); items.addAll(lists); mDrawerList = (ListView) findViewById(R.id.left_drawer); // Set the adapter for the list view mDrawerList.setAdapter(new DrawerLineAdapter(this, items, account)); // Set the list's click listener mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); } private List<String> getAccountNames() { TweetDB tdb = TweetDB.getInstance(getApplicationContext()); accountList = tdb.getAccountsForSelection(false); List<String> data = new ArrayList<String>(accountList.size()); for (Account account : accountList) { String identifier = account.getAccountIdentifier(); data.add(identifier); } return data; } ////////////// OnNavigationListener and Spinnerssetup - mostly copied from AccountStuffActivity. TODO unite that again public SpinnerAdapter getAccountSpinnerAdapter() { List<String> data = getAccountNames(); SpinnerAdapter adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,data); return adapter; } private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { ZUserList zul = (ZUserList) ((ListView)parent).getAdapter().getItem(position); listId = zul.listId; selectItem(zul); } } /** Swaps fragments in the main content view */ private void selectItem(ZUserList zul) { // Create a new fragment and specify the planet to show based on position TweetListFragment fragment = new TweetListFragment(); fragment.setAccount(account); fragment.setListId(zul.listId); Bundle args = new Bundle(); // args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position); fragment.setArguments(args); // Insert the fragment by replacing any existing fragment FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.content_frame, fragment) .commit(); // Highlight the selected item, update the title, and close the drawer // mDrawer.setItemChecked(position, true); // setTitle(mPlanetTitles[position]); mDrawerLayout.closeDrawer(mDrawerList); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); MenuItem item = menu.findItem(R.id.ProgressBar); progressItem = (ProgressBar) item.getActionView(); progressItem.setVisibility(ProgressBar.INVISIBLE); this.menu = menu; return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Intent i; // Handle item selection switch (item.getItemId()) { case R.id.preferences: i = new Intent(this, Preferences.class); startActivity(i); break; case R.id.reloadLists: // syncLists(); // new SyncSLTask(this).execute(); break; case R.id.DevelResetLastRead: // resetLastRead(); break; case R.id.DevelCleanTweets: // cleanTweetDB(); break; case R.id.DevelCleanImages: // cleanImages(); break; case R.id.AccountStuff: i = new Intent(this, AccountStuffActivity.class); startActivity(i); break; case R.id.helpMenu: i = new Intent(MainActivity.this, HelpActivity.class); // TODO Fragment startActivity(i); break; case R.id.menu_cleanTweets: new CleanupTask(this).execute(); break; case R.id.DevelDumpAccounts: TweetDB tmpDb = TweetDB.getInstance(getApplicationContext()); List<Account> allAccounts = tmpDb.getAccountsForSelection(false); for (Account a : allAccounts) System.out.println(a); break; /// below are Honeycomb ActionBar items case R.id.refresh: // forward to the inner list's reload/referesh // if (listActivity!=null) // listActivity.reload(null); Intent fetcher = new Intent(this, FetchTimelinesService.class); fetcher.putExtra("account",account); fetcher.putExtra("listIds",new int[] { listId}); startService(fetcher); break; case R.id.send: i = new Intent(this,NewTweetActivity.class); startActivity(i); break; case R.id.to_top: // if (listActivity!=null) // listActivity.scrollToTop(null); break; case R.id.menu_feedback: // send_feedback(); break; case R.id.menu_goto_user: // displayUserInfo(); break; case R.id.menu_default_search: onSearchRequested(); break; default: System.out.println("Unknown option " + item.toString()); return super.onOptionsItemSelected(item); } return true; } }