Commit 99f293ea authored by Marcus Sales's avatar Marcus Sales

Termina implementação

parent 9126897d
......@@ -39,6 +39,9 @@ dependencies {
testCompile "junit:junit:$rootProject.ext.junitVersion"
testCompile "org.mockito:mockito-core:$rootProject.mockitoVersion"
//
compile 'com.amitshekhar.android:android-networking:1.0.0'
// UI Testing
androidTestCompile "com.android.support:support-annotations:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support.test.espresso:espresso-core:$rootProject.espressoVersion"
......
......@@ -32,6 +32,14 @@
android:launchMode="singleTop"
android:screenOrientation="portrait"/>
<activity android:name=".ui.detailSensor.DetailSensorActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait"/>
<activity android:name=".ui.detailStream.DetailStreamActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait"/>
</application>
</manifest>
......@@ -2,6 +2,18 @@ package br.com.evologica.mvp.data;
import android.content.Context;
import com.androidnetworking.common.ANRequest;
import org.json.JSONException;
import org.json.JSONObject;
import br.com.evologica.mvp.data.db.AppDbHelper;
import br.com.evologica.mvp.data.db.DbHelper;
import br.com.evologica.mvp.data.db.model.Sensor;
import br.com.evologica.mvp.data.db.model.Stream;
import br.com.evologica.mvp.data.db.model.StreamData;
import br.com.evologica.mvp.data.network.ApiHelper;
import br.com.evologica.mvp.data.network.AppApiHelper;
import br.com.evologica.mvp.data.prefs.AppPreferencesHelper;
import br.com.evologica.mvp.data.prefs.PreferencesHelper;
import br.com.evologica.mvp.utils.AppConstants;
......@@ -16,10 +28,14 @@ public class AppDataManager implements DataManager {
private final Context mContext;
private PreferencesHelper mPreferencesHelper;
private ApiHelper mApiHelper;
private DbHelper mDbHelper;
public AppDataManager(Context ctx) {
mContext = ctx;
mPreferencesHelper = new AppPreferencesHelper(ctx, AppConstants.PREF_NAME);
mApiHelper = new AppApiHelper();
mDbHelper = new AppDbHelper();
}
@Override
......@@ -36,4 +52,34 @@ public class AppDataManager implements DataManager {
public boolean isLogged() {
return mPreferencesHelper.isLogged();
}
@Override
public ANRequest getAllStreams() {
return mApiHelper.getAllStreams();
}
@Override
public ANRequest getDetailSensor(int oidSensor) {
return mApiHelper.getDetailSensor(oidSensor);
}
@Override
public ANRequest getDetailStream(int oidSensor, int oidStream) {
return mApiHelper.getDetailStream(oidSensor, oidStream);
}
@Override
public Sensor createSensor(JSONObject jsonObject) throws JSONException {
return mDbHelper.createSensor(jsonObject);
}
@Override
public Stream createStream(JSONObject jsonObject) throws JSONException {
return mDbHelper.createStream(jsonObject);
}
@Override
public StreamData createStreamData(JSONObject jsonObject) throws JSONException {
return mDbHelper.createStreamData(jsonObject);
}
}
package br.com.evologica.mvp.data;
import br.com.evologica.mvp.data.db.DbHelper;
import br.com.evologica.mvp.data.network.ApiHelper;
import br.com.evologica.mvp.data.prefs.PreferencesHelper;
/**
* Created by marcussales on 01/03/2017.
*/
public interface DataManager extends PreferencesHelper {
public interface DataManager extends PreferencesHelper, ApiHelper, DbHelper {
}
package br.com.evologica.mvp.data.db;
import org.json.JSONException;
import org.json.JSONObject;
import br.com.evologica.mvp.data.db.model.Sensor;
import br.com.evologica.mvp.data.db.model.Stream;
import br.com.evologica.mvp.data.db.model.StreamData;
/**
* Created by marcussales on 02/10/2017.
*/
public class AppDbHelper implements DbHelper {
@Override
public Sensor createSensor(JSONObject jsonObject) throws JSONException {
return new Sensor(jsonObject);
}
@Override
public Stream createStream(JSONObject jsonObject) throws JSONException {
return new Stream(jsonObject);
}
@Override
public StreamData createStreamData(JSONObject jsonObject) throws JSONException {
return new StreamData(jsonObject);
}
}
package br.com.evologica.mvp.data.db;
import org.json.JSONException;
import org.json.JSONObject;
import br.com.evologica.mvp.data.db.model.Sensor;
import br.com.evologica.mvp.data.db.model.Stream;
import br.com.evologica.mvp.data.db.model.StreamData;
/**
* Created by marcussales on 02/10/2017.
*/
public interface DbHelper {
Sensor createSensor(JSONObject jsonObject) throws JSONException;
Stream createStream(JSONObject jsonObject) throws JSONException;
StreamData createStreamData(JSONObject jsonObject) throws JSONException;
}
package br.com.evologica.mvp.data.db.model;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by marcussales on 02/10/2017.
*/
public class Sensor {
private int oid;
private String nome;
private String key;
private int streamNumber;
public Sensor(JSONObject jsonObject) throws JSONException {
this.oid = jsonObject.getInt("oid");
this.nome = jsonObject.getString("name");
this.key = jsonObject.getString("key");
this.streamNumber = jsonObject.getJSONArray("streams").length();
}
public int getOid() {
return oid;
}
public String getNome() {
return nome;
}
public String getKey() {
return key;
}
public int getStreamNumber() {
return streamNumber;
}
}
package br.com.evologica.mvp.data.db.model;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by marcussales on 02/10/2017.
*/
public class Stream {
private int oid;
private String nome;
private String key;
public Stream(JSONObject jsonObject) throws JSONException {
this.oid = jsonObject.getInt("oid");
this.nome = jsonObject.getString("name");
this.key = jsonObject.getString("key");
}
public int getOid() {
return oid;
}
public String getNome() {
return nome;
}
public String getKey() {
return key;
}
}
package br.com.evologica.mvp.data.db.model;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Date;
/**
* Created by marcussales on 02/10/2017.
*/
public class StreamData {
private Date date;
private String value;
public StreamData(JSONObject jsonObject) throws JSONException {
this.date = new Date(jsonObject.getLong("serverTimestamp"));
this.value = jsonObject.getJSONArray("values").getJSONObject(0).getString("value");
}
public Date getDate() {
return date;
}
public String getValue() {
return value;
}
}
package br.com.evologica.mvp.data.network;
import com.androidnetworking.common.ANRequest;
/**
* Created by marcussales on 02/10/2017.
*/
public interface ApiHelper {
ANRequest getAllStreams();
ANRequest getDetailSensor(int oidSensor);
ANRequest getDetailStream(int oidSensor, int oidStream);
}
package br.com.evologica.mvp.data.network;
import com.androidnetworking.AndroidNetworking;
import com.androidnetworking.common.ANRequest;
/**
* Created by marcussales on 02/10/2017.
*/
public class AppApiHelper implements ApiHelper {
@Override
public ANRequest getAllStreams() {
return AndroidNetworking.get("http://multicast.vix.br:8082/sensors")
.addHeaders("X-AUTH-TOKEN", "cba991ae0c38408a84cf01687c60d075")
.build();
}
@Override
public ANRequest getDetailSensor(int oidSensor) {
return AndroidNetworking.get("http://multicast.vix.br:8082/sensors/" + oidSensor)
.addHeaders("X-AUTH-TOKEN", "cba991ae0c38408a84cf01687c60d075")
.build();
}
@Override
public ANRequest getDetailStream(int oidSensor, int oidStream) {
return AndroidNetworking.get("http://multicast.vix.br:8082/sensors/" + oidSensor + "/streams/" + oidStream)
.addHeaders("X-AUTH-TOKEN", "cba991ae0c38408a84cf01687c60d075")
.build();
}
}
package br.com.evologica.mvp.ui.detailSensor;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.util.List;
import br.com.evologica.mvp.MvpApp;
import br.com.evologica.mvp.R;
import br.com.evologica.mvp.data.db.model.Stream;
/**
* Created by marcussales on 02/10/2017.
*/
public class DetailSensorActivity extends AppCompatActivity implements DetailSensorMvpView {
DetailSensorMvpPresenter<DetailSensorMvpView> mPresenter;
private RecyclerView listaStreams;
private TextView errorText;
private ProgressBar progressBar;
private int sensorOid;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_sensor);
listaStreams = (RecyclerView) findViewById(R.id.list_streams);
errorText = (TextView) findViewById(R.id.error_text);
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
Toolbar detailToolbar = (Toolbar) findViewById(R.id.toolbar_detail);
String sensorName = getIntent().getStringExtra("SENSOR_NAME");
detailToolbar.setTitle(sensorName);
setSupportActionBar(detailToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mPresenter = new DetailSensorPresenter<>(((MvpApp)getApplicationContext()).getDataManager());
mPresenter.onAttach(this);
sensorOid = getIntent().getIntExtra("SENSOR_OID", 0);
mPresenter.fetchStreams(sensorOid);
}
@Override
protected void onDestroy() {
mPresenter.onDetach();
super.onDestroy();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
finish();
break;
}
return true;
}
@Override
public void onFetchStreamsFinished(List<Stream> streams) {
progressBar.setVisibility(View.GONE);
listaStreams.setVisibility(View.VISIBLE);
StreamsAdapter adapter = new StreamsAdapter(streams, this, sensorOid);
listaStreams.setLayoutManager(new LinearLayoutManager(this));
listaStreams.setAdapter(adapter);
}
@Override
public void onErrorFetchStreams(String message) {
progressBar.setVisibility(View.GONE);
errorText.setVisibility(View.VISIBLE);
errorText.setText(message);
}
}
package br.com.evologica.mvp.ui.detailSensor;
import br.com.evologica.mvp.ui.base.MvpPresenter;
import br.com.evologica.mvp.ui.base.MvpView;
/**
* Created by marcussales on 02/10/2017.
*/
public interface DetailSensorMvpPresenter<V extends MvpView> extends MvpPresenter<V> {
void fetchStreams(int sensorOid);
}
package br.com.evologica.mvp.ui.detailSensor;
import java.util.List;
import br.com.evologica.mvp.data.db.model.Stream;
import br.com.evologica.mvp.ui.base.MvpView;
/**
* Created by marcussales on 02/10/2017.
*/
public interface DetailSensorMvpView extends MvpView {
void onFetchStreamsFinished(List<Stream> streams);
void onErrorFetchStreams(String message);
}
package br.com.evologica.mvp.ui.detailSensor;
import com.androidnetworking.error.ANError;
import com.androidnetworking.interfaces.JSONObjectRequestListener;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import br.com.evologica.mvp.data.DataManager;
import br.com.evologica.mvp.data.db.model.Stream;
import br.com.evologica.mvp.ui.base.BasePresenter;
/**
* Created by marcussales on 02/10/2017.
*/
public class DetailSensorPresenter<V extends DetailSensorMvpView> extends BasePresenter<V> implements DetailSensorMvpPresenter<V> {
public DetailSensorPresenter(DataManager mDataManager) {
super(mDataManager);
}
@Override
public void fetchStreams(int oidSensor) {
getDataManager().getDetailSensor(oidSensor)
.getAsJSONObject(new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray streams = response.getJSONArray("streams");
List<Stream> streamsModel = new ArrayList<>();
for(int i = 0; i < streams.length(); i++){
streamsModel.add(getDataManager().createStream(streams.getJSONObject(i)));
}
getMvpView().onFetchStreamsFinished(streamsModel);
} catch (JSONException e) {
getMvpView().onErrorFetchStreams(e.getMessage());
}
}
@Override
public void onError(ANError anError) {
getMvpView().onErrorFetchStreams(anError.getMessage());
}
});
}
}
package br.com.evologica.mvp.ui.detailSensor;
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
import br.com.evologica.mvp.R;
import br.com.evologica.mvp.data.db.model.Stream;
import br.com.evologica.mvp.ui.detailStream.DetailStreamActivity;
/**
* Created by marcussales on 02/10/2017.
*/
public class StreamsAdapter extends RecyclerView.Adapter<StreamsAdapter.ViewHolder> {
private List<Stream> listaStreams;
private Context context;
private final int sensorOid;
public StreamsAdapter(List<Stream> listaStreams, Context context, int sensorOid) {
this.listaStreams = listaStreams;
this.context = context;
this.sensorOid = sensorOid;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.stream_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Stream stream = listaStreams.get(position);
final int streamOid = stream.getOid();
holder.nomeStream.setText(stream.getNome());
holder.keyStream.setText(stream.getKey());
holder.itemView.setOnClickListener(
(view) -> {
Intent intent = new Intent(context, DetailStreamActivity.class);
intent.putExtra("SENSOR_OID", sensorOid);
intent.putExtra("STREAM_OID", streamOid);
context.startActivity(intent);
}
);
}
@Override
public int getItemCount() {
return listaStreams.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView nomeStream;
TextView keyStream;
public ViewHolder(View itemView) {
super(itemView);
nomeStream = (TextView) itemView.findViewById(R.id.stream_name);
keyStream = (TextView) itemView.findViewById(R.id.stream_key);
}
}
}
package br.com.evologica.mvp.ui.detailStream;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.util.List;
import br.com.evologica.mvp.MvpApp;
import br.com.evologica.mvp.R;
import br.com.evologica.mvp.data.db.model.StreamData;
/**
* Created by marcussales on 02/10/2017.
*/
public class DetailStreamActivity extends AppCompatActivity implements DetailStreamMvpView {
DetailStreamMvpPresenter<DetailStreamMvpView> mPresenter;
private RecyclerView listaStreamData;
private TextView errorText;
private ProgressBar progressBar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_streams);
listaStreamData = (RecyclerView) findViewById(R.id.list_stream_data);
errorText = (TextView) findViewById(R.id.error_text);
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
Toolbar detailStreamToolbar = (Toolbar) findViewById(R.id.toolbar_detail_stream);
detailStreamToolbar.setTitle("Stream");
setSupportActionBar(detailStreamToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mPresenter = new DetailStreamPresenter<>(((MvpApp)getApplicationContext()).getDataManager());
mPresenter.onAttach(this);
int sensorOid = getIntent().getIntExtra("SENSOR_OID", 0);
int streamOid = getIntent().getIntExtra("STREAM_OID", 0);
mPresenter.fetchStreamsData(sensorOid, streamOid);
}
@Override
protected void onDestroy() {
mPresenter.onDetach();
super.onDestroy();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case android.R.id.home:
finish();
break;
}
return true;
}
@Override
public void onFetchStreamsDataFinished(List<StreamData> response) {
progressBar.setVisibility(View.GONE);
listaStreamData.setVisibility(View.VISIBLE);
StreamDataAdapter adapter = new StreamDataAdapter(response, this);
listaStreamData.setLayoutManager(new LinearLayoutManager(this));
listaStreamData.setAdapter(adapter);
}
@Override
public void onErrorFetchStreamsData(String message) {
progressBar.setVisibility(View.GONE);
errorText.setVisibility(View.VISIBLE);
errorText.setText(message);
}
}
package br.com.evologica.mvp.ui.detailStream;
import br.com.evologica.mvp.ui.base.MvpPresenter;
import br.com.evologica.mvp.ui.base.MvpView;
/**
* Created by marcussales on 02/10/2017.
*/
public interface DetailStreamMvpPresenter<V extends MvpView> extends MvpPresenter<V> {
void fetchStreamsData(int sensorOid, int streamOid);
}
package br.com.evologica.mvp.ui.detailStream;
import java.util.List;
import br.com.evologica.mvp.data.db.model.StreamData;
import br.com.evologica.mvp.ui.base.MvpView;
/**
* Created by marcussales on 02/10/2017.
*/
public interface DetailStreamMvpView extends MvpView {
void onFetchStreamsDataFinished(List<StreamData> response);
void onErrorFetchStreamsData(String message);
}
package br.com.evologica.mvp.ui.detailStream;
import com.androidnetworking.error.ANError;
import com.androidnetworking.interfaces.JSONObjectRequestListener;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import br.com.evologica.mvp.data.DataManager;
import br.com.evologica.mvp.data.db.model.StreamData;
import br.com.evologica.mvp.ui.base.BasePresenter;
/**
* Created by marcussales on 02/10/2017.
*/
public class DetailStreamPresenter<V extends DetailStreamMvpView> extends BasePresenter<V> implements DetailStreamMvpPresenter<V> {
public DetailStreamPresenter(DataManager mDataManager) {
super(mDataManager);
}
@Override
public void fetchStreamsData(int sensorOid, int streamOid) {
getDataManager().getDetailStream(sensorOid, streamOid)
.getAsJSONObject(new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray streams = response.getJSONArray("data");
List<StreamData> streamsModel = new ArrayList<>();
for(int i = 0; i < streams.length(); i++){
streamsModel.add(getDataManager().createStreamData(streams.getJSONObject(i)));
}
getMvpView().onFetchStreamsDataFinished(streamsModel);
} catch (JSONException e) {
getMvpView().onErrorFetchStreamsData(e.getMessage());
}
}
@Override
public void onError(ANError anError) {
getMvpView().onErrorFetchStreamsData(anError.getMessage());
}
});
}
}
package br.com.evologica.mvp.ui.detailStream;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
import br.com.evologica.mvp.R;
import br.com.evologica.mvp.data.db.model.StreamData;
/**
* Created by marcussales on 02/10/2017.
*/
public class StreamDataAdapter extends RecyclerView.Adapter<StreamDataAdapter.ViewHolder> {
private List<StreamData> listaDadosStream;
private Context context;
public StreamDataAdapter(List<StreamData> listaDadosStream, Context context) {
this.listaDadosStream = listaDadosStream;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.stream_data_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
StreamData streamData = listaDadosStream.get(position);
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
holder.streamTimestamp.setText(format.format(streamData.getDate()));
holder.streamValue.setText(streamData.getValue());
}
@Override
public int getItemCount() {
return listaDadosStream.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView streamTimestamp;
TextView streamValue;
public ViewHolder(View itemView) {
super(itemView);
streamTimestamp = (TextView) itemView.findViewById(R.id.stream_item_timestamp);
streamValue = (TextView) itemView.findViewById(R.id.stream_item_value);
}
}
}
package br.com.evologica.mvp.ui.login;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import br.com.evologica.mvp.MvpApp;
import br.com.evologica.mvp.R;
import br.com.evologica.mvp.ui.main.MainActivity;
/**
* Created by marcussales on 01/03/2017.
*/
public class LoginActivity extends AppCompatActivity implements LoginMvpView {
private static final String TAG = "LoginActivity";
LoginMvpPresenter<LoginMvpView> mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mPresenter = new LoginPresenter<>(((MvpApp)getApplicationContext()).getDataManager());
mPresenter.onAttach(LoginActivity.this);
}
@Override
public void openMainActivity() {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
@Override
protected void onDestroy() {
mPresenter.onDetach();
super.onDestroy();
}
}
package br.com.evologica.mvp.ui.login;
import br.com.evologica.mvp.ui.base.MvpPresenter;
/**
* Created by marcussales on 01/03/2017.
*/
public interface LoginMvpPresenter<V extends LoginMvpView> extends MvpPresenter<V> {
void onLogin(String email,String password);
}
package br.com.evologica.mvp.ui.login;
import br.com.evologica.mvp.ui.base.MvpView;
/**
* Created by marcussales on 01/03/2017.
*/
public interface LoginMvpView extends MvpView {
void openMainActivity();
}
package br.com.evologica.mvp.ui.login;
import br.com.evologica.mvp.data.DataManager;
import br.com.evologica.mvp.ui.base.BasePresenter;
/**
* Created by marcussales on 01/03/2017.
*/
public class LoginPresenter<V extends LoginMvpView> extends BasePresenter<V> implements LoginMvpPresenter<V> {
private static final String TAG = "LoginPresenter";
public LoginPresenter(DataManager dataManager) {
super(dataManager);
}
@Override
public void onLogin(String email, String password) {
}
}
\ No newline at end of file
package br.com.evologica.mvp.ui.main;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.util.List;
import br.com.evologica.mvp.MvpApp;
import br.com.evologica.mvp.R;
import br.com.evologica.mvp.ui.login.LoginActivity;
import br.com.evologica.mvp.data.db.model.Sensor;
/**
* Created by marcussales on 01/03/2017.
......@@ -17,20 +24,26 @@ public class MainActivity extends AppCompatActivity implements MainMvpView {
MainMvpPresenter<MainMvpView> mPresenter;
private RecyclerView listaSensores;
private TextView errorText;
private ProgressBar progressBar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPresenter = new MainPresenter<>(((MvpApp)getApplicationContext()).getDataManager());
mPresenter.onAttach(MainActivity.this);
}
listaSensores = (RecyclerView) findViewById(R.id.list_sensor);
errorText = (TextView) findViewById(R.id.error_text);
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
Toolbar mainToolbar = (Toolbar) findViewById(R.id.toolbar_main);
@Override
public void openLoginActivity() {
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
finish();
mainToolbar.setTitle("Sensores");
setSupportActionBar(mainToolbar);
mPresenter = new MainPresenter<>(((MvpApp)getApplicationContext()).getDataManager());
mPresenter.onAttach(MainActivity.this);
mPresenter.fetchSensors();
}
@Override
......@@ -39,4 +52,19 @@ public class MainActivity extends AppCompatActivity implements MainMvpView {
super.onDestroy();
}
@Override
public void onFetchSensorsFinished(List<Sensor> sensores) {
progressBar.setVisibility(View.GONE);
listaSensores.setVisibility(View.VISIBLE);
SensoresAdapter adapter = new SensoresAdapter(sensores, this);
listaSensores.setLayoutManager(new LinearLayoutManager(this));
listaSensores.setAdapter(adapter);
}
@Override
public void onErrorFetchSensors(String message) {
progressBar.setVisibility(View.GONE);
errorText.setVisibility(View.VISIBLE);
errorText.setText(message);
}
}
......@@ -9,5 +9,5 @@ import br.com.evologica.mvp.ui.base.MvpView;
public interface MainMvpPresenter<V extends MvpView> extends MvpPresenter<V> {
void onLogout();
void fetchSensors();
}
package br.com.evologica.mvp.ui.main;
import java.util.List;
import br.com.evologica.mvp.data.db.model.Sensor;
import br.com.evologica.mvp.ui.base.MvpView;
/**
......@@ -7,5 +10,6 @@ import br.com.evologica.mvp.ui.base.MvpView;
*/
public interface MainMvpView extends MvpView {
void openLoginActivity();
void onFetchSensorsFinished(List<Sensor> sensores);
void onErrorFetchSensors(String message);
}
package br.com.evologica.mvp.ui.main;
import com.androidnetworking.error.ANError;
import com.androidnetworking.interfaces.JSONArrayRequestListener;
import org.json.JSONArray;
import org.json.JSONException;
import java.util.ArrayList;
import java.util.List;
import br.com.evologica.mvp.data.DataManager;
import br.com.evologica.mvp.data.db.model.Sensor;
import br.com.evologica.mvp.ui.base.BasePresenter;
public class MainPresenter<V extends MainMvpView> extends BasePresenter<V> implements MainMvpPresenter<V> {
......@@ -10,7 +20,26 @@ public class MainPresenter<V extends MainMvpView> extends BasePresenter<V> imple
}
@Override
public void onLogout() {
public void fetchSensors() {
getDataManager().getAllStreams()
.getAsJSONArray(new JSONArrayRequestListener() {
@Override
public void onResponse(JSONArray response) {
try {
List<Sensor> sensores = new ArrayList<>();
for(int i = 0; i < response.length(); i++){
sensores.add(getDataManager().createSensor(response.getJSONObject(i)));
}
getMvpView().onFetchSensorsFinished(sensores);
} catch (JSONException e) {
getMvpView().onErrorFetchSensors(e.getMessage());
}
}
@Override
public void onError(ANError anError) {
getMvpView().onErrorFetchSensors(anError.getMessage());
}
});
}
}
package br.com.evologica.mvp.ui.main;
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
import br.com.evologica.mvp.R;
import br.com.evologica.mvp.data.db.model.Sensor;
import br.com.evologica.mvp.ui.detailSensor.DetailSensorActivity;
/**
* Created by marcussales on 02/10/2017.
*/
public class SensoresAdapter extends RecyclerView.Adapter<SensoresAdapter.ViewHolder> {
private List<Sensor> listaSensores;
private Context context;
public SensoresAdapter(List<Sensor> listaSensores, Context context) {
this.listaSensores = listaSensores;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.sensor_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Sensor sensor = listaSensores.get(position);
final String nomeSensor = sensor.getNome();
final int sensorOid = sensor.getOid();
holder.nomeSensor.setText(nomeSensor);
holder.keySensor.setText(sensor.getKey());
String streamNumber = sensor.getStreamNumber() + " streams";
holder.numeroStreams.setText(streamNumber);
holder.itemView.setOnClickListener(
(view) -> {
Intent intent = new Intent(context, DetailSensorActivity.class);
intent.putExtra("SENSOR_NAME", nomeSensor);
intent.putExtra("SENSOR_OID", sensorOid);
context.startActivity(intent);
}
);
}
@Override
public int getItemCount() {
return listaSensores.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView nomeSensor;
TextView keySensor;
TextView numeroStreams;
public ViewHolder(View itemView) {
super(itemView);
nomeSensor = (TextView) itemView.findViewById(R.id.sensor_name);
keySensor = (TextView) itemView.findViewById(R.id.sensor_key);
numeroStreams = (TextView) itemView.findViewById(R.id.streams_number);
}
}
}
......@@ -7,7 +7,6 @@ import android.support.v7.app.AppCompatActivity;
import br.com.evologica.mvp.MvpApp;
import br.com.evologica.mvp.R;
import br.com.evologica.mvp.ui.login.LoginActivity;
import br.com.evologica.mvp.ui.main.MainActivity;
public class SplashActivity extends AppCompatActivity implements SplashMvpView {
......@@ -22,13 +21,6 @@ public class SplashActivity extends AppCompatActivity implements SplashMvpView {
mPresenter.onAttach(SplashActivity.this);
}
@Override
public void openLoginActivity() {
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
finish();
}
@Override
public void openMainActivity() {
Intent intent = new Intent(this, MainActivity.class);
......
......@@ -8,7 +8,5 @@ import br.com.evologica.mvp.ui.base.MvpView;
public interface SplashMvpView extends MvpView {
void openLoginActivity();
void openMainActivity();
}
......@@ -13,10 +13,6 @@ public class SplashPresenter<V extends SplashMvpView> extends BasePresenter<V> i
public void onAttach(V mvpView) {
super.onAttach(mvpView);
if (!getDataManager().isLogged()){
getMvpView().openLoginActivity();
}else{
getMvpView().openMainActivity();
}
}
}
package br.com.evologica.mvp.utils;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import br.com.evologica.mvp.R;
/**
* Created by marcussales on 02/03/2017.
*/
......@@ -18,17 +11,4 @@ public final class CommonUtils {
private CommonUtils() {
// This utility class is not publicly instantiable
}
public static ProgressDialog showLoadingDialog(Context context) {
ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.show();
if (progressDialog.getWindow() != null) {
progressDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
progressDialog.setContentView(R.layout.progress_dialog);
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(true);
progressDialog.setCanceledOnTouchOutside(false);
return progressDialog;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_detail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:titleTextColor="@color/white"
android:background="@color/navy_blue"/>
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:visibility="visible"/>
<TextView
android:id="@+id/error_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="Error no fetch"
android:visibility="gone"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/list_streams"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_detail_stream"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:titleTextColor="@color/white"
android:background="@color/navy_blue"/>
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:visibility="visible"/>
<TextView
android:id="@+id/error_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="Erro no fetch"
android:visibility="gone"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/list_stream_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
</LinearLayout>
\ No newline at end of file
......@@ -16,80 +16,34 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent">
<Button
android:id="@+id/logout_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LOGOUT"/>
</LinearLayout>
<!--<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"-->
<!--xmlns:app="http://schemas.android.com/apk/res-auto"-->
<!--android:id="@+id/drawer_view"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="match_parent"-->
<!--android:fitsSystemWindows="true">-->
<!--<android.support.design.widget.CoordinatorLayout-->
<!--android:id="@+id/cl_root_view"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="match_parent"-->
<!--android:clipChildren="false">-->
<!--<LinearLayout-->
<!--android:id="@+id/activity_main"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="match_parent"-->
<!--android:orientation="vertical">-->
<!--<android.support.design.widget.AppBarLayout-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="wrap_content"-->
<!--app:elevation="5dp">-->
<!--<android.support.v7.widget.Toolbar-->
<!--android:id="@+id/toolbar"-->
<!--style="@style/Toolbar"-->
<!--app:subtitleTextColor="@color/white"-->
<!--app:title="@string/app_name"-->
<!--app:titleTextAppearance="@style/Toolbar.TitleText"-->
<!--app:titleTextColor="@color/white" />-->
android:layout_width="match_parent"
android:orientation="vertical">
<!--<View-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="1dp"-->
<!--android:background="@color/light_gray" />-->
<!--</android.support.design.widget.AppBarLayout>-->
<!--<com.mindorks.placeholderview.SwipePlaceHolderView-->
<!--android:id="@+id/cards_container"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="match_parent" />-->
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:titleTextColor="@color/white"
android:background="@color/navy_blue"/>
<!--</LinearLayout>-->
<!--</android.support.design.widget.CoordinatorLayout>-->
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:visibility="visible"/>
<!--&lt;!&ndash;<android.support.design.widget.NavigationView&ndash;&gt;-->
<!--&lt;!&ndash;android:id="@+id/navigation_view"&ndash;&gt;-->
<!--&lt;!&ndash;style="@style/Widget.Design.NavigationView"&ndash;&gt;-->
<!--&lt;!&ndash;android:layout_width="wrap_content"&ndash;&gt;-->
<!--&lt;!&ndash;android:layout_height="match_parent"&ndash;&gt;-->
<!--&lt;!&ndash;android:layout_gravity="start"&ndash;&gt;-->
<!--&lt;!&ndash;android:background="@color/white"&ndash;&gt;-->
<!--&lt;!&ndash;app:headerLayout="@layout/drawer_header"&ndash;&gt;-->
<!--&lt;!&ndash;app:itemBackground="@color/white"&ndash;&gt;-->
<!--&lt;!&ndash;app:itemIconTint="@color/black_effective"&ndash;&gt;-->
<!--&lt;!&ndash;app:itemTextColor="@color/black_effective"&ndash;&gt;-->
<!--&lt;!&ndash;app:menu="@menu/drawer">&ndash;&gt;-->
<TextView
android:id="@+id/error_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="Error no fetch"
android:visibility="gone"/>
<!--&lt;!&ndash;<TextView&ndash;&gt;-->
<!--&lt;!&ndash;android:id="@+id/tv_app_version"&ndash;&gt;-->
<!--&lt;!&ndash;style="@style/TextStyle.Title.Sub"&ndash;&gt;-->
<!--&lt;!&ndash;android:layout_width="wrap_content"&ndash;&gt;-->
<!--&lt;!&ndash;android:layout_height="wrap_content"&ndash;&gt;-->
<!--&lt;!&ndash;android:layout_gravity="bottom|end"&ndash;&gt;-->
<!--&lt;!&ndash;android:padding="5dp" />&ndash;&gt;-->
<!--&lt;!&ndash;</android.support.design.widget.NavigationView>&ndash;&gt;-->
<!--</android.support.v4.widget.DrawerLayout>-->
\ No newline at end of file
<android.support.v7.widget.RecyclerView
android:id="@+id/list_sensor"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (C) 2017 MINDORKS NEXTGEN PRIVATE LIMITED
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ https://mindorks.com/license/apache-v2
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@android:color/transparent">
<ProgressBar
android:id="@+id/pb_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:progressDrawable="@color/black_effective" />
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<TextView
android:id="@+id/sensor_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Freeza"/>
<TextView
android:id="@+id/sensor_key"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Key: ae194d2b61e0496fbf601f9edcf8b0c5"/>
<TextView
android:id="@+id/streams_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3 streams"/>
<View
android:layout_width="match_parent"
android:layout_height="2px"
android:background="@color/light_gray" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Data: "/>
<TextView
android:id="@+id/stream_item_timestamp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Freeza"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Valor: "/>
<TextView
android:id="@+id/stream_item_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="29.1"
android:layout_weight="1"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="2px"
android:background="@color/light_gray"
android:layout_gravity="bottom"/>
</FrameLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<TextView
android:id="@+id/stream_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Freeza"/>
<TextView
android:id="@+id/stream_key"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Key: ae194d2b61e0496fbf601f9edcf8b0c5"/>
<View
android:layout_width="match_parent"
android:layout_height="2px"
android:background="@color/light_gray" />
</LinearLayout>
\ No newline at end of file
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