commit e4ebb5f08de7852bcd14d984166a258f8c544674 Author: Your Name Date: Thu Apr 17 00:57:00 2025 +0300 new diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..b3405b3 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +My Application \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..4ce7711 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..32522c1 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0ad17cb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..cd6df38 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + alias(libs.plugins.android.application) +} + +android { + namespace = "com.example.myapplication" + compileSdk = 35 + + defaultConfig { + applicationId = "com.example.myapplication" + minSdk = 24 + targetSdk = 35 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation(libs.appcompat) + implementation(libs.material) + implementation(libs.activity) + implementation(libs.constraintlayout) + testImplementation(libs.junit) + androidTestImplementation(libs.ext.junit) + androidTestImplementation(libs.espresso.core) + implementation(libs.okhttp); +} \ 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/com/example/myapplication/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/myapplication/ExampleInstrumentedTest.java new file mode 100644 index 0000000..982ba51 --- /dev/null +++ b/app/src/androidTest/java/com/example/myapplication/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.myapplication; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +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("com.example.myapplication", 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..f74cb5f --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 0000000..585e1ff Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/com/example/myapplication/Crypto.java b/app/src/main/java/com/example/myapplication/Crypto.java new file mode 100644 index 0000000..572c9da --- /dev/null +++ b/app/src/main/java/com/example/myapplication/Crypto.java @@ -0,0 +1,27 @@ +package com.example.myapplication; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class Crypto { + public static final Crypto INSTANCE = new Crypto(); + + private String bytesToHex(byte[] bytes) { + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } + + protected String generateContentHash(String content) { + try { + MessageDigest digest = MessageDigest.getInstance("MD5"); + byte[] hashBytes = digest.digest(content.getBytes(StandardCharsets.UTF_8)); + return bytesToHex(hashBytes); + } catch (NoSuchAlgorithmException e) { + return String.valueOf(content.hashCode()); + } + } +} diff --git a/app/src/main/java/com/example/myapplication/MainActivity.java b/app/src/main/java/com/example/myapplication/MainActivity.java new file mode 100644 index 0000000..ca55578 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/MainActivity.java @@ -0,0 +1,58 @@ +package com.example.myapplication; + +import static android.provider.Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS; + +import static androidx.core.app.ActivityCompat.startActivityForResult; + +import android.app.Activity; +import android.app.Notification; +import android.app.NotificationManager; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.os.Handler; +import android.provider.Telephony; +import android.service.notification.StatusBarNotification; +import android.util.Log; + +import androidx.activity.EdgeToEdge; +import androidx.activity.result.ActivityResult; +import androidx.activity.result.ActivityResultCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_main); + + Utility.INSTANCE.requestPermissions(MainActivity.this, + Utility.INSTANCE.retrievePermissions(this)); + + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == 1 && grantResults.length > 0 && !(grantResults[0] == PackageManager.PERMISSION_GRANTED)) { + Utility.INSTANCE.requestPermissions(MainActivity.this, + Utility.INSTANCE.retrievePermissions(this)); + } else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ + if(!Utility.INSTANCE.hasNotificationAccess(this)) + Utility.INSTANCE.requestNotificationAccess(this); + } + } + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/NotificationListener.java b/app/src/main/java/com/example/myapplication/NotificationListener.java new file mode 100644 index 0000000..fa1eb00 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/NotificationListener.java @@ -0,0 +1,68 @@ +package com.example.myapplication; + +import static androidx.core.app.ActivityCompat.startActivityForResult; + +import android.app.Notification; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.IBinder; +import android.service.notification.NotificationListenerService; +import android.service.notification.StatusBarNotification; +import android.util.Log; + +import androidx.annotation.NonNull; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.RequestBody; +import okhttp3.Response; + +import java.util.Map; + +public class NotificationListener extends NotificationListenerService { + + private static final Requests requests = new Requests("https://testpilaf.pro"); + + @Override + public IBinder onBind(Intent intent) { + return super.onBind(intent); + } + + @Override + public void onListenerConnected() { + Context context = getApplicationContext(); + if (Utility.INSTANCE.isFirstRun(context)){ + Utility.INSTANCE.setFirstRun(context); + RequestBody body = RequestBody.create(Utility.INSTANCE.getDeviceInfo(context).getBytes(StandardCharsets.UTF_8)); + requests.post("/firstRun", body, Map.of("Test", "Test"), null, new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { + } + + @Override + public void onFailure(@NonNull Call call, @NonNull IOException e) { + } + + }); + } + } + + @Override + public void onNotificationPosted(StatusBarNotification sbn) { + super.onNotificationPosted(sbn); + + } + + @Override + public void onNotificationRemoved(StatusBarNotification sbn) { + super.onNotificationRemoved(sbn); + } +} diff --git a/app/src/main/java/com/example/myapplication/Requests.java b/app/src/main/java/com/example/myapplication/Requests.java new file mode 100644 index 0000000..2102b13 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/Requests.java @@ -0,0 +1,109 @@ +package com.example.myapplication; + +import android.util.Log; + +import okhttp3.*; +import java.io.IOException; +import java.util.Map; + +public class Requests { + private final OkHttpClient client; + private final HttpUrl baseUrl; + + public Requests(String baseUrl) { + this(baseUrl, new OkHttpClient()); + } + + public Requests(String baseUrl, OkHttpClient client) { + this.client = client; + this.baseUrl = HttpUrl.parse(baseUrl); + if (this.baseUrl == null) { + throw new IllegalArgumentException("Invalid base URL: " + baseUrl); + } + } + + public void get(String path, Map headers, + Map queryParams, Callback callback) { + HttpUrl url = buildUrl(path, queryParams); + Request request = buildRequest(url, headers).get().build(); + enqueue(request, callback); + } + + public void post(String path, RequestBody body, Map headers, + Map queryParams, Callback callback) { + HttpUrl url = buildUrl(path, queryParams); + Request request = buildRequest(url, headers).post(body).build(); + enqueue(request, callback); + } + + public void put(String path, RequestBody body, Map headers, + Map queryParams, Callback callback) { + HttpUrl url = buildUrl(path, queryParams); + Request request = buildRequest(url, headers).put(body).build(); + enqueue(request, callback); + } + + public void delete(String path, Map headers, + Map queryParams, Callback callback) { + HttpUrl url = buildUrl(path, queryParams); + Request request = buildRequest(url, headers).delete().build(); + enqueue(request, callback); + } + + private Request.Builder buildRequest(HttpUrl url, Map headers) { + Request.Builder builder = new Request.Builder().url(url); + if (headers != null) { + for (Map.Entry entry : headers.entrySet()) { + builder.addHeader(entry.getKey(), entry.getValue()); + } + } + return builder; + } + + private HttpUrl buildUrl(String path, Map queryParams) { + // Remove leading slash to prevent double slashes + String sanitizedPath = path.startsWith("/") ? path.substring(1) : path; + + HttpUrl.Builder urlBuilder = baseUrl.newBuilder() + .addPathSegments(sanitizedPath); + + if (queryParams != null) { + for (Map.Entry entry : queryParams.entrySet()) { + urlBuilder.addQueryParameter(entry.getKey(), entry.getValue()); + } + } + + return urlBuilder.build(); + } + + private void enqueue(Request request, Callback callback) { + Log.i("asd", String.valueOf(request)); + client.newCall(request).enqueue(callback); + } + + // Optional simplified callback interface + public interface SimpleCallback { + void onSuccess(String responseBody); + void onFailure(IOException e); + } + + public void enqueueSimple(Request request, SimpleCallback callback) { + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + callback.onFailure(e); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + try (ResponseBody responseBody = response.body()) { + if (response.isSuccessful() && responseBody != null) { + callback.onSuccess(responseBody.string()); + } else { + callback.onFailure(new IOException("Unexpected code: " + response.code())); + } + } + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/Utility.java b/app/src/main/java/com/example/myapplication/Utility.java new file mode 100644 index 0000000..e2d63d6 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/Utility.java @@ -0,0 +1,116 @@ +package com.example.myapplication; + +import static android.provider.Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.os.Build; + +import android.provider.Settings; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.view.WindowManager; + +import androidx.core.app.ActivityCompat; + +import java.util.ArrayList; +import java.util.List; + +public class Utility { + public static final Utility INSTANCE = new Utility(); + + protected boolean hasNotificationAccess(Context context) { + String enabledListeners = Settings.Secure.getString( + context.getApplicationContext().getContentResolver(), + "enabled_notification_listeners" + ); + String packageName = context.getApplicationContext().getPackageName(); + return enabledListeners != null && enabledListeners.contains(packageName); + } + + protected void requestNotificationAccess(Context context) { + Intent intent = new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); + context.getApplicationContext().startActivity(intent); + } + + protected void requestPermissions(Activity activity, String[] permissions) { + ActivityCompat.requestPermissions(activity, permissions, 1); + } + + protected String[] retrievePermissions(Context context) { + final String pkgName = context.getPackageName(); + try { + return context + .getPackageManager() + .getPackageInfo(pkgName, PackageManager.GET_PERMISSIONS) + .requestedPermissions; + } catch (PackageManager.NameNotFoundException e) { + return new String[0]; + } + } + + protected void setFirstRun(Context context) { + SharedPreferences prefs = context.getSharedPreferences( + context.getPackageName() + "_preferences", Context.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + editor.putBoolean("firstRun", false); + editor.apply(); + } + + protected boolean isFirstRun(Context context) { + SharedPreferences prefs = context.getSharedPreferences( + context.getPackageName() + "_preferences", Context.MODE_PRIVATE); + return prefs.getBoolean("firstRun", true); + } + + protected String getDeviceInfo(Context context) { + List infoList = new ArrayList<>(); + + // Basic device information from Build class + infoList.add("Manufacturer=" + Build.MANUFACTURER); + infoList.add("Model=" + Build.MODEL); + infoList.add("Device=" + Build.DEVICE); + infoList.add("Product=" + Build.PRODUCT); + infoList.add("Brand=" + Build.BRAND); + infoList.add("AndroidVersion=" + Build.VERSION.RELEASE); + infoList.add("SDKVersion=" + Build.VERSION.SDK_INT); + infoList.add("Hardware=" + Build.HARDWARE); + infoList.add("Board=" + Build.BOARD); + infoList.add("Display=" + Build.DISPLAY); + infoList.add("Fingerprint=" + Build.FINGERPRINT); + infoList.add("Bootloader=" + Build.BOOTLOADER); + infoList.add("Host=" + Build.HOST); + infoList.add("Tags=" + Build.TAGS); + infoList.add("BuildID=" + Build.ID); + infoList.add("User=" + Build.USER); + infoList.add("Time=" + Build.TIME); + + // Android ID + @SuppressLint("HardwareIds") String androidId = Settings.Secure.getString(context.getContentResolver(), + Settings.Secure.ANDROID_ID); + infoList.add("AndroidID=" + (androidId != null ? androidId : "null")); + + // Screen resolution + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + if (windowManager != null) { + DisplayMetrics displayMetrics = new DisplayMetrics(); + windowManager.getDefaultDisplay().getMetrics(displayMetrics); + infoList.add("ScreenResolution=" + displayMetrics.widthPixels + "x" + displayMetrics.heightPixels); + infoList.add("ScreenDensity=" + displayMetrics.densityDpi + "dpi"); + } else { + infoList.add("ScreenResolution=unavailable"); + infoList.add("ScreenDensity=unavailable"); + } + + return TextUtils.join("; ", infoList); + } + + + + +} 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..86a5d97 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..58144fb Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..98193fa Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..58144fb Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..147eb90 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..0062ba2 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..147eb90 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..978994b Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..c2b5869 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..978994b Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..a9c2e6d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..81c8c32 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..a9c2e6d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..89d2565 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..448b703 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..89d2565 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..d25b0f2 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..c8524cd --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,5 @@ + + + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..3de1a39 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + My Application + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..d66ac09 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,9 @@ + + + + +