From b01999e0534a11475ef8b2987acf539535e3c7da Mon Sep 17 00:00:00 2001 From: Ten Wong Date: Mon, 5 Oct 2015 19:09:46 +0800 Subject: [PATCH 1/3] =?UTF-8?q?Added=EF=BC=9A=20Main=20list?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/app.iml | 30 +- android/app/build.gradle | 17 +- .../seeed/iot/ui_main/MainScreenActivity.java | 66 ++- .../ui_main/MainScreenActivity_backup.java | 383 ++++++++++++++++++ .../iot/ui_main/NodeListRecyclerAdapter.java | 117 +++--- .../NodeListRecyclerAdapter_backup.java | 146 +++++++ .../ui_main/util/DividerItemDecoration.java | 125 ++++++ .../util/RecyclerItemClickListener.java | 45 ++ .../src/main/res/drawable-hdpi/node_icon.png | Bin 4943 -> 0 bytes .../src/main/res/drawable-mdpi/divider.xml | 25 ++ .../src/main/res/drawable-mdpi/node_icon.png | Bin 3565 -> 0 bytes .../src/main/res/drawable-xhdpi/node_icon.png | Bin 5975 -> 0 bytes .../main/res/drawable-xxhdpi/grove_bulb.png | Bin 0 -> 8916 bytes .../main/res/drawable-xxhdpi/grove_cold.png | Bin 0 -> 9056 bytes .../main/res/drawable-xxhdpi/grove_drop.png | Bin 0 -> 8675 bytes .../res/drawable-xxhdpi/grove_temperature.png | Bin 0 -> 9164 bytes .../res/drawable-xxhdpi/grove_weather.png | Bin 0 -> 9271 bytes .../res/drawable-xxhdpi/ic_access_time.png | Bin 0 -> 2379 bytes .../src/main/res/drawable-xxhdpi/ic_dot.png | Bin 0 -> 134 bytes .../drawable-xxhdpi/ic_favorite_border.png | Bin 0 -> 2725 bytes .../res/drawable-xxhdpi/ic_location_on.png | Bin 0 -> 1502 bytes .../ic_location_on_black_36px.png | Bin 0 -> 1502 bytes .../main/res/drawable-xxhdpi/node_icon.png | Bin 8387 -> 18418 bytes .../app/src/main/res/drawable/node_icon.png | Bin 8387 -> 0 bytes .../res/layout/activity_setup_iot_node.xml | 8 +- .../main/res/layout/dialog_signin_backup.xml | 2 +- .../src/main/res/layout/main_list_item.xml | 296 ++++++++++---- .../main/res/layout/main_list_item_back.xml | 172 ++++---- .../app/src/main/res/menu/ui_node_action.xml | 4 +- android/app/src/main/res/values/colors.xml | 12 +- android/app/src/main/res/values/dimens.xml | 6 + android/app/src/main/res/values/strings.xml | 5 + 32 files changed, 1186 insertions(+), 273 deletions(-) create mode 100644 android/app/src/main/java/cc/seeed/iot/ui_main/MainScreenActivity_backup.java create mode 100755 android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter_backup.java create mode 100644 android/app/src/main/java/cc/seeed/iot/ui_main/util/DividerItemDecoration.java create mode 100644 android/app/src/main/java/cc/seeed/iot/ui_main/util/RecyclerItemClickListener.java delete mode 100644 android/app/src/main/res/drawable-hdpi/node_icon.png create mode 100644 android/app/src/main/res/drawable-mdpi/divider.xml delete mode 100644 android/app/src/main/res/drawable-mdpi/node_icon.png delete mode 100644 android/app/src/main/res/drawable-xhdpi/node_icon.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/grove_bulb.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/grove_cold.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/grove_drop.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/grove_temperature.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/grove_weather.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_access_time.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_dot.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_favorite_border.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_location_on.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_location_on_black_36px.png delete mode 100644 android/app/src/main/res/drawable/node_icon.png diff --git a/android/app/app.iml b/android/app/app.iml index fdc7c66..9e8b8c5 100644 --- a/android/app/app.iml +++ b/android/app/app.iml @@ -71,12 +71,13 @@ - - - - - - + + + + + + + @@ -94,24 +95,25 @@ - + - - - + + - + + - - - + + + + \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index 6c8068d..9bc12c2 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 22 - buildToolsVersion "22.0.1" + compileSdkVersion 23 + buildToolsVersion "23.0.1" defaultConfig { applicationId "cc.seeed.iot.ap" minSdkVersion 16 - targetSdkVersion 22 + targetSdkVersion 23 versionCode 1 versionName "1.0" } @@ -20,17 +20,18 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:support-v13:22.2.1' + compile 'com.android.support:support-v13:23.0.1' compile 'fr.avianey.com.viewpagerindicator:library:2.4.1@aar' - compile 'com.android.support:design:22.2.1' - compile 'com.android.support:appcompat-v7:22.2.1' - compile 'com.android.support:cardview-v7:22.2.1' + compile 'com.android.support:design:23.0.1' + compile 'com.android.support:appcompat-v7:23.0.1' + compile 'com.android.support:cardview-v7:23.0.1' compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'com.squareup.okhttp:okhttp:2.2.0' - compile 'com.android.support:recyclerview-v7:22.2.1' + compile 'com.android.support:recyclerview-v7:23.0.1' compile 'com.ikimuhendis:ldrawer:0.1' compile 'com.esotericsoftware.yamlbeans:yamlbeans:1.09' compile "com.google.zxing:android-integration:3.2.0" compile 'com.google.zxing:core:3.2.0' + compile "com.daimajia.swipelayout:library:1.1.8@aar" } diff --git a/android/app/src/main/java/cc/seeed/iot/ui_main/MainScreenActivity.java b/android/app/src/main/java/cc/seeed/iot/ui_main/MainScreenActivity.java index faf9841..274ab8f 100644 --- a/android/app/src/main/java/cc/seeed/iot/ui_main/MainScreenActivity.java +++ b/android/app/src/main/java/cc/seeed/iot/ui_main/MainScreenActivity.java @@ -16,7 +16,6 @@ package cc.seeed.iot.ui_main; -import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; @@ -28,8 +27,11 @@ import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.ActionBar; +import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.ListPopupWindow; +import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.Log; @@ -47,6 +49,7 @@ import cc.seeed.iot.R; import cc.seeed.iot.datastruct.User; import cc.seeed.iot.ui_login.SetupActivity; +import cc.seeed.iot.ui_main.util.DividerItemDecoration; import cc.seeed.iot.ui_setnode.SetupIotNodeActivity; import cc.seeed.iot.ui_smartconfig.GoReadyActivity; import cc.seeed.iot.webapi.IotApi; @@ -62,7 +65,7 @@ * TODO */ public class MainScreenActivity extends AppCompatActivity - implements NodeListRecyclerAdapter.NodeAction { + implements NodeListRecyclerAdapter.OnClickListener { private final static String TAG = "MainScreenActivity"; private DrawerLayout mDrawerLayout; private SwipeRefreshLayout mSwipeRefreshLayout; @@ -103,9 +106,13 @@ protected void onCreate(Bundle savedInstanceState) { mRecyclerView.setHasFixedSize(true); RecyclerView.LayoutManager layout = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(layout); + mRecyclerView.addItemDecoration(new DividerItemDecoration(getResources().getDrawable(R.drawable.divider))); mAdapter = new NodeListRecyclerAdapter(nodes); + mAdapter.setOnClickListener(this); mRecyclerView.setAdapter(mAdapter); setupAdapter(); + + } mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.activity_main_swipe_refresh_layout); @@ -275,6 +282,58 @@ public boolean onNavigationItemSelected(MenuItem menuItem) { } @Override + public void onClick(View v, final int position) { + Log.e(TAG, "pos:" + position + " id:" + v.getId()); + + int id = v.getId(); + switch (id) { + case R.id.node_item: + nodeSet(position); + break; + case R.id.location: + break; + case R.id.favorite: + break; + case R.id.rename: + nodeRename(position); + break; + case R.id.detail: + nodeDetail(position); + break; + case R.id.remove: + nodeRemove(position); + break; + case R.id.dot: + PopupMenu popupMenu = new PopupMenu(this, v); + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case R.id.remove: + nodeRemove(position); + return true; + case R.id.detail: + nodeDetail(position); + return true; + case R.id.rename: + nodeRename(position); + return true; + } + return false; + } + }); + popupMenu.inflate(R.menu.ui_node_action); + popupMenu.show(); + if (popupMenu.getDragToOpenListener() instanceof ListPopupWindow.ForwardingListener) { + ListPopupWindow.ForwardingListener listener = + (ListPopupWindow.ForwardingListener) popupMenu.getDragToOpenListener(); + listener.getPopup().setVerticalOffset(-v.getHeight()); + listener.getPopup().show(); + } + break; + } + } + public boolean nodeRemove(final int position) {//todo: rubbish code AlertDialog.Builder builder = new AlertDialog.Builder(this); @@ -319,7 +378,6 @@ public void failure(RetrofitError error) { return true; } - @Override public boolean nodeDetail(int position) { Intent intent = new Intent(this, NodeDetailActivity.class); intent.putExtra("position", position); @@ -327,7 +385,6 @@ public boolean nodeDetail(int position) { return true; } - @Override public boolean nodeSet(int position) { Intent intent = new Intent(this, SetupIotNodeActivity.class); intent.putExtra("position", position); @@ -335,7 +392,6 @@ public boolean nodeSet(int position) { return true; } - @Override public boolean nodeRename(final int position) { final LayoutInflater inflater = this.getLayoutInflater(); final View view = inflater.inflate(R.layout.dialog_name_input, null); diff --git a/android/app/src/main/java/cc/seeed/iot/ui_main/MainScreenActivity_backup.java b/android/app/src/main/java/cc/seeed/iot/ui_main/MainScreenActivity_backup.java new file mode 100644 index 0000000..2e5bdad --- /dev/null +++ b/android/app/src/main/java/cc/seeed/iot/ui_main/MainScreenActivity_backup.java @@ -0,0 +1,383 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +package cc.seeed.iot.ui_main; + +import android.app.AlertDialog; +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.NavigationView; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.app.ActionBar; +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.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import java.util.ArrayList; + +import cc.seeed.iot.MyApplication; +import cc.seeed.iot.R; +import cc.seeed.iot.datastruct.User; +import cc.seeed.iot.ui_login.SetupActivity; +import cc.seeed.iot.ui_setnode.SetupIotNodeActivity; +import cc.seeed.iot.ui_smartconfig.GoReadyActivity; +import cc.seeed.iot.webapi.IotApi; +import cc.seeed.iot.webapi.IotService; +import cc.seeed.iot.webapi.model.Node; +import cc.seeed.iot.webapi.model.NodeListResponse; +import cc.seeed.iot.webapi.model.NodeResponse; +import retrofit.Callback; +import retrofit.RetrofitError; +import retrofit.client.Response; + +/** + * TODO + */ +public class MainScreenActivity_backup extends AppCompatActivity + implements NodeListRecyclerAdapter_backup.NodeAction { + private final static String TAG = "MainScreenActivity"; + private DrawerLayout mDrawerLayout; + private SwipeRefreshLayout mSwipeRefreshLayout; + private RecyclerView mRecyclerView; + private NodeListRecyclerAdapter mAdapter; + private TextView mEmail; + + private ArrayList nodes; + private User user; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + user = ((MyApplication) MainScreenActivity_backup.this.getApplication()).getUser(); + nodes = ((MyApplication) MainScreenActivity_backup.this.getApplication()).getNodes(); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + final ActionBar ab = getSupportActionBar(); + if (ab != null) { + ab.setHomeAsUpIndicator(R.drawable.ic_menu); + ab.setDisplayHomeAsUpEnabled(true); + ab.setTitle("PION ONE"); + } + + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + + NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); + if (navigationView != null) { + setupDrawerContent(navigationView); + } + + mRecyclerView = (RecyclerView) findViewById(R.id.listview); + if (mRecyclerView != null) { + mRecyclerView.setHasFixedSize(true); + RecyclerView.LayoutManager layout = new LinearLayoutManager(this); + mRecyclerView.setLayoutManager(layout); + mAdapter = new NodeListRecyclerAdapter(nodes); + mRecyclerView.setAdapter(mAdapter); + setupAdapter(); + } + + mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.activity_main_swipe_refresh_layout); + mSwipeRefreshLayout.setColorSchemeResources(R.color.orange, R.color.green, R.color.blue); + mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + setupAdapter(); + mSwipeRefreshLayout.setRefreshing(false); + } + }, 0); + } + }); + + FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ((MyApplication) getApplication()).setConfigState(true); + Intent intent = new Intent(MainScreenActivity_backup.this, GoReadyActivity.class); + startActivity(intent); + } + }); + + mEmail = (TextView) findViewById(R.id.hd_email); + mEmail.setText(user.email); + + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.ui_main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + mDrawerLayout.openDrawer(GravityCompat.START); + return true; + case R.id.update: + setupAdapter(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onBackPressed() { + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_HOME); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + + private void setupAdapter() { + final ProgressDialog mProgressDialog = new ProgressDialog(this); + mProgressDialog.setMessage("search node list..."); + mProgressDialog.setCanceledOnTouchOutside(false); + mProgressDialog.show(); + + IotApi api = new IotApi(); + User user = ((MyApplication) MainScreenActivity_backup.this.getApplication()).getUser(); + api.setAccessToken(user.user_key); + final IotService iot = api.getService(); + iot.nodesList(new Callback() { + @Override + public void success(NodeListResponse nodeListResponse, Response response) { + mProgressDialog.dismiss(); + if (nodeListResponse.status.equals("200")) { + nodes = (ArrayList) nodeListResponse.nodes; + ArrayList delNodes = new ArrayList(); + for (Node n : nodes) { + if (n.name.equals("node000")) { + iot.nodesDelete(n.node_sn, new Callback() { + @Override + public void success(NodeResponse nodeResponse, Response response) { + + } + + @Override + public void failure(RetrofitError error) { + + } + }); + delNodes.add(n); + } + } + nodes.removeAll(delNodes); + + ((MyApplication) MainScreenActivity_backup.this.getApplication()).setNodes(nodes); + + mAdapter.updateAll(nodes); + + } else { + Toast.makeText(MainScreenActivity_backup.this, nodeListResponse.msg, Toast.LENGTH_LONG).show(); + } + } + + @Override + public void failure(RetrofitError error) { + mProgressDialog.dismiss(); + Toast.makeText(MainScreenActivity_backup.this, "Connect server fail...", Toast.LENGTH_LONG).show(); + } + }); + + } + + private void addItem(Node node) { + nodes.add(node); + ((MyApplication) MainScreenActivity_backup.this.getApplication()).setNodes(nodes); + mAdapter.notifyItemInserted(nodes.size()); + } + + private void removeItem(Node node) { + nodes.remove(node); + mAdapter.notifyItemRemoved(nodes.size()); + } + + private void setupDrawerContent(NavigationView navigationView) { + navigationView.setNavigationItemSelectedListener( + new NavigationView.OnNavigationItemSelectedListener() { + @Override + public boolean onNavigationItemSelected(MenuItem menuItem) { + menuItem.setChecked(true); + mDrawerLayout.closeDrawers(); + switch (menuItem.getItemId()) { + case R.id.nav_nodes_list: + break; + case R.id.nav_smartconfig: { + ((MyApplication) getApplication()).setConfigState(false); + Intent intent = new Intent(MainScreenActivity_backup.this, + GoReadyActivity.class); + startActivity(intent); + } + break; + case R.id.nav_setting: { + Intent intent = new Intent(MainScreenActivity_backup.this, + SettingActivity.class); + startActivity(intent); + } + break; + case R.id.nav_about: { + Intent intent = new Intent(MainScreenActivity_backup.this, + AboutActivity.class); + startActivity(intent); + } + break; + case R.id.nav_logout: { + ((MyApplication) getApplication()).setLoginState(false); + Intent intent = new Intent(MainScreenActivity_backup.this, + SetupActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + } + break; + } + + return true; + } + }); + } + + @Override + public boolean nodeRemove(final int position) {//todo: rubbish code + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setCancelable(false); + builder.setTitle("Remove Pion One"); + builder.setMessage("Confirm remove?"); + builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + + final ProgressDialog progressDialog = new ProgressDialog(MainScreenActivity_backup.this); + progressDialog.setMessage("Node delete..."); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + final int p = position; + Node node = nodes.get(position); + IotApi api = new IotApi(); + User user = ((MyApplication) MainScreenActivity_backup.this.getApplication()).getUser(); + api.setAccessToken(user.user_key); + final IotService iot = api.getService(); + iot.nodesDelete(node.node_sn, new Callback() { + @Override + public void success(NodeResponse nodeResponse, Response response) { + progressDialog.dismiss(); + nodes.remove(nodeResponse); + ((MyApplication) MainScreenActivity_backup.this.getApplication()).setNodes(nodes); + mAdapter.removeItem(p); + Log.i("iot", "Delete Node success!"); + } + + @Override + public void failure(RetrofitError error) { + progressDialog.dismiss(); + Log.e("iot", "Delete Node fail!"); + } + }); + } + }); + builder.setNegativeButton(R.string.cancel, null); + builder.show(); + + return true; + } + + @Override + public boolean nodeDetail(int position) { + Intent intent = new Intent(this, NodeDetailActivity.class); + intent.putExtra("position", position); + startActivity(intent); + return true; + } + + @Override + public boolean nodeSet(int position) { + Intent intent = new Intent(this, SetupIotNodeActivity.class); + intent.putExtra("position", position); + startActivity(intent); + return true; + } + + @Override + public boolean nodeRename(final int position) { + final LayoutInflater inflater = this.getLayoutInflater(); + final View view = inflater.inflate(R.layout.dialog_name_input, null); + final EditText nameView = (EditText) view.findViewById(R.id.new_name); + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setCancelable(false); + builder.setTitle("Rename Pion One"); + builder.setView(view); + builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + final String newName = nameView.getText().toString(); + final ProgressDialog progressDialog = new ProgressDialog(MainScreenActivity_backup.this); + progressDialog.setMessage("Node rename..."); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.show(); + final int p = position; + Node node = nodes.get(position); + IotApi api = new IotApi(); + User user = ((MyApplication) MainScreenActivity_backup.this.getApplication()).getUser(); + api.setAccessToken(user.user_key); + final IotService iot = api.getService(); + iot.nodesRename(newName, node.node_sn, new Callback() { + @Override + public void success(NodeResponse nodeResponse, Response response) { + progressDialog.dismiss(); + setupAdapter(); + } + + @Override + public void failure(RetrofitError error) { + progressDialog.dismiss(); + Log.e("iot", "Delete Node fail!"); + } + }); + } + }); + builder.setNegativeButton(R.string.cancel, null); + builder.show(); + + return true; + } + +} \ No newline at end of file diff --git a/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter.java b/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter.java index 9c05245..5b13f35 100755 --- a/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter.java +++ b/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter.java @@ -1,16 +1,17 @@ package cc.seeed.iot.ui_main; import android.content.Context; -import android.support.v7.widget.PopupMenu; +import android.graphics.Color; import android.support.v7.widget.RecyclerView; import android.util.TypedValue; import android.view.LayoutInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import com.daimajia.swipe.adapters.RecyclerSwipeAdapter; + import java.util.ArrayList; import java.util.List; @@ -20,7 +21,8 @@ /** * Created by tenwong on 15/6/25. */ -public class NodeListRecyclerAdapter extends RecyclerView.Adapter { +public class NodeListRecyclerAdapter extends RecyclerSwipeAdapter { + private static final String TAG = "NodeListRecyclerAdapter"; private ArrayList nodes; private Context context; @@ -28,6 +30,16 @@ public class NodeListRecyclerAdapter extends RecyclerView.Adapter mValues; + private OnClickListener mOnClickListener; + + public interface OnClickListener { + void onClick(View v, int position); + } + + public void setOnClickListener(OnClickListener l) { + mOnClickListener = l; + } + public NodeListRecyclerAdapter(ArrayList nodes) { this.nodes = nodes; } @@ -37,18 +49,18 @@ public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { this.context = parent.getContext(); View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.main_list_item, parent, false); - return new MainViewHolder(v); + return new MainViewHolder(v, mOnClickListener); } @Override public void onBindViewHolder(MainViewHolder holder, final int position) { Node node = nodes.get(position); - holder.tv_name.setText(node.name); + holder.mNameView.setText(node.name); if (node.online) { - holder.mStausView.setImageResource(R.drawable.online_led); + holder.mStatusView.setBackgroundColor(Color.GREEN); } else { - holder.mStausView.setImageResource(R.drawable.offline_led); + holder.mStatusView.setBackgroundColor(Color.RED); } } @@ -82,65 +94,56 @@ public boolean updateAll(ArrayList nodes) { return true; } - public static class MainViewHolder extends RecyclerView.ViewHolder - implements PopupMenu.OnMenuItemClickListener, View.OnClickListener { - TextView tv_name; - ImageView pop_menu; - ImageView mStausView; - View mView; + @Override + public int getSwipeLayoutResourceId(int position) { + return 0; + } - NodeAction nodeAction; + public static class MainViewHolder extends RecyclerView.ViewHolder + implements View.OnClickListener { + private OnClickListener mOnClickListener; - public MainViewHolder(View itemView) { - super(itemView); - mView = itemView; - tv_name = (TextView) itemView.findViewById(R.id.txtvName); - pop_menu = (ImageView) itemView.findViewById(R.id.pop_menu); - mStausView = (ImageView) itemView.findViewById(R.id.status_led); + TextView mNameView; + TextView mLocationView; + ImageView mFavoriteView; + ImageView mPopMenuView; + View mStatusView; + View mItemView; - itemView.setOnClickListener(this); - pop_menu.setOnClickListener(this); + TextView mRenameView; + TextView mDetailView; + TextView mRemoveView; - nodeAction = (NodeAction) mView.getContext(); - } - - @Override - public boolean onMenuItemClick(MenuItem item) { - switch (item.getItemId()) { - case R.id.remove: - nodeAction.nodeRemove(getAdapterPosition()); - return true; - case R.id.detail: - nodeAction.nodeDetail(getAdapterPosition()); - return true; - case R.id.rename: - nodeAction.nodeRename(getAdapterPosition()); - return true; - } - return false; + public MainViewHolder(View itemView, OnClickListener mOnClickListener) { + super(itemView); + this.mOnClickListener = mOnClickListener; + + mItemView = itemView; + mNameView = (TextView) itemView.findViewById(R.id.name); + mLocationView = (TextView) itemView.findViewById(R.id.location); + mFavoriteView = (ImageView) itemView.findViewById(R.id.favorite); + mPopMenuView = (ImageView) itemView.findViewById(R.id.dot); + mStatusView = itemView.findViewById(R.id.status); + + mRenameView = (TextView) itemView.findViewById(R.id.rename); + mDetailView = (TextView) itemView.findViewById(R.id.detail); + mRemoveView = (TextView) itemView.findViewById(R.id.remove); + + mItemView.setOnClickListener(this); + mLocationView.setOnClickListener(this); + mFavoriteView.setOnClickListener(this); + mPopMenuView.setOnClickListener(this); + mRenameView.setOnClickListener(this); + mDetailView.setOnClickListener(this); + mRemoveView.setOnClickListener(this); } @Override public void onClick(View v) { - if (v == pop_menu) { - PopupMenu popupMenu = new PopupMenu(mView.getContext(), v); - popupMenu.setOnMenuItemClickListener(this); - popupMenu.inflate(R.menu.ui_node_action); - popupMenu.show(); - } else if (v == mView) { - nodeAction.nodeSet(getAdapterPosition()); + if (mOnClickListener != null) { + mOnClickListener.onClick(v, getLayoutPosition()); } - } - } - public interface NodeAction { - public boolean nodeRemove(int position); - - public boolean nodeDetail(int position); - - public boolean nodeSet(int position); - - public boolean nodeRename(int position); + } } - } diff --git a/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter_backup.java b/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter_backup.java new file mode 100755 index 0000000..a706bf7 --- /dev/null +++ b/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter_backup.java @@ -0,0 +1,146 @@ +package cc.seeed.iot.ui_main; + +import android.content.Context; +import android.support.v7.widget.PopupMenu; +import android.support.v7.widget.RecyclerView; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; + +import cc.seeed.iot.R; +import cc.seeed.iot.webapi.model.Node; + +/** + * Created by tenwong on 15/6/25. + */ +public class NodeListRecyclerAdapter_backup extends RecyclerView.Adapter { + private ArrayList nodes; + private Context context; + + private final TypedValue mTypedValue = new TypedValue(); + private int mBackground; + private List mValues; + + public NodeListRecyclerAdapter_backup(ArrayList nodes) { + this.nodes = nodes; + } + + @Override + public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + this.context = parent.getContext(); + View v = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.main_list_item, parent, false); + return new MainViewHolder(v); + } + + @Override + public void onBindViewHolder(MainViewHolder holder, final int position) { + Node node = nodes.get(position); + holder.tv_name.setText(node.name); + + if (node.online) { + holder.mStausView.setImageResource(R.drawable.online_led); + } else { + holder.mStausView.setImageResource(R.drawable.offline_led); + } + } + + @Override + public int getItemCount() { + if (nodes == null) + return 0; + else + return nodes.size(); + } + + public Node getItem(int position) { + return nodes.get(position); + } + + public Node removeItem(int position) { + Node node = nodes.remove(position); + notifyItemRemoved(position); + return node; + } + + public Node updateItem(int position, Node newNode) { + nodes.set(position, newNode); + notifyItemChanged(position); + return newNode; + } + + public boolean updateAll(ArrayList nodes) { + this.nodes = nodes; + notifyDataSetChanged(); + return true; + } + + public static class MainViewHolder extends RecyclerView.ViewHolder + implements PopupMenu.OnMenuItemClickListener, View.OnClickListener { + TextView tv_name; + ImageView pop_menu; + ImageView mStausView; + View mView; + + NodeAction nodeAction; + + public MainViewHolder(View itemView) { + super(itemView); + mView = itemView; + tv_name = (TextView) itemView.findViewById(R.id.txtvName); + pop_menu = (ImageView) itemView.findViewById(R.id.pop_menu); + mStausView = (ImageView) itemView.findViewById(R.id.status_led); + + itemView.setOnClickListener(this); + pop_menu.setOnClickListener(this); + + nodeAction = (NodeAction) mView.getContext(); + } + + @Override + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case R.id.remove: + nodeAction.nodeRemove(getAdapterPosition()); + return true; + case R.id.detail: + nodeAction.nodeDetail(getAdapterPosition()); + return true; + case R.id.rename: + nodeAction.nodeRename(getAdapterPosition()); + return true; + } + return false; + } + + @Override + public void onClick(View v) { + if (v == pop_menu) { + PopupMenu popupMenu = new PopupMenu(mView.getContext(), v); + popupMenu.setOnMenuItemClickListener(this); + popupMenu.inflate(R.menu.ui_node_action); + popupMenu.show(); + } else if (v == mView) { + nodeAction.nodeSet(getAdapterPosition()); + } + } + } + + public interface NodeAction { + public boolean nodeRemove(int position); + + public boolean nodeDetail(int position); + + public boolean nodeSet(int position); + + public boolean nodeRename(int position); + } + +} diff --git a/android/app/src/main/java/cc/seeed/iot/ui_main/util/DividerItemDecoration.java b/android/app/src/main/java/cc/seeed/iot/ui_main/util/DividerItemDecoration.java new file mode 100644 index 0000000..95d2be1 --- /dev/null +++ b/android/app/src/main/java/cc/seeed/iot/ui_main/util/DividerItemDecoration.java @@ -0,0 +1,125 @@ +package cc.seeed.iot.ui_main.util; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; +import android.view.View; + +public class DividerItemDecoration extends RecyclerView.ItemDecoration { + + private Drawable mDivider; + private boolean mShowFirstDivider = false; + private boolean mShowLastDivider = false; + + + public DividerItemDecoration(Context context, AttributeSet attrs) { + final TypedArray a = context + .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider}); + mDivider = a.getDrawable(0); + a.recycle(); + } + + public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider, + boolean showLastDivider) { + this(context, attrs); + mShowFirstDivider = showFirstDivider; + mShowLastDivider = showLastDivider; + } + + public DividerItemDecoration(Drawable divider) { + mDivider = divider; + } + + public DividerItemDecoration(Drawable divider, boolean showFirstDivider, + boolean showLastDivider) { + this(divider); + mShowFirstDivider = showFirstDivider; + mShowLastDivider = showLastDivider; + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, + RecyclerView.State state) { + super.getItemOffsets(outRect , view, parent, state); + if (mDivider == null) { + return; + } + if (parent.getChildPosition(view) < 1) { + return; + } + + if (getOrientation(parent) == LinearLayoutManager.VERTICAL) { + outRect.top = mDivider.getIntrinsicHeight(); + } else { + outRect.left = mDivider.getIntrinsicWidth(); + } + } + + @Override + public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { + if (mDivider == null) { + super.onDrawOver(c, parent, state); + return; + } + + // Initialization needed to avoid compiler warning + int left = 0, right = 0, top = 0, bottom = 0, size; + int orientation = getOrientation(parent); + int childCount = parent.getChildCount(); + + if (orientation == LinearLayoutManager.VERTICAL) { + size = mDivider.getIntrinsicHeight(); + left = parent.getPaddingLeft(); + right = parent.getWidth() - parent.getPaddingRight(); + } else { //horizontal + size = mDivider.getIntrinsicWidth(); + top = parent.getPaddingTop(); + bottom = parent.getHeight() - parent.getPaddingBottom(); + } + + for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) { + View child = parent.getChildAt(i); + RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); + + if (orientation == LinearLayoutManager.VERTICAL) { + top = child.getTop() - params.topMargin; + bottom = top + size; + } else { //horizontal + left = child.getLeft() - params.leftMargin; + right = left + size; + } + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + + // show last divider + if (mShowLastDivider && childCount > 0) { + View child = parent.getChildAt(childCount - 1); + RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); + if (orientation == LinearLayoutManager.VERTICAL) { + top = child.getBottom() + params.bottomMargin; + bottom = top + size; + } else { // horizontal + left = child.getRight() + params.rightMargin; + right = left + size; + } + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + + private int getOrientation(RecyclerView parent) { + if (parent.getLayoutManager() instanceof LinearLayoutManager) { + LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager(); + return layoutManager.getOrientation(); + } else { + throw new IllegalStateException( + "DividerItemDecoration can only be used with a LinearLayoutManager."); + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/cc/seeed/iot/ui_main/util/RecyclerItemClickListener.java b/android/app/src/main/java/cc/seeed/iot/ui_main/util/RecyclerItemClickListener.java new file mode 100644 index 0000000..c5124ac --- /dev/null +++ b/android/app/src/main/java/cc/seeed/iot/ui_main/util/RecyclerItemClickListener.java @@ -0,0 +1,45 @@ +package cc.seeed.iot.ui_main.util; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.View; + +public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { + private OnItemClickListener mListener; + + public interface OnItemClickListener { + public void onItemClick(View view, int position); + } + + GestureDetector mGestureDetector; + + public RecyclerItemClickListener(Context context, OnItemClickListener listener) { + mListener = listener; + mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { + @Override + public boolean onSingleTapUp(MotionEvent e) { + return true; + } + }); + } + + @Override + public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { + View childView = view.findChildViewUnder(e.getX(), e.getY()); + if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { + mListener.onItemClick(childView, view.getChildPosition(childView)); + } + return false; + } + + @Override + public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { + } + + @Override + public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { + + } +} diff --git a/android/app/src/main/res/drawable-hdpi/node_icon.png b/android/app/src/main/res/drawable-hdpi/node_icon.png deleted file mode 100644 index 90728645c2049dbb55797dab6c1740378ab2caa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4943 zcmV-V6R_-wP)Px|2}wjjRCodHT?vpBRhs@QGpnlarkifM1$wyUT<#qNcL#NimE{s=#{pf>(G7y& z(1}nWJT{0}oX~YyF~o!Mzypa5L_BaE4nY}KA`oeXLFfUwk*n{k&dkdFzpT!x%<9Ul zs;0W3SRYYcuipK>{NMln_y2!B9ApTps*3aH&z}$o1mX%=Bc@NK9(I@NBBTqj0WS{T9|Nh1L`uZ6RkPr+8^{oFF-%h8K7@$y5QPHN+ zqenmT%rnoN!o)RzmMvS>`|Gd2-qO&}FicStVg$Pslu#%{e!oA`C;Dd!j{NSb2vZV? zqDbAkbvtz9jW^!LxSW+ZQJ6k``U-%9fp#@Gcp$xc^`fa$rxFH;{+pYd>7$Q6B2aNx zjt6}K17NXt@7@(Wp1U0L=FJ;<;J|@>Uawc`%E9PV!ONK@PMk=qSFhHSsJfI(eGD|Hs*MaL!z6xOj<^gh+N* zM?fgR1lUMGA zQg%UcG@B<9@U>FV=jDl{hna_DnF{(;(8$l$YW@6l_N>MWqMdeq4442LFlo!))sR9t zMLnqWpZ-8WN0#gq`R z@>-A97DbgVR5RsQmJ^FOBsf%RXv)^8DO#$1%&~C6LUrfPKa=HCV+@2C;Z5bmtnwKu z9ROiS?RfyW1CwW(C^S56EGy=lF&Z3I<+T^5ADLyd$&-IYlEbY~cA>~Zk)3ECQICZC z(subYGieOcM3AN*;eONdH)bvrf8L5B60ni-e|eg28r#E?Nu^~>8Q6#>Bub~5f}A08 zIpd?4f%8h^kg?1|yi=!psi$#>S3^@jlTL!C@H0R^1C#)P1ldBqX8;R;MuiymTf0w! z7O(njySX7R9Dqq-^9YheC5KbmGFVhrL-z6qAMjaTi8j>MUWR<}{FLP9Cn5&J3KhF5=+`$qt_j6}$>nx4 zL8uf6^4SA{=eeuuLpoUV1((4o%%CuXV3g&`p@ioU+rT^~8xe7IpF6&DxL&9~ef8D`$8BA#EA<(PIcqxuzwyafy9 z)3oVRY0K8lkp_%qB8eFi!76|q4&lZg<+Qf2Dy97JPEr?F@ed#a8$1w%ojr<(TFZQu<9<#pm}v0kyZhYuf~uy0#{X3UsD z_*{ztJM&|YJw|x=Pe1*%rL%-d4vGch;K75mVZ#O%7~3Sx*a8{+8@@*nW6qsBXKNs^ zr6Bn1fCmj3GK5Bq7?Htnv>!UV+R=OOy{EAdJI@wdfbPHlei}1o3=J4CpnVS+o&u|d z?&b%tGAn;1TY$!oA5ZwCGqCu_W@{JkVzOnk0^9vXhwacT>n584_OWEi68HeoE3dpl zWo2b?tJ;oY`}Xbh%{SlhnQQ^&=jX?5AeBT2fF8M?4xismA(IZu+zMo_7H?gr$w250 zg5t@OC#j&IAaXu4k0Sib7NAX=HfcO)=FFLt%$69h17n)N9wH6O8QOK}En{-rIQyHC zsCkfdj-*&vSV%YBbdx3rxmoRD6-)r(2^+(b$CuJ?e>2AfPHY)t`DEglxFlE~4wGr4 zqh++drLe&h8;{X(RBuy=vAjkA5*VCjZ!PUR@)eg2E73%DA}FX3Y2Q&!gVu~E*XXTg zyS5of&baCWmaR{2p}kc*qK9B81huJ#=ZpDOH=XABMXkn;|9pF~T3@iAwWy+|D3TRx z<_Q!e*0fzN6?PQwpp%FLe$kr@-n`14wAgr!-T&a>}wz^p)!TB1<(~fhmFmt!2qV{dtro3QDaO+;1E#sY+^*Wg(C)3%aEkQ!9i#04^y@8Sfoq@AcYxUX>MQo=Sd4}$NcV>%c-vR47-J- z!m9vyEa;v#-x;pQ6an#swU)117h9Q5g)*XhFPDoxr)sR%&$ zVI)zURX+IO1FEg9rCV;fC897hmO-5>5x~E&ZR4LF!Wz%$Z#~`ktt~Njj)#XXzZXaM z+KzY zL^1XUO9s@fJ$v?yEGJ{W9=8Mt1t5a+Ye5lo^-5Rnn@z`pLVx~gjfs)!<55(8DJRJt z42RU$UVBZiYWZym5Ud){KKm^3yPO)*mMwI7hDsi)VSW&ghhfnrFXjL6!w=e7tY5!= zmb0(~2>KD6SFXm83J6x?ui=;W9)9>??cuLmx6V>=ZwvQ3@4Q0~Jn(>K{;}#PQ`4co zx&8LrY08u-wk*Vwf-v!8$Bq#cOHEBpmI|dz1ql3g>C&YMhi^+k(71j4@y9f1(4d43 zWm*9Uho67`IqlxP+ji)-6a<|ujQf`pz&3GC!co8&aMUo$F~+>Eh=T_`_0&@u4}#^! z%7MWapcN}t(3UM*=*>6Zq`rOoraW!{;8R-YWX)gNpT$_c;+31O7)af_ch_{%#l^*z z;9$bG0D*#Fn$@MuR1p$b@ecLF_H(P^R)yXLWv)cPoMz9Sov>@$(JflEi1@vFTZ9w! z5ME;GQ$Hl?FWGz;4Z&Z*tmn*`qbcv>)ipDQm=ZXz96x?MCiU9*35)7WFTF&szy7+d zgP1Kq&pr1X-FfGoR8>`VZJ=V91q9*T++6J_6+Y-1G7VANB{pu{IPGP(($Z2xmCTOn zVBqk*cI{e?zrqzJ8q6926F`s+aQ4!}9e2#4S$u~EluCMfRJo*=%AD`;JiHnx*w%** z9ikoSpt;cJ7poC4ST!J-@UG=7GR+ux8jpn@xq)PrZ(ZOGI88z0b!54avj~W6$+0GmK=wt;vxYb+tz6JN772Z*D61Efv99xNk39fy4pdW({3G{nyJxhooN@~HU@!_MQ{4m*7L$&g zRpl`C*wI9|row)R6@{Z{LZ6u=hpa6L@bviM+%CF!>94E`?QDR|YUOxyjGdneAT}Fn zd?;Q;J&oBJ(}unERWHj*P{KPP_*ex88v^Y-UajhNB%M!%;6l-=`g1lgS%sIOLecBO zA^^#uAoVL4Nx!|}u}A~j5rdWEAte-9CLeyYl74L1bHyAGB7;jY0vlb4yMpe$@!#2e z&XmgYa`8@voel1Idf2*uEq!-!6Yq3k2a5ZaZPUvq7NCvXklu?9dQp8K5X*Fi?;&IUMKP;0SsX;}w4G zOJ!yXCxSj66FfCbfN)m1?Y7%!)TmL^uV25+L?OYbag<6FECGVq=g~(WO;kTY zKIE$K$Eu)~Z!1b#)x5lPT&VKI6Hicic{wd!ytrdtu1Ag>A$&kdRw_xmVZu|y!xzFS zHgb?Cu$5GfZmV(IgX06Po=G*>)B}%&T?_^Z@TCs90k2xMN^|1;^wUpMb|iktn@ zJJ7TZ9z3{%JjlV~q?gZk@ds!gH7`SpW#-^pSPIYfp_-uw`TUp~73H1nMGe;8cEOf{;2(sSS#G`c)|7dWU8kw!;h58{PZ7tP=xP zl@y}CnJ}Is_#_{`-oDv#f50vVAsFDm|H+CM*#b0h;6TFXiihM`Ptrq$&w>693U)Kd zL-B$w4_d!|JuO_gP(wOid_T1Ivw#2o#CO)~S&{Ep zm23ncWYo2uqc6Vu?}$nR{(kUrKJnciEe##i@J7PZ`p3^|(rE>dg+^9Pf+(gFvfNM>~$c$qF%J53DG3@|}sS zy?}BM*Z#o50;2T#Srz_JBE7y z&t$%bI>8~dt+EhwldrUf8u}a|v6BEoSD+B582#@kV4%nr3#k6Eo4idjl?`)}l3&9r zW}ZKTqbR|PlI-xWbxO{Af=n%0Y7u?AzLAa{KBYA`;%^7g@L%V%A5XK^c-wpueqo6L z9K~&I%`i5?w=Zk%y~ec8kE`T%X3?oHMcT9VAVZ~4`L|{C_rEKnfV-M`RTc$B-+u{A zG^%)K-cGe+TbWyd936(u-s_i{o+!MPyfdqv`SN%v zl*3fRmTa+!HU6-zTl8WaOp{Vr#eK z04p}MI(Rp9z@sF!fURBhB=*u}TQN&u%1O7sd~@Kf7q|ZYD@Vi*^nX!?v3WQ=^u7Q9 N002ovPDHLkV1go1k3;|f diff --git a/android/app/src/main/res/drawable-mdpi/divider.xml b/android/app/src/main/res/drawable-mdpi/divider.xml new file mode 100644 index 0000000..e233a4a --- /dev/null +++ b/android/app/src/main/res/drawable-mdpi/divider.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable-mdpi/node_icon.png b/android/app/src/main/res/drawable-mdpi/node_icon.png deleted file mode 100644 index 89d353d053616c70eeeddc41dfd0704e3f545eb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3565 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 diff --git a/android/app/src/main/res/drawable-xhdpi/node_icon.png b/android/app/src/main/res/drawable-xhdpi/node_icon.png deleted file mode 100644 index 60e142f410f5e559abd287bc843b62eabad8e955..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5975 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 FV1hY|amWAw diff --git a/android/app/src/main/res/drawable-xxhdpi/grove_bulb.png b/android/app/src/main/res/drawable-xxhdpi/grove_bulb.png new file mode 100644 index 0000000000000000000000000000000000000000..687e085aa21098ad4555f8c31321b2c49fbfabf8 GIT binary patch literal 8916 zcmV;_A}igAP)r004>z1^@s6b%)Yq00001b5ch_0Itp) z=>PyCj!8s8RCodHT?v>~#g(o{(;K}3-OUcN%F^tc$fj&!K#;@;GKoy0qZtq(kW9cB z4HL&C%qYmJLlzy4V-OXG07BRo(SR(?-t7C@K+{ck(;IL8|MIH6eP7+~_xine?|s1e zzT5Y{yHuU3`uo(WQ>RY3#9czur%z7+-H+n7^c?kFE?0uv?M}e&1pT$AN^)>72hVfx zTYr5PzcYB`F)`6qy?S-Q1JXrA zMn;OLs3`5MzvhQUMMa{puuwbeuOUT5R#ujFWM^l)i;Ig@bx6>xeO-7t5;7XCnsybh>wpKcrU1BgESEY z&h_ip#g!{p#JO|l#DxnN+yIz9BfRGR2aXRQZT>oW^5m;QWx}Gw^aZjg%gSdnZQ8V` zl$4aARjO1OgGL{Ml%kj#rA6)9wO#e=*B3leQ&R=rseDEOe0l5EEphqsWpVcGS?#!Z z@uFVp6ap~I@y`31nVHK_p27gKvh>ri0LrXcvl;;mKSSgH5Vcd2HH2$7K;dfHvZZL; zxG}+EX~p@P8M-EM;=~D&k&!{*xB(Jb=T~w47d(G+;>3xkd`-`;_axJHM>Qz} zu-rmVi^KrsWA^aKtUz~YAVaCPd`Nnpg{w7LrlKNvZQ zojZ3@%D4d%wuc+Xr|6a@zwp8fr-PD75E5|&P@aGO`AA5M$tce&kRWkXPFuHb?ds5> zgWzc8ZlD`CZiw{sbaCLo0ZsXZgvmv@UxU<{v0%Z1BD?FrcA%h}c^HyoJ^<31m4Pls z^z7MF#KpzgT{pJmpPQR2wrttLE=kKDfH?q3GY;L+dRrLsWNI5w-gx7U6oBC^@bLrk zl9ZGr`t<1|8Z>C&VeRfdojG$xY}&L*v(b2J;zNMwr$7Js&ok|)8C!q?U8Fa3k&jT| z2JB`!ckZlpGmtEH)PZC3ge1|rqa8bTNL$Pq=q{t7yKJ_aX{&+anm>R3RCF`1p`a14 zo{Ikc``@vOYOorU3h&yrYiacr=!%Mw?yKX*jr%>$RD3NV%YZU__Uu$hkM{wRM{&5J zyt=w|>t>q;)sor`VkVFzV%xTD98v=-ZWoRfFxHKkFk!;wAZBBllqEpHq}_w)YCZu# z>cz&!x*eIJvKUzvXqoF^d%%G+0CfdlW_5lwKKObCvQRaTOeJYgOdB6pUL?AddP+u0Ld=^in#zu6^v>` zuU@@^KF#lQDeu4+QLox$C;PCzBXy@r# z91*Qpu|iHRz61rAww9n!(0~F-@?%JnKjUy?WaHwTjgzRj#4Wa;yeYOF&ll-u3dFfA z+N~-_th8peB1MOWF`{R)SPeLpODXtYagGQhB1#qxpPzwY?%iPI5)`07aUBMoWHA_u z;CxM5T3Rr83rZTtFBgiH`*OvGj69KjlP({@CrX?Ct*VJf(&9yOe9(JyzZu@UcdyvI zS+nw&K-v8+Mniw|I}yVN0Rsgf=?RdmM!K()ssbZ} z+Qfw` zptD>u^6KmF zO3O)jkXM15z+y1ap35Qz4H{&toumjl$U;bv|NP>LI1L5WU!rna7hMP?LBpC=MXiLY zA}KaP#74P9L9ttu_|a=|rjCm8>ixN*MqGqwlA_(h1W3 z!}aUeS85`$(()0@BVI;H2ExHvQ(gg>fD2aH1Smy*zdTbMx#XK8SaemFXj?y8v~L(K zTGxrzMlwm&%>QRl$s+Sci8yt&NbEaXAkt44Xh67CL6u+2yCvROc~$)5SiYDru%@UM zW$j3bZNe#&Pd@p?4ae?*o;G`}GWA@k*2M_tAuzE9M-`0OU3NMfeR()fytVqO$itAf zJYsjy<-Qovzjd7G(KJ>>0W5(~c7BQ2cqmV-IgqD;rlPd!LQ?&5XtHRUYQ1!!6BO(! zz`OevjsX}6ZK#M}<8!}j%i}Jv3m~aS(|q^t-HmBl_IvS;9P!6ZSrz6-VEm|861o&^ z#Yctj`}@MKQ#ZxCUuIP((PChe`PE}7qEn+7f3pbq{jFQK3OGPfUpWW&gpU5YCz#7y z6V`?e8}=SR(t|U>{rdH@O)vTL<}C5y*V!gq-oD+sZj_kvon-O-u8EqyQSQqDJfvRp zXxlhZAI7+2mkPy=0=0B2hMq$yR3C=B`;tQgTC-xXy}0BR`bq*usf{6F7MZ=Py6=}n z!BF@SWU>;AvfQIajdI!LA^#^xkP4nv2JXTD8q^5|$98GytgvR^wXr5SqFi#x3P$+T?7TeEv=7@Kn z2`rpSn|jgWt*2^>-~2689MAL~jTNJLUR#hg!H#pnl;Ov}peKZQ=SaBH?G zgbtx6+El3Yropb#BqdVo4$8Bs=)d*lngDnS!(vJn)pWwCtHt7-^;zPlgKGMcTu|O& z8?r62U_RE3{Eq8^k^5Hqbo`?=+EEZk_D@)T6yi$A{L5a zifNvEVIZ3YJBxm{m^PIMG3!e+I}LBtD?&|qa9^0b@S->kV5sQV!&5}}Cf3z0oU_G8 zAAO_+{ee{J2C4FmiZ6Mu{LUP20dcgz3e4r$0upvPpKe!!q&cSgCqXAMqg61W|MIg- zr63_32#$B3sSD#*il%T{0TS{@tL(3br;3Cab(M2|s?bF7H7j2r_xTUcHf0*Jjmt|< z&9&zXO!~D&pZ_={ikl0@?V$OnK-Dm_28O_|z<3p1)w>8VDrv*hw^m&(oug@n(GYck zas6tDlz5+d+@Kei*4dXZELI7y3)v;&W6V`qNo-TLE!&uFU0&YawOsaX#wejXqb<^8 z_nDhw*QtWC9C?1RPfx+bor>Q3^14{`&9_qMk+e7sBrR%NZ$3Bj$6@nG7ywnY7^5vt z4Om5#Dr{Ti$AfKcN~S=8ajiMN8VRw)Reh!jgz^EEPZhOq5G}ekR`=&C_uden=(?&O z!*o9p6LMB{F)DtI_nzpQ086oV)!)R3?*De(Fuoqr-)vj9F)|tHX>(<9+3vBLtJaiKu$!Yr+dp6RU~x>5qoTX(JWlV^G-Y3BRV8xFakzB0PITB`gF!*?pa zRuS8lZH)XPJZ-MbS_u^Rn$WiV6u+=bH(9Zlab&!Sqa0NiLPb!olW^|k33!@0mA=z1 zUQlN-5*@rZ!LVp0>Du@yPuqKCuLKIhZ+;hVCcu9|i_z-!Rfun}(Ko|=z(_QP{c}&X zG@;YdMJR-%me570v^trpM!3Y7o@(3AT3C#&BnD_^TZ0m?^kal7ZzWKm1wYM~8GX?X z;yj4Tzl63AdZ8KVTvieElH2+WM-(p%sNpD`#K^DwP3f4TaK@(XhgM`ON!Qk6RQY-V zg>mEolz~)mnm4CDYdvu?O-21%#i?#sFPhol9CSN(|Nf$$ML&4&tBA`= ztR%KI+njAr3>fqF0tzg!Kfp^7m>qT@gt+m2OMa)H_I8Y>Pixo4-VQ&UOIeSl7$kbZ zn+-iJVZ0KV^fLiJ*B)6(Y-_eT@{I6cpiK5&K#|=JBSPCjXJCoFn(M9g)4x?U#N~P& zuIwZAfqzFZ=V`1cKOLBA#(6b^*aM)@aA+mT?nh!kpLZD!F^+DCm)ZkeZo2~AWMJA~ zMIB%}QPDb`;z#p*I1-I;M&j(YetydMJQTm_W5l*628acH9%X=n2mSbvJ5!*)(!Xcf zH6@CQTEoA?NF{KC=duVA=TKVJvETA)!jbRvXMWtf0|J8F56yWLFQEk zD7a}mQ0SIuq|}56<>Vi|(!r9h#bA1G?b zpe!|Onor%!4?}g%E$~)kRkjA^ukXVf!|5noiOQ^$_xdvAnt1c;-wF0L+nyL87W8vJ zr9hFQhKRy-u=DphJ(Z!2aY|Ga=~1J2zTW{e!zvzqxySmB!O~SDF;Nu-jFZx+78NxUBpOS|Er>&SdPJG!#X6`x)@x=o4@xMu*XPp*l)Za>fgHVN5cg3 zE7cHz9&OVCZk%K%sf3xCIf0Xd3x85yXeIzmXV_nBe!N5(UN` zZDNNLM0S#DA$Oia%19nnMmYH_oX)D%1=UO>X{gI3F(5I){4}6==64cl#-$=-C#fpO zE)i^1Jz(Xypwp6(s@W7!&d%|Q-p@NjKF+%GG*p? zW;6|jR7qFEDK$GHqeyQd48yDuIHRvkRh&ix0{-qI31~cRP5$882QtcV7J1FoL>57%Ta=nZ$)WHEJ$o< zK*2{EP_VkaqVGfgTno6D=sk122kwDfLwu(Z=8m&91UTvVN11rlefg-WtIEli_=whn?ll=9=-&(XYc5{1o0Q5dKq9*!yZI~4 z-wBmf%8Z2<9PK=SaHmcoU_+bMmR%43b!#G8AlG&{f=7CNb!!r%j8a6m$5)0ic#ikf zyd#*efC(8?Ckv6SjWnWD0+yZFUoK+7L)xl&+4bZAI2uswo)nba@jM2b4yeLe(fGFU zP`(xvNB@4fTrb#gO{hRZX~G3;P9O;ss3lteFS{J=hkWP+M#%%ifj@M=dLPjP zXYIFPIrMzfTtCD?>yjiEBsMgOBE^diMfx(>dd+~njB}!*46NySW91cu-*P@!7)j|@ zi!UjM!(3R;2vQvFIfWz^BsLt~^~g%&3cz-V-l(EYhx4_#C@7HXu_Nx~VP(N9pI^o{ zE^5D;??Qp~C(^bRg_1x)US+zT^UORaN4sYQAAaS*5gH>>tHN0^A@=$6Ohme08HM0w zE~1~dPZ)wVEE1cB7}{Q?o1 zxZ{SCh+X1z>_}$jB9RR1>&u92>7*`4)}Iaw8N4UE9_@$jp?u#_XU3NwKfru(8spJ2 zj=fXp9fUsJYO?ty6?EEy>^9Y#)s+ql-vR~wdsqO4h2k!t&p%|oQh>we6Pfmp-snHG ze2;n(lOXx`5h==8bY=}_^?eBxi49GnVBeNAU?h)WujR1FYR3G@kDD5deOL_^4uJl& z$$SS6fAXp9yHuobSWyVZHaUuYe^kUB$(#%l@~o34hwxJyPRh9+KBq$4@#@v9 zVF45}{5^yR-G9DN+mMOB^|a-P^PHR>hk4#f6Mp*o(q9t;9?}Lmyq3x=ueb2e*|TSP z3LAPB!HJz?rZTU#C>Ya5nFJv=|H_^xIt*x-AQz=T!5(vKd4rq&gcH%n_JO9}u9HqH z!+mz$V-wzU(aShp^t5|T2a0xY#KY#v_n>TMZ=LZcMG|<26=xeh$v|NQp16?3QiLnn0 z&=@3mH_k_~TY7oG(C0-1Tbd&Dss0_OT(iy5_7oCFhy^`gWq`s5kSKq_Y1*Mfhr$Xd z+{Qi`8xYVrNKgFF_g6X+7+eobi9v82sQ?&tu(FZ)Z$IfBn!OzYDM#95_|w;eFV}2y z4}BmnsDarF%?kkUdUxuX5)SOpRmnwpJpivi!$T|lyT$69YgoC z86Wn>hqi6SQie+(e{gGBBT)D$w>8lNg+3ybG+I|eV8BzZysm_!77Y{#MNS7Qx;z*u zU9r%d?{q{A|8O9-HQL+-L9v+_F!JnOV!VNu--lG`O;IER=^H~1D z<)!7AXLLLGd}rAm$xChttYgj>51Z`aN9JjBxh*knYR0zX6#%0l_7J+3S0ZjGcEJb- z2PL*C+Lm3;I<|Fr4OlKv_#yO^|G=r=o;`cqZQHgD3#rn*Nvs!8Se8`>a?1ea1|&== zFklBEF!=9fM%;i&D!|l*7n^Kx=f`P5f1fZ%7D+G$?qwzTJKz~*RyO+9BQW%@W zxx|eW2B3@i)DW?WpqTOZQh!jd0#E^!z~Hdi2n_uPT-;^s-sJOv4tG+@%*>R!2|8rK zwyltS0tyhf8&YKs6rP`M+O$cG7%{@}E(nhxyp<6s#@Zk-q@j%xgT^{v>F@h;g;8PV zw@i}@)tpL@AcAd(wxl$f!?yK>SD%2wgs>L%RYWr$b@AfGx)~W6qE)L_zNBy4JB--W z8A0<@#xQQA{p(?=$}pwAFnkKbVzcF|!#e~v1otKXK;B{7p$(bDdA6yqX&GH1O~0Em zWeV47PUZ_=fBm(ah8m|6W2>mB7<$ETvF_)SZ?X}FLZM`+KJwh-RKQE0UBV^~-r5cK z27EL?TTMAx2mFX_#kr3&f}cIrVR{VYPJ&w(`SqmCp%HET)C321Y~s$ z1}Ou1;Vb#v^~eN^i;JJb9xgkPVG@Q{qFuXo@{uFYKfyZX1MoFDZ4#S=(uKRXo9*E4 zYoQpJ(8(ZSTX{fooo(oAx#W93cRlih7himlkbIWEDaI~ezAPU(@*IO5PJi=ws-|Ry zia|PW{|xb4oJwpXU6=E$rw#pL*LO8vm+Z1-%MLvD*kdWsnjfH_C5Ft72|KD|v-FbP zNuL(g#4$uUxNzM+ouo7olZ%!Jg!3AJnCQ^OT{NsMUAmOMuv9bVqRV;Hq$uUyt`tz1 zVz+MH*2Krh4}}T1?)B@}MYCqj%FW2`hq2g#Zb0ieZ61glYpeW6{Na&%A99K4B%^Gpx!UeLo1EZah>({TZ)PIWK%B;RZX3w783_i6xa4!+S5nZ};(LZ+dHBI;5 zoXFSwWKUqY%P5l-5%(regVnby)(|lSyPbRfRm3ZwZ{NOM&;kp}#td=i2@@t9<&Vlx zKtN%JFvJbVT)}6!jOg39uV~YzO=bA7{hO<~CE^k`xy-`^AHDF4VR@y6m!ZJ8W|&@Z zwA6;n_PP7_?-v_4Ze+cdKt=c-3~NgQspNox!p!H*oA(?xDO>=+xCadyKDICkuqShZ>u@ZqNW!1M4k`9pw7ic0G!`iz$^U%q3=kRinY%77CmPPpsVt?Noi z2yD@nKK*;wzSjVkgu-6primWMuK<#_eE-_~&7c5<$pb8#~1`gu}31REq|Cn%#HvvOeq@fAG#4WEaboyDw7PP(tNlaQ@fVRd~i zRQ!b$C}bLTmgg}Vnvctf=FOW6+FHWFn?F<)9*lHpmZyybT|1MbodkO8xCOyT+boTc z1BDp_EF%Dx_i>q!l$0c3YY|R&r!=cDyYF*k0~?9pv(4PECC7&F>BVW z7BKgJ48U~6S|K-hN4x!q2kIwh`MyQT%}fq#qHXZP--1~Bm|)~#D7cJ10F*9gA@rS-|F zQ>R+C3AAMrMc?9c=gu7osY0`IB8+nG9zA-v!YRClzAT}>W;hD^lH}#(v8}QpO`gMI zt&c;UuQ7dFfI=oPKhzxE(4TSi;cuAzMV~%>1ne&SdDj!ejMH2G{Q2`*U7)MkgyR{Q z5%$2Hps(!7K@ zn|}j9I2f>vYzGQUK6B>G>IkdxI{st+6%wWj=ZHFV=%BeQ+%141KF+d?OhPMcS246Uy!obVDx#G+L-980a*>(BmKAsdTzd`j8tZ z(KDU^;Y1#J130#zn|U3|>T)OXN?sfZ6j@2oU-}U+_&tF4sKd~GfzI6b-FKg(9lB*1 z^k^?-DlivPHwIBP~1bVY7B zbZf)vI(6#ER~>n#b2EpzM~@zLGad<_SpEnwk zWeo0hmiOV-AnMnzUwXi(Cm-2z<~Al=#v%_!UDVMIl;M4p;Ui4qS!OWP}zZuIV=L;dK!})vH(6 z4*K+R7MsIw9`YJ#XrH1{83a$;wUuXi%^k+M`4JBS0>AaThW0IZ$OaD^k;Ym8X)TsX z?8bwN*MsPpcG&fu0F*LS`s9;OMm+S;LtP0PJm`f6V|r004>z1^@s6b%)Yq00001b5ch_0Itp) z=>PyD8c9S!RCodHT?v>J)wRAo!)(AX!?3SHScV;Blhp+f4d9ZOfH6c&qWEN!fJShM zAu)LgFDin7`7|#Q1QS_If`XtjpeUj&vcs_N12Y56KFmhH|1bK^)YMdUS9e!;bq{mC zufDG3*4@tE_nvdlxu+cBCZV}==f;CNqPfYgqlLrah<7@j@wkpxpS!vw7x!}UJQvsM z^Yge)<&m44dt}zES$tmY$x$6!IB(v(W-&1_ccE=VaCE|v45l{^L|Xx*3&@wiIgI1W zqN1WrGiJ<43q)CV=2q7fVV?L~(Jk@~b|_C?c}5vXmnyC&yV@TB_HF1WgK$va+(xQ>RY7%sj)H z^coo!?Ro9B*OD-5{1_v}BRFnDrOVp_<~y4SZE?l@EE?&Io1i;hZ@S^l=<`Lw+0xV2J?T4-brE);oJ#OIFgf-MVmHl z2$rCBoY}%KHHlNFPKngiR078dkjOs2g7al~{_6DU)6baA&#rW`(sq^awp;+D17wHi zFnSOmQB2IKq+`d9qCeLB%2eg5UkOH;WsrmZ2*4Z- zwK~iCgd|Yjc;k)k5Kf;*CC33I7(61J?b@|-^y<}10g9}AIR8?n*}Z$WIDY)NGRgof z*U_F85Ptt>+O%o=Lal8f1(ZdL7PSH>UPCAS5QhU`abomv+ z`|dlAGERVm{BYt}jcIA-lqplrT2hDwnS=yTo_OMkD2x^}(Vkyp1gS&ev~%aqj-EYx z3Ti7i1LfuAi9LJvh(m`CDZ(#Cn0&PRWsEwnz4g{xC3g3L?Lfgab0ynU=AchVdDq6N|>8jez{d4ZzIk9ES7G;gb)f3ABqF+Aq%rlvG^o%V)fh;lvvdBNs z;Fg?bdiU8ipit0&vS7i2Mi@Po0wnk1 za6))>^y}BpwiVQ%^sa@4U?dUSw{NFP4XijFIM!paZo*SfJ(Xc$F@{+M1t>7u4a8Kl z3IJ&y7Z>NmDB@_$vjke2JJKyT03>B;%sJh z8*cji8aHlC=PbwR)2A^5IR^nO2>{CmD?7$gpg?ft8p(?U$-Vd9>uB4yt(A4H$;(X- zBqb#Y0LF3R#0i3B;FvLEiU1bN7UnDi3PzHj10-+Ya1I|n+(Boe8VYU?&bke zT!w1)vfGMUSfYYJaJ>%zd7BlYOhUt64cXHJ?0YB()(>7obS;hCK2kJLOfsfC8DMF;Kf2ImLD9(nWAd zzJ@}h2gnQZ1QbUekyrlI%x9p$gFFI4({fazDYr$?MWBX4s|Uyv@`gMjugEiBYv}Wf z*dFl$Dlh^L&Q31NnI3gffJHp-BsJPTA9{+oqxSUs3-j9vrBgI>fHWN{iK6O!fKA~_z zCn#t?RGY8k7!DVO&%Lde*CPtu1yIO)I3nTn9QGh#hn>hMt^^X^OV2G6r!vETRAF2A zM<%au%H@#vTs-6>)8sW!;8U^)BS~{wg8TOEYr3FNPFREyMUSqPatB5AAo7YlBk#yV zZ(HRRP@rawL_uS*DT|A0HBLv~_O^}bp(YFRjJzWc$xCmlV;U$Ju3}KwLS_yf-Ep&Q zqwuCPLp?2dM&7ZW$J*_GF>>>|nmg$ff&gcoBI=9)dc!cxtKvrffafd(##Oq}P1Z$dMz%${Bk9`6BW3 z`|0A71Nmb8{(N!tQnBd&y|_x+%%z-CvGGtrl@1%xrH*J)uVVB2mHaaC{0HgcU%T?e zwiAWo<9+#}UE?UxJW<&eUFH2yyn$&)(16HI^PmAR-oE$o#~){Ts;j9H1=isC$S95* z!?}PHPW0yHtAZnnr0u7!iRV_Qi|oP*RaicA_e(JSYUL%2N)?(Ah2a0&;<1n2Woyeb z@{qg)#kqLvu^t|Qg3+WePnLTS|y2#8kH+7uBV%#$;E{TiT zRl${Cq^~i_vO@Kjyd+P_Tk_abJv{;ih*MVcU^j5UgWgkqA@_V(XZ_F^XRl&}SdlI+ zWL1n1dX+zNu}D0-DqUR3uNalo=|=Sk&%M#)C3(uWNFJ-(r9F2G6d01a0dWs-Hy<~Q zha>%LaH1I8ULW9GRQnZ1mJ=EJVA*@N2r@~A$i1cylKXnr6%X}eP|5Hl@|3(KkI8Fy zt#Atzy!bp0x-*95Xu^hb34Yf18;Frz^*6m|6oJb7pR zu(ok=R3UH4V;tnQAsGS%3o`BT);J7H+|_58K{z~!jBtqQBa*~}w^}nzJU%p0JTfpL z9GdR2j^r(QjD+J{JlB245GYWGxo#54KsKSUxK;qog{tnwY;yvrUTY`bUSIrlfbRi$ zfHwfHzW70J-=`Z2#$O&S@F*MU)jtsT$XoK5yms+iw;0`Z6!>2HA~E0e+57(6d&!$6H&DsqHA;0i=zg)`hS~oclYn#&x|_4;c5Qn&6}$TZMq{0 z!f*ZnFU7-uL5b1oe^q?X0d{dQ|FbKiu((22Sc6X9cg{OTt7~w7uXr(YWRlDFwKT~Jl!Hj|%~X$TbZ8Wayt{s;B))&&Zr z;76F4(HHF|Y=qNQO}F4*=?@L>Tt_@Vx`C*rJEm6TTszt!e*c3;qR%b9jbJjTuZ~r% zFRTHT76WBkJAPHXo}gEL6`(MVJb*HS0#5t(lxOXwTF_crCsiz?%i3@{@|Om-t1W(e zeb zN218qty?<~LR_2P((6r!^TjJ0E-UKk84S%v)K5nqxs+2T+`VIzm-c?I*0G94q`lAU z8Fwd%c8!$a*m{pm-@6JMQ7UXqTIzjEEF?&MkkU2t?Jus1Kd-+mHlv>cP2@Fsj&dSh z7^qZa6*$XjhY_IzN$-7=EtYS~DKFwb-{lHU2h>U$##gRZpEj{#^{$HfUB0vfR@~M} z{u|^ta_CVkrX4G2yTRz!7wys#Ez--r&Q^?+QYzb=S|IqxcnE7Zfh0~p*gVFyA&MTa zsLQIi^xDszB+` zBw8fajub_3w_Ld+M?CgUn)m>tCflz^b)vPb(o5yvJ@TBqcjcmBLFQPgbRcOMAMgtm zfhMkQy3;uFV3mF6%WP$Y`Q$*J;C!y7GGJu44imKL?7ZFsHD1prw|DCpv0;Cnn7HJk zSn^f2$XBWV+WJP}Kl_UziQ3x%xt6?_SdfKO76yd!VWgk{g&M~j4@Zf2zRH5fSk-@= ztRS~g%>V2v{(Y4&EguU`KZDx)zP?eOQGiaq(b0BT6c-MS>`3aW4ESEGcoc?BD`YWs zzDDN~D0r?68ZupZ?{l3WC~C!3Sb9JOgIYI;62F0Z`oB;?J2!K$UC?-^M>|7YPBHou zcmhe6=F#HMV;hTK-`6N;AYuQK_rw6Pptk*#k0^4eA);`u$CH5F>)IklyfUtd`1*K( z_&bJS`ihvP%TPVJFXwv}sIg|tG@Fj~%G7b3a`!&hj5vY}fV-w0MBdW_4slk91CA=k zSdVg`;Cu*g*y-xX>8O9(IK^?9sxv`ghIU|72}PiM1NGf3HLM${EDa2YpDqHjnSCuF z={Q&rC?I0uEuNGE1?cI_8~kvRox}yGd%D#XcXq0+Xg~jePY6|Kcf>ULur817S5I)Y z({7@p)5`5RV$B|NDsBI^vErF~8i+a}PQE}|-V_)-xJ zem9OoX+<7E!nzihIiX7D!plBSj00Hi>lrViVaN+MQPuqrLh1^D#GMwStrz8(@o%4p zoE9Uxx4dz5Y7(PZm$hkwaV;@GOvv&Spt$Ti^|*{1Y?lIVf!F}`mu`myhS55LtgyRZ zs?>jjN==P|E4;xP#<|yr`+U5aF177oyZ7P`!h=MWn83LUBP+L!1amqf28acGRka?m z!S6ULK!M++vR*Hdq-{i?u1{qaD?Y0QZq^WdDVqZ1>rkn=fJL9#+X5&UetorTNWVgX-RrB5xfk)}-O@NBXLDF6O04=bx41Q4CxX<5IP_G_a9|?1PN8$M+YT9P>+QS<^7bnZeL|{hn4Lx z%1aI!5*x~hA}{1aqnE9|Pp2d^)CwwN4|t|^gBsl(NBue#<^?k<^}!1_MlLHBuV~d> z;$e|cwntK+iBch$dk2j6*@90{eH>1q^ zd(~A`YP~$=J*v9YVm^eb>q*e&v_cjAelN8yIxq2{n+1vPk%uo9E8cJH5B2_MS+79< zN-Pi?EKB~Slnd-`4|Mre@^4W;O8nHKtq(Ey`;F~ePu$zB4w#$kmbq$`+Q`k3&fGgr zW*UM{HijAsM@N=T$8CR!BWNH6a5ME&VW9#j7)@*gikV7#nlte+`XUHGT2+3i`?)i#v2 zoG&2UK7ftxKZ15+$0C@vPJz587F?t(3(Kh|7r;?~5^STOtW6+)>7Y$;cx%(1=J`6;`cH~K`?#4s;Vi}#Fy!144S6{}2 zE4NZ(4QM!`ItA0Z>#lBAJyT(!0w@?wl#AkG-?ag&Dri+cid7fU188~mMAV9Cf6zvx+|>2KZoi}KN5e5Q78+sXNl`Hc8peXL{6?6Hb8Z~JX%T(~0R*W+KRP(UwD&xx$dmX$gR~~|H@oo0u7jotk;+bmU~Sis z0GB|)b)~5%jR|sdm3uO6z<;^CE=;FfE(oOtn3q;+I)D30cB}@guuuUM2rQ{~j41bFTShGm6Cdr(6UXsE15Z#}2D*V|-YFR%%9zTmpgDS1UDvL03-( zB;@oOYynpCmlyyRcv(Pf@I+2M0FLtrMwMPf5(2*QSx||apZL`a9wY*X;UFlRm?5d^ z+G*9Li=!`A>S36IIX&713~m3aMw26Wrl<(&MT^6H;mVaO+V_Hf%~-6jB4n3YkldME zTiLs8CrH$tBvop&@n}=vmZ|Kyb`zdVoqwRuRTxk(!Sd8V*~%N|&!6XyEksrKb*yww zS$@&fdWfv#AcI)<^0{5V!!c5rC92eumt9msrJDWfhuOTnO{cO+}f&YkR87&WYNoQ5n-VbK8x#V89)|CnM^u<+i9hi7$7EO z-O5LlsZ*yOfSi(^pPwJJ^%O2VaV>&jxTx;BTMwZoqeonXs~sYnyY=eF=nUSHv{Ex% z*J@XIGH>(nH9h4MVt`m6CS*S4KylsJ#9!6WBhy*_%O&?G-%W#ECL7xl6nROv3<88& z(Jv9oQ;+l_E9#}Q>mGLp>Jcr@JPh!!ydtgCla{3k%5A|Q74H=+$TGD+QHB~h^vFbk z_+5aowXx-%*>}Nfp>gokN<{xDyRO*G}n}~ioVMNvS zrc378k8HE=ZZc@1LMpWTEpplo{1ryd&b@gJkHpcuP>R#~tFv6{f zXi2vRHSu$GS=i{MsMHTM!V2{@CAeX#f#bIscL{a=zMPZiazr5()Ol1IQLwmj3<-{1 zyLPSo1$AO8&-LbRT6JF>)3A!Fn+_{8P5D|1^=U`emm{MdslV{iy+y2e4UXS0AU;1g z;cMwO1pNy%5hUb2F+eP+%d1i&j3~>HV9t>vM?}k(E!Al)J)btbz7k}ZoyB;ow3~1< zm3FT#3*BMx$&^r^c4UY3Qv}+p^0NGQJ1op{8>zghwo>!+yZo9eKRNS@A%Xvp6nXBV zcjbxvtpXIF>0N+j4nkc!;gjG{?eCE9Sn^9hlc~e?1ypSTJ9R>Y)8N;mmH!SxjFPm< zVD)zig7W(-%ei=a5!vhA0ab(f@=zM|qU5IapMpN>dM? zOrAXX1iR~x8KTC)uc*^?(^sN)qy4OICrn3l{j{6NWAYmHD01<>N|khXdu`aT;o9iY zqq`z?cfJwmFKtw*mF5OJd1%MliZ;Lie%$-(tEU?6D6>~(nDWk7SA)|8zv9IOG;ia# z$b4v%Vzek8{5Ihecd#A0|5f=)P=0sp*ui*hoOV_{_0&_#^$M*b%*sS~X)c7?A0Ik& z$l1GhZ-?C*!&>3HJUsj%MmBo>gLIDzeMV()dj_W=emaie^_D24$|y_Tz8k3YRENo9 zDb%x^i>M3nF zJST5mLhM@d+^EimK;a9p9{z#92M!!?((5T)=_F#(6C_3<)0-#i53EL;(kTc(hmpzZ zNRz?tU-Fc^Wx0~qMs;ut6j%?x#;CFhfoUDC@8TNe6SDUi%a($x+$W>0=m;3*Cf`|K zdt14tKdjN$*ZFzf7yp%kwGsDPlWxW#a+5qIZ^>iw+FiBW0);O^PWe55_wCykmZQqT zl≷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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_dot.png b/android/app/src/main/res/drawable-xxhdpi/ic_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..03bd2292353baabc37eb08022d1774ddcce4bbb4 GIT binary patch literal 134 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 Eg6N&rX#fBK literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_location_on_black_36px.png b/android/app/src/main/res/drawable-xxhdpi/ic_location_on_black_36px.png new file mode 100644 index 0000000000000000000000000000000000000000..11dfb5cbb586f1b7dea6c4291a5981607c0ccc0e GIT binary patch literal 1502 zcmV<41tI#0P)Px)m`OxIRA>d&npoXKo9 zJusOw=X~G)`|X)C-#N3JhK5U|WYXjuA0NMLVPPRB&8DWNv)$d@7t+#C3_3VC*wWV4 zwl$m0J_^jHOeWLL`5F#Svq=4Xu~^J=KEAZHw0CxP_F!LM-yGN0#S=AloS2w+0OMx? zyPxwF#*P;a3xIz?_06uXuFq|JjX?pt9pTpje9$I9lr6xY(f1<2$D(Y4?Nveh`};3% zZ*PAKz-}C?+6ToA>hKoF^ZEQv;`|q99~*ddbaV|5#fJ#o9Ve1P-w__d$9sEw&qZlP zf{u)g+y>-6M)HOz=QP_H*)tpuktt48(ya)}NL~-*4>&lfrjlcg+RievTNv3t!ur{8 z!_d&sl|b&LeWf9Vl2dFkgt^K<$&K%0v^i|Jg4df{TU*}?$1Az@tSs9|;Gcwz>T%5i zq4~Psi|vmn=>f*|ar*?9zXO(Hzp}N}8JiQFvbz@^=o8;f5KO}YSfD#o(?+w6qRagRl zMeuFf$5?^~i1A#K0F3Hm_#JmZsU!jg@>Mn!yW;@d5AZy9Z4THZ(@SixWJpO@@q{JW zBOdMS?9?7W`%aURnVg(Fg5g~z#z7mVP>bg1+F+w;9p`>*O(7*)bbVB}Eo+rKwKKOW z-12{BW@ZjqIbkdx`P%x4F}t|9XbnoBY3AO7Z9vy&+SX5uStfX!tt0kH=Cl{a+Eet!Op*I;qZG&eWv9m=Y> zJ|#Og69F+gP9)<$p{mlrSGI5Nt`HQ}T9KX3X8tJVZ*SgnJ^N3n>>DLyD$w%-}*Rq+NYGO>v1B4$H_ z59)S~cpddV16so3KTIAN57klT#+}}EJpF z>l!!2#f${)>FLpyY)_5Zg7SOZn87x`9tkQ7p1v1I71nP6zPe#WF%&D#JQkEqv3}5s z6^Iiz?NbcJinFhnp27|+0*6=x%2GzyF3B~Jhe_`DRr8G<(SUOgg7bmvRI09KkBOKO zs5Y*MzGfn5VG%4EO5lldeN1rv}eHU()(vx=SH zZ44?8^4u?s#4g`EVMQ9!vT-+h>O+DVvVeYi+!ks#x&(4R^YUSgZN9QB-8dUXayH+^ z9oXt025d_n&>c8gK`MyVt(Sv}yAW)rs`nbxvIyk%YKc8cED@;0xP4y{_@yY}aJy{f z6K*%XPBKS>+M2H)F<&1EHiqj!ehj33-LSspo>t-!bp?urLP04j?pu~qu1#V{#aix& zI=uR(j#2%V<7%hD{liH9%W((u@?@|*NqxB^>ckWX3H%A5{GS$8S6dp83X%$_gh=3@ z0_SfDRacw(R%PMgdPhgvaNbXhsp(ElO+AyE*rh1+KT6{>A*v=-0ssI207*qoM6N<$ Eg6N&rX#fBK literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/node_icon.png b/android/app/src/main/res/drawable-xxhdpi/node_icon.png index e0a0463fe30d8282d355a4b5ccecdf8d3ebced9d..2a0adbd9da6674d20418880f44be53dce855b1ca 100644 GIT binary patch literal 18418 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 OfUKmFM75Yv;Qs?BL+>R3 diff --git a/android/app/src/main/res/drawable/node_icon.png b/android/app/src/main/res/drawable/node_icon.png deleted file mode 100644 index e0a0463fe30d8282d355a4b5ccecdf8d3ebced9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8387 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 OfUKmFM75Yv;Qs?BL+>R3 diff --git a/android/app/src/main/res/layout/activity_setup_iot_node.xml b/android/app/src/main/res/layout/activity_setup_iot_node.xml index 52f04e8..747ab59 100644 --- a/android/app/src/main/res/layout/activity_setup_iot_node.xml +++ b/android/app/src/main/res/layout/activity_setup_iot_node.xml @@ -41,8 +41,8 @@ android:layout_height="44dp" android:layout_alignTop="@+id/node_view" android:layout_marginTop="45dp" - android:layout_toStartOf="@+id/node_view" android:layout_toLeftOf="@+id/node_view" + android:layout_toStartOf="@+id/node_view" android:background="@drawable/state_grove_indicator_left" android:clickable="true" /> @@ -52,8 +52,8 @@ android:layout_height="44dp" android:layout_alignTop="@+id/node_view" android:layout_marginTop="90dp" - android:layout_toStartOf="@+id/node_view" android:layout_toLeftOf="@+id/node_view" + android:layout_toStartOf="@+id/node_view" android:background="@drawable/state_grove_indicator_left" android:clickable="true" /> @@ -63,8 +63,8 @@ android:layout_height="44dp" android:layout_alignTop="@+id/node_view" android:layout_marginTop="135dp" - android:layout_toStartOf="@+id/node_view" android:layout_toLeftOf="@+id/node_view" + android:layout_toStartOf="@+id/node_view" android:background="@drawable/state_grove_indicator_left" android:clickable="true" /> @@ -118,7 +118,7 @@ android:layout_width="match_parent" android:layout_height="56dp" android:layout_alignParentBottom="true" - android:background="@color/link_text_material_light"> + android:background="@color/cardview_light_background"> diff --git a/android/app/src/main/res/layout/dialog_signin_backup.xml b/android/app/src/main/res/layout/dialog_signin_backup.xml index 4d54d06..178e344 100644 --- a/android/app/src/main/res/layout/dialog_signin_backup.xml +++ b/android/app/src/main/res/layout/dialog_signin_backup.xml @@ -59,7 +59,7 @@ android:background="@drawable/abc_btn_borderless_material" android:text="Forgot your password?" android:textAppearance="?android:attr/textAppearanceSmall" - android:textColor="@color/link_text_material_dark" /> + android:textColor="@color/primary_dark_material_dark" /> - - - - - - - - - - - - - - - \ No newline at end of file + android:layout_height="match_parent"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/main_list_item_back.xml b/android/app/src/main/res/layout/main_list_item_back.xml index e8fddcf..77f47d1 100644 --- a/android/app/src/main/res/layout/main_list_item_back.xml +++ b/android/app/src/main/res/layout/main_list_item_back.xml @@ -1,108 +1,84 @@ - + android:layout_height="88dp" + android:layout_marginBottom="8dp" + android:layout_marginTop="8dp" + android:background="?attr/selectableItemBackground"> - + - + - + - - android:textSize="16sp" - tools:text="Seeed STU Test Node" /> + - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/android/app/src/main/res/menu/ui_node_action.xml b/android/app/src/main/res/menu/ui_node_action.xml index 83a03b9..cd183de 100644 --- a/android/app/src/main/res/menu/ui_node_action.xml +++ b/android/app/src/main/res/menu/ui_node_action.xml @@ -3,13 +3,13 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index 67a6993..033258a 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -6,7 +6,7 @@ #ff33b5e5 - #e91e63 + #bbbbc1 #f8bbd0 #c2185b @color/apptheme_main @@ -33,5 +33,13 @@ #000099 #FF9900 - #ECEFF1 + #ECEFF1 + + + #A4EA32 + #F32E2E + #bbbbc1 + #f88b07 + #f52025 + #ffffff \ No newline at end of file diff --git a/android/app/src/main/res/values/dimens.xml b/android/app/src/main/res/values/dimens.xml index 219754b..9120da3 100644 --- a/android/app/src/main/res/values/dimens.xml +++ b/android/app/src/main/res/values/dimens.xml @@ -4,4 +4,10 @@ 16dp 16dp + + + 5dp + 36dp + 12dp + 12dp diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 1419933..efd2c00 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -97,4 +97,9 @@ Select AP Set Pion One + + " Rename " + " Detail " + " Remove " + From 1600c9581a1512d97b4d17eddccca7d5c0240277 Mon Sep 17 00:00:00 2001 From: Ten Wong Date: Thu, 8 Oct 2015 17:52:29 +0800 Subject: [PATCH 2/3] Added: CirculImageView --- android/app/app.iml | 2 ++ android/app/build.gradle | 1 + .../iot/ui_main/NodeListRecyclerAdapter.java | 19 +++++++++++++++++++ .../seeed/iot/webapi/model/GroverDriver.java | 4 +++- .../src/main/res/layout/main_list_item.xml | 19 +++++++++++-------- 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/android/app/app.iml b/android/app/app.iml index 9e8b8c5..dce2454 100644 --- a/android/app/app.iml +++ b/android/app/app.iml @@ -79,6 +79,7 @@ + @@ -104,6 +105,7 @@ + diff --git a/android/app/build.gradle b/android/app/build.gradle index 9bc12c2..b74766e 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -33,5 +33,6 @@ dependencies { compile "com.google.zxing:android-integration:3.2.0" compile 'com.google.zxing:core:3.2.0' compile "com.daimajia.swipelayout:library:1.1.8@aar" + compile 'de.hdodenhof:circleimageview:2.0.0' } diff --git a/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter.java b/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter.java index 5b13f35..0764a5a 100755 --- a/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter.java +++ b/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter.java @@ -1,7 +1,14 @@ package cc.seeed.iot.ui_main; import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.RectF; import android.support.v7.widget.RecyclerView; import android.util.TypedValue; import android.view.LayoutInflater; @@ -11,12 +18,14 @@ import android.widget.TextView; import com.daimajia.swipe.adapters.RecyclerSwipeAdapter; +import com.koushikdutta.urlimageviewhelper.UrlImageViewHelper; import java.util.ArrayList; import java.util.List; import cc.seeed.iot.R; import cc.seeed.iot.webapi.model.Node; +import de.hdodenhof.circleimageview.CircleImageView; /** * Created by tenwong on 15/6/25. @@ -62,6 +71,10 @@ public void onBindViewHolder(MainViewHolder holder, final int position) { } else { holder.mStatusView.setBackgroundColor(Color.RED); } + + UrlImageViewHelper.setUrlDrawable(holder.mGroveOneView, "http://www.seeedstudio.com/wiki/images/thumb/c/ca/Button.jpg/300px-Button.jpg"); + UrlImageViewHelper.setUrlDrawable(holder.mGroveTwoView, "http://www.seeedstudio.com/wiki/images/6/69/Digital_Light_Sensor.jpg"); +// holder.mGroveOneView.setImageBitmap(); } @Override @@ -114,6 +127,9 @@ public static class MainViewHolder extends RecyclerView.ViewHolder TextView mDetailView; TextView mRemoveView; + ImageView mGroveOneView; + ImageView mGroveTwoView; + public MainViewHolder(View itemView, OnClickListener mOnClickListener) { super(itemView); this.mOnClickListener = mOnClickListener; @@ -129,6 +145,9 @@ public MainViewHolder(View itemView, OnClickListener mOnClickListener) { mDetailView = (TextView) itemView.findViewById(R.id.detail); mRemoveView = (TextView) itemView.findViewById(R.id.remove); + mGroveOneView = (CircleImageView) itemView.findViewById(R.id.grove_image_1); + mGroveTwoView = (CircleImageView) itemView.findViewById(R.id.grove_image_2); + mItemView.setOnClickListener(this); mLocationView.setOnClickListener(this); mFavoriteView.setOnClickListener(this); diff --git a/android/app/src/main/java/cc/seeed/iot/webapi/model/GroverDriver.java b/android/app/src/main/java/cc/seeed/iot/webapi/model/GroverDriver.java index 6a363f8..fb2892a 100755 --- a/android/app/src/main/java/cc/seeed/iot/webapi/model/GroverDriver.java +++ b/android/app/src/main/java/cc/seeed/iot/webapi/model/GroverDriver.java @@ -14,10 +14,12 @@ public class GroverDriver { public String GroveName; public Map> Outputs; public URL ImageURL; + public List Events; public String ClassName; + public Boolean CanGetLastError; public String InterfaceType; public Boolean HasEvent; public String IncludePath; + public int ID; public List ConstructArgList; - } diff --git a/android/app/src/main/res/layout/main_list_item.xml b/android/app/src/main/res/layout/main_list_item.xml index 57ddc30..f303784 100644 --- a/android/app/src/main/res/layout/main_list_item.xml +++ b/android/app/src/main/res/layout/main_list_item.xml @@ -122,8 +122,8 @@ android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginStart="5dp" - android:text="office" android:background="?attr/selectableItemBackgroundBorderless" + android:text="office" android:textAppearance="?android:attr/textAppearanceSmall" android:textSize="14sp" /> @@ -143,23 +143,26 @@ android:textAppearance="?android:attr/textAppearanceSmall" android:textSize="14sp" /> - + android:src="@drawable/node_icon" /> - + android:scaleType="centerCrop" + android:src="@drawable/node_icon" /> - - - Date: Thu, 8 Oct 2015 17:54:53 +0800 Subject: [PATCH 3/3] Del backup file --- .../ui_main/MainScreenActivity_backup.java | 383 ------------------ .../NodeListRecyclerAdapter_backup.java | 146 ------- .../main/res/layout/main_list_item_back.xml | 84 ---- 3 files changed, 613 deletions(-) delete mode 100644 android/app/src/main/java/cc/seeed/iot/ui_main/MainScreenActivity_backup.java delete mode 100755 android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter_backup.java delete mode 100644 android/app/src/main/res/layout/main_list_item_back.xml diff --git a/android/app/src/main/java/cc/seeed/iot/ui_main/MainScreenActivity_backup.java b/android/app/src/main/java/cc/seeed/iot/ui_main/MainScreenActivity_backup.java deleted file mode 100644 index 2e5bdad..0000000 --- a/android/app/src/main/java/cc/seeed/iot/ui_main/MainScreenActivity_backup.java +++ /dev/null @@ -1,383 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * 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 - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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. - */ - -package cc.seeed.iot.ui_main; - -import android.app.AlertDialog; -import android.app.ProgressDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.os.Bundle; -import android.os.Handler; -import android.support.design.widget.FloatingActionButton; -import android.support.design.widget.NavigationView; -import android.support.v4.view.GravityCompat; -import android.support.v4.widget.DrawerLayout; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.app.ActionBar; -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.util.Log; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.EditText; -import android.widget.TextView; -import android.widget.Toast; - -import java.util.ArrayList; - -import cc.seeed.iot.MyApplication; -import cc.seeed.iot.R; -import cc.seeed.iot.datastruct.User; -import cc.seeed.iot.ui_login.SetupActivity; -import cc.seeed.iot.ui_setnode.SetupIotNodeActivity; -import cc.seeed.iot.ui_smartconfig.GoReadyActivity; -import cc.seeed.iot.webapi.IotApi; -import cc.seeed.iot.webapi.IotService; -import cc.seeed.iot.webapi.model.Node; -import cc.seeed.iot.webapi.model.NodeListResponse; -import cc.seeed.iot.webapi.model.NodeResponse; -import retrofit.Callback; -import retrofit.RetrofitError; -import retrofit.client.Response; - -/** - * TODO - */ -public class MainScreenActivity_backup extends AppCompatActivity - implements NodeListRecyclerAdapter_backup.NodeAction { - private final static String TAG = "MainScreenActivity"; - private DrawerLayout mDrawerLayout; - private SwipeRefreshLayout mSwipeRefreshLayout; - private RecyclerView mRecyclerView; - private NodeListRecyclerAdapter mAdapter; - private TextView mEmail; - - private ArrayList nodes; - private User user; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - user = ((MyApplication) MainScreenActivity_backup.this.getApplication()).getUser(); - nodes = ((MyApplication) MainScreenActivity_backup.this.getApplication()).getNodes(); - - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - final ActionBar ab = getSupportActionBar(); - if (ab != null) { - ab.setHomeAsUpIndicator(R.drawable.ic_menu); - ab.setDisplayHomeAsUpEnabled(true); - ab.setTitle("PION ONE"); - } - - mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); - - NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); - if (navigationView != null) { - setupDrawerContent(navigationView); - } - - mRecyclerView = (RecyclerView) findViewById(R.id.listview); - if (mRecyclerView != null) { - mRecyclerView.setHasFixedSize(true); - RecyclerView.LayoutManager layout = new LinearLayoutManager(this); - mRecyclerView.setLayoutManager(layout); - mAdapter = new NodeListRecyclerAdapter(nodes); - mRecyclerView.setAdapter(mAdapter); - setupAdapter(); - } - - mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.activity_main_swipe_refresh_layout); - mSwipeRefreshLayout.setColorSchemeResources(R.color.orange, R.color.green, R.color.blue); - mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - setupAdapter(); - mSwipeRefreshLayout.setRefreshing(false); - } - }, 0); - } - }); - - FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); - fab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - ((MyApplication) getApplication()).setConfigState(true); - Intent intent = new Intent(MainScreenActivity_backup.this, GoReadyActivity.class); - startActivity(intent); - } - }); - - mEmail = (TextView) findViewById(R.id.hd_email); - mEmail.setText(user.email); - - - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.ui_main, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - mDrawerLayout.openDrawer(GravityCompat.START); - return true; - case R.id.update: - setupAdapter(); - return true; - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onBackPressed() { - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.addCategory(Intent.CATEGORY_HOME); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); - } - - private void setupAdapter() { - final ProgressDialog mProgressDialog = new ProgressDialog(this); - mProgressDialog.setMessage("search node list..."); - mProgressDialog.setCanceledOnTouchOutside(false); - mProgressDialog.show(); - - IotApi api = new IotApi(); - User user = ((MyApplication) MainScreenActivity_backup.this.getApplication()).getUser(); - api.setAccessToken(user.user_key); - final IotService iot = api.getService(); - iot.nodesList(new Callback() { - @Override - public void success(NodeListResponse nodeListResponse, Response response) { - mProgressDialog.dismiss(); - if (nodeListResponse.status.equals("200")) { - nodes = (ArrayList) nodeListResponse.nodes; - ArrayList delNodes = new ArrayList(); - for (Node n : nodes) { - if (n.name.equals("node000")) { - iot.nodesDelete(n.node_sn, new Callback() { - @Override - public void success(NodeResponse nodeResponse, Response response) { - - } - - @Override - public void failure(RetrofitError error) { - - } - }); - delNodes.add(n); - } - } - nodes.removeAll(delNodes); - - ((MyApplication) MainScreenActivity_backup.this.getApplication()).setNodes(nodes); - - mAdapter.updateAll(nodes); - - } else { - Toast.makeText(MainScreenActivity_backup.this, nodeListResponse.msg, Toast.LENGTH_LONG).show(); - } - } - - @Override - public void failure(RetrofitError error) { - mProgressDialog.dismiss(); - Toast.makeText(MainScreenActivity_backup.this, "Connect server fail...", Toast.LENGTH_LONG).show(); - } - }); - - } - - private void addItem(Node node) { - nodes.add(node); - ((MyApplication) MainScreenActivity_backup.this.getApplication()).setNodes(nodes); - mAdapter.notifyItemInserted(nodes.size()); - } - - private void removeItem(Node node) { - nodes.remove(node); - mAdapter.notifyItemRemoved(nodes.size()); - } - - private void setupDrawerContent(NavigationView navigationView) { - navigationView.setNavigationItemSelectedListener( - new NavigationView.OnNavigationItemSelectedListener() { - @Override - public boolean onNavigationItemSelected(MenuItem menuItem) { - menuItem.setChecked(true); - mDrawerLayout.closeDrawers(); - switch (menuItem.getItemId()) { - case R.id.nav_nodes_list: - break; - case R.id.nav_smartconfig: { - ((MyApplication) getApplication()).setConfigState(false); - Intent intent = new Intent(MainScreenActivity_backup.this, - GoReadyActivity.class); - startActivity(intent); - } - break; - case R.id.nav_setting: { - Intent intent = new Intent(MainScreenActivity_backup.this, - SettingActivity.class); - startActivity(intent); - } - break; - case R.id.nav_about: { - Intent intent = new Intent(MainScreenActivity_backup.this, - AboutActivity.class); - startActivity(intent); - } - break; - case R.id.nav_logout: { - ((MyApplication) getApplication()).setLoginState(false); - Intent intent = new Intent(MainScreenActivity_backup.this, - SetupActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); - } - break; - } - - return true; - } - }); - } - - @Override - public boolean nodeRemove(final int position) {//todo: rubbish code - - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setCancelable(false); - builder.setTitle("Remove Pion One"); - builder.setMessage("Confirm remove?"); - builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - - final ProgressDialog progressDialog = new ProgressDialog(MainScreenActivity_backup.this); - progressDialog.setMessage("Node delete..."); - progressDialog.setCanceledOnTouchOutside(false); - progressDialog.show(); - final int p = position; - Node node = nodes.get(position); - IotApi api = new IotApi(); - User user = ((MyApplication) MainScreenActivity_backup.this.getApplication()).getUser(); - api.setAccessToken(user.user_key); - final IotService iot = api.getService(); - iot.nodesDelete(node.node_sn, new Callback() { - @Override - public void success(NodeResponse nodeResponse, Response response) { - progressDialog.dismiss(); - nodes.remove(nodeResponse); - ((MyApplication) MainScreenActivity_backup.this.getApplication()).setNodes(nodes); - mAdapter.removeItem(p); - Log.i("iot", "Delete Node success!"); - } - - @Override - public void failure(RetrofitError error) { - progressDialog.dismiss(); - Log.e("iot", "Delete Node fail!"); - } - }); - } - }); - builder.setNegativeButton(R.string.cancel, null); - builder.show(); - - return true; - } - - @Override - public boolean nodeDetail(int position) { - Intent intent = new Intent(this, NodeDetailActivity.class); - intent.putExtra("position", position); - startActivity(intent); - return true; - } - - @Override - public boolean nodeSet(int position) { - Intent intent = new Intent(this, SetupIotNodeActivity.class); - intent.putExtra("position", position); - startActivity(intent); - return true; - } - - @Override - public boolean nodeRename(final int position) { - final LayoutInflater inflater = this.getLayoutInflater(); - final View view = inflater.inflate(R.layout.dialog_name_input, null); - final EditText nameView = (EditText) view.findViewById(R.id.new_name); - - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setCancelable(false); - builder.setTitle("Rename Pion One"); - builder.setView(view); - builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - final String newName = nameView.getText().toString(); - final ProgressDialog progressDialog = new ProgressDialog(MainScreenActivity_backup.this); - progressDialog.setMessage("Node rename..."); - progressDialog.setCanceledOnTouchOutside(false); - progressDialog.show(); - final int p = position; - Node node = nodes.get(position); - IotApi api = new IotApi(); - User user = ((MyApplication) MainScreenActivity_backup.this.getApplication()).getUser(); - api.setAccessToken(user.user_key); - final IotService iot = api.getService(); - iot.nodesRename(newName, node.node_sn, new Callback() { - @Override - public void success(NodeResponse nodeResponse, Response response) { - progressDialog.dismiss(); - setupAdapter(); - } - - @Override - public void failure(RetrofitError error) { - progressDialog.dismiss(); - Log.e("iot", "Delete Node fail!"); - } - }); - } - }); - builder.setNegativeButton(R.string.cancel, null); - builder.show(); - - return true; - } - -} \ No newline at end of file diff --git a/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter_backup.java b/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter_backup.java deleted file mode 100755 index a706bf7..0000000 --- a/android/app/src/main/java/cc/seeed/iot/ui_main/NodeListRecyclerAdapter_backup.java +++ /dev/null @@ -1,146 +0,0 @@ -package cc.seeed.iot.ui_main; - -import android.content.Context; -import android.support.v7.widget.PopupMenu; -import android.support.v7.widget.RecyclerView; -import android.util.TypedValue; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import java.util.ArrayList; -import java.util.List; - -import cc.seeed.iot.R; -import cc.seeed.iot.webapi.model.Node; - -/** - * Created by tenwong on 15/6/25. - */ -public class NodeListRecyclerAdapter_backup extends RecyclerView.Adapter { - private ArrayList nodes; - private Context context; - - private final TypedValue mTypedValue = new TypedValue(); - private int mBackground; - private List mValues; - - public NodeListRecyclerAdapter_backup(ArrayList nodes) { - this.nodes = nodes; - } - - @Override - public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - this.context = parent.getContext(); - View v = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.main_list_item, parent, false); - return new MainViewHolder(v); - } - - @Override - public void onBindViewHolder(MainViewHolder holder, final int position) { - Node node = nodes.get(position); - holder.tv_name.setText(node.name); - - if (node.online) { - holder.mStausView.setImageResource(R.drawable.online_led); - } else { - holder.mStausView.setImageResource(R.drawable.offline_led); - } - } - - @Override - public int getItemCount() { - if (nodes == null) - return 0; - else - return nodes.size(); - } - - public Node getItem(int position) { - return nodes.get(position); - } - - public Node removeItem(int position) { - Node node = nodes.remove(position); - notifyItemRemoved(position); - return node; - } - - public Node updateItem(int position, Node newNode) { - nodes.set(position, newNode); - notifyItemChanged(position); - return newNode; - } - - public boolean updateAll(ArrayList nodes) { - this.nodes = nodes; - notifyDataSetChanged(); - return true; - } - - public static class MainViewHolder extends RecyclerView.ViewHolder - implements PopupMenu.OnMenuItemClickListener, View.OnClickListener { - TextView tv_name; - ImageView pop_menu; - ImageView mStausView; - View mView; - - NodeAction nodeAction; - - public MainViewHolder(View itemView) { - super(itemView); - mView = itemView; - tv_name = (TextView) itemView.findViewById(R.id.txtvName); - pop_menu = (ImageView) itemView.findViewById(R.id.pop_menu); - mStausView = (ImageView) itemView.findViewById(R.id.status_led); - - itemView.setOnClickListener(this); - pop_menu.setOnClickListener(this); - - nodeAction = (NodeAction) mView.getContext(); - } - - @Override - public boolean onMenuItemClick(MenuItem item) { - switch (item.getItemId()) { - case R.id.remove: - nodeAction.nodeRemove(getAdapterPosition()); - return true; - case R.id.detail: - nodeAction.nodeDetail(getAdapterPosition()); - return true; - case R.id.rename: - nodeAction.nodeRename(getAdapterPosition()); - return true; - } - return false; - } - - @Override - public void onClick(View v) { - if (v == pop_menu) { - PopupMenu popupMenu = new PopupMenu(mView.getContext(), v); - popupMenu.setOnMenuItemClickListener(this); - popupMenu.inflate(R.menu.ui_node_action); - popupMenu.show(); - } else if (v == mView) { - nodeAction.nodeSet(getAdapterPosition()); - } - } - } - - public interface NodeAction { - public boolean nodeRemove(int position); - - public boolean nodeDetail(int position); - - public boolean nodeSet(int position); - - public boolean nodeRename(int position); - } - -} diff --git a/android/app/src/main/res/layout/main_list_item_back.xml b/android/app/src/main/res/layout/main_list_item_back.xml deleted file mode 100644 index 77f47d1..0000000 --- a/android/app/src/main/res/layout/main_list_item_back.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file