Pages

Monday 25 November 2019

Android clear stack and brought activity to front without recreating activity

If we have back stack like A -> B -> C -> D , and from D we need to open A without recreating its instance then we should use Clear top and single top as flags and root activity's (in our case A is root)  launch mode should be singleTop or singleTask in our Android manifest file.


Sunday 22 September 2019

Android Interface Definition Language (AIDL)

  • AIDL used to perform IPC (inter process communication). In simple words, when we want to communicate with service of other application then we may use AIDL
  • Que: How AIDL different then ContentProvider?
    Ans: Using ContentProvider we can access data of other application and we may query on data. While Using AIDL we can do interaction with background Service of other application.
We are going to show one example of AIDL Server and Client application when client app will get string and one student object from server app for demo purpose you can do any process and send result from server app to client app in realtime. Lets start with server application first.
  1. SERVER APP:
    Consider that our app's applicationId (package name) is "com.example.aidl.server".
    AIDL is nothing but the interface through client app will get callback from server app.
    So Basically in server app we have a Service and  a AIDL file (interface).
    We need to create interface into main>aidl path of the main (app) module.
    Into aidl folder create same package name as our applicationId, and add following aidl file.


    Now create following one service at your desired package.


    Now you have to rebuild app before move further as android will create abstract class of binder object from aidl file. As you see above in service we have implemented object from MyAidl.Stub. and onBind method of service will return this AIDL.Stub instance (which is actually binder). so Client app will bind this service and get instance of Aidl stub. using this client app can call getStudentObject and getString methods. We can pass custom class using parcelable implementation. We need to create one aidl file too for parcelable class. Following is an example of that.


    That's it for server app.
  2. CLIENT APP:
    Consider out client app's applicationId (package name) is "com.example.aidl.client".
    First of all we need same aidl files as server have so we simply copy paste those files.
    Here is one thing need to consider "MyAidl.aidl" file should be in package name same as server. We need "Student.aidl" and "Student.kt" both files same as server. you can place "Student.kt" file at your desired package name and in aidl folder we have to put "Student.aidl" file in same package name as we put "Student.kt" file in our client app. Now we have to rebuild app to move further so android studio will generate Stub classes. We can bind server's service and we can get string and student object from it following way.


    Using above activity we have bind service and get data from other app.
    That's it for client app.
    You can find both app at this github url: https://github.com/k9428/Aidl_demo

    So this way we can do interprocess communication using AIDL.

Tuesday 17 September 2019

How to force open english keyboard


  • We generally required to open english keyboard by default in password fields. Consider scenario where phone language and app language both are set to other then english. (For ex. set to arabic), Still if we want to open english keyboard for password field then we can use
    "android:imeOptions="flagForceAscii" attribute in password field.
    Following is full example of edit text.



Friday 13 September 2019

How to use content provider in android

When to use content provider:
  • When we want to share our data, files etc to other application then we can use content provider.
    Following diagram illustrate basic of it.
    Overview diagram of how content providers manage access to storage.
  • Let's consider content provider app as server app and the app who use it called client app.
    So to use server app's data, client app needs to use ContentResolver class to perform query to the server app. server app will return cursor to client app so client can iterate through it and read data from cursor. Following diagram illustrate it
    Interaction between ContentProvider, other classes, and storage.
  • Lets start server side (ContentProvider related) Example.
    Consider following package and files structure in server app already there so that we can only focus on content provider. It mainly having Database related files using Room library. Following is structure with use of each file
    • content_provider_demo (package)
      • dao (package)
        • RecentSearchDao : Dao class to perform query on recent search table
      • ContentProviderDemoActivity: demo activity to get result from content provider and print in logs.
      • Database: Singleton class to create RoomDatabase object if not exist
      • Detail : contains static variables. i.e. Db name etc
      • RecentSearch: Table of recent search, made using Room lib
      • RecentSearchProvider: Our provider class. we will discuss about it in next section
      • ScoscheDatabase: Room database config class contains all Dao and Entity.

  • We are going to provide access of our "Recent search" data to other app using "RecentSearchProvider" class. To do that first we have to create "RecentSearchProvider" class as following. I have just use insert and query method for demo purpose. you can use other methods like update, delete etc How it works : - User can use this content provider using content resolver. in content resolver we need to pass unique URI so that system can find which provider need to use and what table and data need to access.  - We can construct Uri like following.
    Uri = host://authority/table
    Here, host is fixed string "content://".
    authority is any unique string which we need to define. We can construct it like following.
    authority = package_name + "."+ your provider class name
    - By URI passed in ContentResolver system can find our class and the method (query, insert etc) need to be call. Now user can do different select queries. For ex user can select all recent searches or user might need recent search for given id etc etc.  so that we have created URI matcher here, So to get all recent search user need to use this content URI "content://$PROVIDER_NAME/$tblRecentSearch". To get recent search for ID = 4 user may use this type of provider "content://$PROVIDER_NAME/$tblRecentSearch/4".
  • We have to register this content provider class in AndroidMenifest.xml file to allow its access to apps. We can do it by adding following code in "application" tab.  Here, "name" contains path of our Content provider class and "authority" contains the authority of this provider.
  • So server side (or ContentProvider related) logic done here.
  • Client side (ContentResolver related) part start here. Second part is "How to access data from ContentProvider". We need to create ContentResolver object to access data from ContentProvider. Android have getContentResolver() (contentResolver property for Kotlin) method to create object of ContentResolver. ContentResolver have different methods like "insert","query","update", "delete" etc to access data. We need to use ContentUri defined previously in content provider to access its data. To insert data to recent search we can do like following.


  • To get records from content provider we can use "query" method of contentResolver. It will return cursor object so we can iterate through it to fetch data. Following example fetch all recent searches.


  • That's it for contentResolver. Second part of code can be found in "ContentProviderDemoActivity". Client side (ContentResolver related) ends here.
  • You can find whole demo in Github. Github Link: https://github.com/k9428/Content-Provider-Demo

Tuesday 27 August 2019

android auto resize textview font not increasing after decrease

I have faced following issue when using textview with autoresize
Following is my layout xml to do auto size

<androidx.appcompat.widget.AppCompatTextView 
       android:id="@+id/tvAmount"        
        android:layout_width="match_parent"        
        android:layout_height="match_parent"        
        android:scrollHorizontally="true"
        android:maxWidth="@dimen/_290sdp"
        android:maxHeight="@dimen/_50sdp"
        android:gravity="start|bottom"
        android:textSize="@dimen/_28ssp"
        android:maxLines="1"        
        android:textColor="@color/charcoal"
        android:includeFontPadding="false"
        android:layout_toStartOf="@+id/tvCurrency"
        tools:text="200"
        app:autoSizeTextType="uniform"
        app:autoSizeMinTextSize="@dimen/_5ssp"
        app:autoSizeMaxTextSize="@dimen/_25ssp"
        app:autoSizeStepGranularity="1sp"        
        app:layout_constraintTop_toTopOf="parent"        
        app:layout_constraintBottom_toBottomOf="parent"        
        app:layout_constraintEnd_toStartOf="@+id/tvCurrency" />

Above code is working fine and did auto complete resize.
but For ex,
if I set value 100
then after some calculation or button click I want to change value to 10000 then text size is too small even if we have space to show this big value.

To solve above problem need to do following.

tvAmount.setHorizontallyScrolling(true)
tvAmount.text = value?.getDecimalFormat()
tvAmount.setHorizontallyScrolling(false)


I have to enable and disable horizontal scrolling because internally for autosize text calculation, if horizontal scrolling is true text view's available drawing width is "1024 * 1024" and after setting text, we should disable horizontal scroll so text
size may decrease if required.