package it.demo.twitterlike.android.ui; import it.demo.twitterlike.android.application.MainApplication; import it.demo.twitterlike.android.domain.InternalMessage; import it.demo.twitterlike.android.tasks.MessageListTask; import it.demo.twitterlike.android.ui.adapters.MessageListAdapter; import it.demo.twitterlike.android.ui.fragments.CallbackDialogFragment; import it.demo.twitterlike.android.ui.utils.Constants; import it.demo.twitterlike.rest.api.UserProfile; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.List; import android.app.ActionBar; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.ListView; import com.telly.groundy.Groundy; import com.telly.groundy.annotations.OnSuccess; import com.telly.groundy.annotations.Param; public class MessageListActivity extends AbstractAsyncActivity { private static final String ANIMATE_REFRESH = "animateRefresh"; private static final String AUTOMATIC_CHECK_CALLED = "automaticCheckCalled"; private static final String MESSAGES = "messages"; private static final int ADDMESSAGE_REQUEST_CODE = 56; private static final int ADDUSER_REQUEST_CODE = 57; private MessageListAdapter adapter; private View noMessagePresentsView; private boolean automaticCheckCalled; /** * Refresh menu item */ protected MenuItem refreshItem; static void show(Context context) { final Intent intent = new Intent(context, MessageListActivity.class); context.startActivity(intent); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putBoolean(ANIMATE_REFRESH, refreshItem != null && refreshItem.getActionView() != null); savedInstanceState.putBoolean(AUTOMATIC_CHECK_CALLED, automaticCheckCalled); savedInstanceState.putSerializable(MESSAGES, (Serializable) adapter.getAll()); } public MainApplication getMainApplication() { return (MainApplication) super.getApplication(); } @Override public void onBackPressed() { CallbackDialogFragment.createInstance( Constants.DIALOG_CODE_APPLICATION_QUIT, R.string.activity_message_list_quit_title, null, R.string.activity_message_list_quit_yes, R.string.activity_message_list_quit_no, null).show( getFragmentManager(), "exit"); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { refreshIfNeeded(false); } } @SuppressWarnings("unchecked") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_messagelist); ActionBar actionBar = getActionBar(); actionBar.setTitle(R.string.activity_messagelist_title); updateConnectedUser(getAuthenticatedUser()); noMessagePresentsView = findViewById(R.id.noMessagesPresentTextView); if (adapter == null) { adapter = new MessageListAdapter(this, new ArrayList<InternalMessage>()); } if (savedInstanceState != null) { this.automaticCheckCalled = savedInstanceState .getBoolean(AUTOMATIC_CHECK_CALLED); updateResultList((List<InternalMessage>) savedInstanceState .get(MESSAGES)); } else { requestUpdate(true); } ListView listView = (ListView) findViewById(android.R.id.list); listView.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_activity_messages, menu); this.refreshItem = menu.findItem(R.id.refresh); Bundle bundle = getSavedInstanceState(); if (bundle != null && bundle.getBoolean(ANIMATE_REFRESH, false)) { showRefreshAnimation(); } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: finish(); return true; case R.id.addMessage: { MessageCreateActivity.show(this, ADDMESSAGE_REQUEST_CODE); return true; } case R.id.addFollow: { FollowActivity.show(this, ADDUSER_REQUEST_CODE); return true; } case R.id.menu_logout: { CallbackDialogFragment.createInstance( Constants.DIALOG_CODE_APPLICATION_LOGOUT, R.string.activity_message_list_logout_title, null, R.string.activity_message_list_logout_yes, R.string.activity_message_list_logout_no, null).show( getFragmentManager(), "logout"); return true; } case R.id.refresh: { forceRefresh(); return true; } default: return super.onOptionsItemSelected(item); } } private void hideRefreshAnimation() { if (refreshItem != null) { refreshItem.setEnabled(true); View view = refreshItem.getActionView(); if (view != null) { view.clearAnimation(); refreshItem.setActionView(null); } } } protected boolean doOnError(Boolean connectionError, Boolean authenticationError) { hideRefreshAnimation(); return false; } private void showRefreshAnimation() { if (refreshItem != null) { hideRefreshAnimation(); refreshItem.setEnabled(false); ImageView refreshActionView = (ImageView) getLayoutInflater() .inflate(R.layout.action_view, null); refreshActionView.setImageResource(R.drawable.ic_action_refresh); refreshItem.setActionView(refreshActionView); Animation animation = AnimationUtils.loadAnimation(this, R.anim.refresh); animation.setRepeatMode(Animation.RESTART); animation.setRepeatCount(Animation.INFINITE); refreshActionView.startAnimation(animation); } } protected void forceRefresh() { refreshIfNeeded(true); } protected void refreshIfNeeded(boolean force) { showRefreshAnimation(); requestUpdate(false); } protected void updateConnectedUser(UserProfile user) { String fullName = null; if (user != null) { fullName = user.getFirstName() + " " + user.getLastName(); } getActionBar().setSubtitle(fullName); } public void requestUpdate(boolean showProgressBar) { if (showProgressBar) { showProgressDialog(getString(R.string.progressbar_loading)); } Groundy.create(MessageListTask.class).callback(this) .callbackManager(callbacksManager).queueUsing(this); } @OnSuccess({ MessageListTask.class }) public void updateResultList( @Param(MessageListTask.MESSAGE_LIST) Collection<InternalMessage> result) { dismissProgressDialog(); adapter.clear(); if (result != null) { adapter.addAll(result); } adapter.notifyDataSetChanged(); noMessagePresentsView.setVisibility(result == null || result.size() <= 0 ? View.VISIBLE : View.GONE); hideRefreshAnimation(); if (!automaticCheckCalled) { refreshIfNeeded(false); automaticCheckCalled = true; } } @Override public void onNeutral(int code, Object... args) { switch (code) { case Constants.DIALOG_CODE_APPLICATION_LOGOUT: { break; } } } @Override public void onYes(int code, Object... args) { switch (code) { case Constants.DIALOG_CODE_APPLICATION_QUIT: { finish(); break; } case Constants.DIALOG_CODE_APPLICATION_LOGOUT: { requestLogin(); } } } }