/* * Copyright (C) 2014 Pedro Vicente Gómez Sánchez. * * 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.github.pedrovgs.tuentitv.ui.activity; import android.animation.ObjectAnimator; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.TextView; import butterknife.InjectView; import butterknife.OnFocusChange; import com.github.pedrovgs.tuentitv.R; import com.github.pedrovgs.tuentitv.model.Account; import com.github.pedrovgs.tuentitv.presenter.LoginPresenter; import com.github.pedrovgs.tuentitv.ui.navigator.Navigator; import com.github.pedrovgs.tuentitv.ui.picasso.transformation.CircleTransform; import com.squareup.picasso.Picasso; import java.util.LinkedList; import java.util.List; import javax.inject.Inject; /** * Activity created to show recent logged accounts and perform login process. This activity is * going * to use LoginPresenter as main collaborator to perform login process. * * @author Pedro Vicente Gómez Sánchez */ public class LoginActivity extends BaseActivity implements LoginPresenter.View { private static final int PASSWORD_REQUEST_CODE = 1; @Inject LoginPresenter loginPresenter; @Inject Navigator navigator; @InjectView(R.id.ll_accounts_container) ViewGroup ll_accounts_container; @InjectView(R.id.iv_app_logo) View iv_app_logo; @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.login_activity); super.onCreate(savedInstanceState); hookListeners(); initializePresenter(); } @OnFocusChange(R.id.iv_app_logo) void onFocusChanged(boolean focused) { if (!focused) { iv_app_logo.setFocusable(false); } } @Override public void showAccounts(List<Account> accounts) { for (int i = 0; i < accounts.size(); i++) { View v_account = ll_accounts_container.getChildAt(i); showAccount(accounts.get(i), v_account); } } @Override public void showPasswordBox() { navigator.startPasswordViewAndWaitForResult(PASSWORD_REQUEST_CODE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PASSWORD_REQUEST_CODE && passwordIsCorrect(data)) { loginPresenter.loginWithSelectedUser(); } } @Override public void close() { finish(); } private void initializePresenter() { loginPresenter.setView(this); loginPresenter.initialize(); loginPresenter.loadAccounts(); } private void hookListeners() { hookScaleAnimations(); hookAccountClickListeners(); } private void hookScaleAnimations() { for (int i = 0; i < ll_accounts_container.getChildCount(); i++) { View v_account = ll_accounts_container.getChildAt(i); configureScaleAnimator(v_account); } } private void configureScaleAnimator(View v_account_container) { View ib_account = v_account_container.findViewById(R.id.ib_account); View tv_account_name = v_account_container.findViewById(R.id.tv_account_name); ib_account.setOnFocusChangeListener(new OnFocusChangeAccountListener(tv_account_name)); } private void showAccount(Account account, View v_account_container) { TextView tv_account_name = (TextView) v_account_container.findViewById(R.id.tv_account_name); ImageButton ib_account = (ImageButton) v_account_container.findViewById(R.id.ib_account); tv_account_name.setText(account.getName()); Picasso.with(this) .load(account.getAvatarUrl()) .transform(new CircleTransform(getResources().getDimension(R.dimen.account_item_size))) .placeholder(R.drawable.icn_user_default_blue) .into(ib_account); } private void hookAccountClickListeners() { for (int i = 0; i < ll_accounts_container.getChildCount() - 1; i++) { ImageButton ib_accoun = (ImageButton) ll_accounts_container.getChildAt(i).findViewById(R.id.ib_account); ib_accoun.setOnClickListener(new OnAccountClickListener(i)); } } private boolean passwordIsCorrect(Intent data) { return data != null && data.getBooleanExtra(EnterPasswordActivity.RESULT_KEY, false); } private class OnFocusChangeAccountListener implements View.OnFocusChangeListener { private final View view; public OnFocusChangeAccountListener(View view) { this.view = view; } @Override public void onFocusChange(View v, boolean hasFocus) { float to = hasFocus ? 1.6f : 1; performScaleXAnimation(to); performScaleYAnimation(to); performAlphaAnimation(hasFocus); } private void performScaleXAnimation(float to) { ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(view, "scaleX", to); scaleXAnimator.setDuration(getResources().getInteger(R.integer.short_animation_time)); scaleXAnimator.start(); } private void performScaleYAnimation(float to) { ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(view, "scaleY", to); scaleYAnimator.setDuration(getResources().getInteger(R.integer.short_animation_time)); scaleYAnimator.start(); } private void performAlphaAnimation(boolean hasFocus) { float toAlpha = hasFocus ? 1f : 0.5f; ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(view, "alpha", toAlpha); alphaAnimator.setDuration(getResources().getInteger(R.integer.short_animation_time)); alphaAnimator.start(); } } private class OnAccountClickListener implements View.OnClickListener { private final int position; public OnAccountClickListener(int position) { this.position = position; } @Override public void onClick(View v) { Account selectedAccount = loginPresenter.getAccountAtIndex(position); loginPresenter.onAccountClicked(selectedAccount); } } @Override protected List getModules() { return new LinkedList(); } }