Add touch feedback to GameGridActivity and AddDirectoryActivity.

This commit is contained in:
Eder Bastos 2015-05-10 10:29:29 -04:00
parent 24c6be9d0f
commit 3f1465196c
7 changed files with 145 additions and 112 deletions

View File

@ -4,6 +4,7 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.model.FileListItem;
@ -102,8 +103,14 @@ public class FileAdapter extends RecyclerView.Adapter<FileViewHolder> implements
return mFileList.size();
}
/**
* When a file is clicked, determine if it is a directory; if it is, show that new directory's
* contents. If it is not, end the activity successfully.
*
* @param view
*/
@Override
public void onClick(View view)
public void onClick(final View view)
{
String path = (String) view.getTag();
@ -111,8 +118,26 @@ public class FileAdapter extends RecyclerView.Adapter<FileViewHolder> implements
if (clickedFile.isDirectory())
{
mFileList = generateFileList(clickedFile);
notifyDataSetChanged();
final ArrayList<FileListItem> fileList = generateFileList(clickedFile);
if (fileList.isEmpty())
{
Toast.makeText(view.getContext(), R.string.add_directory_empty_folder, Toast.LENGTH_SHORT).show();
} else
{
// Delay the loading of the new directory to give a little bit of time for UI feedback
// to happen. Hacky, but good enough for now; this is necessary because we're modifying
// the RecyclerView's contents, rather than constructing a new one.
view.getHandler().postDelayed(new Runnable()
{
@Override
public void run()
{
mFileList = fileList;
notifyDataSetChanged();
}
}, 200);
}
} else
{
// Pass the activity the path of the parent directory of the clicked file.
@ -120,6 +145,12 @@ public class FileAdapter extends RecyclerView.Adapter<FileViewHolder> implements
}
}
/**
* For a given directory, return a list of Files it contains.
*
* @param directory
* @return
*/
private ArrayList<FileListItem> generateFileList(File directory)
{
File[] children = directory.listFiles();
@ -145,6 +176,12 @@ public class FileAdapter extends RecyclerView.Adapter<FileViewHolder> implements
return mPath;
}
/**
* Mostly just allows the activity's menu option to kick us up a level in the directory
* structure.
*
* @param path
*/
public void setPath(String path)
{
mPath = path;
@ -154,8 +191,11 @@ public class FileAdapter extends RecyclerView.Adapter<FileViewHolder> implements
notifyDataSetChanged();
}
public static interface FileClickListener
/**
* Callback for when the user wants to add the visible directory to the library.
*/
public interface FileClickListener
{
public void finishSuccessfully();
void finishSuccessfully();
}
}

View File

@ -1,5 +1,7 @@
package org.dolphinemu.dolphinemu.adapters;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
@ -9,12 +11,16 @@ import android.view.ViewGroup;
import com.squareup.picasso.Picasso;
import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.dialogs.GameDetailsDialog;
import org.dolphinemu.dolphinemu.emulation.EmulationActivity;
import org.dolphinemu.dolphinemu.model.Game;
import org.dolphinemu.dolphinemu.viewholders.GameViewHolder;
import java.util.ArrayList;
public class GameAdapter extends RecyclerView.Adapter<GameViewHolder>
public class GameAdapter extends RecyclerView.Adapter<GameViewHolder> implements
View.OnClickListener,
View.OnLongClickListener
{
private ArrayList<Game> mGameList;
@ -42,6 +48,9 @@ public class GameAdapter extends RecyclerView.Adapter<GameViewHolder>
View gameCard = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_game, parent, false);
gameCard.setOnClickListener(this);
gameCard.setOnLongClickListener(this);
// Use that view to create a ViewHolder.
GameViewHolder holder = new GameViewHolder(gameCard);
return holder;
@ -74,7 +83,6 @@ public class GameAdapter extends RecyclerView.Adapter<GameViewHolder>
{
holder.textDescription.setText(game.getDescription());
}
holder.buttonDetails.setTag(game.getGameId());
holder.path = game.getPath();
holder.screenshotPath = game.getScreenPath();
@ -92,6 +100,45 @@ public class GameAdapter extends RecyclerView.Adapter<GameViewHolder>
return mGameList.size();
}
/**
* Launches the game that was clicked on.
*
* @param view The card representing the game the user wants to play.
*/
@Override
public void onClick(View view)
{
GameViewHolder holder = (GameViewHolder) view.getTag();
// Start the emulation activity and send the path of the clicked ISO to it.
Intent intent = new Intent(view.getContext(), EmulationActivity.class);
intent.putExtra("SelectedGame", holder.path);
view.getContext().startActivity(intent);
}
/**
* Launches the details activity for this Game, using an ID stored in the
* details button's Tag.
*
* @param view The Card button that was long-clicked.
*/
@Override
public boolean onLongClick(View view)
{
GameViewHolder holder = (GameViewHolder) view.getTag();
// Get the ID of the game we want to look at.
// TODO This should be all we need to pass in, eventually.
// String gameId = (String) holder.gameId;
Activity activity = (Activity) view.getContext();
GameDetailsDialog.newInstance(holder.game).show(activity.getFragmentManager(), "game_details");
return true;
}
public static class SpacesItemDecoration extends RecyclerView.ItemDecoration
{
private int space;
@ -108,7 +155,6 @@ public class GameAdapter extends RecyclerView.Adapter<GameViewHolder>
outRect.right = space;
outRect.bottom = space;
outRect.top = space;
}
}

View File

@ -19,7 +19,6 @@ public class GameViewHolder extends RecyclerView.ViewHolder
public ImageView imageScreenshot;
public TextView textGameTitle;
public TextView textDescription;
public ImageButton buttonDetails;
// Used to handle onClick(). Set this in onBindViewHolder().
public String path;
@ -30,54 +29,10 @@ public class GameViewHolder extends RecyclerView.ViewHolder
{
super(itemView);
itemView.setOnClickListener(mCardClickListener);
itemView.setTag(this);
imageScreenshot = (ImageView) itemView.findViewById(R.id.image_game_screen);
textGameTitle = (TextView) itemView.findViewById(R.id.text_game_title);
textDescription = (TextView) itemView.findViewById(R.id.text_game_description);
buttonDetails = (ImageButton) itemView.findViewById(R.id.button_details);
buttonDetails.setOnClickListener(mDetailsButtonListener);
}
private View.OnClickListener mCardClickListener = new View.OnClickListener()
{
/**
* Launches the game that was clicked on.
*
* @param view The card representing the game the user wants to play.
*/
@Override
public void onClick(View view)
{
// Start the emulation activity and send the path of the clicked ROM to it.
Intent intent = new Intent(view.getContext(), EmulationActivity.class);
intent.putExtra("SelectedGame", path);
view.getContext().startActivity(intent);
}
};
private View.OnClickListener mDetailsButtonListener = new View.OnClickListener()
{
/**
* Launches the details activity for this Game, using an ID stored in the
* details button's Tag.
*
* @param view The Details button that was clicked on.
*/
@Override
public void onClick(View view)
{
// Get the ID of the game we want to look at.
// TODO This should be all we need to pass in, eventually.
// String gameId = (String) view.getTag();
Activity activity = (Activity) view.getContext();
GameDetailsDialog.newInstance(game).show(activity.getFragmentManager(), "game_details");
}
};
}

View File

@ -2,9 +2,14 @@
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="200dp"
android:layout_height="250dp"
android:transitionName="card_game">
android:layout_width="0dp"
tools:layout_width="224dp"
android:layout_height="256dp"
android:transitionName="card_game"
android:focusable="true"
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
>
<LinearLayout
android:layout_width="match_parent"
@ -17,53 +22,37 @@
android:layout_height="0dp"
android:transitionName="image_game_screen"
android:layout_weight="1"
tools:src="@drawable/placeholder_screenshot"/>
tools:src="@drawable/placeholder_screenshot"
tools:scaleType="centerCrop"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="72dp">
<TextView
android:id="@+id/text_game_title"
style="@android:style/TextAppearance.Material.Subhead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="16dp"
android:layout_toStartOf="@+id/button_details"
android:ellipsize="end"
android:lines="1"
android:maxLines="1"
tools:text="The Legend of Zelda: The Wind Waker"/>
<TextView
android:id="@+id/text_game_description"
style="@android:style/TextAppearance.Material.Caption"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="8dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:ellipsize="end"
android:lines="1"
android:maxLines="1"
tools:text="Zany rhythm action!"/>
<TextView
android:id="@+id/text_game_title"
style="@android:style/TextAppearance.Material.Subhead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@+id/image_game_screen"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_toStartOf="@+id/button_details"
android:ellipsize="end"
android:lines="1"
android:maxLines="1"
tools:text="Rhythm Heaven Fever"/>
<TextView
android:id="@+id/text_game_description"
style="@android:style/TextAppearance.Material.Caption"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/text_game_title"
android:layout_alignParentBottom="true"
android:layout_alignStart="@+id/text_game_title"
android:layout_marginBottom="16dp"
android:layout_toStartOf="@+id/button_details"
android:ellipsize="end"
android:lines="1"
android:maxLines="1"
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus sed odio vel quam auctor euismod. Pellentesque odio nibh, fermentum ut hendrerit id, ultrices et justo. "
tools:text="Zany rhythm action!"/>
<ImageButton
android:id="@+id/button_details"
style="@android:style/Widget.Material.Light.Button.Borderless.Small"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentEnd="true"
android:layout_alignTop="@+id/text_game_title"
android:src="@drawable/ic_action_overflow"/>
</RelativeLayout>
</LinearLayout>
</android.support.v7.widget.CardView>

View File

@ -1,30 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="56dp">
android:layout_height="56dp"
android:background="?android:attr/selectableItemBackground"
android:orientation="horizontal">
<ImageView
android:id="@+id/image_type"
android:background="@drawable/oval_ripple_grey"
tools:src="@drawable/ic_wii"
android:layout_gravity="center_vertical"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:padding="4dp"/>
android:background="@drawable/oval_ripple_grey"
android:padding="4dp"
tools:src="@drawable/ic_wii"/>
<TextView
android:id="@+id/text_file_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
tools:text="File Name"
android:layout_weight="1"
android:textSize="16sp"
android:layout_gravity="center_vertical"
android:id="@+id/text_file_name"/>
tools:text="File Name"/>
</LinearLayout>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- TODO Please give me an icon! -->
<item
android:id="@+id/menu_up_one_level"
android:title="@string/add_directory_up_one_level"

View File

@ -221,6 +221,7 @@
<string name="other">Other</string>
<string name="add_directory_title">Add Directory to Library</string>
<string name="add_directory_title">Add Folder to Library</string>
<string name="add_directory_up_one_level">Up one level</string>
<string name="add_directory_empty_folder">That folder is empty.</string>
</resources>