diff options
author | Andrew Comminos <andrew@comminos.com> | 2015-10-24 23:57:14 +0300 |
---|---|---|
committer | Andrew Comminos <andrew@comminos.com> | 2015-10-24 23:57:14 +0300 |
commit | fb30b2122eb883f750755ae4095afd89d42c9b35 (patch) | |
tree | 3a4d519380bcda64203de45c4ad40447b56d6aea | |
parent | 91ba0f137633326e1cb073e0b358b36f2f352277 (diff) |
Migration towards new AIDL-less Jumble interface.
20 files changed, 498 insertions, 803 deletions
diff --git a/app/src/main/java/com/morlunk/mumbleclient/app/PlumbleActivity.java b/app/src/main/java/com/morlunk/mumbleclient/app/PlumbleActivity.java index 20a4466..e4edf81 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/app/PlumbleActivity.java +++ b/app/src/main/java/com/morlunk/mumbleclient/app/PlumbleActivity.java @@ -55,7 +55,7 @@ import com.morlunk.jumble.model.Server; import com.morlunk.jumble.util.JumbleException; import com.morlunk.jumble.util.JumbleObserver; import com.morlunk.jumble.util.MumbleURLParser; -import com.morlunk.jumble.util.ParcelableByteArray; +import com.morlunk.mumbleclient.BuildConfig; import com.morlunk.mumbleclient.R; import com.morlunk.mumbleclient.Settings; import com.morlunk.mumbleclient.channel.AccessTokenFragment; @@ -100,7 +100,7 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte */ public static final String EXTRA_DRAWER_FRAGMENT = "drawer_fragment"; - private PlumbleService.PlumbleBinder mService; + private PlumbleService mService; private PlumbleDatabase mDatabase; private Settings mSettings; @@ -119,7 +119,7 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { - mService = (PlumbleService.PlumbleBinder) service; + mService = (PlumbleService)((JumbleService.JumbleBinder) service).getService(); try { mService.registerObserver(mObserver); mService.clearChatNotifications(); // Clear chat notifications on resume. @@ -132,15 +132,11 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte fragment.setServiceBound(true); // Re-show server list if we're showing a fragment that depends on the service. - try { - if(getSupportFragmentManager().findFragmentById(R.id.content_frame) instanceof JumbleServiceFragment && - mService.getConnectionState() != JumbleService.STATE_CONNECTED) { - loadDrawerFragment(DrawerAdapter.ITEM_FAVOURITES); - } - updateConnectionState(getService()); - } catch (RemoteException e) { - e.printStackTrace(); + if(getSupportFragmentManager().findFragmentById(R.id.content_frame) instanceof JumbleServiceFragment && + mService.getConnectionState() != JumbleService.ConnectionState.CONNECTED) { + loadDrawerFragment(DrawerAdapter.ITEM_FAVOURITES); } + updateConnectionState(getService()); } @Override @@ -151,7 +147,7 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte private JumbleObserver mObserver = new JumbleObserver() { @Override - public void onConnected() throws RemoteException { + public void onConnected() { loadDrawerFragment(DrawerAdapter.ITEM_SERVER); mDrawerAdapter.notifyDataSetChanged(); supportInvalidateOptionsMenu(); @@ -160,12 +156,12 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte } @Override - public void onConnecting() throws RemoteException { + public void onConnecting() { updateConnectionState(getService()); } @Override - public void onDisconnected(JumbleException e) throws RemoteException { + public void onDisconnected(JumbleException e) { // Re-show server list if we're showing a fragment that depends on the service. if(getSupportFragmentManager().findFragmentById(R.id.content_frame) instanceof JumbleServiceFragment) { loadDrawerFragment(DrawerAdapter.ITEM_FAVOURITES); @@ -177,13 +173,14 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte } @Override - public void onTLSHandshakeFailed(ParcelableByteArray cert) throws RemoteException { - byte[] certBytes = cert.getBytes(); + public void onTLSHandshakeFailed(X509Certificate[] chain) { final Server lastServer = getService().getConnectedServer(); + if (chain.length == 0) + return; + try { - CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); - final X509Certificate x509 = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(certBytes)); + final X509Certificate x509 = chain[0]; AlertDialog.Builder adb = new AlertDialog.Builder(PlumbleActivity.this); adb.setTitle(R.string.untrusted_certificate); @@ -226,7 +223,7 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte } @Override - public void onPermissionDenied(String reason) throws RemoteException { + public void onPermissionDenied(String reason) { AlertDialog.Builder adb = new AlertDialog.Builder(PlumbleActivity.this); adb.setTitle(R.string.perm_denied); adb.setMessage(reason); @@ -264,16 +261,11 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte @Override public void onDrawerStateChanged(int newState) { super.onDrawerStateChanged(newState); - - try { - // Prevent push to talk from getting stuck on when the drawer is opened. - if (getService() != null - && getService().getConnectionState() == JumbleService.STATE_CONNECTED - && getService().isTalking() && !mSettings.isPushToTalkToggle()) { - getService().setTalkingState(false); - } - } catch (RemoteException e) { - e.printStackTrace(); + // Prevent push to talk from getting stuck on when the drawer is opened. + if (getService() != null + && getService().isSynchronized() + && getService().isTalking() && !mSettings.isPushToTalkToggle()) { + getService().setTalkingState(false); } } @@ -298,14 +290,9 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte dadb.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - try { - if(mService != null - && mService.getConnectionState() == JumbleService.STATE_CONNECTED) - mService.disconnect(); - loadDrawerFragment(DrawerAdapter.ITEM_FAVOURITES); - } catch (RemoteException e) { - e.printStackTrace(); - } + if(mService != null && mService.isSynchronized()) + mService.disconnect(); + loadDrawerFragment(DrawerAdapter.ITEM_FAVOURITES); } }); dadb.setNegativeButton(android.R.string.cancel, null); @@ -364,14 +351,12 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte if (mConnectingDialog != null) mConnectingDialog.dismiss(); - if(mService != null) - try { - for(JumbleServiceFragment fragment : mServiceFragments) - fragment.setServiceBound(false); - mService.unregisterObserver(mObserver); - } catch (RemoteException e) { - e.printStackTrace(); + if(mService != null) { + for (JumbleServiceFragment fragment : mServiceFragments) { + fragment.setServiceBound(false); } + mService.unregisterObserver(mObserver); + } unbindService(mConnection); } @@ -386,12 +371,7 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte @Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem disconnectButton = menu.findItem(R.id.action_disconnect); - try { - disconnectButton.setVisible(mService != null && - mService.getConnectionState() == JumbleService.STATE_CONNECTED); - } catch (RemoteException e) { - e.printStackTrace(); - } + disconnectButton.setVisible(mService != null && mService.isSynchronized()); // Color the action bar icons to the primary text color of the theme. int foregroundColor = getSupportActionBar().getThemedContext() @@ -422,11 +402,7 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte switch (item.getItemId()) { case R.id.action_disconnect: - try { - getService().disconnect(); - } catch (RemoteException e) { - e.printStackTrace(); - } + getService().disconnect(); return true; } @@ -442,11 +418,7 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (mService != null && keyCode == mSettings.getPushToTalkKey()) { - try { - mService.onTalkKeyDown(); - } catch (RemoteException e) { - e.printStackTrace(); - } + mService.onTalkKeyDown(); return true; } return super.onKeyDown(keyCode, event); @@ -455,11 +427,7 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (mService != null && keyCode == mSettings.getPushToTalkKey()) { - try { - mService.onTalkKeyUp(); - } catch (RemoteException e) { - e.printStackTrace(); - } + mService.onTalkKeyUp(); return true; } return super.onKeyUp(keyCode, event); @@ -467,14 +435,9 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte @Override public void onBackPressed() { - try { - if(mService != null && - mService.getConnectionState() == JumbleService.STATE_CONNECTED) { - mDisconnectPromptBuilder.show(); - return; - } - } catch (RemoteException e) { - e.printStackTrace(); + if(mService != null && mService.isSynchronized()) { + mDisconnectPromptBuilder.show(); + return; } super.onBackPressed(); } @@ -531,12 +494,8 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte break; case DrawerAdapter.ITEM_ACCESS_TOKENS: fragmentClass = AccessTokenFragment.class; - try { - args.putLong("server", mService.getConnectedServer().getId()); - args.putStringArrayList("access_tokens", (ArrayList<String>) mDatabase.getAccessTokens(mService.getConnectedServer().getId())); - } catch (RemoteException e) { - e.printStackTrace(); - } + args.putLong("server", mService.getConnectedServer().getId()); + args.putStringArrayList("access_tokens", (ArrayList<String>) mDatabase.getAccessTokens(mService.getConnectedServer().getId())); break; case DrawerAdapter.ITEM_PINNED_CHANNELS: fragmentClass = ChannelFragment.class; @@ -565,35 +524,26 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte public void connectToServer(final Server server) { // Check if we're already connected to a server; if so, inform user. - try { - if(mService != null && - mService.getConnectionState() == JumbleService.STATE_CONNECTED) { - AlertDialog.Builder adb = new AlertDialog.Builder(this); - adb.setMessage(R.string.reconnect_dialog_message); - adb.setPositiveButton(R.string.connect, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - try { - // Register an observer to reconnect to the new server once disconnected. - mService.registerObserver(new JumbleObserver() { - @Override - public void onDisconnected(JumbleException e) throws RemoteException { - connectToServer(server); - mService.unregisterObserver(this); - } - }); - mService.disconnect(); - } catch (RemoteException e) { - e.printStackTrace(); + if(mService != null && mService.isConnectionEstablished()) { + AlertDialog.Builder adb = new AlertDialog.Builder(this); + adb.setMessage(R.string.reconnect_dialog_message); + adb.setPositiveButton(R.string.connect, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // Register an observer to reconnect to the new server once disconnected. + mService.registerObserver(new JumbleObserver() { + @Override + public void onDisconnected(JumbleException e) { + connectToServer(server); + mService.unregisterObserver(this); } - } - }); - adb.setNegativeButton(android.R.string.cancel, null); - adb.show(); - return; - } - } catch (RemoteException e) { - e.printStackTrace(); + }); + mService.disconnect(); + } + }); + adb.setNegativeButton(android.R.string.cancel, null); + adb.show(); + return; } // Prompt to start Orbot if enabled but not running @@ -651,14 +601,14 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte * connection state updates. * @param service A bound IJumbleService. */ - private void updateConnectionState(IJumbleService service) throws RemoteException { + private void updateConnectionState(IJumbleService service) { if (mConnectingDialog != null) mConnectingDialog.dismiss(); if (mErrorDialog != null) mErrorDialog.dismiss(); switch (mService.getConnectionState()) { - case JumbleService.STATE_CONNECTING: + case CONNECTING: Server server = service.getConnectedServer(); mConnectingDialog = new ProgressDialog(this); mConnectingDialog.setIndeterminate(true); @@ -666,20 +616,16 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte mConnectingDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { - try { - mService.disconnect(); - Toast.makeText(PlumbleActivity.this, R.string.cancelled, - Toast.LENGTH_SHORT).show(); - } catch (RemoteException e) { - e.printStackTrace(); - } + mService.disconnect(); + Toast.makeText(PlumbleActivity.this, R.string.cancelled, + Toast.LENGTH_SHORT).show(); } }); mConnectingDialog.setMessage(getString(R.string.connecting_to_server, server.getHost(), server.getPort())); mConnectingDialog.show(); break; - case JumbleService.STATE_CONNECTION_LOST: + case CONNECTION_LOST: // Only bother the user if the error hasn't already been shown. if (!getService().isErrorShown()) { JumbleException error = getService().getConnectionError(); @@ -691,12 +637,8 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte @Override public void onClick(DialogInterface dialog, int which) { if (getService() != null) { - try { - getService().cancelReconnect(); - getService().markErrorShown(); - } catch (RemoteException e) { - e.printStackTrace(); - } + getService().cancelReconnect(); + getService().markErrorShown(); } } }); @@ -724,7 +666,7 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte */ @Override - public PlumbleService.PlumbleBinder getService() { + public PlumbleService getService() { return mService; } @@ -764,27 +706,18 @@ public class PlumbleActivity extends ActionBarActivity implements ListView.OnIte @Override public boolean isConnected() { - try { - return mService != null - && mService.getConnectionState() == JumbleService.STATE_CONNECTED; - } catch (RemoteException e) { - e.printStackTrace(); - return false; - } + return mService != null && mService.isSynchronized(); } @Override public String getConnectedServerName() { - try { - if(mService != null - && mService.getConnectionState() == JumbleService.STATE_CONNECTED) { - Server server = mService.getConnectedServer(); - return server.getName().equals("") ? server.getHost() : server.getName(); - } - } catch (RemoteException e) { - e.printStackTrace(); + if(mService != null && mService.isSynchronized()) { + Server server = mService.getConnectedServer(); + return server.getName().equals("") ? server.getHost() : server.getName(); } - return null; + if (BuildConfig.DEBUG) + throw new RuntimeException("getConnectedServerName should only be called if connected!"); + return ""; } @Override diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/AccessTokenFragment.java b/app/src/main/java/com/morlunk/mumbleclient/channel/AccessTokenFragment.java index a778c73..bb6efe5 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/AccessTokenFragment.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/AccessTokenFragment.java @@ -113,18 +113,14 @@ public class AccessTokenFragment extends JumbleServiceFragment { mTokenField.setText(""); - Log.i(Constants.TAG, "Adding token: "+tokenText); + Log.i(Constants.TAG, "Adding token: " + tokenText); mTokens.add(tokenText); mTokenAdapter.notifyDataSetChanged(); mTokenList.smoothScrollToPosition(mTokens.size() - 1); mProvider.getDatabase().addAccessToken(getServerId(), tokenText); - try { - getService().sendAccessTokens(mTokens); - } catch (RemoteException e) { - e.printStackTrace(); - } + getService().sendAccessTokens(mTokens); } private long getServerId() { @@ -162,11 +158,7 @@ public class AccessTokenFragment extends JumbleServiceFragment { mTokens.remove(position); notifyDataSetChanged(); mProvider.getDatabase().removeAccessToken(getServerId(), token); - try { - getService().sendAccessTokens(mTokens); - } catch (RemoteException e) { - e.printStackTrace(); - } + getService().sendAccessTokens(mTokens); } }); diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelAdapter.java b/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelAdapter.java index b0a1229..200e79e 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelAdapter.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelAdapter.java @@ -26,7 +26,6 @@ import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; -import com.morlunk.jumble.IJumbleService; import com.morlunk.jumble.model.Channel; import com.morlunk.jumble.model.IChannel; import com.morlunk.jumble.model.IUser; @@ -50,33 +49,19 @@ public class ChannelAdapter extends BaseAdapter { @Override public int getCount() { - try { - return mChannel.getUsers().size(); - } catch (RemoteException e) { - e.printStackTrace(); - return 0; - } + return mChannel.getUsers().size(); } @Override public Object getItem(int position) { - try { - return mChannel.getUsers().get(position); - } catch (RemoteException e) { - e.printStackTrace(); - } - return null; + return mChannel.getUsers().get(position); } @Override public long getItemId(int position) { - try { - IUser user = (IUser) mChannel.getUsers().get(position); - if (user != null) - return user.getUserId(); - } catch (RemoteException e) { - e.printStackTrace(); - } + IUser user = mChannel.getUsers().get(position); + if (user != null) + return user.getUserId(); return -1; } diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelChatFragment.java b/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelChatFragment.java index c763aa2..1011a04 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelChatFragment.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelChatFragment.java @@ -42,7 +42,6 @@ import android.widget.ListView; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; -import com.morlunk.jumble.IJumbleObserver; import com.morlunk.jumble.IJumbleService; import com.morlunk.jumble.model.Channel; import com.morlunk.jumble.model.IChannel; @@ -50,6 +49,7 @@ import com.morlunk.jumble.model.IMessage; import com.morlunk.jumble.model.IUser; import com.morlunk.jumble.model.Message; import com.morlunk.jumble.model.User; +import com.morlunk.jumble.util.IJumbleObserver; import com.morlunk.jumble.util.JumbleObserver; import com.morlunk.mumbleclient.R; import com.morlunk.mumbleclient.service.IChatMessage; @@ -72,27 +72,27 @@ public class ChannelChatFragment extends JumbleServiceFragment implements ChatTa private IJumbleObserver mServiceObserver = new JumbleObserver() { @Override - public void onMessageLogged(IMessage message) throws RemoteException { + public void onMessageLogged(IMessage message) { addChatMessage(new IChatMessage.TextMessage(message), true); } @Override - public void onLogInfo(String message) throws RemoteException { + public void onLogInfo(String message) { addChatMessage(new IChatMessage.InfoMessage(IChatMessage.InfoMessage.Type.INFO, message), true); } @Override - public void onLogWarning(String message) throws RemoteException { + public void onLogWarning(String message) { addChatMessage(new IChatMessage.InfoMessage(IChatMessage.InfoMessage.Type.WARNING, message), true); } @Override - public void onLogError(String message) throws RemoteException { + public void onLogError(String message) { addChatMessage(new IChatMessage.InfoMessage(IChatMessage.InfoMessage.Type.ERROR, message), true); } @Override - public void onUserJoinedChannel(IUser user, IChannel newChannel, IChannel oldChannel) throws RemoteException { + public void onUserJoinedChannel(IUser user, IChannel newChannel, IChannel oldChannel) { if (user != null && getService().getSessionUser() != null && user.equals(getService().getSessionUser()) && mTargetProvider.getChatTarget() == null) { @@ -184,11 +184,7 @@ public class ChannelChatFragment extends JumbleServiceFragment implements ChatTa } }); - try { - updateChatTargetText(mTargetProvider.getChatTarget()); - } catch (RemoteException e) { - e.printStackTrace(); - } + updateChatTargetText(mTargetProvider.getChatTarget()); return view; } @@ -270,7 +266,7 @@ public class ChannelChatFragment extends JumbleServiceFragment implements ChatTa /** * Updates hint displaying chat target. */ - public void updateChatTargetText(ChatTargetProvider.ChatTarget target) throws RemoteException { + public void updateChatTargetText(ChatTargetProvider.ChatTarget target) { if(getService() == null) return; String hint = null; @@ -305,11 +301,7 @@ public class ChannelChatFragment extends JumbleServiceFragment implements ChatTa @Override public void onChatTargetSelected(ChatTargetProvider.ChatTarget target) { - try { - updateChatTargetText(target); - } catch (RemoteException e) { - e.printStackTrace(); - } + updateChatTargetText(target); } private static class ChannelChatAdapter extends ArrayAdapter<IChatMessage> { @@ -342,30 +334,25 @@ public class ChannelChatFragment extends JumbleServiceFragment implements ChatTa public void visit(IChatMessage.TextMessage message) { IMessage textMessage = message.getMessage(); String targetMessage = getContext().getString(R.string.unknown); - boolean selfAuthored = false; - try { - selfAuthored = textMessage.getActor() == mService.getSession(); - - if (textMessage.getTargetChannels() != null && !textMessage.getTargetChannels().isEmpty()) { - IChannel currentChannel = (IChannel) textMessage.getTargetChannels().get(0); - if (currentChannel != null && currentChannel.getName() != null) { - targetMessage = getContext().getString(R.string.chat_message_to, textMessage.getActorName(), currentChannel.getName()); - } - } else if (textMessage.getTargetTrees() != null && !textMessage.getTargetTrees().isEmpty()) { - IChannel currentChannel = (IChannel) textMessage.getTargetTrees().get(0); - if (currentChannel != null && currentChannel.getName() != null) { - targetMessage = getContext().getString(R.string.chat_message_to, textMessage.getActorName(), currentChannel.getName()); - } - } else if (textMessage.getTargetUsers() != null && !textMessage.getTargetUsers().isEmpty()) { - User user = (User) textMessage.getTargetUsers().get(0); - if (user != null && user.getName() != null) { - targetMessage = getContext().getString(R.string.chat_message_to, textMessage.getActorName(), user.getName()); - } - } else { - targetMessage = textMessage.getActorName(); + boolean selfAuthored = textMessage.getActor() == mService.getSession(); + + if (textMessage.getTargetChannels() != null && !textMessage.getTargetChannels().isEmpty()) { + IChannel currentChannel = (IChannel) textMessage.getTargetChannels().get(0); + if (currentChannel != null && currentChannel.getName() != null) { + targetMessage = getContext().getString(R.string.chat_message_to, textMessage.getActorName(), currentChannel.getName()); + } + } else if (textMessage.getTargetTrees() != null && !textMessage.getTargetTrees().isEmpty()) { + IChannel currentChannel = (IChannel) textMessage.getTargetTrees().get(0); + if (currentChannel != null && currentChannel.getName() != null) { + targetMessage = getContext().getString(R.string.chat_message_to, textMessage.getActorName(), currentChannel.getName()); + } + } else if (textMessage.getTargetUsers() != null && !textMessage.getTargetUsers().isEmpty()) { + User user = (User) textMessage.getTargetUsers().get(0); + if (user != null && user.getName() != null) { + targetMessage = getContext().getString(R.string.chat_message_to, textMessage.getActorName(), user.getName()); } - } catch (RemoteException e) { - e.printStackTrace(); + } else { + targetMessage = textMessage.getActorName(); } int gravity = selfAuthored ? Gravity.RIGHT : Gravity.LEFT; diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelEditFragment.java b/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelEditFragment.java index 4b95401..6004c24 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelEditFragment.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelEditFragment.java @@ -66,18 +66,14 @@ public class ChannelEditFragment extends DialogFragment { mPositionField = (TextView) view.findViewById(R.id.channel_edit_position); mTemporaryBox = (CheckBox) view.findViewById(R.id.channel_edit_temporary); - try { - // If we can only make temporary channels, remove the option. - IChannel parentChannel = mServiceProvider.getService().getChannel(getParent()); - int combinedPermissions = mServiceProvider.getService().getPermissions() | parentChannel.getPermissions(); - boolean canMakeChannel = (combinedPermissions & Permissions.MakeChannel) > 0; - boolean canMakeTempChannel = (combinedPermissions & Permissions.MakeTempChannel) > 0; - boolean onlyTemp = canMakeTempChannel && !canMakeChannel; - mTemporaryBox.setChecked(onlyTemp); - mTemporaryBox.setEnabled(!onlyTemp); - } catch (RemoteException e) { - e.printStackTrace(); - } + // If we can only make temporary channels, remove the option. + IChannel parentChannel = mServiceProvider.getService().getChannel(getParent()); + int combinedPermissions = mServiceProvider.getService().getPermissions() | parentChannel.getPermissions(); + boolean canMakeChannel = (combinedPermissions & Permissions.MakeChannel) > 0; + boolean canMakeTempChannel = (combinedPermissions & Permissions.MakeTempChannel) > 0; + boolean onlyTemp = canMakeTempChannel && !canMakeChannel; + mTemporaryBox.setChecked(onlyTemp); + mTemporaryBox.setEnabled(!onlyTemp); return new AlertDialog.Builder(getActivity()) .setTitle(isAdding() ? R.string.channel_add : R.string.channel_edit) @@ -85,18 +81,14 @@ public class ChannelEditFragment extends DialogFragment { .setPositiveButton(isAdding() ? R.string.add : R.string.save, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - try { - if(isAdding()) { - mServiceProvider.getService().createChannel(getParent(), - mNameField.getText().toString(), - mDescriptionField.getText().toString(), - Integer.parseInt(mPositionField.getText().toString()), // We can guarantee this to be an int. InputType is numberSigned. - mTemporaryBox.isChecked()); - } else { - // TODO - } - } catch (RemoteException e) { - e.printStackTrace(); + if(isAdding()) { + mServiceProvider.getService().createChannel(getParent(), + mNameField.getText().toString(), + mDescriptionField.getText().toString(), + Integer.parseInt(mPositionField.getText().toString()), // We can guarantee this to be an int. InputType is numberSigned. + mTemporaryBox.isChecked()); + } else { + // TODO } } }) diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelFragment.java b/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelFragment.java index 411f106..e0f01c7 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelFragment.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelFragment.java @@ -37,9 +37,9 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; -import com.morlunk.jumble.IJumbleObserver; import com.morlunk.jumble.model.IUser; import com.morlunk.jumble.model.User; +import com.morlunk.jumble.util.IJumbleObserver; import com.morlunk.jumble.util.JumbleObserver; import com.morlunk.mumbleclient.R; import com.morlunk.mumbleclient.Settings; @@ -65,7 +65,7 @@ public class ChannelFragment extends JumbleServiceFragment implements SharedPref private JumbleObserver mObserver = new JumbleObserver() { @Override - public void onUserTalkStateUpdated(IUser user) throws RemoteException { + public void onUserTalkStateUpdated(IUser user) { if (user != null && user.getSession() == getService().getSession()) { // Manually set button selection colour when we receive a talk state update. // This allows representation of talk state when using hot corners and PTT toggle. @@ -113,17 +113,13 @@ public class ChannelFragment extends JumbleServiceFragment implements SharedPref @Override public boolean onTouch(View v, MotionEvent event) { - try { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - getService().onTalkKeyDown(); - break; - case MotionEvent.ACTION_UP: - getService().onTalkKeyUp(); - break; - } - } catch (RemoteException e) { - e.printStackTrace(); + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + getService().onTalkKeyDown(); + break; + case MotionEvent.ACTION_UP: + getService().onTalkKeyUp(); + break; } return true; } diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelListAdapter.java b/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelListAdapter.java index e1257cc..0617c90 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelListAdapter.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelListAdapter.java @@ -116,86 +116,74 @@ public class ChannelListAdapter extends RecyclerView.Adapter implements UserMenu @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { final Node node = mNodes.get(position); - try { - if (node.isChannel()) { - final IChannel channel = node.getChannel(); - ChannelViewHolder cvh = (ChannelViewHolder) viewHolder; - cvh.itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mChannelClickListener != null) { - mChannelClickListener.onChannelClick(channel); - } - } - }); - - final boolean expandUsable = channel.getSubchannels().size() > 0 || - channel.getSubchannelUserCount() > 0; - cvh.mChannelExpandToggle.setImageResource(node.isExpanded() ? - R.drawable.ic_action_expanded : R.drawable.ic_action_collapsed); - cvh.mChannelExpandToggle.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - try { - mExpandedChannels.put(channel.getId(), !node.isExpanded()); - updateChannels(); // FIXME: very inefficient. - } catch (RemoteException e) { - e.printStackTrace(); - } - notifyDataSetChanged(); + if (node.isChannel()) { + final IChannel channel = node.getChannel(); + ChannelViewHolder cvh = (ChannelViewHolder) viewHolder; + cvh.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mChannelClickListener != null) { + mChannelClickListener.onChannelClick(channel); } - }); - // Dim channel expand toggle when no subchannels exist - cvh.mChannelExpandToggle.setEnabled(expandUsable); - cvh.mChannelExpandToggle.setVisibility(expandUsable ? View.VISIBLE : View.INVISIBLE); - - cvh.mChannelName.setText(channel.getName()); - - int userCount = channel.getSubchannelUserCount(); - cvh.mChannelUserCount.setText(String.format("%d", userCount)); - - // Pad the view depending on channel's nested level. - DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); - float margin = node.getDepth() * TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25, metrics); - cvh.mChannelHolder.setPadding((int) margin, - cvh.mChannelHolder.getPaddingTop(), - cvh.mChannelHolder.getPaddingRight(), - cvh.mChannelHolder.getPaddingBottom()); - } else if (node.isUser()) { - final IUser user = node.getUser(); - UserViewHolder uvh = (UserViewHolder) viewHolder; - uvh.itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mUserClickListener != null) { - mUserClickListener.onUserClick(user); - } + } + }); + + final boolean expandUsable = channel.getSubchannels().size() > 0 || + channel.getSubchannelUserCount() > 0; + cvh.mChannelExpandToggle.setImageResource(node.isExpanded() ? + R.drawable.ic_action_expanded : R.drawable.ic_action_collapsed); + cvh.mChannelExpandToggle.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + mExpandedChannels.put(channel.getId(), !node.isExpanded()); + updateChannels(); // FIXME: very inefficient. + notifyDataSetChanged(); + } + }); + // Dim channel expand toggle when no subchannels exist + cvh.mChannelExpandToggle.setEnabled(expandUsable); + cvh.mChannelExpandToggle.setVisibility(expandUsable ? View.VISIBLE : View.INVISIBLE); + + cvh.mChannelName.setText(channel.getName()); + + int userCount = channel.getSubchannelUserCount(); + cvh.mChannelUserCount.setText(String.format("%d", userCount)); + + // Pad the view depending on channel's nested level. + DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); + float margin = node.getDepth() * TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25, metrics); + cvh.mChannelHolder.setPadding((int) margin, + cvh.mChannelHolder.getPaddingTop(), + cvh.mChannelHolder.getPaddingRight(), + cvh.mChannelHolder.getPaddingBottom()); + } else if (node.isUser()) { + final IUser user = node.getUser(); + UserViewHolder uvh = (UserViewHolder) viewHolder; + uvh.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mUserClickListener != null) { + mUserClickListener.onUserClick(user); } - }); - - uvh.mUserName.setText(user.getName()); - try { - uvh.mUserName.setTypeface(null, user.getSession() == mService.getSession() ? Typeface.BOLD : Typeface.NORMAL); - } catch (RemoteException e) { - e.printStackTrace(); } + }); - uvh.mUserTalkHighlight.setImageDrawable(getTalkStateDrawable(user)); + uvh.mUserName.setText(user.getName()); + uvh.mUserName.setTypeface(null, user.getSession() == mService.getSession() ? Typeface.BOLD : Typeface.NORMAL); - // Pad the view depending on channel's nested level. - DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); - float margin = (node.getDepth() + 1) * TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25, metrics); - uvh.mUserHolder.setPadding((int) margin, - uvh.mUserHolder.getPaddingTop(), - uvh.mUserHolder.getPaddingRight(), - uvh.mUserHolder.getPaddingBottom()); + uvh.mUserTalkHighlight.setImageDrawable(getTalkStateDrawable(user)); - uvh.mMoreButton.setOnClickListener(new UserMenuProvider(mContext, user, - (PlumbleService.PlumbleBinder) mService, mFragmentManager, this)); - } - } catch (RemoteException e) { - e.printStackTrace(); + // Pad the view depending on channel's nested level. + DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); + float margin = (node.getDepth() + 1) * TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25, metrics); + uvh.mUserHolder.setPadding((int) margin, + uvh.mUserHolder.getPaddingTop(), + uvh.mUserHolder.getPaddingRight(), + uvh.mUserHolder.getPaddingBottom()); + + uvh.mMoreButton.setOnClickListener(new UserMenuProvider(mContext, user, + (PlumbleService) mService, mFragmentManager, this)); } } @@ -230,7 +218,7 @@ public class ChannelListAdapter extends RecyclerView.Adapter implements UserMenu * Updates the channel tree model. * To be used after any channel tree modifications. */ - public void updateChannels() throws RemoteException { + public void updateChannels() { mNodes.clear(); for (int cid : mRootChannels) { IChannel channel = mService.getChannel(cid); @@ -245,7 +233,7 @@ public class ChannelListAdapter extends RecyclerView.Adapter implements UserMenu * @param user The user to update. * @param view The view containing this adapter. */ - public void animateUserStateUpdate(IUser user, RecyclerView view) throws RemoteException { + public void animateUserStateUpdate(IUser user, RecyclerView view) { long itemId = user.getSession() | USER_ID_MASK; UserViewHolder uvh = (UserViewHolder) view.findViewHolderForItemId(itemId); if (uvh != null) { @@ -266,7 +254,7 @@ public class ChannelListAdapter extends RecyclerView.Adapter implements UserMenu } } - private Drawable getTalkStateDrawable(IUser user) throws RemoteException { + private Drawable getTalkStateDrawable(IUser user) { Resources resources = mContext.getResources(); if (user.isSelfDeafened()) { return resources.getDrawable(R.drawable.outline_circle_deafened); @@ -341,7 +329,7 @@ public class ChannelListAdapter extends RecyclerView.Adapter implements UserMenu * @param nodes An accumulator to store generated nodes into. */ private void constructNodes(Node parent, IChannel channel, int depth, - List<Node> nodes) throws RemoteException { + List<Node> nodes) { Node channelNode = new Node(parent, depth, channel); nodes.add(channelNode); @@ -366,9 +354,8 @@ public class ChannelListAdapter extends RecyclerView.Adapter implements UserMenu /** * Changes the service backing the adapter. Updates the list as well. * @param service The new service to retrieve channels from. - * @throws RemoteException */ - public void setService(IJumbleService service) throws RemoteException { + public void setService(IJumbleService service) { mService = service; updateChannels(); notifyDataSetChanged(); @@ -376,36 +363,27 @@ public class ChannelListAdapter extends RecyclerView.Adapter implements UserMenu @Override public void onLocalUserStateUpdated(final IUser user) { - try { - notifyDataSetChanged(); - - // Add or remove registered user from local mute history - final Server server = mService.getConnectedServer(); - - if (user.getUserId() >= 0 && server.isSaved()) { - new Thread(new Runnable() { - @Override - public void run() { - // TODO: use dedicated database worker thread? - try { - if (user.isLocalMuted()) { - mDatabase.addLocalMutedUser(server.getId(), user.getUserId()); - } else { - mDatabase.removeLocalMutedUser(server.getId(), user.getUserId()); - } - if (user.isLocalIgnored()) { - mDatabase.addLocalIgnoredUser(server.getId(), user.getUserId()); - } else { - mDatabase.removeLocalIgnoredUser(server.getId(), user.getUserId()); - } - } catch (RemoteException e) { - e.printStackTrace(); - } + notifyDataSetChanged(); + + // Add or remove registered user from local mute history + final Server server = mService.getConnectedServer(); + + if (user.getUserId() >= 0 && server.isSaved()) { + new Thread(new Runnable() { + @Override + public void run() { + if (user.isLocalMuted()) { + mDatabase.addLocalMutedUser(server.getId(), user.getUserId()); + } else { + mDatabase.removeLocalMutedUser(server.getId(), user.getUserId()); } - }).start(); - } - } catch (RemoteException e) { - e.printStackTrace(); + if (user.isLocalIgnored()) { + mDatabase.addLocalIgnoredUser(server.getId(), user.getUserId()); + } else { + mDatabase.removeLocalIgnoredUser(server.getId(), user.getUserId()); + } + } + }).start(); } } diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelListFragment.java b/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelListFragment.java index a5d27dc..f610885 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelListFragment.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/ChannelListFragment.java @@ -41,7 +41,6 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import com.morlunk.jumble.IJumbleObserver; import com.morlunk.jumble.IJumbleService; import com.morlunk.jumble.JumbleService; import com.morlunk.jumble.model.Channel; @@ -49,6 +48,7 @@ import com.morlunk.jumble.model.IChannel; import com.morlunk.jumble.model.IUser; import com.morlunk.jumble.model.Server; import com.morlunk.jumble.model.User; +import com.morlunk.jumble.util.IJumbleObserver; import com.morlunk.jumble.util.JumbleException; import com.morlunk.jumble.util.JumbleObserver; import com.morlunk.mumbleclient.R; @@ -63,12 +63,12 @@ public class ChannelListFragment extends JumbleServiceFragment implements OnChan private IJumbleObserver mServiceObserver = new JumbleObserver() { @Override - public void onDisconnected(JumbleException e) throws RemoteException { + public void onDisconnected(JumbleException e) { mChannelView.setAdapter(null); } @Override - public void onUserJoinedChannel(IUser user, IChannel newChannel, IChannel oldChannel) throws RemoteException { + public void onUserJoinedChannel(IUser user, IChannel newChannel, IChannel oldChannel) { mChannelListAdapter.updateChannels(); mChannelListAdapter.notifyDataSetChanged(); if(getService().getSession() == user.getSession()) { @@ -77,43 +77,43 @@ public class ChannelListFragment extends JumbleServiceFragment implements OnChan } @Override - public void onChannelAdded(IChannel channel) throws RemoteException { + public void onChannelAdded(IChannel channel) { mChannelListAdapter.updateChannels(); mChannelListAdapter.notifyDataSetChanged(); } @Override - public void onChannelRemoved(IChannel channel) throws RemoteException { + public void onChannelRemoved(IChannel channel) { mChannelListAdapter.updateChannels(); mChannelListAdapter.notifyDataSetChanged(); } @Override - public void onChannelStateUpdated(IChannel channel) throws RemoteException { + public void onChannelStateUpdated(IChannel channel) { mChannelListAdapter.updateChannels(); mChannelListAdapter.notifyDataSetChanged(); } @Override - public void onUserConnected(IUser user) throws RemoteException { + public void onUserConnected(IUser user) { mChannelListAdapter.updateChannels(); mChannelListAdapter.notifyDataSetChanged(); } @Override - public void onUserRemoved(IUser user, String reason) throws RemoteException { + public void onUserRemoved(IUser user, String reason) { mChannelListAdapter.updateChannels(); mChannelListAdapter.notifyDataSetChanged(); } @Override - public void onUserStateUpdated(IUser user) throws RemoteException { + public void onUserStateUpdated(IUser user) { mChannelListAdapter.animateUserStateUpdate(user, mChannelView); getActivity().supportInvalidateOptionsMenu(); // Update self mute/deafen state } @Override - public void onUserTalkStateUpdated(IUser user) throws RemoteException { + public void onUserTalkStateUpdated(IUser user) { mChannelListAdapter.animateUserStateUpdate(user, mChannelView); } }; @@ -201,30 +201,19 @@ public class ChannelListFragment extends JumbleServiceFragment implements OnChan MenuItem muteItem = menu.findItem(R.id.menu_mute_button); MenuItem deafenItem = menu.findItem(R.id.menu_deafen_button); - try { - if(getService() != null - && getService().getConnectionState() == JumbleService.STATE_CONNECTED - && getService().getSessionUser() != null) { - // Color the action bar icons to the primary text color of the theme, TODO move this elsewhere - int foregroundColor = getActivity().getTheme().obtainStyledAttributes(new int[]{android.R.attr.textColorPrimaryInverse}).getColor(0, -1); + if(getService() != null + && getService().isSynchronized()) { + // Color the action bar icons to the primary text color of the theme, TODO move this elsewhere + int foregroundColor = getActivity().getTheme().obtainStyledAttributes(new int[]{android.R.attr.textColorPrimaryInverse}).getColor(0, -1); - IUser self = getService().getSessionUser(); - muteItem.setIcon(self.isSelfMuted() ? R.drawable.ic_action_microphone_muted : R.drawable.ic_action_microphone); - deafenItem.setIcon(self.isSelfDeafened() ? R.drawable.ic_action_audio_muted : R.drawable.ic_action_audio); - muteItem.getIcon().mutate().setColorFilter(foregroundColor, PorterDuff.Mode.MULTIPLY); - deafenItem.getIcon().mutate().setColorFilter(foregroundColor, PorterDuff.Mode.MULTIPLY); - } - } catch (RemoteException e) { - e.printStackTrace(); - } + IUser self = getService().getSessionUser(); + muteItem.setIcon(self.isSelfMuted() ? R.drawable.ic_action_microphone_muted : R.drawable.ic_action_microphone); + deafenItem.setIcon(self.isSelfDeafened() ? R.drawable.ic_action_audio_muted : R.drawable.ic_action_audio); + muteItem.getIcon().mutate().setColorFilter(foregroundColor, PorterDuff.Mode.MULTIPLY); + deafenItem.getIcon().mutate().setColorFilter(foregroundColor, PorterDuff.Mode.MULTIPLY); - try { - if(getService() != null) { - MenuItem bluetoothItem = menu.findItem(R.id.menu_bluetooth); - bluetoothItem.setChecked(getService().usingBluetoothSco()); - } - } catch (RemoteException e) { - e.printStackTrace(); + MenuItem bluetoothItem = menu.findItem(R.id.menu_bluetooth); + bluetoothItem.setChecked(getService().usingBluetoothSco()); } } @@ -251,14 +240,10 @@ public class ChannelListFragment extends JumbleServiceFragment implements OnChan String itemType = cursor.getString(typeColumn); int itemId = cursor.getInt(dataIdColumn); if(ChannelSearchProvider.INTENT_DATA_CHANNEL.equals(itemType)) { - try { - if(getService().getSessionChannel().getId() != itemId) { - getService().joinChannel(itemId); - } else { - scrollToChannel(itemId); - } - } catch (RemoteException e) { - e.printStackTrace(); + if(getService().getSessionChannel().getId() != itemId) { + getService().joinChannel(itemId); + } else { + scrollToChannel(itemId); } return true; } else if(ChannelSearchProvider.INTENT_DATA_USER.equals(itemType)) { @@ -274,44 +259,34 @@ public class ChannelListFragment extends JumbleServiceFragment implements OnChan public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - case R.id.menu_mute_button: - try { - IUser self = getService().getSessionUser(); - - boolean muted = !self.isSelfMuted(); - boolean deafened = self.isSelfDeafened(); - deafened &= muted; // Undeafen if mute is off - getService().setSelfMuteDeafState(muted, deafened); - - getActivity().supportInvalidateOptionsMenu(); - } catch (RemoteException e) { - e.printStackTrace(); - } + case R.id.menu_mute_button: { + IUser self = getService().getSessionUser(); + + boolean muted = !self.isSelfMuted(); + boolean deafened = self.isSelfDeafened(); + deafened &= muted; // Undeafen if mute is off + getService().setSelfMuteDeafState(muted, deafened); + + getActivity().supportInvalidateOptionsMenu(); return true; - case R.id.menu_deafen_button: - try { - IUser self = getService().getSessionUser(); + } + case R.id.menu_deafen_button: { + IUser self = getService().getSessionUser(); - boolean deafened = !self.isSelfDeafened(); - getService().setSelfMuteDeafState(deafened, deafened); + boolean deafened = !self.isSelfDeafened(); + getService().setSelfMuteDeafState(deafened, deafened); - getActivity().supportInvalidateOptionsMenu(); - } catch (RemoteException e) { - e.printStackTrace(); - } + getActivity().supportInvalidateOptionsMenu(); return true; + } case R.id.menu_search: return false; case R.id.menu_bluetooth: item.setChecked(!item.isChecked()); - try { - if (item.isChecked()) { - getService().enableBluetoothSco(); - } else { - getService().disableBluetoothSco(); - } - } catch (RemoteException e) { - e.printStackTrace(); + if (item.isChecked()) { + getService().enableBluetoothSco(); + } else { + getService().disableBluetoothSco(); } return true; } diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/ServerInfoFragment.java b/app/src/main/java/com/morlunk/mumbleclient/channel/ServerInfoFragment.java index 8695f20..ff173b0 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/ServerInfoFragment.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/ServerInfoFragment.java @@ -78,7 +78,7 @@ public class ServerInfoFragment extends JumbleServiceFragment { */ public void updateData() throws RemoteException { if(getService() == null - || getService().getConnectionState() != JumbleService.STATE_CONNECTED) + || !getService().isSynchronized()) return; mProtocolView.setText(getString(R.string.server_info_protocol, getService().getServerRelease())); @@ -88,7 +88,7 @@ public class ServerInfoFragment extends JumbleServiceFragment { mHostView.setText(getString(R.string.server_info_host, getService().getConnectedServer().getHost(), getService().getConnectedServer().getPort())); String codecName; - JumbleUDPMessageType codecType = JumbleUDPMessageType.values()[getService().getCodec()]; + JumbleUDPMessageType codecType = getService().getCodec(); switch (codecType) { case UDPVoiceOpus: codecName = "Opus"; diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/UserMenuProvider.java b/app/src/main/java/com/morlunk/mumbleclient/channel/UserMenuProvider.java index 9ec6879..cbdee20 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/UserMenuProvider.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/UserMenuProvider.java @@ -48,25 +48,25 @@ import java.util.List; public class UserMenuProvider implements View.OnClickListener, PopupMenu.OnMenuItemClickListener, PopupMenu.OnDismissListener { private final Context mContext; private final IUser mUser; - private final PlumbleService.PlumbleBinder mService; + private final PlumbleService mService; private final FragmentManager mFragmentManager; private final Listener mListener; private final JumbleObserver mPermissionObserver = new JumbleObserver() { @Override - public void onUserStateUpdated(IUser user) throws RemoteException { + public void onUserStateUpdated(IUser user) { if (user.getSession() == mUser.getSession()) configureMenu(mMenu); } @Override - public void onChannelPermissionsUpdated(IChannel channel) throws RemoteException { + public void onChannelPermissionsUpdated(IChannel channel) { if (mMenu != null) configureMenu(mMenu); } }; private Menu mMenu; - public UserMenuProvider(Context context, IUser user, PlumbleService.PlumbleBinder service, + public UserMenuProvider(Context context, IUser user, PlumbleService service, FragmentManager fragmentManager, Listener listener) { mContext = context; mUser = user; @@ -83,18 +83,14 @@ public class UserMenuProvider implements View.OnClickListener, PopupMenu.OnMenuI menu.setOnDismissListener(this); mMenu = menu.getMenu(); - try { - // Observer permissions changes, configure menu when we receive an update - mService.registerObserver(mPermissionObserver); - // Request permissions update from server, if we don't have channel permissions - IChannel channel = mUser.getChannel(); - if (channel != null && channel.getPermissions() == 0) { - mService.requestPermissions(channel.getId()); - } else { - configureMenu(mMenu); - } - } catch (RemoteException e) { - e.printStackTrace(); + // Observer permissions changes, configure menu when we receive an update + mService.registerObserver(mPermissionObserver); + // Request permissions update from server, if we don't have channel permissions + IChannel channel = mUser.getChannel(); + if (channel != null && channel.getPermissions() == 0) { + mService.requestPermissions(channel.getId()); + } else { + configureMenu(mMenu); } menu.show(); @@ -105,52 +101,48 @@ public class UserMenuProvider implements View.OnClickListener, PopupMenu.OnMenuI * @param menu A menu inflated from R.menu.context_user. */ public void configureMenu(Menu menu) { - try { - // Use permission data to determine the actions available. - boolean self = mUser.getSession() == mService.getSession(); - int perms = mService.getPermissions(); - IChannel channel = mUser.getChannel(); - int channelPerms = channel.getId() != 0 ? channel.getPermissions() : perms; + // Use permission data to determine the actions available. + boolean self = mUser.getSession() == mService.getSession(); + int perms = mService.getPermissions(); + IChannel channel = mUser.getChannel(); + int channelPerms = channel.getId() != 0 ? channel.getPermissions() : perms; - menu.findItem(R.id.context_kick).setVisible( - !self && (perms & (Permissions.Kick | Permissions.Ban | Permissions.Write)) > 0); - menu.findItem(R.id.context_ban).setVisible( - !self && (perms & (Permissions.Ban | Permissions.Write)) > 0); - menu.findItem(R.id.context_mute).setVisible( - ((channelPerms & (Permissions.Write | Permissions.MuteDeafen)) > 0 && - (!self || mUser.isMuted() || mUser.isSuppressed()))); - menu.findItem(R.id.context_deafen).setVisible( - ((channelPerms & (Permissions.Write | Permissions.MuteDeafen)) > 0 && - (!self || mUser.isDeafened()))); - menu.findItem(R.id.context_priority).setVisible( - ((channelPerms & (Permissions.Write | Permissions.MuteDeafen)) > 0)); - menu.findItem(R.id.context_move).setVisible( - !self && (perms & Permissions.Move) > 0); - menu.findItem(R.id.context_change_comment).setVisible(self); - menu.findItem(R.id.context_reset_comment).setVisible( - !self && mUser.getCommentHash() != null && - (perms & (Permissions.Move | Permissions.Write)) > 0); - menu.findItem(R.id.context_view_comment).setVisible( - (mUser.getComment() != null && !mUser.getComment().isEmpty()) || - (mUser.getCommentHash() != null)); - menu.findItem(R.id.context_register).setVisible(mUser.getUserId() < 0 && - (mUser.getHash() != null && !mUser.getHash().isEmpty()) && - (perms & ((self ? Permissions.SelfRegister : Permissions.Register) | Permissions.Write)) > 0); - menu.findItem(R.id.context_local_mute).setVisible(!self); - menu.findItem(R.id.context_ignore_messages).setVisible(!self); + menu.findItem(R.id.context_kick).setVisible( + !self && (perms & (Permissions.Kick | Permissions.Ban | Permissions.Write)) > 0); + menu.findItem(R.id.context_ban).setVisible( + !self && (perms & (Permissions.Ban | Permissions.Write)) > 0); + menu.findItem(R.id.context_mute).setVisible( + ((channelPerms & (Permissions.Write | Permissions.MuteDeafen)) > 0 && + (!self || mUser.isMuted() || mUser.isSuppressed()))); + menu.findItem(R.id.context_deafen).setVisible( + ((channelPerms & (Permissions.Write | Permissions.MuteDeafen)) > 0 && + (!self || mUser.isDeafened()))); + menu.findItem(R.id.context_priority).setVisible( + ((channelPerms & (Permissions.Write | Permissions.MuteDeafen)) > 0)); + menu.findItem(R.id.context_move).setVisible( + !self && (perms & Permissions.Move) > 0); + menu.findItem(R.id.context_change_comment).setVisible(self); + menu.findItem(R.id.context_reset_comment).setVisible( + !self && mUser.getCommentHash() != null && + (perms & (Permissions.Move | Permissions.Write)) > 0); + menu.findItem(R.id.context_view_comment).setVisible( + (mUser.getComment() != null && !mUser.getComment().isEmpty()) || + (mUser.getCommentHash() != null)); + menu.findItem(R.id.context_register).setVisible(mUser.getUserId() < 0 && + (mUser.getHash() != null && !mUser.getHash().isEmpty()) && + (perms & ((self ? Permissions.SelfRegister : Permissions.Register) | Permissions.Write)) > 0); + menu.findItem(R.id.context_local_mute).setVisible(!self); + menu.findItem(R.id.context_ignore_messages).setVisible(!self); - // TODO info + // TODO info // informationItem.enabled = (((perms & (Permissions.Write | Permissions.Register))) > 0 || (channelPermissions & (Permissions.Write | Permissions.Enter)) > 0 || (mUser.getSession() == mService.getSession())); - // Highlight toggles - menu.findItem(R.id.context_mute).setChecked(mUser.isMuted() || mUser.isSuppressed()); - menu.findItem(R.id.context_deafen).setChecked(mUser.isDeafened()); - menu.findItem(R.id.context_priority).setChecked(mUser.isPrioritySpeaker()); - menu.findItem(R.id.context_local_mute).setChecked(mUser.isLocalMuted()); - menu.findItem(R.id.context_ignore_messages).setChecked(mUser.isLocalIgnored()); - } catch (RemoteException e) { - e.printStackTrace(); - } + // Highlight toggles + menu.findItem(R.id.context_mute).setChecked(mUser.isMuted() || mUser.isSuppressed()); + menu.findItem(R.id.context_deafen).setChecked(mUser.isDeafened()); + menu.findItem(R.id.context_priority).setChecked(mUser.isPrioritySpeaker()); + menu.findItem(R.id.context_local_mute).setChecked(mUser.isLocalMuted()); + menu.findItem(R.id.context_ignore_messages).setChecked(mUser.isLocalIgnored()); } private void showUserComment(final boolean edit) throws RemoteException { @@ -174,11 +166,7 @@ public class UserMenuProvider implements View.OnClickListener, PopupMenu.OnMenuI @Override public void onClick(DialogInterface dialog, int which) { IChannel channel = channels.get(which); - try { - mService.moveUserToChannel(mUser.getSession(), channel.getId()); - } catch (RemoteException e) { - e.printStackTrace(); - } + mService.moveUserToChannel(mUser.getSession(), channel.getId()); } }); adb.show(); @@ -198,12 +186,8 @@ public class UserMenuProvider implements View.OnClickListener, PopupMenu.OnMenuI alertBuilder.setPositiveButton(R.string.user_menu_kick, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - try { - mService.kickBanUser(mUser.getSession(), - reasonField.getText().toString(), menuItem.getItemId() == R.id.context_ban); - } catch (RemoteException e) { - e.printStackTrace(); - } + mService.kickBanUser(mUser.getSession(), + reasonField.getText().toString(), menuItem.getItemId() == R.id.context_ban); } }); alertBuilder.setNegativeButton(android.R.string.cancel, null); @@ -241,11 +225,7 @@ public class UserMenuProvider implements View.OnClickListener, PopupMenu.OnMenuI .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - try { - mService.setUserComment(mUser.getSession(), ""); - } catch (RemoteException e) { - e.printStackTrace(); - } + mService.setUserComment(mUser.getSession(), ""); } }) .setNegativeButton(android.R.string.cancel, null) @@ -267,11 +247,7 @@ public class UserMenuProvider implements View.OnClickListener, PopupMenu.OnMenuI @Override public void onDismiss(PopupMenu popupMenu) { - try { - mService.unregisterObserver(mPermissionObserver); - } catch (RemoteException e) { - e.printStackTrace(); - } + mService.unregisterObserver(mPermissionObserver); } public interface Listener { diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/actionmode/ChannelActionModeCallback.java b/app/src/main/java/com/morlunk/mumbleclient/channel/actionmode/ChannelActionModeCallback.java index 79b1215..226174d 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/actionmode/ChannelActionModeCallback.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/actionmode/ChannelActionModeCallback.java @@ -78,38 +78,30 @@ public class ChannelActionModeCallback extends ChatTargetActionModeCallback { TintedMenuInflater inflater = new TintedMenuInflater(mContext, actionMode.getMenuInflater()); inflater.inflate(R.menu.context_channel, menu); - try { - actionMode.setTitle(mChannel.getName()); - actionMode.setSubtitle(R.string.current_chat_target); - // Request permissions update from server, if we don't have channel permissions - if(mChannel.getPermissions() == 0) - mService.requestPermissions(mChannel.getId()); - } catch (RemoteException e) { - e.printStackTrace(); - } + actionMode.setTitle(mChannel.getName()); + actionMode.setSubtitle(R.string.current_chat_target); + // Request permissions update from server, if we don't have channel permissions + if(mChannel.getPermissions() == 0) + mService.requestPermissions(mChannel.getId()); return true; } @Override public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { - try { - int perms = mChannel.getPermissions(); + int perms = mChannel.getPermissions(); - // This breaks uMurmur ACL. Put in a fix based on server version perhaps? - //menu.getMenu().findItem(R.id.menu_channel_add) - // .setVisible((permissions & (Permissions.MakeChannel | Permissions.MakeTempChannel)) > 0); - menu.findItem(R.id.context_channel_edit).setVisible((perms & Permissions.Write) > 0); - menu.findItem(R.id.context_channel_remove).setVisible((perms & Permissions.Write) > 0); - menu.findItem(R.id.context_channel_view_description) - .setVisible(mChannel.getDescription() != null || - mChannel.getDescriptionHash() != null); - Server server = mService.getConnectedServer(); - if(server != null) { - menu.findItem(R.id.context_channel_pin) - .setChecked(mDatabase.isChannelPinned(server.getId(), mChannel.getId())); - } - } catch (RemoteException e) { - e.printStackTrace(); + // This breaks uMurmur ACL. Put in a fix based on server version perhaps? + //menu.getMenu().findItem(R.id.menu_channel_add) + // .setVisible((permissions & (Permissions.MakeChannel | Permissions.MakeTempChannel)) > 0); + menu.findItem(R.id.context_channel_edit).setVisible((perms & Permissions.Write) > 0); + menu.findItem(R.id.context_channel_remove).setVisible((perms & Permissions.Write) > 0); + menu.findItem(R.id.context_channel_view_description) + .setVisible(mChannel.getDescription() != null || + mChannel.getDescriptionHash() != null); + Server server = mService.getConnectedServer(); + if(server != null) { + menu.findItem(R.id.context_channel_pin) + .setChecked(mDatabase.isChannelPinned(server.getId(), mChannel.getId())); } return false; @@ -120,26 +112,18 @@ public class ChannelActionModeCallback extends ChatTargetActionModeCallback { boolean adding = false; switch(menuItem.getItemId()) { case R.id.context_channel_join: - try { - mService.joinChannel(mChannel.getId()); - } catch (RemoteException e) { - e.printStackTrace(); - } + mService.joinChannel(mChannel.getId()); break; case R.id.context_channel_add: adding = true; case R.id.context_channel_edit: - try { - ChannelEditFragment addFragment = new ChannelEditFragment(); - Bundle args = new Bundle(); - if (adding) args.putInt("parent", mChannel.getId()); - else args.putInt("channel", mChannel.getId()); - args.putBoolean("adding", adding); - addFragment.setArguments(args); - addFragment.show(mFragmentManager, "ChannelAdd"); - } catch (RemoteException e) { - e.printStackTrace(); - } + ChannelEditFragment addFragment = new ChannelEditFragment(); + Bundle args = new Bundle(); + if (adding) args.putInt("parent", mChannel.getId()); + else args.putInt("channel", mChannel.getId()); + args.putBoolean("adding", adding); + addFragment.setArguments(args); + addFragment.show(mFragmentManager, "ChannelAdd"); break; case R.id.context_channel_remove: AlertDialog.Builder adb = new AlertDialog.Builder(mContext); @@ -148,38 +132,26 @@ public class ChannelActionModeCallback extends ChatTargetActionModeCallback { adb.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - try { - mService.removeChannel(mChannel.getId()); - } catch (RemoteException e) { - e.printStackTrace(); - } + mService.removeChannel(mChannel.getId()); } }); adb.setNegativeButton(android.R.string.cancel, null); adb.show(); break; case R.id.context_channel_view_description: - try { - Bundle commentArgs = new Bundle(); - commentArgs.putInt("channel", mChannel.getId()); - commentArgs.putString("comment", mChannel.getDescription()); - commentArgs.putBoolean("editing", false); - DialogFragment commentFragment = (DialogFragment) Fragment.instantiate(mContext, - ChannelDescriptionFragment.class.getName(), commentArgs); - commentFragment.show(mFragmentManager, ChannelDescriptionFragment.class.getName()); - } catch (RemoteException e) { - e.printStackTrace(); - } + Bundle commentArgs = new Bundle(); + commentArgs.putInt("channel", mChannel.getId()); + commentArgs.putString("comment", mChannel.getDescription()); + commentArgs.putBoolean("editing", false); + DialogFragment commentFragment = (DialogFragment) Fragment.instantiate(mContext, + ChannelDescriptionFragment.class.getName(), commentArgs); + commentFragment.show(mFragmentManager, ChannelDescriptionFragment.class.getName()); break; case R.id.context_channel_pin: - try { - long serverId = mService.getConnectedServer().getId(); - boolean pinned = mDatabase.isChannelPinned(serverId, mChannel.getId()); - if(!pinned) mDatabase.addPinnedChannel(serverId, mChannel.getId()); - else mDatabase.removePinnedChannel(serverId, mChannel.getId()); - } catch (RemoteException e) { - e.printStackTrace(); - } + long serverId = mService.getConnectedServer().getId(); + boolean pinned = mDatabase.isChannelPinned(serverId, mChannel.getId()); + if(!pinned) mDatabase.addPinnedChannel(serverId, mChannel.getId()); + else mDatabase.removePinnedChannel(serverId, mChannel.getId()); break; } actionMode.finish(); diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/actionmode/UserActionModeCallback.java b/app/src/main/java/com/morlunk/mumbleclient/channel/actionmode/UserActionModeCallback.java index fb6b257..e0680ca 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/actionmode/UserActionModeCallback.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/actionmode/UserActionModeCallback.java @@ -62,12 +62,8 @@ public class UserActionModeCallback extends ChatTargetActionModeCallback { @Override public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { super.onCreateActionMode(actionMode, menu); - try { - actionMode.setTitle(mUser.getName()); - actionMode.setSubtitle(R.string.current_chat_target); - } catch (RemoteException e) { - e.printStackTrace(); - } + actionMode.setTitle(mUser.getName()); + actionMode.setSubtitle(R.string.current_chat_target); return true; } diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/comment/ChannelDescriptionFragment.java b/app/src/main/java/com/morlunk/mumbleclient/channel/comment/ChannelDescriptionFragment.java index da470fd..7e200f3 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/comment/ChannelDescriptionFragment.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/comment/ChannelDescriptionFragment.java @@ -33,7 +33,7 @@ public class ChannelDescriptionFragment extends AbstractCommentFragment { public void requestComment(final IJumbleService service) throws RemoteException { service.registerObserver(new JumbleObserver() { @Override - public void onChannelStateUpdated(IChannel channel) throws RemoteException { + public void onChannelStateUpdated(IChannel channel) { if(channel.getId() == getChannelId() && channel.getDescription() != null) { loadComment(channel.getDescription()); diff --git a/app/src/main/java/com/morlunk/mumbleclient/channel/comment/UserCommentFragment.java b/app/src/main/java/com/morlunk/mumbleclient/channel/comment/UserCommentFragment.java index f003d9d..9e74427 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/channel/comment/UserCommentFragment.java +++ b/app/src/main/java/com/morlunk/mumbleclient/channel/comment/UserCommentFragment.java @@ -33,7 +33,7 @@ public class UserCommentFragment extends AbstractCommentFragment { public void requestComment(final IJumbleService service) throws RemoteException { service.registerObserver(new JumbleObserver() { @Override - public void onUserStateUpdated(IUser user) throws RemoteException { + public void onUserStateUpdated(IUser user) { if(user.getSession() == getSession() && user.getComment() != null) { loadComment(user.getComment()); diff --git a/app/src/main/java/com/morlunk/mumbleclient/service/IChatMessage.java b/app/src/main/java/com/morlunk/mumbleclient/service/IChatMessage.java index 37bfccf..9ecdeb5 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/service/IChatMessage.java +++ b/app/src/main/java/com/morlunk/mumbleclient/service/IChatMessage.java @@ -61,22 +61,12 @@ public interface IChatMessage { @Override public String getBody() { - try { - return mMessage.getMessage(); - } catch (RemoteException e) { - e.printStackTrace(); - return null; - } + return mMessage.getMessage(); } @Override public long getReceivedTime() { - try { - return mMessage.getReceivedTime(); - } catch (RemoteException e) { - e.printStackTrace(); - return 0; - } + return mMessage.getReceivedTime(); } @Override diff --git a/app/src/main/java/com/morlunk/mumbleclient/service/PlumbleOverlay.java b/app/src/main/java/com/morlunk/mumbleclient/service/PlumbleOverlay.java index 17b1288..934ea35 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/service/PlumbleOverlay.java +++ b/app/src/main/java/com/morlunk/mumbleclient/service/PlumbleOverlay.java @@ -48,23 +48,23 @@ public class PlumbleOverlay { private JumbleObserver mObserver = new JumbleObserver() { @Override - public void onUserTalkStateUpdated(IUser user) throws RemoteException { + public void onUserTalkStateUpdated(IUser user) { mChannelAdapter.notifyDataSetChanged(); } @Override - public void onUserStateUpdated(IUser user) throws RemoteException { + public void onUserStateUpdated(IUser user) { if(user.getChannel() != null && - user.getChannel().equals(mService.getBinder().getSessionChannel())) + user.getChannel().equals(mService.getSessionChannel())) mChannelAdapter.notifyDataSetChanged(); } @Override - public void onUserJoinedChannel(IUser user, IChannel newChannel, IChannel oldChannel) throws RemoteException { - if(user.getSession() == mService.getBinder().getSession()) // Session user has changed channels - mChannelAdapter.setChannel(mService.getBinder().getSessionChannel()); - else if(newChannel.getId() == mService.getBinder().getSessionChannel().getId() || - oldChannel.getId() == mService.getBinder().getSessionChannel().getId()) + public void onUserJoinedChannel(IUser user, IChannel newChannel, IChannel oldChannel) { + if(user.getSession() == mService.getSession()) // Session user has changed channels + mChannelAdapter.setChannel(mService.getSessionChannel()); + else if(newChannel.getId() == mService.getSessionChannel().getId() || + oldChannel.getId() == mService.getSessionChannel().getId()) mChannelAdapter.notifyDataSetChanged(); } }; @@ -160,16 +160,12 @@ public class PlumbleOverlay { mTalkButton.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { - try { - if(MotionEvent.ACTION_DOWN == event.getAction()) { - mService.getBinder().setTalkingState(true); - return true; - } else if(MotionEvent.ACTION_UP == event.getAction()) { - mService.getBinder().setTalkingState(false); - return true; - } - } catch (RemoteException e) { - e.printStackTrace(); + if(MotionEvent.ACTION_DOWN == event.getAction()) { + mService.setTalkingState(true); + return true; + } else if(MotionEvent.ACTION_UP == event.getAction()) { + mService.setTalkingState(false); + return true; } return false; } @@ -206,30 +202,22 @@ public class PlumbleOverlay { if(mShown) return; mShown = true; - try { - mChannelAdapter = new ChannelAdapter(mService, mService.getBinder().getSessionChannel()); - mOverlayList.setAdapter(mChannelAdapter); - mService.getBinder().registerObserver(mObserver); - WindowManager windowManager = (WindowManager) mService.getSystemService(Context.WINDOW_SERVICE); - windowManager.addView(mOverlayView, mOverlayParams); - } catch (RemoteException e) { - e.printStackTrace(); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } + mChannelAdapter = new ChannelAdapter(mService, mService.getSessionChannel()); + mOverlayList.setAdapter(mChannelAdapter); + mService.registerObserver(mObserver); + WindowManager windowManager = (WindowManager) mService.getSystemService(Context.WINDOW_SERVICE); + windowManager.addView(mOverlayView, mOverlayParams); } public void hide() { if(!mShown) return; mShown = false; + mService.unregisterObserver(mObserver); + mOverlayList.setAdapter(null); try { - mService.getBinder().unregisterObserver(mObserver); - mOverlayList.setAdapter(null); WindowManager windowManager = (WindowManager) mService.getSystemService(Context.WINDOW_SERVICE); windowManager.removeView(mOverlayView); - } catch (RemoteException e) { - e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } diff --git a/app/src/main/java/com/morlunk/mumbleclient/service/PlumbleService.java b/app/src/main/java/com/morlunk/mumbleclient/service/PlumbleService.java index 127bbf8..a033e46 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/service/PlumbleService.java +++ b/app/src/main/java/com/morlunk/mumbleclient/service/PlumbleService.java @@ -33,6 +33,7 @@ import android.view.WindowManager; import com.morlunk.jumble.Constants; import com.morlunk.jumble.JumbleService; +import com.morlunk.jumble.exception.AudioException; import com.morlunk.jumble.model.IMessage; import com.morlunk.jumble.model.IUser; import com.morlunk.jumble.model.TalkState; @@ -63,7 +64,6 @@ public class PlumbleService extends JumbleService implements public static final int TTS_THRESHOLD = 250; // Maximum number of characters to read public static final int RECONNECT_DELAY = 10000; - private PlumbleBinder mBinder = new PlumbleBinder(); private Settings mSettings; private PlumbleNotification mNotification; private PlumbleReconnectNotification mReconnectNotification; @@ -96,20 +96,12 @@ public class PlumbleService extends JumbleService implements private PlumbleHotCorner.PlumbleHotCornerListener mHotCornerListener = new PlumbleHotCorner.PlumbleHotCornerListener() { @Override public void onHotCornerDown() { - try { - mBinder.onTalkKeyDown(); - } catch (RemoteException e) { - e.printStackTrace(); - } + onTalkKeyDown(); } @Override public void onHotCornerUp() { - try { - mBinder.onTalkKeyUp(); - } catch (RemoteException e) { - e.printStackTrace(); - } + onTalkKeyUp(); } }; @@ -118,7 +110,7 @@ public class PlumbleService extends JumbleService implements private JumbleObserver mObserver = new JumbleObserver() { @Override - public void onConnecting() throws RemoteException { + public void onConnecting() { // Remove old notification left from reconnect, if (mReconnectNotification != null) { mReconnectNotification.hide(); @@ -133,7 +125,7 @@ public class PlumbleService extends JumbleService implements } @Override - public void onConnected() throws RemoteException { + public void onConnected() { if (mNotification != null) { mNotification.setCustomTicker(getString(R.string.plumbleConnected)); mNotification.setCustomContentText(getString(R.string.connected)); @@ -143,7 +135,7 @@ public class PlumbleService extends JumbleService implements } @Override - public void onDisconnected(JumbleException e) throws RemoteException { + public void onDisconnected(JumbleException e) { if (mNotification != null) { mNotification.hide(); mNotification = null; @@ -151,23 +143,23 @@ public class PlumbleService extends JumbleService implements if (e != null) { mReconnectNotification = PlumbleReconnectNotification.show(PlumbleService.this, e.getMessage(), - getBinder().isReconnecting(), + isReconnecting(), PlumbleService.this); } } @Override - public void onUserConnected(IUser user) throws RemoteException { + public void onUserConnected(IUser user) { if (user.getTextureHash() != null && user.getTexture() == null) { // Request avatar data if available. - getBinder().requestAvatar(user.getSession()); + requestAvatar(user.getSession()); } } @Override - public void onUserStateUpdated(IUser user) throws RemoteException { - if(user.getSession() == mBinder.getSession()) { + public void onUserStateUpdated(IUser user) { + if(user.getSession() == getSession()) { mSettings.setMutedAndDeafened(user.isSelfMuted(), user.isSelfDeafened()); // Update settings mute/deafen state if(mNotification != null) { String contentText; @@ -185,12 +177,12 @@ public class PlumbleService extends JumbleService implements if (user.getTextureHash() != null && user.getTexture() == null) { // Update avatar data if available. - getBinder().requestAvatar(user.getSession()); + requestAvatar(user.getSession()); } } @Override - public void onMessageLogged(IMessage message) throws RemoteException { + public void onMessageLogged(IMessage message) { // Split on / strip all HTML tags. Document parsedMessage = Jsoup.parseBodyFragment(message.getMessage()); String strippedMessage = parsedMessage.text(); @@ -220,8 +212,8 @@ public class PlumbleService extends JumbleService implements if(mSettings.isTextToSpeechEnabled() && mTTS != null && formattedTtsMessage.length() <= TTS_THRESHOLD && - getBinder().getSessionUser() != null && - !getBinder().getSessionUser().isSelfDeafened()) { + getSessionUser() != null && + !getSessionUser().isSelfDeafened()) { mTTS.speak(formattedTtsMessage, TextToSpeech.QUEUE_ADD, null); } @@ -229,22 +221,22 @@ public class PlumbleService extends JumbleService implements } @Override - public void onLogInfo(String message) throws RemoteException { + public void onLogInfo(String message) { mMessageLog.add(new IChatMessage.InfoMessage(IChatMessage.InfoMessage.Type.INFO, message)); } @Override - public void onLogWarning(String message) throws RemoteException { + public void onLogWarning(String message) { mMessageLog.add(new IChatMessage.InfoMessage(IChatMessage.InfoMessage.Type.WARNING, message)); } @Override - public void onLogError(String message) throws RemoteException { + public void onLogError(String message) { mMessageLog.add(new IChatMessage.InfoMessage(IChatMessage.InfoMessage.Type.ERROR, message)); } @Override - public void onPermissionDenied(String reason) throws RemoteException { + public void onPermissionDenied(String reason) { if(mSettings.isChatNotifyEnabled() && mNotification != null) { mNotification.setCustomTicker(reason); @@ -253,10 +245,10 @@ public class PlumbleService extends JumbleService implements } @Override - public void onUserTalkStateUpdated(IUser user) throws RemoteException { - if (isConnected() && - mBinder.getSession() == user.getSession() && - mBinder.getTransmitMode() == Constants.TRANSMIT_PUSH_TO_TALK && + public void onUserTalkStateUpdated(IUser user) { + if (isConnectionEstablished() && + getSession() == user.getSession() && + getTransmitMode() == Constants.TRANSMIT_PUSH_TO_TALK && user.getTalkState() == TalkState.TALKING && mPTTSoundEnabled) { AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); @@ -268,11 +260,7 @@ public class PlumbleService extends JumbleService implements @Override public void onCreate() { super.onCreate(); - try { - getBinder().registerObserver(mObserver); - } catch (RemoteException e) { - e.printStackTrace(); - } + registerObserver(mObserver); // Register for preference changes mSettings = Settings.getInstance(this); @@ -293,7 +281,7 @@ public class PlumbleService extends JumbleService implements if(mSettings.isTextToSpeechEnabled()) mTTS = new TextToSpeech(this, mTTSInitListener); - mTalkReceiver = new TalkBroadcastReceiver(getBinder()); + mTalkReceiver = new TalkBroadcastReceiver(this); mMessageLog = new ArrayList<>(); } @@ -316,11 +304,7 @@ public class PlumbleService extends JumbleService implements e.printStackTrace(); } - try { - getBinder().unregisterObserver(mObserver); - } catch (RemoteException e) { - e.printStackTrace(); - } + unregisterObserver(mObserver); if(mTTS != null) mTTS.shutdown(); mMessageLog = null; super.onDestroy(); @@ -332,11 +316,7 @@ public class PlumbleService extends JumbleService implements // Restore mute/deafen state if(mSettings.isMuted() || mSettings.isDeafened()) { - try { - getBinder().setSelfMuteDeafState(mSettings.isMuted(), mSettings.isDeafened()); - } catch (RemoteException e) { - e.printStackTrace(); - } + setSelfMuteDeafState(mSettings.isMuted(), mSettings.isDeafened()); } registerReceiver(mTalkReceiver, new IntentFilter(TalkBroadcastReceiver.BROADCAST_TALK)); @@ -384,7 +364,7 @@ public class PlumbleService extends JumbleService implements mChannelOverlay.setPushToTalkShown(inputMethod == Constants.TRANSMIT_PUSH_TO_TALK); break; case Settings.PREF_HANDSET_MODE: - setProximitySensorOn(isConnected() && mSettings.isHandsetMode()); + setProximitySensorOn(isConnectionEstablished() && mSettings.isHandsetMode()); changedExtras.putInt(JumbleService.EXTRAS_AUDIO_STREAM, mSettings.isHandsetMode() ? AudioManager.STREAM_VOICE_CALL : AudioManager.STREAM_MUSIC); break; @@ -394,7 +374,7 @@ public class PlumbleService extends JumbleService implements break; case Settings.PREF_HOT_CORNER_KEY: mHotCorner.setGravity(mSettings.getHotCornerGravity()); - mHotCorner.setShown(isConnected() && mSettings.isHotCornerEnabled()); + mHotCorner.setShown(isConnectionEstablished() && mSettings.isHotCornerEnabled()); break; case Settings.PREF_USE_TTS: if (mTTS == null && mSettings.isTextToSpeechEnabled()) @@ -443,13 +423,13 @@ public class PlumbleService extends JumbleService implements if (changedExtras.size() > 0) { try { // Reconfigure the service appropriately. - requiresReconnect |= mBinder.reconfigure(changedExtras); - } catch (RemoteException e) { + requiresReconnect |= configureExtras(changedExtras); + } catch (AudioException e) { e.printStackTrace(); } } - if (requiresReconnect && isConnected()) { + if (requiresReconnect && isConnectionEstablished()) { AlertDialog ad = new AlertDialog.Builder(this) .setTitle(R.string.information) .setMessage(R.string.change_requires_reconnect) @@ -472,38 +452,20 @@ public class PlumbleService extends JumbleService implements } @Override - public PlumbleBinder getBinder() { - return mBinder; - } - - @Override - public IBinder onBind(Intent intent) { - return mBinder; - } - - @Override public void onMuteToggled() { - try { - IUser user = mBinder.getSessionUser(); - if (isConnected() && user != null) { - boolean muted = !user.isSelfMuted(); - boolean deafened = user.isSelfDeafened() && muted; - mBinder.setSelfMuteDeafState(muted, deafened); - } - } catch (RemoteException e) { - e.printStackTrace(); + IUser user = getSessionUser(); + if (isConnectionEstablished() && user != null) { + boolean muted = !user.isSelfMuted(); + boolean deafened = user.isSelfDeafened() && muted; + setSelfMuteDeafState(muted, deafened); } } @Override public void onDeafenToggled() { - try { - IUser user = mBinder.getSessionUser(); - if (isConnected() && user != null) { - mBinder.setSelfMuteDeafState(!user.isSelfDeafened(), !user.isSelfDeafened()); - } - } catch (RemoteException e) { - e.printStackTrace(); + IUser user = getSessionUser(); + if (isConnectionEstablished() && user != null) { + setSelfMuteDeafState(!user.isSelfDeafened(), !user.isSelfDeafened()); } } @@ -528,87 +490,73 @@ public class PlumbleService extends JumbleService implements @Override public void cancelReconnect() { - try { - mBinder.cancelReconnect(); - } catch (RemoteException e) { - e.printStackTrace(); + if (mReconnectNotification != null) { + mReconnectNotification.hide(); + mReconnectNotification = null; } + super.cancelReconnect(); } - /** - * An extension of JumbleBinder to add Plumble-specific functionality. - */ - public class PlumbleBinder extends JumbleBinder { - public void setOverlayShown(boolean showOverlay) { - if(!mChannelOverlay.isShown()) { - mChannelOverlay.show(); - } else { - mChannelOverlay.hide(); - } - } - - public boolean isOverlayShown() { - return mChannelOverlay.isShown(); - } - - public void clearChatNotifications() throws RemoteException { - if (mNotification != null) { - mNotification.clearMessages(); - mNotification.show(); - } + public void setOverlayShown(boolean showOverlay) { + if(!mChannelOverlay.isShown()) { + mChannelOverlay.show(); + } else { + mChannelOverlay.hide(); } + } - public void markErrorShown() { - mErrorShown = true; - } + public boolean isOverlayShown() { + return mChannelOverlay.isShown(); + } - public boolean isErrorShown() { - return mErrorShown; + public void clearChatNotifications() throws RemoteException { + if (mNotification != null) { + mNotification.clearMessages(); + mNotification.show(); } + } - public void cancelReconnect() throws RemoteException { - if (mReconnectNotification != null) { - mReconnectNotification.hide(); - mReconnectNotification = null; - } + public void markErrorShown() { + mErrorShown = true; + } - super.cancelReconnect(); - } + public boolean isErrorShown() { + return mErrorShown; + } - /** - * Called when a user presses a talk key down (i.e. when they want to talk). - * Accounts for talk logic if toggle PTT is on. - */ - public void onTalkKeyDown() throws RemoteException { - if(isConnected() - && Settings.ARRAY_INPUT_METHOD_PTT.equals(mSettings.getInputMethod())) { - if (!mSettings.isPushToTalkToggle() && !isTalking()) { - setTalkingState(true); // Start talking - } + /** + * Called when a user presses a talk key down (i.e. when they want to talk). + * Accounts for talk logic if toggle PTT is on. + */ + public void onTalkKeyDown() { + if(isConnectionEstablished() + && Settings.ARRAY_INPUT_METHOD_PTT.equals(mSettings.getInputMethod())) { + if (!mSettings.isPushToTalkToggle() && !isTalking()) { + setTalkingState(true); // Start talking } } + } - /** - * Called when a user releases a talk key (i.e. when they do not want to talk). - * Accounts for talk logic if toggle PTT is on. - */ - public void onTalkKeyUp() throws RemoteException { - if(isConnected() - && Settings.ARRAY_INPUT_METHOD_PTT.equals(mSettings.getInputMethod())) { - if (mSettings.isPushToTalkToggle()) { - setTalkingState(!isTalking()); // Toggle talk state - } else if (isTalking()) { - setTalkingState(false); // Stop talking - } + /** + * Called when a user releases a talk key (i.e. when they do not want to talk). + * Accounts for talk logic if toggle PTT is on. + */ + public void onTalkKeyUp() { + if(isConnectionEstablished() + && Settings.ARRAY_INPUT_METHOD_PTT.equals(mSettings.getInputMethod())) { + if (mSettings.isPushToTalkToggle()) { + setTalkingState(!isTalking()); // Toggle talk state + } else if (isTalking()) { + setTalkingState(false); // Stop talking } } + } - public List<IChatMessage> getMessageLog() { - return Collections.unmodifiableList(mMessageLog); - } + public List<IChatMessage> getMessageLog() { + return Collections.unmodifiableList(mMessageLog); + } - public void clearMessageLog() { - mMessageLog.clear(); - } + public void clearMessageLog() { + mMessageLog.clear(); } } diff --git a/app/src/main/java/com/morlunk/mumbleclient/service/ipc/TalkBroadcastReceiver.java b/app/src/main/java/com/morlunk/mumbleclient/service/ipc/TalkBroadcastReceiver.java index 57772cd..9166fbf 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/service/ipc/TalkBroadcastReceiver.java +++ b/app/src/main/java/com/morlunk/mumbleclient/service/ipc/TalkBroadcastReceiver.java @@ -20,7 +20,6 @@ package com.morlunk.mumbleclient.service.ipc; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.os.RemoteException; import com.morlunk.jumble.IJumbleService; @@ -42,22 +41,18 @@ public class TalkBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - try { - if (BROADCAST_TALK.equals(intent.getAction())) { - String status = intent.getStringExtra(EXTRA_TALK_STATUS); - if (status == null) status = TALK_STATUS_TOGGLE; - if (TALK_STATUS_ON.equals(status)) { - mService.setTalkingState(true); - } else if (TALK_STATUS_OFF.equals(status)) { - mService.setTalkingState(false); - } else if (TALK_STATUS_TOGGLE.equals(status)) { - mService.setTalkingState(!mService.isTalking()); - } - } else { - throw new UnsupportedOperationException(); + if (BROADCAST_TALK.equals(intent.getAction())) { + String status = intent.getStringExtra(EXTRA_TALK_STATUS); + if (status == null) status = TALK_STATUS_TOGGLE; + if (TALK_STATUS_ON.equals(status)) { + mService.setTalkingState(true); + } else if (TALK_STATUS_OFF.equals(status)) { + mService.setTalkingState(false); + } else if (TALK_STATUS_TOGGLE.equals(status)) { + mService.setTalkingState(!mService.isTalking()); } - } catch (RemoteException e) { - e.printStackTrace(); + } else { + throw new UnsupportedOperationException(); } } } diff --git a/app/src/main/java/com/morlunk/mumbleclient/util/JumbleServiceFragment.java b/app/src/main/java/com/morlunk/mumbleclient/util/JumbleServiceFragment.java index b1025eb..cde3c7c 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/util/JumbleServiceFragment.java +++ b/app/src/main/java/com/morlunk/mumbleclient/util/JumbleServiceFragment.java @@ -24,8 +24,8 @@ import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.View; -import com.morlunk.jumble.IJumbleObserver; import com.morlunk.jumble.IJumbleService; +import com.morlunk.jumble.util.IJumbleObserver; import com.morlunk.mumbleclient.service.PlumbleService; /** @@ -78,24 +78,16 @@ public abstract class JumbleServiceFragment extends Fragment { private void onServiceAttached(IJumbleService service) { mBound = true; - try { - if(getServiceObserver() != null) - service.registerObserver(getServiceObserver()); - } catch (RemoteException e) { - e.printStackTrace(); - } + if(getServiceObserver() != null) + service.registerObserver(getServiceObserver()); onServiceBound(service); } private void onServiceDetached(IJumbleService service) { mBound = false; - try { - if(getServiceObserver() != null) - service.unregisterObserver(getServiceObserver()); - } catch (RemoteException e) { - e.printStackTrace(); - } + if(getServiceObserver() != null) + service.unregisterObserver(getServiceObserver()); onServiceUnbound(); } @@ -107,7 +99,7 @@ public abstract class JumbleServiceFragment extends Fragment { onServiceDetached(mServiceProvider.getService()); } - public PlumbleService.PlumbleBinder getService() { + public PlumbleService getService() { return mServiceProvider.getService(); } } diff --git a/app/src/main/java/com/morlunk/mumbleclient/util/JumbleServiceProvider.java b/app/src/main/java/com/morlunk/mumbleclient/util/JumbleServiceProvider.java index 8e98054..797c68a 100644 --- a/app/src/main/java/com/morlunk/mumbleclient/util/JumbleServiceProvider.java +++ b/app/src/main/java/com/morlunk/mumbleclient/util/JumbleServiceProvider.java @@ -24,7 +24,7 @@ import com.morlunk.mumbleclient.service.PlumbleService; * Created by andrew on 03/08/13. */ public interface JumbleServiceProvider { - public PlumbleService.PlumbleBinder getService(); - public void addServiceFragment(JumbleServiceFragment fragment); - public void removeServiceFragment(JumbleServiceFragment fragment); + PlumbleService getService(); + void addServiceFragment(JumbleServiceFragment fragment); + void removeServiceFragment(JumbleServiceFragment fragment); } |