Google Spread Sheets As Database

Google Spread Sheets As Android Web Database 

এই প্রজেক্টে দুটি পার্ট থাকবে, 

১। এ্যান্ড্রয়েড পার্ট 
২। ওয়েব পার্ট  


======================================================

১। এ্যান্ড্রয়েড পার্ট 

এই  প্রজেক্টের জন্য  আমাদের কয়েকটি আলাদা ক্লাস লাগবে । ক্লাসগুলো হচ্ছে : 


১। InternetConnection
২। Controller
৩। Keys
৪। MyDataModel
৫। InsertData
৬। DownloadData

এখন নিচে এই ক্লাসগুলোর একে একে বর্ণনা  দেখব: 


১। InternetConnection : 

নামেই বোঝা যাচ্ছে যে, এই ক্লাসের মাধ্যমে কি কাজ হবে।  এই ক্লাসের মাধ্যমে আমরা ইন্টারনেট চেক করব। যদি ইন্টারনেট কানেকশন ষ্টাব্লিশড হয়, তাহলে আমাদের নির্দিষ্ট কাজটি শুরু হবে, আর যদি ইন্টারনেট কানেকশন না থাকে তাহলে একটা মেসেজ দেখাবে। 

একটি নতুন ক্লাস তৈরী করার জন্য এখানে যান : 

file > new > java class 

নাম দিন  InternetConnection 

ক্লাসটি ভিজিবল হবার পর  নিচের কোড গুলো পেষ্ট করে দিন  : 


package ..................................;  // (your package name) 

import android.content.Context;
import android.net.ConnectivityManager;
import android.support.annotation.NonNull;


public class InternetConnection {

    /** CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT */
    public static boolean checkConnection(@NonNull Context context) {
        return  ((ConnectivityManager) context.getSystemService
                (Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null;
    }
}




২। Controller

গুগল স্প্রিড শীট এ ডাটা আপলোড এবং ডাউলোড করার জন্য একটি কন্ট্রোলার লাগবে। যার মাধ্যমে আমরা কোন এ্যড্রসে ডাটা আপলোড করব তা নির্ধারিত হবে। 


উপরের পদ্ধতিতে Controller   নামে একটি ক্লাস তৈরী করে  নিচের কোডগুলো পেষ্ট করে দিন : 



package ....................................;

/**
 * Created by user on 4/15/2018.
 */
import android.support.annotation.NonNull;
import android.util.Log;

import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

public class Controller {



WAURL="https://script.google.com/macros/s/AKfycbzVuuT0B1CxYFujFv8r5xpppTCksthaYxnCx1ENT-U9D1INHg4/exec?";
    public static final String WAURL="https://script.google.com/macros/s/AKfycbz0LWQfOSKhbh2bd4aHuT1vLqxXTI4cGxKkUneCkVMwytsendw/exec?";


    public static final String RAGISTRATIONURL="https://script.google.com/macros/s/AKfycbx7yPYdrkg_ZnplhQOCxRX7_SFmFr9IQZI1G8oxbn41VLpgGlw/exec?";
                                              
    // EG : https://script.google.com/macros/s/AKfycbwXXXXXXXXXXXXXXXXX/exec?
//Make Sure '?' Mark is present at the end of URL


    private static final String MAIN_URL = "https://script.google.com/macros/s/AKfycbxOLElujQcy1-ZUer1KgEvK16gkTLUqYftApjNCM_IRTL3HSuDk/exec?id=1vsGK30gV4IAW0siWtIACh8BcPtuDOCAFT62ftMVxGCU&sheet=Sheet1";

  
    private static final String PASSWORD_RATE_URL = "https://script.google.com/macros/s/AKfycbxOLElujQcy1-ZUer1KgEvK16gkTLUqYftApjNCM_IRTL3HSuDk/exec?id=1IiU9BDvuVzE7uJXSH7pZ2Qn42_sTk1Xg6pVZyEgXoKE&sheet=Sheet1";



   public static final String TAG = "TAG";
    private static final String KEY_USER_ID = "user_id";

    private static Response response;




    public static JSONObject insertRegistration(String id, String name) {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    //.url(RAGISTRATIONURL+"action=insert&id="+id+"&name="+name)
                     .url(RGISTRATION_URL+"action=insert&id="+id+"&name="+name)

                    .build();
            response = client.newCall(request).execute();
            //    Log.e(TAG,"response from gs"+response.body().string());
            return new JSONObject(response.body().string());


        } catch (@NonNull IOException | JSONException e) {
            Log.e(TAG, "recieving null " + e.getLocalizedMessage());
        }
        return null;
    }




    public static JSONObject readRegistrationData() {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(RGISTRATION_URL_READ+"action=readRegistrationData")
                    .build();
            response = client.newCall(request).execute();
            return new JSONObject(response.body().string());
        } catch (@NonNull IOException | JSONException e) {
            Log.e(TAG, "" + e.getLocalizedMessage());
        }
        return null;
    }




    public static JSONObject readAllData() {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(RGISTRATION_URL_READ)
                    .build();
            response = client.newCall(request).execute();
            return new JSONObject(response.body().string());
        } catch (@NonNull IOException | JSONException e) {
            Log.e(TAG, "" + e.getLocalizedMessage());
        }
        return null;
    }


    public static JSONObject readBibekMonth() {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(BIBEK_MONTH_READ)
                    .build();
            response = client.newCall(request).execute();
            return new JSONObject(response.body().string());
        } catch (@NonNull IOException | JSONException e) {
            Log.e(TAG, "" + e.getLocalizedMessage());
        }
        return null;
    }




    public static JSONObject getDataFromWeb() {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(MAIN_URL)
                    .build();
            response = client.newCall(request).execute();
            return new JSONObject(response.body().string());
        } catch (@NonNull IOException | JSONException e) {
            Log.e(TAG, "" + e.getLocalizedMessage());
        }
        return null;
    }



    public static JSONObject getPasswordAndRateFromWeb() {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(PASSWORD_RATE_URL)
                    .build();
            response = client.newCall(request).execute();
            return new JSONObject(response.body().string());
        } catch (@NonNull IOException | JSONException e) {
            Log.e(TAG, "" + e.getLocalizedMessage());
        }
        return null;

    }



    public static JSONObject readAllRegistration() {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(RGISTRATION_URL_READ)
                    .build();
            response = client.newCall(request).execute();
            return new JSONObject(response.body().string());
        } catch (@NonNull IOException | JSONException e) {
            Log.e(TAG, "" + e.getLocalizedMessage());
        }
        return null;
    }





    public static JSONObject insertData(String id, String name) {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(WAURL+"action=insert&id="+id+"&name="+name)
                    .build();
            response = client.newCall(request).execute();
            //    Log.e(TAG,"response from gs"+response.body().string());
            return new JSONObject(response.body().string());


        } catch (@NonNull IOException | JSONException e) {
            Log.e(TAG, "recieving null " + e.getLocalizedMessage());
        }
        return null;
    }



    public static JSONObject updateData(String id, String name) {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(WAURL+"action=update&id="+id+"&name="+name)
                    .build();
            response = client.newCall(request).execute();
            //    Log.e(TAG,"response from gs"+response.body().string());
            return new JSONObject(response.body().string());


        } catch (@NonNull IOException | JSONException e) {
            Log.e(TAG, "recieving null " + e.getLocalizedMessage());
        }
        return null;
    }


    public static JSONObject updateRateAndPassword(String id, String name) {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(RATEANDPASSWORD_URL+"action=update&id="+id+"&name="+name)
                    .build();
            response = client.newCall(request).execute();
            //    Log.e(TAG,"response from gs"+response.body().string());
            return new JSONObject(response.body().string());


        } catch (@NonNull IOException | JSONException e) {
            Log.e(TAG, "recieving null " + e.getLocalizedMessage());
        }
        return null;
    }

    public static JSONObject readData(String id) {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(WAURL+"action=read&id="+id)
                    .build();
            response = client.newCall(request).execute();
            // Log.e(TAG,"response from gs"+response.body().string());
            return new JSONObject(response.body().string());


        } catch (@NonNull IOException | JSONException e) {
            Log.e(TAG, "recieving null " + e.getLocalizedMessage());
        }
        return null;
    }

    public static JSONObject deleteData(String id) {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(WAURL+"action=delete&id="+id)
                    .build();
            response = client.newCall(request).execute();
            // Log.e(TAG,"response from gs"+response.body().string());
            return new JSONObject(response.body().string());


        } catch (@NonNull IOException | JSONException e) {
            Log.e(TAG, "recieving null " + e.getLocalizedMessage());
        }
        return null;
    }


}

=============================================================

৩। Keys

file > new > java class 

নাম দিন  Keys



package ...............................;


public class Keys {

    public static final String KEY_CONTACTS = "Sheet1";
    public static final String KEY_NAME = "name";
    public static final String KEY_COUNTRY = "rate";
  //  public static final String KEY_IMAGE = "image";

}



=============================================================


৪। MyDataModel

file > new > java class 

নাম দিন  MyDataModel



package ......................................;



public class MyDataModel {

    private String name;

    private String country;



    public String getName() {
        return name;
    }

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

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }



}

=======================================================================

৫।ক।  InsertData

এতক্ষণ আমরা যে ক্লাস গুলো তৈরী করেছি সেগুলো ছিল হেল্পার ক্লাস। সেগুলোর কোন অনক্রিয়েট ছিলনা এবং ছিলনা কোন লেআউট ডিক্লারেশন। 

উপরের ৪টি ক্লাস ব্যবহার করে এখন আমরা দুটি এ্যাক্টিভিটি তৈরী করবো যার  একটির মাধ্যমে আমরা ডাটা আপলোড করব এবং আরেকটির মাধ্যমে আমরা ডাটা ডাউনলোড করব। 


ইনসার্ট ডাটার জন্য একটি জাভা ফাইল এবং একটি  লেআউট এক্সএমএল  লাগবে । নিচের কোডগুলো  দেখুন : 


একটি নতুন একটি এ্রাক্টিভিটি তৈরী করে তার নাম দিন  InsertData . 

এবার নিচের কেডগুলো পেষ্ট করে দিন : 

package  ......................................................;

import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class InsertData extends AppCompatActivity {

    private Button insert;

    String id;
    String fullregistration;

    EditText uid1ET, uid2, fullAddress, nameET;

    Context mContext;

    Calendar myCalendar;

    AutoCompleteTextView last_date, district, blodgroup;







    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.insert_data);

        mContext=this;

        Resources DistrictRes = getResources();

        insert = (Button) findViewById(R.id.insert_btn);


        uid1ET = (EditText) findViewById(R.id.uid);
        nameET = (EditText) findViewById(R.id.name);
        district =(AutoCompleteTextView)findViewById(R.id.district);
        fullAddress =(EditText)findViewById(R.id.fullAddress);
        last_date =(AutoCompleteTextView)findViewById(R.id.lastDate);


        //blood group dropdow list :

         blodgroup =(AutoCompleteTextView)findViewById(R.id.blodgroup);
        ////////////////
        //for not blinking the cursor or cursor to left :
        blodgroup.setSelection(blodgroup.getText().length());


        final String[] bloodArray  = DistrictRes.getStringArray(R.array.blood_group);
        ArrayAdapter<String> bloodAdapter =new ArrayAdapter<String>(mContext,android.R.layout.simple_list_item_1,bloodArray);


        blodgroup.setAdapter(bloodAdapter);

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











        //for not blinking the cursor or cursor to left :
        district.setSelection(district.getText().length());


        final String[] districtname  = DistrictRes.getStringArray(R.array.district_name);
        ArrayAdapter<String> districtAdapter =new ArrayAdapter<String>(mContext,android.R.layout.simple_list_item_1,districtname);

        //show roll quantity built in dropdown :

        district.setAdapter(districtAdapter);
        district.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                district.showDropDown();
            }
        });
        district.setClickable(true);

        //get current date and time from system :
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy");
        final String registration_date = simpleDateFormat.format(new Date());




        //////////////date picker  dialog //////////////

        myCalendar = Calendar.getInstance();

       final DatePickerDialog.OnDateSetListener  date = new DatePickerDialog.OnDateSetListener() {

            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear,
                                  int dayOfMonth) {
                // TODO Auto-generated method stub
                myCalendar.set(Calendar.YEAR, year);
                myCalendar.set(Calendar.MONTH, monthOfYear);
                myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                updateLabel();
            }

        };

        last_date.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new DatePickerDialog(InsertData.this, date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });

        Button show_calendar = (Button)findViewById(R.id.show_calendar);
        show_calendar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new DatePickerDialog(InsertData.this, date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH)).show();

            }
        });








        insert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


               String phnNo=uid1ET.getText().toString();
               String name =nameET.getText().toString();
               String blodgroupTxt=blodgroup.getText().toString();
              /// String registration_date=*******.getText().toString();
                String districtName = district.getText().toString();
                String fullAddressText = fullAddress.getText().toString();
                String donorLastDate=last_date.getText().toString();

               if(TextUtils.isEmpty(phnNo)){
                   uid1ET.setError("empty");
               }else if(TextUtils.isEmpty(name)){
                   nameET.setError("empty");
               }else if(TextUtils.isEmpty(districtName)){
                   district.setError("empty");
               }else if(TextUtils.isEmpty(fullAddressText)){
                   fullAddress.setError("empty");
               }else if (TextUtils.isEmpty(blodgroupTxt)){
                   blodgroup.setError("empty");
               } else {

                   uid1ET.setError(null);
                   nameET.setError(null);
                   district.setError(null);
                   fullAddress.setError(null);
                   blodgroup.setError(null);


                    id = phnNo;
                    fullregistration =name+"="+blodgroupTxt+"="+phnNo+"="+registration_date+"="+districtName+"="+fullAddressText+"="+":"+donorLastDate;

                    Toast.makeText(mContext,blodgroupTxt,Toast.LENGTH_LONG).show();

                   new InsertDataActivity().execute();


               }








            }
        });


    }




    //for set any date :
    private void updateLabel() {
        String myFormat = "dd.MM.yyyy"; //In which you need put here
        SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);

        last_date.setText(sdf.format(myCalendar.getTime()));
    }



    class InsertDataActivity extends AsyncTask < Void, Void, Void > {

        ProgressDialog dialog;
        int jIndex;
        int x;

        String result = null;


        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            dialog = new ProgressDialog(InsertData.this);
            dialog.setTitle("Hey Wait Please...");
            dialog.setMessage("Inserting your values..");
            dialog.show();

        }

        @Nullable
        @Override
        protected Void doInBackground(Void...params) {
            JSONObject jsonObject = Controller.insertRegistration(id, fullregistration);// equievalent to id, name .
            Log.i(Controller.TAG, "Json obj ");

            try {
                /**
                 * Check Whether Its NULL???
                 */
                if (jsonObject != null) {

                    result = jsonObject.getString("result");

                }
            } catch (JSONException je) {
                Log.i(Controller.TAG, "" + je.getLocalizedMessage());
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            dialog.dismiss();
            Toast.makeText(mContext, result, Toast.LENGTH_LONG).show();


            uid1ET.setText(null);
            nameET.setText(null);
            district.setText(null);
            fullAddress.setText(null);
            last_date.setText(null);
            blodgroup.setText(null);
            insert.setTextColor(Color.BLUE);

            Snackbar.make(findViewById(R.id.insertdata), result, Snackbar.LENGTH_LONG).show();


        }
    }


    //hide keyboard if touching out side the keyboard :
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if ( v instanceof EditText) {
                Rect outRect = new Rect();
                v.getGlobalVisibleRect(outRect);
                if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
                    v.clearFocus();
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
        }
        return super.dispatchTouchEvent( event );
    }



}

========================================================


৫. খ ।    এবার ইনসার্ট ডাটার  এক্সএমএল লেআউট ফাইল : 



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:id="@+id/insertdata"
    android:orientation="vertical"
    android:layout_gravity="center"
    android:gravity="center_horizontal"
    >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Registration"
        android:textSize="20sp"
        android:textColor="@color/black"
        android:layout_marginTop="20dp"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/name"
        android:hint="নাম"
        android:layout_marginTop="20dp"
        android:singleLine="true"
        />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/uid"
        android:hint="মোবাইল নম্বর"
        android:inputType="numberSigned|numberDecimal"
        android:singleLine="true"
       />

    <AutoCompleteTextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/blodgroup"
        android:hint="রক্তের গ্রুপ"
        android:focusableInTouchMode="true"
        android:focusable="false"
        android:clickable="true"/>

    <AutoCompleteTextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/district"
        android:hint="জিলা সিলেক্ট করুন"
        android:focusableInTouchMode="true"
        android:focusable="false"
        android:clickable="true"/>



    <EditText
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/fullAddress"
        android:hint="ঠিকানা"
        android:maxLines="1"

        />


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <AutoCompleteTextView
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:id="@+id/lastDate"
        android:hint="শেষ রক্তদানের তারিখ (যদি থাকে)"
        android:clickable="true"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:layout_weight="1"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="calendar"
        android:id="@+id/show_calendar"/>



</LinearLayout>


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Insert"
        android:id="@+id/insert_btn"
        android:layout_marginTop="45dp"
         />


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="*আমি ইনশাআল্লাহ মানবতার সেবায় রক্তদান করতে প্রস্তুত আছি"
        android:textSize="12sp"

        android:layout_marginTop="40dp"/>


</LinearLayout>



==============================================================



৬.   DownloadData : 

এখন ডাউনলোড ডাটার জন্য একটি এ্যাক্টিভিটি লাগবে যেখানে একটি জাভা ক্লাস ফাইল এবং একটি লে আউট এক্স এম এল ফাইল থাকবে, আর এখানে আরেকটি বাড়তি এক্সটার্নাল ক্লাস লাগবে যার নাম হলো এ্যাডাপ্টার । যার কাজ হলো ডাটা ডাউনলোড হওয়ার পর ডাটা গুলোকে একটি লিষ্ট আকারে সাজিয়ে প্রদর্শন করা, যার ম্যাকানিজম হচ্ছে একটি টেক্সটভিউকে বার বার ব্যবহার করে প্রতিটি রো প্রদর্শন করা।

অর্থাৎ, ধরুন আপনার একহাজার রো এর তালিকা আছে, তাহলে কি একহাজার বার আপনি টেক্সটভিউ এর কোড লিখবেন ?  এখানেই এ্যাডাপ্টার এর কাজ। আপনি একটি মাত্র টেক্সটভিউ   এর কোড লিখবেন।  এ্যাডাপ্টারটি আপনার  ডাটা লিষ্ট থেকে একটি করে তথ্য নিয়ে টেক্সটভিউতে প্রদর্শন করবে, এরপরে আবার আরেকটি  তথ্য নিয়ে আবার সেই টেক্সটভিউ কে পুনরায় ব্যবহার করে পরের লাইনে প্রদর্শন করবে। এভাবেই  এ্যাডাপ্টারটি একটি মাত্র টেক্সটভিউকে বার বার ব্যবহার করে একহাজার বা একলক্ষ  রো এর একটি তালিকা প্রদর্শন করবে।  আর এ্যাডাপ্টার এর মধ্যে  যে মেথড এ কাজটা  করে তার না হচ্ছে getView . 


তাহলে   এই এ্যাক্টিভিটির জন্য এই মুহুর্তে যে কয়টি ফাইল তৈরী করতে হবে তাহলো : 

ক।  ডাউনলোড ডাটা জাভা 
খ। ডাউনলোড ডাটা এক্স এম এল লেআউট 
গ। এ্যাডাপ্টার ক্লাস 
ঘ। এ্যাডাপ্টার ক্লাস বার বার ব্যবহার করবে এরকম একটি টেক্সটভিউ সহকারে একটি লেআউট । 

এছাড়াও উপরে বর্ণি ত  কীওয়ার্ড, কন্ট্রোলার,  ইন্টারনেট কানেকশন এবং ডাটামডেল ক্লাসও এই এ্যাক্টিভিটিতে ব্যবহৃত হবে। 




৬.ক।  ডাউনলোড ডাটা জাভা 


package .................................................;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;




public class Show_All_Registration extends AppCompatActivity {

    private ListView list_all_order;
    private ArrayList<MyDataModel> list;
    private ArrayAdapter_showAll_Registration adapter;
    TextView firstTv;







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

        setTitle("Show Donor");



        list = new ArrayList<>();

        String searchString1 = getIntent().getStringExtra("District");

       // String searchString1="";
        String searchString2=getIntent().getStringExtra("BloodGroup");;

        adapter = new ArrayAdapter_showAll_Registration(this, list, searchString1, searchString2);




        list_all_order = (ListView) findViewById(R.id.list_all_order);


        list_all_order.setDividerHeight(0);
       // list_all_order.smoothScrollToPosition(adapter.getCount()-1);

        list_all_order.setAdapter(adapter);








        ///this list_all_order.setOnItemClickListener does not work for cardview, so see in adapter for cardview clicklistener:

      /*
        list_all_order.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Snackbar.make(findViewById(R.id.show_all_layout), list.get(position).getName() + " => " + list.get(position).getCountry(), Snackbar.LENGTH_LONG).show();
                String name = list.get(position).getName()+"+++++++++++++++++" +  list.get(position).getCountry();
                dbcon.insertData(name);
                Intent main = new Intent(Show_All_Registration_classic.this, Internal_PhnMemry_SavedList.class)
                        .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(main);

            }
        });
        */

        /**
         * Just to know onClick and Printing Hello Toast in Center.
         */
        // Toast toast = Toast.makeText(getApplicationContext(), "Click on FloatingActionButton to Load JSON", Toast.LENGTH_LONG);
        // toast.setGravity(Gravity.CENTER, 0, 0);
        // toast.show();




        if (InternetConnection.checkConnection(getApplicationContext())) {
            new GetDataTask().execute();
            // String  s = list.get(0).getName();


        } else {
            Toast.makeText(getApplicationContext(), "Internet Connection Not Available", Toast.LENGTH_LONG).show();
        }


        FloatingActionButton fab1 = (FloatingActionButton) findViewById(R.id.fab1);
        fab1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(@NonNull View view) {

                /**
                 * Checking Internet Connection
                 */
                if (InternetConnection.checkConnection(getApplicationContext())) {
                  //  new GetDataTask().execute();
                    recreate();

                    Toast.makeText(getApplicationContext(),"Re_Download........",Toast.LENGTH_LONG).show();
                } else {
                    Snackbar.make(view, "Internet Connection Not Available", Snackbar.LENGTH_LONG).show();
                }
            }
        });
    }

    /**
     * Creating Get Data Task for Getting Data From Web
     */
    class GetDataTask extends AsyncTask<Void, Void, Void> {

        ProgressDialog dialog;
        int jIndex;
        int x;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            /**
             * Progress Dialog for User Interaction
             */
            for(int i=0; i<1; i++){ //this make the duration of toast 1x, if you write i<2 so this make the duration 2x
                Toast toast =  Toast.makeText(getApplicationContext(),"Loading ........",Toast.LENGTH_LONG);
                // toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL,7,0);
               // toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();

            }


            x=list.size();

            if(x==0)
                jIndex=0;
            else
                jIndex=x;

            dialog = new ProgressDialog(Show_All_Registration.this);
            dialog.setTitle("Hey Wait Please...");
           // dialog.setTitle("Hey Wait Please..."+x);


            dialog.setMessage("Downloading Registrations...");
            dialog.show();
        }

        @Nullable
        @Override
        protected Void doInBackground(Void... params) {

            /**
             * Getting JSON Object from Web Using okHttp
             */
            JSONObject jsonObject = Controller.readAllData();

            try {
                /**
                 * Check Whether Its NULL???
                 */
                if (jsonObject != null) {
                    /**
                     * Check Length...
                     */
                    if(jsonObject.length() > 0) {
                        /**
                         * Getting Array named "contacts" From MAIN Json Object
                         */
                        JSONArray array = jsonObject.getJSONArray(Keys.KEY_CONTACTS);

                        /**
                         * Check Length of Array...
                         */


                        int lenArray = array.length();
                        if(lenArray > 0) {
                            for( ; jIndex < lenArray; jIndex++) {

                                /**
                                 * Creating Every time New Object
                                 * and
                                 * Adding into List
                                 */
                                MyDataModel model = new MyDataModel();

                                /**
                                 * Getting Inner Object from contacts array...
                                 * and
                                 * From that We will get Name of that Contact
                                 *
                                 */
                                JSONObject innerObject = array.getJSONObject(jIndex);
                                String name = innerObject.getString(Keys.KEY_NAME);
                                String country = innerObject.getString(Keys.KEY_COUNTRY);
//                                String image = innerObject.getString(Keys.KEY_IMAGE);
                                /**
                                 * Getting Object from Object "phone"
                                 */
                                //JSONObject phoneObject = innerObject.getJSONObject(Keys.KEY_PHONE);
                                //String phone = phoneObject.getString(Keys.KEY_MOBILE);

                                model.setName(name);
                                model.setCountry(country);
                                //                              model.setImage(image);

                                /**
                                 * Adding name and phone concatenation in List...
                                 */
                                list.add(model);
                            }
                        }
                    }
                } else {

                }
            } catch (JSONException je) {
              //  Log.i(JSONParserAll.TAG, "" + je.getLocalizedMessage());
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            dialog.dismiss();

            /**
             * Checking if List size if more than zero then
             * Update ListView
             */
            if(list.size() > 0) {


                adapter.notifyDataSetChanged();


             //get extras from Update_Remarks_Classic.class: the extra is id
                Intent i = getIntent();

                if(i.hasExtra("listViewPosition")){ //if extra is not null :
                    final   String modifiedIDposition=i.getStringExtra("listViewPosition");
                  final  int positionOfListview =Integer.parseInt(modifiedIDposition);

                    list_all_order.smoothScrollToPosition(positionOfListview-1);
                    Toast.makeText(getApplicationContext(),modifiedIDposition,Toast.LENGTH_LONG).show();


                  }else{
                    // Do something else : (Direct opening this class, list view setview to the last row:)
                    list_all_order.smoothScrollToPosition(adapter.getCount()-1);
                }


            } else {
                Snackbar.make(findViewById(R.id.show_all_layout), "No Data Found", Snackbar.LENGTH_LONG).show();
            }
        }
    }
}




==============================================================






৬। খ। ডাউনলোড ডাটা এক্স এম এল লেআউট :


<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context="bangladesh.donation.blood.Show_All_Registration"
    android:id="@+id/show_all_layout"
    >


    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/list_all_order">

    </ListView>


    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left|top"

        android:src="@android:drawable/stat_sys_download" />

</android.support.design.widget.CoordinatorLayout>




==============================================================


৬. গ। এ্যাডাপ্টার ক্লাস

package .....................;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Paint;
import android.net.Uri;
import android.support.v7.widget.CardView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;


/**
 * Created by user on 4/1/2018.
 */

public class ArrayAdapter_showAll_Registration extends ArrayAdapter<MyDataModel> {

   // SharedPreferences settings = getSharedPreferences("prefs", 0);


    SharedPreferences settings ;
    SharedPreferences.Editor editor ;


    List<MyDataModel> modelList;
    Context context;
    private LayoutInflater mInflater;
    List<String> listofItems;

    String searchkey1;
    String searchkey2;

    // Constructors
    public ArrayAdapter_showAll_Registration(Context context, List<MyDataModel> objects, String searchString1, String searchString2) {
        super(context, 0, objects);
        this.context = context;
        this.mInflater = LayoutInflater.from(context);
        modelList = objects;
        this.searchkey1=searchString1;
        this.searchkey2=searchString2;
    }

    @Override
    public MyDataModel getItem(int position) {
        return modelList.get(position);


    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {







        final ViewHolder vh;
        if (convertView == null) {
            View view = mInflater.inflate(R.layout.show_all_listitem_registration, parent, false);
            vh = ViewHolder.create((RelativeLayout) view);
            view.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
        }


        MyDataModel item = getItem(position);

      // vh.textViewName.setText(item.getName());
       //vh.textViewCountry.setText(item.getCountry());


        settings =context.getSharedPreferences("prefs", 0);
      //  editor = settings.edit();
        String courier2 = settings.getString("COURIER", "");
        String   customer_gmail=settings.getString("CUSTOMER_GMAIL","");






       final String id =item.getName();//this is the order id
       final String s =item.getCountry(); // this is the rest order



        if(s.contains(searchkey1)&& s.contains(searchkey2)) {

            vh.cardview.setVisibility(View.VISIBLE);


            //first this textview contains id
            vh.textViewName.setText(id); //this is the gmail as Customers registration ID
            //set phone link for mobile numbers :
            setAutolinkForPhoneWorkAround(vh.textViewName, id);


            //this is the second array line from net spreadsheet, this contains full order :
            String[] order = s.split("\\s*\\=\\s*");


            final String name = order[0];
            final String bloodgroup = order[1];
            final String phnNo = order[2];
            final String regDate = order[3];

            final String districtName = order[4];
            final String fullAddress = order[5];
            final String donorLastDate = order[6];


            //   final String date=order[7];//

            //textViewHouse//নাম
            //textViewDistrict//জিলা
            //textViewCourier//রক্তের গ্রুপ
            //crMobile//রেজি: তারিখ
            //srGmail//মোাবাইল নং
            //srMobile//শেষ রক্তদানের তারিখ
            //remark//পূর্ণঠিকানা

            vh.house.setText(name);
            vh.district.setText(districtName);

            vh.courier.setText(bloodgroup);
            vh.crMobile.setText(regDate);
            vh.srGmail.setText(phnNo);
            //   vh.date.setText(date);
            vh.srMobile.setText(donorLastDate);
            vh.remark.setText(fullAddress);

            //for printing the position of Listview :
            int pos = position + 1;
            vh.rowNumber.setText("" + pos);//the method of set an integer to setText method in a TextView


            //set phone link for mobile numbers :
            setAutolinkForPhoneWorkAround(vh.srGmail, phnNo);

        }else {
            vh.cardview.setVisibility(View.GONE);
        }





        ///for Search_Registration_classic , go through the main class  Search_Registration_classic and to uses adapter as a searchString:

        /*
        vh.district.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "Searching...", Toast.LENGTH_LONG).show();

                 Intent modify_intent = new Intent(context,Search_Registration_classic.class);
                modify_intent.putExtra("SearchInRegistration",district );

                context.startActivity(modify_intent);
                    }
                    });


        vh.courier.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "Searching...", Toast.LENGTH_LONG).show();

                Intent modify_intent = new Intent(context,Search_Registration_classic.class);
                modify_intent.putExtra("SearchInRegistration",courier );

                context.startActivity(modify_intent);



            }
        });

        vh.house.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "Searching...", Toast.LENGTH_LONG).show();

                Intent modify_intent = new Intent(context,Search_Registration_classic.class);
                modify_intent.putExtra("SearchInRegistration",house );

                context.startActivity(modify_intent);



            }
        });

        vh.srGmail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "Searching...", Toast.LENGTH_LONG).show();

                Intent modify_intent = new Intent(context,Search_Registration_classic.class);
                modify_intent.putExtra("SearchInRegistration",srGmail );

                context.startActivity(modify_intent);



            }
        });

        vh.date.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "Searching...", Toast.LENGTH_LONG).show();

                Intent modify_intent = new Intent(context,Search_Registration_classic.class);
                modify_intent.putExtra("SearchInRegistration",date );

                context.startActivity(modify_intent);



            }
        });

        vh.crMobile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "Searching...", Toast.LENGTH_LONG).show();

                Intent modify_intent = new Intent(context,Search_Registration_classic.class);
                modify_intent.putExtra("SearchInRegistration",crMobile );

                context.startActivity(modify_intent);



            }
        });


        vh.rowNumber.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "this is Temporary ID...", Toast.LENGTH_LONG).show();





            }
        });


        ///search order by customer ID :


        vh.textViewName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "Searching...", Toast.LENGTH_LONG).show();

                Intent modify_intent = new Intent(context,Search_Orders_classic.class);
                modify_intent.putExtra("SearchInOrders",id );

                context.startActivity(modify_intent);



            }
        });

        */









        return vh.rootView;
    }



    private static class ViewHolder {
        public final RelativeLayout rootView;

        public final TextView textViewName;
        public final TextView textViewCountry;
        public final CardView cardview;
        public final TextView date;
        public final TextView time;
        public final TextView house;
        public final TextView district;
        public final TextView courier;
        public final TextView catagory;

        public final TextView width;
        public final TextView  roll;
        public final TextView  total;
        public final TextView  crGmail;
        public final TextView  srGmail;
        public final TextView  crMobile;
        public final TextView srMobile;
        public final TextView remark;
        public final TextView rowNumber;



        private ViewHolder(RelativeLayout rootView, TextView textViewName, TextView textViewCountry, CardView cardview, TextView date, TextView time, TextView house, TextView district, TextView courier, TextView catagory,

                           TextView  width, TextView roll, TextView total, TextView crGmail, TextView srGmail, TextView crMobile, TextView srMobile, TextView remark, TextView rowNumber) {
            this.rootView = rootView;
            this.textViewName = textViewName;

            this.textViewCountry = textViewCountry;
            this.cardview=cardview;
            this.date = date;
            this.time = time;
            this.house = house;
            this.district = district;
            this.courier =courier;
            this.catagory =catagory;

            this.width=width;
            this.roll=roll;
            this.total=total;
            this.crGmail=crGmail;
            this.srGmail=srGmail;
            this.crMobile=crMobile;
            this.srMobile=srMobile;
            this.remark=remark;
            this.rowNumber=rowNumber;



        }

        public static ViewHolder create(RelativeLayout rootView) {
            TextView textViewName = (TextView) rootView.findViewById(R.id.textViewName);
            TextView textViewCountry = (TextView) rootView.findViewById(R.id.textViewCountry);
            CardView cardview=(CardView)rootView.findViewById(R.id.card_view1);

            TextView date = (TextView) rootView.findViewById(R.id.textViewDate);
           TextView time = (TextView) rootView.findViewById(R.id.textViewTime);
            TextView house = (TextView) rootView.findViewById(R.id.textViewHouse);
          TextView district = (TextView) rootView.findViewById(R.id.textViewDistrict);
           TextView courier = (TextView) rootView.findViewById(R.id.textViewCourier);
          TextView catagory = (TextView) rootView.findViewById(R.id.textViewCatagory);


            TextView width=(TextView)rootView.findViewById(R.id.width);
            TextView roll=(TextView)rootView.findViewById(R.id.roll);
            TextView total=(TextView)rootView.findViewById(R.id.total);
            TextView crGmail=(TextView)rootView.findViewById(R.id.crGmail);
            TextView srGmail=(TextView)rootView.findViewById(R.id.srGmail);
            TextView crMobile=(TextView)rootView.findViewById(R.id.crMobile);
            TextView srMobile=(TextView)rootView.findViewById(R.id.srMobile);
            TextView remark=(TextView)rootView.findViewById(R.id.remark);

            TextView rowNumber=(TextView)rootView.findViewById(R.id.rowNumber);


            return new ViewHolder(rootView, textViewName, textViewCountry, cardview, date, time, house,district,courier,catagory,
                    width, roll, total, crGmail, srGmail, crMobile,srMobile,remark, rowNumber);
        }
    }

    private void setAutolinkForPhoneWorkAround(TextView textView, final String phoneText){
        textView.setText(phoneText);
        textView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i =new Intent(Intent.ACTION_VIEW, Uri.parse("tel:"+phoneText));

                context.startActivity(i);
            }
        });
    }
}


==============================================================

ঘ। এ্যাডাপ্টার ক্লাস বার বার ব্যবহার করবে এরকম একটি টেক্সটভিউ সহকারে একটি লেআউট ।

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">

    <android.support.v7.widget.CardView
        android:id="@+id/card_view1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"

        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="30dp"
        android:layout_marginBottom="5dp"
        card_view:cardBackgroundColor="@color/QuranKuran"
        card_view:cardCornerRadius="5dp"
        card_view:contentPadding="5dp"
        card_view:contentPaddingTop="5dp"
        card_view:cardElevation="20dp"
        android:visibility="gone"
        >
        <LinearLayout

            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">


            <View
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_weight="1"/>



            <TextView
                android:textAppearance="?android:textAppearanceSmall"


                android:layout_width="wrap_content"
                android:layout_height="wrap_content"

                android:text="TID:"/>



            <TextView
                android:textAppearance="?android:textAppearanceSmall"

                android:id="@+id/rowNumber"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="1030"/>


        </LinearLayout>



    <LinearLayout

    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_centerVertical="true"
    android:layout_height="wrap_content"
    >

    <LinearLayout
        android:layout_marginTop="12dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:gravity="center_horizontal"
        >

        <TextView

            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:textAppearance="?android:textAppearanceSmall"

            android:text="ID:"
            android:textStyle="bold|italic"
            android:textColor="@color/black"


            />


    <TextView
        android:id="@+id/textViewName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:textAppearance="?android:textAppearanceSmall"
        tools:text="TextView"
        android:text="OrderID"
        android:textStyle="bold|italic"
        android:textColor="@color/black"


       />


    </LinearLayout>

    <TextView
        android:id="@+id/textViewCountry"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:textAppearance="?android:textAppearanceMedium"
        tools:text="TextView"
        android:autoLink="all"
        android:visibility="gone"

        />


        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="Date:"
                    android:textColor="@color/black"
                    android:textStyle="italic"
                    android:visibility="gone"
                    />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="নাম:"
                    android:textColor="@color/black"
                    android:textStyle="italic"/>


                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="FullAddress:"
                    android:textColor="@color/black"
                    android:textStyle="italic"
                    android:visibility="gone"
                    />


                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="জিলা:"
                    android:textColor="@color/black"
                    android:textStyle="italic"/>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="রক্তের গ্রুপ : "
                    android:textColor="@color/black"
                    android:textStyle="italic"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="Catagory:"
                    android:textColor="@color/black"
                    android:textStyle="italic"
                    android:visibility="gone"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="Width:"
                    android:textColor="@color/black"
                    android:textStyle="italic"
                    android:visibility="gone"/>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="@color/black"
                    android:textStyle="italic"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="roll"
                    android:visibility="gone"/>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="total"
                    android:textColor="@color/black"
                    android:textStyle="italic"
                    android:visibility="gone"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"

                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="তালিকাভুক্তির তারিখ:"
                    android:textColor="@color/black"
                    android:textStyle="italic"                    />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="মোবাইল নং :"
                    android:textColor="@color/black"
                    android:textStyle="italic"

                    />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"

                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="CustomerMobile"
                    android:textColor="@color/black"
                    android:textStyle="italic"
                    android:visibility="gone"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"

                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="শেষ রক্তদানের তরিখ:"
                    android:textColor="@color/black"
                    android:textStyle="italic"                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="পূর্ণ ঠিকানা:"
                    android:textColor="@color/black"
                    android:textStyle="italic"
                    />





            </LinearLayout>

  <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:layout_marginLeft="30dp">


                <TextView
                    android:id="@+id/textViewDate"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:textColor="@color/colorPrimary"
                    tools:text="date"
                    android:visibility="gone"

                    />

                <TextView
                    android:id="@+id/textViewHouse"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"

                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="নাম"

                    android:textColor="@color/colorBlue"
                    />
      <TextView
          android:id="@+id/textViewTime"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:textAppearance="?android:textAppearanceSmall"
            android:text="FulssAddress"
          android:textColor="@color/colorPrimary"
          android:visibility="gone"
          />

                <TextView
                    android:id="@+id/textViewDistrict"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textStyle="italic|bold"
                    android:textColor="@color/colorBlue"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:text="জিলা:"

                    />
                <TextView
                    android:id="@+id/textViewCourier"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:textAppearanceSmall"
                    tools:text="রক্তের গ্রুপ"
                    android:textStyle="italic|bold"
                    android:textColor="@color/colorBlue"
                    />
                <TextView
                    android:id="@+id/textViewCatagory"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="@color/colorPrimary"
                    android:textAppearance="?android:textAppearanceSmall"
                    tools:text="catagory"
                    android:visibility="gone"
                    />

                <TextView
                    android:id="@+id/width"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="@color/colorPrimary"
                    android:textAppearance="?android:textAppearanceSmall"
                    tools:text="width"
                    android:visibility="gone"
                    />

        <TextView
            android:id="@+id/roll"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/colorPrimaryDark"
            android:textAppearance="?android:textAppearanceSmall"
            android:text="roll"
            android:textStyle="bold"
            android:visibility="gone"
            />

        <TextView
            android:id="@+id/total"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
           android:textAppearance="?android:textAppearanceSmall"
            android:text="total"
            android:textColor="@color/colorPrimaryDark"
            android:textStyle="bold"
            android:visibility="gone"
            />
        <TextView
            android:id="@+id/crMobile"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:textAppearance="?android:textAppearanceSmall"
            android:text="রেজি:তারিখ"

            android:textColor="@color/colorBlue"
            />

        <TextView
            android:id="@+id/srGmail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:textAppearanceSmall"
            android:text="মোবাইল নং"
            android:textColor="@color/colorAccent"
            android:autoLink="all"
            />

        <TextView
            android:id="@+id/crGmail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:textAppearance="?android:textAppearanceSmall"
            android:text="textViewCrgmail"
            android:autoLink="email"
            android:textColor="@color/colorAccent"
            android:visibility="gone"
            />
        <TextView
            android:id="@+id/srMobile"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:textAppearance="?android:textAppearanceSmall"
            android:text="শেষ রক্তদানের তারিখ"

            android:textColor="@color/black"
            />
        <TextView
            android:id="@+id/remark"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:textAppearanceSmall"
            android:text="পূর্ণঠিকানা"


            android:textColor="@color/colorBlue"

            />

            </LinearLayout>







        </LinearLayout>




</LinearLayout>

    </android.support.v7.widget.CardView>
</RelativeLayout>



============================================
============================================

২। ওয়েব পার্ট  : 



জিমেইল আইডি দিয়ে গুগল  spreadsheet ওপেন করুন।   একটি ব্লাংক spreadsheet ওপেন করে যে কোন নাম দিন। এবার দুটি কলাম এর নাম দিন name এবং rate . 

এবার   এই spreadsheet এর উপরের দিক থেকে এ্যাড্রেস কপি করে আমাদের এই লেসনের উপরের দিকে যেখানে কন্ট্রোলার এর আলোচনা করা হয়েছে অর্থাৎ কন্ট্রোলার ক্লাস এর WA_URL  হিসেবে   যে   ইউআরএলটি রয়েছে সেটির অভ্যন্তরে ইউআরএল আইডি আছে, সেটি  মুছে দিয়ে  আপনার  spreadsheet  এর  ইউআর এল   থেকে আইডি কপি করে সেখানে পেষ্ট করে দিন। 

ধরি,  spreadsheet  এর  এ্যাড্রেস বারে  নিচের  এ্যাড্রেস লেখা আছে : 

https://docs.google.com/spreadsheets/d/1iBXaq-TQ-V9G40yYUpBdGueL00HCAA_6o88weTo9hlc/edit#gid=0


তাহলে এখানে আইডি হবে এটা : 1iBXaq-TQ-V9G40yYUpBdGueL00HCAA_6o88weTo9hlc




এরপর spreadsheet এর  মেনু থেকে tools > script editor  ওপেন করে যা লেখা থাকবে তা মুছে ফেলে  নিচের কোডটুকু কপি পেষ্ট করে দিন : 



function doGet(e) {

    var op = e.parameter.action;

    var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1jJm4G3o78I7E3wq7HrYUCsG5axDmVVu2TReoZibrsEM/edit#gid=0");
    var sheet = ss.getSheetByName("Sheet1");



    if (op == "insert")
        return insert_value(e, sheet);

    //Make sure you are sending proper parameters
    if (op == "read")
        return read_value(e, sheet);

    if (op == "update")
        return update_value(e, sheet);

    if (op == "delete")
        return delete_value(e, sheet);

    if (op == "readAll")
        return read_all(e, ss);

}




function read_all(request,ss){


  var output  = ContentService.createTextOutput(),
      data    = {};


   var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1VZh9F7HzJE21YiOtDSW6SDwSBA3XK3_DZtj519UWj80/edit#gid=0");
    var sheet = ss.getSheetByName("Sheet1");





  //Note : here sheet is sheet name , don't get confuse with other operation
   //   var sheet="sheet1";

  data.records = readData_(ss, sheet);

  var callback = request.parameters.callback;

  if (callback === undefined) {
    output.setContent(JSON.stringify(data));
  } else {
    output.setContent(callback + "(" + JSON.stringify(data) + ")");
  }
  output.setMimeType(ContentService.MimeType.JAVASCRIPT);

  return output;
}


function readData_(ss, sheetname, properties) {

  if (typeof properties == "undefined") {
    properties = getHeaderRow_(ss, sheetname);
    properties = properties.map(function(p) { return p.replace(/\s+/g, '_'); });
  }

  var rows = getDataRows_(ss, sheetname),
      data = [];

  for (var r = 0, l = rows.length; r < l; r++) {
    var row     = rows[r],
        record  = {};

    for (var p in properties) {
      record[properties[p]] = row[p];
    }

    data.push(record);

  }
  return data;
}



function getDataRows_(ss, sheetname) {
  var sh = ss.getSheetByName(sheetname);

  return sh.getRange(2, 1, sh.getLastRow() - 1, sh.getLastColumn()).getValues();
}


function getHeaderRow_(ss, sheetname) {
  var sh = ss.getSheetByName(sheetname);

  return sh.getRange(1, 1, 1, sh.getLastColumn()).getValues()[0];
}


//Recieve parameter and pass it to function to handle


function insert_value(request, sheet) {


    var id = request.parameter.id;
    var name = request.parameter.name;
    var country = request.parameter.country;


  var currRow = SpreadsheetApp.getActiveSheet().getActiveCell().getRow();

  var text = "noor";


  //for auto increment number :


   var AUTOINC_COLUMN = 0;
  var HEADER_ROW_COUNT = 1;

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var worksheet   = spreadsheet.getSheetByName("Sheet1");
  var rows        = worksheet.getDataRange().getNumRows();
  var vals        = worksheet.getSheetValues(1, 1, rows+1, 2);


  /////


  ///check if id already exist :

    var flag = 1;
    var lr = sheet.getLastRow();
    for (var i = 1; i <= lr; i++) {
        var id1 = sheet.getRange(i, 2).getValue();
        if (id1 == id) {
            flag = 0;
            var result = "Id - exist..";
        }
    }



  /////get the id not from the user but from the auto increment system described upper : here id means row number :
  //// otherwise if you want to get id from the user , so delete this line :
  //this registration script get id from customer ad their email id entered into app, so
  // this line is disabled: 

  //id = rows;

  /////




  //add new row with recieved parameter from client
    if (flag == 1) {


      //get a time stamp
      //change time stamp from a1:c1 to auto increment id for myfunction execute:
      //  var d = new Date();
      //  var currentTime = d.toLocaleString();
        var rowData = sheet.appendRow([ rows,id, name]);
        var result = "Web Registration Complete";
      
      
      
        //send Email: 
      var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = 2;   // Number of rows to process
  // Fetch the range of cells A2:B3
   var dataRange = sheet.getRange(startRow, 1, numRows, 7)
   // var dataRange = spreadSheet.getDataRange();
  
  
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (i in data) {
    var row = data[i];
    var emailAddress = row[6];  // First column
    var message = "RegistrationID="+rows+"=Customer Email:="+id+"="+name;       // Second column
    var subject = " A New Registration From ক্লাসিক সাইন এ্যাপ  ";
    MailApp.sendEmail(emailAddress, subject, message);
        
  }
      
      
      
      
    }
    result = JSON.stringify({

        "result": result

    });

    return ContentService
        .createTextOutput(result)
        .setMimeType(ContentService.MimeType.JAVASCRIPT);
}




//update function

function update_value(request, sheet) {

    var output = ContentService.createTextOutput();
    var id = request.parameter.id;
    var flag = 0;
    var country = request.parameter.name;
    var lr = sheet.getLastRow();
    for (var i = 1; i <= lr; i++) {
        var rid = sheet.getRange(i, 2).getValue();
        if (rid == id) {
            sheet.getRange(i, 3).setValue(country);
            var result = "value updated successfully";
            flag = 1;
        }
    }
    if (flag == 0)
        var result = "id not found";

    result = JSON.stringify({
        "result": result
    });

    return ContentService
        .createTextOutput(result)
        .setMimeType(ContentService.MimeType.JAVASCRIPT);


}




function delete_value(request, sheet) {

    var output = ContentService.createTextOutput();
    var id = request.parameter.id;
    var country = request.parameter.name;
    var flag = 0;



    var lr = sheet.getLastRow();
    for (var i = 1; i <= lr; i++) {
        var rid = sheet.getRange(i, 2).getValue();
        if (rid == id) {
            sheet.deleteRow(i);
            var result = "value deleted successfully";
            flag = 1;
        }

    }

    if (flag == 0)
        var result = "id not found";



    result = JSON.stringify({
        "result": result
    });

    return ContentService
        .createTextOutput(result)
        .setMimeType(ContentService.MimeType.JAVASCRIPT);

}


function read_value(request, sheet) {

    var id = request.parameter.id;
    var name;
    var record = {};
    //var place = request.parameter.place;

    var flag = 1;
    var lr = sheet.getLastRow();
    for (var i = 1; i <= lr; i++) {
        var id1 = sheet.getRange(i, 2).getValue();
        if (id1 == id) {
            flag = 0;

            name = sheet.getRange(i, 3).getValue();



            var result = JSON.stringify({
                "user": {
                    "id": id,
                    "name": name
                }

            });


        }

    }
    return ContentService
        .createTextOutput(result)
        .setMimeType(ContentService.MimeType.JAVASCRIPT);


}




এবার সেভ করে পাবলিশড করে দিন। পাবলিশড করার সময় আমার   জিমেইল এ্যাকাউন্টের অনুমতি চাইবে ওকে দিয়ে কন্টিনিউ করুন। এরপর এ্যাডভান্স এ ক্লিক করে পাবলিশড করুন। 



=========================================

=========================================


=========================================


নোট :  ১ ।  
AndroidManifast ফাইলে এ্যাপ্লিকেশন ট্যাগ এর বাইরে  নিচের তিনটি পারমিশন লিখতে হবে : 

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />



===================================

নোট : ২।    build Gradle ফাইলে নিচের Dependency  এর অভ্যন্তরে নিচের  dependency  গুলো যুক্ত করতে হবে : 

 compile 'com.android.support:design:28.0.0-beta01'
    compile 'com.squareup.okhttp:okhttp:2.7.5'
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.7.5'
    compile 'com.android.support:cardview-v7:28.0.0-beta01'

====================================

নোট : ৩ ।  

ক) spreadsheet লিখে গুগলে সার্চ দিলেই পাওয়া যাবে।  
খ)  নতুন spreadsheet নিয়ে যে কোন নাম দিয়ে সেভ দেওয়ার পর  file > share > advance   এ যাওয়ার পর who has access অপশনে চেঞ্জ সিলেক্ট করতে হবে এরপর সেখান থেকে On anyone with the link সিলেক্ট করে সেভ করতে হবে। 


==================================


------ 
Mohammad Noor Hossain.
facebook.com/noor.hossain.16