diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb6828..5d19981 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0a8ca4c..df33a52 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + @@ -28,6 +38,10 @@ public class DetailModel implements Model.Detail { return item; } + @Override + public Bitmap getPicture() { + return pic; + } // detail <-- // events --> @@ -52,7 +66,14 @@ public class DetailModel implements Model.Detail { // process --> @Override public void executeQuery() { + notifyDataSetChanged(); + Message command; + command = Message.obtain(); + command.what = Command.ITEM_GET_IMAGE; + command.arg1 = item.getId(); + dao.executeCommand(command); + } // process <-- @@ -61,7 +82,6 @@ public class DetailModel implements Model.Detail { public void setPresenter(Presenter.ItemDetail presenter) { this.presenter = presenter; this.item = presenter.getCurrentItem(); - } @Override @@ -72,5 +92,14 @@ public class DetailModel implements Model.Detail { @Override public void onEvent(Message event) { + switch (event.what) { + case Event.ITEM_IMAGE_LOAD_ERROR : + break; + case Event.ITEM_IMAGE_LOAD_COMPLETED : + pic = (Bitmap) event.obj; + notifyDataSetChanged(); + break; + } + } } diff --git a/app/src/main/java/hikapro/com/backpack/model/ItemModel.java b/app/src/main/java/hikapro/com/backpack/model/ItemModel.java index 459617b..8b16719 100644 --- a/app/src/main/java/hikapro/com/backpack/model/ItemModel.java +++ b/app/src/main/java/hikapro/com/backpack/model/ItemModel.java @@ -208,7 +208,6 @@ public class ItemModel implements Model.Item { command.what = Command.SET_GET_ITEMS; command.arg1 = presenter.getCurrentSet().getId(); dao.executeCommand(command); - } } @Override diff --git a/app/src/main/java/hikapro/com/backpack/model/Model.java b/app/src/main/java/hikapro/com/backpack/model/Model.java index 157a71b..9347c1c 100644 --- a/app/src/main/java/hikapro/com/backpack/model/Model.java +++ b/app/src/main/java/hikapro/com/backpack/model/Model.java @@ -1,5 +1,6 @@ package hikapro.com.backpack.model; +import android.graphics.Bitmap; import android.os.Message; import java.util.List; @@ -54,6 +55,7 @@ public interface Model { interface Detail extends Base { int getCount(); hikapro.com.backpack.model.entities.Item findItem(int id); + Bitmap getPicture(); void setPresenter(Presenter.ItemDetail presenter); Presenter.ItemDetail getPresenter(); diff --git a/app/src/main/java/hikapro/com/backpack/model/dao/Command.java b/app/src/main/java/hikapro/com/backpack/model/dao/Command.java index 5542a54..3a86701 100644 --- a/app/src/main/java/hikapro/com/backpack/model/dao/Command.java +++ b/app/src/main/java/hikapro/com/backpack/model/dao/Command.java @@ -19,6 +19,7 @@ public interface Command { int ITEM_PACK = 0x7A; int ITEM_UNPACK = 0x7B; int ITEM_GET_CATEGORIES = 0x7C; + int ITEM_GET_IMAGE = 0x7D; int MY_LIST_POST = 0x8C; int MY_LIST_ITEM_ADD = 0x8D; diff --git a/app/src/main/java/hikapro/com/backpack/model/dao/DAO.java b/app/src/main/java/hikapro/com/backpack/model/dao/DAO.java index 44a87e9..9265162 100644 --- a/app/src/main/java/hikapro/com/backpack/model/dao/DAO.java +++ b/app/src/main/java/hikapro/com/backpack/model/dao/DAO.java @@ -5,6 +5,8 @@ import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -108,6 +110,7 @@ public class DAO { SetTask setTask; ItemTask itemTask; + ImageProviderTask imageProviderTask; if (command != null) { switch (command.what) { @@ -170,6 +173,16 @@ public class DAO { threadPool.execute(itemTask); break; + case Command.ITEM_GET_IMAGE : + Item item = findItem(command.arg1); + if (item != null) { + imageProviderTask = new ImageProviderTask(Command.ITEM_GET_IMAGE, + Process.THREAD_PRIORITY_DEFAULT); + imageProviderTask.item = item; + threadPool.execute(imageProviderTask); + } + break; + case Command.MY_LIST_ITEM_ADD : break; @@ -320,13 +333,48 @@ public class DAO { db.close(); return ret; } + + private Item findItem(int id) { + Item ret = null; + Cursor cursor = null; + SQLiteDatabase db = null; + try { + db = getReadDB(); + String query = String.format("SELECT * FROM %s a WHERE a.%s = %d LIMIT 1", + Db.ItemsTable.TABLE_NAME, Db.ItemsTable.COLUMN_ID, id); + cursor = db.rawQuery(query, null); + if (cursor.moveToNext()) { + ret = Db.ItemsTable.parseCursor(cursor); + } + } catch (Exception e) { + //TODO write to log here + } finally { + if (cursor != null) + cursor.close(); + if (db != null) + db.close(); + } + return ret; + } + private List readItems(int setId) { List ret = new ArrayList<>(256); Cursor cursor = null; SQLiteDatabase db = null; Item item; String query = String.format( - "SELECT * FROM %s a INNER JOIN %s b ON a.%s = b.%s WHERE b.%s = ? AND b.%s <> 1 AND b.%s <> 1", + "SELECT a.%s, a.%s, a.%s, a.%s, a.%s, a.%s, a.%s, a.%s, a.%s FROM %s a INNER JOIN %s b ON a.%s = b.%s WHERE b.%s = ? AND b.%s <> 1 AND b.%s <> 1", + + Db.ItemsTable.COLUMN_ID, + Db.ItemsTable.COLUMN_NAME, + Db.ItemsTable.COLUMN_CATEGORY, + Db.ItemsTable.COLUMN_DESCRIPTION, + Db.ItemsTable.COLUMN_BUY_URLS, + Db.ItemsTable.COLUMN_PHOTO_URL, + Db.ItemsTable.COLUMN_PHOTO_THUMB_URL, + Db.ItemsTable.COLUMN_PHOTO_LOCAL, + Db.ItemsTable.COLUMN_PHOTO_THUMB_LOCAL, + Db.ItemsTable.TABLE_NAME, Db.SetItemsTable.TABLE_NAME, Db.ItemsTable.COLUMN_ID, @@ -421,6 +469,32 @@ public class DAO { return ret; } // updates + private int updateItemLocalPic(int id, String path) { + int ret = 0; + SQLiteDatabase db = null; + ContentValues values; + try { + db = getWriteDB(); + db.beginTransaction(); + values = new ContentValues(); + values.put(Db.ItemsTable.COLUMN_PHOTO_LOCAL, path); + ret = db.update(Db.ItemsTable.TABLE_NAME, values, "_id = ?", + new String[]{String.valueOf(id)}); + db.setTransactionSuccessful(); + } catch (SQLiteException e) { + //TODO write to log here + + } catch (Exception e) { + //TODO write to log here + } finally { + if (db != null) { + db.endTransaction(); + db.close(); + } + } + return ret; + } + private int updateSetsOrder(List reorderedSet) { int ret = 0; SQLiteDatabase db = null; @@ -738,7 +812,67 @@ public class DAO { } } } + // IMAGE PROVIDER CLASS + private class ImageProviderTask implements Runnable { + int currentCommand; + int priority; + Item item; + + + public ImageProviderTask(int command, int priority) { + this.currentCommand = command; + this.priority = priority; + } + + @Override + public void run() { + android.os.Process.setThreadPriority(priority); + Message message = Message.obtain(); + switch (currentCommand) { + + case Command.ITEM_GET_IMAGE : + try { + Bitmap bitmap = loadItemImage(item); + if (bitmap != null) { + message.what = Event.ITEM_IMAGE_LOAD_COMPLETED; + message.obj = bitmap; + } + else + message.what = Event.ITEM_IMAGE_LOAD_ERROR; + } catch (Exception e) { + message.what = Event.ITEM_IMAGE_LOAD_ERROR; + } + break; + } + handler.sendMessage(message); + } + } //endregion + private Bitmap loadItemImage(Item item){ + ImageDownloadHelper downloadHelper = new ImageDownloadHelper(); + Bitmap bitmap = null; + String filename = null; + + if (item != null) { + bitmap = BitmapFactory.decodeFile(item.getPhotoLocal()); + // cannot retrieve, download and save then + if (bitmap == null) { // return it + bitmap = downloadHelper.loadImage(item.getPhotoUrl()); + if (bitmap != null) { + if (downloadHelper.isExternalStorageWritable()) { + filename = downloadHelper.saveImageExternal( + downloadHelper.generateFileName(item.getPhotoUrl()), bitmap); + } else { + filename = downloadHelper.saveImageInternal( + downloadHelper.generateFileName(item.getPhotoUrl()), bitmap); + } + updateItemLocalPic(item.getId(), filename); + } + } + } + return bitmap; + } + } diff --git a/app/src/main/java/hikapro/com/backpack/model/dao/Db.java b/app/src/main/java/hikapro/com/backpack/model/dao/Db.java index 26c643b..3c4b4e0 100644 --- a/app/src/main/java/hikapro/com/backpack/model/dao/Db.java +++ b/app/src/main/java/hikapro/com/backpack/model/dao/Db.java @@ -96,8 +96,9 @@ public class Db { values.put(COLUMN_PHOTO_URL, item.getPhotoUrl()); if (item.getPhotoThumbUrl() != null) values.put(COLUMN_PHOTO_THUMB_URL, item.getPhotoThumbUrl()); + if (item.getPhotoLocal() != null) + values.put(COLUMN_PHOTO_LOCAL, item.getPhotoLocal()); /* - values.put(COLUMN_PHOTO_LOCAL, ); values.put(COLUMN_PHOTO_THUMB_LOCAL, item.getName()); */ return values; @@ -120,6 +121,7 @@ public class Db { } item.setPhotoUrl(cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_PHOTO_URL))); item.setPhotoThumbUrl(cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_PHOTO_THUMB_URL))); + item.setPhotoLocal(cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_PHOTO_LOCAL))); return item; } diff --git a/app/src/main/java/hikapro/com/backpack/model/dao/Event.java b/app/src/main/java/hikapro/com/backpack/model/dao/Event.java index e4ada30..7cf77e8 100644 --- a/app/src/main/java/hikapro/com/backpack/model/dao/Event.java +++ b/app/src/main/java/hikapro/com/backpack/model/dao/Event.java @@ -25,6 +25,7 @@ public interface Event { int ITEM_PACK_ERROR = -0x17; int ITEM_UNPACK_ERROR = -0x18; int ITEM_CATEGORY_LOAD_ERROR = -0x19; + int ITEM_IMAGE_LOAD_ERROR = -0x1A; int ITEM_FROM_SET_DELETED = 0x14; int ITEM_INSERTED = 0x15; @@ -32,6 +33,8 @@ public interface Event { int ITEM_PACKED = 0x17; int ITEM_UNPACKED = 0x18; int ITEM_CATEGORY_LOAD_COMPLETED = 0x19; + int ITEM_IMAGE_LOAD_COMPLETED = 0x1A; + int MY_LIST_POST_ERROR = -0x28; int MY_LIST_ITEM_ADD_ERROR = -0x29; diff --git a/app/src/main/java/hikapro/com/backpack/model/dao/ImageDownloadHelper.java b/app/src/main/java/hikapro/com/backpack/model/dao/ImageDownloadHelper.java new file mode 100644 index 0000000..ebc2660 --- /dev/null +++ b/app/src/main/java/hikapro/com/backpack/model/dao/ImageDownloadHelper.java @@ -0,0 +1,145 @@ +package hikapro.com.backpack.model.dao; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Environment; +import android.util.Log; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; +import java.net.URLConnection; + +import hikapro.com.backpack.App; + +/** + * Created by tariel on 04/05/16. + */ +public class ImageDownloadHelper { + + public static final String ITEMS_TAG = "items"; + private Context context; + + public ImageDownloadHelper() { + this.context = App.getAppContext(); + } + + public Bitmap loadImage(String netPath) { + Bitmap bitmap = null; + try { + URL url = new URL(netPath); + URLConnection conn = url.openConnection(); + bitmap = BitmapFactory.decodeStream(conn.getInputStream()); + } catch (Exception ex) { + Log.e(ITEMS_TAG, " File cannot be downloaded"); + } + return bitmap; + } + + public boolean existsExternal(String filename) { + boolean ret = false; + if (isExternalStorageReadable()) { + File directory = getDir(); + File file = new File(directory.getAbsoluteFile(), filename); + ret = file.exists(); + } + return ret; + } + public boolean existsInternal(String filename) { + boolean ret = false; + File file = createTempFile(filename); + if (file != null) { + ret = file.exists(); + } + return ret; + } + + private File createTempFile(String fileName) { + File file = null; + try { + file = File.createTempFile(fileName, null, context.getCacheDir()); + } catch (IOException e) { + Log.e(ITEMS_TAG, " Cannot obtain temp file"); + } + return file; + } + + public String generateFileName(String netPath) { + String ret = ""; + if (netPath != null && !netPath.isEmpty()) { + ret = Uri.parse(netPath).getLastPathSegment(); + } + return ret; + } + + public String saveImageInternal(String filename, Bitmap bitmap) { + File file = null; + FileOutputStream outputStream; + if (bitmap != null && !filename.isEmpty()) { + file = createTempFile(filename); + if (file != null) { + try { + outputStream = new FileOutputStream(file); + bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream); + outputStream.flush(); + outputStream.close(); + } catch (Exception e) { + Log.e(ITEMS_TAG, " File cannot be saved"); + } + } + } + return file != null ? file.getAbsolutePath() : null; + } + + public String saveImageExternal(String filename, Bitmap bitmap) { + File file = null; + FileOutputStream outputStream; + if (isExternalStorageWritable()) { + if (bitmap != null && !filename.isEmpty()) { + File directory = getDir(); + file = new File(directory.getAbsoluteFile(), filename); + try { + outputStream = new FileOutputStream(file); + bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream); + outputStream.flush(); + outputStream.close(); + } catch (Exception e) { + Log.e(ITEMS_TAG, " File cannot be saved"); + } + } + } + return file != null ? file.getAbsolutePath() : null; + } + + /* Checks if external storage is available for read and write */ + public boolean isExternalStorageWritable() { + String state = Environment.getExternalStorageState(); + if (Environment.MEDIA_MOUNTED.equals(state)) { + return true; + } + return false; + } + + /* Checks if external storage is available to at least read */ + public boolean isExternalStorageReadable() { + String state = Environment.getExternalStorageState(); + if (Environment.MEDIA_MOUNTED.equals(state) || + Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { + return true; + } + return false; + } + + private File getDir() { + // Get the directory for the app's private pictures directory. + File file = new File(context.getExternalFilesDir( + Environment.DIRECTORY_PICTURES), ITEMS_TAG); + if (!file.mkdirs()) { + Log.e(ITEMS_TAG, " Directory not created"); + } + return file; + } +} diff --git a/app/src/main/java/hikapro/com/backpack/model/entities/Item.java b/app/src/main/java/hikapro/com/backpack/model/entities/Item.java index 10adc19..dfe6d59 100644 --- a/app/src/main/java/hikapro/com/backpack/model/entities/Item.java +++ b/app/src/main/java/hikapro/com/backpack/model/entities/Item.java @@ -34,6 +34,8 @@ public class Item implements Comparable, Serializable { @Expose private String photoThumbUrl; + private String photoLocal; + public Item() { } @@ -104,6 +106,14 @@ public class Item implements Comparable, Serializable { this.photoThumbUrl = photoThumbUrl; } + public String getPhotoLocal() { + return photoLocal; + } + + public void setPhotoLocal(String photoLocal) { + this.photoLocal = photoLocal; + } + @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; diff --git a/app/src/main/java/hikapro/com/backpack/presenter/ItemDetailPresenter.java b/app/src/main/java/hikapro/com/backpack/presenter/ItemDetailPresenter.java index daffca3..8fe9a0a 100644 --- a/app/src/main/java/hikapro/com/backpack/presenter/ItemDetailPresenter.java +++ b/app/src/main/java/hikapro/com/backpack/presenter/ItemDetailPresenter.java @@ -1,6 +1,7 @@ package hikapro.com.backpack.presenter; import android.content.Context; +import android.graphics.Bitmap; import android.os.Bundle; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; @@ -60,35 +61,6 @@ public class ItemDetailPresenter implements Presenter.ItemDetail { } // life cycle <-- - // recycler --> - - @Override - public int getItemsCount() { - return model.getCount(); - } - @Override - public void bindViewHolder(DetailViewHolder holder, int position) { - hikapro.com.backpack.model.entities.Item item = model.findItem(position); - holder.title.setText(item.getName()); - holder.description.setText(item.getDescription()); - holder.title.setOnClickListener(new android.view.View.OnClickListener() { - @Override - public void onClick(android.view.View view) { - showMessage("On detail click"); - } - }); - } - @Override - public DetailViewHolder createViewHolder(ViewGroup parent, int viewType) { - DetailViewHolder viewHolder; - android.view.View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_detail, - parent, false); - viewHolder = new DetailViewHolder(v); - return viewHolder; - } - - // recycler <-- - // process --> @Override @@ -110,6 +82,11 @@ public class ItemDetailPresenter implements Presenter.ItemDetail { this.model = model; } + @Override + public Model.Detail getModel() { + return model; + } + @Override public Item getCurrentItem() { return item; @@ -136,6 +113,11 @@ public class ItemDetailPresenter implements Presenter.ItemDetail { Toast.makeText(getView().getAppContext(), message, Toast.LENGTH_SHORT).show(); } + @Override + public void displayPicture(Bitmap bitmap) { + + + } // other impl <-- private View.ItemDetail getView() throws NullPointerException { diff --git a/app/src/main/java/hikapro/com/backpack/presenter/ItemListPresenter.java b/app/src/main/java/hikapro/com/backpack/presenter/ItemListPresenter.java index 1ee0ebb..cc599e5 100644 --- a/app/src/main/java/hikapro/com/backpack/presenter/ItemListPresenter.java +++ b/app/src/main/java/hikapro/com/backpack/presenter/ItemListPresenter.java @@ -51,9 +51,11 @@ public class ItemListPresenter implements Presenter.ItemList { } @Override public android.view.View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - /* + if (savedInstanceState != null) - set = (Set) savedInstanceState.getSerializable(BUNDLE_SET_LIST_KEY);*/ + set = (Set) savedInstanceState.getSerializable(BUNDLE_SET_LIST_KEY); + else + set = getView().getSet(); android.view.View view = inflater.inflate(R.layout.fragment_item_list, container, false); LinearLayoutManager llm = new LinearLayoutManager(getActivityContext()); recycler = (RecyclerView) view.findViewById(R.id.items_recycler); diff --git a/app/src/main/java/hikapro/com/backpack/presenter/Presenter.java b/app/src/main/java/hikapro/com/backpack/presenter/Presenter.java index 347c886..c989f58 100644 --- a/app/src/main/java/hikapro/com/backpack/presenter/Presenter.java +++ b/app/src/main/java/hikapro/com/backpack/presenter/Presenter.java @@ -1,6 +1,7 @@ package hikapro.com.backpack.presenter; import android.content.Context; +import android.graphics.Bitmap; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -59,15 +60,14 @@ public interface Presenter { interface ItemDetail extends Base { void setView(hikapro.com.backpack.view.View.ItemDetail view); void setModel(Model.Detail model); + Model.Detail getModel(); void notifyDataSetChanged(); void showMessage(String message); - int getItemsCount(); - void bindViewHolder(DetailViewHolder holder, int position); - DetailViewHolder createViewHolder(ViewGroup parent, int viewType); void onDestroy(boolean isChangingConfiguration); android.view.View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState); void onSaveInstanceState(Bundle outState); Item getCurrentItem(); + void displayPicture(Bitmap bitmap); } diff --git a/app/src/main/java/hikapro/com/backpack/presenter/adapters/ItemDetailAdapter.java b/app/src/main/java/hikapro/com/backpack/presenter/adapters/ItemDetailAdapter.java index bbf1a00..2a44c6e 100644 --- a/app/src/main/java/hikapro/com/backpack/presenter/adapters/ItemDetailAdapter.java +++ b/app/src/main/java/hikapro/com/backpack/presenter/adapters/ItemDetailAdapter.java @@ -1,8 +1,12 @@ package hikapro.com.backpack.presenter.adapters; +import android.graphics.Bitmap; import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; import android.view.ViewGroup; +import hikapro.com.backpack.R; +import hikapro.com.backpack.model.Model; import hikapro.com.backpack.presenter.Presenter; import hikapro.com.backpack.view.recycler.DetailViewHolder; @@ -12,7 +16,6 @@ import hikapro.com.backpack.view.recycler.DetailViewHolder; public class ItemDetailAdapter extends RecyclerView.Adapter { private Presenter.ItemDetail presenter; - private int itemId; public ItemDetailAdapter(Presenter.ItemDetail presenter) { this.presenter = presenter; @@ -20,21 +23,33 @@ public class ItemDetailAdapter extends RecyclerView.Adapter { @Override public int getItemCount() { - return presenter.getItemsCount(); + return presenter.getModel().getCount(); } @Override public void onBindViewHolder(DetailViewHolder holder, int position) { - presenter.bindViewHolder(holder, position); - + hikapro.com.backpack.model.entities.Item item = presenter.getModel().findItem(position); + holder.title.setText(item.getName()); + holder.description.setText(item.getDescription()); + Bitmap bitmap = presenter.getModel().getPicture(); + if (bitmap != null) + holder.photo.setImageBitmap(bitmap); + holder.title.setOnClickListener(new android.view.View.OnClickListener() { + @Override + public void onClick(android.view.View view) { + presenter.showMessage("On detail click"); + } + }); } @Override public DetailViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - return presenter.createViewHolder(parent, viewType); + DetailViewHolder viewHolder; + android.view.View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_detail, + parent, false); + viewHolder = new DetailViewHolder(v); + return viewHolder; } - public void setItemId(int id) { - this.itemId = id; - } + } diff --git a/app/src/main/java/hikapro/com/backpack/view/fragments/ItemDetailFragment.java b/app/src/main/java/hikapro/com/backpack/view/fragments/ItemDetailFragment.java index 9673463..b7c3de9 100644 --- a/app/src/main/java/hikapro/com/backpack/view/fragments/ItemDetailFragment.java +++ b/app/src/main/java/hikapro/com/backpack/view/fragments/ItemDetailFragment.java @@ -71,52 +71,52 @@ public class ItemDetailFragment extends Fragment implements hikapro.com.backpack public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment - View view = presenter.onCreateView(inflater, container, savedInstanceState); presenter.setView(this); - Log.i(this.toString(), "onCreateView"); + View view = presenter.onCreateView(inflater, container, savedInstanceState); + Log.i(this.toString(), " onCreateView"); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - Log.i(this.toString(), "onActivityCreated"); + Log.i(this.toString(), " onActivityCreated"); } @Override public void onStart() { super.onStart(); - Log.i(this.toString(), "onStart"); + Log.i(this.toString(), " onStart"); } @Override public void onResume() { super.onResume(); - Log.i(this.toString(), "onResume"); + Log.i(this.toString(), " onResume"); } @Override public void onStop() { super.onStop(); - Log.i(this.toString(), "onStop"); + Log.i(this.toString(), " onStop"); } @Override public void onDestroyView() { super.onDestroyView(); presenter.onDestroy(true); // TODO isChangingConfigurations - Log.i(this.toString(), "onDestroyView"); + Log.i(this.toString(), " onDestroyView"); } @Override public void onDestroy() { super.onDestroy(); presenter.onDestroy(false); // TODO isChangingConfigurations - Log.i(this.toString(), "onDestroy"); + Log.i(this.toString(), " onDestroy"); } @Override public void onDetach() { super.onDetach(); - Log.i(this.toString(), "onDetach"); + Log.i(this.toString(), " onDetach"); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - Log.i(this.toString(), "onSaveInstanceState"); + Log.i(this.toString(), " onSaveInstanceState"); } // life cycle <-- diff --git a/app/src/main/java/hikapro/com/backpack/view/fragments/ItemListFragment.java b/app/src/main/java/hikapro/com/backpack/view/fragments/ItemListFragment.java index ccb05a8..8a17e18 100644 --- a/app/src/main/java/hikapro/com/backpack/view/fragments/ItemListFragment.java +++ b/app/src/main/java/hikapro/com/backpack/view/fragments/ItemListFragment.java @@ -150,6 +150,7 @@ public class ItemListFragment extends Fragment implements hikapro.com.backpack.v @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); + presenter.onSaveInstanceState(outState); Log.i(this.toString(), "onSaveInstanceState"); } diff --git a/app/src/main/res/animator/slide_in_left.xml b/app/src/main/res/animator/slide_in_left.xml new file mode 100644 index 0000000..f8c7553 --- /dev/null +++ b/app/src/main/res/animator/slide_in_left.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/slide_in_right.xml b/app/src/main/res/animator/slide_in_right.xml new file mode 100644 index 0000000..05199a6 --- /dev/null +++ b/app/src/main/res/animator/slide_in_right.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/slide_out_left.xml b/app/src/main/res/animator/slide_out_left.xml new file mode 100644 index 0000000..a13ab18 --- /dev/null +++ b/app/src/main/res/animator/slide_out_left.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/slide_out_right.xml b/app/src/main/res/animator/slide_out_right.xml new file mode 100644 index 0000000..184d522 --- /dev/null +++ b/app/src/main/res/animator/slide_out_right.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file