Compare commits

11 Commits
main ... dev

17 changed files with 78 additions and 177 deletions

View File

@ -1,6 +1,11 @@
# CarbUp # CarbUp
Calculate cost-effectiveness of foods on a High Carb Low Fat lifestyle. Calculate cost-effectiveness of foods on a High Carb Low Fat lifestyle.
# Status ## Status
Working on open sourcing my free app that has existed on the Play Store for years. No new features planned, only updates are to keep the app available on newer Android versions.
This was my first app and will likely also be the first to get a Kotlin rewrite since it looks ancient on newer devices! ;D
## Update Notes
### 2025-07-11
(This article)[https://sijus.medium.com/resurrecting-a-5-year-old-android-app-a-developers-journey-59d8f5689e5b]
was very helpful in getting this app updated from SDK 25 to 36.

View File

@ -1,26 +1,34 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
compileSdkVersion 23 namespace "com.hyperling.carbupbeta"
buildToolsVersion "23.0.2" compileSdkVersion 36
defaultConfig { defaultConfig {
applicationId "com.hyperling.carbupbeta" applicationId "com.hyperling.carbupbeta"
minSdkVersion 8 minSdkVersion 14
targetSdkVersion 23 targetSdkVersion 36
versionCode 6 versionCode 7
versionName "0.11" versionName "1.0.0"
} }
buildTypes { buildTypes {
release { release {
minifyEnabled false minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} }
} }
} }
dependencies { dependencies {
/*
compile fileTree(dir: 'libs', include: ['*.jar']) compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.google.android.gms:play-services-ads:8.3.0' compile 'com.google.android.gms:play-services-ads:8.3.0'
*/
implementation fileTree(dir: 'libs', include: ['*.jar'])
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
// https://mvnrepository.com/artifact/com.android.support/appcompat-v7
implementation group: 'com.android.support', name: 'appcompat-v7', version: '28.0.0'
} }

View File

@ -9,12 +9,11 @@
android:allowBackup="true" android:allowBackup="true"
android:icon="@drawable/dr_face_straight2_circle" android:icon="@drawable/dr_face_straight2_circle"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme"> android:theme="@style/CarbUp">
<activity <activity
android:name=".Splash" android:name=".Splash"
android:label="@string/app_name" android:exported="true"
android:screenOrientation="portrait" android:screenOrientation="fullSensor">
android:theme="@style/AppTheme.NoActionBar">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@ -23,24 +22,16 @@
</activity> </activity>
<activity <activity
android:name=".Main" android:name=".Main"
android:label="@string/app_name" android:screenOrientation="fullSensor"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Light.NoTitleBar"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/> android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
<activity <activity
android:name=".Tab1" android:name=".Tab1"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.NoTitleBar"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/> android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
<activity <activity
android:name=".Tab2" android:name=".Tab2"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.NoTitleBar"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/> android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
<activity <activity
android:name=".MySettings" android:name=".MySettings"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.NoTitleBar"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/> android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
<activity <activity
android:name=".Home" android:name=".Home"

View File

@ -7,14 +7,12 @@ import android.os.Bundle;
import android.app.Activity; import android.app.Activity;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.view.Menu; import android.view.Menu;
import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.Toast; import android.widget.Toast;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
public class Home extends AppCompatActivity { public class Home extends AppCompatActivity {
Resources recs; Resources recs;
@ -56,23 +54,6 @@ public class Home extends AppCompatActivity {
btnWhyVegan = (Button) findViewById(R.id.btnWhyVegan); btnWhyVegan = (Button) findViewById(R.id.btnWhyVegan);
//////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
// Finally, load ads >:)
if (Build.VERSION.SDK_INT >= 9) {
// Load an ad into the AdMob banner view.
AdView adView = (AdView) findViewById(R.id.adViewHome);
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice("C6A494DC6E7C9AC29102694D48487084") // nexus 7
.addTestDevice("B8B7561B850A9AB24E0D5B560FC50628") // Moto G
.addTestDevice("") // Cappy, even though it doesn't support ads
.setRequestAgent("android_studio:ad_template")
.build();
adView.loadAd(adRequest);
}
////////////////////////////////////////////////////////////////////////////////////////////
} }
@Override @Override

View File

@ -17,7 +17,7 @@ public class MySettings extends Activity {
Context context; Context context;
LinearLayout settingsArea; LinearLayout settingsArea;
MySettingItem quickLoad, adsEnabled, rainbowLists, whiteOnBlack; MySettingItem quickLoad, rainbowLists, whiteOnBlack;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -35,16 +35,13 @@ public class MySettings extends Activity {
// Instantiate settings // Instantiate settings
quickLoad = new MySettingItem(context, new MySettingInfo()); quickLoad = new MySettingItem(context, new MySettingInfo());
adsEnabled = new MySettingItem(context, new MySettingInfo());
// Name them // Name them
quickLoad.setName("Quick Load:"); quickLoad.setName("Quick Load:");
adsEnabled.setName("Ads Enabled:");
// Set the checkboxes // Set the checkboxes
dalih.open(); dalih.open();
quickLoad.setEnabled(dalih.getQuickLoad()); quickLoad.setEnabled(dalih.getQuickLoad());
adsEnabled.setEnabled(dalih.getAdsEnabled());
dalih.close(); dalih.close();
// Set the checkbox actions // Set the checkbox actions
@ -62,26 +59,8 @@ public class MySettings extends Activity {
} }
}); });
adsEnabled.btnItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dalih.setAdsEnabled(!dalih.getAdsEnabled());
adsEnabled.checkBox.setChecked(dalih.getAdsEnabled());
}
});
adsEnabled.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dalih.setAdsEnabled(adsEnabled.checkBox.isChecked());
}
});
// Throw them onto the screen // Throw them onto the screen
settingsArea.addView(quickLoad.getView()); settingsArea.addView(quickLoad.getView());
if (Build.VERSION.SDK_INT >= 9) {
settingsArea.addView(adsEnabled.getView());
}
} }
@Override @Override

View File

@ -15,9 +15,6 @@ import android.widget.Toast;
import java.util.ArrayList; import java.util.ArrayList;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
/** /**
* Created by usb on 9/28/14. * Created by usb on 9/28/14.
* *
@ -35,7 +32,6 @@ public class Tab1 extends Activity{
Button btnCreate; Button btnCreate;
LinearLayout layListArea; LinearLayout layListArea;
TextView tvLeft, tvRight, selectHeader; TextView tvLeft, tvRight, selectHeader;
AdView mAdView;
// The lists! // The lists!
ArrayList<List> lists = new ArrayList<List>(); ArrayList<List> lists = new ArrayList<List>();
@ -58,7 +54,6 @@ public class Tab1 extends Activity{
tvLeft = (TextView) findViewById(R.id.leftEditView); tvLeft = (TextView) findViewById(R.id.leftEditView);
tvRight = (TextView) findViewById(R.id.rightEditView); tvRight = (TextView) findViewById(R.id.rightEditView);
selectHeader = (TextView) findViewById(R.id.selectListHeader); selectHeader = (TextView) findViewById(R.id.selectListHeader);
mAdView = (AdView) findViewById(R.id.adView);
return; return;
} }
@ -266,26 +261,6 @@ public class Tab1 extends Activity{
dalih.open(); dalih.open();
if (Build.VERSION.SDK_INT >= 9) {
if (dalih.getAdsEnabled()) {
if (mAdView.getVisibility() != View.VISIBLE) {
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice("C6A494DC6E7C9AC29102694D48487084") // nexus 7
.addTestDevice("B8B7561B850A9AB24E0D5B560FC50628") // Moto G
.addTestDevice("") // Cappy, even though it can't get ads
.build();
mAdView.setVisibility(View.VISIBLE);
mAdView.loadAd(adRequest);
}
}
else{
if (mAdView.getVisibility() == View.VISIBLE) {
mAdView.setVisibility(View.GONE);
}
}
}
setButtonInsert(); setButtonInsert();
super.onResume(); super.onResume();

View File

@ -11,9 +11,6 @@ import android.widget.EditText;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.Toast; import android.widget.Toast;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import java.util.ArrayList; import java.util.ArrayList;
/** /**
@ -35,7 +32,6 @@ public class Tab2 extends Activity{
LinearLayout layListArea; LinearLayout layListArea;
EditText txtName, txtCost, txtServings, txtCalories, txtCarbs, txtFiber; EditText txtName, txtCost, txtServings, txtCalories, txtCarbs, txtFiber;
Button btnClear, btnAdd; Button btnClear, btnAdd;
AdView mAdView;
// List // List
ArrayList<ListItem> items = new ArrayList<ListItem>(); ArrayList<ListItem> items = new ArrayList<ListItem>();
@ -61,7 +57,6 @@ public class Tab2 extends Activity{
txtFiber = (EditText) findViewById(R.id.etItemFiber); txtFiber = (EditText) findViewById(R.id.etItemFiber);
btnClear = (Button) findViewById(R.id.btnClear); btnClear = (Button) findViewById(R.id.btnClear);
btnAdd = (Button) findViewById(R.id.btnAddToList); btnAdd = (Button) findViewById(R.id.btnAddToList);
mAdView = (AdView) findViewById(R.id.adView);
// Give the Buttons their power // Give the Buttons their power
btnClear.setOnClickListener(new View.OnClickListener() { btnClear.setOnClickListener(new View.OnClickListener() {
@ -91,26 +86,6 @@ public class Tab2 extends Activity{
dalih.open(); dalih.open();
if (Build.VERSION.SDK_INT >= 9) {
if (dalih.getAdsEnabled()) {
if (mAdView.getVisibility() != View.VISIBLE) {
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice("C6A494DC6E7C9AC29102694D48487084") // nexus 7
.addTestDevice("B8B7561B850A9AB24E0D5B560FC50628") // Moto G
.addTestDevice("") // Cappy, even though it can't get ads
.build();
mAdView.setVisibility(View.VISIBLE);
mAdView.loadAd(adRequest);
}
}
else{
if (mAdView.getVisibility() == View.VISIBLE) {
mAdView.setVisibility(View.GONE);
}
}
}
setButtonInsert(); setButtonInsert();
super.onResume(); super.onResume();

View File

@ -50,7 +50,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
android:layout_weight=".45" android:layout_weight=".45"
android:weightSum="1"> android:weightSum="1"
style="?android:attr/buttonBarStyle">
<Button <Button
android:layout_width="match_parent" android:layout_width="match_parent"
@ -64,7 +65,8 @@
android:text="Why High Carb?" android:text="Why High Carb?"
android:textColor="@color/textPrimaryInverse" android:textColor="@color/textPrimaryInverse"
android:textAllCaps="false" android:textAllCaps="false"
android:id="@+id/btnWhyHCLF"/> android:id="@+id/btnWhyHCLF"
style="?android:attr/buttonBarButtonStyle" />
<Button <Button
android:layout_width="match_parent" android:layout_width="match_parent"
@ -78,17 +80,9 @@
android:text="Why Vegan?" android:text="Why Vegan?"
android:textColor="@color/textAccentInverse" android:textColor="@color/textAccentInverse"
android:textAllCaps="false" android:textAllCaps="false"
android:id="@+id/btnWhyVegan"/> android:id="@+id/btnWhyVegan"
style="?android:attr/buttonBarButtonStyle" />
</LinearLayout> </LinearLayout>
<com.google.android.gms.ads.AdView
android:id="@+id/adViewHome"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight=".1"
ads:adSize="BANNER"
ads:adUnitId="@string/banner_ad_home">
</com.google.android.gms.ads.AdView>
</LinearLayout> </LinearLayout>

View File

@ -2,6 +2,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="?android:actionBarSize"
android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" android:paddingTop="@dimen/activity_vertical_margin"

View File

@ -2,12 +2,13 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:layout_marginTop="?android:actionBarSize">
<TabHost <TabHost
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_below="@+id/title" android:layout_alignParentTop="true"
android:id="@android:id/tabhost"> android:id="@android:id/tabhost">
<RelativeLayout <RelativeLayout

View File

@ -3,7 +3,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -50,4 +49,4 @@
</ScrollView> </ScrollView>
</RelativeLayout> </RelativeLayout>

View File

@ -68,22 +68,10 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
ads:adSize="BANNER"
android:visibility="gone"
ads:adUnitId="@string/banner_ad_tab1">
</com.google.android.gms.ads.AdView>
<ScrollView <ScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_alignParentTop="true" android:layout_alignParentTop="true">
android:layout_above="@+id/adView">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -96,4 +84,4 @@
</RelativeLayout> </RelativeLayout>
</LinearLayout> </LinearLayout>

View File

@ -97,22 +97,10 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
ads:adSize="BANNER"
android:visibility="gone"
ads:adUnitId="@string/banner_ad_tab2">
</com.google.android.gms.ads.AdView>
<ScrollView <ScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_alignParentTop="true" android:layout_alignParentTop="true">
android:layout_above="@+id/adView">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -125,4 +113,4 @@
</RelativeLayout> </RelativeLayout>
</LinearLayout> </LinearLayout>

View File

@ -6,11 +6,13 @@
<string name="app_name_short">Carb Up!</string> <string name="app_name_short">Carb Up!</string>
<string name="action_settings">Settings</string> <string name="action_settings">Settings</string>
<string name="title_activity_main">Main</string> <string name="title_activity_main">Main</string>
<string name="version_name">-=Version Banana=-</string> <string name="version_name">-= Version Mango =-</string>
<string name="version_number">-=Beta v0.10=-</string> <string name="version_number">-= v1.0.0 =-</string>
<string name="author">Hyperling</string> <string name="author">Hyperling</string>
<string name="title_activity_home">Home</string>
<!-- Tab1 Views --> <!-- Tab1 Views -->
<string name="list_header">Create a New List:</string> <string name="list_header">Create a New List:</string>
@ -52,14 +54,4 @@
<string name="delete_dialog_ok">Delete</string> <string name="delete_dialog_ok">Delete</string>
<string name="delete_dialog_cancel">Cancel</string> <string name="delete_dialog_cancel">Cancel</string>
<!-- Ads -->
<string name="banner_ad_unit_id">ca-app-pub-9712416021907617/1895014881</string>
<string name="banner_ad_tab1">ca-app-pub-9712416021907617/1895014881</string>
<string name="banner_ad_tab2">ca-app-pub-9712416021907617/6325214486</string>
<string name="banner_ad_home">ca-app-pub-9712416021907617/4055112081</string>
<string name="interstitial_ad_splash">ca-app-pub-9712416021907617/9278680882</string>
<string name="title_activity_home">Home</string>
</resources> </resources>

View File

@ -14,4 +14,15 @@
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
</style> </style>
<style name="CarbUp" parent="@android:style/Theme.Light.NoTitleBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:colorForeground">@color/colorPrimary</item>
</style>
</resources> </resources>

View File

@ -2,10 +2,18 @@
buildscript { buildscript {
repositories { repositories {
jcenter() mavenCentral()
maven {
url 'https://jitpack.io'
}
google()
maven {
url 'https://maven.google.com/'
name 'Google'
}
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:1.5.0' classpath 'com.android.tools.build:gradle:8.11.1'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
@ -14,6 +22,11 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
jcenter() mavenCentral()
google()
} }
} }
task clean(type: Delete) {
delete rootProject.buildDir
}

View File

@ -1,6 +1,6 @@
#Wed Apr 10 15:27:10 PDT 2013 #Fri Jul 11 14:14:34 MST 2025
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip