Skip to content

Commit aa7d270

Browse files
authored
Merge pull request #8 from ptkNktq/feature/license
オープンソースライセンスの表示
2 parents e9200b6 + a1b5339 commit aa7d270

15 files changed

Lines changed: 720 additions & 34 deletions

File tree

AndroidApp/app/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ apply plugin: 'com.android.application'
22
apply plugin: 'kotlin-android'
33
apply plugin: 'kotlin-kapt'
44
apply plugin: "androidx.navigation.safeargs.kotlin"
5+
apply plugin: "com.cookpad.android.plugin.license-tools"
56

67
android {
78
compileSdkVersion 30
@@ -45,7 +46,7 @@ android {
4546
dependencies {
4647
implementation fileTree(dir: "libs", include: ["*.jar"])
4748
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
48-
49+
4950
implementation 'androidx.core:core-ktx:1.5.0'
5051
implementation 'androidx.appcompat:appcompat:1.3.0'
5152
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'

AndroidApp/app/licenses.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
- artifact: io.insert-koin:koin-android:+
2+
name: koin-android
3+
copyrightHolder: Arnaud GIULIANI, Laurent BARESSE
4+
license: The Apache Software License, Version 2.0
5+
licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
6+
url: https://insert-koin.io/
7+
- artifact: com.google.code.gson:gson:+
8+
name: gson
9+
copyrightHolder: Google Inc.
10+
license: The Apache Software License, Version 2.0
11+
licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
12+
url: https://github.com/google/gson

AndroidApp/app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
package="me.nya_n.notificationnotifier">
55

66
<uses-permission android:name="android.permission.INTERNET" />
7-
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
7+
<uses-permission
8+
android:name="android.permission.QUERY_ALL_PACKAGES"
89
tools:ignore="QueryAllPackagesPermission" />
910

1011
<application

AndroidApp/app/src/main/assets/licenses.html

Lines changed: 577 additions & 0 deletions
Large diffs are not rendered by default.

AndroidApp/app/src/main/java/me/nya_n/notificationnotifier/viewmodels/MainViewModel.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,23 @@ import me.nya_n.notificationnotifier.repositories.sources.DB
2020
import me.nya_n.notificationnotifier.utils.Event
2121
import java.io.BufferedReader
2222
import java.io.InputStreamReader
23-
import java.lang.RuntimeException
2423

2524
class MainViewModel(
2625
private val userSettingRepository: UserSettingRepository,
2726
private val appRepository: AppRepository
2827
) : ViewModel() {
29-
val fab = MutableLiveData<Event<Fab>>()
28+
private val _fab = MutableLiveData<Event<Fab>>()
29+
val fab: LiveData<Event<Fab>> = _fab
3030
private val _message = MutableLiveData<Event<Message>>()
3131
val message: LiveData<Event<Message>> = _message
3232

33+
/**
34+
* Fabの状態を更新
35+
*/
36+
fun changeFabState(fab: Fab) {
37+
_fab.postValue(Event(fab))
38+
}
39+
3340
/**
3441
* バックアップのために外部ストレージにデータを保存
3542
*/
@@ -69,6 +76,9 @@ class MainViewModel(
6976
}
7077
}
7178

79+
/**
80+
* 外部ストレージのバックアップからデータを復元
81+
*/
7282
fun importData(context: Context, uri: Uri) {
7383
viewModelScope.launch {
7484
runCatching {

AndroidApp/app/src/main/java/me/nya_n/notificationnotifier/views/activities/MainActivity.kt

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.appcompat.app.AppCompatActivity
1010
import androidx.core.app.NotificationManagerCompat
1111
import androidx.databinding.DataBindingUtil
1212
import androidx.fragment.app.DialogFragment
13+
import androidx.navigation.findNavController
1314
import kotlinx.coroutines.*
1415
import me.nya_n.notificationnotifier.R
1516
import me.nya_n.notificationnotifier.databinding.ActivityMainBinding
@@ -26,25 +27,27 @@ class MainActivity : AppCompatActivity(), DialogListener {
2627
private lateinit var binding: ActivityMainBinding
2728
private val model: MainViewModel by viewModel()
2829

29-
private val exportDataResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
30-
if (it.resultCode == RESULT_CANCELED) return@registerForActivityResult
31-
val uri = it.data?.data
32-
if (uri != null) {
33-
model.exportData(this, uri)
34-
} else {
35-
handleMessage(Message.Error(R.string.export_failed))
30+
private val exportDataResult =
31+
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
32+
if (it.resultCode == RESULT_CANCELED) return@registerForActivityResult
33+
val uri = it.data?.data
34+
if (uri != null) {
35+
model.exportData(this, uri)
36+
} else {
37+
handleMessage(Message.Error(R.string.export_failed))
38+
}
3639
}
37-
}
3840

39-
private val importDataResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
40-
if (it.resultCode == RESULT_CANCELED) return@registerForActivityResult
41-
val uri = it.data?.data
42-
if (uri != null) {
43-
model.importData(this, uri)
44-
} else {
45-
handleMessage(Message.Error(R.string.import_failed))
41+
private val importDataResult =
42+
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
43+
if (it.resultCode == RESULT_CANCELED) return@registerForActivityResult
44+
val uri = it.data?.data
45+
if (uri != null) {
46+
model.importData(this, uri)
47+
} else {
48+
handleMessage(Message.Error(R.string.import_failed))
49+
}
4650
}
47-
}
4851

4952
override fun onCreate(savedInstanceState: Bundle?) {
5053
super.onCreate(savedInstanceState)
@@ -84,7 +87,8 @@ class MainActivity : AppCompatActivity(), DialogListener {
8487
)
8588
true
8689
}
87-
R.id.licence -> {
90+
R.id.license -> {
91+
findNavController(R.id.nav_host_fragment).navigate(R.id.action_MainFragment_to_LicenseFragment)
8892
true
8993
}
9094
else -> super.onOptionsItemSelected(item)

AndroidApp/app/src/main/java/me/nya_n/notificationnotifier/views/fragments/DetailFragment.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import androidx.navigation.fragment.navArgs
1111
import me.nya_n.notificationnotifier.R
1212
import me.nya_n.notificationnotifier.databinding.FragmentDetailBinding
1313
import me.nya_n.notificationnotifier.entities.Fab
14-
import me.nya_n.notificationnotifier.utils.Event
1514
import me.nya_n.notificationnotifier.utils.Snackbar
1615
import me.nya_n.notificationnotifier.viewmodels.DetailViewModel
1716
import me.nya_n.notificationnotifier.viewmodels.MainViewModel
@@ -55,7 +54,7 @@ class DetailFragment : Fragment() {
5554

5655
override fun onResume() {
5756
super.onResume()
58-
activityModel.fab.postValue(Event(Fab(false)))
57+
activityModel.changeFabState(Fab(false))
5958
}
6059

6160
private fun initViews() {
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package me.nya_n.notificationnotifier.views.fragments
2+
3+
import android.os.Bundle
4+
import android.view.*
5+
import androidx.databinding.DataBindingUtil
6+
import androidx.fragment.app.Fragment
7+
import me.nya_n.notificationnotifier.R
8+
import me.nya_n.notificationnotifier.databinding.FragmentLicenseBinding
9+
import me.nya_n.notificationnotifier.entities.Fab
10+
import me.nya_n.notificationnotifier.viewmodels.MainViewModel
11+
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
12+
13+
class LicenseFragment : Fragment() {
14+
private lateinit var binding: FragmentLicenseBinding
15+
private val activityModel: MainViewModel by sharedViewModel()
16+
17+
override fun onCreate(savedInstanceState: Bundle?) {
18+
super.onCreate(savedInstanceState)
19+
setHasOptionsMenu(true)
20+
}
21+
22+
override fun onCreateView(
23+
inflater: LayoutInflater,
24+
container: ViewGroup?,
25+
savedInstanceState: Bundle?
26+
): View {
27+
binding = DataBindingUtil.inflate(
28+
inflater,
29+
R.layout.fragment_license,
30+
container,
31+
false
32+
)
33+
return binding.root
34+
}
35+
36+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
37+
super.onViewCreated(view, savedInstanceState)
38+
binding.web.loadUrl("file:///android_asset/licenses.html")
39+
}
40+
41+
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
42+
super.onCreateOptionsMenu(menu, inflater)
43+
menu.clear()
44+
}
45+
46+
override fun onResume() {
47+
super.onResume()
48+
activityModel.changeFabState(Fab(false))
49+
}
50+
}

AndroidApp/app/src/main/java/me/nya_n/notificationnotifier/views/fragments/SelectionFragment.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import me.nya_n.notificationnotifier.R
1212
import me.nya_n.notificationnotifier.databinding.FragmentSelectionBinding
1313
import me.nya_n.notificationnotifier.entities.Fab
1414
import me.nya_n.notificationnotifier.entities.InstalledApp
15-
import me.nya_n.notificationnotifier.utils.Event
1615
import me.nya_n.notificationnotifier.utils.Snackbar
1716
import me.nya_n.notificationnotifier.viewmodels.MainViewModel
1817
import me.nya_n.notificationnotifier.viewmodels.SelectionViewModel
@@ -72,7 +71,7 @@ class SelectionFragment : Fragment() {
7271

7372
override fun onResume() {
7473
super.onResume()
75-
activityModel.fab.postValue(Event(Fab(false)))
74+
activityModel.changeFabState(Fab(false))
7675
}
7776

7877
private fun initViews() {
@@ -119,7 +118,10 @@ class SelectionFragment : Fragment() {
119118
it.getContentIfNotHandled() ?: return@observe
120119
binding.refresh.isRefreshing = false
121120
PackageVisibilityDialog.showOnlyOnce(childFragmentManager)
122-
childFragmentManager.setFragmentResultListener(PackageVisibilityDialog.TAG, viewLifecycleOwner) { _, result ->
121+
childFragmentManager.setFragmentResultListener(
122+
PackageVisibilityDialog.TAG,
123+
viewLifecycleOwner
124+
) { _, result ->
123125
val isGranted = result.getBoolean(PackageVisibilityDialog.KEY_IS_GRANTED)
124126
if (isGranted) {
125127
shared.packageVisibilityGranted()

AndroidApp/app/src/main/java/me/nya_n/notificationnotifier/views/fragments/TopFragment.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import me.nya_n.notificationnotifier.R
1313
import me.nya_n.notificationnotifier.databinding.FragmentTopBinding
1414
import me.nya_n.notificationnotifier.entities.Fab
1515
import me.nya_n.notificationnotifier.entities.InstalledApp
16-
import me.nya_n.notificationnotifier.utils.Event
1716
import me.nya_n.notificationnotifier.utils.Snackbar
1817
import me.nya_n.notificationnotifier.viewmodels.MainViewModel
1918
import me.nya_n.notificationnotifier.viewmodels.SharedViewModel
@@ -69,7 +68,7 @@ class TopFragment : Fragment() {
6968

7069
override fun onResume() {
7170
super.onResume()
72-
activityModel.fab.postValue(Event(Fab(true) {
71+
activityModel.changeFabState((Fab(true) {
7372
findNavController().navigate(R.id.action_MainFragment_to_SelectionFragment)
7473
}))
7574
}
@@ -112,7 +111,10 @@ class TopFragment : Fragment() {
112111
it.getContentIfNotHandled() ?: return@observe
113112
binding.refresh.isRefreshing = false
114113
PackageVisibilityDialog.showOnlyOnce(childFragmentManager)
115-
childFragmentManager.setFragmentResultListener(PackageVisibilityDialog.TAG, viewLifecycleOwner) { _, result ->
114+
childFragmentManager.setFragmentResultListener(
115+
PackageVisibilityDialog.TAG,
116+
viewLifecycleOwner
117+
) { _, result ->
116118
val isGranted = result.getBoolean(PackageVisibilityDialog.KEY_IS_GRANTED)
117119
if (isGranted) {
118120
shared.packageVisibilityGranted()

0 commit comments

Comments
 (0)