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" applicationId "com.tommasoberlose.anotherwidget"
minSdkVersion 19 minSdkVersion 19
targetSdkVersion 26 targetSdkVersion 26
versionCode 15 versionCode 16
versionName "1.1" versionName "1.2"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
} }
buildTypes { buildTypes {
@ -50,4 +50,5 @@ dependencies {
compile 'com.android.support:recyclerview-v7:26.1.0' compile 'com.android.support:recyclerview-v7:26.1.0'
compile 'com.google.android.gms:play-services-awareness:11.4.2' compile 'com.google.android.gms:play-services-awareness:11.4.2'
compile 'joda-time:joda-time:2.9.9' 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. * 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 id: Int = 0
var name: String = "" var name: String = ""
var account_name: String = "" var account_name: String = ""
init { init {
this.id = id this.id = id
this.name = name this.name = name?: ""
this.account_name = account_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_NAME = "PREF_NEXT_EVENT_NAME"
val PREF_NEXT_EVENT_START_DATE = "PREF_NEXT_EVENT_START_DATE" 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_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_END_DATE = "PREF_NEXT_EVENT_END_DATE"
val PREF_NEXT_EVENT_CALENDAR_ID = "PREF_NEXT_EVENT_CALENDAR_ID" val PREF_NEXT_EVENT_CALENDAR_ID = "PREF_NEXT_EVENT_CALENDAR_ID"
val PREF_CUSTOM_LOCATION_LAT = "PREF_CUSTOM_LOCATION_LAT" 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_WEATHER_PROVIDER_API_KEY = "PREF_WEATHER_PROVIDER_API_KEY"
val PREF_EVENT_APP_NAME = "PREF_EVENT_APP_NAME" val PREF_EVENT_APP_NAME = "PREF_EVENT_APP_NAME"
val PREF_EVENT_APP_PACKAGE = "PREF_EVENT_APP_PACKAGE" 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" val ACTION_EXTRA_OPEN_WEATHER_PROVIDER = "ACTION_EXTRA_OPEN_WEATHER_PROVIDER"

View File

@ -15,14 +15,16 @@ class Event {
var endDate: Long = 0 var endDate: Long = 0
var calendarID: Int = 0 var calendarID: Int = 0
var allDay: Boolean = false 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.id = id
this.title = title this.title = title
this.startDate = startDate this.startDate = startDate
this.endDate = endDate this.endDate = endDate
this.calendarID = calendarID this.calendarID = calendarID
this.allDay = allDay this.allDay = allDay
this.address = address
} }
constructor(eventCursor: Cursor, instanceCursor: Cursor) { constructor(eventCursor: Cursor, instanceCursor: Cursor) {
@ -33,6 +35,7 @@ class Event {
title = eventCursor.getString(0) title = eventCursor.getString(0)
allDay = !eventCursor.getString(1).equals("0") allDay = !eventCursor.getString(1).equals("0")
calendarID = eventCursor.getInt(2) calendarID = eventCursor.getInt(2)
address = eventCursor.getString(3)
} }
override fun toString(): String { 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.CalendarUtil
import com.tommasoberlose.anotherwidget.util.WeatherUtil import com.tommasoberlose.anotherwidget.util.WeatherUtil
import android.content.DialogInterface import android.content.DialogInterface
import android.graphics.Color
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Build import android.os.Build
import android.support.annotation.ColorInt
import android.support.design.widget.BottomSheetDialog import android.support.design.widget.BottomSheetDialog
import android.support.v4.content.ContextCompat
import android.text.Html import android.text.Html
import android.util.Log import android.util.Log
import android.util.TypedValue
import android.widget.Toast import android.widget.Toast
import com.crashlytics.android.Crashlytics import com.crashlytics.android.Crashlytics
import com.pes.androidmaterialcolorpickerdialog.ColorPicker
import com.tommasoberlose.anotherwidget.`object`.CalendarSelector import com.tommasoberlose.anotherwidget.`object`.CalendarSelector
import io.fabric.sdk.android.Fabric import io.fabric.sdk.android.Fabric
import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main.*
@ -244,37 +249,64 @@ class MainActivity : AppCompatActivity() {
val e = CalendarUtil.getNextEvent(this) val e = CalendarUtil.getNextEvent(this)
if (e.id != 0) { 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) { if (!e.address.equals("") && SP.getBoolean(Constants.PREF_SHOW_EVENT_LOCATION, false)) {
val startHour: String = if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) Constants.badHourFormat.format(e.startDate) else Constants.goodHourFormat.format(e.startDate) second_row_icon.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_action_location))
val endHour: String = if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) Constants.badHourFormat.format(e.endDate) else Constants.goodHourFormat.format(e.endDate) next_event_date.text = e.address
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 { } 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 empty_layout.visibility = View.GONE
calendar_layout.visibility = View.VISIBLE 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() { fun updateLocationView() {
@ -388,6 +420,59 @@ class MainActivity : AppCompatActivity() {
updateAppWidget() 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() 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)) 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)) { 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) 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)) calendar_app_label.text = SP.getString(Constants.PREF_CALENDAR_APP_NAME, getString(R.string.default_name))
action_calendar_app.setOnClickListener { action_calendar_app.setOnClickListener {
startActivityForResult(Intent(this, ChooseApplicationActivity::class.java), Constants.CALENDAR_APP_REQUEST_CODE) 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) 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 { action_filter_calendar.setOnClickListener {
val calendarSelectorList: List<CalendarSelector> = CalendarUtil.getCalendarList(this) val calendarSelectorList: List<CalendarSelector> = CalendarUtil.getCalendarList(this)
var calFiltered = SP.getString(Constants.PREF_CALENDAR_FILTER, "") 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.TextClock
import android.widget.TextView import android.widget.TextView
import android.content.ComponentName 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.support.v4.content.ContextCompat.startActivity
import android.provider.CalendarContract.Events import android.provider.CalendarContract.Events
import android.util.TypedValue
/** /**
@ -70,6 +70,25 @@ class TheWidget : AppWidgetProvider() {
views = updateLocationView(context, views, appWidgetId) 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) appWidgetManager.updateAppWidget(appWidgetId, views)
} }
@ -96,40 +115,55 @@ class TheWidget : AppWidgetProvider() {
val e = CalendarUtil.getNextEvent(context) val e = CalendarUtil.getNextEvent(context)
if (e.id != 0) { 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) { if (!e.address.equals("") && SP.getBoolean(Constants.PREF_SHOW_EVENT_LOCATION, false)) {
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() val source = BitmapFactory.decodeResource(context.resources, R.drawable.ic_action_location);
startCal.timeInMillis = e.startDate val result = Util.changeBitmapColor(source, Util.getFontColor(SP))
views.setImageViewBitmap(R.id.second_row_icon, result)
val endCal = Calendar.getInstance() views.setTextViewText(R.id.next_event_date, e.address)
endCal.timeInMillis = e.endDate
if (startCal.get(Calendar.HOUR_OF_DAY) > endCal.get(Calendar.HOUR_OF_DAY)) { val mapIntent = PendingIntent.getActivity(context, widgetID, Util.getGoogleMapsIntentFromAddress(context, e.address), 0)
dayDiff++ views.setOnClickPendingIntent(R.id.next_event_date, mapIntent)
} 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))
} else { } 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.empty_layout, View.GONE)
views.setViewVisibility(R.id.calendar_layout, View.VISIBLE) views.setViewVisibility(R.id.calendar_layout, View.VISIBLE)
val pIntent = PendingIntent.getActivity(context, widgetID, Util.getEventIntent(context, e), 0) val pIntent = PendingIntent.getActivity(context, widgetID, Util.getEventIntent(context, e), 0)
views.setOnClickPendingIntent(R.id.main_layout, pIntent) views.setOnClickPendingIntent(R.id.main_layout, pIntent)
} }

View File

@ -55,7 +55,7 @@ object CalendarUtil {
for (i in 0 until instanceCursor.count) { for (i in 0 until instanceCursor.count) {
val ID = instanceCursor.getInt(0) 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 ?", CalendarContract.Events._ID + " is ?",
arrayOf(Integer.toString(ID)), null) arrayOf(Integer.toString(ID)), null)
@ -109,7 +109,7 @@ object CalendarUtil {
try { try {
val calendarCursor = context.contentResolver.query(Uri.parse("content://com.android.calendar/calendars"), 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, null,
null) null)
@ -119,7 +119,10 @@ object CalendarUtil {
calendarCursor.moveToFirst() calendarCursor.moveToFirst()
for (j in 0 until calendarCursor.count) { 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() calendarCursor.moveToNext()
} }
} else { } else {
@ -131,7 +134,7 @@ object CalendarUtil {
ignored.printStackTrace() ignored.printStackTrace()
try { try {
val calendarCursor = context.contentResolver.query(CalendarContract.Calendars.CONTENT_URI, 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, null,
null) null)
@ -167,6 +170,7 @@ object CalendarUtil {
.remove(Constants.PREF_NEXT_EVENT_END_DATE) .remove(Constants.PREF_NEXT_EVENT_END_DATE)
.remove(Constants.PREF_NEXT_EVENT_ALL_DAY) .remove(Constants.PREF_NEXT_EVENT_ALL_DAY)
.remove(Constants.PREF_NEXT_EVENT_CALENDAR_ID) .remove(Constants.PREF_NEXT_EVENT_CALENDAR_ID)
.remove(Constants.PREF_NEXT_EVENT_LOCATION)
.commit() .commit()
Util.updateWidget(context) Util.updateWidget(context)
} }
@ -181,12 +185,13 @@ object CalendarUtil {
.putLong(Constants.PREF_NEXT_EVENT_END_DATE, event.endDate) .putLong(Constants.PREF_NEXT_EVENT_END_DATE, event.endDate)
.putBoolean(Constants.PREF_NEXT_EVENT_ALL_DAY, event.allDay) .putBoolean(Constants.PREF_NEXT_EVENT_ALL_DAY, event.allDay)
.putInt(Constants.PREF_NEXT_EVENT_CALENDAR_ID, event.calendarID) .putInt(Constants.PREF_NEXT_EVENT_CALENDAR_ID, event.calendarID)
.putString(Constants.PREF_NEXT_EVENT_LOCATION, event.address)
.commit() .commit()
Util.updateWidget(context) Util.updateWidget(context)
} }
fun getNextEvent(context: Context): Event { fun getNextEvent(context: Context): Event {
val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) 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 package com.tommasoberlose.anotherwidget.util
import android.Manifest import android.Manifest
import android.annotation.SuppressLint
import android.app.Notification import android.app.Notification
import android.app.NotificationManager import android.app.NotificationManager
import android.app.PendingIntent import android.app.PendingIntent
@ -29,6 +30,7 @@ import android.content.ComponentName
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.provider.CalendarContract import android.provider.CalendarContract
import android.provider.Settings import android.provider.Settings
import android.support.v4.graphics.drawable.DrawableCompat
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import android.view.animation.Animation import android.view.animation.Animation
@ -116,6 +118,20 @@ object Util {
context.startActivity(Intent.createChooser(sendIntent, context.getString(R.string.action_share))); 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? { fun getCurrentWallpaper(context: Context): Drawable? {
var wallpaper: Drawable? = null var wallpaper: Drawable? = null
try { try {
@ -252,7 +268,7 @@ object Util {
} else { } else {
val pm: PackageManager = context.packageManager val pm: PackageManager = context.packageManager
return try { 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.addCategory(Intent.CATEGORY_LAUNCHER)
intent intent
} catch (ex: Exception) { } catch (ex: Exception) {
@ -391,14 +407,14 @@ object Util {
return String(Character.toChars(unicode)) 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 nowDate = DateTime(now)
val eventDate = DateTime(start) val eventDate = DateTime(start)
val difference = start - now val difference = start - now
if (difference < 0) { if (difference < 0) {
return String.format("%s", title) return ""
} else if (difference < 1000 * 60) { } else if (difference < 1000 * 60) {
val minutes = TimeUnit.MILLISECONDS.toMinutes(difference) val minutes = TimeUnit.MILLISECONDS.toMinutes(difference)
var time = "" var time = ""
@ -406,7 +422,7 @@ object Util {
time += "" + minutes + context.getString(R.string.min_code) 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) { } else if (difference < 1000 * 60 * 6) {
val hour = TimeUnit.MILLISECONDS.toHours(difference) val hour = TimeUnit.MILLISECONDS.toHours(difference)
var time = "" var time = ""
@ -422,16 +438,45 @@ object Util {
time += "" + minutes + context.getString(R.string.min_code) 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) { } 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) { } 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 { } else {
val days = TimeUnit.MILLISECONDS.toDays(difference) 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.awareness.state.Weather
import com.google.android.gms.tasks.OnFailureListener import com.google.android.gms.tasks.OnFailureListener
import com.google.android.gms.tasks.OnSuccessListener import com.google.android.gms.tasks.OnSuccessListener
import java.util.*
/** /**
@ -89,7 +90,7 @@ object WeatherUtil {
val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
SP.edit() 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)) .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")) .putString(Constants.PREF_WEATHER_REAL_TEMP_UNIT, SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F"))
.commit() .commit()
Util.updateWidget(context) Util.updateWidget(context)
@ -159,6 +160,39 @@ object WeatherUtil {
Util.updateWidget(context) 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 { fun getWeatherIconResource(icon: String): Int {
when (icon) { when (icon) {
"01d" -> { "01d" -> {
@ -188,6 +222,18 @@ object WeatherUtil {
"50d" -> { "50d" -> {
return R.drawable.haze_day 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" -> { "01n" -> {
return R.drawable.clear_night return R.drawable.clear_night
} }
@ -215,8 +261,17 @@ object WeatherUtil {
"50n" -> { "50n" -> {
return R.drawable.haze_night 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 -> { else -> {
return -1 return R.drawable.unknown
} }
} }
} }

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.tommasoberlose.anotherwidget.ui.activity.MainActivity" tools:context="com.tommasoberlose.anotherwidget.ui.activity.MainActivity"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@ -69,6 +69,106 @@
android:orientation="vertical" android:orientation="vertical"
android:paddingTop="16dp" android:paddingTop="16dp"
android:paddingBottom="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 <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -225,6 +325,30 @@
android:id="@+id/show_until_label" android:id="@+id/show_until_label"
style="@style/AnotherWidget.Settings.Subtitle"/> style="@style/AnotherWidget.Settings.Subtitle"/>
</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_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 <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -318,6 +442,30 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/weather_settings" android:id="@+id/weather_settings"
android:orientation="vertical"> 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 <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -354,30 +502,6 @@
android:visibility="gone" android:visibility="gone"
android:src="@drawable/ic_action_alert"/> android:src="@drawable/ic_action_alert"/>
</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_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 <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

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

View File

@ -95,5 +95,13 @@
<string name="well_done">Ben Fatto!</string> <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="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="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> </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="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="well_done">Well Done!</string>
<string name="hs_code">h</string> <string name="hs_code">h</string>
<string name="tomorrow">tomorrow</string> <string name="tomorrow">Tomorrow</string>
<string name="today">oggi</string> <string name="today">Today</string>
<string name="settings_event_app_title">Tap on event opens</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> </resources>