THE Update

This commit is contained in:
Tommaso Berlose 2017-10-20 20:06:59 +02:00
parent 1494c2bc1e
commit b0559e9a15
14 changed files with 545 additions and 135 deletions

View File

@ -15,8 +15,8 @@ android {
applicationId "com.tommasoberlose.anotherwidget"
minSdkVersion 19
targetSdkVersion 26
versionCode 15
versionName "1.1"
versionCode 16
versionName "1.2"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
@ -50,4 +50,5 @@ dependencies {
compile 'com.android.support:recyclerview-v7:26.1.0'
compile 'com.google.android.gms:play-services-awareness:11.4.2'
compile 'joda-time:joda-time:2.9.9'
compile 'com.pes.materialcolorpicker:library:1.0.4'
}

View File

@ -1 +1 @@
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":15},"path":"app-release.apk","properties":{"packageId":"com.tommasoberlose.anotherwidget","split":"","minSdkVersion":"19"}}]
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":16},"path":"app-release.apk","properties":{"packageId":"com.tommasoberlose.anotherwidget","split":"","minSdkVersion":"19"}}]

View File

@ -3,14 +3,14 @@ package com.tommasoberlose.anotherwidget.`object`
/**
* Created by tommaso on 08/10/17.
*/
class CalendarSelector(id: Int, name: String, account_name: String) {
class CalendarSelector(id: Int, name: String?, account_name: String?) {
var id: Int = 0
var name: String = ""
var account_name: String = ""
init {
this.id = id
this.name = name
this.account_name = account_name
this.name = name?: ""
this.account_name = account_name?: ""
}
}

View File

@ -35,6 +35,7 @@ object Constants {
val PREF_NEXT_EVENT_NAME = "PREF_NEXT_EVENT_NAME"
val PREF_NEXT_EVENT_START_DATE = "PREF_NEXT_EVENT_START_DATE"
val PREF_NEXT_EVENT_ALL_DAY = "PREF_NEXT_EVENT_ALL_DAY"
val PREF_NEXT_EVENT_LOCATION = "PREF_NEXT_EVENT_LOCATION"
val PREF_NEXT_EVENT_END_DATE = "PREF_NEXT_EVENT_END_DATE"
val PREF_NEXT_EVENT_CALENDAR_ID = "PREF_NEXT_EVENT_CALENDAR_ID"
val PREF_CUSTOM_LOCATION_LAT = "PREF_CUSTOM_LOCATION_LAT"
@ -51,6 +52,10 @@ object Constants {
val PREF_WEATHER_PROVIDER_API_KEY = "PREF_WEATHER_PROVIDER_API_KEY"
val PREF_EVENT_APP_NAME = "PREF_EVENT_APP_NAME"
val PREF_EVENT_APP_PACKAGE = "PREF_EVENT_APP_PACKAGE"
val PREF_SHOW_EVENT_LOCATION = "PREF_SHOW_EVENT_LOCATION"
val PREF_TEXT_COLOR = "PREF_TEXT_COLOR"
val PREF_TEXT_MAIN_SIZE = "PREF_TEXT_MAIN_SIZE"
val PREF_TEXT_SECOND_SIZE = "PREF_TEXT_SECOND_SIZE"
val ACTION_EXTRA_OPEN_WEATHER_PROVIDER = "ACTION_EXTRA_OPEN_WEATHER_PROVIDER"

View File

@ -15,14 +15,16 @@ class Event {
var endDate: Long = 0
var calendarID: Int = 0
var allDay: Boolean = false
var address: String = ""
constructor(id:Int, title:String, startDate:Long, endDate:Long, calendarID: Int, allDay: Boolean) {
constructor(id:Int, title:String, startDate:Long, endDate:Long, calendarID: Int, allDay: Boolean, address: String) {
this.id = id
this.title = title
this.startDate = startDate
this.endDate = endDate
this.calendarID = calendarID
this.allDay = allDay
this.address = address
}
constructor(eventCursor: Cursor, instanceCursor: Cursor) {
@ -33,6 +35,7 @@ class Event {
title = eventCursor.getString(0)
allDay = !eventCursor.getString(1).equals("0")
calendarID = eventCursor.getInt(2)
address = eventCursor.getString(3)
}
override fun toString(): String {

View File

@ -23,13 +23,18 @@ import android.content.BroadcastReceiver
import com.tommasoberlose.anotherwidget.util.CalendarUtil
import com.tommasoberlose.anotherwidget.util.WeatherUtil
import android.content.DialogInterface
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.os.Build
import android.support.annotation.ColorInt
import android.support.design.widget.BottomSheetDialog
import android.support.v4.content.ContextCompat
import android.text.Html
import android.util.Log
import android.util.TypedValue
import android.widget.Toast
import com.crashlytics.android.Crashlytics
import com.pes.androidmaterialcolorpickerdialog.ColorPicker
import com.tommasoberlose.anotherwidget.`object`.CalendarSelector
import io.fabric.sdk.android.Fabric
import kotlinx.android.synthetic.main.activity_main.*
@ -244,37 +249,64 @@ class MainActivity : AppCompatActivity() {
val e = CalendarUtil.getNextEvent(this)
if (e.id != 0) {
next_event.text = Util.getDifferenceText(this, e.title, now.timeInMillis, e.startDate)
next_event.text = e.title
next_event_difference_time.text = Util.getDifferenceText(this, now.timeInMillis, e.startDate)
if (!e.allDay) {
val startHour: String = if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) Constants.badHourFormat.format(e.startDate) else Constants.goodHourFormat.format(e.startDate)
val endHour: String = if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) Constants.badHourFormat.format(e.endDate) else Constants.goodHourFormat.format(e.endDate)
var dayDiff = TimeUnit.MILLISECONDS.toDays(e.endDate - e.startDate)
val startCal = Calendar.getInstance()
startCal.timeInMillis = e.startDate
val endCal = Calendar.getInstance()
endCal.timeInMillis = e.endDate
if (startCal.get(Calendar.HOUR_OF_DAY) > endCal.get(Calendar.HOUR_OF_DAY)) {
dayDiff++
} else if (startCal.get(Calendar.HOUR_OF_DAY) == endCal.get(Calendar.HOUR_OF_DAY) && startCal.get(Calendar.MINUTE) >= endCal.get(Calendar.MINUTE)) {
dayDiff++
}
var multipleDay: String = ""
if (dayDiff > 0) {
multipleDay = String.format(" (+%s%s)", dayDiff, getString(R.string.day_char))
}
next_event_date.text = String.format("%s - %s%s", startHour, endHour, multipleDay)
if (!e.address.equals("") && SP.getBoolean(Constants.PREF_SHOW_EVENT_LOCATION, false)) {
second_row_icon.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_action_location))
next_event_date.text = e.address
} else {
next_event_date.text = dateStringValue
second_row_icon.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_action_calendar))
if (!e.allDay) {
val startHour: String = if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) Constants.badHourFormat.format(e.startDate) else Constants.goodHourFormat.format(e.startDate)
val endHour: String = if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) Constants.badHourFormat.format(e.endDate) else Constants.goodHourFormat.format(e.endDate)
var dayDiff = TimeUnit.MILLISECONDS.toDays(e.endDate - e.startDate)
val startCal = Calendar.getInstance()
startCal.timeInMillis = e.startDate
val endCal = Calendar.getInstance()
endCal.timeInMillis = e.endDate
if (startCal.get(Calendar.HOUR_OF_DAY) > endCal.get(Calendar.HOUR_OF_DAY)) {
dayDiff++
} else if (startCal.get(Calendar.HOUR_OF_DAY) == endCal.get(Calendar.HOUR_OF_DAY) && startCal.get(Calendar.MINUTE) >= endCal.get(Calendar.MINUTE)) {
dayDiff++
}
var multipleDay: String = ""
if (dayDiff > 0) {
multipleDay = String.format(" (+%s%s)", dayDiff, getString(R.string.day_char))
}
next_event_date.text = String.format("%s - %s%s", startHour, endHour, multipleDay)
} else {
next_event_date.text = dateStringValue
}
}
empty_layout.visibility = View.GONE
calendar_layout.visibility = View.VISIBLE
}
}
empty_date.setTextColor(Util.getFontColor(SP))
divider1.setTextColor(Util.getFontColor(SP))
temp.setTextColor(Util.getFontColor(SP))
next_event.setTextColor(Util.getFontColor(SP))
next_event_difference_time.setTextColor(Util.getFontColor(SP))
next_event_date.setTextColor(Util.getFontColor(SP))
divider2.setTextColor(Util.getFontColor(SP))
calendar_temp.setTextColor(Util.getFontColor(SP))
second_row_icon.setColorFilter(Util.getFontColor(SP))
empty_date.setTextSize(TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f))
divider1.setTextSize(TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f))
temp.setTextSize(TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f))
next_event.setTextSize(TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f))
next_event_difference_time.setTextSize(TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f))
next_event_date.setTextSize(TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f))
divider2.setTextSize(TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f))
calendar_temp.setTextSize(TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f))
}
fun updateLocationView() {
@ -388,6 +420,59 @@ class MainActivity : AppCompatActivity() {
updateAppWidget()
}
show_location_label.text = if (SP.getBoolean(Constants.PREF_SHOW_EVENT_LOCATION, false)) getString(R.string.settings_show_location_subtitle_true) else getString(R.string.settings_show_location_subtitle_false)
action_show_location.setOnClickListener {
SP.edit().putBoolean(Constants.PREF_SHOW_EVENT_LOCATION, !SP.getBoolean(Constants.PREF_SHOW_EVENT_LOCATION, false)).commit()
Util.updateWidget(this)
updateSettings()
updateAppWidget()
}
main_text_size_label.text = String.format("%.0f%s", SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f), "sp")
action_main_text_size.setOnClickListener {
var fontSize = SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f) + 1
if (fontSize > 30) {
fontSize = 20f
}
SP.edit().putFloat(Constants.PREF_TEXT_MAIN_SIZE, fontSize).commit()
Util.updateWidget(this)
updateSettings()
updateAppWidget()
}
second_text_size_label.text = String.format("%.0f%s", SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f), "sp")
action_second_text_size.setOnClickListener {
var fontSize = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) + 1
if (fontSize > 20) {
fontSize = 12f
}
SP.edit().putFloat(Constants.PREF_TEXT_SECOND_SIZE, fontSize).commit()
Util.updateWidget(this)
updateSettings()
updateAppWidget()
}
val textColor = try {
Color.parseColor(SP.getString(Constants.PREF_TEXT_COLOR, "#FFFFFF"))
} catch (e: Exception) {
SP.edit().remove(Constants.PREF_TEXT_COLOR).commit()
Color.parseColor(SP.getString(Constants.PREF_TEXT_COLOR, "#FFFFFF"))
}
text_color_icon.setCardBackgroundColor(textColor)
font_color_label.text = SP.getString(Constants.PREF_TEXT_COLOR, "#FFFFFF").toUpperCase()
action_font_color.setOnClickListener {
val cp: ColorPicker = ColorPicker(this@MainActivity, Color.red(textColor), Color.green(textColor), Color.blue(textColor))
cp.setOnColorSelected { color ->
SP.edit().putString(Constants.PREF_TEXT_COLOR, "#" + Integer.toHexString(color)).commit()
Util.updateWidget(this)
updateSettings()
updateAppWidget()
cp.dismiss()
}
cp.show()
}
val now = Calendar.getInstance()
var dateStringValue: String = String.format("%s%s", Constants.engDateFormat.format(now.time)[0].toUpperCase(), Constants.engDateFormat.format(now.time).substring(1))
if (SP.getBoolean(Constants.PREF_ITA_FORMAT_DATE, false)) {
@ -436,6 +521,22 @@ class MainActivity : AppCompatActivity() {
startActivityForResult(Intent(this, CustomLocationActivity::class.java), Constants.RESULT_CODE_CUSTOM_LOCATION)
}
if (SP.getString(Constants.PREF_CUSTOM_LOCATION_ADD, getString(R.string.custom_location_gps)) == getString(R.string.custom_location_gps)) {
action_weather_provider_api_key.visibility= View.GONE
} else {
action_weather_provider_api_key.visibility= View.VISIBLE
if (!SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, "").equals("")) {
label_weather_provider_api_key.text = getString(R.string.settings_weather_provider_api_key_subtitle_all_set)
alert_icon.visibility = View.GONE
} else {
label_weather_provider_api_key.text = getString(R.string.settings_weather_provider_api_key_subtitle_not_set)
alert_icon.visibility = View.VISIBLE
}
action_weather_provider_api_key.setOnClickListener {
startActivityForResult(Intent(this, WeatherProviderActivity::class.java), Constants.WEATHER_PROVIDER_REQUEST_CODE)
}
}
calendar_app_label.text = SP.getString(Constants.PREF_CALENDAR_APP_NAME, getString(R.string.default_name))
action_calendar_app.setOnClickListener {
startActivityForResult(Intent(this, ChooseApplicationActivity::class.java), Constants.CALENDAR_APP_REQUEST_CODE)
@ -451,17 +552,6 @@ class MainActivity : AppCompatActivity() {
startActivityForResult(Intent(this, ChooseApplicationActivity::class.java), Constants.EVENT_APP_REQUEST_CODE)
}
if (!SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, "").equals("")) {
label_weather_provider_api_key.text = getString(R.string.settings_weather_provider_api_key_subtitle_all_set)
alert_icon.visibility = View.GONE
} else {
label_weather_provider_api_key.text = getString(R.string.settings_weather_provider_api_key_subtitle_not_set)
alert_icon.visibility = View.VISIBLE
}
action_weather_provider_api_key.setOnClickListener {
startActivityForResult(Intent(this, WeatherProviderActivity::class.java), Constants.WEATHER_PROVIDER_REQUEST_CODE)
}
action_filter_calendar.setOnClickListener {
val calendarSelectorList: List<CalendarSelector> = CalendarUtil.getCalendarList(this)
var calFiltered = SP.getString(Constants.PREF_CALENDAR_FILTER, "")

View File

@ -29,12 +29,12 @@ import android.net.Uri
import android.widget.TextClock
import android.widget.TextView
import android.content.ComponentName
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.drawable.BitmapDrawable
import android.support.v4.content.ContextCompat.startActivity
import android.provider.CalendarContract.Events
import android.util.TypedValue
/**
@ -70,6 +70,25 @@ class TheWidget : AppWidgetProvider() {
views = updateLocationView(context, views, appWidgetId)
val SP = PreferenceManager.getDefaultSharedPreferences(context)
views.setTextColor(R.id.empty_date, Util.getFontColor(SP))
views.setTextColor(R.id.divider1, Util.getFontColor(PreferenceManager.getDefaultSharedPreferences(context)))
views.setTextColor(R.id.temp, Util.getFontColor(PreferenceManager.getDefaultSharedPreferences(context)))
views.setTextColor(R.id.next_event, Util.getFontColor(PreferenceManager.getDefaultSharedPreferences(context)))
views.setTextColor(R.id.next_event_difference_time, Util.getFontColor(PreferenceManager.getDefaultSharedPreferences(context)))
views.setTextColor(R.id.next_event_date, Util.getFontColor(PreferenceManager.getDefaultSharedPreferences(context)))
views.setTextColor(R.id.divider2, Util.getFontColor(PreferenceManager.getDefaultSharedPreferences(context)))
views.setTextColor(R.id.calendar_temp, Util.getFontColor(PreferenceManager.getDefaultSharedPreferences(context)))
views.setTextViewTextSize(R.id.empty_date, TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f))
views.setTextViewTextSize(R.id.divider1, TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f))
views.setTextViewTextSize(R.id.temp, TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f))
views.setTextViewTextSize(R.id.next_event, TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f))
views.setTextViewTextSize(R.id.next_event_difference_time, TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f))
views.setTextViewTextSize(R.id.next_event_date, TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f))
views.setTextViewTextSize(R.id.divider2, TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f))
views.setTextViewTextSize(R.id.calendar_temp, TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f))
appWidgetManager.updateAppWidget(appWidgetId, views)
}
@ -96,40 +115,55 @@ class TheWidget : AppWidgetProvider() {
val e = CalendarUtil.getNextEvent(context)
if (e.id != 0) {
views.setTextViewText(R.id.next_event, Util.getDifferenceText(context, e.title, now.timeInMillis, e.startDate))
views.setTextViewText(R.id.next_event, e.title)
views.setTextViewText(R.id.next_event_difference_time, Util.getDifferenceText(context, now.timeInMillis, e.startDate))
if (!e.allDay) {
val startHour: String = if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) Constants.badHourFormat.format(e.startDate) else Constants.goodHourFormat.format(e.startDate)
val endHour: String = if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) Constants.badHourFormat.format(e.endDate) else Constants.goodHourFormat.format(e.endDate)
var dayDiff = TimeUnit.MILLISECONDS.toDays(e.endDate - e.startDate)
if (!e.address.equals("") && SP.getBoolean(Constants.PREF_SHOW_EVENT_LOCATION, false)) {
val startCal = Calendar.getInstance()
startCal.timeInMillis = e.startDate
val source = BitmapFactory.decodeResource(context.resources, R.drawable.ic_action_location);
val result = Util.changeBitmapColor(source, Util.getFontColor(SP))
views.setImageViewBitmap(R.id.second_row_icon, result)
val endCal = Calendar.getInstance()
endCal.timeInMillis = e.endDate
views.setTextViewText(R.id.next_event_date, e.address)
if (startCal.get(Calendar.HOUR_OF_DAY) > endCal.get(Calendar.HOUR_OF_DAY)) {
dayDiff++
} else if (startCal.get(Calendar.HOUR_OF_DAY) == endCal.get(Calendar.HOUR_OF_DAY) && startCal.get(Calendar.MINUTE) >= endCal.get(Calendar.MINUTE)) {
dayDiff++
}
var multipleDay: String = ""
if (dayDiff > 0) {
multipleDay = String.format(" (+%s%s)", dayDiff, context.getString(R.string.day_char))
}
views.setTextViewText(R.id.next_event_date, String.format("%s - %s%s", startHour, endHour, multipleDay))
val mapIntent = PendingIntent.getActivity(context, widgetID, Util.getGoogleMapsIntentFromAddress(context, e.address), 0)
views.setOnClickPendingIntent(R.id.next_event_date, mapIntent)
} else {
views.setTextViewText(R.id.next_event_date, dateStringValue)
val source = BitmapFactory.decodeResource(context.resources, R.drawable.ic_action_calendar);
val result = Util.changeBitmapColor(source, Util.getFontColor(SP))
views.setImageViewBitmap(R.id.second_row_icon, result)
if (!e.allDay) {
val startHour: String = if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) Constants.badHourFormat.format(e.startDate) else Constants.goodHourFormat.format(e.startDate)
val endHour: String = if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) Constants.badHourFormat.format(e.endDate) else Constants.goodHourFormat.format(e.endDate)
var dayDiff = TimeUnit.MILLISECONDS.toDays(e.endDate - e.startDate)
val startCal = Calendar.getInstance()
startCal.timeInMillis = e.startDate
val endCal = Calendar.getInstance()
endCal.timeInMillis = e.endDate
if (startCal.get(Calendar.HOUR_OF_DAY) > endCal.get(Calendar.HOUR_OF_DAY)) {
dayDiff++
} else if (startCal.get(Calendar.HOUR_OF_DAY) == endCal.get(Calendar.HOUR_OF_DAY) && startCal.get(Calendar.MINUTE) >= endCal.get(Calendar.MINUTE)) {
dayDiff++
}
var multipleDay = ""
if (dayDiff > 0) {
multipleDay = String.format(" (+%s%s)", dayDiff, context.getString(R.string.day_char))
}
views.setTextViewText(R.id.next_event_date, String.format("%s - %s%s", startHour, endHour, multipleDay))
} else {
views.setTextViewText(R.id.next_event_date, dateStringValue)
}
}
views.setViewVisibility(R.id.empty_layout, View.GONE)
views.setViewVisibility(R.id.calendar_layout, View.VISIBLE)
val pIntent = PendingIntent.getActivity(context, widgetID, Util.getEventIntent(context, e), 0)
views.setOnClickPendingIntent(R.id.main_layout, pIntent)
}

View File

@ -55,7 +55,7 @@ object CalendarUtil {
for (i in 0 until instanceCursor.count) {
val ID = instanceCursor.getInt(0)
val eventCursor = context.contentResolver.query(CalendarContract.Events.CONTENT_URI, arrayOf(CalendarContract.Events.TITLE, CalendarContract.Events.ALL_DAY, CalendarContract.Events.CALENDAR_ID),
val eventCursor = context.contentResolver.query(CalendarContract.Events.CONTENT_URI, arrayOf(CalendarContract.Events.TITLE, CalendarContract.Events.ALL_DAY, CalendarContract.Events.CALENDAR_ID, CalendarContract.Events.EVENT_LOCATION),
CalendarContract.Events._ID + " is ?",
arrayOf(Integer.toString(ID)), null)
@ -109,7 +109,7 @@ object CalendarUtil {
try {
val calendarCursor = context.contentResolver.query(Uri.parse("content://com.android.calendar/calendars"),
arrayOf(CalendarContract.Calendars._ID, CalendarContract.Calendars.NAME, CalendarContract.Calendars.ACCOUNT_NAME),
arrayOf(CalendarContract.Calendars._ID, CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, CalendarContract.Calendars.ACCOUNT_NAME),
null,
null,
null)
@ -119,7 +119,10 @@ object CalendarUtil {
calendarCursor.moveToFirst()
for (j in 0 until calendarCursor.count) {
calendarList.add(CalendarSelector(calendarCursor.getInt(0), calendarCursor.getString(1), calendarCursor.getString(2)))
val id = calendarCursor.getInt(0)
val name = calendarCursor.getString(1)
val account = calendarCursor.getString(2)
calendarList.add(CalendarSelector(id, name, account))
calendarCursor.moveToNext()
}
} else {
@ -131,7 +134,7 @@ object CalendarUtil {
ignored.printStackTrace()
try {
val calendarCursor = context.contentResolver.query(CalendarContract.Calendars.CONTENT_URI,
arrayOf(CalendarContract.Calendars._ID, CalendarContract.Calendars.NAME, CalendarContract.Calendars.ACCOUNT_NAME),
arrayOf(CalendarContract.Calendars._ID, CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, CalendarContract.Calendars.ACCOUNT_NAME),
null,
null,
null)
@ -167,6 +170,7 @@ object CalendarUtil {
.remove(Constants.PREF_NEXT_EVENT_END_DATE)
.remove(Constants.PREF_NEXT_EVENT_ALL_DAY)
.remove(Constants.PREF_NEXT_EVENT_CALENDAR_ID)
.remove(Constants.PREF_NEXT_EVENT_LOCATION)
.commit()
Util.updateWidget(context)
}
@ -181,12 +185,13 @@ object CalendarUtil {
.putLong(Constants.PREF_NEXT_EVENT_END_DATE, event.endDate)
.putBoolean(Constants.PREF_NEXT_EVENT_ALL_DAY, event.allDay)
.putInt(Constants.PREF_NEXT_EVENT_CALENDAR_ID, event.calendarID)
.putString(Constants.PREF_NEXT_EVENT_LOCATION, event.address)
.commit()
Util.updateWidget(context)
}
fun getNextEvent(context: Context): Event {
val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
return Event(SP.getInt(Constants.PREF_NEXT_EVENT_ID, 0), SP.getString(Constants.PREF_NEXT_EVENT_NAME, ""), SP.getLong(Constants.PREF_NEXT_EVENT_START_DATE, 0), SP.getLong(Constants.PREF_NEXT_EVENT_END_DATE, 0), SP.getInt(Constants.PREF_NEXT_EVENT_CALENDAR_ID, 0), SP.getBoolean(Constants.PREF_NEXT_EVENT_ALL_DAY, false))
return Event(SP.getInt(Constants.PREF_NEXT_EVENT_ID, 0), SP.getString(Constants.PREF_NEXT_EVENT_NAME, ""), SP.getLong(Constants.PREF_NEXT_EVENT_START_DATE, 0), SP.getLong(Constants.PREF_NEXT_EVENT_END_DATE, 0), SP.getInt(Constants.PREF_NEXT_EVENT_CALENDAR_ID, 0), SP.getBoolean(Constants.PREF_NEXT_EVENT_ALL_DAY, false), SP.getString(Constants.PREF_NEXT_EVENT_LOCATION, ""))
}
}

View File

@ -1,6 +1,7 @@
package com.tommasoberlose.anotherwidget.util
import android.Manifest
import android.annotation.SuppressLint
import android.app.Notification
import android.app.NotificationManager
import android.app.PendingIntent
@ -29,6 +30,7 @@ import android.content.ComponentName
import android.preference.PreferenceManager
import android.provider.CalendarContract
import android.provider.Settings
import android.support.v4.graphics.drawable.DrawableCompat
import android.util.Log
import android.view.View
import android.view.animation.Animation
@ -116,6 +118,20 @@ object Util {
context.startActivity(Intent.createChooser(sendIntent, context.getString(R.string.action_share)));
}
fun getGoogleMapsIntentFromAddress(context: Context, address:String): Intent {
val gmmIntentUri: Uri = Uri.parse("geo:0,0?q=" + address);
val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.`package` = "com.google.android.apps.maps";
return if (mapIntent.resolveActivity(context.packageManager) != null) {
mapIntent
} else {
val map = "http://maps.google.co.in/maps?q=" + address
val i = Intent(Intent.ACTION_VIEW, Uri.parse(map));
i
}
}
fun getCurrentWallpaper(context: Context): Drawable? {
var wallpaper: Drawable? = null
try {
@ -252,7 +268,7 @@ object Util {
} else {
val pm: PackageManager = context.packageManager
return try {
val intent: Intent = pm.getLaunchIntentForPackage(SP.getString(Constants.PREF_CALENDAR_APP_PACKAGE, ""))
val intent: Intent = pm.getLaunchIntentForPackage(SP.getString(Constants.PREF_EVENT_APP_PACKAGE, ""))
intent.addCategory(Intent.CATEGORY_LAUNCHER)
intent
} catch (ex: Exception) {
@ -391,14 +407,14 @@ object Util {
return String(Character.toChars(unicode))
}
fun getDifferenceText(context: Context, title: String, now: Long, start: Long): String {
fun getDifferenceText(context: Context, now: Long, start: Long): String {
val nowDate = DateTime(now)
val eventDate = DateTime(start)
val difference = start - now
if (difference < 0) {
return String.format("%s", title)
return ""
} else if (difference < 1000 * 60) {
val minutes = TimeUnit.MILLISECONDS.toMinutes(difference)
var time = ""
@ -406,7 +422,7 @@ object Util {
time += "" + minutes + context.getString(R.string.min_code)
}
return String.format("%s %s %s", title, context.getString(R.string.in_code), time)
return String.format("%s %s", context.getString(R.string.in_code), time)
} else if (difference < 1000 * 60 * 6) {
val hour = TimeUnit.MILLISECONDS.toHours(difference)
var time = ""
@ -422,16 +438,45 @@ object Util {
time += "" + minutes + context.getString(R.string.min_code)
}
return String.format("%s %s %s", title, context.getString(R.string.in_code), time)
return String.format("%s %s", context.getString(R.string.in_code), time)
} else if (eventDate.dayOfYear == nowDate.plusDays(1).dayOfYear) {
return String.format("%s %s", title, context.getString(R.string.tomorrow))
return String.format("%s", context.getString(R.string.tomorrow))
} else if (eventDate.dayOfYear == nowDate.dayOfYear) {
return String.format("%s %s", title, context.getString(R.string.today))
return String.format("%s", context.getString(R.string.today))
} else {
val days = TimeUnit.MILLISECONDS.toDays(difference)
return String.format("%s %s %s%s", title, context.getString(R.string.in_code), days, context.getString(R.string.day_char))
return String.format("%s %s%s", context.getString(R.string.in_code), days, context.getString(R.string.day_char))
}
}
@SuppressLint("ApplySharedPref")
fun getFontColor(SP: SharedPreferences): Int {
return try {
Color.parseColor(SP.getString(Constants.PREF_TEXT_COLOR, "#FFFFFF"))
} catch (e: Exception) {
SP.edit().remove(Constants.PREF_TEXT_COLOR).commit()
Color.parseColor(SP.getString(Constants.PREF_TEXT_COLOR, "#FFFFFF"))
}
}
fun getTintedDrawable(context: Context, inputDrawable: Int, color: Int): Drawable {
val wrapDrawable = ContextCompat.getDrawable(context, inputDrawable);
DrawableCompat.setTint(wrapDrawable, color);
DrawableCompat.setTintMode(wrapDrawable, PorterDuff.Mode.SRC_IN);
return wrapDrawable;
}
fun changeBitmapColor(sourceBitmap: Bitmap, color: Int): Bitmap {
val resultBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0,
sourceBitmap.getWidth() - 1, sourceBitmap.getHeight() - 1);
val p = Paint()
val filter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN);
p.colorFilter = filter;
val canvas = Canvas(resultBitmap);
canvas.drawBitmap(resultBitmap, 0f, 0f, p);
return resultBitmap;
}
}

View File

@ -26,6 +26,7 @@ import com.google.android.gms.awareness.snapshot.WeatherResponse
import com.google.android.gms.awareness.state.Weather
import com.google.android.gms.tasks.OnFailureListener
import com.google.android.gms.tasks.OnSuccessListener
import java.util.*
/**
@ -89,7 +90,7 @@ object WeatherUtil {
val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
SP.edit()
.putFloat(Constants.PREF_WEATHER_TEMP, weather.getTemperature(if (SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F").equals("F")) Weather.FAHRENHEIT else Weather.CELSIUS))
.putString(Constants.PREF_WEATHER_ICON, weather.conditions[0].toString())
.putString(Constants.PREF_WEATHER_ICON, getIconCodeFromAwareness(weather.conditions))
.putString(Constants.PREF_WEATHER_REAL_TEMP_UNIT, SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F"))
.commit()
Util.updateWidget(context)
@ -159,6 +160,39 @@ object WeatherUtil {
Util.updateWidget(context)
}
fun getIconCodeFromAwareness(conditions: IntArray): String {
var icon = ""
return if (conditions.contains(Weather.CONDITION_UNKNOWN)) {
""
} else {
if (conditions.contains(Weather.CONDITION_CLEAR)) {
icon = "01"
} else if (conditions.contains(Weather.CONDITION_CLOUDY)) {
icon = "02"
} else if (conditions.contains(Weather.CONDITION_RAINY)) {
icon = "10"
} else if (conditions.contains(Weather.CONDITION_STORMY)) {
icon = "09"
} else if (conditions.contains(Weather.CONDITION_SNOWY)) {
icon = "13"
} else if (conditions.contains(Weather.CONDITION_WINDY)) {
icon = "80"
} else if (conditions.contains(Weather.CONDITION_HAZY)) {
icon = "50"
} else if (conditions.contains(Weather.CONDITION_ICY)) {
icon = "81"
} else if (conditions.contains(Weather.CONDITION_FOGGY)) {
icon = "82"
}
return if (Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 19 || Calendar.getInstance().get(Calendar.HOUR_OF_DAY) < 7) {
icon + "n"
} else {
icon + "d"
}
}
}
fun getWeatherIconResource(icon: String): Int {
when (icon) {
"01d" -> {
@ -188,6 +222,18 @@ object WeatherUtil {
"50d" -> {
return R.drawable.haze_day
}
"80d" -> {
return R.drawable.windy_day
}
"81d" -> {
return R.drawable.rain_snow_day
}
"82d" -> {
return R.drawable.haze_weather
}
"01n" -> {
return R.drawable.clear_night
}
@ -215,8 +261,17 @@ object WeatherUtil {
"50n" -> {
return R.drawable.haze_night
}
"80n" -> {
return R.drawable.windy_night
}
"81n" -> {
return R.drawable.rain_snow_night
}
"82n" -> {
return R.drawable.haze_weather
}
else -> {
return -1
return R.drawable.unknown
}
}
}

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.tommasoberlose.anotherwidget.ui.activity.MainActivity"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -69,6 +69,106 @@
android:orientation="vertical"
android:paddingTop="16dp"
android:paddingBottom="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/settings_general_title"
style="@style/AnotherWidget.Settings.Header"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:paddingLeft="32dp"
android:paddingRight="32dp"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_font_color"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title"
android:text="@string/settings_font_color_title"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/font_color_label"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
<LinearLayout
android:layout_width="24dp"
android:layout_height="24dp"
android:padding="3dp"
android:orientation="horizontal"
android:background="@drawable/circle_background">
<android.support.v7.widget.CardView
android:layout_width="18dp"
android:layout_height="18dp"
app:cardCornerRadius="9dp"
app:cardElevation="0dp"
android:id="@+id/text_color_icon"
android:orientation="horizontal"
android:background="@android:color/white"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:paddingLeft="32dp"
android:paddingRight="32dp"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_main_text_size"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title"
android:text="@string/title_main_text_size"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/main_text_size_label"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:paddingLeft="32dp"
android:paddingRight="32dp"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_second_text_size"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title"
android:text="@string/title_second_text_size"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/second_text_size_label"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -225,6 +325,30 @@
android:id="@+id/show_until_label"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:paddingLeft="32dp"
android:paddingRight="32dp"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_show_location"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title"
android:text="@string/settings_show_location_title"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/show_location_label"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -318,6 +442,30 @@
android:layout_height="wrap_content"
android:id="@+id/weather_settings"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:paddingLeft="32dp"
android:paddingRight="32dp"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_custom_location"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title"
android:text="@string/settings_custom_location_title"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/label_custom_location"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -354,30 +502,6 @@
android:visibility="gone"
android:src="@drawable/ic_action_alert"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:paddingLeft="32dp"
android:paddingRight="32dp"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_custom_location"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Settings.Title"
android:text="@string/settings_custom_location_title"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/label_custom_location"
style="@style/AnotherWidget.Settings.Subtitle"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -4,7 +4,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_layout">
<LinearLayout
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
@ -12,25 +12,28 @@
android:id="@+id/empty_layout">
<TextView
android:id="@+id/empty_date"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:lines="1"
android:maxLines="1"
android:gravity="right"
android:ellipsize="end"
android:text="@string/loading_text"
style="@style/AnotherWidget.Title" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:id="@+id/weather"
android:minWidth="110dp"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:id="@+id/divider1"
android:text="@string/divider"
style="@style/AnotherWidget.Subtitle"/>
<ImageView
@ -43,6 +46,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Date.Big"
android:singleLine="true"
android:ellipsize="marquee"
android:id="@+id/temp"/>
</LinearLayout>
</LinearLayout>
@ -55,31 +60,58 @@
android:visibility="gone"
android:id="@+id/calendar_layout"
android:gravity="center">
<TextView
android:id="@+id/next_event"
android:layout_width="match_parent"
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Title" />
android:orientation="horizontal">
<TextView
android:id="@+id/next_event"
android:layout_width="0dp"
android:layout_weight="2"
android:maxLines="1"
android:lines="1"
android:gravity="end"
android:ellipsize="end"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Title" />
<TextView
android:id="@+id/next_event_difference_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
style="@style/AnotherWidget.Title" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center">
<ImageView
android:layout_width="14dp"
android:layout_height="14dp"
android:layout_marginTop="1dp"
android:layout_marginEnd="4dp"
android:layout_marginStart="4dp"
android:src="@drawable/ic_action_calendar"/>
<TextView
android:id="@+id/next_event_date"
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Subtitle" />
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:layout_width="14dp"
android:layout_height="14dp"
android:layout_marginTop="1dp"
android:layout_marginEnd="4dp"
android:layout_marginStart="4dp"
android:id="@+id/second_row_icon"
android:src="@drawable/ic_action_calendar"/>
<TextView
android:id="@+id/next_event_date"
android:layout_width="wrap_content"
android:lines="1"
android:maxLines="1"
android:ellipsize="end"
android:layout_height="wrap_content"
style="@style/AnotherWidget.Subtitle" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:id="@+id/calendar_weather">
@ -89,11 +121,12 @@
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="2dp"
android:id="@+id/divider2"
android:text="@string/divider"
style="@style/AnotherWidget.Subtitle"/>
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_width="18dp"
android:layout_height="18dp"
android:id="@+id/weather_icon"
android:src="@drawable/clear_night"/>
<TextView
@ -101,6 +134,7 @@
android:layout_height="wrap_content"
style="@style/AnotherWidget.Date"
android:layout_marginStart="4dp"
android:ellipsize="marquee"
android:layout_marginEnd="4dp"
android:id="@+id/calendar_temp"/>
</LinearLayout>

View File

@ -95,5 +95,13 @@
<string name="well_done">Ben Fatto!</string>
<string name="api_key_info_all_set"><![CDATA[Posso essere necessari fino a <b>dieci minuti</b> prima che la tua chiave sia attivata.<BR /><BR />Quindi <i>rilassati</i>! Il meteo verrà aggiornato non appena sarà disponibile!]]></string>
<string name="hs_code">" ore"</string>
<string name="tomorrow">domani</string>
<string name="tomorrow">Domani</string>
<string name="today">Oggi</string>
<string name="settings_event_app_title">Gli eventi aprono</string>
<string name="settings_show_location_title">Informazione Seconda Riga</string>
<string name="settings_show_location_subtitle_false">Mostra orario evento</string>
<string name="settings_show_location_subtitle_true">Mostra indirizzo evento invece dell\'orario</string>
<string name="settings_font_color_title">Colore Testo</string>
<string name="title_main_text_size">Dimensione Testo Prima Riga</string>
<string name="title_second_text_size">Dimensione Testo Seconda Riga</string>
</resources>

View File

@ -97,7 +97,13 @@
<string name="api_key_info_all_set"><![CDATA[It may take up to <b>ten minutes</b> before your API key is activated.<BR /><BR />So <i>relax</i>! The weather will be updated as soon as it is available!!]]></string>
<string name="well_done">Well Done!</string>
<string name="hs_code">h</string>
<string name="tomorrow">tomorrow</string>
<string name="today">oggi</string>
<string name="tomorrow">Tomorrow</string>
<string name="today">Today</string>
<string name="settings_event_app_title">Tap on event opens</string>
<string name="settings_show_location_title">Second Row Information</string>
<string name="settings_show_location_subtitle_true">Show event address instead of time</string>
<string name="settings_show_location_subtitle_false">Show event time</string>
<string name="settings_font_color_title">Text Color</string>
<string name="title_main_text_size">First Row Text Size</string>
<string name="title_second_text_size">Second Row Text Size</string>
</resources>