Skip to content
Snippets Groups Projects
Commit c9bf5420 authored by hyunholee's avatar hyunholee
Browse files

Merge branch 'master' of git.ajou.ac.kr:open-source-2018-spring/Awsome_Android_Global_Calender

parents c98f0216 66d6f29a
No related branches found
No related tags found
No related merge requests found
......@@ -34,5 +34,9 @@
> <p> 1.나라별 변경 완료.</p>
> <p> 2.기능 한글화.</p>
> <p> 2.D-day 기능 구현(예정)..</p>
> <p> 3.GPS기능 추가(예정)</p>
\ No newline at end of file
> <p> 3.나라별 공휴일 한글화 완료.</p>
> <p> 4.D-day 기능 구현(예정)</p>
> <p> 5.GPS 국가 자동 변경 기능 완료</p>
> <p> 6.가계부 기능 추가 구현(예정)</p>
### ScreenShot
......@@ -50,6 +50,14 @@ dependencies {
implementation 'joda-time:joda-time:2.9.9'
implementation 'com.facebook.stetho:stetho:1.5.0'
implementation 'com.android.support:multidex:1.0.3'
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.google.android.gms:play-services-location:11.8.0'
implementation 'com.google.android.gms:play-services-maps:11.8.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanaryVersion"
releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:$leakCanaryVersion"
}
......
......@@ -22,6 +22,7 @@ import com.simplemobiletools.calendar.adapters.EventListAdapter
import com.simplemobiletools.calendar.dialogs.ExportEventsDialog
import com.simplemobiletools.calendar.dialogs.FilterEventTypesDialog
import com.simplemobiletools.calendar.dialogs.ImportEventsDialog
import com.google.android.gms.maps.model.LatLng
import com.simplemobiletools.calendar.extensions.*
import com.simplemobiletools.calendar.fragments.*
import com.simplemobiletools.calendar.helpers.*
......@@ -43,8 +44,38 @@ import java.io.FileOutputStream
import java.text.SimpleDateFormat
import java.util.*
import kotlin.collections.ArrayList
class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
import android.Manifest
import android.annotation.SuppressLint
import android.content.DialogInterface
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationManager
import android.os.Build
import android.provider.Settings
import android.location.Geocoder
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
import android.support.v7.app.AlertDialog
import android.support.v7.app.AppCompatActivity
import android.view.View
import com.google.android.gms.common.api.GoogleApiClient
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.location.LocationServices
import kotlinx.android.synthetic.main.activity_main.*
import android.location.Address
import android.util.Log
import java.io.IOException
class MainActivity : SimpleActivity(), RefreshRecyclerViewListener , com.google.android.gms.location.LocationListener{
//for gps module
private var REQUEST_LOCATION_CODE = 101
private var mGoogleApiClient: GoogleApiClient? = null
private var mLocation: Location? = null
private var mLocationRequest: LocationRequest? = null
private val UPDATE_INTERVAL = (2 * 1000).toLong() /* 10 secs */
private val FASTEST_INTERVAL: Long = 2000 /* 2 sec */
//for main
private val CALDAV_SYNC_DELAY = 1000L
private var showCalDAVRefreshToast = false
......@@ -56,7 +87,8 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
private var shouldGoToTodayBeVisible = false
private var goToTodayButton: MenuItem? = null
private var currentFragments = ArrayList<MyFragmentHolder>()
private var lat = 0.1
private var lng = 0.1
private var mStoredTextColor = 0
private var mStoredBackgroundColor = 0
private var mStoredPrimaryColor = 0
......@@ -65,8 +97,42 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
private var mStoredUse24HourFormat = false
private var mStoredDimPastEvents = true
override fun onLocationChanged(location: Location?) {
// You can now create a LatLng Object for use with maps
// val latLng = LatLng(location.latitude, location.longitude)
}
@SuppressLint("MissingPermission")
private fun getLocation() {
mLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLocation == null) {
startLocationUpdates();
}
if (mLocation != null) {
lat = mLocation!!.latitude
lng = mLocation!!.longitude
} else {
Toast.makeText(this, "Location not Detected", Toast.LENGTH_SHORT).show();
}
}
private fun startLocationUpdates() {
// Create the location request
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(UPDATE_INTERVAL)
.setFastestInterval(FASTEST_INTERVAL)
// Request location updates
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return
}
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
buildGoogleApiClient()
setContentView(R.layout.activity_main)
appLaunched(BuildConfig.APPLICATION_ID)
......@@ -109,7 +175,107 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
refreshCalDAVCalendars(false)
}
}
@Synchronized
private fun buildGoogleApiClient() {
mGoogleApiClient = GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.build()
mGoogleApiClient!!.connect()
}
private fun checkGPSEnabled(): Boolean {
if (!isLocationEnabled())
showAlert()
return isLocationEnabled()
}
private fun showAlert() {
val dialog = AlertDialog.Builder(this)
dialog.setTitle("Enable Location")
.setMessage("Your Locations Settings is set to 'Off'.\nPlease Enable Location to " + "use this app")
.setPositiveButton("Location Settings") { paramDialogInterface, paramInt ->
val myIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
startActivity(myIntent)
}
.setNegativeButton("Cancel") { paramDialogInterface, paramInt -> }
dialog.show()
}
private fun isLocationEnabled(): Boolean {
var locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
return locationManager!!.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager!!.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
}
private fun checkLocationPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
AlertDialog.Builder(this)
.setTitle("Location Permission Needed")
.setMessage("This app needs the Location permission, please accept to use location functionality")
.setPositiveButton("OK", DialogInterface.OnClickListener { dialog, which ->
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_LOCATION_CODE)
})
.create()
.show()
} else ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_LOCATION_CODE)
}
}
private fun autochange(){
val geocoder = Geocoder(this)
val addresses: List<Address>?
var add = ""
val items = getHolidayRadioItemsCode()
if (!checkGPSEnabled()) {
return
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//Location Permission already granted
getLocation();
} else {
//Request Location Permission
checkLocationPermission()
}
} else {
getLocation();
}
addresses = geocoder.getFromLocation(lat,lng,1)
toast(R.string.importing)
Thread {
var country = ""
for((num,code,file) in items){
if(code == addresses.get(0).countryCode){
country = file.toString()
break
}
}
val holidays = getString(R.string.holidays)
var eventTypeId = dbHelper.getEventTypeIdWithTitle(holidays)
deleteHolidays()
// dbHelper.deleteEventsWithType(eventTypeId)
if (eventTypeId == -1) {
val eventType = EventType(0, holidays, resources.getColor(R.color.default_holidays_color))
eventTypeId = dbHelper.insertEventType(eventType)
}
val result = IcsImporter(this).importEvents(country, eventTypeId, 0, false)
handleParseResult(result)
if (result != IcsImporter.ImportResult.IMPORT_FAIL) {
runOnUiThread {
updateViewPager()
}
}
}.start()
toast(addresses.get(0).countryCode)
}
override fun onResume() {
super.onResume()
if (mStoredTextColor != config.textColor || mStoredBackgroundColor != config.backgroundColor || mStoredPrimaryColor != config.primaryColor
......@@ -142,9 +308,15 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
super.onPause()
storeStateVariables()
}
override fun onStart() {
super.onStart()
mGoogleApiClient?.connect()
}
override fun onStop() {
super.onStop()
if (mGoogleApiClient!!.isConnected()) {
mGoogleApiClient!!.disconnect()
}
mCalDAVSyncHandler.removeCallbacksAndMessages(null)
contentResolver.unregisterContentObserver(calDAVSyncObserver)
closeSearch()
......@@ -177,6 +349,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
R.id.filter -> showFilterDialog()
R.id.refresh_caldav_calendars -> refreshCalDAVCalendars(true)
R.id.add_holidays -> addHolidays()
R.id.auto_countryChange -> autochange()
R.id.add_birthdays -> tryAddBirthdays()
R.id.add_anniversaries -> tryAddAnniversaries()
R.id.import_events -> tryImportEvents()
......@@ -819,6 +992,70 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
var i = 0
for ((country, file) in this) {
items.add(RadioItem(i++, country, file))
}
}
return items
}
private fun getHolidayRadioItemsCode(): ArrayList<RadioItem> {
val items = ArrayList<RadioItem>()
LinkedHashMap<String, String>().apply {
put("GR", "greece.ics")
put("ZA", "southafrica.ics")
put("NO", "norway.ics")
put("NL", "netherlands.ics")
put("KR", "southkorea.ics")
put("DK", "denmark.ics")
put("DE", "germany.ics")
put("LV", "latvia.ics")
put("RU", "russia.ics")
put("RO", "romania.ics")
put("LT", "lithuania.ics")
put("LU", "luxembourg.ics")
put("MK", "macedonia.ics")
put("MX", "mexico.ics")
put("BO", "bolivia.ics")
put("US", "unitedstates.ics")
put("BE", "belgium.ics")
put("BR", "brazil.ics")
put("RS", "serbia.ics")
put("CH", "switzerland.ics")
put("SE", "sweden.ics")
put("ES", "spain.ics")
put("SK", "slovakia.ics")
put("SI", "slovenia.ics")
put("AR", "argentina.ics")
put("IS", "iceland.ics")
put("IE", "ireland.ics")
put("DZ", "algeria.ics")
put("EE", "estonia.ics")
put("GB", "unitedkingdom.ics")
put("AT", "austria.ics")
put("UA", "ukraine.ics")
put("IT", "italy.ics")
put("IN", "india.ics")
put("ID", "indonesia.ics")
put("JP", "japan.ics")
put("CN", "china.ics")
put("CZ", "czech.ics")
put("CA", "canada.ics")
put("HR", "croatia.ics")
put("PK", "pakistan.ics")
put("PT", "portugal.ics")
put("PL", "poland.ics")
put("FR", "france.ics")
put("FI", "finland.ics")
put("AU", "australia.ics")
put("HU", "hungary.ics")
var i = 0
for ((country, file) in this) {
items.add(RadioItem(i++, country, file))
......
......@@ -31,6 +31,10 @@
android:id="@+id/add_holidays"
android:title="@string/add_holidays"
app:showAsAction="never"/>
<item
android:id="@+id/auto_countryChange"
android:title="@string/auto_countryChange"
app:showAsAction="never"/>
<item
android:id="@+id/add_birthdays"
android:title="@string/add_birthdays"
......
......@@ -131,10 +131,10 @@
<!-- Holidays -->
<string name="holidays">공휴일</string>
<string name="add_holidays">공휴일 추가</string>
<string name="add_holidays">국가 변경</string>
<string name="national_holidays">국경일</string>
<string name="religious_holidays">종교 휴일</string>
<string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
<string name="holidays_imported_successfully">국가 변경 성공</string>
<string name="importing_some_holidays_failed">일부 이벤트를 가져오지 못했습니다</string>
<string name="importing_holidays_failed">공휴일을 가져오는데 실패했습니다</string>
......
......@@ -10,7 +10,7 @@
<string name="simple_event_list">간단한 이벤트 목록</string>
<string name="no_upcoming_events">다가올 이벤트가 없는 것 같습니다.</string>
<string name="go_to_today">오늘로 이동</string>
<string name="auto_countryChange">국가 자동변경</string>
<!-- Widget titles -->
<string name="widget_monthly">월별 달력</string>
<string name="widget_list">일정 목록 달력</string>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment