Monday, November 25, 2019

Android Internals - UI Events...


This article builds a conceptual model. For actual Android internals (Looper, MessageQueue, threading), watch the attached video below.




i know the way we started learning computer science almost three decades ago is absolutely different from the way students learn computer science these days. 

students these days probably start programming keeping AI, Robotics and similar stuffs in mind. 

However, it is also the fact that the basics have remained the same.

For example, the way event-handling works in different UI based OS is almost the same.

I remember when i studied Windows/ Visual C++ in 90's, i was really awed (rather scared)  by the MFC's dreaded 

DECLARE_MESSAGE_MAP

BEGIN_MESSAGE_MAP 

and 

END_MESSAGE_MAP 

macros... 

That's why i have made this video to throw lights on the way UI event handling is done in Android.

The video in the beginning is my investigation on the Android internals vis-a-vis an UI input event. 

i always wanted to get involved in my software job as an inquisitive engineer and not just as a programmer. 

Hence when Google made Android's framework code open-source, it became a boon for me. 

It opened the door for doing in-depth investigation... 

Hope you like the video...

Happy learning

Enjoy...

Here goes the source code of the Simulation Of the Android Button Click Event project.



package com.somitsolutions.java.SimulationOfAndroidButtonClickEvent;



public class View {

static class ListenerInfo {

OnClickListener mClickListener;

OnLongClickListener mLongClickListener;

}

ListenerInfo mListenerInfo;

//Lazy Initialization

ListenerInfo getListenerInfo() {

if (mListenerInfo != null) {

return mListenerInfo;

}

mListenerInfo = new ListenerInfo();

return mListenerInfo;

}


public void performClick() {

mListenerInfo.mClickListener.onClick(this);

}

public interface OnClickListener

{

public void onClick (View view);

}

public interface OnLongClickListener

{

public void onLongClick (View view);

}

public void setOnClickListner(OnClickListener li){

getListenerInfo().mClickListener = li;

}

public void setOnClickListner(OnLongClickListener li){

getListenerInfo().mLongClickListener = li;

}


}



package com.somitsolutions.java.SimulationOfAndroidButtonClickEvent;


public class Button extends View {

private String mButtonText;

public Button ()

{

}

public String getButtonText() {

return mButtonText;

}


public void setButtonText(String buttonText) {

this.mButtonText = buttonText;

}


}


package com.somitsolutions.java.SimulationOfAndroidButtonClickEvent;


public class Activity implements View.OnClickListener{

Button button;


public Activity() {

button = new Button();

button.setOnClickListner(this);

}

@Override

public void onClick(View view) {

// TODO Auto-generated method stub

if(view.equals(button)) {

button.setButtonText("You clicked me...");

System.out.println(button.getButtonText());

}

}


}



package com.somitsolutions.java.SimulationOfAndroidButtonClickEvent;


public class Main {


public static void main(String[] args) {

// TODO Auto-generated method stub

Activity activity = new Activity();

View view = (View)activity.button;

view.performClick();


}


}

Tuesday, August 28, 2018

My first Flutter app - a keypad dialer


As flutter seems to be today's buzzword in the world of cross-platform mobile apps development, i myself tried it to get an idea and this is my first flutter app. The video of the app running on both iOS and Android emulator is shown here.


Here goes the main.dart file of this app. Hope it will help you as an example particularly for designing a simple layout in flutter.

main.dart

import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or press Run > Flutter Hot Reload in IntelliJ). Notice that the
        // counter didn't reset back to zero; the application is not restarted.
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Keypad Dialer'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  // This widget is the home page of your application. It is stateful, meaning
  // that it has a State object (defined below) that contains fields that affect
  // how it looks.

  // This class is the configuration for the state. It holds the values (in this
  // case the title) provided by the parent (in this case the App widget) and
  // used by the build method of the State. Fields in a Widget subclass are
  // always marked "final".

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String phoneNumber = " ";
  TextEditingController _controller;

  @override
  void initState() {
    super.initState();
    _controller = new TextEditingController(text: '');
  }

  _launchURL(String url) async {
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }

  void callPhone() {}

  @override
  Widget build(BuildContext context) {
    // This method is rerun every time setState is called, for instance as done
    // by the _incrementCounter method above.
    //
    // The Flutter framework has been optimized to make rerunning build methods
    // fast, so that you can just rebuild anything that needs updating rather
    // than having to individually change instances of widgets.
    return new Scaffold(
        appBar: new AppBar(
          // Here we take the value from the MyHomePage object that was created by
          // the App.build method, and use it to set our appbar title.
          title: new Text("Keypad Dialer"),
        ),
        body: new Center(
          // Center is a layout widget. It takes a single child and positions it
          // in the middle of the parent.
          child: new Column(
            // Column is also layout widget. It takes a list of children and
            // arranges them vertically. By default, it sizes itself to fit its
            // children horizontally, and tries to be as tall as its parent.
            //
            // Invoke "debug paint" (press "p" in the console where you ran
            // "flutter run", or select "Toggle Debug Paint" from the Flutter tool
            // window in IntelliJ) to see the wireframe for each widget.
            //
            // Column has various properties to control how it sizes itself and
            // how it positions its children. Here we use mainAxisAlignment to
            // center the children vertically; the main axis here is the vertical
            // axis because Columns are vertical (the cross axis would be
            // horizontal).
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              new Container(
                  padding: const EdgeInsets.all(8.0),
                  child: new Column(children: [
                    new Container(
                      padding: const EdgeInsets.only(bottom: 100.0),
                      child: new TextField(
                        controller: _controller,
                      ),
                    ),
                    new Container(
                        padding: const EdgeInsets.all(8.0),
                        child: new Row(
                            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                            children: <Widget>[
                              new RaisedButton(
                                padding: const EdgeInsets.all(8.0),
                                textColor: Colors.white,
                                color: Colors.blue,
                                onPressed: () {
                                  _controller.text = _controller.text + "1";
                                  //appendToThePhoneNumber('1');
                                },
                                child: new Text("1"),
                              ),
                              new RaisedButton(
                                padding: const EdgeInsets.all(8.0),
                                textColor: Colors.white,
                                color: Colors.blue,
                                onPressed: () {
                                  //appendToThePhoneNumber('2');
                                  _controller.text = _controller.text + "2";
                                },
                                child: new Text("2"),
                              ),
                              new RaisedButton(
                                padding: const EdgeInsets.all(8.0),
                                textColor: Colors.white,
                                color: Colors.blue,
                                onPressed: () {
                                  //appendToThePhoneNumber('3');
                                  _controller.text = _controller.text + "3";
                                },
                                child: new Text("3"),
                              ),
                            ])),
                    new Container(
                        padding: const EdgeInsets.all(8.0),
                        child: new Row(
                            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                            children: <Widget>[
                              new RaisedButton(
                                padding: const EdgeInsets.all(8.0),
                                textColor: Colors.white,
                                color: Colors.blue,
                                onPressed: () {
                                  //appendToThePhoneNumber('4');
                                  _controller.text = _controller.text + "4";
                                },
                                child: new Text("4"),
                              ),
                              new RaisedButton(
                                padding: const EdgeInsets.all(8.0),
                                textColor: Colors.white,
                                color: Colors.blue,
                                onPressed: () {
                                  //appendToThePhoneNumber('5');
                                  _controller.text = _controller.text + "5";
                                },
                                child: new Text("5"),
                              ),
                              new RaisedButton(
                                padding: const EdgeInsets.all(8.0),
                                textColor: Colors.white,
                                color: Colors.blue,
                                onPressed: () {
                                  //appendToThePhoneNumber('6');
                                  _controller.text = _controller.text + "6";
                                },
                                child: new Text("6"),
                              ),
                            ])),
                    new Container(
                        padding: const EdgeInsets.all(8.0),
                        child: new Row(
                            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                            children: <Widget>[
                              new RaisedButton(
                                padding: const EdgeInsets.all(8.0),
                                textColor: Colors.white,
                                color: Colors.blue,
                                onPressed: () {
                                  //appendToThePhoneNumber('7');
                                  _controller.text = _controller.text + "7";
                                },
                                child: new Text("7"),
                              ),
                              new RaisedButton(
                                padding: const EdgeInsets.all(8.0),
                                textColor: Colors.white,
                                color: Colors.blue,
                                onPressed: () {
                                  //appendToThePhoneNumber('8');
                                  _controller.text = _controller.text + "8";
                                },
                                child: new Text("8"),
                              ),
                              new RaisedButton(
                                padding: const EdgeInsets.all(8.0),
                                textColor: Colors.white,
                                color: Colors.blue,
                                onPressed: () {
                                  //appendToThePhoneNumber('9');
                                  _controller.text = _controller.text + "9";
                                },
                                child: new Text("9"),
                              ),
                            ])),
                    new Container(
                        padding: const EdgeInsets.all(8.0),
                        child: new Row(
                            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                            children: <Widget>[
                              new RaisedButton(
                                padding: const EdgeInsets.all(8.0),
                                textColor: Colors.white,
                                color: Colors.blue,
                                onPressed: () {
                                  String number = _controller.text;
                                  _launchURL("tel://" + number);
                                },
                                child: new Text("Call"),
                              ),
                              new RaisedButton(
                                padding: const EdgeInsets.all(8.0),
                                textColor: Colors.white,
                                color: Colors.blue,
                                onPressed: () {
                                  //appendToThePhoneNumber('0');
                                  _controller.text = _controller.text + "0";
                                },
                                child: new Text("0"),
                              ),
                              new RaisedButton(
                                padding: const EdgeInsets.all(8.0),
                                textColor: Colors.white,
                                color: Colors.blue,
                                onPressed: () {
                                  int l = _controller.text.length;
                                  if (l != 0) {
                                    _controller.text =
                                        _controller.text.substring(0, l - 1);
                                  }
                                  //_controller.clear();
                                },
                                child: new Text("Clear"),
                              ),
                            ])),
                  ]))
            ],
          ),
        ));
  }
}

Wednesday, December 6, 2017

One of my most useful phases of life - Parenting, Teaching...

Monday, May 8, 2017

Change Management in Software Skill...

1960's till '80 saw the birth of programming languages like COBOL, PASCAL, C, PROLOG, SQL, BASIC, SMALLTALK. Then came '80s and a paradigm shift occurred and we got Object Oriented Technology and saw the birth of C++, Objective C, etc. Then came '90s and the age of internet started. New programming languages like Java, R, Haskel, Python, Javascript came in the horizon. Then 2000s came and support for concurrent programming, distributed programming, meta programming and aspect oriented programming became essential and we got languages like C#, SCALA, Go, DART, SWIFT. In the meantime people like me who started their IT journey with C++, VC++, MFC, VB on Windows platform had to realign their skillsets to match the market demand and started working on Mobility, Cloud etc. Now another shift in the market demand will see the rise in technologists working on AI, Computer Vision, IOT, Industrial IOT, predictive analytics and so on. So you see for an IT engineer there is no time to rest... He has to upskill himself continuously or else he will become obsolete... Its not easy but thats what the market demands... No wonder IT people in India who are in the age bracket of 40-55 and probably started their IT career on Windows based desktop applications and could not float well with the everchanging IT skills are feeling the heat now... The kind of job profile these people have is sometimes more managerial and people management than playing with technology... Naturally we are experiencing the massive job cuts for these category of people... Without the proper social support it will be really difficult...

We will also have to see if our academic institutions are capable of handling this change management... I am not sure but when i last saw the question papaer of GATE exmas of CS in 2011, it mainly concentrated on procedural language like C. Even when i train undergraduate students, they say they are becoming master in C to qualify the GATE exam. I know C is omnipresent but with the change in the IT scenario other aspects of software designing using Object Oriented Programming or Aspect oriented Programming should also take a major part in the question paper... The reason is that the students will mostly use languages other than C for their day-to-day work in the industry...

I may be wrong but this is my observation vis-a-vis the current IT scene of India...