Android Developer

[Android] OpenSource, ButterKnife, Firebase

졸려질려 2019. 5. 2. 03:16
반응형

Open Source

Open Source Library?

  • Open Source License를 가진 Library
  • 누구나 제한 없이 재사용, 수정, 사용 할 수 있다.
  • 대부분의 오픈소스 소프트웨어는 GNU General Public License 를 가지고 있다.
    GNU General Public License는 대표적인 Open Source License 이다.

ButterKnife

  • 뷰를 쉽게 바인딩 해주는 라이브러리

1. ButterKnife Download

  • butterknife github 에 나온 Download 가이드를 따라서 compileOptions 와 dependencies 를 추가합니다.

!!!! 그런데 !!!!


이런 빌드 오류가 발생하네요....??
그러면 오류문이 하라는대로 해보겠습니다.


그리고 프로젝트를 Rebuild~


WHAT~???!!!!!
이건 뭘까.... 인터넷에 쳐보았습니다.

  1. AndroidManifest.xml 파일을 열어줍니다.
  2. 하단에 있는 Merged Manifest 탭을 클릭합니다.
  3. 우측에 나오는 Merging Errors 를 확인합니다.
  4. 무슨 말인지 모르겠습니다.
    그렇다면 다시 구글링을 해보겠습니다.


이대로 한 번 해보겠습니다. ( Link : https://stackoverflow.com/questions/53268865/android-x-toolsreplace-specified-at-line-for-attribute-but-no-new-value-spec)


그리고 마지막줄 replace를..... android.support.v7.app.AppCompatActivity가 어디있는....?
하... replace를 하지 않고 이전 과정까지 한 상태로 Sync 하면 모든 파일들이 오류가 걸립니다 ㅠㅠㅠ
아무래도 가장 최신버전인 10.1.0은 AndroidX 를 사용하는 듯합니다.... 시간이 없으니 일단은 보류... ㅠㅠ

결국!!!


8.8.1 버전을 사용하고자 합니다. 10 버전 밑으로 아무렇게 적으면 됩니다~

2. Using ButterKnife


제가 기존에 만들었던 타이머 기능이 담긴 프래그먼트입니다.
기존의 방식은 각 레이아웃에 맞는 변수를 선언하고 하나씩 findViewById 하는 방식이었습니다.
ButterKnife를 이용하면 한 줄로 만들 수 있습니다.


@BindView를 통해 한 줄로 변수 선언과 바인딩을 할 수 있습니다.


Fragment의 onCreateView 에서 ButterKnife.bind(this, mView) 코드를 추가합니다.


ButterKnife 덕분에 반토막난 소스 코드


setOnClickListener를 선언하고 OnClick를 해야하던 기존의 방석과는 다르다.
각 메서드 위에 @OnClick(Resource ID) 만 붙여주면 클릭 했을 때 해당 메서드를 이벤트 해준다.

Okhttp3 / Retrofit2

  • Square사에서 만든 오픈 라이브러리
  • Retrofit : REST 통신을 위한 클라이언트 라이브러리
  • Okhttp : HTTP & HTTP/2 통신 클라이언트 라이브러리

Glide

  • 이미지 로딩 라이브러리

Firebase Auth

  • 사용자 인증 라이브러리

Firebase Console을 사용하여 Firebase 추가

1. FireBase 프로젝트 만들기

2. Application 추가하기


IOS, Android, Web 중에서 Android 를 클릭한다.




도움말을 참고하여 어플리케이션 이름을 기입한다.
이후에는 Firebase에서 안내 해주는대로 실행하면 된다.






마지막으로 앱을 실행시키면 Firebase와 통신을 하여 Firebase 콘솔에 앱이 등록된다.

Login Activity 만들기

package com.example.calculatorapplication;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;

import java.util.regex.Pattern;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class LoginActivity extends AppCompatActivity {
    private FirebaseAuth mAuth;

    @BindView(R.id.login_id) EditText mGetID;
    @BindView(R.id.login_password) EditText mGetPass;
    @BindView(R.id.button_sign_in) Button mSignIn;
    @BindView(R.id.button_sign_up) Button mSignUp;
    @BindView(R.id.button_google_signin) SignInButton mGoogleBtn;

    private String mEmail = "";
    private String mPassword = "";

    private static final int RC_SIGN_IN = 900;
    private GoogleSignInClient googleSignInClient;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        ButterKnife.bind(this);

        mAuth = FirebaseAuth.getInstance();

        GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        googleSignInClient = GoogleSignIn.getClient(this, googleSignInOptions);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == RC_SIGN_IN){
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            try{
                GoogleSignInAccount account = task.getResult(ApiException.class);
            }
            catch(ApiException e){

            }
        }
    }

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct){
        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if(task.isSuccessful()){
                            Toast.makeText(getBaseContext(), "Success Google", Toast.LENGTH_LONG).show();
                        }
                        else{
                            Toast.makeText(getBaseContext(), "Failure Google", Toast.LENGTH_LONG).show();
                        }
                    }
                });
    }

    @OnClick(R.id.button_google_signin)
    public void signUpGoogle(View view){
        Intent signInIntent = googleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

    @OnClick(R.id.button_sign_up)
    public void singUp(View view){
        mEmail = mGetID.getText().toString();
        mPassword = mGetPass.getText().toString();

        if(isValidEmail() && isValidPassword()){
            createUser(mEmail, mPassword);
        }
    }

    private void createUser(String mEmail, String mPassword) {
        mAuth.createUserWithEmailAndPassword(mEmail, mPassword)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if(task.isSuccessful()){
                            Toast.makeText(getBaseContext(), "SUCCESS FOR SIGN UP", Toast.LENGTH_LONG).show();
                        }
                        else{
                            Toast.makeText(getBaseContext(), "FAILURE FOR SIGN UP", Toast.LENGTH_LONG).show();
                        }
                    }
                });
    }

    @OnClick(R.id.button_sign_in)
    public void signIn(View view){
        mEmail = mGetID.getText().toString();
        mPassword = mGetPass.getText().toString();

        if(isValidEmail() && isValidPassword()){
            loginUser(mEmail, mPassword);
        }
    }

    private void loginUser(String mEmail, String mPassword) {
        mAuth.signInWithEmailAndPassword(mEmail, mPassword)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>(){
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if(task.isSuccessful()){
                            Intent intent = new Intent(getBaseContext(), MainActivity.class);
                            startActivity(intent);
                        }
                        else{
                            Toast.makeText(LoginActivity.this, "LOGIN FAIL", Toast.LENGTH_LONG).show();
                        }
                    }
                });
    }

    private boolean isValidPassword() {
        if(mPassword.isEmpty()) return false;
        //else if(!PASSWORD_PATTERN.matcher(mPassword).matches()) return false;
        else return true;
    }

    private boolean isValidEmail() {
        if(mEmail.isEmpty()) return false;
        //else if(!Patterns.EMAIL_ADDRESS.matcher(mEmail).matches()) return false;
        else return true;
    }
}
반응형