From 83ea8b84736cce2028e81fa354634eef952092c5 Mon Sep 17 00:00:00 2001 From: Trevor Slocum Date: Sat, 21 Nov 2020 22:18:42 -0800 Subject: [PATCH] Initial commit --- .gitignore | 14 ++ LICENSE | 21 +++ README.md | 9 + app/build.gradle | 34 ++++ app/proguard-rules.pro | 21 +++ .../xenia/ExampleInstrumentedTest.java | 26 +++ app/src/main/AndroidManifest.xml | 31 ++++ app/src/main/ic_launcher-playstore.png | Bin 0 -> 11782 bytes .../main/java/space/rocketnine/xenia/App.java | 34 ++++ .../space/rocketnine/xenia/MainActivity.java | 41 +++++ .../space/rocketnine/xenia/XeniaService.java | 86 +++++++++ .../main/res/drawable-hdpi/ic_stat_name.png | Bin 0 -> 352 bytes .../main/res/drawable-mdpi/ic_stat_name.png | Bin 0 -> 245 bytes .../drawable-v24/ic_launcher_foreground.xml | 31 ++++ .../main/res/drawable-xhdpi/ic_stat_name.png | Bin 0 -> 437 bytes .../main/res/drawable-xxhdpi/ic_stat_name.png | Bin 0 -> 657 bytes .../res/drawable-xxxhdpi/ic_stat_name.png | Bin 0 -> 851 bytes .../res/drawable/ic_dashboard_black_24dp.xml | 9 + app/src/main/res/drawable/ic_gemini.png | Bin 0 -> 6686 bytes .../main/res/drawable/ic_home_black_24dp.xml | 9 + .../res/drawable/ic_launcher_background.xml | 170 +++++++++++++++++ .../drawable/ic_notifications_black_24dp.xml | 9 + app/src/main/res/layout/activity_main.xml | 21 +++ app/src/main/res/menu/bottom_nav_menu.xml | 19 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1415 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 960 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3339 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1037 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 666 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2115 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 1959 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 1360 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 4767 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 3022 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 2309 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 7429 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 4213 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 3419 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 10672 bytes app/src/main/res/values-night/themes.xml | 8 + app/src/main/res/values/colors.xml | 10 + app/src/main/res/values/dimens.xml | 5 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings.xml | 6 + app/src/main/res/values/themes.xml | 8 + .../rocketnine/xenia/ExampleUnitTest.java | 17 ++ build.gradle | 24 +++ gradle.properties | 19 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 ++++++++++++++++++ gradlew.bat | 84 +++++++++ settings.gradle | 2 + 55 files changed, 960 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/space/rocketnine/xenia/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/space/rocketnine/xenia/App.java create mode 100644 app/src/main/java/space/rocketnine/xenia/MainActivity.java create mode 100644 app/src/main/java/space/rocketnine/xenia/XeniaService.java create mode 100644 app/src/main/res/drawable-hdpi/ic_stat_name.png create mode 100644 app/src/main/res/drawable-mdpi/ic_stat_name.png create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable-xhdpi/ic_stat_name.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_stat_name.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_stat_name.png create mode 100644 app/src/main/res/drawable/ic_dashboard_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_gemini.png create mode 100644 app/src/main/res/drawable/ic_home_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_notifications_black_24dp.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/menu/bottom_nav_menu.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/test/java/space/rocketnine/xenia/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc1c87c --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +/.idea +/app/build +/app/go +/app/libs +/build +/captures +/local.properties +*.iml +*.sh +.DS_Store +.cxx +.externalNativeBuild +.gradle +local.properties diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7c20f89 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Trevor Slocum + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..476a9f3 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Xenia +[![CI status](https://gitlab.com/tslocum/xenia/badges/master/pipeline.svg)](https://gitlab.com/tslocum/xenia/commits/master) +[![Donate](https://img.shields.io/liberapay/receives/rocketnine.space.svg?logo=liberapay)](https://liberapay.com/rocketnine.space) + +[Gemini](https://gemini.circumlunar.space) browser for Android + +## Support + +Please share issues and suggestions [here](https://gitlab.com/tslocum/xenia/issues). diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..5ae14f6 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,34 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.2" + + defaultConfig { + applicationId "space.rocketnine.xenia" + minSdkVersion 23 + targetSdkVersion 30 + versionCode 10 + versionName "0.1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/space/rocketnine/xenia/ExampleInstrumentedTest.java b/app/src/androidTest/java/space/rocketnine/xenia/ExampleInstrumentedTest.java new file mode 100644 index 0000000..46245eb --- /dev/null +++ b/app/src/androidTest/java/space/rocketnine/xenia/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package space.rocketnine.xenia; + +import android.content.Context; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("space.rocketnine.xenia", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..648d3e4 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..2ea2cd090a3e48cd95619e51feb5a33e1e33e5c5 GIT binary patch literal 11782 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 ZS3Z5+8;c(~1%wQA_LRxV{1Z-h{~zak`s)Ay literal 0 HcmV?d00001 diff --git a/app/src/main/java/space/rocketnine/xenia/App.java b/app/src/main/java/space/rocketnine/xenia/App.java new file mode 100644 index 0000000..1085b81 --- /dev/null +++ b/app/src/main/java/space/rocketnine/xenia/App.java @@ -0,0 +1,34 @@ +package space.rocketnine.xenia; + +import android.app.Application; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; + +public class App extends Application { + + @Override + public void onCreate() { + super.onCreate(); + + Intent serviceIntent = new Intent(this, XeniaService.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(serviceIntent); + } else { + startService(serviceIntent); + } + + Thread openBrowser = new Thread(() -> { + try { + Thread.sleep(1000); + + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://127.0.0.1:1967/gemini/twins.rocketnine.space/")); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } catch (Exception e) { + e.getLocalizedMessage(); + } + }); + openBrowser.start(); + } +} diff --git a/app/src/main/java/space/rocketnine/xenia/MainActivity.java b/app/src/main/java/space/rocketnine/xenia/MainActivity.java new file mode 100644 index 0000000..ed37b1a --- /dev/null +++ b/app/src/main/java/space/rocketnine/xenia/MainActivity.java @@ -0,0 +1,41 @@ +package space.rocketnine.xenia; + +import android.app.Activity; +import android.app.NotificationManager; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; +import android.view.View; + +public class MainActivity extends Activity { + String LOGTAG = "xenia"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + Log.d(LOGTAG, "started"); + } + + public void openBrowser(View view) { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://127.0.0.1:1967/gemini/twins.rocketnine.space/")); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + + public void exit(View view) { + NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.cancelAll(); + + Intent intent = new Intent(MainActivity.this, XeniaService.class); + + getApplication().stopService(intent); + finishAffinity(); + + int pid = android.os.Process.myPid(); + android.os.Process.killProcess(pid); + } +} \ No newline at end of file diff --git a/app/src/main/java/space/rocketnine/xenia/XeniaService.java b/app/src/main/java/space/rocketnine/xenia/XeniaService.java new file mode 100644 index 0000000..335b707 --- /dev/null +++ b/app/src/main/java/space/rocketnine/xenia/XeniaService.java @@ -0,0 +1,86 @@ +package space.rocketnine.xenia; + +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Handler; +import android.os.IBinder; +import android.util.Log; + +import space.rocketnine.gmitohtml.Gmitohtml; + +public class XeniaService extends Service { + private final String channelID = "space.rocketnine.xenia"; + public Context context = this; + public Handler handler = null; + private final String channelName = "Xenia"; + private final String channelDescription = "Foreground service"; + + private void createNotificationChannel() { + // Create the NotificationChannel, but only on API 26+ because + // the NotificationChannel class is new and not in the support library + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + CharSequence name = channelName; + String description = channelDescription; + int importance = NotificationManager.IMPORTANCE_DEFAULT; + NotificationChannel channel = new NotificationChannel(channelID, name, importance); + channel.setDescription(description); + // Register the channel with the system; you can't change the importance + // or other notification behaviors after this + NotificationManager notificationManager = getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(channel); + } + } + + @Override + public void onCreate() { + Log.d("xenia", "service oncreate"); + + createNotificationChannel(); + + Notification.Builder builder = new Notification.Builder(this); + if (Build.VERSION.SDK_INT >= 26) { + builder.setChannelId(channelID); + } + builder.setSmallIcon(R.drawable.ic_stat_name); + builder.setContentText("Xenia is running. Tap to open"); + + Intent notificationIntent = new Intent(this, MainActivity.class); + notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); + + builder.setContentIntent(pendingIntent); + + startForeground(1337, builder.build()); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Log.d("xenia", "service starting"); + + try { + Gmitohtml.startDaemon("127.0.0.1:1967"); + } catch (Exception e) { + e.printStackTrace(); + } + + // If we get killed, after returning from here, restart + return START_STICKY; + } + + @Override + public IBinder onBind(Intent intent) { + // We don't provide binding, so return null + return null; + } + + @Override + public void onDestroy() { + Log.d("xenia", "service destroyed"); + } +} diff --git a/app/src/main/res/drawable-hdpi/ic_stat_name.png b/app/src/main/res/drawable-hdpi/ic_stat_name.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef077e4e49004733db5251130483d85b1bd7ab0 GIT binary patch literal 352 zcmV-m0iXVfP)@mk>>|2^f31w7qr3pXq8hYnNV=U*`!3GvE)z8nktee=| z8NsN1Mr0+UbN1Vr#+C;8zxpclhp}GB3wa?g}1CrGe1^Zoh%|G%X` zKEoq11wW=Feg!k;q+Ert<|KjJG99)Hv!WJM$q6SnnhR`a{3xcd@3%Zt-T&h(1{(mEJaN;N*qU&qNim&qONT&9lHVp> zhO7FVdQ&MBb@0Fen;KmY&$ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..da1dcd9 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/ic_stat_name.png b/app/src/main/res/drawable-xhdpi/ic_stat_name.png new file mode 100644 index 0000000000000000000000000000000000000000..009ec91c157e10cd2535d57cceb76d22894916f9 GIT binary patch literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezr3(FxGgwIEGZ*dVAx%HcO$*v5&Dw z<0cdY%80oBV_qtvnkB2UY07MsQ;D)I%w0izMO*&xPMRP7R9@l8UEjL)(AyRDuZtzN z=B`dF(?7pFZmY5N=KGatWqST9i!NrENcr}Cw0ST1dxkszD?#4Gxf)Uzx>;o&D0ax7 zGkd?|h+x@jI(_P?>L=cl*#9n%vt>`2=lw(wqm>it%qs1p)efz46DxxbUjd@hy8 zZJMF~V?M)w3x7rt2W&{;N7PcL(u^&A%TLC!Df zGdurw=#=OgPVKMzoA$jZ%s!VlQPW}VjE&pQm9FdDaO&=st6j^tUFfnE4Zrto@#%MI zy9?*(&zhi{@x`};E{ zy=`i$i)xOpDzEb%6z2YywuU>vR@Atjp`@iRWuRS08=f2ayLYdGN*3u#AZK=I0-Dm5uftFy6tmc7w{V*{!Y{<1TG;ww}{Gzw=!Gq32VAAAb*# zZTIi|9KZFQOiS(to>!l~9P#eD!L@agC3D(An+OK(tq+bB+MT)j`|?#gyX%v7+&jMK zzv>U?3-NL1n{-Z)gZ@Q3YBBWwdS%eQ7k?Og zF9a7b=4B;&&EKZ9L~>*3-PMLn{vmhotvgy#>2nwu4}xJUJ8ZsH#I!EIH8I50vG97_ z0ae|;z`Jp?H@3UVu4&o3D|6$_v^5Vb`W{12irsz&|HUt_XxZ1+0+Skpr>mdKI;Vst E0J0`Ji~s-t literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_stat_name.png b/app/src/main/res/drawable-xxxhdpi/ic_stat_name.png new file mode 100644 index 0000000000000000000000000000000000000000..278f908b0d67c2496267cafe41254d6d181b34bc GIT binary patch literal 851 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V3zW9aSW-r^>$8lhfkr*arWIw z8~G=_zIICYq^--AM~$KredS_KndWSHvv^8-X)mv*NL1$p4=0X~YFuw0izQB;bWL^o zoo7G(&ANZNY+IV?;^K2P`@Ux0nz?r7=ihVw|F{4A$#*G-VvB$ig4pCCz;gdc?#9rN zjy%r2=YkA_bHu+NxxJ!h!?mA^^Ew_UEuNwGtAo!_vc&!3{q|U8DVN1RZoaaLUZka< zQ-7rTW566y>!VhN{ypN%IZvNNPvXCRZ@G_;z~`fE8{OxK_vda7` zwVLNf(Z3pAzn=-*4?5TRjD^ed_bD6Qu&z%lc`?OviVX~ew z`Ge`Yb_wlON7C$j4u8_--*n0D#)ca+H=bm-^_n7b>V12c8C%l*&E78YhBw-cJbi?X zkLUzyKI_=|FXH9-+pmL$Zw?A^&XiGr-fvu_u(ev)T=U@_OU|>;TVB~OM zpaD}MkjZ7^3)Qx6&3o)AuKwOfrPjNz{uXs6>wopu2qm$un@O7_)T+7`HHjxoonpr$ z{i5i-DDUZX{pPc&`z#VymKTP73YoPekzb^HZ_=k}6~dE?_Jzkyk9@v*r4Apn{x_v7 zQH3|NYK5=Oxbenz$u(Vbx00?)AJ$jg&QW|iH#EY{)nVPcP3!mhMxK5vTNpS;fW5|g zL(vD_x(~M&?!LyKQXTXD{Pkb|-wLoF^(@ppF(udh*Qr1AwmiG@EkxM-=fAAOD?hF} zQRukr&hF3kzxKqs*xxr=9dj$OFxV#FeQV(o)*I7G!rus=KJsG6m%>-YW&B31kF;yP zMt=XYd*bDXgp`#^J)S<3>i(m)Y3=(SbH?pU5GfSMn(*SezI|+z-^WF#Rsu5% NgQu&X%Q~loCIIk@bKL*{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_dashboard_black_24dp.xml b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml new file mode 100644 index 0000000..46fc8de --- /dev/null +++ b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_gemini.png b/app/src/main/res/drawable/ic_gemini.png new file mode 100644 index 0000000000000000000000000000000000000000..91c609def52007eae61cb3916959d369a1e7a0db GIT binary patch literal 6686 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_home_black_24dp.xml b/app/src/main/res/drawable/ic_home_black_24dp.xml new file mode 100644 index 0000000..f8bb0b5 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_notifications_black_24dp.xml b/app/src/main/res/drawable/ic_notifications_black_24dp.xml new file mode 100644 index 0000000..78b75c3 --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..b14985c --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,21 @@ + + + +