Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

쨍쨍

#3. AI Smart Home_MainActivity 본문

프로그래밍 코드/Android Studio

#3. AI Smart Home_MainActivity

이선선 2024. 3. 13. 03:04

[ Main 화면 ]

 

 

Main화면 UI

 

 

 

[ activity_main.xml ]

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ImageView
        android:layout_width="360dp"
        android:layout_height="90dp"
        android:layout_gravity="center"
        android:background="@drawable/ikon2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.49"
        app:layout_constraintStart_toStartOf="parent"
        tools:layout_editor_absoluteY="34dp" />

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="350dp"
        android:layout_height="90dp"
        android:layout_gravity="center"
        android:background="@drawable/edge"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.508"
        app:layout_constraintStart_toStartOf="parent"
        tools:layout_editor_absoluteY="134dp">

        <ImageView
            android:id="@+id/weather_sky"
            android:layout_width="80dp"
            android:layout_height="60dp"
            android:contentDescription="@string/weather_image_description"
            android:layout_gravity="center"
            android:layout_marginStart="10dp"
            android:src="@drawable/default_weather" />

        <TextView
            android:layout_width="150dp"
            android:layout_height="80dp"
            android:layout_gravity="center"
            android:gravity="center"
            android:text="오늘의 날씨"
            android:layout_marginStart="10dp"
            android:textColor="@color/black"
            android:textSize="30sp" />

        <ImageView
            android:id="@+id/weather_pty"
            android:layout_width="80dp"
            android:layout_height="60dp"
            android:layout_gravity="center"
            android:contentDescription="@string/weather_image_description"
            android:layout_marginStart="10dp"
            android:src="@drawable/default_weather" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="350dp"
        android:layout_height="220dp"
        android:layout_gravity="center"
        android:orientation="horizontal"
        android:layout_marginTop="5dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.508"
        app:layout_constraintStart_toStartOf="parent"
        tools:layout_editor_absoluteY="234dp">

        <LinearLayout
            android:layout_width="170dp"
            android:layout_height="220dp"
            android:layout_gravity="center"
            android:layout_marginEnd="5dp"
            android:background="@drawable/edge"
            android:orientation="horizontal">

            <LinearLayout
                android:layout_width="85dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:orientation="vertical">

                <ImageView
                    android:layout_width="85dp"
                    android:layout_height="90dp"
                    android:layout_marginTop="10dp"
                    android:layout_marginLeft="5dp"
                    android:src="@drawable/temperature" />

                <ImageView
                    android:layout_width="85dp"
                    android:layout_height="90dp"
                    android:layout_marginTop="20dp"
                    android:src="@drawable/humidity" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="85dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:orientation="vertical">

                <TextView
                    android:layout_width="75dp"
                    android:layout_height="50dp"
                    android:layout_gravity="center"
                    android:layout_marginTop="5dp"
                    android:gravity="center"
                    android:text="온도"
                    android:textColor="@color/black"
                    android:textSize="24sp" />

                <TextView
                    android:id="@+id/tempTextView"
                    android:layout_width="75dp"
                    android:layout_height="50dp"
                    android:layout_gravity="center"
                    android:gravity="center"
                    android:text="  "
                    android:textColor="@color/black"
                    android:textSize="24sp" />

                <TextView
                    android:layout_width="75dp"
                    android:layout_height="50dp"
                    android:layout_gravity="center"
                    android:layout_marginTop="10dp"
                    android:gravity="center"
                    android:text="습도"
                    android:textColor="@color/black"
                    android:textSize="24sp" />

                <TextView
                    android:id="@+id/rehTextView"
                    android:layout_width="80dp"
                    android:layout_height="50dp"
                    android:layout_gravity="center"
                    android:gravity="center"
                    android:text="  "
                    android:textColor="@color/black"
                    android:textSize="24sp" />
            </LinearLayout>

        </LinearLayout>

        <LinearLayout
            android:layout_width="170dp"
            android:layout_height="220dp"
            android:layout_gravity="center"
            android:layout_marginStart="5dp"
            android:background="@drawable/edge"
            android:orientation="horizontal">

            <LinearLayout
                android:layout_width="84dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:orientation="vertical">

                <ImageView
                    android:id="@+id/uv_image"
                    android:layout_width="68dp"
                    android:layout_height="82dp"
                    android:layout_gravity="center"
                    android:layout_marginTop="10dp"
                    android:src="@drawable/uv" />

                <ImageView
                    android:id="@+id/dust_image"
                    android:layout_width="70dp"
                    android:layout_height="90dp"
                    android:layout_gravity="center"
                    android:layout_marginStart="5dp"
                    android:layout_marginTop="20dp"
                    android:src="@drawable/rain1" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="86dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:orientation="vertical">

                <TextView
                    android:layout_width="75dp"
                    android:layout_height="50dp"
                    android:layout_gravity="center"
                    android:layout_marginTop="5dp"
                    android:gravity="center"
                    android:text="자외선"
                    android:textColor="@color/black"
                    android:textSize="24sp" />

                <TextView
                    android:id="@+id/uvTextView"
                    android:layout_width="75dp"
                    android:layout_height="50dp"
                    android:gravity="center"
                    android:text="  "
                    android:textColor="@color/black"
                    android:textSize="24sp" />

                <TextView
                    android:layout_width="90dp"
                    android:layout_height="50dp"
                    android:layout_gravity="center"
                    android:layout_marginTop="10dp"
                    android:gravity="center"
                    android:text="강수확률"
                    android:textColor="@color/black"
                    android:textSize="22sp" />

                <TextView
                    android:id="@+id/popTextView"
                    android:layout_width="75dp"
                    android:layout_height="50dp"
                    android:layout_gravity="center"
                    android:gravity="center"
                    android:text="  "
                    android:textColor="@color/black"
                    android:textSize="20sp" />
            </LinearLayout>
        </LinearLayout>

    </LinearLayout>
    <LinearLayout
        android:layout_width="350dp"
        android:layout_height="225dp"
        android:layout_gravity="center"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.508"
        app:layout_constraintStart_toStartOf="parent"
        tools:layout_editor_absoluteY="461dp">

        <LinearLayout
            android:layout_width="170dp"
            android:layout_height="220dp"
            android:layout_gravity="center"
            android:layout_marginEnd="5dp"
            android:orientation="vertical">

            <LinearLayout
                android:id="@+id/home_btn"
                android:layout_width="170dp"
                android:layout_height="100dp"
                android:layout_marginTop="5dp"
                android:layout_marginBottom="5dp"
                android:background="@drawable/edge"
                android:orientation="horizontal">

                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:layout_marginStart="10dp"
                    android:layout_marginTop="10dp"
                    android:src="@drawable/home" />

                <TextView
                    android:layout_width="80dp"
                    android:layout_height="50dp"
                    android:layout_gravity="center"
                    android:layout_marginTop="5dp"
                    android:gravity="center"
                    android:text="home"
                    android:textColor="@color/black"
                    android:textSize="24sp" />
            </LinearLayout>

            <LinearLayout
                android:id="@+id/mode_btn"
                android:layout_width="170dp"
                android:layout_height="100dp"
                android:layout_marginTop="5dp"
                android:clickable="true"
                android:focusable="true"
                android:background="@drawable/edge"
                android:orientation="horizontal">

                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:layout_marginStart="10dp"
                    android:layout_marginTop="10dp"
                    android:src="@drawable/mode" />

                <TextView
                    android:layout_width="80dp"
                    android:layout_height="50dp"
                    android:layout_gravity="center"
                    android:layout_marginTop="5dp"
                    android:gravity="center"
                    android:text="mode"
                    android:textColor="@color/black"
                    android:textSize="24sp" />
            </LinearLayout>
        </LinearLayout>

        <LinearLayout
            android:layout_width="172dp"
            android:layout_height="225dp"
            android:layout_gravity="center"
            android:layout_marginStart="5dp"
            android:layout_marginEnd="5dp"
            android:orientation="vertical">

            <LinearLayout
                android:id="@+id/cctv_btn"
                android:layout_width="170dp"
                android:layout_height="100dp"
                android:layout_marginTop="8dp"
                android:layout_marginBottom="5dp"
                android:background="@drawable/edge"
                android:orientation="horizontal"
                android:clickable="true"
                android:focusable="true">

                <ImageView
                    android:layout_width="70dp"
                    android:layout_height="83dp"
                    android:layout_marginStart="10dp"
                    android:layout_marginTop="10dp"
                    android:src="@drawable/cctv" />

                <TextView
                    android:layout_width="80dp"
                    android:layout_height="50dp"
                    android:layout_gravity="center"
                    android:layout_marginTop="5dp"
                    android:gravity="center"
                    android:text="cctv"
                    android:textColor="@color/black"
                    android:textSize="24sp" />

            </LinearLayout>

            <LinearLayout
                android:id="@+id/tip_btn"
                android:layout_width="170dp"
                android:layout_height="100dp"
                android:layout_marginTop="5dp"
                android:background="@drawable/edge"
                android:orientation="horizontal"
                android:clickable="true"
                android:focusable="true">

                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:layout_marginStart="10dp"
                    android:layout_marginTop="10dp"
                    android:src="@drawable/tip" />

                <TextView
                    android:layout_width="80dp"
                    android:layout_height="50dp"
                    android:layout_gravity="center"
                    android:layout_marginTop="5dp"
                    android:gravity="center"
                    android:text="tip"
                    android:textColor="@color/black"
                    android:textSize="24sp" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

 

 

 

 

[ MainActivity.java ]

 

 

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements SocketActivity.OnDataReceivedListener {

    private static final String TAG = "MainActivity";
    private LinearLayout homeLayout, tipLayout, graphLayout, cctvLayout, modeLayout;
    private ImageView weatherSkyImageView, weatherPtyImageView;
    private TextView tempTextView, rehTextView, uvTextView, popTextView;
    private SocketActivity socketActivity;
    private Handler uiHandler;



    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        // UI 요소 초기화
        homeLayout = findViewById(R.id.home_btn);
        tipLayout = findViewById(R.id.tip_btn);
        modeLayout = findViewById(R.id.mode_btn);
        cctvLayout = findViewById(R.id.cctv_btn);
        tempTextView = findViewById(R.id.tempTextView);
        rehTextView = findViewById(R.id.rehTextView);
        uvTextView = findViewById(R.id.uvTextView);
        popTextView = findViewById(R.id.popTextView);

        weatherSkyImageView = findViewById(R.id.weather_sky); // SKY 데이터 ImageView
        weatherPtyImageView = findViewById(R.id.weather_pty); // PTY 데이터 ImageView

        uiHandler = new Handler(Looper.getMainLooper());

        // 버튼 클릭 리스너 설정
        setButtonListeners();

        // SocketActivity 인스턴스 가져오기 및 서버 연결 및 데이터 수신
        socketActivity = SocketActivity.getInstance();
        socketActivity.connectToServer(this);  // 서버 연결 및 데이터 수신 시작
        Log.d(TAG, "Attempting to connect to server...");
    }

    // 서버에서 데이터 수신 시 호출되는 메서드
    @Override
    public void onDataReceived(String data) {
        Log.d(TAG, "Data received: " + data);

        uiHandler.post(() -> parseAndSetData(data));


    }

    private void showAlertForBtnOn() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        // 커스텀 레이아웃 인플레이션
        LayoutInflater inflater = getLayoutInflater();
        View dialogView = inflater.inflate(R.layout.emergency, null);

        // AlertDialog에 커스텀 레이아웃 설정
        builder.setView(dialogView)
                .setTitle("알림")
                .setPositiveButton("확인", (dialog, which) -> dialog.dismiss())
                .show();
    }

    // 데이터를 파싱하고 UI에 설정하는 메서드
    private void parseAndSetData(String data) {
        Log.d(TAG, "Parsing data: " + data); // 데이터 파싱 로그 추가

        runOnUiThread(() -> {
            if (data.startsWith("TEMP:")) {  // 온도 데이터
                String TEMP = data.substring("TEMP:".length()).trim();
                tempTextView.setText(TEMP + " °C"); // 온도 설정
            } else if (data.startsWith("REH:")) {  // 습도 데이터
                String reh = data.substring("REH:".length()).trim();
                rehTextView.setText(reh + " %"); // 습도 설정
            } else if (data.startsWith("UV:")) {  // 자외선 데이터
                String uv = data.substring("UV:".length()).trim();
                uvTextView.setText(uv); // 자외선 설정
            } else if (data.startsWith("POP:")) {  // 미세먼지 데이터
                String POP = data.substring("POP:".length()).trim();
                popTextView.setText(POP + " %"); // 자외선 설정
            } else if (data.startsWith("SKY:")) {
                String sky = data.substring("SKY:".length()).trim();
                updateSkyImage(sky);
            } else if (data.startsWith("PTY:")) {
                String pty = data.substring("PTY:".length()).trim();
                updatePtyImage(pty);
            }
        });
    }

    private void updateSkyImage(String sky) {
        int imageResId = R.drawable.nope;
        if (sky != null) {
            switch (sky) {
                case "맑음":
                    imageResId = R.drawable.weather_sun;
                    break;
                case "구름많음":
                    imageResId = R.drawable.weather_cloudy;
                    break;
                case "흐림":
                    imageResId = R.drawable.weather_mcloudy;
                    break;
            }
        }
        weatherSkyImageView.setImageResource(imageResId);
    }

    private void updatePtyImage(String pty) {

        int imageResId = R.drawable.nope; // 기본값을 nope 이미지로 설정

        if (pty != null) {
            switch (pty) {
                case "비":
                case "소나기":
                    imageResId = R.drawable.weather_rain;
                    break;
                case "눈":
                case "진눈깨비":
                    imageResId = R.drawable.weather_snow;
                    break;
            }
        }
        weatherPtyImageView.setImageResource(imageResId);
    }

    // 버튼 클릭 리스너 설정 메서드
    private void setButtonListeners() {
        homeLayout.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, HomeActivity.class)));
        tipLayout.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, TipActivity.class)));
        modeLayout.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, ModeActivity.class)));
        cctvLayout.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, CctvActivity.class)));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // MainActivity 종료 시 서버 연결 해제
        if (socketActivity != null) {
            socketActivity.disconnect();
        }
    }
}