From 466870ff5091aa407029fb321ff6ec495f7acd5b Mon Sep 17 00:00:00 2001 From: Tal Hacohen Date: Tue, 28 Mar 2017 17:09:17 +0300 Subject: [PATCH] Import - Add basic import activity --- app/src/main/AndroidManifest.xml | 1 + .../syncadapter/resource/CalendarAccount.java | 75 +++++----- .../ui/ViewCollectionActivity.java | 5 +- .../ui/importlocal/ImportActivity.java | 128 ++++++++++++++++++ app/src/main/res/layout/activity_import.xml | 20 +++ app/src/main/res/values/strings.xml | 5 + 6 files changed, 196 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportActivity.java create mode 100644 app/src/main/res/layout/activity_import.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ebcc45bb..b0600fb8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -184,6 +184,7 @@ android:parentActivityName=".ui.AccountsActivity"> + diff --git a/app/src/main/java/com/etesync/syncadapter/resource/CalendarAccount.java b/app/src/main/java/com/etesync/syncadapter/resource/CalendarAccount.java index 23ca9ec9..5464d5e2 100644 --- a/app/src/main/java/com/etesync/syncadapter/resource/CalendarAccount.java +++ b/app/src/main/java/com/etesync/syncadapter/resource/CalendarAccount.java @@ -1,20 +1,27 @@ package com.etesync.syncadapter.resource; +import android.accounts.Account; import android.content.ContentProviderClient; import android.content.ContentResolver; +import android.content.ContentValues; import android.database.Cursor; +import android.database.DatabaseUtils; import android.net.Uri; +import android.provider.CalendarContract; import android.provider.CalendarContract.Calendars; import android.provider.CalendarContract.Events; import android.util.Log; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import at.bitfire.ical4android.AndroidCalendar; - -import static android.R.attr.id; -import static org.spongycastle.asn1.x500.style.RFC4519Style.c; +import at.bitfire.ical4android.AndroidEvent; +import at.bitfire.ical4android.AndroidEventFactory; +import at.bitfire.ical4android.CalendarStorageException; +import at.bitfire.ical4android.Event; +import lombok.Cleanup; /** * Created by tal on 27/03/17. @@ -24,7 +31,7 @@ public class CalendarAccount { private static final String TAG = "CalendarAccount"; public String accountName; - public List calendars = new ArrayList<>(); + public List calendars = new ArrayList<>(); private static final String[] CAL_COLS = new String[] { Calendars._ID, Calendars.DELETED, Calendars.NAME, Calendars.CALENDAR_DISPLAY_NAME, @@ -58,6 +65,7 @@ public class CalendarAccount { List calendarAccounts = new ArrayList<>(cur.getCount()); CalendarAccount calendarAccount = null; + ContentProviderClient contentProviderClient = resolver.acquireContentProviderClient(CalendarContract.CONTENT_URI); while (cur.moveToNext()) { if (getLong(cur, Calendars.DELETED) != 0) continue; @@ -68,24 +76,26 @@ public class CalendarAccount { calendarAccounts.add(calendarAccount); } - CalendarAccount.Calendar calendar = new Calendar(); - calendar.id = getLong(cur, Calendars._ID); - if (calendar.id == -1) { + long id = getLong(cur, Calendars._ID); + if (id == -1) { continue; } - calendar.name = getString(cur, Calendars.NAME); - calendar.displayName = getString(cur, Calendars.CALENDAR_DISPLAY_NAME); - calendar.accountType = getString(cur, Calendars.ACCOUNT_TYPE); - calendar.owner = getString(cur, Calendars.OWNER_ACCOUNT); - calendar.isActive = getLong(cur, Calendars.VISIBLE) == 1; - calendar.timezone = getString(cur, Calendars.CALENDAR_TIME_ZONE); - - final String[] args = new String[] { String.valueOf(calendar.id) }; + + final String[] args = new String[] { String.valueOf(id) }; Cursor eventsCur = resolver.query(Events.CONTENT_URI, CAL_ID_COLS, CAL_ID_WHERE, args, null); - calendar.numEntries = eventsCur.getCount(); + Account account = new Account(accountName, getString(cur, Calendars.ACCOUNT_TYPE)); + + try { + LocalCalendar localCalendar = LocalCalendar.findByName(account, contentProviderClient, + LocalCalendar.Factory.INSTANCE, getString(cur, Calendars.NAME)); + if (localCalendar != null) calendarAccount.calendars.add(localCalendar); + } catch (Exception ex) { + ex.printStackTrace(); + } + eventsCur.close(); - calendarAccount.calendars.add(calendar); } + contentProviderClient.close(); cur.close(); return calendarAccounts; } @@ -117,27 +127,22 @@ public class CalendarAccount { return accountName + " calendars:" + calendars.size(); } - private boolean differ(final String lhs, final String rhs) { - if (lhs == null) - return rhs != null; - return rhs == null || !lhs.equals(rhs); - } - - public static class Calendar { - public long id; - public String name; - public String displayName; - public String owner; - public String accountType; - public boolean isActive; - public String timezone; - public int numEntries; + static class Factory implements AndroidEventFactory { + static final LocalEvent.Factory INSTANCE = new LocalEvent.Factory(); @Override - public String toString() { - return displayName + " ( " + id + " )"; + public AndroidEvent newInstance(AndroidCalendar calendar, long id, ContentValues baseInfo) { + return new LocalEvent(calendar, id, baseInfo); } - } + @Override + public AndroidEvent newInstance(AndroidCalendar calendar, Event event) { + return new LocalEvent(calendar, event, null, null); + } + @Override + public AndroidEvent[] newArray(int size) { + return new LocalEvent[size]; + } + } } diff --git a/app/src/main/java/com/etesync/syncadapter/ui/ViewCollectionActivity.java b/app/src/main/java/com/etesync/syncadapter/ui/ViewCollectionActivity.java index 77e952ed..bd7621b5 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/ViewCollectionActivity.java +++ b/app/src/main/java/com/etesync/syncadapter/ui/ViewCollectionActivity.java @@ -27,6 +27,7 @@ import com.etesync.syncadapter.model.EntryEntity; import com.etesync.syncadapter.model.JournalEntity; import com.etesync.syncadapter.resource.LocalAddressBook; import com.etesync.syncadapter.resource.LocalCalendar; +import com.etesync.syncadapter.ui.importlocal.ImportActivity; import com.etesync.syncadapter.ui.journalviewer.ListEntriesFragment; import java.io.FileNotFoundException; @@ -167,8 +168,6 @@ public class ViewCollectionActivity extends AppCompatActivity implements Refresh } public void onImport(MenuItem item) { - getSupportFragmentManager().beginTransaction() - .add(ImportFragment.newInstance(account, info), null) - .commit(); + startActivity(ImportActivity.newIntent(ViewCollectionActivity.this, account, info)); } } diff --git a/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportActivity.java b/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportActivity.java new file mode 100644 index 00000000..079ba8ef --- /dev/null +++ b/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportActivity.java @@ -0,0 +1,128 @@ +package com.etesync.syncadapter.ui.importlocal; + +import android.accounts.Account; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.MenuItem; +import android.view.View; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseExpandableListAdapter; +import android.widget.ExpandableListView; +import android.widget.TextView; + +import com.etesync.syncadapter.App; +import com.etesync.syncadapter.R; +import com.etesync.syncadapter.model.CollectionInfo; +import com.etesync.syncadapter.resource.CalendarAccount; +import com.etesync.syncadapter.resource.LocalCalendar; +import com.etesync.syncadapter.resource.LocalEvent; +import com.etesync.syncadapter.ui.ImportFragment; + +import java.util.List; + +import static com.etesync.syncadapter.resource.CalendarAccount.loadAll; + +public class ImportActivity extends AppCompatActivity { + public final static String EXTRA_ACCOUNT = "account", + EXTRA_COLLECTION_INFO = "collectionInfo"; + + private Account account; + protected CollectionInfo info; + + public static Intent newIntent(Context context, Account account, CollectionInfo info) { + Intent intent = new Intent(context, ImportActivity.class); + intent.putExtra(ImportActivity.EXTRA_ACCOUNT, account); + intent.putExtra(ImportActivity.EXTRA_COLLECTION_INFO, info); + return intent; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.activity_import); + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + account = getIntent().getExtras().getParcelable(EXTRA_ACCOUNT); + info = (CollectionInfo) getIntent().getExtras().getSerializable(EXTRA_COLLECTION_INFO); + + findViewById(R.id.import_button_account).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View aView) { + importAccount(); + } + }); + + findViewById(R.id.import_button_file).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View aView) { + importFile(); + } + }); + } + + private void importFile() { + getSupportFragmentManager().beginTransaction() + .add(ImportFragment.newInstance(account, info), null) + .commit(); + + } + + private void importAccount() { + final List calendarAccountList = CalendarAccount.loadAll(getContentResolver()); + + ExpandableListView listCalendar = (ExpandableListView) findViewById(R.id.calendars); + + final ExpandableListAdapter adapter = new ExpandableListAdapter(this, calendarAccountList); + listCalendar.setAdapter(adapter); + + listCalendar.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { + @Override + public boolean onChildClick(ExpandableListView aExpandableListView, View aView, int groupPosition, int childPosition, long aL) { + Toast.makeText(ImportActivity.this, + calendarAccountList.get(groupPosition).calendars.get(childPosition).toString(), + Toast.LENGTH_SHORT).show(); + //todo import + LocalCalendar localCalendar = (LocalCalendar) calendarAccountList.get(groupPosition).calendars.get(childPosition); + + return false; + } + }); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + if (!getSupportFragmentManager().popBackStackImmediate()) { + finish(); + } + return true; + } + return false; + } + + @Override + protected void onResume() { + super.onResume(); + + App app = (App) getApplicationContext(); + if (app.getCertManager() != null) + app.getCertManager().appInForeground = true; + } + + @Override + protected void onPause() { + super.onPause(); + + App app = (App) getApplicationContext(); + if (app.getCertManager() != null) + app.getCertManager().appInForeground = false; + } +} diff --git a/app/src/main/res/layout/activity_import.xml b/app/src/main/res/layout/activity_import.xml new file mode 100644 index 00000000..90847740 --- /dev/null +++ b/app/src/main/res/layout/activity_import.xml @@ -0,0 +1,20 @@ + + + +