#1292 Rewrite of LanguageActivity

This commit is contained in:
Sean Mac Gillicuddy 2019-07-18 12:51:01 +01:00
parent 6ed73447c1
commit 97edd97d25
73 changed files with 979 additions and 705 deletions

View File

@ -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());

View File

@ -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();

View File

@ -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> {

View File

@ -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

View File

@ -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

View File

@ -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) })
} }

View File

@ -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)

View File

@ -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();

View File

@ -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();
}
}

View File

@ -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)
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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());
}
});
}
}

View File

@ -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
}

View File

@ -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)
}
}

View File

@ -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()
}

View File

@ -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) }
}
}
}

View File

@ -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()
}

View File

@ -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)
}

View File

@ -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)
}
}

View File

@ -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()
}
}
}

View File

@ -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)
}
}

View File

@ -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()
}
}
}

View File

@ -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()
}
}
}

View File

@ -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)
} }

View File

@ -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)
} }

View File

@ -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

View File

@ -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)) },

View File

@ -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

View File

@ -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

View File

@ -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;
} }
} }

View File

@ -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>

View 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>

View 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>

View File

@ -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>

View File

@ -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>

View File

@ -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"
> >

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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 daccé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 daccé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 dautre 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 dautre contenu.</string>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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)

View File

@ -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)
}
}
}

View File

@ -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)
}
}

View File

@ -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"))
)
)
}
}
}

View File

@ -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()
}
}
}

View File

@ -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)