package com.rava.voting.ui; import java.util.List; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; import android.app.ActionBar; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.content.Intent; import android.os.Bundle; import android.support.v4.widget.DrawerLayout; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import com.rava.voting.R; import com.rava.voting.RavaApplication; import com.rava.voting.api.LoginService; import com.rava.voting.model.User; import com.rava.voting.utils.SettingsManager; import com.rava.voting.utils.Utils; import com.sromku.simple.fb.Permission; import com.sromku.simple.fb.SimpleFacebook; import com.sromku.simple.fb.entities.Group; import com.sromku.simple.fb.entities.Profile; import com.sromku.simple.fb.listeners.OnGroupsListener; import com.sromku.simple.fb.listeners.OnLoginListener; import com.sromku.simple.fb.listeners.OnLogoutListener; import com.sromku.simple.fb.listeners.OnProfileListener; public class MainActivity extends Activity implements NavigationDrawerFragment.NavigationDrawerCallbacks { public static final String TAG = "MainActivity"; /** * Fragment managing the behaviors, interactions and presentation of the * navigation drawer. */ private NavigationDrawerFragment mNavigationDrawerFragment; /** * Used to store the last screen title. For use in * {@link #restoreActionBar()}. */ private CharSequence mTitle; private SimpleFacebook mSimpleFacebook; private MenuItem mItemFb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager() .findFragmentById(R.id.navigation_drawer); mTitle = getTitle(); // Set up the drawer. mNavigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout)); Utils.printHashKey(this); } @Override public void onResume() { super.onResume(); mSimpleFacebook = SimpleFacebook.getInstance(this); if (mSimpleFacebook.isLogin() && SettingsManager.getUser() == null) { login(mSimpleFacebook.getSession().getAccessToken()); } } @Override public void onNavigationDrawerItemSelected(int position) { onSectionAttached(position); FragmentManager fragmentManager = getFragmentManager(); switch (position) { case 0: Fragment fragment = fragmentManager .findFragmentById(R.id.container); if (fragment != null && fragment instanceof ScannerFragment) { return; } else { fragmentManager .beginTransaction() .replace(R.id.container, ScannerFragment.newInstance(), ScannerFragment.TAG).commit(); } break; case 1: fragmentManager .beginTransaction() .replace(R.id.container, UserElectionsFragment.newInstance()).commit(); break; case 2: fragmentManager .beginTransaction() .replace(R.id.container, UserVotedElectionsFragment.newInstance()).commit(); break; case 3: fragmentManager .beginTransaction() .replace(R.id.container, UserOpenElectionsFragment.newInstance()).commit(); break; default: break; } } public void onSectionAttached(int number) { switch (number) { case 0: mTitle = getString(R.string.section_scan_receipt); break; case 1: mTitle = getString(R.string.section_user_elections); break; case 2: mTitle = getString(R.string.section_user_voted_elections); break; case 3: mTitle = getString(R.string.section_user_open_elections); break; } } public void restoreActionBar() { ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setDisplayShowTitleEnabled(true); actionBar.setTitle(mTitle); } @Override public boolean onCreateOptionsMenu(Menu menu) { if (!mNavigationDrawerFragment.isDrawerOpen()) { // Only show items in the action bar relevant to this screen // if the drawer is not showing. Otherwise, let the drawer // decide what to show in the action bar. getMenuInflater().inflate(R.menu.main, menu); mItemFb = menu.findItem(R.id.action_fb); restoreActionBar(); return true; } return super.onCreateOptionsMenu(menu); } @Override public boolean onPrepareOptionsMenu(Menu menu) { if (mItemFb != null) { if (mSimpleFacebook.isLogin()) { mItemFb.setIcon(R.drawable.ic_action_exit); mItemFb.setTitle(R.string.logout); } else { mItemFb.setIcon(R.drawable.ic_action_facebook); mItemFb.setTitle(R.string.login); } return true; } return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_fb) { if (mSimpleFacebook.isLogin()) { mSimpleFacebook.logout(mOnLogoutListener); } else { mSimpleFacebook.login(mOnLoginListener); } return true; } if (id == R.id.action_settings) { Intent intent = new Intent(this, PreferencesActivity.class); startActivity(intent); return true; } return super.onOptionsItemSelected(item); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mSimpleFacebook.onActivityResult(this, requestCode, resultCode, data); } public SimpleFacebook getSimpleFacebook() { return mSimpleFacebook; } // Login listener private OnLoginListener mOnLoginListener = new OnLoginListener() { @Override public void onFail(String reason) { Log.w(TAG, "Failed to login"); } @Override public void onException(Throwable throwable) { Log.e(TAG, "Bad thing happened", throwable); } @Override public void onThinking() { // show progress bar or something to the user while login is // happening Log.i(TAG, "Thinking..."); } @Override public void onLogin() { Log.i(TAG, "Logged in"); invalidateOptionsMenu(); Log.i(TAG, mSimpleFacebook.getSession().getAccessToken()); login(mSimpleFacebook.getSession().getAccessToken()); // Profile.Properties properties = new Profile.Properties.Builder() // .add(Properties.ID).add(Properties.NAME).build(); // mSimpleFacebook.getProfile(properties, mOnProfileListener); // // mSimpleFacebook.getGroups(mOnGroupsListener); // final Session session = ((MainActivity) // getActivity()).getSimpleFacebook().getSession(); // if (session != null && session.isOpened()) { // // If the session is open, make an API call to get user data // // and define a new callback to handle the response // Request request = Request.newMeRequest(session, new // Request.GraphUserCallback() { // @Override // public void onCompleted(GraphUser user, Response response) { // // If the response is successful // if (session == Session.getActiveSession()) { // if (user != null) { // String user_ID = user.getId();//user id // String profileName = user.getName();//user's profile name // mTextViewContent.setText(user_ID + " / " + profileName); // } // } // } // }); // Request.executeBatchAsync(request); // } } @Override public void onNotAcceptingPermissions(Permission.Type type) { toast(String .format("You didn't accept %s permissions", type.name())); } }; private void login(String token) { RavaApplication app = (RavaApplication) getApplication(); LoginService loginService = app.getLoginService(); loginService.login(token, new Callback<User>() { @Override public void success(User user, Response arg1) { Toast.makeText(MainActivity.this, "success " + user.getId(), Toast.LENGTH_SHORT).show(); SettingsManager.saveUser(user); } @Override public void failure(RetrofitError error) { Utils.parseError(error, MainActivity.this); } }); } // Logout listener private OnLogoutListener mOnLogoutListener = new OnLogoutListener() { @Override public void onFail(String reason) { Log.w(TAG, "Failed to login"); } @Override public void onException(Throwable throwable) { Log.e(TAG, "Bad thing happened", throwable); } @Override public void onThinking() { Log.i(TAG, "Thinking..."); } @Override public void onLogout() { invalidateOptionsMenu(); SettingsManager.clearUser(); toast("You are logged out"); } }; // listener for profile request final OnProfileListener mOnProfileListener = new OnProfileListener() { @Override public void onFail(String reason) { // insure that you are logged in before getting the profile Log.w(TAG, reason); } @Override public void onException(Throwable throwable) { Log.e(TAG, "Bad thing happened", throwable); } @Override public void onThinking() { // show progress bar or something to the user while fetching // profile Log.i(TAG, "Thinking..."); } @Override public void onComplete(Profile profile) { Log.i(TAG, "My profile id = " + profile.getId()); String name = profile.getName(); toast("name = " + name + "," + "id = " + profile.getId()); } }; // listener for groups final OnGroupsListener mOnGroupsListener = new OnGroupsListener() { @Override public void onFail(String reason) { Log.w(TAG, reason); } @Override public void onException(Throwable throwable) { Log.e(TAG, "Bad thing happened", throwable); } @Override public void onThinking() { Log.i(TAG, "Thinking..."); } @Override public void onComplete(List<Group> response) { Log.i(TAG, "Number of groups = " + response.size()); toast("Number of groups = " + response.size()); } }; /** * Show toast * * @param message */ private void toast(String message) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } /** * A placeholder fragment containing a simple view. */ public static class PlaceholderFragment extends Fragment { /** * The fragment argument representing the section number for this * fragment. */ private static final String ARG_SECTION_NUMBER = "section_number"; /** * Returns a new instance of this fragment for the given section number. */ public static PlaceholderFragment newInstance(int sectionNumber) { PlaceholderFragment fragment = new PlaceholderFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); fragment.setArguments(args); return fragment; } public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment, container, false); TextView textView = (TextView) rootView .findViewById(R.id.section_label); textView.setText(Integer.toString(getArguments().getInt( ARG_SECTION_NUMBER))); return rootView; } @Override public void onAttach(Activity activity) { super.onAttach(activity); ((MainActivity) activity).onSectionAttached(getArguments().getInt( ARG_SECTION_NUMBER)); } } }