Android Working with Popup Menu

/res/menu/popup_login.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/itemLoginAdmin"
        android:title="@string/login_admin" />
    <item android:id="@+id/itemLoginUser"
        android:title="@string/login_user" />
</menu>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    Button button;

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

        button= (Button) findViewById(R.id.buttonLogin);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PopupMenu popupMenu=new PopupMenu(getBaseContext(),v);
                popupMenu.getMenuInflater().inflate(R.menu.popup_login,popupMenu.getMenu());
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        if (item.getItemId()==R.id.itemLoginAdmin)
                        {
                            Toast.makeText(getBaseContext(),"Admin",Toast.LENGTH_LONG).show();
                            return true;
                        }
                        else if (item.getItemId()==R.id.itemLoginUser)
                        {
                            Toast.makeText(getBaseContext(),"User",Toast.LENGTH_LONG).show();
                            return true;
                        }

                        return false;
                    }
                });

                popupMenu.show();
            }
        });
    }
}

References
https://github.com/mhdr/AndroidSamples/tree/master/026

Android ListView with Contextual Action Mode

/res/menu/custom_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/itemShare"
        android:title="@string/share"
        android:icon="@drawable/ic_share_white_24dp" />
    <item android:id="@+id/itemDelete"
        android:title="@string/delete"
        android:icon="@drawable/ic_delete_white_24dp" />
</menu>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    ListView listViewCountries;
    ArrayList<String> countries=new ArrayList<>();
    ArrayList<String> selections=new ArrayList<>();

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

        String[] temp1=getResources().getStringArray(R.array.countries);

        for (String c:temp1)
        {
            countries.add(c);
        }

        listViewCountries= (ListView) findViewById(R.id.listViewCountries);
        final ArrayAdapter arrayAdapter=new ArrayAdapter(getBaseContext(),android.R.layout.simple_list_item_1,countries);
        listViewCountries.setAdapter(arrayAdapter);

        listViewCountries.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);

        listViewCountries.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
            @Override
            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
                if (checked)
                {
                    selections.add(countries.get(position));
                }
                else {
                    selections.remove(countries.get(position));
                }

                mode.setTitle(selections.size() + " Selected");
            }

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                getMenuInflater().inflate(R.menu.custom_menu,menu);
                return true;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

                if (item.getItemId()==R.id.itemDelete)
                {

                    for (String i:selections)
                    {
                        countries.remove(i);
                    }

                    arrayAdapter.notifyDataSetChanged();
                    mode.finish();

                    return true;
                }

                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {
                selections.clear();
            }
        });


    }
}

References
https://github.com/mhdr/AndroidSamples/tree/master/025

Android Working with Contextual Action Mode

/res/menu/custom_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/itemDelete"
        android:title="@string/delete"
        android:icon="@drawable/ic_delete_black_24dp" />
    <item android:id="@+id/itemShare"
        android:title="@string/share"
        android:icon="@drawable/ic_share_black_24dp" />
</menu>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    ImageView imageView;
    ActionMode actionMode;

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

        imageView= (ImageView) findViewById(R.id.imageView);

        imageView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {

                if (actionMode==null)
                {
                    actionMode=startActionMode(new android.view.ActionMode.Callback() {
                        @Override
                        public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {

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

                            return true;
                        }

                        @Override
                        public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
                            mode.setTitle("Item Selected");
                            return true;
                        }

                        @Override
                        public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {

                            if (item.getItemId()==R.id.itemShare)
                            {
                                Toast.makeText(getApplicationContext(),"Share",Toast.LENGTH_LONG).show();
                                return true;
                            }
                            else if (item.getItemId()==R.id.itemDelete)
                            {
                                Toast.makeText(getApplicationContext(),"Delete",Toast.LENGTH_LONG).show();
                                return true;
                            }

                            return false;
                        }

                        @Override
                        public void onDestroyActionMode(android.view.ActionMode mode) {
                            actionMode=null;
                        }
                    });

                    return true;
                }

                return false;
            }
        });
    }
}

References
https://github.com/mhdr/AndroidSamples/tree/master/024

Configure Let’s Encrypt for Apache on Ubuntu

sudo apt-get install python-letsencrypt-apache 
letsencrypt --apache
nano /etc/apache2/apache2.conf
<VirtualHost *:443>
	SSLEngine on
	SSLCertificateKeyFile /etc/letsencrypt/live/dl.mhdr.ir/privkey.pem
	SSLCertificateFile /etc/letsencrypt/live/dl.mhdr.ir/cert.pem
	SSLCertificateChainFile /etc/letsencrypt/live/dl.mhdr.ir/chain.pem
    DocumentRoot "/var/www/html/dl"
    ServerName dl.mhdr.ir
</VirtualHost>
service apache2 restart

PPA

$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-apache

note : only the last VitualHost will be detected by letsencrypt
References
https://certbot.eff.org/#ubuntuxenial-apache
https://www.digitalocean.com/community/tutorials/how-to-use-apache-http-server-as-reverse-proxy-using-mod_proxy-extension
https://letsencrypt.org/

Android Handling Click Events of Floating Context Menu

MainActivity.java

public class MainActivity extends AppCompatActivity {

    ListView listViewCities;
    ArrayList<String> cities=new ArrayList<>();
    ArrayAdapter<String> arrayAdapter;

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

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

        String[] temp=getResources().getStringArray(R.array.cities);
        for (String city:temp)
        {
            cities.add(city);
        }

        arrayAdapter=new ArrayAdapter<String>(getBaseContext(), R.layout.custom_listview_layout,R.id.textViewCity,cities);

        listViewCities.setAdapter(arrayAdapter);

        registerForContextMenu(listViewCities);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        getMenuInflater().inflate(R.menu.contextual_menu,menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {

        AdapterView.AdapterContextMenuInfo contextMenuInfo= (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

        if (item.getItemId()==R.id.itemDelete)
        {
            cities.remove(contextMenuInfo.position);
            arrayAdapter.notifyDataSetChanged();
        }

        return super.onContextItemSelected(item);
    }
}

References
https://github.com/mhdr/AndroidSamples/tree/master/023

Android Create a Floating Context Menu

/res/menu/contextual_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/itemCreate"
        android:title="@string/create" />
    <item android:title="@string/update"
        android:id="@+id/itemUpdate" />
    <item android:title="@string/delete"
        android:id="@+id/itemDelete" />
</menu>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    ListView listViewCities;
    String[] cities;
    ArrayAdapter<String> arrayAdapter;

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

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

        cities=getResources().getStringArray(R.array.cities);

        arrayAdapter=new ArrayAdapter<String>(getBaseContext(), R.layout.custom_listview_layout,R.id.textViewCity,cities);

        listViewCities.setAdapter(arrayAdapter);

        registerForContextMenu(listViewCities);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        getMenuInflater().inflate(R.menu.contextual_menu,menu);
    }
}

References
https://github.com/mhdr/AndroidSamples/tree/master/022

Android Handling Click Events of Options Menu

/res/menu/option_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/itemRed"
        android:title="@string/red" />
    <item android:id="@+id/itemBlue"
        android:title="@string/blue" />
    <item android:id="@+id/itemGreen"
        android:title="@string/green" />
    <item android:id="@+id/itemPurple"
        android:title="@string/purple" />
</menu>

MainActivity.java

public class MainActivity extends AppCompatActivity {

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


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

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

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        RelativeLayout relativeLayout= (RelativeLayout) findViewById(R.id.activity_main);

        switch (item.getItemId())
        {
            case R.id.itemBlue:

                relativeLayout.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light));
                break;
            case R.id.itemGreen:
                relativeLayout.setBackgroundColor(getResources().getColor(android.R.color.holo_green_light));
                break;
            case R.id.itemPurple:
                relativeLayout.setBackgroundColor(getResources().getColor(android.R.color.holo_purple));
                break;
            case R.id.itemRed:
                relativeLayout.setBackgroundColor(getResources().getColor(android.R.color.holo_red_light));
                break;
        }

        return super.onOptionsItemSelected(item);
    }
}

References
https://github.com/mhdr/AndroidSamples/tree/master/021

Android Working with Options Menu

/res/menu/option_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:title="@string/search"
        android:icon="@drawable/ic_search_white_24dp"
        app:showAsAction="ifRoom"/>
    <item android:title="@string/share"
        android:icon="@drawable/ic_share_white_24dp" />
</menu>

MainActivity.java

public class MainActivity extends AppCompatActivity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

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

        return super.onCreateOptionsMenu(menu);
    }
}

References
https://github.com/mhdr/AndroidSamples/tree/master/020

Android Creating a DatePickerDialog

MainActivity.java

public class MainActivity extends AppCompatActivity {

    Button buttonShow;

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

        buttonShow= (Button) findViewById(R.id.buttonShow);
        buttonShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CustomDatePicker customDatePicker=new CustomDatePicker();
                customDatePicker.show(getSupportFragmentManager(),"customDatePicker1");
            }
        });
    }
}

CustomDatePicker.java

public class CustomDatePicker extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        Calendar calendar=Calendar.getInstance();

        int year=calendar.get(Calendar.YEAR);
        int month=calendar.get(Calendar.MONTH);
        int day=calendar.get(Calendar.DAY_OF_MONTH);

        final DatePickerDialog datePickerDialog=new DatePickerDialog(getContext(), new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                String output=String.format("%s:%s:%s",year,month,dayOfMonth);
                Toast.makeText(getContext(),output,Toast.LENGTH_LONG).show();
            }
        },year,month,day);



        return datePickerDialog;
    }
}

References
https://github.com/mhdr/AndroidSamples/tree/master/019