/*
* Copyright 2014 Jeremie Long
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.lithidsw.wallbox.app.randomizer;
import java.io.File;
import java.util.ArrayList;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.lithidsw.wallbox.R;
import com.lithidsw.wallbox.app.randomizer.adapter.RandomizerGridAdapter;
import com.lithidsw.wallbox.app.randomizer.db.TableHelper;
import com.lithidsw.wallbox.utils.C;
import com.lithidsw.wallbox.utils.CustomDialogs;
import com.lithidsw.wallbox.utils.MenuHelper;
import com.lithidsw.wallbox.utils.Utils;
public class RandomizerFrag extends Fragment {
LinearLayout ll;
FragmentActivity fa;
SharedPreferences prefs;
GridView mGridView;
TextView mTextView;
ProgressBar mProgressBar;
RandomizerGridAdapter adapter;
Utils mUtils;
GalLoader loader = null;
MenuHelper menuHelper;
ArrayList<String[]> mGalItems = new ArrayList<String[]>();
ArrayList<Integer> mRemoveList = new ArrayList<Integer>();
private static final int GET_IMAGE_CODE = 8639;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
fa = super.getActivity();
mUtils = new Utils(fa);
menuHelper = new MenuHelper(fa);
ll = (LinearLayout) inflater.inflate(R.layout.randomizer_frag, container, false);
prefs = fa.getSharedPreferences(C.PREF, Context.MODE_PRIVATE);
adapter = new RandomizerGridAdapter(fa, mGalItems);
mGridView = (GridView) ll.findViewById(R.id.grid_view);
mTextView = (TextView) ll.findViewById(R.id.no_content);
mProgressBar = (ProgressBar) ll.findViewById(R.id.progress);
mGridView.setAdapter(adapter);
mGridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
mGridView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode actionMode, int i, long l, boolean b) {
}
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
actionMode.setTitle("Choose threads");
mRemoveList.clear();
MenuInflater inflater = actionMode.getMenuInflater();
inflater.inflate(R.menu.randomizer_selection_menu, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
final SparseBooleanArray checked = mGridView.getCheckedItemPositions();
switch (menuItem.getItemId()) {
case R.id.action_delete:
int size = checked.size();
for (int i = 0; i < size; i++) {
int key = checked.keyAt(i);
boolean value = checked.get(key);
if (value) {
new TableHelper(fa).deleteSinglePaper(mGalItems.get(key)[1]);
}
}
actionMode.finish();
new GalLoader().execute();
break;
}
return false;
}
@Override
public void onDestroyActionMode(ActionMode actionMode) {
}
});
setHasOptionsMenu(true);
if (!prefs.getBoolean(C.PREF_RANDOMIZER_FIRST_RUN_MAIN, false)) {
prefs.edit().putBoolean(C.PREF_RANDOMIZER_FIRST_RUN_MAIN, true).commit();
String title = getResources().getString(R.string.main_title_randomize);
String message = getResources().getString(R.string.randomizer_description);
new CustomDialogs().openFirstDialog(fa, title, message);
}
return ll;
}
@Override
public void onResume() {
super.onResume();
loadUp();
}
private void loadUp() {
stopLoader();
loader = (GalLoader) new GalLoader().execute();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_add:
Intent in = new Intent();
in.setType("image/*");
in.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(in, "Select Image"), GET_IMAGE_CODE);
return true;
case R.id.action_interval:
if (mGalItems.size() > 1) {
singleDialog();
} else {
mUtils.sendToast("Need at least 2 wallpapers to start!");
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void showU(Integer item) {
switch (item) {
case 0:
mProgressBar.setVisibility(View.VISIBLE);
mTextView.setVisibility(View.GONE);
mGridView.setVisibility(View.GONE);
break;
case 1:
mProgressBar.setVisibility(View.GONE);
mTextView.setVisibility(View.VISIBLE);
mGridView.setVisibility(View.GONE);
new Utils(fa).stopRandomizerAlarms();
prefs.edit().putInt(C.PREF_RANDOMIZER_INTERVAL, 0).commit();
break;
case 2:
mProgressBar.setVisibility(View.GONE);
mTextView.setVisibility(View.GONE);
mGridView.setVisibility(View.VISIBLE);
break;
}
}
private void singleDialog() {
final String title = "Wallpaper update interval";
CharSequence[] meh = fa.getResources().getStringArray(R.array.time_intervals);
AlertDialog.Builder builder = new AlertDialog.Builder(fa);
int selected = prefs.getInt(C.PREF_RANDOMIZER_INTERVAL, 0);
builder.setTitle(title);
builder.setSingleChoiceItems(meh, selected, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
int selectedPosition = ((AlertDialog) dialog).getListView().getCheckedItemPosition();
prefs.edit().putInt(C.PREF_RANDOMIZER_INTERVAL, selectedPosition).commit();
new Utils(fa).stopRandomizerAlarms();
if (selectedPosition > 0) {
new Utils(fa).setRandomizerAlarms(selectedPosition);
String itemChosen = getResources().getStringArray(R.array.time_intervals)[selectedPosition];
Toast.makeText(fa, "Wallpapers set: " + itemChosen, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(fa, "Stopping PapersRand now", Toast.LENGTH_SHORT).show();
}
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
// Sike
}
});
builder.show();
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private String checkImage(Intent data) {
String image_path = null;
Uri uri_data = data.getData();
if (uri_data != null) {
Cursor cursor;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
String wholeID = DocumentsContract.getDocumentId(uri_data);
String id = wholeID.split(":")[1];
String[] projection = { MediaStore.Images.Media.DATA };
String whereClause = MediaStore.Images.Media._ID + "=?";
cursor = fa.getContentResolver().query(getUri(), projection, whereClause,
new String[]{id}, null);
if( cursor != null ){
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
if (cursor.moveToFirst()) {
image_path = cursor.getString(column_index);
}
cursor.close();
}
} else {
cursor = fa.getContentResolver().query(uri_data,
new String[]{android.provider.MediaStore.Images.ImageColumns.DATA},
null, null, null);
if (cursor != null) {
cursor.moveToFirst();
image_path = cursor.getString(0);
cursor.close();
}
}
}
return image_path;
}
private Uri getUri() {
String state = Environment.getExternalStorageState();
if(!state.equalsIgnoreCase(Environment.MEDIA_MOUNTED))
return MediaStore.Images.Media.INTERNAL_CONTENT_URI;
return MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
private void galleryAddPic(Intent data) {
String image = checkImage(data);
if (image != null) {
if (!new TableHelper(fa).isExist(Utils.calculateMD5(image))) {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(image);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
fa.sendBroadcast(mediaScanIntent);
new TableHelper(fa).writePaperItem(image, Utils.calculateMD5(image));
} else {
Toast.makeText(fa, "Picture already exists!", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(fa, "Picture returned null, couldn't add this image, try again.", Toast.LENGTH_LONG).show();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
switch (requestCode) {
case GET_IMAGE_CODE:
galleryAddPic(data);
break;
}
}
}
private void stopLoader() {
if (loader != null
&& loader.getStatus() != GalLoader.Status.FINISHED) {
loader.cancel(true);
loader = null;
}
}
class GalLoader extends AsyncTask<String, String, Integer> {
@Override
protected void onPreExecute() {
showU(0);
mGalItems.clear();
mGridView.invalidateViews();
}
@Override
protected Integer doInBackground(String... strings) {
ArrayList<String[]> list = new TableHelper(fa).getAllPapers();
if (list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
String[] item = new String[2];
item[0] = list.get(i)[0];
item[1] = list.get(i)[1];
mGalItems.add(item);
}
return mGalItems.size();
}
return 0;
}
@Override
protected void onPostExecute(Integer count) {
adapter.notifyDataSetChanged();
if (count > 0) {
showU(2);
} else {
showU(1);
}
}
}
}