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~???!!!!!
이건 뭘까.... 인터넷에 쳐보았습니다.
AndroidManifest.xml
파일을 열어줍니다.- 하단에 있는
Merged Manifest
탭을 클릭합니다. - 우측에 나오는
Merging Errors
를 확인합니다. - 무슨 말인지 모르겠습니다.
그렇다면 다시 구글링을 해보겠습니다.
이대로 한 번 해보겠습니다. ( 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;
}
}
'Android Developer' 카테고리의 다른 글
[Android] Activity의 LaunchMode (0) | 2019.07.10 |
---|---|
[Android] 난독화(Proguard) (0) | 2019.05.14 |
[Andoird] GIF를 이용한 Splash Activity 만들기 (0) | 2019.04.12 |
[Android] Android Design Pattern (0) | 2019.04.09 |
[Android] Foreground, Background, Timer (0) | 2019.04.02 |