From 5dc6c3d51fb09d11a0724b1f334c6cea68756cdf Mon Sep 17 00:00:00 2001 From: Jacques Foucry Date: Thu, 19 May 2016 07:37:28 +0200 Subject: [PATCH] =?UTF-8?q?Nouveau=20projet=20qui=20part=20d'un=20mod?= =?UTF-8?q?=C3=A8le=20avec=20toolbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 44 +++ .idea/gradle.xml | 23 ++ .idea/runConfigurations.xml | 12 + app/.gitignore | 1 + app/build.gradle | 29 ++ app/proguard-rules.pro | 17 ++ .../net/foucry/pilldroid/ApplicationTest.java | 13 + app/src/main/AndroidManifest.xml | 32 ++ .../java/net/foucry/pilldroid/DBHelper.java | 289 ++++++++++++++++++ .../java/net/foucry/pilldroid/Medicament.java | 209 +++++++++++++ .../pilldroid/MedicamentDetailActivity.java | 81 +++++ .../pilldroid/MedicamentDetailFragment.java | 69 +++++ .../pilldroid/MedicamentListActivity.java | 142 +++++++++ .../java/net/foucry/pilldroid/UtilDate.java | 94 ++++++ .../main/java/net/foucry/pilldroid/Utils.java | 32 ++ .../foucry/pilldroid/dummy/DummyContent.java | 72 +++++ .../main/res/drawable/gradient_bg_alert.xml | 9 + app/src/main/res/drawable/gradient_bg_ok.xml | 9 + .../main/res/drawable/gradient_bg_warning.xml | 9 + app/src/main/res/drawable/line_divider.xml | 11 + app/src/main/res/drawable/stock_alert.png | Bin 0 -> 4731 bytes app/src/main/res/drawable/stock_ok.png | Bin 0 -> 4342 bytes app/src/main/res/drawable/stock_warn.png | Bin 0 -> 4083 bytes .../res/layout-w900dp/medicament_list.xml | 38 +++ .../res/layout/activity_medicament_detail.xml | 53 ++++ .../res/layout/activity_medicament_list.xml | 42 +++ app/src/main/res/layout/medicament_detail.xml | 9 + app/src/main/res/layout/medicament_list.xml | 13 + .../res/layout/medicament_list_content.xml | 20 ++ app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2294 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1329 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3136 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5562 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 8074 bytes app/src/main/res/values-v21/styles.xml | 9 + app/src/main/res/values/colors.xml | 6 + app/src/main/res/values/dimens.xml | 7 + app/src/main/res/values/strings.xml | 4 + app/src/main/res/values/styles.xml | 20 ++ .../net/foucry/pilldroid/ExampleUnitTest.java | 15 + build.gradle | 23 ++ gradle.properties | 18 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 160 ++++++++++ gradlew.bat | 90 ++++++ settings.gradle | 1 + 47 files changed, 1731 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/gradle.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/net/foucry/pilldroid/ApplicationTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/net/foucry/pilldroid/DBHelper.java create mode 100644 app/src/main/java/net/foucry/pilldroid/Medicament.java create mode 100644 app/src/main/java/net/foucry/pilldroid/MedicamentDetailActivity.java create mode 100644 app/src/main/java/net/foucry/pilldroid/MedicamentDetailFragment.java create mode 100644 app/src/main/java/net/foucry/pilldroid/MedicamentListActivity.java create mode 100644 app/src/main/java/net/foucry/pilldroid/UtilDate.java create mode 100644 app/src/main/java/net/foucry/pilldroid/Utils.java create mode 100644 app/src/main/java/net/foucry/pilldroid/dummy/DummyContent.java create mode 100644 app/src/main/res/drawable/gradient_bg_alert.xml create mode 100644 app/src/main/res/drawable/gradient_bg_ok.xml create mode 100644 app/src/main/res/drawable/gradient_bg_warning.xml create mode 100644 app/src/main/res/drawable/line_divider.xml create mode 100755 app/src/main/res/drawable/stock_alert.png create mode 100755 app/src/main/res/drawable/stock_ok.png create mode 100755 app/src/main/res/drawable/stock_warn.png create mode 100644 app/src/main/res/layout-w900dp/medicament_list.xml create mode 100644 app/src/main/res/layout/activity_medicament_detail.xml create mode 100644 app/src/main/res/layout/activity_medicament_list.xml create mode 100644 app/src/main/res/layout/medicament_detail.xml create mode 100644 app/src/main/res/layout/medicament_list.xml create mode 100644 app/src/main/res/layout/medicament_list_content.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values-v21/styles.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/test/java/net/foucry/pilldroid/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..289bf66 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# Built application files +/*/build/ +/build + +# Crashlytics configuations +com_crashlytics_export_strings.xml + +# Local configuration file (sdk path, etc) +local.properties + +# Gradle generated files +.gradle/ + +# Signing files +.signing/ + +# User-specific configurations +.idea/libraries/ +.idea/workspace.xml +.idea/tasks.xml +.idea/.name +.idea/compiler.xml +.idea/copyright/profiles_settings.xml +.idea/encodings.xml +.idea/misc.xml +.idea/modules.xml +.idea/scopes/scope_settings.xml +.idea/vcs.xml +*.iml + +# OS-specific files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +*.apk +*.ap_ + +*.class +gen/ diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..508b3d9 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..ab967fd --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,29 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.2" + + defaultConfig { + applicationId "net.foucry.pilldroid" + minSdkVersion 22 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' + compile 'com.android.support:appcompat-v7:23.3.0' + compile 'com.android.support:support-v4:23.3.0' + compile 'com.android.support:recyclerview-v7:23.3.0' + compile 'com.android.support:design:23.3.0' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..1af6302 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Volumes/Users/jacques/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/app/src/androidTest/java/net/foucry/pilldroid/ApplicationTest.java b/app/src/androidTest/java/net/foucry/pilldroid/ApplicationTest.java new file mode 100644 index 0000000..3129e2c --- /dev/null +++ b/app/src/androidTest/java/net/foucry/pilldroid/ApplicationTest.java @@ -0,0 +1,13 @@ +package net.foucry.pilldroid; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..5113f17 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/net/foucry/pilldroid/DBHelper.java b/app/src/main/java/net/foucry/pilldroid/DBHelper.java new file mode 100644 index 0000000..7a13aef --- /dev/null +++ b/app/src/main/java/net/foucry/pilldroid/DBHelper.java @@ -0,0 +1,289 @@ +package net.foucry.medicament; + +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.LinkedList; +import java.util.List; + +/** + * Created by jacques on 24/04/16. + */ + + +public class DBHelper extends SQLiteOpenHelper { + + private static final int DATABASE_VERSION = 1; + private static String DATABASE_NAME = "ordonnance.db"; + + private static final String TABLE_DRUG = "drug"; + private static final String KEY_ID = "id"; + private static final String KEY_CIS = "cis"; + private static final String KEY_CIP13 = "cip13"; + private static final String KEY_NAME = "nom"; + private static final String KEY_ADMIN = "mode_administration"; + private static final String KEY_PRES = "presentation"; + private static final String KEY_STOCK = "stock"; + private static final String KEY_PRISE = "prise"; + private static final String KEY_SEUIL_WARN = "warning"; + private static final String KEY_SEUIL_ALERT = "alerte"; + + private static DBHelper sInstance; + + private static final String[] COLUMS = {KEY_ID, KEY_CIS,KEY_CIP13, KEY_NAME, KEY_ADMIN, KEY_PRES, KEY_STOCK, KEY_PRISE, + KEY_SEUIL_WARN, KEY_SEUIL_ALERT}; + + public static synchronized DBHelper getInstance(Context context) { + if (sInstance == null) { + sInstance = new DBHelper(context.getApplicationContext()); + } + return sInstance; + } + + public DBHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + String CREATE_DRUG_TABLE = "CREATE TABLE drug ( " + + "id INTEGER PRIMARY KEY AUTOINCREMENT," + + "cis TEXT, " + + "cip13 TEXT, " + + "nom TEXT, " + + "mode_administration TEXT, " + + "presentation TEXT, " + + "stock REAL, " + + "prise REAL, " + + "warning INT, " + + "alerte INT)"; + + db.execSQL(CREATE_DRUG_TABLE); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // Drop old database + db.execSQL("DROP TABLE IF EXISTS drug"); + + // Create fresh book table + this.onCreate(db); + } + + public void dropDrug() { + SQLiteDatabase db = this.getWritableDatabase(); + Log.d(CustomizedListView.Constants.TAG, "Drop drug table"); + db.execSQL("DROP TABLE IF EXISTS drug"); + + this.onCreate(db); + } + + public void addDrug(Medicament medicament) { + // Logging + Log.d(CustomizedListView.Constants.TAG, medicament.toString()); + + // Get reference to writable DB + SQLiteDatabase db = this.getWritableDatabase(); + + // Create ContentValues to add key "column"/value + ContentValues values = new ContentValues(); + values.put(KEY_CIS, medicament.getCis()); + values.put(KEY_CIP13, medicament.getCip13()); + values.put(KEY_NAME, medicament.getNom()); + values.put(KEY_ADMIN, medicament.getMode_administration()); + values.put(KEY_PRES, medicament.getPresentation()); + values.put(KEY_STOCK, medicament.getStock()); + values.put(KEY_PRISE, medicament.getPrise()); + values.put(KEY_SEUIL_WARN, medicament.getWarnThreshold()); + values.put(KEY_SEUIL_ALERT,medicament.getAlertThreshold()); + + // Calculate some medicament's fields + + // Insert + db.insert(TABLE_DRUG, // table + null, // colunms list not needed + values); // key/value + + // Close database + db.close(); + } + + public Medicament getDrug(int id) { + // Get reference to readable DB + SQLiteDatabase db = this.getReadableDatabase(); + + // Build query + Cursor cursor = db.query(TABLE_DRUG, // Which table + COLUMS, // column names + " id = ?", // selections + new String[] { String.valueOf(id) }, // selections args + null, // group by + null, // having + null, // order by + null); // limits + + // if case we got result, go to the first one + if (cursor != null) + cursor.moveToFirst(); + + // Build medicament object + Medicament medicament = new Medicament(); + medicament.setId(Integer.parseInt(cursor.getString(0))); + medicament.setCis(cursor.getString(1)); + medicament.setCip13(cursor.getString(2)); + medicament.setNom(cursor.getString(3)); + medicament.setMode_administration(cursor.getString(4)); + medicament.setPresentation(cursor.getString(5)); + medicament.setStock(Double.parseDouble(cursor.getString(6))); + medicament.setPrise(Double.parseDouble(cursor.getString(7))); + medicament.setWarnThreshold(Integer.parseInt(cursor.getString(8))); + medicament.setAlertThreshold(Integer.parseInt(cursor.getString(9))); + + // Log + Log.d(CustomizedListView.Constants.TAG, "getDrug("+id+")" + medicament.toString()); + + // Return medicament + + return medicament; + } + + public Medicament getDrugByCIP13(String cip13) { + // Get reference to readable DB + SQLiteDatabase db = this.getReadableDatabase(); + + // Build query + Cursor cursor = db.query(TABLE_DRUG, // Which table + COLUMS, // column names + " cip13 = ?", // selections + new String[] { String.valueOf(cip13) }, // selections args + null, // group by + null, // having + null, // order by + null); // limits + + // if case we got result, go to the first one + if (cursor != null) + cursor.moveToFirst(); + + // Build medicament object + Medicament medicament = new Medicament(); + medicament.setId(Integer.parseInt(cursor.getString(0))); + medicament.setCis(cursor.getString(1)); + medicament.setCip13(cursor.getString(2)); + medicament.setNom(cursor.getString(3)); + medicament.setMode_administration(cursor.getString(4)); + medicament.setPresentation(cursor.getString(5)); + medicament.setStock(Double.parseDouble(cursor.getString(6))); + medicament.setPrise(Double.parseDouble(cursor.getString(7))); + medicament.setWarnThreshold(Integer.parseInt(cursor.getString(8))); + medicament.setAlertThreshold(Integer.parseInt(cursor.getString(9))); + + // Log + Log.d(CustomizedListView.Constants.TAG, "getDrug("+cip13+")" + medicament.toString()); + + // Return medicament + + return medicament; + } + public List getAllDrugs() { + List medicaments = new LinkedList(); + + // Build the query + String query = "SELECT * FROM " + TABLE_DRUG; + + // Get reference to readable DB (tutorial parle de writable, mais bof... on verra) + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(query, null); + + // For Each row, build a medicament and add it to the list + Medicament medicament = null; + if (cursor.moveToFirst()) { + do { + medicament = new Medicament(); + medicament.setId(Integer.parseInt(cursor.getString(0))); + medicament.setCis(cursor.getString(1)); + medicament.setCip13(cursor.getString(2)); + medicament.setNom(cursor.getString(3)); + medicament.setMode_administration(cursor.getString(4)); + medicament.setPresentation(cursor.getString(5)); + medicament.setStock(Double.parseDouble(cursor.getString(6))); + medicament.setPrise(Double.parseDouble(cursor.getString(7))); + medicament.setWarnThreshold(Integer.parseInt(cursor.getString(8))); + medicament.setAlertThreshold(Integer.parseInt(cursor.getString(9))); + + // Call calcul method + medicament.setDateEndOfStock(); + medicament.setDateLastUpdate(); + + // Add medicament to medicaments + medicaments.add(medicament); + } while (cursor.moveToNext()); + } + + cursor.close(); + Log.d(CustomizedListView.Constants.TAG, "getAllDrugs " + medicaments.toString()); + + // return + return medicaments; + } + + public int updateDrug(Medicament medicament) { + // Get reference to writable DB + SQLiteDatabase db = this.getWritableDatabase(); + + // Create ContentValues to add columnm/value + ContentValues values = new ContentValues(); + values.put(KEY_CIS, medicament.getCis()); + values.put(KEY_CIP13, medicament.getCip13()); + values.put(KEY_NAME, medicament.getNom()); + values.put(KEY_ADMIN, medicament.getMode_administration()); + values.put(KEY_PRES, medicament.getPresentation()); + values.put(KEY_STOCK, medicament.getStock()); + + // Update row + int i = db.update(TABLE_DRUG, // table + values, // column/value + KEY_ID+" = ?", // selections + new String[] {String.valueOf(medicament.getId()) } ); // selections args + + // Close DB + db.close(); + + return i; + } + + public void deleteDrug(Medicament medicament) { + // Get writable database + SQLiteDatabase db = this.getWritableDatabase(); + + // Delete record + db.delete(TABLE_DRUG, // table + KEY_ID+ " = ?", // selections + new String[] { String.valueOf(medicament.getId()) } ); // selections args + + // Close DB + db.close(); + + // log + Log.d(CustomizedListView.Constants.TAG, "delete drug "+medicament.toString()); + } + + public int getCount() { + + String query = "SELECT count (*) FROM " + TABLE_DRUG; + + // Get reference to readable DB (tutorial parle de writable, mais bof... on verra) + SQLiteDatabase db = this.getReadableDatabase(); + Cursor mCount = db.rawQuery(query, null); + mCount.moveToFirst(); + int count = mCount.getInt(0); + + mCount.close(); + return count; + } +} + diff --git a/app/src/main/java/net/foucry/pilldroid/Medicament.java b/app/src/main/java/net/foucry/pilldroid/Medicament.java new file mode 100644 index 0000000..163bd03 --- /dev/null +++ b/app/src/main/java/net/foucry/pilldroid/Medicament.java @@ -0,0 +1,209 @@ +package net.foucry.medicament; + +import java.io.Serializable; +import java.lang.String; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import static net.foucry.medicament.UtilDate.*; + + +/** + * Created by jacques on 26/11/15. + */ +public class Medicament implements Serializable { + + /* part read form database */ + private int id; + private String nom; + private String cip13; + private String cis; + private String mode_administration; + private String presentation; + private double stock; + private double prise; + private int warnThreshold; + private int alertThreshold; + private String dateLastUpdate; + + /* calculate part */ + private Date dateEndOfStock; + + private static final String[] COLUMN_LIST = {"id","cis", "cip13", "nom", "mode_administration", "presentation", "stock", "prise", + "seuil_warn", "seuil_alert", "dateLastUpdate"}; + + public Medicament() {} + + public Medicament(String cis, String cip13, String nom, String mode_administration, String presentation, + double stock, double prise, int warn, int alert) { + super(); + + this.cis = cis; + this.cip13 = cip13; + this.nom = nom; + this.mode_administration = mode_administration; + this.presentation = presentation; + this.stock = stock; + this.prise = prise; + this.warnThreshold = warn; + this.alertThreshold = alert; + } + +// private Medicament(Cursor cursor) { +// if (cursor == null) throw new AssertionError(); +// +// this.setCis(cursor.getString(0)); +// this.setCip13(cursor.getString(1)); +// this.setNom(cursor.getString(2)); +// this.setMode_administration(cursor.getString(3)); +// this.setPresentation(cursor.getString(4)); +// this.setStock(cursor.getFloat(5)); +// this.setPrise(cursor.getFloat(6)); +// } + + + + public int getId() { + return id; + } + + public String getNom() { + return nom; + } + + public String getCip13() { + return cip13; + } + + public String getCis() { + return cis; + } + + public String getMode_administration() { + return mode_administration; + } + + public String getPresentation() { + return presentation; + } + + public double getStock() { + return stock; + } + + public double getPrise() { + return prise; + } + + public int getAlertThreshold() { + return alertThreshold; + } + + public int getWarnThreshold() { + return warnThreshold; + } + + public String getDateLastUpdate() { + return dateLastUpdate; + } + + public Date getDateEndOfStock() { + return dateEndOfStock; + } + + public void setId(int id) { + this.id = id; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public void setCip13(String cip13) { + this.cip13 = cip13; + } + + public void setCis(String cis) { + this.cis = cis; + } + + public void setMode_administration(String mode_administration) { + this.mode_administration = mode_administration; + } + + public void setPresentation(String presentation) { + this.presentation = presentation; + } + + public void setStock(double stock) { + this.stock = stock; + } + + public void setPrise(double prise) { + this.prise = prise; + } + + public void setWarnThreshold(int warn) { + if (warn == 0) + warn = 14; + this.warnThreshold = warn; + } + public void setAlertThreshold(int alert) { + if (alert == 0) + alert = 7; + this.alertThreshold = alert; + } + + public void setDateLastUpdate() { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + this.dateLastUpdate = date2String(dateAtNoon(new Date()), dateFormat); + } + + public void setDateEndOfStock() { + int numberDayOfPrise; + if (this.prise > 0) { + numberDayOfPrise = (int) Math.floor(this.stock / this.prise); + } else { + numberDayOfPrise = 0; + } + + Date aDate = dateAtNoon(new Date()); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(aDate); + calendar.add(Calendar.DAY_OF_YEAR, numberDayOfPrise); + + this.dateEndOfStock = calendar.getTime(); + } + + public double newStock(double currentStock) { + Date lastUpdate = string2Date(this.dateLastUpdate); + int numberOfDays = nbOfDaysBetweenDateAndToday(lastUpdate); + double takeDuringPeriod = this.prise * numberOfDays; + + return currentStock - takeDuringPeriod; + } + + +// public static Medicament getMedicamentByCIP13(String cip13) { +// Log.e(CustomizedListView.Constants.TAG, "getMedicamentByCIP13 called"); +// +// Context context = null; +// DBHelper db = new DBHelper(context); +// SQLiteDatabase myDatabase = DBHelper.getInstance(context).getWritableDatabase(); +// +// Medicament medicament = null; +// +// Cursor cur = myDatabase.query("medicaments", COLUMN_LIST, "cip13 = ?", new String[]{cip13}, null, null,null); +// if (cur != null) { +// cur.moveToFirst(); +// int count = cur.getCount(); +// Log.d(CustomizedListView.Constants.TAG, "Number of item in cursor " + String.valueOf(count)); +// medicament = new Medicament(cur); +// } +// cur.close(); +// myDatabase.close(); +// return medicament; +// } + +} diff --git a/app/src/main/java/net/foucry/pilldroid/MedicamentDetailActivity.java b/app/src/main/java/net/foucry/pilldroid/MedicamentDetailActivity.java new file mode 100644 index 0000000..5a7e1ed --- /dev/null +++ b/app/src/main/java/net/foucry/pilldroid/MedicamentDetailActivity.java @@ -0,0 +1,81 @@ +package net.foucry.pilldroid; + +import android.content.Intent; +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.support.v7.widget.Toolbar; +import android.view.View; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.app.ActionBar; +import android.view.MenuItem; + +/** + * An activity representing a single Medicament detail screen. This + * activity is only used narrow width devices. On tablet-size devices, + * item details are presented side-by-side with a list of items + * in a {@link MedicamentListActivity}. + */ +public class MedicamentDetailActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_medicament_detail); + Toolbar toolbar = (Toolbar) findViewById(R.id.detail_toolbar); + setSupportActionBar(toolbar); + + FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Snackbar.make(view, "Replace with your own detail action", Snackbar.LENGTH_LONG) + .setAction("Action", null).show(); + } + }); + + // Show the Up button in the action bar. + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + } + + // savedInstanceState is non-null when there is fragment state + // saved from previous configurations of this activity + // (e.g. when rotating the screen from portrait to landscape). + // In this case, the fragment will automatically be re-added + // to its container so we don't need to manually add it. + // For more information, see the Fragments API guide at: + // + // http://developer.android.com/guide/components/fragments.html + // + if (savedInstanceState == null) { + // Create the detail fragment and add it to the activity + // using a fragment transaction. + Bundle arguments = new Bundle(); + arguments.putString(MedicamentDetailFragment.ARG_ITEM_ID, + getIntent().getStringExtra(MedicamentDetailFragment.ARG_ITEM_ID)); + MedicamentDetailFragment fragment = new MedicamentDetailFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .add(R.id.medicament_detail_container, fragment) + .commit(); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == android.R.id.home) { + // This ID represents the Home or Up button. In the case of this + // activity, the Up button is shown. For + // more details, see the Navigation pattern on Android Design: + // + // http://developer.android.com/design/patterns/navigation.html#up-vs-back + // + navigateUpTo(new Intent(this, MedicamentListActivity.class)); + return true; + } + return super.onOptionsItemSelected(item); + } +} diff --git a/app/src/main/java/net/foucry/pilldroid/MedicamentDetailFragment.java b/app/src/main/java/net/foucry/pilldroid/MedicamentDetailFragment.java new file mode 100644 index 0000000..7ed082a --- /dev/null +++ b/app/src/main/java/net/foucry/pilldroid/MedicamentDetailFragment.java @@ -0,0 +1,69 @@ +package net.foucry.pilldroid; + +import android.app.Activity; +import android.support.design.widget.CollapsingToolbarLayout; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import net.foucry.pilldroid.dummy.DummyContent; + +/** + * A fragment representing a single Medicament detail screen. + * This fragment is either contained in a {@link MedicamentListActivity} + * in two-pane mode (on tablets) or a {@link MedicamentDetailActivity} + * on handsets. + */ +public class MedicamentDetailFragment extends Fragment { + /** + * The fragment argument representing the item ID that this fragment + * represents. + */ + public static final String ARG_ITEM_ID = "item_id"; + + /** + * The dummy content this fragment is presenting. + */ + private DummyContent.DummyItem mItem; + + /** + * Mandatory empty constructor for the fragment manager to instantiate the + * fragment (e.g. upon screen orientation changes). + */ + public MedicamentDetailFragment() { + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (getArguments().containsKey(ARG_ITEM_ID)) { + // Load the dummy content specified by the fragment + // arguments. In a real-world scenario, use a Loader + // to load content from a content provider. + mItem = DummyContent.ITEM_MAP.get(getArguments().getString(ARG_ITEM_ID)); + + Activity activity = this.getActivity(); + CollapsingToolbarLayout appBarLayout = (CollapsingToolbarLayout) activity.findViewById(R.id.toolbar_layout); + if (appBarLayout != null) { + appBarLayout.setTitle(mItem.content); + } + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.medicament_detail, container, false); + + // Show the dummy content as text in a TextView. + if (mItem != null) { + ((TextView) rootView.findViewById(R.id.medicament_detail)).setText(mItem.details); + } + + return rootView; + } +} diff --git a/app/src/main/java/net/foucry/pilldroid/MedicamentListActivity.java b/app/src/main/java/net/foucry/pilldroid/MedicamentListActivity.java new file mode 100644 index 0000000..5b10f5d --- /dev/null +++ b/app/src/main/java/net/foucry/pilldroid/MedicamentListActivity.java @@ -0,0 +1,142 @@ +package net.foucry.pilldroid; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + + +import net.foucry.pilldroid.dummy.DummyContent; + +import java.util.List; + +/** + * An activity representing a list of Medicaments. This activity + * has different presentations for handset and tablet-size devices. On + * handsets, the activity presents a list of items, which when touched, + * lead to a {@link MedicamentDetailActivity} representing + * item details. On tablets, the activity presents the list of items and + * item details side-by-side using two vertical panes. + */ +public class MedicamentListActivity extends AppCompatActivity { + + /** + * Whether or not the activity is in two-pane mode, i.e. running on a tablet + * device. + */ + private boolean mTwoPane; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_medicament_list); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + toolbar.setTitle(getTitle()); + + FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) + .setAction("Action", null).show(); + } + }); + + View recyclerView = findViewById(R.id.medicament_list); + assert recyclerView != null; + setupRecyclerView((RecyclerView) recyclerView); + + if (findViewById(R.id.medicament_detail_container) != null) { + // The detail container view will be present only in the + // large-screen layouts (res/values-w900dp). + // If this view is present, then the + // activity should be in two-pane mode. + mTwoPane = true; + } + } + + private void setupRecyclerView(@NonNull RecyclerView recyclerView) { + recyclerView.setAdapter(new SimpleItemRecyclerViewAdapter(DummyContent.ITEMS)); + } + + public class SimpleItemRecyclerViewAdapter + extends RecyclerView.Adapter { + + private final List mValues; + + public SimpleItemRecyclerViewAdapter(List items) { + mValues = items; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.medicament_list_content, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(final ViewHolder holder, int position) { + holder.mItem = mValues.get(position); + holder.mIdView.setText(mValues.get(position).id); + holder.mContentView.setText(mValues.get(position).content); + + holder.mView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mTwoPane) { + Bundle arguments = new Bundle(); + arguments.putString(MedicamentDetailFragment.ARG_ITEM_ID, holder.mItem.id); + MedicamentDetailFragment fragment = new MedicamentDetailFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .replace(R.id.medicament_detail_container, fragment) + .commit(); + } else { + Context context = v.getContext(); + Intent intent = new Intent(context, MedicamentDetailActivity.class); + intent.putExtra(MedicamentDetailFragment.ARG_ITEM_ID, holder.mItem.id); + + context.startActivity(intent); + } + } + }); + } + + @Override + public int getItemCount() { + return mValues.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + public final View mView; + public final TextView mIdView; + public final TextView mContentView; + public DummyContent.DummyItem mItem; + + public ViewHolder(View view) { + super(view); + mView = view; + mIdView = (TextView) view.findViewById(R.id.id); + mContentView = (TextView) view.findViewById(R.id.content); + } + + @Override + public String toString() { + return super.toString() + " '" + mContentView.getText() + "'"; + } + } + } +} diff --git a/app/src/main/java/net/foucry/pilldroid/UtilDate.java b/app/src/main/java/net/foucry/pilldroid/UtilDate.java new file mode 100644 index 0000000..e7f2cb0 --- /dev/null +++ b/app/src/main/java/net/foucry/pilldroid/UtilDate.java @@ -0,0 +1,94 @@ +package net.foucry.medicament; + +import android.util.Log; + +import java.text.DateFormat; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +/** + * Created by jacques on 05/05/16. + */ +public class UtilDate { + + /** + * + * @param aDate + * @return date + * + * set date time at Noon + */ + public static Date dateAtNoon(Date aDate) { + + Log.d(CustomizedListView.Constants.TAG, "dateAtNoon " + aDate); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(aDate); + calendar.set(Calendar.HOUR_OF_DAY, 12); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + + return calendar.getTime(); + } + + /** + * + * @param days + * @param date + * @return date + * + * Substract days to date and return a new date + */ + public static Date removeDaysToDate(int days, Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DAY_OF_YEAR, -days); + + return calendar.getTime(); + } + + /** + * + * @param date + * @return String + * + * Convert a date to a String using a SimpleDateFormat + */ + public static String date2String(Date date, DateFormat dateFormat) { + + Log.d(CustomizedListView.Constants.TAG, "date == " + date); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + return dateFormat.format(calendar.getTime()); + } + + /** + * + * @param dateString + * @return date + * + * Convert String date into Date + */ + public static Date string2Date(String dateString) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + ParsePosition pos = new ParsePosition(0); + return dateFormat.parse(dateString,pos); + } + + /** + * + * @param date + * @return int + * + * Number of days between date (older than today) and today + */ + public static int nbOfDaysBetweenDateAndToday(Date date) { + Date oldDate = dateAtNoon(date); // Be sure that the old date is at Noon + Date todayDate = dateAtNoon(new Date()); // Be sure that we use today at Noon + + return (int) (todayDate.getTime() - oldDate.getTime()); + } +} diff --git a/app/src/main/java/net/foucry/pilldroid/Utils.java b/app/src/main/java/net/foucry/pilldroid/Utils.java new file mode 100644 index 0000000..70e377b --- /dev/null +++ b/app/src/main/java/net/foucry/pilldroid/Utils.java @@ -0,0 +1,32 @@ +package net.foucry.medicament; + +import java.io.InputStream; +import java.io.OutputStream; + +import java.util.Random; +import java.lang.Math; + +public class Utils { + public static void CopyStream(InputStream is, OutputStream os) + { + final int buffer_size=1024; + try + { + byte[] bytes=new byte[buffer_size]; + for(;;) + { + int count=is.read(bytes, 0, buffer_size); + if(count==-1) + break; + os.write(bytes, 0, count); + } + } + catch(Exception ex){} + } + + public static final double doubleRandomInclusive(int min, int max) { + double value = Math.floor(min + (max - min) * CustomizedListView.random.nextDouble() *4)/4; + + return value; + } +} \ No newline at end of file diff --git a/app/src/main/java/net/foucry/pilldroid/dummy/DummyContent.java b/app/src/main/java/net/foucry/pilldroid/dummy/DummyContent.java new file mode 100644 index 0000000..8a110fc --- /dev/null +++ b/app/src/main/java/net/foucry/pilldroid/dummy/DummyContent.java @@ -0,0 +1,72 @@ +package net.foucry.pilldroid.dummy; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Helper class for providing sample content for user interfaces created by + * Android template wizards. + *

+ * TODO: Replace all uses of this class before publishing your app. + */ +public class DummyContent { + + /** + * An array of sample (dummy) items. + */ + public static final List ITEMS = new ArrayList(); + + /** + * A map of sample (dummy) items, by ID. + */ + public static final Map ITEM_MAP = new HashMap(); + + private static final int COUNT = 25; + + static { + // Add some sample items. + for (int i = 1; i <= COUNT; i++) { + addItem(createDummyItem(i)); + } + } + + private static void addItem(DummyItem item) { + ITEMS.add(item); + ITEM_MAP.put(item.id, item); + } + + private static DummyItem createDummyItem(int position) { + return new DummyItem(String.valueOf(position), "Item " + position, makeDetails(position)); + } + + private static String makeDetails(int position) { + StringBuilder builder = new StringBuilder(); + builder.append("Details about Item: ").append(position); + for (int i = 0; i < position; i++) { + builder.append("\nMore details information here."); + } + return builder.toString(); + } + + /** + * A dummy item representing a piece of content. + */ + public static class DummyItem { + public final String id; + public final String content; + public final String details; + + public DummyItem(String id, String content, String details) { + this.id = id; + this.content = content; + this.details = details; + } + + @Override + public String toString() { + return content; + } + } +} diff --git a/app/src/main/res/drawable/gradient_bg_alert.xml b/app/src/main/res/drawable/gradient_bg_alert.xml new file mode 100644 index 0000000..7d58d72 --- /dev/null +++ b/app/src/main/res/drawable/gradient_bg_alert.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_bg_ok.xml b/app/src/main/res/drawable/gradient_bg_ok.xml new file mode 100644 index 0000000..e2ea5eb --- /dev/null +++ b/app/src/main/res/drawable/gradient_bg_ok.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_bg_warning.xml b/app/src/main/res/drawable/gradient_bg_warning.xml new file mode 100644 index 0000000..59190ce --- /dev/null +++ b/app/src/main/res/drawable/gradient_bg_warning.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/line_divider.xml b/app/src/main/res/drawable/line_divider.xml new file mode 100644 index 0000000..b865b8d --- /dev/null +++ b/app/src/main/res/drawable/line_divider.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/stock_alert.png b/app/src/main/res/drawable/stock_alert.png new file mode 100755 index 0000000000000000000000000000000000000000..a457eb19c86fa3cbfb3db67b139d9e34cd994b65 GIT binary patch literal 4731 zcmV->5`^uEP)imUK>w-~sj8G!w%w+Gwb|~jcBLv(rK(Aq-6U!n9<8?9kN{PI5FkLx!$81b z^Rn@CY|q%^c|Z1#>oEh^bI+Z*cWmcl9RbO`=iGC?KJRmWKV34JWEM~gEKUn`zym-L zU{4DG{5aREOCUI)ziOgIO^z^{R~fuVdQnlE82zz>0+0LA%8Py@WcFM)S} zkk*N5EsP$i|M)ri@6ffP6ZjcYAC%B45iNyj0e%HEXq7-Zk!TD6ld&Kl$pN$iKLQSF z5xG{vyaD_NQjN)(L?X$cca*VUm{2%69wG$O{+>uk`OxciSj;9YW+PU!apLb5vk{xs zjJvo9y+&C7#cKj*J>(myz&#8Qvg*dFzBh9UqO9MMK%M4pOB?E*$T4-siPOJDZ{=ozC3k_ zKuEQLOI|6om{_;Eo)V``$!kfZ0fFLXEgNAPkVYWFeafw#L5`ojN_>{olBqBl^sHIA zh==C5mAvLh8mTH85GWO<6gY)~(N}BREzV!*RFcMwXL)TE4RsGGdF3Xs8U;gXCBm4H zcKd|pDY1BhV`r{#t9wv1{#nIC6>c7Dtfjypytr``cpSk=s1jj*hv1Ap5Dathxx@d5CCkq1SEc?0-Qkp~08Fnhl|H)}h2r4(9BY+ScOi8%j+ zz}lLKFfG7e5m=Cn#S?sSJXPZ}uHfsssNn}=~wxUcM>& zoXu)xW&J!{PCG?53npU$(O8^5kB=UYm(K1%M#h37Nvej!W~Hja&722{DSyC;vA{qi z8e?=U#E{R=*-JMW3x;LmS-E%~E9->^tlNSAnd*OL62<~tL15?c#_a(Pp173p8J$kY zl9~z{msDq*LB|sbPG7vi#r7_=UaisTVClk2RxPc@pr85|I2wy{=Gz;5+tDq%gw*nA zJ=JqdMUw9XYMEl2I+HMO0{<=-`=Hm)Uk;tgIC<3RbUfSKz?@R??f#wtFGs$)j6Wd% zo0<*wLNm>eELQwYUmR)8D2~CPXY+^*XhVc(eIcQaAqw6U>yMOOPSU!UvXVtZG{XKYq8FFn0lWNpn0 z)G*2Eo2lyWPZ2oH(%Nv|28zNwJuXY;0aZiK8%M8cITmqcCex z03KdiO`+A4F%5qpL~GkEk?4w%%KAPg6Q&yJ+*d{dp$M&4q<$b%czDVDoVIT*W+NNd zt)#?ZlTAx5lsIf`T(>f(ol0YYfrppOmrbknN|)$d?scRxzl+I)`2_-p@lId7PAnEf zZZPRmwi-Jr7PFB}>sR7(7RshK^>-AqX?<>@q>%EIIlWjc#_5aKMWQn!mHA!VE6jYP zW2+hQjt01Vty`$+aM-ij1-uVQoW}8*qqO<5v1xsyDxv^5>{g+4FJJ4%I~ov)@)e}A zpWt3$UPWM!JKrl>K-;kpAU8@r?6XHx#b6ifF zW}*ODl|evYNryBI(uLV1_tv$p0mVbqYh44x6WVMkTg@h(e|!}#=bb*s<+StsrI!yJAj&b6gc2^v&W)oYUScSXThP&9tmM63m1>nTF zc6_5_C@lx6>}088ygNw^nOfxDh(u#_^$wFvD$5AKnM=2rS5eB`@)G4Q3t%;y*!tun z0GLhccJ%4o?i=RJrCV8*L09iEk!Vb0l-dHc>(l;`ksG%?#Nu(qbBJUzNg|Qpz_IfL zHQd!Sn~a)@5)4H+aO^yZL?Wv)h{faFxa|>1ss-*eWgFz4mWIg6+ST+h;t%o11K(&W zj#dOi5&n4K8%F%0oXX%@r%-dY0VH8ck-0}7Pb9d0dw^t)KOXPstP>|CipM*ebN;X2 z78(f60ZR2qmL@XN-R~tFiRJX$k_rREqwJX_;siqx_8jLn zIFcwQ@eGfkcD|*ulx49V$zV=K{9|ENs`7o!+R!Mw_RTDDf}sez_MK#4NS)^E-rye- zS^=ojBUv%Zh})Xvdqe-wD4*`luQ-8FgirT=O~1x9B^3nw7-36}!e%w|+E#6Aj$m1O^hidcWh2vKvQ;*NL`jhnr_AlpB+r7vwCRy7cW0!i z(4u-jSnhJNeTIpW!e%wIeQPu2E~o1GE)r|XE(-}$?8yCKcsk{7C);0~nWChyS_)ll`hdFrw7ZM{y%Gfm4yqD&$q%ylI9PZ=pKDPr}q1tJNm zW`1!(6pzpi;JfJcs4I?Wo>nhgKxv8Wu|1H={CfI-m~6Q87Lxm?j6AVsDMq6Kxn=I| zf!uE`OY@Y2^mx3o=}q<1);n9Y&*pC)O+#i7t#(=65lfFgK8Va%H5* zW}#_St!#BZaP-22)17P>3x;`j=RrlySEgp|-JQ9K6N$z+aP)#~T1~5JMMq-4W)kOg zQ%x}5Ml#uyk@c(VamcJ6c}D~6J9=K^1Mg!j80NP-4+?ekqM^s*MN0!VDo`x8H0k;I%DHveuQ3oxVzk*fqBau66eF&d2++>Qm(C z_4s(_+;){Qm!rl4&@n*Xej{ zRV~jnEzfv!Hx^H@@2ggheA7mTZ&L-GPDk@2bv)D5ka2Y)5{9xz5Q(BCx*oM_?A{>cvy{n)0Tm4*Y z?_w~|=7HVCc9t%zWZ^?)%&#oNY$_lajxgjMqi4X&{_*BZj;9`5##7?!g4@Z`SSd(N z-5CTt^Cf|g|9n)j9sfd$iBKe}x!WsI^m-i@lTq=(_T{xzeDC?SqHBq*KqDF4HL7Y5 zI~tAi>rej5?Y?2L&-;!rx4eYcUw#s!QOJ^^Dh9C`kKj#_6pcm$JGM6Cv|CVT3^ntE z({5qM)@D&rKq||OqJTzD7kr}uKKRp@-}#y|x4eWMTcs^$K|VlbrwgFaO-VEw=aaq1 zX>I#%`Ho4^P*=sv8`mhQDVn({0fmlzlE8tZ=Q(inLdK!=Y(fV-wRRa#tzE8U(@;~# zJ}DHt!aCP>i%&i~uDThw}-zRK1;{VzG)l1>42JfiSGzcWrIV{S`!siGYB1+ zOV)j&QnV5Vq*du(A+Tkj2C1#$JYMr?1%8CUf@C&mDGW$8=2hV52<(K;5;}pOA)N!$ ztP|8)m=qS^he#7Hac^xi3op`y`W>d&4px(V36sKwypIrpVC(ahvWff;6grVE4Sh)3Rfy?iCJB?yLZsn#3zDt-j3(~0pbzPG@ZZLRc79Z{WTpyp zFQrI^yHlYK$t-aZ(&A|?l|mavo!>n_i>j*30$jk-DXA2g z4k4#Gn0f_ z54;KN1qz~Ec02Gf@IG)p%4G*7*1{|V-k3;>V_A_Y+yo9!q}#EoM684<0)7I#4p?GQ z0SQ##cfgN;JJBvY+QOs*KLoxD#6`2<2=D;E0)7hgMyt?h3F8F52fPcUMx#Iz=mY)* z_$4rEc41}=Z0zX6an27QFReJgc85;30>KUI%V~kAszuzxDhoV?;#yN1t*@=&{PyXK- zXJ=k~92u!eD2ie84L|UG;O9nV7{F*@9Kf%Ew-Kf>Fynv>;-0_ zC>Ao)lgZ6WCoeM%XPiBf?5ctNz(XVIW|T0Mz#oCaaBlADb9249o$j6iBkB@1nHkAc zloXJWny7toaN2-Z5aUlo7$M9);6M4=h$zkA&CVnU$%u@;Unm53RL^q6w@eh=rbw&0s3y<|G9 zR)zH|m#`owL(gq)#7tG!gg~z_F5nV6W?ywpce&o&uBVI{Pen-qm8A>x+|mZDMaNWH zk1!6zZlBaT#q0BP?n*OvJ9}jFpH(c#&0xc-5^Pp!<3=^`Jd%r0J;J<)hj_~h)hSv$z3U2$a0?B`iE*!w4~|}9XvCvkpkm8a5}V#^&lMO?@aw+u!;9ikZ{JU{pvPeuNPrJ zo&70$elmZxdu>Qj0G2Mw;lR!{WTq#D%+KrfQu~#Zhix39&7a`u9qS9qJY>yt6H}V3zli~_W4yV*4>iH&N9*VlLQkcBwaoIv`%aZ z&-RoxKZO^!>K7$|D?OQ&WrZQjXl?JNtEXQkyJ>}4kHo7GHP>##o+0hcO=$B2C%zQ+a9IDx*9w0U@+jxvd>io0pRs1cX_Pg!$!m zM>ny52!)?=Tq(Rw8pm^=3#;q^tn%1=#7U`bInPKO;uQMlLD%gwu8 z5$79<+{{#7dEOjR03P?d(K6zCeLn8odqhc5wpMmkz<&gU*`{^1m?FzmGdOu!X{@U( zCO?06frxDykx}$cO;;}~q;#SFlSUkN8?WwMLqSfu?lM6o zFEf?>JJ*;jN(&dRwS-ka(UzJlRS*Z}gv34M(e)U~Oiy9+Gn#r&i`{1B8{5}Vl)?&AtC(5}iEu6d3647H;a>sYRf;d_#B!k1F(ti?+Ym?KhR!U(DLpF-psFf=I8h70D*0CvV#dh}H#lRmC?MKWf+cQwWz@A81|gwF%l)tVV6Dbq)|Z} zqj5jfRaUD)Nnw^DD=gLT=cD77sf|(3IexC5GZ!0-UpY#olEN&k+6LbHz{9{*r?swL zTAXXxGRv>39EpKA$IjJr`ck7wOGoXrv^ZC$ny2AwPs~$VSC{Tw;|C6~XtBlQ9GaxDZcUATC;jv3xmV4WGT29v7;Pk~C zrqxq#5^bi*O{PS9dU~35SnKYBoD7yN&NuC2_*In;j(r)nIMuby96MJ(1LP2C+2VW( zm7CSWNpgs$b=Uqx!^A5yx`<>Gajut1*!ji-p~rDrBo4QkdI_ z@J}Ier6sYpe349nVWX<@;&{D2-v8(e{_l(Hrq)R>Ys(kmO4D@P1JUMBe9*9uEEyac z<=@`>crtE_Sy+HAYnQTXLq*U9ZewdF|MlqwT@EABz+t!X5AW=i8T5l5SrW{n;SM4u z*WZQ8Eoq*UO{+^ddEth1Wy3)Q&RlGyvGqPHmlm=hHv_xPN?Ye6TJAic`OX7V%MX`L zt4m~OV!t9taJq<&#qx}K`T1`?4f!hdUm__<2^{?P9^xFDo;=eYi#46`s~3rL`{Nuo z-rBdxRPXxPhTUf6t$mwhL;=ypK@UzaU##RF+D`$qRY( zVkmR*C?a~DCY7ZHY~N5G>)C0{)AkMJvZ8=!+i5+_we0wZkqj2FV?#L=C37XBqJAn$ z3fQqhYK0G?O+zl`wH}0iL`Xr+1FY*o|8532HG^_ z>&r4bU#Acu1vRnTt-QT|GbxEqV*g-?PD)91^7j7Cdfw0ZJ`($1rUYH+9~|b;k+XBY z=j3Ij@%H{Lq-dYu7vK;E2VDT2VM@lwef<8D^VBuXt=KUEDoYFa){E=)^c2&=lz`5_ zJ}Pjm`Z~v|>*vf=+5+s{SkBIk6?!%eO%3c5KzAstYfX3g{m17Gi~brb>^3Xk+Pj_= z`l2mGB@|Ww-NEBJx_Wu0X{i%b;ixyDoYD^aqCJl)04xweMW@z4G>Wf?6%HF{OQb9ZnbsA zZ1!dWiVL%NY3oV~b2U$KnT{D11Uo>)VdDqfBhEE>2=IKNh=amgoosh2;%o; zHn9>Wz(T|r^ac{KYof$W#Q1TTr`%SfNvwsL%6dfnl)XfMqR@_bY3O~Xyb2LZW|A;d zS&W!&S0T>2H|F%yujxX(9ei>kX}%W}ZDy)4Pvb&3UI$Vs;#lG&gz+?xKo}7NX%KOU kQ4_*ZKJc$pFqc^J|26*CpIvwS8vpgun1PJvo;&w7X#25_Y)fM0DVAj#_uT`ZO;o=feNz?IG9RL0UJ%e|0M7ca4MByq|C21%8Maa7hzSB)Q%{PT$}-iKMY1fWOGcqa7`5+PEIK`~J?Kq9_bc z%yQ}45X&oZL(lPg+_Z0LU}tMXJ{^VE$y1zsg*l37=%q`_-T5VYE?g(FY`o*LsiB5l zU0XHBEGzK@7p@L4JU(OinWg?B_V3zBRb`o;%Tz>%KzFs4k1*Yc9*A_CGCVQMXP0l1 zG+0Uisw&GkvbS4$ETSkXAAB0*?);MBXL~$uc0aP6O&izixh#z6sp{$w=oO|GxPXq{ zSFmrGt2ajUJY!8f9yiY&c!Ua_jq<`$l=seDHsy-}(ACyVcl#zimka^B(9xCFGcqqi zR9{k}B$5g}7kdfzji9QSlIp4}bc+H|QC31-b%kkm1p7wlx!9|xooq?vU6JesdW88E zl7q)cG{y&?1Q{BiK{fHGrYfMr-217i3Ycok(D)1=d=exQjmes@7me@l2YyslmYZ(RY$(ioJy-OI^C}`QHIWhKAYwvNlSESC)cI?| zP_uJERq+^@eDt_ome>@D#yEBUnx1Oy=ZHMbiIy;K#MHf1$@=6^eWIj*CCMmO*)_d?j^ujEPaM$Gf%B%Vm};n^=pBo)i*Z?oDNyX;FO6+S%sh3vxK z>xjJm5^D+bBP4dS1p9^wN0x2*CK{bB25Z}x%oL6+6YLw7F=-tlufIe#VKyW7edQ#w zyh8BCsO9x`W-?l2?6fs_V^ns+_CzYr?<1QqKSg3Q-k<+6NFtHIzDmM)iLukxL?XeT z|1v0JR52pY@8dyXwjj2x<|MQjp?6^1wyNP_tIE=;cVL{*VnoKYml1it%7eljM`DfT z^I$(oMYXkRP*uYx#HQNvx0Fb#h`-;|;k!Z}(9WBPIGBf1W z&*Q+e(}rpjr*YEufzfF?w>N2hY*mAFRkjU@>6gLL zDV(bi9_GqSP34^?&7_)>bcxYiA6SVe7`=1%uO%i=M(^BZC7zHujc^dS<<9sgC%4CD zNF`dl4>hbKk7gUl7%RQ3~N5%1fn$S#%@(66YjPASK4g40oZ-j!Wj{ zj2q!3TJvUV0sI)*p))!;=eYeUs;n@5UWDiF+`^Rl3!&X)bi#lz6LSUe4gtBUtk;c% zFzYIGx#_Ts;fYxWNA1u0cLro>cMdDRrD+%t*%yad|2%iW0Q3|1toMK07gUrW1f_vMSPNN}A`{oUJJcThe z1EN|xcjXr6uH3@Ky}CQJuv7?b{Fm@}+_YrVhDkY=l%So6MHz4_a64Y;7#q z&=rM@3z2sctZI-c%sX0F1?CzXPGJTS;h%C+TNPke=T?~q{=a5d=T>Uv+(rI|2jZb+n;&=s5&kJB zPw)N;KA#7tr_ohZR8^te@1orALRA%~twBY_=kxIN?yty*5=-UzePr7ua~lzp>mPF6 zEl}oX-&fl>b?%zX!!4nA=Ak|KeA!3S@pzoye|VM)*Tzs? zro@PmrZP~ik^}LO?57g3_%u)j5ZR-~QqvFW))3&#d4$(mdYL$cxV%SW^@L zpU=mO&mG|L4yl2iY52SzzH@Y+j3^-TIP2xA zv9+ZERk3!LOjlboU*97&!UvJ3IS2Dv!YGK4f|`pkF5uhGevO8@D$8n%iV`n1>opIS zeunNl%I5;&%^Pf`#8L})6~Vak1q=6+p?&t%EuQq zcW6oD0uJx(MBYj7yV4tScN!7rQOXs!c!@5K9o>u9>o#Q$YIr8f`=`%I z8~pz1a}3W!O?kH0>*mUH%BRcs6%mqvHE#n?)m)90^q=0fjk zG;t%eHdL_xv39m?-Gskb90*#D#ke&vOwYwW`p1n&qAl`yIk0O72cOs}yUQgL+rurU z$tytV;?gqje;nj|u-}w;%5F7IU6t5ZHg$Ii#bqdFvbd+)#S`7FJo99CKF3g091KvJ zChw5GQ*#Tvcjhv|zQWkynWnqFndc5XLS1!5K9?6nNZ&Muf?yAg&+y-8F4I3Wi7D3P zfeUDDspoGFJVHx@rWcpBD5xOVX$*&rUkFF};^rtb^l1YVu(P`%9!z_fO%!i{agrh8kBdh#dA!Jbyb6--^EPAj?7!cl2e}QE1IioD4Vo{c9 zdjmI%AYztSb3!s7tP}=Bi8+o4lxFQ>jeU$D7P(F$u^f^wRtuBHj|i0ZIuaqa3X~9H zK>ZduRvyj5E@9GCBVux$Kq9JBfe=G%G5Q&6Y@DzHyM;-!84>>JWpvIO*ocbQA^8Sb z_I+86Q^KU#f@p(|BN4mCCT=0xkCQyGZPiYk7ABM3i1;bbV}D0s1aWBS9WstWI7uN1 zlgTzjcl#j1*L_YG_jxdhI30W{l{C)<*-fDe^B}bd$KC1Fj&MsHKun&d6NpK~bXr6> lG3rA&nn?ea3g+S@{|8ku$VesII4uAG002ovPDHLkV1l;k-0A=T literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout-w900dp/medicament_list.xml b/app/src/main/res/layout-w900dp/medicament_list.xml new file mode 100644 index 0000000..563f006 --- /dev/null +++ b/app/src/main/res/layout-w900dp/medicament_list.xml @@ -0,0 +1,38 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/activity_medicament_detail.xml b/app/src/main/res/layout/activity_medicament_detail.xml new file mode 100644 index 0000000..160cdae --- /dev/null +++ b/app/src/main/res/layout/activity_medicament_detail.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_medicament_list.xml b/app/src/main/res/layout/activity_medicament_list.xml new file mode 100644 index 0000000..4f86cdd --- /dev/null +++ b/app/src/main/res/layout/activity_medicament_list.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/medicament_detail.xml b/app/src/main/res/layout/medicament_detail.xml new file mode 100644 index 0000000..c08e7cb --- /dev/null +++ b/app/src/main/res/layout/medicament_detail.xml @@ -0,0 +1,9 @@ + diff --git a/app/src/main/res/layout/medicament_list.xml b/app/src/main/res/layout/medicament_list.xml new file mode 100644 index 0000000..4b4db2f --- /dev/null +++ b/app/src/main/res/layout/medicament_list.xml @@ -0,0 +1,13 @@ + + diff --git a/app/src/main/res/layout/medicament_list_content.xml b/app/src/main/res/layout/medicament_list_content.xml new file mode 100644 index 0000000..3df9ca7 --- /dev/null +++ b/app/src/main/res/layout/medicament_list_content.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7a892ff1072b660f0da436e0da4ad947d671f0b2 GIT binary patch literal 2294 zcmV?=FxunUlYt%CJoC_Oyk%eGU&lgk-xyar$(N51YFWCRSz^{GNyX|L?g+9O4j%IJ|fSY=HlCHKM0$@Me%2Uj%9Jb)Xtq12O3Toz8*Ih0cl2 z%?UIZGJPXvlZze+)Id)HJ{Ed9H#$c;*FM7`fB6M+k#Zjdb7z#(x%LSXr8-F9bV9Oa zQZJojFDneDpmXk(lc>CW)Hx2FMCa}p5Hb89gu{Z)-60^l3=UR6bncD;(LQIe0wQyF z2#7UReYj{yN-I{ZI)l_D2k`erdypLeIbzq94opa7?k)o)mFuy0<`y(OI0=|A0hlty z_Hp!RVCYc%_qV~=6qiZTwtescdXZ#I_1LL|k`z#@fp^~p($awRbYSOBVC701u;If| zJT4qBC7c{QfG8Z(NRlNFKMX`i1CKps%bZ6a1;WCBHEV3JKKckqNB|ys2puG&zMi%m zG3&4THXx~7hidMVg;~oAFyi|uy7&Z?+?oeKkSumMufuX zn}9MRH+2QlQ;_n)R8oct1#s{n@cQdOXee;+y{H*I0h?p@BiP&g?cNV4NYjDJ2d26Q67MIHJ?$i$tW8a@SS&CajSNz4y$*Z7F(c}49p2psZCjM) zK0qYeNGGnZs$yWwW;3i-EBk0L7#OH)H}%;1SqnlodMTg~(hL1KLFyJb?UN=!UslFI z(9rAkXtHNgOG^uyo159^=-1Ab8SwIlt=0U|%C6bphCwU8uTLR4Y_{u=idD#uK8uCz!$q^qlQ2#5~~h63v1r)n4Y z$@vVjk_>7Aw*G)CuA4#2U!6YDF`H0HdZEmiKCLGXd61L_t`UT8gz|~eFoH>pJ-MI z{dDwu(m!o)_w<1o6*b8sl>sy4H}C{UAaSP&q+^In*5YY(He@gF!w-TyrAsaW)SaKG(0M;q+|c7M8CFjo+VhZ%q}+Z%7*~oYt_btwr?6Og41Y`^kThC6 zr~U>X#weis%>!MV!p9$XDV(1CL|@a-H#X{!dZ@*7zt!OTBI=}IWgSB0R}sNoz-;b} zJ)3e_Ha$bKX_ev#4o575b=ZhbK-T5U-2zAmie`}zQax!268_ohDL_1=Hn#i+sdTL5 z!nmIiB`d;Qc>!XS$BCPA@U+GT>a|x7q99-n17wlQ-3mxpc0w=FRW5jg#{lscZnu?O za+5uqt`Rqt5I22~`SO!ktfFO?!^)0=+MMtKE^d9#BY=2`)76gu^ZInFhXHlTCIfNP zEl9X>M9BEE%VTBtlwIP_Zq(wvgXd6jz1Aa;_~oC*p}gk)03_(RiJJnGn-Q#Pw3l5e zq_Q6|hqMF>iJz7v-}cjsTXKGQ_5{Wz4DJdWaXEm(F1^rD-8V&=+3fhv9$!sTDIEJ2D2wWsdt@5;l&$n1yuO6 z(OUrhx+MrqF%wXF);meKD~Oc+L^|>By7kk}%p#Om*0=@Gzw%Aq21vNt+5M!Xe!9Wh z0x5Tn_=)W6NZBn(>~i^3A!}|L+pqaVpEDy-?*8AlW{v zCp&3Z1m6~zSvO9PQY2g%BDwQ+Kap*Vy)EGV^w!6PD7|{C&v15sW%lG=%pHE>+kyt> zr*OJ$A%2=`_mgnjvMeZi8C= z#&I0Vx{S)3U5{;R>U8)r--!5~t)736qDTFtsDVUY!TdD4(@(jbpq6T~S@|XI$j8?7 zB5X*zfS0ykhBT#$wG}io*)@F!P|tn}`<0*a?4Y#7QQ0iwlCu$`$i*C4KHCSIqZ> zJ29X~EA$LXDm#anvNM=TvL`a}EF?)K1kf+6dmki#x&vjhIf^u!G^-?B1&LCG%B~=U zI!LKw-{<2c=D<;GGiUHj>Uh%eY@xcPlJy<||G==zZ6IVRkM0`AsIK&|iad^Y{AHCe9b}&)8 Q8UO$Q07*qoM6N<$f>!fh!2kdN literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad3ae5a73f35561ea8fb3117017d374111ac539 GIT binary patch literal 1329 zcmV-11Hk?^tGm?nXr|+$EhGYoLI0YOr zGZ+oN#QBnJ5{+@$=mbRAGPF~0$V6Zwld-L@l$JsJ_ul7e*h z|K)|4JP*QWC1|MxoBUKTGq(@dZ-NG(Ir^%Aei2kaKQn-j{?B^xGHSOS!l@0rp~G1xzBekhz9`!yp>Un@x;wQaWPO@%0*rtoYD88L9`F)FAWJ7;Bb01uxuHydNr_O z1+aWMux1TVPykeu_p-BLyXSt?rdA+HF(xd4%;G_eN8AmBh20wA;Xq6bAeRG`l|VuQ zhN5Gk&iR6f<`M=#P1+mYljlc71P~Vol$Qf460oeENXOrg#1)-IoAXcjtBiGG1@|_*Yues(5U=m{a4J5yO0g@fH=y_nBU&%XT zV__N@xdp%z7K;UTyPXaCym!z7^(W*0`4LzPIU!b#B9ZAunxqv^%1)ssTZ`)}SNR06 z)z!_IJU?g^_|1=fwE&L0BE5?1>(}?z zR@4i=A78cFkp8+ebcZ<(!h}R=A0A=O<1u*?wyPUaRD29g8#3VvpYr48&YgZIKa(G{ ztpSIkH~ z=n4^l+X<1%fjA;|lJqZZWqwActOZZ2bjZ`3#@pLVF>thgRsj65OP?P-X%8g;w>NmI z5ic7?GV=#gnR9Gg<*11t2Xy$Lp$o$!H)ah&qqENvY5*RHiX06T7SdM#U^CN&ZPGS8 zq4=L%qIv*X&zNF*P?7DkT@*^jIrxdcR3)rPab4h9X- zH#FA(ytWc4#}F^Sh9u@sGOap@AI+>Ex!OjQf7pSZ{;L54oM^Yr2LK;r!ac42C4O`h zKhC)LVnHUd;(1O!;A#!AUk#+mHtFFL2m389&EyiGnZg6 z`1a$?uN@)W2ZB2Kdi*dDKl=ao<0-cvlEbZN?zjx2m%i72Iv&EEc-C!2$1e3_gguhb z-Q42`tw>R23l7!mQSs456x9qMQDf$u5(dC@Kdd}I&LK@FaV;o30KOmNEC}7v=|M4B@;j1C ze#1ryser=D9bE(qFs-#jN;?Z9CZ}FHhS}GI<$xa`Y&gC5zFz=~{qOZV;eumvUokEE nOTI;a&3Z>%bT6%?71;U@X8~cu_Z)L^00000NkvXXu0mjfGc#by literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2842f956ca0e611f1073de3f49abc5163faf7fbf GIT binary patch literal 3136 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 at^Wh=18KhQQQ9E@0000Sv}W)e@)k#Q<%4g-Jp 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7c7d259e8c12cca621b00a7048bf07fa728768f0 GIT binary patch literal 8074 zcma)hgh98rAV@c|bgqC%@6sSrf`a5qBS<$$ODZAKDJYM&YWwW=RWtjqqVhE$w?VW0RSLZS5ta+dv5>lASS#WpUt@t z0RWqhx)M^)XJ#vt$VX3~uD7^p;^q9f`D{~AQ;D;h0@;@oAcP%HplE3(!A6w-E~Os( zIxkTu35RBg-TCLFm|BuC&NY^0`}>nG@6R^JFaOEahwO+49N{NfI^k$L*whFSu2g z!j7{FACvRlYZ0nNGE$mwd{6KWFg#Ot;E19~3KJY{yBAdHLK*p0*n%66nK`29?F@`D z(S$OMV=Ey-O`}!+-`!;uv2ZDg4X%{wnxp`0w0t%C z@N1A9w^`j2myPv^XTEiL1|eXZ*kQ{GxWNV*fqzRQ6P)Wo}2} z4O=rFi?xRFT?p14{9vj0%IC|Pkjo89F2jA4)L~)HTin@z_x1f&(qc^WomKz$xIh;M zvIx*F3lITsVi~-CL`VBM2wdX;GV`KD|IKfIXNYHLNq+eYDzJXAcum)^DY~>A6KwGL z=cFm}#pwVXrL|~CNvGS{`5b7ugDqPXGn%@O_wJtXGwaq%kENy!tlTyr`-+bLIe6?XO&`uk)<$z-Me51Y8xILM_eI-8TP=tB?r+No^TwlO{ zq|Fg{-gRWYw-j1ptOUWXf!IUk3U>shC#xhzs`9B^(M8vf8Ny%zkJtdjp(xT|GbeG^I#oZul0ug@~6 zoHVGZR>`G+s|&@SyzT3wi0ntCQL}Ek+@nX6CFLK7-M{GDl7700B-ho3J<#L4XI6wb zU1eGtdrEtkny2XP>+47FjFMd;wxfxHZq}G~paF`VzFMqtF{c71&2p7ABaVBR^dr}# z+H^1~A^Ac`WcJui?hy1PHt5D*|KQa+P9EVUzWcAFz3qlP;No6|4ax4PDk%&v2A8v= zj9DCDb4k8tPa)_58Yr-ly`S|mS-Akc_X*GQhlaURrZ$(S$j@cZ{hF$hDt20^=|z=- zcURK~1OrYo_eu2bf9?4MZ@cpTBja)!y0a4i1M_a9K8gTC1UTI%A{3X$bQcP4MeADx z=A-=1+H%RF{SQxyC`O6c_}mc;!H@GW*VL)floaf!loE z%O)@GMjI0kaxe*?-EX+)b|=RhKhxW}*>Z1R>KGu>?p+@geg|jI-kmTVkb*Gg9Yg!V zCijT$Rc`LAz#fTYEB687@_x#!s>T}{55d?Q9PFnVbW}$qcLC zbeabq`T>~h>VM)oJe4zWpZZy^zm7(4Ac!w}%h-B(!5~yZYB5Ubf>a!(la2L!kt0(=u z?#NNTwaT<*?7*?u&sY+ZKBF%BSyubcz_qDNjMXpU3Iw*|YEsVhEAZB`~5vrwcAjK%TQ$|9PoQVzP%o($a>1TqH&;X6Xy6No#J-_k_XoJ zAn64Uc*|-tZ8hdv@Dh32{Y7X20k#@DG7q5s?**T=ouZ#Pi}RD5p03PPk_K+3nSATj{({wDU4EVrW!ZXc+;r+S2?Izy##N*~c`}Q8nr+>9#eFDurWjP?I%{D(NmY z({}coX_p;hueht>#Q1>075Cf;sKPD%M=E}-Mp$IY9tmUaNN<^AOGuBNi$L{h@ zvz>ASY%jBxF~Ag4bHS(+V`YJk^FCqEt=Im7@=7spbDql%(`f$nLl+6MxojYn;X3OE z&&qi-t?bxqDx&N~8`E%T-=(#*C5j_{+&$pFJuX8XBwN4$ddW+QA7*bWN7P z1HVqf8^ZS6I9TfQ&a(pmmM-x)^Dz<4rb)`P$XPeVKYji>4fgRgZ6Xuf0zL4BhrQM( zFM%1YvhIG38+v+}QM~yWC_pyqDbao`YVxN{n%tdtF?1jEDu|VpmHC8(O2MG7P-l$? z0Ti!d0{j@gqRY1klsXH{9m#2;K7f6U3j`}60IwEwZt>zJ4= z1@yii=utnP^3I1%XaE(qcUyx@9&m{@KiP=dbp9;%Dz^q&E?N=e zKGxqn^rW0wjer`r*tg|vb^I1w#Cpdt;)!Vl(Z|-R^^r=2Z)XL}EZN0&KnpEaa!>#C zhi<*n94d;3XYky;TMu`=HZxd0>R6j-HEc=*X0~XhpZ?rE^lZ zI~3p4R!8xwBau4X=g+K1*jYS$mlh~3yMFOU;gXv;jvs+OB!L9kkRO{}8Mc*N4D;|> zR-Bsuf_iTYE4X;%!yz+gFu=g@#_GipG)^WQcAyicvZXl8JHfSOa3dqG>$@1JMT-f% zZcim={0H@@qg%P292Nt%32+L4wgAAFYlBKt-y!R zJyOehyRQrkwO*8Id|focj3iV=9Ya^o7p{Zd!7!@8CqRWIP@w@-Fl2HDsZ2)cuTv(* zS|l<=(O=QknceyAZ=O9?I8TT`T_FQew6g~>R#`h@7etTD@YI1Ch}8_Y7yug41V+R- z$pSgYMu(Fl&|@Co7%w4l7H6v2(qQe3tZnZ-DZA2~kJs$Zo+K(?JhDLOSP~wn_FX_a zTKj+l)XwS^HOB)O@rt%P9lkN+0QwL&MdA?gLMv@A((UL=y8d}q_zsX~T>)6BJt5tGt=VzPOUEhEM|Kt5aDL~r@d_;<{*z6-#??>zG}Jg|a5P8& zj1Im43?8x9Y1;%-bCNMDH5WZxcbJJ7O57N|x379A{s-r-$3vJprc9{z8DwQ-M!KDq z5t16Y`g|~!W5M%??a^FG_YNthLZX~F=@HE}7KHv`fiM$MI25v45Uy&!ANHXR7vsp% zbc&y}wu zs&S10Slc8b7KV8~MxgPxzMZYZYN<2v@y!YF9} z;f1)6hj@XIX(6{zq!jX6m9w>df8?X|VotvQ#r00xju;^AUuu1ms33o1D>I|{97r=D z)trF5a0$jPg|QG%5EC0X!fdS3r4&dLR~{HJm#e%Pc2cpodaRI92KUkp{7TCw@71>k zIP^``zMM@)RGjR%%$bMrF2L8^FiYuAUzd|1Kd=yclMvUDKCNJ#&ka%#1|cmENFh-} zow!s8gpwUX3!8f=^O*vli~89E=ig75Th4hVhtA_!Hma9joln(z-{dq~mRSR7cCSBk zO!2ax>eH{d;)TTGg=CM43ET<%CbKTgP8{D~gSGN$0XR4`K?$imE3FMT)@w)&n74=2RmUk-98f{#dzZX(f}HXN)kzmo@D5dgEWpWDoH)|vuB5Dd*`=p3^V3fP_|AS2wGrVSVXOw3 zrp_-^pVBlf@5aJGR=$(OS4%Bn>}3sc!bSI@>wbDgJ5>dLs6rY%oJJrKY;12VUVqKp zQB^L9VWdEm81Q`?zOBXn9T4@%=}(1Podk2*FHTJ^0u@BTwZhumi3H>tQrPEEL}7(lmoz1AJK_IUk9OGf=Fwo%p$rmffH_uw9VR`1U(ED4!*`;c4OAf^ zZ@)!0)MwyWd-ywEWW(C|Yz5By7zsIFwGD6BI)WW1t?Sl=<_%5PCmrm!+W3`SA#q6GF z!SdRNS2A7>?O-c&y1&zi$o4Fe1^)(^d7-`-5G&bBh4)3@WS09!HPTd3QadvzHX;xl zct^(6`GZ|wl|!ll-Shzw3f0!txlOI@H_H89uKi?jc)322+{;}%o6X15m;pTU`z_zX z2=}KXatg-RV@M6KXCwnDa<-Am?LGRUZX0$;#UELCudv z%;Hf5mQZ{>DwzSiF*^MRz#Z?FXHtDC?%GAJSuB&Q(T7zIh0LWJrSFvA&vR~QieK0! zLViIl-l+Esed#sYJwhxMaVbfyS_AhVFyR~ffCmWk|CM=4ToAsu)lvN{l;fr&)tKZm zr{tUgZ`k?Z6;RZ?Sz!^daY9j<=4#^D)I? zW6t?i@XA#viCFcn=4!cg;5meBkq|%bI%6Bz4M@*38KwW8sVb^7P3DEphbg;`4RH2e zTcxsKa4E`%jc3^<3C%CyWNnmtLpKBTKuQSWRnB{!#wnG0hwSInt|bO^3|AemRW88i zmuJvP>)xzfp&$adcsO z>c*$Cfp@gBtT9%Ck~{p?fcz@d#yIaRGVa6(nU$L>1#1E#AEyFbt; zl9x!XnOnNE8d%9dL{SaL%@#iZSm%}G-0NMP{zCU_R#IzGv;%BE>okd+Y)4@$Q?+0i zYgS^ouvDO?pw9 zv+Y=eG;q~by|y|`_G)Q#&_$er{jewI!h1pqPvi8%`s#{Tq2JQr2`Jjz1^*rf(JLwe z`^V56g!bd1ySMmj@)~;#+}{m&0A31$mChEt>@9P?ME*3{BD5&kJP$qZ5#SjbLY}96 z*?0Qu4z%nAGQ=xhxXtPX!>nIz&YUL%jrErC7Yvz(#>!D##GX3R_>Ghb5VlJp(Z8W_ zjN8_QY(L8FH)YG7Ul8Sn!F^tKsBAt&cdmhq0-h_PAy~tB^VvE0l)-T2w`5&gSZa;n>Mi?&ypqCnH@UXHNcZ-m3M{n0Wepf`hev5n z=iXH9w6yoA7e0m2dCGP$5%={mqMVTKGfhu70ULTOh!?l(TGV->AUYJ$;p- zr%Xy>+o&M3YCYIqY1hV=Pxc6{?B? ztx4pYEQ9i{vusn$%?87d97^FhpBLA%n*;FGci+nz3a5~iBUmrrSryGZZVUu?I4qH zqxDD}Yxv0uP=UWRM491l1aXPGpaJPd}yxqm!3u1BNrZ?i1?6#2S=JNQ2Aoz3A7eHBph1YVtmlW@u!* zBy$8Xi*3ecxrXsp7hFgAr3PPynZAOff(uA4Nu) z_7YQet>}io(26{JH=df=Ldk}y2WwQHSfBm7I_12_#wPT=Ym>k?%1;i;l|8Il*Z{6F zb9Rj8DTGnpdMg9CI}IdwdFuV3lBE zP2#v=8F--QF*^Em;E@+;93tT|w!C%7@oMDrX1(@)I`LtpGe~eAQmj*b5?+ z+)`Ff3!*S10=$P$GVtMM)Hl2R{L5{+4}|U$D541PMT&{zwG=U)5x`^Qh{Qf`;!DYa zW>gLJVu~A!;&e1nYfgHLr_9^*%?tK>HBVk*bn%|Y&c8t%U7O?KlPG31oloK=Z~|%_ zR-g`qC*!%YEv}xQ=^>}*DEGd7n6jG+(U?|E>*a)^6XFl72Nt7Tq zaa3XrmK?LW5SP`RI1eSk*V)&;ZS^d-X%Ml?68u`FfkZu4wA3Z^Qz=8#_l>VJH&U>0 z)ql)%tnb6qBh5r75YPh@_HZfV_sWF1%>F6|L@$x+Hi@?ht|?2DF|`d}hZr9~;v zQxK5m1V#pN9)@mlA^=1|7daw1R-@}!>#5@GRHcwz#5{fU*M5j5XBd_k7qmR^)bM5@ zF$e#3pMn&g)mw^oZxA92Sb7kW`?Rr(=mEe?@y3Ik_^Tvh!lBq|c0Dp3_75FBhbu=%$NvA~&#`4s^?>CVa4C z4%DWd+_1#%vyTP>nWH#u4rSqgfkzVDCetX5 zO9&A8)P}(H!^dwx7-2ZaPue!U=6{AoB5sp0*`OsfHDuo`gyQyzvYrFR!tvBUfb&gP z3bKMEl#&#cQBTwA-#rYV8z>3M*qOt=F8*p(K%a`iyt`cC)Zli?k&gfLqW^@Wr2*Ou z>|Z2_QHQW}q!fYU+nT==KtYsy>VU9pWQwwYC>oZ;1gmNqBF0om{`TBHe0 z+FjQsW^96w869)H<8r#)LCo+kZonq#*6a7V%AyG>{x#RV?p({bN8)!OkTg;wpk}SEV?F%=0DMq2km2X zl2W6}NMqu%di*YouG8lU&25i)Ig)=(Dy-|fj@Aqp`CGblU+eI@%RM-JdETJZua^<% z1{u1fW3|xl@{QflQFF2G#>)b91HXsuqNPLmhqXItF>H2s$E`d5lOic1HSB}bPzug@ zGCwTD+>KB@xP0_7w2$qL7${P({L;oRd_v9hdyC^J^sZR2KqOtY$SV5NFK*4^pc}Pv z>b6SeoTev?s9z(E$^*ah4Az+P`1KF`)u(kWU#U4K@;Ij3`pQdojHd1pYKry$FeSa` z+cG zRoy(&h?KuTsCSi+z8tFMEf-qBe^@u4FqzKc{fu@}kJq|D_tpyeHhq4<2Upn!L|dMB ziw7x--2{X}75hK>@*rvO{Wt~cJo5Tj@q_<^XniYe50+2dfWWgVX0I#95`o)IU0F-1 JOu;JT{{dIr9)th@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml new file mode 100644 index 0000000..dbbdd40 --- /dev/null +++ b/app/src/main/res/values-v21/styles.xml @@ -0,0 +1,9 @@ + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..3ab3e9c --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #3F51B5 + #303F9F + #FF4081 + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..868016b --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,7 @@ + + + 16dp + 200dp + 200dp + 16dp + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..9684ed6 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + PillDroid + Medicament Detail + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..545b9c6 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + +