app/src/main/java/jp/aosystem/inunohi/MainActivity.kt
package jp.aosystem.inunohi
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.DisplayMetrics
import android.view.View
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.AdSize
import com.google.android.gms.ads.AdView
import com.google.android.gms.ads.MobileAds
import jp.aosystem.inunohi.databinding.ActivityMainBinding
import java.text.SimpleDateFormat
import java.util.*
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var viewModel: ConstraintLayout
private var colorBackSunday: Int = 0
private var colorBackSaturday: Int = 0
private var colorBackWeekday: Int = 0
private var colorBackDogday: Int = 0
private var colorTextWeekday: Int = 0
private var colorTextToday: Int = 0
private val calToday: Calendar = Calendar.getInstance() //今日
private val calCurrent: Calendar = Calendar.getInstance() //指定のYearMonthの1日
private var todayYear: Int = 0 //今日
private var todayMonth: Int = 0 //今日
private var todayDay: Int = 0 //今日
private var textDays: Array<TextView> = arrayOf()
//adMob
private lateinit var adView: AdView //adMob
private val adSize: AdSize
get() {
val display = windowManager.defaultDisplay
val outMetrics = DisplayMetrics()
display.getMetrics(outMetrics)
val density = outMetrics.density
var adWidthPixels = this.binding.adContainer.width.toFloat()
if (adWidthPixels == 0f) {
adWidthPixels = outMetrics.widthPixels.toFloat()
}
val adWidth = (adWidthPixels / density).toInt()
return AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(this, adWidth)
}
companion object {
//private const val AD_UNIT_ID: String = "ca-app-pub-3940256099942544/6300978111" //adMob Test
private const val AD_UNIT_ID: String = "ca-app-pub-0000000000000000/0000000000" //adMob
private const val RESULT_SETTING_ACTIVITY: Int = 1
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//setContentView(R.layout.activity_main)
this.binding = ActivityMainBinding.inflate(layoutInflater)
this.viewModel = this.binding.root
setContentView(this.viewModel)
//タイトルバー非表示
supportActionBar?.hide()
//adMob
MobileAds.initialize(this) {}
this.adView = AdView(this)
this.binding.adContainer.addView(this.adView)
loadBanner()
//テーマ設定
this.setTheme()
}
override fun onResume() {
super.onResume()
this.calToday.time = Date()
this.todayYear = calToday.get(Calendar.YEAR)
this.todayMonth = calToday.get(Calendar.MONTH) + 1 //0..11だから+1する
this.todayDay = calToday.get(Calendar.DAY_OF_MONTH)
this.calCurrent.set(this.todayYear, this.todayMonth - 1, 1)
this.textDays = arrayOf(
this.binding.textDay0,
this.binding.textDay1,
this.binding.textDay2,
this.binding.textDay3,
this.binding.textDay4,
this.binding.textDay5,
this.binding.textDay6,
this.binding.textDay7,
this.binding.textDay8,
this.binding.textDay9,
this.binding.textDay10,
this.binding.textDay11,
this.binding.textDay12,
this.binding.textDay13,
this.binding.textDay14,
this.binding.textDay15,
this.binding.textDay16,
this.binding.textDay17,
this.binding.textDay18,
this.binding.textDay19,
this.binding.textDay20,
this.binding.textDay21,
this.binding.textDay22,
this.binding.textDay23,
this.binding.textDay24,
this.binding.textDay25,
this.binding.textDay26,
this.binding.textDay27,
this.binding.textDay28,
this.binding.textDay29,
this.binding.textDay30,
this.binding.textDay31,
this.binding.textDay32,
this.binding.textDay33,
this.binding.textDay34,
this.binding.textDay35,
this.binding.textDay36,
this.binding.textDay37,
this.binding.textDay38,
this.binding.textDay39,
this.binding.textDay40,
this.binding.textDay41,
)
this.colorBackSunday = ContextCompat.getColor(this,R.color.backSunday)
this.colorBackSaturday = ContextCompat.getColor(this,R.color.backSaturday)
this.colorBackWeekday = ContextCompat.getColor(this,R.color.backWeekday)
this.colorBackDogday = ContextCompat.getColor(this,R.color.backDogDay)
this.colorTextWeekday = ContextCompat.getColor(this,R.color.textWeekday)
this.colorTextToday = ContextCompat.getColor(this,R.color.textToday)
this.calendarStart()
}
//adMob
private fun loadBanner() {
this.adView.adUnitId = AD_UNIT_ID
this.adView.adSize = adSize
val adRequest = AdRequest
.Builder()
//.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.build()
this.adView.loadAd(adRequest)
}
private fun calendarStart() {
this.clearCalendar() //カレンダーをクリアする
//
val year: Int = this.calCurrent.get(Calendar.YEAR) //表示する年
val month: Int = this.calCurrent.get(Calendar.MONTH) + 1 //表示する月
this.binding.textYearMonth.text = "${year.toString()}年${month.toString()}月"
val week: Int = this.calCurrent.get(Calendar.DAY_OF_WEEK)
val lastDay: Int = this.calCurrent.getActualMaximum(Calendar.DATE)
val unixTimeDate: Date = SimpleDateFormat("yyyy-M-dd").parse("${year.toString()}-${month.toString()}-01")
val unixTimeDay: Int = unixTimeDate.time.div(86400000).toInt() //1000 * 3600 * 24
for (i in 1..lastDay) {
//日付
this.textDays[i + week - 2].text = i.toString()
//当日を着色
if (year == todayYear && month == todayMonth && i == todayDay) {
this.textDays[i + week - 2].setTextColor(this.colorTextToday)
}
//戌の日を背景着色
if ((unixTimeDay + i + 7) % 12 == 0) {
this.textDays[i + week - 2].setBackgroundColor(this.colorBackDogday)
}
}
}
private fun clearCalendar() {
for (element in this.textDays) {
element.text = ""
element.setTextColor(this.colorTextWeekday)
element.setBackgroundColor(colorBackWeekday)
}
//日曜、土曜を背景着色
for (i in this.textDays.indices) {
when (i % 7) {
0 -> this.textDays[i].setBackgroundColor(this.colorBackSunday)
6 -> this.textDays[i].setBackgroundColor(this.colorBackSaturday)
}
}
}
fun onClickPrevYear(v: View) {
val y: Int = calCurrent.get(Calendar.YEAR) - 1 //prev
val m: Int = calCurrent.get(Calendar.MONTH) + 1 //0..11だから+1する
this.calCurrent.set(y, m - 1, 1)
this.calendarStart()
}
fun onClickNextYear(v: View) {
val y: Int = calCurrent.get(Calendar.YEAR) + 1 //next
val m: Int = calCurrent.get(Calendar.MONTH) + 1 //0..11だから+1する
this.calCurrent.set(y, m - 1, 1)
this.calendarStart()
}
fun onClickPrevMonth(v: View) {
var y: Int = calCurrent.get(Calendar.YEAR)
var m: Int = calCurrent.get(Calendar.MONTH) + 1 //0..11だから+1する
m -= 1 //前月
if (m <= 0) {
m = 12
y -= 1
}
this.calCurrent.set(y, m - 1, 1)
this.calendarStart()
}
fun onClickNextMonth(v: View) {
var y: Int = calCurrent.get(Calendar.YEAR)
var m: Int = calCurrent.get(Calendar.MONTH) + 1 //0..11だから+1する
m += 1 //次月
if (m > 12) {
m = 1
y += 1
}
this.calCurrent.set(y, m - 1, 1)
this.calendarStart()
}
fun onClickToday(v: View) {
val y: Int = calToday.get(Calendar.YEAR)
val m: Int = calToday.get(Calendar.MONTH) + 1 //0..11だから+1する
this.calCurrent.set(y, m - 1, 1)
this.calendarStart()
}
fun onClickSetting(v: View) {
val intent = Intent(applicationContext, SettingActivity::class.java)
val themeNumber: Int = this.loadThemeNumber()
intent.putExtra("themeNumber", themeNumber)
startActivityForResult(intent, RESULT_SETTING_ACTIVITY)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
super.onActivityResult(requestCode, resultCode, intent)
if (resultCode == Activity.RESULT_OK && requestCode == RESULT_SETTING_ACTIVITY && intent != null) {
val themeNumber: Int = intent.getIntExtra("themeNumber", 0)
if (this.loadThemeNumber() != themeNumber) {
this.saveThemeNumber(themeNumber)
recreate()
}
}
}
//テーマを保存
private fun saveThemeNumber(themeNumber: Int) {
getSharedPreferences("settings", Context.MODE_PRIVATE).edit().apply {
putInt("themeNumber", themeNumber)
apply()
}
}
//テーマを読み出し
private fun loadThemeNumber(): Int {
val pref = getSharedPreferences("settings", Context.MODE_PRIVATE)
return pref.getInt("themeNumber", 0)
}
//テーマを設定
private fun setTheme() {
when (this.loadThemeNumber()) {
0 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
1 -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
}
}
app/src/main/java/jp/aosystem/inunohi/SettingActivity.kt
package jp.aosystem.inunohi
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import jp.aosystem.inunohi.databinding.ActivitySettingBinding
class SettingActivity : AppCompatActivity() {
private lateinit var binding: ActivitySettingBinding
private lateinit var viewModel: ConstraintLayout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//setContentView(R.layout.activity_main)
this.binding = ActivitySettingBinding.inflate(layoutInflater)
this.viewModel = this.binding.root
setContentView(this.viewModel)
//データ受け取り
val intent = this.intent
val themeNumber: Int = intent.getIntExtra("themeNumber",0)
this.binding.switchTheme.isChecked = themeNumber != 0
//タイトルバー非表示
supportActionBar?.hide()
}
fun onClickApply(v: View) {
val themeNumber = if (this.binding.switchTheme.isChecked) 1 else 0
val intent = Intent()
intent.putExtra("themeNumber", themeNumber)
setResult(Activity.RESULT_OK, intent)
finish()
}
fun onClickCancel(v: View) {
val intent = Intent()
setResult(Activity.RESULT_CANCELED, intent)
finish()
}
}