diff --git a/app/build.gradle b/app/build.gradle
index fb03c0e..d0d7c1c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -46,7 +46,6 @@ dependencies {
transitive = true;
}
compile 'com.android.support:design:26.1.0'
- compile 'com.github.rubensousa:bottomsheetbuilder:1.6.0'
- compile 'com.github.johnhiott:DarkSkyApi:v0.1.5'
compile 'org.greenrobot:eventbus:3.0.0'
+ compile 'com.android.support:recyclerview-v7:26.1.0'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a40cddd..39acf35 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -66,6 +66,7 @@
+
@@ -78,7 +79,12 @@
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleInstance"
android:screenOrientation="portrait" />
-
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/object/Constants.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/object/Constants.kt
index ce590c9..d7f7210 100644
--- a/app/src/main/java/com/tommasoberlose/anotherwidget/object/Constants.kt
+++ b/app/src/main/java/com/tommasoberlose/anotherwidget/object/Constants.kt
@@ -14,6 +14,7 @@ object Constants {
val LOCATION_REQUEST_CODE = 2
val CALENDAR_APP_REQUEST_CODE = 3
val WEATHER_APP_REQUEST_CODE = 4
+ val WEATHER_PROVIDER_REQUEST_CODE = 5
val RESULT_CODE_CUSTOM_LOCATION = 45
@@ -45,6 +46,7 @@ object Constants {
val PREF_CALENDAR_APP_PACKAGE = "PREF_CALENDAR_APP_PACKAGE"
val PREF_WEATHER_APP_NAME = "PREF_WEATHER_APP_NAME"
val PREF_WEATHER_APP_PACKAGE = "PREF_WEATHER_APP_PACKAGE"
+ val PREF_WEATHER_PROVIDER_API_KEY = "PREF_WEATHER_PROVIDER_API_KEY"
val itDateFormat = SimpleDateFormat("EEEE, d MMM")
val engDateFormat = SimpleDateFormat("EEEE, MMM d")
diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/receiver/WeatherReceiver.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/receiver/WeatherReceiver.kt
index 4ec4ee9..ea1a5b1 100644
--- a/app/src/main/java/com/tommasoberlose/anotherwidget/receiver/WeatherReceiver.kt
+++ b/app/src/main/java/com/tommasoberlose/anotherwidget/receiver/WeatherReceiver.kt
@@ -18,7 +18,7 @@ class WeatherReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action.equals(Intent.ACTION_BOOT_COMPLETED) || intent.action.equals(Intent.ACTION_MY_PACKAGE_REPLACED)) {
setUpdates(context)
- } else if (intent.action.equals(Constants.ACTION_WEATHER_UPDATE)) {
+ } else if (intent.action.equals(Constants.ACTION_WEATHER_UPDATE) || intent.action.equals("android.location.PROVIDERS_CHANGED")) {
WeatherUtil.updateWeather(context)
}
}
diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/ChooseApplicationActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/ChooseApplicationActivity.kt
index b976c0b..96dbfb1 100644
--- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/ChooseApplicationActivity.kt
+++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/ChooseApplicationActivity.kt
@@ -19,13 +19,15 @@ import android.widget.ArrayAdapter
import com.tommasoberlose.anotherwidget.`object`.ApplicationListEvent
import android.content.pm.PackageManager
import android.location.Geocoder
+import android.support.v7.widget.LinearLayoutManager
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
+import com.tommasoberlose.anotherwidget.ui.adapter.ApplicationInfoAdapter
class ChooseApplicationActivity : AppCompatActivity() {
- lateinit var adapter: ArrayAdapter
+ lateinit var adapter: ApplicationInfoAdapter
val appList = ArrayList()
val appListFiltered = ArrayList()
@@ -38,16 +40,20 @@ class ChooseApplicationActivity : AppCompatActivity() {
selectDefaultApp()
}
- adapter = ArrayAdapter(this, R.layout.custom_location_item, appList.map { it.name })
- list_view.adapter = adapter
+ list_view.setHasFixedSize(true);
+ val mLayoutManager = LinearLayoutManager(this);
+ list_view.layoutManager = mLayoutManager;
- list_view.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
+ adapter = ApplicationInfoAdapter(this, appListFiltered);
+ list_view.setAdapter(adapter);
+
+ /*list_view.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
val resultIntent = Intent()
resultIntent.putExtra(Constants.RESULT_APP_NAME, pm.getApplicationLabel(appListFiltered[position]).toString())
resultIntent.putExtra(Constants.RESULT_APP_PACKAGE, appListFiltered[position].packageName)
setResult(Activity.RESULT_OK, resultIntent)
finish()
- }
+ }*/
location.addTextChangedListener(object: TextWatcher {
override fun afterTextChanged(text: Editable?) {
@@ -95,20 +101,12 @@ class ChooseApplicationActivity : AppCompatActivity() {
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
fun onMessageEvent(event: ApplicationListEvent) {
- val pm = packageManager
- adapter.clear()
if (!event.filtered) {
appList.clear()
event.apps.mapTo(appList, {it})
- for (a:ApplicationInfo in appList) {
- adapter.add(pm.getApplicationLabel(a).toString())
- }
}
appListFiltered.clear()
event.apps.mapTo(appListFiltered, {it})
- for (a:ApplicationInfo in appListFiltered) {
- adapter.add(pm.getApplicationLabel(a).toString())
- }
- adapter.notifyDataSetChanged()
+ adapter.changeData(appListFiltered)
}
}
diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/MainActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/MainActivity.kt
index fb9bc53..1053fc8 100644
--- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/MainActivity.kt
+++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/MainActivity.kt
@@ -24,12 +24,14 @@ import com.tommasoberlose.anotherwidget.util.CalendarUtil
import com.tommasoberlose.anotherwidget.util.WeatherUtil
import android.content.DialogInterface
import android.graphics.drawable.Drawable
+import android.support.design.widget.BottomSheetDialog
import android.util.Log
import android.widget.Toast
import com.crashlytics.android.Crashlytics
import com.tommasoberlose.anotherwidget.`object`.CalendarSelector
import io.fabric.sdk.android.Fabric
import kotlinx.android.synthetic.main.activity_main.*
+import kotlinx.android.synthetic.main.main_menu_layout.view.*
import kotlinx.android.synthetic.main.the_widget.*
@@ -55,10 +57,6 @@ class MainActivity : AppCompatActivity() {
AppWidgetManager.INVALID_APPWIDGET_ID)
if (mAppWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
-
- action_refresh.visibility = View.GONE
- action_support.visibility = View.GONE
- action_share.visibility = View.GONE
action_add_widget.visibility = View.VISIBLE
action_add_widget.setOnClickListener {
@@ -67,22 +65,47 @@ class MainActivity : AppCompatActivity() {
}
}
- action_support.setOnClickListener(object: View.OnClickListener {
- override fun onClick(p0: View?) {
- Util.openURI(this@MainActivity, "https://paypal.me/tommasoberlose")
- }
- })
- action_share.setOnClickListener(object: View.OnClickListener {
- override fun onClick(p0: View?) {
- Util.share(this@MainActivity)
- }
- })
- action_refresh.setOnClickListener {
- WeatherUtil.updateWeather(this)
- CalendarUtil.updateEventList(this)
- Util.updateWidget(this)
+ action_menu.setOnClickListener {
+ val mBottomSheetDialog: BottomSheetDialog = BottomSheetDialog(this)
+ val menuView: View = getLayoutInflater().inflate(R.layout.main_menu_layout, null)
+ menuView.action_support.setOnClickListener(object: View.OnClickListener {
+ override fun onClick(p0: View?) {
+ Util.openURI(this@MainActivity, "https://paypal.me/tommasoberlose")
+ mBottomSheetDialog.dismiss()
+ }
+ })
+
+ menuView.action_share.setOnClickListener(object: View.OnClickListener {
+ override fun onClick(p0: View?) {
+ Util.share(this@MainActivity)
+ mBottomSheetDialog.dismiss()
+ }
+ })
+
+ menuView.action_rate.setOnClickListener(object: View.OnClickListener {
+ override fun onClick(p0: View?) {
+ Util.rateApp(this@MainActivity, "https://play.google.com/store/apps/details?id=com.tommasoberlose.anotherwidget")
+ mBottomSheetDialog.dismiss()
+ }
+ })
+
+ menuView.action_feedback.setOnClickListener(object: View.OnClickListener {
+ override fun onClick(p0: View?) {
+ Util.sendEmail(this@MainActivity)
+ mBottomSheetDialog.dismiss()
+ }
+ })
+
+ menuView.action_refresh.setOnClickListener {
+ WeatherUtil.updateWeather(this)
+ CalendarUtil.updateEventList(this)
+ Util.updateWidget(this)
+ mBottomSheetDialog.dismiss()
+ }
+ mBottomSheetDialog.setContentView(menuView)
+ mBottomSheetDialog.show();
}
}
@@ -125,8 +148,13 @@ class MainActivity : AppCompatActivity() {
updateSettings()
}
Constants.LOCATION_REQUEST_CODE -> if (!(permissions.size != 1 || grantResults.size != 1 || grantResults[0] != PackageManager.PERMISSION_GRANTED)) {
- WeatherUtil.updateWeather(this)
- updateAppWidget()
+ val SP = PreferenceManager.getDefaultSharedPreferences(this)
+ if (SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, "").equals("")) {
+ startActivityForResult(Intent(this, WeatherProviderActivity::class.java), Constants.WEATHER_PROVIDER_REQUEST_CODE)
+ } else {
+ WeatherUtil.updateWeather(this)
+ updateAppWidget()
+ }
updateSettings()
}
}
@@ -169,6 +197,9 @@ class MainActivity : AppCompatActivity() {
Util.updateWidget(this)
updateSettings()
updateAppWidget()
+ } else if (requestCode == Constants.WEATHER_PROVIDER_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
+ sendBroadcast(Intent(Constants.ACTION_WEATHER_UPDATE))
+ updateSettings()
}
}
@@ -179,9 +210,9 @@ class MainActivity : AppCompatActivity() {
empty_layout.visibility = View.VISIBLE
calendar_layout.visibility = View.GONE
- var dateStringValue: String = String.format("%s%s", Constants.engDateFormat.format(now.time)[0].toUpperCase(), Constants.engDateFormat.format(now.time).substring(1))
+ var dateStringValue: String = Util.getCapWordString(Constants.engDateFormat.format(now.time))
if (SP.getBoolean(Constants.PREF_ITA_FORMAT_DATE, false)) {
- dateStringValue = String.format("%s%s", Constants.itDateFormat.format(now.time)[0].toUpperCase(), Constants.itDateFormat.format(now.time).substring(1))
+ dateStringValue = Util.getCapWordString(Constants.itDateFormat.format(now.time))
}
empty_date.text = dateStringValue
//empty_date.setImageBitmap(Util.buildUpdate(this, String.format("%s%s", Constants.dateFormat.format(now.time)[0].toUpperCase(), Constants.dateFormat.format(now.time).substring(1)), "fonts/product_sans_regular.ttf"))
@@ -241,7 +272,7 @@ class MainActivity : AppCompatActivity() {
fun updateLocationView() {
val SP = PreferenceManager.getDefaultSharedPreferences(this)
- val locationLayout = SP.getBoolean(Constants.PREF_SHOW_WEATHER, true) && Util.checkGrantedPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
+ val locationLayout = SP.getBoolean(Constants.PREF_SHOW_WEATHER, true)
if (locationLayout && SP.contains(Constants.PREF_WEATHER_TEMP) && SP.contains(Constants.PREF_WEATHER_ICON)) {
weather.visibility = View.VISIBLE
@@ -408,6 +439,17 @@ class MainActivity : AppCompatActivity() {
startActivityForResult(Intent(this, ChooseApplicationActivity::class.java), Constants.WEATHER_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 = CalendarUtil.getCalendarList(this)
var calFiltered = SP.getString(Constants.PREF_CALENDAR_FILTER, "")
diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/WeatherProviderActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/WeatherProviderActivity.kt
new file mode 100644
index 0000000..509162e
--- /dev/null
+++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/WeatherProviderActivity.kt
@@ -0,0 +1,71 @@
+package com.tommasoberlose.anotherwidget.ui.activity
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.app.AlertDialog
+import android.content.ClipboardManager
+import android.content.Context
+import android.content.DialogInterface
+import android.support.v7.app.AppCompatActivity
+import android.os.Bundle
+import android.preference.PreferenceManager
+import android.text.Editable
+import android.text.TextWatcher
+import android.view.View
+import com.tommasoberlose.anotherwidget.R
+import com.tommasoberlose.anotherwidget.`object`.Constants
+import kotlinx.android.synthetic.main.activity_weather_provider.*
+
+class WeatherProviderActivity : AppCompatActivity() {
+
+ @SuppressLint("ApplySharedPref")
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_weather_provider)
+
+ val SP = PreferenceManager.getDefaultSharedPreferences(this)
+ action_paste.setOnClickListener {
+ val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
+ api_key.setText(clipboard.primaryClip.getItemAt(0).text)
+ }
+
+ action_save.setOnClickListener {
+ SP.edit()
+ .putString(Constants.PREF_WEATHER_PROVIDER_API_KEY, api_key.text.toString())
+ .commit()
+ setResult(Activity.RESULT_OK)
+ finish()
+ }
+
+ api_key.addTextChangedListener(object: TextWatcher {
+ override fun afterTextChanged(text: Editable?) {
+ if (text.toString().equals("") || text.toString().equals(SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, ""))) {
+ action_save.animate().scaleY(-2f).start()
+ } else {
+ action_save.animate().scaleY(0f).start()
+ }
+ }
+
+ override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+ }
+
+ override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
+ }
+ })
+ }
+
+ override fun onBackPressed() {
+ val SP = PreferenceManager.getDefaultSharedPreferences(this)
+ if (api_key.text.toString().equals("") || !api_key.text.toString().equals(SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, ""))) {
+ AlertDialog.Builder(this)
+ .setTitle(getString(R.string.error_weather_api_key))
+ .setNegativeButton(android.R.string.cancel, null)
+ .setPositiveButton(android.R.string.ok, DialogInterface.OnClickListener { _,_ ->
+ super.onBackPressed()
+ })
+ .show()
+ } else {
+ super.onBackPressed()
+ }
+ }
+}
diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/adapter/ApplicationInfoAdapter.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/adapter/ApplicationInfoAdapter.kt
new file mode 100644
index 0000000..1baae55
--- /dev/null
+++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/adapter/ApplicationInfoAdapter.kt
@@ -0,0 +1,44 @@
+package com.tommasoberlose.anotherwidget.ui.adapter
+
+import android.content.Context
+import android.content.pm.ApplicationInfo
+import android.support.v7.widget.RecyclerView
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import com.tommasoberlose.anotherwidget.R
+import java.io.File
+
+/**
+ * Created by tommaso on 15/10/17.
+ */
+class ApplicationInfoAdapter (private val context: Context, private var mDataset: ArrayList) : RecyclerView.Adapter() {
+
+ class ViewHolder(var view: View, var text: TextView, var icon: ImageView) : RecyclerView.ViewHolder(view)
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+ val v = LayoutInflater.from(parent.context).inflate(R.layout.application_info_layout, parent, false)
+ return ViewHolder(v, v.findViewById(R.id.text), v.findViewById(R.id.icon))
+ }
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ val pm = context.packageManager
+ holder.text.text = pm.getApplicationLabel(mDataset[position]).toString()
+ try {
+ holder.icon.setImageDrawable(mDataset[position].loadIcon(pm))
+ } catch (ignore: Exception) {
+ }
+ }
+
+ override fun getItemCount(): Int {
+ return mDataset.size
+ }
+
+ fun changeData(newData: ArrayList) {
+ mDataset = newData
+ notifyDataSetChanged()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widget/TheWidget.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widget/TheWidget.kt
index a203cbd..fbe1348 100644
--- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widget/TheWidget.kt
+++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widget/TheWidget.kt
@@ -80,9 +80,9 @@ class TheWidget : AppWidgetProvider() {
views.setViewVisibility(R.id.empty_layout, View.VISIBLE)
views.setViewVisibility(R.id.calendar_layout, View.GONE)
- var dateStringValue: String = String.format("%s%s", Constants.engDateFormat.format(now.time)[0].toUpperCase(), Constants.engDateFormat.format(now.time).substring(1))
+ var dateStringValue: String = Util.getCapWordString(Constants.engDateFormat.format(now.time))
if (SP.getBoolean(Constants.PREF_ITA_FORMAT_DATE, false)) {
- dateStringValue = String.format("%s%s", Constants.itDateFormat.format(now.time)[0].toUpperCase(), Constants.itDateFormat.format(now.time).substring(1))
+ dateStringValue = Util.getCapWordString(Constants.itDateFormat.format(now.time))
}
views.setTextViewText(R.id.empty_date, dateStringValue)
//views.setImageViewBitmap(R.id.empty_date, Util.buildUpdate(context, Constants.dateFormat.format(now.time)[0].toUpperCase() + Constants.dateFormat.format(now.time).substring(1), "fonts/product_sans_regular.ttf"))
@@ -158,7 +158,7 @@ class TheWidget : AppWidgetProvider() {
fun updateLocationView(context: Context, views: RemoteViews, widgetID: Int): RemoteViews {
val SP = PreferenceManager.getDefaultSharedPreferences(context)
- val locationLayout = SP.getBoolean(Constants.PREF_SHOW_WEATHER, true) && Util.checkGrantedPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
+ val locationLayout = SP.getBoolean(Constants.PREF_SHOW_WEATHER, true)
if (locationLayout && SP.contains(Constants.PREF_WEATHER_TEMP) && SP.contains(Constants.PREF_WEATHER_ICON)) {
views.setViewVisibility(R.id.weather, View.VISIBLE)
diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/util/CalendarUtil.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/util/CalendarUtil.kt
index bb569c0..21b04d5 100644
--- a/app/src/main/java/com/tommasoberlose/anotherwidget/util/CalendarUtil.kt
+++ b/app/src/main/java/com/tommasoberlose/anotherwidget/util/CalendarUtil.kt
@@ -22,74 +22,78 @@ object CalendarUtil {
fun updateEventList(context: Context) {
val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
- val eventList = ArrayList()
+ if (SP.getBoolean(Constants.PREF_SHOW_EVENTS, true)) {
+ val eventList = ArrayList()
- val now = Calendar.getInstance()
- val limit = Calendar.getInstance()
- when (SP.getInt(Constants.PREF_SHOW_UNTIL, 1)) {
- 0 -> limit.add(Calendar.HOUR, 3)
- 1 -> limit.add(Calendar.HOUR, 6)
- 2 -> limit.add(Calendar.HOUR, 12)
- 3 -> limit.add(Calendar.DAY_OF_MONTH, 1)
- 4 -> limit.add(Calendar.DAY_OF_MONTH, 3)
- 5 -> limit.add(Calendar.DAY_OF_MONTH, 7)
- else -> limit.add(Calendar.HOUR, 6)
- }
-
-
- val builder = CalendarContract.Instances.CONTENT_URI.buildUpon()
- ContentUris.appendId(builder, now.timeInMillis)
- ContentUris.appendId(builder, limit.timeInMillis)
-
- if (!Util.checkGrantedPermission(context, Manifest.permission.READ_CALENDAR)) {
- resetNextEventData(context)
- } else {
-
- val instanceCursor = context.contentResolver.query(builder.build(), arrayOf(CalendarContract.Instances.EVENT_ID, CalendarContract.Instances.BEGIN, CalendarContract.Instances.END), null, null, null)
- if (instanceCursor != null && instanceCursor.count > 0) {
- instanceCursor.moveToFirst()
-
- 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),
- CalendarContract.Events._ID + " is ?",
- arrayOf(Integer.toString(ID)), null)
-
- if (eventCursor != null && eventCursor.count > 0) {
- eventCursor.moveToFirst()
-
- for (j in 0 until eventCursor.count) {
- val e = Event(eventCursor, instanceCursor)
- val allDay: Boolean = !eventCursor.getString(1).equals("0")
- if ((SP.getBoolean(Constants.PREF_CALENDAR_ALL_DAY, false) || !allDay) && !(SP.getString(Constants.PREF_CALENDAR_FILTER, "").contains(" " + e.calendarID + ","))) {
- eventList.add(e)
- }
- eventCursor.moveToNext()
- }
- }
-
- eventCursor.close()
-
- instanceCursor.moveToNext()
- }
+ val now = Calendar.getInstance()
+ val limit = Calendar.getInstance()
+ when (SP.getInt(Constants.PREF_SHOW_UNTIL, 1)) {
+ 0 -> limit.add(Calendar.HOUR, 3)
+ 1 -> limit.add(Calendar.HOUR, 6)
+ 2 -> limit.add(Calendar.HOUR, 12)
+ 3 -> limit.add(Calendar.DAY_OF_MONTH, 1)
+ 4 -> limit.add(Calendar.DAY_OF_MONTH, 3)
+ 5 -> limit.add(Calendar.DAY_OF_MONTH, 7)
+ else -> limit.add(Calendar.HOUR, 6)
}
- instanceCursor.close()
- if (eventList.isEmpty()) {
+ val builder = CalendarContract.Instances.CONTENT_URI.buildUpon()
+ ContentUris.appendId(builder, now.timeInMillis)
+ ContentUris.appendId(builder, limit.timeInMillis)
+
+ if (!Util.checkGrantedPermission(context, Manifest.permission.READ_CALENDAR)) {
resetNextEventData(context)
} else {
- Collections.sort(eventList, { event: Event, event1: Event ->
- if (event.startDate > event1.startDate) {
- return@sort 1
- } else if (event.startDate < event1.startDate) {
- return@sort -1
+
+ val instanceCursor = context.contentResolver.query(builder.build(), arrayOf(CalendarContract.Instances.EVENT_ID, CalendarContract.Instances.BEGIN, CalendarContract.Instances.END), null, null, null)
+ if (instanceCursor != null && instanceCursor.count > 0) {
+ instanceCursor.moveToFirst()
+
+ 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),
+ CalendarContract.Events._ID + " is ?",
+ arrayOf(Integer.toString(ID)), null)
+
+ if (eventCursor != null && eventCursor.count > 0) {
+ eventCursor.moveToFirst()
+
+ for (j in 0 until eventCursor.count) {
+ val e = Event(eventCursor, instanceCursor)
+ val allDay: Boolean = !eventCursor.getString(1).equals("0")
+ if ((SP.getBoolean(Constants.PREF_CALENDAR_ALL_DAY, false) || !allDay) && !(SP.getString(Constants.PREF_CALENDAR_FILTER, "").contains(" " + e.calendarID + ","))) {
+ eventList.add(e)
+ }
+ eventCursor.moveToNext()
+ }
+ }
+
+ eventCursor.close()
+
+ instanceCursor.moveToNext()
}
- return@sort 0
- })
- saveNextEventData(context, eventList.get(0))
+ }
+
+ instanceCursor.close()
+
+ if (eventList.isEmpty()) {
+ resetNextEventData(context)
+ } else {
+ Collections.sort(eventList, { event: Event, event1: Event ->
+ if (event.startDate > event1.startDate) {
+ return@sort 1
+ } else if (event.startDate < event1.startDate) {
+ return@sort -1
+ }
+ return@sort 0
+ })
+ saveNextEventData(context, eventList.get(0))
+ }
}
+ } else {
+ resetNextEventData(context)
}
}
diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt
index 8a1ae5f..83f8f14 100644
--- a/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt
+++ b/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt
@@ -27,6 +27,7 @@ import android.util.TypedValue
import android.content.Intent
import android.content.ComponentName
import android.preference.PreferenceManager
+import android.provider.Settings
import android.util.Log
import android.widget.Toast
import com.tommasoberlose.anotherwidget.`object`.Constants
@@ -76,10 +77,10 @@ object Util {
fun openURI(context: Context, url: String) {
try {
- val builder: CustomTabsIntent.Builder = CustomTabsIntent.Builder();
- builder.setToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary));
- val customTabsIntent: CustomTabsIntent = builder.build();
- customTabsIntent.launchUrl(context, Uri.parse(url));
+ val builder: CustomTabsIntent.Builder = CustomTabsIntent.Builder()
+ builder.setToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary))
+ val customTabsIntent: CustomTabsIntent = builder.build()
+ customTabsIntent.launchUrl(context, Uri.parse(url))
} catch (e: Exception) {
try {
val openIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url));
@@ -91,10 +92,11 @@ object Util {
Toast.makeText(context, R.string.error_opening_uri, Toast.LENGTH_LONG).show()
}
}
- val clipboard:ClipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
- val clip = ClipData.newPlainText(context.getString(R.string.app_name), url);
- clipboard.primaryClip = clip;
- Toast.makeText(context, R.string.error_opening_uri, Toast.LENGTH_LONG).show()
+ }
+
+ fun rateApp(context: Context, url: String) {
+ val openIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
+ context.startActivity(openIntent)
}
fun share(context: Context) {
@@ -229,4 +231,55 @@ object Util {
}
}
+ fun getCapWordString(text: String): String {
+ return try {
+ val ar = text.split(" ")
+ var newText = ""
+ for (t: String in ar) {
+ newText += " "
+ newText += t.substring(0, 1).toUpperCase()
+ newText += t.substring(1)
+ }
+ newText.substring(1)
+ } catch (e: Exception) {
+ text
+ }
+ }
+
+
+
+ fun showLocationNotification(context: Context, show: Boolean) {
+ val mNotificationManager: NotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager;
+
+ if (show) {
+ val mBuilder: NotificationCompat.Builder = NotificationCompat.Builder(context, "Settings")
+ .setSmallIcon(R.drawable.ic_stat_name)
+ .setPriority(Notification.PRIORITY_MIN)
+ .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
+ .setContentTitle(context.getString(R.string.notification_gps_title))
+ .setContentText(context.getString(R.string.notification_gps_subtitle))
+ .setAutoCancel(true);
+
+ val intent: Intent = Intent( Settings.ACTION_LOCATION_SOURCE_SETTINGS);
+ val pi: PendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ mBuilder.setContentIntent(pi);
+ mNotificationManager.notify(1, mBuilder.build());
+ } else {
+ mNotificationManager.cancel(1);
+ }
+
+ }
+
+ fun sendEmail(context: Context) {
+ val i:Intent = Intent(Intent.ACTION_SEND)
+ i.type = "message/rfc822"
+ i.putExtra(Intent.EXTRA_EMAIL, arrayOf("tommaso.berlose@gmail.com"))
+ i.putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.feedback_title))
+ try {
+ context.startActivity(Intent.createChooser(i, context.getString(R.string.feedback_chooser_title)))
+ } catch (ex: Exception) {
+ Toast.makeText(context, R.string.feedback_error, Toast.LENGTH_SHORT).show();
+ }
+ }
+
}
diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/util/WeatherUtil.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/util/WeatherUtil.kt
index cec117c..31f1fda 100644
--- a/app/src/main/java/com/tommasoberlose/anotherwidget/util/WeatherUtil.kt
+++ b/app/src/main/java/com/tommasoberlose/anotherwidget/util/WeatherUtil.kt
@@ -15,6 +15,13 @@ import com.survivingwithandroid.weather.lib.provider.openweathermap.Openweatherm
import com.survivingwithandroid.weather.lib.request.WeatherRequest
import com.tommasoberlose.anotherwidget.R
import com.tommasoberlose.anotherwidget.`object`.Constants
+import android.content.DialogInterface
+import android.support.v4.content.ContextCompat.startActivity
+import android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS
+import android.content.Intent
+import android.location.LocationManager
+
+
/**
@@ -22,41 +29,73 @@ import com.tommasoberlose.anotherwidget.`object`.Constants
*/
object WeatherUtil {
- val API_KEY_1 = "43e744ad8ff91b09ea62dbc7d0e7c1dd"
- val API_KEY_2 = "61cde158f4bcc2e5cd18de7b9d000702"
fun updateWeather(context: Context) {
+ Util.showLocationNotification(context, false)
val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
if (SP.getString(Constants.PREF_CUSTOM_LOCATION_ADD, "").equals("") || SP.getString(Constants.PREF_CUSTOM_LOCATION_LAT, "").equals("") || SP.getString(Constants.PREF_CUSTOM_LOCATION_LON, "").equals("")) {
if (!Util.checkGrantedPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)) {
return
}
-
+ var gpsEnabled = false
+ var networkEnabled = false
val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
- getCurrentWeather(context, locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER))
- getCurrentWeather(context, locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER))
+ try {
+ gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
+ } catch (ex: Exception) {
+ }
- locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0f, object : LocationListener {
- override fun onLocationChanged(location: Location) {
- locationManager.removeUpdates(this)
- getCurrentWeather(context, location)
- }
+ try {
+ networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
+ } catch (ex: Exception) {
+ }
- @SuppressLint("ApplySharedPref")
- override fun onProviderDisabled(p0: String?) {
- }
+ if (!gpsEnabled && !networkEnabled) {
+ Util.showLocationNotification(context, true)
+ } else {
+ if (gpsEnabled) {
+ getCurrentWeather(context, locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER))
+ locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, object : LocationListener {
+ override fun onLocationChanged(location: Location) {
+ locationManager.removeUpdates(this)
+ getCurrentWeather(context, location)
+ }
- @SuppressLint("ApplySharedPref")
- override fun onProviderEnabled(p0: String?) {
- }
+ @SuppressLint("ApplySharedPref")
+ override fun onProviderDisabled(p0: String?) {
+ }
- override fun onStatusChanged(p0: String?, p1: Int, p2: Bundle?) {
+ @SuppressLint("ApplySharedPref")
+ override fun onProviderEnabled(p0: String?) {
+ }
+
+ override fun onStatusChanged(p0: String?, p1: Int, p2: Bundle?) {
+ }
+ })
+ } else {
+ getCurrentWeather(context, locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER))
+ locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0f, object : LocationListener {
+ override fun onLocationChanged(location: Location) {
+ locationManager.removeUpdates(this)
+ getCurrentWeather(context, location)
+ }
+
+ @SuppressLint("ApplySharedPref")
+ override fun onProviderDisabled(p0: String?) {
+ }
+
+ @SuppressLint("ApplySharedPref")
+ override fun onProviderEnabled(p0: String?) {
+ }
+
+ override fun onStatusChanged(p0: String?, p1: Int, p2: Bundle?) {
+ }
+ })
}
- })
+ }
} else {
weatherNetworkRequest(context, SP.getString(Constants.PREF_CUSTOM_LOCATION_LAT, "").toDouble(), SP.getString(Constants.PREF_CUSTOM_LOCATION_LON, "").toDouble())
-
}
}
@@ -69,42 +108,45 @@ object WeatherUtil {
fun weatherNetworkRequest(context: Context, latitude: Double, longitude: Double) {
val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
+ if (!SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, "").equals("")) {
+ try {
+ val config = WeatherConfig()
+ config.unitSystem = if (SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F").equals("C")) WeatherConfig.UNIT_SYSTEM.M else WeatherConfig.UNIT_SYSTEM.I
+ config.lang = "en"
+ config.maxResult = 1
+ config.numDays = 1
+ config.ApiKey = SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, "")
- try {
- val config = WeatherConfig()
- config.unitSystem = if (SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F").equals("C")) WeatherConfig.UNIT_SYSTEM.M else WeatherConfig.UNIT_SYSTEM.I
- config.lang = "en" // If you want to use english
- config.maxResult = 1 // Max number of cities retrieved
- config.numDays = 1 // Max num of days in the forecast
- config.ApiKey = API_KEY_2
+ val client = WeatherClient.ClientBuilder().attach(context)
+ .httpClient(com.survivingwithandroid.weather.lib.client.volley.WeatherClientDefault::class.java)
+ .provider(OpenweathermapProviderType())
+ .config(config)
+ .build()
- val client = WeatherClient.ClientBuilder().attach(context)
- .httpClient(com.survivingwithandroid.weather.lib.client.volley.WeatherClientDefault::class.java)
- .provider(OpenweathermapProviderType())
- .config(config)
- .build()
+ client.getCurrentCondition(WeatherRequest(longitude, latitude), object : WeatherClient.WeatherEventListener {
+ @SuppressLint("ApplySharedPref")
+ override fun onWeatherRetrieved(currentWeather: CurrentWeather) {
+ SP.edit()
+ .putFloat(Constants.PREF_WEATHER_TEMP, currentWeather.weather.temperature.temp)
+ .putString(Constants.PREF_WEATHER_ICON, currentWeather.weather.currentCondition.icon)
+ .commit()
+ Util.updateWidget(context)
+ }
- client.getCurrentCondition(WeatherRequest(longitude, latitude), object : WeatherClient.WeatherEventListener {
- @SuppressLint("ApplySharedPref")
- override fun onWeatherRetrieved(currentWeather: CurrentWeather) {
- SP.edit()
- .putFloat(Constants.PREF_WEATHER_TEMP, currentWeather.weather.temperature.temp)
- .putString(Constants.PREF_WEATHER_ICON, currentWeather.weather.currentCondition.icon)
- .commit()
- Util.updateWidget(context)
- }
+ @SuppressLint("ApplySharedPref")
+ override fun onWeatherError(e: WeatherLibException?) {
+ // removeWeather(context, SP)
+ }
- @SuppressLint("ApplySharedPref")
- override fun onWeatherError(e: WeatherLibException?) {
- removeWeather(context, SP)
- }
-
- @SuppressLint("ApplySharedPref")
- override fun onConnectionError(throwable: Throwable?) {
- removeWeather(context, SP)
- }
- })
- } catch (t: Exception) {
+ @SuppressLint("ApplySharedPref")
+ override fun onConnectionError(throwable: Throwable?) {
+ // removeWeather(context, SP)
+ }
+ })
+ } catch (t: Exception) {
+ // removeWeather(context, SP)
+ }
+ } else {
removeWeather(context, SP)
}
}
diff --git a/app/src/main/res/drawable-hdpi/ic_action_alert.png b/app/src/main/res/drawable-hdpi/ic_action_alert.png
new file mode 100644
index 0000000..3603ce8
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_alert.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_action_menu.png b/app/src/main/res/drawable-hdpi/ic_action_menu.png
new file mode 100644
index 0000000..ddb4dcc
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_menu.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_action_paste.png b/app/src/main/res/drawable-hdpi/ic_action_paste.png
new file mode 100644
index 0000000..b5fe06e
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_paste.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_action_refresh.png b/app/src/main/res/drawable-hdpi/ic_action_refresh.png
index a61eb24..3396344 100644
Binary files a/app/src/main/res/drawable-hdpi/ic_action_refresh.png and b/app/src/main/res/drawable-hdpi/ic_action_refresh.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_action_save.png b/app/src/main/res/drawable-hdpi/ic_action_save.png
new file mode 100644
index 0000000..757596c
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_save.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_action_alert.png b/app/src/main/res/drawable-mdpi/ic_action_alert.png
new file mode 100644
index 0000000..1d48902
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_alert.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_action_menu.png b/app/src/main/res/drawable-mdpi/ic_action_menu.png
new file mode 100644
index 0000000..b07955b
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_menu.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_action_paste.png b/app/src/main/res/drawable-mdpi/ic_action_paste.png
new file mode 100644
index 0000000..1ccd675
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_paste.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_action_refresh.png b/app/src/main/res/drawable-mdpi/ic_action_refresh.png
index 85f0b3b..9224ce3 100644
Binary files a/app/src/main/res/drawable-mdpi/ic_action_refresh.png and b/app/src/main/res/drawable-mdpi/ic_action_refresh.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_action_save.png b/app/src/main/res/drawable-mdpi/ic_action_save.png
new file mode 100644
index 0000000..b788742
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_save.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_alert.png b/app/src/main/res/drawable-xhdpi/ic_action_alert.png
new file mode 100644
index 0000000..385a80f
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_alert.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_menu.png b/app/src/main/res/drawable-xhdpi/ic_action_menu.png
new file mode 100644
index 0000000..276d9b8
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_menu.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_paste.png b/app/src/main/res/drawable-xhdpi/ic_action_paste.png
new file mode 100644
index 0000000..dd9a9ab
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_paste.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_refresh.png b/app/src/main/res/drawable-xhdpi/ic_action_refresh.png
index 6c9b809..ff7d85c 100644
Binary files a/app/src/main/res/drawable-xhdpi/ic_action_refresh.png and b/app/src/main/res/drawable-xhdpi/ic_action_refresh.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_save.png b/app/src/main/res/drawable-xhdpi/ic_action_save.png
new file mode 100644
index 0000000..4609b2d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_save.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_alert.png b/app/src/main/res/drawable-xxhdpi/ic_action_alert.png
new file mode 100644
index 0000000..6d404c1
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_alert.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_menu.png b/app/src/main/res/drawable-xxhdpi/ic_action_menu.png
new file mode 100644
index 0000000..ec25f34
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_menu.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_paste.png b/app/src/main/res/drawable-xxhdpi/ic_action_paste.png
new file mode 100644
index 0000000..9703b48
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_paste.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png b/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png
index 77dffe9..614efcc 100644
Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png and b/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_save.png b/app/src/main/res/drawable-xxhdpi/ic_action_save.png
new file mode 100644
index 0000000..0696468
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_save.png differ
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
index 1cd2a36..01f0af0 100644
--- a/app/src/main/res/drawable/ic_launcher_background.xml
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -1,113 +1,74 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..c7bd21d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_choose_application.xml b/app/src/main/res/layout/activity_choose_application.xml
index 914bf5f..e8f16a1 100644
--- a/app/src/main/res/layout/activity_choose_application.xml
+++ b/app/src/main/res/layout/activity_choose_application.xml
@@ -66,7 +66,6 @@
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
- android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/custom_location_gps"
android:id="@+id/action_default"
android:src="@drawable/ic_action_reset"
@@ -76,7 +75,7 @@
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/black_10"/>
-
diff --git a/app/src/main/res/layout/activity_custom_location.xml b/app/src/main/res/layout/activity_custom_location.xml
index c5b87ed..07505e6 100644
--- a/app/src/main/res/layout/activity_custom_location.xml
+++ b/app/src/main/res/layout/activity_custom_location.xml
@@ -64,7 +64,6 @@
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
- android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/custom_location_gps"
android:id="@+id/action_geolocation"
android:src="@drawable/ic_action_gps"
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index de579af..4d18bce 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,73 +1,79 @@
-
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
-
+
+ android:orientation="vertical"
+ android:layout_margin="32dp"
+ android:id="@+id/toolbar"
+ android:gravity="center_vertical">
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+ android:layout_height="60dp"
+ android:text="@string/add_widget"
+ android:visibility="gone"
+ android:gravity="center"
+ android:background="@color/black_30"
+ android:foreground="?android:attr/selectableItemBackground"
+ android:id="@+id/action_add_widget"
+ style="@style/AnotherWidget.Main.Button"/>
+ android:id="@+id/all_set_container">
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp">
@@ -289,6 +294,42 @@
android:layout_height="wrap_content"
android:id="@+id/weather_settings"
android:orientation="vertical">
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_weather_provider.xml b/app/src/main/res/layout/activity_weather_provider.xml
new file mode 100644
index 0000000..223e90b
--- /dev/null
+++ b/app/src/main/res/layout/activity_weather_provider.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/application_info_layout.xml b/app/src/main/res/layout/application_info_layout.xml
new file mode 100644
index 0000000..574e59e
--- /dev/null
+++ b/app/src/main/res/layout/application_info_layout.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/main_menu_layout.xml b/app/src/main/res/layout/main_menu_layout.xml
new file mode 100644
index 0000000..b75f47f
--- /dev/null
+++ b/app/src/main/res/layout/main_menu_layout.xml
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_generic_app.xml b/app/src/main/res/mipmap-anydpi-v26/ic_generic_app.xml
new file mode 100644
index 0000000..bbd3e02
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_generic_app.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_generic_app_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_generic_app_round.xml
new file mode 100644
index 0000000..bbd3e02
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_generic_app_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_generic_app.png b/app/src/main/res/mipmap-hdpi/ic_generic_app.png
new file mode 100644
index 0000000..ebae12c
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_generic_app.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_generic_app.png b/app/src/main/res/mipmap-mdpi/ic_generic_app.png
new file mode 100644
index 0000000..f1f8b4b
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_generic_app.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_generic_app.png b/app/src/main/res/mipmap-xhdpi/ic_generic_app.png
new file mode 100644
index 0000000..9ace2ee
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_generic_app.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_generic_app.png b/app/src/main/res/mipmap-xxhdpi/ic_generic_app.png
new file mode 100644
index 0000000..2ed8ddb
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_generic_app.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_generic_app.png b/app/src/main/res/mipmap-xxxhdpi/ic_generic_app.png
new file mode 100644
index 0000000..57521ba
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_generic_app.png differ
diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml
index 7a9e24c..36bfd8c 100644
--- a/app/src/main/res/values-it-rIT/strings.xml
+++ b/app/src/main/res/values-it-rIT/strings.xml
@@ -1,7 +1,7 @@
Another Widget
- Aggiungi Another Widget
+ Aggiungi Widget
Just
Concedi Accesso
Rimani Aggiornato
@@ -48,7 +48,7 @@
24 Ore
Località Meteo
Geolocalizzazione
- Aggiorna
+ Aggiorna Widget
Eventi Visibili
Eventi non Visibili
Meteo Visibile
@@ -68,4 +68,16 @@
Il meteo apre
App Predefinita
Scegli Applicazione
+ "Provider del Meteo "
+ Il provider meteo è configurato correttamente
+ Il provider meteo deve essere configurato
+ Localizzazione disattivata
+ Riaccendi la localizzazione per avere il meteo aggiornato.
+ Feedback
+ AW Feedback
+ Invia email...
+ Errore invio mail.
+ Chiave API OpenWeather
+ Il provider non è configurato correttamente, vuoi comunque uscire?
+ Salva
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index a542063..96e532b 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -3,7 +3,7 @@
#0092ca
#0083B5
#124E96
- #124E96
+ #04507D
#DAEAF6
#80000000
#48000000
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f67012d..c633c7a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,6 +1,6 @@
Another Widget
- Add Another Widget
+ Add Widget
Just
Grant Permission
See your Events
@@ -49,7 +49,7 @@
24 Hours
Custom Location
Geolocation
- Refresh
+ Refresh Widget
Events are Visible
Events are not Visible
Weather Info are Visible
@@ -70,4 +70,16 @@
Tap on weather opens
Default App
Choose Application
+ Weather Provider
+ The weather provider is configured correctly
+ The weather provider must be configured
+ Location is turned off
+ Turn on the localization to get the updated weather.
+ Feedback
+ AW Feedback
+ Send email...
+ Error sending email.
+ OpenWeather API Key
+ The provider is not configured correctly, do you still want to go back?
+ Save