Android Multi-dex Enable

aSometimes it needed to enable multidex in out add and its can throw error also . But memory limit 64 k problem may be a painful problem to solve for who faces this problem newly .

But we can easily solve this problem . Just three steps –

Step : 1

Add dependency at first and sync

compile 'com.android.support:multidex:+'

Step 2 :

and add multidex enable inside defaultConfig

multiDexEnabled true

so whole build.gradle will looks like as

 

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"
    defaultConfig {
        applicationId "com.example.arifhasnat.googlemapapi"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.google.android.gms:play-services:9.6.1'
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:multidex:+'
}

Step 3 :

And finally give the the app name inside application of manifest

android:name="android.support.multidex.MultiDexApplication"

as like

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:name="android.support.multidex.MultiDexApplication"
    android:theme="@style/AppTheme">

Now run the program . Hope it will work fine 🙂

 

Details :

https://developer.android.com/studio/build/multidex.html

iOS 10 tutorial : Working with collection view

Collection view is very good component of IOS . Its similar with table but have some basic difference . Here I will discuss with ios Collection view with easy way 🙂

So let start ,

Part 1 :

Create a project Named Like CollectionViewDemo . Go to Main.Storyboard and add a Navigation controller – for that go to Editor menu of toolbar and select EmbededIn and click Navigation Controller . It will add a Navigation bar of the top of the Story Board . Click that and named the text as Collection Demo or as you like .

 

Then the UI main part is coming , first choose CollectionView from library and add it to srory board make it full screen and now select a collection row and make its size as 90/90 .

Now drag an Imagview from library and drop it to collection cell , make it fill as cell size . and make it aspect fill . OK?

Part : 2

Create A Cocoa touch file named MyCollectionViewCell .

Now goto main.storyboard and select collection cell and In class file attach MyCollectionViewCell file then identify is as  – collection_cell

 

Now return to MyCollectionViewCell and drag collection_cell into MyCollectionViewCell and named it as MyCollectionView . Ok?

 

Part 3 :

 

Now add some Image file into asset folder

Go to ViewController class and drag CollectionView to ViewController and named it ass MyCollectionView

@IBOutlet weak var MyCollectionView: UICollectionView!

and images listed as array like

var images = [“one”,”two”,”three”,”four”, “five”]

make all class as

//
// ViewController.swift
// IOSCollectionView
//
// Created by Arif on 11/24/16.
// Copyright © 2016 Arif. All rights reserved.
//&lt;/code&gt;


class ViewController: UIViewController , UICollectionViewDataSource , UICollectionViewDelegate{
@IBOutlet weak var MyCollectionView: UICollectionView!

var images = ["one","two","three","four", "five"]

override func viewDidLoad() {
super.viewDidLoad()
self.MyCollectionView.delegate = self
self.MyCollectionView.dataSource = self

}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -&amp;gt; Int {

return images.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -&amp;gt; UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collection_cell", for: indexPath) as! MyCollectionViewCell
cell.MyImageView.image = UIImage(named: images[indexPath.row])
return cell

}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("selected item is ", indexPath.row)
}
}

run it —

Working With ionic and cordova : Part-1 Installation

Ionic is a good platform for hybrid mobile apps development , both for android and ios . There has some good stuffs and good functionality . We can make app only with HTML , CSS , And java Script framework like angular .

So lets start –

Step : 1

Fist of all we have to install node js of our machine . Go the node js website and download and install it .

https://nodejs.org/en/

Step : 2

From this step we can follow the ionic docs from here https://ionicframework.com/getting-started/

to install ionic and cordova first open your cmd prompt for windows and terminal for mac and linux

then paste it and enter

npm install -g cordova ionic

it will make insure to install ionic and cordova

 

Step:3

Now go you drive where you want to create  project

like i have made a folder on O Drive and name the folder is “ionic Projects”

the go there from cmd as

cd O:

cd ionic Projects/

and

ionic start myApp tabs

it will create a tab based project named “myApp”

 

step : 4

To Build and Run project for android

cd myApp
ionic platform add Android
ionic build Android
ionic emulate Android

if every thing is ok then it will show the following type of project on emulator

capture

Binary Search : Deep knowledge with Java

import java.util.Scanner;

class BinarySearch
{
public static void main(String args[])
{
int c, first, last, middle, n, search, array[];

Scanner in = new Scanner(System.in);
System.out.println("Enter number of elements");
n = in.nextInt();
array = new int[n];

System.out.println("Enter " + n + " integers");

for (c = 0; c &lt; n; c++)
array = in.nextInt();

System.out.println("Enter value to find");
search = in.nextInt();

first = 0;
last = n - 1;
middle = (first + last)/2;

while( first &lt;= last )
{
if ( array[middle] &lt; search ) first = middle + 1; 
else if ( array[middle] == search ) { System.out.println(search + " found at location " + (middle + 1) + "."); break; 
} else last = middle - 1; 

middle = (first + last)/2;
}

if ( first &gt; last )
System.out.println(search + " is not present in the list.\n");
}
}

Insertion Sort Algorithm

Insertion Sort:

Insertion sort is a simple sorting algorithm that is relatively efficient for small lists and mostly sorted lists, and is often used as part of more sophisticated algorithms. It works by taking elements from the list one by one and inserting them in their correct position into a new sorted list.[17] In arrays, the new list and the remaining elements can share the array’s space, but insertion is expensive, requiring shifting all following elements over by one. Shell sort (see below) is a variant of insertion sort that is more efficient for larger lists.

Time Complexity of Insertion Sort :
Class Sorting algorithm
Data structure Array
Worst case performance О(n2) comparisons, swaps
Best case performance O(n) comparisons, O(1) swaps
Average case performance О(n2) comparisons, swaps
Worst case space complexity О(n) total, O(1) auxiliary
Animated Example :

insertion-sort-example-300px

Psedo Code :
public static void insertionSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
int j = i + 1;
int tmp = array[j];
while (j > 0 && tmp > array[j-1]) {
array[j] = array[j-1];
j--;
}
array[j] = tmp;
}
}
Complete Code :
public class InsertionSort {
public static void main(String args[]){


int a[]={1,3,5,6,12,22,12,7,8,9};
intInsertionSort(a);

}


public static void intInsertionSort(int[] a){
for (int i = 1; i <a.length ; i++) {
int temp = a[i];
int j;
for ( j = i-1; j >=0 && temp<a[j] ; j--) {

a[j+1] = a[j];

}
a[j+1] =temp;
printNumbers(a);


}
}

public static void printNumbers(int[] input){
for (int i = 0; i <input.length ; i++) {
System.out.print(input[i] + "," );

}
System.out.println("\n");
}
}

Java Collection Framework

What is Collection Framework : 

The Java collections framework (JCF) is a set of classes and interfaces that implement commonly reusable collection data structures. Although referred to as a framework, it works in a manner of a library. The JCF provides both interfaces that define various collections and classes that implement them.

Java Collection Framework Hierarchy :

collection_interfaces

 

Common Collection Framework Classes :

There several Collection Framework Class and Interfaces . Here we will Discuss most Common Collection Framework Hierarchy .

List :    Java List is an Ordered elements . List have duplicates element . There are three most used List Class Array List ,Linked List ,Vector .

  • Array List
  • Linked List
  •  Vector

Process in Android

What is Process : 

A process is an instance of a program running in a computer. It is close in meaning to task , a term used in some operating systems. In UNIX and some other operating systems, a process is started when a program is initiated (either by a user entering a shell command or by another program). Like a task, a process is a running program with which a particular set of data is associated so that the process can be kept track of. An application that is being shared by multiple users will generally have one process at some stage of execution for each user.

Process In Android : 

When an application component starts and the application does not have any other components running, the Android system starts a new Linux process for the application with a single thread of execution. By default, all components of the same application run in the same process and thread (called the “main” thread). If an application component starts and there already exists a process for that application (because another component from the application exists), then the component is started within that process and uses the same thread of execution. However, you can arrange for different components in your application to run in separate processes, and you can create additional threads for any process.

 

How Android Handle Process :

By default, all components of the same application run in the same process and most applications should not change this. However, if you find that you need to control which process a certain component belongs to, you can do so in the manifest file.

The manifest entry for each type of component element—<activity>, <service>, <receiver>, and <provider>—supports an android:process attribute that can specify a process in which that component should run. You can set this attribute so that each component runs in its own process or so that some components share a process while others do not. You can also set android:process so that components of different applications run in the same process—provided that the applications share the same Linux user ID and are signed with the same certificates.

The <application> element also supports an android:process attribute, to set a default value that applies to all components.

 

Android Process Life Cycle :

The Android system tries to maintain an application process for as long as possible, but eventually needs to remove old processes to reclaim memory for new or more important processes. To determine which processes to keep and which to kill, the system places each process into an “importance hierarchy” based on the components running in the process and the state of those components. Processes with the lowest importance are eliminated first, then those with the next lowest importance, and so on, as necessary to recover system resources.

There are five levels in the importance hierarchy. The following list presents the different types of processes in order of importance (the first process ismost important and is killed last):

  1. Foreground processA process that is required for what the user is currently doing. A process is considered to be in the foreground if any of the following conditions are true:

    Generally, only a few foreground processes exist at any given time. They are killed only as a last resort—if memory is so low that they cannot all continue to run. Generally, at that point, the device has reached a memory paging state, so killing some foreground processes is required to keep the user interface responsive.

  2. Visible processA process that doesn’t have any foreground components, but still can affect what the user sees on screen. A process is considered to be visible if either of the following conditions are true:
    • It hosts an Activity that is not in the foreground, but is still visible to the user (its onPause() method has been called). This might occur, for example, if the foreground activity started a dialog, which allows the previous activity to be seen behind it.
    • It hosts a Service that’s bound to a visible (or foreground) activity.

    A visible process is considered extremely important and will not be killed unless doing so is required to keep all foreground processes running.

  3. Service processA process that is running a service that has been started with the startService() method and does not fall into either of the two higher categories. Although service processes are not directly tied to anything the user sees, they are generally doing things that the user cares about (such as playing music in the background or downloading data on the network), so the system keeps them running unless there’s not enough memory to retain them along with all foreground and visible processes.
  4. Background processA process holding an activity that’s not currently visible to the user (the activity’s onStop() method has been called). These processes have no direct impact on the user experience, and the system can kill them at any time to reclaim memory for a foreground, visible, or service process. Usually there are many background processes running, so they are kept in an LRU (least recently used) list to ensure that the process with the activity that was most recently seen by the user is the last to be killed. If an activity implements its lifecycle methods correctly, and saves its current state, killing its process will not have a visible effect on the user experience, because when the user navigates back to the activity, the activity restores all of its visible state. See the Activities document for information about saving and restoring state.
  5. Empty processA process that doesn’t hold any active application components. The only reason to keep this kind of process alive is for caching purposes, to improve startup time the next time a component needs to run in it. The system often kills these processes in order to balance overall system resources between process caches and the underlying kernel caches.

 

Priority of Process in Android : 

 

Android ranks a process at the highest level it can, based upon the importance of the components currently active in the process. For example, if a process hosts a service and a visible activity, the process is ranked as a visible process, not a service process.

In addition, a process’s ranking might be increased because other processes are dependent on it—a process that is serving another process can never be ranked lower than the process it is serving. For example, if a content provider in process A is serving a client in process B, or if a service in process A is bound to a component in process B, process A is always considered at least as important as process B.

Because a process running a service is ranked higher than a process with background activities, an activity that initiates a long-running operation might do well to start a service for that operation, rather than simply create a worker thread—particularly if the operation will likely outlast the activity. For example, an activity that’s uploading a picture to a web site should start a service to perform the upload so that the upload can continue in the background even if the user leaves the activity. Using a service guarantees that the operation will have at least “service process” priority, regardless of what happens to the activity. This is the same reason that broadcast receivers should employ services rather than simply put time-consuming operations in a thread

Android Schedule Notifications at specific time

A notification is a message you can display to the user outside of your application’s normal UI. When you tell the system to issue a notification, it first appears as an icon in the notification area. To see the details of the notification, the user opens the notification drawer. Both the notification area and the notification drawer are system-controlled areas that the user can view at any time.

 

I will discuss here about android schedule notification with big Image Style

 

1 . Create an Android Project :

Launch android studio and Create a ‘New Project’  at basic or empty project mode .

2. Create Receiver Service Class :

First of all create a Utils class name Utils

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import arifhansat.android.firebase.dailyhadish.R;
import arifhansat.android.firebase.dailyhadish.activity.MainActivity;

/**
 * Created by arif hasnat on 9/18/2016.
 */
public class Utils {

    public static NotificationManager mManager;


    @SuppressWarnings("static-access")
    public static void generateNotification(Context context){

        android.support.v7.app.NotificationCompat.Builder nb= new android.support.v7.app.NotificationCompat.Builder(context);
        nb.setSmallIcon(R.drawable.icon);
        nb.setContentTitle("Brother , Have your read hadish today ?");
        nb.setContentText("Hadish can makes our life Enlightened");
        nb.setTicker("Take a look");

        nb.setAutoCancel(true);



        //get the bitmap to show in notification bar
        Bitmap bitmap_image = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon);
        android.support.v7.app.NotificationCompat.BigPictureStyle s = new android.support.v7.app.NotificationCompat.BigPictureStyle().bigPicture(bitmap_image);
        s.setSummaryText("Hadish can makes our life Enlightened");
        nb.setStyle(s);



        Intent resultIntent = new Intent(context, MainActivity.class);
        TaskStackBuilder TSB = TaskStackBuilder.create(context);
        TSB.addParentStack(MainActivity.class);
        // Adds the Intent that starts the Activity to the top of the stack
        TSB.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =
                TSB.getPendingIntent(
                        0,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );

        nb.setContentIntent(resultPendingIntent);
        nb.setAutoCancel(true);
        NotificationManager mNotificationManager =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        // mId allows you to update the notification later on.

        NotificationManager notificationManager =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(11221, nb.build());


    }

Then create a Class named MyReceiver and call the method

generateNotification

that declared on Utils class

import android.util.Log;

/**
 * Created by arif hasnat on 9/18/2016.
 */
public class MyReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent)
    {
      /*Intent service1 = new Intent(context, MyAlarmService.class);
        context.startService(service1);*/
        Log.i("App", "called receiver method");
        try{
            Utils.generateNotification(context);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

3. Manifest Registration :

Go to manifest and add the receiver service

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="animations.arifhasnat.notiifcationonspecifictime">
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".MyReceiver"/>
    </application>

</manifest>

4. Set Notification Time :

Now go to ManinActivity Class and set notification time

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.util.Calendar;

public class MainActivity extends AppCompatActivity {
    private PendingIntent pendingIntent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Calendar calendar = Calendar.getInstance();


       
        //calendar.set(Calendar.MONTH, 8);
        //calendar.set(Calendar.YEAR, 2016);
        //calendar.set(Calendar.DAY_OF_MONTH, 18);

        calendar.set(Calendar.HOUR_OF_DAY, 11);
        calendar.set(Calendar.MINUTE, 42);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.AM_PM,Calendar.AM);

        Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,0);

        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
    }
}

5 . Run the App :

If you run the code then should get a notification at specific time that is set .

screenshot_2016-09-18-13-50-521

Download Source Code

 

 

Android Push Notification Using Firebase

Firebase is a very nice services of Google specially for mobile   platform . Apps developer can do many things simply . Firebase has several features including real-time database , hosting, messaging , notifications ,analytics , app-linking ,admob and so on .

I will discuss here push notification using firebase including big image notification.

  1. Firebase Account and Project Creation : 

Go to firebase console and login with gmail account and  press button ‘Create New Project’

1

Give your project Name and select country and press create project .

2. Android Project Creation :

Create an android empty-Project  . Open the gradle file (app module ).

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:24.0.0'

    compile 'com.google.firebase:firebase-messaging:9.4.0'

}

apply plugin: 'com.google.gms.google-services'

Open gradle file (project ) and add gradle

classpath 'com.google.gms:google-services:3.0.0'
buildscript {
    repositories {
        jcenter()
        mavenLocal()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.3'
        classpath 'com.google.gms:google-services:3.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        mavenLocal()
    }
}

3. Notification Settings on Firebase Project Console :

Click ‘Add Firebase on your android app’ and Paste your application package name . Application Package name can be found on manifest file or gradle file .

23Click ‘Add App’ then your will get an google-services.json file . Copy it and paste it on your project on ‘app’ directory .

And Again go to your firebase project console and click next and finish . ok ?

4. Service and Notification add On android projects:

Create a Service Class Named

MyFirebaseMessagingService
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "MyFirebaseMsgService";
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {


        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
            sendNotification(remoteMessage.getNotification().getBody());
        }

    }

    public void sendNotification(String messageBody) {

        android.support.v7.app.NotificationCompat.Builder nb= new android.support.v7.app.NotificationCompat.Builder(this);
        nb.setSmallIcon(R.drawable.icon);
        nb.setContentTitle("New Post : Today's Hadish");
        nb.setContentText(messageBody);
        nb.setTicker("Take a look");
        nb.setAutoCancel(true);



        //get the bitmap to show in notification bar
        Bitmap bitmap_image = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon);
        android.support.v7.app.NotificationCompat.BigPictureStyle s = new android.support.v7.app.NotificationCompat.BigPictureStyle().bigPicture(bitmap_image);
        s.setSummaryText(messageBody);
        nb.setStyle(s);



        Intent resultIntent = new Intent(this, MainActivity.class);
        TaskStackBuilder TSB = TaskStackBuilder.create(this);
        TSB.addParentStack(MainActivity.class);
        // Adds the Intent that starts the Activity to the top of the stack
        TSB.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =
                TSB.getPendingIntent(
                        0,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );

        nb.setContentIntent(resultPendingIntent);
        nb.setAutoCancel(true);
        NotificationManager mNotificationManager =
                (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
        // mId allows you to update the notification later on.

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(11221, nb.build());



    }

}

Create another Class and Named :

MyFirebaseInstanceIDService
import android.util.Log;

import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;


public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = "MyFirebaseIIDService";

    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);

        sendRegistrationToServer(refreshedToken);
    }

    private void sendRegistrationToServer(String token) {

    }
}

Go to your manifest and add the service registration :

<service
    android:name=".MyFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

<service
    android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>

and Add Internet Permission :

<uses-permission android:name="android.permission.INTERNET" />

5. Run App:

Run your app on real devices .

6. Send Notifications :

Go to firebase console and go to Notification tab and press ‘send your first notification ‘

6

If every thing is ok then you should show  notification .

Download Source Code