Thursday, March 21, 2024

windows 11 x64: installing MinGW-w64 for Windows binary

  1. Download from GCC 32.2.0 with Posix thread without LLVM/Clang/LLD/LLDB: 7-Zip archive from  https://winlibs.com/ 
  2. Extract them in location easy to access e.q D:\mingw64
  3. Set your windows environment add mingw bin folder, System -> Advanced system settings -> Environment Variables -> System Variables -> Path -> Edit. Add mingw bin folder e.q. D:\mingw64\bin
  4. Save new configuration and mingw64 ready to use

Tuesday, March 5, 2024

Android java: behaviour state when configuration change (rotating mobile phone) Android N (7.0 / API 24)

After rotating mobilephone

  1. onConfigurationChanged
  2. onPause
  3. onSaveInstanceState
  4. onStop
  5. onDestroy

Following

  1. onStart
  2. onRestoreInstanceState
  3. onResume

NOTE: Important to keep state UI

  • Save any state in onSaveInstanceState
  • Restore InstanceState  in onRestoreInstanceState

To restore UI from InstanceState:

  • restore in onResume
  • if you use background service in OnStart, wait until it is finish. Easier way is UI handler -> handleMessage  

Friday, March 1, 2024

Source code Kramaning (com.dedetok.kramaning)

Android Studio 2025.1.3 

Minimum android: 7.0 API 24 

target: android 16 api 36

language: java 

build: kotlin dsl 

--- build.gradle.kts (Project Settings):

plugins {
    alias(libs.plugins.android.application) apply false
}

--- build.gradle.kts (Module :app):

plugins {

    alias(libs.plugins.android.application)
}

android {
    namespace = "com.dedetok.kramaning"
    compileSdk = 36

    defaultConfig {
        applicationId = "com.dedetok.kramaning"
        minSdk = 24
        targetSdk = 36
        buildToolsVersion = "36.1.0"
        versionCode = 202501
        versionName = "2025.01"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }

}

dependencies {

    implementation(libs.appcompat)
    implementation(libs.material)
    testImplementation(libs.junit)
    androidTestImplementation(libs.ext.junit)
    androidTestImplementation(libs.espresso.core)

    // admob
    implementation(libs.play.services.ads)

}

--- graddle.properties (Project Properties):

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.useAndroidX=true
android.nonTransitiveRClass=true

--- gradle-wrpaper.properties

#Fri Oct 03 14:07:44 WIB 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

--- lib.versuibs,toml Version Catalog "libs")

[versions]
agp = "8.13.0"
junit = "4.13.2"
junitVersion = "1.3.0"
espressoCore = "3.7.0"
appcompat = "1.7.1"
material = "1.13.0"

[libraries]
junit = { group = "junit", name = "junit", version.ref = "junit" }
ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }

--- settings.gradle.kts (Project Settings)

pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    //repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name = "Kramaning"
include(":app")

 --- AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <!-- For apps targeting Android 13 or higher & GMA SDK version 20.3.0 or lower -->
    <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- Sample AdMob app ID: ca-app-pub-3940256099942544~3347511713 -->
        <!-- AD App ID: ca-app-pub-0220748109202708~3978959687 -> AndroidManifest.xml -->
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-0220748109202708~3978959687"/>


    </application>

</manifest>

--- res -> values -> strings -> strings.xml

<resources>
    <string name="app_name">Kramaning</string>
    <string name="nav_open">Open</string>
    <string name="nav_close">Close</string>
    <string name="t_preparation">Preparation</string>
    <string name="t_trisandya">Trisandya</string>
    <string name="t_kramaning">Kramaning</string>
    <string name="t_metirta" translatable="false">Metirta &amp; Mebije</string>
</resources>

--- res -> values -> strings -> strings.xml (in)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Kramaning</string>
    <string name="nav_open">Buka</string>
    <string name="nav_close">Tutup</string>
    <string name="t_preparation">Persiapan</string>
    <string name="t_trisandya">Trisandya</string>
    <string name="t_kramaning">Kramaning</string>

</resources>

--- menu -> my_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/preparation"
        android:title="@string/t_preparation" />

    <item
        android:id="@+id/trisandya"
        android:title="@string/t_trisandya" />

    <item
        android:id="@+id/kramaning"
        android:title="@string/t_kramaning" />

    <item
        android:id="@+id/metirta"
        android:title="@string/t_metirta" />

</menu> 

--- Layout layout_viewitem.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:textColor="#9C27B0"
        />

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/tv_mantra"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        />
</androidx.appcompat.widget.LinearLayoutCompat>

 --- Layout layout_fragment_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/my_recycler_view"
        android:scrollbars="vertical"
        />
</androidx.appcompat.widget.LinearLayoutCompat>

 --- Layout activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/my_drawerlayout"
    tools:openDrawer="start"
    android:fitsSystemWindows="true"
    android:orientation="vertical"
    >

    <androidx.appcompat.widget.LinearLayoutCompat
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/my_toolbar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/my_fragmentcontainerview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="top|left"
            />

        <!-- Sample AdMob unit ID: ca-app-pub-3940256099942544/6300978111 -->
        <!-- AD Unit ID: ca-app-pub-0220748109202708/9185950681 -->
        <com.google.android.gms.ads.AdView
            android:id="@+id/adView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:adSize="BANNER"
            app:adUnitId="ca-app-pub-0220748109202708/9185950681"
            android:layout_gravity="end|center"
            />
    </androidx.appcompat.widget.LinearLayoutCompat>

    <!-- Container for contents of drawer - use NavigationView to make configuration easier -->
    <com.google.android.material.navigation.NavigationView
        android:id="@+id/my_navigationview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:menu="@menu/my_menu"
        />

</androidx.drawerlayout.widget.DrawerLayout>

--- java com.dedetok.kramaning.ScriptHindu.java

package com.dedetok.kramaning;

import java.util.ArrayList;

public class ScriptHindu {

    @SuppressWarnings("SpellCheckingInspection")
    private static final String[] textMantras = {
            "Om Ang Brahma Dupa Danta Ya Namah svaha||", // 0 dupa
            "Om Puspa Danta Ya Namah svaha||", // 1 flower
            "Om Waktra Sudayamam svaha||", // 2 mount
            "Om Sudayamam svaha, Om Ati Sudayamam svaha||", // 3 right hand
            "Om Prasada Stiti Sarira Suci Nirmalaya Namah svaha||", // 4 soul
            "Om Ang Namah, Om Ung Namah, Om Mang Namah||", // 5 pranayama
            "OM Bhur Bhubah Svah|\nTat savitur varenyam|\nBharga devasya dhimahi|\nDhiyo yo nah pracodayat||", // 6 traisandya 1
            "OM Narayana evedwam sarvam|\nYad butham Yac ca Bhavyam|\nNiskalanko niranjano nirvikalpo|\nNirakhyatah suddho deva eko|\nNarayana na dvitiyo asti kascit||", // 7 traisandya 2
            "OM Tvam siwah tvam mahadevah|\nIswarah paramesvarah|\nBrahma Visnuca rudrasca|\nPurusah parikirtitah||", // 8 traisandya 3
            "OM Papoham papokarmaham|\nPapatma papasambhavah|\nTrahi mam pundarikaksa|\nSabahyabyantarah sucih||", // 9 traisandya 4
            "OM Ksamasva mam mahadeva|\nSarvaprani hitangkara|\nMam moca sarva papebyah|\nPalayasva sada siva||", // 10 traisandya 5
            "OM Ksantavyah kayika dosah|\nKsantavyo vaciko mama|\nKsantavyo manasa dosah|\nTat pramadat ksamamsva mam||", // 11 traisandya 6
            "OM Canti Canti Canti||", // 12 traisandya 7
            "OM Atma tattvatma suddha ya mam svaha", // 13 kramaning 1
            "OM Adityah syah param jyoti|\nRakta teja namastute|\nSveta pangkaja madhyastha|\nBhaskara ya na namostute||\n\nOM Pranam ya bhaskaram dewam|\nSarwaklesa winasanam|\nParama ditya siwartam|\nBhukti mukti warapradam||\n\nOM Hrang hring sah parama ciwa raditya ya namah svaha||", // 14 kramaning 2
            "OM Namah deva ya adhista na ya|\nSarvavyapi nasiwaya|\nPadmasana eka pratisthaya|\nArdhanaresvar ya namah svaha||\n\nOM Brahma visnu isvara devam|\nJiwatmanan trilokanam|\nSarva jagat pratisthanam|\nSarva roga vinurcitam|\nSarva roga vinasamam|\nVigna desa vinasanam||\n\nOM Namah siva ya||", // 15 kramaning 3
            "OM Anugraha manoharam|\nDwva data nugrahakam|\nHyarcanam sarva pujanam|\nNamah sava nugrahakam||\n\nDeva devi maha sidhi|\nYajnangga nimalatmaka|\nLaksmi siddhisca dirgahayu|\nNirvigram suka vrdisca|\n\nOM Ggring anugahraha ya namah svaha|\nOM Gring anugraha ya namah svaha||\n\nOm Ayur verdi yaso verdi|\nVredi pradnya suka sriyam|\nDhrama santana verdisca|\nSantute sapta vrdayah||\n\nYata meru sthita devam|\nYawat gangga maha tale|\nCandrakau ganggane tawat|\nTattavatma wijayam bawat||\n\nOM Dhirgahayau tat astu svaha|\nOM Awignam astu tat astu svaha|\nOM Subahamastu tat astu svaha|\nOM Sukham bhavantu sruyam bhavantu purnam bhavantu||\n\nOm Sapta verdhi tat astu svaha|\nAntyestih parama pindam|\nAntyestih dewa mersittah|\nSwarvatih eka stnawa|\nSarwva dewa sukha pradadna|\nYa namo namah svaha||", // 16 kramaning 4
            "OM Maha deva devi suksma paramachintya ya nama svaha||", // 17 kramaning 5
            "Om ang brahma amrtha ya namah, Om ung wisnu amrtha ya namah, Om mang isvara amrtha ya namah||", // 18 tirta 1
            "Om Sarira paripurna ya namah, om ang ung mang sarira sudha, Pramantya ya namah, Om ung ksama sampurna ya namah||", // 19 tirta drink 2
            "Om Siva Amertha ya namah, om sadha siva amertha ya namah, Om parama siva amertha ya namah||", // 20 tirta wash face 3
            "Om çriyam bhawantu, Om sukam bhawantu, Om ksama sampurna ya namah svaha" // 21 Bije
    };

    private static final String[] titleMantrasID = {
            "Penyucian Dupa/Api", // 0 dupa
            "Penyucian Bunga", // 1 flower
            "Penyucian Mulut", // 2 mount
            "Penyucian Tangan", // 3 right hand
            "Penyucian Jiwa", // 4 soul
            "Pranayama", // 5 pranayama
            "Trisandya bait 1", // 6 traisandya 1
            "Trisandya bait 2", // 7 traisandya 2
            "Trisandya bait 3", // 8 traisandya 3
            "Trisandya bait 4", // 9 traisandya 4
            "Trisandya bait 5", // 10 traisandya 5
            "Trisandya bait 6", // 11 traisandya 6
            "Trisandya bait 7", // 12 traisandya 7
            "Kramaning bait 1", // 13 kramaning 1
            "Kramaning bait 2", // 14 kramaning 2
            "Kramaning bait 3", // 15 kramaning 3
            "Kramaning bait 4", // 16 kramaning 4
            "Kramaning bait 5", // 17 kramaning 5
            "Tirta dikepala", // 18 tirta 1
            "Tirta diminum", // 19 tirta drink 2
            "Tirta diraup", // 20 tirta wash face 3
            "Bije didahi, dtenggorokan &dimakan" // 21 Bije
    };

    private static final String[] titleMantrasEN = {
            "Penyucian Dupa/Api", // 0 dupa
            "Penyucian Bunga", // 1 flower
            "Penyucian Mulut", // 2 mount
            "Penyucian Tangan", // 3 right hand
            "Penyucian Jiwa", // 4 soul
            "Pranayama", // 5 pranayama
            "Trisandya bait 1", // 6 traisandya 1
            "Trisandya bait 2", // 7 traisandya 2
            "Trisandya bait 3", // 8 traisandya 3
            "Trisandya bait 4", // 9 traisandya 4
            "Trisandya bait 5", // 10 traisandya 5
            "Trisandya bait 6", // 11 traisandya 6
            "Trisandya bait 7", // 12 traisandya 7
            "Kramaning bait 1", // 13 kramaning 1
            "Kramaning bait 2", // 14 kramaning 2
            "Kramaning bait 3", // 15 kramaning 3
            "Kramaning bait 4", // 16 kramaning 4
            "Kramaning bait 5", // 17 kramaning 5
            "Tirta dikepala", // 18 tirta 1
            "Tirta diminum", // 19 tirta drink 2
            "Tirta diraup", // 20 tirta wash face 3
            "Bije didahi, dtenggorokan &dimakan" // 21 Bije
    };

    public static ArrayList<MantraContainer> getMantras(String myLang) {
        ArrayList<MantraContainer> tmpMantras= new ArrayList<MantraContainer>();
        for (int i=0;i<textMantras.length;i++) {
            MantraContainer tmpContainer = new MantraContainer();
            if (myLang.equalsIgnoreCase("id")) {
                tmpContainer.myTitle = titleMantrasID[i];
            } else {
                tmpContainer.myTitle = titleMantrasEN[i];
            }
            tmpContainer.myMantra = textMantras[i];
            tmpMantras.add(tmpContainer);
        }
        return tmpMantras;
    }
}

--- java com.dedetok.kramaning.MantraContainer.java

package com.dedetok.kramaning;

public class MantraContainer {
    public String myTitle;
    public String myMantra;

}

--- java com.dedetok.kramaning.MyAdapter.java

package com.dedetok.kramaning;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.appcompat.widget.AppCompatTextView;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class MyAdapter extends RecyclerView.Adapter {

    private ArrayList<MantraContainer> myMantraAll;
    private ArrayList<MantraContainer> myMantraShow;

    public MyAdapter(String myLang) {
        super();
        this.myMantraAll = ScriptHindu.getMantras(myLang);
        this.myMantraShow = this.myMantraAll;

    }

    /*
     * mandatary extends RecyclerView.Adapter
     */
    @NonNull
    @Override
    public MyAdapter.MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View myView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.layout_viewitem, parent, false);
        return new MyAdapter.MyHolder (myView);
    }

    /*
     * mandatary extends RecyclerView.Adapter
     */
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        MantraContainer tmpMantraContainer = myMantraShow.get(position);
        ((MyHolder) holder).tvTitle.setText(tmpMantraContainer.myTitle);
        ((MyHolder) holder).tvMantra.setText(tmpMantraContainer.myMantra);
    }

    /*
     * mandatary extends RecyclerView.Adapter
     */
    @Override
    public int getItemCount() {
        return myMantraShow.size();
    }

    public void updateList(int myMin, int myMax) {
        myMantraShow = new ArrayList<MantraContainer>();
        for (int i=myMin;i<myMax;i++) {
            this.myMantraShow.add(this.myMantraAll.get(i));
        }
        notifyDataSetChanged();
    }

    private class MyHolder extends RecyclerView.ViewHolder {
        //public TextView tvTitle, tvMantra;
        public AppCompatTextView tvTitle, tvMantra;

        public MyHolder(@NonNull View itemView) {
            super(itemView);
            tvTitle = itemView.findViewById(R.id.tv_title);
            tvMantra = itemView.findViewById(R.id.tv_mantra);
            // unnecessary, use android:textSize="24sp"
            // if android sdk api<28 (android 8.0)
            /*
            if (Build.VERSION.SDK_INT<28) {
                tvTitle.setTextSize(24);
                tvMantra.setTextSize(24);
            }
            */
        }
    }
}

--- java com.dedetok.kramaning.FragmentMain.java

package com.dedetok.kramaning;

import android.os.Bundle;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

public class FragmentMain extends Fragment {

    private String localLang="id";

    private MyAdapter myAdapter;

    public FragmentMain(String localLang) {
        super(R.layout.layout_fragment_main);
        this.localLang = localLang;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        //recyclerview
        RecyclerView myRecyclerView = view.findViewById(R.id.my_recycler_view);
        LinearLayoutManager myLinearLayout = new LinearLayoutManager(getActivity().getApplicationContext());
        myLinearLayout.setOrientation(LinearLayoutManager.VERTICAL);
        myRecyclerView.setLayoutManager(myLinearLayout);
        myAdapter = new MyAdapter(localLang);
        myRecyclerView.setAdapter(myAdapter);

    }


    public void updateList(int mFirst, int mLast) {
        myAdapter.updateList(mFirst, mLast);
    }


}

--- java com.dedetok.kramaning.MainActivity.java

package com.dedetok.kramaning;

import androidx.annotation.NonNull;

import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;

import android.os.Bundle;
import android.view.MenuItem;
import com.google.android.material.navigation.NavigationView;

import java.util.Locale;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;


public class MainActivity extends AppCompatActivity {

    private DrawerLayout myDrawerLayout;

    FragmentMain myFragmentMain;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // get locale language
        String langLocale = Locale.getDefault().getLanguage();
        //Log.e("dedetok", langLocale); //debug

        // TODO change admob id before publish, put back to edit
        // This CODE make slow down startup
        /*
        MobileAds.initialize(this, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(@NonNull InitializationStatus initializationStatus) {

            }
        });
        */
        // AD Unit ID: ca-app-pub-0220748109202708/9185950681 -> AdView in Layout
        // AD App ID: ca-app-pub-0220748109202708~3978959687 -> AndroidManifest.xml

        AdView mAdView = findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);

        Toolbar myToolbar = findViewById(R.id.my_toolbar);
        setSupportActionBar(myToolbar);

        myDrawerLayout = findViewById(R.id.my_drawerlayout);
        ActionBarDrawerToggle myActionBarDrawerToggle = new ActionBarDrawerToggle(this, myDrawerLayout, myToolbar, R.string.nav_open, R.string.nav_close);
        myDrawerLayout.addDrawerListener(myActionBarDrawerToggle);
        myActionBarDrawerToggle.syncState();

        NavigationView myNavigationView = findViewById(R.id.my_navigationview);
        myNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                if (myFragmentMain==null) {
                    //Log.e("dedetok", "null create new"); //debug
                    myFragmentMain = new FragmentMain(langLocale);
                }
                //Log.e("dedetok", item.getTitle().toString()); //debug
                int idItem = item.getItemId();
                if (idItem == R.id.preparation) {
                    //Log.e("dedetok", "Preparation"); //debug
                    myFragmentMain.updateList(0,5);
                } else if (idItem == R.id.trisandya) {
                    myFragmentMain.updateList(6,12);
                } else if (idItem == R.id.kramaning) {
                    myFragmentMain.updateList(13,17);
                } else if (idItem == R.id.metirta) {
                    myFragmentMain.updateList(18,21);
                }
                // close drawer if open
                if (myDrawerLayout.isDrawerOpen(GravityCompat.START)) {
                    myDrawerLayout.close();
                }
                return false;
            }
        });

        myFragmentMain = new FragmentMain(langLocale);
        getSupportFragmentManager().beginTransaction().
                add(R.id.my_fragmentcontainerview, myFragmentMain, null).
                commit();
        //Log.e("dedetok", "create fragment end"); // debug will execute after commit
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (myFragmentMain!=null) {
            myFragmentMain.updateList(0,5);
        }
        //Log.e("dedetok", Integer.toString(Build.VERSION.SDK_INT)); // debug version android 7.0 level api 24
    }
}