- Download from GCC 32.2.0 with Posix thread without LLVM/Clang/LLD/LLDB: 7-Zip archive from https://winlibs.com/
- Extract them in location easy to access e.q D:\mingw64
- 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
- Save new configuration and mingw64 ready to use
Thursday, March 21, 2024
windows 11 x64: installing MinGW-w64 for Windows binary
Tuesday, March 19, 2024
Tuesday, March 5, 2024
Android java: behaviour state when configuration change (rotating mobile phone) Android N (7.0 / API 24)
After rotating mobilephone
- onConfigurationChanged
- onPause
- onSaveInstanceState
- onStop
- onDestroy
Following
- onStart
- onRestoreInstanceState
- 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)
build.gradle.kts (Module: app)
plugins {
id("com.android.application")
}
android {
namespace = "com.dedetok.kramaning"
compileSdk = 34
defaultConfig {
applicationId = "com.dedetok.kramaning"
minSdk = 24
targetSdk = 34
versionCode = 202401
versionName = "2024.01"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
dependencies {
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.11.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
implementation ("com.google.android.gms:play-services-ads:22.6.0")
}
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 & 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>
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;
}
}
com.dedetok.kramaning.MantraContainer.java
package com.dedetok.kramaning;
public class MantraContainer {
public String myTitle;
public String myMantra;
}
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);
}
*/
}
}
}
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);
}
}
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
}
}
Wednesday, February 28, 2024
My Radio List Summary
Australia 10 channels/stations
Brazil 3 channels/stations
Brunei Darussalam 6 channels/stations
China 3 channels/stations
France 5 channels/stations
Germany 3 channels/stations
Greece 3 channels/stations
India 5 channels/stations
Indonesia 127 channels/stations
Italy 12 channels/stations
Japan 2 channels/stations
Korea, Republic of 3 channels/stations
Lao People's Democratic Republic 2 channels/stations
Libya 2 channels/stations
Malaysia 6 channels/stations
Morocco 2 channels/stations
Netherlands, Kingdom of the 2 channels/stations
Palestine, State of 1 channels/stations
Paraguay 11 channels/stations
Peru 4 channels/stations
Philippines 3 channels/stations
Poland 3 channels/stations
Russian Federation 1 channels/stations
Singapore 8 channels/stations
Slovakia 3 channels/stations
Switzerland 4 channels/stations
Thailand 5 channels/stations
Ukraine 3 channels/stations
United Kingdom of Great Britain and Northern Ireland 2 channels/stations
United States of America 12 channels/stations
Viet Nam 2 channels/stations
------------------------------------------------------------
"Lagi keluar kota siaran radio diluar jangkauan, pakai Radio Walkman. Dengan Radio Walkman, sepanjang masih ada sinyal HP, radio kesayangan tetap bisa didengar."
"Lagi ke negeri orang tapi lagi pengen radio home base. Dengan Radio Walkman, sepanjang masih ada sinyal HP, radio kesayangan tetap bisa didengar."
Peringatan: Radio Walkman menggunakan data selular. Bila memungkinkan gunakan internet yang unlimited (unmetered).
Do not hesitate to request your radio station in comments. Country City Radio_Station_Name