Skip to content

Commit 851d6eb

Browse files
Fix startup crash and remove Kotlin references
1 parent e4a1c90 commit 851d6eb

File tree

39 files changed

+27
-340
lines changed

39 files changed

+27
-340
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
- Added functionality to "Music" chip.
7878
- Added app updater dialog and ability to update in background.
7979
- Added comments to the Java code samples for better understanding.
80-
- Refactored app's codebase from Kotlin to Java to match the name and style of the app.
80+
- Refactored app's codebase to Java to match the name and style of the app.
8181
- Fixed all crash reports from Google Play Console and Google Firebase.
8282
- Made various improvements to languages and fixed some typos.
8383
- Made under-the-hood improvements for a better overall app experience.

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66

77
**Learn how to make simple apps in Android Studio.**
88

9-
Android Studio Tutorials: Java Edition is the sister project of [Android Studio Tutorials: Kotlin Edition](https://github.com/D4rK7355608/com.d4rk.androidtutorials). This guide provides practical examples and complete source code to help you build your first Android application using Android Studio and Java.
9+
Android Studio Tutorials: Java Edition provides practical examples and complete source code to help you build your first Android application using Android Studio with Java and XML.
1010

1111
Our app is designed to be easy to use and lightweight. Plus, it's free and open‑source!
1212

13+
> **Note:** This project is built solely with Java and XML. Kotlin and Jetpack Compose are not used.
14+
1315
## Features
1416

1517
- Java and XML code examples

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
<activity
4141
android:name=".ui.screens.startup.StartupActivity"
4242
android:exported="true"
43-
android:theme="@style/SplashScreenTheme" />
43+
android:theme="@style/AppTheme" />
4444

4545
<activity
4646
android:name=".ui.screens.main.MainActivity"

app/src/main/java/com/d4rk/androidtutorials/java/data/repository/DefaultMainRepository.java

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.d4rk.androidtutorials.java.data.repository;
22

33
import android.content.Context;
4-
import android.content.Intent;
54
import android.content.SharedPreferences;
6-
import android.content.pm.PackageManager;
7-
import android.net.Uri;
85

96
import androidx.appcompat.app.AppCompatDelegate;
107
import androidx.core.os.LocaleListCompat;
@@ -47,22 +44,6 @@ private static int getNewNightMode(String[] darkModeValues, int currentNightMode
4744
return newNightMode;
4845
}
4946

50-
/**
51-
* Check if a given package name is installed.
52-
*
53-
* @param packageName The package to check.
54-
* @return True if installed, false otherwise.
55-
*/
56-
public boolean isAppInstalled(String packageName) {
57-
PackageManager packageManager = context.getPackageManager();
58-
try {
59-
packageManager.getPackageInfo(packageName, 0);
60-
return true;
61-
} catch (PackageManager.NameNotFoundException e) {
62-
return false;
63-
}
64-
}
65-
6647
/**
6748
* Retrieves the user's theme preference and applies it.
6849
* This method returns true if a change was applied (so the Activity can decide if it needs to recreate).
@@ -134,19 +115,4 @@ public AppUpdateManager getAppUpdateManager() {
134115
return appUpdateManager;
135116
}
136117

137-
/**
138-
* Creates an intent to open your other app or fallback to Google Play if not installed.
139-
*/
140-
public Intent buildShortcutIntent(boolean isInstalled) {
141-
if (isInstalled) {
142-
return new Intent(Intent.ACTION_MAIN) // <--- set an ACTION
143-
.addCategory(Intent.CATEGORY_LAUNCHER) // optional for typical launcher scenario
144-
.setClassName("com.d4rk.androidtutorials", "com.d4rk.androidtutorials.MainActivity")
145-
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
146-
} else {
147-
return new Intent(Intent.ACTION_VIEW)
148-
.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.d4rk.androidtutorials"))
149-
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
150-
}
151-
}
152118
}
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
package com.d4rk.androidtutorials.java.data.repository;
22

3-
import android.content.Intent;
43
import com.google.android.play.core.appupdate.AppUpdateManager;
54

65
public interface MainRepository {
7-
boolean isAppInstalled(String packageName);
86
boolean applyThemeSettings(String[] darkModeValues);
97
String getBottomNavLabelVisibility();
108
String getDefaultTabPreference();
119
boolean shouldShowStartupScreen();
1210
void markStartupScreenShown();
1311
void applyLanguageSettings();
1412
AppUpdateManager getAppUpdateManager();
15-
Intent buildShortcutIntent(boolean isInstalled);
1613
}

app/src/main/java/com/d4rk/androidtutorials/java/di/AppModule.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,9 @@
2929
import com.d4rk.androidtutorials.java.domain.home.GetAppPlayStoreUrlUseCase;
3030
import com.d4rk.androidtutorials.java.domain.main.ApplyLanguageSettingsUseCase;
3131
import com.d4rk.androidtutorials.java.domain.main.ApplyThemeSettingsUseCase;
32-
import com.d4rk.androidtutorials.java.domain.main.BuildShortcutIntentUseCase;
3332
import com.d4rk.androidtutorials.java.domain.main.GetAppUpdateManagerUseCase;
3433
import com.d4rk.androidtutorials.java.domain.main.GetBottomNavLabelVisibilityUseCase;
3534
import com.d4rk.androidtutorials.java.domain.main.GetDefaultTabPreferenceUseCase;
36-
import com.d4rk.androidtutorials.java.domain.main.IsAppInstalledUseCase;
3735
import com.d4rk.androidtutorials.java.domain.main.MarkStartupScreenShownUseCase;
3836
import com.d4rk.androidtutorials.java.domain.main.ShouldShowStartupScreenUseCase;
3937
import com.d4rk.androidtutorials.java.domain.quiz.LoadQuizQuestionsUseCase;
@@ -171,16 +169,6 @@ public MarkStartupScreenShownUseCase provideMarkStartupScreenShownUseCase(MainRe
171169
return new MarkStartupScreenShownUseCase(repository);
172170
}
173171

174-
@Provides
175-
public IsAppInstalledUseCase provideIsAppInstalledUseCase(MainRepository repository) {
176-
return new IsAppInstalledUseCase(repository);
177-
}
178-
179-
@Provides
180-
public BuildShortcutIntentUseCase provideBuildShortcutIntentUseCase(MainRepository repository) {
181-
return new BuildShortcutIntentUseCase(repository);
182-
}
183-
184172
@Provides
185173
public GetAppUpdateManagerUseCase provideGetAppUpdateManagerUseCase(MainRepository repository) {
186174
return new GetAppUpdateManagerUseCase(repository);

app/src/main/java/com/d4rk/androidtutorials/java/domain/main/BuildShortcutIntentUseCase.java

Lines changed: 0 additions & 17 deletions
This file was deleted.

app/src/main/java/com/d4rk/androidtutorials/java/domain/main/IsAppInstalledUseCase.java

Lines changed: 0 additions & 16 deletions
This file was deleted.

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@
1818
import androidx.annotation.NonNull;
1919
import androidx.appcompat.app.ActionBar;
2020
import androidx.appcompat.app.AppCompatActivity;
21-
import androidx.core.content.pm.ShortcutInfoCompat;
22-
import androidx.core.content.pm.ShortcutManagerCompat;
23-
import androidx.core.graphics.drawable.IconCompat;
2421
import androidx.core.splashscreen.SplashScreen;
2522
import androidx.lifecycle.DefaultLifecycleObserver;
2623
import androidx.lifecycle.LifecycleOwner;
@@ -123,7 +120,6 @@ protected void onCreate(Bundle savedInstanceState) {
123120
String[] defaultTabValues = getResources().getStringArray(R.array.preference_default_tab_values);
124121
mainViewModel.applySettings(themeValues, bottomNavBarLabelsValues, defaultTabValues);
125122

126-
launcherShortcuts();
127123

128124
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
129125
requestPermissions(new String[]{Manifest.permission.POST_NOTIFICATIONS}, 1);
@@ -162,18 +158,6 @@ private void setupActionBar() {
162158
}
163159
}
164160

165-
private void launcherShortcuts() {
166-
boolean isInstalled = mainViewModel.isAndroidTutorialsInstalled();
167-
168-
ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(this, "shortcut_id")
169-
.setShortLabel(getString(R.string.shortcut_kotlin_edition_short))
170-
.setLongLabel(getString(R.string.shortcut_kotlin_edition_long))
171-
.setIcon(IconCompat.createWithResource(this, R.mipmap.ic_shortcut_kotlin_edition))
172-
.setIntent(mainViewModel.getShortcutIntent(isInstalled))
173-
.build();
174-
175-
ShortcutManagerCompat.pushDynamicShortcut(this, shortcut);
176-
}
177161

178162
private boolean shouldUseNavigationRail() {
179163
return getResources().getConfiguration().smallestScreenWidthDp >= 600;

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainViewModel.java

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.d4rk.androidtutorials.java.ui.screens.main;
22

3-
import android.content.Intent;
43

54
import androidx.lifecycle.ViewModel;
65
import androidx.lifecycle.LiveData;
@@ -13,8 +12,6 @@
1312
import com.d4rk.androidtutorials.java.domain.main.ApplyLanguageSettingsUseCase;
1413
import com.d4rk.androidtutorials.java.domain.main.ShouldShowStartupScreenUseCase;
1514
import com.d4rk.androidtutorials.java.domain.main.MarkStartupScreenShownUseCase;
16-
import com.d4rk.androidtutorials.java.domain.main.IsAppInstalledUseCase;
17-
import com.d4rk.androidtutorials.java.domain.main.BuildShortcutIntentUseCase;
1815
import com.d4rk.androidtutorials.java.domain.main.GetAppUpdateManagerUseCase;
1916
import com.google.android.material.navigation.NavigationBarView;
2017
import com.google.android.play.core.appupdate.AppUpdateManager;
@@ -35,8 +32,6 @@ public class MainViewModel extends ViewModel {
3532
private final ApplyLanguageSettingsUseCase applyLanguageSettingsUseCase;
3633
private final ShouldShowStartupScreenUseCase shouldShowStartupScreenUseCase;
3734
private final MarkStartupScreenShownUseCase markStartupScreenShownUseCase;
38-
private final IsAppInstalledUseCase isAppInstalledUseCase;
39-
private final BuildShortcutIntentUseCase buildShortcutIntentUseCase;
4035
private final GetAppUpdateManagerUseCase getAppUpdateManagerUseCase;
4136
private final MutableLiveData<MainUiState> uiState = new MutableLiveData<>();
4237
private final MutableLiveData<Boolean> isLoading = new MutableLiveData<>(false);
@@ -48,17 +43,13 @@ public MainViewModel(ApplyThemeSettingsUseCase applyThemeSettingsUseCase,
4843
ApplyLanguageSettingsUseCase applyLanguageSettingsUseCase,
4944
ShouldShowStartupScreenUseCase shouldShowStartupScreenUseCase,
5045
MarkStartupScreenShownUseCase markStartupScreenShownUseCase,
51-
IsAppInstalledUseCase isAppInstalledUseCase,
52-
BuildShortcutIntentUseCase buildShortcutIntentUseCase,
5346
GetAppUpdateManagerUseCase getAppUpdateManagerUseCase) {
5447
this.applyThemeSettingsUseCase = applyThemeSettingsUseCase;
5548
this.getBottomNavLabelVisibilityUseCase = getBottomNavLabelVisibilityUseCase;
5649
this.getDefaultTabPreferenceUseCase = getDefaultTabPreferenceUseCase;
5750
this.applyLanguageSettingsUseCase = applyLanguageSettingsUseCase;
5851
this.shouldShowStartupScreenUseCase = shouldShowStartupScreenUseCase;
5952
this.markStartupScreenShownUseCase = markStartupScreenShownUseCase;
60-
this.isAppInstalledUseCase = isAppInstalledUseCase;
61-
this.buildShortcutIntentUseCase = buildShortcutIntentUseCase;
6253
this.getAppUpdateManagerUseCase = getAppUpdateManagerUseCase;
6354
}
6455

@@ -118,20 +109,6 @@ public void markStartupScreenShown() {
118109
markStartupScreenShownUseCase.invoke();
119110
}
120111

121-
/**
122-
* Check if the “Android Tutorials” app is installed or not.
123-
*/
124-
public boolean isAndroidTutorialsInstalled() {
125-
return isAppInstalledUseCase.invoke("com.d4rk.androidtutorials.java");
126-
}
127-
128-
/**
129-
* Build the intent for the shortcut (opens app if installed, or fallback to the Play Store).
130-
*/
131-
public Intent getShortcutIntent(boolean isInstalled) {
132-
return buildShortcutIntentUseCase.invoke(isInstalled);
133-
}
134-
135112
/**
136113
* Expose the consolidated UI state so MainActivity can observe it.
137114
*/

0 commit comments

Comments
 (0)