From c7cbbc880ebba58b38dca8171489f3cff7c4eeb9 Mon Sep 17 00:00:00 2001 From: Habib Ridho Date: Thu, 4 May 2017 08:56:43 +0700 Subject: [PATCH 01/76] integrate RN 0.39.2 --- .gitignore | 2 + app/build.gradle | 4 + app/src/main/AndroidManifest.xml | 11 +++ .../github/bukaanalytics/MainActivity.java | 13 ++- .../reactnative/MyReactActivity.java | 90 +++++++++++++++++++ build.gradle | 4 + index.android.js | 33 +++++++ package.json | 24 +++++ 8 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/github/bukaanalytics/reactnative/MyReactActivity.java create mode 100644 index.android.js create mode 100644 package.json diff --git a/.gitignore b/.gitignore index 1d0e462..a51ab8f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ /captures .externalNativeBuild +# RN +node_modules # Below created by gitignore # Created by https://www.gitignore.io/api/android,androidstudio diff --git a/app/build.gradle b/app/build.gradle index b9772f9..d2c424f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,6 +17,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + configurations.all { + resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.0' + } } dependencies { @@ -29,4 +32,5 @@ dependencies { compile 'com.android.support:design:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' + compile 'com.facebook.react:react-native:0.39.2' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 51d2f6e..8675d0c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/github/bukaanalytics/MainActivity.java b/app/src/main/java/com/github/bukaanalytics/MainActivity.java index 4c1e67f..b93df6e 100644 --- a/app/src/main/java/com/github/bukaanalytics/MainActivity.java +++ b/app/src/main/java/com/github/bukaanalytics/MainActivity.java @@ -1,5 +1,6 @@ package com.github.bukaanalytics; +import android.content.Intent; import android.net.Uri; import android.support.v4.app.Fragment; import android.os.Bundle; @@ -18,6 +19,7 @@ import com.github.bukaanalytics.biddingtools.FragmentBidding; import com.github.bukaanalytics.home.FragmentHome; import com.github.bukaanalytics.pricingtools.FragmentPricing; +import com.github.bukaanalytics.reactnative.MyReactActivity; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, @@ -110,7 +112,16 @@ public boolean onNavigationItemSelected(MenuItem item) { } else if (id == R.id.nav_pricing) { fragmentclass = FragmentPricing.class; } else if (id == R.id.nav_bidding) { - fragmentclass = FragmentBidding.class; + Intent intent = new Intent(this, MyReactActivity.class); + this.startActivity(intent); + + item.setChecked(true); + setTitle(item.getTitle()); + + DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + drawer.closeDrawer(GravityCompat.START); + return true; + // fragmentclass = FragmentBidding.class; } else { fragmentclass = FragmentHome.class; } diff --git a/app/src/main/java/com/github/bukaanalytics/reactnative/MyReactActivity.java b/app/src/main/java/com/github/bukaanalytics/reactnative/MyReactActivity.java new file mode 100644 index 0000000..1581d9f --- /dev/null +++ b/app/src/main/java/com/github/bukaanalytics/reactnative/MyReactActivity.java @@ -0,0 +1,90 @@ +package com.github.bukaanalytics.reactnative; + +import android.app.Activity; +import android.os.Bundle; +import android.view.KeyEvent; + +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.ReactRootView; +import com.facebook.react.common.LifecycleState; +import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; +import com.facebook.react.shell.MainReactPackage; +import com.github.bukaanalytics.BuildConfig; + +/** + * Created by habibridho on 5/4/17. + */ + +public class MyReactActivity extends Activity implements DefaultHardwareBackBtnHandler { + private ReactRootView mReactRootView; + private ReactInstanceManager mReactInstanceManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mReactRootView = new ReactRootView(this); + mReactInstanceManager = ReactInstanceManager.builder() + .setApplication(getApplication()) + .setBundleAssetName("index.android.bundle") + .setJSMainModuleName("index.android") + .addPackage(new MainReactPackage()) + .setUseDeveloperSupport(BuildConfig.DEBUG) + .setInitialLifecycleState( + LifecycleState.RESUMED) + .build(); + mReactRootView.startReactApplication(mReactInstanceManager, "HelloWorld", null); + + setContentView(mReactRootView); + } + + @Override + public void invokeDefaultOnBackPressed() { + super.onBackPressed(); + } + + + @Override + public void onBackPressed() { + if (mReactInstanceManager != null) { + mReactInstanceManager.onBackPressed(); + } else { + super.onBackPressed(); + } + } + @Override + protected void onPause() { + super.onPause(); + + if (mReactInstanceManager != null) { + mReactInstanceManager.onHostPause(this); + } + } + + @Override + protected void onResume() { + super.onResume(); + + if (mReactInstanceManager != null) { + mReactInstanceManager.onHostResume(this, this); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + if (mReactInstanceManager != null) { + mReactInstanceManager.onHostDestroy(this); + } + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) { + mReactInstanceManager.showDevOptionsDialog(); + return true; + } + return super.onKeyUp(keyCode, event); + } +} diff --git a/build.gradle b/build.gradle index b78a0b8..0f65026 100644 --- a/build.gradle +++ b/build.gradle @@ -15,6 +15,10 @@ buildscript { allprojects { repositories { jcenter() + maven { + // All of React Native (JS, Android binaries) is installed from npm + url "$rootDir/node_modules/react-native/android" + } } } diff --git a/index.android.js b/index.android.js new file mode 100644 index 0000000..0d17c7e --- /dev/null +++ b/index.android.js @@ -0,0 +1,33 @@ +'use strict'; + +import React from 'react'; +import { + AppRegistry, + StyleSheet, + Text, + View +} from 'react-native'; + +class HelloWorld extends React.Component { + render() { + return ( + + Hello, World + This one came from RN + + ) + } +} +var styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + }, + hello: { + fontSize: 20, + textAlign: 'center', + margin: 10, + }, +}); + +AppRegistry.registerComponent('HelloWorld', () => HelloWorld); diff --git a/package.json b/package.json new file mode 100644 index 0000000..7af756b --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "bukaanalytics", + "version": "0.0.1", + "description": "This Repo contains BukaAnalytics app code. We use native java code to build our app.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node node_modules/react-native/local-cli/cli.js start" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/bukaanalytics/app.git" + }, + "author": "Habib", + "license": "ISC", + "bugs": { + "url": "https://github.com/bukaanalytics/app/issues" + }, + "homepage": "https://github.com/bukaanalytics/app#readme", + "dependencies": { + "react": "^15.4.2", + "react-native": "^0.39.2" + } +} From 090dc1fbb389379f7f992891c3aa9a2eb01b3075 Mon Sep 17 00:00:00 2001 From: Habib Ridho Date: Thu, 4 May 2017 10:20:34 +0700 Subject: [PATCH 02/76] add RN menu --- app/build.gradle | 3 +++ app/src/main/java/com/github/bukaanalytics/MainActivity.java | 5 +++-- app/src/main/res/menu/activity_main_drawer.xml | 4 ++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d2c424f..7b7a69a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,6 +10,9 @@ android { versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + ndk { + abiFilters "armeabi-v7a", "x86" + } } buildTypes { release { diff --git a/app/src/main/java/com/github/bukaanalytics/MainActivity.java b/app/src/main/java/com/github/bukaanalytics/MainActivity.java index b93df6e..89e3e33 100644 --- a/app/src/main/java/com/github/bukaanalytics/MainActivity.java +++ b/app/src/main/java/com/github/bukaanalytics/MainActivity.java @@ -111,7 +111,9 @@ public boolean onNavigationItemSelected(MenuItem item) { fragmentclass = FragmentHome.class; } else if (id == R.id.nav_pricing) { fragmentclass = FragmentPricing.class; - } else if (id == R.id.nav_bidding) { + } else if(id == R.id.nav_bidding) { + fragmentclass = FragmentBidding.class; + } else if (id == R.id.nav_rn) { Intent intent = new Intent(this, MyReactActivity.class); this.startActivity(intent); @@ -121,7 +123,6 @@ public boolean onNavigationItemSelected(MenuItem item) { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; - // fragmentclass = FragmentBidding.class; } else { fragmentclass = FragmentHome.class; } diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index dd3e2a1..1c8c224 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -14,6 +14,10 @@ android:id="@+id/nav_bidding" android:icon="@drawable/ic_bukaanalytics_bidding" android:title="Bidding" /> + From e58fa552c4861631d77f2b4d04ecf3f76097f4d2 Mon Sep 17 00:00:00 2001 From: fawwaz Date: Thu, 4 May 2017 21:46:24 +0700 Subject: [PATCH 03/76] Ignoring node_modules folder to match RN --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 1d0e462..a51ab8f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ /captures .externalNativeBuild +# RN +node_modules # Below created by gitignore # Created by https://www.gitignore.io/api/android,androidstudio From 2cd97b4230b03e6c05437f82d32d243fe3b9c17a Mon Sep 17 00:00:00 2001 From: fawwaz Date: Thu, 4 May 2017 22:53:11 +0700 Subject: [PATCH 04/76] working widget but still over 30 minutes --- app/src/main/AndroidManifest.xml | 9 +++++ .../BukaAnalyticsAppWidgetProvider.java | 40 +++++++++++++++++++ app/src/main/res/layout/widget.xml | 22 ++++++++++ app/src/main/res/xml/widget_info.xml | 10 +++++ 4 files changed, 81 insertions(+) create mode 100644 app/src/main/java/com/github/bukaanalytics/widget/BukaAnalyticsAppWidgetProvider.java create mode 100644 app/src/main/res/layout/widget.xml create mode 100644 app/src/main/res/xml/widget_info.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 51d2f6e..aefbf01 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,15 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> + + + + + + + + +> + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/widget_info.xml b/app/src/main/res/xml/widget_info.xml new file mode 100644 index 0000000..597decd --- /dev/null +++ b/app/src/main/res/xml/widget_info.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file From c5beae523a7172487c473c480a88307314f294ad Mon Sep 17 00:00:00 2001 From: fawwaz Date: Sat, 6 May 2017 00:09:22 +0700 Subject: [PATCH 05/76] finished working bacgkround service example and sql --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 20 +++ .../github/bukaanalytics/MainActivity.java | 31 +++++ .../BukaAnalyticsBroadcastReceiver.java | 20 +++ .../common/BukaAnalyticsIntentService.java | 61 +++++++++ ...BukaAnalyticsWakefulBroadcastReceiver.java | 18 +++ .../model/BukaAnalyticsSqliteOpenHelper.java | 121 ++++++++++++++++++ .../bukaanalytics/common/model/Post.java | 9 ++ .../bukaanalytics/home/FragmentHome.java | 27 +++- 9 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsBroadcastReceiver.java create mode 100644 app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsIntentService.java create mode 100644 app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsWakefulBroadcastReceiver.java create mode 100644 app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java create mode 100644 app/src/main/java/com/github/bukaanalytics/common/model/Post.java diff --git a/app/build.gradle b/app/build.gradle index b9772f9..9355a64 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,6 +24,7 @@ dependencies { androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) + compile 'com.koushikdutta.ion:ion:2.+' compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support:support-v4:25.3.1' compile 'com.android.support:design:25.3.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 51d2f6e..d177753 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,10 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/github/bukaanalytics/MainActivity.java b/app/src/main/java/com/github/bukaanalytics/MainActivity.java index 4c1e67f..12ccd82 100644 --- a/app/src/main/java/com/github/bukaanalytics/MainActivity.java +++ b/app/src/main/java/com/github/bukaanalytics/MainActivity.java @@ -1,5 +1,9 @@ package com.github.bukaanalytics; +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; import android.net.Uri; import android.support.v4.app.Fragment; import android.os.Bundle; @@ -16,6 +20,7 @@ import android.view.MenuItem; import com.github.bukaanalytics.biddingtools.FragmentBidding; +import com.github.bukaanalytics.common.BukaAnalyticsBroadcastReceiver; import com.github.bukaanalytics.home.FragmentHome; import com.github.bukaanalytics.pricingtools.FragmentPricing; @@ -62,6 +67,8 @@ protected void onCreate(Bundle savedInstanceState) { _navview = (NavigationView) findViewById(R.id.nav_view); _navview.setNavigationItemSelectedListener(this); + + scheduleAlarm(); } @Override @@ -137,4 +144,28 @@ public boolean onNavigationItemSelected(MenuItem item) { public void onFragmentInteraction(Uri uri) { } + + private void scheduleAlarm () { + // Construct an intent that will execute the AlarmReceiver + Intent intent = new Intent(getApplicationContext(), BukaAnalyticsBroadcastReceiver.class); + // Create a PendingIntent to be triggered when the alarm goes off + final PendingIntent pIntent = PendingIntent.getBroadcast( + this, BukaAnalyticsBroadcastReceiver.REQUEST_CODE, + intent, PendingIntent.FLAG_UPDATE_CURRENT); + // Setup periodic alarm every every half hour from this point onwards + long firstMillis = System.currentTimeMillis(); // alarm is set right away + AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); + // First parameter is the type: ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC_WAKEUP + // Interval can be INTERVAL_FIFTEEN_MINUTES, INTERVAL_HALF_HOUR, INTERVAL_HOUR, INTERVAL_DAY + alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis, + AlarmManager.INTERVAL_HALF_HOUR, pIntent); + } + + public void cancelAlarm() { + Intent intent = new Intent(getApplicationContext(), BukaAnalyticsBroadcastReceiver.class); + final PendingIntent pIntent = PendingIntent.getBroadcast(this, BukaAnalyticsBroadcastReceiver.REQUEST_CODE, + intent, PendingIntent.FLAG_UPDATE_CURRENT); + AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); + alarm.cancel(pIntent); + } } diff --git a/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsBroadcastReceiver.java b/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsBroadcastReceiver.java new file mode 100644 index 0000000..66e9af8 --- /dev/null +++ b/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsBroadcastReceiver.java @@ -0,0 +1,20 @@ +package com.github.bukaanalytics.common; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +/** + * Created by fawwaz.muhammad on 05/05/17. + */ + +public class BukaAnalyticsBroadcastReceiver extends BroadcastReceiver { + public static final int REQUEST_CODE = 12345; + public static final String ACTION = "com.github.bukaanalytics.checkapi"; + + @Override + public void onReceive(Context context, Intent intent) { + Intent i = new Intent(context, BukaAnalyticsIntentService.class); + context.startService(i); + } +} diff --git a/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsIntentService.java b/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsIntentService.java new file mode 100644 index 0000000..2f6e4c8 --- /dev/null +++ b/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsIntentService.java @@ -0,0 +1,61 @@ +package com.github.bukaanalytics.common; + +import android.app.IntentService; +import android.content.Intent; +import android.support.annotation.Nullable; +import android.support.v4.content.WakefulBroadcastReceiver; + +import com.github.bukaanalytics.common.model.BukaAnalyticsSqliteOpenHelper; +import com.github.bukaanalytics.common.model.Post; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.koushikdutta.async.future.FutureCallback; +import com.koushikdutta.ion.Ion; + +/** + * Created by fawwaz.muhammad on 05/05/17. + */ + +public class BukaAnalyticsIntentService extends IntentService { + public BukaAnalyticsIntentService() { + super("BukaAnalytics"); + } + + private void findTopStories() { + Ion.with(getApplicationContext()) + .load("https://hacker-news.firebaseio.com/v0/topstories.json") + .asJsonArray() + .setCallback(new FutureCallback() { + @Override + public void onCompleted(Exception e, JsonArray result) { + String topStoryId = result.get(0).getAsString(); + getStory(topStoryId); + } + }); + } + + private void getStory(String storyId){ + Ion.with(getApplicationContext()) + .load("https://hacker-news.firebaseio.com/v0/item/"+storyId+".json") + .asJsonObject() + .setCallback(new FutureCallback() { + @Override + public void onCompleted(Exception e, JsonObject result) { + String title = result.get("title").getAsString(); + + Post hnpost = new Post(); + hnpost.text = title; + + BukaAnalyticsSqliteOpenHelper db = BukaAnalyticsSqliteOpenHelper.getInstance(getApplicationContext()); + db.addPost(hnpost); + + } + }); + } + + @Override + protected void onHandleIntent(@Nullable Intent intent) { + findTopStories(); + WakefulBroadcastReceiver.completeWakefulIntent(intent); + } +} diff --git a/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsWakefulBroadcastReceiver.java b/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsWakefulBroadcastReceiver.java new file mode 100644 index 0000000..572c647 --- /dev/null +++ b/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsWakefulBroadcastReceiver.java @@ -0,0 +1,18 @@ +package com.github.bukaanalytics.common; + +import android.content.Context; +import android.content.Intent; +import android.support.v4.content.WakefulBroadcastReceiver; + +/** + * Created by fawwaz.muhammad on 05/05/17. + */ + +public class BukaAnalyticsWakefulBroadcastReceiver extends WakefulBroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + Intent i = new Intent(context, BukaAnalyticsIntentService.class); + startWakefulService(context,i); + } + +} diff --git a/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java b/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java new file mode 100644 index 0000000..1d73893 --- /dev/null +++ b/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java @@ -0,0 +1,121 @@ +package com.github.bukaanalytics.common.model; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by fawwaz.muhammad on 05/05/17. + */ + +public class BukaAnalyticsSqliteOpenHelper extends SQLiteOpenHelper { + // debugging only + private String TAG = "BukaAnalyticsSqliteOpenHelper"; + + // Database Info + private static final String DATABASE_NAME = "baDatabase"; + private static final int DATABASE_VERSION = 1; + + // Table Names + private static final String TABLE_POSTS = "posts"; + + // Post Table Columns + private static final String KEY_POST_ID = "id"; + private static final String KEY_POST_TEXT = "text"; + + // Instance + private static BukaAnalyticsSqliteOpenHelper sInstance; + + private BukaAnalyticsSqliteOpenHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + String CREATE_POSTS_TABLE = "CREATE TABLE " + TABLE_POSTS + + "(" + + KEY_POST_ID + " INTEGER PRIMARY KEY," + // Define a primary key + KEY_POST_TEXT + " TEXT" + + ")"; + db.execSQL(CREATE_POSTS_TABLE); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + if (oldVersion != newVersion) { + // Simplest implementation is to drop all old tables and recreate them + db.execSQL("DROP TABLE IF EXISTS " + TABLE_POSTS); + onCreate(db); + } + } + + public static synchronized BukaAnalyticsSqliteOpenHelper getInstance(Context context) { + // Use the application context, which will ensure that you + // don't accidentally leak an Activity's context. + // See this article for more information: http://bit.ly/6LRzfx + if (sInstance == null) { + sInstance = new BukaAnalyticsSqliteOpenHelper(context.getApplicationContext()); + } + return sInstance; + } + + public void addPost(Post post){ + SQLiteDatabase db = getWritableDatabase(); + + // It's a good idea to wrap our insert in a transaction. This helps with performance and ensures + // consistency of the database. + db.beginTransaction(); + try { + // The user might already exist in the database (i.e. the same user created multiple posts). + + ContentValues values = new ContentValues(); + values.put(KEY_POST_TEXT, post.text); + + // Notice how we haven't specified the primary key. SQLite auto increments the primary key column. + db.insertOrThrow(TABLE_POSTS, null, values); + db.setTransactionSuccessful(); + } catch (Exception e) { + Log.d(TAG, "Error while trying to add post to database"); + } finally { + db.endTransaction(); + } + } + + public List getAllPosts() { + List posts = new ArrayList<>(); + + // SELECT * FROM POSTS + // LEFT OUTER JOIN USERS + // ON POSTS.KEY_POST_USER_ID_FK = USERS.KEY_USER_ID + String POSTS_SELECT_QUERY = + String.format("SELECT * FROM %s ", TABLE_POSTS); + + // "getReadableDatabase()" and "getWriteableDatabase()" return the same object (except under low + // disk space scenarios) + SQLiteDatabase db = getReadableDatabase(); + Cursor cursor = db.rawQuery(POSTS_SELECT_QUERY, null); + try { + if (cursor.moveToFirst()) { + do { + Post newPost = new Post(); + newPost.text = cursor.getString(cursor.getColumnIndex(KEY_POST_TEXT)); + posts.add(newPost); + } while(cursor.moveToNext()); + } + } catch (Exception e) { + Log.d(TAG, "Error while trying to get posts from database"); + } finally { + if (cursor != null && !cursor.isClosed()) { + cursor.close(); + } + } + return posts; + } + +} diff --git a/app/src/main/java/com/github/bukaanalytics/common/model/Post.java b/app/src/main/java/com/github/bukaanalytics/common/model/Post.java new file mode 100644 index 0000000..661d96e --- /dev/null +++ b/app/src/main/java/com/github/bukaanalytics/common/model/Post.java @@ -0,0 +1,9 @@ +package com.github.bukaanalytics.common.model; + +/** + * Created by fawwaz.muhammad on 05/05/17. + */ + +public class Post { + public String text; +} diff --git a/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java b/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java index bd49998..3932603 100644 --- a/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java +++ b/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java @@ -3,12 +3,18 @@ import android.content.Context; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import com.github.bukaanalytics.R; +import com.github.bukaanalytics.common.model.BukaAnalyticsSqliteOpenHelper; +import com.github.bukaanalytics.common.model.Post; + +import java.util.List; /** * A simple {@link Fragment} subclass. @@ -59,13 +65,16 @@ public void onCreate(Bundle savedInstanceState) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } + + } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_home, container, false); + View view = inflater.inflate(R.layout.fragment_home, container, false); + return view; } // TODO: Rename method, update argument and hook method into UI event @@ -86,6 +95,22 @@ public void onAttach(Context context) { } } + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + BukaAnalyticsSqliteOpenHelper helper = BukaAnalyticsSqliteOpenHelper.getInstance(getContext()); + List posts = helper.getAllPosts(); + + StringBuffer sb = new StringBuffer(); + for (Post p : posts) { + sb.append(p.text + "\n"); + } + + TextView tv = (TextView) getView().findViewById(R.id.text_home); + tv.setText(sb.toString()); + + super.onActivityCreated(savedInstanceState); + } + @Override public void onDetach() { super.onDetach(); From eab6713171f8033037ade30c2d6dabf62f2c1a8f Mon Sep 17 00:00:00 2001 From: Habib Ridho Date: Sat, 6 May 2017 12:55:50 +0700 Subject: [PATCH 06/76] progress sqlite --- app/build.gradle | 1 + .../reactnative/MyReactActivity.java | 3 +++ index.android.js | 16 +++++++++++++++- jsconfig.json | 9 +++++++++ package.json | 3 ++- settings.gradle | 3 +++ 6 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 jsconfig.json diff --git a/app/build.gradle b/app/build.gradle index 6f3a92a..7b20f98 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,4 +37,5 @@ dependencies { compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' compile 'com.facebook.react:react-native:0.39.2' + compile project(':react-native-sqlite-storage') } diff --git a/app/src/main/java/com/github/bukaanalytics/reactnative/MyReactActivity.java b/app/src/main/java/com/github/bukaanalytics/reactnative/MyReactActivity.java index 1581d9f..fa1995a 100644 --- a/app/src/main/java/com/github/bukaanalytics/reactnative/MyReactActivity.java +++ b/app/src/main/java/com/github/bukaanalytics/reactnative/MyReactActivity.java @@ -11,6 +11,8 @@ import com.facebook.react.shell.MainReactPackage; import com.github.bukaanalytics.BuildConfig; +import org.pgsqlite.SQLitePluginPackage; + /** * Created by habibridho on 5/4/17. */ @@ -29,6 +31,7 @@ protected void onCreate(Bundle savedInstanceState) { .setBundleAssetName("index.android.bundle") .setJSMainModuleName("index.android") .addPackage(new MainReactPackage()) + .addPackage(new SQLitePluginPackage()) .setUseDeveloperSupport(BuildConfig.DEBUG) .setInitialLifecycleState( LifecycleState.RESUMED) diff --git a/index.android.js b/index.android.js index 0d17c7e..787f987 100644 --- a/index.android.js +++ b/index.android.js @@ -7,13 +7,27 @@ import { Text, View } from 'react-native'; +import SQLite from 'react-native-sqlite-storage' class HelloWorld extends React.Component { + + componentDidMount() { + let db = SQLite.openDatabase({name: 'baDatabase'}, () => { + // alert('connected') + }) + + db.executeSql("SELECT * FROM posts", [], (t, r) => { + // console.log(t.rows) + let result = t.rows.item(0) + console.log(result) + }) + } + render() { return ( Hello, World - This one came from RN + This one came from RN ) } diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..c98b6e0 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "allowJs": true, + "allowSyntheticDefaultImports": true + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/package.json b/package.json index 7af756b..337b5ca 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "homepage": "https://github.com/bukaanalytics/app#readme", "dependencies": { "react": "^15.4.2", - "react-native": "^0.39.2" + "react-native": "^0.39.2", + "react-native-sqlite-storage": "^3.3.1" } } diff --git a/settings.gradle b/settings.gradle index e7b4def..56ba0c1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,4 @@ include ':app' + +include ':react-native-sqlite-storage' +project(':react-native-sqlite-storage').projectDir = new File(rootProject.projectDir, 'node_modules/react-native-sqlite-storage/src/android') From e941dc5596a36f3ad9463ae562200d54868fee0f Mon Sep 17 00:00:00 2001 From: Aldi Doanta Kurnia Date: Sat, 6 May 2017 21:58:36 +0700 Subject: [PATCH 07/76] Add initial sqlite wrapper, add Product and Stat model --- .../model/BukaAnalyticsSqliteOpenHelper.java | 123 ++++++++++++++++++ .../bukaanalytics/common/model/Product.java | 10 ++ .../bukaanalytics/common/model/Stat.java | 15 +++ 3 files changed, 148 insertions(+) create mode 100644 app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java create mode 100644 app/src/main/java/com/github/bukaanalytics/common/model/Product.java create mode 100644 app/src/main/java/com/github/bukaanalytics/common/model/Stat.java diff --git a/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java b/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java new file mode 100644 index 0000000..726b63d --- /dev/null +++ b/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java @@ -0,0 +1,123 @@ +package com.github.bukaanalytics.common.model; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by fawwaz.muhammad on 05/05/17. + */ + +public class BukaAnalyticsSqliteOpenHelper extends SQLiteOpenHelper { + // debugging only + private String TAG = "BukaAnalyticsSqliteOpenHelper"; + + // Database Info + private static final String DATABASE_NAME = "baDatabase"; + private static final int DATABASE_VERSION = 1; + + // Table Names + private static final String TABLE_POSTS = "posts"; + + // Post Table Columns + private static final String KEY_POST_ID = "id"; + private static final String KEY_POST_TEXT = "text"; + + // Instance + private static BukaAnalyticsSqliteOpenHelper sInstance; + + private BukaAnalyticsSqliteOpenHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + String CREATE_POSTS_TABLE = "CREATE TABLE " + TABLE_POSTS + + "(" + + KEY_POST_ID + " INTEGER PRIMARY KEY," + // Define a primary key + KEY_POST_TEXT + " TEXT" + + ")"; + db.execSQL(CREATE_POSTS_TABLE); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + if (oldVersion != newVersion) { + // Simplest implementation is to drop all old tables and recreate them + db.execSQL("DROP TABLE IF EXISTS " + TABLE_POSTS); + onCreate(db); + } + } + + public static synchronized BukaAnalyticsSqliteOpenHelper getInstance(Context context) { + // Use the application context, which will ensure that you + // don't accidentally leak an Activity's context. + // See this article for more information: http://bit.ly/6LRzfx + if (sInstance == null) { + sInstance = new BukaAnalyticsSqliteOpenHelper(context.getApplicationContext()); + } + return sInstance; + } + + public void addProduct + + public void addPost(Post post){ + SQLiteDatabase db = getWritableDatabase(); + + // It's a good idea to wrap our insert in a transaction. This helps with performance and ensures + // consistency of the database. + db.beginTransaction(); + try { + // The user might already exist in the database (i.e. the same user created multiple posts). + + ContentValues values = new ContentValues(); + values.put(KEY_POST_TEXT, post.text); + + // Notice how we haven't specified the primary key. SQLite auto increments the primary key column. + db.insertOrThrow(TABLE_POSTS, null, values); + db.setTransactionSuccessful(); + } catch (Exception e) { + Log.d(TAG, "Error while trying to add post to database"); + } finally { + db.endTransaction(); + } + } + + public List getAllPosts() { + List posts = new ArrayList<>(); + + // SELECT * FROM POSTS + // LEFT OUTER JOIN USERS + // ON POSTS.KEY_POST_USER_ID_FK = USERS.KEY_USER_ID + String POSTS_SELECT_QUERY = + String.format("SELECT * FROM %s ", TABLE_POSTS); + + // "getReadableDatabase()" and "getWriteableDatabase()" return the same object (except under low + // disk space scenarios) + SQLiteDatabase db = getReadableDatabase(); + Cursor cursor = db.rawQuery(POSTS_SELECT_QUERY, null); + try { + if (cursor.moveToFirst()) { + do { + Post newPost = new Post(); + newPost.text = cursor.getString(cursor.getColumnIndex(KEY_POST_TEXT)); + posts.add(newPost); + } while(cursor.moveToNext()); + } + } catch (Exception e) { + Log.d(TAG, "Error while trying to get posts from database"); + } finally { + if (cursor != null && !cursor.isClosed()) { + cursor.close(); + } + } + return posts; + } + +} diff --git a/app/src/main/java/com/github/bukaanalytics/common/model/Product.java b/app/src/main/java/com/github/bukaanalytics/common/model/Product.java new file mode 100644 index 0000000..ab8ab65 --- /dev/null +++ b/app/src/main/java/com/github/bukaanalytics/common/model/Product.java @@ -0,0 +1,10 @@ +package com.github.bukaanalytics.common.model; + +/** + * Created by touchtenmac-19 on 5/6/17. + */ + +public class Product { + public String id; + public String name; +} diff --git a/app/src/main/java/com/github/bukaanalytics/common/model/Stat.java b/app/src/main/java/com/github/bukaanalytics/common/model/Stat.java new file mode 100644 index 0000000..68b55aa --- /dev/null +++ b/app/src/main/java/com/github/bukaanalytics/common/model/Stat.java @@ -0,0 +1,15 @@ +package com.github.bukaanalytics.common.model; + +import java.util.Date; + +/** + * Created by touchtenmac-19 on 5/6/17. + */ + +public class Stat { + public Date date; + public String dayName; + public String productId; + public int viewCount; + public int totalViewCount; +} From 32ce304db4496b0938115dd56dec0bf071092d16 Mon Sep 17 00:00:00 2001 From: Aldi Doanta Kurnia Date: Sat, 6 May 2017 22:22:10 +0700 Subject: [PATCH 08/76] Refactor helper code --- .../model/BukaAnalyticsSqliteOpenHelper.java | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java b/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java index 726b63d..558e9ce 100644 --- a/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java +++ b/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java @@ -16,18 +16,18 @@ public class BukaAnalyticsSqliteOpenHelper extends SQLiteOpenHelper { // debugging only - private String TAG = "BukaAnalyticsSqliteOpenHelper"; + private String TAG = "BASqliteOpenHelper"; // Database Info private static final String DATABASE_NAME = "baDatabase"; private static final int DATABASE_VERSION = 1; // Table Names - private static final String TABLE_POSTS = "posts"; + private static final String TABLE_PRODUCTS = "products"; - // Post Table Columns - private static final String KEY_POST_ID = "id"; - private static final String KEY_POST_TEXT = "text"; + // Product Table Columns + private static final String KEY_PRODUCT_ID = "id"; + private static final String KEY_PRODUCT_NAME = "name"; // Instance private static BukaAnalyticsSqliteOpenHelper sInstance; @@ -38,10 +38,10 @@ private BukaAnalyticsSqliteOpenHelper(Context context) { @Override public void onCreate(SQLiteDatabase db) { - String CREATE_POSTS_TABLE = "CREATE TABLE " + TABLE_POSTS + + String CREATE_POSTS_TABLE = "CREATE TABLE " + TABLE_PRODUCTS + "(" + - KEY_POST_ID + " INTEGER PRIMARY KEY," + // Define a primary key - KEY_POST_TEXT + " TEXT" + + KEY_PRODUCT_ID + " STRING PRIMARY KEY," + // Define a primary key + KEY_PRODUCT_NAME + " TEXT" + ")"; db.execSQL(CREATE_POSTS_TABLE); } @@ -50,7 +50,7 @@ public void onCreate(SQLiteDatabase db) { public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion != newVersion) { // Simplest implementation is to drop all old tables and recreate them - db.execSQL("DROP TABLE IF EXISTS " + TABLE_POSTS); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_PRODUCTS); onCreate(db); } } @@ -65,22 +65,19 @@ public static synchronized BukaAnalyticsSqliteOpenHelper getInstance(Context con return sInstance; } - public void addProduct - - public void addPost(Post post){ + public void addProduct(Product product){ SQLiteDatabase db = getWritableDatabase(); // It's a good idea to wrap our insert in a transaction. This helps with performance and ensures // consistency of the database. db.beginTransaction(); try { - // The user might already exist in the database (i.e. the same user created multiple posts). - ContentValues values = new ContentValues(); - values.put(KEY_POST_TEXT, post.text); + values.put(KEY_PRODUCT_ID, product.id); + values.put(KEY_PRODUCT_NAME, product.name); // Notice how we haven't specified the primary key. SQLite auto increments the primary key column. - db.insertOrThrow(TABLE_POSTS, null, values); + db.insertOrThrow(TABLE_PRODUCTS, null, values); db.setTransactionSuccessful(); } catch (Exception e) { Log.d(TAG, "Error while trying to add post to database"); @@ -89,25 +86,26 @@ public void addPost(Post post){ } } - public List getAllPosts() { - List posts = new ArrayList<>(); + public List getAllPosts() { + List posts = new ArrayList<>(); // SELECT * FROM POSTS // LEFT OUTER JOIN USERS // ON POSTS.KEY_POST_USER_ID_FK = USERS.KEY_USER_ID - String POSTS_SELECT_QUERY = - String.format("SELECT * FROM %s ", TABLE_POSTS); + String PRODUCTS_SELECT_QUERY = + String.format("SELECT * FROM %s ", TABLE_PRODUCTS); // "getReadableDatabase()" and "getWriteableDatabase()" return the same object (except under low // disk space scenarios) SQLiteDatabase db = getReadableDatabase(); - Cursor cursor = db.rawQuery(POSTS_SELECT_QUERY, null); + Cursor cursor = db.rawQuery(PRODUCTS_SELECT_QUERY, null); try { if (cursor.moveToFirst()) { do { - Post newPost = new Post(); - newPost.text = cursor.getString(cursor.getColumnIndex(KEY_POST_TEXT)); - posts.add(newPost); + Product newProduct = new Product(); + newProduct.name = cursor.getString(cursor.getColumnIndex(KEY_PRODUCT_NAME)); + newProduct.id = cursor.getString(cursor.getColumnIndex(KEY_PRODUCT_ID)); + posts.add(newProduct); } while(cursor.moveToNext()); } } catch (Exception e) { From 68f52632f18a216f8b47abd568b7a220974b9860 Mon Sep 17 00:00:00 2001 From: Aldi Doanta Kurnia Date: Sat, 6 May 2017 22:38:36 +0700 Subject: [PATCH 09/76] FrgamentHome: show all products --- .../model/BukaAnalyticsSqliteOpenHelper.java | 2 +- .../bukaanalytics/home/FragmentHome.java | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java b/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java index 558e9ce..89191e9 100644 --- a/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java +++ b/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java @@ -86,7 +86,7 @@ public void addProduct(Product product){ } } - public List getAllPosts() { + public List getAllProducts() { List posts = new ArrayList<>(); // SELECT * FROM POSTS diff --git a/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java b/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java index bd49998..1c4059f 100644 --- a/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java +++ b/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java @@ -3,12 +3,18 @@ import android.content.Context; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import com.github.bukaanalytics.R; +import com.github.bukaanalytics.common.model.BukaAnalyticsSqliteOpenHelper; +import com.github.bukaanalytics.common.model.Product; + +import java.util.List; /** * A simple {@link Fragment} subclass. @@ -68,6 +74,22 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, return inflater.inflate(R.layout.fragment_home, container, false); } + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + BukaAnalyticsSqliteOpenHelper helper = BukaAnalyticsSqliteOpenHelper.getInstance(getContext()); + List posts = helper.getAllProducts(); + + StringBuffer sb = new StringBuffer(); + for (Product p : posts) { + sb.append(p.name + "\n"); + } + + TextView tv = (TextView) getView().findViewById(R.id.text_home); + tv.setText(sb.toString()); + + super.onActivityCreated(savedInstanceState); + } + // TODO: Rename method, update argument and hook method into UI event public void onButtonPressed(Uri uri) { if (mListener != null) { From bcdda13eb9a158524b108be4cafeb36a46a10aca Mon Sep 17 00:00:00 2001 From: Aldi Doanta Kurnia Date: Sun, 7 May 2017 00:11:14 +0700 Subject: [PATCH 10/76] Test storing product info using BL API --- app/build.gradle | 1 + .../common/BukaAnalyticsIntentService.java | 50 ++++++++++++++++++ .../model/BukaAnalyticsSqliteOpenHelper.java | 8 +-- .../bukaanalytics/common/model/Product.java | 7 +++ .../bukaanalytics/home/FragmentHome.java | 52 ++++++++++++++----- 5 files changed, 101 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsIntentService.java diff --git a/app/build.gradle b/app/build.gradle index b9772f9..9355a64 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,6 +24,7 @@ dependencies { androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) + compile 'com.koushikdutta.ion:ion:2.+' compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support:support-v4:25.3.1' compile 'com.android.support:design:25.3.1' diff --git a/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsIntentService.java b/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsIntentService.java new file mode 100644 index 0000000..1b9594b --- /dev/null +++ b/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsIntentService.java @@ -0,0 +1,50 @@ +package com.github.bukaanalytics.common; + +import android.app.IntentService; +import android.content.Intent; +import android.support.annotation.Nullable; + +import com.github.bukaanalytics.common.model.BukaAnalyticsSqliteOpenHelper; +import com.github.bukaanalytics.common.model.Product; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.koushikdutta.async.future.FutureCallback; +import com.koushikdutta.ion.Ion; + +/** + * Created by fawwaz.muhammad on 05/05/17. + */ + +public class BukaAnalyticsIntentService extends IntentService { + public BukaAnalyticsIntentService() { + super("BukaAnalytics"); + } + + private void addProducts() { +// Ion.with(getApplicationContext()) +// .load("https://api.bukalapak.com/v2/users/7183893/products.json") +// .asJsonObject() +// .setCallback(new FutureCallback() { +// @Override +// public void onCompleted(Exception e, JsonObject result) { +// JsonArray products = result.getAsJsonArray("products"); +// for (int i = 0; i < products.size(); i++) { +// JsonObject product = products.get(i).getAsJsonObject(); +// String id = product.get("id").getAsString(); +// String name = product.get("name").getAsString(); +// String sellerId = product.get("seller_id").getAsString(); +// +// Product newProduct = new Product(id, name, sellerId); +// BukaAnalyticsSqliteOpenHelper db = BukaAnalyticsSqliteOpenHelper.getInstance(getApplicationContext()); +// +// db.addProduct(newProduct); +// } +// } +// }); + } + + @Override + protected void onHandleIntent(@Nullable Intent intent) { + addProducts(); + } +} diff --git a/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java b/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java index 89191e9..05bf715 100644 --- a/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java +++ b/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java @@ -28,6 +28,7 @@ public class BukaAnalyticsSqliteOpenHelper extends SQLiteOpenHelper { // Product Table Columns private static final String KEY_PRODUCT_ID = "id"; private static final String KEY_PRODUCT_NAME = "name"; + private static final String KEY_PRODUCT_SELLERID = "sellerId"; // Instance private static BukaAnalyticsSqliteOpenHelper sInstance; @@ -75,6 +76,7 @@ public void addProduct(Product product){ ContentValues values = new ContentValues(); values.put(KEY_PRODUCT_ID, product.id); values.put(KEY_PRODUCT_NAME, product.name); + values.put(KEY_PRODUCT_SELLERID, product.sellerId); // Notice how we haven't specified the primary key. SQLite auto increments the primary key column. db.insertOrThrow(TABLE_PRODUCTS, null, values); @@ -102,9 +104,9 @@ public List getAllProducts() { try { if (cursor.moveToFirst()) { do { - Product newProduct = new Product(); - newProduct.name = cursor.getString(cursor.getColumnIndex(KEY_PRODUCT_NAME)); - newProduct.id = cursor.getString(cursor.getColumnIndex(KEY_PRODUCT_ID)); + Product newProduct = new Product(cursor.getString(cursor.getColumnIndex(KEY_PRODUCT_NAME)), + cursor.getString(cursor.getColumnIndex(KEY_PRODUCT_ID)), + cursor.getString(cursor.getColumnIndex(KEY_PRODUCT_SELLERID))); posts.add(newProduct); } while(cursor.moveToNext()); } diff --git a/app/src/main/java/com/github/bukaanalytics/common/model/Product.java b/app/src/main/java/com/github/bukaanalytics/common/model/Product.java index ab8ab65..588b8ff 100644 --- a/app/src/main/java/com/github/bukaanalytics/common/model/Product.java +++ b/app/src/main/java/com/github/bukaanalytics/common/model/Product.java @@ -7,4 +7,11 @@ public class Product { public String id; public String name; + public String sellerId; + + public Product(String _id, String _name, String _sellerId){ + id = _id; + name = _name; + sellerId = _sellerId; + } } diff --git a/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java b/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java index 1c4059f..622ec83 100644 --- a/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java +++ b/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java @@ -13,24 +13,28 @@ import com.github.bukaanalytics.R; import com.github.bukaanalytics.common.model.BukaAnalyticsSqliteOpenHelper; import com.github.bukaanalytics.common.model.Product; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.koushikdutta.async.future.FutureCallback; +import com.koushikdutta.ion.Ion; import java.util.List; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the - * {@link FragmentHome.OnFragmentInteractionListener} interface + * {@link FragmentHome.OnFragimentInteractionListener} interface * to handle interaction events. * Use the {@link FragmentHome#newInstance} factory method to * create an instance of this fragment. */ public class FragmentHome extends Fragment { - // TODO: Rename parameter arguments, choose names that match + // TODO: Rename parameter iarguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; - // TODO: Rename and change types of parameters + // TODO: Riename and change types of parameters private String mParam1; private String mParam2; @@ -44,7 +48,7 @@ public FragmentHome() { * Use this factory method to create a new instance of * this fragment using the provided parameters. * - * @param param1 Parameter 1. + * @param param1 Pairameter 1. * @param param2 Parameter 2. * @return A new instance of fragment FragmentHome. */ @@ -76,16 +80,36 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { - BukaAnalyticsSqliteOpenHelper helper = BukaAnalyticsSqliteOpenHelper.getInstance(getContext()); - List posts = helper.getAllProducts(); - - StringBuffer sb = new StringBuffer(); - for (Product p : posts) { - sb.append(p.name + "\n"); - } - - TextView tv = (TextView) getView().findViewById(R.id.text_home); - tv.setText(sb.toString()); + Ion.with(getContext()) + .load("https://api.bukalapak.com/v2/users/7183893/products.json") + .asJsonObject() + .setCallback(new FutureCallback() { + @Override + public void onCompleted(Exception e, JsonObject result) { + JsonArray products = result.getAsJsonArray("products"); + for (int i = 0; i < products.size(); i++) { + JsonObject product = products.get(i).getAsJsonObject(); + String id = product.get("id").getAsString(); + String name = product.get("name").getAsString(); + String sellerId = product.get("seller_id").getAsString(); + + Product newProduct = new Product(id, name, sellerId); + BukaAnalyticsSqliteOpenHelper db = BukaAnalyticsSqliteOpenHelper.getInstance(getContext()); + + db.addProduct(newProduct); + } + } + }); +// BukaAnalyticsSqliteOpenHelper helper = BukaAnalyticsSqliteOpenHelper.getInstance(getContext()); +// List posts = helper.getAllProducts(); +// +// StringBuffer sb = new StringBuffer(); +// for (Product p : posts) { +// sb.append(p.name + "\n"); +// }c +// +// TextView tv = (TextView) getView().findViewById(R.id.text_home); +// tv.setText(sb.toString()); super.onActivityCreated(savedInstanceState); } From 14fdd4c186017a64d211f3d3782686106cc37c70 Mon Sep 17 00:00:00 2001 From: fawwaz Date: Sun, 7 May 2017 10:10:45 +0700 Subject: [PATCH 11/76] Added date time text to enhance debugging process --- .../bukaanalytics/common/BukaAnalyticsIntentService.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsIntentService.java b/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsIntentService.java index 2f6e4c8..715353e 100644 --- a/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsIntentService.java +++ b/app/src/main/java/com/github/bukaanalytics/common/BukaAnalyticsIntentService.java @@ -12,6 +12,9 @@ import com.koushikdutta.async.future.FutureCallback; import com.koushikdutta.ion.Ion; +import java.text.SimpleDateFormat; +import java.util.Calendar; + /** * Created by fawwaz.muhammad on 05/05/17. */ @@ -43,8 +46,12 @@ private void getStory(String storyId){ public void onCompleted(Exception e, JsonObject result) { String title = result.get("title").getAsString(); + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMM-dd HH:mm"); + String time = sdf.format(calendar.getTime()); + Post hnpost = new Post(); - hnpost.text = title; + hnpost.text = time + " >> " + title; BukaAnalyticsSqliteOpenHelper db = BukaAnalyticsSqliteOpenHelper.getInstance(getApplicationContext()); db.addPost(hnpost); From f43566728f321b1ee8396903b101856391a13285 Mon Sep 17 00:00:00 2001 From: Aldi Doanta Kurnia Date: Sun, 7 May 2017 15:36:19 +0700 Subject: [PATCH 12/76] Working example of showing product names and product ids stored in local db --- .../model/BukaAnalyticsSqliteOpenHelper.java | 15 +++++++++---- .../bukaanalytics/home/FragmentHome.java | 21 +++++++++---------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java b/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java index 05bf715..2b384da 100644 --- a/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java +++ b/app/src/main/java/com/github/bukaanalytics/common/model/BukaAnalyticsSqliteOpenHelper.java @@ -3,6 +3,7 @@ import android.content.ContentValues; import android.content.Context; import android.database.Cursor; +import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; @@ -39,10 +40,12 @@ private BukaAnalyticsSqliteOpenHelper(Context context) { @Override public void onCreate(SQLiteDatabase db) { + Log.d(TAG, "onCreate: mau exec CREATE TABLE"); String CREATE_POSTS_TABLE = "CREATE TABLE " + TABLE_PRODUCTS + "(" + - KEY_PRODUCT_ID + " STRING PRIMARY KEY," + // Define a primary key - KEY_PRODUCT_NAME + " TEXT" + + KEY_PRODUCT_ID + " TEXT PRIMARY KEY," + // Define a primary key + KEY_PRODUCT_NAME + " TEXT," + + KEY_PRODUCT_SELLERID + " TEXT" + ")"; db.execSQL(CREATE_POSTS_TABLE); } @@ -81,8 +84,12 @@ public void addProduct(Product product){ // Notice how we haven't specified the primary key. SQLite auto increments the primary key column. db.insertOrThrow(TABLE_PRODUCTS, null, values); db.setTransactionSuccessful(); - } catch (Exception e) { - Log.d(TAG, "Error while trying to add post to database"); + } + catch (SQLException e) { + Log.d(TAG, "SQLException: " + e.getMessage()); + } + catch (Exception e) { + Log.d(TAG, "Error while trying to add post to database: " + e.getMessage()); } finally { db.endTransaction(); } diff --git a/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java b/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java index 622ec83..e87e232 100644 --- a/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java +++ b/app/src/main/java/com/github/bukaanalytics/home/FragmentHome.java @@ -80,6 +80,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { + final BukaAnalyticsSqliteOpenHelper db = BukaAnalyticsSqliteOpenHelper.getInstance(getContext()); Ion.with(getContext()) .load("https://api.bukalapak.com/v2/users/7183893/products.json") .asJsonObject() @@ -94,22 +95,20 @@ public void onCompleted(Exception e, JsonObject result) { String sellerId = product.get("seller_id").getAsString(); Product newProduct = new Product(id, name, sellerId); - BukaAnalyticsSqliteOpenHelper db = BukaAnalyticsSqliteOpenHelper.getInstance(getContext()); db.addProduct(newProduct); } } }); -// BukaAnalyticsSqliteOpenHelper helper = BukaAnalyticsSqliteOpenHelper.getInstance(getContext()); -// List posts = helper.getAllProducts(); -// -// StringBuffer sb = new StringBuffer(); -// for (Product p : posts) { -// sb.append(p.name + "\n"); -// }c -// -// TextView tv = (TextView) getView().findViewById(R.id.text_home); -// tv.setText(sb.toString()); + List posts = db.getAllProducts(); + + StringBuffer sb = new StringBuffer(); + for (Product p : posts) { + sb.append(p.id + " " + p.name + "\n"); + } + + TextView tv = (TextView) getView().findViewById(R.id.text_home); + tv.setText(sb.toString()); super.onActivityCreated(savedInstanceState); } From 88b4c53da202a7e6ab4d24006e9d79306f9f50cd Mon Sep 17 00:00:00 2001 From: Habib Ridho Date: Sun, 7 May 2017 22:15:32 +0700 Subject: [PATCH 13/76] minimum skeleton --- app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 10 +- .../github/bukaanalytics/MainApplication.java | 46 + index.android.js | 44 +- js-src/components/README.md | 17 + .../general/__snapshots__/error-test.js.snap | 291 ++++ .../__snapshots__/loading-test.js.snap | 100 ++ .../__snapshots__/placeholder-test.js.snap | 91 ++ .../__tests__/general/error-test.js | 25 + .../__tests__/general/loading-test.js | 25 + .../__tests__/general/placeholder-test.js | 25 + .../ui/__snapshots__/alerts-test.js.snap | 242 +++ .../ui/__snapshots__/button-test.js.snap | 1303 +++++++++++++++++ .../ui/__snapshots__/card-test.js.snap | 267 ++++ .../ui/__snapshots__/form-input-test.js.snap | 85 ++ .../ui/__snapshots__/form-label-test.js.snap | 55 + .../ui/__snapshots__/list-item-test.js.snap | 176 +++ .../ui/__snapshots__/list-test.js.snap | 341 +++++ .../ui/__snapshots__/tab-icon-test.js.snap | 49 + .../ui/__snapshots__/text-test.js.snap | 255 ++++ js-src/components/__tests__/ui/alerts-test.js | 41 + js-src/components/__tests__/ui/button-test.js | 92 ++ js-src/components/__tests__/ui/card-test.js | 33 + .../__tests__/ui/form-input-test.js | 17 + .../__tests__/ui/form-label-test.js | 17 + .../components/__tests__/ui/list-item-test.js | 22 + js-src/components/__tests__/ui/list-test.js | 20 + .../components/__tests__/ui/tab-icon-test.js | 17 + js-src/components/__tests__/ui/text-test.js | 73 + js-src/components/general/Error.js | 46 + js-src/components/general/Loading.js | 44 + js-src/components/general/Placeholder.js | 30 + js-src/components/general/WebView.js | 87 ++ js-src/components/package.json | 3 + js-src/components/ui/Alerts.js | 120 ++ js-src/components/ui/Button.js | 111 ++ js-src/components/ui/Card.js | 66 + js-src/components/ui/FormInput.js | 68 + js-src/components/ui/FormLabel.js | 52 + js-src/components/ui/List.js | 51 + js-src/components/ui/ListItem.js | 73 + js-src/components/ui/Spacer.js | 29 + js-src/components/ui/TabIcon.js | 27 + js-src/components/ui/Text.js | 70 + js-src/components/ui/index.js | 19 + js-src/components/ui/package.json | 3 + js-src/index.js | 46 + js-src/navigation/index.js | 32 + js-src/navigation/package.json | 3 + js-src/redux/index.js | 18 + js-src/redux/nav/reducer.js | 14 + js-src/redux/package.json | 3 + js-src/redux/user/actions.js | 6 + js-src/redux/user/reducer.js | 8 + js-src/screen/Example/ExampleContainer.js | 15 + js-src/screen/Example/ExampleView.js | 34 + js-src/screen/Home/HomeContainer.js | 14 + js-src/screen/Home/HomeView.js | 31 + js-src/screen/package.json | 3 + js-src/theme/colors.js | 46 + js-src/theme/fonts.js | 34 + js-src/theme/index.js | 13 + js-src/theme/package.json | 3 + js-src/theme/sizes.js | 33 + js-src/theme/styles.js | 244 +++ package.json | 21 +- settings.gradle | 2 + 67 files changed, 5258 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/com/github/bukaanalytics/MainApplication.java create mode 100644 js-src/components/README.md create mode 100644 js-src/components/__tests__/general/__snapshots__/error-test.js.snap create mode 100644 js-src/components/__tests__/general/__snapshots__/loading-test.js.snap create mode 100644 js-src/components/__tests__/general/__snapshots__/placeholder-test.js.snap create mode 100644 js-src/components/__tests__/general/error-test.js create mode 100644 js-src/components/__tests__/general/loading-test.js create mode 100644 js-src/components/__tests__/general/placeholder-test.js create mode 100644 js-src/components/__tests__/ui/__snapshots__/alerts-test.js.snap create mode 100644 js-src/components/__tests__/ui/__snapshots__/button-test.js.snap create mode 100644 js-src/components/__tests__/ui/__snapshots__/card-test.js.snap create mode 100644 js-src/components/__tests__/ui/__snapshots__/form-input-test.js.snap create mode 100644 js-src/components/__tests__/ui/__snapshots__/form-label-test.js.snap create mode 100644 js-src/components/__tests__/ui/__snapshots__/list-item-test.js.snap create mode 100644 js-src/components/__tests__/ui/__snapshots__/list-test.js.snap create mode 100644 js-src/components/__tests__/ui/__snapshots__/tab-icon-test.js.snap create mode 100644 js-src/components/__tests__/ui/__snapshots__/text-test.js.snap create mode 100644 js-src/components/__tests__/ui/alerts-test.js create mode 100644 js-src/components/__tests__/ui/button-test.js create mode 100644 js-src/components/__tests__/ui/card-test.js create mode 100644 js-src/components/__tests__/ui/form-input-test.js create mode 100644 js-src/components/__tests__/ui/form-label-test.js create mode 100644 js-src/components/__tests__/ui/list-item-test.js create mode 100644 js-src/components/__tests__/ui/list-test.js create mode 100644 js-src/components/__tests__/ui/tab-icon-test.js create mode 100644 js-src/components/__tests__/ui/text-test.js create mode 100644 js-src/components/general/Error.js create mode 100644 js-src/components/general/Loading.js create mode 100644 js-src/components/general/Placeholder.js create mode 100644 js-src/components/general/WebView.js create mode 100644 js-src/components/package.json create mode 100644 js-src/components/ui/Alerts.js create mode 100644 js-src/components/ui/Button.js create mode 100644 js-src/components/ui/Card.js create mode 100644 js-src/components/ui/FormInput.js create mode 100644 js-src/components/ui/FormLabel.js create mode 100644 js-src/components/ui/List.js create mode 100644 js-src/components/ui/ListItem.js create mode 100644 js-src/components/ui/Spacer.js create mode 100644 js-src/components/ui/TabIcon.js create mode 100644 js-src/components/ui/Text.js create mode 100644 js-src/components/ui/index.js create mode 100644 js-src/components/ui/package.json create mode 100644 js-src/index.js create mode 100644 js-src/navigation/index.js create mode 100644 js-src/navigation/package.json create mode 100644 js-src/redux/index.js create mode 100644 js-src/redux/nav/reducer.js create mode 100644 js-src/redux/package.json create mode 100644 js-src/redux/user/actions.js create mode 100644 js-src/redux/user/reducer.js create mode 100644 js-src/screen/Example/ExampleContainer.js create mode 100644 js-src/screen/Example/ExampleView.js create mode 100644 js-src/screen/Home/HomeContainer.js create mode 100644 js-src/screen/Home/HomeView.js create mode 100644 js-src/screen/package.json create mode 100644 js-src/theme/colors.js create mode 100644 js-src/theme/fonts.js create mode 100644 js-src/theme/index.js create mode 100644 js-src/theme/package.json create mode 100644 js-src/theme/sizes.js create mode 100644 js-src/theme/styles.js diff --git a/app/build.gradle b/app/build.gradle index 7b20f98..4814ace 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,8 @@ apply plugin: 'com.android.application' +apply from: "../node_modules/react-native/react.gradle" +apply from: "../node_modules/react-native-vector-icons/fonts.gradle" + android { compileSdkVersion 25 buildToolsVersion "25.0.2" @@ -36,6 +39,7 @@ dependencies { compile 'com.android.support:design:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' - compile 'com.facebook.react:react-native:0.39.2' + compile 'com.facebook.react:react-native:+' compile project(':react-native-sqlite-storage') + compile project(':react-native-vector-icons') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e61ee0b..efe0587 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ + + + + - - - - - diff --git a/app/src/main/java/com/github/bukaanalytics/MainApplication.java b/app/src/main/java/com/github/bukaanalytics/MainApplication.java new file mode 100644 index 0000000..685cb20 --- /dev/null +++ b/app/src/main/java/com/github/bukaanalytics/MainApplication.java @@ -0,0 +1,46 @@ +package com.github.bukaanalytics; + +/** + * Created by habibridho on 5/7/17. + */ + +import android.app.Application; + +import com.facebook.react.ReactApplication; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.shell.MainReactPackage; +import com.facebook.soloader.SoLoader; +import com.oblador.vectoricons.VectorIconsPackage; + +import java.util.Arrays; +import java.util.List; + +public class MainApplication extends Application implements ReactApplication { + + private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + return Arrays.asList( + new MainReactPackage(), + new VectorIconsPackage() + ); + } + }; + + @Override + public ReactNativeHost getReactNativeHost() { + return mReactNativeHost; + } + + @Override + public void onCreate() { + super.onCreate(); + SoLoader.init(this, /* native exopackage */ false); + } +} diff --git a/index.android.js b/index.android.js index 787f987..3a2f63a 100644 --- a/index.android.js +++ b/index.android.js @@ -1,47 +1,9 @@ 'use strict'; import React from 'react'; +import Root from './js-src/' import { - AppRegistry, - StyleSheet, - Text, - View + AppRegistry } from 'react-native'; -import SQLite from 'react-native-sqlite-storage' -class HelloWorld extends React.Component { - - componentDidMount() { - let db = SQLite.openDatabase({name: 'baDatabase'}, () => { - // alert('connected') - }) - - db.executeSql("SELECT * FROM posts", [], (t, r) => { - // console.log(t.rows) - let result = t.rows.item(0) - console.log(result) - }) - } - - render() { - return ( - - Hello, World - This one came from RN - - ) - } -} -var styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: 'center', - }, - hello: { - fontSize: 20, - textAlign: 'center', - margin: 10, - }, -}); - -AppRegistry.registerComponent('HelloWorld', () => HelloWorld); +AppRegistry.registerComponent('HelloWorld', () => Root); diff --git a/js-src/components/README.md b/js-src/components/README.md new file mode 100644 index 0000000..e72149b --- /dev/null +++ b/js-src/components/README.md @@ -0,0 +1,17 @@ +# Components + +This directory is used for React "Dumb-Components" which simply render elements to the screen and are ideally stateless (don't manipulate any state - instead uses props from a Container). + +They shouldn't know what's happening in Redux nor should they deal with business logic, API calls or general heavy lifting. + +## Grouping + +We've found grouping Components by their type (eg. `recipes`) is a great approach, especially when you start to get a lot of Components. This way, you can easily browse to what you looking for. + +## Naming conventions + +__Directories__ +All directories are lowercase, except for each [Container's](../containers/README.md) directory - which are Pascal Case. + +__Files__ +Components should be `Pascal Case`. diff --git a/js-src/components/__tests__/general/__snapshots__/error-test.js.snap b/js-src/components/__tests__/general/__snapshots__/error-test.js.snap new file mode 100644 index 0000000..2214e22 --- /dev/null +++ b/js-src/components/__tests__/general/__snapshots__/error-test.js.snap @@ -0,0 +1,291 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Error renders correctly 1`] = ` + + +  + + + + We can't find that + + + +`; + +exports[`Error w/ Try Again Button renders correctly 1`] = ` + + +  + + + + Woops, Something went wrong. + + + + + + Try again + + + + +`; diff --git a/js-src/components/__tests__/general/__snapshots__/loading-test.js.snap b/js-src/components/__tests__/general/__snapshots__/loading-test.js.snap new file mode 100644 index 0000000..f7051b3 --- /dev/null +++ b/js-src/components/__tests__/general/__snapshots__/loading-test.js.snap @@ -0,0 +1,100 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Loading renders correctly 1`] = ` + + + + +`; + +exports[`Loading w/ text renders correctly 1`] = ` + + + + + Checking for Updates + + +`; diff --git a/js-src/components/__tests__/general/__snapshots__/placeholder-test.js.snap b/js-src/components/__tests__/general/__snapshots__/placeholder-test.js.snap new file mode 100644 index 0000000..63516c1 --- /dev/null +++ b/js-src/components/__tests__/general/__snapshots__/placeholder-test.js.snap @@ -0,0 +1,91 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Placeholder renders correctly 1`] = ` + + + Coming soon... + + +`; + +exports[`Placeholder w/ Text renders correctly 1`] = ` + + + Hello world! + + +`; diff --git a/js-src/components/__tests__/general/error-test.js b/js-src/components/__tests__/general/error-test.js new file mode 100644 index 0000000..cd50c4d --- /dev/null +++ b/js-src/components/__tests__/general/error-test.js @@ -0,0 +1,25 @@ +/** + * Test to check if the component renders correctly + */ +/* global it expect */ +import { Alert } from 'react-native'; +import React from 'react'; +import renderer from 'react-test-renderer'; + +import Error from '@components/general/Error'; + +it('Error renders correctly', () => { + const tree = renderer.create( + , + ).toJSON(); + + expect(tree).toMatchSnapshot(); +}); + +it('Error w/ Try Again Button renders correctly', () => { + const tree = renderer.create( + { Alert.alert('Hey there'); }} />, + ).toJSON(); + + expect(tree).toMatchSnapshot(); +}); diff --git a/js-src/components/__tests__/general/loading-test.js b/js-src/components/__tests__/general/loading-test.js new file mode 100644 index 0000000..6748a6b --- /dev/null +++ b/js-src/components/__tests__/general/loading-test.js @@ -0,0 +1,25 @@ +/** + * Test to check if the component renders correctly + */ +/* global it expect */ +import 'react-native'; +import React from 'react'; +import renderer from 'react-test-renderer'; + +import Loading from '@components/general/Loading'; + +it('Loading renders correctly', () => { + const tree = renderer.create( + , + ).toJSON(); + + expect(tree).toMatchSnapshot(); +}); + +it('Loading w/ text renders correctly', () => { + const tree = renderer.create( + , + ).toJSON(); + + expect(tree).toMatchSnapshot(); +}); diff --git a/js-src/components/__tests__/general/placeholder-test.js b/js-src/components/__tests__/general/placeholder-test.js new file mode 100644 index 0000000..9017086 --- /dev/null +++ b/js-src/components/__tests__/general/placeholder-test.js @@ -0,0 +1,25 @@ +/** + * Test to check if the component renders correctly + */ +/* global it expect */ +import 'react-native'; +import React from 'react'; +import renderer from 'react-test-renderer'; + +import Placeholder from '@components/general/Placeholder'; + +it('Placeholder renders correctly', () => { + const tree = renderer.create( + , + ).toJSON(); + + expect(tree).toMatchSnapshot(); +}); + +it('Placeholder w/ Text renders correctly', () => { + const tree = renderer.create( + , + ).toJSON(); + + expect(tree).toMatchSnapshot(); +}); diff --git a/js-src/components/__tests__/ui/__snapshots__/alerts-test.js.snap b/js-src/components/__tests__/ui/__snapshots__/alerts-test.js.snap new file mode 100644 index 0000000..8f08f47 --- /dev/null +++ b/js-src/components/__tests__/ui/__snapshots__/alerts-test.js.snap @@ -0,0 +1,242 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Alerts (Error) renders correctly 1`] = ` + + + + + Error hey + + + + + +`; + +exports[`Alerts (Status) renders correctly 1`] = ` + + + + + Something's happening... + + + + + +`; + +exports[`Alerts (Sucess) renders correctly 1`] = ` + + + + + Hello Success + + + + + +`; + +exports[`Alerts (empty) renders correctly 1`] = ` + +`; diff --git a/js-src/components/__tests__/ui/__snapshots__/button-test.js.snap b/js-src/components/__tests__/ui/__snapshots__/button-test.js.snap new file mode 100644 index 0000000..e8b828c --- /dev/null +++ b/js-src/components/__tests__/ui/__snapshots__/button-test.js.snap @@ -0,0 +1,1303 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Button renders correctly 1`] = ` + + + + Coming Soon... + + + +`; + +exports[`Button with Icon renders correctly 1`] = ` + + + +  + + + Coming Soon... + + + +`; + +exports[`Button with Text renders correctly 1`] = ` + + + + Test Button + + + +`; + +exports[`Button with onPress renders correctly 1`] = ` + + + + Coming Soon... + + + +`; + +exports[`Large Button renders correctly 1`] = ` + + + + Coming Soon... + + + +`; + +exports[`Large Button with Icon renders correctly 1`] = ` + + + +  + + + Coming Soon... + + + +`; + +exports[`Outlined Button renders correctly 1`] = ` + + + + Coming Soon... + + + +`; + +exports[`Outlined Button with Icon renders correctly 1`] = ` + + + +  + + + Coming Soon... + + + +`; + +exports[`Small Button renders correctly 1`] = ` + + + + Coming Soon... + + + +`; + +exports[`Small Button with Icon renders correctly 1`] = ` + + + +  + + + Coming Soon... + + + +`; diff --git a/js-src/components/__tests__/ui/__snapshots__/card-test.js.snap b/js-src/components/__tests__/ui/__snapshots__/card-test.js.snap new file mode 100644 index 0000000..cb688a8 --- /dev/null +++ b/js-src/components/__tests__/ui/__snapshots__/card-test.js.snap @@ -0,0 +1,267 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Card renders correctly 1`] = ` + + + + Hello world + + + +`; + +exports[`Card w/ Image renders correctly 1`] = ` + + + + + + + Hello world + + + + + +`; + +exports[`Card w/ Title renders correctly 1`] = ` + + + + + With Title + + + + + Hello world + + + +`; diff --git a/js-src/components/__tests__/ui/__snapshots__/form-input-test.js.snap b/js-src/components/__tests__/ui/__snapshots__/form-input-test.js.snap new file mode 100644 index 0000000..c92c6ba --- /dev/null +++ b/js-src/components/__tests__/ui/__snapshots__/form-input-test.js.snap @@ -0,0 +1,85 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`FormInput renders correctly 1`] = ` + + + +`; diff --git a/js-src/components/__tests__/ui/__snapshots__/form-label-test.js.snap b/js-src/components/__tests__/ui/__snapshots__/form-label-test.js.snap new file mode 100644 index 0000000..0656877 --- /dev/null +++ b/js-src/components/__tests__/ui/__snapshots__/form-label-test.js.snap @@ -0,0 +1,55 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`FormLabel renders correctly 1`] = ` + + + John Smith + + +`; diff --git a/js-src/components/__tests__/ui/__snapshots__/list-item-test.js.snap b/js-src/components/__tests__/ui/__snapshots__/list-item-test.js.snap new file mode 100644 index 0000000..db91b24 --- /dev/null +++ b/js-src/components/__tests__/ui/__snapshots__/list-item-test.js.snap @@ -0,0 +1,176 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ListItem renders correctly 1`] = ` + + + + + + + Hello world + + + + + + + + + +  + + + + + +`; diff --git a/js-src/components/__tests__/ui/__snapshots__/list-test.js.snap b/js-src/components/__tests__/ui/__snapshots__/list-test.js.snap new file mode 100644 index 0000000..92e3247 --- /dev/null +++ b/js-src/components/__tests__/ui/__snapshots__/list-test.js.snap @@ -0,0 +1,341 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`List renders correctly 1`] = ` + + + + + + + Hello + + + + + + + + + +  + + + + + + + + + + + Second + + + + + + + + + +  + + + + + + +`; diff --git a/js-src/components/__tests__/ui/__snapshots__/tab-icon-test.js.snap b/js-src/components/__tests__/ui/__snapshots__/tab-icon-test.js.snap new file mode 100644 index 0000000..8c1516f --- /dev/null +++ b/js-src/components/__tests__/ui/__snapshots__/tab-icon-test.js.snap @@ -0,0 +1,49 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`TabIcon renders correctly 1`] = ` + + +  + + +`; diff --git a/js-src/components/__tests__/ui/__snapshots__/text-test.js.snap b/js-src/components/__tests__/ui/__snapshots__/text-test.js.snap new file mode 100644 index 0000000..9f18b24 --- /dev/null +++ b/js-src/components/__tests__/ui/__snapshots__/text-test.js.snap @@ -0,0 +1,255 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Text H1 renders correctly 1`] = ` + + Hey Now... + +`; + +exports[`Text H1 with Link renders correctly 1`] = ` + + Hey Now... + +`; + +exports[`Text H2 renders correctly 1`] = ` + + Hey Now... + +`; + +exports[`Text H3 renders correctly 1`] = ` + + Hey Now... + +`; + +exports[`Text H4 renders correctly 1`] = ` + + Hey Now... + +`; + +exports[`Text H5 renders correctly 1`] = ` + + Hey Now... + +`; + +exports[`Text P renders correctly 1`] = ` + + Hey Now... + +`; + +exports[`Text renders correctly 1`] = ` + + Hey Now... + +`; diff --git a/js-src/components/__tests__/ui/alerts-test.js b/js-src/components/__tests__/ui/alerts-test.js new file mode 100644 index 0000000..5ff21f6 --- /dev/null +++ b/js-src/components/__tests__/ui/alerts-test.js @@ -0,0 +1,41 @@ +/** + * Test to check if the component renders correctly + */ +/* global it expect */ +import 'react-native'; +import React from 'react'; +import renderer from 'react-test-renderer'; + +import Alerts from '@ui/Alerts'; + +it('Alerts (empty) renders correctly', () => { + const tree = renderer.create( + , + ).toJSON(); + + expect(tree).toMatchSnapshot(); +}); + +it('Alerts (Sucess) renders correctly', () => { + const tree = renderer.create( + , + ).toJSON(); + + expect(tree).toMatchSnapshot(); +}); + +it('Alerts (Error) renders correctly', () => { + const tree = renderer.create( + , + ).toJSON(); + + expect(tree).toMatchSnapshot(); +}); + +it('Alerts (Status) renders correctly', () => { + const tree = renderer.create( + , + ).toJSON(); + + expect(tree).toMatchSnapshot(); +}); diff --git a/js-src/components/__tests__/ui/button-test.js b/js-src/components/__tests__/ui/button-test.js new file mode 100644 index 0000000..349cf40 --- /dev/null +++ b/js-src/components/__tests__/ui/button-test.js @@ -0,0 +1,92 @@ +/** + * Test to check if the component renders correctly + */ +/* global it expect */ +import { Alert } from 'react-native'; +import React from 'react'; +import renderer from 'react-test-renderer'; + +import Button from '@ui/Button'; + +// Default Button Press function +const onPress = () => Alert.alert('Hey Tester'); + +it('Button renders correctly', () => { + const tree = renderer.create( +