diff --git a/app/src/androidTestKiwix/java/org/kiwix/kiwixmobile/language/LanguageActivityTest.java b/app/src/androidTestKiwix/java/org/kiwix/kiwixmobile/language/LanguageActivityTest.java index ee5d1e4a6..d87544fb0 100644 --- a/app/src/androidTestKiwix/java/org/kiwix/kiwixmobile/language/LanguageActivityTest.java +++ b/app/src/androidTestKiwix/java/org/kiwix/kiwixmobile/language/LanguageActivityTest.java @@ -26,21 +26,15 @@ import com.schibsted.spain.barista.interaction.BaristaSleepInteractions; import com.schibsted.spain.barista.rule.BaristaRule; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; 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.openActionBarOverflowOrOptionsMenu; import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.action.ViewActions.closeSoftKeyboard; 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.matcher.ViewMatchers.isChecked; 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.kiwix.kiwixmobile.testutils.Matcher.childAtPosition; import static org.kiwix.kiwixmobile.testutils.TestUtils.TEST_PAUSE_MS; -import static org.kiwix.kiwixmobile.testutils.ViewActions.setChecked; public class LanguageActivityTest { @Rule - public BaristaRule activityTestRule = BaristaRule.create(IntroActivity.class); + public BaristaRule activityTestRule = BaristaRule.create(ZimManageActivity.class); @Rule public GrantPermissionRule readPermissionRule = GrantPermissionRule.grant(Manifest.permission.READ_EXTERNAL_STORAGE); @@ -72,46 +65,8 @@ public class LanguageActivityTest { } @Test - @Ignore("Broken in 2.5")//TODO: Fix in 3.0 public void testLanguageActivity() { - BaristaSleepInteractions.sleep(TEST_PAUSE_MS); - 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())); - + onView(withText("Online")).perform(click()); // Open the Language Activity onView(withContentDescription("Choose a language")).perform(click()); @@ -143,18 +98,7 @@ public class LanguageActivityTest { 0), 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()); @@ -164,8 +108,6 @@ public class LanguageActivityTest { onView(withId(R.id.search_src_text)).perform(replaceText(language2), closeSoftKeyboard()); BaristaSleepInteractions.sleep(TEST_PAUSE_MS); - // Initialise the language checkbox - checkBox2.perform(setChecked(false)); onView(withContentDescription("Clear query")).perform(click()); // Collapse the search view to go to the full list of languages onView(withContentDescription("Collapse")).perform(click()); @@ -178,7 +120,7 @@ public class LanguageActivityTest { onView(withId(R.id.search_src_text)).perform(replaceText(language1), closeSoftKeyboard()); BaristaSleepInteractions.sleep(TEST_PAUSE_MS); - checkBox2.perform(click()); + checkBox1.perform(click()); onView(withContentDescription("Clear query")).perform(click()); // Collapse the search view to go to the full list of languages onView(withContentDescription("Collapse")).perform(click()); @@ -187,7 +129,7 @@ public class LanguageActivityTest { onView(withId(R.id.search_src_text)).perform(replaceText(language2), closeSoftKeyboard()); BaristaSleepInteractions.sleep(TEST_PAUSE_MS); - checkBox2.perform(click()); + checkBox1.perform(click()); onView(withContentDescription("Clear query")).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()); BaristaSleepInteractions.sleep(TEST_PAUSE_MS); - checkBox2.check(matches(not(isChecked()))); + checkBox1.check(matches(not(isChecked()))); onView(withContentDescription("Clear query")).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()); BaristaSleepInteractions.sleep(TEST_PAUSE_MS); - checkBox2.check(matches(not(isChecked()))); + checkBox1.check(matches(not(isChecked()))); onView(withContentDescription("Clear query")).perform(click()); onView(withContentDescription("Collapse")).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()); BaristaSleepInteractions.sleep(TEST_PAUSE_MS); - checkBox2.perform(click()); + checkBox1.perform(click()); onView(withContentDescription("Clear query")).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()); BaristaSleepInteractions.sleep(TEST_PAUSE_MS); - checkBox2.perform(click()); + checkBox1.perform(click()); onView(withContentDescription("Clear query")).perform(click()); onView(withContentDescription("Collapse")).perform(click()); onView(withContentDescription("Save languages")).perform(click()); diff --git a/app/src/main/java/org/kiwix/kiwixmobile/bookmark/BookmarksActivity.java b/app/src/main/java/org/kiwix/kiwixmobile/bookmark/BookmarksActivity.java index 48c23f828..48a84074f 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/bookmark/BookmarksActivity.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/bookmark/BookmarksActivity.java @@ -92,7 +92,7 @@ public class BookmarksActivity extends BaseActivity implements BookmarksContract protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); presenter.attachView(this); - setContentView(R.layout.activity_bookmarks_history_language); + setContentView(R.layout.activity_bookmarks); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); diff --git a/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/entities/LanguageEntity.kt b/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/entities/LanguageEntity.kt index 8b5896191..1dba26e86 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/entities/LanguageEntity.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/database/newdb/entities/LanguageEntity.kt @@ -24,7 +24,7 @@ data class LanguageEntity( ) fun toLanguageModel() = - Language(locale, active, occurencesOfLanguage) + Language(locale, active, occurencesOfLanguage, id) } class StringToLocaleConverter : PropertyConverter { diff --git a/app/src/main/java/org/kiwix/kiwixmobile/di/modules/ActivityBindingModule.java b/app/src/main/java/org/kiwix/kiwixmobile/di/modules/ActivityBindingModule.java index cc97109fb..ee09602b3 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/di/modules/ActivityBindingModule.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/di/modules/ActivityBindingModule.java @@ -12,7 +12,6 @@ import org.kiwix.kiwixmobile.history.HistoryModule; import org.kiwix.kiwixmobile.intro.IntroActivity; import org.kiwix.kiwixmobile.intro.IntroModule; import org.kiwix.kiwixmobile.language.LanguageActivity; -import org.kiwix.kiwixmobile.language.LanguageModule; import org.kiwix.kiwixmobile.main.MainActivity; import org.kiwix.kiwixmobile.main.MainModule; import org.kiwix.kiwixmobile.search.SearchActivity; @@ -61,7 +60,7 @@ public abstract class ActivityBindingModule { public abstract SplashActivity provideSplashActivity(); @PerActivity - @ContributesAndroidInjector(modules = LanguageModule.class) + @ContributesAndroidInjector public abstract LanguageActivity provideLanguageActivity(); @PerActivity diff --git a/app/src/main/java/org/kiwix/kiwixmobile/di/modules/ViewModelModule.kt b/app/src/main/java/org/kiwix/kiwixmobile/di/modules/ViewModelModule.kt index 45c3db03e..f69993da8 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/di/modules/ViewModelModule.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/di/modules/ViewModelModule.kt @@ -7,6 +7,7 @@ import dagger.Module import dagger.multibindings.IntoMap import org.kiwix.kiwixmobile.KiwixViewModelFactory import org.kiwix.kiwixmobile.di.ViewModelKey +import org.kiwix.kiwixmobile.language.viewmodel.LanguageViewModel import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel /* @@ -31,7 +32,12 @@ abstract class ViewModelModule { @Binds @IntoMap @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 internal abstract fun bindViewModelFactory(factory: KiwixViewModelFactory): ViewModelProvider.Factory diff --git a/app/src/main/java/org/kiwix/kiwixmobile/downloader/DownloadFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/downloader/DownloadFragment.kt index 77d58af4c..3c4fd2bba 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/downloader/DownloadFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/downloader/DownloadFragment.kt @@ -23,7 +23,6 @@ import android.view.View import android.view.ViewGroup import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView 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.di.components.ActivityComponent import org.kiwix.kiwixmobile.downloader.model.DownloadItem +import org.kiwix.kiwixmobile.extensions.viewModel import org.kiwix.kiwixmobile.utils.DialogShower import org.kiwix.kiwixmobile.utils.KiwixDialog.YesNoDialog.StopDownload import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil @@ -44,10 +44,10 @@ class DownloadFragment : BaseFragment() { @Inject lateinit var sharedPreferenceUtil: SharedPreferenceUtil @Inject lateinit var downloader: Downloader - private val zimManageViewModel: ZimManageViewModel by lazy { - ViewModelProviders.of(activity!!, viewModelFactory) - .get(ZimManageViewModel::class.java) + private val zimManageViewModel by lazy { + activity!!.viewModel(viewModelFactory) } + private val downloadAdapter = DownloadAdapter { dialogShower.show(StopDownload, { downloader.cancelDownload(it) }) } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/extensions/ActivityExtensions.kt b/app/src/main/java/org/kiwix/kiwixmobile/extensions/ActivityExtensions.kt index 19f27325b..9beb1c147 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/extensions/ActivityExtensions.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/extensions/ActivityExtensions.kt @@ -1,10 +1,16 @@ package org.kiwix.kiwixmobile.extensions import android.app.Activity +import android.content.Intent import android.view.ActionMode import android.view.ActionMode.Callback import android.view.Menu 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( menuId: Int, @@ -41,3 +47,12 @@ fun Activity.startActionMode( }) } + +inline fun Activity.start() { + startActivity(Intent(this, T::class.java)) +} + +inline fun FragmentActivity.viewModel(viewModelFactory: ViewModelProvider.Factory) = + ViewModelProviders.of(this, viewModelFactory) + .get(T::class.java) + diff --git a/app/src/main/java/org/kiwix/kiwixmobile/history/HistoryActivity.java b/app/src/main/java/org/kiwix/kiwixmobile/history/HistoryActivity.java index ee375d784..75e02369d 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/history/HistoryActivity.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/history/HistoryActivity.java @@ -106,7 +106,7 @@ public class HistoryActivity extends BaseActivity implements HistoryContract.Vie protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); presenter.attachView(this); - setContentView(R.layout.activity_bookmarks_history_language); + setContentView(R.layout.activity_history); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageActivity.java b/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageActivity.java deleted file mode 100644 index af3a11b15..000000000 --- a/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageActivity.java +++ /dev/null @@ -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 languages = new ArrayList<>(); - private final ArrayList 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 languages) { - this.languages.clear(); - this.languages.addAll(languages); - languageAdapter.categorizeLanguages(); - languageAdapter.notifyDataSetChanged(); - } -} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageActivity.kt b/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageActivity.kt new file mode 100644 index 000000000..387c5c401 --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageActivity.kt @@ -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(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) + } + +} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageAdapter.java b/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageAdapter.java deleted file mode 100644 index 0192e2e59..000000000 --- a/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageAdapter.java +++ /dev/null @@ -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 { - private static final int TYPE_HEADER = 0; - private static final int TYPE_ITEM = 1; - private final ArrayList languages; - private final ArrayList selectedLanguages = new ArrayList<>(); - private final ArrayList unselectedLanguages = new ArrayList<>(); - - LanguageAdapter(ArrayList 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); - } - } -} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageContract.java b/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageContract.java deleted file mode 100644 index ee6035570..000000000 --- a/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageContract.java +++ /dev/null @@ -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 { - void notifyLanguagesFiltered(List languages); - } - - interface Presenter extends BaseContract.Presenter { - void filerLanguages(List languages, String query); - - void saveLanguages(List languages); - } -} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageModule.java b/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageModule.java deleted file mode 100644 index 11dec7227..000000000 --- a/app/src/main/java/org/kiwix/kiwixmobile/language/LanguageModule.java +++ /dev/null @@ -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; - } -} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/LanguagePresenter.java b/app/src/main/java/org/kiwix/kiwixmobile/language/LanguagePresenter.java deleted file mode 100644 index 42052b70d..000000000 --- a/app/src/main/java/org/kiwix/kiwixmobile/language/LanguagePresenter.java +++ /dev/null @@ -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 - 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 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>() { - // @Override - // public void onSubscribe(Disposable d) { - // compositeDisposable.add(d); - // } - // - // @Override - // public void onSuccess(List languages) { - // view.notifyLanguagesFiltered(languages); - // } - // - // @Override - // public void onError(Throwable e) { - // Log.e("LanguagePresenter", e.toString()); - // } - // }); - } - - @Override - public void saveLanguages(List 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()); - } - }); - } -} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/adapter/LanguageAdapter.kt b/app/src/main/java/org/kiwix/kiwixmobile/language/adapter/LanguageAdapter.kt new file mode 100644 index 000000000..5860bf524 --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/language/adapter/LanguageAdapter.kt @@ -0,0 +1,27 @@ +/* + * Kiwix Android + * Copyright (C) 2018 Kiwix + * + * 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 . + */ +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 +) : BaseDelegateAdapter(*delegates) { + override fun getIdFor(item: LanguageListItem) = item.id +} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/adapter/LanguageDelegate.kt b/app/src/main/java/org/kiwix/kiwixmobile/language/adapter/LanguageDelegate.kt new file mode 100644 index 000000000..08cbde435 --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/language/adapter/LanguageDelegate.kt @@ -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> : + AbsDelegateAdapter { + + class HeaderDelegate : LanguageDelegate() { + 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() { + override val itemClass = LanguageItem::class.java + + override fun createViewHolder(parent: ViewGroup) = + LanguageViewHolder(parent.inflate(R.layout.item_language, false), clickAction) + + } +} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/adapter/LanguageListItem.kt b/app/src/main/java/org/kiwix/kiwixmobile/language/adapter/LanguageListItem.kt new file mode 100644 index 000000000..7842fe4bf --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/language/adapter/LanguageListItem.kt @@ -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() +} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/adapter/LanguageListViewHolder.kt b/app/src/main/java/org/kiwix/kiwixmobile/language/adapter/LanguageListViewHolder.kt new file mode 100644 index 000000000..1c4441880 --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/language/adapter/LanguageListViewHolder.kt @@ -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(override val containerView: View) : + BaseViewHolder(containerView) { + class HeaderViewHolder(view: View) : LanguageListViewHolder(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(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) } + } + + } +} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/viewmodel/Action.kt b/app/src/main/java/org/kiwix/kiwixmobile/language/viewmodel/Action.kt new file mode 100644 index 000000000..5a0804d99 --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/language/viewmodel/Action.kt @@ -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) : Action() + data class Filter(val filter: String) : Action() + data class Select(val language: LanguageItem) : Action() + object SaveAll : Action() +} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/viewmodel/LanguageViewModel.kt b/app/src/main/java/org/kiwix/kiwixmobile/language/viewmodel/LanguageViewModel.kt new file mode 100644 index 000000000..1ade26a3a --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/language/viewmodel/LanguageViewModel.kt @@ -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().apply { value = Loading } + val actions = PublishProcessor.create() + val effects = PublishProcessor.create>() + + 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) + +} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/viewmodel/SaveLanguagesAndFinish.kt b/app/src/main/java/org/kiwix/kiwixmobile/language/viewmodel/SaveLanguagesAndFinish.kt new file mode 100644 index 000000000..82f6d8dc2 --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/language/viewmodel/SaveLanguagesAndFinish.kt @@ -0,0 +1,39 @@ +/* + * Kiwix Android + * Copyright (C) 2018 Kiwix + * + * 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 . + */ +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, + val languageDao: NewLanguagesDao +) : SideEffect { + + override fun invokeWith(activity: Activity) { + Flowable.fromCallable { languageDao.insert(languages) } + .subscribeOn(Schedulers.io()) + .subscribe({ + activity.finish() + }, Throwable::printStackTrace) + } +} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/language/viewmodel/State.kt b/app/src/main/java/org/kiwix/kiwixmobile/language/viewmodel/State.kt new file mode 100644 index 000000000..a49febd60 --- /dev/null +++ b/app/src/main/java/org/kiwix/kiwixmobile/language/viewmodel/State.kt @@ -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, + val filter: String = "", + val viewItems: List = 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, + filter: String + ) = activeItems( + items, filter + ) + otherItems(items, filter) + + private fun activeItems( + items: List, + filter: String + ) = + createLanguageSection( + items, filter, { it.active }, HeaderItem.SELECTED + ) + + private fun otherItems( + items: List, + filter: String + ) = + createLanguageSection( + items, filter, { !it.active }, HeaderItem.OTHER + ) + + private fun createLanguageSection( + items: List, + 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() + + } + } + +} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/views/LanguageAdapter.kt b/app/src/main/java/org/kiwix/kiwixmobile/views/LanguageAdapter.kt deleted file mode 100644 index 668adb82b..000000000 --- a/app/src/main/java/org/kiwix/kiwixmobile/views/LanguageAdapter.kt +++ /dev/null @@ -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) : RecyclerView.Adapter() { - - 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) - } -} - diff --git a/app/src/main/java/org/kiwix/kiwixmobile/views/LanguageSelectDialog.kt b/app/src/main/java/org/kiwix/kiwixmobile/views/LanguageSelectDialog.kt deleted file mode 100644 index c74d01928..000000000 --- a/app/src/main/java/org/kiwix/kiwixmobile/views/LanguageSelectDialog.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Kiwix Android - * Copyright (C) 2018 Kiwix - * - * 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 . - */ -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) -> Unit - var languages: List = 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() - } - } -} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/views/LanguageViewHolder.kt b/app/src/main/java/org/kiwix/kiwixmobile/views/LanguageViewHolder.kt deleted file mode 100644 index fdee12c76..000000000 --- a/app/src/main/java/org/kiwix/kiwixmobile/views/LanguageViewHolder.kt +++ /dev/null @@ -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() - } - } -} diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/Language.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/Language.kt index 172f6491d..7465a74a2 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/Language.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/Language.kt @@ -6,6 +6,7 @@ import java.util.Locale @Parcelize data class Language constructor( + val id: Long = 0, var active: Boolean, var occurencesOfLanguage: Int, var language: String, @@ -13,11 +14,14 @@ data class Language constructor( var languageCode: String, var languageCodeISO2: String ) : Parcelable { + constructor( locale: Locale, active: Boolean, - occurrencesOfLanguage: Int + occurrencesOfLanguage: Int, + id: Long = 0 ) : this( + id, active, occurrencesOfLanguage, locale.displayLanguage, @@ -35,4 +39,7 @@ data class Language constructor( override fun equals(other: Any?): Boolean { return (other as Language).language == language && other.active == active } + + fun matches(filter: String) = + language.contains(filter, true) or languageLocalized.contains(filter, true) } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageActivity.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageActivity.kt index 2ed7d9399..eb0b2bbc2 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageActivity.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageActivity.kt @@ -26,32 +26,25 @@ import android.util.Log import android.view.Menu import android.view.MenuItem import androidx.appcompat.widget.SearchView -import androidx.lifecycle.Observer 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.tabs import kotlinx.android.synthetic.main.zim_manager.toolbar import org.kiwix.kiwixmobile.R import org.kiwix.kiwixmobile.base.BaseActivity 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.utils.Constants.TAG_KIWIX import org.kiwix.kiwixmobile.utils.LanguageUtils -import org.kiwix.kiwixmobile.utils.StyleUtils.dialogStyle -import org.kiwix.kiwixmobile.views.LanguageSelectDialog import java.io.File import javax.inject.Inject class ZimManageActivity : BaseActivity() { - private val zimManageViewModel: ZimManageViewModel by lazy { - ViewModelProviders.of(this, viewModelFactory) - .get(ZimManageViewModel::class.java) - } + private val zimManageViewModel by lazy { viewModel(viewModelFactory) } private val mSectionsPagerAdapter: SectionsPagerAdapter by lazy { SectionsPagerAdapter(this, supportFragmentManager) } @@ -78,9 +71,6 @@ class ZimManageActivity : BaseActivity() { tabs.setupWithViewPager(this) addOnPageChangeListener(SimplePageChangeListener(this@ZimManageActivity::updateMenu)) } - zimManageViewModel.languageItems.observe(this, Observer { - onLanguageItemsForDialogUpdated(it!!) - }) setViewPagerPositionFromIntent(intent) } @@ -95,24 +85,6 @@ class ZimManageActivity : BaseActivity() { } } - private fun onLanguageItemsForDialogUpdated(languages: List) { - 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) { searchItem?.isVisible = position == 1 @@ -155,9 +127,7 @@ class ZimManageActivity : BaseActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.select_language -> { - zimManageViewModel.requestLanguagesDialog.onNext(Unit) - } + R.id.select_language -> start() } return super.onOptionsItemSelected(item) } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageViewModel.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageViewModel.kt index 88a77ff75..1f92adbda 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageViewModel.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageViewModel.kt @@ -110,13 +110,11 @@ class ZimManageViewModel @Inject constructor( val deviceListIsRefreshing = MutableLiveData() val libraryListIsRefreshing = MutableLiveData() val networkStates = MutableLiveData() - val languageItems = MutableLiveData>() val requestFileSystemCheck = PublishProcessor.create() val fileSelectActions = PublishProcessor.create() val requestDownloadLibrary = BehaviorProcessor.createDefault(Unit) val requestFiltering = BehaviorProcessor.createDefault("") - val requestLanguagesDialog = PublishProcessor.create() private val compositeDisposable = CompositeDisposable() @@ -151,7 +149,6 @@ class ZimManageViewModel @Inject constructor( updateLibraryItems(booksFromDao, downloads, networkLibrary, languages), updateLanguagesInDao(networkLibrary, languages), updateNetworkStates(), - updateLanguageItemsForDialog(languages), requestsAndConnectivtyChangesToLibraryRequests(networkLibrary), fileSelectActions() ) @@ -286,16 +283,6 @@ class ZimManageViewModel @Inject constructor( ) } - private fun updateLanguageItemsForDialog(languages: Flowable>) = - requestLanguagesDialog - .withLatestFrom( - languages, - BiFunction, List> { _, langs -> langs }) - .subscribe( - languageItems::postValue, - Throwable::printStackTrace - ) - private fun updateNetworkStates() = connectivityBroadcastReceiver.networkStates.subscribe( networkStates::postValue, Throwable::printStackTrace diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/ZimFileSelectFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/ZimFileSelectFragment.kt index 854f3a55c..78642abf7 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/ZimFileSelectFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/fileselect_view/ZimFileSelectFragment.kt @@ -29,7 +29,6 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import io.reactivex.disposables.CompositeDisposable @@ -40,6 +39,7 @@ import org.kiwix.kiwixmobile.R import org.kiwix.kiwixmobile.base.BaseFragment import org.kiwix.kiwixmobile.di.components.ActivityComponent 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.LanguageUtils import org.kiwix.kiwixmobile.utils.SharedPreferenceUtil @@ -61,11 +61,9 @@ class ZimFileSelectFragment : BaseFragment() { private var actionMode: ActionMode? = null val disposable = CompositeDisposable() - private val zimManageViewModel: ZimManageViewModel by lazy { - ViewModelProviders.of(activity!!, viewModelFactory) - .get(ZimManageViewModel::class.java) + private val zimManageViewModel by lazy { + activity!!.viewModel(viewModelFactory) } - private val bookDelegate: BookDelegate by lazy { BookDelegate(sharedPreferenceUtil, { offerAction(RequestOpen(it)) }, diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/LibraryFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/LibraryFragment.kt index 38e7d94fd..3ec2e70ca 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/LibraryFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/LibraryFragment.kt @@ -27,7 +27,6 @@ import android.view.View.VISIBLE import android.view.ViewGroup import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView 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.extensions.snack import org.kiwix.kiwixmobile.extensions.toast +import org.kiwix.kiwixmobile.extensions.viewModel import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book import org.kiwix.kiwixmobile.main.MainActivity import org.kiwix.kiwixmobile.utils.BookUtils @@ -72,10 +72,10 @@ class LibraryFragment : BaseFragment() { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory @Inject lateinit var bookUtils: BookUtils - private val zimManageViewModel: ZimManageViewModel by lazy { - ViewModelProviders.of(activity!!, viewModelFactory) - .get(ZimManageViewModel::class.java) + private val zimManageViewModel by lazy { + activity!!.viewModel(viewModelFactory) } + private val libraryAdapter: LibraryAdapter by lazy { LibraryAdapter( BookDelegate(bookUtils, this::onBookItemClick), DividerDelegate diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/base/AbsDelegateAdapter.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/base/AbsDelegateAdapter.kt index 00105fcad..4adaf5a64 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/base/AbsDelegateAdapter.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/base/AbsDelegateAdapter.kt @@ -25,7 +25,10 @@ interface AbsDelegateAdapter> : AdapterDelegate { - abstract val itemClass: Class + + val itemClass: Class + + @Suppress("UNCHECKED_CAST") override fun bind( viewHolder: RecyclerView.ViewHolder, itemToBind: SUPERTYPE diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/base/AdapterDelegateManager.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/base/AdapterDelegateManager.kt index de671d953..6fa79c5c1 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/base/AdapterDelegateManager.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/adapter/base/AdapterDelegateManager.kt @@ -27,7 +27,7 @@ class AdapterDelegateManager() { private fun getDelegateIndexFor(item: T): Int { for (index in 0..delegates.size()) { val valueAt = delegates.valueAt(index) - if (valueAt.isFor(item)) { + if (valueAt?.isFor(item) == true) { return index; } } diff --git a/app/src/main/res/layout/activity_bookmarks_history_language.xml b/app/src/main/res/layout/activity_bookmarks.xml similarity index 97% rename from app/src/main/res/layout/activity_bookmarks_history_language.xml rename to app/src/main/res/layout/activity_bookmarks.xml index b8afd1c47..3ff974d16 100644 --- a/app/src/main/res/layout/activity_bookmarks_history_language.xml +++ b/app/src/main/res/layout/activity_bookmarks.xml @@ -26,7 +26,7 @@ + diff --git a/app/src/main/res/layout/activity_history.xml b/app/src/main/res/layout/activity_history.xml new file mode 100644 index 000000000..3ff974d16 --- /dev/null +++ b/app/src/main/res/layout/activity_history.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_language.xml b/app/src/main/res/layout/activity_language.xml new file mode 100644 index 000000000..ab3646d3c --- /dev/null +++ b/app/src/main/res/layout/activity_language.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_language.xml b/app/src/main/res/layout/item_language.xml index 3e367bcf5..343ac22a1 100644 --- a/app/src/main/res/layout/item_language.xml +++ b/app/src/main/res/layout/item_language.xml @@ -57,4 +57,9 @@ app:layout_constraintTop_toTopOf="parent" tools:text="9 books" /> + diff --git a/app/src/main/res/layout/language_selection.xml b/app/src/main/res/layout/language_selection.xml deleted file mode 100644 index 26dd7b23b..000000000 --- a/app/src/main/res/layout/language_selection.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/search.xml b/app/src/main/res/layout/search.xml index a2088fd43..b4346faa0 100644 --- a/app/src/main/res/layout/search.xml +++ b/app/src/main/res/layout/search.xml @@ -15,7 +15,6 @@ diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 901006464..acc0bdfe8 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -94,7 +94,6 @@ لا يوجد فيديو لا يوجد اتصال بالشبكة استخدم الشبكة لتنزيل قائمة المحتويات. (حوالي 6 ميغابايت) - لا يزال يتم تحميل المحتوى ماذا يفعل كيويكس؟ كيويكس قارئ محتوى غير متصل، وهو يعمل إلى حد كبير مثل المتصفح، ولكن بدلا من الوصول إلى صفحات الويب على الإنترنت، فإنه يقرأ المحتوى من ملف بتنسيق ZIM. بينما كان كيويكس مصمما في الأصل لتوفير ويكيبيديا في وضع عدم الاتصال، فإنه يقرأ أيضا محتويات أخرى. diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 8c2feab46..cf421b6df 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -94,7 +94,6 @@ Без видео клипове Няма връзка с мрежата Използвайте мрежата за даунлоуд на списъка със съдържанието.\n(Приблизително 6MB) - Съдържанието все още се зарежда Какво прави Kiwix? Kiwix е офлайн четец на съдържание. Той действа като браузър, но вместо да зарежда съдържанието от онлайн уеб страници, той зарежда съдържанието от файл в ZIM формат. Въпреки че Kiwix е проектиран първоначално, да предоставя достъп до Уикипедия офлайн, той е способен, да предоставя достъп и до друго съдържание. diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 5fffe9e6a..fe46b3dbe 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -94,7 +94,6 @@ কোন ভিডিও নেই কোন নেটওয়ার্ক সংযোগ নেই বিষয়বস্তুর তালিকা ডাউনলোড করতে নেটওয়ার্ক ব্যবহার করুন (আনুমানিক ৬ MB) - বিষয়বস্তু এখনো লোড হচ্ছে কিউইক্স কি কাজ করে? কিউইক্স একটি অফলাইনভিত্তিক নিবন্ধ পাঠক। এটি একটি ব্রাউজারের মত অনেকটা কাজ করে কিন্তু অনলাইনে ওয়েব পৃষ্ঠাগুলিতে ঢুকার পরিবর্তে, এটি ZIM ফরম্যাটে একটি ফাইল থেকে বিষয়বস্তু পড়ে। কিউইক্স মূলত উইকিপিডিয়াকে অফলাইনে সরবরাহ করার জন্য নকশা করা হয়েছে, তবে এটি অন্যান্য বিষয়গুলিও পড়ে থাকে। @@ -140,7 +139,6 @@ বামে স্বয়ংক্রিয়ভাবে দিন এবং রাতের মোডে স্যুইচ করুন। স্বয়ংক্রিয় রাত্রি মোড - (%1$dটি) আর জিজ্ঞাসা করবেন না নির্বাচিত ভাষা অন্যান্য ভাষাসমূহ: diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index cc54b8be8..7e677d19d 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -94,7 +94,6 @@ Video ebet N\'eus kevreadur rouedad ebet Implijout ar rouedad evit pellgargañ ar roll endalc\'had (war-dro 6Mo). - O kargañ emañ an endalc\'had c\'hoazh Petra a ra Kiwix ? 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. Daoust ma\'z eo bet krouet Kiwix evit pourchas Wikipedia ezlinenn e lenn endalc\'hioù all ivez. diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index c7939ec96..3a9ed8b54 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -89,7 +89,6 @@ Ingen videoer Ingen netværksforbindelse Brug netværk til at hente indholdsliste. (Cirka 6 MB) - Indhold indlæses stadig Hvad gør Kiwix? 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. Selvom Kiwix oprindelig blev designet for at tilbyde Wikipedia lokalt, så læser det også andet indhold. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 69ca5c07d..afc0a8ba7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -90,7 +90,6 @@ Keine Videos Keine Netzwerkverbindung Netzwerk verwenden, um die Inhaltsliste herunterzuladen (ungefähr 6 MB). - Inhalt lädt noch Was macht Kiwix? 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. Obwohl Kiwix ursprünglich entwickelt wurde, um Wikipedia offline zur Verfügung zu stellen, liest es auch andere Inhalte. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 515af317b..58899684d 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -85,7 +85,6 @@ Χωρίς βίντεο Δεν υπάρχει σύνδεση στο δίκτυο Χρησιμοποιήστε δίκτυο για να κατεβάσετε την λίστα περιεχομένων. (Περίπου 6MB) - Το περιεχόμενο φορτώνει ακόμα Τι κάνει το Kiwix; Το Kiwix είναι ένας αναγνώστης περιεχομένου εκτός σύνδεσης. Φέρεται πολύ σαν περιηγητής αλλά αντί να έχει πρόσβαση σε διαδικτυακές σελίδες, διαβάζει περιεχόμενο από ένα αρχείο σε μορφοποίηση ZIM. Που είναι το περιεχόμενο; diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index b8bb6e2ca..8d12f9dab 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -94,7 +94,6 @@ Neniu Videaĵo Reta konekto mankas Uzi reton por elŝuti liston de enhavo (proksimume 6 megabajtoj) - Enhavo Estas Ankoraŭ Ŝarĝata Kion faras Kiwix? Kiwix estas senkonekta legilo de enhavo. Ĝi estas simila al TTT-legilo, sed anstataŭ legi retpaĝojn konektite, ĝi legas enhavon en ZIM-dosiero. Kiwix estis originale farita por senkonekta legado de Vikipedio, sed ĝi povas legi alian enhavon. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3311a5787..541a0fa52 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -92,7 +92,6 @@ Ningún video Ninguna conexión de red Usar la red para descargar la lista de contenido. (Aproximadamente 6MB) - Todavía está cargando el contenido ¿Qué hace Kiwix? 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. Si bien Kiwix se diseñó originalmente para proporcionar una Wikipedia sin conexión, también puede leer otros contenidos. diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 4acc4a6a1..10e662507 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -93,7 +93,6 @@ Bideorik ez Ez dago konexiorik Sarea erabili eduki zerrenda deskargatzeko. (6MB inguru) - Oraindik Edukia Kargatzen Zer egiten du Kiwix-ek? Kiwix konexio gabeko eduki irakurlea da. Nabigatzaile baten moduan erabiltzen da, baina sarean dauden web orrialdeetan sartu beharrean, ZIM formatoko edukia irakurtzen du. Nahiz eta, Kiwix, berez, Wikipedia konexiorik gabe erabiltzeko sortu, beste edukiak ere eskeintzen ditu. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 632ea9903..a974fba06 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -87,7 +87,6 @@ Ei videoita Ei verkkoyhteyttä Lataa sisältöluettelo käyttämällä verkkoa. (Noin 6 Mt) - Sisältö latautuu edelleen Mitä Kiwix tekee? Missä sisältö on? Sisältöämme ylläpidetään Kiwixin verkkosivulla. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 575f18b9e..bec4adc68 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -87,7 +87,6 @@ Aucune vidéo Aucune connexion réseau Utiliser le réseau pour télécharger la liste de contenu (environ 6Mo). - Le contenu est encore en cours de chargement Que fait Kiwix ? Kiwix est un lecteur de contenu hors connexion. Il agit quasiment comme un navigateur, mais au lieu d’accéder à des pages web en ligne, il lit le contenu depuis un fichier au format ZIM. Bien que Kiwix ait été conçu au départ pour fournir Wikipédia hors connexion, il lit aussi d’autre contenu. diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 7da74d98e..15b2ff0ba 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -91,7 +91,6 @@ Sen vídeos Ningunha conexión de rede Usar a rede para descargar a lista de contido. (Aproximadamente 6MB) - Aínda está cargando o contido Que fai Kiwix? 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. Se ben Kiwix deseñouse orixinalmente para proporcionar Wikipedia sen conexión, tamén pode ler outros contidos. diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index b6b3a18f8..0e3cc01a6 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -94,7 +94,6 @@ चलचित्र नहीं नेटवर्क कनेक्शन नहीं सामग्री सूची डाउनलोड करने के लिए नेटवर्क का उपयोग करें। (लगभग 6 एमबी - सामग्री अभी भी लोड हो रही किविक्स क्या करता है? किवीक्स ऑफ़लाइन सामग्री रीडर है यह एक ब्राउज़र की तरह बहुत ज्यादा काम करता है लेकिन ऑनलाइन वेब पेजों को एक्सेस करने के बजाय, यह ZIM प्रारूप में फ़ाइल से सामग्री पढ़ता है। जबकि किवीक्स को मूल रूप से विकिपीडिया ऑफ़लाइन उपलब्ध कराने के लिए डिज़ाइन किया गया है, यह अन्य सामग्री भी पढ़ता है। diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index a68852edb..bbd2dd62f 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -92,7 +92,6 @@ Nincsenek videók Nincs hálózati kapcsolat Használd a hálózatot a tartalomlista letöltéséhez. (Körülbelül 6MB) - A tartalom még töltődik Mit csinál a Kiwix? 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. Bár a Kiwix eredetileg az offline Wikipédia megvalósítására lett tervezve, más tartalmakat is olvas. diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 462fd8488..bdcb17cb0 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -94,7 +94,6 @@ 동영상 없음 네트워크 연결 없음 콘텐츠 목록의 다운로드를 위해 네트워크를 사용합니다. (약 6MB) - 내용을 계속 불러오고 있습니다 Kiwix의 역할이 무엇입니까? Kiwix는 오프라인 콘텐츠 리더입니다. 브라우저와 매우 비슷하게 동작하지만 온라인 웹 페이지에 접근하는 대신 ZIM 포맷의 파일로부터 내용을 읽습니다. Kiwix가 본래 오프라인 상태에서 위키백과를 제공하도록 설계되었으나 다른 콘텐츠도 읽을 수 있습니다. diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 965caa5fa..a7d62f456 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -94,7 +94,6 @@ Нема видеа Немате мрежна врска Користи мрежа за преземање на списокот содржини (прибл. 6 МБ) - Содржината сè уште се вчитува Што прави Kiwix? Kiwix е вонмрежен читач на содржини. Работи како прелистувач но чита содржини од податотека во ZIM-формат место од семрежјето. Иако Kiwix е првично предвиден како вонмрежен читач на Википедија, но сега чита и други содржини. diff --git a/app/src/main/res/values-ps/strings.xml b/app/src/main/res/values-ps/strings.xml index cfe6d62cc..aa069da62 100644 --- a/app/src/main/res/values-ps/strings.xml +++ b/app/src/main/res/values-ps/strings.xml @@ -60,7 +60,6 @@ اسان هيڅ دوتنه نشته هيڅ ويډيو نسته - منځپانګې تر وسه هم حرکت کوي تفریحي درونه انتظارول درول diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 1de129e5c..66de41c0f 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -93,7 +93,6 @@ Sem vídeos Nenhuma ligação de rede Usar a rede para descarregar a lista de conteúdos (aproximadamente 6 MB). - Ainda está a carregar o conteúdo O que faz o Kiwix? 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. Embora o Kiwix tenha sido originalmente desenhado para fornecer a Wikipédia offline, também lê outros conteúdos. diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 77bbe9808..910798571 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -91,7 +91,6 @@ Fără video Nu există conexiune de rețea Folosește rețeaua să descarci lista de conținut. (Aproximativ 6MB) - Conținutul încă se încarcă Ce face Kiwix? 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. În timp ce Kiwix a fost făcut inițial să ofere Wikipedia off-line de asemenea citește și alt conținut. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 572a83f91..606f888a8 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -94,7 +94,6 @@ Нет видео Отсутствует сетевое подключение Используйте сеть, чтобы загрузить список контента. (Около 6MB) - Содержимое Ещё Загружается Что делает Kiwix? Kiwix - это автономный контент-ридер. Он действует схоже с браузером, но вместо обращения к онлайн страницам, он считывает содержимое из файла в формате ZIM. Хотя Kiwix и был изначально разработан, чтобы просматривать Wikipedia офлайн, он также пригоден и для другого содержимого. diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 6ef6f6a76..9bc9d2e82 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -93,7 +93,6 @@ Perunu vìdeu Peruna connessione de retza Imprea sa retza pro iscarrigare sa lista de cuntenutos (pagu prus o mancu 6MB) - Cuntenutu galu in carrigamentu Ite faghet Kiwix? 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. Fintzas si Kiwix est istadu creadu, in orìgine, pro lèghere Wikipèdia chene lìnia, leghet fintzas àteros cuntenutos. diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 974f6c5cc..83b8eecf4 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -66,7 +66,6 @@ Enostavno Ni slik Ni videoposnetkov - Vsebina se še nalaga Shranjevanje Trenutna mapa premor diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index d2ffca389..157df2709 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -92,7 +92,6 @@ S\’ka Video S\’ka lidhje rrjeti Përdor rrjetin për shkarkim liste lënde. (Afërsisht 6MB) - Lëndë Ende Në Ngarkim Ç’kryen Kiwix-i? 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. 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. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 1bbf3db89..a12fc88c3 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -92,7 +92,6 @@ Inga videor Ingen nätverksanslutning Använd nätverket för att ladda ned innehållslistan. (Uppskattningsvis 6MB) - Läser fortfarande in innehåll Vad gör Kiwix? 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. Även om Kiwix ursprungligen skapades för att tillhandahålla Wikipedia offline läser den även annat innehåll. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c85eba2da..b8c41975c 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -94,7 +94,6 @@ Video yok Ağ bağlantısı yok İçerik listesini indirmek için ağı kullan. (Yaklaşık 6MB) - İçerik hâlâ yükleniyor Kiwix ne yapar? 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. Kiwix orijinalde Vikipedi\'yi çevrimdışı olarak okuması için tasarlanmış olsa da diğer içerikleri de okuyabilir. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 6f01bceb0..1a50a2c76 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -94,7 +94,6 @@ Немає відео Відсутнє з\'єднання з мережею Скористатись мережею, щоб завантажити список контенту (приблизно 6MБ) - Контент все ще завантажується Що робить Kiwix? Kiwix — це офлайновий читач контенту. Він багато в чому поводиться як браузер, але замість доступу до онлайнових веб-сторінок, він зчитує контент із файлу у форматі ZIM. Тоді як початково Kiwix було розроблено для забезпечення доступу до Вікіпедії в режимі офлайн, він також зчитує інші типи контенту. diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 3154ad3f8..ddbea8391 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -93,7 +93,6 @@ Không có video Không có kết nối mạng Dùng mạng để tải về danh sách nội dung (khoảng 6MB) - Vẫn đang tải nội dung Kiwix dùng để làm gì? 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. 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. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ef127b24c..c0fd5a58d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -99,7 +99,6 @@ No Videos No network connection Use network to download content list. (Approximately 6MB) - Content Still Loading What does Kiwix do? 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. While Kiwix has been originally designed to provide Wikipedia offline, it also reads other contents. @@ -148,8 +147,6 @@ Yesterday Automatically switch between day and night mode. Automated night mode - (%1$d) - (%s) Warn when entering external links Display popup to warn about additional costs or not working in offline links. Entering External Link @@ -188,7 +185,6 @@ Table of contents Select languages Save languages - Languages saved Send feedback Expand History @@ -259,4 +255,8 @@ No notes found for deletion Entire notes folder deleted Some files not deleted + + %d book + %d books + diff --git a/app/src/test/java/org/kiwix/kiwixmobile/TestModelFunctions.kt b/app/src/test/java/org/kiwix/kiwixmobile/TestModelFunctions.kt index 8e620aff5..e3d7bf09a 100644 --- a/app/src/test/java/org/kiwix/kiwixmobile/TestModelFunctions.kt +++ b/app/src/test/java/org/kiwix/kiwixmobile/TestModelFunctions.kt @@ -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.Pending 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.zim_manager.Language import org.kiwix.kiwixmobile.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk import java.io.File @@ -76,3 +78,19 @@ fun downloadModel( downloadId: Long = 1L, book: Book = 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) diff --git a/app/src/test/java/org/kiwix/kiwixmobile/language/adapter/LanguageDelegateTest.kt b/app/src/test/java/org/kiwix/kiwixmobile/language/adapter/LanguageDelegateTest.kt new file mode 100644 index 000000000..ff360c415 --- /dev/null +++ b/app/src/test/java/org/kiwix/kiwixmobile/language/adapter/LanguageDelegateTest.kt @@ -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 + * + * 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 . + */ + +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() + 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() + 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) + } + } +} diff --git a/app/src/test/java/org/kiwix/kiwixmobile/language/viewmodel/LanguageViewModelTest.kt b/app/src/test/java/org/kiwix/kiwixmobile/language/viewmodel/LanguageViewModelTest.kt new file mode 100644 index 000000000..53eda503a --- /dev/null +++ b/app/src/test/java/org/kiwix/kiwixmobile/language/viewmodel/LanguageViewModelTest.kt @@ -0,0 +1,157 @@ +/* + * Kiwix Android + * Copyright (C) 2018 Kiwix + * + * 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 . + */ + +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> = 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) + } +} diff --git a/app/src/test/java/org/kiwix/kiwixmobile/language/viewmodel/StateTest.kt b/app/src/test/java/org/kiwix/kiwixmobile/language/viewmodel/StateTest.kt new file mode 100644 index 000000000..5ff764151 --- /dev/null +++ b/app/src/test/java/org/kiwix/kiwixmobile/language/viewmodel/StateTest.kt @@ -0,0 +1,58 @@ +/* + * Kiwix Android + * Copyright (C) 2018 Kiwix + * + * 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 . + */ + +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")) + ) + ) + } + } +} diff --git a/app/src/test/java/org/kiwix/kiwixmobile/zim_manager/LanguageTest.kt b/app/src/test/java/org/kiwix/kiwixmobile/zim_manager/LanguageTest.kt new file mode 100644 index 000000000..3de941a95 --- /dev/null +++ b/app/src/test/java/org/kiwix/kiwixmobile/zim_manager/LanguageTest.kt @@ -0,0 +1,73 @@ +package org.kiwix.kiwixmobile.zim_manager + +/* + * Kiwix Android + * Copyright (C) 2018 Kiwix + * + * 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 . + */ + +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() + } + } +} diff --git a/app/src/test/java/org/kiwix/kiwixmobile/zim_manager/ZimManageViewModelTest.kt b/app/src/test/java/org/kiwix/kiwixmobile/zim_manager/ZimManageViewModelTest.kt index 75f95f0f6..c7821bad5 100644 --- a/app/src/test/java/org/kiwix/kiwixmobile/zim_manager/ZimManageViewModelTest.kt +++ b/app/src/test/java/org/kiwix/kiwixmobile/zim_manager/ZimManageViewModelTest.kt @@ -49,6 +49,7 @@ import org.kiwix.kiwixmobile.downloader.model.DownloadModel import org.kiwix.kiwixmobile.downloader.model.DownloadState import org.kiwix.kiwixmobile.downloader.model.DownloadStatus 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.Book import org.kiwix.kiwixmobile.resetSchedulers @@ -285,7 +286,7 @@ class ZimManageViewModelTest { languageCodeISO2 = "en" ) ), - Language(true, 1, "", "", "", "") + language(isActive = true, occurencesOfLanguage = 1) ) verify(exactly = 0) { newLanguagesDao.insert(any()) } } @@ -342,7 +343,7 @@ class ZimManageViewModelTest { Book().apply { language = "fra" } ), listOf(dbLanguage), - Language(true, 1, "", "", "", "") + language(isActive = true, occurencesOfLanguage = 1) ) verify { newLanguagesDao.insert( @@ -387,20 +388,6 @@ class ZimManageViewModelTest { .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 fun `library update removes from sources`() { every { downloader.queryStatus(any()) } returns emptyList() @@ -447,8 +434,8 @@ class ZimManageViewModelTest { books.onNext(listOf(bookOnDisk(book = bookAlreadyOnDisk))) languages.onNext( listOf( - Language(true, 1, "", "", "activeLanguage", ""), - Language(false, 1, "", "", "inactiveLanguage", "") + language(isActive = true, occurencesOfLanguage = 1, languageCode = "activeLanguage"), + language(isActive = false, occurencesOfLanguage = 1, languageCode = "inactiveLanguage") ) ) fileSystemStates.onNext(CanWrite4GbFile) @@ -482,7 +469,7 @@ class ZimManageViewModelTest { books.onNext(listOf()) languages.onNext( listOf( - Language(true, 1, "", "", "activeLanguage", "") + language(isActive = true, occurencesOfLanguage = 1, languageCode = "activeLanguage") ) ) fileSystemStates.onNext(CannotWrite4GbFile)