diff --git a/.gitignore b/.gitignore index 7cbf4f1..04c4bdb 100644 --- a/.gitignore +++ b/.gitignore @@ -15,19 +15,7 @@ local.properties .signing/ # User-specific configurations -.idea/gradle.xml -.idea/runConfigurations.xml -.idea/libraries/ -.idea/workspace.xml -.idea/tasks.xml -.idea/.name -.idea/compiler.xml -.idea/copyright/profiles_settings.xml -.idea/encodings.xml -.idea/misc.xml -.idea/modules.xml -.idea/scopes/scope_settings.xml -.idea/vcs.xml +.idea *.iml # OS-specific files @@ -37,4 +25,4 @@ local.properties .Spotlight-V100 .Trashes ehthumbs.db -Thumbs.db \ No newline at end of file +Thumbs.db diff --git a/app/.gitignore b/app/.gitignore index c9e26d9..7f0f2be 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1,2 +1,3 @@ /build -/app.iml \ No newline at end of file +/app.iml +/release diff --git a/app/build.gradle b/app/build.gradle index 0ce9595..2f26a08 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion '26.0.2' + compileSdkVersion 27 + buildToolsVersion '27.0.3' defaultConfig { applicationId "com.example.yink.amadeus.kurisutina" - minSdkVersion 9 - targetSdkVersion 20 + minSdkVersion 14 + targetSdkVersion 27 versionCode 1 versionName "0.9.6-alpha.5" } @@ -18,9 +18,18 @@ android { } productFlavors { } + + lintOptions { + checkReleaseBuilds false + abortOnError false + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'com.android.support:appcompat-v7:25.3.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:appcompat-v7:27.1.1' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 55d074b..9da1ebf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -8,15 +9,18 @@ + android:theme="@style/AppTheme" + android:allowBackup="true" + android:fullBackupContent="true" + tools:ignore="GoogleAppIndexingWarning"> + android:screenOrientation="portrait" + tools:ignore="UnusedAttribute"> @@ -37,7 +41,8 @@ android:name=".SettingsActivity" android:label="Preferences" android:parentActivityName=".LaunchActivity" - android:theme="@style/PreferenceTheme"> + android:theme="@style/PreferenceTheme" + tools:ignore="UnusedAttribute"> @@ -64,6 +69,8 @@ android:label="AlarmBootReceiver"> + + diff --git a/app/src/main/java/com/example/yink/amadeus/Alarm.java b/app/src/main/java/com/example/yink/amadeus/Alarm.java index 9af4804..f1e654f 100644 --- a/app/src/main/java/com/example/yink/amadeus/Alarm.java +++ b/app/src/main/java/com/example/yink/amadeus/Alarm.java @@ -33,8 +33,10 @@ static void start(Context context, int ringtone) { if (settings.getBoolean("vibrate", false)) { v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); - long[] pattern = {500, 2000}; - v.vibrate(pattern, 0); + if (v != null) { + long[] pattern = {500, 2000}; + v.vibrate(pattern, 0); + } } m = MediaPlayer.create(context, ringtone); @@ -54,17 +56,23 @@ static void cancel(Context context) { if (isPlaying) { settings = PreferenceManager.getDefaultSharedPreferences(context); - AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - Intent alarmIntent = new Intent(context, AlarmReceiver.class); - final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, ALARM_ID, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); - NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - SharedPreferences.Editor editor = settings.edit(); editor.putBoolean("alarm_toggle", false); editor.apply(); + + Intent alarmIntent = new Intent(context, AlarmReceiver.class); + final PendingIntent pendingIntent = + PendingIntent.getBroadcast(context, ALARM_ID, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); + + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + if (alarmManager != null) { + alarmManager.cancel(pendingIntent); + } + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + if (notificationManager != null) { + notificationManager.cancel(ALARM_NOTIFICATION_ID); + } m.release(); - notificationManager.cancel(ALARM_NOTIFICATION_ID); - alarmManager.cancel(pendingIntent); releaseCpuLock(); isPlaying = false; if (v != null) { @@ -86,11 +94,14 @@ private static void acquireCpuWakeLock(Context context) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); + if (pm == null) { + return; + } sCpuWakeLock = pm.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, TAG); - sCpuWakeLock.acquire(); + sCpuWakeLock.acquire(10*60*1000L /*10 minutes*/); } private static void releaseCpuLock() { diff --git a/app/src/main/java/com/example/yink/amadeus/AlarmActivity.java b/app/src/main/java/com/example/yink/amadeus/AlarmActivity.java index 1555893..f0dcb9b 100644 --- a/app/src/main/java/com/example/yink/amadeus/AlarmActivity.java +++ b/app/src/main/java/com/example/yink/amadeus/AlarmActivity.java @@ -19,7 +19,7 @@ public class AlarmActivity extends AppCompatActivity { - private final String TAG = "AlarmActivity"; + private static final String TAG = "AlarmActivity"; private AlarmManager alarmManager; private PendingIntent pendingIntent; @@ -32,8 +32,8 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_alarm); settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); - alarmTimePicker = (TimePicker) findViewById(R.id.alarmTimePicker); - alarmToggle = (ToggleButton) findViewById(R.id.alarmToggle); + alarmTimePicker = findViewById(R.id.alarmTimePicker); + alarmToggle = findViewById(R.id.alarmToggle); alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); pendingIntent = PendingIntent.getBroadcast(this, Alarm.ALARM_ID, new Intent(this, AlarmReceiver.class), PendingIntent.FLAG_CANCEL_CURRENT); diff --git a/app/src/main/java/com/example/yink/amadeus/AlarmBootReceiver.java b/app/src/main/java/com/example/yink/amadeus/AlarmBootReceiver.java index d3d0349..78df1b5 100644 --- a/app/src/main/java/com/example/yink/amadeus/AlarmBootReceiver.java +++ b/app/src/main/java/com/example/yink/amadeus/AlarmBootReceiver.java @@ -2,35 +2,38 @@ import android.app.AlarmManager; import android.app.PendingIntent; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Build; import android.preference.PreferenceManager; -import android.support.v4.content.WakefulBroadcastReceiver; import android.util.Log; -public class AlarmBootReceiver extends WakefulBroadcastReceiver { +public class AlarmBootReceiver extends BroadcastReceiver { - final String TAG = "AlarmBootReceiver"; + private static final String TAG = "AlarmBootReceiver"; @Override public void onReceive(Context context, Intent intent) { SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context); - if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction()) + if (("android.intent.action.BOOT_COMPLETED".equals(intent.getAction()) || "android.intent.action.QUICKBOOT_POWERON".equals(intent.getAction())) && settings.getBoolean("alarm_toggle", false)) { AlarmManager alarmManager = (AlarmManager) context.getSystemService( Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, Alarm.ALARM_ID, new Intent(context, AlarmReceiver.class), 0); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, settings.getLong("alarm_time", 0), pendingIntent); - } else { - alarmManager.set(AlarmManager.RTC_WAKEUP, settings.getLong("alarm_time", 0), pendingIntent); + if (alarmManager != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, settings.getLong("alarm_time", 0), pendingIntent); + } else { + alarmManager.set(AlarmManager.RTC_WAKEUP, settings.getLong("alarm_time", 0), pendingIntent); + } } + Log.d(TAG, "Alarm has been recovered"); } diff --git a/app/src/main/java/com/example/yink/amadeus/AlarmReceiver.java b/app/src/main/java/com/example/yink/amadeus/AlarmReceiver.java index 0a995c1..97d4584 100644 --- a/app/src/main/java/com/example/yink/amadeus/AlarmReceiver.java +++ b/app/src/main/java/com/example/yink/amadeus/AlarmReceiver.java @@ -10,7 +10,7 @@ public class AlarmReceiver extends BroadcastReceiver { - private final String TAG = "AlarmReceiver"; + private static final String TAG = "AlarmReceiver"; @Override public void onReceive(Context context, Intent intent) { diff --git a/app/src/main/java/com/example/yink/amadeus/AlarmService.java b/app/src/main/java/com/example/yink/amadeus/AlarmService.java index ca5ef4d..e863a9a 100644 --- a/app/src/main/java/com/example/yink/amadeus/AlarmService.java +++ b/app/src/main/java/com/example/yink/amadeus/AlarmService.java @@ -1,14 +1,18 @@ package com.example.yink.amadeus; import android.app.IntentService; +import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.os.Build; import android.support.v4.app.NotificationCompat; public class AlarmService extends IntentService { + private static final String CHANNEL_ID = "amadeus_channel_alarm"; + public AlarmService() { super("AlarmService"); } @@ -25,13 +29,21 @@ private void sendNotification(String msg) { NotificationManager alarmNotificationManager = (NotificationManager) this .getSystemService(Context.NOTIFICATION_SERVICE); + if (alarmNotificationManager == null) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + alarmNotificationManager.createNotificationChannel(new NotificationChannel(CHANNEL_ID, getString(R.string.pref_alarm), NotificationManager.IMPORTANCE_HIGH)); + } + PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, LaunchActivity.class), 0); - NotificationCompat.Builder alarmNotificationBuilder = new NotificationCompat.Builder( - this).setContentTitle(getString(R.string.app_name)).setSmallIcon(R.drawable.incoming_call) + NotificationCompat.Builder alarmNotificationBuilder = new NotificationCompat.Builder(this, CHANNEL_ID) + .setContentTitle(getString(R.string.app_name)).setSmallIcon(R.drawable.incoming_call) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) - .setContentText(msg); + .setContentText(msg) + .setChannelId(CHANNEL_ID); alarmNotificationBuilder.setContentIntent(contentIntent); alarmNotificationManager.notify(Alarm.ALARM_NOTIFICATION_ID, alarmNotificationBuilder.build()); diff --git a/app/src/main/java/com/example/yink/amadeus/Amadeus.java b/app/src/main/java/com/example/yink/amadeus/Amadeus.java index 2d52bcc..3abe0e4 100644 --- a/app/src/main/java/com/example/yink/amadeus/Amadeus.java +++ b/app/src/main/java/com/example/yink/amadeus/Amadeus.java @@ -28,10 +28,10 @@ class Amadeus { static Boolean isSpeaking = false; static Boolean isLoop = false; static MediaPlayer m; - private static String TAG = "Amadeus"; + private static final String TAG = "Amadeus"; private static int shaman_girls = -1; - private static VoiceLine[] voiceLines = VoiceLine.Line.getLines(); - private static HashMap, Bundle> responseInputMap = new HashMap<>(); + private static final VoiceLine[] voiceLines = VoiceLine.Line.getLines(); + private static final HashMap, Bundle> responseInputMap = new HashMap<>(); static { responseInputMap.put(new Bundle<>( @@ -120,8 +120,8 @@ class Amadeus { static void speak(VoiceLine line, final Activity activity) { final AnimationDrawable animation; - final TextView subtitles = (TextView) activity.findViewById(R.id.textView_subtitles); - final ImageView kurisu = (ImageView) activity.findViewById(R.id.imageView_kurisu); + final TextView subtitles = activity.findViewById(R.id.textView_subtitles); + final ImageView kurisu = activity.findViewById(R.id.imageView_kurisu); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(activity); try { @@ -142,29 +142,18 @@ static void speak(VoiceLine line, final Activity activity) { m = new MediaPlayer(); } - m.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { - @Override - public void onPrepared(MediaPlayer mp) { - isSpeaking = true; - mp.start(); - v.setEnabled(true); - } + m.setOnPreparedListener(mp -> { + isSpeaking = true; + mp.start(); + v.setEnabled(true); }); - m.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { - @Override - public void onCompletion(MediaPlayer mp) { - isSpeaking = false; - mp.release(); - v.setEnabled(false); - - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - kurisu.setImageDrawable(animation.getFrame(0)); - } - }); - } + m.setOnCompletionListener(mp -> { + isSpeaking = false; + mp.release(); + v.setEnabled(false); + + activity.runOnUiThread(() -> kurisu.setImageDrawable(animation.getFrame(0))); }); @@ -180,15 +169,12 @@ public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int sampl // The normalized volume final float normalized = sum / (float) bytes.length; - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - if (normalized > 50) { - // Todo: Maybe choose sprite based on previous choice and volume instead of random - kurisu.setImageDrawable(animation.getFrame((int) Math.ceil(Math.random() * 2))); - } else { - kurisu.setImageDrawable(animation.getFrame(0)); - } + activity.runOnUiThread(() -> { + if (normalized > 50) { + // Todo: Maybe choose sprite based on previous choice and volume instead of random + kurisu.setImageDrawable(animation.getFrame((int) Math.ceil(Math.random() * 2))); + } else { + kurisu.setImageDrawable(animation.getFrame(0)); } }); } @@ -336,20 +322,22 @@ static void openApp(String[] input, Activity activity) { private static class Bundle implements Iterable { - private T[] list; + private final T[] list; - public Bundle(T... list) { + @SafeVarargs + private Bundle(T... list) { this.list = list; } - public T[] toArray() { + private T[] toArray() { return list; } @NonNull @Override public Iterator iterator() { - Iterator iterator = new Iterator() { + Iterator iterator; + iterator = new Iterator() { int index = 0; @Override diff --git a/app/src/main/java/com/example/yink/amadeus/ContextLocalWrapper.java b/app/src/main/java/com/example/yink/amadeus/ContextLocalWrapper.java new file mode 100644 index 0000000..0ac6b6f --- /dev/null +++ b/app/src/main/java/com/example/yink/amadeus/ContextLocalWrapper.java @@ -0,0 +1,96 @@ +package com.example.yink.amadeus; + +/* Solution: http://stackoverflow.com/a/40704077 */ + +import android.content.Context; +import android.content.ContextWrapper; +import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Build; +import android.os.LocaleList; +import android.preference.PreferenceManager; + +import java.util.Locale; + +public class ContextLocalWrapper extends ContextWrapper { + + public ContextLocalWrapper(Context base) { + super(base); + } + + private static Locale getLocale(Context context) { + + SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); + String lang = settings.getString("lang", "system"); + Locale locale = null; + if (!lang.equals("system")) { + String[] langArr = lang.split("-"); + switch(langArr.length){ + case 3: + locale = new Locale(langArr[0],langArr[1], langArr[2]); + break; + case 2: + locale = new Locale(langArr[0],langArr[1]); + break; + case 1: + locale = new Locale(langArr[0]); + break; + } + } + + if (locale == null) { + locale = Resources.getSystem().getConfiguration().locale; + } + + return locale; + + } + + public static ContextLocalWrapper wrap(Context context) { + Resources res = context.getResources(); + Configuration configuration = res.getConfiguration(); + + Locale locale = getLocale(context); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + configuration.setLocale(locale); + LocaleList localeList = new LocaleList(locale); + LocaleList.setDefault(localeList); + configuration.setLocales(localeList); + context = context.createConfigurationContext(configuration); + + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + configuration.setLocale(locale); + context = context.createConfigurationContext(configuration); + } else { + configuration.locale = locale; + res.updateConfiguration(configuration, res.getDisplayMetrics()); + } + + return new ContextLocalWrapper(context); + } + + public static Context load(Context context, String lang) { + Configuration config = context.getResources().getConfiguration(); + + Locale locale = new Locale(lang); + Locale.setDefault(locale); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + config.setLocale(locale); + } else { + config.locale = locale; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + context = context.createConfigurationContext(config); + } else { + context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); + } + + return context; + } + + +} diff --git a/app/src/main/java/com/example/yink/amadeus/LangContext.java b/app/src/main/java/com/example/yink/amadeus/LangContext.java deleted file mode 100644 index 88f6730..0000000 --- a/app/src/main/java/com/example/yink/amadeus/LangContext.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.example.yink.amadeus; - -/* Solution: http://stackoverflow.com/a/40704077 */ - -import android.annotation.TargetApi; -import android.content.Context; -import android.content.ContextWrapper; -import android.content.SharedPreferences; -import android.content.res.Configuration; -import android.os.Build; -import android.preference.PreferenceManager; - -import java.util.Locale; - -public class LangContext extends ContextWrapper { - public LangContext(Context base) { - super(base); - } - - @SuppressWarnings("deprecation") - public static ContextWrapper wrap(Context context) { - Configuration config = context.getResources().getConfiguration(); - - SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); - - String lang = settings.getString("lang", "en"); - String[] langArr = lang.split("-"); - Locale locale; - switch(langArr.length){ - case 3: - locale = new Locale(langArr[0],langArr[1], langArr[2]); - break; - case 2: - locale = new Locale(langArr[0],langArr[1]); - break; - default: - locale = new Locale(langArr[0]); - break; - } - - if (lang.equals("zh-rTW")) - locale = Locale.TAIWAN; - else if (lang.equals("zh-rCN")) - locale = Locale.CHINA; - - Locale.setDefault(locale); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - setSystemLocale(config, locale); - } else { - setSystemLocaleLegacy(config, locale); - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - context = context.createConfigurationContext(config); - } else { - context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); - } - return new LangContext(context); - } - - @SuppressWarnings("deprecation") - public static Context load(Context context, String lang) { - Configuration config = context.getResources().getConfiguration(); - - Locale locale = new Locale(lang); - Locale.setDefault(locale); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - setSystemLocale(config, locale); - } else { - setSystemLocaleLegacy(config, locale); - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - context = context.createConfigurationContext(config); - } else { - context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); - } - - return context; - } - - @SuppressWarnings("deprecation") - private static void setSystemLocaleLegacy(Configuration config, Locale locale){ - config.locale = locale; - } - - @TargetApi(Build.VERSION_CODES.N) - private static void setSystemLocale(Configuration config, Locale locale){ - config.setLocale(locale); - } -} diff --git a/app/src/main/java/com/example/yink/amadeus/LaunchActivity.java b/app/src/main/java/com/example/yink/amadeus/LaunchActivity.java index 14c62b1..1fb497b 100644 --- a/app/src/main/java/com/example/yink/amadeus/LaunchActivity.java +++ b/app/src/main/java/com/example/yink/amadeus/LaunchActivity.java @@ -1,5 +1,6 @@ package com.example.yink.amadeus; +import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; @@ -7,30 +8,36 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.media.MediaPlayer; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; +import android.provider.Settings; import android.support.v4.app.NotificationCompat; import android.support.v4.app.TaskStackBuilder; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; -import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; public class LaunchActivity extends AppCompatActivity { + private static final String GOOGLE_PACKAGE_NAME = "com.google.android.googlequicksearchbox"; + private static final String DEFAULT_ASSAIST = "com.google.android.googlequicksearchbox/com.google.android.voiceinteraction.GsaVoiceInteractionService"; + private static final String CHANNEL_ID = "amadeus_channel_icon"; + private ImageView connect, cancel, logo; private TextView status; private Boolean isPressed = false; private MediaPlayer m; - private Handler aniHandle = new Handler(); + private final Handler aniHandle = new Handler(); private int i = 0; - Runnable aniRunnable = new Runnable() { + private final Runnable aniRunnable = new Runnable() { public void run() { final int DURATION = 20; if (i < 39) { @@ -52,21 +59,38 @@ private boolean isAppInstalled(Context context, String packageName) { } } + private boolean isDefaultAssistApp(Context context, String app){ + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + return true; + } + final String assistant = Settings.Secure.getString(context.getContentResolver(), "assistant"); + if (assistant.equals(app)) { + return true; + } + Toast.makeText(context, getString(R.string.assist_app_error), Toast.LENGTH_LONG).show(); + startActivity(new Intent(Settings.ACTION_VOICE_INPUT_SETTINGS)); + return false; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_launch); - connect = (ImageView) findViewById(R.id.imageView_connect); - cancel = (ImageView) findViewById(R.id.imageView_cancel); - status = (TextView) findViewById(R.id.textView_call); - logo = (ImageView) findViewById(R.id.imageView_logo); + connect = findViewById(R.id.imageView_connect); + cancel = findViewById(R.id.imageView_cancel); + status = findViewById(R.id.textView_call); + logo = findViewById(R.id.imageView_logo); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); final Window win = getWindow(); aniHandle.post(aniRunnable); - if (!isAppInstalled(LaunchActivity.this, "com.google.android.googlequicksearchbox")) { + if (!isAppInstalled(LaunchActivity.this, GOOGLE_PACKAGE_NAME)) { status.setText(R.string.google_app_error); + } else if (!isDefaultAssistApp(LaunchActivity.this, DEFAULT_ASSAIST)){ + status.setText(R.string.assist_app_error); + } else if (settings.getBoolean("show_notification", false)) { + showNotification(); } if (Alarm.isPlaying()) { @@ -75,76 +99,58 @@ protected void onCreate(Bundle savedInstanceState) { win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); } - if (settings.getBoolean("show_notification", false)) { - showNotification(); - } + connect.setOnClickListener(view -> { + if (!isPressed && isAppInstalled(LaunchActivity.this, GOOGLE_PACKAGE_NAME) + && isDefaultAssistApp(LaunchActivity.this, DEFAULT_ASSAIST)) { + isPressed = true; - connect.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (!isPressed && isAppInstalled(LaunchActivity.this, "com.google.android.googlequicksearchbox")) { - isPressed = true; - - connect.setImageResource(R.drawable.connect_select); - - if (!Alarm.isPlaying()) { - m = MediaPlayer.create(LaunchActivity.this, R.raw.tone); - - m.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { - @Override - public void onPrepared(MediaPlayer mp) { - mp.start(); - status.setText(R.string.connecting); - } - }); - - m.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { - @Override - public void onCompletion(MediaPlayer mp) { - mp.release(); - Intent intent = new Intent(LaunchActivity.this, MainActivity.class); - startActivity(intent); - } - }); - } else { - Alarm.cancel(LaunchActivity.this); - win.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); - win.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); + connect.setImageResource(R.drawable.connect_select); + if (!Alarm.isPlaying()) { + m = MediaPlayer.create(LaunchActivity.this, R.raw.tone); + + m.setOnPreparedListener(mp -> { + mp.start(); + status.setText(R.string.connecting); + }); + + m.setOnCompletionListener(mp -> { + mp.release(); Intent intent = new Intent(LaunchActivity.this, MainActivity.class); startActivity(intent); - } + }); + } else { + Alarm.cancel(LaunchActivity.this); + win.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); + win.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); + + Intent intent = new Intent(LaunchActivity.this, MainActivity.class); + startActivity(intent); } } }); - cancel.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - cancel.setImageResource(R.drawable.cancel_select); - Alarm.cancel(getApplicationContext()); - win.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); - win.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); - - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.addCategory(Intent.CATEGORY_HOME); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); - } + cancel.setOnClickListener(view -> { + cancel.setImageResource(R.drawable.cancel_select); + Alarm.cancel(getApplicationContext()); + win.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); + win.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); + + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_HOME); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); }); - logo.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Intent settingIntent = new Intent(LaunchActivity.this, SettingsActivity.class); - startActivity(settingIntent); - } + logo.setOnClickListener(view -> { + Intent settingIntent = new Intent(LaunchActivity.this, SettingsActivity.class); + startActivity(settingIntent); }); } @Override protected void attachBaseContext(Context newBase) { - super.attachBaseContext(LangContext.wrap(newBase)); + super.attachBaseContext(ContextLocalWrapper.wrap(newBase)); } @Override @@ -169,8 +175,10 @@ protected void onResume() { if (isPressed) { status.setText(R.string.disconnected); - } else if (!isAppInstalled(LaunchActivity.this, "com.google.android.googlequicksearchbox")) { + } else if (!isAppInstalled(LaunchActivity.this, GOOGLE_PACKAGE_NAME)) { status.setText(R.string.google_app_error); + } else if (!isDefaultAssistApp(LaunchActivity.this, DEFAULT_ASSAIST)){ + status.setText(R.string.assist_app_error); } else if (Alarm.isPlaying()) { status.setText(R.string.incoming_call); } else { @@ -183,17 +191,24 @@ protected void onResume() { } private void showNotification() { - NotificationCompat.Builder builder = new NotificationCompat.Builder(LaunchActivity.this) + NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + if (notificationManager == null) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + notificationManager.createNotificationChannel(new NotificationChannel(CHANNEL_ID, getString(R.string.pref_notification), NotificationManager.IMPORTANCE_LOW)); + } + NotificationCompat.Builder builder = new NotificationCompat.Builder(LaunchActivity.this, CHANNEL_ID) .setSmallIcon(R.drawable.xp2) .setContentTitle(getString(R.string.app_name)) - .setContentText(getString(R.string.notification_text)); + .setContentText(getString(R.string.notification_text)) + .setChannelId(CHANNEL_ID); Intent resultIntent = new Intent(LaunchActivity.this, MainActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(LaunchActivity.this); stackBuilder.addParentStack(MainActivity.class); stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(resultPendingIntent); - NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, builder.build()); } } \ No newline at end of file diff --git a/app/src/main/java/com/example/yink/amadeus/MainActivity.java b/app/src/main/java/com/example/yink/amadeus/MainActivity.java index 8f35b5e..1442baa 100644 --- a/app/src/main/java/com/example/yink/amadeus/MainActivity.java +++ b/app/src/main/java/com/example/yink/amadeus/MainActivity.java @@ -29,10 +29,10 @@ public class MainActivity extends AppCompatActivity { - private final String TAG = "MainActivity"; + private static final String TAG = "MainActivity"; - private VoiceLine[] voiceLines = VoiceLine.Line.getLines(); - private Random randomgen = new Random(); + private final VoiceLine[] voiceLines = VoiceLine.Line.getLines(); + private final Random randomgen = new Random(); private String recogLang; private String[] contextLang; private SpeechRecognizer sr; @@ -43,8 +43,8 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); - ImageView kurisu = (ImageView) findViewById(R.id.imageView_kurisu); - ImageView subtitlesBackground = (ImageView) findViewById(R.id.imageView_subtitles); + ImageView kurisu = findViewById(R.id.imageView_kurisu); + ImageView subtitlesBackground = findViewById(R.id.imageView_subtitles); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); recogLang = settings.getString("recognition_lang", "ja-JP"); contextLang = recogLang.split("-"); @@ -73,48 +73,43 @@ public void run() { } }; - kurisu.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - MainActivity host = (MainActivity) view.getContext(); - - int permissionCheck = ContextCompat.checkSelfPermission(host, - Manifest.permission.RECORD_AUDIO); - - /* Input during loop produces bugs and mixes with output */ - if (!Amadeus.isLoop && !Amadeus.isSpeaking) { - if (permissionCheck == PackageManager.PERMISSION_GRANTED) { - promptSpeechInput(); - } else { - Amadeus.speak(voiceLines[VoiceLine.Line.DAGA_KOTOWARU], MainActivity.this); - } - } - - } else if (!Amadeus.isLoop && !Amadeus.isSpeaking) { - promptSpeechInput(); - } - }}); + kurisu.setOnClickListener(view -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + MainActivity host = (MainActivity) view.getContext(); + int permissionCheck = ContextCompat.checkSelfPermission(host, + Manifest.permission.RECORD_AUDIO); - kurisu.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View view) { + /* Input during loop produces bugs and mixes with output */ if (!Amadeus.isLoop && !Amadeus.isSpeaking) { - handler.post(loop); - Amadeus.isLoop = true; - } else { - handler.removeCallbacks(loop); - Amadeus.isLoop = false; + if (permissionCheck == PackageManager.PERMISSION_GRANTED) { + promptSpeechInput(); + } else { + Amadeus.speak(voiceLines[VoiceLine.Line.DAGA_KOTOWARU], MainActivity.this); + } } - return true; + + } else if (!Amadeus.isLoop && !Amadeus.isSpeaking) { + promptSpeechInput(); } }); + + + kurisu.setOnLongClickListener(view -> { + if (!Amadeus.isLoop && !Amadeus.isSpeaking) { + handler.post(loop); + Amadeus.isLoop = true; + } else { + handler.removeCallbacks(loop); + Amadeus.isLoop = false; + } + return true; + }); } @Override protected void attachBaseContext(Context newBase) { - super.attachBaseContext(LangContext.wrap(newBase)); + super.attachBaseContext(ContextLocalWrapper.wrap(newBase)); } @Override @@ -165,7 +160,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && null != data) { /* Switch language within current context for voice recognition */ - Context context = LangContext.load(getApplicationContext(), contextLang[0]); + Context context = ContextLocalWrapper.load(getApplicationContext(), contextLang[0]); ArrayList input = data .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); @@ -203,14 +198,17 @@ public void onError(int error) { } public void onResults(Bundle results) { String input = ""; - String debug = ""; + StringBuilder debug = new StringBuilder(); Log.d(TAG, "Received results"); ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); + if (data == null) { + return; + } for (Object word: data) { - debug += word + "\n"; + debug.append(word).append("\n"); } - Log.d(TAG, debug); + Log.d(TAG, debug.toString()); input += data.get(0); /* TODO: Japanese doesn't split the words. Sigh. */ @@ -222,7 +220,7 @@ public void onResults(Bundle results) { } /* Switch language within current context for voice recognition */ - Context context = LangContext.load(getApplicationContext(), contextLang[0]); + Context context = ContextLocalWrapper.load(getApplicationContext(), contextLang[0]); if (splitInput.length > 2 && splitInput[0].equalsIgnoreCase(context.getString(R.string.assistant))) { String cmd = splitInput[1].toLowerCase(); diff --git a/app/src/main/java/com/example/yink/amadeus/SettingsActivity.java b/app/src/main/java/com/example/yink/amadeus/SettingsActivity.java index 17f4490..bffdf60 100644 --- a/app/src/main/java/com/example/yink/amadeus/SettingsActivity.java +++ b/app/src/main/java/com/example/yink/amadeus/SettingsActivity.java @@ -1,25 +1,22 @@ package com.example.yink.amadeus; -/** - * Created by Yink on 05.03.2017. - */ - import android.content.Context; -import android.os.Build; import android.os.Bundle; import android.support.v4.app.FragmentActivity; -public class SettingsActivity extends FragmentActivity { +/** + * Created by Yink on 05.03.2017. + */ + +public class SettingsActivity extends FragmentActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit(); - } + getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit(); } @Override protected void attachBaseContext(Context newBase) { - super.attachBaseContext(LangContext.wrap(newBase)); + super.attachBaseContext(ContextLocalWrapper.wrap(newBase)); } } diff --git a/app/src/main/java/com/example/yink/amadeus/SettingsFragment.java b/app/src/main/java/com/example/yink/amadeus/SettingsFragment.java index 84e4790..705ff04 100644 --- a/app/src/main/java/com/example/yink/amadeus/SettingsFragment.java +++ b/app/src/main/java/com/example/yink/amadeus/SettingsFragment.java @@ -1,22 +1,27 @@ package com.example.yink.amadeus; import android.content.SharedPreferences; -import android.os.Build; import android.os.Bundle; import android.preference.PreferenceFragment; -import android.support.annotation.RequiresApi; +import android.widget.Toast; /** * Created by Yink on 05.03.2017. */ -@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) -public class SettingsFragment extends PreferenceFragment { - SharedPreferences sharedPreferences; +public class SettingsFragment extends PreferenceFragment + implements SharedPreferences.OnSharedPreferenceChangeListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (key.equals("lang")) { + Toast.makeText(getActivity(), getString(R.string.pref_app_restart_required), Toast.LENGTH_SHORT).show(); + } + } } diff --git a/app/src/main/java/com/example/yink/amadeus/VoiceLine.java b/app/src/main/java/com/example/yink/amadeus/VoiceLine.java index eb87f1e..48d0d62 100644 --- a/app/src/main/java/com/example/yink/amadeus/VoiceLine.java +++ b/app/src/main/java/com/example/yink/amadeus/VoiceLine.java @@ -46,7 +46,7 @@ static class Mood { } static class Line { - static VoiceLine[] voiceLines = new VoiceLine[45]; + static final VoiceLine[] voiceLines = new VoiceLine[45]; static final int HELLO = 0; static final int DAGA_KOTOWARU = 1; diff --git a/app/src/main/res/layout/activity_alarm.xml b/app/src/main/res/layout/activity_alarm.xml index 46ee3dd..07e7938 100644 --- a/app/src/main/res/layout/activity_alarm.xml +++ b/app/src/main/res/layout/activity_alarm.xml @@ -14,7 +14,7 @@ + android:src="@drawable/logo39" + android:contentDescription="@string/app_name" /> + android:layout_alignParentStart="true" + tools:ignore="UnusedAttribute" /> + android:src="@drawable/connect_unselect" + tools:ignore="ContentDescription" /> + android:src="@drawable/cancel_unselect" + tools:ignore="ContentDescription" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 112acaf..4567c65 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,5 +1,6 @@ @@ -9,13 +10,15 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="centerCrop" - android:src="@drawable/bg1" /> + android:src="@drawable/bg1" + tools:ignore="ContentDescription" /> + android:src="@drawable/kurisu_happy1" + tools:ignore="ContentDescription" /> + android:layout_alignParentEnd="true" + android:contentDescription="@string/app_name" /> + android:src="@drawable/subtitle_frame_big" + tools:ignore="ContentDescription" /> + android:typeface="monospace" + tools:ignore="RelativeOverlap,UnusedAttribute" /> \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 28727b9..45bcbec 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -4,18 +4,19 @@ Verbindung mit Kurisu herstellen? Verbindung wird hergestellt… Verbindung unterbrochen. - de - de-DE Google App wurde nicht erkannt. + Google App is\'t default Assist & voice input app. Eingehender Anruf von Kurisu. Deine Waifu vermisst dich. App Einstellungen + App restart required Spracherkennung Wähle Sprache zur Spracherkennung Sprache Wähle App Sprache (App Neustart erforderlich) + System Language (Default) Untertitel anzeigen Untertitel für Amadeus Antworten anzeigen Show "XP"-Icon diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 44469a3..ce38c0c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -3,16 +3,16 @@ ¿Conectar a Kurisu? Conectando… Desconectado. - es - es-ES Google App no fue detectado. - + Google App is\'t default Assist & voice input app. Ajustes de la aplicación + App restart required Idioma de reconocimiento de voz Elegir el idioma de reconocimiento de voz Idiomas Elegir el idioma de la aplicación (requiere reiniciar la aplicación) + System Language (Default) Mostrar subtítulos Mostrar subtítulos para las respuestas de Amadeus Mostrar icono "XP" diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4e65bbe..6cb2d2b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -4,18 +4,19 @@ Se connecter à Kurisu ? Connexion… Déconnecté. - fr - fr-FR Application Google non détectée. + Google App is\'t default Assist & voice input app. Appel de Kurisu. Vous manquez à votre waifu. Paramètres de l\'application + App restart required Langue de reconnaissance vocale Sélectionnez la langue pour la reconnaissance vocale Langue Sélectionnez la langue de l\'application (redémarrage requis) + System Language (Default) Afficher les sous-titres Affiche les sous-titres pour les réponses d\'Amadeus Afficher Icône-"XP" @@ -61,7 +62,7 @@ Senpai, s\'il vous plaît, ne le dites pas aux autres… Cela ne me satisfait toujours pas. Cela ne fait aucun sens. - Voyons voir... Ma conclusion est que cela n\'est pas possible. + Voyons voir… Ma conclusion est que cela n\'est pas possible. C\'est probablement car les scientifiques n\'ont encore rien découvert d\'important. Mais on ne sait pas si c\'est réellement impossible, je suppose. Une machine à voyager dans le temps, dites-vous ? diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 32963cf..5828035 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -4,18 +4,19 @@ Connettere a Kurisu? Collegamento… Disconnesso. - it - en-US App Google non rilevata. + Google App is\'t default Assist & voice input app. Chiamata da Kurisu. Manchi alla tua waifu. Impostazioni applicazione + App restart required Lingua di riconoscimento Seleziona lingua di riconoscimento vocale Lingua Seleziona lingua app (riavvio app richiesto) + System Language (Default) Mostra sottotitoli Mostra sottotitoli per le risposte di Amadeus Mostra "XP"-Icon diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 7af6460..4fd118b 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -3,9 +3,28 @@ Connect to Kurisu? Connecting… Disconnected. - ja - ja-JP Google App wasn\'t detected. + Google App is\'t default Assist & voice input app. + + + Application settings + App restart required + Recognition language + Select voice recognition language + Language + Select app language (app restart required) + System Language (Default) + Show subtitles + Shows subtitles for Amadeus\' answers + Show "XP"-Icon + Shows Icon in the notification bar (app restart required) + Alarm + Alarm settings + Alarm setup + Alarm ringtone + Select ringtone for alarm + Vibrate on alarm + 24-hour format Hello. Don\'t call me like that! diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index bc358a6..7098e42 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -3,9 +3,28 @@ Conectar a Kurisu? Conectando… Desconectado. - pt - ja-JP Google App wasn\'t detected. + Google App is\'t default Assist & voice input app. + + + Application settings + App restart required + Recognition language + Select voice recognition language + Language + Select app language (app restart required) + System Language (Default) + Show subtitles + Shows subtitles for Amadeus\' answers + Show "XP"-Icon + Shows Icon in the notification bar (app restart required) + Alarm + Alarm settings + Alarm setup + Alarm ringtone + Select ringtone for alarm + Vibrate on alarm + 24-hour format Olá. Não me chames assim! diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 45d4d7b..46d44f9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -3,18 +3,19 @@ Подключиться к Курису? Подключение… Отключено. - ru - ru-RU Google App не найден. + Google App is\'t default Assist & voice input app. Звонок от Курису. Твоя вайфу скучает по тебе. Настройки приложения + App restart required Язык распознавания Выберите язык распознавания голоса Язык Выберите язык приложения (требуется перезапуск) + System Language (Default) Показывать субтитры Показывает субтитры с ответами Амадеуса Показывать иконку "XP" diff --git a/app/src/main/res/values-v14/styles.xml b/app/src/main/res/values-v14/styles.xml deleted file mode 100644 index a6e791f..0000000 --- a/app/src/main/res/values-v14/styles.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 3bf0178..699ae00 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -2,45 +2,46 @@ Amadeus 连接到助手 - 连接中... - 断开连接 - zh-rCN - en-US - 没有检测到Google App + 连接中… + 已断开连接 + Google App 未安装 + Google App 不是默认的辅助或语音输入应用 来自助手的电话 - 你的老婆想你了 + 你的纸片人老婆想你了。 设置 + 重启 App 后生效 语音识别 选择语种 界面语言 - 选择界面语言 (需重启应用) + 选择界面语言(重启生效) + 系统语言(默认) 显示字幕 - 显示Amadeus说的话 - 在状态栏显示 - 在状态栏显示提示 (需重启应用) + 显示 Amadeus 说的话 + 显示“XP”图标 + 在状态栏显示“XP”图标(重启生效) 闹钟设置 设置时间 闹钟铃声 选择闹钟铃声 响铃时震动 - 24小时制 + 24 小时制 - 你好。 + 你好! 别 那 样 叫 我。 但是我拒绝。 没想到你竟然这么变态,我看错你了。 也对呢。 - 干得漂亮。 + 干得漂亮! 变 态 确 定。 抱歉。 很幸苦呢。 这家伙没救了,必须要做点什么。 咔。 缇娜 禁止!! - 你个变态! 你是笨蛋? 想死吗?! + 你个变态!你是笨蛋?想死吗?! 说起来,还没正式自我介绍过。我叫牧瀬红莉栖,初次见面,请多关照。 谁是克莉斯缇娜啊?我可没说过。 我很好奇为什么我叫克莉斯缇娜? @@ -56,7 +57,7 @@ 请多指教。 那么前辈,我能再问一个问题吗? 前辈? - 呐,前辈。关于刚才那件事... + 呐,前辈。关于刚才那件事… 嗯,前辈,那边的那个人是? 前辈,拜托请不要告诉其他人。 我对这件事不是很满意。 @@ -70,7 +71,7 @@ 也就是说,是秘密日记。 修改我的记忆? 理论上是可行的。 举例来说,可以做到让我认为自己的名字是克莉斯缇娜。 - 咔、啊、嗯嗯嗯... + 咔、啊、嗯嗯嗯… 太棒了,他真的可以。 太棒了! 天呐! diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 900ef5a..d71a792 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -1,19 +1,20 @@ - English - Русский - Português - Español - Italiano - Française - Deutsch - 日本語 - 简体中文 - 繁體中文 + @string/pref_lang_system + @string/pref_lang_en + @string/pref_lang_ru + @string/pref_lang_pt + @string/pref_lang_es + @string/pref_lang_it + @string/pref_lang_fr + @string/pref_lang_de + @string/pref_lang_ja + @string/pref_lang_zh_cn + system en ru pt @@ -23,16 +24,15 @@ de ja zh-rCN - zh-rTW - English - 日本語 - Русский - Español - Deutsch - Française + @string/pref_lang_en + @string/pref_lang_ja + @string/pref_lang_pt + @string/pref_lang_es + @string/pref_lang_de + @string/pref_lang_fr @@ -45,13 +45,13 @@ - Gate Of Steiner - Village - Beginning Of Fight - Easygoingness - Reunion - Precaution - Over The Sky + @string/pref_alarm_ringtone_gate_of_steiner + @string/pref_alarm_ringtone_village + @string/pref_alarm_ringtone_beginning_of_fight + @string/pref_alarm_ringtone_easygoingness + @string/pref_alarm_ringtone_reunion + @string/pref_alarm_ringtone_precaution + @string/pref_alarm_ringtone_over_the_sky diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d438a6d..24fd8da 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,22 +4,37 @@ Connect to Kurisu? Connecting… Disconnected. - en - en-US + system + en-US Google App wasn\'t detected. + Google App is\'t default Assist & voice input app. Call from Kurisu. Your waifu misses you. Application settings + App restart required Recognition language Select voice recognition language Language Select app language (app restart required) + + System Language (Default) + English + Русский + Português + Español + Italiano + Française + Deutsch + 日本語 + 中文(大陆) + Show subtitles Shows subtitles for Amadeus\' answers Show "XP"-Icon Shows Icon in the notification bar (app restart required) + Alarm Alarm settings Alarm setup Alarm ringtone @@ -27,6 +42,14 @@ Vibrate on alarm 24-hour format + Gate Of Steiner + Village + Beginning Of Fight + Easygoingness + Reunion + Precaution + Over The Sky + Hello. Don\'t call me like that! @@ -111,4 +134,5 @@ antimatter assistant open + Alarm On/Off \ No newline at end of file diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 69e9306..27b77ec 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -16,14 +16,14 @@ android:entries="@array/languagesRecogArray" android:entryValues="@array/languagesRecogValues" android:key="recognition_lang" - android:summary="@string/pref_recog_lang_desc" + android:summary="%s" android:title="@string/pref_recog_lang" /> @@ -33,10 +33,11 @@ android:targetClass="com.example.yink.amadeus.AlarmActivity" />-->