3 Ocak 2019 Perşembe

Android Firebase Kullanimi

Merhaba,
Bu yazimda Firebase ile proje gelistirmeye giris asamasini anlatacagim. Firebase in bir cok ozelligi bulunuyor : Authentication,
Storage, Database gibi. Oncelikle Authentication ozelligini kullanarak uygulama gelistirecegiz.
Bunun icin once Android studio dan yeni bir proje olusturuyoruz, activity olarak ise LoginActivity seciyoruz.

Daha sonra Firebase Consol da bir proje olusturuyoruz.
Simdi Android Studio ya geri donelim. Tools -> Firebase seciyoruz.
Resimdeki Asistan kismi aciliyor.

Once 1. Connect your app to Firebase altindan Connect to Firebase i seciyoruz.
Acilan ekrandan Firebase Consol da olusturdugumuz projeyi seciyoruz.

Buradan Authentication secip "Add Firebase Authentication to your app" e tikliyoruz.Acilan
ekranda bize gradle a firebase authentication icin gerekli kodlari ekleyecegim diyor, biz de tamam diyoruz ve kodlar gradle a
ekleniyor.

Bu sekilde artik gerekli kodlarimiz gradle a eklenmis oluyor.

Kodlarimizi yazdiktan sonra Firebase consoldan oturum acma yontemi olarak Eposta/Sifre kismini etkinlestiriyoruz.


Oncelikle FirebaseAuth classindan bir nesne olusturuyoruz. Girilen mail adresi kayitli bir mail adresi mi diye kontrol ediyoruz. Daha sonra eger kayitli ise login olmasi icin signInWithEmailAndPassword methodunu cagiriyoruz.

Eger kayitli degilse kayit olmasi icin de createUserWithEmailAndPassword methodunu cagiriyoruz.

Bu methodlarin yanlarina nokta koyup islemin tamamlanip tamamlanmadigi kontrolunu yapmak icin
addOnCompleteListener yazarak Complete Listener ekliyoruz.

Daha sonra login olurken firebaseAuth dan getCurrentUser diyerek useri aliyoruz, daha sonra mail adresi verify edildi mi kontrol ediyoruz. Eger edildiyse kullaniciyi login etmeliyiz. Degilse hata vermeliyiz.

Kayit olurken ise currentUser a verification maili gonderiyoruz.

LoginActivity.java

firebaseAuth.fetchProvidersForEmail(mEmail).addOnCompleteListener(new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    if(task.isSuccessful()){

                        boolean isMailExist = !task.getResult().getProviders().isEmpty();
                        if(isMailExist){

                            firebaseAuth.signInWithEmailAndPassword(mEmail, mPassword).addOnCompleteListener(new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    if(task.isSuccessful()){

                                        FirebaseUser user = firebaseAuth.getCurrentUser();
                                        if(user.isEmailVerified()){
                                            // kullaniciyi anasayfaya yonlendir.
                                        }else {
                                            mPasswordView.setError("Mail dogrulanmayi bekliyor!!!");
                                        }
                                    }

                                }
                            });
                        } else{

                            firebaseAuth.createUserWithEmailAndPassword(mEmail, mPassword).addOnCompleteListener(new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    if(task.isSuccessful()){
                                        FirebaseUser useer = firebaseAuth.getCurrentUser();
                                        useer.sendEmailVerification().addOnCompleteListener(new OnCompleteListener() {
                                            @Override
                                            public void onComplete(@NonNull Task task) {
                                                if(task.isSuccessful()){
                                                    tw.setText("Email gonderildi");
                                                }
                                            }
                                        });
                                    }
                                }
                            });
                        }
                    }
                }
            });


Ilk once tum mailler icin create metoduna dusecektir ve kullaniciya dogrulama maili gonderecektir. Daha sonra ilgili kullanici mail adresini onaylarsa bu defa da sign in metoduna dusecektir.


Kullanici login oldugunda gidecegi sayfa icin yeni bir activity olusturuyoruz, olsutururken NavigationDrawerActivity seciyoruz.

Burada ise oturumu acilan kullanicinin mail adresini cekip soldaki acilir menude resmin altina yazmaya calisalim.

Oncelikle

private FirebaseAuth firebaseAuth;

olusturalim. Daha sonra onCreate icinde firebaseAuth a deger atayalim.

firebaseAuth = FirebaseAuth.getInstance();

Simdi de oturumu acilmis kullaniciyi alalim.

FirebaseUser fUser = firebaseAuth.getCurrentUser();

// Eger user null degilse soldaki text view a yazalim.
Bunun icin once soldaki text view i alalim.activity layout icindeki navigation view da yer alan header layout a gidiyoruz. Oraya bir text view ekliyoruz. Id si userMail olsun.

View view = navigationView.getHeaderView(0);

TextView tw = view.findViewById(R.id.userMail);

if(fUser != null){
    tw.setText(fUser.getEmail());
}


Simdi ise sol menuye cikis yap butonu ekleyelim. Ve o butona basildiginda giris yaptigi ekrana tekrar donsun. Butonun id si logOut olsun.

else if(id == R.id.logOut){
    firebaseAuth.signOut();
    Intent i = new Intent(getApplicationContext(), LoginActivity.class);
    startActivity(i);
    finish(); // geriye tiklandiginda geri donmemesi icin
}


LoginActivity tum kodlari asagida yer aliyor,

package gykizmir.com.newproject;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.TargetApi;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.app.LoaderManager.LoaderCallbacks;

import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;

import android.os.Build;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.EditorInfo;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.ProviderQueryResult;

import java.util.ArrayList;
import java.util.List;

import static android.Manifest.permission.READ_CONTACTS;

/**
 * A login screen that offers login via email/password.
 */
public class LoginActivity extends AppCompatActivity implements LoaderCallbacks {

    /**
     * Id to identity READ_CONTACTS permission request.
     */
    private static final int REQUEST_READ_CONTACTS = 0;

    /**
     * A dummy authentication store containing known user names and passwords.
     * TODO: remove after connecting to a real authentication system.
     */
    private static final String[] DUMMY_CREDENTIALS = new String[]{
            "foo@example.com:hello", "bar@example.com:world"
    };
    /**
     * Keep track of the login task to ensure we can cancel it if requested.
     */
    private UserLoginTask mAuthTask = null;

    // UI references.
    private AutoCompleteTextView mEmailView;
    private EditText mPasswordView;
    private View mProgressView;
    private View mLoginFormView;
    private FirebaseAuth firebaseAuth;
    public final static String TAG= "GYKIZMIR";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        // Set up the login form.
        mEmailView = (AutoCompleteTextView) findViewById(R.id.email);
        //   populateAutoComplete();

        mPasswordView = (EditText) findViewById(R.id.password);
        mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
                if (id == R.id.login || id == EditorInfo.IME_NULL) {
                    attemptLogin();
                    return true;
                }
                return false;
            }
        });

        Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button);
        mEmailSignInButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                attemptLogin();
            }
        });

        mLoginFormView = findViewById(R.id.login_form);
        mProgressView = findViewById(R.id.login_progress);

        firebaseAuth = FirebaseAuth.getInstance();

    }

    private void populateAutoComplete() {
        if (!mayRequestContacts()) {
            return;
        }

        getLoaderManager().initLoader(0, null, this);
    }

    private boolean mayRequestContacts() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return true;
        }
        if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
            return true;
        }
        if (shouldShowRequestPermissionRationale(READ_CONTACTS)) {
            Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
                    .setAction(android.R.string.ok, new View.OnClickListener() {
                        @Override
                        @TargetApi(Build.VERSION_CODES.M)
                        public void onClick(View v) {
                            requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
                        }
                    });
        } else {
            requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
        }
        return false;
    }

    /**
     * Callback received when a permissions request has been completed.
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        if (requestCode == REQUEST_READ_CONTACTS) {
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                populateAutoComplete();
            }
        }
    }


    /**
     * Attempts to sign in or register the account specified by the login form.
     * If there are form errors (invalid email, missing fields, etc.), the
     * errors are presented and no actual login attempt is made.
     */
    private void attemptLogin() {
        if (mAuthTask != null) {
            return;
        }

        // Reset errors.
        mEmailView.setError(null);
        mPasswordView.setError(null);

        // Store values at the time of the login attempt.
        String email = mEmailView.getText().toString();
        String password = mPasswordView.getText().toString();

        boolean cancel = false;
        View focusView = null;

        // Check for a valid password, if the user entered one.
        if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) {
            mPasswordView.setError(getString(R.string.error_invalid_password));
            focusView = mPasswordView;
            cancel = true;
        }

        // Check for a valid email address.
        if (TextUtils.isEmpty(email)) {
            mEmailView.setError(getString(R.string.error_field_required));
            focusView = mEmailView;
            cancel = true;
        } else if (!isEmailValid(email)) {
            mEmailView.setError(getString(R.string.error_invalid_email));
            focusView = mEmailView;
            cancel = true;
        }

        if (cancel) {
            // There was an error; don't attempt login and focus the first
            // form field with an error.
            focusView.requestFocus();
        } else {
            // Show a progress spinner, and kick off a background task to
            // perform the user login attempt.
            showProgress(true);
            mAuthTask = new UserLoginTask(email, password);
            mAuthTask.execute((Void) null);
        }
    }

    private boolean isEmailValid(String email) {
        //TODO: Replace this with your own logic
        return email.contains("@");
    }

    private boolean isPasswordValid(String password) {
        //TODO: Replace this with your own logic
        return password.length() > 4;
    }

    /**
     * Shows the progress UI and hides the login form.
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
    private void showProgress(final boolean show) {
        // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
        // for very easy animations. If available, use these APIs to fade-in
        // the progress spinner.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
            int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);

            mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
            mLoginFormView.animate().setDuration(shortAnimTime).alpha(
                    show ? 0 : 1).setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
                }
            });

            mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
            mProgressView.animate().setDuration(shortAnimTime).alpha(
                    show ? 1 : 0).setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
                }
            });
        } else {
            // The ViewPropertyAnimator APIs are not available, so simply show
            // and hide the relevant UI components.
            mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
            mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
        }
    }

    @Override
    public Loader onCreateLoader(int i, Bundle bundle) {
        return new CursorLoader(this,
                // Retrieve data rows for the device user's 'profile' contact.
                Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI,
                        ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION,

                // Select only email addresses.
                ContactsContract.Contacts.Data.MIMETYPE +
                        " = ?", new String[]{ContactsContract.CommonDataKinds.Email
                .CONTENT_ITEM_TYPE},

                // Show primary email addresses first. Note that there won't be
                // a primary email address if the user hasn't specified one.
                ContactsContract.Contacts.Data.IS_PRIMARY + " DESC");
    }

    @Override
    public void onLoadFinished(Loader cursorLoader, Cursor cursor) {
        List emails = new ArrayList<>();
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            emails.add(cursor.getString(ProfileQuery.ADDRESS));
            cursor.moveToNext();
        }

        addEmailsToAutoComplete(emails);
    }

    @Override
    public void onLoaderReset(Loader cursorLoader) {

    }

    private void addEmailsToAutoComplete(List emailAddressCollection) {
        //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list.
        ArrayAdapter adapter =
                new ArrayAdapter<>(LoginActivity.this,
                        android.R.layout.simple_dropdown_item_1line, emailAddressCollection);

        mEmailView.setAdapter(adapter);
    }


    private interface ProfileQuery {
        String[] PROJECTION = {
                ContactsContract.CommonDataKinds.Email.ADDRESS,
                ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
        };

        int ADDRESS = 0;
        int IS_PRIMARY = 1;
    }

    /**
     * Represents an asynchronous login/registration task used to authenticate
     * the user.
     */
    public class UserLoginTask extends AsyncTask {

        private final String mEmail;
        private final String mPassword;

        UserLoginTask(String email, String password) {
            mEmail = email;
            mPassword = password;
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            // TODO: attempt authentication against a network service.

            try {
                // Simulate network access.
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                return false;
            }

            firebaseAuth.fetchProvidersForEmail(mEmail).addOnCompleteListener(new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    if(task.isSuccessful()){

                        boolean isMailExist = !task.getResult().getProviders().isEmpty();
                        if(isMailExist){

                            firebaseAuth.signInWithEmailAndPassword(mEmail, mPassword).addOnCompleteListener(new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    if(task.isSuccessful()){

                                        FirebaseUser user = firebaseAuth.getCurrentUser();
                                        if(user.isEmailVerified()){
                                            Toast.makeText(LoginActivity.this, "Email verify edildi", Toast.LENGTH_LONG).show();
                                            Intent i = new Intent(LoginActivity.this, MainActivity.class);
                                            startActivity(i);
                                        }else {
                                            mPasswordView.setError("Mail dogrulanmayi bekliyor!!!");
                                            Toast.makeText(LoginActivity.this, "Mail dogrulanmayi bekliyor!!!", Toast.LENGTH_LONG).show();
                                        }
                                    }

                                }
                            });
                        } else{

                            firebaseAuth.createUserWithEmailAndPassword(mEmail, mPassword).addOnCompleteListener(new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    if(task.isSuccessful()){
                                        FirebaseUser useer = firebaseAuth.getCurrentUser();
                                        useer.sendEmailVerification().addOnCompleteListener(new OnCompleteListener() {
                                            @Override
                                            public void onComplete(@NonNull Task task) {
                                                if(task.isSuccessful()){
                                                  //  tw.setText("Email gonderildi");
                                                    Toast.makeText(LoginActivity.this, "Email gonderildi", Toast.LENGTH_LONG).show();
                                                }
                                            }
                                        });
                                    }
                                }
                            });
                        }
                    }
                }
            });




            return true;
        }

        @Override
        protected void onPostExecute(final Boolean success) {
            mAuthTask = null;
            showProgress(false);

            if (success) {
                // finish();
            } else {
                mPasswordView.setError(getString(R.string.error_incorrect_password));
                mPasswordView.requestFocus();
            }
        }

        @Override
        protected void onCancelled() {
            mAuthTask = null;
            showProgress(false);
        }
    }

    private void setPwError(Exception exception) {
        Log.e(TAG, "Mail dogrulanmadi... ", exception);
        mPasswordView.setError(exception.toString());
    }
}




activity_login.xml



User.java

package gykizmir.com.newproject;

public class User {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

UserAdapter.java



package gykizmir.com.newproject;

import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Gamze on 1/13/2019.
 */

public class UserAdapter extends RecyclerView.Adapter {
    private Context context;
    private List userList;
    private LayoutInflater inflater;


    public UserAdapter(Context context, List list) {
        this.context = context;
        this.userList = list;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v =  LayoutInflater.from(context).inflate(R.layout.user_item, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        User user = userList.get(position);
        holder.isim.setText(user.getName());
    }

    @Override
    public int getItemCount() {
        return userList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        public TextView isim;
        public ImageView resim;
        private DatabaseReference dbRef;

        public ViewHolder(View view){
            super(view);
            isim = (TextView) view.findViewById(R.id.userName);
            resim = (ImageView) view.findViewById(R.id.userImg);

            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    if(position != RecyclerView.NO_POSITION){
                        final User selectedUser = userList.get(position);
                        Toast.makeText(context, "Secilen kullanici: "+ selectedUser.getName(), Toast.LENGTH_LONG).show();

                        AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
                        alertDialog.setTitle("Degistir");
                        alertDialog.setMessage("Yeni degeri girin");
                        final EditText input = new EditText(context);
                        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.MATCH_PARENT,
                                LinearLayout.LayoutParams.MATCH_PARENT);
                        input.setLayoutParams(lp);
                        alertDialog.setView(input);

                        alertDialog.setPositiveButton("Onayla",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {

// value su o toast icinde gosterilen deger olanin key i ni bul. onun valuesunu girilen degeri setle

                                        dbRef = FirebaseDatabase.getInstance().getReference("users");

                                        dbRef.addValueEventListener(new ValueEventListener() {
                                            @Override
                                            public void onDataChange(DataSnapshot dataSnapshot) {

                                                for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren()){
                                                    User u = dataSnapshot1.getValue(User.class);
                                                    if(u.getName().equals(selectedUser.getName())){
                                                             dbRef.child(dataSnapshot1.getKey()).child("name").setValue(input.getText().toString());

                                                    }
                                                }
                                            }

                                            @Override
                                            public void onCancelled(DatabaseError databaseError) {

                                            }
                                        });

                                    }
                                });

                        alertDialog.setNegativeButton("Iptal",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        dialog.cancel();
                                    }
                                });

                        alertDialog.show();

                        FirebaseDatabase.getInstance().getReference("users").child("gamze").child("name").setValue("Gamzecik");

                    }
                }
            });
        }

    }
}

MainActivity.java



package gykizmir.com.newproject;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    private TextView username;
    private TextView usermail;
    private FirebaseAuth firebaseAuth;
    private RecyclerView recyclerView;
    private DatabaseReference databaseReference;
    private UserAdapter userAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        View view = navigationView.getHeaderView(0);
       // username = (TextView) findViewById(R.id.uname);
        usermail = view.findViewById(R.id.uMail);

        firebaseAuth = FirebaseAuth.getInstance();
        FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
        usermail.setText(firebaseUser.getEmail());

        recyclerView = (RecyclerView) findViewById(R.id.rc_view);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,
                LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(linearLayoutManager);


        databaseReference = FirebaseDatabase.getInstance().getReference("users");
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                List userList = new ArrayList();
                for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren()){
                    // Ekranda gosterecegimiz datalari listeye ekliyoruz.
                    User u = dataSnapshot1.getValue(User.class);
                    userList.add(u);
                }
                loadUsers(userList);
// Bu metodla olusturdugumuz listedeki elemanlari ekranda gosterecegiz.
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


    }

    private void loadUsers(List userList){
        userAdapter = new UserAdapter(this, userList);
        recyclerView.setAdapter(userAdapter);
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_camera) {
            // Handle the camera action
        } else if (id == R.id.nav_gallery) {
            Intent i = new Intent(MainActivity.this, StorageActivity.class);
            startActivity(i);

        } else if (id == R.id.nav_slideshow) {

        } else if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        } else if (id == R.id.nav_signout){
            firebaseAuth.signOut();
            Intent intent = new Intent(MainActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}


Simdi ise veritabaninda bir tablo olusturalim ve ona bir deger ekleyelim.

Veritabani yapimiz su sekilde olsun:

users:
    gamze
        name
            Gamze Sen
    mary
        name
            Mary Hopkins
     ....

Bu islemi yapacak satirimiz su sekildedir.

FirebaseDatabase.getInstance().getReference().child("users").child("gamze").child("name").setValue("Gamze Sen");

FirebaseDatabase.getInstance().getReference().child("users").child("mary").child("name").setValue("Mary Hopkins");

seklinde.

simdi ise gamze sen degerini alip onu header layout ta bir textview olusturup orada gostermek isteyelim.

databaseReference = FirebaseDatabase.getInstance().getReference("users/gamze/name");

databaseReference.addValueEventListener(new ValueEventListener(
     @Override
     public void onDataChange(DataSnapshot dataSnapshot) {
                userName.setText(dataSnapshot.toString());
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }

)); 

Simdi ise database e eklenen tum degerleri ekranda liste halinde gosterelim. Eleman her biri User modelinin birer ozelligi.
O yuzden oncelikle User adinda bir model olusturalim. isim ve resim parametreleri olsun.
Ve her bir user item ini gosterecegimiz bir view item olusturalim. Solda resim yaninda da isimleri olsun. Database den cekilsin
bu degerler.

Bu degerleri setlemek icin bir adapter yazmamiz gerekir. Daha once de bahsettigimiz gibi adapter verileri bizim kullanabilecegimiz
sekle donusturur, donusturucu islevi gorur. Bu adapter imiz verileri alicak, ekrandaki view lara degerlerini setleyecek.

Ekranda bir textview ve bir imageview yer alsin.
Oncelikle UserAdapter imizi olusturalim. Custom olarak olusturacagimiz ViewHolder classimizi extend etsin.
ViewHolder in yapacagi su : ViewHolder constructor i icinde ekranda yer alacak textview ve imageview i findviewbyid ile setlemek.

public class ViewHolder extends RecyclerView.ViewHolder{

        public TextView isim;
        public ImageView resim;

        public ViewHolder(View view){
            super(view);
            isim = (TextView) view.findViewById(R.id.isim);
            resim = (ImageView) view.findViewById(R.id.userImage);
        }

    }

Simdi ise UserAdapter a bakalim. Adapter in 3 metodu implement etmesi gerekir. Bu metodlar:
onCreateViewHolder, onBindViewHolder ve getItemCount metodlaridir.

onCreateViewHolder metodu viewholder olusturmamizi saglar. Layout inflater ile each user icin layoutumuzu veririz.

 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v =  LayoutInflater.from(context).inflate(R.layout.user_item, parent, false);
        return new ViewHolder(v);
    }

onBindViewHolder metodu ise parameterlere degerleri setlememizi saglar. Bir user objesi olustururuz. userListesinden o
pozisyondaki user i bulup viewholder in isim alanina o userin adini setleriz.

public void onBindViewHolder(ViewHolder holder, int position) {
        User user = userList.get(position);
        holder.isim.setText(user.getName());
    }
getItemCount methodu ise userList in size ini dondurur.

public int getItemCount() {
    return userList.size();
    }


Adapterimizi bu sekilde olsuturduktan sonra main ekranimiza bu adapterimizi vermeliyiz ki degerlerimiz main ekranda gorunsun.

Uygulamamiz ilk acildiginda degerlerimizin gosterilmesini istiyoruz, O yuzden oncreate methoduna gidelim.
Gosterecegimiz u degerler users tablosundan gelecek. Oncelikle bir referansimiz olsuturalim.


databaseReference = FirebaseDatabase.getInstance().getReference("users");
databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
   List<User> userList = new ArrayList<User>();
   for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren()){
    // Ekranda gosterecegimiz datalari listeye ekliyoruz.
    User u = dataSnapshot1.getValue(User.class);
    userList.add(u);
   }
   loadUsers(userList);
// Bu metodla olusturdugumuz listedeki elemanlari ekranda gosterecegiz.
}}


Simdi ise bu methodumuzu yazalim.

private void loadUsers(List<User> userList){
        userAdapter = new UserAdapter(this, userList);
        recyclerView.setAdapter(userAdapter);
    }

Buradaki recyclerView i ise su sekilde tanimliyoruz.


 recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, 
LinearLayoutManager.VERTICAL, false);
 recyclerView.setLayoutManager(linearLayoutManager);


Ekrana datalarimizi gosterdik. Simdi de o listedeki elemanlara tiklayip degerlerini gorme islemine bakalim. Recycler View kullanmistik.

Tiklanma algilama islemini UserAdapter da yazdigimiz custome viewholder icinde, constructor da yapacagiz.

 public ViewHolder(View view) {
            super(view);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                  int position = getAdapterPosition();
                  if(position != RecyclerView.NO_POSITION){
                     User clickedUser = userList.get(position);
                     Log.d("Tiklanan user : ", " adi : "+ clickedUser.getName());
                   }
                }
            });

    }


Simdi ise firebase in storage ozelligini kullanmayi ogrenelim. Bunun icin telefondan bir resim yukleyelim ve bu resmi firebase e yukleyelim. Yuklerken de ne kadar yuklendigini yuzde oraninda gostermek icin ProgressBar kullanalim.

Bu islemler icin layoutumuz olarak resim sec ve yukle butonu olacak. Altta ise yuklenen resmi imageview da gosterelim.





package gykizmir.com.newproject;

import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.Image;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.OnProgressListener;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

import java.io.IOException;
import java.util.UUID;

public class StorageActivity extends AppCompatActivity {

    private Button uploadBtn, selectImgBtn;
    private ImageView uploadedImg;
    private StorageReference databaseReference;
    private final int IMG_REQUEST_CODE = 82;
    private Uri selectedData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_storage);

        selectImgBtn = (Button) findViewById(R.id.secBtn);
        uploadBtn = (Button) findViewById(R.id.yukleBtn);
        uploadedImg = (ImageView) findViewById(R.id.image);

        databaseReference = FirebaseStorage.getInstance().getReference();

        selectImgBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                resmiSec();
            }
        });

        uploadBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                resmiYukle();
            }
        });

    }

    public void resmiSec(){
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        startActivityForResult(Intent.createChooser(intent, "Yuklenecek resmi sec"), IMG_REQUEST_CODE);
    }

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

        if(requestCode == IMG_REQUEST_CODE && resultCode == RESULT_OK && data != null && data.getData() != null){
            selectedData = data.getData();

            try{
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedData);
                uploadedImg.setImageBitmap(bitmap);

            } catch (Exception e){
                e.printStackTrace();
            }

        }
    }

    public void resmiYukle(){
        if(selectedData != null){
            final ProgressDialog progressDialog = new ProgressDialog(this);
            progressDialog.setTitle("Yukleniyor...");
            progressDialog.show();

            StorageReference storageReference = databaseReference.child(UUID.randomUUID().toString());
            storageReference.putFile(selectedData)
                    .addOnSuccessListener(new OnSuccessListener() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            Toast.makeText(getApplicationContext(), "Yukleme Tamamlandi", Toast.LENGTH_LONG).show();
                            progressDialog.dismiss();
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(getApplicationContext(), "Yukleme sirasinda hata olustu", Toast.LENGTH_LONG).show();
                            progressDialog.dismiss();
                        }
                    }).addOnProgressListener(new OnProgressListener() {
                        @Override
                        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                            @SuppressWarnings("VisibleForTests")
                            double yuklenmeOrani = (100 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
                            progressDialog.setMessage("Yuklenen : %" + (int) yuklenmeOrani);
                        }
            });

        }

    }
}

Yukleme ekranimiz alttaki sekilde gorunuyor.



Hiç yorum yok:

Yorum Gönder