mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-09-24 05:04:50 -04:00
#1292 Rewrite of LanguageActivity
This commit is contained in:
parent
6ed73447c1
commit
97edd97d25
@ -26,21 +26,15 @@ import com.schibsted.spain.barista.interaction.BaristaSleepInteractions;
|
|||||||
import com.schibsted.spain.barista.rule.BaristaRule;
|
import com.schibsted.spain.barista.rule.BaristaRule;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.kiwix.kiwixmobile.R;
|
import org.kiwix.kiwixmobile.R;
|
||||||
import org.kiwix.kiwixmobile.intro.IntroActivity;
|
import org.kiwix.kiwixmobile.zim_manager.ZimManageActivity;
|
||||||
|
|
||||||
import static androidx.test.InstrumentationRegistry.getInstrumentation;
|
|
||||||
import static androidx.test.espresso.Espresso.onView;
|
import static androidx.test.espresso.Espresso.onView;
|
||||||
import static androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu;
|
|
||||||
import static androidx.test.espresso.action.ViewActions.click;
|
import static androidx.test.espresso.action.ViewActions.click;
|
||||||
import static androidx.test.espresso.action.ViewActions.closeSoftKeyboard;
|
import static androidx.test.espresso.action.ViewActions.closeSoftKeyboard;
|
||||||
import static androidx.test.espresso.action.ViewActions.replaceText;
|
import static androidx.test.espresso.action.ViewActions.replaceText;
|
||||||
import static androidx.test.espresso.action.ViewActions.swipeLeft;
|
|
||||||
import static androidx.test.espresso.action.ViewActions.swipeRight;
|
|
||||||
import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
|
|
||||||
import static androidx.test.espresso.assertion.ViewAssertions.matches;
|
import static androidx.test.espresso.assertion.ViewAssertions.matches;
|
||||||
import static androidx.test.espresso.matcher.ViewMatchers.isChecked;
|
import static androidx.test.espresso.matcher.ViewMatchers.isChecked;
|
||||||
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
|
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
|
||||||
@ -52,12 +46,11 @@ import static org.hamcrest.Matchers.allOf;
|
|||||||
import static org.hamcrest.core.IsNull.notNullValue;
|
import static org.hamcrest.core.IsNull.notNullValue;
|
||||||
import static org.kiwix.kiwixmobile.testutils.Matcher.childAtPosition;
|
import static org.kiwix.kiwixmobile.testutils.Matcher.childAtPosition;
|
||||||
import static org.kiwix.kiwixmobile.testutils.TestUtils.TEST_PAUSE_MS;
|
import static org.kiwix.kiwixmobile.testutils.TestUtils.TEST_PAUSE_MS;
|
||||||
import static org.kiwix.kiwixmobile.testutils.ViewActions.setChecked;
|
|
||||||
|
|
||||||
public class LanguageActivityTest {
|
public class LanguageActivityTest {
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public BaristaRule<IntroActivity> activityTestRule = BaristaRule.create(IntroActivity.class);
|
public BaristaRule<ZimManageActivity> activityTestRule = BaristaRule.create(ZimManageActivity.class);
|
||||||
@Rule
|
@Rule
|
||||||
public GrantPermissionRule readPermissionRule =
|
public GrantPermissionRule readPermissionRule =
|
||||||
GrantPermissionRule.grant(Manifest.permission.READ_EXTERNAL_STORAGE);
|
GrantPermissionRule.grant(Manifest.permission.READ_EXTERNAL_STORAGE);
|
||||||
@ -72,46 +65,8 @@ public class LanguageActivityTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Ignore("Broken in 2.5")//TODO: Fix in 3.0
|
|
||||||
public void testLanguageActivity() {
|
public void testLanguageActivity() {
|
||||||
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
onView(withText("Online")).perform(click());
|
||||||
onView(withId(R.id.get_started)).perform(click());
|
|
||||||
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
|
||||||
|
|
||||||
// Open the Library
|
|
||||||
openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());
|
|
||||||
onView(withText("Get Content")).perform(click());
|
|
||||||
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
|
||||||
|
|
||||||
ViewInteraction viewPager = onView(allOf(withId(R.id.manageViewPager),
|
|
||||||
childAtPosition(allOf(withId(R.id.zim_manager_main_activity),
|
|
||||||
childAtPosition(withId(android.R.id.content), 0)), 1),
|
|
||||||
isDisplayed()));
|
|
||||||
|
|
||||||
// Verify that the "Choose Language" and the "Search" buttons are present only in the "online" tab
|
|
||||||
onView(withContentDescription("Search")).check(matches(notNullValue()));
|
|
||||||
// Test that the language selection screen does not open if the "Choose language" button is clicked, while the data is being loaded
|
|
||||||
onView(withContentDescription("Choose a language")).check(matches(notNullValue()))
|
|
||||||
.perform(click());
|
|
||||||
|
|
||||||
viewPager.perform(swipeRight());
|
|
||||||
onView(withContentDescription("Search")).check(doesNotExist());
|
|
||||||
onView(withContentDescription("Choose a language")).check(doesNotExist());
|
|
||||||
viewPager.perform(swipeLeft());
|
|
||||||
viewPager.perform(swipeLeft());
|
|
||||||
onView(withContentDescription("Search")).check(doesNotExist());
|
|
||||||
onView(withContentDescription("Choose a language")).check(doesNotExist());
|
|
||||||
|
|
||||||
viewPager.perform(swipeRight());
|
|
||||||
|
|
||||||
// Verify that the library is still visible
|
|
||||||
onView(allOf(withText("Library"), childAtPosition(allOf(withId(R.id.toolbar),
|
|
||||||
childAtPosition(withId(R.id.toolbar_layout), 0)), 1), isDisplayed()));
|
|
||||||
|
|
||||||
// Make sure that the zim list has been loaded
|
|
||||||
//IdlingRegistry.getInstance().register(LibraryFragment.IDLING_RESOURCE);
|
|
||||||
onView(allOf(isDisplayed(), withText("Selected languages:"))).check(matches(notNullValue()));
|
|
||||||
|
|
||||||
// Open the Language Activity
|
// Open the Language Activity
|
||||||
onView(withContentDescription("Choose a language")).perform(click());
|
onView(withContentDescription("Choose a language")).perform(click());
|
||||||
|
|
||||||
@ -143,18 +98,7 @@ public class LanguageActivityTest {
|
|||||||
0),
|
0),
|
||||||
isDisplayed()));
|
isDisplayed()));
|
||||||
|
|
||||||
// Get a reference to the checkbox associated with the top unselected language
|
|
||||||
checkBox2 = onView(
|
|
||||||
allOf(withId(R.id.item_language_checkbox),
|
|
||||||
childAtPosition(
|
|
||||||
childAtPosition(
|
|
||||||
withId(R.id.recycler_view),
|
|
||||||
2),
|
|
||||||
0),
|
|
||||||
isDisplayed()));
|
|
||||||
|
|
||||||
// Initialise the language checkbox
|
|
||||||
checkBox2.perform(setChecked(false));
|
|
||||||
|
|
||||||
onView(withContentDescription("Save languages")).perform(click());
|
onView(withContentDescription("Save languages")).perform(click());
|
||||||
|
|
||||||
@ -164,8 +108,6 @@ public class LanguageActivityTest {
|
|||||||
onView(withId(R.id.search_src_text)).perform(replaceText(language2), closeSoftKeyboard());
|
onView(withId(R.id.search_src_text)).perform(replaceText(language2), closeSoftKeyboard());
|
||||||
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
||||||
|
|
||||||
// Initialise the language checkbox
|
|
||||||
checkBox2.perform(setChecked(false));
|
|
||||||
onView(withContentDescription("Clear query")).perform(click());
|
onView(withContentDescription("Clear query")).perform(click());
|
||||||
// Collapse the search view to go to the full list of languages
|
// Collapse the search view to go to the full list of languages
|
||||||
onView(withContentDescription("Collapse")).perform(click());
|
onView(withContentDescription("Collapse")).perform(click());
|
||||||
@ -178,7 +120,7 @@ public class LanguageActivityTest {
|
|||||||
onView(withId(R.id.search_src_text)).perform(replaceText(language1), closeSoftKeyboard());
|
onView(withId(R.id.search_src_text)).perform(replaceText(language1), closeSoftKeyboard());
|
||||||
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
||||||
|
|
||||||
checkBox2.perform(click());
|
checkBox1.perform(click());
|
||||||
onView(withContentDescription("Clear query")).perform(click());
|
onView(withContentDescription("Clear query")).perform(click());
|
||||||
// Collapse the search view to go to the full list of languages
|
// Collapse the search view to go to the full list of languages
|
||||||
onView(withContentDescription("Collapse")).perform(click());
|
onView(withContentDescription("Collapse")).perform(click());
|
||||||
@ -187,7 +129,7 @@ public class LanguageActivityTest {
|
|||||||
onView(withId(R.id.search_src_text)).perform(replaceText(language2), closeSoftKeyboard());
|
onView(withId(R.id.search_src_text)).perform(replaceText(language2), closeSoftKeyboard());
|
||||||
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
||||||
|
|
||||||
checkBox2.perform(click());
|
checkBox1.perform(click());
|
||||||
onView(withContentDescription("Clear query")).perform(click());
|
onView(withContentDescription("Clear query")).perform(click());
|
||||||
onView(withContentDescription("Collapse")).perform(click());
|
onView(withContentDescription("Collapse")).perform(click());
|
||||||
|
|
||||||
@ -216,7 +158,7 @@ public class LanguageActivityTest {
|
|||||||
onView(withId(R.id.search_src_text)).perform(replaceText(language1), closeSoftKeyboard());
|
onView(withId(R.id.search_src_text)).perform(replaceText(language1), closeSoftKeyboard());
|
||||||
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
||||||
|
|
||||||
checkBox2.check(matches(not(isChecked())));
|
checkBox1.check(matches(not(isChecked())));
|
||||||
|
|
||||||
onView(withContentDescription("Clear query")).perform(click());
|
onView(withContentDescription("Clear query")).perform(click());
|
||||||
onView(withContentDescription("Collapse")).perform(click());
|
onView(withContentDescription("Collapse")).perform(click());
|
||||||
@ -224,7 +166,7 @@ public class LanguageActivityTest {
|
|||||||
onView(withId(R.id.search_src_text)).perform(replaceText(language2), closeSoftKeyboard());
|
onView(withId(R.id.search_src_text)).perform(replaceText(language2), closeSoftKeyboard());
|
||||||
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
||||||
|
|
||||||
checkBox2.check(matches(not(isChecked())));
|
checkBox1.check(matches(not(isChecked())));
|
||||||
onView(withContentDescription("Clear query")).perform(click());
|
onView(withContentDescription("Clear query")).perform(click());
|
||||||
onView(withContentDescription("Collapse")).perform(click());
|
onView(withContentDescription("Collapse")).perform(click());
|
||||||
onView(withContentDescription("Navigate up")).perform(click());
|
onView(withContentDescription("Navigate up")).perform(click());
|
||||||
@ -237,7 +179,7 @@ public class LanguageActivityTest {
|
|||||||
onView(withId(R.id.search_src_text)).perform(replaceText(language1), closeSoftKeyboard());
|
onView(withId(R.id.search_src_text)).perform(replaceText(language1), closeSoftKeyboard());
|
||||||
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
||||||
|
|
||||||
checkBox2.perform(click());
|
checkBox1.perform(click());
|
||||||
|
|
||||||
onView(withContentDescription("Clear query")).perform(click());
|
onView(withContentDescription("Clear query")).perform(click());
|
||||||
onView(withContentDescription("Collapse")).perform(click());
|
onView(withContentDescription("Collapse")).perform(click());
|
||||||
@ -245,7 +187,7 @@ public class LanguageActivityTest {
|
|||||||
onView(withId(R.id.search_src_text)).perform(replaceText(language2), closeSoftKeyboard());
|
onView(withId(R.id.search_src_text)).perform(replaceText(language2), closeSoftKeyboard());
|
||||||
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
BaristaSleepInteractions.sleep(TEST_PAUSE_MS);
|
||||||
|
|
||||||
checkBox2.perform(click());
|
checkBox1.perform(click());
|
||||||
onView(withContentDescription("Clear query")).perform(click());
|
onView(withContentDescription("Clear query")).perform(click());
|
||||||
onView(withContentDescription("Collapse")).perform(click());
|
onView(withContentDescription("Collapse")).perform(click());
|
||||||
onView(withContentDescription("Save languages")).perform(click());
|
onView(withContentDescription("Save languages")).perform(click());
|
||||||
|
@ -92,7 +92,7 @@ public class BookmarksActivity extends BaseActivity implements BookmarksContract
|
|||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
presenter.attachView(this);
|
presenter.attachView(this);
|
||||||
setContentView(R.layout.activity_bookmarks_history_language);
|
setContentView(R.layout.activity_bookmarks);
|
||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
|
@ -24,7 +24,7 @@ data class LanguageEntity(
|
|||||||
)
|
)
|
||||||
|
|
||||||
fun toLanguageModel() =
|
fun toLanguageModel() =
|
||||||
Language(locale, active, occurencesOfLanguage)
|
Language(locale, active, occurencesOfLanguage, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
class StringToLocaleConverter : PropertyConverter<Locale, String> {
|
class StringToLocaleConverter : PropertyConverter<Locale, String> {
|
||||||
|
@ -12,7 +12,6 @@ import org.kiwix.kiwixmobile.history.HistoryModule;
|
|||||||
import org.kiwix.kiwixmobile.intro.IntroActivity;
|
import org.kiwix.kiwixmobile.intro.IntroActivity;
|
||||||
import org.kiwix.kiwixmobile.intro.IntroModule;
|
import org.kiwix.kiwixmobile.intro.IntroModule;
|
||||||
import org.kiwix.kiwixmobile.language.LanguageActivity;
|
import org.kiwix.kiwixmobile.language.LanguageActivity;
|
||||||
import org.kiwix.kiwixmobile.language.LanguageModule;
|
|
||||||
import org.kiwix.kiwixmobile.main.MainActivity;
|
import org.kiwix.kiwixmobile.main.MainActivity;
|
||||||
import org.kiwix.kiwixmobile.main.MainModule;
|
import org.kiwix.kiwixmobile.main.MainModule;
|
||||||
import org.kiwix.kiwixmobile.search.SearchActivity;
|
import org.kiwix.kiwixmobile.search.SearchActivity;
|
||||||
@ -61,7 +60,7 @@ public abstract class ActivityBindingModule {
|
|||||||
public abstract SplashActivity provideSplashActivity();
|
public abstract SplashActivity provideSplashActivity();
|
||||||
|
|
||||||
@PerActivity
|
@PerActivity
|
||||||
@ContributesAndroidInjector(modules = LanguageModule.class)
|
@ContributesAndroidInjector
|
||||||
public abstract LanguageActivity provideLanguageActivity();
|
public abstract LanguageActivity provideLanguageActivity();
|
||||||
|
|
||||||
@PerActivity
|
@PerActivity
|
||||||
|
@ -7,6 +7,7 @@ import dagger.Module
|
|||||||
import dagger.multibindings.IntoMap
|
import dagger.multibindings.IntoMap
|
||||||
import org.kiwix.kiwixmobile.KiwixViewModelFactory
|
import org.kiwix.kiwixmobile.KiwixViewModelFactory
|
||||||
import org.kiwix.kiwixmobile.di.ViewModelKey
|
import org.kiwix.kiwixmobile.di.ViewModelKey
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.LanguageViewModel
|
||||||
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel
|
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -31,7 +32,12 @@ abstract class ViewModelModule {
|
|||||||
@Binds
|
@Binds
|
||||||
@IntoMap
|
@IntoMap
|
||||||
@ViewModelKey(ZimManageViewModel::class)
|
@ViewModelKey(ZimManageViewModel::class)
|
||||||
internal abstract fun bindUserViewModel(userViewModel: ZimManageViewModel): ViewModel
|
internal abstract fun bindZimManageViewModel(zimManageViewModel: ZimManageViewModel): ViewModel
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
@IntoMap
|
||||||
|
@ViewModelKey(LanguageViewModel::class)
|
||||||
|
internal abstract fun bindLanguageViewModel(languageViewModel: LanguageViewModel): ViewModel
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
internal abstract fun bindViewModelFactory(factory: KiwixViewModelFactory): ViewModelProvider.Factory
|
internal abstract fun bindViewModelFactory(factory: KiwixViewModelFactory): ViewModelProvider.Factory
|
||||||
|
@ -23,7 +23,6 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.lifecycle.Observer
|
import androidx.lifecycle.Observer
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.lifecycle.ViewModelProviders
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import kotlinx.android.synthetic.main.layout_download_management.download_management_no_downloads
|
import kotlinx.android.synthetic.main.layout_download_management.download_management_no_downloads
|
||||||
@ -31,6 +30,7 @@ import kotlinx.android.synthetic.main.layout_download_management.zim_downloader_
|
|||||||
import org.kiwix.kiwixmobile.base.BaseFragment
|
import org.kiwix.kiwixmobile.base.BaseFragment
|
||||||
import org.kiwix.kiwixmobile.di.components.ActivityComponent
|
import org.kiwix.kiwixmobile.di.components.ActivityComponent
|
||||||
import org.kiwix.kiwixmobile.downloader.model.DownloadItem
|
import org.kiwix.kiwixmobile.downloader.model.DownloadItem
|
||||||
|
import org.kiwix.kiwixmobile.extensions.viewModel
|
||||||
import org.kiwix.kiwixmobile.utils.DialogShower
|
import org.kiwix.kiwixmobile.utils.DialogShower
|
||||||
import org.kiwix.kiwixmobile.utils.KiwixDialog.YesNoDialog.StopDownload
|
import org.kiwix.kiwixmobile.utils.KiwixDialog.YesNoDialog.StopDownload
|
||||||
import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil
|
import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil
|
||||||
@ -44,10 +44,10 @@ class DownloadFragment : BaseFragment() {
|
|||||||
@Inject lateinit var sharedPreferenceUtil: SharedPreferenceUtil
|
@Inject lateinit var sharedPreferenceUtil: SharedPreferenceUtil
|
||||||
@Inject lateinit var downloader: Downloader
|
@Inject lateinit var downloader: Downloader
|
||||||
|
|
||||||
private val zimManageViewModel: ZimManageViewModel by lazy {
|
private val zimManageViewModel by lazy {
|
||||||
ViewModelProviders.of(activity!!, viewModelFactory)
|
activity!!.viewModel<ZimManageViewModel>(viewModelFactory)
|
||||||
.get(ZimManageViewModel::class.java)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private val downloadAdapter = DownloadAdapter {
|
private val downloadAdapter = DownloadAdapter {
|
||||||
dialogShower.show(StopDownload, { downloader.cancelDownload(it) })
|
dialogShower.show(StopDownload, { downloader.cancelDownload(it) })
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
package org.kiwix.kiwixmobile.extensions
|
package org.kiwix.kiwixmobile.extensions
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
|
import android.content.Intent
|
||||||
import android.view.ActionMode
|
import android.view.ActionMode
|
||||||
import android.view.ActionMode.Callback
|
import android.view.ActionMode.Callback
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
|
import androidx.fragment.app.FragmentActivity
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.lifecycle.ViewModelProviders
|
||||||
|
import org.kiwix.kiwixmobile.base.BaseActivity
|
||||||
|
|
||||||
fun Activity.startActionMode(
|
fun Activity.startActionMode(
|
||||||
menuId: Int,
|
menuId: Int,
|
||||||
@ -41,3 +47,12 @@ fun Activity.startActionMode(
|
|||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline fun <reified T : Activity> Activity.start() {
|
||||||
|
startActivity(Intent(this, T::class.java))
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <reified T : ViewModel> FragmentActivity.viewModel(viewModelFactory: ViewModelProvider.Factory) =
|
||||||
|
ViewModelProviders.of(this, viewModelFactory)
|
||||||
|
.get(T::class.java)
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ public class HistoryActivity extends BaseActivity implements HistoryContract.Vie
|
|||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
presenter.attachView(this);
|
presenter.attachView(this);
|
||||||
setContentView(R.layout.activity_bookmarks_history_language);
|
setContentView(R.layout.activity_history);
|
||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
|
@ -1,111 +0,0 @@
|
|||||||
package org.kiwix.kiwixmobile.language;
|
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.widget.Toast;
|
|
||||||
import androidx.appcompat.app.ActionBar;
|
|
||||||
import androidx.appcompat.widget.SearchView;
|
|
||||||
import androidx.appcompat.widget.Toolbar;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import butterknife.BindView;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import org.kiwix.kiwixmobile.R;
|
|
||||||
import org.kiwix.kiwixmobile.base.BaseActivity;
|
|
||||||
import org.kiwix.kiwixmobile.zim_manager.Language;
|
|
||||||
|
|
||||||
public class LanguageActivity extends BaseActivity implements LanguageContract.View {
|
|
||||||
|
|
||||||
public static final String LANGUAGE_LIST = "languages";
|
|
||||||
private final ArrayList<Language> languages = new ArrayList<>();
|
|
||||||
private final ArrayList<Language> allLanguages = new ArrayList<>();
|
|
||||||
|
|
||||||
@BindView(R.id.toolbar)
|
|
||||||
Toolbar toolbar;
|
|
||||||
@BindView(R.id.recycler_view)
|
|
||||||
RecyclerView recyclerView;
|
|
||||||
@Inject
|
|
||||||
LanguageContract.Presenter presenter;
|
|
||||||
|
|
||||||
private LanguageAdapter languageAdapter;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
presenter.attachView(this);
|
|
||||||
setContentView(R.layout.activity_bookmarks_history_language);
|
|
||||||
setSupportActionBar(toolbar);
|
|
||||||
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
|
||||||
if (actionBar != null) {
|
|
||||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
|
||||||
actionBar.setHomeAsUpIndicator(R.drawable.ic_clear_white_24dp);
|
|
||||||
actionBar.setTitle(R.string.select_languages);
|
|
||||||
}
|
|
||||||
|
|
||||||
languages.addAll(getIntent().getParcelableArrayListExtra(LANGUAGE_LIST));
|
|
||||||
allLanguages.addAll(languages);
|
|
||||||
languageAdapter = new LanguageAdapter(languages);
|
|
||||||
recyclerView.setAdapter(languageAdapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
|
||||||
getMenuInflater().inflate(R.menu.menu_language, menu);
|
|
||||||
MenuItem search = menu.findItem(R.id.menu_language_search);
|
|
||||||
((SearchView) search.getActionView()).setOnQueryTextListener(
|
|
||||||
new SearchView.OnQueryTextListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onQueryTextSubmit(String query) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onQueryTextChange(String newText) {
|
|
||||||
languages.clear();
|
|
||||||
languages.addAll(allLanguages);
|
|
||||||
presenter.filerLanguages(languages, newText);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case android.R.id.home:
|
|
||||||
onBackPressed();
|
|
||||||
return true;
|
|
||||||
case R.id.menu_language_save:
|
|
||||||
languages.clear();
|
|
||||||
languages.addAll(allLanguages);
|
|
||||||
presenter.saveLanguages(languages);
|
|
||||||
|
|
||||||
Toast.makeText(this, getString(R.string.languages_saved), Toast.LENGTH_SHORT).show();
|
|
||||||
Intent intent = new Intent();
|
|
||||||
intent.putParcelableArrayListExtra(LANGUAGE_LIST, languages);
|
|
||||||
setResult(RESULT_OK, intent);
|
|
||||||
finish();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDestroy() {
|
|
||||||
presenter.detachView();
|
|
||||||
super.onDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void notifyLanguagesFiltered(List<Language> languages) {
|
|
||||||
this.languages.clear();
|
|
||||||
this.languages.addAll(languages);
|
|
||||||
languageAdapter.categorizeLanguages();
|
|
||||||
languageAdapter.notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,110 @@
|
|||||||
|
package org.kiwix.kiwixmobile.language
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.MenuItem
|
||||||
|
import androidx.appcompat.widget.SearchView
|
||||||
|
import androidx.lifecycle.Observer
|
||||||
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
|
import kotlinx.android.synthetic.main.activity_language.language_progressbar
|
||||||
|
import kotlinx.android.synthetic.main.activity_language.recycler_view
|
||||||
|
import kotlinx.android.synthetic.main.activity_language.toolbar
|
||||||
|
import org.kiwix.kiwixmobile.R
|
||||||
|
import org.kiwix.kiwixmobile.base.BaseActivity
|
||||||
|
import org.kiwix.kiwixmobile.extensions.viewModel
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.Select
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.State.Content
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.State.Loading
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.State.Saving
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageAdapter
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageDelegate.HeaderDelegate
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageDelegate.LanguageItemDelegate
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.Action
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.LanguageViewModel
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.State
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.SimpleTextListener
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class LanguageActivity : BaseActivity() {
|
||||||
|
|
||||||
|
private val languageViewModel by lazy { viewModel<LanguageViewModel>(viewModelFactory) }
|
||||||
|
|
||||||
|
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
|
||||||
|
|
||||||
|
val compositeDisposable = CompositeDisposable()
|
||||||
|
|
||||||
|
private val languageAdapter =
|
||||||
|
LanguageAdapter(
|
||||||
|
LanguageItemDelegate { languageViewModel.actions.offer(Select(it)) },
|
||||||
|
HeaderDelegate()
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.activity_language)
|
||||||
|
setSupportActionBar(toolbar)
|
||||||
|
|
||||||
|
supportActionBar?.let {
|
||||||
|
it.setDisplayHomeAsUpEnabled(true)
|
||||||
|
it.setHomeAsUpIndicator(R.drawable.ic_clear_white_24dp)
|
||||||
|
it.setTitle(R.string.select_languages)
|
||||||
|
}
|
||||||
|
recycler_view.run {
|
||||||
|
adapter = languageAdapter
|
||||||
|
layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
|
||||||
|
setHasFixedSize(true)
|
||||||
|
}
|
||||||
|
languageViewModel.state.observe(this, Observer {
|
||||||
|
render(it)
|
||||||
|
})
|
||||||
|
compositeDisposable.add(
|
||||||
|
languageViewModel.effects.subscribe(
|
||||||
|
{
|
||||||
|
it.invokeWith(this)
|
||||||
|
},
|
||||||
|
Throwable::printStackTrace
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
compositeDisposable.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun render(state: State) = when (state) {
|
||||||
|
Loading -> language_progressbar.show()
|
||||||
|
is Content -> {
|
||||||
|
language_progressbar.hide()
|
||||||
|
languageAdapter.items = state.viewItems
|
||||||
|
}
|
||||||
|
Saving -> Unit
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
menuInflater.inflate(R.menu.menu_language, menu)
|
||||||
|
val search = menu.findItem(R.id.menu_language_search)
|
||||||
|
(search.actionView as SearchView).setOnQueryTextListener(SimpleTextListener {
|
||||||
|
languageViewModel.actions.offer(Action.Filter(it))
|
||||||
|
})
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
when (item.itemId) {
|
||||||
|
android.R.id.home -> {
|
||||||
|
onBackPressed()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
R.id.menu_language_save -> {
|
||||||
|
languageViewModel.actions.offer(Action.SaveAll)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,139 +0,0 @@
|
|||||||
package org.kiwix.kiwixmobile.language;
|
|
||||||
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.CheckBox;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import butterknife.BindView;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import org.kiwix.kiwixmobile.R;
|
|
||||||
import org.kiwix.kiwixmobile.zim_manager.Language;
|
|
||||||
|
|
||||||
class LanguageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
|
||||||
private static final int TYPE_HEADER = 0;
|
|
||||||
private static final int TYPE_ITEM = 1;
|
|
||||||
private final ArrayList<Language> languages;
|
|
||||||
private final ArrayList<Language> selectedLanguages = new ArrayList<>();
|
|
||||||
private final ArrayList<Language> unselectedLanguages = new ArrayList<>();
|
|
||||||
|
|
||||||
LanguageAdapter(ArrayList<Language> languages) {
|
|
||||||
this.languages = languages;
|
|
||||||
categorizeLanguages();
|
|
||||||
}
|
|
||||||
|
|
||||||
void categorizeLanguages() {
|
|
||||||
selectedLanguages.clear();
|
|
||||||
unselectedLanguages.clear();
|
|
||||||
//for (Language language : languages) {
|
|
||||||
// if (language.active != null && language.active.equals(true)) {
|
|
||||||
// selectedLanguages.add(language);
|
|
||||||
// } else {
|
|
||||||
// language.active = false;
|
|
||||||
// unselectedLanguages.add(language);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//Collections.sort(selectedLanguages);
|
|
||||||
//Collections.sort(unselectedLanguages);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
||||||
if (viewType == TYPE_ITEM) {
|
|
||||||
View view =
|
|
||||||
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_language, parent, false);
|
|
||||||
return new ViewHolder(view);
|
|
||||||
}
|
|
||||||
return new Header(
|
|
||||||
LayoutInflater.from(parent.getContext()).inflate(R.layout.header_date, parent, false));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder item, int position) {
|
|
||||||
if (item instanceof Header) {
|
|
||||||
Header header = (Header) item;
|
|
||||||
if (position == 0) {
|
|
||||||
header.header.setText(R.string.your_languages);
|
|
||||||
} else {
|
|
||||||
header.header.setText(R.string.other_languages);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Language language;
|
|
||||||
if (position - 1 < selectedLanguages.size()) {
|
|
||||||
language = selectedLanguages.get(position - 1);
|
|
||||||
} else {
|
|
||||||
language = unselectedLanguages.get(position - selectedLanguages.size() - 2);
|
|
||||||
}
|
|
||||||
ViewHolder holder = (ViewHolder) item;
|
|
||||||
//holder.languageName.setText(language.language);
|
|
||||||
//holder.languageLocalizedName.setText(language.languageLocalized);
|
|
||||||
//holder.booksCount.setText(holder.booksCount.getContext().getResources()
|
|
||||||
// .getQuantityString(R.plurals.books_count, language.booksCount, language.booksCount));
|
|
||||||
//if (language.active == null) {
|
|
||||||
// language.active = false;
|
|
||||||
//}
|
|
||||||
//holder.checkBox.setChecked(language.active);
|
|
||||||
//View.OnClickListener onClickListener = v -> {
|
|
||||||
// language.active = holder.checkBox.isChecked();
|
|
||||||
// if (language.active) {
|
|
||||||
// unselectedLanguages.remove(language);
|
|
||||||
// selectedLanguages.add(language);
|
|
||||||
// } else {
|
|
||||||
// unselectedLanguages.add(language);
|
|
||||||
// selectedLanguages.remove(language);
|
|
||||||
// }
|
|
||||||
// Collections.sort(selectedLanguages);
|
|
||||||
// Collections.sort(unselectedLanguages);
|
|
||||||
// notifyDataSetChanged();
|
|
||||||
//};
|
|
||||||
//holder.itemView.setOnClickListener(v -> {
|
|
||||||
// holder.checkBox.toggle();
|
|
||||||
// onClickListener.onClick(v);
|
|
||||||
//});
|
|
||||||
//holder.checkBox.setOnClickListener(onClickListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemViewType(int position) {
|
|
||||||
if (position == 0 || position == selectedLanguages.size() + 1) {
|
|
||||||
return TYPE_HEADER;
|
|
||||||
}
|
|
||||||
return TYPE_ITEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return selectedLanguages.size() + unselectedLanguages.size() + 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
class ViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
@BindView(R.id.item_language_name)
|
|
||||||
TextView languageName;
|
|
||||||
@BindView(R.id.item_language_localized_name)
|
|
||||||
TextView languageLocalizedName;
|
|
||||||
@BindView(R.id.item_language_books_count)
|
|
||||||
TextView booksCount;
|
|
||||||
@BindView(R.id.item_language_checkbox)
|
|
||||||
CheckBox checkBox;
|
|
||||||
|
|
||||||
ViewHolder(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
ButterKnife.bind(this, itemView);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Header extends RecyclerView.ViewHolder {
|
|
||||||
@BindView(R.id.header_date)
|
|
||||||
TextView header;
|
|
||||||
|
|
||||||
Header(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
ButterKnife.bind(this, itemView);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
package org.kiwix.kiwixmobile.language;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import org.kiwix.kiwixmobile.base.BaseContract;
|
|
||||||
import org.kiwix.kiwixmobile.zim_manager.Language;
|
|
||||||
|
|
||||||
interface LanguageContract {
|
|
||||||
interface View extends BaseContract.View<Presenter> {
|
|
||||||
void notifyLanguagesFiltered(List<Language> languages);
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Presenter extends BaseContract.Presenter<View> {
|
|
||||||
void filerLanguages(List<Language> languages, String query);
|
|
||||||
|
|
||||||
void saveLanguages(List<Language> languages);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
package org.kiwix.kiwixmobile.language;
|
|
||||||
|
|
||||||
import dagger.Module;
|
|
||||||
import dagger.Provides;
|
|
||||||
import org.kiwix.kiwixmobile.di.PerActivity;
|
|
||||||
|
|
||||||
@Module
|
|
||||||
public class LanguageModule {
|
|
||||||
@PerActivity
|
|
||||||
@Provides
|
|
||||||
LanguageContract.Presenter provideLanguagePresenter(LanguagePresenter presenter) {
|
|
||||||
return presenter;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
package org.kiwix.kiwixmobile.language;
|
|
||||||
|
|
||||||
import android.util.Log;
|
|
||||||
import io.reactivex.CompletableObserver;
|
|
||||||
import io.reactivex.Scheduler;
|
|
||||||
import io.reactivex.disposables.Disposable;
|
|
||||||
import java.util.List;
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import org.kiwix.kiwixmobile.base.BasePresenter;
|
|
||||||
import org.kiwix.kiwixmobile.data.DataSource;
|
|
||||||
import org.kiwix.kiwixmobile.di.PerActivity;
|
|
||||||
import org.kiwix.kiwixmobile.di.qualifiers.Computation;
|
|
||||||
import org.kiwix.kiwixmobile.di.qualifiers.MainThread;
|
|
||||||
import org.kiwix.kiwixmobile.zim_manager.Language;
|
|
||||||
|
|
||||||
@PerActivity
|
|
||||||
class LanguagePresenter extends BasePresenter<LanguageContract.View>
|
|
||||||
implements LanguageContract.Presenter {
|
|
||||||
private final Scheduler mainThread;
|
|
||||||
private final Scheduler computation;
|
|
||||||
private final DataSource dataSource;
|
|
||||||
|
|
||||||
@Inject LanguagePresenter(DataSource dataSource, @Computation Scheduler computation,
|
|
||||||
@MainThread Scheduler mainThread) {
|
|
||||||
this.computation = computation;
|
|
||||||
this.mainThread = mainThread;
|
|
||||||
this.dataSource = dataSource;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void filerLanguages(List<Language> languages, String query) {
|
|
||||||
//Observable.fromIterable(languages)
|
|
||||||
// .filter(language -> language.language.toLowerCase().contains(query.toLowerCase()) ||
|
|
||||||
// language.languageLocalized.toLowerCase().contains(query.toLowerCase()))
|
|
||||||
// .toList()
|
|
||||||
// .subscribeOn(computation)
|
|
||||||
// .observeOn(mainThread)
|
|
||||||
// .subscribe(new SingleObserver<List<Language>>() {
|
|
||||||
// @Override
|
|
||||||
// public void onSubscribe(Disposable d) {
|
|
||||||
// compositeDisposable.add(d);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void onSuccess(List<Language> languages) {
|
|
||||||
// view.notifyLanguagesFiltered(languages);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void onError(Throwable e) {
|
|
||||||
// Log.e("LanguagePresenter", e.toString());
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void saveLanguages(List<Language> languages) {
|
|
||||||
dataSource.saveLanguages(languages)
|
|
||||||
.subscribe(new CompletableObserver() {
|
|
||||||
@Override
|
|
||||||
public void onSubscribe(Disposable d) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onComplete() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onError(Throwable e) {
|
|
||||||
Log.e("LanguagePresenter", e.toString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Kiwix Android
|
||||||
|
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.kiwix.kiwixmobile.language.adapter
|
||||||
|
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.library_view.adapter.base.AdapterDelegate
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.library_view.adapter.base.BaseDelegateAdapter
|
||||||
|
|
||||||
|
class LanguageAdapter(
|
||||||
|
vararg delegates: AdapterDelegate<LanguageListItem>
|
||||||
|
) : BaseDelegateAdapter<LanguageListItem>(*delegates) {
|
||||||
|
override fun getIdFor(item: LanguageListItem) = item.id
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package org.kiwix.kiwixmobile.language.adapter
|
||||||
|
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import org.kiwix.kiwixmobile.R
|
||||||
|
import org.kiwix.kiwixmobile.extensions.inflate
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.HeaderItem
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.LanguageItem
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListViewHolder.HeaderViewHolder
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListViewHolder.LanguageViewHolder
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.library_view.adapter.base.AbsDelegateAdapter
|
||||||
|
|
||||||
|
sealed class LanguageDelegate<I : LanguageListItem, VH : LanguageListViewHolder<I>> :
|
||||||
|
AbsDelegateAdapter<I, LanguageListItem, VH> {
|
||||||
|
|
||||||
|
class HeaderDelegate : LanguageDelegate<HeaderItem, HeaderViewHolder>() {
|
||||||
|
override val itemClass = HeaderItem::class.java
|
||||||
|
|
||||||
|
override fun createViewHolder(parent: ViewGroup) =
|
||||||
|
HeaderViewHolder(parent.inflate(R.layout.header_date, false))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class LanguageItemDelegate(val clickAction: (LanguageItem) -> Unit) : LanguageDelegate<LanguageItem, LanguageViewHolder>() {
|
||||||
|
override val itemClass = LanguageItem::class.java
|
||||||
|
|
||||||
|
override fun createViewHolder(parent: ViewGroup) =
|
||||||
|
LanguageViewHolder(parent.inflate(R.layout.item_language, false), clickAction)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package org.kiwix.kiwixmobile.language.adapter
|
||||||
|
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.Language
|
||||||
|
|
||||||
|
sealed class LanguageListItem {
|
||||||
|
abstract val id: Long
|
||||||
|
|
||||||
|
data class HeaderItem constructor(
|
||||||
|
override val id: Long
|
||||||
|
) : LanguageListItem() {
|
||||||
|
companion object{
|
||||||
|
const val SELECTED = Long.MAX_VALUE
|
||||||
|
const val OTHER = Long.MIN_VALUE
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
data class LanguageItem(
|
||||||
|
val language: Language,
|
||||||
|
override val id: Long = language.id
|
||||||
|
) : LanguageListItem()
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package org.kiwix.kiwixmobile.language.adapter
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import kotlinx.android.synthetic.main.header_date.header_date
|
||||||
|
import kotlinx.android.synthetic.main.item_language.item_language_books_count
|
||||||
|
import kotlinx.android.synthetic.main.item_language.item_language_checkbox
|
||||||
|
import kotlinx.android.synthetic.main.item_language.item_language_clickable_area
|
||||||
|
import kotlinx.android.synthetic.main.item_language.item_language_localized_name
|
||||||
|
import kotlinx.android.synthetic.main.item_language.item_language_name
|
||||||
|
import org.kiwix.kiwixmobile.R
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.HeaderItem
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.LanguageItem
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.library_view.adapter.base.BaseViewHolder
|
||||||
|
|
||||||
|
sealed class LanguageListViewHolder<T : LanguageListItem>(override val containerView: View) :
|
||||||
|
BaseViewHolder<T>(containerView) {
|
||||||
|
class HeaderViewHolder(view: View) : LanguageListViewHolder<HeaderItem>(view) {
|
||||||
|
override fun bind(item: HeaderItem) {
|
||||||
|
header_date.setText(
|
||||||
|
if (item.id == HeaderItem.SELECTED) R.string.your_languages
|
||||||
|
else R.string.other_languages
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LanguageViewHolder(
|
||||||
|
view: View,
|
||||||
|
val clickAction: (LanguageItem) -> Unit
|
||||||
|
) : LanguageListViewHolder<LanguageItem>(view) {
|
||||||
|
override fun bind(item: LanguageItem) {
|
||||||
|
val language = item.language
|
||||||
|
item_language_name.text = language.language
|
||||||
|
item_language_localized_name.text = language.languageLocalized
|
||||||
|
item_language_books_count.text = containerView.resources.getQuantityString(
|
||||||
|
R.plurals.books_count, language.occurencesOfLanguage, language.occurencesOfLanguage
|
||||||
|
)
|
||||||
|
item_language_checkbox.isChecked = language.active;
|
||||||
|
item_language_clickable_area.setOnClickListener { clickAction(item) }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package org.kiwix.kiwixmobile.language.viewmodel
|
||||||
|
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.LanguageItem
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.Language
|
||||||
|
|
||||||
|
sealed class Action {
|
||||||
|
data class UpdateLanguages(val languages: List<Language>) : Action()
|
||||||
|
data class Filter(val filter: String) : Action()
|
||||||
|
data class Select(val language: LanguageItem) : Action()
|
||||||
|
object SaveAll : Action()
|
||||||
|
}
|
@ -0,0 +1,91 @@
|
|||||||
|
package org.kiwix.kiwixmobile.language.viewmodel
|
||||||
|
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
|
import io.reactivex.processors.PublishProcessor
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewLanguagesDao
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.LanguageItem
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.Filter
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.SaveAll
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.Select
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.UpdateLanguages
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.State.Content
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.State.Loading
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.State.Saving
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.fileselect_view.effects.SideEffect
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class LanguageViewModel @Inject constructor(
|
||||||
|
private val languageDao: NewLanguagesDao
|
||||||
|
) : ViewModel() {
|
||||||
|
|
||||||
|
val state = MutableLiveData<State>().apply { value = Loading }
|
||||||
|
val actions = PublishProcessor.create<Action>()
|
||||||
|
val effects = PublishProcessor.create<SideEffect<*>>()
|
||||||
|
|
||||||
|
private val compositeDisposable = CompositeDisposable()
|
||||||
|
|
||||||
|
init {
|
||||||
|
compositeDisposable.addAll(
|
||||||
|
actions.map { reduce(it, state.value!!) }
|
||||||
|
.distinctUntilChanged()
|
||||||
|
.subscribe(state::postValue, Throwable::printStackTrace),
|
||||||
|
languageDao.languages().filter { it.isNotEmpty() }
|
||||||
|
.subscribe(
|
||||||
|
{
|
||||||
|
actions.offer(UpdateLanguages(it))
|
||||||
|
},
|
||||||
|
Throwable::printStackTrace
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun reduce(
|
||||||
|
action: Action,
|
||||||
|
currentState: State
|
||||||
|
): State {
|
||||||
|
return when (action) {
|
||||||
|
is UpdateLanguages -> when (currentState) {
|
||||||
|
Loading -> Content(action.languages)
|
||||||
|
else -> currentState
|
||||||
|
}
|
||||||
|
is Filter -> {
|
||||||
|
when (currentState) {
|
||||||
|
is Content -> filterContent(action.filter, currentState)
|
||||||
|
else -> currentState
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is Select ->
|
||||||
|
when (currentState) {
|
||||||
|
is Content -> updateSelection(action.language, currentState)
|
||||||
|
else -> currentState
|
||||||
|
}
|
||||||
|
SaveAll ->
|
||||||
|
when (currentState) {
|
||||||
|
is Content -> saveAll(currentState)
|
||||||
|
else -> currentState
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun saveAll(currentState: Content): State {
|
||||||
|
effects.offer(
|
||||||
|
SaveLanguagesAndFinish(
|
||||||
|
currentState.items, languageDao
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return Saving
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateSelection(
|
||||||
|
languageItem: LanguageItem,
|
||||||
|
currentState: Content
|
||||||
|
) = currentState.select(languageItem)
|
||||||
|
|
||||||
|
private fun filterContent(
|
||||||
|
filter: String,
|
||||||
|
currentState: Content
|
||||||
|
) = currentState.updateFilter(filter)
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Kiwix Android
|
||||||
|
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.kiwix.kiwixmobile.language.viewmodel
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import io.reactivex.Flowable
|
||||||
|
import io.reactivex.schedulers.Schedulers
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewLanguagesDao
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.Language
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.fileselect_view.effects.SideEffect
|
||||||
|
|
||||||
|
data class SaveLanguagesAndFinish(
|
||||||
|
val languages: List<Language>,
|
||||||
|
val languageDao: NewLanguagesDao
|
||||||
|
) : SideEffect<Unit> {
|
||||||
|
|
||||||
|
override fun invokeWith(activity: Activity) {
|
||||||
|
Flowable.fromCallable { languageDao.insert(languages) }
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.subscribe({
|
||||||
|
activity.finish()
|
||||||
|
}, Throwable::printStackTrace)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
package org.kiwix.kiwixmobile.language.viewmodel
|
||||||
|
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.HeaderItem
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.LanguageItem
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.Language
|
||||||
|
|
||||||
|
sealed class State() {
|
||||||
|
object Loading : State()
|
||||||
|
object Saving : State()
|
||||||
|
data class Content(
|
||||||
|
val items: List<Language>,
|
||||||
|
val filter: String = "",
|
||||||
|
val viewItems: List<LanguageListItem> = createViewList(
|
||||||
|
items, filter
|
||||||
|
)
|
||||||
|
) : State() {
|
||||||
|
fun select(languageItem: LanguageItem) = Content(
|
||||||
|
items.map { if (it.id == languageItem.id) it.copy(active = !it.active) else it },
|
||||||
|
filter
|
||||||
|
)
|
||||||
|
|
||||||
|
fun updateFilter(filter: String) = Content(items, filter)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
internal fun createViewList(
|
||||||
|
items: List<Language>,
|
||||||
|
filter: String
|
||||||
|
) = activeItems(
|
||||||
|
items, filter
|
||||||
|
) + otherItems(items, filter)
|
||||||
|
|
||||||
|
private fun activeItems(
|
||||||
|
items: List<Language>,
|
||||||
|
filter: String
|
||||||
|
) =
|
||||||
|
createLanguageSection(
|
||||||
|
items, filter, { it.active }, HeaderItem.SELECTED
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun otherItems(
|
||||||
|
items: List<Language>,
|
||||||
|
filter: String
|
||||||
|
) =
|
||||||
|
createLanguageSection(
|
||||||
|
items, filter, { !it.active }, HeaderItem.OTHER
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun createLanguageSection(
|
||||||
|
items: List<Language>,
|
||||||
|
filter: String,
|
||||||
|
filterCondition: (Language) -> Boolean,
|
||||||
|
headerId: Long
|
||||||
|
) = items.filter(filterCondition)
|
||||||
|
.filter { filter.isEmpty() or it.matches(filter) }
|
||||||
|
.takeIf { it.isNotEmpty() }
|
||||||
|
?.let { listOf(HeaderItem(headerId)) + it.map { language -> LanguageItem(language) } }
|
||||||
|
?: emptyList()
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,34 +0,0 @@
|
|||||||
package org.kiwix.kiwixmobile.views
|
|
||||||
|
|
||||||
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
|
||||||
import org.kiwix.kiwixmobile.R
|
|
||||||
import org.kiwix.kiwixmobile.extensions.inflate
|
|
||||||
import org.kiwix.kiwixmobile.zim_manager.Language
|
|
||||||
|
|
||||||
class LanguageAdapter(val listItems: MutableList<Language>) : RecyclerView.Adapter<LanguageViewHolder>() {
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(
|
|
||||||
parent: ViewGroup,
|
|
||||||
viewType: Int
|
|
||||||
) = LanguageViewHolder(
|
|
||||||
parent.inflate(R.layout.item_language, false),
|
|
||||||
this::toggleItemAt
|
|
||||||
)
|
|
||||||
|
|
||||||
override fun getItemCount() = listItems.size
|
|
||||||
|
|
||||||
override fun onBindViewHolder(
|
|
||||||
holder: LanguageViewHolder,
|
|
||||||
position: Int
|
|
||||||
) {
|
|
||||||
holder.bind(listItems[position], position)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun toggleItemAt(position: Int) {
|
|
||||||
listItems[position] = listItems[position].also { it.active = !it.active }
|
|
||||||
notifyItemChanged(position)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
|||||||
/*
|
|
||||||
* Kiwix Android
|
|
||||||
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package org.kiwix.kiwixmobile.views
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.view.View
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
|
||||||
import kotlinx.android.extensions.LayoutContainer
|
|
||||||
import kotlinx.android.synthetic.main.language_selection.language_check_view
|
|
||||||
import org.kiwix.kiwixmobile.R
|
|
||||||
import org.kiwix.kiwixmobile.zim_manager.Language
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by judebrauer on 12/6/17
|
|
||||||
*/
|
|
||||||
|
|
||||||
class LanguageSelectDialog constructor(
|
|
||||||
context: Context
|
|
||||||
) : AlertDialog(context) {
|
|
||||||
|
|
||||||
class Builder : AlertDialog.Builder, LayoutContainer {
|
|
||||||
lateinit var dialogView: View
|
|
||||||
override val containerView: View? by lazy { dialogView }
|
|
||||||
lateinit var onOkClicked: (List<Language>) -> Unit
|
|
||||||
var languages: List<Language> = listOf()
|
|
||||||
|
|
||||||
constructor(context: Context) : super(context)
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
context: Context,
|
|
||||||
themeResId: Int
|
|
||||||
) : super(context, themeResId)
|
|
||||||
|
|
||||||
override fun create(): AlertDialog {
|
|
||||||
dialogView = View.inflate(context, R.layout.language_selection, null)
|
|
||||||
val languageArrayAdapter = LanguageAdapter(languages.toMutableList())
|
|
||||||
language_check_view.run {
|
|
||||||
adapter = languageArrayAdapter
|
|
||||||
layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
|
|
||||||
setHasFixedSize(true)
|
|
||||||
}
|
|
||||||
setView(dialogView)
|
|
||||||
setPositiveButton(android.R.string.ok) { _, _ ->
|
|
||||||
onOkClicked.invoke(languageArrayAdapter.listItems)
|
|
||||||
}
|
|
||||||
return super.create()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
package org.kiwix.kiwixmobile.views
|
|
||||||
|
|
||||||
import android.graphics.Typeface
|
|
||||||
import android.view.View
|
|
||||||
import androidx.recyclerview.widget.RecyclerView.ViewHolder
|
|
||||||
import kotlinx.android.extensions.LayoutContainer
|
|
||||||
import kotlinx.android.synthetic.main.item_language.item_language_books_count
|
|
||||||
import kotlinx.android.synthetic.main.item_language.item_language_checkbox
|
|
||||||
import kotlinx.android.synthetic.main.item_language.item_language_localized_name
|
|
||||||
import kotlinx.android.synthetic.main.item_language.item_language_name
|
|
||||||
import org.kiwix.kiwixmobile.R
|
|
||||||
import org.kiwix.kiwixmobile.utils.LanguageUtils
|
|
||||||
import org.kiwix.kiwixmobile.zim_manager.Language
|
|
||||||
|
|
||||||
class LanguageViewHolder(
|
|
||||||
override val containerView: View,
|
|
||||||
private val onCheckboxChecked: (Int) -> Unit
|
|
||||||
) : ViewHolder(containerView),
|
|
||||||
LayoutContainer {
|
|
||||||
fun bind(
|
|
||||||
language: Language,
|
|
||||||
position: Int
|
|
||||||
) {
|
|
||||||
val context = containerView.context
|
|
||||||
item_language_name.text = language.language
|
|
||||||
item_language_localized_name.text = context.getString(
|
|
||||||
R.string.language_localized,
|
|
||||||
language.languageLocalized
|
|
||||||
)
|
|
||||||
item_language_localized_name.typeface = Typeface.createFromAsset(
|
|
||||||
context.assets,
|
|
||||||
LanguageUtils.getTypeface(language.languageCode)
|
|
||||||
)
|
|
||||||
item_language_books_count.text =
|
|
||||||
context.getString(R.string.language_count, language.occurencesOfLanguage)
|
|
||||||
item_language_checkbox.setOnCheckedChangeListener(null)
|
|
||||||
item_language_checkbox.isChecked = language.active
|
|
||||||
item_language_checkbox.setOnCheckedChangeListener { _, _ ->
|
|
||||||
onCheckboxChecked.invoke(position)
|
|
||||||
}
|
|
||||||
containerView.setOnClickListener {
|
|
||||||
item_language_checkbox.toggle()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,6 +6,7 @@ import java.util.Locale
|
|||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
data class Language constructor(
|
data class Language constructor(
|
||||||
|
val id: Long = 0,
|
||||||
var active: Boolean,
|
var active: Boolean,
|
||||||
var occurencesOfLanguage: Int,
|
var occurencesOfLanguage: Int,
|
||||||
var language: String,
|
var language: String,
|
||||||
@ -13,11 +14,14 @@ data class Language constructor(
|
|||||||
var languageCode: String,
|
var languageCode: String,
|
||||||
var languageCodeISO2: String
|
var languageCodeISO2: String
|
||||||
) : Parcelable {
|
) : Parcelable {
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
locale: Locale,
|
locale: Locale,
|
||||||
active: Boolean,
|
active: Boolean,
|
||||||
occurrencesOfLanguage: Int
|
occurrencesOfLanguage: Int,
|
||||||
|
id: Long = 0
|
||||||
) : this(
|
) : this(
|
||||||
|
id,
|
||||||
active,
|
active,
|
||||||
occurrencesOfLanguage,
|
occurrencesOfLanguage,
|
||||||
locale.displayLanguage,
|
locale.displayLanguage,
|
||||||
@ -35,4 +39,7 @@ data class Language constructor(
|
|||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
return (other as Language).language == language && other.active == active
|
return (other as Language).language == language && other.active == active
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun matches(filter: String) =
|
||||||
|
language.contains(filter, true) or languageLocalized.contains(filter, true)
|
||||||
}
|
}
|
||||||
|
@ -26,32 +26,25 @@ import android.util.Log
|
|||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import androidx.appcompat.widget.SearchView
|
import androidx.appcompat.widget.SearchView
|
||||||
import androidx.lifecycle.Observer
|
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.lifecycle.ViewModelProviders
|
|
||||||
import io.reactivex.Flowable
|
|
||||||
import io.reactivex.schedulers.Schedulers
|
|
||||||
import kotlinx.android.synthetic.main.zim_manager.manageViewPager
|
import kotlinx.android.synthetic.main.zim_manager.manageViewPager
|
||||||
import kotlinx.android.synthetic.main.zim_manager.tabs
|
import kotlinx.android.synthetic.main.zim_manager.tabs
|
||||||
import kotlinx.android.synthetic.main.zim_manager.toolbar
|
import kotlinx.android.synthetic.main.zim_manager.toolbar
|
||||||
import org.kiwix.kiwixmobile.R
|
import org.kiwix.kiwixmobile.R
|
||||||
import org.kiwix.kiwixmobile.base.BaseActivity
|
import org.kiwix.kiwixmobile.base.BaseActivity
|
||||||
import org.kiwix.kiwixmobile.database.newdb.dao.NewLanguagesDao
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewLanguagesDao
|
||||||
import org.kiwix.kiwixmobile.extensions.toast
|
import org.kiwix.kiwixmobile.extensions.start
|
||||||
|
import org.kiwix.kiwixmobile.extensions.viewModel
|
||||||
|
import org.kiwix.kiwixmobile.language.LanguageActivity
|
||||||
import org.kiwix.kiwixmobile.main.MainActivity
|
import org.kiwix.kiwixmobile.main.MainActivity
|
||||||
import org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX
|
import org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX
|
||||||
import org.kiwix.kiwixmobile.utils.LanguageUtils
|
import org.kiwix.kiwixmobile.utils.LanguageUtils
|
||||||
import org.kiwix.kiwixmobile.utils.StyleUtils.dialogStyle
|
|
||||||
import org.kiwix.kiwixmobile.views.LanguageSelectDialog
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class ZimManageActivity : BaseActivity() {
|
class ZimManageActivity : BaseActivity() {
|
||||||
|
|
||||||
private val zimManageViewModel: ZimManageViewModel by lazy {
|
private val zimManageViewModel by lazy { viewModel<ZimManageViewModel>(viewModelFactory) }
|
||||||
ViewModelProviders.of(this, viewModelFactory)
|
|
||||||
.get(ZimManageViewModel::class.java)
|
|
||||||
}
|
|
||||||
private val mSectionsPagerAdapter: SectionsPagerAdapter by lazy {
|
private val mSectionsPagerAdapter: SectionsPagerAdapter by lazy {
|
||||||
SectionsPagerAdapter(this, supportFragmentManager)
|
SectionsPagerAdapter(this, supportFragmentManager)
|
||||||
}
|
}
|
||||||
@ -78,9 +71,6 @@ class ZimManageActivity : BaseActivity() {
|
|||||||
tabs.setupWithViewPager(this)
|
tabs.setupWithViewPager(this)
|
||||||
addOnPageChangeListener(SimplePageChangeListener(this@ZimManageActivity::updateMenu))
|
addOnPageChangeListener(SimplePageChangeListener(this@ZimManageActivity::updateMenu))
|
||||||
}
|
}
|
||||||
zimManageViewModel.languageItems.observe(this, Observer {
|
|
||||||
onLanguageItemsForDialogUpdated(it!!)
|
|
||||||
})
|
|
||||||
setViewPagerPositionFromIntent(intent)
|
setViewPagerPositionFromIntent(intent)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,24 +85,6 @@ class ZimManageActivity : BaseActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onLanguageItemsForDialogUpdated(languages: List<Language>) {
|
|
||||||
if (languages.isEmpty()) {
|
|
||||||
toast(R.string.wait_for_load)
|
|
||||||
} else {
|
|
||||||
LanguageSelectDialog.Builder(this, dialogStyle())
|
|
||||||
.apply {
|
|
||||||
onOkClicked = {
|
|
||||||
Flowable.fromCallable {
|
|
||||||
languagesDao.insert(it)
|
|
||||||
}
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.subscribe()
|
|
||||||
}
|
|
||||||
this.languages = languages
|
|
||||||
}
|
|
||||||
.show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updateMenu(position: Int) {
|
private fun updateMenu(position: Int) {
|
||||||
searchItem?.isVisible = position == 1
|
searchItem?.isVisible = position == 1
|
||||||
@ -155,9 +127,7 @@ class ZimManageActivity : BaseActivity() {
|
|||||||
|
|
||||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
when (item.itemId) {
|
when (item.itemId) {
|
||||||
R.id.select_language -> {
|
R.id.select_language -> start<LanguageActivity>()
|
||||||
zimManageViewModel.requestLanguagesDialog.onNext(Unit)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item)
|
return super.onOptionsItemSelected(item)
|
||||||
}
|
}
|
||||||
|
@ -110,13 +110,11 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
val deviceListIsRefreshing = MutableLiveData<Boolean>()
|
val deviceListIsRefreshing = MutableLiveData<Boolean>()
|
||||||
val libraryListIsRefreshing = MutableLiveData<Boolean>()
|
val libraryListIsRefreshing = MutableLiveData<Boolean>()
|
||||||
val networkStates = MutableLiveData<NetworkState>()
|
val networkStates = MutableLiveData<NetworkState>()
|
||||||
val languageItems = MutableLiveData<List<Language>>()
|
|
||||||
|
|
||||||
val requestFileSystemCheck = PublishProcessor.create<Unit>()
|
val requestFileSystemCheck = PublishProcessor.create<Unit>()
|
||||||
val fileSelectActions = PublishProcessor.create<FileSelectActions>()
|
val fileSelectActions = PublishProcessor.create<FileSelectActions>()
|
||||||
val requestDownloadLibrary = BehaviorProcessor.createDefault<Unit>(Unit)
|
val requestDownloadLibrary = BehaviorProcessor.createDefault<Unit>(Unit)
|
||||||
val requestFiltering = BehaviorProcessor.createDefault<String>("")
|
val requestFiltering = BehaviorProcessor.createDefault<String>("")
|
||||||
val requestLanguagesDialog = PublishProcessor.create<Unit>()
|
|
||||||
|
|
||||||
private val compositeDisposable = CompositeDisposable()
|
private val compositeDisposable = CompositeDisposable()
|
||||||
|
|
||||||
@ -151,7 +149,6 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
updateLibraryItems(booksFromDao, downloads, networkLibrary, languages),
|
updateLibraryItems(booksFromDao, downloads, networkLibrary, languages),
|
||||||
updateLanguagesInDao(networkLibrary, languages),
|
updateLanguagesInDao(networkLibrary, languages),
|
||||||
updateNetworkStates(),
|
updateNetworkStates(),
|
||||||
updateLanguageItemsForDialog(languages),
|
|
||||||
requestsAndConnectivtyChangesToLibraryRequests(networkLibrary),
|
requestsAndConnectivtyChangesToLibraryRequests(networkLibrary),
|
||||||
fileSelectActions()
|
fileSelectActions()
|
||||||
)
|
)
|
||||||
@ -286,16 +283,6 @@ class ZimManageViewModel @Inject constructor(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateLanguageItemsForDialog(languages: Flowable<List<Language>>) =
|
|
||||||
requestLanguagesDialog
|
|
||||||
.withLatestFrom(
|
|
||||||
languages,
|
|
||||||
BiFunction<Unit, List<Language>, List<Language>> { _, langs -> langs })
|
|
||||||
.subscribe(
|
|
||||||
languageItems::postValue,
|
|
||||||
Throwable::printStackTrace
|
|
||||||
)
|
|
||||||
|
|
||||||
private fun updateNetworkStates() =
|
private fun updateNetworkStates() =
|
||||||
connectivityBroadcastReceiver.networkStates.subscribe(
|
connectivityBroadcastReceiver.networkStates.subscribe(
|
||||||
networkStates::postValue, Throwable::printStackTrace
|
networkStates::postValue, Throwable::printStackTrace
|
||||||
|
@ -29,7 +29,6 @@ import android.view.ViewGroup
|
|||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.lifecycle.Observer
|
import androidx.lifecycle.Observer
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.lifecycle.ViewModelProviders
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import io.reactivex.disposables.CompositeDisposable
|
import io.reactivex.disposables.CompositeDisposable
|
||||||
@ -40,6 +39,7 @@ import org.kiwix.kiwixmobile.R
|
|||||||
import org.kiwix.kiwixmobile.base.BaseFragment
|
import org.kiwix.kiwixmobile.base.BaseFragment
|
||||||
import org.kiwix.kiwixmobile.di.components.ActivityComponent
|
import org.kiwix.kiwixmobile.di.components.ActivityComponent
|
||||||
import org.kiwix.kiwixmobile.extensions.toast
|
import org.kiwix.kiwixmobile.extensions.toast
|
||||||
|
import org.kiwix.kiwixmobile.extensions.viewModel
|
||||||
import org.kiwix.kiwixmobile.utils.Constants.REQUEST_STORAGE_PERMISSION
|
import org.kiwix.kiwixmobile.utils.Constants.REQUEST_STORAGE_PERMISSION
|
||||||
import org.kiwix.kiwixmobile.utils.LanguageUtils
|
import org.kiwix.kiwixmobile.utils.LanguageUtils
|
||||||
import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil
|
import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil
|
||||||
@ -61,11 +61,9 @@ class ZimFileSelectFragment : BaseFragment() {
|
|||||||
private var actionMode: ActionMode? = null
|
private var actionMode: ActionMode? = null
|
||||||
val disposable = CompositeDisposable()
|
val disposable = CompositeDisposable()
|
||||||
|
|
||||||
private val zimManageViewModel: ZimManageViewModel by lazy {
|
private val zimManageViewModel by lazy {
|
||||||
ViewModelProviders.of(activity!!, viewModelFactory)
|
activity!!.viewModel<ZimManageViewModel>(viewModelFactory)
|
||||||
.get(ZimManageViewModel::class.java)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private val bookDelegate: BookDelegate by lazy {
|
private val bookDelegate: BookDelegate by lazy {
|
||||||
BookDelegate(sharedPreferenceUtil,
|
BookDelegate(sharedPreferenceUtil,
|
||||||
{ offerAction(RequestOpen(it)) },
|
{ offerAction(RequestOpen(it)) },
|
||||||
|
@ -27,7 +27,6 @@ import android.view.View.VISIBLE
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.lifecycle.Observer
|
import androidx.lifecycle.Observer
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.lifecycle.ViewModelProviders
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import eu.mhutti1.utils.storage.StorageDevice
|
import eu.mhutti1.utils.storage.StorageDevice
|
||||||
@ -42,6 +41,7 @@ import org.kiwix.kiwixmobile.di.components.ActivityComponent
|
|||||||
import org.kiwix.kiwixmobile.downloader.Downloader
|
import org.kiwix.kiwixmobile.downloader.Downloader
|
||||||
import org.kiwix.kiwixmobile.extensions.snack
|
import org.kiwix.kiwixmobile.extensions.snack
|
||||||
import org.kiwix.kiwixmobile.extensions.toast
|
import org.kiwix.kiwixmobile.extensions.toast
|
||||||
|
import org.kiwix.kiwixmobile.extensions.viewModel
|
||||||
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book
|
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book
|
||||||
import org.kiwix.kiwixmobile.main.MainActivity
|
import org.kiwix.kiwixmobile.main.MainActivity
|
||||||
import org.kiwix.kiwixmobile.utils.BookUtils
|
import org.kiwix.kiwixmobile.utils.BookUtils
|
||||||
@ -72,10 +72,10 @@ class LibraryFragment : BaseFragment() {
|
|||||||
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
|
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
|
||||||
@Inject lateinit var bookUtils: BookUtils
|
@Inject lateinit var bookUtils: BookUtils
|
||||||
|
|
||||||
private val zimManageViewModel: ZimManageViewModel by lazy {
|
private val zimManageViewModel by lazy {
|
||||||
ViewModelProviders.of(activity!!, viewModelFactory)
|
activity!!.viewModel<ZimManageViewModel>(viewModelFactory)
|
||||||
.get(ZimManageViewModel::class.java)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private val libraryAdapter: LibraryAdapter by lazy {
|
private val libraryAdapter: LibraryAdapter by lazy {
|
||||||
LibraryAdapter(
|
LibraryAdapter(
|
||||||
BookDelegate(bookUtils, this::onBookItemClick), DividerDelegate
|
BookDelegate(bookUtils, this::onBookItemClick), DividerDelegate
|
||||||
|
@ -25,7 +25,10 @@ interface AbsDelegateAdapter<INSTANCE : SUPERTYPE,
|
|||||||
SUPERTYPE : Any,
|
SUPERTYPE : Any,
|
||||||
VIEWHOLDER : BaseViewHolder<INSTANCE>> :
|
VIEWHOLDER : BaseViewHolder<INSTANCE>> :
|
||||||
AdapterDelegate<SUPERTYPE> {
|
AdapterDelegate<SUPERTYPE> {
|
||||||
abstract val itemClass: Class<INSTANCE>
|
|
||||||
|
val itemClass: Class<INSTANCE>
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun bind(
|
override fun bind(
|
||||||
viewHolder: RecyclerView.ViewHolder,
|
viewHolder: RecyclerView.ViewHolder,
|
||||||
itemToBind: SUPERTYPE
|
itemToBind: SUPERTYPE
|
||||||
|
@ -27,7 +27,7 @@ class AdapterDelegateManager<T>() {
|
|||||||
private fun getDelegateIndexFor(item: T): Int {
|
private fun getDelegateIndexFor(item: T): Int {
|
||||||
for (index in 0..delegates.size()) {
|
for (index in 0..delegates.size()) {
|
||||||
val valueAt = delegates.valueAt(index)
|
val valueAt = delegates.valueAt(index)
|
||||||
if (valueAt.isFor(item)) {
|
if (valueAt?.isFor(item) == true) {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/recycler_view"
|
android:id="@+id/recycler_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="0dp"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
@ -34,4 +34,5 @@
|
|||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/appbar"
|
app:layout_constraintTop_toBottomOf="@id/appbar"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
38
app/src/main/res/layout/activity_history.xml
Normal file
38
app/src/main/res/layout/activity_history.xml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="?attr/listBackground"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
>
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/appbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:theme="@style/AppTheme.AppBarOverlay"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
>
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:theme="@style/AppTheme.AppBarOverlay"
|
||||||
|
app:popupTheme="@style/AppTheme.PopupOverlay"
|
||||||
|
/>
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/recycler_view"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/appbar"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
47
app/src/main/res/layout/activity_language.xml
Normal file
47
app/src/main/res/layout/activity_language.xml
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
>
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/appbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:theme="@style/AppTheme.AppBarOverlay"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
>
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:theme="@style/AppTheme.AppBarOverlay"
|
||||||
|
app:popupTheme="@style/AppTheme.PopupOverlay"
|
||||||
|
/>
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/recycler_view"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/appbar"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<androidx.core.widget.ContentLoadingProgressBar
|
||||||
|
android:id="@+id/language_progressbar"
|
||||||
|
style="?android:attr/progressBarStyleLarge"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/appbar"
|
||||||
|
/>
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -57,4 +57,9 @@
|
|||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
tools:text="9 books"
|
tools:text="9 books"
|
||||||
/>
|
/>
|
||||||
|
<View
|
||||||
|
android:background="?android:attr/selectableItemBackground"
|
||||||
|
android:id="@+id/item_language_clickable_area"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"/>
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
|
||||||
android:id="@+id/language_check_view"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:id="@+id/toolbar_layout"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="?android:attr/actionBarSize"
|
android:layout_height="?android:attr/actionBarSize"
|
||||||
>
|
>
|
||||||
|
@ -94,7 +94,6 @@
|
|||||||
<string name="zim_novid">لا يوجد فيديو</string>
|
<string name="zim_novid">لا يوجد فيديو</string>
|
||||||
<string name="no_network_connection">لا يوجد اتصال بالشبكة</string>
|
<string name="no_network_connection">لا يوجد اتصال بالشبكة</string>
|
||||||
<string name="get_library_over_network">استخدم الشبكة لتنزيل قائمة المحتويات. (حوالي 6 ميغابايت)</string>
|
<string name="get_library_over_network">استخدم الشبكة لتنزيل قائمة المحتويات. (حوالي 6 ميغابايت)</string>
|
||||||
<string name="wait_for_load">لا يزال يتم تحميل المحتوى</string>
|
|
||||||
<string name="help_2">ماذا يفعل كيويكس؟</string>
|
<string name="help_2">ماذا يفعل كيويكس؟</string>
|
||||||
<string name="help_3">كيويكس قارئ محتوى غير متصل، وهو يعمل إلى حد كبير مثل المتصفح، ولكن بدلا من الوصول إلى صفحات الويب على الإنترنت، فإنه يقرأ المحتوى من ملف بتنسيق ZIM.</string>
|
<string name="help_3">كيويكس قارئ محتوى غير متصل، وهو يعمل إلى حد كبير مثل المتصفح، ولكن بدلا من الوصول إلى صفحات الويب على الإنترنت، فإنه يقرأ المحتوى من ملف بتنسيق ZIM.</string>
|
||||||
<string name="help_4">بينما كان كيويكس مصمما في الأصل لتوفير ويكيبيديا في وضع عدم الاتصال، فإنه يقرأ أيضا محتويات أخرى.</string>
|
<string name="help_4">بينما كان كيويكس مصمما في الأصل لتوفير ويكيبيديا في وضع عدم الاتصال، فإنه يقرأ أيضا محتويات أخرى.</string>
|
||||||
|
@ -94,7 +94,6 @@
|
|||||||
<string name="zim_novid">Без видео клипове</string>
|
<string name="zim_novid">Без видео клипове</string>
|
||||||
<string name="no_network_connection">Няма връзка с мрежата</string>
|
<string name="no_network_connection">Няма връзка с мрежата</string>
|
||||||
<string name="get_library_over_network">Използвайте мрежата за даунлоуд на списъка със съдържанието.\n(Приблизително 6MB)</string>
|
<string name="get_library_over_network">Използвайте мрежата за даунлоуд на списъка със съдържанието.\n(Приблизително 6MB)</string>
|
||||||
<string name="wait_for_load">Съдържанието все още се зарежда</string>
|
|
||||||
<string name="help_2">Какво прави Kiwix?</string>
|
<string name="help_2">Какво прави Kiwix?</string>
|
||||||
<string name="help_3">Kiwix е офлайн четец на съдържание. Той действа като браузър, но вместо да зарежда съдържанието от онлайн уеб страници, той зарежда съдържанието от файл в ZIM формат.</string>
|
<string name="help_3">Kiwix е офлайн четец на съдържание. Той действа като браузър, но вместо да зарежда съдържанието от онлайн уеб страници, той зарежда съдържанието от файл в ZIM формат.</string>
|
||||||
<string name="help_4">Въпреки че Kiwix е проектиран първоначално, да предоставя достъп до Уикипедия офлайн, той е способен, да предоставя достъп и до друго съдържание.</string>
|
<string name="help_4">Въпреки че Kiwix е проектиран първоначално, да предоставя достъп до Уикипедия офлайн, той е способен, да предоставя достъп и до друго съдържание.</string>
|
||||||
|
@ -94,7 +94,6 @@
|
|||||||
<string name="zim_novid">কোন ভিডিও নেই</string>
|
<string name="zim_novid">কোন ভিডিও নেই</string>
|
||||||
<string name="no_network_connection">কোন নেটওয়ার্ক সংযোগ নেই</string>
|
<string name="no_network_connection">কোন নেটওয়ার্ক সংযোগ নেই</string>
|
||||||
<string name="get_library_over_network">বিষয়বস্তুর তালিকা ডাউনলোড করতে নেটওয়ার্ক ব্যবহার করুন (আনুমানিক ৬ MB)</string>
|
<string name="get_library_over_network">বিষয়বস্তুর তালিকা ডাউনলোড করতে নেটওয়ার্ক ব্যবহার করুন (আনুমানিক ৬ MB)</string>
|
||||||
<string name="wait_for_load">বিষয়বস্তু এখনো লোড হচ্ছে</string>
|
|
||||||
<string name="help_2">কিউইক্স কি কাজ করে?</string>
|
<string name="help_2">কিউইক্স কি কাজ করে?</string>
|
||||||
<string name="help_3">কিউইক্স একটি অফলাইনভিত্তিক নিবন্ধ পাঠক। এটি একটি ব্রাউজারের মত অনেকটা কাজ করে কিন্তু অনলাইনে ওয়েব পৃষ্ঠাগুলিতে ঢুকার পরিবর্তে, এটি ZIM ফরম্যাটে একটি ফাইল থেকে বিষয়বস্তু পড়ে।</string>
|
<string name="help_3">কিউইক্স একটি অফলাইনভিত্তিক নিবন্ধ পাঠক। এটি একটি ব্রাউজারের মত অনেকটা কাজ করে কিন্তু অনলাইনে ওয়েব পৃষ্ঠাগুলিতে ঢুকার পরিবর্তে, এটি ZIM ফরম্যাটে একটি ফাইল থেকে বিষয়বস্তু পড়ে।</string>
|
||||||
<string name="help_4">কিউইক্স মূলত উইকিপিডিয়াকে অফলাইনে সরবরাহ করার জন্য নকশা করা হয়েছে, তবে এটি অন্যান্য বিষয়গুলিও পড়ে থাকে।</string>
|
<string name="help_4">কিউইক্স মূলত উইকিপিডিয়াকে অফলাইনে সরবরাহ করার জন্য নকশা করা হয়েছে, তবে এটি অন্যান্য বিষয়গুলিও পড়ে থাকে।</string>
|
||||||
@ -140,7 +139,6 @@
|
|||||||
<string name="time_left">বামে</string>
|
<string name="time_left">বামে</string>
|
||||||
<string name="pref_autonightmode_summary">স্বয়ংক্রিয়ভাবে দিন এবং রাতের মোডে স্যুইচ করুন।</string>
|
<string name="pref_autonightmode_summary">স্বয়ংক্রিয়ভাবে দিন এবং রাতের মোডে স্যুইচ করুন।</string>
|
||||||
<string name="pref_autonightmode">স্বয়ংক্রিয় রাত্রি মোড</string>
|
<string name="pref_autonightmode">স্বয়ংক্রিয় রাত্রি মোড</string>
|
||||||
<string name="language_count">(%1$dটি)</string>
|
|
||||||
<string name="do_not_ask_anymore">আর জিজ্ঞাসা করবেন না</string>
|
<string name="do_not_ask_anymore">আর জিজ্ঞাসা করবেন না</string>
|
||||||
<string name="your_languages">নির্বাচিত ভাষা</string>
|
<string name="your_languages">নির্বাচিত ভাষা</string>
|
||||||
<string name="other_languages">অন্যান্য ভাষাসমূহ:</string>
|
<string name="other_languages">অন্যান্য ভাষাসমূহ:</string>
|
||||||
|
@ -94,7 +94,6 @@
|
|||||||
<string name="zim_novid">Video ebet</string>
|
<string name="zim_novid">Video ebet</string>
|
||||||
<string name="no_network_connection">N\'eus kevreadur rouedad ebet</string>
|
<string name="no_network_connection">N\'eus kevreadur rouedad ebet</string>
|
||||||
<string name="get_library_over_network">Implijout ar rouedad evit pellgargañ ar roll endalc\'had (war-dro 6Mo).</string>
|
<string name="get_library_over_network">Implijout ar rouedad evit pellgargañ ar roll endalc\'had (war-dro 6Mo).</string>
|
||||||
<string name="wait_for_load">O kargañ emañ an endalc\'had c\'hoazh</string>
|
|
||||||
<string name="help_2">Petra a ra Kiwix ?</string>
|
<string name="help_2">Petra a ra Kiwix ?</string>
|
||||||
<string name="help_3">Ul lenner endalc\'had ezlinenn eo Kiwix. Ober a ra traoù hogos evel ur merdeer, met e-lec\'h diraez pajennoù web enlinenn e lenn an endalc\'had diwar ur restr er furmad ZIM.</string>
|
<string name="help_3">Ul lenner endalc\'had ezlinenn eo Kiwix. Ober a ra traoù hogos evel ur merdeer, met e-lec\'h diraez pajennoù web enlinenn e lenn an endalc\'had diwar ur restr er furmad ZIM.</string>
|
||||||
<string name="help_4">Daoust ma\'z eo bet krouet Kiwix evit pourchas Wikipedia ezlinenn e lenn endalc\'hioù all ivez.</string>
|
<string name="help_4">Daoust ma\'z eo bet krouet Kiwix evit pourchas Wikipedia ezlinenn e lenn endalc\'hioù all ivez.</string>
|
||||||
|
@ -89,7 +89,6 @@
|
|||||||
<string name="zim_novid">Ingen videoer</string>
|
<string name="zim_novid">Ingen videoer</string>
|
||||||
<string name="no_network_connection">Ingen netværksforbindelse</string>
|
<string name="no_network_connection">Ingen netværksforbindelse</string>
|
||||||
<string name="get_library_over_network">Brug netværk til at hente indholdsliste. (Cirka 6 MB)</string>
|
<string name="get_library_over_network">Brug netværk til at hente indholdsliste. (Cirka 6 MB)</string>
|
||||||
<string name="wait_for_load">Indhold indlæses stadig</string>
|
|
||||||
<string name="help_2">Hvad gør Kiwix?</string>
|
<string name="help_2">Hvad gør Kiwix?</string>
|
||||||
<string name="help_3">Kiwix er en lokal indholdlæser. Den fungerer meget lig en browser, men i stedet for at tilgå internetsider, så læser den indhold fra en fil i ZIM-formatet.</string>
|
<string name="help_3">Kiwix er en lokal indholdlæser. Den fungerer meget lig en browser, men i stedet for at tilgå internetsider, så læser den indhold fra en fil i ZIM-formatet.</string>
|
||||||
<string name="help_4">Selvom Kiwix oprindelig blev designet for at tilbyde Wikipedia lokalt, så læser det også andet indhold.</string>
|
<string name="help_4">Selvom Kiwix oprindelig blev designet for at tilbyde Wikipedia lokalt, så læser det også andet indhold.</string>
|
||||||
|
@ -90,7 +90,6 @@
|
|||||||
<string name="zim_novid">Keine Videos</string>
|
<string name="zim_novid">Keine Videos</string>
|
||||||
<string name="no_network_connection">Keine Netzwerkverbindung</string>
|
<string name="no_network_connection">Keine Netzwerkverbindung</string>
|
||||||
<string name="get_library_over_network">Netzwerk verwenden, um die Inhaltsliste herunterzuladen (ungefähr 6 MB).</string>
|
<string name="get_library_over_network">Netzwerk verwenden, um die Inhaltsliste herunterzuladen (ungefähr 6 MB).</string>
|
||||||
<string name="wait_for_load">Inhalt lädt noch</string>
|
|
||||||
<string name="help_2">Was macht Kiwix?</string>
|
<string name="help_2">Was macht Kiwix?</string>
|
||||||
<string name="help_3">Kiwix ist eine Lesesoftware für Offlineinhalte. Sie funktioniert wie ein Browser, aber anstatt auf Webseiten online zuzugreifen, liest sie Inhalte von einer Datei im ZIM-Format.</string>
|
<string name="help_3">Kiwix ist eine Lesesoftware für Offlineinhalte. Sie funktioniert wie ein Browser, aber anstatt auf Webseiten online zuzugreifen, liest sie Inhalte von einer Datei im ZIM-Format.</string>
|
||||||
<string name="help_4">Obwohl Kiwix ursprünglich entwickelt wurde, um Wikipedia offline zur Verfügung zu stellen, liest es auch andere Inhalte.</string>
|
<string name="help_4">Obwohl Kiwix ursprünglich entwickelt wurde, um Wikipedia offline zur Verfügung zu stellen, liest es auch andere Inhalte.</string>
|
||||||
|
@ -85,7 +85,6 @@
|
|||||||
<string name="zim_novid">Χωρίς βίντεο</string>
|
<string name="zim_novid">Χωρίς βίντεο</string>
|
||||||
<string name="no_network_connection">Δεν υπάρχει σύνδεση στο δίκτυο</string>
|
<string name="no_network_connection">Δεν υπάρχει σύνδεση στο δίκτυο</string>
|
||||||
<string name="get_library_over_network">Χρησιμοποιήστε δίκτυο για να κατεβάσετε την λίστα περιεχομένων. (Περίπου 6MB)</string>
|
<string name="get_library_over_network">Χρησιμοποιήστε δίκτυο για να κατεβάσετε την λίστα περιεχομένων. (Περίπου 6MB)</string>
|
||||||
<string name="wait_for_load">Το περιεχόμενο φορτώνει ακόμα</string>
|
|
||||||
<string name="help_2">Τι κάνει το Kiwix;</string>
|
<string name="help_2">Τι κάνει το Kiwix;</string>
|
||||||
<string name="help_3">Το Kiwix είναι ένας αναγνώστης περιεχομένου εκτός σύνδεσης. Φέρεται πολύ σαν περιηγητής αλλά αντί να έχει πρόσβαση σε διαδικτυακές σελίδες, διαβάζει περιεχόμενο από ένα αρχείο σε μορφοποίηση ZIM.</string>
|
<string name="help_3">Το Kiwix είναι ένας αναγνώστης περιεχομένου εκτός σύνδεσης. Φέρεται πολύ σαν περιηγητής αλλά αντί να έχει πρόσβαση σε διαδικτυακές σελίδες, διαβάζει περιεχόμενο από ένα αρχείο σε μορφοποίηση ZIM.</string>
|
||||||
<string name="help_5">Που είναι το περιεχόμενο;</string>
|
<string name="help_5">Που είναι το περιεχόμενο;</string>
|
||||||
|
@ -94,7 +94,6 @@
|
|||||||
<string name="zim_novid">Neniu Videaĵo</string>
|
<string name="zim_novid">Neniu Videaĵo</string>
|
||||||
<string name="no_network_connection">Reta konekto mankas</string>
|
<string name="no_network_connection">Reta konekto mankas</string>
|
||||||
<string name="get_library_over_network">Uzi reton por elŝuti liston de enhavo (proksimume 6 megabajtoj)</string>
|
<string name="get_library_over_network">Uzi reton por elŝuti liston de enhavo (proksimume 6 megabajtoj)</string>
|
||||||
<string name="wait_for_load">Enhavo Estas Ankoraŭ Ŝarĝata</string>
|
|
||||||
<string name="help_2">Kion faras Kiwix?</string>
|
<string name="help_2">Kion faras Kiwix?</string>
|
||||||
<string name="help_3">Kiwix estas senkonekta legilo de enhavo. Ĝi estas simila al TTT-legilo, sed anstataŭ legi retpaĝojn konektite, ĝi legas enhavon en ZIM-dosiero.</string>
|
<string name="help_3">Kiwix estas senkonekta legilo de enhavo. Ĝi estas simila al TTT-legilo, sed anstataŭ legi retpaĝojn konektite, ĝi legas enhavon en ZIM-dosiero.</string>
|
||||||
<string name="help_4">Kiwix estis originale farita por senkonekta legado de Vikipedio, sed ĝi povas legi alian enhavon.</string>
|
<string name="help_4">Kiwix estis originale farita por senkonekta legado de Vikipedio, sed ĝi povas legi alian enhavon.</string>
|
||||||
|
@ -92,7 +92,6 @@
|
|||||||
<string name="zim_novid">Ningún video</string>
|
<string name="zim_novid">Ningún video</string>
|
||||||
<string name="no_network_connection">Ninguna conexión de red</string>
|
<string name="no_network_connection">Ninguna conexión de red</string>
|
||||||
<string name="get_library_over_network">Usar la red para descargar la lista de contenido. (Aproximadamente 6MB)</string>
|
<string name="get_library_over_network">Usar la red para descargar la lista de contenido. (Aproximadamente 6MB)</string>
|
||||||
<string name="wait_for_load">Todavía está cargando el contenido</string>
|
|
||||||
<string name="help_2">¿Qué hace Kiwix?</string>
|
<string name="help_2">¿Qué hace Kiwix?</string>
|
||||||
<string name="help_3">Kiwix es un lector de contenido desconectado. Actúa mucho como un navegador pero en vez de acceder páginas web en línea, lee contenido de un archivo en formato ZIM.</string>
|
<string name="help_3">Kiwix es un lector de contenido desconectado. Actúa mucho como un navegador pero en vez de acceder páginas web en línea, lee contenido de un archivo en formato ZIM.</string>
|
||||||
<string name="help_4">Si bien Kiwix se diseñó originalmente para proporcionar una Wikipedia sin conexión, también puede leer otros contenidos.</string>
|
<string name="help_4">Si bien Kiwix se diseñó originalmente para proporcionar una Wikipedia sin conexión, también puede leer otros contenidos.</string>
|
||||||
|
@ -93,7 +93,6 @@
|
|||||||
<string name="zim_novid">Bideorik ez</string>
|
<string name="zim_novid">Bideorik ez</string>
|
||||||
<string name="no_network_connection">Ez dago konexiorik</string>
|
<string name="no_network_connection">Ez dago konexiorik</string>
|
||||||
<string name="get_library_over_network">Sarea erabili eduki zerrenda deskargatzeko. (6MB inguru)</string>
|
<string name="get_library_over_network">Sarea erabili eduki zerrenda deskargatzeko. (6MB inguru)</string>
|
||||||
<string name="wait_for_load">Oraindik Edukia Kargatzen</string>
|
|
||||||
<string name="help_2">Zer egiten du Kiwix-ek?</string>
|
<string name="help_2">Zer egiten du Kiwix-ek?</string>
|
||||||
<string name="help_3">Kiwix konexio gabeko eduki irakurlea da. Nabigatzaile baten moduan erabiltzen da, baina sarean dauden web orrialdeetan sartu beharrean, ZIM formatoko edukia irakurtzen du.</string>
|
<string name="help_3">Kiwix konexio gabeko eduki irakurlea da. Nabigatzaile baten moduan erabiltzen da, baina sarean dauden web orrialdeetan sartu beharrean, ZIM formatoko edukia irakurtzen du.</string>
|
||||||
<string name="help_4">Nahiz eta, Kiwix, berez, Wikipedia konexiorik gabe erabiltzeko sortu, beste edukiak ere eskeintzen ditu.</string>
|
<string name="help_4">Nahiz eta, Kiwix, berez, Wikipedia konexiorik gabe erabiltzeko sortu, beste edukiak ere eskeintzen ditu.</string>
|
||||||
|
@ -87,7 +87,6 @@
|
|||||||
<string name="zim_novid">Ei videoita</string>
|
<string name="zim_novid">Ei videoita</string>
|
||||||
<string name="no_network_connection">Ei verkkoyhteyttä</string>
|
<string name="no_network_connection">Ei verkkoyhteyttä</string>
|
||||||
<string name="get_library_over_network">Lataa sisältöluettelo käyttämällä verkkoa. (Noin 6 Mt)</string>
|
<string name="get_library_over_network">Lataa sisältöluettelo käyttämällä verkkoa. (Noin 6 Mt)</string>
|
||||||
<string name="wait_for_load">Sisältö latautuu edelleen</string>
|
|
||||||
<string name="help_2">Mitä Kiwix tekee?</string>
|
<string name="help_2">Mitä Kiwix tekee?</string>
|
||||||
<string name="help_5">Missä sisältö on?</string>
|
<string name="help_5">Missä sisältö on?</string>
|
||||||
<string name="help_6">Sisältöämme ylläpidetään Kiwixin verkkosivulla.</string>
|
<string name="help_6">Sisältöämme ylläpidetään Kiwixin verkkosivulla.</string>
|
||||||
|
@ -87,7 +87,6 @@
|
|||||||
<string name="zim_novid">Aucune vidéo</string>
|
<string name="zim_novid">Aucune vidéo</string>
|
||||||
<string name="no_network_connection">Aucune connexion réseau</string>
|
<string name="no_network_connection">Aucune connexion réseau</string>
|
||||||
<string name="get_library_over_network">Utiliser le réseau pour télécharger la liste de contenu (environ 6Mo).</string>
|
<string name="get_library_over_network">Utiliser le réseau pour télécharger la liste de contenu (environ 6Mo).</string>
|
||||||
<string name="wait_for_load">Le contenu est encore en cours de chargement</string>
|
|
||||||
<string name="help_2">Que fait Kiwix ?</string>
|
<string name="help_2">Que fait Kiwix ?</string>
|
||||||
<string name="help_3">Kiwix est un lecteur de contenu hors connexion. Il agit quasiment comme un navigateur, mais au lieu d’accéder à des pages web en ligne, il lit le contenu depuis un fichier au format ZIM.</string>
|
<string name="help_3">Kiwix est un lecteur de contenu hors connexion. Il agit quasiment comme un navigateur, mais au lieu d’accéder à des pages web en ligne, il lit le contenu depuis un fichier au format ZIM.</string>
|
||||||
<string name="help_4">Bien que Kiwix ait été conçu au départ pour fournir Wikipédia hors connexion, il lit aussi d’autre contenu.</string>
|
<string name="help_4">Bien que Kiwix ait été conçu au départ pour fournir Wikipédia hors connexion, il lit aussi d’autre contenu.</string>
|
||||||
|
@ -91,7 +91,6 @@
|
|||||||
<string name="zim_novid">Sen vídeos</string>
|
<string name="zim_novid">Sen vídeos</string>
|
||||||
<string name="no_network_connection">Ningunha conexión de rede</string>
|
<string name="no_network_connection">Ningunha conexión de rede</string>
|
||||||
<string name="get_library_over_network">Usar a rede para descargar a lista de contido. (Aproximadamente 6MB)</string>
|
<string name="get_library_over_network">Usar a rede para descargar a lista de contido. (Aproximadamente 6MB)</string>
|
||||||
<string name="wait_for_load">Aínda está cargando o contido</string>
|
|
||||||
<string name="help_2">Que fai Kiwix?</string>
|
<string name="help_2">Que fai Kiwix?</string>
|
||||||
<string name="help_3">Kiwix é un lector de contido desconectado. Actúa como un navegador web, pero en vez de acceder a páxinas web en liña, le o contido dun ficheiro en formato ZIM.</string>
|
<string name="help_3">Kiwix é un lector de contido desconectado. Actúa como un navegador web, pero en vez de acceder a páxinas web en liña, le o contido dun ficheiro en formato ZIM.</string>
|
||||||
<string name="help_4">Se ben Kiwix deseñouse orixinalmente para proporcionar Wikipedia sen conexión, tamén pode ler outros contidos.</string>
|
<string name="help_4">Se ben Kiwix deseñouse orixinalmente para proporcionar Wikipedia sen conexión, tamén pode ler outros contidos.</string>
|
||||||
|
@ -94,7 +94,6 @@
|
|||||||
<string name="zim_novid">चलचित्र नहीं</string>
|
<string name="zim_novid">चलचित्र नहीं</string>
|
||||||
<string name="no_network_connection">नेटवर्क कनेक्शन नहीं</string>
|
<string name="no_network_connection">नेटवर्क कनेक्शन नहीं</string>
|
||||||
<string name="get_library_over_network">सामग्री सूची डाउनलोड करने के लिए नेटवर्क का उपयोग करें। (लगभग 6 एमबी</string>
|
<string name="get_library_over_network">सामग्री सूची डाउनलोड करने के लिए नेटवर्क का उपयोग करें। (लगभग 6 एमबी</string>
|
||||||
<string name="wait_for_load">सामग्री अभी भी लोड हो रही</string>
|
|
||||||
<string name="help_2">किविक्स क्या करता है?</string>
|
<string name="help_2">किविक्स क्या करता है?</string>
|
||||||
<string name="help_3">किवीक्स ऑफ़लाइन सामग्री रीडर है यह एक ब्राउज़र की तरह बहुत ज्यादा काम करता है लेकिन ऑनलाइन वेब पेजों को एक्सेस करने के बजाय, यह ZIM प्रारूप में फ़ाइल से सामग्री पढ़ता है।</string>
|
<string name="help_3">किवीक्स ऑफ़लाइन सामग्री रीडर है यह एक ब्राउज़र की तरह बहुत ज्यादा काम करता है लेकिन ऑनलाइन वेब पेजों को एक्सेस करने के बजाय, यह ZIM प्रारूप में फ़ाइल से सामग्री पढ़ता है।</string>
|
||||||
<string name="help_4">जबकि किवीक्स को मूल रूप से विकिपीडिया ऑफ़लाइन उपलब्ध कराने के लिए डिज़ाइन किया गया है, यह अन्य सामग्री भी पढ़ता है।</string>
|
<string name="help_4">जबकि किवीक्स को मूल रूप से विकिपीडिया ऑफ़लाइन उपलब्ध कराने के लिए डिज़ाइन किया गया है, यह अन्य सामग्री भी पढ़ता है।</string>
|
||||||
|
@ -92,7 +92,6 @@
|
|||||||
<string name="zim_novid">Nincsenek videók</string>
|
<string name="zim_novid">Nincsenek videók</string>
|
||||||
<string name="no_network_connection">Nincs hálózati kapcsolat</string>
|
<string name="no_network_connection">Nincs hálózati kapcsolat</string>
|
||||||
<string name="get_library_over_network">Használd a hálózatot a tartalomlista letöltéséhez. (Körülbelül 6MB)</string>
|
<string name="get_library_over_network">Használd a hálózatot a tartalomlista letöltéséhez. (Körülbelül 6MB)</string>
|
||||||
<string name="wait_for_load">A tartalom még töltődik</string>
|
|
||||||
<string name="help_2">Mit csinál a Kiwix?</string>
|
<string name="help_2">Mit csinál a Kiwix?</string>
|
||||||
<string name="help_3">A Kiwix egy offline tartalom olvasó. Úgy viselkedik, mint egy böngésző, de az online weboldalak betöltése helyett a tartalmát egy ZIM formátumú fájlból olvassa.</string>
|
<string name="help_3">A Kiwix egy offline tartalom olvasó. Úgy viselkedik, mint egy böngésző, de az online weboldalak betöltése helyett a tartalmát egy ZIM formátumú fájlból olvassa.</string>
|
||||||
<string name="help_4">Bár a Kiwix eredetileg az offline Wikipédia megvalósítására lett tervezve, más tartalmakat is olvas.</string>
|
<string name="help_4">Bár a Kiwix eredetileg az offline Wikipédia megvalósítására lett tervezve, más tartalmakat is olvas.</string>
|
||||||
|
@ -94,7 +94,6 @@
|
|||||||
<string name="zim_novid">동영상 없음</string>
|
<string name="zim_novid">동영상 없음</string>
|
||||||
<string name="no_network_connection">네트워크 연결 없음</string>
|
<string name="no_network_connection">네트워크 연결 없음</string>
|
||||||
<string name="get_library_over_network">콘텐츠 목록의 다운로드를 위해 네트워크를 사용합니다. (약 6MB)</string>
|
<string name="get_library_over_network">콘텐츠 목록의 다운로드를 위해 네트워크를 사용합니다. (약 6MB)</string>
|
||||||
<string name="wait_for_load">내용을 계속 불러오고 있습니다</string>
|
|
||||||
<string name="help_2">Kiwix의 역할이 무엇입니까?</string>
|
<string name="help_2">Kiwix의 역할이 무엇입니까?</string>
|
||||||
<string name="help_3">Kiwix는 오프라인 콘텐츠 리더입니다. 브라우저와 매우 비슷하게 동작하지만 온라인 웹 페이지에 접근하는 대신 ZIM 포맷의 파일로부터 내용을 읽습니다.</string>
|
<string name="help_3">Kiwix는 오프라인 콘텐츠 리더입니다. 브라우저와 매우 비슷하게 동작하지만 온라인 웹 페이지에 접근하는 대신 ZIM 포맷의 파일로부터 내용을 읽습니다.</string>
|
||||||
<string name="help_4">Kiwix가 본래 오프라인 상태에서 위키백과를 제공하도록 설계되었으나 다른 콘텐츠도 읽을 수 있습니다.</string>
|
<string name="help_4">Kiwix가 본래 오프라인 상태에서 위키백과를 제공하도록 설계되었으나 다른 콘텐츠도 읽을 수 있습니다.</string>
|
||||||
|
@ -94,7 +94,6 @@
|
|||||||
<string name="zim_novid">Нема видеа</string>
|
<string name="zim_novid">Нема видеа</string>
|
||||||
<string name="no_network_connection">Немате мрежна врска</string>
|
<string name="no_network_connection">Немате мрежна врска</string>
|
||||||
<string name="get_library_over_network">Користи мрежа за преземање на списокот содржини (прибл. 6 МБ)</string>
|
<string name="get_library_over_network">Користи мрежа за преземање на списокот содржини (прибл. 6 МБ)</string>
|
||||||
<string name="wait_for_load">Содржината сè уште се вчитува</string>
|
|
||||||
<string name="help_2">Што прави Kiwix?</string>
|
<string name="help_2">Што прави Kiwix?</string>
|
||||||
<string name="help_3">Kiwix е вонмрежен читач на содржини. Работи како прелистувач но чита содржини од податотека во ZIM-формат место од семрежјето.</string>
|
<string name="help_3">Kiwix е вонмрежен читач на содржини. Работи како прелистувач но чита содржини од податотека во ZIM-формат место од семрежјето.</string>
|
||||||
<string name="help_4">Иако Kiwix е првично предвиден како вонмрежен читач на Википедија, но сега чита и други содржини.</string>
|
<string name="help_4">Иако Kiwix е првично предвиден како вонмрежен читач на Википедија, но сега чита и други содржини.</string>
|
||||||
|
@ -60,7 +60,6 @@
|
|||||||
<string name="zim_simple">اسان</string>
|
<string name="zim_simple">اسان</string>
|
||||||
<string name="zim_nopic">هيڅ دوتنه نشته</string>
|
<string name="zim_nopic">هيڅ دوتنه نشته</string>
|
||||||
<string name="zim_novid">هيڅ ويډيو نسته</string>
|
<string name="zim_novid">هيڅ ويډيو نسته</string>
|
||||||
<string name="wait_for_load">منځپانګې تر وسه هم حرکت کوي</string>
|
|
||||||
<string name="tts_pause">تفریحي درونه</string>
|
<string name="tts_pause">تفریحي درونه</string>
|
||||||
<string name="tts_resume">انتظارول</string>
|
<string name="tts_resume">انتظارول</string>
|
||||||
<string name="tts_stop">درول</string>
|
<string name="tts_stop">درول</string>
|
||||||
|
@ -93,7 +93,6 @@
|
|||||||
<string name="zim_novid">Sem vídeos</string>
|
<string name="zim_novid">Sem vídeos</string>
|
||||||
<string name="no_network_connection">Nenhuma ligação de rede</string>
|
<string name="no_network_connection">Nenhuma ligação de rede</string>
|
||||||
<string name="get_library_over_network">Usar a rede para descarregar a lista de conteúdos (aproximadamente 6 MB).</string>
|
<string name="get_library_over_network">Usar a rede para descarregar a lista de conteúdos (aproximadamente 6 MB).</string>
|
||||||
<string name="wait_for_load">Ainda está a carregar o conteúdo</string>
|
|
||||||
<string name="help_2">O que faz o Kiwix?</string>
|
<string name="help_2">O que faz o Kiwix?</string>
|
||||||
<string name="help_3">O Kiwix é um leitor de conteúdo offline. Funciona tal como um navegador mas, em vez de aceder a páginas da Internet online, lê o conteúdo de um ficheiro no formato ZIM.</string>
|
<string name="help_3">O Kiwix é um leitor de conteúdo offline. Funciona tal como um navegador mas, em vez de aceder a páginas da Internet online, lê o conteúdo de um ficheiro no formato ZIM.</string>
|
||||||
<string name="help_4">Embora o Kiwix tenha sido originalmente desenhado para fornecer a Wikipédia offline, também lê outros conteúdos.</string>
|
<string name="help_4">Embora o Kiwix tenha sido originalmente desenhado para fornecer a Wikipédia offline, também lê outros conteúdos.</string>
|
||||||
|
@ -91,7 +91,6 @@
|
|||||||
<string name="zim_novid">Fără video</string>
|
<string name="zim_novid">Fără video</string>
|
||||||
<string name="no_network_connection">Nu există conexiune de rețea</string>
|
<string name="no_network_connection">Nu există conexiune de rețea</string>
|
||||||
<string name="get_library_over_network">Folosește rețeaua să descarci lista de conținut. (Aproximativ 6MB)</string>
|
<string name="get_library_over_network">Folosește rețeaua să descarci lista de conținut. (Aproximativ 6MB)</string>
|
||||||
<string name="wait_for_load">Conținutul încă se încarcă</string>
|
|
||||||
<string name="help_2">Ce face Kiwix?</string>
|
<string name="help_2">Ce face Kiwix?</string>
|
||||||
<string name="help_3">Kiwix este un server de citit conținut off-line. Este aproape ca un browser dar în loc să acceseze paginile web online citește conținut de la un fișier în formatul ZIM.</string>
|
<string name="help_3">Kiwix este un server de citit conținut off-line. Este aproape ca un browser dar în loc să acceseze paginile web online citește conținut de la un fișier în formatul ZIM.</string>
|
||||||
<string name="help_4">În timp ce Kiwix a fost făcut inițial să ofere Wikipedia off-line de asemenea citește și alt conținut.</string>
|
<string name="help_4">În timp ce Kiwix a fost făcut inițial să ofere Wikipedia off-line de asemenea citește și alt conținut.</string>
|
||||||
|
@ -94,7 +94,6 @@
|
|||||||
<string name="zim_novid">Нет видео</string>
|
<string name="zim_novid">Нет видео</string>
|
||||||
<string name="no_network_connection">Отсутствует сетевое подключение</string>
|
<string name="no_network_connection">Отсутствует сетевое подключение</string>
|
||||||
<string name="get_library_over_network">Используйте сеть, чтобы загрузить список контента. (Около 6MB)</string>
|
<string name="get_library_over_network">Используйте сеть, чтобы загрузить список контента. (Около 6MB)</string>
|
||||||
<string name="wait_for_load">Содержимое Ещё Загружается</string>
|
|
||||||
<string name="help_2">Что делает Kiwix?</string>
|
<string name="help_2">Что делает Kiwix?</string>
|
||||||
<string name="help_3">Kiwix - это автономный контент-ридер. Он действует схоже с браузером, но вместо обращения к онлайн страницам, он считывает содержимое из файла в формате ZIM.</string>
|
<string name="help_3">Kiwix - это автономный контент-ридер. Он действует схоже с браузером, но вместо обращения к онлайн страницам, он считывает содержимое из файла в формате ZIM.</string>
|
||||||
<string name="help_4">Хотя Kiwix и был изначально разработан, чтобы просматривать Wikipedia офлайн, он также пригоден и для другого содержимого.</string>
|
<string name="help_4">Хотя Kiwix и был изначально разработан, чтобы просматривать Wikipedia офлайн, он также пригоден и для другого содержимого.</string>
|
||||||
|
@ -93,7 +93,6 @@
|
|||||||
<string name="zim_novid">Perunu vìdeu</string>
|
<string name="zim_novid">Perunu vìdeu</string>
|
||||||
<string name="no_network_connection">Peruna connessione de retza</string>
|
<string name="no_network_connection">Peruna connessione de retza</string>
|
||||||
<string name="get_library_over_network">Imprea sa retza pro iscarrigare sa lista de cuntenutos (pagu prus o mancu 6MB)</string>
|
<string name="get_library_over_network">Imprea sa retza pro iscarrigare sa lista de cuntenutos (pagu prus o mancu 6MB)</string>
|
||||||
<string name="wait_for_load">Cuntenutu galu in carrigamentu</string>
|
|
||||||
<string name="help_2">Ite faghet Kiwix?</string>
|
<string name="help_2">Ite faghet Kiwix?</string>
|
||||||
<string name="help_3">Kiwix est unu leghidore de cuntenutu non in lìnia. Funtzionat comente unu navigadore ma imbetzes de intrare in pàginas web in lìnia leghet cuntenutu dae unu documentu in formatu ZIM.</string>
|
<string name="help_3">Kiwix est unu leghidore de cuntenutu non in lìnia. Funtzionat comente unu navigadore ma imbetzes de intrare in pàginas web in lìnia leghet cuntenutu dae unu documentu in formatu ZIM.</string>
|
||||||
<string name="help_4">Fintzas si Kiwix est istadu creadu, in orìgine, pro lèghere Wikipèdia chene lìnia, leghet fintzas àteros cuntenutos.</string>
|
<string name="help_4">Fintzas si Kiwix est istadu creadu, in orìgine, pro lèghere Wikipèdia chene lìnia, leghet fintzas àteros cuntenutos.</string>
|
||||||
|
@ -66,7 +66,6 @@
|
|||||||
<string name="zim_simple">Enostavno</string>
|
<string name="zim_simple">Enostavno</string>
|
||||||
<string name="zim_nopic">Ni slik</string>
|
<string name="zim_nopic">Ni slik</string>
|
||||||
<string name="zim_novid">Ni videoposnetkov</string>
|
<string name="zim_novid">Ni videoposnetkov</string>
|
||||||
<string name="wait_for_load">Vsebina se še nalaga</string>
|
|
||||||
<string name="pref_storage">Shranjevanje</string>
|
<string name="pref_storage">Shranjevanje</string>
|
||||||
<string name="pref_current_folder">Trenutna mapa</string>
|
<string name="pref_current_folder">Trenutna mapa</string>
|
||||||
<string name="tts_pause">premor</string>
|
<string name="tts_pause">premor</string>
|
||||||
|
@ -92,7 +92,6 @@
|
|||||||
<string name="zim_novid">S\’ka Video</string>
|
<string name="zim_novid">S\’ka Video</string>
|
||||||
<string name="no_network_connection">S\’ka lidhje rrjeti</string>
|
<string name="no_network_connection">S\’ka lidhje rrjeti</string>
|
||||||
<string name="get_library_over_network">Përdor rrjetin për shkarkim liste lënde. (Afërsisht 6MB)</string>
|
<string name="get_library_over_network">Përdor rrjetin për shkarkim liste lënde. (Afërsisht 6MB)</string>
|
||||||
<string name="wait_for_load">Lëndë Ende Në Ngarkim</string>
|
|
||||||
<string name="help_2">Ç’kryen Kiwix-i?</string>
|
<string name="help_2">Ç’kryen Kiwix-i?</string>
|
||||||
<string name="help_3">Kiwix është një lexues lënde pa internet. Funksionon shumë ngjashëm me një shfletues, por në vend të përdorimit\n“online” të faqeve web, lëndën e lexon që nga një kartelë në formatin ZIM.</string>
|
<string name="help_3">Kiwix është një lexues lënde pa internet. Funksionon shumë ngjashëm me një shfletues, por në vend të përdorimit\n“online” të faqeve web, lëndën e lexon që nga një kartelë në formatin ZIM.</string>
|
||||||
<string name="help_4">Edhe pse fillimisht qe konceptuar për të lejuar përdorimin pa internet të Wikipedia-s, mund të përdoret edhe për lëndë tjetër.</string>
|
<string name="help_4">Edhe pse fillimisht qe konceptuar për të lejuar përdorimin pa internet të Wikipedia-s, mund të përdoret edhe për lëndë tjetër.</string>
|
||||||
|
@ -92,7 +92,6 @@
|
|||||||
<string name="zim_novid">Inga videor</string>
|
<string name="zim_novid">Inga videor</string>
|
||||||
<string name="no_network_connection">Ingen nätverksanslutning</string>
|
<string name="no_network_connection">Ingen nätverksanslutning</string>
|
||||||
<string name="get_library_over_network">Använd nätverket för att ladda ned innehållslistan. (Uppskattningsvis 6MB)</string>
|
<string name="get_library_over_network">Använd nätverket för att ladda ned innehållslistan. (Uppskattningsvis 6MB)</string>
|
||||||
<string name="wait_for_load">Läser fortfarande in innehåll</string>
|
|
||||||
<string name="help_2">Vad gör Kiwix?</string>
|
<string name="help_2">Vad gör Kiwix?</string>
|
||||||
<string name="help_3">Kiwix är en innehållsläsare för offlineanvändning. Den fungerar som en webbläsare, men istället för att komma åt webbsidor online läser den innehåll från en fil i ZIM-format.</string>
|
<string name="help_3">Kiwix är en innehållsläsare för offlineanvändning. Den fungerar som en webbläsare, men istället för att komma åt webbsidor online läser den innehåll från en fil i ZIM-format.</string>
|
||||||
<string name="help_4">Även om Kiwix ursprungligen skapades för att tillhandahålla Wikipedia offline läser den även annat innehåll.</string>
|
<string name="help_4">Även om Kiwix ursprungligen skapades för att tillhandahålla Wikipedia offline läser den även annat innehåll.</string>
|
||||||
|
@ -94,7 +94,6 @@
|
|||||||
<string name="zim_novid">Video yok</string>
|
<string name="zim_novid">Video yok</string>
|
||||||
<string name="no_network_connection">Ağ bağlantısı yok</string>
|
<string name="no_network_connection">Ağ bağlantısı yok</string>
|
||||||
<string name="get_library_over_network">İçerik listesini indirmek için ağı kullan. (Yaklaşık 6MB)</string>
|
<string name="get_library_over_network">İçerik listesini indirmek için ağı kullan. (Yaklaşık 6MB)</string>
|
||||||
<string name="wait_for_load">İçerik hâlâ yükleniyor</string>
|
|
||||||
<string name="help_2">Kiwix ne yapar?</string>
|
<string name="help_2">Kiwix ne yapar?</string>
|
||||||
<string name="help_3">Kiwix bir çevrimdışı içerik okuyucusudur. Aynı bir ağ tarayıcısı gibi çalışır ama web sayfalarına çevrimiçi erişmek yerine içeriği ZIM formatındaki bir dosyadan okur.</string>
|
<string name="help_3">Kiwix bir çevrimdışı içerik okuyucusudur. Aynı bir ağ tarayıcısı gibi çalışır ama web sayfalarına çevrimiçi erişmek yerine içeriği ZIM formatındaki bir dosyadan okur.</string>
|
||||||
<string name="help_4">Kiwix orijinalde Vikipedi\'yi çevrimdışı olarak okuması için tasarlanmış olsa da diğer içerikleri de okuyabilir.</string>
|
<string name="help_4">Kiwix orijinalde Vikipedi\'yi çevrimdışı olarak okuması için tasarlanmış olsa da diğer içerikleri de okuyabilir.</string>
|
||||||
|
@ -94,7 +94,6 @@
|
|||||||
<string name="zim_novid">Немає відео</string>
|
<string name="zim_novid">Немає відео</string>
|
||||||
<string name="no_network_connection">Відсутнє з\'єднання з мережею</string>
|
<string name="no_network_connection">Відсутнє з\'єднання з мережею</string>
|
||||||
<string name="get_library_over_network">Скористатись мережею, щоб завантажити список контенту (приблизно 6MБ)</string>
|
<string name="get_library_over_network">Скористатись мережею, щоб завантажити список контенту (приблизно 6MБ)</string>
|
||||||
<string name="wait_for_load">Контент все ще завантажується</string>
|
|
||||||
<string name="help_2">Що робить Kiwix?</string>
|
<string name="help_2">Що робить Kiwix?</string>
|
||||||
<string name="help_3">Kiwix — це офлайновий читач контенту. Він багато в чому поводиться як браузер, але замість доступу до онлайнових веб-сторінок, він зчитує контент із файлу у форматі ZIM.</string>
|
<string name="help_3">Kiwix — це офлайновий читач контенту. Він багато в чому поводиться як браузер, але замість доступу до онлайнових веб-сторінок, він зчитує контент із файлу у форматі ZIM.</string>
|
||||||
<string name="help_4">Тоді як початково Kiwix було розроблено для забезпечення доступу до Вікіпедії в режимі офлайн, він також зчитує інші типи контенту.</string>
|
<string name="help_4">Тоді як початково Kiwix було розроблено для забезпечення доступу до Вікіпедії в режимі офлайн, він також зчитує інші типи контенту.</string>
|
||||||
|
@ -93,7 +93,6 @@
|
|||||||
<string name="zim_novid">Không có video</string>
|
<string name="zim_novid">Không có video</string>
|
||||||
<string name="no_network_connection">Không có kết nối mạng</string>
|
<string name="no_network_connection">Không có kết nối mạng</string>
|
||||||
<string name="get_library_over_network">Dùng mạng để tải về danh sách nội dung (khoảng 6MB)</string>
|
<string name="get_library_over_network">Dùng mạng để tải về danh sách nội dung (khoảng 6MB)</string>
|
||||||
<string name="wait_for_load">Vẫn đang tải nội dung</string>
|
|
||||||
<string name="help_2">Kiwix dùng để làm gì?</string>
|
<string name="help_2">Kiwix dùng để làm gì?</string>
|
||||||
<string name="help_3">Kiwix là một chương trình đọc nội dung ngoại tuyến. Kiwix hoạt động như trình duyệt, tuy nhiên, thay vì truy cập các trang web trực tuyến thì Kiwix lại đọc nội dung từ các tập tin định dạng ZIM.</string>
|
<string name="help_3">Kiwix là một chương trình đọc nội dung ngoại tuyến. Kiwix hoạt động như trình duyệt, tuy nhiên, thay vì truy cập các trang web trực tuyến thì Kiwix lại đọc nội dung từ các tập tin định dạng ZIM.</string>
|
||||||
<string name="help_4">Mặc dù Kiwix lúc ban đầu được tạo ra để giúp bạn truy cập Wikipedia ngoại tuyến, chương trình cũng có thể đọc các nội dung khác nữa.</string>
|
<string name="help_4">Mặc dù Kiwix lúc ban đầu được tạo ra để giúp bạn truy cập Wikipedia ngoại tuyến, chương trình cũng có thể đọc các nội dung khác nữa.</string>
|
||||||
|
@ -99,7 +99,6 @@
|
|||||||
<string name="zim_novid">No Videos</string>
|
<string name="zim_novid">No Videos</string>
|
||||||
<string name="no_network_connection">No network connection</string>
|
<string name="no_network_connection">No network connection</string>
|
||||||
<string name="get_library_over_network">Use network to download content list. (Approximately 6MB)</string>
|
<string name="get_library_over_network">Use network to download content list. (Approximately 6MB)</string>
|
||||||
<string name="wait_for_load">Content Still Loading</string>
|
|
||||||
<string name="help_2">What does Kiwix do?</string>
|
<string name="help_2">What does Kiwix do?</string>
|
||||||
<string name="help_3">Kiwix is an offline content reader. It acts very much like a browser but instead of accessing online web pages, it reads content from a file in ZIM format.</string>
|
<string name="help_3">Kiwix is an offline content reader. It acts very much like a browser but instead of accessing online web pages, it reads content from a file in ZIM format.</string>
|
||||||
<string name="help_4">While Kiwix has been originally designed to provide Wikipedia offline, it also reads other contents.</string>
|
<string name="help_4">While Kiwix has been originally designed to provide Wikipedia offline, it also reads other contents.</string>
|
||||||
@ -148,8 +147,6 @@
|
|||||||
<string name="time_yesterday">Yesterday</string>
|
<string name="time_yesterday">Yesterday</string>
|
||||||
<string name="pref_autonightmode_summary">Automatically switch between day and night mode.</string>
|
<string name="pref_autonightmode_summary">Automatically switch between day and night mode.</string>
|
||||||
<string name="pref_autonightmode">Automated night mode</string>
|
<string name="pref_autonightmode">Automated night mode</string>
|
||||||
<string name="language_count">(%1$d)</string>
|
|
||||||
<string name="language_localized">(%s)</string>
|
|
||||||
<string name="pref_external_link_popup_title">Warn when entering external links</string>
|
<string name="pref_external_link_popup_title">Warn when entering external links</string>
|
||||||
<string name="pref_external_link_popup_summary">Display popup to warn about additional costs or not working in offline links.</string>
|
<string name="pref_external_link_popup_summary">Display popup to warn about additional costs or not working in offline links.</string>
|
||||||
<string name="external_link_popup_dialog_title">Entering External Link</string>
|
<string name="external_link_popup_dialog_title">Entering External Link</string>
|
||||||
@ -188,7 +185,6 @@
|
|||||||
<string name="table_of_contents">Table of contents</string>
|
<string name="table_of_contents">Table of contents</string>
|
||||||
<string name="select_languages">Select languages</string>
|
<string name="select_languages">Select languages</string>
|
||||||
<string name="save_languages">Save languages</string>
|
<string name="save_languages">Save languages</string>
|
||||||
<string name="languages_saved">Languages saved</string>
|
|
||||||
<string name="send_feedback">Send feedback</string>
|
<string name="send_feedback">Send feedback</string>
|
||||||
<string name="expand">Expand</string>
|
<string name="expand">Expand</string>
|
||||||
<string name="history">History</string>
|
<string name="history">History</string>
|
||||||
@ -259,4 +255,8 @@
|
|||||||
<string name="notes_deletion_none_found">No notes found for deletion</string>
|
<string name="notes_deletion_none_found">No notes found for deletion</string>
|
||||||
<string name="notes_deletion_successful">Entire notes folder deleted</string>
|
<string name="notes_deletion_successful">Entire notes folder deleted</string>
|
||||||
<string name="notes_deletion_unsuccessful">Some files not deleted</string>
|
<string name="notes_deletion_unsuccessful">Some files not deleted</string>
|
||||||
|
<plurals name="books_count">
|
||||||
|
<item quantity="one">%d book</item>
|
||||||
|
<item quantity="other">%d books</item>
|
||||||
|
</plurals>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -21,7 +21,9 @@ import org.kiwix.kiwixmobile.downloader.model.DownloadModel
|
|||||||
import org.kiwix.kiwixmobile.downloader.model.DownloadState
|
import org.kiwix.kiwixmobile.downloader.model.DownloadState
|
||||||
import org.kiwix.kiwixmobile.downloader.model.DownloadState.Pending
|
import org.kiwix.kiwixmobile.downloader.model.DownloadState.Pending
|
||||||
import org.kiwix.kiwixmobile.downloader.model.DownloadStatus
|
import org.kiwix.kiwixmobile.downloader.model.DownloadStatus
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.LanguageItem
|
||||||
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book
|
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.Language
|
||||||
import org.kiwix.kiwixmobile.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk
|
import org.kiwix.kiwixmobile.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@ -76,3 +78,19 @@ fun downloadModel(
|
|||||||
downloadId: Long = 1L,
|
downloadId: Long = 1L,
|
||||||
book: Book = book()
|
book: Book = book()
|
||||||
) = DownloadModel(databaseId, downloadId, book)
|
) = DownloadModel(databaseId, downloadId, book)
|
||||||
|
|
||||||
|
fun language(
|
||||||
|
id: Long = 0,
|
||||||
|
isActive: Boolean = false,
|
||||||
|
occurencesOfLanguage: Int = 0,
|
||||||
|
language: String = "",
|
||||||
|
languageLocalized: String = "",
|
||||||
|
languageCode: String = "",
|
||||||
|
languageCodeISO2: String = ""
|
||||||
|
) = Language(
|
||||||
|
id, isActive, occurencesOfLanguage, language, languageLocalized, languageCode,
|
||||||
|
languageCodeISO2
|
||||||
|
)
|
||||||
|
|
||||||
|
fun languageItem(language: Language = language()) =
|
||||||
|
LanguageItem(language)
|
||||||
|
@ -0,0 +1,72 @@
|
|||||||
|
package org.kiwix.kiwixmobile.language.adapter
|
||||||
|
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.mockk
|
||||||
|
import io.mockk.mockkStatic
|
||||||
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
|
import org.junit.jupiter.api.Nested
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import org.kiwix.kiwixmobile.R
|
||||||
|
import org.kiwix.kiwixmobile.extensions.inflate
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageDelegate.HeaderDelegate
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageDelegate.LanguageItemDelegate
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.HeaderItem
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.LanguageItem
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListViewHolder.HeaderViewHolder
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListViewHolder.LanguageViewHolder
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Kiwix Android
|
||||||
|
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class LanguageDelegateTest {
|
||||||
|
@Nested
|
||||||
|
inner class HeaderDelegateTests {
|
||||||
|
@Test
|
||||||
|
fun `class is header item`() {
|
||||||
|
assertThat(HeaderDelegate().itemClass).isEqualTo(HeaderItem::class.java)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `creates HeaderViewHolder`() {
|
||||||
|
val parent = mockk<ViewGroup>()
|
||||||
|
mockkStatic("org.kiwix.kiwixmobile.extensions.ViewGroupExtensionsKt")
|
||||||
|
every { parent.inflate(R.layout.header_date, false) } returns mockk(relaxed = true)
|
||||||
|
assertThat(HeaderDelegate().createViewHolder(parent))
|
||||||
|
.isInstanceOf(HeaderViewHolder::class.java)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
inner class LanguageItemDelegateTests {
|
||||||
|
@Test
|
||||||
|
fun `class is lanuguage item`() {
|
||||||
|
assertThat(LanguageItemDelegate({}).itemClass).isEqualTo(LanguageItem::class.java)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `creates HeaderViewHolder`() {
|
||||||
|
val parent = mockk<ViewGroup>()
|
||||||
|
mockkStatic("org.kiwix.kiwixmobile.extensions.ViewGroupExtensionsKt")
|
||||||
|
every { parent.inflate(R.layout.item_language, false) } returns mockk(relaxed = true)
|
||||||
|
val clickAction = mockk<(LanguageItem) -> Unit>()
|
||||||
|
assertThat(LanguageItemDelegate(clickAction).createViewHolder(parent))
|
||||||
|
.isInstanceOf(LanguageViewHolder::class.java)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,157 @@
|
|||||||
|
/*
|
||||||
|
* Kiwix Android
|
||||||
|
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.kiwix.kiwixmobile.language.viewmodel
|
||||||
|
|
||||||
|
import com.jraska.livedata.test
|
||||||
|
import io.mockk.clearAllMocks
|
||||||
|
import io.mockk.every
|
||||||
|
import io.mockk.mockk
|
||||||
|
import io.reactivex.processors.PublishProcessor
|
||||||
|
import io.reactivex.schedulers.Schedulers
|
||||||
|
import org.junit.jupiter.api.AfterAll
|
||||||
|
import org.junit.jupiter.api.BeforeEach
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith
|
||||||
|
import org.kiwix.kiwixmobile.InstantExecutorExtension
|
||||||
|
import org.kiwix.kiwixmobile.database.newdb.dao.NewLanguagesDao
|
||||||
|
import org.kiwix.kiwixmobile.language
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.Filter
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.SaveAll
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.Select
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.Action.UpdateLanguages
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.State.Content
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.State.Loading
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.State.Saving
|
||||||
|
import org.kiwix.kiwixmobile.languageItem
|
||||||
|
import org.kiwix.kiwixmobile.resetSchedulers
|
||||||
|
import org.kiwix.kiwixmobile.setScheduler
|
||||||
|
import org.kiwix.kiwixmobile.zim_manager.Language
|
||||||
|
|
||||||
|
@ExtendWith(InstantExecutorExtension::class)
|
||||||
|
class LanguageViewModelTest {
|
||||||
|
init {
|
||||||
|
setScheduler(Schedulers.trampoline())
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterAll
|
||||||
|
fun teardown() {
|
||||||
|
resetSchedulers()
|
||||||
|
}
|
||||||
|
|
||||||
|
private val newLanguagesDao: NewLanguagesDao = mockk()
|
||||||
|
private lateinit var languageViewModel: LanguageViewModel
|
||||||
|
|
||||||
|
private val languages: PublishProcessor<List<Language>> = PublishProcessor.create()
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
fun init() {
|
||||||
|
clearAllMocks()
|
||||||
|
every { newLanguagesDao.languages() } returns languages
|
||||||
|
languageViewModel = LanguageViewModel(newLanguagesDao)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `initial state is Loading`() {
|
||||||
|
languageViewModel.state.test()
|
||||||
|
.assertValueHistory(Loading)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `an empty languages emission does not send update action`() {
|
||||||
|
languageViewModel.actions.test()
|
||||||
|
.also {
|
||||||
|
languages.offer(listOf())
|
||||||
|
}
|
||||||
|
.assertValues()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `a languages emission sends update action`() {
|
||||||
|
val expectedList = listOf(language())
|
||||||
|
languageViewModel.actions.test()
|
||||||
|
.also {
|
||||||
|
languages.offer(expectedList)
|
||||||
|
}
|
||||||
|
.assertValues(UpdateLanguages(expectedList))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `UpdateLanguages Action changes state to Content when Loading`() {
|
||||||
|
languageViewModel.actions.offer(UpdateLanguages(listOf()))
|
||||||
|
languageViewModel.state.test()
|
||||||
|
.assertValueHistory(Content(listOf()))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `UpdateLanguages Action has no effect on other states`() {
|
||||||
|
languageViewModel.actions.offer(UpdateLanguages(listOf()))
|
||||||
|
languageViewModel.actions.offer(UpdateLanguages(listOf()))
|
||||||
|
languageViewModel.state.test()
|
||||||
|
.assertValueHistory(Content(listOf()))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Filter Action updates Content state `() {
|
||||||
|
languageViewModel.actions.offer(UpdateLanguages(listOf()))
|
||||||
|
languageViewModel.actions.offer(Filter("filter"))
|
||||||
|
languageViewModel.state.test()
|
||||||
|
.assertValueHistory(Content(listOf(), filter = "filter"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Filter Action has no effect on other states`() {
|
||||||
|
languageViewModel.actions.offer(Filter(""))
|
||||||
|
languageViewModel.state.test()
|
||||||
|
.assertValueHistory(Loading)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Select Action updates Content state`() {
|
||||||
|
languageViewModel.actions.offer(UpdateLanguages(listOf(language())))
|
||||||
|
languageViewModel.actions.offer(Select(languageItem()))
|
||||||
|
languageViewModel.state.test()
|
||||||
|
.assertValueHistory(Content(listOf(language(isActive = true))))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Select Action has no effect on other states`() {
|
||||||
|
languageViewModel.actions.offer(Select(languageItem()))
|
||||||
|
languageViewModel.state.test()
|
||||||
|
.assertValueHistory(Loading)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `SaveAll changes Content to Saving with SideEffect SaveLanguagesAndFinish`() {
|
||||||
|
languageViewModel.actions.offer(UpdateLanguages(listOf()))
|
||||||
|
languageViewModel.effects.test()
|
||||||
|
.also {
|
||||||
|
languageViewModel.actions.offer(SaveAll)
|
||||||
|
}
|
||||||
|
.assertValues(SaveLanguagesAndFinish(listOf(), newLanguagesDao))
|
||||||
|
languageViewModel.state.test()
|
||||||
|
.assertValueHistory(Saving)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `SaveAll has no effect on other states`() {
|
||||||
|
languageViewModel.actions.offer(SaveAll)
|
||||||
|
languageViewModel.state.test()
|
||||||
|
.assertValueHistory(Loading)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Kiwix Android
|
||||||
|
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.kiwix.kiwixmobile.language.viewmodel
|
||||||
|
|
||||||
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
|
import org.junit.jupiter.api.Nested
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import org.kiwix.kiwixmobile.language
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.HeaderItem
|
||||||
|
import org.kiwix.kiwixmobile.language.adapter.LanguageListItem.LanguageItem
|
||||||
|
import org.kiwix.kiwixmobile.language.viewmodel.State.Content
|
||||||
|
|
||||||
|
class StateTest {
|
||||||
|
@Nested
|
||||||
|
inner class ContentTests {
|
||||||
|
@Test
|
||||||
|
fun `creates language list items with headers for active and inactive languages`() {
|
||||||
|
val content = Content(listOf(language(), language(isActive = true)))
|
||||||
|
assertThat(content.viewItems).isEqualTo(
|
||||||
|
listOf(
|
||||||
|
HeaderItem(Long.MAX_VALUE),
|
||||||
|
LanguageItem(language(isActive = true)),
|
||||||
|
HeaderItem(Long.MIN_VALUE),
|
||||||
|
LanguageItem(language())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `filters out based on filter`() {
|
||||||
|
val content = Content(
|
||||||
|
listOf(language(language = "matchesFilter"), language(isActive = true))
|
||||||
|
).updateFilter("matches")
|
||||||
|
assertThat(content.viewItems).isEqualTo(
|
||||||
|
listOf(
|
||||||
|
HeaderItem(Long.MIN_VALUE),
|
||||||
|
LanguageItem(language(language = "matchesFilter"))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
package org.kiwix.kiwixmobile.zim_manager
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Kiwix Android
|
||||||
|
* Copyright (C) 2018 Kiwix <android.kiwix.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
|
import org.junit.jupiter.api.Assertions.assertThrows
|
||||||
|
import org.junit.jupiter.api.Nested
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import org.kiwix.kiwixmobile.language
|
||||||
|
|
||||||
|
class LanguageTest {
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
inner class Equals {
|
||||||
|
@Test
|
||||||
|
fun `throws exception when object is not language item`() {
|
||||||
|
assertThrows(ClassCastException::class.java) { language().equals(Unit) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `not equals with mismatched active states`() {
|
||||||
|
assertThat(language() == language(isActive = true)).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `not equals with mismatched language`() {
|
||||||
|
assertThat(language() == language(language = "mismatch")).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `is equal when language and active are equal`() {
|
||||||
|
assertThat(
|
||||||
|
language(language = "lang", isActive = true) == language(
|
||||||
|
language = "lang", isActive = true
|
||||||
|
)
|
||||||
|
).isTrue()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
inner class Matches {
|
||||||
|
@Test
|
||||||
|
fun `does not match if language and localised do not contain filter`() {
|
||||||
|
assertThat(language().matches("filter")).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `matches if language contains filter`() {
|
||||||
|
assertThat(language(language = "Filtermatcher").matches("filter")).isTrue()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `matches if languageLocalized contains filter`() {
|
||||||
|
assertThat(language(languageLocalized = "Filtermatcher").matches("filter")).isTrue()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -49,6 +49,7 @@ import org.kiwix.kiwixmobile.downloader.model.DownloadModel
|
|||||||
import org.kiwix.kiwixmobile.downloader.model.DownloadState
|
import org.kiwix.kiwixmobile.downloader.model.DownloadState
|
||||||
import org.kiwix.kiwixmobile.downloader.model.DownloadStatus
|
import org.kiwix.kiwixmobile.downloader.model.DownloadStatus
|
||||||
import org.kiwix.kiwixmobile.downloader.model.UriToFileConverter
|
import org.kiwix.kiwixmobile.downloader.model.UriToFileConverter
|
||||||
|
import org.kiwix.kiwixmobile.language
|
||||||
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity
|
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity
|
||||||
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book
|
import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book
|
||||||
import org.kiwix.kiwixmobile.resetSchedulers
|
import org.kiwix.kiwixmobile.resetSchedulers
|
||||||
@ -285,7 +286,7 @@ class ZimManageViewModelTest {
|
|||||||
languageCodeISO2 = "en"
|
languageCodeISO2 = "en"
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
Language(true, 1, "", "", "", "")
|
language(isActive = true, occurencesOfLanguage = 1)
|
||||||
)
|
)
|
||||||
verify(exactly = 0) { newLanguagesDao.insert(any()) }
|
verify(exactly = 0) { newLanguagesDao.insert(any()) }
|
||||||
}
|
}
|
||||||
@ -342,7 +343,7 @@ class ZimManageViewModelTest {
|
|||||||
Book().apply { language = "fra" }
|
Book().apply { language = "fra" }
|
||||||
),
|
),
|
||||||
listOf(dbLanguage),
|
listOf(dbLanguage),
|
||||||
Language(true, 1, "", "", "", "")
|
language(isActive = true, occurencesOfLanguage = 1)
|
||||||
)
|
)
|
||||||
verify {
|
verify {
|
||||||
newLanguagesDao.insert(
|
newLanguagesDao.insert(
|
||||||
@ -387,20 +388,6 @@ class ZimManageViewModelTest {
|
|||||||
.assertValue(NOT_CONNECTED)
|
.assertValue(NOT_CONNECTED)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `language items for dialog observed`() {
|
|
||||||
val expectedValue = listOf(
|
|
||||||
Language(true, 1, "e", "e", "e", "e")
|
|
||||||
)
|
|
||||||
testScheduler.triggerActions()
|
|
||||||
languages.onNext(expectedValue)
|
|
||||||
testScheduler.triggerActions()
|
|
||||||
viewModel.requestLanguagesDialog.onNext(Unit)
|
|
||||||
testScheduler.triggerActions()
|
|
||||||
viewModel.languageItems.test()
|
|
||||||
.assertValue(expectedValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `library update removes from sources`() {
|
fun `library update removes from sources`() {
|
||||||
every { downloader.queryStatus(any()) } returns emptyList()
|
every { downloader.queryStatus(any()) } returns emptyList()
|
||||||
@ -447,8 +434,8 @@ class ZimManageViewModelTest {
|
|||||||
books.onNext(listOf(bookOnDisk(book = bookAlreadyOnDisk)))
|
books.onNext(listOf(bookOnDisk(book = bookAlreadyOnDisk)))
|
||||||
languages.onNext(
|
languages.onNext(
|
||||||
listOf(
|
listOf(
|
||||||
Language(true, 1, "", "", "activeLanguage", ""),
|
language(isActive = true, occurencesOfLanguage = 1, languageCode = "activeLanguage"),
|
||||||
Language(false, 1, "", "", "inactiveLanguage", "")
|
language(isActive = false, occurencesOfLanguage = 1, languageCode = "inactiveLanguage")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
fileSystemStates.onNext(CanWrite4GbFile)
|
fileSystemStates.onNext(CanWrite4GbFile)
|
||||||
@ -482,7 +469,7 @@ class ZimManageViewModelTest {
|
|||||||
books.onNext(listOf())
|
books.onNext(listOf())
|
||||||
languages.onNext(
|
languages.onNext(
|
||||||
listOf(
|
listOf(
|
||||||
Language(true, 1, "", "", "activeLanguage", "")
|
language(isActive = true, occurencesOfLanguage = 1, languageCode = "activeLanguage")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
fileSystemStates.onNext(CannotWrite4GbFile)
|
fileSystemStates.onNext(CannotWrite4GbFile)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user