3
import java.io.UnsupportedEncodingException;
4
import java.net.URLEncoder;
5
import java.util.Calendar;
7
import org.json.JSONArray;
8
import org.json.JSONException;
9
import org.json.JSONObject;
11
import com.lsg.app.Events.EventUpdateTask;
12
import com.lsg.app.VPlan.VPlanUpdater;
3
14
import android.app.Activity;
15
import android.app.AlertDialog;
16
import android.app.ProgressDialog;
17
import android.content.ContentValues;
18
import android.content.Context;
19
import android.content.DialogInterface;
4
20
import android.content.Intent;
21
import android.content.SharedPreferences;
22
import android.database.Cursor;
23
import android.database.sqlite.SQLiteDatabase;
24
import android.database.sqlite.SQLiteStatement;
25
import android.os.AsyncTask;
5
26
import android.os.Bundle;
27
import android.os.Handler;
28
import android.os.Parcelable;
29
import android.preference.PreferenceManager;
30
import android.support.v4.view.PagerAdapter;
6
31
import android.support.v4.view.ViewPager;
32
import android.util.Log;
33
import android.view.LayoutInflater;
34
import android.view.Menu;
35
import android.view.MenuInflater;
7
36
import android.view.MenuItem;
37
import android.view.View;
38
import android.view.ViewGroup;
39
import android.widget.AdapterView;
40
import android.widget.AdapterView.OnItemClickListener;
41
import android.widget.CursorAdapter;
42
import android.widget.LinearLayout;
43
import android.widget.ListView;
44
import android.widget.TextView;
45
import android.widget.Toast;
9
47
public class TimeTable extends Activity {
48
public static class TimetableAdapter extends CursorAdapter {
49
private SQLiteDatabase myDB;
51
public LinearLayout lay;
52
public TextView timetable_day;
53
public TextView timetable_hour;
54
public TextView timetable_subject;
55
public TextView timetable_teacher;
56
public TextView timetable_room;
58
public TimetableAdapter(Context context, Cursor c) {
59
super(context, c, false);
60
myDB = context.openOrCreateDatabase(Functions.DB_NAME, Context.MODE_PRIVATE, null);
63
public View newView(Context context, Cursor cursor, ViewGroup parent) {
64
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
65
View rowView = inflater.inflate(R.layout.timetable_item, null, true);
66
TimetableItem holder = new TimetableItem();
67
holder.lay = (LinearLayout) rowView.findViewById(R.id.timetable_lay);
68
holder.timetable_day = (TextView) rowView.findViewById(R.id.timetable_day);
69
holder.timetable_hour = (TextView) rowView.findViewById(R.id.timetable_hour);
70
holder.timetable_subject = (TextView) rowView.findViewById(R.id.timetable_subject);
71
holder.timetable_teacher = (TextView) rowView.findViewById(R.id.timetable_teacher);
72
holder.timetable_room = (TextView) rowView.findViewById(R.id.timetable_room);
73
if(Functions.getSDK() < 11)
74
holder.timetable_hour.setBackgroundResource(R.layout.divider_gradient);
75
rowView.setTag(holder);
80
public void bindView(View view, Context context, Cursor cursor) {
81
TimetableItem holder = (TimetableItem) view.getTag();
82
int position = cursor.getPosition();
84
holder.timetable_day.setVisibility(View.VISIBLE);
85
holder.timetable_day.setText(context.getResources().getStringArray(R.array.days)[cursor.getInt(cursor.getColumnIndex(Functions.DB_DAY))]);
88
holder.timetable_day.setVisibility(View.GONE);
89
int hour = cursor.getInt(cursor.getColumnIndex(Functions.DB_HOUR)) + 1;
90
String when = Integer.valueOf(hour).toString();
92
int length = cursor.getInt(cursor.getColumnIndex(Functions.DB_LENGTH));
94
when += ", " + Integer.valueOf(hour + i).toString();
97
String rawfach = cursor.getString(cursor.getColumnIndex(Functions.DB_RAW_FACH));
98
String lehrer = cursor.getString(cursor.getColumnIndex(Functions.DB_LEHRER));
99
Cursor c = myDB.query(Functions.DB_VPLAN_TABLE, new String[] {}, Functions.DB_STUNDE + "=? AND " + Functions.DB_RAW_FACH + "=? AND " + Functions.DB_LEHRER + "=?",
100
new String[] {Integer.valueOf(hour).toString(), rawfach, lehrer}, null, null, null);
102
holder.lay.setBackgroundResource(R.layout.background_info);
104
holder.lay.setBackgroundResource(R.layout.background);
106
holder.timetable_hour.setText(when + ". " + context.getString(R.string.hour));
107
holder.timetable_subject.setText(cursor.getString(cursor.getColumnIndex(Functions.DB_FACH)));
108
holder.timetable_teacher.setText(cursor.getString(cursor.getColumnIndex(Functions.DB_LEHRER)));
109
holder.timetable_room.setText(context.getString(R.string.room) + " " + cursor.getString(cursor.getColumnIndex(Functions.DB_RAUM)));
111
public void close() {
116
public class TimeTableViewPagerAdapter extends PagerAdapter {
117
private String[] exclude_subjects = new String[4];
118
private final SQLiteDatabase myDB;
119
public Cursor timetable_monday;
120
public Cursor timetable_tuesday;
121
public Cursor timetable_wednesday;
122
public Cursor timetable_thursday;
123
public Cursor timetable_friday;
124
private TimetableAdapter timetableadap_monday;
125
private TimetableAdapter timetableadap_tuesday;
126
private TimetableAdapter timetableadap_wednesday;
127
private TimetableAdapter timetableadap_thursday;
128
private TimetableAdapter timetableadap_friday;
129
private final Context context;
130
private final SharedPreferences prefs;
132
public TimeTableViewPagerAdapter(TimeTable act) {
133
prefs = PreferenceManager.getDefaultSharedPreferences(act);
134
exclude_subjects[1] = (prefs.getString(Functions.GENDER, "").equals("m")) ? "Sw" : "Sm";
135
if(prefs.getString(Functions.RELIGION, "").equals(Functions.KATHOLISCH)) {
136
exclude_subjects[2] = Functions.EVANGELISCH;
137
exclude_subjects[3] = Functions.ETHIK;
138
} else if(prefs.getString(Functions.RELIGION, "").equals(Functions.EVANGELISCH)) {
139
exclude_subjects[2] = Functions.KATHOLISCH;
140
exclude_subjects[3] = Functions.ETHIK;
142
exclude_subjects[2] = Functions.KATHOLISCH;
143
exclude_subjects[3] = Functions.EVANGELISCH;
145
context = (Context) act;
147
myDB = context.openOrCreateDatabase(Functions.DB_NAME, Context.MODE_PRIVATE, null);
148
timetableadap_monday = new TimetableAdapter(context, timetable_monday);
149
timetableadap_tuesday = new TimetableAdapter(context, timetable_tuesday);
150
timetableadap_wednesday = new TimetableAdapter(context, timetable_wednesday);
151
timetableadap_thursday = new TimetableAdapter(context, timetable_thursday);
152
timetableadap_friday = new TimetableAdapter(context, timetable_friday);
154
SQLiteStatement num_rows = myDB.compileStatement("SELECT COUNT(*) FROM " + Functions.DB_TIME_TABLE);
155
long count = num_rows.simpleQueryForLong();
157
act.updateTimeTable();
162
public int getCount() {
166
public Object instantiateItem(View pager, int position) {
167
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
168
LinearLayout lay = (LinearLayout) inflater.inflate(R.layout.list, null);
169
ListView lv = (ListView) lay.findViewById(android.R.id.list);
172
lv.setAdapter(timetableadap_monday);
175
lv.setAdapter(timetableadap_tuesday);
178
lv.setAdapter(timetableadap_wednesday);
181
lv.setAdapter(timetableadap_thursday);
184
lv.setAdapter(timetableadap_friday);
187
lv.setAdapter(timetableadap_monday);
190
lv.setOnItemClickListener(new OnItemClickListener() {
192
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
193
Cursor c = myDB.query(Functions.DB_TIME_TABLE, new String[] {Functions.DB_RAW_FACH, Functions.DB_HOUR, Functions.DB_LEHRER},
194
Functions.DB_ROWID + "=?", new String[] {new Long(id).toString()}, null, null, null);
196
String hour = Integer.valueOf(c.getInt(c.getColumnIndex(Functions.DB_HOUR)) + 1).toString();
197
Cursor d = myDB.query(Functions.DB_VPLAN_TABLE, new String[] {Functions.DB_KLASSE, Functions.DB_STUNDE, Functions.DB_VERTRETUNGSTEXT,
198
Functions.DB_LEHRER, Functions.DB_FACH, Functions.DB_ART}, Functions.DB_RAW_FACH + "=? AND " + Functions.DB_STUNDE + "=? AND "
199
+ Functions.DB_LEHRER + "=?",
200
new String[] {c.getString(c.getColumnIndex(Functions.DB_RAW_FACH)), hour, c.getString(c.getColumnIndex(Functions.DB_LEHRER))}, null, null, null);
202
if(d.getCount() > 0) {
203
String vtext = (!(d.getString(d.getColumnIndex(Functions.DB_VERTRETUNGSTEXT))).equals("null")) ? d.getString(
204
d.getColumnIndex(Functions.DB_VERTRETUNGSTEXT)) + "\n" : "";
205
AlertDialog.Builder builder = new AlertDialog.Builder(context);
206
builder.setTitle(d.getString(d.getColumnIndex(Functions.DB_KLASSE)))
207
.setMessage(d.getString(d.getColumnIndex(Functions.DB_FACH)) + " / " + d.getString(d.getColumnIndex(Functions.DB_STUNDE)) + ". "
208
+ context.getString(R.string.hour)+ "\n" + vtext + d.getString(d.getColumnIndex(Functions.DB_ART)) + " " +context.getString(R.string.at)
209
+ " " + d.getString(d.getColumnIndex(Functions.DB_LEHRER)))
211
.setNeutralButton(context.getString(R.string.ok), new DialogInterface.OnClickListener() {
212
public void onClick(DialogInterface dialog, int id) {
216
AlertDialog alert = builder.create();
221
((ViewPager)pager).addView(lay, 0);
224
public void updateCursor() {
225
exclude_subjects[0] = "0";
226
timetable_monday = myDB.query(Functions.DB_TIME_TABLE, new String[] {Functions.DB_ROWID, Functions.DB_LEHRER, Functions.DB_FACH, Functions.DB_RAUM, Functions.DB_LENGTH,
227
Functions.DB_HOUR, Functions.DB_DAY, Functions.DB_RAW_FACH}, Functions.DB_DAY + "=? AND " + Functions.DB_RAW_FACH + " != ? AND " + Functions.DB_RAW_FACH
228
+ " != ? AND " + Functions.DB_RAW_FACH + " != ?", exclude_subjects, null, null, null);
229
timetableadap_monday.changeCursor(timetable_monday);
232
exclude_subjects[0] = "1";
233
timetable_tuesday = myDB.query(Functions.DB_TIME_TABLE, new String[] {Functions.DB_ROWID, Functions.DB_LEHRER, Functions.DB_FACH, Functions.DB_RAUM, Functions.DB_LENGTH,
234
Functions.DB_HOUR, Functions.DB_DAY, Functions.DB_RAW_FACH}, Functions.DB_DAY + "=? AND " + Functions.DB_RAW_FACH + " != ? AND " + Functions.DB_RAW_FACH
235
+ " != ? AND " + Functions.DB_RAW_FACH + " != ?", exclude_subjects, null, null, null);
236
timetableadap_tuesday.changeCursor(timetable_tuesday);
238
exclude_subjects[0] = "2";
239
timetable_wednesday = myDB.query(Functions.DB_TIME_TABLE, new String[] {Functions.DB_ROWID, Functions.DB_LEHRER, Functions.DB_FACH, Functions.DB_RAUM, Functions.DB_LENGTH,
240
Functions.DB_HOUR, Functions.DB_DAY, Functions.DB_RAW_FACH}, Functions.DB_DAY + "=? AND " + Functions.DB_RAW_FACH + " != ? AND " + Functions.DB_RAW_FACH
241
+ " != ? AND " + Functions.DB_RAW_FACH + " != ?", exclude_subjects, null, null, null);
242
timetableadap_wednesday.changeCursor(timetable_wednesday);
244
exclude_subjects[0] = "3";
245
timetable_thursday = myDB.query(Functions.DB_TIME_TABLE, new String[] {Functions.DB_ROWID, Functions.DB_LEHRER, Functions.DB_FACH, Functions.DB_RAUM, Functions.DB_LENGTH,
246
Functions.DB_HOUR, Functions.DB_DAY, Functions.DB_RAW_FACH}, Functions.DB_DAY + "=? AND " + Functions.DB_RAW_FACH + " != ? AND " + Functions.DB_RAW_FACH
247
+ " != ? AND " + Functions.DB_RAW_FACH + " != ?", exclude_subjects, null, null, null);
248
timetableadap_thursday.changeCursor(timetable_thursday);
250
exclude_subjects[0] = "4";
251
timetable_friday = myDB.query(Functions.DB_TIME_TABLE, new String[] {Functions.DB_ROWID, Functions.DB_LEHRER, Functions.DB_FACH, Functions.DB_RAUM, Functions.DB_LENGTH,
252
Functions.DB_HOUR, Functions.DB_DAY, Functions.DB_RAW_FACH}, Functions.DB_DAY + "=? AND " + Functions.DB_RAW_FACH + " != ? AND " + Functions.DB_RAW_FACH
253
+ " != ? AND " + Functions.DB_RAW_FACH + " != ?", exclude_subjects, null, null, null);
254
timetableadap_friday.changeCursor(timetable_friday);
256
public void closeCursorsDB() {
257
timetable_monday.close();
258
timetable_tuesday.close();
259
timetable_wednesday.close();
260
timetable_thursday.close();
261
timetable_friday.close();
265
public void destroyItem( View pager, int position, Object view ) {
266
((ViewPager)pager).removeView((View) view);
270
public boolean isViewFromObject( View view, Object object ) {
271
return view.equals( object );
275
public void finishUpdate( View view ) {}
278
public void restoreState( Parcelable p, ClassLoader c ) {}
281
public Parcelable saveState() {
285
public void startUpdate( View view ) {}
288
public static class TimeTableUpdater {
289
private Context context;
290
TimeTableUpdater(Context c) {
293
public String[] update() {
294
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
297
add = "&" + URLEncoder.encode("date", "UTF-8") + "=" + URLEncoder.encode(prefs.getString("timetable_date", ""), "UTF-8")
298
+ "&" + URLEncoder.encode("time", "UTF-8") + "=" + URLEncoder.encode(prefs.getString("timetable_time", ""), "UTF-8")
299
+ "&" + URLEncoder.encode("class", "UTF-8") + "=" + URLEncoder.encode(prefs.getString(Functions.FULL_CLASS, ""), "UTF-8");
300
} catch(UnsupportedEncodingException e) { Log.d("encoding", e.getMessage()); }
301
String get = Functions.getData(Functions.TIMETABLE_URL, context, true, add);
302
if(!get.equals("networkerror") && !get.equals("loginerror") && !get.equals("noact")) {
304
JSONArray jArray = new JSONArray(get);
305
JSONObject jObject_ = jArray.getJSONObject(0);
306
String date = jObject_.getString("date");
307
String time = jObject_.getString("time");
308
String one = jObject_.getString("one");
309
String two = jObject_.getString("two");
310
String klasse = jObject_.getString("klasse");
311
SharedPreferences.Editor edit = prefs.edit();
312
edit.putString("timetable_date", date);
313
edit.putString("timetable_time", time);
314
edit.putString("timetable_one", one);
315
edit.putString("timetable_two", two);
316
edit.putString("timetable_klasse", klasse);
319
SQLiteDatabase myDB = context.openOrCreateDatabase(Functions.DB_NAME, Context.MODE_PRIVATE, null);
320
myDB.delete(Functions.DB_TIME_TABLE, null, null); //clear vertretungen
321
while(i < jArray.length()) {
322
JSONObject jObject = jArray.getJSONObject(i);
323
ContentValues values = new ContentValues();
324
values.put(Functions.DB_LEHRER, jObject.getString("teacher"));
325
values.put(Functions.DB_FACH, jObject.getString("subject"));
326
values.put(Functions.DB_RAW_FACH, jObject.getString("rawsubject"));
327
values.put(Functions.DB_RAUM, jObject.getString("room"));
328
values.put(Functions.DB_LENGTH, jObject.getInt ("length"));
329
values.put(Functions.DB_DAY, jObject.getInt ("day"));
330
values.put(Functions.DB_HOUR, jObject.getInt ("hour"));
331
myDB.insert(Functions.DB_TIME_TABLE, null, values);
335
} catch(JSONException e) {
336
Log.d("json", e.getMessage());
337
return new String[] {"json", context.getString(R.string.jsonerror)};
340
else if(get.equals("networkerror")){
341
return new String[] {"networkerror", context.getString(R.string.networkerror)};
343
else if(get.equals("loginerror"))
344
return new String[] {"loginerror", context.getString(R.string.loginerror)};
345
return new String[] {"success", ""};
349
public class TimeTableUpdateTask extends AsyncTask<Void, Void, String[]> {
350
protected void onPreExecute() {
351
super.onPreExecute();
352
loading = ProgressDialog.show(TimeTable.this, "", getString(R.string.loading_timetable));
355
protected String[] doInBackground(Void... params) {
356
TimeTableUpdater upd = new TimeTableUpdater(TimeTable.this);
359
protected void onPostExecute(String[] res) {
361
if(!res[0].equals("success"))
362
Toast.makeText(TimeTable.this, res[1], Toast.LENGTH_LONG).show();
363
if(res[0].equals("loginerror")) {
365
if(Functions.getSDK() >= 11)
366
intent = new Intent(TimeTable.this, SettingsAdvanced.class);
368
intent = new Intent(TimeTable.this, Settings.class);
369
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
370
TimeTable.this.startActivity(intent);
372
viewpageradap.updateCursor();
375
private ProgressDialog loading;
10
376
private TimeTableViewPagerAdapter viewpageradap;
11
377
private ViewPager pager;