package com.xda.one.ui; import com.dd.CircularProgressButton; import com.mobsandgeeks.adapters.Sectionizer; import com.mobsandgeeks.adapters.SimpleSectionAdapter; import com.squareup.otto.Subscribe; import com.squareup.picasso.Picasso; import com.xda.one.R; import com.xda.one.api.inteface.UserClient; import com.xda.one.api.model.response.ResponseForum; import com.xda.one.api.retrofit.RetrofitClient; import com.xda.one.api.retrofit.RetrofitUserClient; import com.xda.one.auth.XDAAccount; import com.xda.one.auth.XDAAuthenticatorActivity; import com.xda.one.event.user.UserLoginEvent; import com.xda.one.event.user.UserProfileEvent; import com.xda.one.loader.ForumLoader; import com.xda.one.model.misc.ForumType; import com.xda.one.util.AccountUtils; import com.xda.one.util.Utils; import android.accounts.Account; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v4.view.ViewCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.util.List; import static com.xda.one.ui.NavigationDrawerAdapter.NavigationDrawerItem; public class NavigationDrawerFragment extends Fragment implements AdapterView.OnItemClickListener { private final UserListener mUserListener = new UserListener(); private Callback mCallback; private NavigationDrawerAdapter mAdapter; private SimpleSectionAdapter<NavigationDrawerItem> mSectionAdapter; private TextView mUsernameTextView; private UserClient mUserClient; private ImageView mAvatar; private CircularProgressButton mLoginLogout; private ListView mListView; @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mCallback = (Callback) activity; } catch (ClassCastException ex) { ex.printStackTrace(); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mUserClient = RetrofitUserClient.getClient(getActivity()); mAdapter = new NavigationDrawerAdapter(getActivity()); mSectionAdapter = new SimpleSectionAdapter<>(getActivity(), mAdapter, R.layout.list_view_header, R.id.list_view_header_title, new NavigationSectionizer()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.navigation_drawer_fragment, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mListView = (ListView) view.findViewById(android.R.id.list); ViewCompat.setOverScrollMode(mListView, ViewCompat.OVER_SCROLL_NEVER); mListView.setOnItemClickListener(this); final LayoutInflater inflater = LayoutInflater.from(getActivity()); final View headerView = inflater.inflate(R.layout.navigation_drawer_header, mListView, false); mListView.addHeaderView(headerView); // Register for the login event mUserClient.getBus().register(mUserListener); final View headerUser = headerView.findViewById(R.id.navigation_drawer_header_background); headerUser.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { startActivityForResult(new Intent(getActivity(), UserProfileActivity.class), 100); } }); mUsernameTextView = (TextView) headerView .findViewById(R.id.navigation_drawer_fragment_username); mAvatar = (ImageView) headerView.findViewById(R.id.navigation_drawer_fragment_avatar); mLoginLogout = (CircularProgressButton) headerView .findViewById(R.id.navigation_drawer_login_logout); mLoginLogout.setOnClickListener(new LoginLogoutListener()); mLoginLogout.setIndeterminateProgressMode(true); final XDAAccount selectedAccount = AccountUtils.getAccount(getActivity()); if (selectedAccount == null) { RetrofitClient.setAuthToken(null); } else { RetrofitClient.setAuthToken(selectedAccount.getAuthToken()); mUserClient.getUserProfileAsync(); } onUserAccountSelected(selectedAccount); mAdapter.onUserProfileChanged(selectedAccount); mSectionAdapter.notifyDataSetChanged(); mListView.setAdapter(mSectionAdapter); } @Override public void onDestroyView() { super.onDestroyView(); mUserClient.getBus().unregister(mUserListener); } @Override public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == 100) { final XDAAccount account = data.getParcelableExtra("account"); AccountUtils.storeAccount(getActivity(), account); } } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final NavigationDrawerItem menuItem = mSectionAdapter.getItem(position - 1); final int title = menuItem.getTitleId(); switch (title) { case R.string.forum_home_title: mCallback.onNavigationItemClicked(ForumPagerFragment.createInstance()); break; case R.string.xda_news: mCallback.onNavigationItemClicked(NewsFragment.createInstance()); break; case R.string.find_a_device: mCallback.onNavigationItemClicked(FindYourDeviceFragment.createInstance()); break; case R.string.search: mCallback.onNavigationItemClicked(SearchFragment.createInstance()); break; case R.string.private_messages: mCallback.onNavigationItemClicked(new MessagePagerFragment()); break; case R.string.subscribed: mCallback.onNavigationItemClicked(new SubscribedPagerFragment()); break; case R.string.participated: mCallback.onNavigationItemClicked(ThreadFragment.createParticipated()); break; case R.string.my_devices: mCallback.onNavigationItemClicked(new MyDeviceFragment()); break; case R.string.quote_mentions: mCallback.onNavigationItemClicked(QuoteMentionPagerFragment.getInstance()); break; case R.string.settings: startActivity(new Intent(getActivity(), SettingsActivity.class)); break; case R.string.help: startActivity(new Intent(getActivity(), HelpActivity.class)); break; case R.string.about: startActivity(new Intent(getActivity(), AboutActivity.class)); break; } mCallback.closeNavigationDrawer(); } public void onUserAccountSelected(final XDAAccount account) { if (account == null) { mLoginLogout.setIdleText(getString(R.string.login)); mLoginLogout.setText(getString(R.string.login)); mUsernameTextView.setText("Anonymous"); Picasso.with(getActivity()).load(R.drawable.ic_account_circle_light).into(mAvatar); } else { mLoginLogout.setIdleText(getString(R.string.logout)); mLoginLogout.setText(getString(R.string.logout)); mUsernameTextView.setText(account.getUserName()); Picasso.with(getActivity()) .load(account.getAvatarUrl()) .placeholder(R.drawable.ic_account_circle_light) .error(R.drawable.ic_account_circle_light) .into(mAvatar); } mLoginLogout.setProgress(0); mAdapter.onUserProfileChanged(account); mSectionAdapter.notifyDataSetChanged(); } public void login() { final Intent intent = new Intent(getActivity(), XDAAuthenticatorActivity.class); startActivityForResult(intent, 100); } private void logout() { final ProgressDialog progressDialog = new ProgressDialog(getActivity()); progressDialog.setTitle("Logging out..."); progressDialog.setMessage("Logging out..."); progressDialog.setIndeterminate(true); progressDialog.setCancelable(false); progressDialog.setCanceledOnTouchOutside(false); progressDialog.show(); getLoaderManager().initLoader(0, null, new LogoutForumLoader(progressDialog)); } public interface Callback { public void closeNavigationDrawer(); public void onNavigationItemClicked(final Fragment fr); } private class NavigationSectionizer implements Sectionizer<NavigationDrawerItem> { @Override public String getSectionTitleForItem(final NavigationDrawerItem menuItem) { return getString(menuItem.getSectionId()); } } private class UserListener { @Subscribe public void onUserProfile(final UserProfileEvent event) { AccountUtils.storeAccount(getActivity(), event.account); onUserAccountSelected(event.account); } @Subscribe public void onLogin(final UserLoginEvent event) { AccountUtils.storeAccount(getActivity(), event.account); onUserAccountSelected(event.account); } } private class LoginLogoutListener implements View.OnClickListener { @Override public void onClick(final View v) { final Account currentAccount = AccountUtils.getAccount(getActivity()); if (currentAccount == null) { login(); return; } logout(); } } private class LogoutForumLoader implements LoaderManager.LoaderCallbacks<List<ResponseForum>> { private final ProgressDialog mProgressDialog; public LogoutForumLoader(final ProgressDialog progressDialog) { mProgressDialog = progressDialog; } @Override public Loader<List<ResponseForum>> onCreateLoader(final int id, final Bundle args) { return new ForumLoader(getActivity(), ForumType.ALL, null, true); } @Override public void onLoadFinished(final Loader<List<ResponseForum>> loader, final List<ResponseForum> data) { mProgressDialog.dismiss(); if (Utils.isCollectionEmpty(data)) { Toast.makeText(getActivity(), R.string.failed_to_logout, Toast.LENGTH_LONG).show(); return; } AccountUtils.storeAccount(getActivity(), null); onUserAccountSelected(null); } @Override public void onLoaderReset(final Loader<List<ResponseForum>> loader) { } } }