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
...@@ -5,56 +5,56 @@ apply plugin: 'com.jakewharton.hugo' ...@@ -5,56 +5,56 @@ apply plugin: 'com.jakewharton.hugo'
apply from: '../config/quality/quality.gradle' apply from: '../config/quality/quality.gradle'
android { android {
compileSdkVersion 25 compileSdkVersion 25
buildToolsVersion "25.0.0" buildToolsVersion "25.0.0"
defaultConfig { defaultConfig {
applicationId "chat.rocket.android" applicationId "chat.rocket.android"
minSdkVersion 17 minSdkVersion 17
targetSdkVersion 25 targetSdkVersion 25
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true vectorDrawables.useSupportLibrary = true
} }
buildTypes { buildTypes {
release { release {
minifyEnabled false minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
//avoiding okio error: https://github.com/square/okhttp/issues/896
lintConfig file("lint.xml")
} }
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
//avoiding okio error: https://github.com/square/okhttp/issues/896
lintConfig file("lint.xml")
}
} }
repositories { repositories {
mavenCentral() mavenCentral()
maven { url 'https://github.com/YusukeIwaki/realm-java-helpers/raw/master/repo' } maven { url 'https://github.com/YusukeIwaki/realm-java-helpers/raw/master/repo' }
maven { url 'https://github.com/uPhyca/stetho-realm/raw/master/maven-repo' } maven { url 'https://github.com/uPhyca/stetho-realm/raw/master/maven-repo' }
maven { url 'https://github.com/RocketChat/Android-DDP/raw/master/repository' } maven { url 'https://github.com/RocketChat/Android-DDP/raw/master/repository' }
} }
dependencies { dependencies {
compile fileTree(dir: 'libs', include: ['*.jar']) compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:25.0.0' compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.android.support:design:25.0.0' compile 'com.android.support:design:25.0.0'
compile 'jp.co.crowdworks:realm-java-helpers:0.0.7' compile 'jp.co.crowdworks:realm-java-helpers:0.0.7'
compile 'jp.co.crowdworks:realm-java-helpers-bolts:0.0.7' compile 'jp.co.crowdworks:realm-java-helpers-bolts:0.0.7'
compile 'com.squareup.okhttp3:okhttp:3.4.1' compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.facebook.stetho:stetho:1.4.1' compile 'com.facebook.stetho:stetho:1.4.1'
compile 'com.facebook.stetho:stetho-okhttp3:1.4.1' compile 'com.facebook.stetho:stetho-okhttp3:1.4.1'
compile 'com.uphyca:stetho_realm:2.0.0' compile 'com.uphyca:stetho_realm:2.0.0'
compile 'chat.rocket:android-ddp:0.0.5' compile 'chat.rocket:android-ddp:0.0.5'
compile 'com.jakewharton.timber:timber:4.3.1' compile 'com.jakewharton.timber:timber:4.3.1'
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0' compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
} }
<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
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="chat.rocket.android"> package="chat.rocket.android">
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application <application
android:allowBackup="true" android:name=".RocketChatApplication"
android:icon="@mipmap/ic_launcher" android:allowBackup="true"
android:label="@string/app_name" android:icon="@mipmap/ic_launcher"
android:supportsRtl="true" android:label="@string/app_name"
android:theme="@style/AppTheme" android:supportsRtl="true"
android:name=".RocketChatApplication"> android:theme="@style/AppTheme">
<activity android:name=".activity.MainActivity" <activity
android:windowSoftInputMode="adjustResize"> android:name=".activity.MainActivity"
<intent-filter> android:windowSoftInputMode="adjustResize">
<action android:name="android.intent.action.MAIN"/> <intent-filter>
<category android:name="android.intent.category.DEFAULT"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".activity.ServerConfigActivity" <category android:name="android.intent.category.DEFAULT"/>
android:windowSoftInputMode="adjustResize"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service android:name=".service.RocketChatService"/> <activity
</application> android:name=".activity.ServerConfigActivity"
android:windowSoftInputMode="adjustResize"/>
<service android:name=".service.RocketChatService"/>
</application>
</manifest> </manifest>
...@@ -2,20 +2,19 @@ package chat.rocket.android; ...@@ -2,20 +2,19 @@ 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;
/** /**
* utility class for launching Activity * utility class for launching Activity
*/ */
public class LaunchUtil { public class LaunchUtil {
/** /**
* launch ServerConfigActivity with proper flags. * launch ServerConfigActivity with proper flags.
*/ */
public static void showServerConfigActivity(Context context, String serverCondigId) { public static void showServerConfigActivity(Context context, String serverCondigId) {
Intent intent = new Intent(context, ServerConfigActivity.class); Intent intent = new Intent(context, ServerConfigActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("id", serverCondigId); intent.putExtra("id", serverCondigId);
context.startActivity(intent); context.startActivity(intent);
} }
} }
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,23 +11,20 @@ import timber.log.Timber; ...@@ -13,23 +11,20 @@ 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());
//TODO: add periodic trigger for RocketChatService.keepalive(this) here! //TODO: add periodic trigger for RocketChatService.keepalive(this) here!
} }
} }
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 protected RealmResults<ServerConfig> queryItems(Realm realm) {
@Override return realm.where(ServerConfig.class).findAll();
protected RealmResults<ServerConfig> queryItems(Realm realm) { }
return realm.where(ServerConfig.class).findAll();
} @Override protected void onCollectionChanged(List<ServerConfig> list) {
if (list.isEmpty()) {
@Override final String newId = UUID.randomUUID().toString();
protected void onCollectionChanged(List<ServerConfig> list) { RealmHelperBolts.executeTransaction(
if (list.isEmpty()) { realm -> realm.createObject(ServerConfig.class, newId))
final String newId = UUID.randomUUID().toString(); .continueWith(new LogcatIfError());
RealmHelperBolts }
.executeTransaction(realm -> }
realm.createObject(ServerConfig.class, newId)) };
.continueWith(new LogcatIfError());
} private RealmListObserver<ServerConfig> loginRequiredServerConfigObserver =
} new RealmListObserver<ServerConfig>() {
}; @Override protected RealmResults<ServerConfig> queryItems(Realm realm) {
return ServerConfig.queryLoginRequiredConnections(realm).findAll();
private RealmListObserver<ServerConfig> mShowConfigActivityIfNeeded = }
new RealmListObserver<ServerConfig>() {
@Override @Override protected void onCollectionChanged(List<ServerConfig> list) {
protected RealmResults<ServerConfig> queryItems(Realm realm) { ServerConfigActivity.launchFor(AbstractAuthedActivity.this, list);
return ServerConfig.queryLoginRequiredConnections(realm).findAll(); }
} };
@Override @Override protected void onResume() {
protected void onCollectionChanged(List<ServerConfig> list) { super.onResume();
ServerConfigActivity.launchFor(AbstractAuthedActivity.this, list); RocketChatService.keepalive(this);
} serverConfigEmptinessObserver.sub();
}; loginRequiredServerConfigObserver.sub();
}
@Override
protected void onResume() { @Override protected void onPause() {
super.onResume(); loginRequiredServerConfigObserver.unsub();
RocketChatService.keepalive(this); serverConfigEmptinessObserver.unsub();
mInsertEmptyRecordIfNoConfigurationExists.sub(); super.onPause();
mShowConfigActivityIfNeeded.sub(); }
}
@Override
protected void onPause() {
mShowConfigActivityIfNeeded.unsub();
mInsertEmptyRecordIfNoConfigurationExists.unsub();
super.onPause();
}
} }
...@@ -3,34 +3,34 @@ package chat.rocket.android.activity; ...@@ -3,34 +3,34 @@ 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
public void onBackPressed() {
Fragment fragment =
getSupportFragmentManager().findFragmentById(getLayoutContainerForFragment());
if (fragment instanceof OnBackPressListener @Override public void onBackPressed() {
&& ((OnBackPressListener) fragment).onBackPressed()) { Fragment fragment =
//consumed. do nothing. getSupportFragmentManager().findFragmentById(getLayoutContainerForFragment());
} else super.onBackPressed();
}
protected void showFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction()
.replace(getLayoutContainerForFragment(), fragment)
.commit();
}
protected void showFragmentWithBackStack(Fragment fragment) { if (fragment instanceof OnBackPressListener
getSupportFragmentManager().beginTransaction() && ((OnBackPressListener) fragment).onBackPressed()) {
.replace(getLayoutContainerForFragment(), fragment) //consumed. do nothing.
.addToBackStack(null) } else {
.commit(); super.onBackPressed();
} }
}
protected void showFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction()
.replace(getLayoutContainerForFragment(), fragment)
.commit();
}
protected void showFragmentWithBackStack(Fragment fragment) {
getSupportFragmentManager().beginTransaction()
.replace(getLayoutContainerForFragment(), fragment)
.addToBackStack(null)
.commit();
}
} }
...@@ -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,18 +11,17 @@ import jp.co.crowdworks.realm_java_helpers_bolts.RealmHelperBolts; ...@@ -12,18 +11,17 @@ 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;
}).continueWith(new LogcatIfError());
} }
return null;
}).continueWith(new LogcatIfError());
} }
}
} }
...@@ -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,165 +24,157 @@ import jp.co.crowdworks.realm_java_helpers.RealmObjectObserver; ...@@ -26,165 +24,157 @@ import jp.co.crowdworks.realm_java_helpers.RealmObjectObserver;
*/ */
public class ServerConfigActivity extends AbstractFragmentActivity { public class ServerConfigActivity extends AbstractFragmentActivity {
@Override private String mServerConfigId;
protected int getLayoutContainerForFragment() { private RealmObjectObserver<ServerConfig> mServerConfigObserver =
return R.id.content; new RealmObjectObserver<ServerConfig>() {
} @Override protected RealmQuery<ServerConfig> query(Realm realm) {
return realm.where(ServerConfig.class).equalTo("id", mServerConfigId);
private String mServerConfigId;
private RealmObjectObserver<ServerConfig> mServerConfigObserver =
new RealmObjectObserver<ServerConfig>() {
@Override
protected RealmQuery<ServerConfig> query(Realm realm) {
return realm.where(ServerConfig.class).equalTo("id", mServerConfigId);
}
@Override
protected void onChange(ServerConfig config) {
onRenderServerConfig(config);
}
};
/**
* Start the ServerConfigActivity with considering the priority of ServerConfig in the list.
*/
public static boolean launchFor(Context context, List<ServerConfig> configList) {
for (ServerConfig config: configList) {
if (TextUtils.isEmpty(config.getHostname())) {
return launchFor(context, config);
} else if (!TextUtils.isEmpty(config.getConnectionError())) {
return launchFor(context, config);
}
}
for (ServerConfig config: configList) {
if (config.getAuthProviders().isEmpty()) {
return launchFor(context, config);
}
} }
for (ServerConfig config: configList) { @Override protected void onChange(ServerConfig config) {
if (TextUtils.isEmpty(config.getSelectedProviderName())) { onRenderServerConfig(config);
return launchFor(context, config);
}
} }
};
/**
* Start the ServerConfigActivity with considering the priority of ServerConfig in the list.
*/
public static boolean launchFor(Context context, List<ServerConfig> configList) {
for (ServerConfig config : configList) {
if (TextUtils.isEmpty(config.getHostname())) {
return launchFor(context, config);
} else if (!TextUtils.isEmpty(config.getConnectionError())) {
return launchFor(context, config);
}
}
for (ServerConfig config: configList) { for (ServerConfig config : configList) {
if (TextUtils.isEmpty(config.getToken())) { if (config.getAuthProviders().isEmpty()) {
return launchFor(context, config); return launchFor(context, config);
} }
} }
for (ServerConfig config: configList) { for (ServerConfig config : configList) {
if (!config.isTokenVerified()) { if (TextUtils.isEmpty(config.getSelectedProviderName())) {
return launchFor(context, config); return launchFor(context, config);
} }
} }
return false; for (ServerConfig config : configList) {
if (TextUtils.isEmpty(config.getToken())) {
return launchFor(context, config);
}
} }
private static boolean launchFor(Context context, ServerConfig config) { for (ServerConfig config : configList) {
LaunchUtil.showServerConfigActivity(context, config.getId()); if (!config.isTokenVerified()) {
return true; return launchFor(context, config);
}
} }
return false;
}
@Override private static boolean launchFor(Context context, ServerConfig config) {
protected void onCreate(@Nullable Bundle savedInstanceState) { LaunchUtil.showServerConfigActivity(context, config.getId());
super.onCreate(savedInstanceState); return true;
}
Intent intent = getIntent(); @Override protected int getLayoutContainerForFragment() {
if (intent == null || intent.getExtras() == null) { return R.id.content;
finish(); }
return;
}
mServerConfigId = intent.getStringExtra("id"); @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
if (TextUtils.isEmpty(mServerConfigId)) { super.onCreate(savedInstanceState);
finish();
return;
}
setContentView(R.layout.simple_screen); Intent intent = getIntent();
if (intent == null || intent.getExtras() == null) {
finish();
return;
} }
@Override mServerConfigId = intent.getStringExtra("id");
protected void onResume() { if (TextUtils.isEmpty(mServerConfigId)) {
super.onResume(); finish();
RocketChatService.keepalive(this); return;
mServerConfigObserver.sub();
} }
@Override setContentView(R.layout.simple_screen);
protected void onPause() { }
mServerConfigObserver.unsub();
super.onPause();
}
private void onRenderServerConfig(ServerConfig config) { @Override protected void onResume() {
if (config == null) { super.onResume();
finish(); RocketChatService.keepalive(this);
return; mServerConfigObserver.sub();
} }
if (config.isTokenVerified()) { @Override protected void onPause() {
finish(); mServerConfigObserver.unsub();
return; super.onPause();
} }
final String token = config.getToken(); private void onRenderServerConfig(ServerConfig config) {
if (!TextUtils.isEmpty(token)) { if (config == null) {
return; finish();
} return;
}
final String selectedProviderName = config.getSelectedProviderName(); if (config.isTokenVerified()) {
if (!TextUtils.isEmpty(selectedProviderName)) { finish();
return;
}
return; final String token = config.getToken();
} if (!TextUtils.isEmpty(token)) {
return;
}
RealmList<MeteorLoginServiceConfiguration> providers = config.getAuthProviders(); final String selectedProviderName = config.getSelectedProviderName();
if (!providers.isEmpty()) { if (!TextUtils.isEmpty(selectedProviderName)) {
return; return;
} }
final String error = config.getConnectionError(); RealmList<MeteorLoginServiceConfiguration> providers = config.getAuthProviders();
String hostname = config.getHostname(); if (!providers.isEmpty()) {
if (!TextUtils.isEmpty(hostname) && TextUtils.isEmpty(error)) {
showFragment(new ConnectingToHostFragment());
return;
}
showFragment(new InputHostnameFragment()); return;
} }
@Override final String error = config.getConnectionError();
protected void showFragment(Fragment fragment) { String hostname = config.getHostname();
injectIdArgTo(fragment); if (!TextUtils.isEmpty(hostname) && TextUtils.isEmpty(error)) {
super.showFragment(fragment); showFragment(new ConnectingToHostFragment());
return;
} }
@Override showFragment(new InputHostnameFragment());
protected void showFragmentWithBackStack(Fragment fragment) { }
injectIdArgTo(fragment);
super.showFragmentWithBackStack(fragment);
}
private void injectIdArgTo(Fragment fragment) { @Override protected void showFragment(Fragment fragment) {
Bundle args = fragment.getArguments(); injectIdArgTo(fragment);
if (args == null) args = new Bundle(); super.showFragment(fragment);
args.putString("id", mServerConfigId); }
fragment.setArguments(args);
}
@Override @Override protected void showFragmentWithBackStack(Fragment fragment) {
public void onBackPressed() { injectIdArgTo(fragment);
if (ServerConfig.hasActiveConnection()) { super.showFragmentWithBackStack(fragment);
super.onBackPressed(); }
} else {
moveTaskToBack(true); private void injectIdArgTo(Fragment fragment) {
} Bundle args = fragment.getArguments();
if (args == null) {
args = new Bundle();
}
args.putString("id", mServerConfigId);
fragment.setArguments(args);
}
@Override public void onBackPressed() {
if (ServerConfig.hasActiveConnection()) {
super.onBackPressed();
} else {
moveTaskToBack(true);
} }
}
} }
...@@ -12,25 +12,25 @@ import android.view.ViewGroup; ...@@ -12,25 +12,25 @@ import android.view.ViewGroup;
* Fragment base class for this Application. * Fragment base class for this Application.
*/ */
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 void onSetupView();
@Nullable protected abstract @LayoutRes int getLayout();
@Override
public View onCreateView(LayoutInflater inflater, protected abstract void onSetupView();
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) { @Nullable @Override
mRootView = inflater.inflate(getLayout(), container, false); public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
onSetupView(); @Nullable Bundle savedInstanceState) {
return mRootView; mRootView = inflater.inflate(getLayout(), container, false);
} onSetupView();
return mRootView;
}
protected void finish() { protected void finish() {
if (getFragmentManager().getBackStackEntryCount() == 0) { if (getFragmentManager().getBackStackEntryCount() == 0) {
getActivity().finish(); getActivity().finish();
} else { } else {
getFragmentManager().popBackStack(); getFragmentManager().popBackStack();
}
} }
}
} }
...@@ -2,27 +2,25 @@ package chat.rocket.android.fragment.server_config; ...@@ -2,27 +2,25 @@ 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();
if (args == null) { if (args == null) {
finish(); finish();
return; return;
} }
mServerConfigId = args.getString("id"); mServerConfigId = args.getString("id");
if (TextUtils.isEmpty(mServerConfigId)) { if (TextUtils.isEmpty(mServerConfigId)) {
finish(); finish();
return; return;
}
} }
}
} }
...@@ -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,95 +12,86 @@ import io.realm.Realm; ...@@ -15,95 +12,86 @@ 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) {
Toast.makeText(mRootView.getContext(), (String) msg.obj, Toast.LENGTH_SHORT).show();
}
};
RealmObjectObserver<ServerConfig> mObserver = new RealmObjectObserver<ServerConfig>() {
@Override protected RealmQuery<ServerConfig> query(Realm realm) {
return realm.where(ServerConfig.class).equalTo("id", mServerConfigId);
}
@Override @Override protected void onChange(ServerConfig config) {
protected int getLayout() { onRenderServerConfig(config);
return R.layout.fragment_input_hostname;
} }
};
RealmObjectObserver<ServerConfig> mObserver = new RealmObjectObserver<ServerConfig>() { public InputHostnameFragment() {
@Override }
protected RealmQuery<ServerConfig> query(Realm realm) {
return realm.where(ServerConfig.class).equalTo("id", mServerConfigId);
}
@Override @Override protected int getLayout() {
protected void onChange(ServerConfig config) { return R.layout.fragment_input_hostname;
onRenderServerConfig(config); }
}
};
@Override @Override protected void onSetupView() {
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();
} }
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))).continueWith(new LogcatIfError());
.put("connectionError", JSONObject.NULL))) }
.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() { private void showError(String errString) {
@Override mShowError.removeMessages(0);
public void handleMessage(Message msg) { Message msg = Message.obtain(mShowError, 0, errString);
Toast.makeText(mRootView.getContext(), (String) msg.obj, Toast.LENGTH_SHORT).show(); mShowError.sendMessageDelayed(msg, 160);
} }
};
private void showError(String errString) {
mShowError.removeMessages(0);
Message msg = Message.obtain(mShowError, 0, errString);
mShowError.sendMessageDelayed(msg, 160);
}
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())) {
if (!TextUtils.isEmpty(config.getConnectionError())) { editor.setText(config.getHostname());
clearConnectionErrorAndHostname();
showError(config.getConnectionError());
}
} }
if (!TextUtils.isEmpty(config.getConnectionError())) {
private void clearConnectionErrorAndHostname() { clearConnectionErrorAndHostname();
RealmHelperBolts showError(config.getConnectionError());
.executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(ServerConfig.class, new JSONObject()
.put("id", mServerConfigId)
.put("hostname", JSONObject.NULL)
.put("connectionError", JSONObject.NULL)))
.continueWith(new LogcatIfError());
} }
}
private void clearConnectionErrorAndHostname() {
RealmHelperBolts.executeTransaction(
realm -> realm.createOrUpdateObjectFromJson(ServerConfig.class,
new JSONObject().put("id", mServerConfigId)
.put("hostname", JSONObject.NULL)
.put("connectionError", JSONObject.NULL))).continueWith(new LogcatIfError());
}
} }
...@@ -8,11 +8,10 @@ import timber.log.Timber; ...@@ -8,11 +8,10 @@ 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());
}
return task;
} }
return task;
}
} }
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;
/** /**
* Helper class for OkHttp client. * Helper class for OkHttp client.
*/ */
public class OkHttpHelper { public class OkHttpHelper {
private static OkHttpClient sHttpClientForWS; private static OkHttpClient sHttpClientForWS;
/** /**
* acquire OkHttpClient instance for WebSocket connection. * acquire OkHttpClient instance for WebSocket connection.
*/ */
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();
}
return sHttpClientForWS;
} }
return sHttpClientForWS;
}
} }
...@@ -5,10 +5,10 @@ package chat.rocket.android.helper; ...@@ -5,10 +5,10 @@ package chat.rocket.android.helper;
*/ */
public interface OnBackPressListener { public interface OnBackPressListener {
/** /**
* onBackPressed * onBackPressed
* *
* @return whether back is handled or not. * @return whether back is handled or not.
*/ */
boolean onBackPressed(); boolean onBackPressed();
} }
...@@ -5,22 +5,25 @@ package chat.rocket.android.helper; ...@@ -5,22 +5,25 @@ package chat.rocket.android.helper;
*/ */
public class TextUtils { 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 *
* @return true if str is null or zero length * @param str the string to be examined
*/ * @return true if str is null or zero length
public static boolean isEmpty(CharSequence str) { */
// same definition as android.text.TextUtils#isEmpty(). public static boolean isEmpty(CharSequence str) {
return str == null || str.length() == 0; // same definition as android.text.TextUtils#isEmpty().
} return str == null || str.length() == 0;
}
/** /**
* 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 str; return defaultValue;
} }
return str;
}
} }
...@@ -6,12 +6,11 @@ import io.realm.annotations.PrimaryKey; ...@@ -6,12 +6,11 @@ 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 private String clientId; //for other auth providers
private String clientId; //for other auth providers
} }
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,101 +9,95 @@ import io.realm.RealmQuery; ...@@ -11,101 +9,95 @@ 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 hostname;
private String id; private String connectionError;
private String hostname; private String token;
private String connectionError; private boolean tokenVerified;
private String token; private RealmList<MeteorLoginServiceConfiguration> authProviders;
private boolean tokenVerified; private String selectedProviderName;
private RealmList<MeteorLoginServiceConfiguration> authProviders;
private String selectedProviderName; public static RealmQuery<ServerConfig> queryLoginRequiredConnections(Realm realm) {
return realm.where(ServerConfig.class).equalTo("tokenVerified", false);
public String getId() { }
return id;
} public static RealmQuery<ServerConfig> queryActiveConnections(Realm realm) {
return realm.where(ServerConfig.class).isNotNull("token");
public void setId(String id) { }
this.id = id;
} public static boolean hasActiveConnection() {
ServerConfig config =
public String getHostname() { RealmHelper.executeTransactionForRead(realm -> queryActiveConnections(realm).findFirst());
return hostname;
} return config != null;
}
public void setHostname(String hostname) {
this.hostname = hostname; @DebugLog public static void logError(String id, Exception exception) {
} RealmHelperBolts.executeTransaction(
realm -> realm.createOrUpdateObjectFromJson(ServerConfig.class,
public String getConnectionError() { new JSONObject().put("id", id).put("connectionError", exception.getMessage())))
return connectionError; .continueWith(new LogcatIfError());
} }
public void setConnectionError(String connectionError) { public String getId() {
this.connectionError = connectionError; return id;
} }
public String getToken() { public void setId(String id) {
return token; this.id = id;
} }
public void setToken(String token) { public String getHostname() {
this.token = token; return hostname;
} }
public boolean isTokenVerified() { public void setHostname(String hostname) {
return tokenVerified; this.hostname = hostname;
} }
public void setTokenVerified(boolean tokenVerified) { public String getConnectionError() {
this.tokenVerified = tokenVerified; return connectionError;
} }
public RealmList<MeteorLoginServiceConfiguration> getAuthProviders() { public void setConnectionError(String connectionError) {
return authProviders; this.connectionError = connectionError;
} }
public void setAuthProviders(RealmList<MeteorLoginServiceConfiguration> authProviders) { public String getToken() {
this.authProviders = authProviders; return token;
} }
public String getSelectedProviderName() { public void setToken(String token) {
return selectedProviderName; this.token = token;
} }
public void setSelectedProviderName(String selectedProviderName) { public boolean isTokenVerified() {
this.selectedProviderName = selectedProviderName; return tokenVerified;
} }
public static RealmQuery<ServerConfig> queryLoginRequiredConnections(Realm realm) { public void setTokenVerified(boolean tokenVerified) {
return realm.where(ServerConfig.class) this.tokenVerified = tokenVerified;
.equalTo("tokenVerified", false); }
}
public RealmList<MeteorLoginServiceConfiguration> getAuthProviders() {
public static RealmQuery<ServerConfig> queryActiveConnections(Realm realm) { return authProviders;
return realm.where(ServerConfig.class) }
.isNotNull("token");
} public void setAuthProviders(RealmList<MeteorLoginServiceConfiguration> authProviders) {
this.authProviders = authProviders;
public static boolean hasActiveConnection() { }
ServerConfig config = RealmHelper.executeTransactionForRead(realm ->
queryActiveConnections(realm).findFirst()); public String getSelectedProviderName() {
return selectedProviderName;
return config != null; }
}
public void setSelectedProviderName(String selectedProviderName) {
@DebugLog this.selectedProviderName = selectedProviderName;
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());
}
} }
...@@ -4,18 +4,18 @@ package chat.rocket.android.service; ...@@ -4,18 +4,18 @@ package chat.rocket.android.service;
* interface for observer and ddp_subscription * interface for observer and ddp_subscription
*/ */
public interface Registerable { public interface Registerable {
/** /**
* register * register
*/ */
void register(); void register();
/** /**
* keepalive * keepalive
*/ */
void keepalive(); void keepalive();
/** /**
* unregister * unregister
*/ */
void unregister(); void unregister();
} }
...@@ -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,94 +20,88 @@ import jp.co.crowdworks.realm_java_helpers.RealmListObserver; ...@@ -22,94 +20,88 @@ import jp.co.crowdworks.realm_java_helpers.RealmListObserver;
*/ */
public class RocketChatService extends Service { public class RocketChatService extends Service {
/** private HashMap<String, RocketChatWebSocketThread> mWebSocketThreads;
* ensure RocketChatService alive. private RealmListObserver<ServerConfig> mConnectionRequiredServerConfigObserver =
*/ new RealmListObserver<ServerConfig>() {
public static void keepalive(Context context) { @Override protected RealmResults<ServerConfig> queryItems(Realm realm) {
context.startService(new Intent(context, RocketChatService.class)); return realm.where(ServerConfig.class)
} .isNotNull("hostname")
.isNull("connectionError")
/** .findAll();
* force stop RocketChatService. }
*/
public static void kill(Context context) {
context.stopService(new Intent(context, RocketChatService.class));
}
private HashMap<String, RocketChatWebSocketThread> mWebSocketThreads; @Override protected void onCollectionChanged(List<ServerConfig> list) {
private RealmListObserver<ServerConfig> mConnectionRequiredServerConfigObserver = syncWebSocketThreadsWith(list);
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) { * ensure RocketChatService alive.
syncWebSocketThreadsWith(list); */
} public static void keepalive(Context context) {
}; context.startService(new Intent(context, RocketChatService.class));
}
@Override /**
public void onCreate() { * force stop RocketChatService.
super.onCreate(); */
mWebSocketThreads = new HashMap<>(); public static void kill(Context context) {
} context.stopService(new Intent(context, RocketChatService.class));
}
@Override @Override public void onCreate() {
public int onStartCommand(Intent intent, int flags, int startId) { super.onCreate();
mConnectionRequiredServerConfigObserver.keepalive(); mWebSocketThreads = new HashMap<>();
return START_STICKY; }
}
private void syncWebSocketThreadsWith(List<ServerConfig> configList) { @Override public int onStartCommand(Intent intent, int flags, int startId) {
final Iterator<Map.Entry<String, RocketChatWebSocketThread>> iterator = mConnectionRequiredServerConfigObserver.keepalive();
mWebSocketThreads.entrySet().iterator(); return START_STICKY;
}
while (iterator.hasNext()) { private void syncWebSocketThreadsWith(List<ServerConfig> configList) {
Map.Entry<String, RocketChatWebSocketThread> entry = iterator.next(); final Iterator<Map.Entry<String, RocketChatWebSocketThread>> iterator =
String serverConfigId = entry.getKey(); mWebSocketThreads.entrySet().iterator();
boolean found = false;
for (ServerConfig config: configList) {
if (serverConfigId.equals(config.getId())) {
found = true;
break;
}
}
if (!found) {
RocketChatWebSocketThread.terminate(entry.getValue());
iterator.remove();
}
}
for (ServerConfig config: configList) { while (iterator.hasNext()) {
findOrCreateWebSocketThread(config).onSuccess(task -> { Map.Entry<String, RocketChatWebSocketThread> entry = iterator.next();
RocketChatWebSocketThread thread = task.getResult(); String serverConfigId = entry.getKey();
thread.syncStateWith(config); boolean found = false;
return null; for (ServerConfig config : configList) {
}); if (serverConfigId.equals(config.getId())) {
found = true;
break;
} }
}
if (!found) {
RocketChatWebSocketThread.terminate(entry.getValue());
iterator.remove();
}
} }
private Task<RocketChatWebSocketThread> findOrCreateWebSocketThread(final ServerConfig config) { for (ServerConfig config : configList) {
final String serverConfigId = config.getId(); findOrCreateWebSocketThread(config).onSuccess(task -> {
if (mWebSocketThreads.containsKey(serverConfigId)) { RocketChatWebSocketThread thread = task.getResult();
return Task.forResult(mWebSocketThreads.get(serverConfigId)); thread.syncStateWith(config);
} else { return null;
return RocketChatWebSocketThread.getStarted(getApplicationContext(), config) });
.onSuccessTask(task -> {
mWebSocketThreads.put(serverConfigId, task.getResult());
return task;
});
}
} }
}
@Nullable private Task<RocketChatWebSocketThread> findOrCreateWebSocketThread(final ServerConfig config) {
@Override final String serverConfigId = config.getId();
public IBinder onBind(Intent intent) { if (mWebSocketThreads.containsKey(serverConfigId)) {
return null; return Task.forResult(mWebSocketThreads.get(serverConfigId));
} else {
return RocketChatWebSocketThread.getStarted(getApplicationContext(), config)
.onSuccessTask(task -> {
mWebSocketThreads.put(serverConfigId, task.getResult());
return task;
});
} }
}
@Nullable @Override public IBinder onBind(Intent intent) {
return null;
}
} }
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;
...@@ -10,22 +9,19 @@ import io.realm.RealmObject; ...@@ -10,22 +9,19 @@ import io.realm.RealmObject;
* meteor.loginServiceConfiguration subscriber * meteor.loginServiceConfiguration subscriber
*/ */
public class LoginServiceConfigurationSubscriber extends AbstractDDPDocEventSubscriber { public class LoginServiceConfigurationSubscriber extends AbstractDDPDocEventSubscriber {
public LoginServiceConfigurationSubscriber(Context context, RocketChatWebSocketAPI api) { public LoginServiceConfigurationSubscriber(Context context, RocketChatWebSocketAPI api) {
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 RocketChatWebSocketAPI mAPI;
protected AbstractModelObserver(Context context, RocketChatWebSocketAPI api) { protected final Context mContext;
mContext = context; protected final RocketChatWebSocketAPI mAPI;
mAPI = api;
}
protected AbstractModelObserver(Context context, RocketChatWebSocketAPI api) {
mContext = context;
mAPI = api;
}
@Override @Override public void register() {
public void register() { sub();
sub(); }
}
@Override @Override public void unregister() {
public void unregister() { unsub();
unsub(); }
}
} }
...@@ -7,34 +7,36 @@ import android.util.AttributeSet; ...@@ -7,34 +7,36 @@ import android.util.AttributeSet;
abstract class AbstractCustomFontTextView extends AppCompatTextView { abstract class AbstractCustomFontTextView extends AppCompatTextView {
protected abstract String getFont(); //CHECKSTYLE:OFF RedundantModifier
public AbstractCustomFontTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
//CHECKSTYLE:OFF RedundantModifier //CHECKSTYLE:OFF RedundantModifier
public AbstractCustomFontTextView(Context context, AttributeSet attrs, int defStyle) { public AbstractCustomFontTextView(Context context, AttributeSet attrs) {
super(context, attrs, defStyle); super(context, attrs);
init(); init();
} }
//CHECKSTYLE:ON RedundantModifier //CHECKSTYLE:ON RedundantModifier
//CHECKSTYLE:OFF RedundantModifier //CHECKSTYLE:OFF RedundantModifier
public AbstractCustomFontTextView(Context context, AttributeSet attrs) { public AbstractCustomFontTextView(Context context) {
super(context, attrs); super(context);
init(); init();
} }
//CHECKSTYLE:ON RedundantModifier //CHECKSTYLE:ON RedundantModifier
//CHECKSTYLE:OFF RedundantModifier protected abstract String getFont();
public AbstractCustomFontTextView(Context context) { //CHECKSTYLE:ON RedundantModifier
super(context);
init();
}
//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);
}
} }
}
} }
...@@ -7,20 +7,19 @@ import android.util.AttributeSet; ...@@ -7,20 +7,19 @@ import android.util.AttributeSet;
* TextView with font-awesome * TextView with font-awesome
*/ */
public class FontAwesomeTextView extends AbstractCustomFontTextView { public class FontAwesomeTextView extends AbstractCustomFontTextView {
public FontAwesomeTextView(Context context, AttributeSet attrs, int defStyle) { public FontAwesomeTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); super(context, attrs, defStyle);
} }
public FontAwesomeTextView(Context context, AttributeSet attrs) { public FontAwesomeTextView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
} }
public FontAwesomeTextView(Context context) { public FontAwesomeTextView(Context context) {
super(context); super(context);
} }
@Override @Override protected String getFont() {
protected String getFont() { return "fontawesome-webfont.ttf";
return "fontawesome-webfont.ttf"; }
}
} }
...@@ -7,20 +7,19 @@ import android.util.AttributeSet; ...@@ -7,20 +7,19 @@ import android.util.AttributeSet;
* TextView with fontello * TextView with fontello
*/ */
public class FontelloTextView extends AbstractCustomFontTextView { public class FontelloTextView extends AbstractCustomFontTextView {
public FontelloTextView(Context context, AttributeSet attrs, int defStyle) { public FontelloTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); super(context, attrs, defStyle);
} }
public FontelloTextView(Context context, AttributeSet attrs) { public FontelloTextView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
} }
public FontelloTextView(Context context) { public FontelloTextView(Context context) {
super(context); super(context);
} }
@Override @Override protected String getFont() {
protected String getFont() { return "fontello.ttf";
return "fontello.ttf"; }
}
} }
...@@ -3,35 +3,32 @@ package chat.rocket.android.view; ...@@ -3,35 +3,32 @@ 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();
private static final Hashtable<String, Typeface> CACHE = new Hashtable<String, Typeface>(); private static final Hashtable<String, Typeface> CACHE = new Hashtable<String, Typeface>();
/** /**
* read font in assets directory. * read font in assets directory.
*/ */
public static Typeface getTypeface(Context context, String assetPath) { public static Typeface getTypeface(Context context, String assetPath) {
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,
Log.e(TAG, "Could not get typeface '" + assetPath "Could not get typeface '" + assetPath + "' because " + exception.getMessage());
+ "' because " + exception.getMessage()); return null;
return null;
}
}
return CACHE.get(assetPath);
} }
}
return CACHE.get(assetPath);
} }
}
} }
...@@ -11,112 +11,108 @@ import android.view.View; ...@@ -11,112 +11,108 @@ 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.
*/ */
public class WaitingView extends LinearLayout { public class WaitingView extends LinearLayout {
private ArrayList<View> mDots; private ArrayList<View> mDots;
public WaitingView(Context context) { public WaitingView(Context context) {
super(context); super(context);
initialize(context, null); initialize(context, null);
} }
public WaitingView(Context context, AttributeSet attrs) { public WaitingView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
initialize(context, attrs); initialize(context, attrs);
} }
public WaitingView(Context context, AttributeSet attrs, int defStyleAttr) { public WaitingView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr); super(context, attrs, defStyleAttr);
initialize(context, attrs); initialize(context, attrs);
} }
@TargetApi(Build.VERSION_CODES.LOLLIPOP) @TargetApi(Build.VERSION_CODES.LOLLIPOP)
public WaitingView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { public WaitingView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes); super(context, attrs, defStyleAttr, defStyleRes);
initialize(context, attrs); initialize(context, attrs);
} }
private void initialize(Context context, AttributeSet attrs) { private void initialize(Context context, AttributeSet attrs) {
int size = context.getResources().getDimensionPixelSize(R.dimen.def_waiting_view_dot_size); int size = context.getResources().getDimensionPixelSize(R.dimen.def_waiting_view_dot_size);
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();
}
mDots = new ArrayList<>();
setOrientation(HORIZONTAL);
for (int i = 0; i < count; i++) addDot(context, size);
addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View view) {
start();
}
@Override
public void onViewDetachedFromWindow(View view) {
cancel();
}
});
} }
private void addDot(Context context, int size) { mDots = new ArrayList<>();
FrameLayout frameLayout = new FrameLayout(context); setOrientation(HORIZONTAL);
frameLayout.setLayoutParams( for (int i = 0; i < count; i++) {
new LinearLayoutCompat.LayoutParams(size * 3 / 2, size * 3 / 2)); addDot(context, size);
ImageView dot = new ImageView(context);
dot.setImageResource(R.drawable.white_circle);
dot.setLayoutParams(new FrameLayout.LayoutParams(size, size, Gravity.CENTER));
frameLayout.addView(dot);
addView(frameLayout);
mDots.add(dot);
} }
private void start() { addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
for (int i = 0; i < mDots.size(); i++) { @Override public void onViewAttachedToWindow(View view) {
animateDot(mDots.get(i), 160 * i, 480, 480); start();
} }
@Override public void onViewDetachedFromWindow(View view) {
cancel();
}
});
}
private void addDot(Context context, int size) {
FrameLayout frameLayout = new FrameLayout(context);
frameLayout.setLayoutParams(new LinearLayoutCompat.LayoutParams(size * 3 / 2, size * 3 / 2));
ImageView dot = new ImageView(context);
dot.setImageResource(R.drawable.white_circle);
dot.setLayoutParams(new FrameLayout.LayoutParams(size, size, Gravity.CENTER));
frameLayout.addView(dot);
addView(frameLayout);
mDots.add(dot);
}
private void start() {
for (int i = 0; i < mDots.size(); i++) {
animateDot(mDots.get(i), 160 * i, 480, 480);
} }
}
private void animateDot(final View dot,
final long startDelay, private void animateDot(final View dot, final long startDelay, final long duration,
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)
.scaleX(1).scaleY(1) .scaleY(1)
.setDuration(duration) .setDuration(duration)
.setStartDelay(startDelay) .setStartDelay(startDelay)
.withEndAction(() -> { .withEndAction(() -> {
dot.animate() dot.animate()
.scaleX(0).scaleY(0) .scaleX(0)
.setDuration(duration) .scaleY(0)
.setStartDelay(0) .setDuration(duration)
.withEndAction(() -> { .setStartDelay(0)
animateDot(dot, interval, duration, interval); .withEndAction(() -> {
}) animateDot(dot, interval, duration, interval);
.start(); })
}) .start();
.start(); })
} .start();
}
private void cancel() {
for (View dot: mDots) { private void cancel() {
dot.clearAnimation(); for (View dot : mDots) {
} 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;
/** /**
* API for several POST actions. * API for several POST actions.
*/ */
public class RocketChatWebSocketAPI { public class RocketChatWebSocketAPI {
private final DDPClient mDDPClient; private final DDPClient mDDPClient;
private final String mHostName; private final String mHostName;
private RocketChatWebSocketAPI(String hostname) {
mDDPClient = new DDPClient(OkHttpHelper.getClientForWebSocket());
mHostName = hostname;
}
/**
* create new API client instance.
*/
public static RocketChatWebSocketAPI create(String hostname) {
return new RocketChatWebSocketAPI(hostname);
}
/** private RocketChatWebSocketAPI(String hostname) {
* Connect to WebSocket server with DDP client. mDDPClient = new DDPClient(OkHttpHelper.getClientForWebSocket());
*/ mHostName = hostname;
public Task<DDPClientCallback.Connect> connect() { }
return mDDPClient.connect("wss://" + mHostName + "/websocket");
}
/** /**
* Returns whether DDP client is connected to WebSocket server. * create new API client instance.
*/ */
public boolean isConnected() { public static RocketChatWebSocketAPI create(String hostname) {
return mDDPClient.isConnected(); return new RocketChatWebSocketAPI(hostname);
} }
/** /**
* close connection. * Connect to WebSocket server with DDP client.
*/ */
public void close() { public Task<DDPClientCallback.Connect> connect() {
mDDPClient.close(); return mDDPClient.connect("wss://" + mHostName + "/websocket");
} }
/**
* Returns whether DDP client is connected to WebSocket server.
*/
public boolean isConnected() {
return mDDPClient.isConnected();
}
/** /**
* Subscribe with DDP client. * close connection.
*/ */
public Task<DDPSubscription.Ready> subscribe(final String name, JSONArray param) { public void close() {
return mDDPClient.sub(UUID.randomUUID().toString(), name, param); mDDPClient.close();
} }
/** /**
* Unsubscribe with DDP client. * Subscribe with DDP client.
*/ */
public Task<DDPSubscription.NoSub> unsubscribe(final String subscriptionId) { public Task<DDPSubscription.Ready> subscribe(final String name, JSONArray param) {
return mDDPClient.unsub(subscriptionId); return mDDPClient.sub(UUID.randomUUID().toString(), name, param);
} }
/** /**
* Returns Observable for handling DDP subscription. * Unsubscribe with DDP client.
*/ */
public Observable<DDPSubscription.Event> getSubscriptionCallback() { public Task<DDPSubscription.NoSub> unsubscribe(final String subscriptionId) {
return mDDPClient.getSubscriptionCallback(); return mDDPClient.unsub(subscriptionId);
} }
/**
* Returns Observable for handling DDP subscription.
*/
public Observable<DDPSubscription.Event> 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"/>
</vector> </vector>
<?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"
<solid android:color="@color/userstatus_away"/> android:shape="oval">
<stroke android:width="1dp" android:color="@color/userstatus_away_outline" /> <solid android:color="@color/userstatus_away"/>
<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"
<solid android:color="@color/userstatus_busy"/> android:shape="oval">
<stroke android:width="1dp" android:color="@color/userstatus_busy_outline" /> <solid android:color="@color/userstatus_busy"/>
<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"
<solid android:color="@color/userstatus_offline"/> android:shape="oval">
<stroke android:width="1dp" android:color="@color/userstatus_offline_outline" /> <solid android:color="@color/userstatus_offline"/>
<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"
<solid android:color="@color/userstatus_online"/> android:shape="oval">
<stroke android:width="1dp" android:color="@color/userstatus_online_outline" /> <solid android:color="@color/userstatus_online"/>
<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"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"> android:shape="oval">
<solid android:color="@android:color/white"/> <solid android:color="@android:color/white"/>
</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_height="match_parent"
>
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="wrap_content"
>
<android.support.design.widget.AppBarLayout <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.support.v7.widget.Toolbar android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:layout_width="match_parent" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
android:layout_height="wrap_content" app:title="@string/app_name"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" </android.support.design.widget.AppBarLayout>
app:title="@string/app_name"/>
</android.support.design.widget.AppBarLayout>
<FrameLayout <FrameLayout
android:id="@+id/activity_main_container" android:id="@+id/activity_main_container"
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_height="match_parent"
>
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="wrap_content"
>
<android.support.design.widget.AppBarLayout <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.support.v7.widget.Toolbar android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:layout_width="match_parent" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
android:layout_height="wrap_content" app:title="@string/app_name"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" </android.support.design.widget.AppBarLayout>
app:title="@string/app_name"/>
</android.support.design.widget.AppBarLayout>
<FrameLayout <FrameLayout
android:id="@+id/activity_main_container" android:id="@+id/activity_main_container"
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 >
android:id="@+id/avatar_initials"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/avatar_text_size_large"
android:layout_gravity="center"/>
</FrameLayout>
<ImageView <TextView
android:id="@+id/avatar_img" android:id="@+id/avatar_initials"
android:layout_width="@dimen/avatar_image_size_large" android:layout_width="wrap_content"
android:layout_height="@dimen/avatar_image_size_large" android:layout_height="wrap_content"
android:src="@drawable/ic_default_avatar" android:layout_gravity="center"
android:scaleType="centerInside"/> android:textSize="@dimen/avatar_text_size_large"
/>
</FrameLayout>
<ImageView
android:id="@+id/avatar_img"
android:layout_width="@dimen/avatar_image_size_large"
android:layout_height="@dimen/avatar_image_size_large"
android:scaleType="centerInside"
android:src="@drawable/ic_default_avatar"
/>
</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 >
android:id="@+id/avatar_initials"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/avatar_text_size_normal"
android:layout_gravity="center"/>
</FrameLayout>
<ImageView <TextView
android:id="@+id/avatar_img" android:id="@+id/avatar_initials"
android:layout_width="@dimen/avatar_image_size_normal" android:layout_width="wrap_content"
android:layout_height="@dimen/avatar_image_size_normal" android:layout_height="wrap_content"
android:src="@drawable/ic_default_avatar" android:layout_gravity="center"
android:scaleType="centerInside"/> android:textSize="@dimen/avatar_text_size_normal"
/>
</FrameLayout>
<ImageView
android:id="@+id/avatar_img"
android:layout_width="@dimen/avatar_image_size_normal"
android:layout_height="@dimen/avatar_image_size_normal"
android:scaleType="centerInside"
android:src="@drawable/ic_default_avatar"
/>
</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
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/white"
android:minWidth="288dp"
android:orientation="horizontal"
android:padding="@dimen/margin_24"
>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="0px"
android:minWidth="288dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:layout_weight="1"
android:background="@color/white" android:orientation="vertical"
android:padding="@dimen/margin_24" >
android:layout_gravity="center">
<LinearLayout
android:layout_width="0px"
android:layout_weight="1"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="hostname"
android:textAppearance="@style/TextAppearance.AppCompat.Caption"/>
<EditText
android:id="@+id/editor_hostname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:hint="demo.rocket.chat"
android:imeOptions="actionGo"
android:inputType="textWebEditText"/>
</LinearLayout>
<Space <TextView
android:layout_width="@dimen/margin_8" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
android:text="hostname"
android:textAppearance="@style/TextAppearance.AppCompat.Caption"
/>
<android.support.design.widget.FloatingActionButton <EditText
android:id="@+id/btn_connect" android:id="@+id/editor_hostname"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:fabSize="mini" android:hint="demo.rocket.chat"
app:srcCompat="@drawable/ic_arrow_forward_white_24dp" android:imeOptions="actionGo"
app:elevation="2dp" android:inputType="textWebEditText"
android:layout_gravity="end|bottom"/> android:singleLine="true"
/>
</LinearLayout> </LinearLayout>
<Space
android:layout_width="@dimen/margin_8"
android:layout_height="wrap_content"
/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/btn_connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
app:elevation="2dp"
app:fabSize="mini"
app:srcCompat="@drawable/ic_arrow_forward_white_24dp"
/>
</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
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimaryDark"
android:orientation="vertical"
>
<LinearLayout <LinearLayout
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="vertical" android:background="?attr/selectableItemBackground"
android:background="?attr/colorPrimaryDark"> android:gravity="center_vertical"
android:orientation="horizontal"
<LinearLayout android:padding="@dimen/margin_16"
android:id="@+id/user_info_container" >
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
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>
<chat.rocket.android.view.FontAwesomeTextView <chat.rocket.android.view.FontAwesomeTextView
android:id="@+id/img_user_action_toggle" android:id="@+id/img_user_action_toggle"
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>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -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>
<color name="colorPrimary">#00426B</color> <color name="colorPrimary">#00426B</color>
<color name="colorPrimaryDark">#FF001E31</color> <color name="colorPrimaryDark">#FF001E31</color>
<color name="colorAccent">#FF2D91FA</color> <color name="colorAccent">#FF2D91FA</color>
<color name="colorAccentLight">#FF6CB1FA</color> <color name="colorAccentLight">#FF6CB1FA</color>
<color name="colorAccentDark">#FF287DD7</color> <color name="colorAccentDark">#FF287DD7</color>
<color name="colorAccent_a40">#662D91FA</color> <color name="colorAccent_a40">#662D91FA</color>
<color name="textColorLink">#008ce3</color> <color name="textColorLink">#008ce3</color>
<color name="divider">#FFEEEEEE</color> <color name="divider">#FFEEEEEE</color>
<color name="white">#FFFEFEFF</color> <color name="white">#FFFEFEFF</color>
</resources> </resources>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<dimen name="avatar_image_size_normal">24dp</dimen> <dimen name="avatar_image_size_normal">24dp</dimen>
<dimen name="avatar_image_size_large">48dp</dimen> <dimen name="avatar_image_size_large">48dp</dimen>
<dimen name="avatar_text_size_normal">11sp</dimen> <dimen name="avatar_text_size_normal">11sp</dimen>
<dimen name="avatar_text_size_large">28sp</dimen> <dimen name="avatar_text_size_large">28sp</dimen>
</resources> </resources>
\ 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>
<dimen name="margin_8">8dp</dimen> <dimen name="margin_8">8dp</dimen>
<dimen name="margin_16">16dp</dimen> <dimen name="margin_16">16dp</dimen>
<dimen name="margin_24">24dp</dimen> <dimen name="margin_24">24dp</dimen>
</resources> </resources>
\ No newline at end of file
<resources> <resources>
<string name="app_name">Rocket.Chat.Android</string> <string name="app_name">Rocket.Chat.Android</string>
</resources> </resources>
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorLink">@drawable/selector_text_color_link</item> <item name="android:textColorLink">@drawable/selector_text_color_link</item>
<item name="android:listDivider">@color/divider</item> <item name="android:listDivider">@color/divider</item>
<item name="colorControlActivated">@color/colorAccentDark</item> <item name="colorControlActivated">@color/colorAccentDark</item>
<item name="android:textColorHighlight">@color/colorAccent_a40</item> <item name="android:textColorHighlight">@color/colorAccent_a40</item>
<item name="actionModeBackground">?attr/colorPrimaryDark</item> <item name="actionModeBackground">?attr/colorPrimaryDark</item>
<item name="android:statusBarColor" tools:targetApi="21">?attr/colorPrimaryDark</item> <item name="android:statusBarColor" tools:targetApi="21">?attr/colorPrimaryDark</item>
<item name="android:navigationBarColor" tools:targetApi="21">?attr/colorPrimaryDark</item> <item name="android:navigationBarColor" tools:targetApi="21">?attr/colorPrimaryDark</item>
</style> </style>
<style name="AppTheme.Dark" parent="Theme.AppCompat.NoActionBar"> <style name="AppTheme.Dark" parent="Theme.AppCompat.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorLink">@drawable/selector_text_color_link</item> <item name="android:textColorLink">@drawable/selector_text_color_link</item>
<item name="android:listDivider">@color/divider</item> <item name="android:listDivider">@color/divider</item>
<item name="colorControlActivated">@color/colorAccentDark</item> <item name="colorControlActivated">@color/colorAccentDark</item>
<item name="android:textColorHighlight">@color/colorAccent_a40</item> <item name="android:textColorHighlight">@color/colorAccent_a40</item>
<item name="actionModeBackground">?attr/colorPrimaryDark</item> <item name="actionModeBackground">?attr/colorPrimaryDark</item>
<item name="android:statusBarColor" tools:targetApi="21">?attr/colorPrimaryDark</item> <item name="android:statusBarColor" tools:targetApi="21">?attr/colorPrimaryDark</item>
<item name="android:navigationBarColor" tools:targetApi="21">?attr/colorPrimaryDark</item> <item name="android:navigationBarColor" tools:targetApi="21">?attr/colorPrimaryDark</item>
</style> </style>
<style name="AppTheme.Dialog" parent="Theme.AppCompat.Light.Dialog"> <style name="AppTheme.Dialog" parent="Theme.AppCompat.Light.Dialog">
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorLink">@drawable/selector_text_color_link</item> <item name="android:textColorLink">@drawable/selector_text_color_link</item>
<item name="android:listDivider">@color/divider</item> <item name="android:listDivider">@color/divider</item>
<item name="colorControlActivated">@color/colorAccentDark</item> <item name="colorControlActivated">@color/colorAccentDark</item>
<item name="android:textColorHighlight">@color/colorAccent_a40</item> <item name="android:textColorHighlight">@color/colorAccent_a40</item>
</style> </style>
</resources> </resources>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="userstatus_online">#35ac19</color> <color name="userstatus_online">#35ac19</color>
<color name="userstatus_online_outline">#2c9210</color> <color name="userstatus_online_outline">#2c9210</color>
<color name="userstatus_away">#fcb316</color> <color name="userstatus_away">#fcb316</color>
<color name="userstatus_away_outline">#e69200</color> <color name="userstatus_away_outline">#e69200</color>
<color name="userstatus_busy">#d30230</color> <color name="userstatus_busy">#d30230</color>
<color name="userstatus_busy_outline">#9f0030</color> <color name="userstatus_busy_outline">#9f0030</color>
<color name="userstatus_offline">#7b7b7b</color> <color name="userstatus_offline">#7b7b7b</color>
<color name="userstatus_offline_outline">#666</color> <color name="userstatus_offline_outline">#666</color>
</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
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
repositories { repositories {
jcenter() jcenter()
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:2.2.2' classpath 'com.android.tools.build:gradle:2.2.2'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
classpath 'me.tatarka:gradle-retrolambda:3.3.1' classpath 'me.tatarka:gradle-retrolambda:3.3.1'
classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2' classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
classpath "io.realm:realm-gradle-plugin:2.1.1" classpath "io.realm:realm-gradle-plugin:2.1.1"
classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1' classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
} }
// Exclude the version that the android plugin depends on. // Exclude the version that the android plugin depends on.
configurations.classpath.exclude group: 'com.android.tools.external.lombok' configurations.classpath.exclude group: 'com.android.tools.external.lombok'
} }
allprojects { allprojects {
repositories { repositories {
jcenter() jcenter()
} }
} }
task clean(type: Delete) { task clean(type: Delete) {
delete rootProject.buildDir delete rootProject.buildDir
} }
<?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
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter> <FindBugsFilter>
<Match> <Match>
<Class name="~.*\.R\$.*"/> <Class name="~.*\.R\$.*"/>
</Match> </Match>
<Match> <Match>
<Class name="~.*\.Manifest\$.*"/> <Class name="~.*\.Manifest\$.*"/>
</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>
</FindBugsFilter> </FindBugsFilter>
\ No newline at end of file
...@@ -4,25 +4,25 @@ ...@@ -4,25 +4,25 @@
xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd" xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"> xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd">
<description>Custom ruleset for Rocket.Chat.Android application</description> <description>Custom ruleset for Rocket.Chat.Android application</description>
<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" />-->
<!--<exclude name="VariableNamingConventions" />--> <!--<exclude name="VariableNamingConventions" />-->
</rule> </rule>
</ruleset> </ruleset>
\ No newline at end of file
...@@ -7,15 +7,14 @@ ...@@ -7,15 +7,14 @@
* - 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'
apply plugin: 'pmd' apply plugin: 'pmd'
dependencies { dependencies {
checkstyle 'com.puppycrawl.tools:checkstyle:7.2' checkstyle 'com.puppycrawl.tools:checkstyle:7.2'
} }
def qualityConfigDir = "$project.rootDir/config/quality"; def qualityConfigDir = "$project.rootDir/config/quality";
...@@ -24,67 +23,67 @@ def reportsDir = "$project.buildDir/reports" ...@@ -24,67 +23,67 @@ def reportsDir = "$project.buildDir/reports"
check.dependsOn 'checkstyle', 'findbugs', 'pmd' check.dependsOn 'checkstyle', 'findbugs', 'pmd'
task checkstyle(type: Checkstyle, group: 'Verification', description: 'Runs code style checks') { task checkstyle(type: Checkstyle, group: 'Verification', description: 'Runs code style checks') {
configFile file("$qualityConfigDir/checkstyle/checkstyle-config.xml") configFile file("$qualityConfigDir/checkstyle/checkstyle-config.xml")
source 'src' source 'src'
include '**/*.java' include '**/*.java'
reports { reports {
xml.enabled = true xml.enabled = true
xml { xml {
destination "$reportsDir/checkstyle/checkstyle.xml" destination "$reportsDir/checkstyle/checkstyle.xml"
}
} }
}
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"
reportLevel = "high" reportLevel = "high"
excludeFilter = new File("$qualityConfigDir/findbugs/android-exclude-filter.xml") excludeFilter = new File("$qualityConfigDir/findbugs/android-exclude-filter.xml")
classes = files("$project.rootDir/app/build/intermediates/classes") classes = files("$project.rootDir/app/build/intermediates/classes")
source 'src' source 'src'
include '**/*.java' include '**/*.java'
exclude '**/gen/**' exclude '**/gen/**'
reports { reports {
xml.enabled = false xml.enabled = false
html.enabled = true html.enabled = true
xml { xml {
destination "$reportsDir/findbugs/findbugs.xml" destination "$reportsDir/findbugs/findbugs.xml"
}
html {
destination "$reportsDir/findbugs/findbugs.html"
}
} }
html {
destination "$reportsDir/findbugs/findbugs.html"
}
}
classpath = files() classpath = files()
} }
task pmd(type: Pmd, group: 'Verification', description: 'Inspect sourcecode for bugs') { task pmd(type: Pmd, group: 'Verification', description: 'Inspect sourcecode for bugs') {
ruleSetFiles = files("$qualityConfigDir/pmd/pmd-ruleset.xml") ruleSetFiles = files("$qualityConfigDir/pmd/pmd-ruleset.xml")
ignoreFailures = false ignoreFailures = false
ruleSets = [] ruleSets = []
source 'src' source 'src'
include '**/*.java' include '**/*.java'
exclude '**/gen/**' exclude '**/gen/**'
reports { reports {
xml.enabled = true xml.enabled = true
html.enabled = true html.enabled = true
xml { xml {
destination "$reportsDir/pmd/pmd.xml" destination "$reportsDir/pmd/pmd.xml"
} }
html { html {
destination "$reportsDir/pmd/pmd.html" destination "$reportsDir/pmd/pmd.html"
}
} }
}
} }
# 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