박정현

코드 업로드

Showing 48 changed files with 1492 additions and 0 deletions
1 +*.iml
2 +.gradle
3 +/local.properties
4 +/.idea/caches
5 +/.idea/libraries
6 +/.idea/modules.xml
7 +/.idea/workspace.xml
8 +/.idea/navEditor.xml
9 +/.idea/assetWizardSettings.xml
10 +.DS_Store
11 +/build
12 +/captures
13 +.externalNativeBuild
14 +.cxx
1 +talktalkspeak
...\ No newline at end of file ...\ No newline at end of file
1 +<component name="ProjectCodeStyleConfiguration">
2 + <code_scheme name="Project" version="173">
3 + <codeStyleSettings language="XML">
4 + <indentOptions>
5 + <option name="CONTINUATION_INDENT_SIZE" value="4" />
6 + </indentOptions>
7 + <arrangement>
8 + <rules>
9 + <section>
10 + <rule>
11 + <match>
12 + <AND>
13 + <NAME>xmlns:android</NAME>
14 + <XML_ATTRIBUTE />
15 + <XML_NAMESPACE>^$</XML_NAMESPACE>
16 + </AND>
17 + </match>
18 + </rule>
19 + </section>
20 + <section>
21 + <rule>
22 + <match>
23 + <AND>
24 + <NAME>xmlns:.*</NAME>
25 + <XML_ATTRIBUTE />
26 + <XML_NAMESPACE>^$</XML_NAMESPACE>
27 + </AND>
28 + </match>
29 + <order>BY_NAME</order>
30 + </rule>
31 + </section>
32 + <section>
33 + <rule>
34 + <match>
35 + <AND>
36 + <NAME>.*:id</NAME>
37 + <XML_ATTRIBUTE />
38 + <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
39 + </AND>
40 + </match>
41 + </rule>
42 + </section>
43 + <section>
44 + <rule>
45 + <match>
46 + <AND>
47 + <NAME>.*:name</NAME>
48 + <XML_ATTRIBUTE />
49 + <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
50 + </AND>
51 + </match>
52 + </rule>
53 + </section>
54 + <section>
55 + <rule>
56 + <match>
57 + <AND>
58 + <NAME>name</NAME>
59 + <XML_ATTRIBUTE />
60 + <XML_NAMESPACE>^$</XML_NAMESPACE>
61 + </AND>
62 + </match>
63 + </rule>
64 + </section>
65 + <section>
66 + <rule>
67 + <match>
68 + <AND>
69 + <NAME>style</NAME>
70 + <XML_ATTRIBUTE />
71 + <XML_NAMESPACE>^$</XML_NAMESPACE>
72 + </AND>
73 + </match>
74 + </rule>
75 + </section>
76 + <section>
77 + <rule>
78 + <match>
79 + <AND>
80 + <NAME>.*</NAME>
81 + <XML_ATTRIBUTE />
82 + <XML_NAMESPACE>^$</XML_NAMESPACE>
83 + </AND>
84 + </match>
85 + <order>BY_NAME</order>
86 + </rule>
87 + </section>
88 + <section>
89 + <rule>
90 + <match>
91 + <AND>
92 + <NAME>.*</NAME>
93 + <XML_ATTRIBUTE />
94 + <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
95 + </AND>
96 + </match>
97 + <order>ANDROID_ATTRIBUTE_ORDER</order>
98 + </rule>
99 + </section>
100 + <section>
101 + <rule>
102 + <match>
103 + <AND>
104 + <NAME>.*</NAME>
105 + <XML_ATTRIBUTE />
106 + <XML_NAMESPACE>.*</XML_NAMESPACE>
107 + </AND>
108 + </match>
109 + <order>BY_NAME</order>
110 + </rule>
111 + </section>
112 + </rules>
113 + </arrangement>
114 + </codeStyleSettings>
115 + </code_scheme>
116 +</component>
...\ 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="GradleMigrationSettings" migrationVersion="1" />
4 + <component name="GradleSettings">
5 + <option name="linkedExternalProjectsSettings">
6 + <GradleProjectSettings>
7 + <option name="testRunner" value="PLATFORM" />
8 + <option name="distributionType" value="DEFAULT_WRAPPED" />
9 + <option name="externalProjectPath" value="$PROJECT_DIR$" />
10 + <option name="modules">
11 + <set>
12 + <option value="$PROJECT_DIR$" />
13 + <option value="$PROJECT_DIR$/app" />
14 + </set>
15 + </option>
16 + <option name="resolveModulePerSourceSet" value="false" />
17 + </GradleProjectSettings>
18 + </option>
19 + </component>
20 +</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="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
4 + <output url="file://$PROJECT_DIR$/build/classes" />
5 + </component>
6 + <component name="ProjectType">
7 + <option name="id" value="Android" />
8 + </component>
9 +</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
1 +apply plugin: 'com.android.application'
2 +
3 +android {
4 + compileSdkVersion 29
5 + buildToolsVersion "29.0.3"
6 +
7 + defaultConfig {
8 + applicationId "com.example.talktalkspeak"
9 + minSdkVersion 16
10 + targetSdkVersion 29
11 + versionCode 1
12 + versionName "1.0"
13 +
14 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
15 + }
16 +
17 + buildTypes {
18 + release {
19 + minifyEnabled false
20 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
21 + }
22 + }
23 +
24 +}
25 +
26 +dependencies {
27 + implementation fileTree(dir: 'libs', include: ['*.jar'])
28 +
29 + implementation 'androidx.appcompat:appcompat:1.1.0'
30 + implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
31 + testImplementation 'junit:junit:4.12'
32 + androidTestImplementation 'androidx.test.ext:junit:1.1.1'
33 + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
34 +}
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 +<?xml version="1.0" encoding="utf-8"?>
2 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 + package="com.example.talktalkspeak">
4 +
5 + <uses-permission android:name="android.permission.BLUETOOTH" />
6 + <application
7 + android:allowBackup="true"
8 + android:icon="@mipmap/ic_launcher"
9 + android:label="@string/app_name"
10 + android:roundIcon="@mipmap/ic_launcher_round"
11 + android:supportsRtl="true"
12 + android:theme="@style/AppTheme">
13 + <activity android:name=".MainActivity">
14 + <intent-filter>
15 + <action android:name="android.intent.action.MAIN" />
16 +
17 + <category android:name="android.intent.category.LAUNCHER" />
18 + </intent-filter>
19 + </activity>
20 + </application>
21 +
22 +</manifest>
...\ No newline at end of file ...\ No newline at end of file
1 +package com.example.talktalkspeak;
2 +
3 +import android.bluetooth.BluetoothAdapter;
4 +import android.bluetooth.BluetoothDevice;
5 +import android.content.BroadcastReceiver;
6 +import android.content.Context;
7 +import android.content.Intent;
8 +import android.content.IntentFilter;
9 +import android.media.AudioManager;
10 +import android.net.Uri;
11 +import android.os.Build;
12 +import android.os.Bundle;
13 +import android.speech.tts.TextToSpeech;
14 +import android.util.Log;
15 +import android.view.View;
16 +import android.widget.AdapterView;
17 +import android.widget.ArrayAdapter;
18 +import android.widget.Button;
19 +import android.widget.SeekBar;
20 +import android.widget.Spinner;
21 +import android.widget.TextView;
22 +import android.widget.Toast;
23 +import androidx.appcompat.app.AppCompatActivity;
24 +import androidx.core.app.ActivityCompat;
25 +import androidx.core.app.NotificationManagerCompat;
26 +import androidx.core.content.ContextCompat;
27 +import java.text.SimpleDateFormat;
28 +import java.util.ArrayList;
29 +import java.util.Date;
30 +import java.util.HashMap;
31 +import java.util.Locale;
32 +import java.util.Set;
33 +import java.util.regex.Matcher;
34 +import java.util.regex.Pattern;
35 +
36 +public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
37 + private static final String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";
38 + private static final int REQUEST_ENABLE_BT = 10;
39 + ArrayAdapter<String> arrayAdapter;
40 + public AudioManager audioManager;
41 + private BluetoothAdapter bluetoothAdapter;
42 + BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() {
43 + public void onReceive(Context context, Intent intent) {
44 + String action = intent.getAction();
45 + BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE");
46 + if ("android.bluetooth.device.action.ACL_CONNECTED".equals(action)) {
47 + MainActivity.this.deviceview.setText(device.getName().toString());
48 + } else if ("android.bluetooth.device.action.ACL_DISCONNECTED".equals(action)) {
49 + MainActivity.this.deviceview.setText("없음");
50 + }
51 + }
52 + };
53 +
54 + /* access modifiers changed from: private */
55 + public Button button1;
56 + private Button button2;
57 + private Button button3;
58 + private Button button4;
59 + private Button button5;
60 +
61 + public TextView deviceview;
62 + private TextView editText;
63 + ArrayList<String> engineList;
64 + ArrayList<String> engineSpinnerList;
65 +
66 + private int isTTSReady = -2;
67 + private BroadcastReceiver kakaoReceiver;
68 + long now = System.currentTimeMillis();
69 +
70 +
71 + /* access modifiers changed from: private */
72 + public double speed = 1.0d;
73 + private Spinner spinner;
74 + private Spinner spinner2;
75 + /* access modifiers changed from: private */
76 + public TextToSpeech tts;
77 + /* access modifiers changed from: private */
78 + public String ttsengine;
79 + private SeekBar volumebar;
80 +
81 + /* access modifiers changed from: protected */
82 + public void onCreate(Bundle savedInstanceState) {
83 + super.onCreate(savedInstanceState);
84 + setContentView((int) R.layout.activity_main);
85 + this.tts = new TextToSpeech(this, this, this.ttsengine);
86 +
87 + //this.editText = (TextView) findViewById(R.id.SMSText);
88 + this.deviceview = (TextView) findViewById(R.id.textView32);
89 + this.button1 = (Button) findViewById(R.id.button1);
90 + this.button2 = (Button) findViewById(R.id.button2);
91 + this.button3 = (Button) findViewById(R.id.button3);
92 + this.button4 = (Button) findViewById(R.id.button4);
93 + this.button5 = (Button) findViewById(R.id.button5);
94 + this.spinner = (Spinner) findViewById(R.id.spinner);
95 + this.spinner2 = (Spinner) findViewById(R.id.spinner2);
96 + this.volumebar = (SeekBar) findViewById(R.id.volumeBar);
97 + this.audioManager = (AudioManager) getSystemService("audio");
98 + this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
99 + processIntent(getIntent());
100 + initializeKakaoReceiver();
101 + Regex(this.tts.getEngines().toString());
102 +
103 + int permission = ContextCompat.checkSelfPermission(this, "android.permission.RECEIVE_SMS");
104 +
105 + if (permission == 0) {
106 + Toast.makeText(this, "메시지 수신 권한 있음.", 1).show();
107 + this.button3.setBackgroundResource(R.drawable.on);
108 + } else {
109 + Toast.makeText(this, "메시지 수신 권한 없음.", 1).show();
110 + ActivityCompat.requestPermissions(this, new String[]{"android.permission.RECEIVE_SMS"}, 1);
111 + if (ActivityCompat.shouldShowRequestPermissionRationale(this, "android.permission.RECEIVE_SMS")) {
112 + Toast.makeText(this, "메시지 권한 설명 필요함.", 1).show();
113 + } else {
114 + ActivityCompat.requestPermissions(this, new String[]{"android.permission.RECEIVE_SMS"}, 1);
115 + }
116 + }
117 +
118 + this.button1.setTag(Integer.valueOf(permission));
119 + this.button1.setOnClickListener(new View.OnClickListener() {
120 + public void onClick(View view) {
121 + if (MainActivity.this.button1.getBackground().getConstantState().equals(MainActivity.this.getResources().getDrawable(R.drawable.stop).getConstantState())) {
122 + MainActivity.this.button1.setBackgroundResource(R.drawable.start);
123 + } else if (((Integer) view.getTag()).intValue() == 0) {
124 + MainActivity.this.button1.setBackgroundResource(R.drawable.stop);
125 + }
126 + }
127 + });
128 +
129 + //권한 허가창 열기
130 + this.button2.setOnClickListener(new View.OnClickListener() {
131 + public void onClick(View view) {
132 + Intent intent = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS", Uri.fromParts("package", MainActivity.this.getPackageName(), (String) null));
133 + intent.addFlags(268435456);
134 + MainActivity.this.startActivity(intent);
135 + }
136 + });
137 +
138 + //블루투스 연결창 열기
139 + this.button4.setOnClickListener(new View.OnClickListener() {
140 + public void onClick(View view) {
141 + MainActivity.this.startActivity(new Intent("android.settings.BLUETOOTH_SETTINGS"));
142 + }
143 + });
144 +
145 + //TTS 속도조정
146 + this.spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
147 + public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
148 + int selectedItemPosition = parent.getSelectedItemPosition();
149 + if (selectedItemPosition == 0) {
150 + double unused = MainActivity.this.speed = 0.5d;
151 + } else if (selectedItemPosition == 1) {
152 + double unused2 = MainActivity.this.speed = 1.0d;
153 + } else if (selectedItemPosition == 2) {
154 + double unused3 = MainActivity.this.speed = 1.5d;
155 + } else if (selectedItemPosition == 3) {
156 + double unused4 = MainActivity.this.speed = 2.0d;
157 + }
158 +
159 + Log.d("spinner", "speed : " + MainActivity.this.speed);
160 + }
161 +
162 + public void onNothingSelected(AdapterView<?> adapterView) {
163 + }
164 + });
165 +
166 + this.spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
167 + public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
168 + MainActivity mainActivity = MainActivity.this;
169 + String unused = mainActivity.ttsengine = mainActivity.engineList.get(i);
170 + MainActivity.this.tts.stop();
171 + MainActivity mainActivity2 = MainActivity.this;
172 + TextToSpeech unused2 = mainActivity2.tts = new TextToSpeech(mainActivity2, mainActivity2, mainActivity2.ttsengine);
173 + }
174 +
175 + public void onNothingSelected(AdapterView<?> adapterView) {
176 + MainActivity mainActivity = MainActivity.this;
177 + TextToSpeech unused = mainActivity.tts = new TextToSpeech(mainActivity, mainActivity, mainActivity.tts.getDefaultEngine());
178 + }
179 + });
180 +
181 + this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
182 + BluetoothAdapter bluetoothAdapter2 = this.bluetoothAdapter;
183 + if (bluetoothAdapter2 != null) {
184 + if (bluetoothAdapter2.isEnabled()) {
185 + this.button5.setBackgroundResource(R.drawable.on);
186 + } else {
187 + this.button5.setBackgroundResource(R.drawable.off);
188 + startActivityForResult(new Intent("android.bluetooth.adapter.action.REQUEST_ENABLE"), 10);
189 + }
190 + }
191 + registerReceiver(this.bluetoothReceiver, new IntentFilter("android.bluetooth.device.action.ACL_CONNECTED"));
192 + registerReceiver(this.bluetoothReceiver, new IntentFilter("android.bluetooth.device.action.ACL_DISCONNECTED"));
193 + registerReceiver(this.kakaoReceiver, new IntentFilter("android.service.notification.NotificationListenerService"));
194 + setSeekBar();
195 + if (!permissionGrantred()) {
196 + startActivity(new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS));
197 + }
198 + }
199 +
200 +
201 + public void processIntent(Intent intent) {
202 + if (intent != null) {
203 + String sender = intent.getStringExtra("sender");
204 + String contents = intent.getStringExtra("contents");
205 + String date2 = intent.getStringExtra("receivedDate");
206 +
207 + if (sender == null || contents == null) {
208 + this.editText.setText((CharSequence) null);
209 + } else {
210 + TextView textView = this.editText;
211 + textView.setText(sender + 10 + contents + 10);
212 + moveTaskToBack(true);
213 + }
214 + if (!this.button1.getBackground().getConstantState().equals(getResources().getDrawable(R.drawable.stop).getConstantState())) {
215 + return;
216 + }
217 +
218 + }
219 + }
220 +
221 + public void onInit(int status) {
222 + if (status == 0) {
223 + int language = this.tts.setLanguage(Locale.KOREAN);
224 + if (language == -1 || language == -2) {
225 + this.editText.setText("지원하지 않는 언어입니다.");
226 + } else {
227 + this.isTTSReady = status;
228 + }
229 + } else {
230 + this.editText.setText("TTS 작업이 실패하였습니다.");
231 + }
232 + }
233 +
234 + private void initializeKakaoReceiver() {
235 + this.kakaoReceiver = new BroadcastReceiver() {
236 + public void onReceive(Context context, Intent intent) {
237 + if (intent.getAction().equals("android.service.notification.NotificationListenerService")) {
238 + String kTitle = intent.getExtras().getString("realTitle");
239 + CharSequence tempKBody = intent.getExtras().getCharSequence("realBody");
240 + String KBody = tempKBody.toString();
241 + if (kTitle != null || KBody != null) {
242 + Intent intent1 = new Intent();
243 + intent1.putExtra("sender", kTitle);
244 + intent1.putExtra("contents", tempKBody);
245 + intent1.putExtra("class", "KAKAO");
246 + MainActivity.this.processIntent(intent1);
247 + }
248 + }
249 + }
250 + };
251 + }
252 +
253 + public void Regex(String str) {
254 + Matcher m = Pattern.compile("name=[A-za-z.]+").matcher(str);
255 + this.engineList = new ArrayList<>();
256 + this.engineSpinnerList = new ArrayList<>();
257 + int i = 0;
258 + while (m.find()) {
259 + this.engineList.add(m.group().substring(5));
260 + if (m.group().substring(5).equals("com.google.android.tts")) {
261 + this.engineSpinnerList.add("구글TTS");
262 + } else if (m.group().substring(5).equals("com.samsung.SMT")) {
263 + this.engineSpinnerList.add("삼성TTS");
264 + } else {
265 + this.engineSpinnerList.add(this.engineList.get(i));
266 + }
267 + i++;
268 + }
269 + this.arrayAdapter = new ArrayAdapter<>(getApplicationContext(), 17367049, this.engineSpinnerList);
270 + this.spinner2.setAdapter(this.arrayAdapter);
271 + }
272 +
273 + public void setSeekBar() {
274 + int nMax = this.audioManager.getStreamMaxVolume(3);
275 + int nCurrentVolume = this.audioManager.getStreamVolume(3);
276 + this.volumebar.setMax(nMax);
277 + this.volumebar.setProgress(nCurrentVolume);
278 + this.volumebar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
279 + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
280 + MainActivity.this.audioManager.setStreamVolume(3, progress, 0);
281 + }
282 +
283 + public void onStartTrackingTouch(SeekBar seekBar) {
284 + }
285 +
286 + public void onStopTrackingTouch(SeekBar seekBar) {
287 + }
288 + });
289 + }
290 +
291 + public void onNewIntent(Intent intent) {
292 + processIntent(intent);
293 + initializeKakaoReceiver();
294 + super.onNewIntent(intent);
295 + }
296 +
297 + private boolean permissionGrantred() {
298 + Set<String> sets = NotificationManagerCompat.getEnabledListenerPackages(this);
299 + if (sets == null || !sets.contains(getPackageName())) {
300 + return false;
301 + }
302 + return true;
303 + }
304 +
305 + public void onRestart() {
306 + super.onRestart();
307 + if (!permissionGrantred()) {
308 + startActivity(new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS));
309 + }
310 + int permission = ContextCompat.checkSelfPermission(this, "android.permission.RECEIVE_SMS");
311 + if (permission == 0) {
312 + Toast.makeText(this, "메시지 수신 권한 주어져 있음.", 1).show();
313 + this.button3.setBackgroundResource(R.drawable.on);
314 + } else {
315 + Toast.makeText(this, "메시지 수신 권한 없음.", 1).show();
316 + ActivityCompat.requestPermissions(this, new String[]{"android.permission.RECEIVE_SMS"}, 1);
317 + if (ActivityCompat.shouldShowRequestPermissionRationale(this, "android.permission.RECEIVE_SMS")) {
318 + Toast.makeText(this, "메시지 권한 설명 필요함.", 1).show();
319 + } else {
320 + ActivityCompat.requestPermissions(this, new String[]{"android.permission.RECEIVE_SMS"}, 1);
321 + }
322 + }
323 + this.button1.setTag(Integer.valueOf(permission));
324 + this.button1.setOnClickListener(new View.OnClickListener() {
325 + public void onClick(View view) {
326 + if (MainActivity.this.button1.getBackground().getConstantState().equals(MainActivity.this.getResources().getDrawable(R.drawable.stop).getConstantState())) {
327 + MainActivity.this.button1.setBackgroundResource(R.drawable.start);
328 + } else if (((Integer) view.getTag()).intValue() == 0) {
329 + MainActivity.this.button1.setBackgroundResource(R.drawable.stop);
330 + }
331 + }
332 + });
333 + this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
334 + BluetoothAdapter bluetoothAdapter2 = this.bluetoothAdapter;
335 + if (bluetoothAdapter2 == null) {
336 + this.button5.setBackgroundResource(R.drawable.off);
337 + } else if (bluetoothAdapter2.isEnabled()) {
338 + this.button5.setBackgroundResource(R.drawable.on);
339 + } else {
340 + this.button5.setBackgroundResource(R.drawable.off);
341 + startActivityForResult(new Intent("android.bluetooth.adapter.action.REQUEST_ENABLE"), 10);
342 + }
343 + setSeekBar();
344 + }
345 +
346 +
347 + public void TextToSpeech(String str) {
348 + if (this.isTTSReady == 0) {
349 + this.tts.setPitch(1.0f);
350 + this.tts.setSpeechRate((float) this.speed);
351 + if (Build.VERSION.SDK_INT >= 21) {
352 + this.tts.addEarcon("[alarm]", BuildConfig.APPLICATION_ID, R.raw.alarm);
353 + this.tts.playEarcon("[alarm]", 1, (Bundle) null, "utteranceId");
354 + this.tts.speak(str, 1, (Bundle) null, "utteranceId");
355 + if (this.tts.isSpeaking()) {
356 + Log.d("TEST", "SUCCESS");
357 + return;
358 + }
359 + return;
360 + }
361 + HashMap<String, String> map = new HashMap<>();
362 + map.put("utteranceId", "UniqueID");
363 + this.tts.speak(str, 1, map);
364 + }
365 + }
366 +
367 + //메시지 수신권한 질의결과
368 + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
369 + if (requestCode != 1 || grantResults.length <= 0) {
370 + return;
371 + }
372 + if (grantResults[0] == 0) {
373 + Toast.makeText(this, "메시지 수신권한을 사용자가 승인함", 1).show();
374 + this.button3.setBackgroundResource(R.drawable.on);
375 + this.button1.setBackgroundResource(R.drawable.stop);
376 + } else if (grantResults[0] == -1) {
377 + Toast.makeText(this, "메시지 수신권한을 사용자가 거부함", 1).show();
378 + this.button3.setBackgroundResource(R.drawable.off);
379 + this.button1.setBackgroundResource(R.drawable.start);
380 + } else {
381 + Toast.makeText(this, "메시지 수신권한을 부여받지 못함", 1).show();
382 + this.button3.setBackgroundResource(R.drawable.off);
383 + this.button1.setBackgroundResource(R.drawable.start);
384 + }
385 + }
386 +
387 +
388 + public void onActivityResult(int requestCode, int resultCode, Intent data) {
389 + super.onActivityResult(requestCode, resultCode, data);
390 + if (requestCode == 10 && resultCode == 0) {
391 + this.button5.setBackgroundResource(R.drawable.off);
392 + } else if (requestCode == 10 && resultCode == -1) {
393 + this.button5.setBackgroundResource(R.drawable.on);
394 + }
395 + }
396 +
397 + //종료
398 +
399 + public void onDestroy() {
400 + TextToSpeech textToSpeech = this.tts;
401 + if (textToSpeech != null) {
402 + textToSpeech.stop();
403 + this.tts.shutdown();
404 + }
405 + super.onDestroy();
406 + }
407 +}
...\ No newline at end of file ...\ No newline at end of file
1 +package com.example.talktalkspeak;
2 +
3 +import android.content.BroadcastReceiver;
4 +import android.content.Context;
5 +import android.content.Intent;
6 +import android.os.Build;
7 +import android.os.Bundle;
8 +import android.os.IBinder;
9 +import android.service.notification.NotificationListenerService;
10 +import android.service.notification.StatusBarNotification;
11 +import android.util.Log;
12 +import android.widget.Toast;
13 +
14 +import androidx.annotation.RequiresApi;
15 +import androidx.core.app.NotificationCompat;
16 +
17 +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
18 +public class NotificationService extends NotificationListenerService {
19 + public static final String TAG = "katextisok";
20 + Context context;
21 +
22 + public static final class ApplicationPackageNames {
23 + public static final String KAKAO_PACK_NAME = "com.kakao.talk";
24 + public static final String KAKAO_SAMPLE_PACK_NAME = "com.kakao.sdk.sample";
25 + }
26 +
27 + public static final class InterceptedNotificationCode {
28 + public static final int KAKAO_CODE = 2;
29 + public static final int KAKAO_SAMPLE_CODE = 1;
30 + }
31 +
32 + public void onCreate() {
33 + super.onCreate();
34 + this.context = getApplicationContext();
35 + }
36 +
37 + class NLServiceReceiver extends BroadcastReceiver {
38 + NLServiceReceiver() {
39 + }
40 +
41 + public void onReceive(Context context, Intent intent) {
42 + if (intent.getStringExtra("command").equals("clearall")) {
43 + Toast.makeText(context, "clearall", 0).show();
44 + NotificationService.this.cancelAllNotifications();
45 + } else if (intent.getStringExtra("command").equals("list")) {
46 + Toast.makeText(context, "list", 0).show();
47 + Intent i1 = new Intent("NOTIFICATION_LISTENER_SERVICE");
48 + i1.putExtra("notification_event", "====================");
49 + NotificationService.this.sendBroadcast(i1);
50 + int i = 1;
51 + for (StatusBarNotification sbn : NotificationService.this.getActiveNotifications()) {
52 + Intent i2 = new Intent("NOTIFICATION_LISTENER_SERVICE");
53 + i2.putExtra("notification_event", i + " " + sbn.getPackageName() + "\n");
54 + NotificationService.this.sendBroadcast(i2);
55 + i++;
56 + }
57 + Intent i3 = new Intent("NOTIFICATION_LISTENER_EXAMPLE");
58 + i3.putExtra("notificaation_event", "==== Notification List====");
59 + NotificationService.this.sendBroadcast(i3);
60 + }
61 + }
62 + }
63 +
64 + public IBinder onBind(Intent intent) {
65 + return super.onBind(intent);
66 + }
67 +
68 + @RequiresApi(api = Build.VERSION_CODES.KITKAT)
69 + public void onNotificationPosted(StatusBarNotification sbn) {
70 + if (sbn != null) {
71 + int notificationCode = matchNotificationCode(sbn);
72 + if (notificationCode == 1) {
73 + Intent intent = new Intent("android.service.notification.NotificationListenerService");
74 + intent.putExtra("Notification Code", notificationCode);
75 + Bundle extras = sbn.getNotification().extras;
76 + String sampletitle = extras.getString(NotificationCompat.EXTRA_TITLE);
77 + CharSequence samplebody = extras.getCharSequence(NotificationCompat.EXTRA_TEXT);
78 + Log.i("NotificationListener", "샘플 푸시 제목 : " + sampletitle);
79 + Log.i("NotificationListener", "샘플 푸시 내용 : " + samplebody);
80 + intent.putExtra("sampleTitle", sampletitle);
81 + intent.putExtra("sampleBody", samplebody);
82 + sendBroadcast(intent);
83 + } else if (notificationCode == 2) {
84 + Intent intent2 = new Intent("android.service.notification.NotificationListenerService");
85 + intent2.putExtra("Notification Code", notificationCode);
86 + Bundle extras2 = sbn.getNotification().extras;
87 + String realTitle = extras2.getString(NotificationCompat.EXTRA_TITLE);
88 + CharSequence realBody = extras2.getCharSequence(NotificationCompat.EXTRA_TEXT);
89 + Log.i("NotificationListener", "푸시 제목 : " + realTitle);
90 + Log.i("NotificationListener", "푸시 내용 : " + realBody);
91 + if (realTitle != null && realBody != null) {
92 + if (realTitle != null || realBody != null) {
93 + intent2.putExtra("realTitle", realTitle);
94 + intent2.putExtra("realBody", realBody);
95 + sendBroadcast(intent2);
96 + }
97 + }
98 + }
99 + }
100 + }
101 +
102 + public void onNotificationRemoved(StatusBarNotification sbn) {
103 + Log.i("kaTalk", "Notification Removed");
104 + }
105 +
106 + private int matchNotificationCode(StatusBarNotification sbn) {
107 + String packageName = sbn.getPackageName();
108 + if (packageName.equals(ApplicationPackageNames.KAKAO_PACK_NAME)) {
109 + return 2;
110 + }
111 + if (packageName.equals(ApplicationPackageNames.KAKAO_SAMPLE_PACK_NAME)) {
112 + return 1;
113 + }
114 + return 0;
115 + }
116 +}
...\ No newline at end of file ...\ No newline at end of file
1 +package com.example.talktalkspeak;
2 +
3 +public class Permission {
4 + String pname;
5 +}
...\ No newline at end of file ...\ No newline at end of file
1 +package com.example.talktalkspeak;
2 +
3 +import android.content.BroadcastReceiver;
4 +import android.content.Context;
5 +import android.content.Intent;
6 +import android.database.Cursor;
7 +import android.net.Uri;
8 +import android.os.Build;
9 +import android.os.Bundle;
10 +import android.provider.ContactsContract;
11 +import android.telephony.SmsMessage;
12 +import android.util.Log;
13 +import java.text.SimpleDateFormat;
14 +import java.util.Date;
15 +
16 +public class SmsReceiver extends BroadcastReceiver {
17 + private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
18 +
19 + public void onReceive(Context context, Intent intent) {
20 + if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
21 + SmsMessage[] messages = parseSmsMessage(intent.getExtras());
22 + if (messages.length > 0) {
23 + sendToActivity(context, messages[0].getOriginatingAddress(), messages[0].getMessageBody().toString(), new Date(messages[0].getTimestampMillis()));
24 + }
25 + }
26 + }
27 +
28 + private String GetName(Context context, String str) {
29 + String name = "str";
30 + Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(str));
31 + Cursor cursor = context.getContentResolver().query(uri, new String[]{"display_name"}, (String) null, (String[]) null, (String) null);
32 + if (cursor != null) {
33 + if (cursor.moveToFirst()) {
34 + name = cursor.getString(0);
35 + }
36 + cursor.close();
37 + }
38 + return name;
39 + }
40 +
41 + private void sendToActivity(Context context, String sender, String contents, Date receivedDate) {
42 + Intent intent = new Intent(context, MainActivity.class);
43 + intent.addFlags(872415232);
44 + intent.putExtra("sender", sender);
45 + intent.putExtra("contents", contents);
46 + intent.putExtra("receivedDate", format.format(receivedDate));
47 + intent.putExtra("class", "SMS");
48 + Log.d("SMSToSpeech", "Sender :" + sender);
49 + Log.d("SMSToSpeech", "contents : " + contents);
50 + Log.d("SMSToSpeech", "receivedDate : " + receivedDate);
51 + context.startActivity(intent);
52 + }
53 +
54 + private SmsMessage[] parseSmsMessage(Bundle bundle) {
55 + Object[] objs = (Object[]) bundle.get("pdus");
56 + SmsMessage[] messages = new SmsMessage[objs.length];
57 + for (int i = 0; i < objs.length; i++) {
58 + if (Build.VERSION.SDK_INT >= 23) {
59 + messages[i] = SmsMessage.createFromPdu((byte[]) objs[i], bundle.getString("format"));
60 + } else {
61 + messages[i] = SmsMessage.createFromPdu((byte[]) objs[i]);
62 + }
63 + }
64 + return messages;
65 + }
66 +}
...\ No newline at end of file ...\ No newline at end of file
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 android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
8 + <aapt:attr name="android:fillColor">
9 + <gradient
10 + android:endX="85.84757"
11 + android:endY="92.4963"
12 + android:startX="42.9492"
13 + android:startY="49.59793"
14 + android:type="linear">
15 + <item
16 + android:color="#44000000"
17 + android:offset="0.0" />
18 + <item
19 + android:color="#00000000"
20 + android:offset="1.0" />
21 + </gradient>
22 + </aapt:attr>
23 + </path>
24 + <path
25 + android:fillColor="#FFFFFF"
26 + android:fillType="nonZero"
27 + android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
28 + android:strokeWidth="1"
29 + android:strokeColor="#00000000" />
30 +</vector>
...\ No newline at end of file ...\ No newline at end of file
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="#3DDC84"
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>
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="match_parent">
3 + <LinearLayout
4 + android:layout_width="match_parent"
5 + android:layout_height="match_parent"
6 + android:background="#FFFFFF"
7 + android:orientation="vertical">
8 +
9 + <Button
10 + android:id="@+id/button1"
11 + android:layout_width="220dp"
12 + android:layout_height="220dp"
13 + android:layout_margin="100dp"
14 + android:background="@drawable/start"
15 + app:srcCompat="@drawable/start" />
16 +
17 + <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"/>
18 + <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent">
19 + <TextView android:textStyle="bold" android:textColor="@android:color/black" android:gravity="left|center_vertical|center_horizontal|center" android:id="@+id/textView2" android:background="#F7FE2E" android:paddingLeft="10dp" android:layout_width="match_parent" android:layout_height="40dp" android:text="알림 안내 권한" app:layout_constraintHorizontal_bias="0.313" app:layout_constraintVertical_bias="0.253"/>
20 +
21 + <Button
22 + android:id="@+id/button2"
23 + android:layout_width="30dp"
24 + android:layout_height="30dp"
25 + android:layout_gravity="right|center_vertical|center_horizontal|center"
26 + android:layout_marginRight="10dp"
27 + android:background="@drawable/setting"
28 + app:layout_constraintHorizontal_bias="0.95"
29 + app:layout_constraintVertical_bias="0.289" />
30 + </FrameLayout>
31 + <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent">
32 + <TextView android:textSize="20sp" android:textStyle="bold" android:textColor="@android:color/black" android:gravity="left|center_vertical|center_horizontal|center" android:id="@+id/textView20" android:background="#FFFFFF" android:paddingLeft="10dp" android:layout_width="match_parent" android:layout_height="60dp" android:text="권한 허용 여부"/>
33 +
34 + <Button
35 + android:id="@+id/button3"
36 + android:layout_width="50dp"
37 + android:layout_height="40dp"
38 + android:layout_gravity="right|center_vertical|center_horizontal|center"
39 + android:layout_marginRight="10dp"
40 + android:background="@drawable/on"
41 + app:layout_constraintHorizontal_bias="0.95"
42 + app:layout_constraintVertical_bias="0.188" />
43 + </FrameLayout>
44 + <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent">
45 + <TextView android:textStyle="bold" android:textColor="@android:color/black" android:gravity="left|center_vertical|center_horizontal|center" android:id="@+id/textView3" android:background="#F7FE2E" android:paddingLeft="10dp" android:layout_width="match_parent" android:layout_height="40dp" android:text="블루투스 연결상태" app:layout_constraintHorizontal_bias="0.313" app:layout_constraintVertical_bias="0.352"/>
46 +
47 + <Button
48 + android:id="@+id/button4"
49 + android:layout_width="30dp"
50 + android:layout_height="30dp"
51 + android:layout_gravity="right|center_vertical|center_horizontal|center"
52 + android:layout_marginRight="10dp"
53 + android:background="@drawable/setting"
54 + app:layout_constraintHorizontal_bias="0.95"
55 + app:layout_constraintVertical_bias="0.387" />
56 + </FrameLayout>
57 + <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent">
58 + <TextView android:textSize="20sp" android:textStyle="bold" android:textColor="@android:color/black" android:gravity="left|center_vertical|center_horizontal|center" android:id="@+id/textView30" android:background="#FFFFFF" android:paddingLeft="10dp" android:layout_width="match_parent" android:layout_height="60dp" android:text="현재 상태"/>
59 +
60 + <Button
61 + android:id="@+id/button5"
62 + android:layout_width="50dp"
63 + android:layout_height="40dp"
64 + android:layout_gravity="right|center_vertical|center_horizontal|center"
65 + android:layout_marginRight="10dp"
66 + android:background="@drawable/on"
67 + app:layout_constraintHorizontal_bias="0.95"
68 + app:layout_constraintVertical_bias="0.486" />
69 + </FrameLayout>
70 + <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
71 + <TextView android:textSize="20sp" android:textStyle="bold" android:textColor="@android:color/black" android:gravity="left|center_vertical|center_horizontal|center" android:id="@+id/textView31" android:background="#FFFFFF" android:paddingLeft="10dp" android:layout_width="0dp" android:layout_height="60dp" android:text="연결된 기기" android:layout_weight="1"/>
72 + <TextView android:textSize="20sp" android:textColor="@android:color/black" android:gravity="right|center_vertical|center_horizontal|center" android:id="@+id/textView32" android:background="#FFFFFF" android:paddingRight="10dp" android:layout_width="0dp" android:layout_height="60dp" android:text="" android:layout_weight="1"/>
73 + </LinearLayout>
74 + <TextView android:textStyle="bold" android:textColor="@android:color/black" android:gravity="left|center_vertical|center_horizontal|center" android:id="@+id/textView4" android:background="#F7FE2E" android:paddingLeft="10dp" android:layout_width="match_parent" android:layout_height="40dp" android:text="사운드 설정" app:layout_constraintHorizontal_bias="0.313" app:layout_constraintVertical_bias="0.448"/>
75 + <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent">
76 + <TextView android:textSize="20sp" android:textStyle="bold" android:textColor="@android:color/black" android:gravity="left|center_vertical|center_horizontal|center" android:id="@+id/textView40" android:background="#FFFFFF" android:paddingLeft="10dp" android:layout_width="match_parent" android:layout_height="60dp" android:text="볼륨"/>
77 + <SeekBar android:layout_gravity="right|center_vertical|center_horizontal|center" android:id="@+id/volumeBar" android:layout_width="300dp" android:layout_height="60dp"/>
78 + </FrameLayout>
79 + <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent">
80 + <TextView android:textSize="20sp" android:textStyle="bold" android:textColor="@android:color/black" android:gravity="left|center_vertical|center_horizontal|center" android:id="@+id/textView41" android:background="#FFFFFF" android:paddingLeft="10dp" android:layout_width="match_parent" android:layout_height="60dp" android:text="읽기 속도"/>
81 + <Spinner android:entries="@array/읽기속도" android:layout_gravity="right|center_vertical|center_horizontal|center" android:id="@+id/spinner" android:layout_width="200dp" android:layout_height="match_parent"/>
82 + </FrameLayout>
83 + <TextView android:textStyle="bold" android:textColor="@android:color/black" android:gravity="left|center_vertical|center_horizontal|center" android:id="@+id/textView5" android:background="#F7FE2E" android:paddingLeft="10dp" android:layout_width="match_parent" android:layout_height="40dp" android:text="읽기 설정" app:layout_constraintHorizontal_bias="0.313" app:layout_constraintVertical_bias="0.546"/>
84 + <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent">
85 + <TextView android:textSize="20sp" android:textStyle="bold" android:textColor="@android:color/black" android:gravity="left|center_vertical|center_horizontal|center" android:id="@+id/textView50" android:background="#FFFFFF" android:paddingLeft="10dp" android:layout_width="match_parent" android:layout_height="60dp" android:text="TTS 엔진 설정"/>
86 +
87 + <Spinner
88 + android:id="@+id/spinner2"
89 + android:layout_width="200dp"
90 + android:layout_height="match_parent"
91 + android:layout_gravity="right|center_vertical|center_horizontal|center" />
92 + </FrameLayout>
93 +
94 + </LinearLayout>
95 +
96 +</ScrollView>
...\ 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
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
No preview for this file type
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<resources>
3 + <array name="읽기속도">
4 + <item>느림(0.5배속)</item>
5 + <item>보통(1배속)</item>
6 + <item>약간빠름(1.5배속)</item>
7 + <item>빠름(2배속)</item>
8 + </array>
9 +</resources>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<resources>
3 + <color name="colorPrimary">#6200EE</color>
4 + <color name="colorPrimaryDark">#3700B3</color>
5 + <color name="colorAccent">#03DAC5</color>
6 +</resources>
1 +<resources>
2 + <string name="app_name">talktalkspeak</string>
3 +</resources>
1 +<resources>
2 +
3 + <!-- Base application theme. -->
4 + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
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>
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 + }
10 + dependencies {
11 + classpath 'com.android.tools.build:gradle:3.6.2'
12 +
13 +
14 + // NOTE: Do not place your application dependencies here; they belong
15 + // in the individual module build.gradle files
16 + }
17 +}
18 +
19 +allprojects {
20 + repositories {
21 + google()
22 + jcenter()
23 +
24 + }
25 +}
26 +
27 +task clean(type: Delete) {
28 + delete rootProject.buildDir
29 +}
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 +# AndroidX package structure to make it clearer which packages are bundled with the
15 +# Android operating system, and which are packaged with your app's APK
16 +# https://developer.android.com/topic/libraries/support-library/androidx-rn
17 +android.useAndroidX=true
18 +# Automatically convert third-party libraries to use AndroidX
19 +android.enableJetifier=true
20 +
1 +#Fri Jun 12 12:23:29 KST 2020
2 +distributionBase=GRADLE_USER_HOME
3 +distributionPath=wrapper/dists
4 +zipStoreBase=GRADLE_USER_HOME
5 +zipStorePath=wrapper/dists
6 +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
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" "$@"
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
1 +rootProject.name='talktalkspeak'
2 +include ':app'