package se.alexanderblom.delicious.ui; import se.alexanderblom.delicious.Constants; import se.alexanderblom.delicious.DeliciousAccount; import se.alexanderblom.delicious.R; import se.alexanderblom.delicious.fragments.ClipboardFragment; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AccountManagerCallback; import android.accounts.AccountManagerFuture; import android.animation.LayoutTransition; import android.animation.ObjectAnimator; import android.app.Fragment; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; public abstract class ContainerActivity extends BaseActivity { private static final String TAG = "ContainerActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getContentResource()); getActionBar().setHomeButtonEnabled(true); if (savedInstanceState == null) { ClipboardFragment clipboard = new ClipboardFragment(); getFragmentManager().beginTransaction() .add(R.id.content, createFragment(savedInstanceState)) .add(R.id.clipboard_display, clipboard) .hide(clipboard) .commit(); } ViewGroup container = (ViewGroup) findViewById(R.id.container); LayoutTransition transition = new LayoutTransition(); transition.setStartDelay(LayoutTransition.APPEARING, 0); transition.setStartDelay(LayoutTransition.CHANGE_APPEARING, 0); transition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, 0); transition.setStartDelay(LayoutTransition.DISAPPEARING, 0); ObjectAnimator animator = ObjectAnimator.ofFloat(null, View.ALPHA, 1f, 0f); transition.setAnimator(LayoutTransition.DISAPPEARING, animator); container.setLayoutTransition(transition); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent intent = new Intent(this, MainActivity.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); finish(); break; case R.id.menu_add: startActivity(new Intent(this, AddBookmarkActivity.class)); break; case R.id.menu_logout: logout(); break; default: return super.onOptionsItemSelected(item); } return true; } @Override protected void accountChanged(DeliciousAccount account) { // Just replace our old fragment, this works when an error is shown too // TODO: Will this work? getFragmentManager().beginTransaction() .replace(R.id.content, createFragment(null)) .commit(); } protected int getContentResource() { return R.layout.activity_container; } protected abstract Fragment createFragment(Bundle savedInstanceState); private void logout() { Log.d(TAG, "Removing account"); AccountManager accountManager = AccountManager.get(this); Account accounts[] = accountManager.getAccountsByType(Constants.ACCOUNT_TYPE); Account account = accounts[0]; // Callback to wait for the account to actually be removed AccountManagerCallback<Boolean> callback = new AccountManagerCallback<Boolean>() { @Override public void run(AccountManagerFuture<Boolean> future) { try { if (future.getResult()) { checkAccount(); } else { // Could not remove account, should not happen Log.e(TAG, "Could not remove account"); } } catch (Exception e) { Log.e(TAG, "Error fetching remove account result", e); } } }; accountManager.removeAccount(account, callback, null); } }