diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index 0f9fbd3..91edac6 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -147,7 +147,7 @@ @@ -157,7 +157,8 @@ diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser index 6f94508..e7dee58 100644 Binary files a/.idea/caches/gradle_models.ser and b/.idea/caches/gradle_models.ser differ diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 8306744..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,6 +2,5 @@ - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 373dcf7..6d65097 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,14 +1,18 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 27 + compileSdkVersion 28 defaultConfig { applicationId "ru.volgorobot.vrcatalog" minSdkVersion 19 targetSdkVersion 27 versionCode 7 versionName "0.5.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + javaCompileOptions { + annotationProcessorOptions { + arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] + } + } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -24,15 +28,19 @@ android { } dependencies { + def room_version = "2.1.0-alpha04" implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation 'com.android.support:appcompat-v7:27.1.1' - implementation 'com.android.support:design:27.1.1' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.2' implementation 'me.texy.treeview:treeview_lib:1.0.4' implementation 'com.google.code.gson:gson:2.8.2' implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' - implementation 'com.android.support:recyclerview-v7:27.1.1' + implementation 'androidx.recyclerview:recyclerview:1.0.0-beta01' implementation 'com.squareup.picasso:picasso:2.71828' implementation 'com.github.chrisbanes:PhotoView:2.1.4' + + implementation "androidx.room:room-runtime:$room_version" + annotationProcessor "androidx.room:room-compiler:$room_version" } diff --git a/app/schemas/ru.volgorobot.vrcatalog.additional.AppDatabase/1.json b/app/schemas/ru.volgorobot.vrcatalog.additional.AppDatabase/1.json new file mode 100644 index 0000000..ef6580c --- /dev/null +++ b/app/schemas/ru.volgorobot.vrcatalog.additional.AppDatabase/1.json @@ -0,0 +1,46 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "b484b5731c959dea19f42d92a1fccfcd", + "entities": [ + { + "tableName": "favorites", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `itemID` INTEGER NOT NULL, `itemName` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "itemID", + "columnName": "itemID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "itemName", + "columnName": "itemName", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"b484b5731c959dea19f42d92a1fccfcd\")" + ] + } +} \ No newline at end of file diff --git a/app/schemas/ru.volgorobot.vrcatalog.additional.DatabaseHelper/1.json b/app/schemas/ru.volgorobot.vrcatalog.additional.DatabaseHelper/1.json new file mode 100644 index 0000000..ef6580c --- /dev/null +++ b/app/schemas/ru.volgorobot.vrcatalog.additional.DatabaseHelper/1.json @@ -0,0 +1,46 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "b484b5731c959dea19f42d92a1fccfcd", + "entities": [ + { + "tableName": "favorites", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `itemID` INTEGER NOT NULL, `itemName` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "itemID", + "columnName": "itemID", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "itemName", + "columnName": "itemName", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"b484b5731c959dea19f42d92a1fccfcd\")" + ] + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c48cb8e..fabb0e8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,7 @@ - @@ -10,7 +12,8 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme" + android:name=".App"> data); } interface ViewBinder { @@ -71,6 +76,10 @@ public interface MainContract { interface ItemPresenter { void getImagesByItemID(int id); + boolean checkFavoriteListed(int itemID); + int getFavoriteID(int itemID); + void addToFavorites(int itemID, String itemName); + void removeFromFavorites(int favID); } interface ItemView { diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/additional/AppCompatPreferenceActivity.java b/app/src/main/java/ru/volgorobot/vrcatalog/additional/AppCompatPreferenceActivity.java index cfd5368..9410cb3 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/additional/AppCompatPreferenceActivity.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/additional/AppCompatPreferenceActivity.java @@ -17,11 +17,11 @@ package ru.volgorobot.vrcatalog.additional; import android.content.res.Configuration; import android.os.Bundle; import android.preference.PreferenceActivity; -import android.support.annotation.LayoutRes; -import android.support.annotation.Nullable; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatDelegate; -import android.support.v7.widget.Toolbar; +import androidx.annotation.LayoutRes; +import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.appcompat.widget.Toolbar; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/additional/DatabaseHelper.java b/app/src/main/java/ru/volgorobot/vrcatalog/additional/DatabaseHelper.java new file mode 100644 index 0000000..3f78ecc --- /dev/null +++ b/app/src/main/java/ru/volgorobot/vrcatalog/additional/DatabaseHelper.java @@ -0,0 +1,11 @@ +package ru.volgorobot.vrcatalog.additional; + +import androidx.room.Database; +import androidx.room.RoomDatabase; +import ru.volgorobot.vrcatalog.model.FavoritesDaoModel; +import ru.volgorobot.vrcatalog.model.FavoritesModel; + +@Database(entities = {FavoritesModel.class}, version = 1) +public abstract class DatabaseHelper extends RoomDatabase { + public abstract FavoritesDaoModel getFavoritesDaoModel(); +} \ No newline at end of file diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/additional/HackyViewPager.java b/app/src/main/java/ru/volgorobot/vrcatalog/additional/HackyViewPager.java new file mode 100644 index 0000000..dd32227 --- /dev/null +++ b/app/src/main/java/ru/volgorobot/vrcatalog/additional/HackyViewPager.java @@ -0,0 +1,42 @@ +package ru.volgorobot.vrcatalog.additional; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; + +import androidx.viewpager.widget.ViewPager; + +/** + * ViewPager fixer class (which fix bug with zooming) + */ + +public class HackyViewPager extends ViewPager { + + public HackyViewPager(Context context) { + super(context); + } + + public HackyViewPager(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + try { + return super.onTouchEvent(ev); + } catch (IllegalArgumentException ex) { + ex.printStackTrace(); + } + return false; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + try { + return super.onInterceptTouchEvent(ev); + } catch (IllegalArgumentException ex) { + ex.printStackTrace(); + } + return false; + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/additional/SearchableNodeViewFactory.java b/app/src/main/java/ru/volgorobot/vrcatalog/additional/SearchableNodeViewFactory.java index baca273..04aab56 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/additional/SearchableNodeViewFactory.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/additional/SearchableNodeViewFactory.java @@ -23,9 +23,9 @@ public class SearchableNodeViewFactory extends BaseNodeViewFactory { public BaseNodeViewBinder getNodeViewBinder(View view, int level) { switch (level) { case 0: - return new FirstLevelNodeViewBinder(view); + return new FirstLevelNodeViewBinder(view, mView); case 1: - return new SecondLevelNodeViewBinder(view); + return new SecondLevelNodeViewBinder(view, mView); case 2: return new ThirdLevelNodeViewBinder(view, context, mView); default: diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/additional/adapters/FavoritesListAdapter.java b/app/src/main/java/ru/volgorobot/vrcatalog/additional/adapters/FavoritesListAdapter.java index 9216b1d..b2287fc 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/additional/adapters/FavoritesListAdapter.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/additional/adapters/FavoritesListAdapter.java @@ -3,25 +3,22 @@ package ru.volgorobot.vrcatalog.additional.adapters; import android.content.Context; import android.widget.ArrayAdapter; +import java.util.ArrayList; import java.util.List; -import ru.volgorobot.vrcatalog.model.FavoritesListModel; -import ru.volgorobot.vrcatalog.presenters.FavoritesDBPresenter; +import ru.volgorobot.vrcatalog.model.FavoritesModel; -public class FavoritesListAdapter extends ArrayAdapter { - private FavoritesDBPresenter db; - - public FavoritesListAdapter(Context context, int resource, List objects) { +public class FavoritesListAdapter extends ArrayAdapter { + public FavoritesListAdapter(Context context, int resource, List objects) { super(context, resource, objects); - db = new FavoritesDBPresenter(context); } - public void updateData() { + public void updateData(ArrayList data) { super.clear(); - super.addAll(db.selectAll()); + super.addAll(data); } public int getArraySize() { - return db.selectAll().size(); + return super.getCount(); } } diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/additional/adapters/FullscreenImagePagerAdapter.java b/app/src/main/java/ru/volgorobot/vrcatalog/additional/adapters/FullscreenImagePagerAdapter.java index 49e5aac..954f341 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/additional/adapters/FullscreenImagePagerAdapter.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/additional/adapters/FullscreenImagePagerAdapter.java @@ -1,9 +1,9 @@ package ru.volgorobot.vrcatalog.additional.adapters; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v4.view.PagerAdapter; -import android.support.v7.widget.Toolbar; +import androidx.annotation.NonNull; +import androidx.viewpager.widget.PagerAdapter; +import androidx.appcompat.widget.Toolbar; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/additional/adapters/ImagePagerAdapter.java b/app/src/main/java/ru/volgorobot/vrcatalog/additional/adapters/ImagePagerAdapter.java index 2f182f9..c38c275 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/additional/adapters/ImagePagerAdapter.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/additional/adapters/ImagePagerAdapter.java @@ -5,8 +5,8 @@ import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.provider.MediaStore; -import android.support.annotation.NonNull; -import android.support.v4.view.PagerAdapter; +import androidx.annotation.NonNull; +import androidx.viewpager.widget.PagerAdapter; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/model/FavoritesDaoModel.java b/app/src/main/java/ru/volgorobot/vrcatalog/model/FavoritesDaoModel.java new file mode 100644 index 0000000..7f1ef46 --- /dev/null +++ b/app/src/main/java/ru/volgorobot/vrcatalog/model/FavoritesDaoModel.java @@ -0,0 +1,22 @@ +package ru.volgorobot.vrcatalog.model; + +import java.util.List; + +import androidx.room.Dao; +import androidx.room.Insert; +import androidx.room.Query; + +@Dao +public interface FavoritesDaoModel { + @Query("SELECT * FROM favorites") + List getAll(); + + @Query("SELECT * FROM favorites WHERE itemID = :itemID") + List getFavoriteByItemID(int itemID); + + @Insert + void add(FavoritesModel model); + + @Query("DELETE FROM favorites WHERE id = :id") + void remove(int id); +} diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/model/FavoritesListModel.java b/app/src/main/java/ru/volgorobot/vrcatalog/model/FavoritesModel.java similarity index 51% rename from app/src/main/java/ru/volgorobot/vrcatalog/model/FavoritesListModel.java rename to app/src/main/java/ru/volgorobot/vrcatalog/model/FavoritesModel.java index 75cfb7b..8f1daa9 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/model/FavoritesListModel.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/model/FavoritesModel.java @@ -1,17 +1,21 @@ package ru.volgorobot.vrcatalog.model; -public class FavoritesListModel { - private int id; - private int itemID; - private String itemName; +import androidx.room.ColumnInfo; +import androidx.room.Entity; +import androidx.room.PrimaryKey; - public FavoritesListModel(int itemID, String itemName) { - this.itemID = itemID; - this.itemName = itemName; - } +@Entity(tableName = "favorites") +public class FavoritesModel { + @PrimaryKey(autoGenerate = true) + public int id; - public FavoritesListModel(int id, int itemID, String itemName) { - this.id = id; + @ColumnInfo + public int itemID; + + @ColumnInfo + public String itemName; + + public FavoritesModel(int itemID, String itemName) { this.itemID = itemID; this.itemName = itemName; } diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/nodeViewBinders/FirstLevelNodeViewBinder.java b/app/src/main/java/ru/volgorobot/vrcatalog/nodeViewBinders/FirstLevelNodeViewBinder.java index b3ddcad..b275c2e 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/nodeViewBinders/FirstLevelNodeViewBinder.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/nodeViewBinders/FirstLevelNodeViewBinder.java @@ -32,6 +32,7 @@ public class FirstLevelNodeViewBinder extends BaseNodeViewBinder implements Main @Override public void bindView(TreeNode treeNode) { textView.setText(treeNode.getValue().toString()); + imageView.setRotation(treeNode.isExpanded() ? 90 : 0); } @Override @@ -48,4 +49,5 @@ public class FirstLevelNodeViewBinder extends BaseNodeViewBinder implements Main public void rotateImageView() { imageView.animate().rotation(90).setDuration(200).start(); } + } diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/nodeViewBinders/SecondLevelNodeViewBinder.java b/app/src/main/java/ru/volgorobot/vrcatalog/nodeViewBinders/SecondLevelNodeViewBinder.java index 9dacb60..026cf46 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/nodeViewBinders/SecondLevelNodeViewBinder.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/nodeViewBinders/SecondLevelNodeViewBinder.java @@ -1,8 +1,10 @@ package ru.volgorobot.vrcatalog.nodeViewBinders; import android.content.Context; +import android.graphics.Color; import android.view.View; import android.widget.ImageView; +import android.widget.RelativeLayout; import android.widget.TextView; import me.texy.treeview.TreeNode; diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/nodeViewBinders/ThirdLevelNodeViewBinder.java b/app/src/main/java/ru/volgorobot/vrcatalog/nodeViewBinders/ThirdLevelNodeViewBinder.java index f18c3e6..0c7529a 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/nodeViewBinders/ThirdLevelNodeViewBinder.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/nodeViewBinders/ThirdLevelNodeViewBinder.java @@ -1,7 +1,9 @@ package ru.volgorobot.vrcatalog.nodeViewBinders; import android.content.Context; +import android.graphics.Color; import android.view.View; +import android.widget.RelativeLayout; import android.widget.TextView; import me.texy.treeview.TreeNode; diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/presenters/FavoritesDBPresenter.java b/app/src/main/java/ru/volgorobot/vrcatalog/presenters/FavoritesDBPresenter.java deleted file mode 100644 index ba5e70c..0000000 --- a/app/src/main/java/ru/volgorobot/vrcatalog/presenters/FavoritesDBPresenter.java +++ /dev/null @@ -1,83 +0,0 @@ -package ru.volgorobot.vrcatalog.presenters; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; - -import java.util.ArrayList; - -import ru.volgorobot.vrcatalog.additional.DatabaseProperties; -import ru.volgorobot.vrcatalog.additional.SqliteHelper; -import ru.volgorobot.vrcatalog.model.FavoritesListModel; - -public class FavoritesDBPresenter { - private SqliteHelper mHelper; - private SQLiteDatabase mDB; - - public FavoritesDBPresenter(Context context) { - this.mHelper = new SqliteHelper(context); - this.mDB = mHelper.getWritableDatabase(); - } - - public ArrayList selectAll() { - ArrayList models = new ArrayList<>(); - - String[] columns = { - DatabaseProperties.FAVORITES_COLUMN_ID, - DatabaseProperties.FAVORITES_COLUMN_ITEM_ID, - DatabaseProperties.FAVORITES_COLUMN_ITEM_NAME - }; - - Cursor cursor = mDB.query(DatabaseProperties.FAVORITES_TABLE_NAME, columns, null, null, null, null, null); - - if(cursor == null) - return new ArrayList<>(); - - while(cursor.moveToNext()) { - models.add(new FavoritesListModel( - cursor.getInt(cursor.getColumnIndex(DatabaseProperties.FAVORITES_COLUMN_ID)), - cursor.getInt(cursor.getColumnIndex(DatabaseProperties.FAVORITES_COLUMN_ITEM_ID)), - cursor.getString(cursor.getColumnIndex(DatabaseProperties.FAVORITES_COLUMN_ITEM_NAME)))); - } - - cursor.close(); - - return models; - } - - public void add(FavoritesListModel model) { - ContentValues contentValues = new ContentValues(); - contentValues.put(DatabaseProperties.FAVORITES_COLUMN_ITEM_ID, model.getItemID()); - contentValues.put(DatabaseProperties.FAVORITES_COLUMN_ITEM_NAME, model.getItemName()); - mDB.insert(DatabaseProperties.FAVORITES_TABLE_NAME, null, contentValues); - } - - public void removeItem(int id) { - mDB.delete(DatabaseProperties.FAVORITES_TABLE_NAME, "_id = " + id, null); - } - - public boolean inFavoritesList(int itemID) { - String[] columns = { DatabaseProperties.FAVORITES_COLUMN_ITEM_ID }; - String[] selectionArgs = { Integer.toString(itemID) }; - Cursor cursor = mDB.query(DatabaseProperties.FAVORITES_TABLE_NAME, columns, DatabaseProperties.FAVORITES_COLUMN_ITEM_ID + " = ?", selectionArgs, null, null, null); - while(cursor.moveToNext()) { - if(cursor.getInt(cursor.getColumnIndex(DatabaseProperties.FAVORITES_COLUMN_ITEM_ID)) == itemID) - return true; - } - cursor.close(); - - return false; - } - - public int getFavoriteID(int itemID) { - String[] columns = { DatabaseProperties.FAVORITES_COLUMN_ID, DatabaseProperties.FAVORITES_COLUMN_ITEM_ID }; - Cursor cursor = mDB.query(DatabaseProperties.FAVORITES_TABLE_NAME, columns, DatabaseProperties.FAVORITES_COLUMN_ITEM_ID + " = " + Integer.toString(itemID), null, null, null, null); - int id = 0; - if( cursor != null && cursor.moveToFirst() ){ - id = cursor.getInt(cursor.getColumnIndex(DatabaseProperties.FAVORITES_COLUMN_ID)); - cursor.close(); - } - return id; - } -} diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/presenters/FavoritesPresenter.java b/app/src/main/java/ru/volgorobot/vrcatalog/presenters/FavoritesPresenter.java index d61fb58..dd98fab 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/presenters/FavoritesPresenter.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/presenters/FavoritesPresenter.java @@ -1,16 +1,21 @@ package ru.volgorobot.vrcatalog.presenters; +import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import java.util.ArrayList; +import androidx.room.Room; +import ru.volgorobot.vrcatalog.App; import ru.volgorobot.vrcatalog.MainContract; +import ru.volgorobot.vrcatalog.additional.DatabaseHelper; import ru.volgorobot.vrcatalog.additional.NetworkErrorException; import ru.volgorobot.vrcatalog.additional.ResultWithErrorCode; import ru.volgorobot.vrcatalog.model.CoreModel; import ru.volgorobot.vrcatalog.model.DetailModel; +import ru.volgorobot.vrcatalog.model.FavoritesModel; import ru.volgorobot.vrcatalog.view.FavoritesActivity; import ru.volgorobot.vrcatalog.view.ItemActivity; @@ -18,13 +23,16 @@ public class FavoritesPresenter implements MainContract.FavoritesPresenter { private Context mContext; private MainContract.MainModel mainModel; private MainContract.FavoritesActivityView mView; + private DatabaseHelper db; - public FavoritesPresenter(Context context, FavoritesActivity view) { - this.mContext = context; - this.mainModel = new CoreModel(context); + public FavoritesPresenter(FavoritesActivity view) { + this.mContext = App.getContext(); + this.mainModel = new CoreModel(mContext); this.mView = view; + this.db = App.getDatabaseInstance(); } + @SuppressLint("StaticFieldLeak") @Override public void fetchItem(int itemID) { new AsyncTask>() { @@ -59,19 +67,30 @@ public class FavoritesPresenter implements MainContract.FavoritesPresenter { break; } case 1: { - mView.onFailruleAnswer(1); + mView.onFailureAnswer(1); break; } case 2: { - mView.onFailruleAnswer(2); + mView.onFailureAnswer(2); break; } case 3: { - mView.onFailruleAnswer(3); + mView.onFailureAnswer(3); break; } } } }.execute(itemID); } + + @Override + public void getAllItems() { + mView.updateListView((ArrayList) db.getFavoritesDaoModel().getAll()); + } + + @Override + public void removeItem(int id) { + db.getFavoritesDaoModel().remove(id); + mView.updateListView((ArrayList) db.getFavoritesDaoModel().getAll()); + } } diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/presenters/ItemPresenter.java b/app/src/main/java/ru/volgorobot/vrcatalog/presenters/ItemPresenter.java index 8bcdb04..7c5f316 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/presenters/ItemPresenter.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/presenters/ItemPresenter.java @@ -15,21 +15,27 @@ import java.io.IOException; import java.util.ArrayList; import java.util.UUID; +import androidx.room.Room; +import ru.volgorobot.vrcatalog.App; import ru.volgorobot.vrcatalog.MainContract; +import ru.volgorobot.vrcatalog.additional.DatabaseHelper; import ru.volgorobot.vrcatalog.additional.NetworkErrorException; import ru.volgorobot.vrcatalog.additional.ResultWithErrorCode; import ru.volgorobot.vrcatalog.model.CoreModel; +import ru.volgorobot.vrcatalog.model.FavoritesModel; import ru.volgorobot.vrcatalog.model.ImageItemModel; public class ItemPresenter implements MainContract.ItemPresenter { private MainContract.ItemView mView; private Context context; private MainContract.MainModel coreModel; + private DatabaseHelper db; - public ItemPresenter(Context context, MainContract.ItemView itemView) { + public ItemPresenter(MainContract.ItemView itemView) { this.mView = itemView; - this.context = context; + this.context = App.getContext(); this.coreModel = new CoreModel(context); + this.db = App.getDatabaseInstance(); } @SuppressLint("StaticFieldLeak") @@ -101,4 +107,27 @@ public class ItemPresenter implements MainContract.ItemPresenter { } return Uri.fromFile(cacheObject); } + + @Override + public boolean checkFavoriteListed(int itemID) { + return db.getFavoritesDaoModel().getFavoriteByItemID(itemID).size() != 0; + } + + @Override + public int getFavoriteID(int itemID) { + ArrayList models = (ArrayList) db.getFavoritesDaoModel().getFavoriteByItemID(itemID); + if(models.size() != 0) + return models.get(0).getID(); + return 0; + } + + @Override + public void addToFavorites(int itemID, String itemName) { + db.getFavoritesDaoModel().add(new FavoritesModel(itemID, itemName)); + } + + @Override + public void removeFromFavorites(int favID) { + db.getFavoritesDaoModel().remove(favID); + } } diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/presenters/ViewBinderPresenter.java b/app/src/main/java/ru/volgorobot/vrcatalog/presenters/ViewBinderPresenter.java index 0c26546..a4a08e2 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/presenters/ViewBinderPresenter.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/presenters/ViewBinderPresenter.java @@ -32,7 +32,7 @@ public class ViewBinderPresenter implements MainContract.LevelLoaderPresenter { @Override public void fetchSecondLevel(FirstLevelModel firstLevelModel, TreeNode treeNode) { - new AsyncTask>>() { + new AsyncTask>>() { @Override protected void onPreExecute() { super.onPreExecute(); @@ -40,31 +40,32 @@ public class ViewBinderPresenter implements MainContract.LevelLoaderPresenter { } @Override - protected ResultWithErrorCode> doInBackground(FirstLevelModel... firstLevelModel) { + protected ResultWithErrorCode> doInBackground(FirstLevelModel... firstLevelModel) { ArrayList secondLevelModels = null; + ArrayList treeNodes = new ArrayList<>(); try { secondLevelModels = coreModel.fetchSecondLevelByParentID(firstLevelModel[0].getID()); } catch (NetworkErrorException networkErrorException) { - return new ResultWithErrorCode<>(secondLevelModels, networkErrorException.getErrorCode()); + return new ResultWithErrorCode<>(null, networkErrorException.getErrorCode()); } catch (NullPointerException nullPointerException) { - return new ResultWithErrorCode<>(secondLevelModels, 3); + return new ResultWithErrorCode<>(null, 3); } - return new ResultWithErrorCode<>(secondLevelModels, 0); + for (int i = 0; i < secondLevelModels.size(); i++) { + TreeNode treeNode = new TreeNode(secondLevelModels.get(i)); + treeNode.setLevel(1); + treeNodes.add(treeNode); + } + + return new ResultWithErrorCode<>(treeNodes, 0); } @Override - protected void onPostExecute(ResultWithErrorCode> result) { + protected void onPostExecute(ResultWithErrorCode> result) { super.onPostExecute(result); switch (result.getErrorCode()) { case 0: { - ArrayList treeNodes = new ArrayList<>(); - for (int i = 0; i < result.getData().size(); i++) { - TreeNode treeNode1 = new TreeNode(result.getData().get(i)); - treeNode1.setLevel(1); - treeNodes.add(treeNode1); - } - treeNode.setChildren(treeNodes); + treeNode.setChildren(result.getData()); mView.refreshTree(); viewBinder.rotateImageView(); break; @@ -89,7 +90,7 @@ public class ViewBinderPresenter implements MainContract.LevelLoaderPresenter { @Override public void fetchThirdLevel(SecondLevelModel secondLevelModel, TreeNode treeNode) { - new AsyncTask>>() { + new AsyncTask>>() { @Override protected void onPreExecute() { super.onPreExecute(); @@ -97,30 +98,32 @@ public class ViewBinderPresenter implements MainContract.LevelLoaderPresenter { } @Override - protected ResultWithErrorCode> doInBackground(SecondLevelModel... secondLevelModel) { + protected ResultWithErrorCode> doInBackground(SecondLevelModel... secondLevelModel) { ArrayList thirdLevelModels = null; + ArrayList treeNodes = new ArrayList<>(); try { thirdLevelModels = coreModel.fetchThirdLevelByParentID(secondLevelModel[0].getID()); } catch (NetworkErrorException networkErrorException) { - return new ResultWithErrorCode<>(thirdLevelModels, networkErrorException.getErrorCode()); + return new ResultWithErrorCode<>(null, networkErrorException.getErrorCode()); } catch (NullPointerException nullPointerException) { - return new ResultWithErrorCode<>(thirdLevelModels, 3); + return new ResultWithErrorCode<>(null, 3); } - return new ResultWithErrorCode<>(thirdLevelModels, 0); + + for (int i = 0; i < thirdLevelModels.size(); i++) { + TreeNode treeNode1 = new TreeNode(thirdLevelModels.get(i)); + treeNode1.setLevel(2); + treeNodes.add(treeNode1); + } + + return new ResultWithErrorCode<>(treeNodes, 0); } @Override - protected void onPostExecute(ResultWithErrorCode> result) { + protected void onPostExecute(ResultWithErrorCode> result) { super.onPostExecute(result); switch (result.getErrorCode()) { case 0: { - ArrayList treeNodes = new ArrayList<>(); - for (int i = 0; i < result.getData().size(); i++) { - TreeNode treeNode1 = new TreeNode(result.getData().get(i)); - treeNode1.setLevel(2); - treeNodes.add(treeNode1); - } - treeNode.setChildren(treeNodes); + treeNode.setChildren(result.getData()); mView.refreshTree(); viewBinder.rotateImageView(); break; diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/searchNodeViewBinders/FirstLevelNodeViewBinder.java b/app/src/main/java/ru/volgorobot/vrcatalog/searchNodeViewBinders/FirstLevelNodeViewBinder.java index 674cc54..86acbac 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/searchNodeViewBinders/FirstLevelNodeViewBinder.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/searchNodeViewBinders/FirstLevelNodeViewBinder.java @@ -1,18 +1,21 @@ package ru.volgorobot.vrcatalog.searchNodeViewBinders; +import android.graphics.Color; import android.view.View; import android.widget.ImageView; +import android.widget.RelativeLayout; import android.widget.TextView; import me.texy.treeview.TreeNode; import me.texy.treeview.base.BaseNodeViewBinder; +import ru.volgorobot.vrcatalog.MainContract; import ru.volgorobot.vrcatalog.R; public class FirstLevelNodeViewBinder extends BaseNodeViewBinder { TextView textView; ImageView imageView; - public FirstLevelNodeViewBinder(View itemView) { + public FirstLevelNodeViewBinder(View itemView, MainContract.MainActivityView mView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.node_name_view); imageView = (ImageView) itemView.findViewById(R.id.arrow_img); @@ -26,6 +29,7 @@ public class FirstLevelNodeViewBinder extends BaseNodeViewBinder { @Override public void bindView(TreeNode treeNode) { textView.setText(treeNode.getValue().toString()); + imageView.setRotation(treeNode.isExpanded() ? 90 : 0); } @Override diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/searchNodeViewBinders/SecondLevelNodeViewBinder.java b/app/src/main/java/ru/volgorobot/vrcatalog/searchNodeViewBinders/SecondLevelNodeViewBinder.java index 8718470..b474415 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/searchNodeViewBinders/SecondLevelNodeViewBinder.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/searchNodeViewBinders/SecondLevelNodeViewBinder.java @@ -1,18 +1,21 @@ package ru.volgorobot.vrcatalog.searchNodeViewBinders; +import android.graphics.Color; import android.view.View; import android.widget.ImageView; +import android.widget.RelativeLayout; import android.widget.TextView; import me.texy.treeview.TreeNode; import me.texy.treeview.base.BaseNodeViewBinder; +import ru.volgorobot.vrcatalog.MainContract; import ru.volgorobot.vrcatalog.R; public class SecondLevelNodeViewBinder extends BaseNodeViewBinder { TextView textView; ImageView imageView; - public SecondLevelNodeViewBinder(View itemView) { + public SecondLevelNodeViewBinder(View itemView, MainContract.MainActivityView mView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.node_name_view); imageView = (ImageView) itemView.findViewById(R.id.arrow_img); @@ -26,6 +29,7 @@ public class SecondLevelNodeViewBinder extends BaseNodeViewBinder { @Override public void bindView(TreeNode treeNode) { textView.setText(treeNode.getValue().toString()); + imageView.setRotation(treeNode.isExpanded() ? 90 : 0); } @Override diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/view/AboutActivity.java b/app/src/main/java/ru/volgorobot/vrcatalog/view/AboutActivity.java index 6dc752c..9f3569e 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/view/AboutActivity.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/view/AboutActivity.java @@ -1,7 +1,7 @@ package ru.volgorobot.vrcatalog.view; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.MenuItem; import ru.volgorobot.vrcatalog.R; diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/view/FavoritesActivity.java b/app/src/main/java/ru/volgorobot/vrcatalog/view/FavoritesActivity.java index 290b069..372d09b 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/view/FavoritesActivity.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/view/FavoritesActivity.java @@ -1,8 +1,8 @@ package ru.volgorobot.vrcatalog.view; import android.content.Intent; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; @@ -19,12 +19,10 @@ import java.util.ArrayList; import ru.volgorobot.vrcatalog.MainContract; import ru.volgorobot.vrcatalog.R; import ru.volgorobot.vrcatalog.additional.adapters.FavoritesListAdapter; -import ru.volgorobot.vrcatalog.model.FavoritesListModel; -import ru.volgorobot.vrcatalog.presenters.FavoritesDBPresenter; +import ru.volgorobot.vrcatalog.model.FavoritesModel; import ru.volgorobot.vrcatalog.presenters.FavoritesPresenter; public class FavoritesActivity extends AppCompatActivity implements MainContract.FavoritesActivityView { - private FavoritesDBPresenter db; private FavoritesListAdapter adapter; private MainContract.FavoritesPresenter mPresenter; @@ -37,15 +35,13 @@ public class FavoritesActivity extends AppCompatActivity implements MainContract super.onCreate(savedInstanceState); setContentView(R.layout.activity_favorites); - mPresenter = new FavoritesPresenter(FavoritesActivity.this, this); + mPresenter = new FavoritesPresenter(this); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); actionBar.setTitle("Избранное"); - db = new FavoritesDBPresenter(FavoritesActivity.this); - initViews(); } @@ -55,16 +51,14 @@ public class FavoritesActivity extends AppCompatActivity implements MainContract listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { - FavoritesListModel model = (FavoritesListModel) listView.getItemAtPosition(i); + FavoritesModel model = (FavoritesModel) listView.getItemAtPosition(i); mPresenter.fetchItem(model.getItemID()); } }); + adapter = new FavoritesListAdapter(FavoritesActivity.this, android.R.layout.simple_list_item_1, new ArrayList<>()); + listView.setAdapter(adapter); favoritesEmptyImage = findViewById(R.id.favorites_empty_image); favoritesEmptyText = findViewById(R.id.favorites_empty_text); - ArrayList models = db.selectAll(); - adapter = new FavoritesListAdapter(FavoritesActivity.this, android.R.layout.simple_list_item_1, models); - listView.setAdapter(adapter); - checkForEmptyContent(); } public void checkForEmptyContent() { @@ -84,17 +78,18 @@ public class FavoritesActivity extends AppCompatActivity implements MainContract AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case 0: { - FavoritesListModel model = (FavoritesListModel) listView.getItemAtPosition(info.position); - db.removeItem(model.getID()); - updateListView(); + FavoritesModel model = (FavoritesModel) listView.getItemAtPosition(info.position); + mPresenter.removeItem(model.getID()); } } return true; } - private void updateListView() { - adapter.updateData(); + @Override + public void updateListView(ArrayList data) { + adapter.updateData(data); adapter.notifyDataSetChanged(); + checkForEmptyContent(); } @Override @@ -115,7 +110,7 @@ public class FavoritesActivity extends AppCompatActivity implements MainContract } @Override - public void onFailruleAnswer(int errorCode) { + public void onFailureAnswer(int errorCode) { switch (errorCode) { case 1: { Toast.makeText(FavoritesActivity.this, "Ошибка сети. Проверьте подключение к сети или данные подключения к API!", Toast.LENGTH_LONG).show(); @@ -143,7 +138,6 @@ public class FavoritesActivity extends AppCompatActivity implements MainContract @Override protected void onResume() { super.onResume(); - updateListView(); - checkForEmptyContent(); + mPresenter.getAllItems(); } } diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/view/FullScreenImageActivity.java b/app/src/main/java/ru/volgorobot/vrcatalog/view/FullScreenImageActivity.java index a897e65..497e451 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/view/FullScreenImageActivity.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/view/FullScreenImageActivity.java @@ -4,11 +4,11 @@ import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.content.ContextCompat; -import android.support.v4.view.ViewPager; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import android.view.MenuItem; import android.view.View; import android.view.Window; diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/view/ItemActivity.java b/app/src/main/java/ru/volgorobot/vrcatalog/view/ItemActivity.java index c9154e5..e7b4740 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/view/ItemActivity.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/view/ItemActivity.java @@ -4,10 +4,11 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Color; import android.os.Bundle; -import android.support.design.widget.TabLayout; -import android.support.v4.view.ViewPager; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import com.google.android.material.tabs.TabLayout; + +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; @@ -17,10 +18,7 @@ import android.widget.TextView; import android.widget.Toast; import java.util.LinkedHashMap; -import java.util.Map; -import ru.volgorobot.vrcatalog.model.FavoritesListModel; -import ru.volgorobot.vrcatalog.presenters.FavoritesDBPresenter; import ru.volgorobot.vrcatalog.presenters.ItemPresenter; import ru.volgorobot.vrcatalog.MainContract; import ru.volgorobot.vrcatalog.R; @@ -33,9 +31,9 @@ public class ItemActivity extends AppCompatActivity implements MainContract.Item private ListView propertiesList; private ImagePagerAdapter imagePagerAdapter; private boolean inFavorites; - private FavoritesDBPresenter db; private int itemID; private String itemName; + private int favoriteID; @Override protected void onCreate(Bundle savedInstanceState) { @@ -47,7 +45,7 @@ public class ItemActivity extends AppCompatActivity implements MainContract.Item getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayShowTitleEnabled(false); initializeViews(); - mPresenter = new ItemPresenter(ItemActivity.this, this); + mPresenter = new ItemPresenter(this); Intent intent = getIntent(); itemName = intent.getStringExtra("detailName"); @@ -63,7 +61,6 @@ public class ItemActivity extends AppCompatActivity implements MainContract.Item LinkedHashMap intentDataForListView = getIntentExtras(intent); itemID = Integer.parseInt(intent.getStringExtra("itemID")); intentDataForListView.get("detailName"); - db = new FavoritesDBPresenter(ItemActivity.this); propertiesList = findViewById(R.id.propertiesList); PropertiesListAdapter propertiesListAdapter = new PropertiesListAdapter(intentDataForListView); @@ -71,7 +68,8 @@ public class ItemActivity extends AppCompatActivity implements MainContract.Item mPresenter.getImagesByItemID(Integer.parseInt(intent.getStringExtra("itemID"))); - inFavorites = db.inFavoritesList(itemID); + inFavorites = mPresenter.checkFavoriteListed(itemID); + favoriteID = mPresenter.getFavoriteID(itemID); } void initializeViews() { @@ -229,13 +227,13 @@ public class ItemActivity extends AppCompatActivity implements MainContract.Item MenuItem deleteFromFavorites = menu.findItem(R.id.action_unfavorite); addToFavorites.setOnMenuItemClickListener((MenuItem menuItem) -> { - db.add(new FavoritesListModel(0, itemID, itemName)); + mPresenter.addToFavorites(itemID, itemName); inFavorites = true; this.invalidateOptionsMenu(); return true; }); deleteFromFavorites.setOnMenuItemClickListener((MenuItem menuItem) -> { - db.removeItem(db.getFavoriteID(itemID)); + mPresenter.removeFromFavorites(favoriteID); inFavorites = false; this.invalidateOptionsMenu(); return true; diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/view/MainActivity.java b/app/src/main/java/ru/volgorobot/vrcatalog/view/MainActivity.java index 3be56e8..63fd314 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/view/MainActivity.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/view/MainActivity.java @@ -5,16 +5,15 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.design.widget.NavigationView; -import android.support.v4.view.GravityCompat; -import android.support.v4.view.MenuItemCompat; -import android.support.v4.widget.DrawerLayout; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.SearchView; -import android.support.v7.widget.Toolbar; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.core.view.GravityCompat; +import androidx.core.view.MenuItemCompat; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import androidx.appcompat.app.ActionBarDrawerToggle; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.appcompat.widget.SearchView; +import androidx.appcompat.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; @@ -25,6 +24,8 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import com.google.android.material.navigation.NavigationView; + import java.util.ArrayList; import me.texy.treeview.TreeNode; @@ -205,7 +206,6 @@ public class MainActivity extends AppCompatActivity search.setQueryHint("Имя детали"); return true; } - } diff --git a/app/src/main/java/ru/volgorobot/vrcatalog/view/SearchableActivity.java b/app/src/main/java/ru/volgorobot/vrcatalog/view/SearchableActivity.java index f411fcd..a0190c2 100644 --- a/app/src/main/java/ru/volgorobot/vrcatalog/view/SearchableActivity.java +++ b/app/src/main/java/ru/volgorobot/vrcatalog/view/SearchableActivity.java @@ -4,14 +4,13 @@ import android.app.SearchManager; import android.content.Intent; import android.os.Bundle; import android.provider.SearchRecentSuggestions; -import android.support.v4.widget.NestedScrollView; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.DefaultItemAnimator; +import androidx.core.widget.NestedScrollView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.DefaultItemAnimator; import android.util.Log; import android.view.MenuItem; import android.view.View; -import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; @@ -35,6 +34,9 @@ public class SearchableActivity extends AppCompatActivity implements MainContrac private ImageView mConnectionErrorImageView; private NestedScrollView mTreeViewContainer; private TextView mErrorTextView; + private ImageView mEmptySearchImageView; + private TextView mEmptySearchTextView; + private boolean isInErrorState = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -53,9 +55,12 @@ public class SearchableActivity extends AppCompatActivity implements MainContrac mTreeViewContainer = findViewById(R.id.searchableTreeViewContainer); mErrorTextView = findViewById(R.id.searchableErrorTextView); + mEmptySearchImageView = findViewById(R.id.emptySearchImage); + mEmptySearchTextView = findViewById(R.id.emptySearchText); + treeView = new TreeView(rootNode, SearchableActivity.this, new SearchableNodeViewFactory(SearchableActivity.this, this)); treeView.setItemAnimator(new DefaultItemAnimator()); - ((ViewGroup) findViewById(R.id.searchableTreeViewContainer)).addView(treeView.getView()); + mTreeViewContainer.addView(treeView.getView()); Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { detailName = intent.getStringExtra(SearchManager.QUERY); @@ -72,6 +77,15 @@ public class SearchableActivity extends AppCompatActivity implements MainContrac rootNode.setChildren(children); treeView.expandAll(); treeView.refreshTreeView(); + if(children.size() == 0 && !isInErrorState) { + mEmptySearchImageView.setVisibility(View.VISIBLE); + mEmptySearchTextView.setVisibility(View.VISIBLE); + mTreeViewContainer.setVisibility(View.GONE); + } else { + mEmptySearchImageView.setVisibility(View.INVISIBLE); + mEmptySearchTextView.setVisibility(View.INVISIBLE); + mTreeViewContainer.setVisibility(View.VISIBLE); + } } public void onFailureAnswer(int errorCode) { @@ -84,6 +98,7 @@ public class SearchableActivity extends AppCompatActivity implements MainContrac mTreeViewContainer.setVisibility(View.GONE); mConnectionErrorImageView.setVisibility(View.VISIBLE); mErrorTextView.setVisibility(View.VISIBLE); + isInErrorState = true; break; } case 2: { @@ -94,6 +109,7 @@ public class SearchableActivity extends AppCompatActivity implements MainContrac mTreeViewContainer.setVisibility(View.GONE); mConnectionErrorImageView.setVisibility(View.VISIBLE); mErrorTextView.setVisibility(View.VISIBLE); + isInErrorState = true; break; } case 3: { @@ -103,6 +119,7 @@ public class SearchableActivity extends AppCompatActivity implements MainContrac mTreeViewContainer.setVisibility(View.GONE); mConnectionErrorImageView.setVisibility(View.VISIBLE); mErrorTextView.setVisibility(View.VISIBLE); + isInErrorState = true; break; } } @@ -116,6 +133,7 @@ public class SearchableActivity extends AppCompatActivity implements MainContrac rootNode.setChildren(new ArrayList()); treeView.refreshTreeView(); searchablePresenter.fetchDetailsTreeByName(detailName); + isInErrorState = false; } @Override diff --git a/app/src/main/res/drawable/ic_clear_gray_24dp.xml b/app/src/main/res/drawable/ic_clear_gray_24dp.xml new file mode 100644 index 0000000..184f32a --- /dev/null +++ b/app/src/main/res/drawable/ic_clear_gray_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml index 05af980..0d398a8 100644 --- a/app/src/main/res/layout/activity_detail.xml +++ b/app/src/main/res/layout/activity_detail.xml @@ -1,25 +1,25 @@ - - - - - - - - + + - - - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_favorites.xml b/app/src/main/res/layout/activity_favorites.xml index 798f0e0..4308b86 100644 --- a/app/src/main/res/layout/activity_favorites.xml +++ b/app/src/main/res/layout/activity_favorites.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fullscreenimage.xml b/app/src/main/res/layout/activity_fullscreenimage.xml index f09d840..f2ed594 100644 --- a/app/src/main/res/layout/activity_fullscreenimage.xml +++ b/app/src/main/res/layout/activity_fullscreenimage.xml @@ -9,12 +9,12 @@ tools:context="ru.volgorobot.vrcatalog.view.FullScreenImageActivity" android:background="@android:color/black"> - - - - - + diff --git a/app/src/main/res/layout/activity_searchable.xml b/app/src/main/res/layout/activity_searchable.xml index 4bdcf45..6ab6a13 100644 --- a/app/src/main/res/layout/activity_searchable.xml +++ b/app/src/main/res/layout/activity_searchable.xml @@ -1,5 +1,5 @@ - - - - + - + - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml index 45fe46a..a314d65 100644 --- a/app/src/main/res/layout/app_bar_main.xml +++ b/app/src/main/res/layout/app_bar_main.xml @@ -1,27 +1,27 @@ - - - - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml index fb7d24c..b5ae086 100644 --- a/app/src/main/res/layout/content_main.xml +++ b/app/src/main/res/layout/content_main.xml @@ -1,5 +1,5 @@ - - - - + - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/first_level_item.xml b/app/src/main/res/layout/first_level_item.xml index 1d2da0f..15caa90 100644 --- a/app/src/main/res/layout/first_level_item.xml +++ b/app/src/main/res/layout/first_level_item.xml @@ -1,9 +1,14 @@ + + + + + + diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml index 259986b..4ddce8f 100644 --- a/app/src/main/res/values-v21/styles.xml +++ b/app/src/main/res/values-v21/styles.xml @@ -25,7 +25,9 @@ @android:color/black @android:color/black - - - diff --git a/gradle.properties b/gradle.properties index fc63706..ac6eb9b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,6 +6,8 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. +android.enableJetifier=true +android.useAndroidX=true org.gradle.jvmargs=-Xmx512m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit