Project Structure
All Activities Java
EventActivity.java
package com.oddpick.myapplication;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import org.w3c.dom.Text;
public class EventActivity extends AppCompatActivity {
private TextView title;
private TextView description;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event);
title = (TextView) findViewById(R.id.title);
description = (TextView) findViewById(R.id.description);
Intent iin= getIntent();
Bundle b = iin.getExtras();
title.setText(b.getString("title"));
description.setText(b.getString("description"));
}
}
LoginActivity.java
package com.oddpick.myapplication;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.RetryPolicy;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import java.util.HashMap;
import java.util.Map;
import com.oddpick.myapplication.app.AppConfig;
import com.oddpick.myapplication.app.AppController;
import org.json.JSONException;
import org.json.JSONObject;
public class LoginActivity extends AppCompatActivity {
private Button login;
private TextView register;
private TextView skip;
private EditText mobile;
private EditText password;
private String mob;
private String pass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
login = (Button) findViewById(R.id.button);
register = (TextView) findViewById(R.id.register);
skip = (TextView) findViewById(R.id.skip);
mobile = (EditText) findViewById(R.id.mobile);
password = (EditText) findViewById(R.id.password);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Intent homeIntent = new Intent(getApplicationContext(), MainActivity.class);
//startActivity(homeIntent);
mob = mobile.getText().toString().trim();
pass = password.getText().toString().trim();
checkLogin(mob, pass);
}
});
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent homeIntent = new Intent(getApplicationContext(), RegisterActivity.class);
startActivity(homeIntent);
}
});
skip.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent homeIntent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(homeIntent);
}
});
}
private void checkLogin(final String phone, final String password) {
// Tag used to cancel the request
String tag_string_req = "req_login";
StringRequest strReq = new StringRequest(Request.Method.POST,
AppConfig.URL_LOGIN, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
// Check for error node in json
if (!error) {
// user successfully logged in
// Create login session
// Now store the user in SQLite
String uid = jObj.getString("uid");
JSONObject user = jObj.getJSONObject("user");
String name = user.getString("name");
String email = user.getString("email");
String phone = user.getString("phone");
// Inserting row in users table
// Launch main activity
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
startActivity(intent);
finish();
} else {
// Error in login. Get the error message
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
protected Map<String, String> getParams() {
// Posting parameters to login url
Map<String, String> params = new HashMap<String, String>();
params.put("phone", mob);
params.put("password", pass);
return params;
}
};
int socketTimeout = 30000;//30 seconds - change to what you want
RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
strReq.setRetryPolicy(policy);
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
}
MainActivity.java
package com.oddpick.myapplication;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.RetryPolicy;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.oddpick.myapplication.adapters.Adapters;
import com.oddpick.myapplication.app.AppConfig;
import com.oddpick.myapplication.app.AppController;
import com.oddpick.myapplication.listeners.RecyclerItemClickListener;
import com.oddpick.myapplication.pojo.Datas;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private List<Datas> list = new ArrayList<>();
private RecyclerView recyclerView;
private Adapters mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mAdapter = new Adapters(list);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
recyclerView.addOnItemTouchListener(
new RecyclerItemClickListener(getApplicationContext(), new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Intent homeIntent = new Intent(getApplicationContext(), EventActivity.class);
homeIntent.putExtra("title", list.get(position).getTitle());
homeIntent.putExtra("description", list.get(position).getDescription());
startActivity(homeIntent);
}
})
);
getData();
}
public void getData(){
String tag_string_req = "req_data";
StringRequest strReq = new StringRequest(Request.Method.POST,
AppConfig.URL_POST, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_SHORT).show();
try {
JSONArray jsonArray = new JSONArray(response);
for (int i=0; i< jsonArray.length() ;i++){
JSONObject jsonObject = jsonArray.getJSONObject(i);
String title1=jsonObject.getString("title");
String description1=jsonObject.getString("description");
Datas datas = new Datas(title1, description1);
list.add(datas);
// Toast.makeText(MainActivity.this, items.get(i).getTitle(), Toast.LENGTH_SHORT).show();
}
mAdapter.notifyDataSetChanged();
// Check for error node in json
} catch (JSONException e) {
// JSON error
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
protected Map<String, String> getParams() {
// Posting parameters to login url
Map<String, String> params = new HashMap<String, String>();
return params;
}
};
int socketTimeout = 30000;//30 seconds - change to what you want
RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
strReq.setRetryPolicy(policy);
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
}
SplashActivity.java
package com.oddpick.myapplication;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
/**
* Design and developed by pongodev.com
*
* ActivitySplash is created to display welcome screen.
* Created using AppCompatActivity.
*/
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// Configuration in Android API below 21 to set window to full screen.
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
// Create loading to wait for few second before displaying ActivityHome
new Loading().execute();
}
// Asynctask class to process loading in background
public class Loading extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... voids) {
try {
Thread.sleep(3000);
}catch(InterruptedException ie){
ie.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// When progress finished, open ActivityHome
Intent homeIntent = new Intent(getApplicationContext(), LoginActivity.class);
startActivity(homeIntent);
// overridePendingTransition(R.anim.open_next, R.anim.close_main);
}
}
// Configuration in Android API 21 to set window to full screen.
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
if (hasFocus) {
getWindow().getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
}
}
Other Java Files
Adapters.java
package com.oddpick.myapplication.adapters;/**
* Created by Shahin Abdulla on 5/26/2016.
*/
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.oddpick.myapplication.R;
import com.oddpick.myapplication.pojo.Datas;
import java.util.List;
public class Adapters extends RecyclerView.Adapter<Adapters.MyViewHolder> {
private List<Datas> list;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView title, description;
public MyViewHolder(View view) {
super(view);
title = (TextView) view.findViewById(R.id.title);
description = (TextView) view.findViewById(R.id.description);
}
}
public Adapters(List<Datas> moviesList) {
this.list = moviesList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.event_list, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Datas movie = list.get(position);
holder.title.setText(movie.getTitle());
holder.description.setText(movie.getDescription());
}
@Override
public int getItemCount() {
return list.size();
}
}
AppConfig.java
package com.oddpick.myapplication.app;
/**
* Created by Shahin Abdulla on 10/19/2015.
*/
public class AppConfig {
public static String URL_LOGIN = "http://innova.oddpick.com/login.php";
public static String URL_REGISTER = "http://innova.oddpick.com/register.php";
public static String URL_POST = "http://innova.oddpick.com/posts.php";
}
AppController.java
package com.oddpick.myapplication.app;
/**
* Created by Shahin Abdulla on 10/18/2015.
*/
import android.app.Application;
import android.text.TextUtils;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
public class AppController extends Application {
public static final String TAG = AppController.class.getSimpleName();
private RequestQueue mRequestQueue;
private static AppController mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public static synchronized AppController getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req, String tag) {
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
getRequestQueue().add(req);
}
public <T> void addToRequestQueue(Request<T> req) {
req.setTag(TAG);
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
}
RecyclerItemClickListener.java
package com.oddpick.myapplication.listeners;
/**
* Created by Shahin Abdulla on 9/29/2015.
*/
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;
public interface OnItemClickListener {
public void onItemClick(View view, int position);
}
GestureDetector mGestureDetector;
public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override public boolean onSingleTapUp(MotionEvent e) {
return true;
}
});
}
@Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildPosition(childView));
return true;
}
return false;
}
@Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
Datas.java
package com.oddpick.myapplication.pojo;
/**
* Created by Shahin Abdulla on 9/24/2016.
*/
public class Datas {
private String title, description;
public Datas() {
}
public Datas(String title, String description) {
this.title = title;
this.description = description;
}
public String getTitle() {
return title;
}
public void setTitle(String name) {
this.title = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Layout xml Files
activity_event.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.oddpick.myapplication.EventActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/title"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/description"
/>
</LinearLayout>
activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.oddpick.myapplication.LoginActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="phone"
android:ems="10"
android:id="@+id/mobile"
android:hint="Mobile Number"
android:layout_weight="1"
android:layout_margin="15dp"
android:layout_gravity="center"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"
android:id="@+id/password"
android:hint="Password"
android:layout_weight="1"
android:layout_margin="15dp"
android:layout_gravity="center"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Login"
android:id="@+id/button"
android:layout_weight="1"
android:layout_margin="15dp"
android:layout_gravity="center"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Register"
android:id="@+id/register"
android:layout_gravity="center"
android:layout_weight="1"
android:layout_margin="15dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Skip"
android:id="@+id/skip"
android:layout_weight="1"
android:layout_margin="15dp"
android:layout_gravity="center"/>
</LinearLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:showIn="@layout/activity_main"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical" />
</RelativeLayout>
activity_splash.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#DDD"
tools:context=".SplashActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="InnovaDen"
android:id="@+id/textView2"
android:textSize="50sp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
event_list.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:clickable="true"
android:background="?android:attr/selectableItemBackground"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:textSize="16dp"
android:textStyle="bold"
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
/>
<TextView
android:id="@+id/description"
android:layout_below="@id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
</RelativeLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.oddpick.myapplication">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".app.AppController"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity" />
<activity android:name=".SplashActivity"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".LoginActivity" />
<activity android:name=".RegisterActivity" />
<activity android:name=".EventActivity"></activity>
</application>
</manifest>
Explanations
- For each API end points you have to send some POST data
register.php : "email", "name", "phone" and "password"
posts.php: no POST data required
- create RegisterActivity yourself by referring LoginActivity
- Don't forget to change the package name and class names if necessary when you copy files to your project.
- You need to add third party library using gradle dependencies in build.Gradle(Module app) file
compile 'com.mcxiaoke.volley:library:1.0.18'compile 'com.android.support:recyclerview-v7:23.0.1'
Comment your doubts and suggestions below, Happy coding.