Skip to content
Permalink
Browse files
Merge pull request #11346 from t895/grid-settings
Android: Move game grid options to MainActivity
  • Loading branch information
lioncash committed Dec 20, 2022
2 parents b59a5c8 + 6090694 commit 46bc212
Show file tree
Hide file tree
Showing 16 changed files with 337 additions and 20 deletions.
@@ -324,10 +324,6 @@ private void addInterfaceSettings(ArrayList<SettingsItem> sl)
R.string.panic_handlers, R.string.panic_handlers_description));
sl.add(new SwitchSetting(mContext, BooleanSetting.MAIN_OSD_MESSAGES, R.string.osd_messages,
R.string.osd_messages_description));
sl.add(new SwitchSetting(mContext, BooleanSetting.MAIN_USE_GAME_COVERS,
R.string.download_game_covers, 0));
sl.add(new SwitchSetting(mContext, BooleanSetting.MAIN_SHOW_GAME_TITLES,
R.string.show_titles_in_game_list, R.string.show_titles_in_game_list_description));

AbstractIntSetting appTheme = new AbstractIntSetting()
{
@@ -0,0 +1,124 @@
package org.dolphinemu.dolphinemu.fragments

import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import android.view.LayoutInflater
import android.view.ViewGroup
import android.os.Bundle
import android.view.View
import com.google.android.material.bottomsheet.BottomSheetBehavior
import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting
import android.widget.CompoundButton
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.bottomsheet.BottomSheetDialog
import org.dolphinemu.dolphinemu.databinding.FragmentGridOptionsBinding
import org.dolphinemu.dolphinemu.databinding.FragmentGridOptionsTvBinding
import org.dolphinemu.dolphinemu.features.settings.model.NativeConfig
import org.dolphinemu.dolphinemu.ui.main.MainView

class GridOptionDialogFragment : BottomSheetDialogFragment() {

private lateinit var mView: MainView

private var _mBindingMobile: FragmentGridOptionsBinding? = null
private var _mBindingTv: FragmentGridOptionsTvBinding? = null

// This property is only valid between onCreateView and
// onDestroyView.
private val mBindingMobile get() = _mBindingMobile!!
private val mBindingTv get() = _mBindingTv!!

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
mView = (activity as MainView)

if (activity is AppCompatActivity)
{
_mBindingMobile = FragmentGridOptionsBinding.inflate(inflater, container, false)
return mBindingMobile.root
}
_mBindingTv = FragmentGridOptionsTvBinding.inflate(inflater, container, false)
return mBindingTv.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
if (activity is AppCompatActivity) {
setUpCoverButtons()
setUpTitleButtons()

// Pins fragment to the top of the dialog ensures the dialog is expanded in landscape by default
BottomSheetBehavior.from<View>(mBindingMobile.gridSheet).state =
BottomSheetBehavior.STATE_EXPANDED
dialog?.setOnShowListener {
val dialog = it as BottomSheetDialog
mBindingMobile.gridSheet.let { sheet ->
dialog.behavior.peekHeight = sheet.height
}
}
} else {
setUpCoverButtonsTv()

// Pins fragment to the top of the dialog ensures the dialog is expanded in landscape by default
BottomSheetBehavior.from<View>(mBindingTv.gridSheet).state =
BottomSheetBehavior.STATE_EXPANDED
dialog?.setOnShowListener {
val dialog = it as BottomSheetDialog
mBindingTv.gridSheet.let { sheet ->
dialog.behavior.peekHeight = sheet.height
}
}
}
}

override fun onDestroyView() {
super.onDestroyView()
_mBindingMobile = null
_mBindingTv = null
}

private fun setUpCoverButtons() {
mBindingMobile.switchDownloadCovers.isChecked =
BooleanSetting.MAIN_USE_GAME_COVERS.booleanGlobal
mBindingMobile.rootDownloadCovers.setOnClickListener {
mBindingMobile.switchDownloadCovers.isChecked = !mBindingMobile.switchDownloadCovers.isChecked
}
mBindingMobile.switchDownloadCovers.setOnCheckedChangeListener { _: CompoundButton, _: Boolean ->
BooleanSetting.MAIN_USE_GAME_COVERS.setBooleanGlobal(
NativeConfig.LAYER_BASE,
mBindingMobile.switchDownloadCovers.isChecked
)
mView.reloadGrid()
}
}

private fun setUpTitleButtons() {
mBindingMobile.switchShowTitles.isChecked = BooleanSetting.MAIN_SHOW_GAME_TITLES.booleanGlobal
mBindingMobile.rootShowTitles.setOnClickListener {
mBindingMobile.switchShowTitles.isChecked = !mBindingMobile.switchShowTitles.isChecked
}
mBindingMobile.switchShowTitles.setOnCheckedChangeListener { _: CompoundButton, _: Boolean ->
BooleanSetting.MAIN_SHOW_GAME_TITLES.setBooleanGlobal(
NativeConfig.LAYER_BASE,
mBindingMobile.switchShowTitles.isChecked
)
mView.reloadGrid()
}
}

// TODO: Remove this when leanback is removed
private fun setUpCoverButtonsTv() {
mBindingTv.switchDownloadCovers.isChecked =
BooleanSetting.MAIN_USE_GAME_COVERS.booleanGlobal
mBindingTv.rootDownloadCovers.setOnClickListener {
mBindingTv.switchDownloadCovers.isChecked = !mBindingTv.switchDownloadCovers.isChecked
}
mBindingTv.switchDownloadCovers.setOnCheckedChangeListener { _: CompoundButton, _: Boolean ->
BooleanSetting.MAIN_USE_GAME_COVERS.setBooleanGlobal(
NativeConfig.LAYER_BASE,
mBindingTv.switchDownloadCovers.isChecked
)
mView.reloadGrid()
}
}
}
@@ -24,6 +24,7 @@
import com.google.android.material.color.MaterialColors;
import com.google.android.material.tabs.TabLayout;

import org.dolphinemu.dolphinemu.fragments.GridOptionDialogFragment;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.activities.EmulationActivity;
import org.dolphinemu.dolphinemu.adapters.PlatformPagerAdapter;
@@ -123,10 +124,6 @@ protected void onResume()
}

mPresenter.onResume();

// In case the user changed a setting that affects how games are displayed,
// such as system language, cover downloading...
forEachPlatformGamesView(PlatformGamesView::refetchMetadata);
}

@Override
@@ -333,6 +330,18 @@ public void showGames()
forEachPlatformGamesView(PlatformGamesView::showGames);
}

@Override
public void reloadGrid()
{
forEachPlatformGamesView(PlatformGamesView::refetchMetadata);
}

@Override
public void showGridOptions()
{
new GridOptionDialogFragment().show(getSupportFragmentManager(), "gridOptions");
}

private void forEachPlatformGamesView(Action1<PlatformGamesView> action)
{
for (Platform platform : Platform.values())
@@ -94,6 +94,10 @@ public boolean handleOptionSelection(int itemId, ComponentActivity activity)
mView.launchSettingsActivity(MenuTag.SETTINGS);
return true;

case R.id.menu_grid_options:
mView.showGridOptions();
return true;

case R.id.menu_refresh:
mView.setRefreshing(true);
GameFileCacheManager.startRescan();
@@ -34,4 +34,8 @@
* To be called when the game file cache is updated.
*/
void showGames();

void reloadGrid();

void showGridOptions();
}
@@ -19,6 +19,7 @@
import androidx.leanback.widget.ListRowPresenter;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import org.dolphinemu.dolphinemu.fragments.GridOptionDialogFragment;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.activities.EmulationActivity;
import org.dolphinemu.dolphinemu.adapters.GameRowPresenter;
@@ -87,10 +88,6 @@ protected void onResume()
}

mPresenter.onResume();

// In case the user changed a setting that affects how games are displayed,
// such as system language, cover downloading...
refetchMetadata();
}

@Override
@@ -217,14 +214,21 @@ public void showGames()
buildRowsAdapter();
}

private void refetchMetadata()
@Override
public void reloadGrid()
{
for (ArrayObjectAdapter row : mGameRows)
{
row.notifyArrayItemRangeChanged(0, row.size());
}
}

@Override
public void showGridOptions()
{
new GridOptionDialogFragment().show(getSupportFragmentManager(), "gridOptions");
}

/**
* Callback from AddDirectoryActivity. Applies any changes necessary to the GameGridActivity.
*
@@ -370,6 +374,10 @@ private ListRow buildSettingsRow()
R.drawable.ic_add_tv,
R.string.add_directory_title));

rowItems.add(new TvSettingsItem(R.id.menu_grid_options,
R.drawable.ic_list_tv,
R.string.grid_menu_grid_options));

rowItems.add(new TvSettingsItem(R.id.menu_refresh,
R.drawable.ic_refresh_tv,
R.string.grid_menu_refresh));
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="?attr/colorControlNormal"
android:pathData="M10,18h4v-2h-4v2zM3,6v2h18L21,6L3,6zM6,13h12v-2L6,11v2z" />
</vector>
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="@android:color/white"
android:pathData="M10,18h4v-2h-4v2zM3,6v2h18L21,6L3,6zM6,13h12v-2L6,11v2z" />
</vector>
@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/grid_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/spacing_xtralarge"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

<com.google.android.material.bottomsheet.BottomSheetDragHandleView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"/>

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/root_download_covers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true">

<TextView
android:id="@+id/text_download_covers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:text="@string/download_game_covers"
app:layout_constraintBottom_toBottomOf="@+id/switch_download_covers"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/switch_download_covers" />

<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switch_download_covers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="24dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/root_show_titles"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true">

<TextView
android:id="@+id/text_show_titles"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:text="@string/show_titles_in_game_list"
app:layout_constraintBottom_toBottomOf="@+id/switch_show_titles"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/switch_show_titles" />

<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switch_show_titles"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="24dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.appcompat.widget.LinearLayoutCompat>

</androidx.coordinatorlayout.widget.CoordinatorLayout>
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/grid_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/root_download_covers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingTop="@dimen/spacing_xtralarge"
android:paddingBottom="@dimen/spacing_xtralarge"
android:clickable="true"
android:focusable="true">

<TextView
android:id="@+id/text_download_covers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:text="@string/download_game_covers"
app:layout_constraintBottom_toBottomOf="@+id/switch_download_covers"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/switch_download_covers" />

<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/switch_download_covers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="24dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.appcompat.widget.LinearLayoutCompat>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

0 comments on commit 46bc212

Please sign in to comment.