Updated UI, New Settings and Bug Fixes

This commit is contained in:
Tommaso Berlose
2017-10-07 17:45:42 +02:00
parent ad20ea1778
commit 666bb4dcd9
64 changed files with 622 additions and 378 deletions

View File

@ -1,14 +1,19 @@
package com.tommasoberlose.anotherwidget.ui.activity
import android.Manifest
import android.annotation.SuppressLint
import android.app.PendingIntent
import android.content.pm.PackageManager
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v4.app.ActivityCompat
import android.appwidget.AppWidgetManager
import android.content.Intent
import android.content.ComponentName
import android.content.*
import android.preference.PreferenceManager
import android.provider.CalendarContract
import android.support.v4.content.ContextCompat
import android.view.View
import android.widget.RemoteViews
import android.widget.Toast
import com.tommasoberlose.anotherwidget.`object`.Constants
import com.tommasoberlose.anotherwidget.R
@ -17,15 +22,30 @@ import com.tommasoberlose.anotherwidget.ui.widget.TheWidget
import com.tommasoberlose.anotherwidget.util.UpdatesReceiver
import com.tommasoberlose.anotherwidget.util.WeatherReceiver
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.the_widget.*
import java.util.*
import java.util.concurrent.TimeUnit
import android.content.Intent
import android.content.BroadcastReceiver
class MainActivity : AppCompatActivity() {
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
updateUI()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
receiver
// TODO Util.showIntro(this)
action_support.setOnClickListener(object: View.OnClickListener {
override fun onClick(p0: View?) {
@ -33,31 +53,30 @@ class MainActivity : AppCompatActivity() {
}
})
action_rate.setOnClickListener(object: View.OnClickListener {
override fun onClick(p0: View?) {
Util.openURI(this@MainActivity, "")
}
})
action_share.setOnClickListener(object: View.OnClickListener {
override fun onClick(p0: View?) {
Util.share(this@MainActivity)
}
})
action_github.setOnClickListener(object: View.OnClickListener {
action_project.setOnClickListener(object: View.OnClickListener {
override fun onClick(p0: View?) {
Util.openURI(this@MainActivity, "https://github.com/tommasoberlose/another-widget")
}
})
}
override fun onResume() {
super.onResume()
val filter = IntentFilter()
filter.addAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
registerReceiver(receiver, filter);
updateUI()
Util.updateWidget(this)
}
override fun onPause() {
unregisterReceiver(receiver);
super.onPause();
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>,
@ -80,6 +99,7 @@ class MainActivity : AppCompatActivity() {
no_calendar_permission_container.visibility= View.GONE
no_location_permission_container.visibility= View.GONE
all_set_container.visibility = View.GONE
updateSettings()
if (!Util.checkGrantedPermission(this, Manifest.permission.READ_CALENDAR)) {
no_calendar_permission_container.visibility = View.VISIBLE
@ -100,7 +120,94 @@ class MainActivity : AppCompatActivity() {
all_set_container.visibility = View.VISIBLE
}
}
updateAppWidget()
Util.updateWidget(this)
}
internal fun updateAppWidget() {
widget_bg.setImageDrawable(Util.getCurrentWallpaper(this))
updateCalendarView()
updateLocationView()
}
fun updateCalendarView() {
val now = Calendar.getInstance()
val calendarLayout = Util.checkGrantedPermission(this, Manifest.permission.READ_CALENDAR)
empty_layout.visibility = View.VISIBLE
calendar_layout.visibility = View.GONE
empty_date.text = String.format("%s%s", Constants.dateFormat.format(now.time)[0].toUpperCase(), Constants.dateFormat.format(now.time).substring(1))
if (calendarLayout) {
val eventList = Util.getNextEvent(this)
if (eventList.isNotEmpty()) {
val difference = eventList[0].startDate - now.timeInMillis
if (difference > 1000 * 60) {
var time = ""
val hour = TimeUnit.MILLISECONDS.toHours(difference)
if (hour > 0) {
time = hour.toString() + getString(R.string.h_code)
}
val minutes = TimeUnit.MILLISECONDS.toMinutes(difference - hour * 3600 * 1000)
if (minutes > 0) {
time += " " + minutes + getString(R.string.min_code)
}
next_event.text = String.format("%s %s %s", eventList[0].title, getString(R.string.in_code), time)
} else {
next_event.text = String.format("%s", eventList[0].title)
}
next_event_date.text = String.format("%s - %s", Constants.hourFormat.format(eventList[0].startDate), Constants.hourFormat.format(eventList[0].endDate))
empty_layout.visibility = View.GONE
calendar_layout.visibility = View.VISIBLE
}
}
}
fun updateLocationView() {
val locationLayout = Util.checkGrantedPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
val SP = PreferenceManager.getDefaultSharedPreferences(this)
if (locationLayout && SP.contains(Constants.PREF_WEATHER_TEMP) && SP.contains(Constants.PREF_WEATHER_ICON)) {
weather.visibility = View.VISIBLE
calendar_weather.visibility = View.VISIBLE
val currentTemp = String.format(Locale.getDefault(), "%.0f °%s", SP.getFloat(Constants.PREF_WEATHER_TEMP, 0f), SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F"))
weather_icon.visibility = View.VISIBLE
empty_weather_icon.visibility = View.VISIBLE
val icon: String = SP.getString(Constants.PREF_WEATHER_ICON, "")
if (icon.equals("")) {
weather_icon.visibility = View.GONE
empty_weather_icon.visibility = View.GONE
} else {
weather_icon.setImageResource(Util.getWeatherIconResource(icon))
empty_weather_icon.setImageResource(Util.getWeatherIconResource(icon))
}
temp.text = currentTemp
calendar_temp.text = currentTemp
} else {
weather.visibility = View.GONE
calendar_weather.visibility = View.GONE
}
}
fun updateSettings() {
val SP = PreferenceManager.getDefaultSharedPreferences(this)
temp_unit.text = if (SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F").equals("F")) getString(R.string.fahrenheit) else getString(R.string.celsius)
action_change_unit.setOnClickListener(object: View.OnClickListener {
@SuppressLint("ApplySharedPref")
override fun onClick(p0: View?) {
SP.edit().putString(Constants.PREF_WEATHER_TEMP_UNIT, if (SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F").equals("F")) "C" else "F").commit()
Util.getWeather(this@MainActivity)
updateSettings()
}
})
}
}

View File

@ -0,0 +1,41 @@
package com.tommasoberlose.anotherwidget.ui.activity
import android.Manifest
import android.os.Bundle
import com.tommasoberlose.anotherwidget.R
import com.heinrichreimersoftware.materialintro.app.IntroActivity
import com.heinrichreimersoftware.materialintro.slide.SimpleSlide
class SplashActivity : IntroActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
isButtonNextVisible = true
isButtonBackVisible = false
isButtonCtaVisible = false
buttonCtaTintMode = BUTTON_CTA_TINT_MODE_TEXT
addSlide(SimpleSlide.Builder()
.title(R.string.app_name)
.background(R.color.colorPrimary)
.backgroundDark(R.color.colorPrimaryDark)
.build())
addSlide(SimpleSlide.Builder()
.title(R.string.title_permission_calendar)
.description(R.string.description_permission_calendar)
.background(R.color.colorPrimary)
.backgroundDark(R.color.colorPrimaryDark)
.permission(Manifest.permission.READ_CALENDAR)
.build())
addSlide(SimpleSlide.Builder()
.title(R.string.title_permission_location)
.description(R.string.description_permission_location)
.background(R.color.colorPrimary)
.backgroundDark(R.color.colorPrimaryDark)
.permission(Manifest.permission.ACCESS_COARSE_LOCATION)
.build())
}
}

View File

@ -68,156 +68,86 @@ class TheWidget : AppWidgetProvider() {
}
fun updateCalendarView(context: Context, views: RemoteViews, widgetID: Int): RemoteViews {
val now = Calendar.getInstance()
val calendarLayout = Util.checkGrantedPermission(context, Manifest.permission.READ_CALENDAR)
val now = Calendar.getInstance()
val calendarLayout = Util.checkGrantedPermission(context, Manifest.permission.READ_CALENDAR)
views.setViewVisibility(R.id.empty_layout, View.VISIBLE)
views.setViewVisibility(R.id.calendar_layout, View.GONE)
views.setTextViewText(R.id.empty_date, Constants.dateFormat.format(now.time))
views.setViewVisibility(R.id.empty_layout, View.VISIBLE)
views.setViewVisibility(R.id.calendar_layout, View.GONE)
views.setTextViewText(R.id.empty_date, Constants.dateFormat.format(now.time))
val calIntent = Intent(Intent.ACTION_MAIN)
calIntent.addCategory(Intent.CATEGORY_APP_CALENDAR)
val calPIntent = PendingIntent.getActivity(context, widgetID, calIntent, 0)
views.setOnClickPendingIntent(R.id.main_layout, calPIntent)
val calIntent = Intent(Intent.ACTION_MAIN)
calIntent.addCategory(Intent.CATEGORY_APP_CALENDAR)
val calPIntent = PendingIntent.getActivity(context, widgetID, calIntent, 0)
views.setOnClickPendingIntent(R.id.main_layout, calPIntent)
if (calendarLayout) {
val eventList = Util.getNextEvent(context)
if (calendarLayout) {
val eventList = Util.getNextEvent(context)
if (eventList.isNotEmpty()) {
val difference = eventList[0].startDate - now.timeInMillis
if (eventList.isNotEmpty()) {
val difference = eventList[0].startDate - now.timeInMillis
if (difference > 1000 * 60) {
var time = ""
val hour = TimeUnit.MILLISECONDS.toHours(difference)
if (hour > 0) {
time = hour.toString() + "h"
}
val minutes = TimeUnit.MILLISECONDS.toMinutes(difference - hour * 3600 * 1000)
if (minutes > 0) {
time += " " + minutes + "min"
if (difference > 1000 * 60) {
var time = ""
val hour = TimeUnit.MILLISECONDS.toHours(difference)
if (hour > 0) {
time = hour.toString() + context.getString(R.string.h_code)
}
val minutes = TimeUnit.MILLISECONDS.toMinutes(difference - hour * 3600 * 1000)
if (minutes > 0) {
time += " " + minutes + context.getString(R.string.min_code)
}
views.setTextViewText(R.id.next_event, String.format("%s %s %s", eventList[0].title, context.getString(R.string.in_code), time))
} else {
views.setTextViewText(R.id.next_event, String.format("%s", eventList[0].title))
}
views.setTextViewText(R.id.next_event_date, String.format("%s - %s", Constants.hourFormat.format(eventList[0].startDate), Constants.hourFormat.format(eventList[0].endDate)))
views.setTextViewText(R.id.next_event, String.format("%s in %s", eventList[0].title, time))
} else {
views.setTextViewText(R.id.next_event, String.format("%s", eventList[0].title))
views.setViewVisibility(R.id.empty_layout, View.GONE)
views.setViewVisibility(R.id.calendar_layout, View.VISIBLE)
val builder = CalendarContract.CONTENT_URI.buildUpon()
builder.appendPath("time")
ContentUris.appendId(builder, eventList[0].startDate)
val intent = Intent(Intent.ACTION_VIEW)
.setData(builder.build())
val pIntent = PendingIntent.getActivity(context, widgetID, intent, 0)
views.setOnClickPendingIntent(R.id.main_layout, pIntent)
}
views.setTextViewText(R.id.next_event_date, String.format("%s - %s", Constants.hourFormat.format(eventList[0].startDate), Constants.hourFormat.format(eventList[0].endDate)))
views.setViewVisibility(R.id.empty_layout, View.GONE)
views.setViewVisibility(R.id.calendar_layout, View.VISIBLE)
val builder = CalendarContract.CONTENT_URI.buildUpon()
builder.appendPath("time")
ContentUris.appendId(builder, eventList[0].startDate)
val intent = Intent(Intent.ACTION_VIEW)
.setData(builder.build())
val pIntent = PendingIntent.getActivity(context, widgetID, intent, 0)
views.setOnClickPendingIntent(R.id.main_layout, pIntent)
}
return views
}
return views
}
fun updateLocationView(context: Context, views: RemoteViews): RemoteViews {
val locationLayout = Util.checkGrantedPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION)
fun updateLocationView(context: Context, views: RemoteViews): RemoteViews {
val locationLayout = Util.checkGrantedPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION)
val SP = PreferenceManager.getDefaultSharedPreferences(context)
if (locationLayout && SP.contains(Constants.PREF_WEATHER_TEMP) && SP.contains(Constants.PREF_WEATHER_ICON)) {
views.setViewVisibility(R.id.weather, View.VISIBLE)
views.setViewVisibility(R.id.calendar_weather, View.VISIBLE)
val temp = String.format(Locale.getDefault(), "%.0f °C", SP.getFloat(Constants.PREF_WEATHER_TEMP, 0f))
val SP = PreferenceManager.getDefaultSharedPreferences(context)
if (locationLayout && SP.contains(Constants.PREF_WEATHER_TEMP) && SP.contains(Constants.PREF_WEATHER_ICON)) {
views.setViewVisibility(R.id.weather, View.VISIBLE)
views.setViewVisibility(R.id.calendar_weather, View.VISIBLE)
val temp = String.format(Locale.getDefault(), "%.0f °%s", SP.getFloat(Constants.PREF_WEATHER_TEMP, 0f), SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F"))
views.setViewVisibility(R.id.weather_icon, View.VISIBLE)
views.setViewVisibility(R.id.empty_weather_icon, View.VISIBLE)
when (SP.getString(Constants.PREF_WEATHER_ICON, "")) {
"01d" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.clear_day)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.clear_day)
}
"02d" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.partly_cloudy)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.partly_cloudy)
}
"03d" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.mostly_cloudy)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.mostly_cloudy)
}
"04d" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.cloudy_weather)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.cloudy_weather)
}
"09d" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.storm_weather_day)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.storm_weather_day)
}
"10d" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.rainy_day)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.rainy_day)
}
"11d" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.thunder_day)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.thunder_day)
}
"13d" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.snow_day)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.snow_day)
}
"50d" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.haze_day)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.haze_day)
}
"01n" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.clear_night)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.clear_night)
}
"02n" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.partly_cloudy_night)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.partly_cloudy_night)
}
"03n" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.mostly_cloudy_night)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.mostly_cloudy_night)
}
"04n" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.cloudy_weather)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.cloudy_weather)
}
"09n" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.storm_weather_night)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.storm_weather_night)
}
"10n" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.rainy_night)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.rainy_night)
}
"11n" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.thunder_night)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.thunder_night)
}
"13n" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.snow_night)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.snow_night)
}
"50n" -> {
views.setImageViewResource(R.id.weather_icon, R.drawable.haze_night)
views.setImageViewResource(R.id.empty_weather_icon, R.drawable.haze_night)
}
else -> {
views.setViewVisibility(R.id.weather_icon, View.VISIBLE)
views.setViewVisibility(R.id.empty_weather_icon, View.VISIBLE)
val icon: String = SP.getString(Constants.PREF_WEATHER_ICON, "")
if (icon.equals("")) {
views.setViewVisibility(R.id.weather_icon, View.GONE)
views.setViewVisibility(R.id.empty_weather_icon, View.GONE)
} else {
views.setImageViewResource(R.id.weather_icon, Util.getWeatherIconResource(icon))
views.setImageViewResource(R.id.empty_weather_icon, Util.getWeatherIconResource(icon))
}
}
views.setTextViewText(R.id.temp, temp)
views.setTextViewText(R.id.calendar_temp, temp)
} else {
views.setViewVisibility(R.id.weather, View.GONE)
views.setViewVisibility(R.id.calendar_weather, View.GONE)
}
return views
views.setTextViewText(R.id.temp, temp)
views.setTextViewText(R.id.calendar_temp, temp)
} else {
views.setViewVisibility(R.id.weather, View.GONE)
views.setViewVisibility(R.id.calendar_weather, View.GONE)
}
return views
}
}
}