Skip to content

Commit

Permalink
chat input
Browse files Browse the repository at this point in the history
  • Loading branch information
weihuoya committed Aug 20, 2021
1 parent a7f5ee1 commit d5022db
Show file tree
Hide file tree
Showing 15 changed files with 242 additions and 29 deletions.
10 changes: 7 additions & 3 deletions src/android/app/src/main/java/org/citra/emu/model/GameFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,11 @@ public boolean isInstalled() {
}

public boolean isInstalledApp() {
return isInstalled() && (getPath().contains("/title/00040000/") || getPath().contains("/title/00040010/"));
return isInstalled() && isAppPath(getPath());
}

public boolean isInstalledDLC() {
return isInstalled() && !getPath().contains("/title/00040000/") && !getPath().contains("/title/00040010/");
return isInstalled() && !isAppPath(getPath());
}

public String getPath() {
Expand Down Expand Up @@ -149,7 +149,11 @@ public static void loadTitleDB(InputStream db) {
}
}
} catch (IOException e) {

// ignore
}
}

public static boolean isAppPath(String path) {
return path.contains("/title/00040000/") || path.contains("/title/00040010/") || path.contains("/title/00040030/");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -269,8 +269,7 @@ public boolean onOptionsItemSelected(MenuItem item) {

private void toggleListView(boolean isShowList) {
if (isShowList) {
InputMethodManager imm =
(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm = getSystemService(InputMethodManager.class);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
mListView.setVisibility(View.VISIBLE);
mEditor.setVisibility(View.INVISIBLE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,31 +187,25 @@ public boolean dispatchKeyEvent(KeyEvent event) {
int action;
switch (event.getAction()) {
case KeyEvent.ACTION_DOWN:
// Handling the case where the back button is pressed.
if (button == KeyEvent.KEYCODE_BACK) {
onBackPressed();
return true;
}
// Normal key events.
action = NativeLibrary.ButtonState.PRESSED;
break;
case KeyEvent.ACTION_UP:
action = NativeLibrary.ButtonState.RELEASED;
break;
default:
return false;
return super.dispatchKeyEvent(event);
}

if (input != null)
return NativeLibrary.KeyEvent(button, action);
else
return false;
if (input != null && NativeLibrary.KeyEvent(button, action)) {
return true;
} else
return super.dispatchKeyEvent(event);
}

@Override
public boolean dispatchGenericMotionEvent(MotionEvent event) {
if (mMenuVisible) {
return false;
return super.dispatchGenericMotionEvent(event);
}

if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0)) {
Expand Down
123 changes: 123 additions & 0 deletions src/android/app/src/main/java/org/citra/emu/ui/EmulationFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,21 @@
import android.os.Handler;
import android.view.Choreographer;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethod;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

Expand All @@ -29,6 +36,7 @@
import org.citra.emu.overlay.InputOverlay;
import org.citra.emu.overlay.LassoOverlay;
import org.citra.emu.overlay.ResizeOverlay;
import org.citra.emu.utils.NetPlayManager;
import org.citra.emu.utils.TranslateHelper;

import java.util.ArrayList;
Expand Down Expand Up @@ -56,6 +64,10 @@ public final class EmulationFragment extends Fragment implements SurfaceHolder.C
private ProgressBar mProgressBar;
private Button mBtnDone;

private LinearLayout mChatLayout;
private EditText mChatEditText;
private ImageButton mBtnChatSend;

private List<String> mMessageList;
private Handler mTaskHandler;

Expand Down Expand Up @@ -125,6 +137,7 @@ public void onCreate(Bundle savedInstanceState) {
mState = EmulationState.STOPPED;
}

@SuppressLint("ClickableViewAccessibility")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Expand Down Expand Up @@ -158,6 +171,95 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
stopConfiguringLayout();
});

mChatLayout = contents.findViewById(R.id.chat_input);
if (!NetPlayManager.NetPlayIsJoined()) {
mChatLayout.setVisibility(View.GONE);
}
mChatLayout.setOnTouchListener(new View.OnTouchListener() {
private int prevX;
private int prevY;
private int leftMargin;
private int topMargin;
private FrameLayout.LayoutParams params;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE: {
final int currX = (int)event.getRawX();
final int currY = (int)event.getRawY();
//params.leftMargin = leftMargin + currX - prevX;
params.topMargin = topMargin + currY - prevY;
v.setLayoutParams(params);
return true;
}
case MotionEvent.ACTION_UP: {
return true;
}
case MotionEvent.ACTION_DOWN: {
prevX = (int) event.getRawX();
prevY = (int) event.getRawY();
params = (FrameLayout.LayoutParams)v.getLayoutParams();
leftMargin = params.leftMargin;
topMargin = params.topMargin;
return true;
}
}
return false;
}
});

mBtnChatSend = contents.findViewById(R.id.chat_send_button);
mBtnChatSend.setOnTouchListener(new View.OnTouchListener() {
private int prevX;
private int prevY;
private int leftMargin;
private int topMargin;
private FrameLayout.LayoutParams params;
private long touchtime;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE: {
final int currX = (int)event.getRawX();
final int currY = (int)event.getRawY();
//params.leftMargin = leftMargin + currX - prevX;
params.topMargin = topMargin + currY - prevY;
mChatLayout.setLayoutParams(params);
return true;
}
case MotionEvent.ACTION_UP: {
if (System.currentTimeMillis() - touchtime < 100) {
toggleInput();
}
return true;
}
case MotionEvent.ACTION_DOWN: {
prevX = (int) event.getRawX();
prevY = (int) event.getRawY();
params = (FrameLayout.LayoutParams)mChatLayout.getLayoutParams();
leftMargin = params.leftMargin;
topMargin = params.topMargin;
touchtime = System.currentTimeMillis();
return true;
}
}
return false;
}
});

mChatEditText = contents.findViewById(R.id.chat_text_input);
mChatEditText.setOnEditorActionListener((view, action, event) -> {
if (action == EditorInfo.IME_ACTION_SEND) {
String name = NetPlayManager.GetUsername(getActivity());
String msg = view.getText().toString();
addNetPlayMessage(name + ": " + msg);
NetPlayManager.NetPlaySendMessage(msg);
view.setText("");
return true;
}
return false;
});

return contents;
}

Expand Down Expand Up @@ -246,6 +348,25 @@ public void onGlobalLayout() {
});
}

private void toggleInput() {
float alpha = mChatLayout.getAlpha();
final Activity activity = getActivity();
final View decor = activity.getWindow().getDecorView();
InputMethodManager imm = activity.getSystemService(InputMethodManager.class);

if (alpha > 0.5f) {
mChatEditText.clearFocus();
mChatEditText.setVisibility(View.GONE);
mChatLayout.animate().alpha(0.5f).setDuration(500).start();
imm.hideSoftInputFromWindow(decor.getWindowToken(), 0);
} else {
mChatLayout.animate().alpha(1.0f).setDuration(500).start();
mChatEditText.setVisibility(View.VISIBLE);
mChatEditText.requestFocus();
imm.showSoftInput(mChatEditText, InputMethod.SHOW_FORCED);
}
}

public void setTranslateProgress(int progress) {
layoutTranslateText();
if (progress == TASK_PROGRESS_BAIDUOCR0) {
Expand Down Expand Up @@ -399,6 +520,8 @@ public void addNetPlayMessage(String msg) {
return;
}

mChatLayout.setVisibility(NetPlayManager.NetPlayIsJoined() ? View.VISIBLE : View.GONE);

if (mMessageList == null) {
mMessageList = new ArrayList<>();
mTaskHandler = new Handler(getMainLooper());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -532,7 +532,6 @@ public class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolder> {
private int mHideInputOverlay;
private int mControllerScale;
private int mControllerAlpha;
private int mEmulateMotionByTouch;
private ArrayList<SettingsItem> mSettings;

public void loadMainMenu() {
Expand All @@ -543,11 +542,11 @@ public void loadMainMenu() {
mSettings.add(new SettingsItem(SettingsItem.SETTING_ROTATE_SCREEN, R.string.emulation_screen_rotation, SettingsItem.TYPE_TEXT, 0));
mSettings.add(new SettingsItem(SettingsItem.SETTING_CHEAT_CODE, R.string.menu_cheat_code, SettingsItem.TYPE_TEXT, 0));
mSettings.add(new SettingsItem(SettingsItem.SETTING_MEMORY_VIEWER, R.string.emulation_memory_search, SettingsItem.TYPE_TEXT, 0));
mSettings.add(new SettingsItem(SettingsItem.SETTING_LOAD_SUBMENU, R.string.multiplayer, SettingsItem.TYPE_TEXT, MENU_MULTIPLAYER));
mSettings.add(new SettingsItem(SettingsItem.SETTING_EDIT_SCREEN, R.string.emulation_screen_layout, SettingsItem.TYPE_TEXT, 0));
if (TranslateHelper.BaiduOCRToken != null) {
mSettings.add(new SettingsItem(SettingsItem.SETTING_LOAD_SUBMENU, R.string.translate_settings, SettingsItem.TYPE_TEXT, MENU_TRANSLATE));
}
mSettings.add(new SettingsItem(SettingsItem.SETTING_LOAD_SUBMENU, R.string.multiplayer, SettingsItem.TYPE_TEXT, MENU_MULTIPLAYER));
mSettings.add(new SettingsItem(SettingsItem.SETTING_EDIT_SCREEN, R.string.emulation_screen_layout, SettingsItem.TYPE_TEXT, 0));
mSettings.add(new SettingsItem(SettingsItem.SETTING_EXIT_GAME, R.string.emulation_stop_running, SettingsItem.TYPE_TEXT, 0));
notifyDataSetChanged();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public static void ShowJoinRoomDialog(final Activity activity) {
});
}

private static String GetUsername(final Activity activity) {
public static String GetUsername(final Activity activity) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
String name = "Citra" + (int) (Math.random() * 100);
return prefs.getString("NetPlayUsername", name);
Expand Down Expand Up @@ -146,6 +146,8 @@ private static void SetRoomPort(final Activity activity, final String port) {

public static native String[] NetPlayRoomInfo();

public static native boolean NetPlayIsJoined();

public static native boolean NetPlayIsHostedRoom();

public static native void NetPlaySendMessage(String msg);
Expand Down Expand Up @@ -237,7 +239,7 @@ private static String FormatNetPlayStatus(Context context, int type, String msg)
@SuppressWarnings("deprecation")
private static String GetIpAddressByWifi(final Activity activity) {
int ipaddress = 0;
WifiManager wifiManager = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);
WifiManager wifiManager = activity.getSystemService(WifiManager.class);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo != null) {
ipaddress = wifiInfo.getIpAddress();
Expand Down
11 changes: 11 additions & 0 deletions src/android/app/src/main/res/drawable/outline_message_24.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal"
android:autoMirrored="true">
<path
android:fillColor="@android:color/white"
android:pathData="M4,4h16v12L5.17,16L4,17.17L4,4m0,-2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2L4,2zM6,12h12v2L6,14v-2zM6,9h12v2L6,11L6,9zM6,6h12v2L6,8L6,6z"/>
</vector>
5 changes: 5 additions & 0 deletions src/android/app/src/main/res/drawable/rounded.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@android:color/white" />
<corners android:radius="32dp" />
</shape>

0 comments on commit d5022db

Please sign in to comment.