Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
denny0223 committed Aug 16, 2023
2 parents 00ea288 + 42bcc8b commit 673c866
Show file tree
Hide file tree
Showing 30 changed files with 486 additions and 151 deletions.
25 changes: 25 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Build
on: [ push, pull_request ]

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout the code
uses: actions/checkout@v3

- name: Setup JDK 17
uses: actions/setup-java@v3
with:
distribution: 'corretto'
java-version: 17
cache: 'gradle'

- name: Generate debug build
run: ./gradlew assembleDebug

- name: Upload APK
uses: actions/upload-artifact@v3
with:
name: app_debug
path: app/build/outputs/apk/debug/app-debug.apk
48 changes: 17 additions & 31 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,29 +1,19 @@
buildscript {
repositories {
maven { url 'https://plugins.gradle.org/m2/' }
}
dependencies {
classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:[0.12.8, 0.99.99]'
}
}
apply plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin'
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

repositories {
maven { url 'https://maven.google.com' }
mavenCentral()
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'com.google.gms.google-services'
}

android {
namespace 'app.opass.ccip'
compileSdk 34

defaultConfig {
applicationId "app.opass.ccip"
minSdk 24
targetSdk 34
versionCode 52
versionName "3.2.8"
versionCode 53
versionName "3.3.0"

manifestPlaceholders = [manifestApplicationId: "${applicationId}"]
}
Expand All @@ -33,9 +23,6 @@ android {
}

buildTypes {
debug {
}

release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
Expand All @@ -49,17 +36,20 @@ android {


compileOptions {
sourceCompatibility JavaVersion.VERSION_1_9
targetCompatibility JavaVersion.VERSION_1_9
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}

kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_9
jvmTarget = JavaVersion.VERSION_17.toString()
}
namespace 'app.opass.ccip'
dependenciesInfo {
includeInApk true
includeInBundle true

lint {
lintConfig file("lint.xml")
}

androidResources {
generateLocaleConfig true
}
}

Expand All @@ -68,7 +58,6 @@ dependencies {
final def lifecycle_version = '2.6.1'

implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.13.2'
implementation 'com.google.firebase:firebase-analytics-ktx:21.3.0'

implementation 'com.onesignal:OneSignal:[4.0.0, 4.99.99]'
Expand Down Expand Up @@ -98,7 +87,6 @@ dependencies {

implementation 'com.tbuonomo:dotsindicator:5.0'

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3"

Expand All @@ -107,5 +95,3 @@ dependencies {

implementation 'me.saket:better-link-movement-method:2.2.0'
}

apply plugin: 'com.google.gms.google-services'
4 changes: 4 additions & 0 deletions app/lint.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="MissingTranslation" severity="ignore" />
</lint>
13 changes: 0 additions & 13 deletions app/src/androidTest/java/app/opass/ccip/ApplicationTest.java

This file was deleted.

1 change: 0 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:localeConfig="@xml/locales_config"
android:theme="@style/AppTheme">
<meta-data
android:name="com.onesignal.NotificationOpened.DEFAULT"
Expand Down
7 changes: 6 additions & 1 deletion app/src/main/java/app/opass/ccip/extension/View.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ import android.view.WindowInsets
import android.view.inputmethod.InputMethodManager
import androidx.annotation.Px
import androidx.core.content.getSystemService
import androidx.core.view.*
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.marginBottom
import androidx.core.view.marginLeft
import androidx.core.view.marginRight
import androidx.core.view.marginTop
import androidx.core.view.updateLayoutParams

fun View.setOnApplyWindowInsetsListenerCompat(block: (v: View, insets: WindowInsets, insetsCompat: WindowInsetsCompat) -> WindowInsets) {
setOnApplyWindowInsetsListener { v, insets ->
Expand Down
12 changes: 12 additions & 0 deletions app/src/main/java/app/opass/ccip/ui/auth/TokenCheckFragment.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package app.opass.ccip.ui.auth

import android.app.AlertDialog
import android.app.NotificationManager
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
Expand Down Expand Up @@ -78,6 +81,15 @@ class TokenCheckFragment : AuthActivity.PageFragment() {
} catch (e: JSONException) {
e.printStackTrace()
}

val manager = mActivity.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (!manager.areNotificationsEnabled()) {
AlertDialog.Builder(mActivity)
.setMessage(R.string.on_login_request_notification_permission)
.setPositiveButton(android.R.string.ok) { _, _ -> OneSignal.promptForPushNotifications() }
.setNegativeButton(android.R.string.cancel) { _, _ -> }
.show()
}
}
response.code() == 403 -> {
binding.title.setText(R.string.couldnt_verify_your_identity)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package app.opass.ccip.ui.dialogs

import android.app.Dialog
import android.os.Bundle
import androidx.fragment.app.DialogFragment
import app.opass.ccip.R
import app.opass.ccip.util.PreferenceUtil
import com.google.android.material.dialog.MaterialAlertDialogBuilder

class NotificationDialogFragment (private val callback: () -> Unit) : DialogFragment() {

companion object {
const val TAG = "NotificationDialogFragment"
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return MaterialAlertDialogBuilder(requireContext())
.setTitle(getString(R.string.get_notified_title))
.setMessage(getString(R.string.get_notified_desc))
.setPositiveButton(android.R.string.ok) { _, _ ->
callback()
}
.setNeutralButton(getString(R.string.later)) { _, _ ->
dismiss()
}
.setNegativeButton(getString(R.string.dont_ask_again)) { _, _ ->
PreferenceUtil.shouldPromptForNotification(requireContext(), false)
dismiss()
}
.create()
}
}
63 changes: 62 additions & 1 deletion app/src/main/java/app/opass/ccip/ui/schedule/ScheduleFragment.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
package app.opass.ccip.ui.schedule

import android.Manifest
import android.app.Activity
import android.app.AlarmManager
import android.app.NotificationManager
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
Expand All @@ -20,11 +30,31 @@ import app.opass.ccip.extension.doOnApplyWindowInsets
import app.opass.ccip.extension.dpToPx
import app.opass.ccip.extension.updateMargin
import app.opass.ccip.model.Session
import app.opass.ccip.ui.dialogs.NotificationDialogFragment
import app.opass.ccip.ui.sessiondetail.SessionDetailActivity
import app.opass.ccip.util.AlarmUtil
import app.opass.ccip.util.PreferenceUtil

class ScheduleFragment : Fragment() {

private val TAG = ScheduleFragment::class.java.simpleName

private val startForResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { _ ->
context?.let { AlarmUtil.setSessionAlarm(it, session) }
}

private val startForPermission =
registerForActivityResult(ActivityResultContracts.RequestPermission()) {
if (it) {
Log.i(TAG, "Notification permission granted, trying to schedule alarm!")
scheduleAlarm()
} else {
Log.i(TAG, "Missing notification permission!")
Toast.makeText(context, getString(R.string.perm_denied), Toast.LENGTH_LONG).show()
}
}

companion object {
private const val ARG_DATE = "ARG_DATE"

Expand All @@ -42,6 +72,7 @@ class ScheduleFragment : Fragment() {
private lateinit var mActivity: Activity
private lateinit var vm: ScheduleViewModel
private lateinit var scheduleView: RecyclerView
private lateinit var session: Session

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
Expand Down Expand Up @@ -103,14 +134,23 @@ class ScheduleFragment : Fragment() {
}

private fun onToggleStarState(session: Session): Boolean {
this.session = session
val sessionIds = PreferenceUtil.loadStarredIds(mActivity).toMutableList()
val isAlreadyStarred = sessionIds.contains(session.id)
if (isAlreadyStarred) {
sessionIds.remove(session.id)
AlarmUtil.cancelSessionAlarm(mActivity, session)
} else {
sessionIds.add(session.id)
AlarmUtil.setSessionAlarm(mActivity, session)

if (PreferenceUtil.shouldPromptForNotification(requireContext())) {
val notificationManager =
context?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (!notificationManager.areNotificationsEnabled()) {
NotificationDialogFragment(::requestNotificationPermission)
.show(childFragmentManager, NotificationDialogFragment.TAG)
}
}
}
vm.hasStarredSessions.value = sessionIds.isNotEmpty()
PreferenceUtil.saveStarredIds(mActivity, sessionIds)
Expand Down Expand Up @@ -140,4 +180,25 @@ class ScheduleFragment : Fragment() {
// Force RV to reload star state :(
adapter.notifyDataSetChanged()
}

private fun requestNotificationPermission() {
val notificationManager = context?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !notificationManager.areNotificationsEnabled()) {
startForPermission.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}

private fun scheduleAlarm() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
val alarmManager = context?.getSystemService(Context.ALARM_SERVICE) as AlarmManager
if (alarmManager.canScheduleExactAlarms()) {
AlarmUtil.setSessionAlarm(mActivity, session)
} else {
val uri = Uri.parse("package:" + requireContext().packageName)
startForResult.launch(Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM, uri))
}
} else {
AlarmUtil.setSessionAlarm(mActivity, session)
}
}
}
16 changes: 14 additions & 2 deletions app/src/main/java/app/opass/ccip/ui/schedule/ScheduleViewModel.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
package app.opass.ccip.ui.schedule

import android.app.Application
import androidx.lifecycle.*
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.liveData
import androidx.lifecycle.map
import androidx.lifecycle.switchMap
import androidx.lifecycle.viewModelScope
import app.opass.ccip.CCIPApplication
import app.opass.ccip.R
import app.opass.ccip.extension.debounce
import app.opass.ccip.model.*
import app.opass.ccip.model.ConfSchedule
import app.opass.ccip.model.Session
import app.opass.ccip.model.SessionLang
import app.opass.ccip.model.SessionTag
import app.opass.ccip.model.SessionType
import app.opass.ccip.util.PreferenceUtil
import com.google.gson.internal.bind.util.ISO8601Utils
import kotlinx.coroutines.Dispatchers
Expand Down
Loading

0 comments on commit 673c866

Please sign in to comment.