DEV'S

SMSReplier - V1.0 - Service - Intent Share - Phone - WhiteList - ReplyLog Addon - Part1

MainActivity.java

package com.dev.cts.smsreplierv10;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends ActionBarActivity {

    private LoginFragment loginFragment;
    private RegisterFragment registerFragment;

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

        ViewPager pager = (ViewPager)findViewById(R.id.pager);
        loginFragment = new LoginFragment();
        registerFragment = new RegisterFragment();
        MyPagerAdapter myPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
        pager.setAdapter(myPagerAdapter);

        /*
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.frame,new LoginFragment());
        fragmentTransaction.commit();

        */

    }

    private class MyPagerAdapter extends FragmentPagerAdapter{

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            if (position == 0){
                return loginFragment;
            }else if (position == 1){
                return registerFragment;
            }

            return null;
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            if (position == 0){
                return "Login";
            }else if (position == 1){
                return "Register";
            }

            return null;
        }
    }

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

        return true;
    }

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

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_register) {

            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

LoginFragement.java

package com.dev.cts.smsreplierv10;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

import com.dev.cts.utils.SmsReplier;

/**
 * A simple {@link Fragment} subclass.
 */
public class LoginFragment extends Fragment implements View.OnClickListener{

    private EditText pin;

    public LoginFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        ViewGroup viewGroup = (ViewGroup)inflater.inflate(R.layout.fragment_login, container, false);
        Button loginButton = (Button)viewGroup.findViewById(R.id.login_btn);
        pin = (EditText)viewGroup.findViewById(R.id.pin_edit);
        loginButton.setOnClickListener(this);

        return viewGroup;
    }

    @Override
    public void onClick(View v) {
        if (pin.getText().toString().equals(SmsReplier.getPin(getActivity()))){
            Intent intent = new Intent(getActivity(),SMSReplierActivity.class);
            startActivity(intent);
            getActivity().finish();
        }else{
            SmsReplier.displayToast(getActivity(),"Sorry, Wrong PIN Entered!!!");
        }

    }
}

RegisterFragment.java

package com.dev.cts.smsreplierv10;

import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.Toast;

import com.dev.cts.utils.SmsReplier;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

/**
 * A simple {@link Fragment} subclass.
 */
public class RegisterFragment extends Fragment {

    private ImageView imageView;
    public static final int IMG_REQ_CODE = 11111;
    public static final int IMG_REQ_CODE_FILE = 11112;
    private Uri imgUri = null;
    private EditText mail,phone,lastName,firstName,pin1,pin2;

    public RegisterFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        //return inflater.inflate(R.layout.fragment_register, container, false);
        ViewGroup viewGroup = (ViewGroup)inflater.inflate(R.layout.fragment_register, container, false);

        Spinner genderSpinner = (Spinner)viewGroup.findViewById(R.id.gender_spin);
        imageView = (ImageView)viewGroup.findViewById(R.id.mypic);
        pin1 = (EditText)viewGroup.findViewById(R.id.enter_pin_1);
        pin2 = (EditText)viewGroup.findViewById(R.id.enter_pin_2);
        firstName = (EditText)viewGroup.findViewById(R.id.firstname_edit);
        lastName = (EditText)viewGroup.findViewById(R.id.lastname_edit);
        phone = (EditText)viewGroup.findViewById(R.id.phone_edit);
        mail = (EditText)viewGroup.findViewById(R.id.email_edit);
        Button registerBtn = (Button)viewGroup.findViewById(R.id.register_btn);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_dropdown_item,getResources().getStringArray(R.array.gender_array));

        genderSpinner.setAdapter(adapter);

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

        registerBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (pin1.getText().toString().length() == 4){
                    if (pin1.getText().toString().equals(pin2.getText().toString())){
                        //Save
                        SmsReplier.setPin(getActivity(),pin1.getText().toString());
                        SmsReplier.setFirstName(getActivity(),firstName.getText().toString());
                        SmsReplier.setLastName(getActivity(),lastName.getText().toString());
                        SmsReplier.setEmail(getActivity(),mail.getText().toString());
                        SmsReplier.setPhone(getActivity(),phone.getText().toString());
                        if (imgUri != null) {
                            SmsReplier.setPhoto(getActivity(), imgUri.getPath());
                        }
                        SmsReplier.displayToast(getActivity(),"Saved Successfully");

                    }else {
                        SmsReplier.displayToast(getActivity(),"PIN does not match");
                    }
                }else{
                    SmsReplier.displayToast(getActivity(),"PIN should be 4 digit longer");
                }
            }
        });

        Bundle bundle = getArguments();
        if (bundle!=null){
            pin1.setText(SmsReplier.getPin(getActivity()));
            pin2.setText(SmsReplier.getPin(getActivity()));
            firstName.setText(SmsReplier.getFirstName(getActivity()));
            lastName.setText(SmsReplier.getLastName(getActivity()));
            phone.setText(SmsReplier.getPhone(getActivity()));
            mail.setText(SmsReplier.getEmail(getActivity()));
            genderSpinner.setSelection(SmsReplier.getGender(getActivity()));
            String imgLink = SmsReplier.getPhoto(getActivity());

            if (!imgLink.equals(SmsReplier.DEFAULT_VALUE)){
                Toast.makeText(getActivity().getBaseContext(), "" + imgLink, Toast.LENGTH_LONG).show();
                imgUri = Uri.fromFile(new File(imgLink));

                ContentResolver contentResolver = getActivity().getContentResolver();
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(contentResolver,imgUri);
                    imageView.setImageBitmap(bitmap);

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

            }

        }

        return viewGroup;
    }

    private void displayDialogChoice(){

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        //builder.setTitle("Select");
        String[] items = new String[] {"From Camera","From Files"};
        builder.setItems(items,new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (which == 0){
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT,setUriForCamera());
                    startActivityForResult(intent, IMG_REQ_CODE);
                }else{
                    //
                    Intent intent = new Intent();
                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(Intent.createChooser(intent,"Pick from"),IMG_REQ_CODE_FILE);
                }
            }
        });

        builder.setCancelable(true);

        AlertDialog alertDialog = builder.create();
        alertDialog.show();

    }

    private Uri setUriForCamera(){
        File smsReplierImages = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"SMSReplier");

        if (!smsReplierImages.exists()){
            smsReplierImages.mkdirs();
        }
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("ddMMyyyy_HHmmss", Locale.ENGLISH);
        String fileName = simpleDateFormat.format(calendar.getTime());

        String myProfile = fileName+".jpg";
        File profilePic = new File(smsReplierImages.getPath()+File.separator+myProfile);
        imgUri = Uri.fromFile(profilePic);
        return imgUri;
    }

    private Uri setUriForFile(Uri uri){

        File smsReplierImages = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"SMSReplier");

        if (!smsReplierImages.exists()){
            smsReplierImages.mkdirs();
        }
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("ddMMyyyy_HHmmss", Locale.ENGLISH);
        String fileName = simpleDateFormat.format(calendar.getTime());

        String myProfile = fileName+".jpg";
        File profilePic = new File(smsReplierImages.getPath()+File.separator+myProfile);
        imgUri = Uri.fromFile(profilePic);

        FileOutputStream out = null;
        try {
            ContentResolver contentResolver = getActivity().getContentResolver();
            Bitmap bmp = MediaStore.Images.Media.getBitmap(contentResolver,uri);
            out = new FileOutputStream(profilePic);
            bmp.compress(Bitmap.CompressFormat.JPEG, 25, out); // bmp is your Bitmap instance
            // PNG is a lossless format, the compression factor (100) is ignored
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return imgUri;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == IMG_REQ_CODE){
            // Toast.makeText(this,""+resultCode,Toast.LENGTH_LONG).show();

            if (resultCode == getActivity().RESULT_OK){
                showImage();
            }

        }else if (requestCode == IMG_REQ_CODE_FILE){
            // Toast.makeText(this,""+resultCode,Toast.LENGTH_LONG).show();

            if (resultCode == getActivity().RESULT_OK){
                setUriForFile(data.getData());
                Toast.makeText(getActivity().getBaseContext(), "" + imgUri.getEncodedPath(), Toast.LENGTH_LONG).show();
                showImage();
            }

        }
    }

    private void showImage(){
        Toast.makeText(getActivity().getBaseContext(), "" + imgUri.getEncodedPath(), Toast.LENGTH_LONG).show();
        ContentResolver contentResolver = getActivity().getContentResolver();
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(contentResolver,imgUri);
            imageView.setImageBitmap(bitmap);
            SmsReplier.setPhoto(getActivity(),imgUri.getEncodedPath());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

SMSReplierActivity.java

package com.dev.cts.smsreplierv10;

import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.MediaStore;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v7.app.ActionBarDrawerToggle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import com.dev.cts.utils.FragmentConnector;
import com.dev.cts.utils.SmsDB;
import com.dev.cts.utils.SmsReplier;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;

import ezvcard.Ezvcard;
import ezvcard.VCard;
import ezvcard.io.text.VCardReader;

public class SMSReplierActivity extends ActionBarActivity implements AdapterView.OnItemClickListener,FragmentConnector{

    private ActionBarDrawerToggle actionBarDrawerToggle;
    private LinearLayout navLayout;
    private DrawerLayout drawerLayout;
    private FragmentTransaction fragmentTransaction;
    private SMSListFragment smsListFragment;
    private SMSComposeFragment smsComposeFragment;
    private WhiteListFragment whiteListFragment;
    private ARLogFragment arLogFragment;
    private RegisterFragment registerFragment;
    private FragmentManager fragmentManager;
    private ImageView userIcon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_smsreplier);
        drawerLayout = (DrawerLayout)findViewById(R.id.drawerlayout);
        navLayout = (LinearLayout)findViewById(R.id.navlist);
        userIcon = (ImageView)findViewById(R.id.profile_pic);
        ListView drawerList = (ListView)findViewById(R.id.drawer_list);
        SimpleAdapter adapter = new SimpleAdapter(this,prepareMenues(),R.layout.drawer_list_box,new String[]{SmsReplier.ICON,SmsReplier.TEXT},new int[]{R.id.menu_icon,R.id.menu_name});
        drawerList.setAdapter(adapter);

        actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,R.string.opendrawer,R.string.closedrawer){
            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        ContentResolver contentResolver = getContentResolver();
                        try {
                            Bitmap bitmap = MediaStore.Images.Media.getBitmap(contentResolver,Uri.fromFile(new File(SmsReplier.getPhoto(SMSReplierActivity.this))));
                            userIcon.setImageBitmap(bitmap);

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

                    }
                });
            }
        };
        drawerLayout.setDrawerListener(actionBarDrawerToggle);
        drawerList.setOnItemClickListener(this);

        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(true);

        actionBar.setTitle(getString(R.string.app_name));

        fragmentManager = getSupportFragmentManager();
        Bundle bundle = getIntent().getExtras();
        String action = getIntent().getAction();
        String type = getIntent().getType();
        /*
                //To see what is inside a bundle
                for (String key : bundle.keySet()) {
                    Object value = bundle.get(key);
                    Log.d("TAG", String.format("%s %s (%s)", key,
                            value.toString(), value.getClass().getName()));
                }
                */
        loadMainListView();
        if (Intent.ACTION_SEND.equals(action) && type != null && bundle !=null) {
            if ("text/x-vcard".equals(type)) {

                Uri uri = (Uri) bundle.get(Intent.EXTRA_STREAM);
                ContentResolver cr = getContentResolver();
                InputStream stream = null;
                try {
                    stream = cr.openInputStream(uri);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                VCardReader vCardReader = new VCardReader(stream);
                VCard vCard = null;
                try {
                    while ((vCard = vCardReader.readNext()) != null) {
                        //do something with the VCard before reading the next one
                        //VCard vCard = Ezvcard.parse(data).first();
                       if (vCard.getTelephoneNumbers().size() > 0){
                           Log.i("TAG", "vdata: " + vCard.getTelephoneNumbers().get(0).getText());
                           Log.i("TAG", "vdata: " + vCard.getFormattedName().getValue());

                           SmsDB db = new SmsDB(this);
                           db.open();
                           db.insertWhiteListNum(vCard.getTelephoneNumbers().get(0).getText().replace("-","").replaceAll("\\s+",""),vCard.getFormattedName().getValue());
                           db.close();
                           SmsReplier.displayToast(this,"Phone number successfully added to WhiteList - No AutoReply would be sent to this number");

                           loadWhiteListView();
                       }else{
                           SmsReplier.displayToast(this,"This contact does not contain phone number..Nothing added");
                       }

                    }
                    vCardReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }else if (SmsDB.AR_SMS_MSG.equals(action) && bundle !=null){

            loadARLogView();
        }

    }

    private void loadMainListView(){
        fragmentTransaction = fragmentManager.beginTransaction();
        smsListFragment = new SMSListFragment();
        fragmentTransaction.replace(R.id.fragmentholder,smsListFragment);
        fragmentTransaction.commit();
    }

    private void loadWhiteListView(){
        fragmentTransaction = fragmentManager.beginTransaction();
        whiteListFragment = new WhiteListFragment();
        fragmentTransaction.replace(R.id.fragmentholder,whiteListFragment);
        fragmentTransaction.addToBackStack(SmsReplier.WL_FRAGMENT);
        fragmentTransaction.commit();
    }

    private void loadWhiteListView(Uri contentUri){
        fragmentTransaction = fragmentManager.beginTransaction();
        whiteListFragment = new WhiteListFragment();
        //whiteListFragment.updateContact(this,contentUri);
        fragmentTransaction.replace(R.id.fragmentholder,whiteListFragment);
        fragmentTransaction.commit();
    }

    private void loadComposeView(){
        smsComposeFragment = new SMSComposeFragment();
        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragmentholder, smsComposeFragment);
        fragmentTransaction.addToBackStack(SmsReplier.SMSCOMPOSE_FRAGMENT);
        fragmentTransaction.commit();
    }

    private void loadARLogView(){
        arLogFragment = new ARLogFragment();
        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragmentholder, arLogFragment);
        fragmentTransaction.addToBackStack(SmsReplier.AR_LOG_FRAGMENT);
        fragmentTransaction.commit();
    }

    private void loadComposeView(long smsId){
        smsComposeFragment = new SMSComposeFragment();
        Bundle bundle = new Bundle();
        bundle.putLong(SmsDB.SMS_ID,smsId);
        smsComposeFragment.setArguments(bundle);
        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragmentholder, smsComposeFragment);
        fragmentTransaction.addToBackStack(SmsReplier.SMSCOMPOSE_FRAGMENT);
        fragmentTransaction.commit();
    }

    private void loadRegisterEditView(){
        registerFragment = new RegisterFragment();
        Bundle bundle = new Bundle();
        bundle.putInt(SmsReplier.REG_ACTION, SmsReplier.EDIT);
        registerFragment.setArguments(bundle);
        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragmentholder, registerFragment);
        fragmentTransaction.addToBackStack(SmsReplier.REG_FRAGMENT);
        fragmentTransaction.commit();
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        actionBarDrawerToggle.syncState();
    }

    private ArrayList<HashMap<String,Object>> prepareMenues(){
        ArrayList<HashMap<String,Object>> menus = new ArrayList<HashMap<String,Object>>();
        HashMap<String,Object> hm = new HashMap<String, Object>();
        hm.put(SmsReplier.ICON,R.drawable.dataanalytics1);
        hm.put(SmsReplier.TEXT,"Home");

        menus.add(hm);

        hm = new HashMap<String, Object>();
        hm.put(SmsReplier.ICON,R.drawable.clock136);
        hm.put(SmsReplier.TEXT,"Add New");

        menus.add(hm);

        hm = new HashMap<String, Object>();
        hm.put(SmsReplier.ICON,R.drawable.time36);
        hm.put(SmsReplier.TEXT,"Settings");

        menus.add(hm);

        hm = new HashMap<String, Object>();
        hm.put(SmsReplier.ICON,R.drawable.done2);
        hm.put("text","White List");

        menus.add(hm);

        hm = new HashMap<String, Object>();
        hm.put(SmsReplier.ICON,R.drawable.dataanalytics);
        hm.put(SmsReplier.TEXT,"Reply Log");

        menus.add(hm);

        hm = new HashMap<String, Object>();
        hm.put(SmsReplier.ICON,R.drawable.inspiration);
        hm.put(SmsReplier.TEXT,"My Location");

        menus.add(hm);

        hm = new HashMap<String, Object>();
        hm.put(SmsReplier.ICON,R.drawable.dataanalytics1);
        hm.put(SmsReplier.TEXT,"My Account");

        menus.add(hm);

        return menus;
    }

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

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

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }else if (id == android.R.id.home){
            if (drawerLayout.isDrawerOpen(navLayout)){
                drawerLayout.closeDrawer(navLayout);
            }else{
                drawerLayout.openDrawer(navLayout);
            }
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        menu.setHeaderTitle("Do you want to ?");
        menu.add(Menu.NONE,1,0,"Edit");
        menu.add(Menu.NONE,2,0,"Delete");
        super.onCreateContextMenu(menu, v, menuInfo);

        //super.onCreateContextMenu(menu, v, menuInfo);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        if (item.getItemId() == 1) {
            loadComposeView(info.id);
        }else if (item.getItemId() == 2){
            smsListFragment.deleteSmsReply(info.position,info.id);
        }

        return super.onContextItemSelected(item);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        drawerLayout.closeDrawer(navLayout);

        switch (position){
            case 0:
                loadMainListView();
                break;
            case 1:
                loadComposeView();
                break;
            case 2:
                //loadComposeView();
                break;
            case 3:
                loadWhiteListView();
                break;
            case 4:
                loadARLogView();
                break;
            case 5:

                break;
            case 6:
                loadRegisterEditView();
                break;
        }
    }

    @Override
    public void getCallBackFromFragment(String fragmentName) {
        if (fragmentName.equals(SmsReplier.SMSLIST_FRAGMENT)) {
            loadComposeView();
        }else if (fragmentName.equals(SmsReplier.SMSCOMPOSE_FRAGMENT)){
            fragmentManager.popBackStack();
        }

    }
}

SMSListFragment.java

package com.dev.cts.smsreplierv10;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.ToggleButton;

import com.dev.cts.utils.FragmentConnector;
import com.dev.cts.utils.SmsDB;
import com.dev.cts.utils.SmsReplier;

/**
 * A simple {@link Fragment} subclass.
 */
public class SMSListFragment extends Fragment implements View.OnClickListener,AdapterView.OnItemClickListener,CompoundButton.OnCheckedChangeListener{

    private FragmentConnector fragmentConnector;
    private SmsDB smsDB;
    private ListView smsListView;
    private SimpleCursorAdapter simpleCursorAdapter;
    private ToggleButton smsOnOff;

    public SMSListFragment() {
        // Required empty public constructor
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        smsDB = new SmsDB(getActivity());
        smsDB.open();
        if (activity instanceof FragmentConnector){
            fragmentConnector = (FragmentConnector)getActivity();
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
       // return inflater.inflate(R.layout.fragment_smslist, container, false);

        ViewGroup viewGroup = (ViewGroup)inflater.inflate(R.layout.fragment_smslist,container,false);
        Button compose = (Button)viewGroup.findViewById(R.id.compose);

        smsListView = (ListView)viewGroup.findViewById(R.id.smslistview);
        smsOnOff = (ToggleButton)viewGroup.findViewById(R.id.smsonoff);
        smsOnOff.setOnCheckedChangeListener(this);
        smsListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        Cursor cursor = smsDB.getAllSmsReplies();
        simpleCursorAdapter = new SimpleCursorAdapter(getActivity(),android.R.layout.simple_list_item_single_choice,cursor,new String[]{SmsDB.SMS_TITLE},new int[]{android.R.id.text1});
        smsListView.setAdapter(simpleCursorAdapter);
        smsListView.setOnItemClickListener(this);
        getActivity().registerForContextMenu(smsListView);
        restoreSelectionIfAny();
        compose.setOnClickListener(this);
        return viewGroup;
    }

    @Override
    public void onClick(View v) {
        fragmentConnector.getCallBackFromFragment(SmsReplier.SMSLIST_FRAGMENT);
    }

    @Override
    public void onDetach() {
        super.onDetach();
        smsDB.close();
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        smsDB.setSelectedSmsReply(id);
        smsOnOff.setChecked(true);
        startService();
    }

    private void restoreSelectionIfAny(){
        Cursor cursor = smsDB.getSelectedSmsReply();
        cursor.moveToFirst();
        long selectedId = -1;
        if (cursor.getCount() > 0) {
           selectedId  = cursor.getLong(cursor.getColumnIndex(SmsDB.SMS_ID));
           startService();
        }else {
           stopService();
        }
        cursor.close();
        Cursor listCursor = simpleCursorAdapter.getCursor();
        listCursor.moveToFirst();

            for (int i = 0; i < listCursor.getCount(); i++) {
                if (selectedId == listCursor.getLong(listCursor.getColumnIndex(SmsDB.SMS_ID))) {
                    smsListView.setItemChecked(i, true);
                    smsOnOff.setChecked(true);

                }else{
                    smsListView.setItemChecked(i,false);
                }

                listCursor.moveToNext();
            }

    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (!isChecked){
            smsDB.setAllUnselected();
            restoreSelectionIfAny();
        }
    }

    public void deleteSmsReply(int position,long smsId){
        if(smsListView.isItemChecked(position)){
           SmsReplier.displayToast(getActivity(),"Sorry active SMSReply message can not be deleted");
        }else{
            smsDB.deleteSmsReply(smsId);
            Cursor cursor = smsDB.getAllSmsReplies();
            simpleCursorAdapter.changeCursor(cursor);
            SmsReplier.displayToast(getActivity(),"Message successfully deleted");
        }
    }

    private void startService(){
        Intent intent = new Intent(getActivity(),SMSService.class);
        getActivity().startService(intent);
    }

    private void stopService(){
        Intent intent = new Intent(getActivity(),SMSService.class);
        getActivity().stopService(intent);
    }
}

SMSComposFragment.java

package com.dev.cts.smsreplierv10;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

import com.dev.cts.utils.FragmentConnector;
import com.dev.cts.utils.SmsDB;
import com.dev.cts.utils.SmsReplier;

/**
 * A simple {@link Fragment} subclass.
 */
public class SMSComposeFragment extends Fragment implements View.OnClickListener {

    private FragmentConnector fragmentConnector;
    private EditText composeField,titleField;
    private long smsId = -1;

    public SMSComposeFragment() {
        // Required empty public constructor
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        if (activity instanceof FragmentConnector){
            fragmentConnector = (FragmentConnector)getActivity();
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        ViewGroup viewGroup = (ViewGroup) inflater.inflate(R.layout.fragment_smscompose, container, false);
        Button back = (Button)viewGroup.findViewById(R.id.back);
        Button save = (Button)viewGroup.findViewById(R.id.save);
        titleField = (EditText)viewGroup.findViewById(R.id.title_edit);
        composeField = (EditText)viewGroup.findViewById(R.id.compose_edt);
        back.setOnClickListener(this);
        save.setOnClickListener(this);
        Bundle bundle = getArguments();
        if (bundle != null){
            smsId = bundle.getLong(SmsDB.SMS_ID);
            SmsDB smsDB = new SmsDB(getActivity());
            smsDB.open();
            Cursor cursor = smsDB.getSmsReplyById(smsId);
            cursor.moveToFirst();
            titleField.setText(cursor.getString(cursor.getColumnIndex(SmsDB.SMS_TITLE)));
            composeField.setText(cursor.getString(cursor.getColumnIndex(SmsDB.SMS_MESSAGE)));
            cursor.close();
            smsDB.close();
        }
        return viewGroup;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){

            case R.id.back:
                fragmentConnector.getCallBackFromFragment(SmsReplier.SMSCOMPOSE_FRAGMENT);
                break;
            case R.id.save:
                if (composeField.getText().toString().length() > 0 && titleField.getText().toString().length() > 0){
                    SmsDB smsDB = new SmsDB(getActivity());
                    smsDB.open();
                    if (smsId == -1) {

                        smsDB.insertSmsReply(titleField.getText().toString(), composeField.getText().toString());

                    }else{
                        smsDB.updateSmsReply(smsId,titleField.getText().toString(), composeField.getText().toString());
                    }
                    smsDB.close();
                    fragmentConnector.getCallBackFromFragment(SmsReplier.SMSCOMPOSE_FRAGMENT);
                }else{
                    SmsReplier.displayToast(getActivity(),"Empty fields not allowed");
                }
                break;
        }
    }
}

FragmentConnector.java

package com.dev.cts.utils;

/**
 * Created by megha on 02/03/15.
 */
public interface FragmentConnector {

      public void getCallBackFromFragment(String fragmentName);
}

Android

2018-11-27 21:26:06
1) Android Videos
2018-07-09 06:40:27
2) 09 Jul - Classroom Videos
2018-07-06 21:15:16
3) Recommended Videos
2018-07-06 21:00:45
4) Classroom Videos
2018-06-21 23:15:31
5) ViewPager TabStrip - TabLayout
2018-06-21 22:19:12
6) AsyncTask Filedownload
2018-06-21 19:54:27
7) Service Connection - Bind Service
2018-06-21 03:08:05
8) Instrumentation Test
2018-06-20 22:10:24
9) ApiDoc - Shopping List App
2018-06-20 22:08:56
10) AsyncTask - PreferenceManager - Example
2018-06-20 20:02:07
11) Fragments - RecyclerView Examples UnitTesting- Part 4
2018-06-20 19:59:57
12) Fragments - RecyclerView Examples -Database - Part 3
2018-06-20 19:59:00
13) Fragments - RecyclerView Examples - Part 2
2018-06-20 19:52:33
14) Fragments - RecyclerView Examples - Part 1
2018-06-19 23:52:14
15) Customize Adapter Example
2018-06-19 22:58:07
16) SimpleAdapter - HashMap Data Type
2018-06-19 03:39:01
17) ListView Add-Edit Example
2018-06-19 02:25:02
18) OptionMenu - Background - Shape
2018-06-18 23:53:27
19) SetActivityForResult Example
2018-06-18 21:33:01
20) Android Button Event
2018-06-18 03:19:58
21) Android Calculator View - Activity LifeCycle
2018-06-15 02:59:14
22) ViewPager - TabLayout Example
2018-06-15 00:14:08
23) Broadcast Receiver SMSManager
2018-06-14 22:58:22
24) Android Location Aware Apps - OnScreen Permission
2018-06-14 05:13:06
25) Sqlite Example - SimpleCursor Adapter
2018-06-14 03:03:36
26) Fragment - NavigationDrawer Example
2018-06-13 22:51:12
27) WebService POST
2018-06-13 05:07:48
28) WebService GET Example
2018-06-13 03:26:20
29) Service - Broadcast Receiver - SimpleAdapter
2018-06-12 23:00:54
30) ListView Add Edit Delete
2018-06-12 04:40:31
31) Background - SharedPreferences
2018-06-12 03:15:15
32) ActionBar - Option Menu
2018-06-12 01:05:30
33) RelativeLayout - ScrollView - Intent -Bundle
2018-06-11 03:38:21
34) Calculator App - Part 2
2018-06-11 00:19:59
35) Calculator Layout - Part 1
2018-05-15 03:07:50
36) Kotlin - Functional Programming Best Practices
2018-05-15 01:10:02
37) Shopping App - Kotlin - Companion Object
2018-05-14 23:51:41
38) Shopping App - Kotlin - Java SAM Interface To Lambda
2018-05-14 20:58:14
39) ShoppingList App - Api Doc
2018-05-14 01:03:11
40) Kotlin - Activities - UI Building - WebService - AsyncTask
2018-05-13 23:53:26
41) Kotlin Classes - Inheritance
2018-01-24 01:18:09
42) IOS - Performance Tuning - Best Practices
2018-01-24 00:07:33
43) Google API Pricing Plan
2018-01-24 00:03:21
44) Firebase Integration - App Analytics
2018-01-23 03:39:46
45) Profiling - Best Practices - Service - Broadcast Receiver - Document -PDF
2018-01-23 03:24:36
46) Broadcast Receiver - Profiling - Unregister - Reduce Memory Leak
2018-01-23 00:20:06
47) Background Service - Use Of LocationListener - Run Time Permission Check - Best Practice
2018-01-22 22:39:07
48) Android Memory Profiling - Performance Improvement - Handler - Runnable
2018-01-22 21:24:46
49) Android Performance Improvement Techniques - PDF Document
2018-01-22 04:50:44
50) Best Practice To Add Smooth View Pan And Communicate Between Activities
2018-01-22 02:50:35
51) Layout Technique - Activity LifeCycle
2017-12-11 05:23:14
52) ShoppingList App - Fragment - Part 5
2017-12-11 05:08:05
53) Feedback
2017-12-11 03:25:52
54) ShoppingList App - RecyclerView - Part 4
2017-12-11 00:27:38
55) ShoppingList App - DrawerLayout - Part 3 - Drawables - Menus - Gradle Configs
2017-12-11 00:23:30
56) ShoppingList App - DrawerLayout - Part 2 - Layouts
2017-12-11 00:20:50
57) ShoppingList App - DrawerLayout - Part 1
2017-12-10 21:17:56
58) ShoppingList App - Api Calls
2017-12-08 03:32:57
59) App - AsyncTast Part 2
2017-12-08 01:32:57
60) App - AsyncTast Part 1
2017-12-07 23:06:12
61) WebService GET - JSON Parsing
2017-12-07 04:51:25
62) Service And Broadcast Receiver
2017-12-06 22:49:06
63) Sqlite DB Example - ListView - Complex Form
2017-12-06 00:23:16
64) ListView - Adapters
2017-12-05 22:44:14
65) ActionBar Option Menu
2017-12-05 03:22:37
66) Multiple Activities
2015-11-19 02:45:01
67) Generate APK
2015-11-18 09:47:41
68) ShoppingList - Cloud App - WebService POST - Final
2015-11-17 13:29:54
69) Creating Swipe Views With Tabs Using ViewPager And TabLayout
2015-11-17 08:00:24
70) TabHost Using Fragment
2015-11-17 03:41:10
71) ShoppingList - Cloud App - WebService POST Example
2015-11-16 03:02:07
72) Camera - Gallery - Intent Calling - Customised Adapter
2015-11-13 08:36:20
73) Android Broadcast Receiver - SMS And Call
2015-11-12 13:17:25
74) WebService Example - HttpURLConnection Example
2015-11-12 13:11:57
75) Android Location Services - Foreground And Background Example
2015-11-11 23:04:58
76) ShoppingList App - Sqlite
2015-11-09 23:23:00
77) ShoppingList App - Continued
2015-11-09 04:09:50
78) ListView - ShoppingList App
2015-11-08 22:23:23
79) Android Layouts - Revisit
2015-03-25 04:05:46
80) Overriding Theme - ActionBar And Tab
2015-03-14 02:45:58
81) SMSReplier - V1.0 - Service - Intent Share - Phone - WhiteList - ReplyLog Addon - Part4
2015-03-14 02:44:07
82) SMSReplier - V1.0 - Service - Intent Share - Phone - WhiteList - ReplyLog Addon - Part3
2015-03-14 02:34:48
83) SMSReplier - V1.0 - Service - Intent Share - Phone - WhiteList - ReplyLog Addon - Part2
2015-03-14 02:30:01
84) SMSReplier - V1.0 - Service - Intent Share - Phone - WhiteList - ReplyLog Addon - Part1
2015-03-12 02:04:35
85) SMSReplier - V1.0 - Broadcast Receiver - Foreground Notification - Persistency Add-on - Part 2
2015-03-12 01:59:08
86) SMSReplier - V1.0 - Broadcast Receiver - Foreground Notification - Persistency Add-on - Part 1
2015-03-11 01:24:43
87) WebService -HTTP GET - AsyncTask - XML Parsing
2015-03-10 01:22:20
88) GoogleMap V2 - LocationListener - GPS
2015-03-09 01:51:33
89) SMS And Call Broadcast Receiver
2015-03-06 01:25:52
90) WebService - HTTP POST - AsyncTask - JSON Parsing
2015-03-05 01:18:38
91) WebService Introduction - GET - AsyncTask - JSON Parsing
2015-03-04 00:39:34
92) AsyncTask Example - Loading Image From Server
2015-03-03 00:15:21
93) SqliteDB Integration - SMSReplier V1.0 - Continued
2015-03-02 01:39:20
94) SMSList - Compose Fragment - FragmentBackStack - SMSReplier V1.0 - Continued...
2015-02-28 00:45:24
95) Post Login - DrawerLayout - Menu System - SMSReplier V1.0 Continued
2015-02-27 01:26:30
96) ViewPager - Tab - PreferenceManager Add On - Moving Everything To Fragment -SMSReplier V1.0 Continued
2015-02-25 02:56:09
97) Camera - Bitmap Add On - SMSReplier V1.0 - Continued
2015-02-25 01:29:05
98) SMSReplier - V1.0 - Registration Form
2015-02-24 03:56:38
99) Introduction To Service And BroadcastReceiver - IntentFilter
2015-02-23 00:57:08
100) Communicating Fragments - Bundle - Interface
2015-02-20 02:01:03
101) Navigation Drawer - Fragment Indroduction
2015-02-18 00:40:37
102) ListView - CustomAdapter With ViewHolder
2015-02-18 00:37:09
103) ListView - SimpleCursorAdapter Example
2015-02-16 04:13:55
104) ListView With SqliteDB - Add -Edit - Delete - Retrive
2015-02-13 23:07:36
105) OptionsMenu And ContextMenu With ListView
2015-02-13 01:40:46
106) ArrayAdapter And SimpleAdapter - ListView Example
2015-02-11 04:22:29
107) Forward And Reverse Bundling Objects Between Activities
2015-02-11 00:16:14
108) Bundle - Parceling Objects Between Activities
2015-02-10 00:34:05
109) ScrollView - PreferenceManager
2015-02-09 03:49:48
110) MultiActivity - AndroidManifest - Intent Introduction
2015-02-09 00:33:52
111) ClickListeners - Object Initialisation - Toast
2015-02-08 23:35:56
112) Bitmap From SD Card
2015-02-07 03:26:37
113) Android Layout Tricks - RelativeLayout
2015-02-06 23:04:29
114) Android Layout Tricks - LinearLayout
2015-02-05 20:47:58
115) UI Stack And Activity LifeCycle
2015-02-04 21:04:55
116) Working With Android Studio
2015-02-04 20:52:49
117) Java - OOP Concept - A Revisit
2014-12-08 22:11:38
118) Maintaining Login State - A Simple Approach
2014-12-07 21:03:53
119) 9 Patch Image Background
2014-12-05 04:25:48
120) WebService - JSON Example From 10.0.2.2 - Localhost
2014-12-03 03:30:10
121) VideoView - Media Controller
2014-12-03 02:52:15
122) Google Map V2 - Location Listener - Display Current Location - Check GPS Status
2014-12-02 23:12:16
123) Google Map V2 Integration
2014-12-02 04:22:51
124) Implicit Intent MIME Type - Camera - Gallery
2014-12-01 23:41:14
125) Camera - Implicit Intent - External Storage Example
2014-12-01 03:01:45
126) WebService - Google Map API WebService Example
2014-11-27 04:22:52
127) Google API Key, KeyStore, Certificate SHA1 Fingerprints
2014-11-27 03:59:46
128) Navigation Drawer - ActionBarDrawerToggle Example
2014-11-26 03:39:20
129) Notification From Service
2014-11-25 03:33:52
130) WebView Example
2014-11-24 00:37:52
131) Saving Item State - Fragment Master Detail Flow Final
2014-11-23 11:43:21
132) Package - Apk Suppress Lint Error
2014-11-21 22:49:09
133) AsyncTask Introduction - Load Image from URL
2014-11-21 05:15:40
134) GridView Example
2014-11-21 03:44:34
135) Location Aware Apps - GPS_PROVIDER - NETWORK_PROVIDER - Introduction
2014-11-20 03:20:22
136) SMSReplier Ver1.3 With Broadcast Receiver
2014-11-19 03:25:18
137) SMSReplier Ver1.2 Using Fragments And SQLite
2014-11-18 05:10:34
138) SMSReplier Ver1.1 Using Fragments - A Modular Approach
2014-11-17 05:21:15
139) ActionBar Tab - Fragment - ViewPager - Lisview - Compose Message
2014-11-15 04:43:26
140) APK - Android Application Package Process
2014-11-15 03:43:55
141) View Fragment And Pager - An Image Gallery Example
2014-11-13 04:07:42
142) Button,Checkbox With Image Background
2014-11-12 04:49:54
143) SMSReplier Ver1.0
2014-11-12 03:10:49
144) BroadcastReceiver With Permission
2014-11-11 03:06:20
145) BroadcastReceiver - Service - Example
2014-11-10 05:21:10
146) Background Service Example
2014-11-10 03:47:35
147) Runtime UI View Generation
2014-11-10 03:30:14
148) Shopping List App Version 3.1 - Shopping Object - Shopping Adapter - Custom Data View Binding
2014-11-10 00:01:53
149) Spinner Example - Dropdown - ArrayAdapter
2014-11-08 01:20:13
150) Shopping List App Version 3.0 - SQlite - CRUD
2014-11-07 03:16:33
151) Shopping List App Version 2.9 - SQlite - SimpleCursorAdapter
2014-11-06 03:08:08
152) Shopping List App Version 2.2 - JSONAdapter (custom) Addon
2014-11-05 04:12:28
153) Customising Adapter From BaseAdapter
2014-11-04 04:46:19
154) Shopping List App Version 2.1 - Alert Dialog Addon
2014-11-04 01:25:04
155) Shopping List App Version 2.1 - View-Edit-Delete Addon
2014-11-03 03:16:51
156) Json Revisit
2014-11-02 23:07:09
157) PreferenceManager Revisit
2014-10-31 03:19:16
158) Shopping List App Version 2.0 - PreferenceManager Add On - Save List
2014-10-30 03:42:19
159) Shopping List App Version 1.0 - Menu-onActivityResult-ListActivity
2014-10-30 02:18:46
160) SharedPreference Example
2014-10-29 22:17:27
161) Option Menu And Context Menu Example
2014-10-29 02:57:14
162) MultiActivity With OnActivityResult Example
2014-10-28 03:09:56
163) Bundle Example
2014-10-27 03:06:53
164) ListView - SimpleAdapter Example
2014-10-27 01:35:15
165) CoreJava Questions & Answers
2014-10-26 22:37:58
166) ListView - ArrayAdapter Example - Continued
2014-10-25 03:32:33
167) ListView - ArrayAdapter Example
2014-10-25 00:18:15
168) Calculator App
2014-10-23 03:14:37
169) Calculator Layout
2014-10-23 00:01:20
170) Event-listeners Example
2014-10-21 03:45:26
171) Android MultiActivity Example
2014-10-20 23:05:09
172) Activity Life Cycle Example
2014-10-20 23:03:17
173) Inheritance Scenario Wrt To Activity
2014-10-20 05:17:13
174) Android HelloWorld From Base
2014-10-20 01:49:59
175) Java Array And ArrayList
2014-10-19 23:06:25
176) Java Basics 1
2014-10-18 05:03:46
177) Hello World Java

© Vasudev.H / Email: tech3in@live.com