/* * Copyright 2012 GitHub Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.mobile.ui.user; import static com.actionbarsherlock.app.ActionBar.NAVIGATION_MODE_LIST; import static com.github.mobile.ui.user.HomeDropdownListAdapter.ACTION_BOOKMARKS; import static com.github.mobile.ui.user.HomeDropdownListAdapter.ACTION_DASHBOARD; import static com.github.mobile.ui.user.HomeDropdownListAdapter.ACTION_GISTS; import static com.github.mobile.util.TypefaceUtils.ICON_FOLLOW; import static com.github.mobile.util.TypefaceUtils.ICON_NEWS; import static com.github.mobile.util.TypefaceUtils.ICON_PUBLIC; import static com.github.mobile.util.TypefaceUtils.ICON_TEAM; import static com.github.mobile.util.TypefaceUtils.ICON_WATCH; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; import android.util.Log; import android.view.View; import android.view.Window; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar.OnNavigationListener; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.github.mobile.R.id; import com.github.mobile.R.menu; import com.github.mobile.accounts.AccountUtils; import com.github.mobile.core.user.UserComparator; import com.github.mobile.persistence.AccountDataManager; import com.github.mobile.ui.TabPagerActivity; import com.github.mobile.ui.gist.GistsActivity; import com.github.mobile.ui.issue.FiltersViewActivity; import com.github.mobile.ui.issue.IssueDashboardActivity; import com.github.mobile.ui.repo.OrganizationLoader; import com.github.mobile.util.AvatarLoader; import com.github.mobile.util.PreferenceUtils; import com.google.inject.Inject; import com.google.inject.Provider; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.eclipse.egit.github.core.User; /** * Home screen activity */ public class HomeActivity extends TabPagerActivity<HomePagerAdapter> implements OnNavigationListener, OrganizationSelectionProvider, LoaderCallbacks<List<User>> { private static final String TAG = "HomeActivity"; private static final String PREF_ORG_ID = "orgId"; @Inject private AccountDataManager accountDataManager; @Inject private Provider<UserComparator> userComparatorProvider; private boolean isDefaultUser; private List<User> orgs = Collections.emptyList(); private HomeDropdownListAdapter homeAdapter; private Set<OrganizationSelectionListener> orgSelectionListeners = new LinkedHashSet<OrganizationSelectionListener>(); private User org; @Inject private AvatarLoader avatars; @Inject private SharedPreferences sharedPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportLoaderManager().initLoader(0, null, this); } private void reloadOrgs() { getSupportLoaderManager().restartLoader(0, null, new LoaderCallbacks<List<User>>() { @Override public Loader<List<User>> onCreateLoader(int id, Bundle bundle) { return HomeActivity.this.onCreateLoader(id, bundle); } @Override public void onLoadFinished(Loader<List<User>> loader, final List<User> users) { HomeActivity.this.onLoadFinished(loader, users); if (users.isEmpty()) return; Window window = getWindow(); if (window == null) return; View view = window.getDecorView(); if (view == null) return; view.post(new Runnable() { @Override public void run() { isDefaultUser = false; setOrg(users.get(0)); } }); } @Override public void onLoaderReset(Loader<List<User>> loader) { HomeActivity.this.onLoaderReset(loader); } }); } @Override protected void onResume() { super.onResume(); // Restart loader if default account doesn't match currently loaded // account List<User> currentOrgs = orgs; if (currentOrgs != null && !currentOrgs.isEmpty() && !AccountUtils.isUser(this, currentOrgs.get(0))) reloadOrgs(); } private void configureActionBar() { ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayShowHomeEnabled(false); actionBar.setDisplayShowTitleEnabled(false); actionBar.setNavigationMode(NAVIGATION_MODE_LIST); homeAdapter = new HomeDropdownListAdapter(this, orgs, avatars); actionBar.setListNavigationCallbacks(homeAdapter, this); } private void setOrg(User org) { Log.d(TAG, "setOrg : " + org.getLogin()); PreferenceUtils.save(sharedPreferences.edit().putInt(PREF_ORG_ID, org.getId())); // Don't notify listeners or change pager if org hasn't changed if (this.org != null && this.org.getId() == org.getId()) return; this.org = org; boolean isDefaultUser = AccountUtils.isUser(this, org); boolean changed = this.isDefaultUser != isDefaultUser; this.isDefaultUser = isDefaultUser; if (adapter == null) configureTabPager(); else if (changed) { int item = pager.getCurrentItem(); adapter.clearAdapter(isDefaultUser); adapter.notifyDataSetChanged(); createTabs(); if (item >= adapter.getCount()) item = adapter.getCount() - 1; pager.setItem(item); } for (OrganizationSelectionListener listener : orgSelectionListeners) listener.onOrganizationSelected(org); } @Override public boolean onCreateOptionsMenu(Menu optionMenu) { getSupportMenuInflater().inflate(menu.home, optionMenu); return super.onCreateOptionsMenu(optionMenu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case id.m_search: onSearchRequested(); return true; default: return super.onOptionsItemSelected(item); } } @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { if (homeAdapter.isOrgPosition(itemPosition)) { homeAdapter.setSelected(itemPosition); setOrg(orgs.get(itemPosition)); } else if (homeAdapter.getOrgCount() > 0) { switch (homeAdapter.getAction(itemPosition)) { case ACTION_GISTS: startActivity(new Intent(this, GistsActivity.class)); break; case ACTION_DASHBOARD: startActivity(new Intent(this, IssueDashboardActivity.class)); break; case ACTION_BOOKMARKS: startActivity(FiltersViewActivity.createIntent()); break; } int orgSelected = homeAdapter.getSelected(); ActionBar actionBar = getSupportActionBar(); if (orgSelected < actionBar.getNavigationItemCount()) actionBar.setSelectedNavigationItem(orgSelected); } return true; } @Override public Loader<List<User>> onCreateLoader(int i, Bundle bundle) { return new OrganizationLoader(this, accountDataManager, userComparatorProvider); } @Override public void onLoadFinished(Loader<List<User>> listLoader, List<User> orgs) { this.orgs = orgs; if (homeAdapter != null) homeAdapter.setOrgs(orgs); else configureActionBar(); int sharedPreferencesOrgId = sharedPreferences.getInt(PREF_ORG_ID, -1); int targetOrgId = org == null ? sharedPreferencesOrgId : org.getId(); ActionBar actionBar = getSupportActionBar(); for (int i = 0; i < orgs.size(); i++) if (orgs.get(i).getId() == targetOrgId) { actionBar.setSelectedNavigationItem(i); break; } } @Override public void onLoaderReset(Loader<List<User>> listLoader) { } @Override public User addListener(OrganizationSelectionListener listener) { if (listener != null) orgSelectionListeners.add(listener); return org; } @Override public OrganizationSelectionProvider removeListener( OrganizationSelectionListener listener) { if (listener != null) orgSelectionListeners.remove(listener); return this; } @Override protected HomePagerAdapter createAdapter() { return new HomePagerAdapter(this, isDefaultUser); } @Override protected String getIcon(int position) { switch (position) { case 0: return ICON_NEWS; case 1: return ICON_PUBLIC; case 2: return isDefaultUser ? ICON_WATCH : ICON_TEAM; case 3: return ICON_FOLLOW; default: return super.getIcon(position); } } }