forked from recloudstream/cloudstream
Add reference to public list
This commit is contained in:
parent
b2ee957833
commit
bbf9f247a9
10 changed files with 135 additions and 31 deletions
|
@ -83,9 +83,9 @@ import kotlin.concurrent.thread
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
import com.lagradost.cloudstream3.plugins.PluginManager
|
import com.lagradost.cloudstream3.plugins.PluginManager
|
||||||
import com.lagradost.cloudstream3.plugins.RepositoryManager
|
import com.lagradost.cloudstream3.plugins.RepositoryManager
|
||||||
import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES
|
|
||||||
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.appStringRepo
|
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.appStringRepo
|
||||||
import com.lagradost.cloudstream3.ui.settings.extensions.RepositoryData
|
import com.lagradost.cloudstream3.ui.settings.extensions.RepositoryData
|
||||||
|
import com.lagradost.cloudstream3.ui.setup.SetupFragmentExtensions
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||||
import com.lagradost.cloudstream3.utils.Event
|
import com.lagradost.cloudstream3.utils.Event
|
||||||
|
|
||||||
|
@ -133,6 +133,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = "MAINACT"
|
const val TAG = "MAINACT"
|
||||||
val afterPluginsLoadedEvent = Event<Boolean>()
|
val afterPluginsLoadedEvent = Event<Boolean>()
|
||||||
|
val afterRepositoryLoadedEvent = Event<Boolean>()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onColorSelected(dialogId: Int, color: Int) {
|
override fun onColorSelected(dialogId: Int, color: Int) {
|
||||||
|
@ -347,6 +348,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
||||||
Toast.LENGTH_LONG
|
Toast.LENGTH_LONG
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
afterRepositoryLoadedEvent.invoke(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -695,9 +697,9 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
|
||||||
// If no plugins bring up extensions screen
|
// If no plugins bring up extensions screen
|
||||||
} else if (PluginManager.getPluginsOnline().isEmpty()
|
} else if (PluginManager.getPluginsOnline().isEmpty()
|
||||||
&& PluginManager.getPluginsLocal().isEmpty()
|
&& PluginManager.getPluginsLocal().isEmpty()
|
||||||
&& PREBUILT_REPOSITORIES.isNotEmpty()
|
// && PREBUILT_REPOSITORIES.isNotEmpty()
|
||||||
) {
|
) {
|
||||||
navController.navigate(R.id.navigation_setup_extensions)
|
navController.navigate(R.id.navigation_setup_extensions, SetupFragmentExtensions.newInstance(false))
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
logError(e)
|
logError(e)
|
||||||
|
|
|
@ -123,11 +123,15 @@ object RepositoryManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getRepositories(): Array<RepositoryData> {
|
||||||
|
return getKey(REPOSITORIES_KEY) ?: emptyArray()
|
||||||
|
}
|
||||||
|
|
||||||
// Don't want to read before we write in another thread
|
// Don't want to read before we write in another thread
|
||||||
private val repoLock = Mutex()
|
private val repoLock = Mutex()
|
||||||
suspend fun addRepository(repository: RepositoryData) {
|
suspend fun addRepository(repository: RepositoryData) {
|
||||||
repoLock.withLock {
|
repoLock.withLock {
|
||||||
val currentRepos = getKey<Array<RepositoryData>>(REPOSITORIES_KEY) ?: emptyArray()
|
val currentRepos = getRepositories()
|
||||||
// No duplicates
|
// No duplicates
|
||||||
setKey(REPOSITORIES_KEY, (currentRepos + repository).distinctBy { it.url })
|
setKey(REPOSITORIES_KEY, (currentRepos + repository).distinctBy { it.url })
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,7 @@ import com.lagradost.cloudstream3.utils.DataStoreHelper.deleteAllResumeStateIds
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.removeLastWatched
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.removeLastWatched
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultWatchState
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultWatchState
|
||||||
import com.lagradost.cloudstream3.utils.Event
|
import com.lagradost.cloudstream3.utils.Event
|
||||||
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.HOMEPAGE_API
|
import com.lagradost.cloudstream3.utils.HOMEPAGE_API
|
||||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showOptionSelectStringRes
|
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showOptionSelectStringRes
|
||||||
import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso
|
import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso
|
||||||
|
|
|
@ -14,6 +14,7 @@ import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import com.lagradost.cloudstream3.AcraApplication.Companion.openBrowser
|
||||||
import com.lagradost.cloudstream3.CommonActivity.showToast
|
import com.lagradost.cloudstream3.CommonActivity.showToast
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.mvvm.Some
|
import com.lagradost.cloudstream3.mvvm.Some
|
||||||
|
@ -25,9 +26,10 @@ import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
||||||
import kotlinx.android.synthetic.main.add_repo_input.*
|
import kotlinx.android.synthetic.main.add_repo_input.*
|
||||||
import kotlinx.android.synthetic.main.add_repo_input.apply_btt
|
|
||||||
import kotlinx.android.synthetic.main.add_repo_input.cancel_btt
|
|
||||||
import kotlinx.android.synthetic.main.fragment_extensions.*
|
import kotlinx.android.synthetic.main.fragment_extensions.*
|
||||||
|
import kotlinx.android.synthetic.main.fragment_extensions.list_repositories
|
||||||
|
|
||||||
|
const val PUBLIC_REPOSITORIES_LIST = "https://recloudstream.github.io/repos/"
|
||||||
|
|
||||||
class ExtensionsFragment : Fragment() {
|
class ExtensionsFragment : Fragment() {
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
|
@ -98,6 +100,10 @@ class ExtensionsFragment : Fragment() {
|
||||||
(repo_recycler_view?.adapter as? RepoAdapter)?.updateList(it)
|
(repo_recycler_view?.adapter as? RepoAdapter)?.updateList(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list_repositories?.setOnClickListener {
|
||||||
|
openBrowser(PUBLIC_REPOSITORIES_LIST)
|
||||||
|
}
|
||||||
|
|
||||||
observe(extensionViewModel.pluginStats) {
|
observe(extensionViewModel.pluginStats) {
|
||||||
when (it) {
|
when (it) {
|
||||||
is Some.Success -> {
|
is Some.Success -> {
|
||||||
|
@ -154,6 +160,9 @@ class ExtensionsFragment : Fragment() {
|
||||||
dialog.repo_url_input?.setText(fixedUrl)
|
dialog.repo_url_input?.setText(fixedUrl)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
dialog.list_repositories?.setOnClickListener {
|
||||||
|
openBrowser(PUBLIC_REPOSITORIES_LIST)
|
||||||
|
}
|
||||||
|
|
||||||
// dialog.text2?.text = provider.name
|
// dialog.text2?.text = provider.name
|
||||||
dialog.apply_btt?.setOnClickListener secondListener@{
|
dialog.apply_btt?.setOnClickListener secondListener@{
|
||||||
|
|
|
@ -7,8 +7,12 @@ import android.view.ViewGroup
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import com.lagradost.cloudstream3.AcraApplication.Companion.openBrowser
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.afterRepositoryLoadedEvent
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
|
import com.lagradost.cloudstream3.plugins.RepositoryManager
|
||||||
import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES
|
import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES
|
||||||
|
import com.lagradost.cloudstream3.ui.settings.extensions.PUBLIC_REPOSITORIES_LIST
|
||||||
import com.lagradost.cloudstream3.ui.settings.extensions.PluginsViewModel
|
import com.lagradost.cloudstream3.ui.settings.extensions.PluginsViewModel
|
||||||
import com.lagradost.cloudstream3.ui.settings.extensions.RepoAdapter
|
import com.lagradost.cloudstream3.ui.settings.extensions.RepoAdapter
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
||||||
|
@ -19,6 +23,10 @@ import kotlinx.android.synthetic.main.fragment_setup_media.*
|
||||||
class SetupFragmentExtensions : Fragment() {
|
class SetupFragmentExtensions : Fragment() {
|
||||||
companion object {
|
companion object {
|
||||||
const val SETUP_EXTENSION_BUNDLE_IS_SETUP = "isSetup"
|
const val SETUP_EXTENSION_BUNDLE_IS_SETUP = "isSetup"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If false then this is treated a singular screen with a done button
|
||||||
|
* */
|
||||||
fun newInstance(isSetup: Boolean): Bundle {
|
fun newInstance(isSetup: Boolean): Bundle {
|
||||||
return Bundle().apply {
|
return Bundle().apply {
|
||||||
putBoolean(SETUP_EXTENSION_BUNDLE_IS_SETUP, isSetup)
|
putBoolean(SETUP_EXTENSION_BUNDLE_IS_SETUP, isSetup)
|
||||||
|
@ -33,6 +41,33 @@ class SetupFragmentExtensions : Fragment() {
|
||||||
return inflater.inflate(R.layout.fragment_setup_extensions, container, false)
|
return inflater.inflate(R.layout.fragment_setup_extensions, container, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
afterRepositoryLoadedEvent += ::setRepositories
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStop() {
|
||||||
|
super.onStop()
|
||||||
|
afterRepositoryLoadedEvent -= ::setRepositories
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setRepositories(success: Boolean = true) {
|
||||||
|
val repositories = RepositoryManager.getRepositories() + PREBUILT_REPOSITORIES
|
||||||
|
val hasRepos = repositories.isNotEmpty()
|
||||||
|
repo_recycler_view?.isVisible = hasRepos
|
||||||
|
blank_repo_screen?.isVisible = !hasRepos
|
||||||
|
|
||||||
|
if (hasRepos) {
|
||||||
|
repo_recycler_view?.adapter = RepoAdapter(true, {}, {
|
||||||
|
PluginsViewModel.downloadAll(activity, it.url, null)
|
||||||
|
}).apply { updateList(repositories) }
|
||||||
|
} else {
|
||||||
|
list_repositories?.setOnClickListener {
|
||||||
|
openBrowser(PUBLIC_REPOSITORIES_LIST)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
context?.fixPaddingStatusbar(setup_root)
|
context?.fixPaddingStatusbar(setup_root)
|
||||||
|
@ -40,10 +75,7 @@ class SetupFragmentExtensions : Fragment() {
|
||||||
|
|
||||||
with(context) {
|
with(context) {
|
||||||
if (this == null) return
|
if (this == null) return
|
||||||
|
setRepositories()
|
||||||
repo_recycler_view?.adapter = RepoAdapter(true, {}, {
|
|
||||||
PluginsViewModel.downloadAll(activity, it.url, null)
|
|
||||||
}).apply { updateList(PREBUILT_REPOSITORIES) }
|
|
||||||
|
|
||||||
if (!isSetup) {
|
if (!isSetup) {
|
||||||
next_btt.setText(R.string.setup_done)
|
next_btt.setText(R.string.setup_done)
|
||||||
|
|
|
@ -80,8 +80,10 @@ class SetupFragmentLanguage : Fragment() {
|
||||||
|
|
||||||
next_btt?.setOnClickListener {
|
next_btt?.setOnClickListener {
|
||||||
// If no plugins go to plugins page
|
// If no plugins go to plugins page
|
||||||
val nextDestination = if (PluginManager.getPluginsOnline()
|
val nextDestination = if (
|
||||||
.isEmpty() && PREBUILT_REPOSITORIES.isNotEmpty()
|
PluginManager.getPluginsOnline().isEmpty()
|
||||||
|
&& PluginManager.getPluginsLocal().isEmpty()
|
||||||
|
//&& PREBUILT_REPOSITORIES.isNotEmpty()
|
||||||
) R.id.action_navigation_global_to_navigation_setup_extensions
|
) R.id.action_navigation_global_to_navigation_setup_extensions
|
||||||
else R.id.action_navigation_setup_language_to_navigation_setup_provider_languages
|
else R.id.action_navigation_setup_language_to_navigation_setup_provider_languages
|
||||||
|
|
||||||
|
|
|
@ -6,16 +6,21 @@
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/text1"
|
android:id="@+id/text1"
|
||||||
android:layout_width="match_parent"
|
android:layout_weight="1"
|
||||||
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_rowWeight="1"
|
android:layout_rowWeight="1"
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
|
|
||||||
android:layout_marginTop="20dp"
|
|
||||||
android:layout_marginBottom="10dp"
|
|
||||||
|
|
||||||
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
|
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
|
||||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
||||||
android:text="@string/add_repository"
|
android:text="@string/add_repository"
|
||||||
|
@ -23,6 +28,14 @@
|
||||||
android:textSize="20sp"
|
android:textSize="20sp"
|
||||||
android:textStyle="bold" />
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/list_repositories"
|
||||||
|
style="@style/WhiteButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:text="@string/view_public_repositories_button_short" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/text2"
|
android:id="@+id/text2"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
|
@ -19,10 +19,11 @@
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||||
app:layout_constraintBottom_toTopOf="@id/download_storage_appbar"
|
app:layout_constraintBottom_toTopOf="@id/download_storage_appbar"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
tools:listitem="@layout/repository_item" />
|
tools:listitem="@layout/repository_item"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:visibility="gone"
|
tools:visibility="gone"
|
||||||
android:id="@+id/blank_repo_screen"
|
android:id="@+id/blank_repo_screen"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
@ -31,17 +32,24 @@
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:layout_margin="10dp"
|
|
||||||
android:layout_width="30dp"
|
android:layout_width="30dp"
|
||||||
android:layout_height="30dp"
|
android:layout_height="30dp"
|
||||||
|
android:layout_margin="10dp"
|
||||||
android:src="@drawable/ic_baseline_extension_24" />
|
android:src="@drawable/ic_baseline_extension_24" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
android:layout_marginBottom="20dp"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:text="@string/blank_repo_message"
|
android:text="@string/blank_repo_message"
|
||||||
android:textSize="16sp" />
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/list_repositories"
|
||||||
|
style="@style/WhiteButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:text="@string/view_public_repositories_button" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/setup_root"
|
android:id="@+id/setup_root"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
@ -21,12 +21,43 @@
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:text="@string/setup_extensions_subtext" />
|
android:text="@string/setup_extensions_subtext" />
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<LinearLayout
|
||||||
android:id="@+id/repo_recycler_view"
|
android:id="@+id/blank_repo_screen"
|
||||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:listitem="@layout/repository_item" />
|
android:layout_margin="20dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
tools:visibility="gone">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="30dp"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:layout_margin="10dp"
|
||||||
|
android:src="@drawable/ic_baseline_extension_24" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="20dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/blank_repo_message"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/list_repositories"
|
||||||
|
style="@style/WhiteButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:text="@string/view_public_repositories_button" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/repo_recycler_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||||
|
tools:listitem="@layout/repository_item"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/apply_btt_holder"
|
android:id="@+id/apply_btt_holder"
|
||||||
|
|
|
@ -596,4 +596,6 @@
|
||||||
<string name="plugins_disabled" formatted="true">Disabled: %d</string>
|
<string name="plugins_disabled" formatted="true">Disabled: %d</string>
|
||||||
<string name="plugins_not_downloaded" formatted="true">Not downloaded: %d</string>
|
<string name="plugins_not_downloaded" formatted="true">Not downloaded: %d</string>
|
||||||
<string name="blank_repo_message">Add a repository to install site extensions</string>
|
<string name="blank_repo_message">Add a repository to install site extensions</string>
|
||||||
|
<string name="view_public_repositories_button">View public repositories</string>
|
||||||
|
<string name="view_public_repositories_button_short">Public list</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in a new issue