/*
* The MIT License (MIT)
*
* Copyright (c) 2014 Devcon Contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.devconmyanmar.apps.devcon.ui;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.DisplayMetrics;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.squareup.okhttp.OkHttpClient;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.devconmyanmar.apps.devcon.Config;
import org.devconmyanmar.apps.devcon.db.MyScheduleDao;
import org.devconmyanmar.apps.devcon.db.SpeakerDao;
import org.devconmyanmar.apps.devcon.db.SponsorDao;
import org.devconmyanmar.apps.devcon.db.TalkDao;
import org.devconmyanmar.apps.devcon.event.BusProvider;
import org.devconmyanmar.apps.devcon.event.SyncSuccessEvent;
import org.devconmyanmar.apps.devcon.model.Speaker;
import org.devconmyanmar.apps.devcon.model.Talk;
import org.devconmyanmar.apps.devcon.sync.SyncScheduleService;
import org.devconmyanmar.apps.devcon.sync.SyncSpeakerService;
import org.devconmyanmar.apps.devcon.utils.SharePref;
import retrofit.Callback;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.client.OkClient;
import retrofit.client.Response;
import static org.devconmyanmar.apps.devcon.utils.LogUtils.makeLogTag;
/**
* Created by Ye Lin Aung on 14/10/05.
*/
public abstract class BaseFragment extends Fragment {
private static final String TAG = makeLogTag(BaseFragment.class);
protected SpeakerDao speakerDao;
protected TalkDao talkDao;
protected MyScheduleDao favDao;
protected SponsorDao sponsorDao;
protected Context mContext;
protected OkHttpClient okHttpClient = new OkHttpClient();
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mContext = getActivity();
speakerDao = new SpeakerDao(mContext);
talkDao = new TalkDao(mContext);
favDao = new MyScheduleDao(mContext);
sponsorDao = new SponsorDao(mContext);
}
public void showRefreshProgress(SwipeRefreshLayout mSwipeRefreshWidget) {
mSwipeRefreshWidget.setRefreshing(true);
}
public void hideRefreshProgress(SwipeRefreshLayout mSwipeRefreshWidget) {
mSwipeRefreshWidget.setRefreshing(false);
}
public void enableSwipe(SwipeRefreshLayout mSwipeRefreshWidget) {
mSwipeRefreshWidget.setEnabled(true);
}
public void disableSwipe(SwipeRefreshLayout mSwipeRefreshWidget) {
mSwipeRefreshWidget.setEnabled(false);
}
@Override public void onResume() {
super.onResume();
BusProvider.getInstance().register(this);
}
@Override public void onPause() {
super.onPause();
BusProvider.getInstance().unregister(this);
}
protected void syncSchedules(final SwipeRefreshLayout exploreSwipeRefreshView) {
showRefreshProgress(exploreSwipeRefreshView);
RestAdapter speakerRestAdapter = new RestAdapter.Builder().setEndpoint(Config.BASE_URL)
.setLogLevel(RestAdapter.LogLevel.BASIC)
.setClient(new OkClient(okHttpClient))
.build();
SyncSpeakerService syncSpeakerService = speakerRestAdapter.create(SyncSpeakerService.class);
syncSpeakerService.getSpeakers(new Callback<List<Speaker>>() {
@Override public void success(List<Speaker> speakers, Response response) {
try {
speakerDao.deleteAll();
for (Speaker s : speakers) {
speakerDao.create(s);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override public void failure(RetrofitError error) {
//Toast.makeText(getActivity(), getString(R.string.oops), Toast.LENGTH_SHORT).show();
hideRefreshProgress(exploreSwipeRefreshView);
}
});
List<Talk> favTalk = talkDao.getFavTalks();
ArrayList<Integer> talkIds = new ArrayList<Integer>();
for (Talk talk : favTalk) {
talkIds.add(talk.getId());
}
SharePref.getInstance(mContext).saveFavIds(talkIds.toString());
RestAdapter scheduleRestAdapter = new RestAdapter.Builder().setEndpoint(Config.BASE_URL)
.setLogLevel(RestAdapter.LogLevel.BASIC)
.setClient(new OkClient(okHttpClient))
.build();
SyncScheduleService syncScheduleService = scheduleRestAdapter.create(SyncScheduleService.class);
syncScheduleService.getSchedules(new Callback<JsonObject>() {
@Override public void success(JsonObject jsonObj, Response response) {
JsonArray scheduleArray = jsonObj.getAsJsonArray("sessions");
try {
talkDao.deleteAll();
} catch (SQLException e) {
e.printStackTrace();
}
List<Talk> talks = new ArrayList<Talk>();
for (JsonElement j : scheduleArray) {
Talk talk = new Talk();
talk.setId(j.getAsJsonObject().get("id").getAsInt());
talk.setTitle(j.getAsJsonObject().get("title").getAsString());
talk.setDescription(j.getAsJsonObject().get("description").getAsString());
talk.setPhoto(j.getAsJsonObject().get("photo").getAsString());
talk.setDate(j.getAsJsonObject().get("date").getAsString());
talk.setFavourite(j.getAsJsonObject().get("favourite").getAsBoolean());
talk.setTalk_type(j.getAsJsonObject().get("talk_type").getAsInt());
talk.setRoom(j.getAsJsonObject().get("room").getAsString());
talk.setFrom_time(j.getAsJsonObject().get("from_time").getAsString());
talk.setTo_time(j.getAsJsonObject().get("to_time").getAsString());
JsonArray speakers = j.getAsJsonObject().getAsJsonArray("speakers");
talk.setSpeakers(speakers.toString());
talks.add(talk);
talkDao.create(talk);
}
ArrayList<Talk> favTalk = flattenFav(SharePref.getInstance(mContext).geFavIds());
ArrayList<Integer> talkIds = new ArrayList<Integer>();
for (Talk talk : favTalk) {
talkIds.add(talk.getId());
}
for (Talk talk : talks) {
if (talkIds.contains(talk.getId())) {
talk.setFavourite(true);
talk.setId(talk.getId());
talkDao.createOrUpdate(talk);
}
}
hideRefreshProgress(exploreSwipeRefreshView);
BusProvider.getInstance().post(new SyncSuccessEvent());
}
@Override public void failure(RetrofitError error) {
hideRefreshProgress(exploreSwipeRefreshView);
}
});
}
public ArrayList<Talk> flattenFav(String talkIds) {
ArrayList<Talk> mTalks = new ArrayList<Talk>();
String id[] = new Gson().fromJson(talkIds, String[].class);
for (String anId : id) {
mTalks.add(talkDao.getTalkById(Integer.valueOf(anId)));
}
return mTalks;
}
public int dpToPx(int dp) {
DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
}
public static boolean isMyanmarText(String str) {
Pattern normalRange = Pattern.compile("^[\\u1000-\\u109f]");
Pattern extendedRange = Pattern.compile("^[\\uaa60-\\uaa7f]");
Matcher normalMatcher = normalRange.matcher(str);
Matcher extendedMatcher = extendedRange.matcher(str);
return normalMatcher.find() || extendedMatcher.find();
}
}