Friday, December 25, 2020

get data in activity

 package com.gkmaza.gujarati;


import android.annotation.SuppressLint;

import android.content.Context;

import android.content.Intent;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.graphics.Color;

import android.net.Uri;

import android.os.Bundle;

import android.os.Handler;

import android.util.Log;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.TextView;

import android.widget.Toast;


import com.getbase.floatingactionbutton.FloatingActionButton;

import com.google.android.gms.ads.AdRequest;

import com.google.android.gms.ads.AdView;

import com.google.android.gms.ads.InterstitialAd;

import com.google.android.gms.ads.MobileAds;

import com.google.android.gms.ads.initialization.InitializationStatus;

import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;

import com.google.android.material.navigation.NavigationView;

import com.google.android.material.snackbar.Snackbar;

import com.google.gson.Gson;


import java.io.IOException;

import java.util.ArrayList;

import java.util.List;


import androidx.annotation.NonNull;

import androidx.appcompat.app.ActionBarDrawerToggle;

import androidx.appcompat.app.AppCompatActivity;

import androidx.appcompat.widget.SearchView;

import androidx.appcompat.widget.Toolbar;

import androidx.core.view.GravityCompat;

import androidx.drawerlayout.widget.DrawerLayout;

import androidx.navigation.ui.AppBarConfiguration;

import androidx.recyclerview.widget.GridLayoutManager;

import androidx.recyclerview.widget.RecyclerView;

import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import network.ApiClient;

import network.ApiInterface;

import network.RestError;

import network.connectionManager;

import network.contact;

import network.data;

import network.quoteShow;

import offlineconnection.UserContract;

import offlineconnection.UserDbHelper;

import retrofit2.Call;

import retrofit2.Callback;

import retrofit2.Response;


public class home extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    RecyclerView recyclerView;

  recyclAdapter recyclAdapter;

    Context context=this;

    UserDbHelper userDbHelper;

    SQLiteDatabase sqLiteDatabase;

    Cursor cursor;

    FloatingActionButton add_quotes,view_quotes;

recyclAdapteroffline recyclAdapteroffline;

    SwipeRefreshLayout swipeRefreshLayout;

boolean flag;

    private List<contact> contacts;

    private ApiInterface apiInterface;

    DrawerLayout relativeLayout;

    boolean backtoexit=false;

    public List<model> modelList;

    AdView adView;

    private InterstitialAd interstitialAd;

    final LoaderDialog loaderDialog = new LoaderDialog();




    private AppBarConfiguration mAppBarConfiguration;




    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_home);


        Toolbar toolbar = findViewById(R.id.toolbar);

        setSupportActionBar(toolbar);

        MobileAds.initialize(this,"ca-app-pub-6020255471056041/9686541658");

        adView=findViewById(R.id.adView);

        MobileAds.initialize(this, new OnInitializationCompleteListener() {

            @Override

            public void onInitializationComplete(InitializationStatus initializationStatus) {


            }

        });

        AdRequest adRequest=new AdRequest.Builder().build();

        adView.loadAd(adRequest);

       /* interstitialAd=new InterstitialAd(this);

        interstitialAd.setAdUnitId("ca-app-pub-6020255471056041/9494969962");

        interstitialAd.loadAd(new AdRequest.Builder().build());

        interstitialAd.setAdListener(new AdListener(){

            @Override

            public void onAdClosed(){

                Toast.makeText(home.this, "close", Toast.LENGTH_SHORT).show();

            }

        });


        if (interstitialAd.isLoaded()){

            interstitialAd.show();

        }

        else{

            Toast.makeText(this, "not show", Toast.LENGTH_SHORT).show();


        }

*/

        DrawerLayout drawer = findViewById(R.id.drawer_layout);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(

                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);

        drawer.addDrawerListener(toggle);

        toggle.syncState();

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

        navigationView.setNavigationItemSelectedListener((NavigationView.OnNavigationItemSelectedListener) context);

        mAppBarConfiguration = new AppBarConfiguration.Builder(

                R.id.nav_home, R.id.nav_all_qoutes, R.id.nav_favorite,

                R.id.nav_rate_app, R.id.nav_share, R.id.nav_feedback)

                .setDrawerLayout(drawer)

                .build();

            swipeRefreshLayout=findViewById(R.id.swipelayout);

        recyclerView=findViewById(R.id.recycl);

        relativeLayout=findViewById(R.id.drawer_layout);

        //int rid=R.anim.layout_animation_right_to_left;

        //LayoutAnimationController animationController= AnimationUtils.loadLayoutAnimation(this,rid);


        recyclerView.setHasFixedSize(true);

add_quotes=findViewById(R.id.action_add);

view_quotes=findViewById(R.id.action_view);

view_quotes.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        Intent intent=new Intent(context,viewmyquotes.class);

        startActivity(intent);

        Toast.makeText(context, "View Quotes", Toast.LENGTH_SHORT).show();

    }

});


add_quotes.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {


        Toast.makeText(context, "Add Quotes", Toast.LENGTH_SHORT).show();

        Intent intent=new Intent(context,add_quotes.class);

        startActivity(intent);

    }

});


        recyclerView.setLayoutManager(new GridLayoutManager(this,2));

        if(connectionManager.checkconnection(getBaseContext())){

            flag=true;

            get_All();

            getonline();

        }else{

           getoffline();

            flag=false;

        }

        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {

            @Override

            public void onRefresh() {

                if(connectionManager.checkconnection(getBaseContext())){

                    flag=true;

                    get_msg_u();

                    get_All();

                    getonline();

                }else{

                    get_msg();

                    flag=false;

                    getoffline();

                    swipeRefreshLayout.setRefreshing(false);

                }

            }

        });



    }


    @SuppressLint("ResourceAsColor")

    private void get_msg() {

        Snackbar snackbar = Snackbar

                .make(relativeLayout, "No Internet Connection!", Snackbar.LENGTH_LONG)

                .setAction("RETRY", new View.OnClickListener() {

                    @Override

                    public void onClick(View view) {

                        if(connectionManager.checkconnection(getBaseContext())){

                            Intent intent=new Intent(getApplicationContext(),home.class);

                            startActivity(intent);

                            finish();

                        }

                        else{

                            Toast.makeText(getApplicationContext(), "Check Your Connection", Toast.LENGTH_SHORT).show();

                        }

                    }

                });

        View snackBarView = snackbar.getView();

        snackBarView.setBackgroundColor(Color.parseColor("#FF4081"));

        snackbar.setActionTextColor(Color.YELLOW);

        View sbView = snackbar.getView();

        TextView textView = (TextView) sbView.findViewById(R.id.snackbar_text);

        textView.setTextColor(Color.WHITE);

        snackbar.show();

    }

    private void get_All() {

        apiInterface= ApiClient.getClient().create(ApiInterface.class);

        Call<quoteShow> call = apiInterface.get_all_quote();

        call.enqueue(new Callback<quoteShow>() {

            @Override

            public void onResponse(Call<quoteShow> call, Response<quoteShow> response) {


                if (response.isSuccessful()) {

                   userDbHelper = new UserDbHelper(getApplicationContext());


                    sqLiteDatabase = userDbHelper.getReadableDatabase();

                    sqLiteDatabase.delete(UserContract.NewUserInfo.TABLE_NAME_Q,null,null);

                    for (int i=0;i<response.body().getRecords().size();i++){


                        String name = response.body().getRecords().get(i).getQuotesName();

                        String id = response.body().getRecords().get(i).getId();

                        String aname = response.body().getRecords().get(i).getAuthorName();

                        String status = response.body().getRecords().get(i).getStatus();

                        String cid = response.body().getRecords().get(i).getCategoryId();

                        String cname = response.body().getRecords().get(i).getCategoryName();


                        userDbHelper.addinformations_quotes(id, name, aname,status,cid,cname, sqLiteDatabase);

                        //Toast.makeText(getBaseContext(), "save", Toast.LENGTH_LONG).show();


                    } userDbHelper.close();

                    // recyclerView.setAdapter(recyclAdapter2);

                } else {

                    RestError errorResponse;

                    Gson gson = new Gson();

                    try {

                        errorResponse = gson.fromJson(response.errorBody().string(), RestError.class);

                        errorResponse.setError(true);

                        Toast.makeText(context, errorResponse.getMessage(), Toast.LENGTH_SHORT).show();

                        Log.e("Error", errorResponse.getMessage());

                    } catch (IOException e) {

                        e.printStackTrace();

                    }

                }


            }


            @Override

            public void onFailure(Call<quoteShow> call, Throwable t) {

                //loaderDialog.hideDialog();

                t.getCause();


            }

        }); }

    private void getoffline() {


        userDbHelper =new UserDbHelper(getApplicationContext());

        sqLiteDatabase = userDbHelper.getReadableDatabase();

        List<data> data = new ArrayList<>();

        String[] projeaction={UserContract.NewUserInfo.C_ID,UserContract.NewUserInfo.C_NAME,UserContract.NewUserInfo.C_DESC};

        cursor= sqLiteDatabase.query(UserContract.NewUserInfo.TABLE_NAME,projeaction,null,null,null,null,null);


        if(cursor.moveToFirst()){

            do{

                String id,name,desc;

                id=cursor.getString(0);

                name=cursor.getString(1);

                desc=cursor.getString(2);

                data dataProvaider=new data(id,name,desc);

                data.add(dataProvaider);



            }while(cursor.moveToNext());


        }

        recyclAdapteroffline=new recyclAdapteroffline(this,data);

        recyclerView.setAdapter(recyclAdapteroffline);


    }


    @SuppressLint("ResourceAsColor")

    private void get_msg_u() {

        Snackbar snackbar = Snackbar

                .make(relativeLayout, "Upto Date..!", Snackbar.LENGTH_LONG)

                .setAction("ok", new View.OnClickListener() {

                    @Override

                    public void onClick(View view) {

                        if(connectionManager.checkconnection(getBaseContext())){


                        }

                        else{

                            Toast.makeText(getApplicationContext(), "Check Your Connection !!", Toast.LENGTH_SHORT).show();

                        }

                    }

                });

        View snackBarView = snackbar.getView();

        snackBarView.setBackgroundColor(Color.parseColor("#00bfa5"));

        snackbar.setActionTextColor(Color.CYAN);

        View sbView = snackbar.getView();

        TextView textView = (TextView) sbView.findViewById(R.id.snackbar_text);

        textView.setTextColor(Color.WHITE);

        snackbar.show();

    }

    private void getonline() {

        loaderDialog.showDialog(context);

        apiInterface= ApiClient.getClient().create(ApiInterface.class);

        Call<contact> call=apiInterface.getdata();

        call.enqueue(new Callback<contact>() {

            @Override

            public void onResponse(Call<contact> call, Response<contact> response) {


                loaderDialog.hideDialog();

                if (response.isSuccessful()) {

                    recyclAdapter=new recyclAdapter(context,response.body());


                    userDbHelper = new UserDbHelper(getApplicationContext());

                    sqLiteDatabase = userDbHelper.getReadableDatabase();

                    sqLiteDatabase.delete(UserContract.NewUserInfo.TABLE_NAME,null,null);

                    for (int i=0;i<response.body().getRecords().size();i++){

                        String name = response.body().getRecords().get(i).getName();

                        String id = response.body().getRecords().get(i).getId();

                        String desc = response.body().getRecords().get(i).getDescription();


                        userDbHelper.addinformations(id, name, desc, sqLiteDatabase);

                        //Toast.makeText(getBaseContext(), "save", Toast.LENGTH_LONG).show();


                    } userDbHelper.close();

                    recyclerView.setAdapter(recyclAdapter);

                    recyclAdapter.notifyDataSetChanged();

                    swipeRefreshLayout.setRefreshing(false);

                }

                else{

                    RestError errorResponse;

                    Gson gson = new Gson();

                    try {

                        errorResponse = gson.fromJson(response.errorBody().string(), RestError.class);

                        errorResponse.setError(true);

                        Toast.makeText(context, errorResponse.getMessage(), Toast.LENGTH_SHORT).show();

                        Log.e("Error", errorResponse.getMessage());

                    } catch (IOException e) {

                        e.printStackTrace();

                    }

                }


            }


            @Override

            public void onFailure(Call<contact> call, Throwable t) {

                loaderDialog.hideDialog();

                t.getCause();


            }

        });

    }



    @Override

    public void onBackPressed() {

        if(backtoexit)

        {super.onBackPressed();

            return;

        }


        this.backtoexit=true;

        Toast.makeText(this,"Click Back again to Exit",Toast.LENGTH_LONG).show();

        new Handler().postDelayed(new Runnable() {

            @Override

            public void run() {


                backtoexit=false;

            }

        },2000);

    }

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main_menu,menu);

        final MenuItem menuItem=menu.findItem(R.id.action_search);

        final SearchView searchView= (SearchView) menuItem.getActionView();


        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override

            public boolean onQueryTextSubmit(String s) {


                return false;

            }


            @Override

            public boolean onQueryTextChange(String s) {

              if(flag==true){recyclAdapter.getFilter().filter(s);}

              else if(flag==false){

                  recyclAdapteroffline.getFilter().filter(s);

              }

                return false;

            }

        });


        return super.onCreateOptionsMenu(menu);

    }



private  List<contact.Record> filterr(List<contact.Record> p1 , String query){

            query=query.toLowerCase();

            final List<contact.Record> filtermodellist=new ArrayList<>();

            for(contact.Record item:p1){

                final  String text=item.getName().toLowerCase();

                if(text.startsWith(query)){

                    filtermodellist.add(item);

                }


            }


return  filtermodellist;

}



    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

        int i=item.getItemId();

        switch (i){

            case R.id.item_1:

                Intent intent=new Intent(context,about.class);

                startActivity(intent);

                this.finish();

                return true;

            default:

                return  super.onOptionsItemSelected(item);





        }



    }



    @Override

    public boolean onSupportNavigateUp()

    {

      return true;

    }


    @Override

    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {

        int id = menuItem.getItemId();


        if (id == R.id.nav_home) {

           Intent intent=new Intent(context,home.class);

            startActivity(intent);


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

            Intent intent=new Intent(context,recycle2.class);

            intent.putExtra("idname",0+"");

            intent.putExtra("fave",0+"");

            startActivity(intent);


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

            Intent intent=new Intent(context,recycle2.class);

            intent.putExtra("idname",0+"");

            intent.putExtra("fave",5+"");

            startActivity(intent);

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


            Intent i = new Intent(android.content.Intent.ACTION_VIEW);

            i.setData(Uri.parse("http://play.google.com/store/apps/details?id=com.gkmaza.gujarati"));

            startActivity(i);

           /* Intent shareIntent =   new Intent(android.content.Intent.ACTION_SEND);

            shareIntent.setType("text/plain");

            shareIntent.putExtra(Intent.EXTRA_SUBJECT,"Rate App");

 String app_url =Shared.link;

            shareIntent.putExtra(android.content.Intent.EXTRA_TEXT,app_url);

            startActivity(Intent.createChooser(shareIntent, "Gujarati Quotes"));

*/

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

            Intent shareIntent =   new Intent(android.content.Intent.ACTION_SEND);

            shareIntent.setType("text/plain");

            shareIntent.putExtra(Intent.EXTRA_SUBJECT,"Gujarati Suvichar/Quotes");

            String app_url = Shared.shareapp+Shared.link;

            shareIntent.putExtra(android.content.Intent.EXTRA_TEXT,app_url);

            startActivity(Intent.createChooser(shareIntent, "Gujarati Quotes"));


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

            //Toast.makeText(context, "Feedback Comming Soon..!!", Toast.LENGTH_SHORT).show();

Intent intent=new Intent(home.this,feedback.class);

startActivity(intent);

finish();

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        drawer.closeDrawer(GravityCompat.START);

        return true;


}





}


add dependacy

 


    implementation 'com.google.code.gson:gson:2.8.5'

    implementation 'com.squareup.retrofit2:retrofit:2.5.0'

    implementation 'com.google.android.gms:play-services-ads:18.3.0'

    implementation 'com.squareup.retrofit2:converter-gson:2.5.0'

    implementation 'com.squareup.retrofit2:converter-scalars:2.5.0'

    implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0'

    implementation 'com.squareup.okhttp3:okhttp:3.12.0'

    implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.19'


    implementation 'com.squareup.okhttp3:logging-interceptor:3.3.1'

add RestError.java

 package network;


import com.google.gson.annotations.Expose;

import com.google.gson.annotations.SerializedName;


public class RestError

{

    private boolean error;


    @SerializedName("status")

    @Expose

    private Integer status;

    @SerializedName("message")

    @Expose

    private String message;


    public RestError(String message) {

        this.message = message;

    }


    public boolean isError() {

        return error;

    }


    public void setError(boolean error) {

        this.error = error;

    }


    public String getMessage() {

        return message;

    }


    public void setMessage(String message) {

        this.message = message;

    }


}


add interface ApiInterface

 package network;


import retrofit2.Call;

import retrofit2.http.Body;

import retrofit2.http.Headers;

import retrofit2.http.POST;

import retrofit2.http.Query;


public interface ApiInterface

{

    String GET_CAT="readc.php";


   @Headers({"Content-Type: application/json","Accept: application/json"})

    @POST(GET_CAT)

    Call<contact> getdata();



}


Add StringConverter.java

 package network;



import androidx.annotation.NonNull;


import java.io.IOException;

import java.lang.annotation.Annotation;

import java.lang.reflect.Type;


import okhttp3.MediaType;

import okhttp3.RequestBody;

import okhttp3.ResponseBody;

import retrofit2.Converter;

import retrofit2.Retrofit;


class StringConverter extends Converter.Factory

{

    private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain");

    @Override

    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {

        if (String.class.equals(type)) {

            return new Converter<ResponseBody, String>() {

                @Override

                public String convert(@NonNull ResponseBody value) throws IOException {

                    return value.string();

                }

            };

        }

        return null;

    }


    @Override

    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations,

                                                          Annotation[] methodAnnotations, Retrofit retrofit) {


        if (String.class.equals(type)) {

            return new Converter<String, RequestBody>() {

                @Override

                public RequestBody convert(@NonNull String value) throws IOException {

                    return RequestBody.create(MEDIA_TYPE, value);

                }

            };

        }

        return null;

    }


}


Add TLSSocketFactory.java

 package network;


import java.io.IOException;

import java.net.InetAddress;

import java.net.Socket;

import java.security.KeyManagementException;

import java.security.NoSuchAlgorithmException;


import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLSocket;

import javax.net.ssl.SSLSocketFactory;


class TLSSocketFactory extends SSLSocketFactory

{

    private SSLSocketFactory delegate;


    public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {

        SSLContext context = SSLContext.getInstance("TLS");

        context.init(null, null, null);

        delegate = context.getSocketFactory();

    }


    @Override

    public String[] getDefaultCipherSuites() {

        return delegate.getDefaultCipherSuites();

    }


    @Override

    public String[] getSupportedCipherSuites() {

        return delegate.getSupportedCipherSuites();

    }


    @Override

    public Socket createSocket() throws IOException {

        return enableTLSOnSocket(delegate.createSocket());

    }


    @Override

    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {

        return enableTLSOnSocket(delegate.createSocket(s, host, port, autoClose));

    }


    @Override

    public Socket createSocket(String host, int port) throws IOException {

        return enableTLSOnSocket(delegate.createSocket(host, port));

    }


    @Override

    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {

        return enableTLSOnSocket(delegate.createSocket(host, port, localHost, localPort));

    }


    @Override

    public Socket createSocket(InetAddress host, int port) throws IOException {

        return enableTLSOnSocket(delegate.createSocket(host, port));

    }


    @Override

    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {

        return enableTLSOnSocket(delegate.createSocket(address, port, localAddress, localPort));

    }


    private Socket enableTLSOnSocket(Socket socket) {

        if (socket != null && (socket instanceof SSLSocket)) {

            ((SSLSocket) socket).setEnabledProtocols(new String[]{"TLSv1.1", "TLSv1.2"});

        }

        return socket;

    }


}


get data from Api Using Retrofit2 ApiClient.java

package network;


import java.security.KeyManagementException;

import java.security.NoSuchAlgorithmException;

import java.util.concurrent.TimeUnit;


import okhttp3.OkHttpClient;

import okhttp3.logging.HttpLoggingInterceptor;

import retrofit2.Retrofit;

import retrofit2.converter.gson.GsonConverterFactory;

import retrofit2.converter.scalars.ScalarsConverterFactory;



public class ApiClient

{

    private static final String BASE_URL="http://www.gkmaza.com/apps/gujarati_suvichar/";

    private static Retrofit retrofit=null;

    private static OkHttpClient client;

    public static Retrofit getClient()

    {

        if(retrofit==null)

        {

            HttpLoggingInterceptor interceptor=new HttpLoggingInterceptor();

            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

            try

            {

                client = new OkHttpClient.Builder()

                        .followRedirects(true)

                        .followSslRedirects(true)

                        .sslSocketFactory(new TLSSocketFactory())

                        .retryOnConnectionFailure(true)

                        .addInterceptor(interceptor)

                        .connectTimeout(30, TimeUnit.MINUTES)

                        .readTimeout(30, TimeUnit.MINUTES)

                        .addInterceptor(interceptor)

                        .build();


            }catch (KeyManagementException e)

            {

                e.printStackTrace();

            }catch (NoSuchAlgorithmException e)

            {

                e.printStackTrace();

            }

            retrofit=new Retrofit.Builder()

                    .baseUrl(BASE_URL)

                    .client(client)

                    .addConverterFactory(new StringConverter())

                    .addConverterFactory(ScalarsConverterFactory.create())

                    .addConverterFactory(GsonConverterFactory.create())

                    .build();


        }


        return retrofit;

    }

}

 

Thursday, November 19, 2020

PREMIUM Quotes App With Android Studio And Admob Ads

 


Quotes App Is An Android Application.Quotes App Has User-Friendly Interface With Easy To Manage. The Quote App Or Sayari App Are Stored In Firebase For Easy Editing And Better Performance.

Best Quotes App Is An Android Application. Quotes App Has User-Friendly Interface With Easy To Manage. The Quotes App Are Stored In Firebase For Easy Editing And Better Performance. Sayari App In Android Studio With Admob Ads And Firebase Realtime Database.



Premium Quotes APP

Only Rs. 499/-

Features


Android Side

  • Quotes With Category Wise
  • Latest Quotes
  • Copy or Share Quote with your friends and on Social Networks
  • Share Image with Quotes
  • Add to Favorite Mode
  • Latest UI with Material Design
  • Admob with Banner and Interstitial ads Integrated
  • App comply with GDPR
  • You can also change frequency on interstitial ad to show after number of click
  • Firebase Analytics
  • Easy Admin Panel – Firebase Backend
  • All Device Combability
  • Check Network Availability
  • MultiLanguage Supported (if your phone supports particular language)
  • Android Code Migrated to AndroidX
  • Android Studio Code (Recommended Android Studio Version – 3.3)


Admin Side

  1. Simple Admin Panel
  2. Easily Add Category
  3. Easily Add Quotes
  4. Quote of the day
  5. Edit and Delete Quotes, Author and Category
  6. Upload Unlimited Category and Quote
  7. Firebase Backend

What You Get:


  1. Full Android Source Code
  2. Full PHP Code of Server Side
  3. Document with Screen Shot
  • App Features
  • Amazing Swiping Cards View
  • Share As Screenshots With Branding
  • Swipe Right Save To Read Offline
  • Supports Video Embeds
  • Supports HTML tags & Links
  • Latest Admob Integrated
  • App Tour With How To Use App
  • Multi language Support
  • Post By Language And Categories
  • OneSignal Push Notifications
  • Easy To Make App In Minutes