Permalink
Browse files

LoginActivity: Show the Toolbar by using a copy of ActionBarActivity.

I don't like this at all, but there doesn't seem to be any way around it:
https://chris.banes.me/2014/10/17/appcompat-v21/#comment-1652981836
  • Loading branch information...
murraycu committed Oct 25, 2014
1 parent f3c1681 commit 6cf2176763966153687f26cc5bfbce8c146c1747
@@ -1,17 +1,17 @@
package com.murrayc.galaxyzoo.app;

import android.accounts.Account;
import android.accounts.AccountAuthenticatorActivity;
//import android.accounts.AccountAuthenticatorActivity;
import android.accounts.AccountManager;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.TargetApi;
import android.app.ActionBar;
import android.content.ContentResolver;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.view.KeyEvent;
@@ -26,10 +26,17 @@
import com.murrayc.galaxyzoo.app.provider.client.ZooniverseClient;

//TODO: Use the toolbar, but we cannot derive from ActionBarActivity from AppCompat.
//Android's standard AccountAuthenticatorActivity doesn't let us use the toolbar,
//because it doesn't deried from ActionBarActivity,
//and it apparently will never have a usable version in AppCompat,
//so we have to copy the whole class to create ZooAccountAuthenticatorActivity
//and derive from that instead.
//See https://chris.banes.me/2014/10/17/appcompat-v21/#comment-1652981836

/**
* A login screen that offers login via username/password.
*/
public class LoginActivity extends AccountAuthenticatorActivity {
public class LoginActivity extends ZooAccountAuthenticatorActivity {

/** The Intent extra to store username. */
public static final String ARG_USERNAME = "username";
@@ -55,7 +62,7 @@ protected void onCreate(Bundle savedInstanceState) {

setContentView(R.layout.activity_login);

//TODO: UiUtils.showToolbar(this);
UiUtils.showToolbar(this);

// Set up the login form.
mUsernameView = (EditText) findViewById(R.id.username);
@@ -97,8 +104,7 @@ public void onClick(View view) {
mProgressView = findViewById(R.id.login_progress);

// Show the Up button in the action bar.
//TODO: final ActionBar actionBar = getSupportActionBar();
final ActionBar actionBar = getActionBar();
final ActionBar actionBar = getSupportActionBar();
if (actionBar == null)
return;

@@ -0,0 +1,85 @@
/*
* Copyright (C) 2009 The Android Open Source Project
* Copyright (C) 2014 Murray Cumming (A modified AccountAuthenticatorActivity to derive from ActionBarActivity
*
* 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.murrayc.galaxyzoo.app;

import android.accounts.AccountAuthenticatorResponse;
import android.accounts.AccountManager;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;

/**
* Base class for implementing an Activity that is used to help implement an
* AbstractAccountAuthenticator. If the AbstractAccountAuthenticator needs to use an activity
* to handle the request then it can have the activity extend AccountAuthenticatorActivity.
* The AbstractAccountAuthenticator passes in the response to the intent using the following:
* <pre>
* intent.putExtra({@link AccountManager#KEY_ACCOUNT_AUTHENTICATOR_RESPONSE}, response);
* </pre>
* The activity then sets the result that is to be handed to the response via
* {@link #setAccountAuthenticatorResult(android.os.Bundle)}.
* This result will be sent as the result of the request when the activity finishes. If this
* is never set or if it is set to null then error {@link AccountManager#ERROR_CODE_CANCELED}
* will be called on the response.
*/
public class ZooAccountAuthenticatorActivity extends ActionBarActivity {
private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
private Bundle mResultBundle = null;

/**
* Set the result that is to be sent as the result of the request that caused this
* Activity to be launched. If result is null or this method is never called then
* the request will be canceled.
* @param result this is returned as the result of the AbstractAccountAuthenticator request
*/
public final void setAccountAuthenticatorResult(Bundle result) {
mResultBundle = result;
}

/**
* Retreives the AccountAuthenticatorResponse from either the intent of the icicle, if the
* icicle is non-zero.
* @param icicle the save instance data of this Activity, may be null
*/
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);

mAccountAuthenticatorResponse =
getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);

if (mAccountAuthenticatorResponse != null) {
mAccountAuthenticatorResponse.onRequestContinued();
}
}

/**
* Sends the result or a Constants.ERROR_CODE_CANCELED error if a result isn't present.
*/
public void finish() {
if (mAccountAuthenticatorResponse != null) {
// send the result bundle back if set, otherwise send an error.
if (mResultBundle != null) {
mAccountAuthenticatorResponse.onResult(mResultBundle);
} else {
mAccountAuthenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED,
"canceled");
}
mAccountAuthenticatorResponse = null;
}
super.finish();
}
}

0 comments on commit 6cf2176

Please sign in to comment.