currentColumnValues) {
61 | this.currentColumnValues = currentColumnValues;
62 | }
63 |
64 | @Override
65 | public Dialog onCreateDialog(Bundle savedInstanceState) {
66 |
67 | LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context
68 | .LAYOUT_INFLATER_SERVICE);
69 | alertDialogView = layoutInflater.inflate(R.layout
70 | .com_awesomedroidapps_inappstoragereadder_view_modify, null);
71 | columnValue = (TextView) alertDialogView.findViewById(R.id.column_value);
72 | columnValue.setText(data);
73 | editedColumnValue = (EditText) alertDialogView.findViewById(R.id.edited_column_value);
74 | editedColumnValue.setVisibility(View.GONE);
75 |
76 | AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
77 |
78 | builder.setView(alertDialogView);
79 | builder.setPositiveButton(Constants.DIALOG_COPY, null);
80 | builder.setNegativeButton(Constants.DIALOG_EDIT, null);
81 |
82 | alertDialog = builder.create();
83 | alertDialog.setOnShowListener(onShowListener);
84 | return alertDialog;
85 | }
86 |
87 |
88 | DialogInterface.OnShowListener onShowListener = new DialogInterface.OnShowListener() {
89 | @Override
90 | public void onShow(DialogInterface dialog) {
91 | Button copyButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
92 | copyButton.setOnClickListener(new View.OnClickListener() {
93 | @Override
94 | public void onClick(View v) {
95 | onCopyButtonClicked();
96 | }
97 | });
98 |
99 | final Button editOrDoneButton = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
100 | editOrDoneButton.setOnClickListener(new View.OnClickListener() {
101 | @Override
102 | public void onClick(View v) {
103 | if (Constants.DIALOG_EDIT.equals(editOrDoneButton.getText().toString())) {
104 | onEditButtonClicked(editOrDoneButton);
105 | } else if (Constants.DIALOG_DONE.equals(editOrDoneButton.getText().toString())) {
106 | onDoneButtonClicked();
107 | }
108 | }
109 | });
110 | }
111 | };
112 |
113 | private void onCopyButtonClicked() {
114 | ClipboardManager clipboard = (ClipboardManager) getContext().getSystemService(Context
115 | .CLIPBOARD_SERVICE);
116 | ClipData clip = ClipData.newPlainText("data", data);
117 | clipboard.setPrimaryClip(clip);
118 | alertDialog.dismiss();
119 | }
120 |
121 | private void onEditButtonClicked(Button editButton) {
122 | editButton.setText(Constants.DIALOG_DONE);
123 | editedColumnValue.setVisibility(View.VISIBLE);
124 | editedColumnValue.setText(data);
125 | editedColumnValue.requestFocus();
126 | columnValue.setVisibility(View.GONE);
127 | }
128 |
129 | private void onDoneButtonClicked() {
130 | alertDialog.dismiss();
131 | dataEditListener.onTableDataEdited(editedColumnValue.getText().toString(), columnIndex,
132 | currentColumnValues);
133 | }
134 | }
135 |
--------------------------------------------------------------------------------
/inappstoragereader/src/main/java/com/awesomedroidapps/inappstoragereader/SharedPreferenceReader.java:
--------------------------------------------------------------------------------
1 | package com.awesomedroidapps.inappstoragereader;
2 |
3 | import android.content.Context;
4 | import android.content.SharedPreferences;
5 |
6 | import com.awesomedroidapps.inappstoragereader.entities.AppDataStorageItem;
7 | import com.awesomedroidapps.inappstoragereader.entities.SharedPreferenceObject;
8 |
9 | import java.io.File;
10 | import java.util.ArrayList;
11 | import java.util.List;
12 | import java.util.Map;
13 | import java.util.Set;
14 |
15 | /**
16 | * Created by anshul on 12/2/17.
17 | *
18 | * A class for reading shared preferences data of an application.
19 | */
20 |
21 | public class SharedPreferenceReader {
22 |
23 | /**
24 | * This method is used to return all the shared preferences tags stored inside of an application.
25 | *
26 | * @param context - Context object.
27 | * @return - List of all the tags of the shared preferences.
28 | */
29 | public static List getSharedPreferencesTags(Context context) {
30 |
31 | if (context == null || context.getApplicationInfo() == null) {
32 | return null;
33 | }
34 |
35 |
36 | String rootPath = context.getApplicationInfo().dataDir + SqliteConstants
37 | .SHARED_PREFERENCES_PATH;
38 | File sharedPreferenceDirectory = new File(rootPath);
39 | if (!sharedPreferenceDirectory.exists()) {
40 | return null;
41 | }
42 |
43 | ArrayList sharedPreferencesList = new ArrayList<>();
44 |
45 | for (File file : sharedPreferenceDirectory.listFiles()) {
46 | String fileName = file.getName();
47 | if (!Utils.isEmpty(fileName) && fileName.endsWith(SqliteConstants.XML_SUFFIX)) {
48 | fileName = fileName.substring(0, fileName.length() - SqliteConstants.XML_SUFFIX.length());
49 | AppDataStorageItem appDataStorageItem = new AppDataStorageItem();
50 | appDataStorageItem.setStorageType(StorageType.SHARED_PREFERENCE);
51 | appDataStorageItem.setStorageName(fileName);
52 | sharedPreferencesList.add(appDataStorageItem);
53 | }
54 | }
55 | return sharedPreferencesList;
56 | }
57 |
58 |
59 | /**
60 | * This method will return the shared preferences for individual files.
61 | *
62 | * @param context
63 | * @param tag
64 | * @return
65 | */
66 | public static List getSharedPreferencesBaseOnFileName(
67 | Context context, String tag) {
68 |
69 | if (context == null || Utils.isEmpty(tag)) {
70 | return null;
71 | }
72 |
73 | //Open the shared preferences file.
74 | SharedPreferences sharedPreferences = context.getSharedPreferences(tag, Context.MODE_PRIVATE);
75 |
76 | if (sharedPreferences == null) {
77 | return null;
78 | }
79 |
80 | //This list will contain all the key-value-type of the shared preferences based on the tag.
81 | ArrayList sharedPreferenceListForTag = new ArrayList<>();
82 |
83 | //Get all the key-value pairs of a shared preference file
84 | Map sharedPreferenceEntities = sharedPreferences.getAll();
85 |
86 | if (sharedPreferenceEntities == null || sharedPreferenceEntities.size() == 0) {
87 | return sharedPreferenceListForTag;
88 | }
89 |
90 | for (Map.Entry entry : sharedPreferenceEntities.entrySet()) {
91 |
92 | if (entry == null || entry.getKey() == null) {
93 | continue;
94 | }
95 |
96 | //Create new instance of SharedPreferenceObject
97 | SharedPreferenceObject sharedPreferenceObject = new SharedPreferenceObject();
98 | sharedPreferenceObject.setKey(entry.getKey());
99 |
100 | if (entry.getValue() == null) {
101 | sharedPreferenceObject.setSharedPreferenceDataType(SharedPreferenceDataType.STRING);
102 | continue;
103 | }
104 |
105 | if (entry.getValue() instanceof String) {
106 | sharedPreferenceObject.setSharedPreferenceDataType(SharedPreferenceDataType.STRING);
107 | String strValue = (String) entry.getValue();
108 | sharedPreferenceObject.setValue(strValue);
109 |
110 | } else if (entry.getValue() instanceof Integer) {
111 | sharedPreferenceObject.setSharedPreferenceDataType(SharedPreferenceDataType.INT);
112 | Integer intValue = (Integer) entry.getValue();
113 | sharedPreferenceObject.setValue(Integer.toString(intValue));
114 |
115 | } else if (entry.getValue() instanceof Long) {
116 | sharedPreferenceObject.setSharedPreferenceDataType(SharedPreferenceDataType.LONG);
117 | Long longValue = (Long) entry.getValue();
118 | sharedPreferenceObject.setValue(Long.toString(longValue));
119 |
120 | } else if (entry.getValue() instanceof Float) {
121 | sharedPreferenceObject.setSharedPreferenceDataType(SharedPreferenceDataType.FLOAT);
122 | Float floatValue = (Float) entry.getValue();
123 | sharedPreferenceObject.setValue(Float.toString((floatValue)));
124 |
125 | } else if (entry.getValue() instanceof Boolean) {
126 | sharedPreferenceObject.setSharedPreferenceDataType(SharedPreferenceDataType.BOOLEAN);
127 | Boolean boolValue = (Boolean) entry.getValue();
128 | sharedPreferenceObject.setValue(Boolean.toString(boolValue));
129 |
130 | } else if (entry.getValue() instanceof Set) {
131 | sharedPreferenceObject.setSharedPreferenceDataType(SharedPreferenceDataType.STRING_SET);
132 | Set set = (Set) entry.getValue();
133 | sharedPreferenceObject.setValue(set.toString());
134 | }
135 |
136 | sharedPreferenceListForTag.add(sharedPreferenceObject);
137 | }
138 |
139 | return sharedPreferenceListForTag;
140 | }
141 |
142 | /**
143 | * This method is used to get all the shared preferences stored inside of an application. First
144 | * it gets through all the shared preference tags and based on the tag, retrieve the shared
145 | * preferences for every tag.
146 | *
147 | * @param context - Context object.
148 | * @return - List of all the shared preferences stored in the application.
149 | */
150 | public static List getAllSharedPreferences(Context context) {
151 | if (context == null) {
152 | return null;
153 | }
154 |
155 | List sharedPreferencesTagList = getSharedPreferencesTags(context);
156 |
157 | if (sharedPreferencesTagList == null || sharedPreferencesTagList.isEmpty()) {
158 | return null;
159 | }
160 |
161 | ArrayList sharedPreferenceDataTypeArrayList = new ArrayList<>();
162 |
163 | for (AppDataStorageItem appDataStorageItem : sharedPreferencesTagList) {
164 | List sharedPreferencesForTagList =
165 | getSharedPreferencesBaseOnFileName(context, appDataStorageItem.getStorageName());
166 | sharedPreferenceDataTypeArrayList.addAll(sharedPreferencesForTagList);
167 | }
168 | return sharedPreferenceDataTypeArrayList;
169 | }
170 |
171 | public static boolean isSharedPreferencesEmpty(Context context) {
172 | if (context == null) {
173 | return true;
174 | }
175 | List sharedPreferenceTags = getSharedPreferencesTags(context);
176 | return Utils.isEmpty(sharedPreferenceTags);
177 | }
178 | }
179 |
--------------------------------------------------------------------------------
/app/src/main/java/com/awesomedroidapps/appstoragedatareader/demo/AppStorageDemoActivity.java:
--------------------------------------------------------------------------------
1 | package com.awesomedroidapps.appstoragedatareader.demo;
2 |
3 | import android.content.Context;
4 | import android.content.SharedPreferences;
5 | import android.os.Bundle;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.view.Menu;
8 | import android.view.MenuInflater;
9 | import android.view.MenuItem;
10 | import android.view.View;
11 | import android.widget.ArrayAdapter;
12 | import android.widget.Button;
13 | import android.widget.EditText;
14 | import android.widget.LinearLayout;
15 | import android.widget.Spinner;
16 | import android.widget.Toast;
17 |
18 | import com.awesomedroidapps.appstoragedatareader.demo.entity.PersonInfo;
19 | import com.awesomedroidapps.inappstoragereader.Utils;
20 |
21 | import java.util.ArrayList;
22 |
23 | import butterknife.BindView;
24 | import butterknife.ButterKnife;
25 | import butterknife.OnClick;
26 |
27 | public class AppStorageDemoActivity extends AppCompatActivity {
28 |
29 | //Views in the database
30 | @BindView(R.id.database_container)
31 | LinearLayout databaseContainer;
32 | @BindView(R.id.first_name)
33 | EditText firstName;
34 | @BindView(R.id.last_name)
35 | EditText lastName;
36 | @BindView(R.id.address)
37 | EditText address;
38 | @BindView(R.id.submit)
39 | Button submit;
40 |
41 | //Views in the shared preference.
42 | @BindView(R.id.shared_preference_container)
43 | LinearLayout sharedPreferenceContainer;
44 | @BindView(R.id.shared_preference_key)
45 | EditText sharedPreferenceKey;
46 | @BindView(R.id.shared_preference_value)
47 | EditText sharedPreferenceValue;
48 | @BindView(R.id.shared_preference_spinner)
49 | Spinner sharedPreferenceSpinner;
50 |
51 | private int currentView = Constants.DATABASE_VIEW;
52 |
53 | @Override
54 | protected void onCreate(Bundle savedInstanceState) {
55 | super.onCreate(savedInstanceState);
56 | setContentView(R.layout.activity_appstorage_demo);
57 | ButterKnife.bind(this);
58 |
59 | //Initially show Table View.
60 | showTableView();
61 |
62 | fillDefaultValuesInTable();
63 | fillDefaultValuesInSharedPreferences();
64 |
65 | ArrayAdapter adapter = new ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item,
66 | getSpinnerArray());
67 | adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
68 | sharedPreferenceSpinner.setAdapter(adapter);
69 | }
70 |
71 | @Override
72 | public boolean onCreateOptionsMenu(Menu menu) {
73 | MenuInflater inflater = getMenuInflater();
74 | inflater.inflate(R.menu.appstorage_menu, menu);
75 | return true;
76 | }
77 |
78 | @Override
79 | public boolean onOptionsItemSelected(MenuItem item) {
80 | // Handle item selection
81 | switch (item.getItemId()) {
82 | case R.id.menu_table:
83 | showTableView();
84 | break;
85 |
86 | case R.id.menu_shared_preference:
87 | showSharedPreferencesView();
88 | break;
89 |
90 | case R.id.menu_refresh:
91 | refreshUI();
92 | break;
93 | }
94 | return super.onOptionsItemSelected(item);
95 | }
96 |
97 | private void showTableView() {
98 | currentView = Constants.DATABASE_VIEW;
99 | databaseContainer.setVisibility(View.VISIBLE);
100 | sharedPreferenceContainer.setVisibility(View.GONE);
101 | }
102 |
103 | private void showSharedPreferencesView() {
104 | currentView = Constants.SHARED_PREFERENCE_VIEW;
105 | sharedPreferenceContainer.setVisibility(View.VISIBLE);
106 | databaseContainer.setVisibility(View.GONE);
107 | }
108 |
109 | private void refreshUI() {
110 | switch (currentView) {
111 | case Constants.DATABASE_VIEW:
112 | firstName.setText(Constants.EMPTY_STRING);
113 | lastName.setText(Constants.EMPTY_STRING);
114 | address.setText(Constants.EMPTY_STRING);
115 | break;
116 | case Constants.SHARED_PREFERENCE_VIEW:
117 | sharedPreferenceKey.setText(Constants.EMPTY_STRING);
118 | sharedPreferenceValue.setText(Constants.EMPTY_STRING);
119 | sharedPreferenceSpinner.setSelection(Constants.ZERO_INDEX);
120 | break;
121 | }
122 | }
123 |
124 | @OnClick(R.id.submit)
125 | public void submit() {
126 | switch (currentView) {
127 | case Constants.DATABASE_VIEW:
128 | enterValuesIntoDB();
129 | break;
130 | case Constants.SHARED_PREFERENCE_VIEW:
131 | enterValuesIntoSharedPreferences();
132 | break;
133 | }
134 | }
135 |
136 | private void enterValuesIntoDB() {
137 | String firstNameStr = firstName.getText().toString();
138 | String lastNameStr = lastName.getText().toString();
139 | String addressStr = address.getText().toString();
140 |
141 | if (Utils.isEmpty(firstNameStr) && Utils.isEmpty(lastNameStr) && Utils.isEmpty(addressStr)) {
142 | showToast(string(R.string.table_empty_values_error_msg));
143 | return;
144 | }
145 |
146 | PersonInfo personInfo = new PersonInfo();
147 | personInfo.setFirstName(firstNameStr);
148 | personInfo.setLastName(lastNameStr);
149 | personInfo.setAddress(addressStr);
150 | long insertResponse = insertIntoDatabase(personInfo);
151 | if (insertResponse == Constants.INVALID_INSERT_RESPONSE) {
152 | showToast(string(R.string.table_insert_failure));
153 | } else {
154 | showToast(string(R.string.table_insert_success));
155 | }
156 | }
157 |
158 | private void enterValuesIntoSharedPreferences() {
159 |
160 | if (!(sharedPreferenceSpinner.getSelectedItem() instanceof String)) {
161 | return;
162 | }
163 |
164 | SharedPreferenceDataType selectedDataType = SharedPreferenceDataType.getDataType((String)
165 | sharedPreferenceSpinner.getSelectedItem());
166 |
167 | if (selectedDataType == SharedPreferenceDataType.UNKNOWN) {
168 | showToast(getString(R.string.shared_preference_datatype_error));
169 | return;
170 | }
171 |
172 | String keyStr = sharedPreferenceKey.getText().toString();
173 | String valueStr = sharedPreferenceValue.getText().toString();
174 |
175 | if (Utils.isEmpty(keyStr) || Utils.isEmpty(valueStr)) {
176 | showToast(getString(R.string.shared_preference_key_value_error));
177 | return;
178 | }
179 | insertIntoSharedPreference(keyStr, valueStr, selectedDataType,
180 | Constants.PERSON_INFO_SHARED_PREFERENCES1);
181 | showToast(string(R.string.shared_preferences_insert_success));
182 | }
183 |
184 | private void fillDefaultValuesInTable() {
185 | String[] defaultFirstNames = getResources().getStringArray(R.array.defaultFirstNames);
186 | String[] defaultLastNames = getResources().getStringArray(R.array.defaultLastNames);
187 | String[] defaultAddresses = getResources().getStringArray(R.array.defaultAddresses);
188 |
189 | for (int i = 0; i < defaultFirstNames.length; i++) {
190 | PersonInfo personInfo = new PersonInfo();
191 | personInfo.setFirstName(defaultFirstNames[i]);
192 | personInfo.setLastName(defaultLastNames[i]);
193 | personInfo.setAddress(defaultAddresses[i]);
194 | insertIntoDatabase(personInfo);
195 | }
196 | }
197 |
198 | private void fillDefaultValuesInSharedPreferences() {
199 | String[] defaultKeys = getResources().getStringArray(R.array.defaultPersonInfoKeys1);
200 | String[] defaultValues = getResources().getStringArray(R.array.defaultPersonInfoValues1);
201 |
202 | for (int i = 0; i < defaultKeys.length; i++) {
203 | insertIntoSharedPreference(defaultKeys[i], defaultValues[i], SharedPreferenceDataType
204 | .STRING, Constants.PERSON_INFO_SHARED_PREFERENCES1);
205 | }
206 |
207 | defaultKeys = getResources().getStringArray(R.array.defaultPersonInfoKeys2);
208 | defaultValues = getResources().getStringArray(R.array.defaultPersonInfoValues2);
209 |
210 | for (int i = 0; i < defaultKeys.length; i++) {
211 | insertIntoSharedPreference(defaultKeys[i], defaultValues[i], SharedPreferenceDataType
212 | .STRING, Constants.PERSON_INFO_SHARED_PREFERENCES2);
213 | }
214 | }
215 |
216 | private long insertIntoDatabase(PersonInfo personInfo) {
217 | DataReaderSqliteOpenHelper helper = new DataReaderSqliteOpenHelper(this);
218 | return helper.insert(personInfo);
219 | }
220 |
221 | private void insertIntoSharedPreference(String key, String value, SharedPreferenceDataType
222 | dataType, String fileName) {
223 | if (Utils.isEmpty(key) || value == null) {
224 | return;
225 | }
226 | SharedPreferences sharedPreferences =
227 | getSharedPreferences(fileName, Context
228 | .MODE_PRIVATE);
229 | SharedPreferences.Editor editor = sharedPreferences.edit();
230 | switch (dataType) {
231 | case STRING:
232 | editor.putString(key, value);
233 | break;
234 | case INT:
235 | try {
236 | int intVal = Integer.parseInt(value);
237 | editor.putInt(key, intVal);
238 | } catch (Exception e) {
239 | showToast(getString(R.string.shared_preferences_error_integer));
240 | return;
241 | }
242 | break;
243 | }
244 | editor.commit();
245 | }
246 |
247 | private String string(int resId) {
248 | return getResources().getString(resId);
249 | }
250 |
251 | private void showToast(String message) {
252 | Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
253 | }
254 |
255 | @Override
256 | public void onStart() {
257 | super.onStart();
258 | }
259 |
260 | @Override
261 | public void onStop() {
262 | super.onStop();
263 | }
264 |
265 | private ArrayList getSpinnerArray() {
266 | ArrayList spinnerArrayList = new ArrayList<>();
267 | for (SharedPreferenceDataType sharedPreferenceDataType : SharedPreferenceDataType.values()) {
268 | spinnerArrayList.add(sharedPreferenceDataType.getType());
269 | }
270 | return spinnerArrayList;
271 | }
272 | }
273 |
--------------------------------------------------------------------------------
/inappstoragereader/src/main/java/com/awesomedroidapps/inappstoragereader/views/TableDataActivity.java:
--------------------------------------------------------------------------------
1 | package com.awesomedroidapps.inappstoragereader.views;
2 |
3 | import android.app.ProgressDialog;
4 | import android.content.ContentValues;
5 | import android.content.Intent;
6 | import android.os.Bundle;
7 | import android.support.v7.widget.LinearLayoutManager;
8 | import android.view.Menu;
9 | import android.view.MenuInflater;
10 | import android.view.MenuItem;
11 | import android.view.View;
12 | import android.widget.RelativeLayout;
13 | import android.widget.Toast;
14 |
15 | import com.awesomedroidapps.inappstoragereader.AppStorageDataRecyclerView;
16 | import com.awesomedroidapps.inappstoragereader.Constants;
17 | import com.awesomedroidapps.inappstoragereader.DataItemDialogFragment;
18 | import com.awesomedroidapps.inappstoragereader.DatabaseColumnType;
19 | import com.awesomedroidapps.inappstoragereader.DatabaseQueryCommandType;
20 | import com.awesomedroidapps.inappstoragereader.ErrorType;
21 | import com.awesomedroidapps.inappstoragereader.QueryDatabaseAsyncTask;
22 | import com.awesomedroidapps.inappstoragereader.R;
23 | import com.awesomedroidapps.inappstoragereader.TableDataAsyncTask;
24 | import com.awesomedroidapps.inappstoragereader.Utils;
25 | import com.awesomedroidapps.inappstoragereader.adapters.TableDataListAdapter;
26 | import com.awesomedroidapps.inappstoragereader.entities.QueryDatabaseRequest;
27 | import com.awesomedroidapps.inappstoragereader.entities.QueryDatabaseResponse;
28 | import com.awesomedroidapps.inappstoragereader.entities.TableDataResponse;
29 | import com.awesomedroidapps.inappstoragereader.entities.TableInfo;
30 | import com.awesomedroidapps.inappstoragereader.interfaces.CommandResponses;
31 | import com.awesomedroidapps.inappstoragereader.interfaces.DataItemClickListener;
32 | import com.awesomedroidapps.inappstoragereader.interfaces.ErrorMessageInterface;
33 | import com.awesomedroidapps.inappstoragereader.interfaces.QueryResponseListener;
34 | import com.awesomedroidapps.inappstoragereader.interfaces.TableDataEditListener;
35 | import com.awesomedroidapps.inappstoragereader.interfaces.TableDataView;
36 | import com.awesomedroidapps.inappstoragereader.utilities.AppDatabaseHelper;
37 |
38 | import java.lang.ref.WeakReference;
39 | import java.util.List;
40 |
41 | /**
42 | * Created by anshul on 11/2/17.
43 | */
44 |
45 | public class TableDataActivity extends BaseActivity
46 | implements ErrorMessageInterface, DataItemClickListener, TableDataView,
47 | TableDataEditListener, QueryResponseListener, CommandResponses {
48 |
49 | private AppStorageDataRecyclerView tableDataRecyclerView;
50 | private String databaseName, tableName;
51 | private ProgressDialog progressDialog;
52 | private RelativeLayout errorHandlerLayout;
53 | private TableDataResponse tableDataResponse;
54 |
55 | @Override
56 | protected void onCreate(Bundle savedInstanceState) {
57 | super.onCreate(savedInstanceState);
58 | setContentView(R.layout.com_awesomedroidapps_inappstoragereader_activity_table_data);
59 | tableDataRecyclerView =
60 | (AppStorageDataRecyclerView) findViewById(R.id.table_data_recycler_view);
61 | errorHandlerLayout = (RelativeLayout) findViewById(R.id.error_handler);
62 | progressDialog = new ProgressDialog(this);
63 |
64 | //Read the bundle
65 | Bundle bundle = getIntent().getExtras();
66 | if (bundle != null) {
67 | databaseName = bundle.getString(Constants.BUNDLE_DATABASE_NAME);
68 | tableName = bundle.getString(Constants.BUNDLE_TABLE_NAME);
69 | }
70 | }
71 |
72 | @Override
73 | public void onStart() {
74 | super.onStart();
75 | initUI();
76 | fetchData();
77 | }
78 |
79 | private void fetchData() {
80 | new TableDataAsyncTask(new WeakReference(this), this).execute(
81 | new String[]{databaseName, tableName});
82 | }
83 |
84 | @Override
85 | public boolean onCreateOptionsMenu(Menu menu) {
86 | MenuInflater inflater = getMenuInflater();
87 | inflater.inflate(R.menu.com_awesomedroidapps_inappstoragereader_table_data, menu);
88 | return true;
89 | }
90 |
91 | @Override
92 | public boolean onOptionsItemSelected(MenuItem item) {
93 | // Handle item selection
94 | if (item.getItemId() == R.id.com_awesomedroidapps_inappstoragereader_edit) {
95 | openQueryActivity();
96 | }
97 | return super.onOptionsItemSelected(item);
98 | }
99 |
100 | private void openQueryActivity() {
101 | Intent intent = new Intent(this, QueryDatabaseActivity.class);
102 | Bundle bundle = new Bundle();
103 | TableInfo tableInfo = new TableInfo();
104 | tableInfo.setDatabaseName(databaseName);
105 | tableInfo.setTableName(tableName);
106 | tableInfo.setPrimaryKeysList(tableDataResponse.getPrimaryKeyList());
107 | tableInfo.setTableColumnNames(tableDataResponse.getColumnNames());
108 | tableInfo.setTableColumnTypes(tableDataResponse.getColumnTypes());
109 |
110 | bundle.putSerializable(Constants.BUNDLE_TABLE_INFO, tableInfo);
111 | intent.putExtras(bundle);
112 | startActivity(intent);
113 | }
114 |
115 | private void initUI() {
116 | tableDataRecyclerView.setVisibility(View.GONE);
117 | errorHandlerLayout.setVisibility(View.GONE);
118 | progressDialog.setMessage(
119 | getString(R.string.com_awesomedroidapps_inappstoragereader_progressBar_message));
120 | progressDialog.setIndeterminate(false);
121 | progressDialog.show();
122 | }
123 |
124 |
125 | @Override
126 | public void handleError(ErrorType errorType) {
127 |
128 | }
129 |
130 | @Override
131 | public void onDataItemClicked(String data) {
132 |
133 | }
134 |
135 | @Override
136 | public void onDataItemClicked(String data, int columnIndex, List columnValues) {
137 | DataItemDialogFragment dataItemDialogFragment = DataItemDialogFragment.newInstance(data, this,
138 | columnIndex, columnValues);
139 | dataItemDialogFragment.show(getSupportFragmentManager(), "dialog");
140 | }
141 |
142 | @Override
143 | public void onDataFetched(TableDataResponse tableDataResponse) {
144 |
145 | this.tableDataResponse = tableDataResponse;
146 | if (progressDialog != null) {
147 | progressDialog.dismiss();
148 | }
149 |
150 | if (tableDataResponse == null || Utils.isEmpty(tableDataResponse.getTableData())) {
151 | handleError(ErrorType.NO_TABLE_DATA_FOUND);
152 | return;
153 | }
154 |
155 | tableDataRecyclerView.setVisibility(View.VISIBLE);
156 | tableDataRecyclerView.setRecyclerViewWidth(tableDataResponse.getRecyclerViewWidth());
157 |
158 | TableDataListAdapter adapter =
159 | new TableDataListAdapter(tableDataResponse.getTableData(), this,
160 | tableDataResponse.getRecyclerViewColumnsWidth(), this);
161 | LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager
162 | .VERTICAL, false);
163 | Utils.setActionBarTitle(getSupportActionBar(), tableName,
164 | tableDataResponse.getTableData().size() - 1);
165 | tableDataRecyclerView.setLayoutManager(linearLayoutManager);
166 | tableDataRecyclerView.setAdapter(adapter);
167 | }
168 |
169 | @Override
170 | public void onTableDataEdited(String newValue, int columnIndex,
171 | List columnValues) {
172 | List tableColumnNames = tableDataResponse.getColumnNames();
173 | List tableColumnTypes = tableDataResponse.getColumnTypes();
174 | List primaryKeysList = tableDataResponse.getPrimaryKeyList();
175 |
176 | QueryDatabaseRequest queryDatabaseRequest = new QueryDatabaseRequest();
177 |
178 | ContentValues contentValues = null;
179 | String genericError = Utils.getString(this, R.string.com_awesomedroidapps_inappstoragereader_database_query_failed);
180 | try {
181 | contentValues =
182 | AppDatabaseHelper.getContentValues(tableColumnNames, tableColumnTypes,
183 | columnIndex, newValue, contentValues);
184 | } catch (Exception e) {
185 | //TODO anshul.jain Instead of throwing Generic exception, throw the relevant exception.
186 | Utils.showLongToast(this, genericError);
187 | return;
188 | }
189 | if (contentValues == null) {
190 | Utils.showLongToast(this, genericError);
191 | return;
192 | }
193 | String whereClause = AppDatabaseHelper.getUpdateWhereClause(tableColumnNames, tableColumnTypes,
194 | columnValues, primaryKeysList);
195 | queryDatabaseRequest.setContentValues(contentValues);
196 | queryDatabaseRequest.setWhereClause(whereClause);
197 | queryDatabaseRequest.setDatabaseQueryCommandType(DatabaseQueryCommandType.UPDATE);
198 | queryDatabaseRequest.setDatabaseName(databaseName);
199 | queryDatabaseRequest.setTableName(tableName);
200 | new QueryDatabaseAsyncTask(new WeakReference(this), this, queryDatabaseRequest).execute();
201 | }
202 |
203 |
204 | @Override
205 | public void onSelectQueryResponse(QueryDatabaseResponse queryDatabaseResponse) {
206 | switch (queryDatabaseResponse.getQueryStatus()) {
207 | case SUCCESS:
208 | break;
209 | case FAILURE:
210 | break;
211 | }
212 | }
213 |
214 | @Override
215 | public void onUpdateQueryResponse(QueryDatabaseResponse queryDatabaseResponse) {
216 | if (queryDatabaseResponse == null || queryDatabaseResponse.getQueryStatus() == null) {
217 | return;
218 | }
219 |
220 | switch (queryDatabaseResponse.getQueryStatus()) {
221 | case SUCCESS:
222 | String toastMessage = Utils.getString(this, R.string
223 | .com_awesomedroidapps_inappstoragereader_database_query_success);
224 | Utils.showLongToast(this, toastMessage);
225 | fetchData();
226 | break;
227 | case FAILURE:
228 | //TODO anshul.jain Replace this with a proper message.
229 | Toast.makeText(this, "Update Failed", Toast.LENGTH_LONG).show();
230 | break;
231 | }
232 | }
233 |
234 | @Override
235 | public void onDeleteQueryResponse(QueryDatabaseResponse queryDatabaseResponse) {
236 |
237 | }
238 |
239 | @Override
240 | public void onInsertQueryResponse(QueryDatabaseResponse queryDatabaseResponse) {
241 |
242 | }
243 |
244 | @Override
245 | public void onUnknownTypeQueryResponse(QueryDatabaseResponse queryDatabaseResponse) {
246 | fetchData();
247 | }
248 |
249 | @Override
250 | public void onRawQueryDataFetched(QueryDatabaseResponse queryDatabaseResponse) {
251 |
252 | if (progressDialog != null) {
253 | progressDialog.dismiss();
254 | }
255 |
256 | if (queryDatabaseResponse == null || queryDatabaseResponse.getQueryStatus() == null) {
257 | String toastMessage = Utils.getString(this, R.string
258 | .com_awesomedroidapps_inappstoragereader_database_query_failed);
259 | Utils.showLongToast(this, toastMessage);
260 | return;
261 | }
262 |
263 | DatabaseQueryCommandType commandType = queryDatabaseResponse.getDatabaseQueryCommandType();
264 |
265 | if (commandType == null) {
266 | onUnknownTypeQueryResponse(queryDatabaseResponse);
267 | return;
268 | }
269 |
270 | switch (commandType) {
271 | case UPDATE:
272 | onUpdateQueryResponse(queryDatabaseResponse);
273 | break;
274 | case SELECT:
275 | onSelectQueryResponse(queryDatabaseResponse);
276 | break;
277 | case DELETE:
278 | onDeleteQueryResponse(queryDatabaseResponse);
279 | break;
280 | case INSERT:
281 | onInsertQueryResponse(queryDatabaseResponse);
282 | break;
283 | default:
284 | onUnknownTypeQueryResponse(queryDatabaseResponse);
285 | }
286 | }
287 | }
288 |
--------------------------------------------------------------------------------
/inappstoragereader/src/main/java/com/awesomedroidapps/inappstoragereader/views/SharedPreferencesActivity.java:
--------------------------------------------------------------------------------
1 | package com.awesomedroidapps.inappstoragereader.views;
2 |
3 | import android.app.ProgressDialog;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.support.v7.widget.LinearLayoutManager;
7 | import android.support.v7.widget.PopupMenu;
8 | import android.view.Menu;
9 | import android.view.MenuInflater;
10 | import android.view.MenuItem;
11 | import android.view.View;
12 | import android.widget.RelativeLayout;
13 | import android.widget.Toast;
14 |
15 | import com.awesomedroidapps.inappstoragereader.AppStorageDataRecyclerView;
16 | import com.awesomedroidapps.inappstoragereader.AppStorageItemListAsyncTask;
17 | import com.awesomedroidapps.inappstoragereader.Constants;
18 | import com.awesomedroidapps.inappstoragereader.DataItemDialogFragment;
19 | import com.awesomedroidapps.inappstoragereader.ErrorMessageHandler;
20 | import com.awesomedroidapps.inappstoragereader.ErrorType;
21 | import com.awesomedroidapps.inappstoragereader.R;
22 | import com.awesomedroidapps.inappstoragereader.SharedPreferenceAsyncTask;
23 | import com.awesomedroidapps.inappstoragereader.StorageType;
24 | import com.awesomedroidapps.inappstoragereader.Utils;
25 | import com.awesomedroidapps.inappstoragereader.adapters.IconWithTextListAdapter;
26 | import com.awesomedroidapps.inappstoragereader.adapters.SharedPreferencesListAdapter;
27 | import com.awesomedroidapps.inappstoragereader.entities.AppDataStorageItem;
28 | import com.awesomedroidapps.inappstoragereader.entities.SharedPreferenceObject;
29 | import com.awesomedroidapps.inappstoragereader.interfaces.AppStorageItemClickListener;
30 | import com.awesomedroidapps.inappstoragereader.interfaces.DataItemClickListener;
31 | import com.awesomedroidapps.inappstoragereader.interfaces.ErrorMessageInterface;
32 | import com.awesomedroidapps.inappstoragereader.interfaces.ListDataView;
33 | import com.awesomedroidapps.inappstoragereader.interfaces.SharedPreferenceView;
34 |
35 | import java.lang.ref.WeakReference;
36 | import java.util.ArrayList;
37 | import java.util.List;
38 |
39 | /**
40 | * Created by anshul on 11/2/17.
41 | */
42 |
43 | public class SharedPreferencesActivity extends BaseActivity implements
44 | ErrorMessageInterface, PopupMenu.OnMenuItemClickListener, AppStorageItemClickListener,
45 | DataItemClickListener, ListDataView, SharedPreferenceView {
46 |
47 | private AppStorageDataRecyclerView sharedPreferencesRecylerView;
48 | private RelativeLayout errorHandlerLayout;
49 | private String fileName = null;
50 | private boolean isFileModeEnabled = false;
51 | private boolean displayFilterMenu = true;
52 | private ProgressDialog progressDialog;
53 |
54 | @Override
55 | protected void onCreate(Bundle savedInstanceState) {
56 | super.onCreate(savedInstanceState);
57 | setContentView(
58 | R.layout.com_awesomedroidapps_inappstoragereader_activity_shared_preferences_list);
59 | sharedPreferencesRecylerView =
60 | (AppStorageDataRecyclerView) findViewById(R.id.shared_preferences_recycler_view);
61 | sharedPreferencesRecylerView.setRecyclerViewWidth(getRecyclerViewWidth());
62 | errorHandlerLayout = (RelativeLayout) findViewById(R.id.error_handler);
63 |
64 | Bundle bundle = getIntent().getExtras();
65 | if (bundle != null) {
66 | fileName = bundle.getString(Constants.BUNDLE_FILE_NAME);
67 | displayFilterMenu = bundle.getBoolean(Constants.BUNDLE_DISPLAY_FILTER);
68 | }
69 | progressDialog = new ProgressDialog(this);
70 | }
71 |
72 | @Override
73 | public void onStart() {
74 | super.onStart();
75 | initUI();
76 | if (isFileModeEnabled) {
77 | loadSharedPreferencesFiles();
78 | } else if (Utils.isEmpty(fileName)) {
79 | loadAllSharedPreferences();
80 | } else {
81 | loadSharedPreferencesFromFile(fileName);
82 | }
83 | }
84 |
85 | private void initUI() {
86 | sharedPreferencesRecylerView.setVisibility(View.GONE);
87 | errorHandlerLayout.setVisibility(View.GONE);
88 | progressDialog.setMessage(
89 | getString(R.string.com_awesomedroidapps_inappstoragereader_progressBar_message));
90 | progressDialog.setIndeterminate(false);
91 | progressDialog.show();
92 | }
93 |
94 | @Override
95 | public boolean onCreateOptionsMenu(Menu menu) {
96 | MenuInflater inflater = getMenuInflater();
97 | inflater.inflate(R.menu.com_awesomedroidapps_inappstoragereader_shared_preference_menu, menu);
98 | MenuItem item = menu.findItem(R.id.shared_preferences_filter);
99 | item.setVisible(displayFilterMenu);
100 | return true;
101 | }
102 |
103 | @Override
104 | public boolean onOptionsItemSelected(MenuItem item) {
105 | // Handle item selection
106 | if (item.getItemId() == R.id.shared_preferences_filter) {
107 | View view = findViewById(R.id.shared_preferences_filter);
108 | showPopup(view);
109 | return true;
110 | }
111 | return super.onOptionsItemSelected(item);
112 | }
113 |
114 | /**
115 | * When the popup is shown.
116 | *
117 | * @param v
118 | */
119 | private void showPopup(View v) {
120 | PopupMenu popup = new PopupMenu(this, v);
121 | MenuInflater inflater = popup.getMenuInflater();
122 | inflater.inflate(R.menu.com_awesomedroidapps_inappstoragereader_shared_preferences_popup_menu,
123 | popup.getMenu());
124 | popup.setOnMenuItemClickListener(this);
125 | popup.show();
126 | }
127 |
128 | /**
129 | * This function is for loading all the shared preferences.
130 | */
131 | private void loadAllSharedPreferences() {
132 | new SharedPreferenceAsyncTask(new WeakReference(this), this).execute(fileName);
133 | }
134 |
135 | /**
136 | * This function is for loading all the shared preferences of a file
137 | *
138 | * @param fileName
139 | */
140 | private void loadSharedPreferencesFromFile(String fileName) {
141 | new SharedPreferenceAsyncTask(new WeakReference(this), this).execute(fileName);
142 | }
143 |
144 | /**
145 | * This function is used for loading all the shared preferences files.
146 | */
147 | private void loadSharedPreferencesFiles() {
148 | new AppStorageItemListAsyncTask(new WeakReference(this), this, StorageType.SHARED_PREFERENCE).execute();
149 | }
150 |
151 | private void setSharedPreferenceList(List sharedPreferenceObjectArrayList) {
152 | setActionBarTitle(sharedPreferenceObjectArrayList);
153 | if (Utils.isEmpty(sharedPreferenceObjectArrayList)) {
154 | handleError(ErrorType.NO_SHARED_PREFERENCES_FOUND);
155 | return;
156 | }
157 | sharedPreferencesRecylerView.setVisibility(View.VISIBLE);
158 | errorHandlerLayout.setVisibility(View.GONE);
159 |
160 | sharedPreferenceObjectArrayList.add(Constants.ZERO_INDEX, getSharedPreferenceHeadersInList());
161 | SharedPreferencesListAdapter
162 | adapter = new SharedPreferencesListAdapter(sharedPreferenceObjectArrayList, this,
163 | getRecyleViewWidthList(), this);
164 | sharedPreferencesRecylerView.setLayoutManager(new LinearLayoutManager(this));
165 | sharedPreferencesRecylerView.setAdapter(adapter);
166 | }
167 |
168 | /**
169 | * Handle Errors .
170 | *
171 | * @param errorType
172 | */
173 | @Override
174 | public void handleError(ErrorType errorType) {
175 | sharedPreferencesRecylerView.setVisibility(View.GONE);
176 | errorHandlerLayout.setVisibility(View.VISIBLE);
177 | ErrorMessageHandler handler = new ErrorMessageHandler();
178 | handler.handleError(errorType, errorHandlerLayout);
179 | }
180 |
181 | /**
182 | * Callback for click on pop up items.
183 | *
184 | * @param item
185 | * @return
186 | */
187 | @Override
188 | public boolean onMenuItemClick(MenuItem item) {
189 | if (item == null) {
190 | return false;
191 | }
192 |
193 | //The view to show the user all the shared preferences at once.
194 | if (item.getItemId() == R.id.shared_preferences_all) {
195 | item.setChecked(item.isChecked());
196 | loadAllSharedPreferences();
197 | isFileModeEnabled = false;
198 | return true;
199 | }
200 | //The view to show the user all the shared preferences files.
201 | else if (item.getItemId() == R.id.shared_preferences_file) {
202 | item.setChecked(item.isChecked());
203 | loadSharedPreferencesFiles();
204 | isFileModeEnabled = true;
205 | return true;
206 | }
207 | return onMenuItemClick(item);
208 | }
209 |
210 | /**
211 | * Sets the title of the action bar with the number of shared preferences items.
212 | *
213 | * @param sharedPreferenceObjectList - List containing the items.
214 | */
215 | private void setActionBarTitle(List sharedPreferenceObjectList) {
216 | if (getSupportActionBar() == null) {
217 | return;
218 | }
219 | String sharedPreferenceTitle = getResources().getString(R.string
220 | .com_awesomedroidapps_inappstoragereader_shared_preferences_list_activity);
221 | int size = Constants.ZERO_INDEX;
222 | if (!Utils.isEmpty(sharedPreferenceObjectList)) {
223 | size = sharedPreferenceObjectList.size();
224 | }
225 | Utils.setActionBarTitle(getSupportActionBar(), sharedPreferenceTitle, size);
226 | }
227 |
228 | @Override
229 | public void onItemClicked(AppDataStorageItem appDataStorageItem) {
230 | Intent intent = new Intent(this, SharedPreferencesActivity.class);
231 | Bundle bundle = new Bundle();
232 | bundle.putString(Constants.BUNDLE_FILE_NAME, appDataStorageItem.getStorageName());
233 | bundle.putBoolean(Constants.BUNDLE_DISPLAY_FILTER, false);
234 | intent.putExtras(bundle);
235 | startActivity(intent);
236 | }
237 |
238 | /**
239 | * To get the width of the recyclerView based on its individual column widths.
240 | *
241 | * @return - The width of the RecyclerView.
242 | */
243 | private int getRecyclerViewWidth() {
244 | return (int) (getResources().getDimension(
245 | R.dimen.com_awesomedroidapps_inappstoragereader_sharedpreferences_type_width) +
246 | getResources().getDimension(
247 | R.dimen.com_awesomedroidapps_inappstoragereader_sharedpreferences_key_width) +
248 | getResources().getDimension(
249 | R.dimen.com_awesomedroidapps_inappstoragereader_sharedpreferences_value_width));
250 | }
251 |
252 | private ArrayList getRecyleViewWidthList() {
253 | ArrayList arrayList = new ArrayList<>();
254 | arrayList.add(Utils.getDimensionInInteger(this,
255 | R.dimen.com_awesomedroidapps_inappstoragereader_sharedpreferences_key_width));
256 | arrayList.add(Utils.getDimensionInInteger(this,
257 | R.dimen.com_awesomedroidapps_inappstoragereader_sharedpreferences_value_width));
258 | arrayList.add(Utils.getDimensionInInteger(this,
259 | R.dimen.com_awesomedroidapps_inappstoragereader_sharedpreferences_type_width));
260 | return arrayList;
261 | }
262 |
263 | private ArrayList getSharedPreferenceHeadersInList() {
264 | ArrayList arrayList = new ArrayList();
265 | arrayList.add(Constants.SHARED_PREFERENCES_KEY);
266 | arrayList.add(Constants.SHARED_PREFERENCES_VALUE);
267 | arrayList.add(Constants.SHARED_PREFERENCES_TYPE);
268 | return arrayList;
269 | }
270 |
271 | @Override
272 | public void onDataFetched(List sharedPreferencesFileList) {
273 | progressDialog.dismiss();
274 | if (Utils.isEmpty(sharedPreferencesFileList)) {
275 | return;
276 | }
277 |
278 | sharedPreferencesRecylerView.setVisibility(View.VISIBLE);
279 | IconWithTextListAdapter
280 | adapter = new IconWithTextListAdapter(sharedPreferencesFileList, this);
281 | sharedPreferencesRecylerView.setLayoutManager(new LinearLayoutManager(this));
282 | sharedPreferencesRecylerView.setAdapter(adapter);
283 | setActionBarTitle(null);
284 | }
285 |
286 | @Override
287 | public void onSharedPreferencesFetched(List appDataList) {
288 | progressDialog.dismiss();
289 | setSharedPreferenceList(appDataList);
290 | }
291 |
292 | @Override
293 | public void onDataItemClicked(String data) {
294 | if (Utils.isEmpty(data)) {
295 | String toastMessage =
296 | getResources().getString(R.string.com_awesomedroidapps_inappstoragereader_item_empty);
297 | Toast.makeText(this, toastMessage, Toast.LENGTH_SHORT).show();
298 | return;
299 | }
300 | DataItemDialogFragment dataItemDialogFragment = DataItemDialogFragment.newInstance(data,null,
301 | 0,null);
302 | dataItemDialogFragment.show(getSupportFragmentManager(), "dialog");
303 | }
304 |
305 | @Override
306 | public void onDataItemClicked(String data, int columnIndex, List columnValues) {
307 |
308 | }
309 | }
310 |
--------------------------------------------------------------------------------
/inappstoragereader/src/main/java/com/awesomedroidapps/inappstoragereader/views/QueryResultActivity.java:
--------------------------------------------------------------------------------
1 | package com.awesomedroidapps.inappstoragereader.views;
2 |
3 | import android.app.ProgressDialog;
4 | import android.content.ContentValues;
5 | import android.os.Bundle;
6 | import android.support.annotation.NonNull;
7 | import android.support.v7.widget.LinearLayoutManager;
8 | import android.view.View;
9 | import android.widget.RelativeLayout;
10 | import android.widget.Toast;
11 |
12 | import com.awesomedroidapps.inappstoragereader.AppStorageDataRecyclerView;
13 | import com.awesomedroidapps.inappstoragereader.Constants;
14 | import com.awesomedroidapps.inappstoragereader.DataItemDialogFragment;
15 | import com.awesomedroidapps.inappstoragereader.DatabaseQueryCommandType;
16 | import com.awesomedroidapps.inappstoragereader.ErrorType;
17 | import com.awesomedroidapps.inappstoragereader.QueryDatabaseAsyncTask;
18 | import com.awesomedroidapps.inappstoragereader.QueryStatus;
19 | import com.awesomedroidapps.inappstoragereader.R;
20 | import com.awesomedroidapps.inappstoragereader.Utils;
21 | import com.awesomedroidapps.inappstoragereader.adapters.TableDataListAdapter;
22 | import com.awesomedroidapps.inappstoragereader.entities.QueryDatabaseRequest;
23 | import com.awesomedroidapps.inappstoragereader.entities.QueryDatabaseResponse;
24 | import com.awesomedroidapps.inappstoragereader.entities.TableDataResponse;
25 | import com.awesomedroidapps.inappstoragereader.interfaces.CommandResponses;
26 | import com.awesomedroidapps.inappstoragereader.interfaces.DataItemClickListener;
27 | import com.awesomedroidapps.inappstoragereader.interfaces.ErrorMessageInterface;
28 | import com.awesomedroidapps.inappstoragereader.interfaces.QueryResponseListener;
29 | import com.awesomedroidapps.inappstoragereader.interfaces.TableDataView;
30 |
31 | import java.lang.ref.WeakReference;
32 | import java.util.List;
33 |
34 | /**
35 | * Created by anshul on 11/2/17.
36 | */
37 |
38 | public class QueryResultActivity extends BaseActivity
39 | implements ErrorMessageInterface, DataItemClickListener, TableDataView,
40 | QueryResponseListener, CommandResponses {
41 |
42 | private AppStorageDataRecyclerView tableDataRecyclerView;
43 | private String rawQuery, databaseName, tableName;
44 | private ProgressDialog progressDialog;
45 | private RelativeLayout errorHandlerLayout;
46 | private QueryDatabaseRequest queryDatabaseRequest;
47 |
48 | @Override
49 | protected void onCreate(Bundle savedInstanceState) {
50 | super.onCreate(savedInstanceState);
51 | setContentView(R.layout.com_awesomedroidapps_inappstoragereader_activity_query_result);
52 | tableDataRecyclerView =
53 | (AppStorageDataRecyclerView) findViewById(R.id.query_result_recycler_view);
54 | errorHandlerLayout = (RelativeLayout) findViewById(R.id.error_handler);
55 | progressDialog = new ProgressDialog(this);
56 |
57 | //Read the bundle
58 | Bundle bundle = getIntent().getExtras();
59 | if (bundle != null) {
60 | rawQuery = bundle.getString(Constants.BUNDLE_RAW_QUERY);
61 | databaseName = bundle.getString(Constants.BUNDLE_DATABASE_NAME);
62 | tableName = bundle.getString(Constants.BUNDLE_TABLE_NAME);
63 | ContentValues contentValues = bundle.getParcelable(Constants.BUNDLE_CONTENT_VALUES);
64 | queryDatabaseRequest = (QueryDatabaseRequest) bundle.get(Constants.BUNDLE_QUERY_REQUEST);
65 | queryDatabaseRequest.setContentValues(contentValues);
66 | }
67 | }
68 |
69 | @Override
70 | public void onStart() {
71 | super.onStart();
72 | queryDatabaseRequest.setDatabaseName(databaseName);
73 | queryDatabaseRequest.setTableName(tableName);
74 | new QueryDatabaseAsyncTask(new WeakReference(this), this, queryDatabaseRequest).execute();
75 | }
76 |
77 |
78 | @Override
79 | public void handleError(ErrorType errorType) {
80 |
81 | }
82 |
83 | @Override
84 | public void onDataFetched(TableDataResponse tableDataResponse) {
85 |
86 | progressDialog.dismiss();
87 |
88 | if (tableDataResponse == null || Utils.isEmpty(tableDataResponse.getTableData())) {
89 | handleError(ErrorType.NO_TABLE_DATA_FOUND);
90 | return;
91 | }
92 |
93 | tableDataRecyclerView.setVisibility(View.VISIBLE);
94 | tableDataRecyclerView.setRecyclerViewWidth(tableDataResponse.getRecyclerViewWidth());
95 |
96 |
97 | TableDataListAdapter adapter =
98 | new TableDataListAdapter(tableDataResponse.getTableData(), this,
99 | tableDataResponse.getRecyclerViewColumnsWidth(), this);
100 | LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager
101 | .VERTICAL, false);
102 | Utils.setActionBarTitle(getSupportActionBar(), "Result",
103 | tableDataResponse.getTableData().size() - 1);
104 | tableDataRecyclerView.setLayoutManager(linearLayoutManager);
105 | tableDataRecyclerView.setAdapter(adapter);
106 | }
107 |
108 | @Override
109 | public void onRawQueryDataFetched(QueryDatabaseResponse queryDatabaseResponse) {
110 |
111 | if (progressDialog != null) {
112 | progressDialog.dismiss();
113 | }
114 |
115 | if (queryDatabaseResponse == null || queryDatabaseResponse.getQueryStatus() == null) {
116 | showGenericErrorToast();
117 | finish();
118 | return;
119 | }
120 |
121 | DatabaseQueryCommandType databaseQueryCommandType =
122 | queryDatabaseResponse.getDatabaseQueryCommandType();
123 |
124 | if (databaseQueryCommandType == null) {
125 | showGenericErrorToast();
126 | finish();
127 | return;
128 | }
129 |
130 | switch (databaseQueryCommandType) {
131 | case UPDATE:
132 | onUpdateQueryResponse(queryDatabaseResponse);
133 | break;
134 | case SELECT:
135 | onSelectQueryResponse(queryDatabaseResponse);
136 | break;
137 | case DELETE:
138 | onDeleteQueryResponse(queryDatabaseResponse);
139 | break;
140 | case INSERT:
141 | onInsertQueryResponse(queryDatabaseResponse);
142 | break;
143 | case RAW_QUERY:
144 | onUnknownTypeQueryResponse(queryDatabaseResponse);
145 | }
146 | }
147 |
148 |
149 | /**
150 | * This method is called when the query to the database is succesful.
151 | *
152 | * @param tableDataResponse
153 | */
154 | private void showQueryData(TableDataResponse tableDataResponse) {
155 | if (tableDataResponse == null || Utils.isEmpty(tableDataResponse.getTableData())) {
156 | handleError(ErrorType.NO_TABLE_DATA_FOUND);
157 | return;
158 | }
159 |
160 | tableDataRecyclerView.setVisibility(View.VISIBLE);
161 | tableDataRecyclerView.setRecyclerViewWidth(tableDataResponse.getRecyclerViewWidth());
162 |
163 |
164 | TableDataListAdapter adapter =
165 | new TableDataListAdapter(tableDataResponse.getTableData(), this,
166 | tableDataResponse.getRecyclerViewColumnsWidth(), this);
167 | LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager
168 | .VERTICAL, false);
169 | Utils.setActionBarTitle(getSupportActionBar(), null,
170 | tableDataResponse.getTableData().size() - 1);
171 | tableDataRecyclerView.setLayoutManager(linearLayoutManager);
172 | tableDataRecyclerView.setAdapter(adapter);
173 |
174 |
175 | }
176 |
177 | /**
178 | * This method is called when the query to the database is failed.
179 | *
180 | * @param errorMessage
181 | */
182 | private void showQueryError(String errorMessage) {
183 | Utils.showLongToast(this, errorMessage);
184 | }
185 |
186 | @Override
187 | public void onDataItemClicked(String data) {
188 | if (Utils.isEmpty(data)) {
189 | String toastMessage =
190 | getResources().getString(R.string.com_awesomedroidapps_inappstoragereader_item_empty);
191 | Toast.makeText(this, toastMessage, Toast.LENGTH_SHORT).show();
192 | return;
193 | }
194 | DataItemDialogFragment dataItemDialogFragment =
195 | DataItemDialogFragment.newInstance(data, null, 0,
196 | null);
197 | dataItemDialogFragment.show(getSupportFragmentManager(), "dialog");
198 | }
199 |
200 | @Override
201 | public void onDataItemClicked(String data, int columnIndex, List columnValues) {
202 |
203 | }
204 |
205 | @Override
206 | public void onSelectQueryResponse(@NonNull QueryDatabaseResponse queryDatabaseResponse) {
207 |
208 | QueryStatus queryStatus = queryDatabaseResponse.getQueryStatus();
209 |
210 | switch (queryStatus) {
211 | case SUCCESS:
212 | int selectedRows = (int) queryDatabaseResponse.getAffectedRows();
213 | showQueryData(queryDatabaseResponse.getTableDataResponse());
214 | String toastMessage = getResources().getQuantityString(R.plurals
215 | .com_awesomedroidapps_inappstoragereader_records_found, selectedRows, selectedRows);
216 | Utils.showLongToast(this, toastMessage);
217 | break;
218 | case FAILURE:
219 | finish();
220 | showQueryError(queryDatabaseResponse.getErrorMessage());
221 | break;
222 | }
223 | }
224 |
225 | @Override
226 | public void onUpdateQueryResponse(QueryDatabaseResponse queryDatabaseResponse) {
227 | switch (queryDatabaseResponse.getQueryStatus()) {
228 | case SUCCESS:
229 | long updatedRows = queryDatabaseResponse.getAffectedRows();
230 | String toastMessage = Utils.getString(this, R.string
231 | .com_awesomedroidapps_inappstoragereader_table_updated_toast, updatedRows);
232 | Utils.showLongToast(this, toastMessage);
233 | break;
234 | case FAILURE:
235 | String errorMessage = queryDatabaseResponse.getErrorMessage();
236 | if (Utils.isEmpty(errorMessage)) {
237 | errorMessage = Utils.getString(this, R.string
238 | .com_awesomedroidapps_inappstoragereader_generic_error);
239 | }
240 | Utils.showLongToast(this, errorMessage);
241 | break;
242 | }
243 | finish();
244 | }
245 |
246 | @Override
247 | public void onDeleteQueryResponse(QueryDatabaseResponse queryDatabaseResponse) {
248 |
249 | switch (queryDatabaseResponse.getQueryStatus()) {
250 | case SUCCESS:
251 | long deletedRows = queryDatabaseResponse.getAffectedRows();
252 | String toastMessage = Utils.getString(this, R.string
253 | .com_awesomedroidapps_inappstoragereader_query_deleted_successful, deletedRows);
254 | Utils.showLongToast(this, toastMessage);
255 | break;
256 | case FAILURE:
257 | String errorMessage = queryDatabaseResponse.getErrorMessage();
258 | if (Utils.isEmpty(errorMessage)) {
259 | errorMessage = Utils.getString(this, R.string
260 | .com_awesomedroidapps_inappstoragereader_generic_error);
261 | }
262 | Utils.showLongToast(this, errorMessage);
263 | break;
264 | }
265 | finish();
266 | }
267 |
268 | @Override
269 | public void onInsertQueryResponse(QueryDatabaseResponse queryDatabaseResponse) {
270 |
271 | switch (queryDatabaseResponse.getQueryStatus()) {
272 | case SUCCESS:
273 | String toastMessage = Utils.getString(this,
274 | R.string.com_awesomedroidapps_inappstoragereader_table_inserted_toast);
275 | Utils.showLongToast(this, toastMessage);
276 | break;
277 | case FAILURE:
278 | String errorMessage = queryDatabaseResponse.getErrorMessage();
279 | if (Utils.isEmpty(errorMessage)) {
280 | errorMessage = Utils.getString(this, R.string
281 | .com_awesomedroidapps_inappstoragereader_generic_error);
282 | }
283 | Utils.showLongToast(this, errorMessage);
284 | break;
285 | }
286 | finish();
287 | }
288 |
289 | @Override
290 | public void onUnknownTypeQueryResponse(QueryDatabaseResponse queryDatabaseResponse) {
291 |
292 | QueryStatus queryStatus = queryDatabaseResponse.getQueryStatus();
293 |
294 | switch (queryStatus) {
295 | case SUCCESS:
296 | if (queryDatabaseResponse.getTableDataResponse() != null) {
297 | onDataFetched(queryDatabaseResponse.getTableDataResponse());
298 | return;
299 | }
300 | String succesfulMessage = Utils.getString(this, R.string
301 | .com_awesomedroidapps_inappstoragereader_database_query_success);
302 | Utils.showLongToast(this, succesfulMessage);
303 | finish();
304 | break;
305 | case FAILURE:
306 | String failureReason = queryDatabaseResponse.getErrorMessage();
307 | if (Utils.isEmpty(failureReason)) {
308 | failureReason = Utils.getString(this, R.string
309 | .com_awesomedroidapps_inappstoragereader_database_query_failed);
310 | }
311 | Utils.showLongToast(this, failureReason);
312 | finish();
313 | break;
314 | }
315 | }
316 |
317 | private void showGenericErrorToast() {
318 | String toastMessage = Utils.getString(this, R.string
319 | .com_awesomedroidapps_inappstoragereader_generic_error);
320 | Utils.showLongToast(this, toastMessage);
321 | }
322 | }
323 |
--------------------------------------------------------------------------------