Material colors palette

    <!-- Red -->
    <color name="red_50">#FFEBEE</color>
    <color name="red_100">#FFCDD2</color>
    <color name="red_200">#EF9A9A</color>
    <color name="red_300">#E57373</color>
    <color name="red_400">#EF5350</color>
    <color name="red_500">#F44336</color>
    <color name="red_600">#E53935</color>
    <color name="red_700">#D32F2F</color>
    <color name="red_800">#C62828</color>
    <color name="red_900">#B71C1C</color>
    <color name="red_A100">#FF8A80</color>
    <color name="red_A200">#FF5252</color>
    <color name="red_A400">#FF1744</color>
    <color name="red_A700">#D50000</color>
    <!-- Red -->

    <!-- Pink -->
    <color name="pink_50">#FCE4EC</color>
    <color name="pink_100">#F8BBD0</color>
    <color name="pink_200">#F48FB1</color>
    <color name="pink_300">#F06292</color>
    <color name="pink_400">#EC407A</color>
    <color name="pink_500">#E91E63</color>
    <color name="pink_600">#D81B60</color>
    <color name="pink_700">#C2185B</color>
    <color name="pink_800">#AD1457</color>
    <color name="pink_900">#880E4F</color>
    <color name="pink_A100">#FF80AB</color>
    <color name="pink_A200">#FF4081</color>
    <color name="pink_A400">#F50057</color>
    <color name="pink_A700">#C51162</color>
    <!-- Pink -->

    <!-- Purple -->
    <color name="purple_50">#F3E5F5</color>
    <color name="purple_100">#E1BEE7</color>
    <color name="purple_200">#CE93D8</color>
    <color name="purple_300">#BA68C8</color>
    <color name="purple_400">#AB47BC</color>
    <color name="purple_500">#9C27B0</color>
    <color name="purple_600">#8E24AA</color>
    <color name="purple_700">#7B1FA2</color>
    <color name="purple_800">#6A1B9A</color>
    <color name="purple_900">#4A148C</color>
    <color name="purple_A100">#EA80FC</color>
    <color name="purple_A200">#E040FB</color>
    <color name="purple_A400">#D500F9</color>
    <color name="purple_A700">#AA00FF</color>
    <!-- Purple -->

    <!-- Deep Purple -->
    <color name="dark_purple_50">#EDE7F6</color>
    <color name="dark_purple_100">#D1C4E9</color>
    <color name="dark_purple_200">#B39DDB</color>
    <color name="dark_purple_300">#9575CD</color>
    <color name="dark_purple_400">#7E57C2</color>
    <color name="dark_purple_500">#673AB7</color>
    <color name="dark_purple_600">#5E35B1</color>
    <color name="dark_purple_700">#512DA8</color>
    <color name="dark_purple_800">#4527A0</color>
    <color name="dark_purple_900">#311B92</color>
    <color name="dark_purple_A100">#B388FF</color>
    <color name="dark_purple_A200">#7C4DFF</color>
    <color name="dark_purple_A400">#651FFF</color>
    <color name="dark_purple_A700">#6200EA</color>
    <!-- Deep Purple -->

    <!-- Indigo -->
    <color name="indigo_50">#E8EAF6</color>
    <color name="indigo_100">#C5CAE9</color>
    <color name="indigo_200">#9FA8DA</color>
    <color name="indigo_300">#7986CB</color>
    <color name="indigo_400">#5C6BC0</color>
    <color name="indigo_500">#3F51B5</color>
    <color name="indigo_600">#3949AB</color>
    <color name="indigo_700">#303F9F</color>
    <color name="indigo_800">#283593</color>
    <color name="indigo_900">#1A237E</color>
    <color name="indigo_A100">#8C9EFF</color>
    <color name="indigo_A200">#536DFE</color>
    <color name="indigo_A400">#3D5AFE</color>
    <color name="indigo_A700">#304FFE</color>
    <!-- Indigo -->

    <!-- Blue -->
    <color name="blue_50">#E3F2FD</color>
    <color name="blue_100">#BBDEFB</color>
    <color name="blue_200">#90CAF9</color>
    <color name="blue_300">#64B5F6</color>
    <color name="blue_400">#42A5F5</color>
    <color name="blue_500">#2196F3</color>
    <color name="blue_600">#1E88E5</color>
    <color name="blue_700">#1976D2</color>
    <color name="blue_800">#1565C0</color>
    <color name="blue_900">#0D47A1</color>
    <color name="blue_A100">#82B1FF</color>
    <color name="blue_A200">#448AFF</color>
    <color name="blue_A400">#2979FF</color>
    <color name="blue_A700">#2962FF</color>
    <!-- Blue -->

    <!-- Light Blue -->
    <color name="light_blue_50">#E1F5FE</color>
    <color name="light_blue_100">#B3E5FC</color>
    <color name="light_blue_200">#81D4FA</color>
    <color name="light_blue_300">#4FC3F7</color>
    <color name="light_blue_400">#29B6F6</color>
    <color name="light_blue_500">#03A9F4</color>
    <color name="light_blue_600">#039BE5</color>
    <color name="light_blue_700">#0288D1</color>
    <color name="light_blue_800">#0277BD</color>
    <color name="light_blue_900">#01579B</color>
    <color name="light_blue_A100">#80D8FF</color>
    <color name="light_blue_A200">#40C4FF</color>
    <color name="light_blue_A400">#00B0FF</color>
    <color name="light_blue_A700">#0091EA</color>
    <!-- Light Blue -->

    <!-- Cyan -->
    <color name="cyan_50">#E0F7FA</color>
    <color name="cyan_100">#B2EBF2</color>
    <color name="cyan_200">#80DEEA</color>
    <color name="cyan_300">#4DD0E1</color>
    <color name="cyan_400">#26C6DA</color>
    <color name="cyan_500">#00BCD4</color>
    <color name="cyan_600">#00ACC1</color>
    <color name="cyan_700">#0097A7</color>
    <color name="cyan_800">#00838F</color>
    <color name="cyan_900">#006064</color>
    <color name="cyan_A100">#84FFFF</color>
    <color name="cyan_A200">#18FFFF</color>
    <color name="cyan_A400">#00E5FF</color>
    <color name="cyan_A700">#00B8D4</color>
    <!-- Cyan -->

    <!-- Teal -->
    <color name="teal_50">#E0F2F1</color>
    <color name="teal_100">#B2DFDB</color>
    <color name="teal_200">#80CBC4</color>
    <color name="teal_300">#4DB6AC</color>
    <color name="teal_400">#26A69A</color>
    <color name="teal_500">#009688</color>
    <color name="teal_600">#00897B</color>
    <color name="teal_700">#00796B</color>
    <color name="teal_800">#00695C</color>
    <color name="teal_900">#004D40</color>
    <color name="teal_A100">#A7FFEB</color>
    <color name="teal_A200">#64FFDA</color>
    <color name="teal_A400">#1DE9B6</color>
    <color name="teal_A700">#00BFA5</color>
    <!-- Teal -->

    <!-- Green -->
    <color name="green_50">#E8F5E9</color>
    <color name="green_100">#C8E6C9</color>
    <color name="green_200">#A5D6A7</color>
    <color name="green_300">#81C784</color>
    <color name="green_400">#66BB6A</color>
    <color name="green_500">#4CAF50</color>
    <color name="green_600">#43A047</color>
    <color name="green_700">#388E3C</color>
    <color name="green_800">#2E7D32</color>
    <color name="green_900">#1B5E20</color>
    <color name="green_A100">#B9F6CA</color>
    <color name="green_A200">#69F0AE</color>
    <color name="green_A400">#00E676</color>
    <color name="green_A700">#00C853</color>
    <!-- Green -->

    <!-- Light Green -->
    <color name="light_green_50">#F1F8E9</color>
    <color name="light_green_100">#DCEDC8</color>
    <color name="light_green_200">#C5E1A5</color>
    <color name="light_green_300">#AED581</color>
    <color name="light_green_400">#9CCC65</color>
    <color name="light_green_500">#8BC34A</color>
    <color name="light_green_600">#7CB342</color>
    <color name="light_green_700">#689F38</color>
    <color name="light_green_800">#558B2F</color>
    <color name="light_green_900">#33691E</color>
    <color name="light_green_A100">#CCFF90</color>
    <color name="light_green_A200">#B2FF59</color>
    <color name="light_green_A400">#76FF03</color>
    <color name="light_green_A700">#64DD17</color>
    <!-- Light Green -->

    <!-- Lime -->
    <color name="lime_50">#F9FBE7</color>
    <color name="lime_100">#F0F4C3</color>
    <color name="lime_200">#E6EE9C</color>
    <color name="lime_300">#DCE775</color>
    <color name="lime_400">#D4E157</color>
    <color name="lime_500">#CDDC39</color>
    <color name="lime_600">#C0CA33</color>
    <color name="lime_700">#AFB42B</color>
    <color name="lime_800">#9E9D24</color>
    <color name="lime_900">#827717</color>
    <color name="lime_A100">#F4FF81</color>
    <color name="lime_A200">#EEFF41</color>
    <color name="lime_A400">#C6FF00</color>
    <color name="lime_A700">#AEEA00</color>
    <!-- Lime -->

    <!-- Yellow -->
    <color name="yellow_50">#FFFDE7</color>
    <color name="yellow_100">#FFF9C4</color>
    <color name="yellow_200">#FFF59D</color>
    <color name="yellow_300">#FFF176</color>
    <color name="yellow_400">#FFEE58</color>
    <color name="yellow_500">#FFEB3B</color>
    <color name="yellow_600">#FDD835</color>
    <color name="yellow_700">#FBC02D</color>
    <color name="yellow_800">#F9A825</color>
    <color name="yellow_900">#F57F17</color>
    <color name="yellow_A100">#FFFF8D</color>
    <color name="yellow_A200">#FFFF00</color>
    <color name="yellow_A400">#FFEA00</color>
    <color name="yellow_A700">#FFD600</color>
    <!-- Yellow -->

    <!-- Amber -->
    <color name="amber_50">#FFF8E1</color>
    <color name="amber_100">#FFECB3</color>
    <color name="amber_200">#FFE082</color>
    <color name="amber_300">#FFD54F</color>
    <color name="amber_400">#FFCA28</color>
    <color name="amber_500">#FFC107</color>
    <color name="amber_600">#FFB300</color>
    <color name="amber_700">#FFA000</color>
    <color name="amber_800">#FF8F00</color>
    <color name="amber_900">#FF6F00</color>
    <color name="amber_A100">#FFE57F</color>
    <color name="amber_A200">#FFD740</color>
    <color name="amber_A400">#FFC400</color>
    <color name="amber_A700">#FFAB00</color>
    <!-- Amber -->

    <!-- Orange -->
    <color name="orange_50">#FFF3E0</color>
    <color name="orange_100">#FFE0B2</color>
    <color name="orange_200">#FFCC80</color>
    <color name="orange_300">#FFB74D</color>
    <color name="orange_400">#FFA726</color>
    <color name="orange_500">#FF9800</color>
    <color name="orange_600">#FB8C00</color>
    <color name="orange_700">#F57C00</color>
    <color name="orange_800">#EF6C00</color>
    <color name="orange_900">#E65100</color>
    <color name="orange_A100">#FFD180</color>
    <color name="orange_A200">#FFAB40</color>
    <color name="orange_A400">#FF9100</color>
    <color name="orange_A700">#FF6D00</color>
    <!-- Orange -->

    <!-- Deep Orange -->
    <color name="deep_orange_50">#FBE9E7</color>
    <color name="deep_orange_100">#FFCCBC</color>
    <color name="deep_orange_200">#FFAB91</color>
    <color name="deep_orange_300">#FF8A65</color>
    <color name="deep_orange_400">#FF7043</color>
    <color name="deep_orange_500">#FF5722</color>
    <color name="deep_orange_600">#F4511E</color>
    <color name="deep_orange_700">#E64A19</color>
    <color name="deep_orange_800">#D84315</color>
    <color name="deep_orange_900">#BF360C</color>
    <color name="deep_orange_A100">#FF9E80</color>
    <color name="deep_orange_A200">#FF6E40</color>
    <color name="deep_orange_A400">#FF3D00</color>
    <color name="deep_orange_A700">#DD2C00</color>
    <!-- Deep Orange -->

    <!-- Brown -->
    <color name="brown_50">#EFEBE9</color>
    <color name="brown_100">#D7CCC8</color>
    <color name="brown_200">#BCAAA4</color>
    <color name="brown_300">#A1887F</color>
    <color name="brown_400">#8D6E63</color>
    <color name="brown_500">#795548</color>
    <color name="brown_600">#6D4C41</color>
    <color name="brown_700">#5D4037</color>
    <color name="brown_800">#4E342E</color>
    <color name="brown_900">#3E2723</color>
    <!-- Brown -->

    <!-- Grey -->
    <color name="grey_50">#FAFAFA</color>
    <color name="grey_100">#F5F5F5</color>
    <color name="grey_200">#EEEEEE</color>
    <color name="grey_300">#E0E0E0</color>
    <color name="grey_400">#BDBDBD</color>
    <color name="grey_500">#9E9E9E</color>
    <color name="grey_600">#757575</color>
    <color name="grey_700">#616161</color>
    <color name="grey_800">#424242</color>
    <color name="grey_900">#212121</color>
    <!-- Grey -->

    <!-- Blue Grey -->
    <color name="blue_grey_50">#ECEFF1</color>
    <color name="blue_grey_100">#CFD8DC</color>
    <color name="blue_grey_200">#B0BEC5</color>
    <color name="blue_grey_300">#90A4AE</color>
    <color name="blue_grey_400">#78909C</color>
    <color name="blue_grey_500">#607D8B</color>
    <color name="blue_grey_600">#546E7A</color>
    <color name="blue_grey_700">#455A64</color>
    <color name="blue_grey_800">#37474F</color>
    <color name="blue_grey_900">#263238</color>
    <!-- Blue Grey -->

    <!-- Black -->
    <color name="black">#000000</color>
    <!-- Black -->

    <!-- White -->
    <color name="white">#FFFFFF</color>
    <!-- White -->

Android – How to clean Android Studio project from libraries

When there is a need to upload or send Android Studio project as zip archive, it takes significant amount of space. But there is a solution for this problem. Open terminal on Android Studio and enter:

./gradlew clean

After cleaning project takes much less space and it is convenient to send as zip archive.

Android – Warning:Conflict with dependency ‘com.google.code.findbugs:jsr305’ solution

When I tried to add these library dependencies:

    compile 'com.trello:rxlifecycle:0.7.0'
    compile 'com.trello:rxlifecycle-android:0.7.0'

I received following error:

Warning:Conflict with dependency ‘com.google.code.findbugs:jsr305’. Resolved versions for app (3.0.1) and test app (2.0.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.
Error:Execution failed for task ‘:app:prepareDebugAndroidTestDependencies’.
> Dependency Error. See console for details.
Information:BUILD FAILED

Then I googled and found this solution:
In your apps build.gradle add the following within android { }:

configurations.all {
    resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
}

How to use lambda in Android Studio?

First of all, add following to build.gradle(app) file:

android {
    defaultConfig {
       ...
        jackOptions {
            enabled true
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

After that you can use lambda in your application:

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(v-> Toast.makeText(getApplicationContext(), "Hello Lambda", Toast.LENGTH_LONG).show());

instead of this:

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "Hello Lambda", Toast.LENGTH_LONG).show();
            }
        });

Android – RecyclerView adapter example

public class PeopleAdapter extends RecyclerView.Adapter<PeopleAdapter.ViewHolder> {

    List<Person> people;

    public PeopleAdapter(List<Person> people) {
        this.people = people;
    }

    @Override
    public PeopleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem_person, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        TextView name;
        TextView number;

        ViewHolder(View itemView) {
            super(itemView);
            name = (TextView) itemView.findViewById(R.id.name);
            number = (TextView) itemView.findViewById(R.id.number);
        }
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Person person = people.get(position);
        holder.name.setText(person.getName());
        holder.number.setText(person.getNumber()+"");
    }

    @Override
    public int getItemCount() {
        return people.size();
    }

}

Java – KenKen Puzzle Solver

import java.util.HashMap;

public class KenKen {

    static int[][] table;//2-dimensional array to represent matrix
    static int width = 4;//this means 4x4 table

    // this hashmap stores contraints like 16x, 7+, 2-, 4
    static HashMap<String, String> constraints = new HashMap<>();

    public static void main(String[] args) {

        table = getEmptyTable();
        fillConstraints();

        int r = 0;//row index
        int c = 0;//column index

        // check all combinations while row index and column index not more than index
        while (r<width && c<width) {
            if (table[r][c] < width) {// if cell value less than max value
                table[r][c]++; // increment cell value by 1
                if (isValid(r, c)) { // check cell value
                    c++; // if cell value is valid move to next cell
                    if (c == width) {//if there is no more column, move to
                        c = 0;//first column
                        r++;//of next line
                    }
                }
            } else {//if cell value more than max value
                table[r][c] = 0;//make it 0
                c--;//because we move to previous column
                if (c < 0) {//if there is no column on the left, move to
                    c = width - 1;//the last column
                    r--;//of previous row
                }
            }
        }
       
        printTable();//print result

    }
   
    // kenken constraints
    private static void fillConstraints() {
        constraints.put("0-0 0-1 1-1", "16 *"); //cell(row:0,column:0) * cell(row:0,column:1) * cell(row:1,column:1) = 16
        constraints.put("0-2 0-3 1-2", "7 +"); // cell(row:0,column:2) + cell(row:0,column:3) + cell(row:1,column:2) = 7
        constraints.put("1-0 2-0", "2 -"); // cell(row:1,column:0) - cell(row:2,column:0) = 2
        constraints.put("2-1 3-0 3-1", "12 *"); // cell(row:2,column:1) * cell(row:3,column:0) * cell(row:3,column:1) = 12
        constraints.put("2-2 2-3", "2 /"); // cell(row:2,column:2) / cell(row:2,column:3) = 2
        constraints.put("3-2 3-3", "2 /"); // cell(row:3,column:2) / cell(row:3,column:3) = 2
        constraints.put("1-3", "4 ="); // cell(row:1,column:3) = 4
    }


    private static boolean isValid(int r, int c) {
        // this method checks cell value validity by its row index and column index

        // check row validity
        for (int i = 0; i < width; i++) {
            if (i != c && table[r][c] == table[r][i])
                return false;
        }

        // check column validity
        for (int i = 0; i < width; i++) {
            if (i != r && table[r][c] == table[i][c])
                return false;
        }

        // check constraints validity
        for (String key : constraints.keySet()) { // loop each key(cell positions)
           
            if (key.contains(r + "-" + c)) {
                //if key(cell positions) has needed position

                String constraint = constraints.get(key); // get contraint like "16 *" which means multiply of cells equals 16

                String operator = constraint.substring(constraint.indexOf(" ") + 1);//get operator. eg "*" from "16 *"
                int num = Integer.parseInt(constraint.substring(0, constraint.indexOf(" ")));//get number. eg 16 from "16 *"
                double result = 0;//using this variable we will check contstraint

                String[] positions = key.split(" ");//split cell positions "0-0 0-1 1-1" to "0-0","0-1","1-1"
                for (int i = 0; i < positions.length; i++) {
                    // loop each position like "0-0" from "0-0 0-1 1-1"
                   
                    int posR = Integer.parseInt(positions[i].substring(0, positions[i].indexOf("-"))); //get row. eg 1 from "1-2"
                    int posC = Integer.parseInt(positions[i].substring(positions[i].indexOf("-") + 1)); //get column eg 2 from "1-2"
                   
                    if (table[posR][posC] == 0) return true;//if cell value equals 0, we cannot make sure this is valid or not, so return true which means valid

                    if (operator.equals("="))
                        return (table[posR][posC] == num);//if constraint "=", let's check equality of cell value and constraint number
                    else if (operator.equals("+"))
                        result = result + table[posR][posC];//if "+", add cell value to sum, in order to compare it in the end of check
                    else if (operator.equals("*")) {
                        if (result == 0)
                            result = 1;// if multiplication of 0 is 0, that's why let's start with 1
                        result = result * table[posR][posC];//multiply result by cell value
                    } else if (operator.equals("-")) {
                        result = result - table[posR][posC];//minus cell value from another value
                        if (result < 0)
                            result = result * -1;//if result is negative, make it positive :)
                    } else if (operator.equals("/")) {
                        if (result == 0) {
                            result = 1;// same as multiplication, 0/x=0
                        } else {
                            if (result % table[posR][posC] != 0 && table[posR][posC] % result != 0)
                                return false;// if we cannot devide value by cell value, it is not divisible (not valid)
                        }
                        result = result / table[posR][posC];//devide one value by another
                        if (result < 1) {// image we have 2 and 4. 2/4=0.5 so we convert this to 1/0.5=2 like 4/2=2
                            result = 1 / result;
                        }

                    }

                }

                return result == num;//check constraint value
                // for example c1=2, c2=4, c3=2
                // contraint "16 *"
                // c1 * c2 * c3 = 16
                // 2 * 4 * 2 = 16 valid

            }
        }

        return true;

    }

   
   
    /*
        method to get empty matrix table with 0s
        0 means empty
        if width = 3;
        matrix will look like this:
        0 0 0
        0 0 0
        0 0 0
     */

    private static int[][] getEmptyTable() {
        int[][] table = new int[width][];

        for (int i = 0; i < width; i++) {
            table[i] = new int[width];
            for (int num : table[i]) {
                num = 0;
            }
        }
        return table;
    }
   
   
   
   
    // print table on console
    private static void printTable() {
       
        for (int i = 0; i < table.length; i++) {
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < width; j++) {
                if (sb.toString().length() > 0)
                    sb.append(" ");
                sb.append(table[i][j]);
            }
            System.out.println(sb.toString());
        }

    }
   
   

}