陈力
2023-05-29 2b270f01facd18f5d2c105e48279482d3ff4b9c8
增加登录、长按进入管理端的功能
12个文件已修改
5个文件已添加
500 ■■■■■ 已修改文件
app/build.gradle 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/lotaai/canguiayw/AdminLoginActivity.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/lotaai/canguiayw/MainActivity.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/lotaai/canguiayw/ManageActivity.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/lotaai/canguiayw/OpenDoorFragment.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/lotaai/canguiayw/SettingFragment.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/lotaai/canguiayw/device/CanGuiCommand.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/lotaai/canguiayw/device/service/CanGuiService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/lotaai/canguiayw/mqtt/MQTTService.java 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoMaster.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoSession.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/lotaai/canguiayw/sqllitedb/Order.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/lotaai/canguiayw/sqllitedb/OrderDetail.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_admin_login.xml 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_main.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/mipmap-hdpi/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle
@@ -66,6 +66,9 @@
    implementation 'com.github.huangyanbin:SmartTable:2.2.0'
   //下拉选择框控件
    implementation 'com.github.arcadefire:nice-spinner:1.3.4'
    //支持MQTT协议
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
app/src/main/AndroidManifest.xml
@@ -24,6 +24,7 @@
        </activity>
        <activity android:name=".TakeActivity"/>
        <activity android:name="ManageActivity"/>
        <activity android:name=".AdminLoginActivity"/>
        <service
            android:name=".device.service.CanGuiService"
app/src/main/java/com/lotaai/canguiayw/AdminLoginActivity.java
New file
@@ -0,0 +1,60 @@
package com.lotaai.canguiayw;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import com.blankj.utilcode.util.LogUtils;
import com.lotaai.canguiayw.device.service.CanGuiService;
public class AdminLoginActivity extends AppCompatActivity {
    private Context context;
    private EditText loginName;
    private EditText loginPwd;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_admin_login);
        context = AdminLoginActivity.this;
        loginName = findViewById(R.id.loginName);
        loginPwd = findViewById(R.id.loginpwd);
    }
    public void confirmLogin(View view){
        Intent intent = new Intent();
        intent.setClass(AdminLoginActivity.this, ManageActivity.class);
        startActivity(intent);
    }
    public void cancelLogin(View view){
        Intent intent = new Intent();
        intent.setClass(AdminLoginActivity.this, MainActivity.class);
        startActivity(intent);
    }
    @Override
    public void finish(){
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(null != this.getCurrentFocus()){
            /**
             * 点击空白位置 隐藏软键盘
             */
            InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
            assert mInputMethodManager != null;
            return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
        }
        return super .onTouchEvent(event);
    }
}
app/src/main/java/com/lotaai/canguiayw/MainActivity.java
@@ -9,6 +9,8 @@
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import com.blankj.utilcode.util.LogUtils;
import com.lotaai.canguiayw.device.CanGuiCommand;
import com.lotaai.canguiayw.device.CanguiStatus;
@@ -20,19 +22,30 @@
public class MainActivity extends AppCompatActivity {
    private Context context;
    private ImageView logoView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LogUtils.i("VERSION.SDK_INT:" +VERSION.SDK_INT);
        logoView = findViewById(R.id.logo);
        context = MainActivity.this;
        Intent startIntent = new Intent(context, CanGuiService.class);
        startService(startIntent);
        logoView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, AdminLoginActivity.class);
                startActivity(intent);
                return true;
            }
        });
    }
    public void gotoSetting(View view){
        Intent intent = new Intent();
        intent.setClass(MainActivity.this, ManageActivity.class);
        intent.setClass(MainActivity.this, AdminLoginActivity.class);
        startActivity(intent);
    }
app/src/main/java/com/lotaai/canguiayw/ManageActivity.java
@@ -3,8 +3,10 @@
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
@@ -205,4 +207,37 @@
        finish();
    }
    public interface MyTouchListener {
        public void onTouchEvent(MotionEvent event);
    }
    // 保存MyTouchListener接口的列表
    private ArrayList<MyTouchListener> myTouchListeners = new ArrayList<ManageActivity.MyTouchListener>();
    /**
     * 提供给Fragment通过getActivity()方法来注册自己的触摸事件的方法
     * @param listener
     */
    public void registerMyTouchListener(MyTouchListener listener) {
        myTouchListeners.add(listener);
    }
    /**
     * 提供给Fragment通过getActivity()方法来取消注册自己的触摸事件的方法
     * @param listener
     */
    public void unRegisterMyTouchListener(MyTouchListener listener) {
        myTouchListeners.remove( listener );
    }
    /**
     * 分发触摸事件给所有注册了MyTouchListener的接口
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        for (MyTouchListener listener : myTouchListeners) {
            listener.onTouchEvent(ev);
        }
        return super.dispatchTouchEvent(ev);
    }
}
app/src/main/java/com/lotaai/canguiayw/OpenDoorFragment.java
@@ -100,7 +100,6 @@
               try {
                   Thread.sleep(1000);
                   showHandler.sendEmptyMessage(1);
                   Log.i(TAG,"在运行");
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }catch (Exception e){
app/src/main/java/com/lotaai/canguiayw/SettingFragment.java
@@ -10,8 +10,10 @@
import android.os.Message;
import android.text.Spannable;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
@@ -52,6 +54,20 @@
        }
        context = container.getContext();
        initSpinner();
        /* Fragment中,注册
                * 接收MainActivity的Touch回调的对象
                * 重写其中的onTouchEvent函数,并进行该Fragment的逻辑处理
                */
        ManageActivity.MyTouchListener myTouchListener = new ManageActivity.MyTouchListener() {
            @Override
            public void onTouchEvent(MotionEvent event) {
                System.out.println("23333333333333333");
            }
        };
        // 将myTouchListener注册到分发列表
        ((ManageActivity)this.getActivity()).registerMyTouchListener(myTouchListener);
        return root;
    }
@@ -73,4 +89,5 @@
            }
        });
    }
}
app/src/main/java/com/lotaai/canguiayw/device/CanGuiCommand.java
@@ -189,15 +189,19 @@
        List<CanguiStatus> list = new ArrayList<>();
        if (recv.length > 0) {
            int guiHao = recv[3] & 0xff;
            for (int i = 1; i <= 9; i++) {
                //开始解析8个格子的状态
            int num = 9;
            if (guiHao == 0){
                num = 8;
            }
            for (int i = 1; i <= num; i++) {
                //开始解析格子的状态
                CanguiStatus status = new CanguiStatus();
                //柜号
                status.setGuiHao(guiHao);
                //格子号
                status.setGridNo(i);
                //温度
                int site = i * 2 + 5;//温度
                int site = (i-1) * 2 + 5;//温度
                int wendu = recv[site] & 0xff;
                status.setWendu(wendu);
                site = site + 1;
app/src/main/java/com/lotaai/canguiayw/device/service/CanGuiService.java
@@ -105,8 +105,8 @@
                        for (int i = 0; i < statuses.size(); i++){
                            CanguiStatus s = statuses.get(i);
                            SettingConfig.getInstance().addStatusInList(s);
//                            LogUtils.i("柜:" + s.getGuiHao(),"格:" + s.getGridNo(),"温度:" + s.getWendu(),
//                                    "门:"+s.isDoorIsOpen(),"加热:"+s.isJiareIsOpen(),"灯光:" + s.isDengGuangIsOpen(),"消毒:" + s.isXiaoDuIsOpen());
                            LogUtils.i("柜:" + s.getGuiHao(),"格:" + s.getGridNo(),"温度:" + s.getWendu(),
                                    "门:"+s.isDoorIsOpen(),"加热:"+s.isJiareIsOpen(),"灯光:" + s.isDengGuangIsOpen(),"消毒:" + s.isXiaoDuIsOpen());
                        }
                    }
                }
app/src/main/java/com/lotaai/canguiayw/mqtt/MQTTService.java
New file
@@ -0,0 +1,181 @@
package com.lotaai.canguiayw.mqtt;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.Nullable;
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
public class MQTTService extends Service {
    public static final String TAG = MQTTService.class.getSimpleName();
    private static MqttAndroidClient client;
    private MqttConnectOptions conOpt;
    private String host = "tcp://xxx";   //服务器地址
    private String userName = "xxx";   //账号
    private String passWord = " xxx";   //密码
    private static String myTopic = "topic";   //频道名
    private String clientId = "mqtt_client";   //客户端ID
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        init();
        return super.onStartCommand(intent, flags, startId);
    }
    public static void publish(String msg) {
        String topic = myTopic;
        Integer qos = 2;
        Boolean retained = false;
        try {
            client.publish(topic, msg.getBytes(), qos.intValue(), retained.booleanValue());
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
    private void init() {
        // 服务器地址(协议+地址+端口号)
        String uri = host;
        client = new MqttAndroidClient(this, uri, clientId);
        // 设置MQTT监听并且接受消息
        client.setCallback(mqttCallback);
        conOpt = new MqttConnectOptions();
        // 清除缓存
        conOpt.setCleanSession(true);
        // 设置超时时间,单位:秒
        conOpt.setConnectionTimeout(10);
        // 心跳包发送间隔,单位:秒
        conOpt.setKeepAliveInterval(20);
        // 用户名
        conOpt.setUserName(userName);
        // 密码
        conOpt.setPassword(passWord.toCharArray());
        // last will message
        boolean doConnect = true;
        String message ="";
        String topic = myTopic;
        Integer qos = 2;
        Boolean retained = false;
        if ((!message.equals("")) || (!topic.equals(""))) {
            // 最后
            try {
                conOpt.setWill(topic, message.getBytes(), qos.intValue(), retained.booleanValue());
            } catch (Exception e) {
                Log.i(TAG, "Exception Occured", e);
                doConnect = false;
                iMqttActionListener.onFailure(null, e);
            }
        }
        if (doConnect) {
            doClientConnection();
        }
    }
    @Override
    public void onDestroy() {
        try {
            client.disconnect();  //服务销毁,断开连接
        } catch (MqttException e) {
            e.printStackTrace();
        }
        super.onDestroy();
    }
    /**
     * 连接MQTT服务器
     */
    private void doClientConnection() {
        if (!client.isConnected() && isConnectIsNomarl()) {
            try {
                client.connect(conOpt, null, iMqttActionListener);
            } catch (MqttException e) {
                e.printStackTrace();
            }
        }
    }
    // MQTT是否连接成功
    private IMqttActionListener iMqttActionListener = new IMqttActionListener() {
        @Override
        public void onSuccess(IMqttToken arg0) {
            Log.i(TAG, "连接成功 ");
            try {
                // 订阅myTopic话题,当订阅多条频道,需要遍历逐条订阅,否则有可能订阅失败
                client.subscribe(myTopic, 1);
            } catch (MqttException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void onFailure(IMqttToken arg0, Throwable arg1) {
            arg1.printStackTrace();
            // 连接失败,重连
        }
    };
    // MQTT监听并且接受消息
    private MqttCallback mqttCallback = new MqttCallback() {
        @Override
        public void messageArrived(String topic, MqttMessage message) throws Exception {
            String str1 = new String(message.getPayload());
            String str2 = topic + ";qos:" + message.getQos() + ";retained:" + message.isRetained();
            Log.i(TAG, "messageArrived:" + str1);
            Log.i(TAG, str2);
        }
        @Override
        public void deliveryComplete(IMqttDeliveryToken arg0) {
        }
        @Override
        public void connectionLost(Throwable arg0) {
            // 失去连接,重连
        }
    };
    /**
     * 判断网络是否连接
     */
    private boolean isConnectIsNomarl() {
        ConnectivityManager connectivityManager = (ConnectivityManager) this.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = connectivityManager.getActiveNetworkInfo();
        if (info != null && info.isAvailable()) {
            String name = info.getTypeName();
            Log.i(TAG, "MQTT当前网络名称:" + name);
            return true;
        } else {
            Log.i(TAG, "MQTT 没有可用网络");
            return false;
        }
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}
app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoMaster.java
@@ -22,12 +22,14 @@
    /** Creates underlying database table using DAOs. */
    public static void createAllTables(Database db, boolean ifNotExists) {
        OrderDao.createTable(db, ifNotExists);
        OrderDetailDao.createTable(db, ifNotExists);
        TestDao.createTable(db, ifNotExists);
    }
    /** Drops underlying database table using DAOs. */
    public static void dropAllTables(Database db, boolean ifExists) {
        OrderDao.dropTable(db, ifExists);
        OrderDetailDao.dropTable(db, ifExists);
        TestDao.dropTable(db, ifExists);
    }
@@ -48,6 +50,7 @@
    public DaoMaster(Database db) {
        super(db, SCHEMA_VERSION);
        registerDaoClass(OrderDao.class);
        registerDaoClass(OrderDetailDao.class);
        registerDaoClass(TestDao.class);
    }
app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoSession.java
@@ -9,9 +9,11 @@
import org.greenrobot.greendao.internal.DaoConfig;
import com.lotaai.canguiayw.sqllitedb.Order;
import com.lotaai.canguiayw.sqllitedb.OrderDetail;
import com.lotaai.canguiayw.sqllitedb.Test;
import com.lotaai.canguiayw.sqllitedb.OrderDao;
import com.lotaai.canguiayw.sqllitedb.OrderDetailDao;
import com.lotaai.canguiayw.sqllitedb.TestDao;
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
@@ -24,9 +26,11 @@
public class DaoSession extends AbstractDaoSession {
    private final DaoConfig orderDaoConfig;
    private final DaoConfig orderDetailDaoConfig;
    private final DaoConfig testDaoConfig;
    private final OrderDao orderDao;
    private final OrderDetailDao orderDetailDao;
    private final TestDao testDao;
    public DaoSession(Database db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig>
@@ -36,18 +40,24 @@
        orderDaoConfig = daoConfigMap.get(OrderDao.class).clone();
        orderDaoConfig.initIdentityScope(type);
        orderDetailDaoConfig = daoConfigMap.get(OrderDetailDao.class).clone();
        orderDetailDaoConfig.initIdentityScope(type);
        testDaoConfig = daoConfigMap.get(TestDao.class).clone();
        testDaoConfig.initIdentityScope(type);
        orderDao = new OrderDao(orderDaoConfig, this);
        orderDetailDao = new OrderDetailDao(orderDetailDaoConfig, this);
        testDao = new TestDao(testDaoConfig, this);
        registerDao(Order.class, orderDao);
        registerDao(OrderDetail.class, orderDetailDao);
        registerDao(Test.class, testDao);
    }
    
    public void clear() {
        orderDaoConfig.clearIdentityScope();
        orderDetailDaoConfig.clearIdentityScope();
        testDaoConfig.clearIdentityScope();
    }
@@ -55,6 +65,10 @@
        return orderDao;
    }
    public OrderDetailDao getOrderDetailDao() {
        return orderDetailDao;
    }
    public TestDao getTestDao() {
        return testDao;
    }
app/src/main/java/com/lotaai/canguiayw/sqllitedb/Order.java
@@ -13,7 +13,7 @@
    @NotNull
    private String gridNo;
    @NotNull
    private int state;//0--空闲  1-占用 2-锁定
    private int state;//状态;0-未存餐 1-已存餐 2-已取餐 3-取消
    private long putInDate;
    private String takeCode;
    @Generated(hash = 2118332125)
app/src/main/java/com/lotaai/canguiayw/sqllitedb/OrderDetail.java
New file
@@ -0,0 +1,50 @@
package com.lotaai.canguiayw.sqllitedb;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.NotNull;
import org.greenrobot.greendao.annotation.Generated;
@Entity
public class OrderDetail {
    @Id
    private long id;
    @NotNull
    private String orderNo;
    private String itemName;
    private int num;
    @Generated(hash = 1442626585)
    public OrderDetail(long id, @NotNull String orderNo, String itemName, int num) {
        this.id = id;
        this.orderNo = orderNo;
        this.itemName = itemName;
        this.num = num;
    }
    @Generated(hash = 268085433)
    public OrderDetail() {
    }
    public long getId() {
        return this.id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getOrderNo() {
        return this.orderNo;
    }
    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }
    public String getItemName() {
        return this.itemName;
    }
    public void setItemName(String itemName) {
        this.itemName = itemName;
    }
    public int getNum() {
        return this.num;
    }
    public void setNum(int num) {
        this.num = num;
    }
}
app/src/main/res/layout/activity_admin_login.xml
New file
@@ -0,0 +1,94 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/bgcolor"
    android:layout_gravity="center"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="120dp"
        android:layout_gravity="center"
        android:layout_marginTop="200dp"
        android:orientation="horizontal">
        <TextView
            android:layout_width="150dp"
            android:layout_height="80dp"
            android:gravity="right|center_vertical"
            android:text="账号:"
            android:layout_margin="10dp"
            android:textColor="@color/white"
            android:textSize="30dp" />
        <EditText
            android:id="@+id/loginName"
            android:layout_width="300dp"
            android:layout_height="80dp"
            android:layout_margin="10dp"
            android:gravity="center"
            android:background="@drawable/round_editstyle"
            android:hint="账号"
            android:textColorHint="@color/white"
            android:textAlignment="center"
            android:textColor="@color/white"
            android:textSize="30dp" />
    </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="120dp"
            android:layout_gravity="center"
            android:orientation="horizontal">
        <TextView
            android:layout_width="150dp"
            android:layout_height="80dp"
            android:layout_margin="10dp"
            android:gravity="right|center_vertical"
            android:text="密码:"
            android:textColor="@color/white"
            android:textSize="30dp" />
        <EditText
            android:id="@+id/loginpwd"
            android:layout_width="300dp"
            android:layout_height="80dp"
            android:layout_margin="10dp"
            android:gravity="center"
            android:background="@drawable/round_editstyle"
            android:hint="密码"
            android:textColorHint="@color/white"
            android:textAlignment="center"
            android:inputType="textPassword"
            android:textColor="@color/white"
            android:textSize="30dp" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="540dp"
        android:layout_height="120dp"
        android:layout_gravity="center"
        android:layout_marginTop="50dp"
        android:orientation="horizontal">
        <Button
            android:id="@+id/jihuo"
            android:layout_width="250dp"
            android:layout_height="80dp"
            android:textSize="30dp"
            android:layout_margin="10dp"
            android:layout_gravity="center"
            android:gravity="center"
            android:onClick="confirmLogin"
            android:background="@drawable/circular_button"
            android:text="登录"/>
        <Button
            android:id="@+id/save"
            android:layout_width="250dp"
            android:layout_height="80dp"
            android:textSize="30dp"
            android:layout_margin="10dp"
            android:layout_gravity="center"
            android:gravity="center"
            android:onClick="cancelLogin"
            android:background="@drawable/circular_button_blue"
            android:text="返回"/>
    </LinearLayout>
</LinearLayout>
app/src/main/res/layout/activity_main.xml
@@ -9,6 +9,7 @@
    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
@@ -24,6 +25,15 @@
        app:pressedTranslationZ="5dp"
        app:rippleColor="@color/DarkGray" />
    <ImageView
        android:id="@+id/logo"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:scaleType="center"
        android:layout_marginTop="50dp"
        android:layout_marginLeft="50dp"
        android:src="@mipmap/logo"/>
   <LinearLayout
       android:layout_width="450dp"
       android:layout_height="450dp"
app/src/main/res/mipmap-hdpi/logo.png