For a harder challenge, make it so that you can use a second finger to rotate your rectangles. To do this, you will need to handle multiple pointers in your MotionEvent handling code. You will also need to rotate your canvas.
When dealing with multiple touches, you need these extra ideas:
pointer index |
tells you which pointer in the current set of pointers the event is for |
pointer ID |
gives you a unique ID for a specific finger in a gesture |
The pointer index may change, but the pointer ID will not.
For more details, check out the documentation for the following MotionEvent functions:
final fun getActionMasked(): Int final fun getActionIndex(): Int final fun getPointerId(pointerIndex: Int): Int final fun getX(pointerIndex: Int): Float final fun getY(pointerIndex: Int): Float
Also look at the documentation for the ACTION_POINTER_UP and ACTION_POINTER_DOWN constants.