From 3c77b37cd74d23f95c12f5d175778f7e21819748 Mon Sep 17 00:00:00 2001 From: Jonathan Chan Date: Sat, 5 May 2018 17:04:58 -0700 Subject: [PATCH] Updated app to use Kotlin! --- .gitignore | 4 +- .idea/.name | 1 - .idea/assetWizardSettings.xml | 14 + .idea/caches/build_file_checksums.ser | Bin 0 -> 539 bytes .idea/codeStyles/Project.xml | 29 + .idea/compiler.xml | 22 - .idea/copyright/profiles_settings.xml | 3 - .idea/encodings.xml | 6 - .idea/misc.xml | 22 +- .idea/vcs.xml | 2 +- QUOZ/QUOZ/.idea/misc.xml | 46 - QUOZ/QUOZ/.idea/workspace.xml | 1921 ----------------- app/build.gradle | 39 +- .../java/nonphatic/quoz/ApplicationTest.java | 13 - .../java/nonphatic/quoz/MainActivity.java | 336 --- .../main/java/nonphatic/quoz/MainActivity.kt | 238 ++ .../preferences/AboutDialogPreference.java | 57 - .../quoz/preferences/AboutDialogPreference.kt | 44 + .../AppCompatPreferenceActivity.java | 109 - .../AppCompatPreferenceActivity.kt | 96 + .../quoz/preferences/SettingsActivity.java | 189 -- .../quoz/preferences/SettingsActivity.kt | 174 ++ .../drawable-v21/nonphatic_colour_light.png | Bin 51985 -> 0 bytes app/src/main/res/drawable/nonphatic.png | Bin 0 -> 23294 bytes .../res/layout/preference_about_dialog.xml | 2 +- app/src/main/res/values/strings.xml | 25 +- app/src/main/res/xml/preferences.xml | 10 +- .../java/nonphatic/quoz/ExampleUnitTest.java | 15 - build.gradle | 6 +- 29 files changed, 640 insertions(+), 2783 deletions(-) delete mode 100644 .idea/.name create mode 100644 .idea/assetWizardSettings.xml create mode 100644 .idea/caches/build_file_checksums.ser create mode 100644 .idea/codeStyles/Project.xml delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/copyright/profiles_settings.xml delete mode 100644 .idea/encodings.xml delete mode 100644 QUOZ/QUOZ/.idea/misc.xml delete mode 100644 QUOZ/QUOZ/.idea/workspace.xml delete mode 100644 app/src/androidTest/java/nonphatic/quoz/ApplicationTest.java delete mode 100644 app/src/main/java/nonphatic/quoz/MainActivity.java create mode 100644 app/src/main/java/nonphatic/quoz/MainActivity.kt delete mode 100644 app/src/main/java/nonphatic/quoz/preferences/AboutDialogPreference.java create mode 100644 app/src/main/java/nonphatic/quoz/preferences/AboutDialogPreference.kt delete mode 100644 app/src/main/java/nonphatic/quoz/preferences/AppCompatPreferenceActivity.java create mode 100644 app/src/main/java/nonphatic/quoz/preferences/AppCompatPreferenceActivity.kt delete mode 100644 app/src/main/java/nonphatic/quoz/preferences/SettingsActivity.java create mode 100644 app/src/main/java/nonphatic/quoz/preferences/SettingsActivity.kt delete mode 100644 app/src/main/res/drawable-v21/nonphatic_colour_light.png create mode 100644 app/src/main/res/drawable/nonphatic.png delete mode 100644 app/src/test/java/nonphatic/quoz/ExampleUnitTest.java diff --git a/.gitignore b/.gitignore index a511bca..f21690d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .gradle /local.properties /.idea/workspace.xml +/.idea/tasks.xml /.idea/libraries .DS_Store /build @@ -10,4 +11,5 @@ gradle* /gradle /app/build -keystore.properties \ No newline at end of file +keystore.properties +/app/release diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index 4dfc7f4..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -QUOZ \ No newline at end of file diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml new file mode 100644 index 0000000..2a9c5e0 --- /dev/null +++ b/.idea/assetWizardSettings.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser new file mode 100644 index 0000000000000000000000000000000000000000..1c2d2c33187c87a5ee2379ee7760247acc3eaaf1 GIT binary patch literal 539 zcmZ4UmVvdnh`~NNKUXg?FQq6yGexf?KR>5fFEb@IQ7^qHF(oHeub?PDD>b=9F91S2 zm1gFoxMk*~I%lLNXBU^|7Q2L-Ts|(GuF1r}uGBYr_F>vMNC#JY1CYR(Fc`|U8WE72K4 uSrd*O(&`8LDkncVF$WYw7^W7 + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 96cc43e..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3..0000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 97626ba..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 5d19981..99202cc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,18 +1,16 @@ - - - @@ -27,17 +25,7 @@ - - - - - - - - - - - + diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/QUOZ/QUOZ/.idea/misc.xml b/QUOZ/QUOZ/.idea/misc.xml deleted file mode 100644 index fbb6828..0000000 --- a/QUOZ/QUOZ/.idea/misc.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/QUOZ/QUOZ/.idea/workspace.xml b/QUOZ/QUOZ/.idea/workspace.xml deleted file mode 100644 index ffae75b..0000000 --- a/QUOZ/QUOZ/.idea/workspace.xml +++ /dev/null @@ -1,1921 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1470164634382 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 6c56efb..8e58bb3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,32 +1,20 @@ -apply plugin: 'com.android.application' - -def keystorePropertiesFile = rootProject.file("keystore.properties") -def keystoreProperties = new Properties() -keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +apply plugin: "com.android.application" +apply plugin: "kotlin-android" android { - signingConfigs { - config { - keyAlias 'AndroidKey' - keyPassword keystoreProperties['password'] - storeFile file('C:/Users/Jonathan/Documents/Projects/Keystores/android.jks') - storePassword keystoreProperties['password'] - } - } - compileSdkVersion 24 - buildToolsVersion "24.0.1" + compileSdkVersion 27 + buildToolsVersion "27.0.3" defaultConfig { applicationId "nonphatic.quoz" - minSdkVersion 19 - targetSdkVersion 24 + minSdkVersion 21 + targetSdkVersion 27 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - signingConfig signingConfigs.config + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } debug { } @@ -34,9 +22,12 @@ android { } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:24.1.1' - compile 'com.android.support:support-v4:24.1.1' - compile 'com.android.support:design:24.1.1' + implementation fileTree(include: ["*.jar"], dir: "libs") + implementation "com.android.support:appcompat-v7:27.1.1" + implementation "com.android.support:support-v4:27.1.1" + implementation "com.android.support:design:27.1.1" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} +repositories { + mavenCentral() } diff --git a/app/src/androidTest/java/nonphatic/quoz/ApplicationTest.java b/app/src/androidTest/java/nonphatic/quoz/ApplicationTest.java deleted file mode 100644 index dbc9c45..0000000 --- a/app/src/androidTest/java/nonphatic/quoz/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package nonphatic.quoz; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/app/src/main/java/nonphatic/quoz/MainActivity.java b/app/src/main/java/nonphatic/quoz/MainActivity.java deleted file mode 100644 index c8876aa..0000000 --- a/app/src/main/java/nonphatic/quoz/MainActivity.java +++ /dev/null @@ -1,336 +0,0 @@ -package nonphatic.quoz; - -import android.annotation.SuppressLint; -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.graphics.Color; -import android.media.AudioManager; -import android.media.MediaPlayer; -import android.preference.PreferenceManager; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; -import android.os.Handler; -import android.view.MotionEvent; -import android.view.View; -import android.widget.TextView; -import android.widget.Toast; - -import nonphatic.quoz.preferences.SettingsActivity; - -import java.util.Random; -import java.util.Timer; -import java.util.TimerTask; - -/** - * An example full-screen activity that shows and hides the system UI (i.e. - * status bar and navigation/system bar) with user interaction. - */ -public class MainActivity extends AppCompatActivity { - /** - * Whether or not the system UI should be auto-hidden after - * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds. - */ - private static final boolean AUTO_HIDE = true; - - /** - * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after - * user interaction before hiding the system UI. - */ - private static final int AUTO_HIDE_DELAY_MILLIS = 3000; - - /** - * Some older devices needs a small delay between UI widget updates - * and a change of the status and navigation bar. - */ - private static final int UI_ANIMATION_DELAY = 300; - private final Handler mHideHandler = new Handler(); - private View mContentView; - private FloatingActionButton mFab; - private View mainView; - private Timer timer; - private TimerTask timerTask; - private MediaPlayer mediaPlayer; - private Random random; - - private int saturationPercent; - private String changeMode; - - private final Runnable mHidePart2Runnable = new Runnable() { - @SuppressLint("InlinedApi") - @Override - public void run() { - // Delayed removal of status and navigation bar - - // Note that some of these constants are new as of API 16 (Jelly Bean) - // and API 19 (KitKat). It is safe to use them, as they are inlined - // at compile-time and do nothing on earlier devices. - mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE - | View.SYSTEM_UI_FLAG_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); - } - }; - private final Runnable mShowPart2Runnable = new Runnable() { - @Override - public void run() { - // Delayed display of UI elements - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.show(); - } - } - }; - private final Runnable mHideRunnable = new Runnable() { - @Override - public void run() { - hide(); - } - }; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.activity_main); - setVolumeControlStream(AudioManager.STREAM_MUSIC); - - getPreferences(); - mContentView = findViewById(R.id.fullscreen_content); - mFab = (FloatingActionButton)findViewById(R.id.fab); - mainView = findViewById(R.id.main_layout); - timer = new Timer(); - random = new Random(); - - // Set up the user interaction to manually show or hide the system UI. - mContentView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (!isSwiping) { - setBackgroundToRandomColour(); - } - } - }); - - mContentView.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View view) { - ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("QUOZ Colour", ((TextView)mContentView).getText()); - clipboardManager.setPrimaryClip(clip); - - Toast.makeText(getApplicationContext(), "Copied to clipboard", Toast.LENGTH_SHORT).show(); - return true; - } - }); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - - // Trigger the initial hide() shortly after the activity has been - // created, to briefly hint to the user that UI controls - // are available. - delayedHide(100); - } - - private void toggle(float yDelta) { - if (yDelta < 0) { - hide(); - } else { - show(); - } - } - - private void hide() { - // Hide UI first - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.hide(); - } - mFab.hide(); - - // Schedule a runnable to remove the status and navigation bar after a delay - mHideHandler.removeCallbacks(mShowPart2Runnable); - mHideHandler.postDelayed(mHidePart2Runnable, UI_ANIMATION_DELAY); - } - - @SuppressLint("InlinedApi") - private void show() { - // Show the system bar - mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); - mFab.show(); - - // Schedule a runnable to display UI elements after a delay - mHideHandler.removeCallbacks(mHidePart2Runnable); - mHideHandler.postDelayed(mShowPart2Runnable, UI_ANIMATION_DELAY); - } - - /** - * Schedules a call to hide() in [delay] milliseconds, canceling any - * previously scheduled calls. - */ - private void delayedHide(int delayMillis) { - mHideHandler.removeCallbacks(mHideRunnable); - mHideHandler.postDelayed(mHideRunnable, delayMillis); - } - - - //region OVERRIDES - private float yPosOnDown; - private float yDelta; - private boolean isSwiping; - @Override - public boolean dispatchTouchEvent(MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - yPosOnDown = event.getY(); - isSwiping = false; - break; - case MotionEvent.ACTION_UP: - if (isSwiping) { - toggle(yDelta); - } - break; - case MotionEvent.ACTION_MOVE: - float yPosCurr = event.getY(); - yDelta = yPosCurr - yPosOnDown; - if (Math.abs(yDelta) > 120) { - isSwiping = true; - return true; - } - break; - } - return super.dispatchTouchEvent(event); - } - - @Override - public void onResume() { - super.onResume(); - getPreferences(); - setBackgroundToRandomColour(); - setTimer(); - } - - @Override - public void onPause() { - super.onPause(); - if (mediaPlayer != null) { - mediaPlayer.stop(); - mediaPlayer.release(); - mediaPlayer = null; - } - } - //endregion - - //region HELPERS - public void getPreferences() { - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); - saturationPercent = preferences.getInt("saturation", 30); - changeMode = preferences.getString("change_mode", "tap"); - } - - public void resetPreferences(Context context) { - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); - preferences.edit().clear().commit(); - PreferenceManager.setDefaultValues(context, R.xml.preferences, true); - Toast.makeText(getApplicationContext(), "Settings reset.", Toast.LENGTH_SHORT).show(); - } - - private void setBackgroundToRandomColour() { - float[] hsv = generateRandomColour(); - float[] hsvText = new float[] { 0, 0, hsv[1] / 2 + 0.25f }; - int randomColour = Color.HSVToColor(hsv); - int textColour = Color.HSVToColor(hsvText); - - mainView.setBackgroundColor(randomColour); - ((TextView)mContentView).setText(String.format("#%s", Integer.toHexString(randomColour).substring(2))); - ((TextView)mContentView).setTextColor(textColour); - } - - private float[] generateRandomColour() { - float phiRecip = Float.parseFloat(getResources().getText(R.string.phiRecip).toString()); - return new float[] { - (random.nextFloat() + phiRecip) % 1 * 360, // random, nicely-spaced hue - saturationPercent / 100f, // saturation - 1.0f // value - }; - } - - private void setTimer() { - if (timerTask != null) { - timerTask.cancel(); - } - - switch (changeMode) { - case "tap": - break; - case "cycle": - timerTask = new TimerTask() { - @Override - public void run() { - runOnUiThread(new Runnable() { - @Override - public void run() { - setBackgroundToRandomColour(); - } - }); - } - }; - timer.schedule(timerTask, 0, 1000); - break; - case "leekspin": - timerTask = new TimerTask() { - @Override - public void run() { - runOnUiThread(new Runnable() { - @Override - public void run() { - setBackgroundToRandomColour(); - } - }); - } - }; - timer.schedule(timerTask, 300, 550); - mediaPlayer = MediaPlayer.create(this, R.raw.ievan_polkka); - mediaPlayer.setLooping(true); - mediaPlayer.start(); - break; - case "nyan": - timerTask = new TimerTask() { - @Override - public void run() { - runOnUiThread(new Runnable() { - @Override - public void run() { - setBackgroundToRandomColour(); - } - }); - } - }; - timer.schedule(timerTask, 160, 420); - mediaPlayer = MediaPlayer.create(this, R.raw.nyan); - mediaPlayer.setLooping(true); - mediaPlayer.start(); - break; - } - } - //endregion - - //region ACTIVITIES - public void openSettings(View view) { - Intent intent = new Intent(this, SettingsActivity.class); - intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, SettingsActivity.PreferencesFragment.class.getName()); - intent.putExtra(SettingsActivity.EXTRA_NO_HEADERS, true); - startActivity(intent); - } - //endregion -} diff --git a/app/src/main/java/nonphatic/quoz/MainActivity.kt b/app/src/main/java/nonphatic/quoz/MainActivity.kt new file mode 100644 index 0000000..2797a52 --- /dev/null +++ b/app/src/main/java/nonphatic/quoz/MainActivity.kt @@ -0,0 +1,238 @@ +package nonphatic.quoz + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.media.AudioManager +import android.media.MediaPlayer +import android.net.Uri +import android.preference.PreferenceManager +import android.support.design.widget.FloatingActionButton +import android.support.v7.app.AppCompatActivity +import android.os.Bundle +import android.os.Handler +import android.preference.PreferenceActivity +import android.view.MotionEvent +import android.view.View +import android.widget.TextView +import android.widget.Toast + +import nonphatic.quoz.preferences.SettingsActivity + +import java.util.Random +import java.util.Timer +import java.util.TimerTask + +class MainActivity : AppCompatActivity() { + private val mHideHandler: Handler = Handler() + private val random: Random = Random() + private val mediaPlayer: MediaPlayer = MediaPlayer() + private var timer: Timer = Timer() + + private lateinit var mContentView: View + private lateinit var mFab: FloatingActionButton + private lateinit var mainView: View + + private val saturationPercent + get() = PreferenceManager.getDefaultSharedPreferences(this) + .getInt(getString(R.string.preferences_colour_key), + resources.getInteger(R.integer.preferences_colour_default)) + private val changeMode + get() = PreferenceManager.getDefaultSharedPreferences(this) + .getString(getString(R.string.preferences_mode_key), + getString(R.string.preferences_mode_default)) + + private val mHidePart2Runnable = Runnable { + // Delayed removal of status and navigation bar + + // Note that some of these constants are new as of API 16 (Jelly Bean) + // and API 19 (KitKat). It is safe to use them, as they are inlined + // at compile-time and do nothing on earlier devices. + mContentView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LOW_PROFILE + or View.SYSTEM_UI_FLAG_FULLSCREEN + or View.SYSTEM_UI_FLAG_LAYOUT_STABLE + or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) + } + private val mShowPart2Runnable = Runnable { + // Delayed display of UI elements + val actionBar = supportActionBar + actionBar?.show() + } + private val mHideRunnable = Runnable { hide() } + + + //region OVERRIDES + private var yPosOnDown: Float = 0f + private var yDelta: Float = 0f + private var isSwiping: Boolean = false + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContentView(R.layout.activity_main) + volumeControlStream = AudioManager.STREAM_MUSIC + + mContentView = findViewById(R.id.fullscreen_content) + mFab = findViewById(R.id.fab) + mainView = findViewById(R.id.main_layout) + + // Set up the user interaction to manually show or hide the system UI. + mContentView.setOnClickListener { + if (!isSwiping) { + setColour() + } + } + + mContentView.setOnLongClickListener { + val clipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clip = ClipData.newPlainText(getString(R.string.app_name), (mContentView as TextView).text) + clipboardManager.primaryClip = clip + + Toast.makeText(applicationContext, getString(R.string.toast_copied), Toast.LENGTH_SHORT).show() + true + } + } + + override fun onPostCreate(savedInstanceState: Bundle?) { + super.onPostCreate(savedInstanceState) + + // Trigger the initial hide() shortly after the activity has been + // created, to briefly hint to the user that UI controls + // are available. + mHideHandler.removeCallbacks(mHideRunnable) + mHideHandler.postDelayed(mHideRunnable, INIT_ANIMATION_DELAY) + } + + private fun show() { + // Show the system bar + mContentView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + mFab.show() + + // Schedule a runnable to display UI elements after a delay + mHideHandler.removeCallbacks(mHidePart2Runnable) + mHideHandler.postDelayed(mShowPart2Runnable, UI_ANIMATION_DELAY) + } + + private fun hide() { + // Hide UI first + supportActionBar?.hide() + mFab.hide() + + // Schedule a runnable to remove the status and navigation bar after a delay + mHideHandler.removeCallbacks(mShowPart2Runnable) + mHideHandler.postDelayed(mHidePart2Runnable, UI_ANIMATION_DELAY) + } + + override fun dispatchTouchEvent(event: MotionEvent): Boolean { + when (event.action) { + MotionEvent.ACTION_DOWN -> { + yPosOnDown = event.y + isSwiping = false + } + MotionEvent.ACTION_UP -> if (isSwiping) { + if (yDelta < 0) hide() else show() + } + MotionEvent.ACTION_MOVE -> { + val yPosCurr = event.y + yDelta = yPosCurr - yPosOnDown + if (Math.abs(yDelta) > SWIPE_MIN_DIST) { + isSwiping = true + return true + } + } + } + return super.dispatchTouchEvent(event) + } + + public override fun onResume() { + super.onResume() + setColour() + setLoop() + } + + public override fun onPause() { + super.onPause() + mediaPlayer.stop() + mediaPlayer.reset() + timer.cancel() + } + //endregion + + + //region HELPERS + private fun setColour(hsv: FloatArray = generateRandomColour()) { + val textHSV = floatArrayOf(0f, 0f, hsv[1] / 2 + 0.25f) + val backgroundColour = Color.HSVToColor(hsv) + val textColour = Color.HSVToColor(textHSV) + + mainView.setBackgroundColor(backgroundColour) + (mContentView as TextView).text = "#${Integer.toHexString(backgroundColour and HEX_MASK)}" + (mContentView as TextView).setTextColor(textColour) + } + + private fun generateRandomColour(): FloatArray = floatArrayOf( + (random.nextFloat() + PHI_RECIP) % 1 * 360, // random, nicely-spaced hue + saturationPercent / 100f, // saturation + 1f // value + ) + + private fun scheduleTimer(delay: Long, period: Long) { + timer = Timer().apply { + schedule(object : TimerTask() { + override fun run() { + runOnUiThread { + setColour() + } + } + }, delay, period) + } + } + + private fun playMedia(resId: Int) { + mediaPlayer.setDataSource(this, Uri.parse("android.resource://$packageName/$resId")) + mediaPlayer.prepare() + mediaPlayer.isLooping = true + mediaPlayer.start() + } + + private fun setLoop() { + when (changeMode) { + "tap" -> {} + "cycle" -> { + scheduleTimer(0, 1000) + } + "leekspin" -> { + scheduleTimer(300, 550) + playMedia(R.raw.ievan_polkka) + } + "nyan" -> { + scheduleTimer(160, 423) + playMedia(R.raw.nyan) + } + } + } + //endregion + + + //region ACTIVITIES + fun openSettings(view: View) { + val intent = Intent(this, SettingsActivity::class.java) + intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, SettingsActivity.PreferencesFragment::class.java.name) + intent.putExtra(PreferenceActivity.EXTRA_NO_HEADERS, true) + startActivity(intent) + } + //endregion + + + companion object { + private const val UI_ANIMATION_DELAY = 300L + private const val INIT_ANIMATION_DELAY = 100L + private const val SWIPE_MIN_DIST = 120 + private const val HEX_MASK = 0xFFFFFF + private const val PHI_RECIP = 0.6180339f + } +} diff --git a/app/src/main/java/nonphatic/quoz/preferences/AboutDialogPreference.java b/app/src/main/java/nonphatic/quoz/preferences/AboutDialogPreference.java deleted file mode 100644 index 751a51e..0000000 --- a/app/src/main/java/nonphatic/quoz/preferences/AboutDialogPreference.java +++ /dev/null @@ -1,57 +0,0 @@ -package nonphatic.quoz.preferences; - -import android.app.AlertDialog; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.preference.DialogPreference; -import android.util.AttributeSet; -import android.view.View; -import android.widget.ImageView; - -import nonphatic.quoz.R; - -/** - * Created by Jonathan on 2016-08-07. - */ -public class AboutDialogPreference extends DialogPreference { - public AboutDialogPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - public AboutDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public AboutDialogPreference(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public AboutDialogPreference(Context context) { - super(context); - } - - @Override - protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { - super.onPrepareDialogBuilder(builder); - builder.setNegativeButton(null, null); - builder.setPositiveButton(null, null); - builder.setTitle(null); - } - - @Override - protected void onBindDialogView(View view) { - super.onBindDialogView(view); - - ImageView nonphaticLogo = (ImageView)view.findViewById(R.id.nonphatic_logo); - nonphaticLogo.setOnLongClickListener(new View.OnLongClickListener() { - public boolean onLongClick(View view) { - Intent intent = new Intent(Intent.ACTION_VIEW); - //intent.setData(Uri.parse("market://search?q=pub:nonphatic")); - intent.setData(Uri.parse("https://github.com/nonphatic")); - getContext().startActivity(intent); - return true; - } - }); - } -} diff --git a/app/src/main/java/nonphatic/quoz/preferences/AboutDialogPreference.kt b/app/src/main/java/nonphatic/quoz/preferences/AboutDialogPreference.kt new file mode 100644 index 0000000..adcedd2 --- /dev/null +++ b/app/src/main/java/nonphatic/quoz/preferences/AboutDialogPreference.kt @@ -0,0 +1,44 @@ +package nonphatic.quoz.preferences + +import android.app.AlertDialog +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.preference.DialogPreference +import android.util.AttributeSet +import android.view.View +import android.widget.ImageView + +import nonphatic.quoz.R + +/** + * Created by Jonathan on 2016-08-07. + */ +class AboutDialogPreference : DialogPreference { + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {} + + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {} + + constructor(context: Context) : super(context) {} + + override fun onPrepareDialogBuilder(builder: AlertDialog.Builder) { + super.onPrepareDialogBuilder(builder) + builder.setNegativeButton(null, null) + builder.setPositiveButton(null, null) + builder.setTitle(null) + } + + override fun onBindDialogView(view: View) { + super.onBindDialogView(view) + + val nonphaticLogo = view.findViewById(R.id.nonphatic_logo) + nonphaticLogo.setOnLongClickListener { + val intent = Intent(Intent.ACTION_VIEW) + intent.data = Uri.parse("https://github.com/nonphatic") + context.startActivity(intent) + true + } + } +} diff --git a/app/src/main/java/nonphatic/quoz/preferences/AppCompatPreferenceActivity.java b/app/src/main/java/nonphatic/quoz/preferences/AppCompatPreferenceActivity.java deleted file mode 100644 index 95c583a..0000000 --- a/app/src/main/java/nonphatic/quoz/preferences/AppCompatPreferenceActivity.java +++ /dev/null @@ -1,109 +0,0 @@ -package nonphatic.quoz.preferences; - -import android.content.res.Configuration; -import android.os.Bundle; -import android.preference.PreferenceActivity; -import android.support.annotation.LayoutRes; -import android.support.annotation.Nullable; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatDelegate; -import android.support.v7.widget.Toolbar; -import android.view.MenuInflater; -import android.view.View; -import android.view.ViewGroup; - -/** - * A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls - * to be used with AppCompat. - */ -public abstract class AppCompatPreferenceActivity extends PreferenceActivity { - - private AppCompatDelegate mDelegate; - - @Override - protected void onCreate(Bundle savedInstanceState) { - getDelegate().installViewFactory(); - getDelegate().onCreate(savedInstanceState); - super.onCreate(savedInstanceState); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - getDelegate().onPostCreate(savedInstanceState); - } - - public ActionBar getSupportActionBar() { - return getDelegate().getSupportActionBar(); - } - - public void setSupportActionBar(@Nullable Toolbar toolbar) { - getDelegate().setSupportActionBar(toolbar); - } - - @Override - public MenuInflater getMenuInflater() { - return getDelegate().getMenuInflater(); - } - - @Override - public void setContentView(@LayoutRes int layoutResID) { - getDelegate().setContentView(layoutResID); - } - - @Override - public void setContentView(View view) { - getDelegate().setContentView(view); - } - - @Override - public void setContentView(View view, ViewGroup.LayoutParams params) { - getDelegate().setContentView(view, params); - } - - @Override - public void addContentView(View view, ViewGroup.LayoutParams params) { - getDelegate().addContentView(view, params); - } - - @Override - protected void onPostResume() { - super.onPostResume(); - getDelegate().onPostResume(); - } - - @Override - protected void onTitleChanged(CharSequence title, int color) { - super.onTitleChanged(title, color); - getDelegate().setTitle(title); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - getDelegate().onConfigurationChanged(newConfig); - } - - @Override - protected void onStop() { - super.onStop(); - getDelegate().onStop(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - getDelegate().onDestroy(); - } - - public void invalidateOptionsMenu() { - getDelegate().invalidateOptionsMenu(); - } - - private AppCompatDelegate getDelegate() { - if (mDelegate == null) { - mDelegate = AppCompatDelegate.create(this, null); - } - return mDelegate; - } -} diff --git a/app/src/main/java/nonphatic/quoz/preferences/AppCompatPreferenceActivity.kt b/app/src/main/java/nonphatic/quoz/preferences/AppCompatPreferenceActivity.kt new file mode 100644 index 0000000..a1cd91d --- /dev/null +++ b/app/src/main/java/nonphatic/quoz/preferences/AppCompatPreferenceActivity.kt @@ -0,0 +1,96 @@ +package nonphatic.quoz.preferences + +import android.content.res.Configuration +import android.os.Bundle +import android.preference.PreferenceActivity +import android.support.annotation.LayoutRes +import android.support.v7.app.ActionBar +import android.support.v7.app.AppCompatDelegate +import android.support.v7.widget.Toolbar +import android.view.MenuInflater +import android.view.View +import android.view.ViewGroup + +/** + * A [android.preference.PreferenceActivity] which implements and proxies the necessary calls + * to be used with AppCompat. + */ +abstract class AppCompatPreferenceActivity : PreferenceActivity() { + + private var mDelegate: AppCompatDelegate? = null + + val supportActionBar: ActionBar? + get() = delegate?.supportActionBar + + private val delegate: AppCompatDelegate? + get() { + if (mDelegate == null) { + mDelegate = AppCompatDelegate.create(this, null) + } + return mDelegate + } + + override fun onCreate(savedInstanceState: Bundle?) { + delegate?.installViewFactory() + delegate?.onCreate(savedInstanceState) + super.onCreate(savedInstanceState) + } + + override fun onPostCreate(savedInstanceState: Bundle?) { + super.onPostCreate(savedInstanceState) + delegate?.onPostCreate(savedInstanceState) + } + + fun setSupportActionBar(toolbar: Toolbar?) { + delegate?.setSupportActionBar(toolbar) + } + + override fun getMenuInflater(): MenuInflater? { + return delegate?.menuInflater + } + + override fun setContentView(@LayoutRes layoutResID: Int) { + delegate?.setContentView(layoutResID) + } + + override fun setContentView(view: View) { + delegate?.setContentView(view) + } + + override fun setContentView(view: View, params: ViewGroup.LayoutParams) { + delegate?.setContentView(view, params) + } + + override fun addContentView(view: View, params: ViewGroup.LayoutParams) { + delegate?.addContentView(view, params) + } + + override fun onPostResume() { + super.onPostResume() + delegate?.onPostResume() + } + + override fun onTitleChanged(title: CharSequence, color: Int) { + super.onTitleChanged(title, color) + delegate?.setTitle(title) + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + delegate?.onConfigurationChanged(newConfig) + } + + override fun onStop() { + super.onStop() + delegate?.onStop() + } + + override fun onDestroy() { + super.onDestroy() + delegate?.onDestroy() + } + + override fun invalidateOptionsMenu() { + delegate?.invalidateOptionsMenu() + } +} diff --git a/app/src/main/java/nonphatic/quoz/preferences/SettingsActivity.java b/app/src/main/java/nonphatic/quoz/preferences/SettingsActivity.java deleted file mode 100644 index 9dac628..0000000 --- a/app/src/main/java/nonphatic/quoz/preferences/SettingsActivity.java +++ /dev/null @@ -1,189 +0,0 @@ -package nonphatic.quoz.preferences; - - -import android.annotation.TargetApi; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.res.Configuration; -import android.media.AudioManager; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.preference.DialogPreference; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.PreferenceActivity; -import android.support.v7.app.ActionBar; -import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; -import android.view.MenuItem; -import android.widget.Toast; - -import nonphatic.quoz.R; - -/** - * A {@link PreferenceActivity} that presents a set of application settings. On - * handset devices, settings are presented as a single list. On tablets, - * settings are split by category, with category headers shown to the left of - * the list of settings. - *

- * See - * Android Design: Settings for design guidelines and the Settings - * API Guide for more information on developing a Settings UI. - */ -public class SettingsActivity extends AppCompatPreferenceActivity { - /** - * A preference value change listener that updates the preference's summary - * to reflect its new value. - */ - private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object value) { - String stringValue = value.toString(); - - if (preference instanceof ListPreference) { - // For list preferences, look up the correct display value in - // the preference's 'entries' list. - ListPreference listPreference = (ListPreference) preference; - int index = listPreference.findIndexOfValue(stringValue); - - // Set the summary to reflect the new value. - preference.setSummary( - index >= 0 - ? listPreference.getEntries()[index] - : null); - - } else { - // For all other preferences, set the summary to the value's - // simple string representation. - preference.setSummary(stringValue); - } - return true; - } - }; - - /** - * Helper method to determine if the device has an extra-large screen. For - * example, 10" tablets are extra-large. - */ - private static boolean isXLargeTablet(Context context) { - return (context.getResources().getConfiguration().screenLayout - & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; - } - - /** - * Binds a preference's summary to its value. More specifically, when the - * preference's value is changed, its summary (line of text below the - * preference title) is updated to reflect the value. The summary is also - * immediately updated upon calling this method. The exact display format is - * dependent on the type of preference. - * - * @see #sBindPreferenceSummaryToValueListener - */ - private static void bindPreferenceSummaryToValue(Preference preference) { - // Set the listener to watch for value changes. - preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); - - // Trigger the listener immediately with the preference's - // current value. - try { - sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, - PreferenceManager - .getDefaultSharedPreferences(preference.getContext()) - .getString(preference.getKey(), "")); - } - catch (ClassCastException e) { - sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, - PreferenceManager - .getDefaultSharedPreferences(preference.getContext()) - .getInt(preference.getKey(), 0)); - } - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setupActionBar(); - setVolumeControlStream(AudioManager.STREAM_MUSIC); - } - - /** - * Set up the {@link android.app.ActionBar}, if the API is available. - */ - private void setupActionBar() { - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - // Show the Up button in the action bar. - actionBar.setDisplayHomeAsUpEnabled(true); - } - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - int id = item.getItemId(); - if (id == android.R.id.home) { - onBackPressed(); - return true; - } - return super.onMenuItemSelected(featureId, item); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean onIsMultiPane() { - return isXLargeTablet(this); - } - - /** - * This method stops fragment injection in malicious applications. - * Make sure to deny any unknown fragments here. - */ - protected boolean isValidFragment(String fragmentName) { - return PreferenceFragment.class.getName().equals(fragmentName) - || PreferencesFragment.class.getName().equals(fragmentName); - } - - /** - * This fragment shows colour type and change mode preferences. - */ - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - public static class PreferencesFragment extends PreferenceFragment { - @Override - public void onCreate(final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.preferences); - setHasOptionsMenu(true); - - Preference resetButton = findPreference("reset_button"); - resetButton.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); - preferences.edit().clear().commit(); - PreferenceManager.setDefaultValues(getActivity().getApplicationContext(), R.xml.preferences, true); - onStop(); - onCreate(savedInstanceState); - Toast.makeText(getActivity().getApplicationContext(), "Settings reset.", Toast.LENGTH_SHORT).show(); - return true; - } - }); - - bindPreferenceSummaryToValue(findPreference("change_mode")); - bindPreferenceSummaryToValue(findPreference("saturation")); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int id = item.getItemId(); - if (id == android.R.id.home) { - startActivity(new Intent(getActivity(), SettingsActivity.class)); - return true; - } - return super.onOptionsItemSelected(item); - } - } -} diff --git a/app/src/main/java/nonphatic/quoz/preferences/SettingsActivity.kt b/app/src/main/java/nonphatic/quoz/preferences/SettingsActivity.kt new file mode 100644 index 0000000..67f42f5 --- /dev/null +++ b/app/src/main/java/nonphatic/quoz/preferences/SettingsActivity.kt @@ -0,0 +1,174 @@ +package nonphatic.quoz.preferences + + +import android.annotation.TargetApi +import android.content.Context +import android.content.Intent +import android.content.SharedPreferences +import android.content.res.Configuration +import android.media.AudioManager +import android.os.Build +import android.os.Bundle +import android.preference.ListPreference +import android.preference.Preference +import android.preference.PreferenceActivity +import android.support.v7.app.ActionBar +import android.preference.PreferenceFragment +import android.preference.PreferenceManager +import android.view.MenuItem +import android.widget.Toast + +import nonphatic.quoz.R + +/** + * A [PreferenceActivity] that presents a set of application settings. On + * handset devices, settings are presented as a single list. On tablets, + * settings are split by category, with category headers shown to the left of + * the list of settings. + * + * + * See [ + * Android Design: Settings](http://developer.android.com/design/patterns/settings.html) for design guidelines and the [Settings + * API Guide](http://developer.android.com/guide/topics/ui/settings.html) for more information on developing a Settings UI. + */ +class SettingsActivity : AppCompatPreferenceActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setupActionBar() + volumeControlStream = AudioManager.STREAM_MUSIC + } + + /** + * Set up the [android.app.ActionBar], if the API is available. + */ + private fun setupActionBar() { + val actionBar = supportActionBar + actionBar?.setDisplayHomeAsUpEnabled(true) + } + + override fun onMenuItemSelected(featureId: Int, item: MenuItem): Boolean { + val id = item.itemId + if (id == android.R.id.home) { + onBackPressed() + return true + } + return super.onMenuItemSelected(featureId, item) + } + + /** + * {@inheritDoc} + */ + override fun onIsMultiPane(): Boolean { + return isXLargeTablet(this) + } + + /** + * This method stops fragment injection in malicious applications. + * Make sure to deny any unknown fragments here. + */ + override fun isValidFragment(fragmentName: String): Boolean { + return PreferenceFragment::class.java.name == fragmentName || PreferencesFragment::class.java.name == fragmentName + } + + /** + * This fragment shows colour type and change mode preferences. + */ + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + class PreferencesFragment : PreferenceFragment() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + addPreferencesFromResource(R.xml.preferences) + setHasOptionsMenu(true) + + val resetButton = findPreference(getString(R.string.preferences_reset_key)) + resetButton.onPreferenceClickListener = Preference.OnPreferenceClickListener { + val preferences = PreferenceManager.getDefaultSharedPreferences(activity.applicationContext) + preferences.edit().clear().commit() + PreferenceManager.setDefaultValues(activity.applicationContext, R.xml.preferences, true) + onStop() + onCreate(savedInstanceState) + Toast.makeText(activity.applicationContext, getString(R.string.toast_reset), Toast.LENGTH_SHORT).show() + true + } + + bindPreferenceSummaryToValue(findPreference(getString(R.string.preferences_mode_key))) + bindPreferenceSummaryToValue(findPreference(getString(R.string.preferences_colour_key))) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + val id = item.itemId + if (id == android.R.id.home) { + startActivity(Intent(activity, SettingsActivity::class.java)) + return true + } + return super.onOptionsItemSelected(item) + } + } + + companion object { + /** + * A preference value change listener that updates the preference's summary + * to reflect its new value. + */ + private val sBindPreferenceSummaryToValueListener = Preference.OnPreferenceChangeListener { preference, value -> + val stringValue = value.toString() + + if (preference is ListPreference) { + // For list preferences, look up the correct display value in + // the preference's 'entries' list. + val index = preference.findIndexOfValue(stringValue) + + // Set the summary to reflect the new value. + preference.setSummary( + if (index >= 0) + preference.entries[index] + else + null) + + } else { + // For all other preferences, set the summary to the value's + // simple string representation. + preference.summary = stringValue + } + true + } + + /** + * Helper method to determine if the device has an extra-large screen. For + * example, 10" tablets are extra-large. + */ + private fun isXLargeTablet(context: Context): Boolean { + return context.resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK >= Configuration.SCREENLAYOUT_SIZE_XLARGE + } + + /** + * Binds a preference's summary to its value. More specifically, when the + * preference's value is changed, its summary (line of text below the + * preference title) is updated to reflect the value. The summary is also + * immediately updated upon calling this method. The exact display format is + * dependent on the type of preference. + * + * @see .sBindPreferenceSummaryToValueListener + */ + private fun bindPreferenceSummaryToValue(preference: Preference) { + // Set the listener to watch for value changes. + preference.onPreferenceChangeListener = sBindPreferenceSummaryToValueListener + + // Trigger the listener immediately with the preference's + // current value. + try { + sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, + PreferenceManager + .getDefaultSharedPreferences(preference.context) + .getString(preference.key, "")) + } catch (e: ClassCastException) { + sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, + PreferenceManager + .getDefaultSharedPreferences(preference.context) + .getInt(preference.key, 0)) + } + + } + } +} diff --git a/app/src/main/res/drawable-v21/nonphatic_colour_light.png b/app/src/main/res/drawable-v21/nonphatic_colour_light.png deleted file mode 100644 index 06cfbb198babed7c19cf4076b2251cf4addcb253..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51985 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%0D)2Hh^K?$de0uRv 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 S`SAkuohKcf?W>Pny8ge@yHsfa diff --git a/app/src/main/res/drawable/nonphatic.png b/app/src/main/res/drawable/nonphatic.png new file mode 100644 index 0000000000000000000000000000000000000000..f9cbd034f9a789759913fd321376963e7279c797 GIT binary patch literal 23294 zcmdtKbyQXF_Ak6Z5kwFWkdj70Qd*>23=jbUDG3QFK~id~bPFmp9p{X3$9wM`Z~SqNeD~gKt>>A~%+LJH6?REeot%`B6vHrbjk7A3 zF>GHZ`X9*w_~gdMjS%?f;LWp!w=nF88~Pu?h&8JhhLLL7DJx&PWb5qae9PAPCYy$` zGTTj8XKOo$>lo(sHATlpS7+|1?E1)0rSqY<2j`tH(~_`VR*JyU+&{s~evtB9D0{{i zTJ3jKs;c{$TGK=KMMvWzX|?&u!bt~+C)qQj?`4ICfA~A*lV$(8YJIwW=WV~-%$v28 zqE6yE60%2UMYY9oWG|IisJ`86X>1;w6jZoF%5@W?Bq_3DzqQRtfNl88$nbI05!YY@ zUcHA%u)2#$b*GMn>{5JJdSXm~3nZv>yMOvT362I+xE-zZ98*vuz@db2wHZHGVpGF$7vzSWF#-4QXl zqrQLRTm8qM7oHvKj5`=;F*F^czEyf?cZ<1~qfx`6+<=#6Li>nIv`S*+n#ePbFr~PY zO~-q7t;R?B|L&6;702>#$PxJ57kFV}x$pORZb}2Uy76@kTdj0{_lbvOAI|pPSf}Ui zvi!Ds`f&_rtr6#fVWuivg1R4ylXzQ9ppb}SO zy%MDosTJ;+>$Q__?ke#Fx92nSUK9GHz${j$Z5tea^RQsOUfE&Un-rVoB&qLss_q=z zuh>dLZO;BRl)xg~fHRte?n%%F`@6IIk3?{>y$_|)<~V;}{H*Zha9uXNv&^fqu7pw{ z#%dM!rCTwPyIa9k>cS816l%+UB73V`{z8&5P%ZONmzA4vV$9L>q%PNDM%hS-jG3<2 zwiI7uiqi#9r(5^QczDmcx5Fy6AQfa49>>t@FMD{uByhW)baEb!cav6iwImiDpN$e~mXZ-uGR`!L&QV;mq z_*#P|QzjcGMJJgi*;kE7Q!Er*o^I%j^IZOL;~c{j<&@aef$NV&6!o$aFAu-S(4`WO zxvG?tQF1v?JLCnmn0umB`@N$Y=bzC!iGuboz8<`l zkGGjCBV=E_%#czRJtwMPbb0N8wLI~}W0#F&H_d}HJlP3r{^27u%O}TAGCdc&P%eDk z*#6a{ghvLi&%V}vtv+8Zk-M0k^1NEL((vz{!-_5ExQ)5hZDKlzQf73%=nQ9*W*@yM zd*)ZJ;4AxQOc|9bp0!TdOOI1)OmV3foU=!~t7kTk`3Y_7ZaZ#f|57J2I8a2!bzqRJ zgI=ad+{IajS*T@jMO)dVK|%SM`9t%BvB3M~-7;ByYEfzwk#^0-6I>IH&5q4kCk~uo zKXLxz_lrx3moJt-Klxnxg7k%!_K)qE?Vq2BC&>!;i_9d=B=skamR`H+b(O#5MM>Fp zjl#*R&kdJKs+@wZN*O*g(7S3FLbv3jqf771omOqsC@Ra@N8-Fcj ztvfbvXE=o{h3@O;^yim8^L({#zDy_gTh29YLT*Avaztdr(CnjRU1@7+n^uE!s#(ye zascP9)$Z-xZY&#joWN#Z*d4_?MudMiZu_#=M$4ZWy#BlJ%c5drdbuL4V$9u~yHoFS z*lk-EVsqHnXC8Ol@31=@bjg4Aa~HAsw0T5>KN)vWNRWQ8eDuvw1IBLQ1aZ&qA>~`6 zDw`^gR7R3)gtesd1kQ=`%Doc2A@fzTLaai*SW1m5afri8RV^V^=xe`teHKSXL zYa!z)y7v6=Hcv{NBDO_6?Dt0BMQR^I6@i zJpH`Hg*Mmqt!vxEK1e-!oyym~__652V60^Fa@y|Vk@_QJaV5`!&+7{?8%$Tfxgk|3 z5)za`OOdY zFPdl>2pNvPHQx+QVUnW_3(ut)q)VU;7~mQ5nqmrZ{!sg5=t1$z*Nx>?oz^|pbJHUN zsYZt%y-Ju)IP66JB+j8$~2K5N^F7{dXUH_}`w`g5HH|*8i#-qQE zCOMjpE{iSudiHG-a~>|~FaOlX+#{=dIp#Cpy!zo5)|#D^WlsTe339!t2~#7AM5owrc}v};h)vs zD@S)f_oYh74p*<;c3y8<|22Aa*x!|VyQ8i0izoL|PL)=b*-wQ<#V^XkA${^jJ3|A@ zLjgDHJk!^@ht$^(1l{Z0x&JGMLYXM$NlaTXdGLJdX*nsWae3G6xvgyFPOHunsdPJ; zJ8ijiM}_=1`sVvPx*vCEB&;UH*E;$>+x}iR&yY9RT;I%6^WIBT*!1U>zl-lYhdh~= zvqmYjCVklgcy?|76#UZZ%KjVA5Ffw0f8XP^ElW{>LC81REYDuPh+(&nV;JrphW*)v zf9EjF{S=0MzlLFF9%C4tbDUX|8irjusiC5%>-BYE*z>VoP|EJg@~NPVvvg9N`>lg; z?BCS_8)rLJiVDc^z!_ekLUaC7W>_Y>wZOp}N-F%JINB)dix)BrPu#dmOSYwO z^FC4eS%#51SrAL(0aD{41G_z%l z?C;Rui-YQhhK3IwK2+7v(0K6Zk(!IkN=U#_wj|mdlS&E40~l^sC`D7<#Kh#&r%#Q~ zFD6+`eRx>lwKDEC5hZD{GTwAwbGLI&hxg%!R{_gh8t^R3mgw%vdD&ncV$1R8-cNh9_D%Ve%VYpHz3;`hQA zZ5rWvw4-~PKE)2k&f`+L}P z6gH5ejWo}ywxXh9V|jOH`LTrK)sHFC`d-sFA3S>Spz+68!$i{PmbKelPZJN)z(Vyi zDbedAK0;0vbI%Q`yb3lxHtBf1ib-&gfi|N=CG4 zg=v1%s?#SfJf@uQ&!bE8b%=eGkkA5mWKs?}997~t$cS!L*YP?pFDAkC_DQFjKhp*^ zzU7JoV?2u^)jp9-l7clqf`rQ4>Co?NUgzdUOD|W6rg~2^=*xdu9lEzcKasNBmUj#bsO?76bX_F3k)!US9=4fNZS$eul_znZy1KaB&Y6Z#Pn@H$E1& zlo=p_C&bQwpP!%jY~&mT64u1UQ7dk~&GQowteE9cBn5xds){VY*zZ>#;e%wd9%{|g z>>V;|A8m&#-YOym`~rvLE^Phr@rzflj$};w#-{pj&bjnxaD&N)?fs(Jv25~IY&5g9 zM6}H6SxfxsH^KQ)Qgdt4q))m>qLX;45ufR~JaPajUGamjU%!@(hx5shC)_3NNtN|! zZkHTA20AQ40vk$~s{S*b4Z}XatCm0`j_Usw{a* z31&w#NG|8G62V=?avt*OHxtnrQ??}tNgmiTiS$?=k#(wElqj9Q3mPeM985_oV6%5) zc-eo3m&f;9Y^qz2hOp~oD-SO({>j($9S2JUI^_N?8025OBYcfm_sW%KfzqKPe;0~k zgpoL;?ZE>H-~Ksk@b<<-;cMLB9gw!p=T-`yJ9mzZ5F|Q4r6seXvbCB}>&7Rz5DY%B z47OwWt?o`UvLWBN=H}*&F^T~CysFi3k|46Paa_@$&SeXQZJA|d1NcL))i*I=wn=fn z!hf~6l|I(|;lqb6EzF)OovE@>1n`W|P=f*sRnWArdY5dKG~ycb%^Sw0NB=}~qpjlV zf5U-;UKz71WjrCHKgG6GwWhf&O)CB3;X#b8R%ZKWF9%KHmrT_Ni^fo@6;MgWeI7Wz zOe|J?3H-L#Y(|I*PjM`l#(0-9Mbyefi~8#;xqskbaWb9_8pwA5@R5)yJYa3eBafWZY zJ;{cw6|K7~L)mhu%q8{JA=s6xnWd#=@~sXj6%NtWZZthU<9?&quD6+<(y5&Y zmmJk~t5a4#P$_z2-fWk#g*CvJ-ypw^o)X=^LnFJ_1>9=$Q2DJW0;v<=CdLA($A@lp ziXTw=M25vmQ{C=XrE6l{-B7nwINV}e>%TpoEx&E|;K2j>{m8$So);|VN)6cYR#sqn z@#ak=gQ&GirN?5V;=2__ZLF0FJjY9tAelmkFNLR98mTS&UgQU%;WZXS7kLMH!WLNm__GAla9!T(WUamQDW_d5E<6!wqDQ(uRlPADA#DGd zpNf=-GONg@Ga8Be%p#TGq&x*5A&&p8MN>Gv?CoNbAi`VU?hrSdcn(j6RiI0~9lsPF zulbeZ9CnH4(!K*^p>w_25Ko^7x1L9$;@5$w4IV!ct}LE zfq{|{Y~9m)eWmGTb}FO&=QqL!yc-(AF}6c*j7mG^mF{Rg7pN!XvUK}jN@6ES_FSm>X!lF6JwNiew8kvsM6Ok|S@+1#{3T{{l)ofUR zD;=OzPy^%R>5$*uI-6b1$BDkA@9XPx+5XjEd7Q5GMft6nW(xlw`;^fWV;DuPBT0x7 z8~O68j?`{V36Z0t->KzJ_2RgaYivi7uJQEpORw=T?(wHR-dA5sR-#VQj#+@i} znP@&e_cY#^oG8&aj>}~x#Zzs0q&iCRv#Tl%mUyT120`L^kkqp8jI_3ii6asU%_~S1 z_>T%)wIWG3wEP(<+7TKYd;sk|y-QbLzXg=!I!XE$0mDMB<``CI6bNV%m;IJ~oZb^% z{aEF_Hhy27MR-5#iL~i1(IJbuo@c?>)eG>H%Hg&+iPayE8`%=E`FPl-z_I0DpZ53*E;1#Dd8|%^&twc2d^r8HhgDZ&s;W3@(n*V-Y(i0qGjD}1{{YQ`%- z`)YCsErCL?n1n<#xHpSGt5eO_vX5&NHn0;^&X-L@M;xR+L4WtCjs+ps8p)mJdpU5m zz~xJUWy?lSLJbY%KF(Xc^4mIY5CuN8wPh6-i-C&<7km2Z+Z(j1s;X(5>*uq3?`vjf zK|;sK$e5X%D|o}+KC7bQ%t*lQwn2rPUDfvQ!Gde=?hcf>WZj&iZcmYx9JxK8GvHji z9jO>`6V68@y`)4UTK2aA_cjqr%GA`AVApx;cWG^uzNzSs(@HoxdoH?aowP`F4+@dF#)bpB!D+%&*D!@mYn1 zJ;=~okJFjBX;=NIKNQ?Lv2hGs0J;fekJ)$sIFII=E8`z*SY)m0=$Lb=-Ll$eJsMoH zOrC!}3PV*TkUX4TEbdKyI%AIW|Ml7|3etj86&{OMfB1k4J#Ol|()3uy+ZEi>hHs~G zcIxdLzRNzNqDV1a-_3SsSuPEg2e-y=@CymWAgc`~V;Cn8OuN<)OfKxV`O|B2E}O_M z)o*9ibJVXpOPvB)09#TyW1>9wH;693`psBneSV9z9=_q=5a~JM&5aU7`~KWt?y&r|~W{RV=~AR%A&-16zf*`e|xMUMtzR$t1}VGpCKpFQXA zinY|90GnbBVfJ{8SKTOM^7h5}MLECC#+ZODOM*o6w{PEqM}PBJ-2PEs)Uln-jbC{I zDWcA*fgqE+<2P)bQm=U~eie5rpE{a%&)&k_-F@Xp14YZvxn3f>!;IoLbd5nSc!QBJ zto8Rx25+dDf9ou$tg+AH+m$JyfG_mzFKTM!AT1jswTsq><6`mO7@O_NxQAbn0IVp7 z`a5Tgj0no}N*PPiLGvC%*g+|K>~!co3c1t%f7;9#@1B^D7Qq$*qnIR{!5r;Fk9Czg zk3JT;9==Y{P6*m8Y+fITRJKj9lK=9{2W;)G%Qb(Ukk`DuzT`-j7zjy2K6P&8QpICg zpAz;$18`uUwAGtb=}c&HuD%sHd-Q7lwRa(k=YD_h&oh(RoXrYO*VtGh!=!DY4sv?m z?h2{RO5Hw+#wI#5ex;&;x;y(Oz!D;%K$M8%5< zXmo2@a-yJxB?5Gefr}W5$R>2$aL6`L`L(ebqV)WszNsB@e#H+U>4KUik-bn%sdl}3 zxhcl~XBLm3pv2kex#3FBt?&A^;o#;v`nvgx!MCCGkG=JD9t14r9|^Tv$2(-#jg_sQ zKn+<20?5?K)@*LwcWb623dPAKnb!KeB5?KflvWRrK=%1>O|UYtw~?{PoM!Q!q@qex z2hBYaBfsOdP`kU++{z&?E{;#T2qBcU+ckyLLK$co%733rBiVQLJtS41cmxE*&!*b- zKEF5w&d6o;J$I#^uA)x4!F{@`#@gE2#!w#$`)_#( zCmsi1HUR+=@8%O5pag-`Dr=;HZS!ozn~X4HnIj45_b@h%Ud>h0VyH zLe`hqkQcCRudiIhrNn(Pkp{2qq!*x&#fzL^-vRoppd7PWxz9O9Hb}r?Z+(`^TSyEk zGho3HJKKMmvJ~Dr4WF^@NM=A68@U@@g7`3>S380~$aBlp>!we8N2cC9<8<5nIaknc z>cfy#M@vW7vRFFG0yP_LmVhl3y(p%m2%G+L$gTIHQ=8)$N%ii|U&~I}b+H4i6{{ck zCK{==XtD&j;JD#ZC;V!HAlSD+dP~-QmueHV3;DdLcj}NZpV5?>q7nY8H2v`jH5eY= z%AU(YexDm$axHMgZ+#e_to#T=S;6Vut+giGLua2|{_ltN-h!9 zmYctcGJ6iWK#fE%{FM;uN^4H!h2kX~1}MQ31l!&rVU~0i3)C5+;7vZbV?%Y!-sPe!5mpTzsz>U)uNA`R7-k)QF7P{m9q=ckTZ75 ztVOaXg2Qov1B6HvCfxc0W%i=)!c<1@G=>%bFNAS8piXR_N;p)`YxN#a7J#C`Cw1BKTk@HfnY(8mbK zSunmj!|UbMPu?>rbl_|xRj83hjYkMEBJ-F24qj?yv+INeRH6uKVYhYBd49n~uQ=>N zl0-YIhzGPGzLioXb^*kIDz;!Yz6X0Xb)zjca?g;mpcDUA^r^3}>FZm2@@|zluCTP- zt(jo9*9cKMEVpq@*$T-Vz?)qOBp|sq@c8p3Lnp+nT4QHF=OnSWp3yh+bN{(CJV?nP zaclYl(&KMMD0@@01%w*KH(y!*SqcBgM%IjIf~Y~}`!)codro~NFeGIHg3nFOqziu!mS>h?3= zd6Z*|Kw)U^5mQL096*5z9oUA?oZFeBLZ%L(WYUwd$^e1Fl8YhHFXv4pfR&Uue6hf< z|GsW#w3XP$Ph8nJgs1UA%yk zM4BVvG&HNI%J4g7*|&vc@>!cu?GOn=s5U%?rmA%0b{h%91Fo<^y7xu^jjaBuPBQiX za~;1E2<&1?2gr||J{2ATn>FPX5Qu_YWPq}A?1@dPFfy^Dg2uLiWEJ1;9*R^jt%S_e zgm#!5iU~>h5?6o4$OyK1E{;oXy}Xm*ZWXxDQe@eUPEev>V7aPgDvtn04^b{bRfm!tDRap8(8kg#q!FGnwk-GY^41N8sN0*+WjNH z+d@JU*pVV#DeEZ-R>c5ns4#XLbT%@UT_a8{%}npn2fzzm^1#2H;#2zcN{>)%47dQojc*qZAaO;)>`GTgpWBEV{M%RVan1L|W&S zPl`1)HFaleu_`YRE*}r4Buc-A@G!O3bObEkxqAzeUM6$8Hzt*z@oVmdqRTmu416+F zIpm7(q~Lrb^ABCgGj&9|5o8BZRIN33b=B4Rx}xF@a4`L0q^QhTcnnF=+3eon*4R8q z&Oscsw5To$V)y9z@Q^PG@SgM^pFV%SZQ*plZ;H=Mn2^XGkVmxv4O33EEH=O&nn)Nv zl{%YoUdo3A$09IA*UZcr|J0Vgu8%iHYpSVu3`VqQ(9>dTcYfumwX$h_d=?8yAA>oa zn3xzne(#Wq?pWZraPIthaz({Kz<8qasUacx$F3F3S3V0onaVNZaYNYzl}B8E7zdmt z&q&4bqM=8Js6f+1>NTOB*%S3xj*&>4@>MnjIjRi=EjOW~r-!5qqzEB<|Gz3^C`&BVU2vNP}bflfGx?={PU_0Huw}j|Wh9Z;SZkO6h>N z0oBIU0a~akP>jIUulyc#W@5hw_ld-)gl~RR;9Lmod#%reS0JzXoYF{m%*5?q->>gy z2QlJeO0Tya<+Qpq|2ZcLqe4{-TmVoeBVIJN4h~{U&$W(Sm2$_0hRUuF^^!=xvsa-4 zTZ@D^uhmYJ7|4Bgd28JgnO`6RIS6czFrRTdMTq>+i^N1mPV6E=lS!oCw;e}6+E2kt zn0U^`rGUyq2?7ED2gvwa1MpVXCC1&&GW52$N|Oe(QqiEuI*JN+Vk~^NTAnn!!CU1OSb5;ptoZezbQS3DJNaq}by1nyv`|RpYAq2L@)%RTbg^ zQ+Nos`@39=KZrl9nOIG&RSawdd6}D;B>8-h`wqJl96~3C7E=4?y>yo@s7F-(AyBcs z&%9%5pCgD1PF7}HFBJ6Yn`OCUt{uNg#V1e@s3clQD$~JrBQskyf)W=bAsn#d%einj zF760=R;x48DJ-$^bzaSlK$CCbJZPOW<{Sz-&=rWF@=yfp-+P+la77=9LUUh#KNzq3 zY}Y&dUE%A&NX#mEopRXS@oO=1fw-+{@k|AsfhzAJDi3XN`g_-lLxdw}Ed$|ql2o?R zA_Ml$%gA^K_Y?rQ3O;KHhtr*urJx~5tY>nrG7mJ-g{X{__)j~ncKS(vej@zu9+Ea;}m=%(8MMu^utq2g+9H+MJ`PCVqzbn=i@h7aFx%biR~xtputf;kBbJ}#zx#KT$y^eU`|H=Q z2k+f#pvJGVKg3!A6573AaXu0>`Ti@T@?}-k5IQJG!PbXv#ZYR=&}f=YKtL_yLy&G$ucz zY#H0&hnxg5Y{yWtAD;#APb8?_UUaUO6WfRP6?i#?LOsa9zOM#aA}DG=JMr18SG>^S zA-_+65GAB47_L(U@Z{1d>sC{r#q0RB`X)l|t|j~H0lNsBMx1T$^C*<1Vn6I4N-W;6 z4R!-K0vZ)49m8;1x1cOwVpp#D)9$>tg|z3-pPx9&Z*VP?OzLNs^4?Rl)&Nzl5Rg=c z6k%z&k_qLqSQ-~JS>PD#L&;7;BNgKFKc7!R4jc`TEdz%#bUR4!2llOZ=w<^sgais+ zC3K?MD3wLl&w=g~(HB?$5;04l@kS^$SMsoL3`4{puR zP!9R$;+dZFLhj4dRpRp&lg26f9&vUCC{Kj}Qle3$6aTsVaxWd}K6O|khEw=kL*UJs@XYV*e zLjfBVL6~mn2{Dfa1H9KzLzOU;9DB{og{!Y9iqNYB+#UfEattBH2rcJX@ zb%Yx8tpXLAbK7L~A08OkxL>=oPW&x1Gc#tZ;>C;B$5^|=$H&6ZC~#F4%YeQSs0K?#2BY^&$XD=*8?{0UFbO$8VQVjTSZ#E^= z{CtKQ|A;?u#%-1oP%!Pw<3^|Jc7JcJb+$B6$S*t^vc3uDjZAPdZ*y~Vpv2J#S{{Pa zooTE>)juzPOp}-InR6RSwcXkd(1#dHXX-U(srqIlj<2Qd`nrApbQ1Eu zMUQKVKj*0m`v8NamjCl!OT|_cRXPY}0UemE0Y?M5cQh^EmBu9J8iw6JX}b&nLoKP- zM+OX8LZn#%zQLCAQ`Bg!-D<0C)UR26xUn@O&&n+A;YLKue$EuiViRNNNk!AOPsW`W zTv65voTqe}GDH$R^U2l8T1aQc@dGaH`)-pm^7}bxt zsQg?Ulmx#mr1`}T?kz@Wm<_e3ru?>BORRMqmxk}6y%~aUTm7Nko=Q&@<;YUB`?1Ri4L9vL|k6x%j}mT z8-yGE9u3$7#fv~b0@bGC=*MXW+6pe1W-I9Tc&13PNoULR#$n{KC0^=5ny zE#40ydBWSDOKWIHH<~3g&nF17T-L5LTkq=moNF>Ko*@7}0E*RQuwI3=L4fSHcGhcS zpp#em-SC<=Bb7^=KxrdtLGLw7Cs3=0OGD*kmxF1*_Ah#Q|EdWsw1~6C_Wd15;k{A+ z2g;Zh0M-jPCL2zrh}&QJm?+K%E|oL-GzY@92JG{y;TBf^YW5xrxr%$80T&xO4CJ$? z0s`qZd0#yfsv^ZSt*9P2u108u0t7%W;a~tg1sN1zkFjwgI0o?<`pp7{S6&2_F+x6@ z_z^0v388>L=ZBzElIvU8rhUeHbrQ9{z%g>6=KAUHFS0Tru%50H`~o{phD-~ZEQFTD zl={kW&drc4cmcdLt}ef+4Gqc*zHtR?QK4nv044wfiv)DB1$x_52-!cJ-vI0z`9|Om zEDU_AuYnSy60Jf6A!{!ECZ0{;%VsdGcy&84!=?y2b-+j?8O3=~aJ#)F|04{cq=jvQ z5y#IzI<59LAADEk=yom~N8OS=G!5dlH$**nO@N{qz-+A~NYkIm?SgFqD!>Jx44uA-yB-;%SSz(>22Kx736LyC zFymZH-AA)fAshn~5h-MBfFhjx?=Lp$d8XClcMl1M2K+4zh=6*0Lg5bhtQdsrtN`0a z4QCC2@i_R!s4F>F8Sb4J6Fr1`lMgU&+4onk#~)iphiSy00Ph#2%@zasV{@|9E&Qi| z)v59afN5f&LOdB_SDKMH< zJyD`I@R*>CX@rcL3RONK%M=%!Am{amTos?6q)j<*caXlo?>b%sAq!;D@+DvO1bVefyD^XVmLi$fje4Z?FfG?bFr*i z>yTc7)S&UaP&Eycq!Udt5ilW8n~jE+7WK}9Y@rWOaHH?l25?jy$ObL~Rt2RIKnHfv zqeS7X#?QxLxI!FM7YPN0O0U0*r4v8}+y1eu?{I`_1v*-?6`sooZKp{@Y#wBs0KLW7 z=ax6KVJbl6fa+dFSy>qX1U1CBgD`_n+MuEJ#;|C*q16~DbHFGty;j)E%f~kXa45#(Z>tT+rBrYl+SzT0J>mp9&6cNh9y(%dOA8T zh6Ln7qFUlS$^vB>iasbXBYz0_5i1lOD?p`E0Y3nNLrqVwPkrZ0G`ZL_AXI@mY8x9n zKx>^Q9Fi4;#mTx*exrsxG`8O7lwXw<(TKC&^<42w^aaikclmKTkRu1=x*wm2T0;Lq z(*g5f$NZK9hb3=*t2;garU;U+ASLKq2LpM-4dH_Hm_o$Hpg=jBN(Kf8&grr~?DzV=K!GTj%?8*CY39)D zg3hs99x*)fG8BMAkm97qMt}sNYqsG9dHn#+o5VDnk-F zqr?sFX?ydR=mDutT5Zx1#0!Oef+_P_f{d6lB!}H}7D`9`n?XjogB9+t(PeV@4j%A1 z5y8dP1ae_i&=goSk?vgt&5bCa;4#9XlsiF|E^N_Al6MgQyzGlf({p981!8EGrA8mZ ztlpYd-)@3j01<7Q*@V1r2ogO5m!&DaSPXoLm%w$+M z`A~~uM9iSc2>IPVoh!glQ{{aq0>X2rx{b(bD5BxNMsz@MzI;jqxHme6h78a{@q|LR z510+DbVel(VZby~2U{^bt`Rreo2@kj6g$ZD-Hx%7dS`)lLaO3G1)6ITh%zFV=_fWw zMt`P3_kT$UURK^LRn$?m`<)T6j=!7Qp*!wBrTj2G9U$g9as-b=5iZxJ1 zCzHsTBpQL2JNw8OW3%UQ1N|2E-M9&i$>Xfz;AsqPQjRNqnW7E~4P9MbMTsY>bx=jA z9>ao4A@C7?Dk{hsLN+V6S`NtJBZ`1(aCHAFs~`^m3x5*|j8or@e!pl!nqa6R8io8< z4rw(Jv7eJ;g5ED8eNp<}a6siky5ha@SmncEa1T}JctKhwv&WJtd%w#Jz(N+#TOc@C zg4#hLUH=$1h=`_72`9T(rcpe;&#A74&PpLPE)S}lpvRKVsq7m+_Op!#u#mcdOq;&F zyO#xdZ#N==%d_*GJQ)@j7iSBmgQ~jC^<`F|jBJJ6zY3H`)D^}jz$l;BHZtPVByc^8 zSbC86xzPfQ{KpBd6LuL_;hwJ-JuLgP3(@ehw9@2Q%l#y{YuFPWsGwayo1_3Tt7f3V zLKZ8B0uLhFATAp4%BF5Hvz?DowMq51hVWajcZo8S<}O6bPhsA7Sbl&BFd!2^_=G@~zdj6o;7=f*POoC6_PP6Pkc@acK3!Os?8o5S=MK5YS8!^$jIM zh{okk82fIbcjxaiYrpZWsKJ|xp_fCaJ5re7OvP1LSiT`#zeQ>$nHr(at%A@Wj0W%v z9IdDYgl>c}aDXf2JWJp)v7rl{Q}9yp*<*KMPbh<<2-r~O?(=rLDfAD=rv}(_m77n@ z;clV8rV|0r&IA}pWC+Xc*8anFn#ZzG^)ET%WeMzD#QhF(`2Oi7a)Qc}@7`6zkbw(w z0}yNMV^4err9;tp{AaIL%;@%#r^}#Y>A}mm&eLiaAD?1BaQK)lSSC#c%J2a0Fb_Q@ zU*tL}P z-7)@?-%^PHb)Gu-d!qPV8lD#zGiu*M6ABUd@8KweVk#h0NnxA$ zM&J+51V0S``O)=Q{?EYCDg&Ox1X94ADh0)3Y0%DRKzvy=$p9qdv59KX13bNAvWvjK z4o9#u!Mb}ISYwv4$6Q<4LmG9oWND$Y^8<&bA4}-%?f_Y@VC~lG065ZZ92lc-1wcab zo82+Vlry1#H$4`!yNtTW^ir>&&yJ{8hmP`xqV}N9t2@aQU62gnnW6}c1%FW={RC|C zjX^;@rPR%Ic~n0Dz_PA0EdyPXI)srzmFJ?0$e0xOaLH#*kTZyI;rWvwdzc|@8nOx$TUlfv?-7{@W^y{E z^yt<9H3HCt3Yt_j0>OhZ!NlWG1w$i0cxG=dzUik<88<=vYtP0rZn^- z?1D)Z#0>{(;wQEsk1n2*s9tMA00JmHO_oB@F;CbJUimH-F93LD8F%r^7bUk{B8aRabKucPf3_-=UcySKwGDwm`yW zLf$R{sT!Wb0Yz-2qKXQd3PGvcX`tpd^5hSWc_R&wtXYYoKXpw3q12}!Z~e3Vw|2LZ zdXT>mR11+zX#pH-{>J(f@mIU6wXM>r;*2U&J`akA(n$!nl7UWa2E$1tDC>1%??^AnIkoxDm^#{Uq9j zolud_-LQR>EaN51BmD}4OXiNtYa{x*NOH)gB|7?hQJogk>h;5+5MaFza3=P=$ELVFX zh$a3L0sFb7tH2F~(&z)Fzzdk!KulHysYJf(VAVZ$ZXBw_DD5n@CIAM=2&EVkA=QqA zk&h-sXGg4Zgi;|q0MgIgn}kXawnQPIaTcc|6M`k6$Ivfai5vmw!sYwR?23zYg{MRY z;R3|31fHSF?#}i^+Rj{BCRDH8P%Z*jj5ZO1M83ml&9J?)5uPUkRS8Nw$V850L2?r_ z))3;8=#**)l=Y(E_=)K0ye6lSs5_7{c0Z2VF(ngf7T${?6xi=ei!SXYRGrgVDbyH zXen??Yh%k`;E0>^^S;-X4_q1pKm!^dgA(`z`hmF&3?iw#zLK*uwhKmL)e5XE^FZrI zfNcW-#vc%jGX)u_;qtqI{@1+|9*;ssu}LADRI4B;oMX1bL@zRBplablqL@Zt&r<~b zqI$n&TN69bu=T)54^1?bQ)DBMV@+1lx89ZC%O91jL+DtP+r9nP3W5K{W!1%5A`tyff&U zfkWUF3QHsyWoDNvi`O>-PK7(=bI+43z(oh60l;>ciNllI2!cF**!A&3TlFZIb2I+C zdEisrG!mqF0r3d&IQt_A;ryn5A+`|#sR2TiAQaMNVaS{T?d&DF^i5Ot*C$ATW7uIt zP^lOCyfD?rtBj#g>0Ql(Hh&xN2vb&46%`c_IMjc&HzNem=U1I;{ye9`QJ_i`NHgxr zAc>&oYcQJem84F-43Oqbpb}G}hoQ=}5k6#jaP_V0-qnow=BeBjpd1*v6%8bc+eacv zN+R0Yy>OhC8;p`542OW4HpBjF+1qWk zTM@4_Ve{twXmo<4PLmIMVlZOTh$Lb@gUAg81J`#q^LD=xF+#9$!>;uQxy$xeI0P6gJoiyyVc}`;b9+C#09+#YnFkD>{Iih@K!Jl#KEtR2 zaDuY%Yqs&(-CmEvtQz(7O|I_;CHwIOiiYd^**Jl>AYVFz)TOh;d(D~?V*pI#SjaKg zP;?;>x)VErl5Iju1Ui`3p>ylbh3`<>Ay5ek(zg(f4LZ~>CSv4Apq5h^i+2QXM53VP z2UJrJAEYlER^W(5pqZQ^?I}Ts{{SXc66;|KC<;x#%B2G1|Kb?<4sraqUUP216KFoJ zG477UNRa*qTF}rN1put8N-dJ!9IYSg@;yMo;_%O(;2H5&(vN{{QSu^FJ%y+tt6HZifBf z_l&mjAO6B`1OM%R{Of<%?*GKb@mC-k15%3rw~TfFe^3N?o&B$K{&#;N)&B3g{qO(! zj~mBd`+xK7|F>uXj#3;}|9@`m|GxzGAI0>)BAovc-G4NZ{|PbuZ#EIOkcW?P(~r2q zz+K=>YT@3;B`w)N2~7k1`rclaI& znXv$?gnHN5+uIx79&jAJaNzW8`n^o3>wy(8gDR1@BO%V1t5G+UE4|hj?&AyKEF&@m zLMVXqVGKib>hKbXfl+ylID{`|MW5kCXdNO^pmrn+^20$^2#tbw1~j9l8T5&=#>zR( zufm~or?_24gKY@5+rZ(2BG%JhFD98(*r2rtZ3`SQFom(yz z=~=4>&JLKL}~WVe1axWI-d-EjWKv8FfQ5xFcB zv}|Jg(6@L73L0ZGD74Zr-C2hjDO7l(W-%IRVZDjscJWi_{cb`-G!**EfQT3ZL8yV72)oz;IT7jS2PbvV z>o17h`Ic;eyBvI&nGq%!p9$jyb`n~W2(U3IyO}|<9Y`+=Xbhq|MMAZG4~um<4$tV~ z_z6UoFpxX_1U0bJVWtAL{K}yH3FD0eJebvk{!qe8m#EIbWDZruJ@n=bXrEdk*6}{1 z5S3`eV5R<$5WNLAV(g$TA-e4WlSUHDRD`R*=J zGj^@iixsGoJpfdqjuv$WVuislod*J4=&^+(`am<4M&uGe+QYj}#GQL)0d0Z%ntu%? z&_g*m(0`%=9GF)KigiKkJwmiW3K;r;UTZUD`?oJPX|!8#Gni;&a|Vvo+H1fepuqrx z{r)B7b;kaPe(%GVz&An+0hq=E+|=i;AP51sB?hk{ zfN3=}W45~yvwI4i2X5;!jDc&(Zx^!{eu9&Mj2_(;O;6g2kbx;NId`fkG*+uY9Wxuoyb1MktZ7x{h}G{}$z(#KG>-BnkduLs!7RL75!f zO66Sr>k$=_&twVgxlBMZ1o$^?2t~kL2SM*6W0euT6lxmuNk1^p@ra-l+9(nb0hl72 zWcB9v*FYpy1YWo(A==K+&jHIA26p0V7)n+{2ZQHtA+|E5)GV}>PVN1w2x_;|sp%J} zJND1d@Iw{HrU-QK59|R1%`WiR=dP}6c!`u>N0TqD+Ax;_gdTGI(>${NE1{mzTX?OX8~3Fn*QF z=tKjL>7#N6oj~~nU=*jIo`fynD6eyCN(?0)LR(J2&oqEegYLGs*sI(!isQonmx2?# z*+H$<#gvm2{Vv;WVW68t>J8%N;&%j{2$RUz2B2sKa3UAgDuCW4qI7r=&1s{OMj^Dv z7v_Ec*>6)$dAWebk$--Q2*s^qB#SUTyQd3}s(*iNBas4Zmj@8Jz0)W~d_oeb@6aj} z-V?LVl`GTk!BXF$GXSM5h~${erMIpxKIowa?cPtsY`fSvCm(}QF=Pv!K1w}j?eDWxpnO(Li?#G6C8 z<7Df7wN@(B+K56sWm{)<>r!;;Y$t#r6?l!n-f^y@S@6QFBTAuAa{4pXbB7T&WrG&hfCJ3{$^C5lD|_Y5NdIsvZwszsL&I1A0- ze?CR18EQ4F90i{a4J3fE@RpotpX;J07I6&l-0loz;=Qe#4Oh5FAnGv3AwbgLCgOW$ zD{0rm1-Gt4-8+EB@d8*io9RfI0AQ(t{VIYt$6sVci|ogwbI^Mf>_j2PA~%94PkXFE zh<<3en|q2d|2({Rg3ab3yrl?$%bBCYM?<@SL1-3;Vk*xC#C7lxY<~lFbhPx+X=Nzy3}M9bTJXaX5^N{uCxp^b>AICZ@|Hi&H>si z#-kR)0`eDWhPP?7O2dn|Tt1x4ZbbZnf+RFa4D*3uph1>ctT4RzB-Rt5VSs8t6Xu-d zLNLOb5dm*+LCip6U<4+{k*vyDpiM+WX9(W2Re%q)`B{LRQpW(q;R}5_vF5|j;sMOx zxe>htK#wo`ATqB3J9zVs3!p|V(8-M|*hh66O?U(GWH|beLi}nz2S%y{_%1LNnjpjB ze0Yvw(vkyAv;faq!Ef)07@CKNz8U?tG}s&JG@yw?{2IDwP%{h&l_n zlCkW{jJ;w0s}c9Y+2tf`^i@{WiO-}8Vh zhL{{}?hi^=QOgxBbu8eyh#&Qu*qDfk$@5#ZhbHjGek3Gz$X+7RJKE6D1EOG9z{?$| zs2HMp@$W`M8ZI^c7?DL0@fh0tzIb3n0nxOeb090>JaPmMEg%U_3!=y vdHo+Ow&2L%_GmT#@h=b_KnJ~>0sF8^Im`ibrTo=!38tZ{sgkR7?e2dA_#V-* literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/preference_about_dialog.xml b/app/src/main/res/layout/preference_about_dialog.xml index 815038b..c933a47 100644 --- a/app/src/main/res/layout/preference_about_dialog.xml +++ b/app/src/main/res/layout/preference_about_dialog.xml @@ -10,6 +10,6 @@ android:layout_height="wrap_content" android:scaleType="fitStart" android:adjustViewBounds="true" - android:src="@drawable/nonphatic_colour_light"> + android:src="@drawable/nonphatic"> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b9e9fc2..b5a6505 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,24 +1,13 @@ QUOZ - - Dummy Button - DUMMY\nCONTENT Settings - 0.618033988748984848 + + Copied to clipboard. + Settings reset. - - Pastel - Pastel neon - Neon - - - 0.3 - 0.5 - 0.7 - - + change_mode Tap Cycle @@ -31,4 +20,10 @@ leekspin nyan + tap + + saturation + 30 + + reset_button diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 4bfbbad..6333cf8 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -1,22 +1,22 @@ + android:defaultValue="@integer/preferences_colour_default"> + android:key="@string/preferences_reset_key" />