diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/platform/PlatformGamesFragment.java b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/platform/PlatformGamesFragment.java
deleted file mode 100644
index 2d74f43caa..0000000000
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/platform/PlatformGamesFragment.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.yuzu.yuzu_emu.ui.platform;
-
-import android.database.Cursor;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
-import android.widget.TextView;
-
-import androidx.core.content.ContextCompat;
-import androidx.fragment.app.Fragment;
-import androidx.recyclerview.widget.GridLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-
-import org.yuzu.yuzu_emu.NativeLibrary;
-import org.yuzu.yuzu_emu.YuzuApplication;
-import org.yuzu.yuzu_emu.R;
-import org.yuzu.yuzu_emu.adapters.GameAdapter;
-import org.yuzu.yuzu_emu.model.GameDatabase;
-
-public final class PlatformGamesFragment extends Fragment implements PlatformGamesView {
-    private PlatformGamesPresenter mPresenter = new PlatformGamesPresenter(this);
-
-    private GameAdapter mAdapter;
-    private RecyclerView mRecyclerView;
-    private TextView mTextView;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        View rootView = inflater.inflate(R.layout.fragment_grid, container, false);
-
-        findViews(rootView);
-
-        mPresenter.onCreateView();
-
-        return rootView;
-    }
-
-    @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
-        mAdapter = new GameAdapter();
-
-        // Organize our grid layout based on the current view.
-        if (isAdded()) {
-            view.getViewTreeObserver()
-                    .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
-                        @Override
-                        public void onGlobalLayout() {
-                            if (view.getMeasuredWidth() == 0) {
-                                return;
-                            }
-
-                            int columns = view.getMeasuredWidth() /
-                                    requireContext().getResources().getDimensionPixelSize(R.dimen.card_width);
-                            if (columns == 0) {
-                                columns = 1;
-                            }
-                            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
-                            GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), columns);
-                            mRecyclerView.setLayoutManager(layoutManager);
-                            mRecyclerView.setAdapter(mAdapter);
-                        }
-                    });
-        }
-
-        // Add swipe down to refresh gesture
-        final SwipeRefreshLayout pullToRefresh = view.findViewById(R.id.swipe_refresh);
-        pullToRefresh.setOnRefreshListener(() -> {
-            refresh();
-            pullToRefresh.setRefreshing(false);
-        });
-    }
-
-    @Override
-    public void refresh() {
-        GameDatabase databaseHelper = YuzuApplication.databaseHelper;
-        databaseHelper.scanLibrary(databaseHelper.getWritableDatabase());
-        mPresenter.refresh();
-        updateTextView();
-    }
-
-    @Override
-    public void showGames(Cursor games) {
-        if (mAdapter != null) {
-            mAdapter.swapCursor(games);
-        }
-        updateTextView();
-    }
-
-    private void updateTextView() {
-        mTextView.setVisibility(mAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
-    }
-
-    private void findViews(View root) {
-        mRecyclerView = root.findViewById(R.id.grid_games);
-        mTextView = root.findViewById(R.id.gamelist_empty_text);
-    }
-}
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/platform/PlatformGamesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/platform/PlatformGamesFragment.kt
new file mode 100644
index 0000000000..9ceea8b3f6
--- /dev/null
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/platform/PlatformGamesFragment.kt
@@ -0,0 +1,94 @@
+package org.yuzu.yuzu_emu.ui.platform
+
+import android.database.Cursor
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.view.ViewTreeObserver.OnGlobalLayoutListener
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+import org.yuzu.yuzu_emu.R
+import org.yuzu.yuzu_emu.YuzuApplication
+import org.yuzu.yuzu_emu.adapters.GameAdapter
+
+class PlatformGamesFragment : Fragment(), PlatformGamesView {
+    private val presenter = PlatformGamesPresenter(this)
+    private var adapter: GameAdapter? = null
+    private lateinit var recyclerView: RecyclerView
+    private lateinit var textView: TextView
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        val rootView = inflater.inflate(R.layout.fragment_grid, container, false)
+        findViews(rootView)
+        presenter.onCreateView()
+        return rootView
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        adapter = GameAdapter()
+
+        // Organize our grid layout based on the current view.
+        if (isAdded) {
+            view.viewTreeObserver
+                .addOnGlobalLayoutListener(object : OnGlobalLayoutListener {
+                    override fun onGlobalLayout() {
+                        if (view.measuredWidth == 0) {
+                            return
+                        }
+                        var columns = view.measuredWidth /
+                                requireContext().resources.getDimensionPixelSize(R.dimen.card_width)
+                        if (columns == 0) {
+                            columns = 1
+                        }
+                        view.viewTreeObserver.removeOnGlobalLayoutListener(this)
+                        val layoutManager = GridLayoutManager(activity, columns)
+                        recyclerView.layoutManager = layoutManager
+                        recyclerView.adapter = adapter
+                    }
+                })
+        }
+
+        // Add swipe down to refresh gesture
+        val pullToRefresh = view.findViewById<SwipeRefreshLayout>(R.id.swipe_refresh)
+        pullToRefresh.setOnRefreshListener {
+            refresh()
+            pullToRefresh.isRefreshing = false
+        }
+    }
+
+    override fun refresh() {
+        val databaseHelper = YuzuApplication.databaseHelper
+        databaseHelper!!.scanLibrary(databaseHelper.writableDatabase)
+        presenter.refresh()
+        updateTextView()
+    }
+
+    override fun showGames(games: Cursor) {
+        if (adapter != null) {
+            adapter!!.swapCursor(games)
+        }
+        updateTextView()
+    }
+
+    private fun updateTextView() {
+        textView.visibility =
+            if (adapter!!.itemCount == 0) View.VISIBLE else View.GONE
+    }
+
+    private fun findViews(root: View) {
+        recyclerView = root.findViewById(R.id.grid_games)
+        textView = root.findViewById(R.id.gamelist_empty_text)
+    }
+
+    companion object {
+        const val TAG = "PlatformGamesFragment"
+    }
+}