Showing
82 changed files
with
3009 additions
and
0 deletions
android/smartwindow/.gitignore
0 → 100644
1 | +<component name="ProjectCodeStyleConfiguration"> | ||
2 | + <code_scheme name="Project" version="173"> | ||
3 | + <Objective-C-extensions> | ||
4 | + <file> | ||
5 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" /> | ||
6 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" /> | ||
7 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" /> | ||
8 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" /> | ||
9 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" /> | ||
10 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" /> | ||
11 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" /> | ||
12 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" /> | ||
13 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" /> | ||
14 | + </file> | ||
15 | + <class> | ||
16 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" /> | ||
17 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" /> | ||
18 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" /> | ||
19 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" /> | ||
20 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" /> | ||
21 | + <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" /> | ||
22 | + </class> | ||
23 | + <extensions> | ||
24 | + <pair source="cpp" header="h" fileNamingConvention="NONE" /> | ||
25 | + <pair source="c" header="h" fileNamingConvention="NONE" /> | ||
26 | + </extensions> | ||
27 | + </Objective-C-extensions> | ||
28 | + </code_scheme> | ||
29 | +</component> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
android/smartwindow/.idea/gradle.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<project version="4"> | ||
3 | + <component name="GradleSettings"> | ||
4 | + <option name="linkedExternalProjectsSettings"> | ||
5 | + <GradleProjectSettings> | ||
6 | + <option name="distributionType" value="DEFAULT_WRAPPED" /> | ||
7 | + <option name="externalProjectPath" value="$PROJECT_DIR$" /> | ||
8 | + <option name="modules"> | ||
9 | + <set> | ||
10 | + <option value="$PROJECT_DIR$" /> | ||
11 | + <option value="$PROJECT_DIR$/app" /> | ||
12 | + </set> | ||
13 | + </option> | ||
14 | + <option name="resolveModulePerSourceSet" value="false" /> | ||
15 | + </GradleProjectSettings> | ||
16 | + </option> | ||
17 | + </component> | ||
18 | +</project> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
android/smartwindow/.idea/misc.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<project version="4"> | ||
3 | + <component name="NullableNotNullManager"> | ||
4 | + <option name="myDefaultNullable" value="android.support.annotation.Nullable" /> | ||
5 | + <option name="myDefaultNotNull" value="android.support.annotation.NonNull" /> | ||
6 | + <option name="myNullables"> | ||
7 | + <value> | ||
8 | + <list size="7"> | ||
9 | + <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" /> | ||
10 | + <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" /> | ||
11 | + <item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" /> | ||
12 | + <item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" /> | ||
13 | + <item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" /> | ||
14 | + <item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" /> | ||
15 | + <item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" /> | ||
16 | + </list> | ||
17 | + </value> | ||
18 | + </option> | ||
19 | + <option name="myNotNulls"> | ||
20 | + <value> | ||
21 | + <list size="6"> | ||
22 | + <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" /> | ||
23 | + <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" /> | ||
24 | + <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" /> | ||
25 | + <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" /> | ||
26 | + <item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" /> | ||
27 | + <item index="5" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" /> | ||
28 | + </list> | ||
29 | + </value> | ||
30 | + </option> | ||
31 | + </component> | ||
32 | + <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK"> | ||
33 | + <output url="file://$PROJECT_DIR$/build/classes" /> | ||
34 | + </component> | ||
35 | + <component name="ProjectType"> | ||
36 | + <option name="id" value="Android" /> | ||
37 | + </component> | ||
38 | +</project> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
2 | +<project version="4"> | ||
3 | + <component name="RunConfigurationProducerService"> | ||
4 | + <option name="ignoredProducers"> | ||
5 | + <set> | ||
6 | + <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" /> | ||
7 | + <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" /> | ||
8 | + <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" /> | ||
9 | + </set> | ||
10 | + </option> | ||
11 | + </component> | ||
12 | +</project> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
android/smartwindow/app/.gitignore
0 → 100644
1 | +/build |
android/smartwindow/app/build.gradle
0 → 100644
1 | +apply plugin: 'com.android.application' | ||
2 | + | ||
3 | +android { | ||
4 | + compileSdkVersion 26 | ||
5 | + defaultConfig { | ||
6 | + applicationId "com.example.suemin.smartwindow" | ||
7 | + minSdkVersion 24 | ||
8 | + targetSdkVersion 26 | ||
9 | + versionCode 1 | ||
10 | + versionName "1.0" | ||
11 | + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" | ||
12 | + } | ||
13 | + buildTypes { | ||
14 | + release { | ||
15 | + minifyEnabled false | ||
16 | + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' | ||
17 | + } | ||
18 | + } | ||
19 | +} | ||
20 | + | ||
21 | +dependencies { | ||
22 | + implementation fileTree(dir: 'libs', include: ['*.jar']) | ||
23 | + implementation 'com.android.support:appcompat-v7:26.+' | ||
24 | + implementation 'com.android.support:design:26.+' | ||
25 | + implementation 'com.android.support.constraint:constraint-layout:1.1.3' | ||
26 | + implementation 'com.android.support:support-v4:26.1.0' | ||
27 | + implementation 'com.android.support:recyclerview-v7:26.1.0' | ||
28 | + testImplementation 'junit:junit:4.12' | ||
29 | + androidTestImplementation 'com.android.support.test:runner:1.0.2' | ||
30 | + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' | ||
31 | +} |
android/smartwindow/app/proguard-rules.pro
0 → 100644
1 | +# Add project specific ProGuard rules here. | ||
2 | +# You can control the set of applied configuration files using the | ||
3 | +# proguardFiles setting in build.gradle. | ||
4 | +# | ||
5 | +# For more details, see | ||
6 | +# http://developer.android.com/guide/developing/tools/proguard.html | ||
7 | + | ||
8 | +# If your project uses WebView with JS, uncomment the following | ||
9 | +# and specify the fully qualified class name to the JavaScript interface | ||
10 | +# class: | ||
11 | +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { | ||
12 | +# public *; | ||
13 | +#} | ||
14 | + | ||
15 | +# Uncomment this to preserve the line number information for | ||
16 | +# debugging stack traces. | ||
17 | +#-keepattributes SourceFile,LineNumberTable | ||
18 | + | ||
19 | +# If you keep the line number information, uncomment this to | ||
20 | +# hide the original source file name. | ||
21 | +#-renamesourcefileattribute SourceFile |
1 | +package com.example.suemin.smartwindow; | ||
2 | + | ||
3 | +import android.content.Context; | ||
4 | +import android.support.test.InstrumentationRegistry; | ||
5 | +import android.support.test.runner.AndroidJUnit4; | ||
6 | + | ||
7 | +import org.junit.Test; | ||
8 | +import org.junit.runner.RunWith; | ||
9 | + | ||
10 | +import static org.junit.Assert.*; | ||
11 | + | ||
12 | +/** | ||
13 | + * Instrumented test, which will execute on an Android device. | ||
14 | + * | ||
15 | + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | ||
16 | + */ | ||
17 | +@RunWith(AndroidJUnit4.class) | ||
18 | +public class ExampleInstrumentedTest { | ||
19 | + @Test | ||
20 | + public void useAppContext() { | ||
21 | + // Context of the app under test. | ||
22 | + Context appContext = InstrumentationRegistry.getTargetContext(); | ||
23 | + | ||
24 | + assertEquals("com.example.suemin.smartwindow", appContext.getPackageName()); | ||
25 | + } | ||
26 | +} |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + package="com.example.suemin.smartwindow"> | ||
4 | + | ||
5 | + <uses-permission android:name="android.permission.INTERNET" /> | ||
6 | + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> | ||
7 | + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> | ||
8 | + <uses-permission android:name="android.permission.BLUETOOTH" /> | ||
9 | + <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> | ||
10 | + | ||
11 | + <uses-feature | ||
12 | + android:name="android.hardware.bluetooth_le" | ||
13 | + android:required="true" /> | ||
14 | + | ||
15 | + <application | ||
16 | + android:allowBackup="true" | ||
17 | + android:icon="@mipmap/ic_launcher" | ||
18 | + android:label="@string/app_name" | ||
19 | + android:roundIcon="@mipmap/ic_launcher_round" | ||
20 | + android:supportsRtl="true" | ||
21 | + android:theme="@style/AppTheme"> | ||
22 | + <activity | ||
23 | + android:name="com.example.suemin.smartwindow.view.MainActivity" | ||
24 | + android:label="@string/app_name"> | ||
25 | + <intent-filter> | ||
26 | + <action android:name="android.intent.action.MAIN" /> | ||
27 | + | ||
28 | + <category android:name="android.intent.category.LAUNCHER" /> | ||
29 | + </intent-filter> | ||
30 | + </activity> | ||
31 | + <service android:name="com.example.suemin.smartwindow.view.bluetooth.BluetoothLeService"/> | ||
32 | + </application> | ||
33 | + | ||
34 | +</manifest> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +# Created by .ignore support plugin (hsz.mobi) | ||
2 | +### Android template | ||
3 | +# Built application files | ||
4 | +*.apk | ||
5 | +*.ap_ | ||
6 | +*.aab | ||
7 | + | ||
8 | +# Files for the ART/Dalvik VM | ||
9 | +*.dex | ||
10 | + | ||
11 | +# Java class files | ||
12 | +*.class | ||
13 | + | ||
14 | +# Generated files | ||
15 | +bin/ | ||
16 | +gen/ | ||
17 | +out/ | ||
18 | +release/ | ||
19 | + | ||
20 | +# Gradle files | ||
21 | +.gradle/ | ||
22 | +build/ | ||
23 | + | ||
24 | +# Local configuration file (sdk path, etc) | ||
25 | +local.properties | ||
26 | + | ||
27 | +# Proguard folder generated by Eclipse | ||
28 | +proguard/ | ||
29 | + | ||
30 | +# Log Files | ||
31 | +*.log | ||
32 | + | ||
33 | +# Android Studio Navigation editor temp files | ||
34 | +.navigation/ | ||
35 | + | ||
36 | +# Android Studio captures folder | ||
37 | +captures/ | ||
38 | + | ||
39 | +# IntelliJ | ||
40 | +*.iml | ||
41 | +.idea/workspace.xml | ||
42 | +.idea/tasks.xml | ||
43 | +.idea/gradle.xml | ||
44 | +.idea/assetWizardSettings.xml | ||
45 | +.idea/dictionaries | ||
46 | +.idea/libraries | ||
47 | +# Android Studio 3 in .gitignore file. | ||
48 | +.idea/caches | ||
49 | +.idea/modules.xml | ||
50 | +# Comment next line if keeping position of elements in Navigation Editor is relevant for you | ||
51 | +.idea/navEditor.xml | ||
52 | + | ||
53 | +# Keystore files | ||
54 | +# Uncomment the following lines if you do not want to check your keystore files in. | ||
55 | +#*.jks | ||
56 | +#*.keystore | ||
57 | + | ||
58 | +# External native build folder generated in Android Studio 2.2 and later | ||
59 | +.externalNativeBuild | ||
60 | + | ||
61 | +# Google Services (e.g. APIs or Firebase) | ||
62 | +# google-services.json | ||
63 | + | ||
64 | +# Freeline | ||
65 | +freeline.py | ||
66 | +freeline/ | ||
67 | +freeline_project_description.json | ||
68 | + | ||
69 | +# fastlane | ||
70 | +fastlane/report.xml | ||
71 | +fastlane/Preview.html | ||
72 | +fastlane/screenshots | ||
73 | +fastlane/test_output | ||
74 | +fastlane/readme.md | ||
75 | + | ||
76 | +# Version control | ||
77 | +vcs.xml | ||
78 | + | ||
79 | +# lint | ||
80 | +lint/intermediates/ | ||
81 | +lint/generated/ | ||
82 | +lint/outputs/ | ||
83 | +lint/tmp/ | ||
84 | +# lint/reports/ | ||
85 | + |
android/smartwindow/app/src/main/java/com/example/suemin/smartwindow/view/MainActivity.java
0 → 100644
1 | +package com.example.suemin.smartwindow.view; | ||
2 | + | ||
3 | +import android.app.NotificationChannel; | ||
4 | +import android.app.NotificationManager; | ||
5 | +import android.content.Context; | ||
6 | +import android.graphics.BitmapFactory; | ||
7 | +import android.graphics.Color; | ||
8 | +import android.media.AudioAttributes; | ||
9 | +import android.net.Uri; | ||
10 | +import android.os.Build; | ||
11 | +import android.os.Bundle; | ||
12 | +import android.support.annotation.NonNull; | ||
13 | +import android.support.design.widget.BottomNavigationView; | ||
14 | +import android.support.v4.app.Fragment; | ||
15 | +import android.support.v4.app.NotificationCompat; | ||
16 | +import android.support.v7.app.AppCompatActivity; | ||
17 | +import android.support.v4.app.FragmentManager; | ||
18 | +import android.support.v4.app.FragmentTransaction; | ||
19 | +import android.view.MenuItem; | ||
20 | +import android.support.v7.widget.Toolbar; | ||
21 | + | ||
22 | + | ||
23 | +import com.example.suemin.smartwindow.R; | ||
24 | +import com.example.suemin.smartwindow.view.bluetooth.Bluetooth; | ||
25 | +import com.example.suemin.smartwindow.view.environment.Env; | ||
26 | +import com.example.suemin.smartwindow.view.home.Home; | ||
27 | + | ||
28 | +public class MainActivity extends AppCompatActivity { | ||
29 | + FragmentManager fragmentManager = getSupportFragmentManager(); | ||
30 | + FragmentTransaction fragmentTransaction; | ||
31 | + Toolbar tb; | ||
32 | + | ||
33 | + public static final String NOTIFICATION_CHANNEL_ID = "10001"; | ||
34 | + private int count = 0; | ||
35 | + public static NotificationManager notificationManager; | ||
36 | + public static NotificationCompat.Builder builder; | ||
37 | + private static Uri sounduri; | ||
38 | + | ||
39 | + Home homeFragment = new Home(); | ||
40 | + Env envFragment = new Env(); | ||
41 | + Bluetooth bluetoothFragment = new Bluetooth(); | ||
42 | + | ||
43 | + private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener | ||
44 | + = new BottomNavigationView.OnNavigationItemSelectedListener() { | ||
45 | + | ||
46 | + @Override | ||
47 | + public boolean onNavigationItemSelected(@NonNull MenuItem item) { | ||
48 | + fragmentTransaction = fragmentManager.beginTransaction(); | ||
49 | + | ||
50 | + switch (item.getItemId()) { | ||
51 | + case R.id.navigation_home: | ||
52 | + replaceFragment(homeFragment); | ||
53 | + return true; | ||
54 | + case R.id.navigation_env: | ||
55 | + replaceFragment(envFragment); | ||
56 | + return true; | ||
57 | + case R.id.navigation_bt: | ||
58 | + replaceFragment(bluetoothFragment); | ||
59 | + return true; | ||
60 | + } | ||
61 | + return false; | ||
62 | + } | ||
63 | + }; | ||
64 | + @Override | ||
65 | + protected void onCreate(Bundle savedInstanceState) { | ||
66 | + super.onCreate(savedInstanceState); | ||
67 | + setContentView(R.layout.activity_main); | ||
68 | + | ||
69 | + | ||
70 | + tb = (Toolbar) findViewById(R.id.tb); | ||
71 | + setSupportActionBar(tb); | ||
72 | + | ||
73 | + fragmentTransaction = fragmentManager.beginTransaction(); | ||
74 | + fragmentTransaction.replace(R.id.frameLayout, homeFragment).commitAllowingStateLoss(); | ||
75 | + | ||
76 | + BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); | ||
77 | + | ||
78 | + navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); | ||
79 | + | ||
80 | + notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); | ||
81 | + builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID) | ||
82 | + .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon_i2)) | ||
83 | + .setContentTitle("침입자 알림") | ||
84 | + .setContentText("침입자가 감지되었습니다") | ||
85 | + .setPriority(NotificationCompat.PRIORITY_DEFAULT) | ||
86 | + .setAutoCancel(true); | ||
87 | + sounduri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.noti_sound); | ||
88 | + | ||
89 | + } | ||
90 | + public void replaceFragment(Fragment fragment) { | ||
91 | + FragmentManager fragmentManager = getSupportFragmentManager(); | ||
92 | + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); | ||
93 | + fragmentTransaction.replace(R.id.frameLayout, fragment).commit(); | ||
94 | + } | ||
95 | + | ||
96 | + public static void NotificationSomethings() { | ||
97 | + | ||
98 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | ||
99 | + | ||
100 | + builder.setSmallIcon(R.drawable.icon); | ||
101 | + CharSequence channelName = "channelname"; | ||
102 | + String description = "description"; | ||
103 | + int importance = NotificationManager.IMPORTANCE_HIGH; | ||
104 | + AudioAttributes audioAttributes = new AudioAttributes.Builder() | ||
105 | + .setUsage(AudioAttributes.USAGE_NOTIFICATION) | ||
106 | + .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) | ||
107 | + .build(); | ||
108 | + | ||
109 | + NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName , importance); | ||
110 | + channel.setDescription(description); | ||
111 | + channel.enableLights(true); | ||
112 | + channel.setLightColor(Color.RED); | ||
113 | + channel.setSound(sounduri, audioAttributes); | ||
114 | + channel.enableVibration(true); | ||
115 | + channel.setVibrationPattern(new long[] {100,200,300,200}); | ||
116 | + | ||
117 | + assert notificationManager != null; | ||
118 | + notificationManager.createNotificationChannel(channel); | ||
119 | + | ||
120 | + }else builder.setSmallIcon(R.mipmap.ic_launcher); | ||
121 | + assert notificationManager != null; | ||
122 | + notificationManager.notify(1234, builder.build()); | ||
123 | + | ||
124 | + } | ||
125 | + | ||
126 | +} |
android/smartwindow/app/src/main/java/com/example/suemin/smartwindow/view/bluetooth/Bluetooth.java
0 → 100644
1 | +package com.example.suemin.smartwindow.view.bluetooth; | ||
2 | + | ||
3 | +import android.Manifest; | ||
4 | +import android.bluetooth.BluetoothAdapter; | ||
5 | +import android.bluetooth.BluetoothDevice; | ||
6 | +import android.bluetooth.BluetoothGattCharacteristic; | ||
7 | +import android.bluetooth.BluetoothGattService; | ||
8 | +import android.bluetooth.BluetoothManager; | ||
9 | +import android.content.BroadcastReceiver; | ||
10 | +import android.content.ComponentName; | ||
11 | +import android.content.Context; | ||
12 | +import android.content.Intent; | ||
13 | +import android.content.IntentFilter; | ||
14 | +import android.content.ServiceConnection; | ||
15 | +import android.content.pm.PackageManager; | ||
16 | +import android.os.Build; | ||
17 | +import android.os.Bundle; | ||
18 | +import android.os.Handler; | ||
19 | +import android.os.IBinder; | ||
20 | +import android.support.v4.app.ListFragment; | ||
21 | +import android.support.v4.content.ContextCompat; | ||
22 | +import android.util.Log; | ||
23 | +import android.view.LayoutInflater; | ||
24 | +import android.view.Menu; | ||
25 | +import android.view.MenuInflater; | ||
26 | +import android.view.MenuItem; | ||
27 | +import android.view.View; | ||
28 | +import android.view.ViewGroup; | ||
29 | +import android.widget.BaseAdapter; | ||
30 | +import android.widget.Button; | ||
31 | +import android.widget.ListView; | ||
32 | +import android.widget.TextView; | ||
33 | +import android.widget.Toast; | ||
34 | +import android.bluetooth.le.BluetoothLeScanner; | ||
35 | +import android.bluetooth.le.ScanCallback; | ||
36 | +import android.bluetooth.le.ScanResult; | ||
37 | + | ||
38 | +import java.util.LinkedList; | ||
39 | +import java.util.List; | ||
40 | + | ||
41 | +import com.example.suemin.smartwindow.R; | ||
42 | + | ||
43 | +import java.util.ArrayList; | ||
44 | +import java.util.Queue; | ||
45 | + | ||
46 | +import static android.content.ContentValues.TAG; | ||
47 | + | ||
48 | + | ||
49 | +public class Bluetooth extends ListFragment { | ||
50 | + private BluetoothAdapter mBluetoothAdapter; | ||
51 | + private static BluetoothLeService mBluetoothLeService; | ||
52 | + private boolean mScanning; | ||
53 | + private Handler mhandler; | ||
54 | + private BluetoothLeScanner BLEScanner; | ||
55 | + | ||
56 | + private LeDeviceListAdapter leDeviceListAdapter; | ||
57 | + private Queue<BluetoothDevice> connectionQueue; | ||
58 | + private Thread connectionThread; | ||
59 | + | ||
60 | + | ||
61 | + private ArrayList<ArrayList<BluetoothGattCharacteristic>> mGattCharacteristics = | ||
62 | + new ArrayList<ArrayList<BluetoothGattCharacteristic>>(); | ||
63 | + private BluetoothGattCharacteristic mNotifyCharacteristic; | ||
64 | + private static BluetoothGattCharacteristic motor; | ||
65 | + | ||
66 | + | ||
67 | + private static final long SCAN_PERIOD = 5000; | ||
68 | + private static final int REQUEST_ENABLE_BT = 1; | ||
69 | + private static final int MY_LOCATION_REQUEST_CODE = 1; | ||
70 | + private static final int PERMISSION_REQUEST_COARSE_LOCATION = 100; | ||
71 | + private final int moduleNum = 3; | ||
72 | + private boolean mConnected = false; | ||
73 | + public static boolean WindowState = false; | ||
74 | + | ||
75 | + public Bluetooth() { | ||
76 | + } | ||
77 | + | ||
78 | + | ||
79 | + @Override | ||
80 | + public void onCreate(Bundle savedInstanceState) { | ||
81 | + super.onCreate(savedInstanceState); | ||
82 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | ||
83 | + mCheckPermission(); | ||
84 | + } | ||
85 | + Intent gattServiceIntent = new Intent(getActivity(), BluetoothLeService.class); | ||
86 | + getActivity().bindService(gattServiceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); | ||
87 | + } | ||
88 | + | ||
89 | + @Override | ||
90 | + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { | ||
91 | + inflater.inflate(R.menu.btmenu, menu); | ||
92 | + super.onCreateOptionsMenu(menu, inflater); | ||
93 | + } | ||
94 | + | ||
95 | + @Override | ||
96 | + public boolean onOptionsItemSelected(MenuItem item) { | ||
97 | + if (item.getItemId() == R.id.navigation_bt) { | ||
98 | + | ||
99 | + if (!getActivity().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { | ||
100 | + } | ||
101 | + final BluetoothManager bluetoothManager = (BluetoothManager) getActivity().getSystemService(Context.BLUETOOTH_SERVICE); | ||
102 | + if (bluetoothManager != null) { | ||
103 | + mBluetoothAdapter = bluetoothManager.getAdapter(); | ||
104 | + } | ||
105 | + if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { | ||
106 | + Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); | ||
107 | + startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); | ||
108 | + } | ||
109 | + BLEScanner = mBluetoothAdapter.getBluetoothLeScanner(); | ||
110 | + if (BLEScanner == null) { | ||
111 | + Toast.makeText(getActivity(), "Can not find BLE Scanner", Toast.LENGTH_SHORT).show(); | ||
112 | + } else { | ||
113 | + Toast.makeText(getActivity(), "블루투스가 활성화되었습니다.", Toast.LENGTH_SHORT).show(); | ||
114 | + } | ||
115 | + | ||
116 | + } | ||
117 | + return super.onOptionsItemSelected(item); | ||
118 | + } | ||
119 | + | ||
120 | + @Override | ||
121 | + public View onCreateView(LayoutInflater inflater, ViewGroup container, | ||
122 | + Bundle savedInstanceState) { | ||
123 | + View view = inflater.inflate(R.layout.fragment_bluetooth, container, false); | ||
124 | + setHasOptionsMenu(true); | ||
125 | + connectionQueue = new LinkedList<BluetoothDevice>(); | ||
126 | + Button btFindBtn = (Button) view.findViewById(R.id.bt_find_btn); | ||
127 | + btFindBtn.setOnClickListener(new View.OnClickListener() { | ||
128 | + @Override | ||
129 | + public void onClick(View v) { | ||
130 | + mhandler = new Handler(); | ||
131 | + leDeviceListAdapter = new LeDeviceListAdapter(); | ||
132 | + setListAdapter(leDeviceListAdapter); | ||
133 | + scanLeDevice(true); | ||
134 | + } | ||
135 | + }); | ||
136 | + | ||
137 | + return view; | ||
138 | + } | ||
139 | + | ||
140 | + private void mCheckPermission() { | ||
141 | + | ||
142 | + if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getActivity(), | ||
143 | + Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { | ||
144 | + requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, | ||
145 | + PERMISSION_REQUEST_COARSE_LOCATION); | ||
146 | + } else { | ||
147 | + } | ||
148 | + } | ||
149 | + | ||
150 | + @Override | ||
151 | + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { | ||
152 | + super.onRequestPermissionsResult(requestCode, permissions, grantResults); | ||
153 | + if (requestCode == MY_LOCATION_REQUEST_CODE) { | ||
154 | + if (permissions.length == 1 && | ||
155 | + permissions[0] == Manifest.permission.ACCESS_FINE_LOCATION && | ||
156 | + grantResults[0] == PackageManager.PERMISSION_GRANTED) { | ||
157 | + } else { | ||
158 | + } | ||
159 | + Toast.makeText(getActivity(), "LOCATION_ACCESS_PERMISSION_DENIED", Toast.LENGTH_SHORT).show(); | ||
160 | + } | ||
161 | + } | ||
162 | + | ||
163 | + | ||
164 | + private void scanLeDevice(final boolean enable) { | ||
165 | + if (enable) { | ||
166 | + mhandler.postDelayed(new Runnable() { | ||
167 | + @Override | ||
168 | + public void run() { | ||
169 | + mScanning = false; | ||
170 | + BLEScanner.stopScan(ScanCallback); | ||
171 | + Toast.makeText(getActivity(), "기기 탐색 완료", Toast.LENGTH_SHORT).show(); | ||
172 | + } | ||
173 | + }, SCAN_PERIOD); | ||
174 | + mScanning = true; | ||
175 | + BLEScanner.startScan(ScanCallback); | ||
176 | + Toast.makeText(getActivity(), "주변 기기를 탐색중입니다...", Toast.LENGTH_SHORT).show(); | ||
177 | + } else { | ||
178 | + mScanning = false; | ||
179 | + BLEScanner.stopScan(ScanCallback); | ||
180 | + } | ||
181 | + } | ||
182 | + | ||
183 | + private ScanCallback ScanCallback = new ScanCallback() { | ||
184 | + @Override | ||
185 | + public void onScanResult(int callbackType, ScanResult result) { | ||
186 | + processResult(result); | ||
187 | + } | ||
188 | + @Override | ||
189 | + public void onBatchScanResults(List<ScanResult> results) { | ||
190 | + for (ScanResult result : results) { | ||
191 | + processResult(result); | ||
192 | + } | ||
193 | + } | ||
194 | + @Override | ||
195 | + public void onScanFailed(int errorCode) { | ||
196 | + } | ||
197 | + | ||
198 | + private void processResult(final ScanResult result) { | ||
199 | + getActivity().runOnUiThread(new Runnable() { | ||
200 | + @Override | ||
201 | + public void run() { | ||
202 | + leDeviceListAdapter.addDevice(result.getDevice()); | ||
203 | + leDeviceListAdapter.notifyDataSetChanged(); | ||
204 | + } | ||
205 | + }); | ||
206 | + } | ||
207 | + }; | ||
208 | + | ||
209 | + private class LeDeviceListAdapter extends BaseAdapter { | ||
210 | + private ArrayList<BluetoothDevice> mLeDevices; | ||
211 | + private LayoutInflater mInflator; | ||
212 | + | ||
213 | + public LeDeviceListAdapter() { | ||
214 | + super(); | ||
215 | + mLeDevices = new ArrayList<BluetoothDevice>(); | ||
216 | + mInflator = getActivity().getLayoutInflater(); | ||
217 | + } | ||
218 | + | ||
219 | + public void addDevice(BluetoothDevice device) { | ||
220 | + if (!mLeDevices.contains(device)) { | ||
221 | + mLeDevices.add(device); | ||
222 | + } | ||
223 | + } | ||
224 | + | ||
225 | + public BluetoothDevice getDevice(int position) { | ||
226 | + return mLeDevices.get(position); | ||
227 | + } | ||
228 | + | ||
229 | + public void clear() { | ||
230 | + mLeDevices.clear(); | ||
231 | + } | ||
232 | + | ||
233 | + @Override | ||
234 | + public int getCount() { | ||
235 | + return mLeDevices.size(); | ||
236 | + } | ||
237 | + | ||
238 | + @Override | ||
239 | + public Object getItem(int i) { | ||
240 | + return mLeDevices.get(i); | ||
241 | + } | ||
242 | + | ||
243 | + @Override | ||
244 | + public long getItemId(int i) { | ||
245 | + return i; | ||
246 | + } | ||
247 | + | ||
248 | + @Override | ||
249 | + public View getView(int position, View view, ViewGroup viewGroup) { | ||
250 | + ViewHolder viewHolder = new ViewHolder(); | ||
251 | + if (view == null) { | ||
252 | + view = mInflator.inflate(R.layout.bt_listview_item, null); | ||
253 | + viewHolder.deviceName = (TextView) view.findViewById(R.id.bt_textView); | ||
254 | + viewHolder.deviceAddr = (TextView) view.findViewById(R.id.bt_textView_addr); | ||
255 | + view.setTag(viewHolder); | ||
256 | + } else { | ||
257 | + viewHolder = (ViewHolder) view.getTag(); | ||
258 | + } | ||
259 | + | ||
260 | + BluetoothDevice device = mLeDevices.get(position); | ||
261 | + String deviceName = device.getName(); | ||
262 | + String deviceAddr = device.getAddress(); | ||
263 | + | ||
264 | + if (deviceName != null && deviceName.length() > 0) { | ||
265 | + viewHolder.deviceName.setText(deviceName); | ||
266 | + viewHolder.deviceAddr.setText(deviceAddr); | ||
267 | + } else { | ||
268 | + viewHolder.deviceName.setText("Unknown Device"); | ||
269 | + viewHolder.deviceAddr.setText(deviceAddr); | ||
270 | + } | ||
271 | + return view; | ||
272 | + } | ||
273 | + | ||
274 | + private class ViewHolder { | ||
275 | + TextView deviceName; | ||
276 | + TextView deviceAddr; | ||
277 | + } | ||
278 | + } | ||
279 | + | ||
280 | + @Override | ||
281 | + public void onResume() { | ||
282 | + super.onResume(); | ||
283 | + getActivity().registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter()); | ||
284 | + } | ||
285 | + | ||
286 | + @Override | ||
287 | + public void onDestroy() { | ||
288 | + super.onDestroy(); | ||
289 | + getActivity().unregisterReceiver(mGattUpdateReceiver); | ||
290 | + getActivity().unbindService(mServiceConnection); | ||
291 | + } | ||
292 | + | ||
293 | + private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() { | ||
294 | + @Override | ||
295 | + public void onReceive(Context context, Intent intent) { | ||
296 | + final String action = intent.getAction(); | ||
297 | + String currentDeviceAddr = intent.getExtras().getString("extra.mac"); | ||
298 | + if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) { | ||
299 | + mConnected = true; | ||
300 | + Toast.makeText(getActivity(), "연결되었습니다", Toast.LENGTH_SHORT).show(); | ||
301 | + } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) { | ||
302 | + mConnected = false; | ||
303 | + } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) { | ||
304 | + Log.d(TAG, "onReceive: Service Discovered" + currentDeviceAddr); | ||
305 | + int size = mBluetoothLeService.getSupportedGattServices(currentDeviceAddr).size(); | ||
306 | + if (currentDeviceAddr.equals(getString(R.string.addr_m))) { | ||
307 | + motor = mBluetoothLeService.getSupportedGattServices(currentDeviceAddr).get(size - 1).getCharacteristic(mBluetoothLeService.HM10); | ||
308 | + } else{ | ||
309 | + getCharacteristics(mBluetoothLeService.getSupportedGattServices(currentDeviceAddr), currentDeviceAddr, size); | ||
310 | + } | ||
311 | + } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) { | ||
312 | + | ||
313 | + String data = intent.getExtras().getString("data"); | ||
314 | + new SensorResult(getContext()).setData(data, currentDeviceAddr); | ||
315 | + } | ||
316 | + } | ||
317 | + }; | ||
318 | + | ||
319 | + public static void setWindowState(String state, String addr) { | ||
320 | + if (motor != null && mBluetoothLeService != null) { | ||
321 | + if(state == "n"){ | ||
322 | + WindowState =true; } | ||
323 | + else { | ||
324 | + WindowState= false;} | ||
325 | + motor.setValue(state); | ||
326 | + mBluetoothLeService.writeMotorCharacteristic(motor, addr); | ||
327 | + mBluetoothLeService.setCharacteristicNotification(motor, addr, true); | ||
328 | + } | ||
329 | + } | ||
330 | + | ||
331 | + private boolean getCharacteristics(List<BluetoothGattService> gattService, String addr, int size) { | ||
332 | + if (size != 0) { | ||
333 | + List<BluetoothGattCharacteristic> gattCharacteristics = gattService.get(size - 1).getCharacteristics(); | ||
334 | + ArrayList<BluetoothGattCharacteristic> charas = | ||
335 | + new ArrayList<BluetoothGattCharacteristic>(); | ||
336 | + for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) { | ||
337 | + charas.add(gattCharacteristic); | ||
338 | + } | ||
339 | + mGattCharacteristics.add(charas); | ||
340 | + if (mGattCharacteristics != null) { | ||
341 | + final BluetoothGattCharacteristic characteristic = charas.get(charas.size() - 1); | ||
342 | + final int charaProp = characteristic.getProperties(); | ||
343 | + | ||
344 | + if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) { | ||
345 | + if (mNotifyCharacteristic != null) { | ||
346 | + mBluetoothLeService.setCharacteristicNotification( | ||
347 | + mNotifyCharacteristic, addr, false); | ||
348 | + mNotifyCharacteristic = null; | ||
349 | + } | ||
350 | + mBluetoothLeService.readCharacteristic(characteristic, addr); | ||
351 | + } | ||
352 | + if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) { | ||
353 | + mNotifyCharacteristic = characteristic; | ||
354 | + mBluetoothLeService.setCharacteristicNotification( | ||
355 | + characteristic, addr, true); | ||
356 | + } | ||
357 | + return true; | ||
358 | + }} | ||
359 | + return false; | ||
360 | + | ||
361 | + } | ||
362 | + | ||
363 | + private static IntentFilter makeGattUpdateIntentFilter() { | ||
364 | + final IntentFilter intentFilter = new IntentFilter(); | ||
365 | + intentFilter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED); | ||
366 | + intentFilter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED); | ||
367 | + intentFilter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED); | ||
368 | + intentFilter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE); | ||
369 | + return intentFilter; | ||
370 | + } | ||
371 | + | ||
372 | + | ||
373 | + private final ServiceConnection mServiceConnection = new ServiceConnection() { | ||
374 | + @Override | ||
375 | + public void onServiceConnected(ComponentName name, IBinder service) { | ||
376 | + mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService(); | ||
377 | + if (!mBluetoothLeService.initialize()) { | ||
378 | + Log.d("", "Unable to initialize Bluetooth"); | ||
379 | + } | ||
380 | + Log.d("", "onServiceConnected: "); | ||
381 | + } | ||
382 | + | ||
383 | + @Override | ||
384 | + public void onServiceDisconnected(ComponentName name) { | ||
385 | + mBluetoothLeService.close(); | ||
386 | + mBluetoothLeService.disconnect(); | ||
387 | + mBluetoothLeService = null; | ||
388 | + } | ||
389 | + }; | ||
390 | + | ||
391 | + | ||
392 | + | ||
393 | + public void onListItemClick(ListView l, View v, int position, long id) { | ||
394 | + super.onListItemClick(l, v, position, id); | ||
395 | + final BluetoothDevice device = leDeviceListAdapter.getDevice(position); | ||
396 | + if (device == null) return; | ||
397 | + Toast.makeText(getActivity(), "연결중...", Toast.LENGTH_SHORT).show(); | ||
398 | + connectionQueue.add(device); | ||
399 | + if (mScanning) { | ||
400 | + BLEScanner.stopScan(ScanCallback); | ||
401 | + mScanning = false; | ||
402 | + } | ||
403 | + if (connectionQueue.size() == moduleNum) { | ||
404 | + initConnection(); | ||
405 | + } | ||
406 | + } | ||
407 | + | ||
408 | + | ||
409 | + | ||
410 | + public void initConnection() { | ||
411 | + if (connectionThread == null) { | ||
412 | + connectionThread = new Thread(new Runnable() { | ||
413 | + @Override | ||
414 | + public void run() { | ||
415 | + connectionloop(); | ||
416 | + connectionThread.interrupt(); | ||
417 | + connectionThread = null; | ||
418 | + } | ||
419 | + }); | ||
420 | + connectionThread.start(); | ||
421 | + } | ||
422 | + } | ||
423 | + | ||
424 | + private void connectionloop() { | ||
425 | + while (!connectionQueue.isEmpty()) { | ||
426 | + if(mBluetoothLeService != null) { | ||
427 | + mBluetoothLeService.connect(connectionQueue.poll().getAddress()); | ||
428 | + } | ||
429 | + try { | ||
430 | + Thread.sleep(250); | ||
431 | + } catch (InterruptedException e) { | ||
432 | + } | ||
433 | + } | ||
434 | + } | ||
435 | + | ||
436 | +} |
1 | +package com.example.suemin.smartwindow.view.bluetooth; | ||
2 | + | ||
3 | +import android.app.Service; | ||
4 | +import android.bluetooth.BluetoothAdapter; | ||
5 | +import android.bluetooth.BluetoothDevice; | ||
6 | +import android.bluetooth.BluetoothGatt; | ||
7 | +import android.bluetooth.BluetoothGattCallback; | ||
8 | +import android.bluetooth.BluetoothGattCharacteristic; | ||
9 | +import android.bluetooth.BluetoothGattDescriptor; | ||
10 | +import android.bluetooth.BluetoothGattService; | ||
11 | +import android.bluetooth.BluetoothManager; | ||
12 | +import android.bluetooth.BluetoothProfile; | ||
13 | +import android.content.Context; | ||
14 | +import android.content.Intent; | ||
15 | +import android.os.Binder; | ||
16 | +import android.os.IBinder; | ||
17 | +import android.util.Log; | ||
18 | + | ||
19 | +import java.util.LinkedList; | ||
20 | +import java.util.List; | ||
21 | +import java.util.Queue; | ||
22 | +import java.util.UUID; | ||
23 | + | ||
24 | +import static android.content.ContentValues.TAG; | ||
25 | + | ||
26 | + | ||
27 | +public class BluetoothLeService extends Service{ | ||
28 | + | ||
29 | + private BluetoothManager mBluetoothManager; | ||
30 | + private BluetoothAdapter mBluetoothAdapter; | ||
31 | + private String mBluetoothDeviceAddress; | ||
32 | + private BluetoothGatt mBluetoothGatt; | ||
33 | + private BluetoothGatt mBluetoothGatt_1; | ||
34 | + private BluetoothGatt mBluetoothGatt_2; | ||
35 | + private int mConnectionState = STATE_DISCONNECTED; | ||
36 | + | ||
37 | + private static final int STATE_DISCONNECTED = 0; | ||
38 | + private static final int STATE_CONNECTING = 1; | ||
39 | + private static final int STATE_CONNECTED = 2; | ||
40 | + | ||
41 | + public final static String ACTION_GATT_CONNECTED = | ||
42 | + "com.example.bluetooth.le.ACTION_GATT_CONNECTED"; | ||
43 | + public final static String ACTION_GATT_DISCONNECTED = | ||
44 | + "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED"; | ||
45 | + public final static String ACTION_GATT_SERVICES_DISCOVERED = | ||
46 | + "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED"; | ||
47 | + public final static String ACTION_DATA_AVAILABLE = | ||
48 | + "com.example.bluetooth.le.ACTION_DATA_AVAILABLE"; | ||
49 | + public final static String EXTRA_DATA = | ||
50 | + "com.example.bluetooth.le.EXTRA_DATA"; | ||
51 | + | ||
52 | + public final static UUID HM10 = | ||
53 | + UUID.fromString(SampleAttributes.HM_10); | ||
54 | + | ||
55 | + private Queue<BluetoothGattCharacteristic> characteristicReadQueue = new LinkedList<BluetoothGattCharacteristic>(); | ||
56 | + private Queue<BluetoothGatt> serviceDiscoveryQueue = new LinkedList<BluetoothGatt>(); | ||
57 | + private Thread serviceDiscoveryThread; | ||
58 | + private Thread initialisationThread; | ||
59 | + private final int moduleNum = 3; | ||
60 | + | ||
61 | + private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { | ||
62 | + @Override | ||
63 | + public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { | ||
64 | + super.onConnectionStateChange(gatt, status, newState); | ||
65 | + String intentAction; | ||
66 | + if (newState == BluetoothProfile.STATE_CONNECTED) { | ||
67 | + intentAction = ACTION_GATT_CONNECTED; | ||
68 | + mConnectionState = STATE_CONNECTED; | ||
69 | + broadcastUpdate(intentAction, gatt); | ||
70 | + Log.d(TAG, "CONNECTED TO GATT SERVER " + gatt.getDevice().getName()); | ||
71 | + serviceDiscoveryQueue.add(gatt); | ||
72 | + if (serviceDiscoveryQueue.size() == moduleNum) { | ||
73 | + initServiceDiscovery(); | ||
74 | + } | ||
75 | + else { | ||
76 | + if (serviceDiscoveryQueue.size() == 1) { | ||
77 | + mBluetoothGatt_1 = gatt; | ||
78 | + } else if (serviceDiscoveryQueue.size() == 2) { | ||
79 | + mBluetoothGatt_2 = gatt; | ||
80 | + } | ||
81 | + } | ||
82 | + } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { | ||
83 | + intentAction = ACTION_GATT_DISCONNECTED; | ||
84 | + mConnectionState = STATE_DISCONNECTED; | ||
85 | + Log.i(TAG, "DISCONNECTED FROM GATT SERVER" + gatt.getDevice().getName()); | ||
86 | + broadcastUpdate(intentAction, gatt); | ||
87 | + } | ||
88 | + } | ||
89 | + @Override | ||
90 | + public void onServicesDiscovered(BluetoothGatt gatt, int status) { | ||
91 | + super.onServicesDiscovered(gatt, status); | ||
92 | + if(status == BluetoothGatt.GATT_SUCCESS){ | ||
93 | + broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED, gatt); | ||
94 | + | ||
95 | + } | ||
96 | + } | ||
97 | + | ||
98 | + @Override | ||
99 | + public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { | ||
100 | + super.onCharacteristicRead(gatt, characteristic, status); | ||
101 | + Log.d(TAG, "onCharacteristicRead: " + gatt.getDevice().getName()); | ||
102 | + characteristicReadQueue.add(characteristic); | ||
103 | + if(status == BluetoothGatt.GATT_SUCCESS ){ | ||
104 | + initreadThread(gatt); | ||
105 | + broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic, gatt); | ||
106 | + } | ||
107 | + } | ||
108 | + | ||
109 | + @Override | ||
110 | + public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { | ||
111 | + super.onCharacteristicChanged(gatt, characteristic); | ||
112 | + Log.d(TAG, "onCharacteristicChanged: " + gatt.getDevice().getName()); | ||
113 | + characteristicReadQueue.add(characteristic); | ||
114 | + if(characteristicReadQueue.size() > 0 ) { | ||
115 | + initreadThread(gatt); | ||
116 | + broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic, gatt); | ||
117 | + } | ||
118 | + } | ||
119 | + }; | ||
120 | + | ||
121 | + public void initServiceDiscovery(){ | ||
122 | + if(serviceDiscoveryThread == null){ | ||
123 | + serviceDiscoveryThread = new Thread(new Runnable() { | ||
124 | + @Override | ||
125 | + public void run() { | ||
126 | + serviceDiscovery(); | ||
127 | + | ||
128 | + serviceDiscoveryThread.interrupt(); | ||
129 | + serviceDiscoveryThread = null; | ||
130 | + } | ||
131 | + }); | ||
132 | + serviceDiscoveryThread.start(); | ||
133 | + } | ||
134 | + } | ||
135 | + private void serviceDiscovery(){ | ||
136 | + while(!serviceDiscoveryQueue.isEmpty()){ | ||
137 | + BluetoothGatt p = serviceDiscoveryQueue.poll(); | ||
138 | + p.discoverServices(); | ||
139 | + try{ | ||
140 | + Thread.sleep(250); | ||
141 | + } | ||
142 | + catch (InterruptedException e){} | ||
143 | + } | ||
144 | + } | ||
145 | + | ||
146 | + private void broadcastUpdate(String action, BluetoothGatt gatt){ | ||
147 | + Intent intent = new Intent(action); | ||
148 | + intent.putExtra("extra.mac", gatt.getDevice().getAddress()); | ||
149 | + sendBroadcast(intent); | ||
150 | + } | ||
151 | + | ||
152 | + private void broadcastUpdate(String action, BluetoothGattCharacteristic characteristic, BluetoothGatt gatt) { | ||
153 | + final Intent intent = new Intent(action); | ||
154 | + intent.putExtra("extra.mac", gatt.getDevice().getAddress()); | ||
155 | + | ||
156 | + Log.v("AndroidLE", "broadcastUpdate()" + gatt.getDevice().getName()); | ||
157 | + final byte[] data = characteristic.getValue(); | ||
158 | + | ||
159 | + if (data != null && data.length > 0) { | ||
160 | + final StringBuilder stringBuilder = new StringBuilder(data.length); | ||
161 | + for(byte byteChar : data) { | ||
162 | + stringBuilder.append(String.format("%02X ", byteChar)); | ||
163 | + } | ||
164 | + String result = new String(data); | ||
165 | + Log.v("AndroidLE", gatt.getDevice().getName() + " ::: " + result); | ||
166 | + intent.putExtra("data", result); | ||
167 | + sendBroadcast(intent); | ||
168 | + } | ||
169 | + } | ||
170 | + public boolean initialize(){ | ||
171 | + | ||
172 | + if(mBluetoothManager == null){ | ||
173 | + mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); | ||
174 | + if(mBluetoothManager ==null){ | ||
175 | + Log.e(TAG, "Unable to initialize MANAGER"); | ||
176 | + return false; | ||
177 | + } | ||
178 | + } | ||
179 | + mBluetoothAdapter = mBluetoothManager.getAdapter(); | ||
180 | + if(mBluetoothAdapter == null){ | ||
181 | + Log.e(TAG, "Unable to initialize ADAPTER"); | ||
182 | + return false; | ||
183 | + } | ||
184 | + | ||
185 | + return true; | ||
186 | + } | ||
187 | + | ||
188 | + public boolean connect(final String address){ | ||
189 | + if(mBluetoothAdapter==null || address ==null){ | ||
190 | + return false; | ||
191 | + } | ||
192 | + if(mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress) && mBluetoothGatt != null){ | ||
193 | + Log.d(TAG, "connect: PREVIOUSLY CONNECTED DEVICE.. TRY TO RECONNECT"); | ||
194 | + if (mBluetoothGatt.connect()){ | ||
195 | + mConnectionState = STATE_CONNECTING; | ||
196 | + return true; | ||
197 | + } | ||
198 | + else{ | ||
199 | + return false; | ||
200 | + } | ||
201 | + | ||
202 | + } | ||
203 | + final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); | ||
204 | + if(device ==null){ | ||
205 | + Log.w(TAG, "DEVICE NOT FOUND"); | ||
206 | + return false; | ||
207 | + } | ||
208 | + mBluetoothGatt = device.connectGatt(this, true, mGattCallback); | ||
209 | + Log.d(TAG, "CONNECTING NEW DEVICE : " +device.getName()); | ||
210 | + mBluetoothDeviceAddress = address; | ||
211 | + mConnectionState = STATE_CONNECTING; | ||
212 | + return true; | ||
213 | + } | ||
214 | + | ||
215 | + public void disconnect(){ | ||
216 | + if(mBluetoothAdapter ==null || mBluetoothGatt== null || mBluetoothGatt_1 ==null || mBluetoothGatt_2 ==null){ | ||
217 | + return; | ||
218 | + } | ||
219 | + mBluetoothGatt.disconnect(); | ||
220 | + mBluetoothGatt_1.disconnect(); | ||
221 | + mBluetoothGatt_2.disconnect(); | ||
222 | + } | ||
223 | + | ||
224 | + public void close(){ | ||
225 | + if(mBluetoothGatt== null || mBluetoothGatt_1 ==null || mBluetoothGatt_2 ==null){ | ||
226 | + return; | ||
227 | + } | ||
228 | + mBluetoothGatt.close(); | ||
229 | + mBluetoothGatt =null; | ||
230 | + mBluetoothGatt_1.close(); | ||
231 | + mBluetoothGatt_1 =null; | ||
232 | + mBluetoothGatt_2.close(); | ||
233 | + mBluetoothGatt_2 =null; | ||
234 | + | ||
235 | + } | ||
236 | + | ||
237 | + private final IBinder mBinder = new LocalBinder(); | ||
238 | + public class LocalBinder extends Binder{ | ||
239 | + BluetoothLeService getService(){ | ||
240 | + return BluetoothLeService.this; | ||
241 | + } | ||
242 | + } | ||
243 | + @Override | ||
244 | + public IBinder onBind(Intent intent) { | ||
245 | + return mBinder; | ||
246 | + } | ||
247 | + public boolean onUnBind(Intent intent){ | ||
248 | + Log.d(TAG, "onUnBind: "); | ||
249 | + return super.onUnbind(intent); | ||
250 | + } | ||
251 | + | ||
252 | + public void writeMotorCharacteristic(BluetoothGattCharacteristic characteristic, String addr){ | ||
253 | + if(addr.equals(mBluetoothGatt.getDevice().getAddress())){ | ||
254 | + mBluetoothGatt.writeCharacteristic(characteristic); | ||
255 | + } | ||
256 | + else if (addr.equals(mBluetoothGatt_1.getDevice().getAddress())){ | ||
257 | + Log.d(TAG, "writeMotorCharacteristic: "+addr ); | ||
258 | + mBluetoothGatt_1.writeCharacteristic(characteristic); | ||
259 | + } | ||
260 | + else if (addr.equals(mBluetoothGatt_2.getDevice().getAddress())){ | ||
261 | + Log.d(TAG, "writeMotorCharacteristic: "+addr); | ||
262 | + mBluetoothGatt_2.writeCharacteristic(characteristic); | ||
263 | + } | ||
264 | + } | ||
265 | + public void readCharacteristic(BluetoothGattCharacteristic characteristic, String addr){ | ||
266 | + if(addr.equals(mBluetoothGatt.getDevice().getAddress()) && mBluetoothGatt != null) { | ||
267 | + mBluetoothGatt.readCharacteristic(characteristic); | ||
268 | + } | ||
269 | + else if(mBluetoothGatt_1 != null &&addr.equals(mBluetoothGatt_1.getDevice().getAddress())) { | ||
270 | + mBluetoothGatt_1.readCharacteristic(characteristic); | ||
271 | + } | ||
272 | + else if(mBluetoothGatt_2 != null && addr.equals(mBluetoothGatt_2.getDevice().getAddress())) { | ||
273 | + mBluetoothGatt_2.readCharacteristic(characteristic); | ||
274 | + } | ||
275 | + } | ||
276 | + | ||
277 | + private void initreadThread(final BluetoothGatt gatt){ | ||
278 | + if(initialisationThread == null) { | ||
279 | + initialisationThread = new Thread(new Runnable() { | ||
280 | + @Override | ||
281 | + public void run() { | ||
282 | + readCharacteristics(gatt); | ||
283 | + initialisationThread.interrupt(); | ||
284 | + initialisationThread = null; | ||
285 | + } | ||
286 | + }); | ||
287 | + initialisationThread.start(); | ||
288 | + } | ||
289 | + } | ||
290 | + | ||
291 | + private void readCharacteristics(BluetoothGatt gatt) { | ||
292 | + while (!characteristicReadQueue.isEmpty()) { | ||
293 | + readCharacteristic(characteristicReadQueue.poll(), gatt.getDevice().getAddress()); | ||
294 | + try { | ||
295 | + Thread.sleep(1000); | ||
296 | + } catch (InterruptedException e) { | ||
297 | + } | ||
298 | + } | ||
299 | + } | ||
300 | + | ||
301 | + | ||
302 | + public void setCharacteristicNotification(BluetoothGattCharacteristic characteristics, String addr, boolean enabled) { | ||
303 | + if(addr.equals(mBluetoothGatt.getDevice().getAddress())) { | ||
304 | + mBluetoothGatt.setCharacteristicNotification(characteristics, true); | ||
305 | + if (HM10.equals(characteristics.getUuid())) { | ||
306 | + BluetoothGattDescriptor descriptor = characteristics.getDescriptor( | ||
307 | + UUID.fromString(SampleAttributes.CLIENT_CHARACTERISTIC_CONFIG)); | ||
308 | + descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); | ||
309 | + mBluetoothGatt.writeDescriptor(descriptor); | ||
310 | + } | ||
311 | + } | ||
312 | + else if (addr.equals(mBluetoothGatt_1.getDevice().getAddress())){ | ||
313 | + mBluetoothGatt_1.setCharacteristicNotification(characteristics, true); | ||
314 | + if (HM10.equals(characteristics.getUuid())) { | ||
315 | + BluetoothGattDescriptor descriptor = characteristics.getDescriptor( | ||
316 | + UUID.fromString(SampleAttributes.CLIENT_CHARACTERISTIC_CONFIG)); | ||
317 | + descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); | ||
318 | + mBluetoothGatt_1.writeDescriptor(descriptor); | ||
319 | + } | ||
320 | + } | ||
321 | + else if (addr.equals(mBluetoothGatt_2.getDevice().getAddress())){ | ||
322 | + mBluetoothGatt_2.setCharacteristicNotification(characteristics, true); | ||
323 | + if (HM10.equals(characteristics.getUuid())) { | ||
324 | + BluetoothGattDescriptor descriptor = characteristics.getDescriptor( | ||
325 | + UUID.fromString(SampleAttributes.CLIENT_CHARACTERISTIC_CONFIG)); | ||
326 | + descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); | ||
327 | + mBluetoothGatt_2.writeDescriptor(descriptor); | ||
328 | + } | ||
329 | + } | ||
330 | + } | ||
331 | + | ||
332 | + public List<BluetoothGattService> getSupportedGattServices(String addr) { | ||
333 | + if(addr.equals(mBluetoothGatt.getDevice().getAddress()) && mBluetoothGatt != null) { | ||
334 | + return mBluetoothGatt.getServices(); | ||
335 | + } | ||
336 | + else if(mBluetoothGatt_1 != null &&addr.equals(mBluetoothGatt_1.getDevice().getAddress())) { | ||
337 | + return mBluetoothGatt_1.getServices(); | ||
338 | + } | ||
339 | + else if(mBluetoothGatt_2 != null && addr.equals(mBluetoothGatt_2.getDevice().getAddress())) { | ||
340 | + return mBluetoothGatt_2.getServices(); | ||
341 | + }else{ | ||
342 | + return mBluetoothGatt.getServices(); | ||
343 | + } | ||
344 | + | ||
345 | + | ||
346 | + } | ||
347 | + } | ||
348 | + |
1 | +package com.example.suemin.smartwindow.view.bluetooth; | ||
2 | + | ||
3 | +import java.util.HashMap; | ||
4 | + | ||
5 | +/** | ||
6 | + * This class includes a small subset of standard GATT attributes for demonstration purposes. | ||
7 | + */ | ||
8 | +public class SampleAttributes { | ||
9 | + private static HashMap<String, String> attributes = new HashMap(); | ||
10 | + public static String HM_10 = "0000ffe1-0000-1000-8000-00805f9b34fb"; | ||
11 | + public static String CLIENT_CHARACTERISTIC_CONFIG = "00002902-0000-1000-8000-00805f9b34fb"; | ||
12 | + | ||
13 | + static { | ||
14 | + // Sample Services. | ||
15 | + attributes.put("0000ffe0-0000-1000-8000-00805f9b34fb", "HM-10 Service"); | ||
16 | + attributes.put("0000180a-0000-1000-8000-00805f9b34fb", "Device Information Service"); | ||
17 | + // Sample Characteristics. | ||
18 | + attributes.put(HM_10, "HM-10 Module"); | ||
19 | + attributes.put("00002a29-0000-1000-8000-00805f9b34fb", "Manufacturer Name String"); | ||
20 | + } | ||
21 | + | ||
22 | + public static String lookup(String uuid, String defaultName) { | ||
23 | + String name = attributes.get(uuid); | ||
24 | + return name == null ? defaultName : name; | ||
25 | + } | ||
26 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +package com.example.suemin.smartwindow.view.bluetooth; | ||
2 | + | ||
3 | + | ||
4 | +import android.content.Context; | ||
5 | + | ||
6 | +import com.example.suemin.smartwindow.R; | ||
7 | +import static com.example.suemin.smartwindow.view.MainActivity.NotificationSomethings; | ||
8 | +import static com.example.suemin.smartwindow.view.bluetooth.Bluetooth.WindowState; | ||
9 | +import static com.example.suemin.smartwindow.view.bluetooth.Bluetooth.setWindowState; | ||
10 | +import static com.example.suemin.smartwindow.view.environment.listview.Finedust.getFineDustResult; | ||
11 | + | ||
12 | +public class SensorResult { | ||
13 | + static Context mcontext = null; | ||
14 | + private static int otfd; | ||
15 | + private static int infd; | ||
16 | + private static String rain, intr, humd, temp = "0"; | ||
17 | + private static boolean raining = false, intruder = false; | ||
18 | + public SensorResult(Context context){ | ||
19 | + this.mcontext=context; | ||
20 | + } | ||
21 | + private void setWindowBySensor() { | ||
22 | + if ( "0".equals(otfd) || "0".equals(infd) || "0".equals(humd) || "0".equals(temp) ) { return ;} | ||
23 | + else{ | ||
24 | + | ||
25 | + // 1. 비가 오거나 침입자 발생, 외부 미세먼지 수치가 높다 | ||
26 | + if (otfd > 80 || raining || intruder) { | ||
27 | + // 열려있으면 닫는다 | ||
28 | + if (WindowState) { | ||
29 | + setWindowState("y", mcontext.getString(R.string.addr_m)); | ||
30 | + } | ||
31 | + } | ||
32 | + // 1. 비 안오고 침입자 없고 미세먼지 보통 이하 | ||
33 | + if (otfd <= 80 && !raining && !intruder) { | ||
34 | + // 닫혀있는데 내부 미세먼지 나쁨이상이거나 온도 높거나 습도 높으면 연다 | ||
35 | + if (!WindowState) { | ||
36 | + if (infd > 80 || getTemperatureState() == "높음" || getHumidState() == "높음") | ||
37 | + setWindowState("n", mcontext.getString(R.string.addr_m)); | ||
38 | + } | ||
39 | + // 열려있는데 온도가 낮으면 닫는다 | ||
40 | + else { | ||
41 | + if (getTemperatureState() == "낮음") { | ||
42 | + setWindowState("y", mcontext.getString(R.string.addr_m)); | ||
43 | + } | ||
44 | + } | ||
45 | + } | ||
46 | + } | ||
47 | + } | ||
48 | + public void setData(String data, String addr){ | ||
49 | + if(addr != null && mcontext != null){ | ||
50 | + String sensor = data.substring(0,5); | ||
51 | + if(addr.equals(mcontext.getString(R.string.addr_r))) { | ||
52 | + if (sensor.equals("intr ")) { | ||
53 | + intr = data.substring(5); | ||
54 | + intruder = true; | ||
55 | + NotificationSomethings(); | ||
56 | + } else { | ||
57 | + rain = data.substring(5); | ||
58 | + raining = true; | ||
59 | + } | ||
60 | + } | ||
61 | + else if (addr.equals(mcontext.getString(R.string.addr_d))){ | ||
62 | + if(sensor.equals("temp ")) { | ||
63 | + temp = data.substring(5); | ||
64 | + } | ||
65 | + else if(sensor.equals("humd ")){ | ||
66 | + humd = data.substring(5); | ||
67 | + } | ||
68 | + else if(sensor.equals("dust ")){ | ||
69 | + if(Double.parseDouble(data.substring(5)) > 0) { | ||
70 | + infd = Integer.parseInt(data.substring(5)); | ||
71 | + } | ||
72 | + } | ||
73 | + else{return;} | ||
74 | + } | ||
75 | + setWindowBySensor(); | ||
76 | + } | ||
77 | + return ; | ||
78 | + } | ||
79 | + public static int getInnerDustResult(){ | ||
80 | + return infd; | ||
81 | + } | ||
82 | + public static double getHumidResult(){ | ||
83 | + if(humd == null){return 0;} | ||
84 | + else { return Math.floor(Double.parseDouble(humd)*10)/10; } | ||
85 | + } | ||
86 | + public static double getTemperatureResult(){ | ||
87 | + if(temp == null){return 0;} | ||
88 | + else { return Math.floor(Double.parseDouble(temp)*10)/10; } | ||
89 | + } | ||
90 | + public static String getRainResult(){ | ||
91 | + if(raining){ | ||
92 | + return "내림"; | ||
93 | + } | ||
94 | + else {return "안내림";} | ||
95 | + | ||
96 | + } | ||
97 | + public static String getIntruderResult(){ | ||
98 | + if(intruder){ | ||
99 | + return "있음"; | ||
100 | + } | ||
101 | + else {return "없음";} | ||
102 | + } | ||
103 | + public static String getOuterFineDustState(){ | ||
104 | + otfd = Integer.parseInt(getFineDustResult()); | ||
105 | + int value = otfd; | ||
106 | + String state = null; | ||
107 | + if(value <31){ state = "좋음";} | ||
108 | + else if (value >30 && value <81){state = "보통";} | ||
109 | + else if (value>80 && value <151){state = "나쁨";} | ||
110 | + else{ state = "매우나쁨"; } | ||
111 | + return state; | ||
112 | + } | ||
113 | + public static String getInnerFineDustState(){ | ||
114 | + int value = getInnerDustResult(); | ||
115 | + String state = null; | ||
116 | + if(value <31){ state = "좋음";} | ||
117 | + else if (value >30 && value <81){state = "보통";} | ||
118 | + else if (value>80 && value <151){state = "나쁨";} | ||
119 | + else{ state = "매우나쁨"; } | ||
120 | + return state; | ||
121 | + } | ||
122 | + public static String getTemperatureState() { | ||
123 | + double value = getTemperatureResult(); | ||
124 | + String state = null; | ||
125 | + if (value < 18) { | ||
126 | + state = "낮음"; | ||
127 | + } else if (value >= 18 && value <= 25) { | ||
128 | + state = "적정"; | ||
129 | + } else{ | ||
130 | + state = "높음"; | ||
131 | + } | ||
132 | + return state; | ||
133 | + } | ||
134 | + public static String getHumidState() { | ||
135 | + double value = getHumidResult(); | ||
136 | + String state = null; | ||
137 | + if (value < 40) { | ||
138 | + state = "낮음"; | ||
139 | + } else if (value >= 40 && value <= 60) { | ||
140 | + state = "적정"; | ||
141 | + } else { | ||
142 | + state = "높음"; | ||
143 | + } | ||
144 | + return state; | ||
145 | + } | ||
146 | + | ||
147 | +} |
android/smartwindow/app/src/main/java/com/example/suemin/smartwindow/view/environment/Env.java
0 → 100644
1 | +package com.example.suemin.smartwindow.view.environment; | ||
2 | + | ||
3 | +import android.Manifest; | ||
4 | +import android.content.Context; | ||
5 | +import android.content.pm.PackageManager; | ||
6 | +import android.graphics.drawable.ColorDrawable; | ||
7 | +import android.location.Address; | ||
8 | +import android.location.Geocoder; | ||
9 | +import android.location.LocationListener; | ||
10 | +import android.location.LocationManager; | ||
11 | +import android.os.Build; | ||
12 | +import android.os.Bundle; | ||
13 | +import android.support.annotation.NonNull; | ||
14 | +import android.support.v4.app.Fragment; | ||
15 | +import android.support.v4.content.ContextCompat; | ||
16 | +import android.util.Log; | ||
17 | +import android.view.LayoutInflater; | ||
18 | +import android.view.View; | ||
19 | +import android.view.ViewGroup; | ||
20 | +import android.widget.AdapterView; | ||
21 | +import android.widget.ListView; | ||
22 | +import android.widget.TextView; | ||
23 | +import android.widget.Toast; | ||
24 | + | ||
25 | +import com.example.suemin.smartwindow.R; | ||
26 | +import com.example.suemin.smartwindow.view.environment.listview.CustomDialog; | ||
27 | +import com.example.suemin.smartwindow.view.environment.listview.ListViewAdapter; | ||
28 | + | ||
29 | +import java.io.IOException; | ||
30 | +import java.util.List; | ||
31 | +import java.util.Locale; | ||
32 | + | ||
33 | + | ||
34 | +public class Env extends Fragment { | ||
35 | + private LocationManager locationManager; | ||
36 | + private static final int REQUEST_CODE_LOCATION = 2; | ||
37 | + | ||
38 | + private double lat; | ||
39 | + private double lng; | ||
40 | + | ||
41 | + private String addr; | ||
42 | + private String subaddr; | ||
43 | + public static String subaddr2; | ||
44 | + | ||
45 | + | ||
46 | + private CustomDialog customDialog; | ||
47 | + | ||
48 | + public Env() { | ||
49 | + // Required empty public constructor | ||
50 | + } | ||
51 | + | ||
52 | + protected android.location.Location getCurrentLoca() { | ||
53 | + android.location.Location currentLocation = null; | ||
54 | + if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){ | ||
55 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | ||
56 | + requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_LOCATION); | ||
57 | + } } | ||
58 | + else { | ||
59 | + locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); | ||
60 | + locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1, mLocationListener); | ||
61 | + locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, mLocationListener); | ||
62 | + | ||
63 | + } | ||
64 | + return currentLocation; | ||
65 | + } | ||
66 | + | ||
67 | + @Override | ||
68 | + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | ||
69 | + super.onRequestPermissionsResult(requestCode, permissions, grantResults); | ||
70 | + if (requestCode == REQUEST_CODE_LOCATION) { | ||
71 | + if (permissions.length == 1 && | ||
72 | + permissions[0] == Manifest.permission.ACCESS_FINE_LOCATION && | ||
73 | + grantResults[0] == PackageManager.PERMISSION_GRANTED) { | ||
74 | + } else { | ||
75 | + } | ||
76 | + // Permission was denied. Display an error message. | ||
77 | + Toast.makeText(getActivity(), "LOCATION_ACCESS_PERMISSION_DENIED",Toast.LENGTH_SHORT).show(); | ||
78 | + } | ||
79 | + } | ||
80 | + | ||
81 | + private final LocationListener mLocationListener =new LocationListener() { | ||
82 | + @Override | ||
83 | + public void onLocationChanged(android.location.Location location) { | ||
84 | + lat = location.getLatitude(); | ||
85 | + lng = location.getLongitude(); | ||
86 | + addr =getCurrentAddr(lat,lng); | ||
87 | + int idx_s = addr.indexOf("시"); | ||
88 | + int idx_k = addr.indexOf("구"); | ||
89 | + int idx_g = addr.indexOf("동"); | ||
90 | + subaddr = addr.substring(idx_s+1, idx_g+1); | ||
91 | + subaddr2 = addr.substring(idx_s+2, idx_k+1); | ||
92 | + setLocationText(subaddr); | ||
93 | + } | ||
94 | + | ||
95 | + @Override | ||
96 | + public void onStatusChanged(String provider, int status, Bundle extras) { | ||
97 | + } | ||
98 | + | ||
99 | + @Override | ||
100 | + public void onProviderEnabled(String provider) { | ||
101 | + } | ||
102 | + | ||
103 | + @Override | ||
104 | + public void onProviderDisabled(String provider) { | ||
105 | + | ||
106 | + } | ||
107 | + }; | ||
108 | + | ||
109 | + private String getCurrentAddr(double lat, double lng) { | ||
110 | + Geocoder geocoder = new Geocoder(this.getActivity(), Locale.getDefault()); | ||
111 | + List<Address> addresses =null; | ||
112 | + try { | ||
113 | + addresses = geocoder.getFromLocation( | ||
114 | + lat, | ||
115 | + lng, | ||
116 | + 7); | ||
117 | + } catch (IOException ioException) { | ||
118 | + } catch (IllegalArgumentException illegalArgumentException) { | ||
119 | + } | ||
120 | + if (addresses == null) { | ||
121 | + Log.d("getCurrentAddr: ","주소 미발견"); | ||
122 | + } | ||
123 | + Address address = addresses.get(0); | ||
124 | + return address.getAddressLine(0).toString()+"\n"; | ||
125 | + } | ||
126 | + | ||
127 | + | ||
128 | + @Override | ||
129 | + public void onCreate(Bundle savedInstanceState) { | ||
130 | + super.onCreate(savedInstanceState); | ||
131 | + getCurrentLoca(); | ||
132 | + } | ||
133 | + | ||
134 | + public void setListView(View view) { | ||
135 | + ListViewAdapter adapter = new ListViewAdapter(); | ||
136 | + | ||
137 | + ListView listView = (ListView) view.findViewById(R.id.list); | ||
138 | + listView.setAdapter(adapter); | ||
139 | + adapter.addItem("비", ContextCompat.getDrawable(this.getContext(), R.drawable.icon_rain)); | ||
140 | + adapter.addItem("실외 미세먼지", ContextCompat.getDrawable(this.getContext(), R.drawable.icon_om)); | ||
141 | + adapter.addItem("실내 미세먼지", ContextCompat.getDrawable(this.getContext(), R.drawable.icon_sm)); | ||
142 | + adapter.addItem("실내 온도", ContextCompat.getDrawable(this.getContext(), R.drawable.icon_t)); | ||
143 | + adapter.addItem("실내 습도", ContextCompat.getDrawable(this.getContext(), R.drawable.icon_s)); | ||
144 | + adapter.addItem("침입자", ContextCompat.getDrawable(this.getContext(), R.drawable.icon_i)); | ||
145 | + listView.setOnItemClickListener(listItemClickListener); | ||
146 | + } | ||
147 | + | ||
148 | + | ||
149 | + @Override | ||
150 | + public View onCreateView(LayoutInflater inflater, ViewGroup container, | ||
151 | + Bundle savedInstanceState) { | ||
152 | + View view = inflater.inflate(R.layout.fragment_env, container, false); | ||
153 | + setListView(view); | ||
154 | + | ||
155 | + return view; | ||
156 | + } | ||
157 | + private void setLocationText(String subaddr){ | ||
158 | + final TextView addrTxt = (TextView)getActivity().findViewById(R.id.location_text); | ||
159 | + if(subaddr != null) addrTxt.setText(subaddr); | ||
160 | + } | ||
161 | + private AdapterView.OnItemClickListener listItemClickListener= new AdapterView.OnItemClickListener(){ | ||
162 | + @Override | ||
163 | + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { | ||
164 | + customDialog = new CustomDialog(getActivity(), positiveListener); | ||
165 | + customDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); | ||
166 | + customDialog.show(); | ||
167 | + customDialog.setText(position); | ||
168 | + } | ||
169 | + }; | ||
170 | + private View.OnClickListener positiveListener = new View.OnClickListener() { | ||
171 | + public void onClick(View v) { | ||
172 | + customDialog.dismiss(); | ||
173 | + } | ||
174 | + }; | ||
175 | + | ||
176 | + | ||
177 | + @Override | ||
178 | + public void onAttach(Context context) { | ||
179 | + super.onAttach(context); | ||
180 | + } | ||
181 | + | ||
182 | + @Override | ||
183 | + public void onDetach() { | ||
184 | + super.onDetach(); | ||
185 | + } | ||
186 | + | ||
187 | + @Override | ||
188 | + public void onDestroy() { | ||
189 | + super.onDestroy(); | ||
190 | + locationManager.removeUpdates(mLocationListener); | ||
191 | + } | ||
192 | + | ||
193 | + | ||
194 | +} |
1 | +package com.example.suemin.smartwindow.view.environment.listview; | ||
2 | + | ||
3 | +import android.app.Dialog; | ||
4 | +import android.content.Context; | ||
5 | +import android.os.Bundle; | ||
6 | +import android.support.annotation.NonNull; | ||
7 | +import android.view.View; | ||
8 | +import android.view.WindowManager; | ||
9 | +import android.widget.Button; | ||
10 | +import android.widget.TextView; | ||
11 | + | ||
12 | +import com.example.suemin.smartwindow.R; | ||
13 | +import com.example.suemin.smartwindow.view.bluetooth.SensorResult; | ||
14 | + | ||
15 | +public class CustomDialog extends Dialog { | ||
16 | + | ||
17 | + private Button mPositiveButton; | ||
18 | + | ||
19 | + private View.OnClickListener mPositiveListener; | ||
20 | + private TextView AlertTitle, AlertNum, AlertState; | ||
21 | + | ||
22 | + @Override | ||
23 | + protected void onCreate(Bundle savedInstanceState) { | ||
24 | + super.onCreate(savedInstanceState); | ||
25 | + | ||
26 | + WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); | ||
27 | + layoutParams.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND; | ||
28 | + layoutParams.dimAmount = 0.8f; | ||
29 | + | ||
30 | + getWindow().setAttributes(layoutParams); | ||
31 | + | ||
32 | + setContentView(R.layout.custom_dialog); | ||
33 | + | ||
34 | + mPositiveButton=(Button)findViewById(R.id.pbutton); | ||
35 | + | ||
36 | + mPositiveButton.setOnClickListener(mPositiveListener); | ||
37 | + | ||
38 | + AlertTitle = (TextView) findViewById(R.id.dialog_title); | ||
39 | + AlertNum = (TextView) findViewById(R.id.dialog_num); | ||
40 | + AlertState= (TextView) findViewById(R.id.dialog_state); | ||
41 | + } | ||
42 | + | ||
43 | + public CustomDialog(@NonNull Context context, View.OnClickListener positiveListener) { | ||
44 | + super(context); | ||
45 | + this.mPositiveListener = positiveListener; | ||
46 | + } | ||
47 | + public boolean setText(int position) | ||
48 | + { | ||
49 | + switch (position) { | ||
50 | + case 0: | ||
51 | + AlertTitle.setText("현재 비"); | ||
52 | + AlertNum.setText(SensorResult.getRainResult()); | ||
53 | + break; | ||
54 | + case 1: | ||
55 | + AlertTitle.setText("현재 실외 미세먼지"); | ||
56 | + AlertNum.setText(Finedust.getFineDustResult()+""); | ||
57 | + AlertState.setText("상태 : "+ SensorResult.getOuterFineDustState()); | ||
58 | + break; | ||
59 | + case 2: | ||
60 | + AlertTitle.setText("현재 실내 미세먼지"); | ||
61 | + AlertNum.setText("51"); | ||
62 | + AlertState.setText("상태 : " + SensorResult.getInnerFineDustState()); | ||
63 | + break; | ||
64 | + case 3: | ||
65 | + AlertTitle.setText("현재 실내 온도"); | ||
66 | + AlertNum.setText(SensorResult.getTemperatureResult() + "℃"); | ||
67 | + AlertState.setText("상태 : " + SensorResult.getTemperatureState()); | ||
68 | + break; | ||
69 | + case 4: | ||
70 | + AlertTitle.setText("현재 실내 습도"); | ||
71 | + AlertNum.setText(SensorResult.getHumidResult()+ "%"); | ||
72 | + AlertState.setText("상태 : " + SensorResult.getHumidState()); | ||
73 | + break; | ||
74 | + case 5: | ||
75 | + AlertTitle.setText("현재 침입자"); | ||
76 | + AlertNum.setText(SensorResult.getIntruderResult()); | ||
77 | + break; | ||
78 | + } | ||
79 | + return true; | ||
80 | + } | ||
81 | + | ||
82 | +} | ||
83 | + |
1 | +package com.example.suemin.smartwindow.view.environment.listview; | ||
2 | + | ||
3 | +import android.os.StrictMode; | ||
4 | + | ||
5 | +import com.example.suemin.smartwindow.view.environment.Env; | ||
6 | + | ||
7 | +import org.xmlpull.v1.XmlPullParser; | ||
8 | +import org.xmlpull.v1.XmlPullParserException; | ||
9 | +import org.xmlpull.v1.XmlPullParserFactory; | ||
10 | + | ||
11 | +import java.io.IOException; | ||
12 | +import java.net.MalformedURLException; | ||
13 | +import java.net.URL; | ||
14 | + | ||
15 | +public class Finedust { | ||
16 | + | ||
17 | + public static String getFineDustResult(){ | ||
18 | + String Key = "rqkQD0pLMXekuhOonOeI0xpbtEMtgBjTtMD5DZRWhDwQCezQGQsJ8bhg76N8YuihCKhY76QEWgsaZifSyupTDQ%3D%3D"; | ||
19 | + StrictMode.enableDefaults(); | ||
20 | + String currentLocation = Env.subaddr2; | ||
21 | + boolean inPm10Value = false; | ||
22 | + String pm10Value = null; | ||
23 | + try{ | ||
24 | + URL url = new URL("http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty?numOfRows=1&pageNo=1&stationName=" | ||
25 | + + currentLocation +"&dataTerm=DAILY&ver=1.3&ServiceKey="+Key); | ||
26 | + XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance(); | ||
27 | + XmlPullParser parser = parserCreator.newPullParser(); | ||
28 | + parser.setInput(url.openStream(),null); | ||
29 | + int parserEvent = parser.getEventType(); | ||
30 | + while(parserEvent != XmlPullParser.END_DOCUMENT){ | ||
31 | + switch(parserEvent){ | ||
32 | + case XmlPullParser.START_TAG: | ||
33 | + if(parser.getName().equals("pm10Value")){ | ||
34 | + inPm10Value= true; | ||
35 | + } | ||
36 | + break; | ||
37 | + case XmlPullParser.TEXT: | ||
38 | + if(inPm10Value){ | ||
39 | + pm10Value = parser.getText(); | ||
40 | + inPm10Value = false; | ||
41 | + } | ||
42 | + break; | ||
43 | + case XmlPullParser.END_TAG: | ||
44 | + if(parser.getName().equals("item")){ | ||
45 | + } | ||
46 | + break; | ||
47 | + } | ||
48 | + parserEvent= parser.next(); | ||
49 | + | ||
50 | + } | ||
51 | + } catch (XmlPullParserException e) { | ||
52 | + e.printStackTrace(); | ||
53 | + } catch (MalformedURLException e) { | ||
54 | + e.printStackTrace(); | ||
55 | + } catch (IOException e) { | ||
56 | + e.printStackTrace(); | ||
57 | + } | ||
58 | + return pm10Value; | ||
59 | + } | ||
60 | +} |
1 | +package com.example.suemin.smartwindow.view.environment.listview; | ||
2 | + | ||
3 | +import android.content.Context; | ||
4 | +import android.graphics.drawable.Drawable; | ||
5 | +import android.view.LayoutInflater; | ||
6 | +import android.view.View; | ||
7 | +import android.view.ViewGroup; | ||
8 | +import android.widget.BaseAdapter; | ||
9 | +import android.widget.ImageView; | ||
10 | +import android.widget.TextView; | ||
11 | + | ||
12 | +import com.example.suemin.smartwindow.R; | ||
13 | + | ||
14 | +import java.util.ArrayList; | ||
15 | + | ||
16 | +public class ListViewAdapter extends BaseAdapter { | ||
17 | + | ||
18 | + private ArrayList<ListViewItem> listViewItemList= new ArrayList<ListViewItem>(); | ||
19 | + | ||
20 | + public ListViewAdapter(){} | ||
21 | + | ||
22 | + @Override | ||
23 | + public int getCount() { | ||
24 | + return listViewItemList.size(); | ||
25 | + } | ||
26 | + | ||
27 | + @Override | ||
28 | + public Object getItem(int position) { | ||
29 | + return listViewItemList.get(position); | ||
30 | + } | ||
31 | + | ||
32 | + @Override | ||
33 | + public long getItemId(int position) { | ||
34 | + return position; | ||
35 | + } | ||
36 | + | ||
37 | + @Override | ||
38 | + public View getView(int position, View convertView, ViewGroup parent) { | ||
39 | + final int pos = position; | ||
40 | + final Context context = parent.getContext(); | ||
41 | + | ||
42 | + if(convertView == null){ | ||
43 | + LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); | ||
44 | + convertView = inflater.inflate(R.layout.listview_item, parent, false); | ||
45 | + } | ||
46 | + | ||
47 | + TextView titleTextView = (TextView) convertView.findViewById(R.id.textView1); | ||
48 | + ImageView iconImageView = (ImageView) convertView.findViewById(R.id.imageView1); | ||
49 | + | ||
50 | + ListViewItem listViewItem = listViewItemList.get(position); | ||
51 | + | ||
52 | + titleTextView.setText(listViewItem.getTitle()); | ||
53 | + iconImageView.setImageDrawable(listViewItem.getIcon()); | ||
54 | + | ||
55 | + return convertView; | ||
56 | + } | ||
57 | + public void addItem(String title, Drawable icon){ | ||
58 | + ListViewItem item = new ListViewItem(); | ||
59 | + item.setTitle(title); | ||
60 | + item.setIcon(icon); | ||
61 | + listViewItemList.add(item); | ||
62 | + } | ||
63 | +} |
1 | +package com.example.suemin.smartwindow.view.environment.listview; | ||
2 | + | ||
3 | +import android.graphics.drawable.Drawable; | ||
4 | + | ||
5 | +public class ListViewItem { | ||
6 | + private String titleStr ; | ||
7 | + private Drawable iconDrawable ; | ||
8 | + | ||
9 | + public void setIcon(Drawable icon) { | ||
10 | + iconDrawable = icon ; | ||
11 | + } | ||
12 | + public void setTitle(String title) { | ||
13 | + titleStr = title ; | ||
14 | + } | ||
15 | + | ||
16 | + public Drawable getIcon() { | ||
17 | + return this.iconDrawable ; | ||
18 | + } | ||
19 | + public String getTitle() { | ||
20 | + return this.titleStr ; | ||
21 | + } | ||
22 | +} |
1 | +package com.example.suemin.smartwindow.view.home; | ||
2 | + | ||
3 | + | ||
4 | +import android.content.Context; | ||
5 | +import android.os.Bundle; | ||
6 | +import android.support.v4.app.Fragment; | ||
7 | +import android.view.LayoutInflater; | ||
8 | +import android.view.View; | ||
9 | +import android.view.ViewGroup; | ||
10 | +import android.widget.CompoundButton; | ||
11 | +import android.widget.ImageView; | ||
12 | +import android.widget.Switch; | ||
13 | +import android.widget.TextView; | ||
14 | + | ||
15 | +import com.example.suemin.smartwindow.R; | ||
16 | + | ||
17 | +import static com.example.suemin.smartwindow.view.bluetooth.Bluetooth.WindowState; | ||
18 | +import static com.example.suemin.smartwindow.view.bluetooth.Bluetooth.setWindowState; | ||
19 | + | ||
20 | + | ||
21 | + | ||
22 | +public class Home extends Fragment { | ||
23 | + | ||
24 | + | ||
25 | + int num = 0; | ||
26 | + | ||
27 | + public Home() { | ||
28 | + // Required empty public constructor | ||
29 | + } | ||
30 | + | ||
31 | + @Override | ||
32 | + public void onCreate(Bundle savedInstanceState) { | ||
33 | + super.onCreate(savedInstanceState); | ||
34 | + | ||
35 | + } | ||
36 | + @Override | ||
37 | + public View onCreateView(LayoutInflater inflater, ViewGroup container, | ||
38 | + Bundle savedInstanceState) { | ||
39 | + View view = inflater.inflate(R.layout.fragment_home, container, false); | ||
40 | + final TextView optionState= (TextView) view.findViewById(R.id.textView_switch); | ||
41 | + final ImageView imgState = (ImageView) view.findViewById(R.id.imageView2); | ||
42 | + Switch sw = (Switch) view.findViewById(R.id.switch1); | ||
43 | + sw.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | ||
44 | + @Override | ||
45 | + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | ||
46 | + if(isChecked) { | ||
47 | + optionState.setText("“ 열림 ”"); | ||
48 | + imgState.setImageResource(R.drawable.window_open); | ||
49 | + if (!WindowState) { | ||
50 | + setWindowState("n", getString(R.string.addr_m)); | ||
51 | + } | ||
52 | + } | ||
53 | + else{ | ||
54 | + num = num+1; | ||
55 | + optionState.setText("“ 닫힘 ”"); | ||
56 | + imgState.setImageResource(R.drawable.window_closed); | ||
57 | + if(WindowState) {setWindowState("y", getString(R.string.addr_m)); | ||
58 | + } | ||
59 | + } | ||
60 | + } | ||
61 | + }); | ||
62 | + return view; | ||
63 | + } | ||
64 | + | ||
65 | + | ||
66 | + | ||
67 | + @Override | ||
68 | + public void onAttach(Context context) { | ||
69 | + super.onAttach(context); | ||
70 | + } | ||
71 | + | ||
72 | + @Override | ||
73 | + public void onDetach() { | ||
74 | + super.onDetach(); | ||
75 | + } | ||
76 | + | ||
77 | +} |
1 | +<vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
2 | + xmlns:aapt="http://schemas.android.com/aapt" | ||
3 | + android:width="108dp" | ||
4 | + android:height="108dp" | ||
5 | + android:viewportWidth="108" | ||
6 | + android:viewportHeight="108"> | ||
7 | + <path | ||
8 | + android:fillType="evenOdd" | ||
9 | + android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z" | ||
10 | + android:strokeWidth="1" | ||
11 | + android:strokeColor="#00000000"> | ||
12 | + <aapt:attr name="android:fillColor"> | ||
13 | + <gradient | ||
14 | + android:endX="78.5885" | ||
15 | + android:endY="90.9159" | ||
16 | + android:startX="48.7653" | ||
17 | + android:startY="61.0927" | ||
18 | + android:type="linear"> | ||
19 | + <item | ||
20 | + android:color="#44000000" | ||
21 | + android:offset="0.0" /> | ||
22 | + <item | ||
23 | + android:color="#00000000" | ||
24 | + android:offset="1.0" /> | ||
25 | + </gradient> | ||
26 | + </aapt:attr> | ||
27 | + </path> | ||
28 | + <path | ||
29 | + android:fillColor="#FFFFFF" | ||
30 | + android:fillType="nonZero" | ||
31 | + android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z" | ||
32 | + android:strokeWidth="1" | ||
33 | + android:strokeColor="#00000000" /> | ||
34 | +</vector> |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<shape xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + android:padding="10dp" | ||
4 | + android:shape="rectangle" > | ||
5 | + <solid android:color="@color/colorPrimary" /> | ||
6 | + <gradient | ||
7 | + android:startColor="@color/colorPrimary" | ||
8 | + android:endColor="#FFFFFF" | ||
9 | + android:angle= "270"> | ||
10 | + </gradient> | ||
11 | +</shape> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<shape xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + android:padding="10dp" | ||
4 | + android:shape="rectangle" | ||
5 | + > | ||
6 | + <solid android:color="#FFFFFF"></solid> | ||
7 | + <corners | ||
8 | + android:bottomLeftRadius="30dp" | ||
9 | + android:bottomRightRadius="30dp" | ||
10 | + android:topLeftRadius="30dp" | ||
11 | + android:topRightRadius="30dp" /> | ||
12 | + <stroke | ||
13 | + android:width="2dp" | ||
14 | + android:color="@color/colorPrimaryDark" /> | ||
15 | +</shape> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<shape xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + android:padding="10dp" | ||
4 | + android:shape="rectangle" > | ||
5 | + <solid android:color="@color/colorPrimaryDark" /> | ||
6 | + <corners | ||
7 | + android:bottomLeftRadius="20dp" | ||
8 | + android:bottomRightRadius="20dp" | ||
9 | + android:topLeftRadius="20dp" | ||
10 | + android:topRightRadius="20dp" /> | ||
11 | + <stroke | ||
12 | + android:width="1dp" | ||
13 | + android:color="@color/colorPrimaryDark" /> | ||
14 | +</shape> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<vector android:height="24dp" android:tint="#3A73C0" | ||
2 | + android:viewportHeight="24.0" android:viewportWidth="24.0" | ||
3 | + android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android" | ||
4 | + > | ||
5 | + <group | ||
6 | + android:name="rotationGroup" | ||
7 | + android:pivotX="12" | ||
8 | + android:pivotY="12" | ||
9 | + android:rotation= "90"> | ||
10 | + <path android:fillAlpha=".3" android:fillColor="#3a73c0" android:pathData="M17,5.33C17,4.6 16.4,4 15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33V8h10V5.33z"/> | ||
11 | + <path android:fillColor="#3a73c0" android:pathData="M7,8v12.67C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V8H7z"/> | ||
12 | + </group> | ||
13 | +</vector> |
1 | +<vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
2 | + android:width="20dp" | ||
3 | + android:height="20dp" | ||
4 | + android:viewportWidth="27.0" | ||
5 | + android:viewportHeight="27.0"> | ||
6 | + <path | ||
7 | + android:fillColor="@color/colorAccent" | ||
8 | + android:pathData="M17.71,7.71L12,2h-1v7.59L6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 11,14.41L11,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM13,5.83l1.88,1.88L13,9.59L13,5.83zM14.88,16.29L13,18.17v-3.76l1.88,1.88z"/> | ||
9 | +</vector> |
1 | +<vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
2 | + android:width="30dp" | ||
3 | + android:height="30dp" | ||
4 | + android:viewportWidth="24.0" | ||
5 | + android:viewportHeight="24.0"> | ||
6 | + <path | ||
7 | + android:fillColor="#3a73c0" | ||
8 | + android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM19,18H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h0.71C7.37,7.69 9.48,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3s-1.34,3 -3,3z"/> | ||
9 | +</vector> |
1 | +<vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
2 | + android:width="24dp" | ||
3 | + android:height="24dp" | ||
4 | + android:viewportWidth="24.0" | ||
5 | + android:viewportHeight="24.0"> | ||
6 | + <path | ||
7 | + android:fillColor="#FF000000" | ||
8 | + android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" /> | ||
9 | +</vector> |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + android:width="108dp" | ||
4 | + android:height="108dp" | ||
5 | + android:viewportWidth="108" | ||
6 | + android:viewportHeight="108"> | ||
7 | + <path | ||
8 | + android:fillColor="#008577" | ||
9 | + android:pathData="M0,0h108v108h-108z" /> | ||
10 | + <path | ||
11 | + android:fillColor="#00000000" | ||
12 | + android:pathData="M9,0L9,108" | ||
13 | + android:strokeWidth="0.8" | ||
14 | + android:strokeColor="#33FFFFFF" /> | ||
15 | + <path | ||
16 | + android:fillColor="#00000000" | ||
17 | + android:pathData="M19,0L19,108" | ||
18 | + android:strokeWidth="0.8" | ||
19 | + android:strokeColor="#33FFFFFF" /> | ||
20 | + <path | ||
21 | + android:fillColor="#00000000" | ||
22 | + android:pathData="M29,0L29,108" | ||
23 | + android:strokeWidth="0.8" | ||
24 | + android:strokeColor="#33FFFFFF" /> | ||
25 | + <path | ||
26 | + android:fillColor="#00000000" | ||
27 | + android:pathData="M39,0L39,108" | ||
28 | + android:strokeWidth="0.8" | ||
29 | + android:strokeColor="#33FFFFFF" /> | ||
30 | + <path | ||
31 | + android:fillColor="#00000000" | ||
32 | + android:pathData="M49,0L49,108" | ||
33 | + android:strokeWidth="0.8" | ||
34 | + android:strokeColor="#33FFFFFF" /> | ||
35 | + <path | ||
36 | + android:fillColor="#00000000" | ||
37 | + android:pathData="M59,0L59,108" | ||
38 | + android:strokeWidth="0.8" | ||
39 | + android:strokeColor="#33FFFFFF" /> | ||
40 | + <path | ||
41 | + android:fillColor="#00000000" | ||
42 | + android:pathData="M69,0L69,108" | ||
43 | + android:strokeWidth="0.8" | ||
44 | + android:strokeColor="#33FFFFFF" /> | ||
45 | + <path | ||
46 | + android:fillColor="#00000000" | ||
47 | + android:pathData="M79,0L79,108" | ||
48 | + android:strokeWidth="0.8" | ||
49 | + android:strokeColor="#33FFFFFF" /> | ||
50 | + <path | ||
51 | + android:fillColor="#00000000" | ||
52 | + android:pathData="M89,0L89,108" | ||
53 | + android:strokeWidth="0.8" | ||
54 | + android:strokeColor="#33FFFFFF" /> | ||
55 | + <path | ||
56 | + android:fillColor="#00000000" | ||
57 | + android:pathData="M99,0L99,108" | ||
58 | + android:strokeWidth="0.8" | ||
59 | + android:strokeColor="#33FFFFFF" /> | ||
60 | + <path | ||
61 | + android:fillColor="#00000000" | ||
62 | + android:pathData="M0,9L108,9" | ||
63 | + android:strokeWidth="0.8" | ||
64 | + android:strokeColor="#33FFFFFF" /> | ||
65 | + <path | ||
66 | + android:fillColor="#00000000" | ||
67 | + android:pathData="M0,19L108,19" | ||
68 | + android:strokeWidth="0.8" | ||
69 | + android:strokeColor="#33FFFFFF" /> | ||
70 | + <path | ||
71 | + android:fillColor="#00000000" | ||
72 | + android:pathData="M0,29L108,29" | ||
73 | + android:strokeWidth="0.8" | ||
74 | + android:strokeColor="#33FFFFFF" /> | ||
75 | + <path | ||
76 | + android:fillColor="#00000000" | ||
77 | + android:pathData="M0,39L108,39" | ||
78 | + android:strokeWidth="0.8" | ||
79 | + android:strokeColor="#33FFFFFF" /> | ||
80 | + <path | ||
81 | + android:fillColor="#00000000" | ||
82 | + android:pathData="M0,49L108,49" | ||
83 | + android:strokeWidth="0.8" | ||
84 | + android:strokeColor="#33FFFFFF" /> | ||
85 | + <path | ||
86 | + android:fillColor="#00000000" | ||
87 | + android:pathData="M0,59L108,59" | ||
88 | + android:strokeWidth="0.8" | ||
89 | + android:strokeColor="#33FFFFFF" /> | ||
90 | + <path | ||
91 | + android:fillColor="#00000000" | ||
92 | + android:pathData="M0,69L108,69" | ||
93 | + android:strokeWidth="0.8" | ||
94 | + android:strokeColor="#33FFFFFF" /> | ||
95 | + <path | ||
96 | + android:fillColor="#00000000" | ||
97 | + android:pathData="M0,79L108,79" | ||
98 | + android:strokeWidth="0.8" | ||
99 | + android:strokeColor="#33FFFFFF" /> | ||
100 | + <path | ||
101 | + android:fillColor="#00000000" | ||
102 | + android:pathData="M0,89L108,89" | ||
103 | + android:strokeWidth="0.8" | ||
104 | + android:strokeColor="#33FFFFFF" /> | ||
105 | + <path | ||
106 | + android:fillColor="#00000000" | ||
107 | + android:pathData="M0,99L108,99" | ||
108 | + android:strokeWidth="0.8" | ||
109 | + android:strokeColor="#33FFFFFF" /> | ||
110 | + <path | ||
111 | + android:fillColor="#00000000" | ||
112 | + android:pathData="M19,29L89,29" | ||
113 | + android:strokeWidth="0.8" | ||
114 | + android:strokeColor="#33FFFFFF" /> | ||
115 | + <path | ||
116 | + android:fillColor="#00000000" | ||
117 | + android:pathData="M19,39L89,39" | ||
118 | + android:strokeWidth="0.8" | ||
119 | + android:strokeColor="#33FFFFFF" /> | ||
120 | + <path | ||
121 | + android:fillColor="#00000000" | ||
122 | + android:pathData="M19,49L89,49" | ||
123 | + android:strokeWidth="0.8" | ||
124 | + android:strokeColor="#33FFFFFF" /> | ||
125 | + <path | ||
126 | + android:fillColor="#00000000" | ||
127 | + android:pathData="M19,59L89,59" | ||
128 | + android:strokeWidth="0.8" | ||
129 | + android:strokeColor="#33FFFFFF" /> | ||
130 | + <path | ||
131 | + android:fillColor="#00000000" | ||
132 | + android:pathData="M19,69L89,69" | ||
133 | + android:strokeWidth="0.8" | ||
134 | + android:strokeColor="#33FFFFFF" /> | ||
135 | + <path | ||
136 | + android:fillColor="#00000000" | ||
137 | + android:pathData="M19,79L89,79" | ||
138 | + android:strokeWidth="0.8" | ||
139 | + android:strokeColor="#33FFFFFF" /> | ||
140 | + <path | ||
141 | + android:fillColor="#00000000" | ||
142 | + android:pathData="M29,19L29,89" | ||
143 | + android:strokeWidth="0.8" | ||
144 | + android:strokeColor="#33FFFFFF" /> | ||
145 | + <path | ||
146 | + android:fillColor="#00000000" | ||
147 | + android:pathData="M39,19L39,89" | ||
148 | + android:strokeWidth="0.8" | ||
149 | + android:strokeColor="#33FFFFFF" /> | ||
150 | + <path | ||
151 | + android:fillColor="#00000000" | ||
152 | + android:pathData="M49,19L49,89" | ||
153 | + android:strokeWidth="0.8" | ||
154 | + android:strokeColor="#33FFFFFF" /> | ||
155 | + <path | ||
156 | + android:fillColor="#00000000" | ||
157 | + android:pathData="M59,19L59,89" | ||
158 | + android:strokeWidth="0.8" | ||
159 | + android:strokeColor="#33FFFFFF" /> | ||
160 | + <path | ||
161 | + android:fillColor="#00000000" | ||
162 | + android:pathData="M69,19L69,89" | ||
163 | + android:strokeWidth="0.8" | ||
164 | + android:strokeColor="#33FFFFFF" /> | ||
165 | + <path | ||
166 | + android:fillColor="#00000000" | ||
167 | + android:pathData="M79,19L79,89" | ||
168 | + android:strokeWidth="0.8" | ||
169 | + android:strokeColor="#33FFFFFF" /> | ||
170 | +</vector> |
3.61 KB
16.9 KB
28.4 KB
15.1 KB
38.7 KB
21.4 KB
20.3 KB
27.4 KB
24.9 KB
1 | +<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt" | ||
2 | + android:viewportWidth="480.011" | ||
3 | + android:viewportHeight="480.011" | ||
4 | + android:width="512dp" | ||
5 | + android:height="512dp"> | ||
6 | + <path | ||
7 | + android:pathData="M440.03 216.004c-14.362 -0.012 -26.964 -9.572 -30.844 -23.4 -10.301 -36.573 -32.069 -68.873 -62.1 -92.15 -63.11 -48.595 -151.033 -48.595 -214.143 0 -12.083 9.329 -22.896 20.195 -32.164 32.325l66.2 -19.471c16.955 -4.987 34.742 4.716 39.729 21.671s-4.716 34.742 -21.671 39.729l-135.994 40c-16.955 4.986 -34.742 -4.717 -39.728 -21.672 -0.694 -2.362 -1.114 -4.795 -1.251 -7.253l-8 -144c-1.104 -17.639 12.301 -32.832 29.939 -33.935s32.832 12.301 33.935 29.94c0.009 0.149 0.018 0.298 0.025 0.448l2.045 36.805c84.413 -89.396 222.822 -100.304 320.196 -25.237 40.928 31.727 70.593 75.753 84.629 125.6 4.75 17.023 -5.2 34.673 -22.223 39.423 -2.793 0.779 -5.678 1.175 -8.577 1.177zm-408.017 -192c-0.3 0 -0.593 0.009 -0.893 0.025 -8.816 0.503 -15.562 8.046 -15.082 16.863l8 144c0.491 8.823 8.041 15.577 16.864 15.087 1.228 -0.068 2.443 -0.278 3.623 -0.625l136 -40c8.478 -2.493 13.329 -11.387 10.835 -19.865s-11.387 -13.329 -19.865 -10.835l-87.453 25.722c-4.239 1.247 -8.686 -1.179 -9.932 -5.418 -0.624 -2.123 -0.342 -4.409 0.781 -6.316 12.433 -21.203 28.818 -39.824 48.268 -54.853l4.89 6.331 -4.89 -6.331c68.87 -53.045 164.83 -53.045 233.7 0 32.758 25.389 56.502 60.622 67.738 100.515 2.375 8.512 11.2 13.487 19.712 11.112s13.487 -11.2 11.112 -19.712c-13.103 -46.531 -40.794 -87.627 -79 -117.243 -80.393 -61.945 -192.431 -61.945 -272.824 0 -14.208 10.994 -27.043 23.658 -38.227 37.717 -2.753 3.456 -7.786 4.026 -11.242 1.273 -1.784 -1.421 -2.877 -3.536 -3.003 -5.814l-3.14 -56.523c-0.484 -8.471 -7.488 -15.096 -15.972 -15.11z" | ||
8 | + android:fillColor="@color/colorAccent" /> | ||
9 | + <path | ||
10 | + android:pathData="M240.013 480.004c-52.923 0.184 -104.385 -17.344 -146.193 -49.793 -40.928 -31.726 -70.592 -75.751 -84.627 -125.597 -4.689 -17.04 5.323 -34.654 22.363 -39.343 16.957 -4.666 34.501 5.226 39.284 22.15 10.301 36.571 32.069 68.869 62.1 92.143 76.608 59.134 186.648 44.969 245.782 -31.639 0.176 -0.228 0.351 -0.456 0.526 -0.685l-66.2 19.471c-16.882 5.23 -34.806 -4.216 -40.036 -21.098s4.216 -34.806 21.098 -40.036c0.292 -0.091 0.586 -0.177 0.881 -0.259l135.993 -40c16.955 -4.986 34.742 4.716 39.728 21.672 0.694 2.361 1.114 4.794 1.251 7.25l8 143.989c0.959 17.637 -12.54 32.723 -30.175 33.722 -0.6 0.034 -1.2 0.051 -1.8 0.051 -16.975 -0.012 -30.986 -13.276 -31.928 -30.225l-2.045 -36.8c-45.149 47.968 -108.129 75.124 -174.002 75.027zm-200.008 -199.985c-8.837 0.006 -15.995 7.175 -15.989 16.011 0.001 1.45 0.199 2.892 0.589 4.289 13.103 46.528 40.794 87.622 79 117.235 80.395 61.94 192.43 61.94 272.825 0 14.208 -10.994 27.042 -23.656 38.227 -37.714 2.753 -3.456 7.786 -4.026 11.242 -1.273 1.784 1.421 2.876 3.536 3.003 5.813l3.14 56.518c0.547 8.82 8.141 15.526 16.96 14.978 8.739 -0.542 15.419 -8.009 14.99 -16.754l-8 -143.988c-0.491 -8.823 -8.042 -15.577 -16.865 -15.086 -1.228 0.068 -2.444 0.278 -3.623 0.625l-135.995 40c-8.483 2.476 -13.352 11.359 -10.876 19.842s11.359 13.352 19.842 10.876c0.021 -0.006 0.041 -0.012 0.062 -0.018l87.449 -25.719c4.239 -1.247 8.686 1.178 9.933 5.416 0.625 2.123 0.342 4.411 -0.781 6.318 -12.433 21.202 -28.818 39.821 -48.268 54.848 -68.871 53.043 -164.829 53.043 -233.7 0 -32.755 -25.385 -56.498 -60.613 -67.735 -100.5 -1.936 -6.923 -8.242 -11.712 -15.43 -11.717z" | ||
11 | + android:fillColor="@color/colorAccent" /> | ||
12 | + | ||
13 | +</vector> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
8.09 KB
14.4 KB
No preview for this file type
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<font-family xmlns:android="http://schemas.android.com/apk/res/android"> | ||
3 | + <font | ||
4 | + android:fontStyle = "normal" | ||
5 | + android:fontWeight="400" | ||
6 | + android:font = "@font/noto"/> | ||
7 | + <font | ||
8 | + android:fontStyle = "normal" | ||
9 | + android:fontWeight = "400" | ||
10 | + android:font = "@font/beba"/> | ||
11 | +</font-family> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
No preview for this file type
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + xmlns:app="http://schemas.android.com/apk/res-auto" | ||
4 | + xmlns:tools="http://schemas.android.com/tools" | ||
5 | + android:id="@+id/container" | ||
6 | + android:layout_width="match_parent" | ||
7 | + android:layout_height="match_parent" | ||
8 | + tools:context="com.example.suemin.smartwindow.view.MainActivity" | ||
9 | + > | ||
10 | + | ||
11 | + | ||
12 | + <android.support.v7.widget.Toolbar | ||
13 | + android:id="@+id/tb" | ||
14 | + android:layout_width="match_parent" | ||
15 | + android:layout_height="wrap_content" | ||
16 | + android:background="@color/colorPrimaryDark"> | ||
17 | + <ImageView | ||
18 | + android:layout_width="32dp" | ||
19 | + android:layout_height="30dp" | ||
20 | + android:src="@drawable/icon" | ||
21 | + android:paddingTop="8dp" | ||
22 | + android:layout_marginRight="5dp"/> | ||
23 | + | ||
24 | + <TextView | ||
25 | + android:layout_width="match_parent" | ||
26 | + android:layout_height="match_parent" | ||
27 | + android:gravity="left" | ||
28 | + android:text="@string/app_name" | ||
29 | + android:fontFamily="@font/beba" | ||
30 | + android:textColor="@color/colorAccent" | ||
31 | + android:textSize="21dp" | ||
32 | + android:textStyle="bold" | ||
33 | + /> | ||
34 | + | ||
35 | + </android.support.v7.widget.Toolbar> | ||
36 | + | ||
37 | + <FrameLayout | ||
38 | + android:id="@+id/frameLayout" | ||
39 | + android:layout_width="match_parent" | ||
40 | + android:layout_height="match_parent" | ||
41 | + android:layout_marginTop="?attr/actionBarSize" | ||
42 | + android:layout_marginBottom="?attr/actionBarSize" | ||
43 | + /> | ||
44 | + | ||
45 | + <android.support.design.widget.BottomNavigationView | ||
46 | + android:id="@+id/navigation" | ||
47 | + android:layout_width="0dp" | ||
48 | + android:layout_height="wrap_content" | ||
49 | + android:layout_marginStart="0dp" | ||
50 | + android:layout_marginEnd="0dp" | ||
51 | + android:background="@color/colorPrimaryDark" | ||
52 | + app:layout_constraintBottom_toBottomOf="parent" | ||
53 | + app:layout_constraintLeft_toLeftOf="parent" | ||
54 | + app:layout_constraintRight_toRightOf="parent" | ||
55 | + app:menu="@menu/navigation" /> | ||
56 | + | ||
57 | +</android.support.constraint.ConstraintLayout> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + android:layout_width="match_parent" | ||
4 | + android:layout_height="wrap_content" | ||
5 | + > | ||
6 | + <TextView | ||
7 | + android:id="@+id/bt_textView" | ||
8 | + android:layout_width="wrap_content" | ||
9 | + android:layout_height="wrap_content" | ||
10 | + android:layout_marginLeft="16dp" | ||
11 | + android:gravity="left" | ||
12 | + android:text="name" | ||
13 | + android:textColor="@color/colorAccent" | ||
14 | + android:fontFamily="@font/noto" | ||
15 | + android:textSize="21dp" | ||
16 | + /> | ||
17 | + <TextView | ||
18 | + android:id="@+id/bt_textView_addr" | ||
19 | + android:layout_width="wrap_content" | ||
20 | + android:layout_height="wrap_content" | ||
21 | + android:layout_marginLeft="16dp" | ||
22 | + android:gravity="left" | ||
23 | + android:text="addr" | ||
24 | + android:textColor="@color/colorAccent" | ||
25 | + android:textSize="14dp" | ||
26 | + android:layout_below="@+id/bt_textView" | ||
27 | + /> | ||
28 | +</RelativeLayout> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + android:layout_width="match_parent" | ||
4 | + android:layout_height="match_parent" | ||
5 | + android:gravity="center" | ||
6 | + android:orientation="vertical" | ||
7 | + > | ||
8 | + | ||
9 | + <LinearLayout | ||
10 | + android:layout_width="250dp" | ||
11 | + android:layout_height="wrap_content" | ||
12 | + android:paddingBottom="15dp" | ||
13 | + android:paddingTop="15dp" | ||
14 | + android:gravity="center" | ||
15 | + android:orientation="vertical" | ||
16 | + android:background="@drawable/dialog_background"> | ||
17 | + | ||
18 | + <TextView | ||
19 | + android:id="@+id/dialog_title" | ||
20 | + android:layout_width="wrap_content" | ||
21 | + android:layout_height="wrap_content" | ||
22 | + android:layout_marginTop="10dp" | ||
23 | + android:layout_marginBottom="10dp" | ||
24 | + android:textSize="20dp" /> | ||
25 | + | ||
26 | + <TextView | ||
27 | + android:id="@+id/dialog_num" | ||
28 | + android:layout_width="wrap_content" | ||
29 | + android:layout_height="wrap_content" | ||
30 | + android:layout_marginTop="5dp" | ||
31 | + android:layout_marginBottom="5dp" | ||
32 | + android:textSize="60dp" /> | ||
33 | + <TextView | ||
34 | + android:id="@+id/dialog_state" | ||
35 | + android:layout_width="wrap_content" | ||
36 | + android:layout_height="wrap_content" | ||
37 | + android:layout_marginBottom="15dp" | ||
38 | + android:textSize="15dp" /> | ||
39 | + <Button | ||
40 | + android:id="@+id/pbutton" | ||
41 | + android:layout_width="50dp" | ||
42 | + android:layout_height="25dp" | ||
43 | + android:layout_marginBottom="10dp" | ||
44 | + android:background="@drawable/dialog_button_background" | ||
45 | + android:text="OK" | ||
46 | + android:textColor="@color/colorAccent"/> | ||
47 | + </LinearLayout> | ||
48 | + | ||
49 | + | ||
50 | + | ||
51 | +</LinearLayout> | ||
52 | + |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + xmlns:tools="http://schemas.android.com/tools" | ||
4 | + android:layout_width="match_parent" | ||
5 | + android:layout_height="match_parent" | ||
6 | + tools:context="com.example.suemin.smartwindow.view.bluetooth.Bluetooth" | ||
7 | + android:background="@color/colorPrimaryDark"> | ||
8 | + | ||
9 | + <TextView | ||
10 | + android:layout_width="wrap_content" | ||
11 | + android:layout_height="22dp" | ||
12 | + android:layout_marginLeft="10dp" | ||
13 | + android:layout_marginTop="5dp" | ||
14 | + android:text="검색된 기기" | ||
15 | + android:textSize="12dp" | ||
16 | + android:textStyle="bold" | ||
17 | + android:textColor="#a04e4e4e"/> | ||
18 | + <ListView | ||
19 | + android:id="@android:id/list" | ||
20 | + android:layout_width="match_parent" | ||
21 | + android:layout_height="wrap_content" | ||
22 | + android:layout_marginTop="24dp"> | ||
23 | + | ||
24 | + </ListView> | ||
25 | + <RelativeLayout | ||
26 | + android:layout_width="wrap_content" | ||
27 | + android:layout_height="60dp" | ||
28 | + android:layout_gravity="bottom" | ||
29 | + android:paddingBottom="15dp"> | ||
30 | + | ||
31 | + <Button | ||
32 | + android:id="@+id/bt_find_btn" | ||
33 | + android:layout_width="50dp" | ||
34 | + android:layout_height="50dp" | ||
35 | + android:layout_alignParentRight="true" | ||
36 | + android:layout_alignParentBottom="true" | ||
37 | + android:layout_marginRight="20dp" | ||
38 | + android:background="@drawable/sync" | ||
39 | + /> | ||
40 | + </RelativeLayout> | ||
41 | + | ||
42 | + | ||
43 | + | ||
44 | +</FrameLayout> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + xmlns:tools="http://schemas.android.com/tools" | ||
4 | + android:layout_width="match_parent" | ||
5 | + android:layout_height="match_parent" | ||
6 | + xmlns:app="http://schemas.android.com/apk/res-auto" | ||
7 | + tools:context="com.example.suemin.smartwindow.view.environment.Env" | ||
8 | + android:background="@color/colorPrimaryDark"> | ||
9 | + | ||
10 | + <LinearLayout | ||
11 | + android:layout_width="match_parent" | ||
12 | + android:layout_height="wrap_content" | ||
13 | + android:orientation="vertical" | ||
14 | + > | ||
15 | + <!-- TODO: Update blank fragment layout --> | ||
16 | + <RelativeLayout | ||
17 | + android:layout_width="wrap_content" | ||
18 | + android:layout_height="20dp" | ||
19 | + android:layout_marginTop="10dp" | ||
20 | + > | ||
21 | + <ImageView | ||
22 | + android:layout_width="10dp" | ||
23 | + android:layout_height="10dp" | ||
24 | + android:layout_marginStart="7dp" | ||
25 | + android:id="@+id/imageView1" | ||
26 | + android:layout_centerVertical="true" | ||
27 | + android:src="@drawable/icon_loca" | ||
28 | + /> | ||
29 | + | ||
30 | + <TextView | ||
31 | + android:id="@+id/location_text" | ||
32 | + android:layout_width="wrap_content" | ||
33 | + android:layout_height="wrap_content" | ||
34 | + android:layout_marginTop="1dp" | ||
35 | + android:layout_marginStart="2dp" | ||
36 | + android:layout_toRightOf="@+id/imageView1" | ||
37 | + android:text="위치 확인중..." | ||
38 | + android:textColor="@color/colorAccent" | ||
39 | + android:textSize="12dp"/> | ||
40 | + | ||
41 | + </RelativeLayout> | ||
42 | + <ListView | ||
43 | + android:id="@+id/list" | ||
44 | + android:layout_width="match_parent" | ||
45 | + android:layout_height="wrap_content" | ||
46 | + /> | ||
47 | + </LinearLayout> | ||
48 | + | ||
49 | +</FrameLayout> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + xmlns:tools="http://schemas.android.com/tools" | ||
4 | + android:layout_width="match_parent" | ||
5 | + android:layout_height="match_parent" | ||
6 | + xmlns:app="http://schemas.android.com/apk/res-auto" | ||
7 | + tools:context="com.example.suemin.smartwindow.view.home.Home" | ||
8 | + android:background="@color/colorPrimaryDark"> | ||
9 | + | ||
10 | + | ||
11 | + <RelativeLayout | ||
12 | + android:layout_width="match_parent" | ||
13 | + android:layout_height="match_parent" | ||
14 | + android:orientation="vertical"> | ||
15 | + | ||
16 | + <ImageView | ||
17 | + android:id="@+id/imageView2" | ||
18 | + android:layout_width="197dp" | ||
19 | + android:layout_height="200dp" | ||
20 | + android:layout_marginTop="80dp" | ||
21 | + android:layout_marginBottom="50dp" | ||
22 | + android:adjustViewBounds="true" | ||
23 | + android:src="@drawable/window_closed" | ||
24 | + android:layout_centerHorizontal="true" | ||
25 | + /> | ||
26 | + | ||
27 | + <RelativeLayout | ||
28 | + android:layout_width="wrap_content" | ||
29 | + android:layout_height="wrap_content" | ||
30 | + android:layout_marginStart="100dp" | ||
31 | + android:layout_below="@id/imageView2" | ||
32 | + android:layout_centerHorizontal="true" | ||
33 | + > | ||
34 | + | ||
35 | + <Switch | ||
36 | + android:id="@+id/switch1" | ||
37 | + android:layout_width="wrap_content" | ||
38 | + android:layout_height="wrap_content" | ||
39 | + android:layout_marginBottom="10dp" | ||
40 | + android:layout_alignParentTop="true" | ||
41 | + android:layout_centerHorizontal="true" | ||
42 | + /> | ||
43 | + | ||
44 | + <TextView | ||
45 | + android:id="@+id/textView2" | ||
46 | + android:layout_width="wrap_content" | ||
47 | + android:layout_height="wrap_content" | ||
48 | + android:layout_below="@id/switch1" | ||
49 | + android:layout_centerHorizontal="true" | ||
50 | + android:textColor="@color/colorAccent" | ||
51 | + android:text="현재 창문 상태는" | ||
52 | + android:textSize="17dp" /> | ||
53 | + | ||
54 | + <TextView | ||
55 | + android:id="@+id/textView_switch" | ||
56 | + android:layout_width="wrap_content" | ||
57 | + android:layout_height="wrap_content" | ||
58 | + android:fontFamily="@font/noto" | ||
59 | + android:text="“ 닫힘 ”" | ||
60 | + android:textSize="25dp" | ||
61 | + android:textStyle="bold" | ||
62 | + android:textColor="@color/colorAccent" | ||
63 | + android:layout_below="@id/textView2" | ||
64 | + android:layout_centerHorizontal="true" | ||
65 | + /> | ||
66 | + </RelativeLayout> | ||
67 | + </RelativeLayout> | ||
68 | + | ||
69 | +</FrameLayout> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<!-- Copyright (C) 2013 The Android Open Source Project | ||
3 | + Licensed under the Apache License, Version 2.0 (the "License"); | ||
4 | + you may not use this file except in compliance with the License. | ||
5 | + You may obtain a copy of the License at | ||
6 | + http://www.apache.org/licenses/LICENSE-2.0 | ||
7 | + Unless required by applicable law or agreed to in writing, software | ||
8 | + distributed under the License is distributed on an "AS IS" BASIS, | ||
9 | + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
10 | + See the License for the specific language governing permissions and | ||
11 | + limitations under the License. | ||
12 | +--> | ||
13 | +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
14 | + android:orientation="vertical" | ||
15 | + android:layout_width="match_parent" | ||
16 | + android:layout_height="wrap_content" | ||
17 | + android:layout_margin="10dp"> | ||
18 | + <LinearLayout android:orientation="horizontal" | ||
19 | + android:layout_width="match_parent" | ||
20 | + android:layout_height="wrap_content" | ||
21 | + android:layout_margin="10dp"> | ||
22 | + <TextView android:layout_width="wrap_content" | ||
23 | + android:layout_height="wrap_content" | ||
24 | + android:text="State : " | ||
25 | + android:textSize="18sp"/> | ||
26 | + <Space android:layout_width="5dp" | ||
27 | + android:layout_height="wrap_content"/> | ||
28 | + <TextView android:id="@+id/connection_state" | ||
29 | + android:layout_width="match_parent" | ||
30 | + android:layout_height="wrap_content" | ||
31 | + android:text="no_data" | ||
32 | + android:textSize="18sp"/> | ||
33 | + </LinearLayout> | ||
34 | + <LinearLayout android:orientation="horizontal" | ||
35 | + android:layout_width="match_parent" | ||
36 | + android:layout_height="wrap_content" | ||
37 | + android:layout_margin="10dp"> | ||
38 | + <TextView android:layout_width="wrap_content" | ||
39 | + android:layout_height="wrap_content" | ||
40 | + android:text="Data : " | ||
41 | + android:id="@+id/device_name" | ||
42 | + android:textSize="18sp"/> | ||
43 | + <Space android:layout_width="5dp" | ||
44 | + android:layout_height="wrap_content"/> | ||
45 | + <TextView android:id="@+id/data_value" | ||
46 | + android:layout_width="match_parent" | ||
47 | + android:layout_height="wrap_content" | ||
48 | + android:text="no_data" | ||
49 | + android:textSize="18sp"/> | ||
50 | + </LinearLayout> | ||
51 | + <ExpandableListView android:id="@+id/gatt_services_list" | ||
52 | + android:layout_width="match_parent" | ||
53 | + android:layout_height="wrap_content"/> | ||
54 | +</LinearLayout> |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + android:layout_width="match_parent" | ||
4 | + android:layout_height="wrap_content" | ||
5 | + > | ||
6 | + <RelativeLayout | ||
7 | + android:layout_width="wrap_content" | ||
8 | + android:layout_height="wrap_content" | ||
9 | + android:gravity="start"> | ||
10 | + | ||
11 | + <TextView | ||
12 | + android:id="@+id/textView1" | ||
13 | + android:layout_width="wrap_content" | ||
14 | + android:layout_height="wrap_content" | ||
15 | + android:paddingLeft="15dp" | ||
16 | + android:layout_marginTop="10dp" | ||
17 | + android:layout_marginBottom="10dp" | ||
18 | + android:gravity="fill_horizontal" | ||
19 | + android:fontFamily="@font/noto" | ||
20 | + android:text="New Text" | ||
21 | + android:layout_toRightOf="@id/imageView1" | ||
22 | + android:textColor="@color/colorAccent" | ||
23 | + android:textSize="21dp" /> | ||
24 | + | ||
25 | + <ImageView | ||
26 | + android:layout_width="50dp" | ||
27 | + android:layout_height="50dp" | ||
28 | + android:id="@+id/imageView1" | ||
29 | + android:layout_marginLeft="5dp" | ||
30 | + android:layout_centerVertical="true" | ||
31 | + android:src="@drawable/ic_cloud_queue_black_24dp" | ||
32 | + /> | ||
33 | + </RelativeLayout> | ||
34 | + | ||
35 | + | ||
36 | +</RelativeLayout> |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + android:layout_width="match_parent" | ||
4 | + android:layout_height="wrap_content" | ||
5 | + > | ||
6 | + <TextView | ||
7 | + android:id="@+id/sv_textView" | ||
8 | + android:layout_width="wrap_content" | ||
9 | + android:layout_height="wrap_content" | ||
10 | + android:layout_marginLeft="16dp" | ||
11 | + android:gravity="left" | ||
12 | + android:text="name" | ||
13 | + android:textColor="@color/colorAccent" | ||
14 | + android:fontFamily="@font/noto" | ||
15 | + android:textSize="21dp" | ||
16 | + /> | ||
17 | + <TextView | ||
18 | + android:id="@+id/sv_uuid" | ||
19 | + android:layout_width="wrap_content" | ||
20 | + android:layout_height="wrap_content" | ||
21 | + android:layout_marginLeft="16dp" | ||
22 | + android:gravity="left" | ||
23 | + android:text="addr" | ||
24 | + android:textColor="@color/colorAccent" | ||
25 | + android:textSize="14dp" | ||
26 | + android:layout_below="@+id/sv_textView" | ||
27 | + /> | ||
28 | +</RelativeLayout> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<menu xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + xmlns:app="http://schemas.android.com/apk/res-auto"> | ||
4 | + <item | ||
5 | + android:id="@+id/navigation_bt" | ||
6 | + android:title="BT" | ||
7 | + android:icon="@drawable/ic_bluetooth_black_24dp" | ||
8 | + app:showAsAction="always" | ||
9 | + /> | ||
10 | + | ||
11 | + </menu> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<menu xmlns:android="http://schemas.android.com/apk/res/android" | ||
3 | + xmlns:app="http://schemas.android.com/apk/res-auto"> | ||
4 | + <item | ||
5 | + android:id="@+id/navigation_home" | ||
6 | + android:icon="@drawable/ic_home_black_24dp" | ||
7 | + android:title="@string/title_home" | ||
8 | + /> | ||
9 | + | ||
10 | + <item | ||
11 | + android:id="@+id/navigation_env" | ||
12 | + android:icon="@drawable/ic_cloud_queue_black_24dp" | ||
13 | + android:title="@string/title_activity_main2" /> | ||
14 | + | ||
15 | + <item | ||
16 | + android:id="@+id/navigation_bt" | ||
17 | + android:icon="@drawable/ic_bluetooth_black_24dp" | ||
18 | + android:title="@string/title_activity_main33" /> | ||
19 | + | ||
20 | +</menu> |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | ||
3 | + <background android:drawable="@drawable/ic_launcher_background" /> | ||
4 | + <foreground android:drawable="@drawable/ic_launcher_foreground" /> | ||
5 | +</adaptive-icon> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +<?xml version="1.0" encoding="utf-8"?> | ||
2 | +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | ||
3 | + <background android:drawable="@drawable/ic_launcher_background" /> | ||
4 | + <foreground android:drawable="@drawable/ic_launcher_foreground" /> | ||
5 | +</adaptive-icon> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
2.89 KB
4.79 KB
2.01 KB
2.72 KB
4.38 KB
6.73 KB
6.24 KB
10.2 KB
8.91 KB
14.8 KB
No preview for this file type
1 | +<resources> | ||
2 | + <string name="app_name">SMART WINDOW</string> | ||
3 | + <string name="title_home">Home</string> | ||
4 | + <string name="title_activity_main2">Environment</string> | ||
5 | + <string name="title_activity_main33">Bluetooth</string> | ||
6 | + <string name="connected">Connected</string> | ||
7 | + <string name="disconnected">Disconnected</string> | ||
8 | + <string name="addr_m">90:E2:02:8F:36:70</string> | ||
9 | + <string name="addr_d">90:E2:02:8E:1F:21</string> | ||
10 | + <string name="addr_r">90:E2:02:92:A9:0E</string> | ||
11 | +</resources> |
1 | +<resources> | ||
2 | + | ||
3 | + <!-- Base application theme. --> | ||
4 | + <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> | ||
5 | + <!-- Customize your theme here. --> | ||
6 | + <item name="colorPrimary">@color/colorPrimary</item> | ||
7 | + <item name="colorPrimaryDark">@color/colorPrimaryDark</item> | ||
8 | + <item name="colorAccent">@color/colorAccent</item> | ||
9 | + </style> | ||
10 | + | ||
11 | +</resources> |
android/smartwindow/app/src/test/java/com/example/suemin/smartwindow/ExampleUnitTest.java
0 → 100644
1 | +package com.example.suemin.smartwindow; | ||
2 | + | ||
3 | +import org.junit.Test; | ||
4 | + | ||
5 | +import static org.junit.Assert.*; | ||
6 | + | ||
7 | +/** | ||
8 | + * Example local unit test, which will execute on the development machine (host). | ||
9 | + * | ||
10 | + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | ||
11 | + */ | ||
12 | +public class ExampleUnitTest { | ||
13 | + @Test | ||
14 | + public void addition_isCorrect() { | ||
15 | + assertEquals(4, 2 + 2); | ||
16 | + } | ||
17 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
android/smartwindow/build.gradle
0 → 100644
1 | +// Top-level build file where you can add configuration options common to all sub-projects/modules. | ||
2 | + | ||
3 | +buildscript { | ||
4 | + | ||
5 | + repositories { | ||
6 | + google() | ||
7 | + jcenter() | ||
8 | + } | ||
9 | + dependencies { | ||
10 | + classpath 'com.android.tools.build:gradle:3.2.1' | ||
11 | + | ||
12 | + | ||
13 | + // NOTE: Do not place your application dependencies here; they belong | ||
14 | + // in the individual module build.gradle files | ||
15 | + } | ||
16 | +} | ||
17 | + | ||
18 | +allprojects { | ||
19 | + repositories { | ||
20 | + google() | ||
21 | + jcenter() | ||
22 | + } | ||
23 | +} | ||
24 | + | ||
25 | +task clean(type: Delete) { | ||
26 | + delete rootProject.buildDir | ||
27 | +} |
android/smartwindow/gradle.properties
0 → 100644
1 | +# Project-wide Gradle settings. | ||
2 | +# IDE (e.g. Android Studio) users: | ||
3 | +# Gradle settings configured through the IDE *will override* | ||
4 | +# any settings specified in this file. | ||
5 | +# For more details on how to configure your build environment visit | ||
6 | +# http://www.gradle.org/docs/current/userguide/build_environment.html | ||
7 | +# Specifies the JVM arguments used for the daemon process. | ||
8 | +# The setting is particularly useful for tweaking memory settings. | ||
9 | +org.gradle.jvmargs=-Xmx1536m | ||
10 | +# When configured, Gradle will run in incubating parallel mode. | ||
11 | +# This option should only be used with decoupled projects. More details, visit | ||
12 | +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects | ||
13 | +# org.gradle.parallel=true | ||
14 | + | ||
15 | + |
No preview for this file type
android/smartwindow/gradlew
0 → 100644
1 | +#!/usr/bin/env sh | ||
2 | + | ||
3 | +############################################################################## | ||
4 | +## | ||
5 | +## Gradle start up script for UN*X | ||
6 | +## | ||
7 | +############################################################################## | ||
8 | + | ||
9 | +# Attempt to set APP_HOME | ||
10 | +# Resolve links: $0 may be a link | ||
11 | +PRG="$0" | ||
12 | +# Need this for relative symlinks. | ||
13 | +while [ -h "$PRG" ] ; do | ||
14 | + ls=`ls -ld "$PRG"` | ||
15 | + link=`expr "$ls" : '.*-> \(.*\)$'` | ||
16 | + if expr "$link" : '/.*' > /dev/null; then | ||
17 | + PRG="$link" | ||
18 | + else | ||
19 | + PRG=`dirname "$PRG"`"/$link" | ||
20 | + fi | ||
21 | +done | ||
22 | +SAVED="`pwd`" | ||
23 | +cd "`dirname \"$PRG\"`/" >/dev/null | ||
24 | +APP_HOME="`pwd -P`" | ||
25 | +cd "$SAVED" >/dev/null | ||
26 | + | ||
27 | +APP_NAME="Gradle" | ||
28 | +APP_BASE_NAME=`basename "$0"` | ||
29 | + | ||
30 | +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||
31 | +DEFAULT_JVM_OPTS="" | ||
32 | + | ||
33 | +# Use the maximum available, or set MAX_FD != -1 to use that value. | ||
34 | +MAX_FD="maximum" | ||
35 | + | ||
36 | +warn () { | ||
37 | + echo "$*" | ||
38 | +} | ||
39 | + | ||
40 | +die () { | ||
41 | + echo | ||
42 | + echo "$*" | ||
43 | + echo | ||
44 | + exit 1 | ||
45 | +} | ||
46 | + | ||
47 | +# OS specific support (must be 'true' or 'false'). | ||
48 | +cygwin=false | ||
49 | +msys=false | ||
50 | +darwin=false | ||
51 | +nonstop=false | ||
52 | +case "`uname`" in | ||
53 | + CYGWIN* ) | ||
54 | + cygwin=true | ||
55 | + ;; | ||
56 | + Darwin* ) | ||
57 | + darwin=true | ||
58 | + ;; | ||
59 | + MINGW* ) | ||
60 | + msys=true | ||
61 | + ;; | ||
62 | + NONSTOP* ) | ||
63 | + nonstop=true | ||
64 | + ;; | ||
65 | +esac | ||
66 | + | ||
67 | +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | ||
68 | + | ||
69 | +# Determine the Java command to use to start the JVM. | ||
70 | +if [ -n "$JAVA_HOME" ] ; then | ||
71 | + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | ||
72 | + # IBM's JDK on AIX uses strange locations for the executables | ||
73 | + JAVACMD="$JAVA_HOME/jre/sh/java" | ||
74 | + else | ||
75 | + JAVACMD="$JAVA_HOME/bin/java" | ||
76 | + fi | ||
77 | + if [ ! -x "$JAVACMD" ] ; then | ||
78 | + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | ||
79 | + | ||
80 | +Please set the JAVA_HOME variable in your environment to match the | ||
81 | +location of your Java installation." | ||
82 | + fi | ||
83 | +else | ||
84 | + JAVACMD="java" | ||
85 | + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||
86 | + | ||
87 | +Please set the JAVA_HOME variable in your environment to match the | ||
88 | +location of your Java installation." | ||
89 | +fi | ||
90 | + | ||
91 | +# Increase the maximum file descriptors if we can. | ||
92 | +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then | ||
93 | + MAX_FD_LIMIT=`ulimit -H -n` | ||
94 | + if [ $? -eq 0 ] ; then | ||
95 | + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then | ||
96 | + MAX_FD="$MAX_FD_LIMIT" | ||
97 | + fi | ||
98 | + ulimit -n $MAX_FD | ||
99 | + if [ $? -ne 0 ] ; then | ||
100 | + warn "Could not set maximum file descriptor limit: $MAX_FD" | ||
101 | + fi | ||
102 | + else | ||
103 | + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" | ||
104 | + fi | ||
105 | +fi | ||
106 | + | ||
107 | +# For Darwin, add options to specify how the application appears in the dock | ||
108 | +if $darwin; then | ||
109 | + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" | ||
110 | +fi | ||
111 | + | ||
112 | +# For Cygwin, switch paths to Windows format before running java | ||
113 | +if $cygwin ; then | ||
114 | + APP_HOME=`cygpath --path --mixed "$APP_HOME"` | ||
115 | + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` | ||
116 | + JAVACMD=`cygpath --unix "$JAVACMD"` | ||
117 | + | ||
118 | + # We build the pattern for arguments to be converted via cygpath | ||
119 | + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` | ||
120 | + SEP="" | ||
121 | + for dir in $ROOTDIRSRAW ; do | ||
122 | + ROOTDIRS="$ROOTDIRS$SEP$dir" | ||
123 | + SEP="|" | ||
124 | + done | ||
125 | + OURCYGPATTERN="(^($ROOTDIRS))" | ||
126 | + # Add a user-defined pattern to the cygpath arguments | ||
127 | + if [ "$GRADLE_CYGPATTERN" != "" ] ; then | ||
128 | + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" | ||
129 | + fi | ||
130 | + # Now convert the arguments - kludge to limit ourselves to /bin/sh | ||
131 | + i=0 | ||
132 | + for arg in "$@" ; do | ||
133 | + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` | ||
134 | + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option | ||
135 | + | ||
136 | + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition | ||
137 | + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` | ||
138 | + else | ||
139 | + eval `echo args$i`="\"$arg\"" | ||
140 | + fi | ||
141 | + i=$((i+1)) | ||
142 | + done | ||
143 | + case $i in | ||
144 | + (0) set -- ;; | ||
145 | + (1) set -- "$args0" ;; | ||
146 | + (2) set -- "$args0" "$args1" ;; | ||
147 | + (3) set -- "$args0" "$args1" "$args2" ;; | ||
148 | + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; | ||
149 | + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; | ||
150 | + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; | ||
151 | + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; | ||
152 | + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; | ||
153 | + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; | ||
154 | + esac | ||
155 | +fi | ||
156 | + | ||
157 | +# Escape application args | ||
158 | +save () { | ||
159 | + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done | ||
160 | + echo " " | ||
161 | +} | ||
162 | +APP_ARGS=$(save "$@") | ||
163 | + | ||
164 | +# Collect all arguments for the java command, following the shell quoting and substitution rules | ||
165 | +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" | ||
166 | + | ||
167 | +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong | ||
168 | +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then | ||
169 | + cd "$(dirname "$0")" | ||
170 | +fi | ||
171 | + | ||
172 | +exec "$JAVACMD" "$@" |
android/smartwindow/gradlew.bat
0 → 100644
1 | +@if "%DEBUG%" == "" @echo off | ||
2 | +@rem ########################################################################## | ||
3 | +@rem | ||
4 | +@rem Gradle startup script for Windows | ||
5 | +@rem | ||
6 | +@rem ########################################################################## | ||
7 | + | ||
8 | +@rem Set local scope for the variables with windows NT shell | ||
9 | +if "%OS%"=="Windows_NT" setlocal | ||
10 | + | ||
11 | +set DIRNAME=%~dp0 | ||
12 | +if "%DIRNAME%" == "" set DIRNAME=. | ||
13 | +set APP_BASE_NAME=%~n0 | ||
14 | +set APP_HOME=%DIRNAME% | ||
15 | + | ||
16 | +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||
17 | +set DEFAULT_JVM_OPTS= | ||
18 | + | ||
19 | +@rem Find java.exe | ||
20 | +if defined JAVA_HOME goto findJavaFromJavaHome | ||
21 | + | ||
22 | +set JAVA_EXE=java.exe | ||
23 | +%JAVA_EXE% -version >NUL 2>&1 | ||
24 | +if "%ERRORLEVEL%" == "0" goto init | ||
25 | + | ||
26 | +echo. | ||
27 | +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||
28 | +echo. | ||
29 | +echo Please set the JAVA_HOME variable in your environment to match the | ||
30 | +echo location of your Java installation. | ||
31 | + | ||
32 | +goto fail | ||
33 | + | ||
34 | +:findJavaFromJavaHome | ||
35 | +set JAVA_HOME=%JAVA_HOME:"=% | ||
36 | +set JAVA_EXE=%JAVA_HOME%/bin/java.exe | ||
37 | + | ||
38 | +if exist "%JAVA_EXE%" goto init | ||
39 | + | ||
40 | +echo. | ||
41 | +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | ||
42 | +echo. | ||
43 | +echo Please set the JAVA_HOME variable in your environment to match the | ||
44 | +echo location of your Java installation. | ||
45 | + | ||
46 | +goto fail | ||
47 | + | ||
48 | +:init | ||
49 | +@rem Get command-line arguments, handling Windows variants | ||
50 | + | ||
51 | +if not "%OS%" == "Windows_NT" goto win9xME_args | ||
52 | + | ||
53 | +:win9xME_args | ||
54 | +@rem Slurp the command line arguments. | ||
55 | +set CMD_LINE_ARGS= | ||
56 | +set _SKIP=2 | ||
57 | + | ||
58 | +:win9xME_args_slurp | ||
59 | +if "x%~1" == "x" goto execute | ||
60 | + | ||
61 | +set CMD_LINE_ARGS=%* | ||
62 | + | ||
63 | +:execute | ||
64 | +@rem Setup the command line | ||
65 | + | ||
66 | +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | ||
67 | + | ||
68 | +@rem Execute Gradle | ||
69 | +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% | ||
70 | + | ||
71 | +:end | ||
72 | +@rem End local scope for the variables with windows NT shell | ||
73 | +if "%ERRORLEVEL%"=="0" goto mainEnd | ||
74 | + | ||
75 | +:fail | ||
76 | +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | ||
77 | +rem the _cmd.exe /c_ return code! | ||
78 | +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | ||
79 | +exit /b 1 | ||
80 | + | ||
81 | +:mainEnd | ||
82 | +if "%OS%"=="Windows_NT" endlocal | ||
83 | + | ||
84 | +:omega |
android/smartwindow/settings.gradle
0 → 100644
1 | +include ':app' |
-
Please register or login to post a comment