Commit 6007fd56 authored by Yusuke Iwaki's avatar Yusuke Iwaki

reformat with SquareAndroid plugin for Android Studio (google-java-formatter didn't work properly!)

parent 352f0c01
<lint> <lint>
<issue id="InvalidPackage"> <issue id="InvalidPackage">
<ignore regexp="okio.*jar" /> <ignore regexp="okio.*jar"/>
</issue> </issue>
</lint> </lint>
\ No newline at end of file
...@@ -5,23 +5,26 @@ ...@@ -5,23 +5,26 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application <application
android:name=".RocketChatApplication"
android:allowBackup="true" android:allowBackup="true"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme" android:theme="@style/AppTheme">
android:name=".RocketChatApplication">
<activity android:name=".activity.MainActivity" <activity
android:name=".activity.MainActivity"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".activity.ServerConfigActivity" <activity
android:name=".activity.ServerConfigActivity"
android:windowSoftInputMode="adjustResize"/> android:windowSoftInputMode="adjustResize"/>
<service android:name=".service.RocketChatService"/> <service android:name=".service.RocketChatService"/>
......
...@@ -2,7 +2,6 @@ package chat.rocket.android; ...@@ -2,7 +2,6 @@ package chat.rocket.android;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import chat.rocket.android.activity.ServerConfigActivity; import chat.rocket.android.activity.ServerConfigActivity;
/** /**
......
package chat.rocket.android; package chat.rocket.android;
import android.app.Application; import android.app.Application;
import com.facebook.stetho.Stetho; import com.facebook.stetho.Stetho;
import com.uphyca.stetho_realm.RealmInspectorModulesProvider; import com.uphyca.stetho_realm.RealmInspectorModulesProvider;
import io.realm.Realm; import io.realm.Realm;
import io.realm.RealmConfiguration; import io.realm.RealmConfiguration;
import timber.log.Timber; import timber.log.Timber;
...@@ -13,19 +11,16 @@ import timber.log.Timber; ...@@ -13,19 +11,16 @@ import timber.log.Timber;
* Customized Application-class for Rocket.Chat * Customized Application-class for Rocket.Chat
*/ */
public class RocketChatApplication extends Application { public class RocketChatApplication extends Application {
@Override @Override public void onCreate() {
public void onCreate() {
super.onCreate(); super.onCreate();
Timber.plant(new Timber.DebugTree()); Timber.plant(new Timber.DebugTree());
Realm.init(this); Realm.init(this);
Realm.setDefaultConfiguration(new RealmConfiguration.Builder() Realm.setDefaultConfiguration(
.deleteRealmIfMigrationNeeded() new RealmConfiguration.Builder().deleteRealmIfMigrationNeeded().build());
.build());
Stetho.initialize( Stetho.initialize(Stetho.newInitializerBuilder(this)
Stetho.newInitializerBuilder(this)
.enableDumpapp(Stetho.defaultDumperPluginsProvider(this)) .enableDumpapp(Stetho.defaultDumperPluginsProvider(this))
.enableWebKitInspector(RealmInspectorModulesProvider.builder(this).build()) .enableWebKitInspector(RealmInspectorModulesProvider.builder(this).build())
.build()); .build());
......
package chat.rocket.android.activity; package chat.rocket.android.activity;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import java.util.List;
import java.util.UUID;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.ServerConfig; import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.service.RocketChatService; import chat.rocket.android.service.RocketChatService;
import io.realm.Realm; import io.realm.Realm;
import io.realm.RealmResults; import io.realm.RealmResults;
import java.util.List;
import java.util.UUID;
import jp.co.crowdworks.realm_java_helpers.RealmListObserver; import jp.co.crowdworks.realm_java_helpers.RealmListObserver;
import jp.co.crowdworks.realm_java_helpers_bolts.RealmHelperBolts; import jp.co.crowdworks.realm_java_helpers_bolts.RealmHelperBolts;
abstract class AbstractAuthedActivity extends AppCompatActivity { abstract class AbstractAuthedActivity extends AppCompatActivity {
private RealmListObserver<ServerConfig> serverConfigEmptinessObserver =
private RealmListObserver<ServerConfig> mInsertEmptyRecordIfNoConfigurationExists =
new RealmListObserver<ServerConfig>() { new RealmListObserver<ServerConfig>() {
@Override @Override protected RealmResults<ServerConfig> queryItems(Realm realm) {
protected RealmResults<ServerConfig> queryItems(Realm realm) {
return realm.where(ServerConfig.class).findAll(); return realm.where(ServerConfig.class).findAll();
} }
@Override @Override protected void onCollectionChanged(List<ServerConfig> list) {
protected void onCollectionChanged(List<ServerConfig> list) {
if (list.isEmpty()) { if (list.isEmpty()) {
final String newId = UUID.randomUUID().toString(); final String newId = UUID.randomUUID().toString();
RealmHelperBolts RealmHelperBolts.executeTransaction(
.executeTransaction(realm -> realm -> realm.createObject(ServerConfig.class, newId))
realm.createObject(ServerConfig.class, newId))
.continueWith(new LogcatIfError()); .continueWith(new LogcatIfError());
} }
} }
}; };
private RealmListObserver<ServerConfig> mShowConfigActivityIfNeeded = private RealmListObserver<ServerConfig> loginRequiredServerConfigObserver =
new RealmListObserver<ServerConfig>() { new RealmListObserver<ServerConfig>() {
@Override @Override protected RealmResults<ServerConfig> queryItems(Realm realm) {
protected RealmResults<ServerConfig> queryItems(Realm realm) {
return ServerConfig.queryLoginRequiredConnections(realm).findAll(); return ServerConfig.queryLoginRequiredConnections(realm).findAll();
} }
@Override @Override protected void onCollectionChanged(List<ServerConfig> list) {
protected void onCollectionChanged(List<ServerConfig> list) {
ServerConfigActivity.launchFor(AbstractAuthedActivity.this, list); ServerConfigActivity.launchFor(AbstractAuthedActivity.this, list);
} }
}; };
@Override @Override protected void onResume() {
protected void onResume() {
super.onResume(); super.onResume();
RocketChatService.keepalive(this); RocketChatService.keepalive(this);
mInsertEmptyRecordIfNoConfigurationExists.sub(); serverConfigEmptinessObserver.sub();
mShowConfigActivityIfNeeded.sub(); loginRequiredServerConfigObserver.sub();
} }
@Override @Override protected void onPause() {
protected void onPause() { loginRequiredServerConfigObserver.unsub();
mShowConfigActivityIfNeeded.unsub(); serverConfigEmptinessObserver.unsub();
mInsertEmptyRecordIfNoConfigurationExists.unsub();
super.onPause(); super.onPause();
} }
} }
...@@ -3,22 +3,22 @@ package chat.rocket.android.activity; ...@@ -3,22 +3,22 @@ package chat.rocket.android.activity;
import android.support.annotation.IdRes; import android.support.annotation.IdRes;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import chat.rocket.android.helper.OnBackPressListener; import chat.rocket.android.helper.OnBackPressListener;
abstract class AbstractFragmentActivity extends AppCompatActivity { abstract class AbstractFragmentActivity extends AppCompatActivity {
protected abstract @IdRes int getLayoutContainerForFragment(); protected abstract @IdRes int getLayoutContainerForFragment();
@Override @Override public void onBackPressed() {
public void onBackPressed() {
Fragment fragment = Fragment fragment =
getSupportFragmentManager().findFragmentById(getLayoutContainerForFragment()); getSupportFragmentManager().findFragmentById(getLayoutContainerForFragment());
if (fragment instanceof OnBackPressListener if (fragment instanceof OnBackPressListener
&& ((OnBackPressListener) fragment).onBackPressed()) { && ((OnBackPressListener) fragment).onBackPressed()) {
//consumed. do nothing. //consumed. do nothing.
} else super.onBackPressed(); } else {
super.onBackPressed();
}
} }
protected void showFragment(Fragment fragment) { protected void showFragment(Fragment fragment) {
......
...@@ -2,7 +2,6 @@ package chat.rocket.android.activity; ...@@ -2,7 +2,6 @@ package chat.rocket.android.activity;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.ServerConfig; import chat.rocket.android.model.ServerConfig;
...@@ -12,14 +11,13 @@ import jp.co.crowdworks.realm_java_helpers_bolts.RealmHelperBolts; ...@@ -12,14 +11,13 @@ import jp.co.crowdworks.realm_java_helpers_bolts.RealmHelperBolts;
* Entry-point for Rocket.Chat.Android application. * Entry-point for Rocket.Chat.Android application.
*/ */
public class MainActivity extends AbstractAuthedActivity { public class MainActivity extends AbstractAuthedActivity {
@Override @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
if (savedInstanceState == null) { if (savedInstanceState == null) {
RealmHelperBolts.executeTransaction(realm -> { RealmHelperBolts.executeTransaction(realm -> {
for (ServerConfig config: ServerConfig.queryActiveConnections(realm).findAll()) { for (ServerConfig config : ServerConfig.queryActiveConnections(realm).findAll()) {
config.setTokenVerified(false); config.setTokenVerified(false);
} }
return null; return null;
......
...@@ -5,9 +5,6 @@ import android.content.Intent; ...@@ -5,9 +5,6 @@ import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import java.util.List;
import chat.rocket.android.LaunchUtil; import chat.rocket.android.LaunchUtil;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.fragment.server_config.ConnectingToHostFragment; import chat.rocket.android.fragment.server_config.ConnectingToHostFragment;
...@@ -19,6 +16,7 @@ import chat.rocket.android.service.RocketChatService; ...@@ -19,6 +16,7 @@ import chat.rocket.android.service.RocketChatService;
import io.realm.Realm; import io.realm.Realm;
import io.realm.RealmList; import io.realm.RealmList;
import io.realm.RealmQuery; import io.realm.RealmQuery;
import java.util.List;
import jp.co.crowdworks.realm_java_helpers.RealmObjectObserver; import jp.co.crowdworks.realm_java_helpers.RealmObjectObserver;
/** /**
...@@ -26,21 +24,14 @@ import jp.co.crowdworks.realm_java_helpers.RealmObjectObserver; ...@@ -26,21 +24,14 @@ import jp.co.crowdworks.realm_java_helpers.RealmObjectObserver;
*/ */
public class ServerConfigActivity extends AbstractFragmentActivity { public class ServerConfigActivity extends AbstractFragmentActivity {
@Override
protected int getLayoutContainerForFragment() {
return R.id.content;
}
private String mServerConfigId; private String mServerConfigId;
private RealmObjectObserver<ServerConfig> mServerConfigObserver = private RealmObjectObserver<ServerConfig> mServerConfigObserver =
new RealmObjectObserver<ServerConfig>() { new RealmObjectObserver<ServerConfig>() {
@Override @Override protected RealmQuery<ServerConfig> query(Realm realm) {
protected RealmQuery<ServerConfig> query(Realm realm) {
return realm.where(ServerConfig.class).equalTo("id", mServerConfigId); return realm.where(ServerConfig.class).equalTo("id", mServerConfigId);
} }
@Override @Override protected void onChange(ServerConfig config) {
protected void onChange(ServerConfig config) {
onRenderServerConfig(config); onRenderServerConfig(config);
} }
}; };
...@@ -49,7 +40,7 @@ public class ServerConfigActivity extends AbstractFragmentActivity { ...@@ -49,7 +40,7 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
* Start the ServerConfigActivity with considering the priority of ServerConfig in the list. * Start the ServerConfigActivity with considering the priority of ServerConfig in the list.
*/ */
public static boolean launchFor(Context context, List<ServerConfig> configList) { public static boolean launchFor(Context context, List<ServerConfig> configList) {
for (ServerConfig config: configList) { for (ServerConfig config : configList) {
if (TextUtils.isEmpty(config.getHostname())) { if (TextUtils.isEmpty(config.getHostname())) {
return launchFor(context, config); return launchFor(context, config);
} else if (!TextUtils.isEmpty(config.getConnectionError())) { } else if (!TextUtils.isEmpty(config.getConnectionError())) {
...@@ -57,25 +48,25 @@ public class ServerConfigActivity extends AbstractFragmentActivity { ...@@ -57,25 +48,25 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
} }
} }
for (ServerConfig config: configList) { for (ServerConfig config : configList) {
if (config.getAuthProviders().isEmpty()) { if (config.getAuthProviders().isEmpty()) {
return launchFor(context, config); return launchFor(context, config);
} }
} }
for (ServerConfig config: configList) { for (ServerConfig config : configList) {
if (TextUtils.isEmpty(config.getSelectedProviderName())) { if (TextUtils.isEmpty(config.getSelectedProviderName())) {
return launchFor(context, config); return launchFor(context, config);
} }
} }
for (ServerConfig config: configList) { for (ServerConfig config : configList) {
if (TextUtils.isEmpty(config.getToken())) { if (TextUtils.isEmpty(config.getToken())) {
return launchFor(context, config); return launchFor(context, config);
} }
} }
for (ServerConfig config: configList) { for (ServerConfig config : configList) {
if (!config.isTokenVerified()) { if (!config.isTokenVerified()) {
return launchFor(context, config); return launchFor(context, config);
} }
...@@ -89,9 +80,11 @@ public class ServerConfigActivity extends AbstractFragmentActivity { ...@@ -89,9 +80,11 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
return true; return true;
} }
@Override protected int getLayoutContainerForFragment() {
return R.id.content;
}
@Override @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Intent intent = getIntent(); Intent intent = getIntent();
...@@ -109,15 +102,13 @@ public class ServerConfigActivity extends AbstractFragmentActivity { ...@@ -109,15 +102,13 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
setContentView(R.layout.simple_screen); setContentView(R.layout.simple_screen);
} }
@Override @Override protected void onResume() {
protected void onResume() {
super.onResume(); super.onResume();
RocketChatService.keepalive(this); RocketChatService.keepalive(this);
mServerConfigObserver.sub(); mServerConfigObserver.sub();
} }
@Override @Override protected void onPause() {
protected void onPause() {
mServerConfigObserver.unsub(); mServerConfigObserver.unsub();
super.onPause(); super.onPause();
} }
...@@ -160,27 +151,26 @@ public class ServerConfigActivity extends AbstractFragmentActivity { ...@@ -160,27 +151,26 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
showFragment(new InputHostnameFragment()); showFragment(new InputHostnameFragment());
} }
@Override @Override protected void showFragment(Fragment fragment) {
protected void showFragment(Fragment fragment) {
injectIdArgTo(fragment); injectIdArgTo(fragment);
super.showFragment(fragment); super.showFragment(fragment);
} }
@Override @Override protected void showFragmentWithBackStack(Fragment fragment) {
protected void showFragmentWithBackStack(Fragment fragment) {
injectIdArgTo(fragment); injectIdArgTo(fragment);
super.showFragmentWithBackStack(fragment); super.showFragmentWithBackStack(fragment);
} }
private void injectIdArgTo(Fragment fragment) { private void injectIdArgTo(Fragment fragment) {
Bundle args = fragment.getArguments(); Bundle args = fragment.getArguments();
if (args == null) args = new Bundle(); if (args == null) {
args = new Bundle();
}
args.putString("id", mServerConfigId); args.putString("id", mServerConfigId);
fragment.setArguments(args); fragment.setArguments(args);
} }
@Override @Override public void onBackPressed() {
public void onBackPressed() {
if (ServerConfig.hasActiveConnection()) { if (ServerConfig.hasActiveConnection()) {
super.onBackPressed(); super.onBackPressed();
} else { } else {
......
...@@ -13,13 +13,13 @@ import android.view.ViewGroup; ...@@ -13,13 +13,13 @@ import android.view.ViewGroup;
*/ */
public abstract class AbstractFragment extends Fragment { public abstract class AbstractFragment extends Fragment {
protected View mRootView; protected View mRootView;
protected abstract @LayoutRes int getLayout(); protected abstract @LayoutRes int getLayout();
protected abstract void onSetupView(); protected abstract void onSetupView();
@Nullable @Nullable @Override
@Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) { @Nullable Bundle savedInstanceState) {
mRootView = inflater.inflate(getLayout(), container, false); mRootView = inflater.inflate(getLayout(), container, false);
onSetupView(); onSetupView();
......
...@@ -2,15 +2,13 @@ package chat.rocket.android.fragment.server_config; ...@@ -2,15 +2,13 @@ package chat.rocket.android.fragment.server_config;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import chat.rocket.android.fragment.AbstractFragment; import chat.rocket.android.fragment.AbstractFragment;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
abstract class AbstractServerConfigFragment extends AbstractFragment { abstract class AbstractServerConfigFragment extends AbstractFragment {
protected String mServerConfigId; protected String mServerConfigId;
@Override @Override public void onCreate(@Nullable Bundle savedInstanceState) {
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Bundle args = getArguments(); Bundle args = getArguments();
......
...@@ -6,13 +6,11 @@ import chat.rocket.android.R; ...@@ -6,13 +6,11 @@ import chat.rocket.android.R;
* Just showing "connecting..." screen. * Just showing "connecting..." screen.
*/ */
public class ConnectingToHostFragment extends AbstractServerConfigFragment { public class ConnectingToHostFragment extends AbstractServerConfigFragment {
@Override @Override protected int getLayout() {
protected int getLayout() {
return R.layout.fragment_wait_for_connection; return R.layout.fragment_wait_for_connection;
} }
@Override @Override protected void onSetupView() {
protected void onSetupView() {
} }
} }
...@@ -4,9 +4,6 @@ import android.os.Handler; ...@@ -4,9 +4,6 @@ import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import org.json.JSONObject;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
...@@ -15,32 +12,35 @@ import io.realm.Realm; ...@@ -15,32 +12,35 @@ import io.realm.Realm;
import io.realm.RealmQuery; import io.realm.RealmQuery;
import jp.co.crowdworks.realm_java_helpers.RealmObjectObserver; import jp.co.crowdworks.realm_java_helpers.RealmObjectObserver;
import jp.co.crowdworks.realm_java_helpers_bolts.RealmHelperBolts; import jp.co.crowdworks.realm_java_helpers_bolts.RealmHelperBolts;
import org.json.JSONObject;
/** /**
* Input server host. * Input server host.
*/ */
public class InputHostnameFragment extends AbstractServerConfigFragment { public class InputHostnameFragment extends AbstractServerConfigFragment {
public InputHostnameFragment(){} private Handler mShowError = new Handler() {
@Override public void handleMessage(Message msg) {
@Override Toast.makeText(mRootView.getContext(), (String) msg.obj, Toast.LENGTH_SHORT).show();
protected int getLayout() {
return R.layout.fragment_input_hostname;
} }
};
RealmObjectObserver<ServerConfig> mObserver = new RealmObjectObserver<ServerConfig>() { RealmObjectObserver<ServerConfig> mObserver = new RealmObjectObserver<ServerConfig>() {
@Override @Override protected RealmQuery<ServerConfig> query(Realm realm) {
protected RealmQuery<ServerConfig> query(Realm realm) {
return realm.where(ServerConfig.class).equalTo("id", mServerConfigId); return realm.where(ServerConfig.class).equalTo("id", mServerConfigId);
} }
@Override @Override protected void onChange(ServerConfig config) {
protected void onChange(ServerConfig config) {
onRenderServerConfig(config); onRenderServerConfig(config);
} }
}; };
@Override public InputHostnameFragment() {
protected void onSetupView() { }
@Override protected int getLayout() {
return R.layout.fragment_input_hostname;
}
@Override protected void onSetupView() {
mRootView.findViewById(R.id.btn_connect).setOnClickListener(view -> handleConnect()); mRootView.findViewById(R.id.btn_connect).setOnClickListener(view -> handleConnect());
mObserver.sub(); mObserver.sub();
...@@ -49,38 +49,26 @@ public class InputHostnameFragment extends AbstractServerConfigFragment { ...@@ -49,38 +49,26 @@ public class InputHostnameFragment extends AbstractServerConfigFragment {
private void handleConnect() { private void handleConnect() {
final TextView editor = (TextView) mRootView.findViewById(R.id.editor_hostname); final TextView editor = (TextView) mRootView.findViewById(R.id.editor_hostname);
final String hostname = TextUtils.or( final String hostname =
TextUtils.or(editor.getText(), editor.getHint()), TextUtils.or(TextUtils.or(editor.getText(), editor.getHint()), "").toString();
"").toString();
RealmHelperBolts RealmHelperBolts.executeTransaction(
.executeTransaction(realm -> realm -> realm.createOrUpdateObjectFromJson(ServerConfig.class,
realm.createOrUpdateObjectFromJson(ServerConfig.class, new JSONObject() new JSONObject().put("id", mServerConfigId)
.put("id", mServerConfigId)
.put("hostname", hostname) .put("hostname", hostname)
.put("connectionError", JSONObject.NULL))) .put("connectionError", JSONObject.NULL))).continueWith(new LogcatIfError());
.continueWith(new LogcatIfError());
} }
@Override @Override public void onResume() {
public void onResume() {
super.onResume(); super.onResume();
mObserver.keepalive(); mObserver.keepalive();
} }
@Override @Override public void onDestroyView() {
public void onDestroyView() {
mObserver.unsub(); mObserver.unsub();
super.onDestroyView(); super.onDestroyView();
} }
private Handler mShowError = new Handler() {
@Override
public void handleMessage(Message msg) {
Toast.makeText(mRootView.getContext(), (String) msg.obj, Toast.LENGTH_SHORT).show();
}
};
private void showError(String errString) { private void showError(String errString) {
mShowError.removeMessages(0); mShowError.removeMessages(0);
Message msg = Message.obtain(mShowError, 0, errString); Message msg = Message.obtain(mShowError, 0, errString);
...@@ -90,7 +78,9 @@ public class InputHostnameFragment extends AbstractServerConfigFragment { ...@@ -90,7 +78,9 @@ public class InputHostnameFragment extends AbstractServerConfigFragment {
private void onRenderServerConfig(ServerConfig config) { private void onRenderServerConfig(ServerConfig config) {
final TextView editor = (TextView) mRootView.findViewById(R.id.editor_hostname); final TextView editor = (TextView) mRootView.findViewById(R.id.editor_hostname);
if (!TextUtils.isEmpty(config.getHostname())) editor.setText(config.getHostname()); if (!TextUtils.isEmpty(config.getHostname())) {
editor.setText(config.getHostname());
}
if (!TextUtils.isEmpty(config.getConnectionError())) { if (!TextUtils.isEmpty(config.getConnectionError())) {
clearConnectionErrorAndHostname(); clearConnectionErrorAndHostname();
showError(config.getConnectionError()); showError(config.getConnectionError());
...@@ -98,12 +88,10 @@ public class InputHostnameFragment extends AbstractServerConfigFragment { ...@@ -98,12 +88,10 @@ public class InputHostnameFragment extends AbstractServerConfigFragment {
} }
private void clearConnectionErrorAndHostname() { private void clearConnectionErrorAndHostname() {
RealmHelperBolts RealmHelperBolts.executeTransaction(
.executeTransaction(realm -> realm -> realm.createOrUpdateObjectFromJson(ServerConfig.class,
realm.createOrUpdateObjectFromJson(ServerConfig.class, new JSONObject() new JSONObject().put("id", mServerConfigId)
.put("id", mServerConfigId)
.put("hostname", JSONObject.NULL) .put("hostname", JSONObject.NULL)
.put("connectionError", JSONObject.NULL))) .put("connectionError", JSONObject.NULL))).continueWith(new LogcatIfError());
.continueWith(new LogcatIfError());
} }
} }
...@@ -8,8 +8,7 @@ import timber.log.Timber; ...@@ -8,8 +8,7 @@ import timber.log.Timber;
* Bolts-Task continuation for just logging if error occurred. * Bolts-Task continuation for just logging if error occurred.
*/ */
public class LogcatIfError implements Continuation { public class LogcatIfError implements Continuation {
@Override @Override public Object then(Task task) throws Exception {
public Object then(Task task) throws Exception {
if (task.isFaulted()) { if (task.isFaulted()) {
Timber.w(task.getError()); Timber.w(task.getError());
} }
......
package chat.rocket.android.helper; package chat.rocket.android.helper;
import com.facebook.stetho.okhttp3.StethoInterceptor; import com.facebook.stetho.okhttp3.StethoInterceptor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
/** /**
...@@ -18,8 +15,7 @@ public class OkHttpHelper { ...@@ -18,8 +15,7 @@ public class OkHttpHelper {
*/ */
public static OkHttpClient getClientForWebSocket() { public static OkHttpClient getClientForWebSocket() {
if (sHttpClientForWS == null) { if (sHttpClientForWS == null) {
sHttpClientForWS = new OkHttpClient.Builder() sHttpClientForWS = new OkHttpClient.Builder().readTimeout(0, TimeUnit.NANOSECONDS)
.readTimeout(0, TimeUnit.NANOSECONDS)
.addNetworkInterceptor(new StethoInterceptor()) .addNetworkInterceptor(new StethoInterceptor())
.build(); .build();
} }
......
...@@ -7,6 +7,7 @@ public class TextUtils { ...@@ -7,6 +7,7 @@ public class TextUtils {
/** /**
* Returns true if the string is null or 0-length. * Returns true if the string is null or 0-length.
*
* @param str the string to be examined * @param str the string to be examined
* @return true if str is null or zero length * @return true if str is null or zero length
*/ */
...@@ -18,9 +19,11 @@ public class TextUtils { ...@@ -18,9 +19,11 @@ public class TextUtils {
/** /**
* Returns str if it is not empty; otherwise defaultValue is returned. * Returns str if it is not empty; otherwise defaultValue is returned.
*/ */
@SuppressWarnings("PMD.ShortMethodName") @SuppressWarnings("PMD.ShortMethodName") public static CharSequence or(CharSequence str,
public static CharSequence or(CharSequence str, CharSequence defaultValue) { CharSequence defaultValue) {
if (isEmpty(str)) return defaultValue; if (isEmpty(str)) {
return defaultValue;
}
return str; return str;
} }
} }
...@@ -6,10 +6,9 @@ import io.realm.annotations.PrimaryKey; ...@@ -6,10 +6,9 @@ import io.realm.annotations.PrimaryKey;
/** /**
* subscription model for "meteor_accounts_loginServiceConfiguration" * subscription model for "meteor_accounts_loginServiceConfiguration"
*/ */
@SuppressWarnings("PMD.ShortVariable") @SuppressWarnings("PMD.ShortVariable") public class MeteorLoginServiceConfiguration
public class MeteorLoginServiceConfiguration extends RealmObject { extends RealmObject {
@PrimaryKey @PrimaryKey private String id;
private String id;
private String service; private String service;
private String consumerKey; //for Twitter private String consumerKey; //for Twitter
private String appId; //for Facebook private String appId; //for Facebook
......
package chat.rocket.android.model; package chat.rocket.android.model;
import org.json.JSONObject;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import hugo.weaving.DebugLog; import hugo.weaving.DebugLog;
import io.realm.Realm; import io.realm.Realm;
...@@ -11,14 +9,13 @@ import io.realm.RealmQuery; ...@@ -11,14 +9,13 @@ import io.realm.RealmQuery;
import io.realm.annotations.PrimaryKey; import io.realm.annotations.PrimaryKey;
import jp.co.crowdworks.realm_java_helpers.RealmHelper; import jp.co.crowdworks.realm_java_helpers.RealmHelper;
import jp.co.crowdworks.realm_java_helpers_bolts.RealmHelperBolts; import jp.co.crowdworks.realm_java_helpers_bolts.RealmHelperBolts;
import org.json.JSONObject;
/** /**
* Server configuration * Server configuration
*/ */
@SuppressWarnings("PMD.ShortVariable") @SuppressWarnings("PMD.ShortVariable") public class ServerConfig extends RealmObject {
public class ServerConfig extends RealmObject { @PrimaryKey private String id;
@PrimaryKey
private String id;
private String hostname; private String hostname;
private String connectionError; private String connectionError;
private String token; private String token;
...@@ -26,6 +23,28 @@ public class ServerConfig extends RealmObject { ...@@ -26,6 +23,28 @@ public class ServerConfig extends RealmObject {
private RealmList<MeteorLoginServiceConfiguration> authProviders; private RealmList<MeteorLoginServiceConfiguration> authProviders;
private String selectedProviderName; private String selectedProviderName;
public static RealmQuery<ServerConfig> queryLoginRequiredConnections(Realm realm) {
return realm.where(ServerConfig.class).equalTo("tokenVerified", false);
}
public static RealmQuery<ServerConfig> queryActiveConnections(Realm realm) {
return realm.where(ServerConfig.class).isNotNull("token");
}
public static boolean hasActiveConnection() {
ServerConfig config =
RealmHelper.executeTransactionForRead(realm -> queryActiveConnections(realm).findFirst());
return config != null;
}
@DebugLog public static void logError(String id, Exception exception) {
RealmHelperBolts.executeTransaction(
realm -> realm.createOrUpdateObjectFromJson(ServerConfig.class,
new JSONObject().put("id", id).put("connectionError", exception.getMessage())))
.continueWith(new LogcatIfError());
}
public String getId() { public String getId() {
return id; return id;
} }
...@@ -81,31 +100,4 @@ public class ServerConfig extends RealmObject { ...@@ -81,31 +100,4 @@ public class ServerConfig extends RealmObject {
public void setSelectedProviderName(String selectedProviderName) { public void setSelectedProviderName(String selectedProviderName) {
this.selectedProviderName = selectedProviderName; this.selectedProviderName = selectedProviderName;
} }
public static RealmQuery<ServerConfig> queryLoginRequiredConnections(Realm realm) {
return realm.where(ServerConfig.class)
.equalTo("tokenVerified", false);
}
public static RealmQuery<ServerConfig> queryActiveConnections(Realm realm) {
return realm.where(ServerConfig.class)
.isNotNull("token");
}
public static boolean hasActiveConnection() {
ServerConfig config = RealmHelper.executeTransactionForRead(realm ->
queryActiveConnections(realm).findFirst());
return config != null;
}
@DebugLog
public static void logError(String id, Exception exception) {
RealmHelperBolts
.executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(ServerConfig.class, new JSONObject()
.put("id", id)
.put("connectionError", exception.getMessage())))
.continueWith(new LogcatIfError());
}
} }
...@@ -5,16 +5,14 @@ import android.content.Context; ...@@ -5,16 +5,14 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.IBinder; import android.os.IBinder;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import bolts.Task; import bolts.Task;
import chat.rocket.android.model.ServerConfig; import chat.rocket.android.model.ServerConfig;
import io.realm.Realm; import io.realm.Realm;
import io.realm.RealmResults; import io.realm.RealmResults;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import jp.co.crowdworks.realm_java_helpers.RealmListObserver; import jp.co.crowdworks.realm_java_helpers.RealmListObserver;
/** /**
...@@ -22,6 +20,21 @@ import jp.co.crowdworks.realm_java_helpers.RealmListObserver; ...@@ -22,6 +20,21 @@ import jp.co.crowdworks.realm_java_helpers.RealmListObserver;
*/ */
public class RocketChatService extends Service { public class RocketChatService extends Service {
private HashMap<String, RocketChatWebSocketThread> mWebSocketThreads;
private RealmListObserver<ServerConfig> mConnectionRequiredServerConfigObserver =
new RealmListObserver<ServerConfig>() {
@Override protected RealmResults<ServerConfig> queryItems(Realm realm) {
return realm.where(ServerConfig.class)
.isNotNull("hostname")
.isNull("connectionError")
.findAll();
}
@Override protected void onCollectionChanged(List<ServerConfig> list) {
syncWebSocketThreadsWith(list);
}
};
/** /**
* ensure RocketChatService alive. * ensure RocketChatService alive.
*/ */
...@@ -36,31 +49,12 @@ public class RocketChatService extends Service { ...@@ -36,31 +49,12 @@ public class RocketChatService extends Service {
context.stopService(new Intent(context, RocketChatService.class)); context.stopService(new Intent(context, RocketChatService.class));
} }
private HashMap<String, RocketChatWebSocketThread> mWebSocketThreads; @Override public void onCreate() {
private RealmListObserver<ServerConfig> mConnectionRequiredServerConfigObserver =
new RealmListObserver<ServerConfig>() {
@Override
protected RealmResults<ServerConfig> queryItems(Realm realm) {
return realm.where(ServerConfig.class)
.isNotNull("hostname")
.isNull("connectionError")
.findAll();
}
@Override
protected void onCollectionChanged(List<ServerConfig> list) {
syncWebSocketThreadsWith(list);
}
};
@Override
public void onCreate() {
super.onCreate(); super.onCreate();
mWebSocketThreads = new HashMap<>(); mWebSocketThreads = new HashMap<>();
} }
@Override @Override public int onStartCommand(Intent intent, int flags, int startId) {
public int onStartCommand(Intent intent, int flags, int startId) {
mConnectionRequiredServerConfigObserver.keepalive(); mConnectionRequiredServerConfigObserver.keepalive();
return START_STICKY; return START_STICKY;
} }
...@@ -73,7 +67,7 @@ public class RocketChatService extends Service { ...@@ -73,7 +67,7 @@ public class RocketChatService extends Service {
Map.Entry<String, RocketChatWebSocketThread> entry = iterator.next(); Map.Entry<String, RocketChatWebSocketThread> entry = iterator.next();
String serverConfigId = entry.getKey(); String serverConfigId = entry.getKey();
boolean found = false; boolean found = false;
for (ServerConfig config: configList) { for (ServerConfig config : configList) {
if (serverConfigId.equals(config.getId())) { if (serverConfigId.equals(config.getId())) {
found = true; found = true;
break; break;
...@@ -85,7 +79,7 @@ public class RocketChatService extends Service { ...@@ -85,7 +79,7 @@ public class RocketChatService extends Service {
} }
} }
for (ServerConfig config: configList) { for (ServerConfig config : configList) {
findOrCreateWebSocketThread(config).onSuccess(task -> { findOrCreateWebSocketThread(config).onSuccess(task -> {
RocketChatWebSocketThread thread = task.getResult(); RocketChatWebSocketThread thread = task.getResult();
thread.syncStateWith(config); thread.syncStateWith(config);
...@@ -107,9 +101,7 @@ public class RocketChatService extends Service { ...@@ -107,9 +101,7 @@ public class RocketChatService extends Service {
} }
} }
@Nullable @Nullable @Override public IBinder onBind(Intent intent) {
@Override
public IBinder onBind(Intent intent) {
return null; return null;
} }
} }
...@@ -3,11 +3,6 @@ package chat.rocket.android.service; ...@@ -3,11 +3,6 @@ package chat.rocket.android.service;
import android.content.Context; import android.content.Context;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Iterator;
import bolts.Task; import bolts.Task;
import bolts.TaskCompletionSource; import bolts.TaskCompletionSource;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
...@@ -16,6 +11,9 @@ import chat.rocket.android.service.ddp_subscriber.LoginServiceConfigurationSubsc ...@@ -16,6 +11,9 @@ import chat.rocket.android.service.ddp_subscriber.LoginServiceConfigurationSubsc
import chat.rocket.android.ws.RocketChatWebSocketAPI; import chat.rocket.android.ws.RocketChatWebSocketAPI;
import chat.rocket.android_ddp.DDPClient; import chat.rocket.android_ddp.DDPClient;
import hugo.weaving.DebugLog; import hugo.weaving.DebugLog;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Iterator;
import jp.co.crowdworks.realm_java_helpers.RealmHelper; import jp.co.crowdworks.realm_java_helpers.RealmHelper;
import timber.log.Timber; import timber.log.Timber;
...@@ -23,8 +21,12 @@ import timber.log.Timber; ...@@ -23,8 +21,12 @@ import timber.log.Timber;
* Thread for handling WebSocket connection. * Thread for handling WebSocket connection.
*/ */
public class RocketChatWebSocketThread extends HandlerThread { public class RocketChatWebSocketThread extends HandlerThread {
private static final Class[] REGISTERABLE_CLASSES = {
LoginServiceConfigurationSubscriber.class
};
private final Context mAppContext; private final Context mAppContext;
private final String mServerConfigId; private final String mServerConfigId;
private final ArrayList<Registerable> mListeners = new ArrayList<>();
private RocketChatWebSocketAPI mWebSocketAPI; private RocketChatWebSocketAPI mWebSocketAPI;
private boolean mSocketExists; private boolean mSocketExists;
private boolean mListenersRegistered; private boolean mListenersRegistered;
...@@ -38,13 +40,11 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -38,13 +40,11 @@ public class RocketChatWebSocketThread extends HandlerThread {
/** /**
* create new Thread. * create new Thread.
*/ */
@DebugLog @DebugLog public static Task<RocketChatWebSocketThread> getStarted(Context appContext,
public static Task<RocketChatWebSocketThread> getStarted(Context appContext,
ServerConfig config) { ServerConfig config) {
TaskCompletionSource<RocketChatWebSocketThread> task = new TaskCompletionSource<>(); TaskCompletionSource<RocketChatWebSocketThread> task = new TaskCompletionSource<>();
new RocketChatWebSocketThread(appContext, config.getId()){ new RocketChatWebSocketThread(appContext, config.getId()) {
@Override @Override protected void onLooperPrepared() {
protected void onLooperPrepared() {
try { try {
super.onLooperPrepared(); super.onLooperPrepared();
task.setResult(this); task.setResult(this);
...@@ -59,8 +59,7 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -59,8 +59,7 @@ public class RocketChatWebSocketThread extends HandlerThread {
/** /**
* terminate the thread * terminate the thread
*/ */
@DebugLog @DebugLog public static void terminate(RocketChatWebSocketThread thread) {
public static void terminate(RocketChatWebSocketThread thread) {
thread.quit(); thread.quit();
} }
...@@ -75,36 +74,30 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -75,36 +74,30 @@ public class RocketChatWebSocketThread extends HandlerThread {
/** /**
* synchronize the state of the thread with ServerConfig. * synchronize the state of the thread with ServerConfig.
*/ */
@DebugLog @DebugLog public void syncStateWith(ServerConfig config) {
public void syncStateWith(ServerConfig config) { if (config == null || TextUtils.isEmpty(config.getHostname()) || !TextUtils.isEmpty(
if (config == null config.getConnectionError())) {
|| TextUtils.isEmpty(config.getHostname())
|| !TextUtils.isEmpty(config.getConnectionError())) {
quit(); quit();
} else { } else {
ensureConnection() ensureConnection().continueWith(task -> {
.continueWith(task -> {
new Handler(getLooper()).post(this::keepaliveListeners); new Handler(getLooper()).post(this::keepaliveListeners);
return null; return null;
}); });
} }
} }
@Override @Override protected void onLooperPrepared() {
protected void onLooperPrepared() {
super.onLooperPrepared(); super.onLooperPrepared();
registerListeners(); registerListeners();
} }
@Override @Override public boolean quit() {
public boolean quit() {
scheduleUnregisterListeners(); scheduleUnregisterListeners();
return super.quit(); return super.quit();
} }
@Override @Override public boolean quitSafely() {
public boolean quitSafely() {
scheduleUnregisterListeners(); scheduleUnregisterListeners();
return super.quitSafely(); return super.quitSafely();
} }
...@@ -118,26 +111,19 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -118,26 +111,19 @@ public class RocketChatWebSocketThread extends HandlerThread {
} }
} }
private static final Class[] REGISTERABLE_CLASSES = {
LoginServiceConfigurationSubscriber.class
};
private final ArrayList<Registerable> mListeners = new ArrayList<>();
private void prepareWebSocket() { private void prepareWebSocket() {
ServerConfig config = RealmHelper.executeTransactionForRead(realm -> ServerConfig config = RealmHelper.executeTransactionForRead(
realm.where(ServerConfig.class) realm -> realm.where(ServerConfig.class).equalTo("id", mServerConfigId).findFirst());
.equalTo("id", mServerConfigId)
.findFirst());
if (mWebSocketAPI == null || !mWebSocketAPI.isConnected()) { if (mWebSocketAPI == null || !mWebSocketAPI.isConnected()) {
mWebSocketAPI = RocketChatWebSocketAPI.create(config.getHostname()); mWebSocketAPI = RocketChatWebSocketAPI.create(config.getHostname());
} }
} }
@DebugLog @DebugLog private Task<Void> registerListeners() {
private Task<Void> registerListeners() { if (mSocketExists) {
if (mSocketExists) return Task.forResult(null); return Task.forResult(null);
}
mSocketExists = true; mSocketExists = true;
prepareWebSocket(); prepareWebSocket();
...@@ -168,13 +154,14 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -168,13 +154,14 @@ public class RocketChatWebSocketThread extends HandlerThread {
//@DebugLog //@DebugLog
private void registerListenersActually() { private void registerListenersActually() {
if (mListenersRegistered) return; if (mListenersRegistered) {
return;
}
mListenersRegistered = true; mListenersRegistered = true;
for (Class clazz: REGISTERABLE_CLASSES) { for (Class clazz : REGISTERABLE_CLASSES) {
try { try {
Constructor ctor = clazz.getConstructor( Constructor ctor = clazz.getConstructor(Context.class, RocketChatWebSocketAPI.class);
Context.class, RocketChatWebSocketAPI.class);
Object obj = ctor.newInstance(mAppContext, mWebSocketAPI); Object obj = ctor.newInstance(mAppContext, mWebSocketAPI);
if (obj instanceof Registerable) { if (obj instanceof Registerable) {
...@@ -190,14 +177,20 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -190,14 +177,20 @@ public class RocketChatWebSocketThread extends HandlerThread {
//@DebugLog //@DebugLog
private void keepaliveListeners() { private void keepaliveListeners() {
if (!mSocketExists || !mListenersRegistered) return; if (!mSocketExists || !mListenersRegistered) {
return;
}
for (Registerable registerable : mListeners) registerable.keepalive(); for (Registerable registerable : mListeners) {
registerable.keepalive();
}
} }
//@DebugLog //@DebugLog
private void unregisterListeners() { private void unregisterListeners() {
if (!mSocketExists || !mListenersRegistered) return; if (!mSocketExists || !mListenersRegistered) {
return;
}
Iterator<Registerable> iterator = mListeners.iterator(); Iterator<Registerable> iterator = mListeners.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
...@@ -212,5 +205,4 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -212,5 +205,4 @@ public class RocketChatWebSocketThread extends HandlerThread {
mListenersRegistered = false; mListenersRegistered = false;
mSocketExists = false; mSocketExists = false;
} }
} }
...@@ -2,19 +2,16 @@ package chat.rocket.android.service.ddp_subscriber; ...@@ -2,19 +2,16 @@ package chat.rocket.android.service.ddp_subscriber;
import android.content.Context; import android.content.Context;
import android.text.TextUtils; import android.text.TextUtils;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Iterator;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.service.Registerable; import chat.rocket.android.service.Registerable;
import chat.rocket.android.ws.RocketChatWebSocketAPI; import chat.rocket.android.ws.RocketChatWebSocketAPI;
import chat.rocket.android_ddp.DDPSubscription; import chat.rocket.android_ddp.DDPSubscription;
import io.realm.Realm; import io.realm.Realm;
import io.realm.RealmObject; import io.realm.RealmObject;
import java.util.Iterator;
import jp.co.crowdworks.realm_java_helpers_bolts.RealmHelperBolts; import jp.co.crowdworks.realm_java_helpers_bolts.RealmHelperBolts;
import org.json.JSONException;
import org.json.JSONObject;
import rx.Subscription; import rx.Subscription;
import timber.log.Timber; import timber.log.Timber;
...@@ -30,14 +27,16 @@ abstract class AbstractDDPDocEventSubscriber implements Registerable { ...@@ -30,14 +27,16 @@ abstract class AbstractDDPDocEventSubscriber implements Registerable {
} }
protected abstract String getSubscriptionName(); protected abstract String getSubscriptionName();
protected abstract String getSubscriptionCallbackName(); protected abstract String getSubscriptionCallbackName();
protected abstract Class<? extends RealmObject> getModelClass(); protected abstract Class<? extends RealmObject> getModelClass();
protected JSONObject customizeFieldJSON(JSONObject json) { protected JSONObject customizeFieldJSON(JSONObject json) {
return json; return json;
} }
@Override @Override public void register() {
public void register() {
mAPI.subscribe(getSubscriptionName(), null).onSuccess(task -> { mAPI.subscribe(getSubscriptionName(), null).onSuccess(task -> {
mID = task.getResult().id; mID = task.getResult().id;
return null; return null;
...@@ -110,8 +109,7 @@ abstract class AbstractDDPDocEventSubscriber implements Registerable { ...@@ -110,8 +109,7 @@ abstract class AbstractDDPDocEventSubscriber implements Registerable {
} }
} }
private void onDocumentAdded(Realm realm, DDPSubscription.Added docEvent) private void onDocumentAdded(Realm realm, DDPSubscription.Added docEvent) throws JSONException {
throws JSONException {
//executed in RealmTransaction //executed in RealmTransaction
JSONObject json = new JSONObject().put("id", docEvent.docID); JSONObject json = new JSONObject().put("id", docEvent.docID);
mergeJSON(json, docEvent.fields); mergeJSON(json, docEvent.fields);
...@@ -136,14 +134,14 @@ abstract class AbstractDDPDocEventSubscriber implements Registerable { ...@@ -136,14 +134,14 @@ abstract class AbstractDDPDocEventSubscriber implements Registerable {
realm.where(getModelClass()).equalTo("id", docEvent.docID).findAll().deleteAllFromRealm(); realm.where(getModelClass()).equalTo("id", docEvent.docID).findAll().deleteAllFromRealm();
} }
@Override @Override public void keepalive() {
public void keepalive() {
} }
@Override @Override public void unregister() {
public void unregister() { if (mSubscription != null) {
if (mSubscription != null) mSubscription.unsubscribe(); mSubscription.unsubscribe();
}
if (!TextUtils.isEmpty(mID)) { if (!TextUtils.isEmpty(mID)) {
mAPI.unsubscribe(mID).continueWith(new LogcatIfError()); mAPI.unsubscribe(mID).continueWith(new LogcatIfError());
} }
......
package chat.rocket.android.service.ddp_subscriber; package chat.rocket.android.service.ddp_subscriber;
import android.content.Context; import android.content.Context;
import chat.rocket.android.model.MeteorLoginServiceConfiguration; import chat.rocket.android.model.MeteorLoginServiceConfiguration;
import chat.rocket.android.ws.RocketChatWebSocketAPI; import chat.rocket.android.ws.RocketChatWebSocketAPI;
import io.realm.RealmObject; import io.realm.RealmObject;
...@@ -14,18 +13,15 @@ public class LoginServiceConfigurationSubscriber extends AbstractDDPDocEventSubs ...@@ -14,18 +13,15 @@ public class LoginServiceConfigurationSubscriber extends AbstractDDPDocEventSubs
super(context, api); super(context, api);
} }
@Override @Override protected String getSubscriptionName() {
protected String getSubscriptionName() {
return "meteor.loginServiceConfiguration"; return "meteor.loginServiceConfiguration";
} }
@Override @Override protected String getSubscriptionCallbackName() {
protected String getSubscriptionCallbackName() {
return "meteor_accounts_loginServiceConfiguration"; return "meteor_accounts_loginServiceConfiguration";
} }
@Override @Override protected Class<? extends RealmObject> getModelClass() {
protected Class<? extends RealmObject> getModelClass() {
return MeteorLoginServiceConfiguration.class; return MeteorLoginServiceConfiguration.class;
} }
} }
package chat.rocket.android.service.observer; package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import chat.rocket.android.service.Registerable; import chat.rocket.android.service.Registerable;
import chat.rocket.android.ws.RocketChatWebSocketAPI; import chat.rocket.android.ws.RocketChatWebSocketAPI;
import io.realm.RealmObject; import io.realm.RealmObject;
import jp.co.crowdworks.realm_java_helpers.RealmListObserver; import jp.co.crowdworks.realm_java_helpers.RealmListObserver;
abstract class AbstractModelObserver<T extends RealmObject> abstract class AbstractModelObserver<T extends RealmObject> extends RealmListObserver<T>
extends RealmListObserver<T> implements Registerable { implements Registerable {
protected final Context mContext; protected final Context mContext;
protected final RocketChatWebSocketAPI mAPI; protected final RocketChatWebSocketAPI mAPI;
...@@ -18,14 +17,11 @@ abstract class AbstractModelObserver<T extends RealmObject> ...@@ -18,14 +17,11 @@ abstract class AbstractModelObserver<T extends RealmObject>
mAPI = api; mAPI = api;
} }
@Override public void register() {
@Override
public void register() {
sub(); sub();
} }
@Override @Override public void unregister() {
public void unregister() {
unsub(); unsub();
} }
} }
...@@ -7,14 +7,11 @@ import android.util.AttributeSet; ...@@ -7,14 +7,11 @@ import android.util.AttributeSet;
abstract class AbstractCustomFontTextView extends AppCompatTextView { abstract class AbstractCustomFontTextView extends AppCompatTextView {
protected abstract String getFont();
//CHECKSTYLE:OFF RedundantModifier //CHECKSTYLE:OFF RedundantModifier
public AbstractCustomFontTextView(Context context, AttributeSet attrs, int defStyle) { public AbstractCustomFontTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); super(context, attrs, defStyle);
init(); init();
} }
//CHECKSTYLE:ON RedundantModifier
//CHECKSTYLE:OFF RedundantModifier //CHECKSTYLE:OFF RedundantModifier
public AbstractCustomFontTextView(Context context, AttributeSet attrs) { public AbstractCustomFontTextView(Context context, AttributeSet attrs) {
...@@ -30,11 +27,16 @@ abstract class AbstractCustomFontTextView extends AppCompatTextView { ...@@ -30,11 +27,16 @@ abstract class AbstractCustomFontTextView extends AppCompatTextView {
} }
//CHECKSTYLE:ON RedundantModifier //CHECKSTYLE:ON RedundantModifier
protected abstract String getFont();
//CHECKSTYLE:ON RedundantModifier
private void init() { private void init() {
String font = getFont(); String font = getFont();
if (font != null) { if (font != null) {
Typeface typeface = TypefaceHelper.getTypeface(getContext(), font); Typeface typeface = TypefaceHelper.getTypeface(getContext(), font);
if (typeface != null) setTypeface(typeface); if (typeface != null) {
setTypeface(typeface);
}
} }
} }
} }
...@@ -19,8 +19,7 @@ public class FontAwesomeTextView extends AbstractCustomFontTextView { ...@@ -19,8 +19,7 @@ public class FontAwesomeTextView extends AbstractCustomFontTextView {
super(context); super(context);
} }
@Override @Override protected String getFont() {
protected String getFont() {
return "fontawesome-webfont.ttf"; return "fontawesome-webfont.ttf";
} }
} }
...@@ -19,8 +19,7 @@ public class FontelloTextView extends AbstractCustomFontTextView { ...@@ -19,8 +19,7 @@ public class FontelloTextView extends AbstractCustomFontTextView {
super(context); super(context);
} }
@Override @Override protected String getFont() {
protected String getFont() {
return "fontello.ttf"; return "fontello.ttf";
} }
} }
...@@ -3,12 +3,10 @@ package chat.rocket.android.view; ...@@ -3,12 +3,10 @@ package chat.rocket.android.view;
import android.content.Context; import android.content.Context;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.util.Log; import android.util.Log;
import java.util.Hashtable; import java.util.Hashtable;
/** /**
* Helper for reading typeface. * Helper for reading typeface. ref:https://code.google.com/p/android/issues/detail?id=9904#c7
* ref:https://code.google.com/p/android/issues/detail?id=9904#c7
*/ */
public class TypefaceHelper { public class TypefaceHelper {
private static final String TAG = TypefaceHelper.class.getName(); private static final String TAG = TypefaceHelper.class.getName();
...@@ -22,12 +20,11 @@ public class TypefaceHelper { ...@@ -22,12 +20,11 @@ public class TypefaceHelper {
synchronized (CACHE) { synchronized (CACHE) {
if (!CACHE.containsKey(assetPath)) { if (!CACHE.containsKey(assetPath)) {
try { try {
Typeface typeface = Typeface.createFromAsset(context.getAssets(), Typeface typeface = Typeface.createFromAsset(context.getAssets(), assetPath);
assetPath);
CACHE.put(assetPath, typeface); CACHE.put(assetPath, typeface);
} catch (Exception exception) { } catch (Exception exception) {
Log.e(TAG, "Could not get typeface '" + assetPath Log.e(TAG,
+ "' because " + exception.getMessage()); "Could not get typeface '" + assetPath + "' because " + exception.getMessage());
return null; return null;
} }
} }
......
...@@ -11,10 +11,8 @@ import android.view.View; ...@@ -11,10 +11,8 @@ import android.view.View;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import java.util.ArrayList;
import chat.rocket.android.R; import chat.rocket.android.R;
import java.util.ArrayList;
/** /**
* View for indicating "waiting for connection ..." and so on. * View for indicating "waiting for connection ..." and so on.
...@@ -48,9 +46,8 @@ public class WaitingView extends LinearLayout { ...@@ -48,9 +46,8 @@ public class WaitingView extends LinearLayout {
int count = 3; int count = 3;
if (attrs != null) { if (attrs != null) {
TypedArray array = context.getTheme().obtainStyledAttributes( TypedArray array =
attrs, context.getTheme().obtainStyledAttributes(attrs, R.styleable.WaitingView, 0, 0);
R.styleable.WaitingView, 0, 0);
size = array.getDimensionPixelSize(R.styleable.WaitingView_dotSize, size); size = array.getDimensionPixelSize(R.styleable.WaitingView_dotSize, size);
count = array.getInteger(R.styleable.WaitingView_dotCount, count); count = array.getInteger(R.styleable.WaitingView_dotCount, count);
array.recycle(); array.recycle();
...@@ -58,16 +55,16 @@ public class WaitingView extends LinearLayout { ...@@ -58,16 +55,16 @@ public class WaitingView extends LinearLayout {
mDots = new ArrayList<>(); mDots = new ArrayList<>();
setOrientation(HORIZONTAL); setOrientation(HORIZONTAL);
for (int i = 0; i < count; i++) addDot(context, size); for (int i = 0; i < count; i++) {
addDot(context, size);
}
addOnAttachStateChangeListener(new OnAttachStateChangeListener() { addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
@Override @Override public void onViewAttachedToWindow(View view) {
public void onViewAttachedToWindow(View view) {
start(); start();
} }
@Override @Override public void onViewDetachedFromWindow(View view) {
public void onViewDetachedFromWindow(View view) {
cancel(); cancel();
} }
}); });
...@@ -75,8 +72,7 @@ public class WaitingView extends LinearLayout { ...@@ -75,8 +72,7 @@ public class WaitingView extends LinearLayout {
private void addDot(Context context, int size) { private void addDot(Context context, int size) {
FrameLayout frameLayout = new FrameLayout(context); FrameLayout frameLayout = new FrameLayout(context);
frameLayout.setLayoutParams( frameLayout.setLayoutParams(new LinearLayoutCompat.LayoutParams(size * 3 / 2, size * 3 / 2));
new LinearLayoutCompat.LayoutParams(size * 3 / 2, size * 3 / 2));
ImageView dot = new ImageView(context); ImageView dot = new ImageView(context);
dot.setImageResource(R.drawable.white_circle); dot.setImageResource(R.drawable.white_circle);
dot.setLayoutParams(new FrameLayout.LayoutParams(size, size, Gravity.CENTER)); dot.setLayoutParams(new FrameLayout.LayoutParams(size, size, Gravity.CENTER));
...@@ -91,19 +87,19 @@ public class WaitingView extends LinearLayout { ...@@ -91,19 +87,19 @@ public class WaitingView extends LinearLayout {
} }
} }
private void animateDot(final View dot, private void animateDot(final View dot, final long startDelay, final long duration,
final long startDelay,
final long duration,
final long interval) { final long interval) {
dot.setScaleX(0); dot.setScaleX(0);
dot.setScaleY(0); dot.setScaleY(0);
dot.animate() dot.animate()
.scaleX(1).scaleY(1) .scaleX(1)
.scaleY(1)
.setDuration(duration) .setDuration(duration)
.setStartDelay(startDelay) .setStartDelay(startDelay)
.withEndAction(() -> { .withEndAction(() -> {
dot.animate() dot.animate()
.scaleX(0).scaleY(0) .scaleX(0)
.scaleY(0)
.setDuration(duration) .setDuration(duration)
.setStartDelay(0) .setStartDelay(0)
.withEndAction(() -> { .withEndAction(() -> {
...@@ -115,7 +111,7 @@ public class WaitingView extends LinearLayout { ...@@ -115,7 +111,7 @@ public class WaitingView extends LinearLayout {
} }
private void cancel() { private void cancel() {
for (View dot: mDots) { for (View dot : mDots) {
dot.clearAnimation(); dot.clearAnimation();
} }
} }
......
package chat.rocket.android.ws; package chat.rocket.android.ws;
import org.json.JSONArray;
import java.util.UUID;
import bolts.Task; import bolts.Task;
import chat.rocket.android.helper.OkHttpHelper; import chat.rocket.android.helper.OkHttpHelper;
import chat.rocket.android_ddp.DDPClient; import chat.rocket.android_ddp.DDPClient;
import chat.rocket.android_ddp.DDPClientCallback; import chat.rocket.android_ddp.DDPClientCallback;
import chat.rocket.android_ddp.DDPSubscription; import chat.rocket.android_ddp.DDPSubscription;
import java.util.UUID;
import org.json.JSONArray;
import rx.Observable; import rx.Observable;
/** /**
...@@ -51,7 +49,6 @@ public class RocketChatWebSocketAPI { ...@@ -51,7 +49,6 @@ public class RocketChatWebSocketAPI {
mDDPClient.close(); mDDPClient.close();
} }
/** /**
* Subscribe with DDP client. * Subscribe with DDP client.
*/ */
...@@ -72,5 +69,4 @@ public class RocketChatWebSocketAPI { ...@@ -72,5 +69,4 @@ public class RocketChatWebSocketAPI {
public Observable<DDPSubscription.Event> getSubscriptionCallback() { public Observable<DDPSubscription.Event> getSubscriptionCallback() {
return mDDPClient.getSubscriptionCallback(); return mDDPClient.getSubscriptionCallback();
} }
} }
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp" android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0" android:viewportWidth="24.0"
android:viewportHeight="24.0"> android:width="24dp">
<path <path
android:fillColor="#FFFFFFFF" android:fillColor="#FFFFFFFF"
android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z"/> android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z"/>
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--item android:state_enabled="false" android:color="@color/textColorLink" /--> <!--item android:state_enabled="false" android:color="@color/textColorLink" /-->
<item android:color="@color/textColorLink" /> <item android:color="@color/textColorLink"/>
</selector> </selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape android:shape="oval" xmlns:android="http://schemas.android.com/apk/res/android"> <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/userstatus_away"/> <solid android:color="@color/userstatus_away"/>
<stroke android:width="1dp" android:color="@color/userstatus_away_outline" /> <stroke
android:color="@color/userstatus_away_outline"
android:width="1dp"/>
</shape> </shape>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape android:shape="oval" xmlns:android="http://schemas.android.com/apk/res/android"> <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/userstatus_busy"/> <solid android:color="@color/userstatus_busy"/>
<stroke android:width="1dp" android:color="@color/userstatus_busy_outline" /> <stroke
android:color="@color/userstatus_busy_outline"
android:width="1dp"/>
</shape> </shape>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape android:shape="oval" xmlns:android="http://schemas.android.com/apk/res/android"> <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/userstatus_offline"/> <solid android:color="@color/userstatus_offline"/>
<stroke android:width="1dp" android:color="@color/userstatus_offline_outline" /> <stroke
android:color="@color/userstatus_offline_outline"
android:width="1dp"/>
</shape> </shape>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape android:shape="oval" xmlns:android="http://schemas.android.com/apk/res/android"> <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/userstatus_online"/> <solid android:color="@color/userstatus_online"/>
<stroke android:width="1dp" android:color="@color/userstatus_online_outline" /> <stroke
android:color="@color/userstatus_online_outline"
android:width="1dp"/>
</shape> </shape>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
<include layout="@layout/sidebar" /> <include layout="@layout/sidebar"/>
<android.support.design.widget.CoordinatorLayout <android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
<android.support.design.widget.AppBarLayout <android.support.design.widget.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
>
<android.support.v7.widget.Toolbar <android.support.v7.widget.Toolbar
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:title="@string/app_name"/> app:title="@string/app_name"
/>
</android.support.design.widget.AppBarLayout> </android.support.design.widget.AppBarLayout>
<FrameLayout <FrameLayout
...@@ -27,8 +31,8 @@ ...@@ -27,8 +31,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/white" android:background="@color/white"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior"
</FrameLayout> ></FrameLayout>
</android.support.design.widget.CoordinatorLayout> </android.support.design.widget.CoordinatorLayout>
</LinearLayout> </LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SlidingPaneLayout xmlns:android="http://schemas.android.com/apk/res/android" <android.support.v4.widget.SlidingPaneLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
<include layout="@layout/sidebar" /> <include layout="@layout/sidebar"/>
<android.support.design.widget.CoordinatorLayout <android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
<android.support.design.widget.AppBarLayout <android.support.design.widget.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
>
<android.support.v7.widget.Toolbar <android.support.v7.widget.Toolbar
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:title="@string/app_name"/> app:title="@string/app_name"
/>
</android.support.design.widget.AppBarLayout> </android.support.design.widget.AppBarLayout>
<FrameLayout <FrameLayout
...@@ -26,8 +32,8 @@ ...@@ -26,8 +32,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/white" android:background="@color/white"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> app:layout_behavior="@string/appbar_scrolling_view_behavior"
</FrameLayout> ></FrameLayout>
</android.support.design.widget.CoordinatorLayout> </android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.SlidingPaneLayout> </android.support.v4.widget.SlidingPaneLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/avatar_image_size_large" android:layout_height="@dimen/avatar_image_size_large"> android:layout_width="@dimen/avatar_image_size_large"
android:layout_height="@dimen/avatar_image_size_large"
>
<FrameLayout <FrameLayout
android:id="@+id/avatar_color" android:id="@+id/avatar_color"
android:layout_width="@dimen/avatar_image_size_large" android:layout_width="@dimen/avatar_image_size_large"
android:layout_height="@dimen/avatar_image_size_large" android:layout_height="@dimen/avatar_image_size_large"
android:layout_gravity="center"> android:layout_gravity="center"
>
<TextView <TextView
android:id="@+id/avatar_initials" android:id="@+id/avatar_initials"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="@dimen/avatar_text_size_large" android:textSize="@dimen/avatar_text_size_large"
android:layout_gravity="center"/> />
</FrameLayout> </FrameLayout>
<ImageView <ImageView
android:id="@+id/avatar_img" android:id="@+id/avatar_img"
android:layout_width="@dimen/avatar_image_size_large" android:layout_width="@dimen/avatar_image_size_large"
android:layout_height="@dimen/avatar_image_size_large" android:layout_height="@dimen/avatar_image_size_large"
android:scaleType="centerInside"
android:src="@drawable/ic_default_avatar" android:src="@drawable/ic_default_avatar"
android:scaleType="centerInside"/> />
</FrameLayout> </FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/avatar_image_size_normal" android:layout_height="@dimen/avatar_image_size_normal"> android:layout_width="@dimen/avatar_image_size_normal"
android:layout_height="@dimen/avatar_image_size_normal"
>
<FrameLayout <FrameLayout
android:id="@+id/avatar_color" android:id="@+id/avatar_color"
android:layout_width="@dimen/avatar_image_size_normal" android:layout_width="@dimen/avatar_image_size_normal"
android:layout_height="@dimen/avatar_image_size_normal" android:layout_height="@dimen/avatar_image_size_normal"
android:layout_gravity="center"> android:layout_gravity="center"
>
<TextView <TextView
android:id="@+id/avatar_initials" android:id="@+id/avatar_initials"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="@dimen/avatar_text_size_normal" android:textSize="@dimen/avatar_text_size_normal"
android:layout_gravity="center"/> />
</FrameLayout> </FrameLayout>
<ImageView <ImageView
android:id="@+id/avatar_img" android:id="@+id/avatar_img"
android:layout_width="@dimen/avatar_image_size_normal" android:layout_width="@dimen/avatar_image_size_normal"
android:layout_height="@dimen/avatar_image_size_normal" android:layout_height="@dimen/avatar_image_size_normal"
android:scaleType="centerInside"
android:src="@drawable/ic_default_avatar" android:src="@drawable/ic_default_avatar"
android:scaleType="centerInside"/> />
</FrameLayout> </FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto" android:background="?attr/colorPrimaryDark"
android:background="?attr/colorPrimaryDark"> >
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:minWidth="288dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:layout_gravity="center"
android:background="@color/white" android:background="@color/white"
android:minWidth="288dp"
android:orientation="horizontal"
android:padding="@dimen/margin_24" android:padding="@dimen/margin_24"
android:layout_gravity="center"> >
<LinearLayout <LinearLayout
android:layout_width="0px" android:layout_width="0px"
android:layout_weight="1"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:layout_weight="1"
android:orientation="vertical"
>
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="hostname" android:text="hostname"
android:textAppearance="@style/TextAppearance.AppCompat.Caption"/> android:textAppearance="@style/TextAppearance.AppCompat.Caption"
/>
<EditText <EditText
android:id="@+id/editor_hostname" android:id="@+id/editor_hostname"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:singleLine="true"
android:hint="demo.rocket.chat" android:hint="demo.rocket.chat"
android:imeOptions="actionGo" android:imeOptions="actionGo"
android:inputType="textWebEditText"/> android:inputType="textWebEditText"
android:singleLine="true"
/>
</LinearLayout> </LinearLayout>
<Space <Space
android:layout_width="@dimen/margin_8" android:layout_width="@dimen/margin_8"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
/>
<android.support.design.widget.FloatingActionButton <android.support.design.widget.FloatingActionButton
android:id="@+id/btn_connect" android:id="@+id/btn_connect"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
app:elevation="2dp"
app:fabSize="mini" app:fabSize="mini"
app:srcCompat="@drawable/ic_arrow_forward_white_24dp" app:srcCompat="@drawable/ic_arrow_forward_white_24dp"
app:elevation="2dp" />
android:layout_gravity="end|bottom"/>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
\ No newline at end of file
...@@ -2,10 +2,12 @@ ...@@ -2,10 +2,12 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?attr/colorPrimaryDark"> android:background="?attr/colorPrimaryDark"
>
<chat.rocket.android.view.WaitingView <chat.rocket.android.view.WaitingView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center"/> android:layout_gravity="center"
/>
</FrameLayout> </FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="288dp" android:layout_width="288dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="start" android:layout_gravity="start"
android:background="?attr/colorPrimary" android:background="?attr/colorPrimary"
android:orientation="vertical" android:orientation="vertical"
android:theme="@style/AppTheme.Dark"> android:theme="@style/AppTheme.Dark"
>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/colorPrimaryDark"
android:orientation="vertical" android:orientation="vertical"
android:background="?attr/colorPrimaryDark"> >
<LinearLayout <LinearLayout
android:id="@+id/user_info_container" android:id="@+id/user_info_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:background="?attr/selectableItemBackground"
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="@dimen/margin_16" android:padding="@dimen/margin_16"
android:background="?attr/selectableItemBackground"> >
<ImageView <ImageView
android:id="@+id/img_userstatus" android:id="@+id/img_userstatus"
android:layout_width="8dp" android:layout_width="8dp"
android:layout_height="8dp" android:layout_height="8dp"
android:src="@drawable/userstatus_online"/> android:src="@drawable/userstatus_online"
/>
<Space <Space
android:layout_width="@dimen/margin_8" android:layout_width="@dimen/margin_8"
android:layout_height="wrap_content"/> android:layout_height="wrap_content"
/>
<include layout="@layout/avatar_container_large"/> <include layout="@layout/avatar_container_large"/>
<FrameLayout <FrameLayout
android:layout_width="0px" android:layout_width="0px"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="@dimen/margin_8" android:layout_marginLeft="@dimen/margin_8"
android:layout_marginRight="@dimen/margin_8"> android:layout_marginRight="@dimen/margin_8"
android:layout_weight="1"
>
<TextView <TextView
android:id="@+id/txt_account_info" android:id="@+id/txt_account_info"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="14sp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:text="John Doe"/> android:text="John Doe"
android:textSize="14sp"
/>
</FrameLayout> </FrameLayout>
...@@ -57,7 +63,8 @@ ...@@ -57,7 +63,8 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/fa_chevron_down" android:text="@string/fa_chevron_down"
android:textSize="16dp"/> android:textSize="16dp"
/>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content" android:id="@+id/content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
</FrameLayout> </FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string translatable="false" name="fa_chevron_down">&#xf078;</string> <string name="fa_chevron_down" translatable="false">&#xf078;</string>
</resources> </resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<declare-styleable name="WaitingView"> <declare-styleable name="WaitingView">
<attr name="dotSize" format="dimension" /> <attr format="dimension" name="dotSize"/>
<attr name="dotCount" format="integer" /> <attr format="integer" name="dotCount"/>
</declare-styleable> </declare-styleable>
<dimen name="def_waiting_view_dot_size">16dp</dimen> <dimen name="def_waiting_view_dot_size">16dp</dimen>
</resources> </resources>
\ No newline at end of file
<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
"-//Puppy Crawl//DTD Suppressions 1.1//EN"
"http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
<suppressions>
<!-- suppress some checks for classes extending RealmObject -->
<suppress checks="MemberName|JavadocMethod" files="chat[\\/]rocket[\\/]android[\\/]model"/>
</suppressions>
\ No newline at end of file
...@@ -8,9 +8,9 @@ ...@@ -8,9 +8,9 @@
</Match> </Match>
<!-- All bugs in test classes, except for JUnit-specific bugs --> <!-- All bugs in test classes, except for JUnit-specific bugs -->
<Match> <Match>
<Class name="~.*\.*Test" /> <Class name="~.*\.*Test"/>
<Not> <Not>
<Bug code="IJU" /> <Bug code="IJU"/>
</Not> </Not>
</Match> </Match>
......
...@@ -9,17 +9,17 @@ ...@@ -9,17 +9,17 @@
<exclude-pattern>.*/R.java</exclude-pattern> <exclude-pattern>.*/R.java</exclude-pattern>
<exclude-pattern>.*/gen/.*</exclude-pattern> <exclude-pattern>.*/gen/.*</exclude-pattern>
<rule ref="rulesets/java/android.xml" /> <rule ref="rulesets/java/android.xml"/>
<rule ref="rulesets/java/clone.xml" /> <rule ref="rulesets/java/clone.xml"/>
<rule ref="rulesets/java/finalizers.xml" /> <rule ref="rulesets/java/finalizers.xml"/>
<rule ref="rulesets/java/imports.xml"> <rule ref="rulesets/java/imports.xml">
<!-- Espresso is designed this way !--> <!-- Espresso is designed this way !-->
<exclude name="TooManyStaticImports" /> <exclude name="TooManyStaticImports"/>
</rule> </rule>
<rule ref="rulesets/java/basic.xml" /> <rule ref="rulesets/java/basic.xml"/>
<rule ref="rulesets/java/naming.xml"> <rule ref="rulesets/java/naming.xml">
<!--<exclude name="AbstractNaming" />--> <!--<exclude name="AbstractNaming" />-->
<exclude name="LongVariable" /> <exclude name="LongVariable"/>
<!--exclude name="ShortMethodName" /--> <!--exclude name="ShortMethodName" /-->
<!--exclude name="ShortVariable" /--> <!--exclude name="ShortVariable" /-->
<!--<exclude name="ShortClassName" />--> <!--<exclude name="ShortClassName" />-->
......
...@@ -7,8 +7,7 @@ ...@@ -7,8 +7,7 @@
* - pmd * - pmd
* *
* The three tasks above are added as dependencies of the check task so running check will * The three tasks above are added as dependencies of the check task so running check will
* run all of them. * run all of them.*/
*/
apply plugin: 'checkstyle' apply plugin: 'checkstyle'
apply plugin: 'findbugs' apply plugin: 'findbugs'
...@@ -35,13 +34,13 @@ task checkstyle(type: Checkstyle, group: 'Verification', description: 'Runs code ...@@ -35,13 +34,13 @@ task checkstyle(type: Checkstyle, group: 'Verification', description: 'Runs code
} }
} }
classpath = files( ) classpath = files()
} }
task findbugs(type: FindBugs, task findbugs(type: FindBugs,
group: 'Verification', group: 'Verification',
description: 'Inspect java bytecode for bugs', description: 'Inspect java bytecode for bugs',
dependsOn: ['compileDebugSources','compileReleaseSources']) { dependsOn: ['compileDebugSources', 'compileReleaseSources']) {
ignoreFailures = false ignoreFailures = false
effort = "max" effort = "max"
......
# Project-wide Gradle settings. # Project-wide Gradle settings.
# IDE (e.g. Android Studio) users: # IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override* # Gradle settings configured through the IDE *will override*
# any settings specified in this file. # any settings specified in this file.
# For more details on how to configure your build environment visit # For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html # http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process. # Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings. # The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode. # When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit # This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment