From 504e3c01468daed3f07b4b4169ad38801e0a2722 Mon Sep 17 00:00:00 2001 From: stom79 Date: Sat, 17 Feb 2018 11:28:52 +0100 Subject: [PATCH] Adds activity & link service --- app/src/main/AndroidManifest.xml | 5 + .../mastodon/activities/BaseMainActivity.java | 5 + .../activities/OwnerStatusActivity.java | 268 ++++++++++++++++++ .../asynctasks/RetrieveFeedsAsyncTask.java | 17 +- .../mastodon/sqlite/StatusCacheDAO.java | 19 ++ app/src/main/res/drawable-hdpi/ic_archive.png | Bin 0 -> 251 bytes .../main/res/drawable-hdpi/ic_date_range.png | Bin 0 -> 223 bytes .../main/res/drawable-hdpi/ic_filter_list.png | Bin 0 -> 113 bytes app/src/main/res/drawable-hdpi/ic_sync.png | Bin 0 -> 427 bytes app/src/main/res/drawable-ldpi/ic_archive.png | Bin 0 -> 287 bytes .../main/res/drawable-ldpi/ic_date_range.png | Bin 0 -> 335 bytes .../main/res/drawable-ldpi/ic_filter_list.png | Bin 0 -> 214 bytes app/src/main/res/drawable-ldpi/ic_sync.png | Bin 0 -> 419 bytes app/src/main/res/drawable-mdpi/ic_archive.png | Bin 0 -> 190 bytes .../main/res/drawable-mdpi/ic_date_range.png | Bin 0 -> 164 bytes .../main/res/drawable-mdpi/ic_filter_list.png | Bin 0 -> 90 bytes app/src/main/res/drawable-mdpi/ic_sync.png | Bin 0 -> 295 bytes .../main/res/drawable-xhdpi/ic_archive.png | Bin 0 -> 280 bytes .../main/res/drawable-xhdpi/ic_date_range.png | Bin 0 -> 188 bytes .../res/drawable-xhdpi/ic_filter_list.png | Bin 0 -> 105 bytes app/src/main/res/drawable-xhdpi/ic_sync.png | Bin 0 -> 543 bytes .../main/res/drawable-xxhdpi/ic_archive.png | Bin 0 -> 391 bytes .../res/drawable-xxhdpi/ic_date_range.png | Bin 0 -> 275 bytes .../res/drawable-xxhdpi/ic_filter_list.png | Bin 0 -> 131 bytes app/src/main/res/drawable-xxhdpi/ic_sync.png | Bin 0 -> 807 bytes .../main/res/drawable-xxxhdpi/ic_archive.png | Bin 0 -> 446 bytes .../res/drawable-xxxhdpi/ic_date_range.png | Bin 0 -> 261 bytes .../res/drawable-xxxhdpi/ic_filter_list.png | Bin 0 -> 161 bytes app/src/main/res/drawable-xxxhdpi/ic_sync.png | Bin 0 -> 1055 bytes .../main/res/layout/activity_ower_status.xml | 100 +++++++ .../res/layout/owner_status_action_bar.xml | 61 ++++ .../main/res/menu/activity_main_drawer.xml | 4 + app/src/main/res/menu/option_owner_cache.xml | 14 + app/src/main/res/values/strings.xml | 6 + 34 files changed, 498 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/fr/gouv/etalab/mastodon/activities/OwnerStatusActivity.java create mode 100644 app/src/main/res/drawable-hdpi/ic_archive.png create mode 100644 app/src/main/res/drawable-hdpi/ic_date_range.png create mode 100644 app/src/main/res/drawable-hdpi/ic_filter_list.png create mode 100644 app/src/main/res/drawable-hdpi/ic_sync.png create mode 100644 app/src/main/res/drawable-ldpi/ic_archive.png create mode 100644 app/src/main/res/drawable-ldpi/ic_date_range.png create mode 100644 app/src/main/res/drawable-ldpi/ic_filter_list.png create mode 100644 app/src/main/res/drawable-ldpi/ic_sync.png create mode 100644 app/src/main/res/drawable-mdpi/ic_archive.png create mode 100644 app/src/main/res/drawable-mdpi/ic_date_range.png create mode 100644 app/src/main/res/drawable-mdpi/ic_filter_list.png create mode 100644 app/src/main/res/drawable-mdpi/ic_sync.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_archive.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_date_range.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_filter_list.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_sync.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_archive.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_date_range.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_filter_list.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_sync.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_archive.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_date_range.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_filter_list.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_sync.png create mode 100644 app/src/main/res/layout/activity_ower_status.xml create mode 100644 app/src/main/res/layout/owner_status_action_bar.xml create mode 100644 app/src/main/res/menu/option_owner_cache.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ed7dec05f..90a80a352 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -158,6 +158,11 @@ android:configChanges="orientation|screenSize" android:label="@string/app_name" /> + . */ +package fr.gouv.etalab.mastodon.activities; + + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.sqlite.SQLiteDatabase; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.app.ActionBar; +import android.support.v7.widget.DividerItemDecoration; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.transition.Transition; + +import java.util.ArrayList; +import java.util.List; +import fr.gouv.etalab.mastodon.R; +import fr.gouv.etalab.mastodon.asynctasks.RetrieveFeedsAsyncTask; +import fr.gouv.etalab.mastodon.client.APIResponse; +import fr.gouv.etalab.mastodon.client.Entities.Account; +import fr.gouv.etalab.mastodon.client.Entities.Status; +import fr.gouv.etalab.mastodon.drawers.StatusListAdapter; +import fr.gouv.etalab.mastodon.helper.Helper; +import fr.gouv.etalab.mastodon.interfaces.OnRetrieveFeedsInterface; +import fr.gouv.etalab.mastodon.services.BackupStatusInDataBaseService; +import fr.gouv.etalab.mastodon.services.BackupStatusService; +import fr.gouv.etalab.mastodon.sqlite.AccountDAO; +import fr.gouv.etalab.mastodon.sqlite.Sqlite; + + +/** + * Created by Thomas on 17/02/2018. + * Show owner's toots + */ + +public class OwnerStatusActivity extends BaseActivity implements OnRetrieveFeedsInterface { + + + private TextView toolbarTitle; + private RecyclerView lv_status; + private boolean isRefreshed; + private ImageView pp_actionBar; + private StatusListAdapter statusListAdapter; + private SharedPreferences sharedpreferences; + private String max_id; + private List statuses; + private RelativeLayout mainLoader, nextElementLoader, textviewNoAction; + private boolean firstLoad; + private SwipeRefreshLayout swipeRefreshLayout; + private boolean swiped; + private boolean flag_loading; + LinearLayoutManager mLayoutManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + sharedpreferences = getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); + int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); + if( theme == Helper.THEME_LIGHT){ + setTheme(R.style.AppTheme_NoActionBar); + }else { + setTheme(R.style.AppThemeDark_NoActionBar); + } + setContentView(R.layout.activity_ower_status); + + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + ActionBar actionBar = getSupportActionBar(); + if( actionBar != null ){ + LayoutInflater inflater = (LayoutInflater) this.getSystemService(android.content.Context.LAYOUT_INFLATER_SERVICE); + assert inflater != null; + @SuppressLint("InflateParams") View view = inflater.inflate(R.layout.toot_action_bar, null); + actionBar.setCustomView(view, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); + + ImageView close_toot = actionBar.getCustomView().findViewById(R.id.close_toot); + close_toot.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + toolbarTitle = actionBar.getCustomView().findViewById(R.id.toolbar_title); + pp_actionBar = actionBar.getCustomView().findViewById(R.id.pp_actionBar); + toolbarTitle.setText(getString(R.string.owner_cached_toots)); + } + statuses = new ArrayList<>(); + lv_status = findViewById(R.id.lv_status); + mainLoader = findViewById(R.id.loader); + nextElementLoader = findViewById(R.id.loading_next_status); + textviewNoAction = findViewById(R.id.no_action); + mainLoader.setVisibility(View.VISIBLE); + nextElementLoader.setVisibility(View.GONE); + max_id = null; + flag_loading = true; + firstLoad = true; + swiped = false; + boolean isOnWifi = Helper.isOnWIFI(OwnerStatusActivity.this); + int positionSpinnerTrans = sharedpreferences.getInt(Helper.SET_TRANSLATOR, Helper.TRANS_YANDEX); + int behaviorWithAttachments = sharedpreferences.getInt(Helper.SET_ATTACHMENT_ACTION, Helper.ATTACHMENT_ALWAYS); + lv_status.addItemDecoration(new DividerItemDecoration(OwnerStatusActivity.this, DividerItemDecoration.VERTICAL)); + String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + statusListAdapter = new StatusListAdapter(OwnerStatusActivity.this, RetrieveFeedsAsyncTask.Type.CACHE_STATUS, userId, isOnWifi, behaviorWithAttachments, positionSpinnerTrans, this.statuses); + lv_status.setAdapter(statusListAdapter); + mLayoutManager = new LinearLayoutManager(OwnerStatusActivity.this); + lv_status.setLayoutManager(mLayoutManager); + + SQLiteDatabase db = Sqlite.getInstance(OwnerStatusActivity.this, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + Account account = new AccountDAO(OwnerStatusActivity.this,db).getAccountByID(userId); + String url = account.getAvatar(); + if( url.startsWith("/") ){ + url = Helper.getLiveInstanceWithProtocol(OwnerStatusActivity.this) + account.getAvatar(); + } + Glide.with(OwnerStatusActivity.this) + .asBitmap() + .load(url) + .into(new SimpleTarget() { + @Override + public void onResourceReady(@NonNull Bitmap resource, Transition transition) { + BitmapDrawable ppDrawable = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(25, OwnerStatusActivity.this), (int) Helper.convertDpToPixel(25, OwnerStatusActivity.this), true)); + if( pp_actionBar != null){ + pp_actionBar.setImageDrawable(ppDrawable); + } else if( getSupportActionBar() != null){ + + getSupportActionBar().setIcon(ppDrawable); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + } + }); + + isRefreshed = false; + + swipeRefreshLayout = findViewById(R.id.swipeContainer); + new RetrieveFeedsAsyncTask(OwnerStatusActivity.this, RetrieveFeedsAsyncTask.Type.CACHE_STATUS, null, OwnerStatusActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + swipeRefreshLayout.setColorSchemeResources(R.color.mastodonC4, + R.color.mastodonC2, + R.color.mastodonC3); + swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + isRefreshed = true; + new RetrieveFeedsAsyncTask(OwnerStatusActivity.this, RetrieveFeedsAsyncTask.Type.CACHE_STATUS, null, OwnerStatusActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + }); + + lv_status.addOnScrollListener(new RecyclerView.OnScrollListener() { + public void onScrolled(RecyclerView recyclerView, int dx, int dy) + { + int firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition(); + if(dy > 0){ + int visibleItemCount = mLayoutManager.getChildCount(); + int totalItemCount = mLayoutManager.getItemCount(); + if(firstVisibleItem + visibleItemCount == totalItemCount ) { + if(!flag_loading ) { + flag_loading = true; + new RetrieveFeedsAsyncTask(OwnerStatusActivity.this, RetrieveFeedsAsyncTask.Type.CACHE_STATUS, max_id, OwnerStatusActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + nextElementLoader.setVisibility(View.VISIBLE); + } + } else { + nextElementLoader.setVisibility(View.GONE); + } + } + } + }); + + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.option_owner_cache, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + return true; + case R.id.action_sync: + Intent backupIntent = new Intent(OwnerStatusActivity.this, BackupStatusInDataBaseService.class); + startService(backupIntent); + return true; + case R.id.action_filter: + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + @Override + public void onRetrieveFeeds(APIResponse apiResponse) { + mainLoader.setVisibility(View.GONE); + nextElementLoader.setVisibility(View.GONE); + //Discards 404 - error which can often happen due to toots which have been deleted + if( apiResponse.getError() != null && apiResponse.getError().getStatusCode() != 404 ){ + boolean show_error_messages = sharedpreferences.getBoolean(Helper.SET_SHOW_ERROR_MESSAGES, true); + if( show_error_messages ) + Toast.makeText(OwnerStatusActivity.this, apiResponse.getError().getError(),Toast.LENGTH_LONG).show(); + swipeRefreshLayout.setRefreshing(false); + swiped = false; + flag_loading = false; + return; + } + int previousPosition = this.statuses.size(); + List statuses = apiResponse.getStatuses(); + max_id = apiResponse.getMax_id(); + flag_loading = (max_id == null ); + if( !swiped && firstLoad && (statuses == null || statuses.size() == 0)) + textviewNoAction.setVisibility(View.VISIBLE); + else + textviewNoAction.setVisibility(View.GONE); + + if( swiped ){ + if (previousPosition > 0) { + for (int i = 0; i < previousPosition; i++) { + this.statuses.remove(0); + } + statusListAdapter.notifyItemRangeRemoved(0, previousPosition); + } + swiped = false; + } + if( statuses != null && statuses.size() > 0) { + this.statuses.addAll(statuses); + statusListAdapter.notifyItemRangeInserted(previousPosition, statuses.size()); + } + swipeRefreshLayout.setRefreshing(false); + firstLoad = false; + + } + + +} diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveFeedsAsyncTask.java b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveFeedsAsyncTask.java index 0674d2bab..12e1cbe93 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveFeedsAsyncTask.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveFeedsAsyncTask.java @@ -58,7 +58,8 @@ public class RetrieveFeedsAsyncTask extends AsyncTask { ONESTATUS, CONTEXT, TAG, - CACHE_BOOKMARKS + CACHE_BOOKMARKS, + CACHE_STATUS } public RetrieveFeedsAsyncTask(Context context, Type action, String max_id, OnRetrieveFeedsInterface onRetrieveFeedsInterface){ @@ -123,6 +124,20 @@ public class RetrieveFeedsAsyncTask extends AsyncTask { List statuses = new StatusCacheDAO(contextReference.get(), db).getAllStatus(StatusCacheDAO.BOOKMARK_CACHE); apiResponse.setStatuses(statuses); break; + case CACHE_STATUS: + apiResponse = new APIResponse(); + db = Sqlite.getInstance(contextReference.get(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + statuses = new StatusCacheDAO(contextReference.get(), db).getStatusFromID(StatusCacheDAO.ARCHIVE_CACHE, max_id); + if( statuses != null && statuses.size() > 0) { + apiResponse.setStatuses(statuses); + apiResponse.setMax_id(statuses.get(0).getId()); + apiResponse.setSince_id(statuses.get(statuses.size() - 1).getId()); + }else{ + apiResponse.setStatuses(null); + apiResponse.setMax_id(null); + apiResponse.setSince_id(null); + } + break; case HASHTAG: break; } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/sqlite/StatusCacheDAO.java b/app/src/main/java/fr/gouv/etalab/mastodon/sqlite/StatusCacheDAO.java index 165931734..fb9956433 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/sqlite/StatusCacheDAO.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/sqlite/StatusCacheDAO.java @@ -160,6 +160,25 @@ public class StatusCacheDAO { } } + /** + * Returns all cached Statuses in db depending of their cache type + * @return stored status List + */ + public List getStatusFromID(int cacheType, String max_id){ + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + String instance = Helper.getLiveInstance(context); + try { + Cursor c; + if( max_id != null) + c = db.query(Sqlite.TABLE_STATUSES_CACHE, null, Sqlite.COL_CACHED_ACTION + " = '" + cacheType+ "' AND " + Sqlite.COL_INSTANCE + " = '" + instance+ "' AND " + Sqlite.COL_USER_ID + " = '" + userId+ "' AND " + Sqlite.COL_STATUS_ID + " < '" + max_id+ "'", null, null, null, Sqlite.COL_CREATED_AT + " DESC", "80"); + else + c = db.query(Sqlite.TABLE_STATUSES_CACHE, null, Sqlite.COL_CACHED_ACTION + " = '" + cacheType+ "' AND " + Sqlite.COL_INSTANCE + " = '" + instance+ "' AND " + Sqlite.COL_USER_ID + " = '" + userId+ "'", null, null, null, Sqlite.COL_CREATED_AT + " DESC", "80"); + return cursorToListStatuses(c); + } catch (Exception e) { + return null; + } + } /** * Returns the last date of backup for a user depending of the type of cache diff --git a/app/src/main/res/drawable-hdpi/ic_archive.png b/app/src/main/res/drawable-hdpi/ic_archive.png new file mode 100644 index 0000000000000000000000000000000000000000..b82509f63b7005b288582c720413d4770e53aa86 GIT binary patch literal 251 zcmVfxL`3)R{}V7YQ7e_q zCQ{ohRBhfwYV$xZ6uf{YEx-$B!89RjBMH)18vxli&R7XzV}1CrB84xc}gPwK(E-%z_K7IzOc(;}}-WY+j|?c0xv=^IglC|GN*UisbEhUH|LAlobq# XrRqKxZ$~@^x|qS!)z4*}Q$iB}H0Wa$ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_filter_list.png b/app/src/main/res/drawable-hdpi/ic_filter_list.png new file mode 100644 index 0000000000000000000000000000000000000000..c7c783d47eaea69871be661e6a69fc4d37999936 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;g{O;SNX4z>1PRu~2?kC7dH6vpcU?M7E7CN7u;IRx=2lz0hEl*_o(Z~>v>qQ~g6iQ)xx1El$UeU239%)F*U ze6wQm<;Uy$^R+?ne}M>rd}K+4{1BiL1Aovj#vAm9@dQ;EV1)(d7`w`D2c@V-feDmP zM%(d?xP6U|(ZdL{4eZvpYXf8&HIzUX2%U3us%!U!t{e134-h&h`%Gu`>;ft33oxxc z;O_5h-9cpsJ+S0O9KVEh_jb@L3t|y;!@9%{`ecD@8-3Qj+d*py~!VN{^oe z>acEY2Q6686G2z3`>=!NEEqK`_S6mZk^Obhk0Eg!Ent^iJ?3#h1Lwsm8JU{tM Vq5+%dYtjG!002ovPDHLkV1n)7z)k=F literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-ldpi/ic_archive.png b/app/src/main/res/drawable-ldpi/ic_archive.png new file mode 100644 index 0000000000000000000000000000000000000000..3efa6168bbc67d71beaa1ae5fe1e0a01b677b956 GIT binary patch literal 287 zcmV+)0pR|LP)XQ?Tq#22O(|7%UAL*V?t+ei9_dt_6B$MiIF}wHAUbC9N+g>@OzGl?(eMN4lN<4qUi~ lM4L`3!KOO#@4w6czYlX5{wxA-1xNq@002ovPDHLkV1iVCdkX*n literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-ldpi/ic_date_range.png b/app/src/main/res/drawable-ldpi/ic_date_range.png new file mode 100644 index 0000000000000000000000000000000000000000..47a10edd7a0972567594320795f44f69492cc55e GIT binary patch literal 335 zcmV-V0kHmwP)B49yHRTdLfEO@MdJWxmudOvqRu90a>ClDQ*bVwU z^V0wlNxnS(_x=Y2aGcVS=lK@6HP5Ykzef-RZjvNHmSxvzn%;$BxEsfDSIT^gf1_M` zn-azz!99G!g2gd9HeJ9MJg|3A+`ffz2`T)*3cgFM%vV0teo-32k}E%=Pf$_wmk^ap z=L9cN6dj@=^FH*Yn$4f;i7F+S@XW{P6`a5bPBl~LDgRR%ruE<4Zl z(uGRC@3+B&7PzJ!uez4O*A6I|FE6m~DbY7a@V5U8% h_K$h6{SRKTy9Omovm_V-2TuS1002ovPDHLkV1g4GluG~r literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-ldpi/ic_filter_list.png b/app/src/main/res/drawable-ldpi/ic_filter_list.png new file mode 100644 index 0000000000000000000000000000000000000000..eb0bf288d82452339e21c5ea984f78457dc8041b GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rhext=bLAr-fh6D0mQxVW^)cI@;x z@rf5tE^*v>1gQV?CdO{v4c&clD$J-p!0phmxeEgc%y*oZWss( zF?#TO=x@4y;c(Y{hP30$#BJ9sYCIRmf8=)IgRcsv5{$mW%_lxeZOrWE*38*?!goQ8 zgZ>nzy+yn&jyaonn6r{tv&tBxf>;kJn0fTXgl|+zWe;nc$jK1?Gg^bfdobrT1R7|_i*;E)QAneBSx^Wwb_ zO41J#IP~1Fr}v!mo*M*PzPhf%pzoJu*;!E(b7Rb?59AccLseDZ_?ci>ycdK6$3X6_ zwJXd5E3sGRrZC5>huZ-D_kcr}Fut%KAh*~vzJTwnop-_n$@4tn9|tb9m;)0Ie&C;A zsm8!QnS0aCx>j**Uc1WYtEERIiJZDbPLx;=QNopY zHy)@UfUfWlyVN|EPE=wCOI3PFpb3{mfX8i-`CEk&n{?vDr|R5EloF>zDzP@jyGh-l zZl*9@&Px0Dt<*MZpMCpHS0AZi)wpV4HS)h-0m1Z?=t=4QF75KT{Q``}6_ll5!M6Ya N002ovPDHLkV1k*Q!Ic02 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_archive.png b/app/src/main/res/drawable-mdpi/ic_archive.png new file mode 100644 index 0000000000000000000000000000000000000000..13e88f27d702896e011791c5afe0ecbbd2b9106e GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mT0LDHLn>}1CoC}fk^jB^`+w$) zg75XK|MMttsQuIaTmRAi+kR%LGi+U23LzR0*qRQAVxh8Fe@+F1;r zr3*BFeYfX)l&Imu)Rkb!87b+)8TLBiRDxH*4$dV!3t7?y{x}CUEy^%HS8%H%V9Dot nVYe?$503qh;&5eA2<&2DkKEwnk>=V2bP$85tDnm{r-UW|=X6HP literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_date_range.png b/app/src/main/res/drawable-mdpi/ic_date_range.png new file mode 100644 index 0000000000000000000000000000000000000000..0937c5562f1410c17db38fbcfba0ec5a9cc1f660 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mvOQfKLn>}1Cn&J~DgSZ5;ZXjM z_YEsoJp5lT@~=L`m*>Cp|N4LZyfy#idjhsRx7XVsz3>HtpDX(W(OQNipC62&7a7;s z*)=SD@xSH2@C6SeQNh%^3c*_h(mT#OYdrcN&*H;6W5Wk~`HPvn422FKbhm2kx(KwE N!PC{xWt~$(696z^KrsLS literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_filter_list.png b/app/src/main/res/drawable-mdpi/ic_filter_list.png new file mode 100644 index 0000000000000000000000000000000000000000..6086611d6f91a802aa7b0af83c6c40a75c723d99 GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1MNb#UkcwN$2@&Hr5(PMPpn nt`GJ^>bP0l+XkKr}`Og literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_sync.png b/app/src/main/res/drawable-mdpi/ic_sync.png new file mode 100644 index 0000000000000000000000000000000000000000..a7add46d8953ce21149686cda5cbf051f6faa257 GIT binary patch literal 295 zcmV+?0oeYDP)k3ehuo4$8TU`f;DNQ&xQsWI)V=${09neN_BaHs9tpGd^?0bMY4!M*W;A?idRjwv tHP=ID2{_*xEK(W+%KlA{Wwiu;>^FK&b!@eA11$gm002ovPDHLkV1fZfdcObw literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_archive.png b/app/src/main/res/drawable-xhdpi/ic_archive.png new file mode 100644 index 0000000000000000000000000000000000000000..4edab214e9edbabac8974e77cdedffa016e83f0f GIT binary patch literal 280 zcmV+z0q6dSP)rB1Lm8N04J*hMM#$XsZZO6T(zs$6g9f-z!OnjZn+8X!Jkynh4)pLY+L%R&2UV9G zG=n~BOhagkl-PujO@eF>{SI>fvkpKN^43nvsY1A-Hp*oLTZ>UXBRV6FYBIvZZc-s5 z{%S78F^bRsrg%oxA}=b&D0{7nGXHJbeG*iJ&@u^{hmfH;rH#{PviW0gK})s5ENC?* eHnP9S4nt1}5XI%NV0B{v0000|k0wldT1B8K8v!{z=NX4z>1PRXv_7W4+tvz^u z<$wQw=l}lyovi;GR^@JxRQ~?|bbZjl>Hm#pus!{+&i*7>>WafOM_%O%3z!{dSyV9W zcjR?RU&2-;_2oX}n+o{EP`$OG`sc@-#-9uaTsa#K$^JKz*MA7q%i!ti=d#Wzp$PzT Cb|4)9 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_sync.png b/app/src/main/res/drawable-xhdpi/ic_sync.png new file mode 100644 index 0000000000000000000000000000000000000000..e47503e903df763b827abcec92dc881605b6c701 GIT binary patch literal 543 zcmV+)0^t3LP)Lr3YhV&6c`ZPiyYMmp{=%SxR@DS9oi+T*9OGatMzcHWF zrn@`u=?(sUY|Tg z^cBnqI3@7|me_!puBV(Ca81%Pk*Sp^>dFkbCF!vUa6(Z{GvJA&+af?pH=GghNz!Ez zV2z>%X24K;js&nmQ6FYNkEBTvV27f5WA9S`-1w{4$+%Wm~lmztOt< zMoXx@Hb5MB9a6-zGH{03)kxl%mBR_~S>TfArfFTOb)VT_pMAqFcf+aZP2}7M5QI43 z?`Z3|*NDcH1tSC@*ppr5DwEMwl@*%;uo1yi84qH#;3d^eDeXCIMA)ROP72|pu;|$| zt~zwM7{dIJt}>6lO~ClvkW((xRI4(G_7yq4jTYG=hXWQa({RATjTR0Ne2&ip5Pj{- h0m7dNa)9&40ADO1>Uf`e8gu{v002ovPDHLkV1k3_@}~d* literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_archive.png b/app/src/main/res/drawable-xxhdpi/ic_archive.png new file mode 100644 index 0000000000000000000000000000000000000000..64b56b9ae5122c50af8e6e4c10f46912e2dc5f14 GIT binary patch literal 391 zcmV;20eJq2P)7xV5C`ytXXsGD8&Fl1SOBSzNZnBT3iMU7w-e$`kUHl@+K#jfOFLvq|23A73h~Fq zcSwl(ZbPwuNo;emlO#rrlMh^Ciaa2vs%2tM^UobDQ6n^JEL0C<>>1p6qGFHw@^@U= zUWYS>_|om?6l{!2UHXliAZnX;x`zrQAJ)TK-`599Mt|+y1$E_X9#j!kM5jzL0L~)Si@vx%tr&~nq#IOwpt;*&=wO~A18?H&UevMSlLt@6U4{asKD9i;_OuL)VFaiim}d2oSR}T>O;;)F-y!}&QG!H*^Z-70>yL7(I}Bh zy&+Qn^cy4-$1*#1Espi=SVwJcCF2#TYcu%3I3;MF8q9oq>U+EiJ=KhIT9D#O4Q$TH lOpR4aJqI~bMl52^`~_cGK^0vqOYHyv002ovPDHLkV1mLWu9*M; literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_date_range.png b/app/src/main/res/drawable-xxhdpi/ic_date_range.png new file mode 100644 index 0000000000000000000000000000000000000000..a864955b9aedda72d32495ef0a4e317d21c63ac4 GIT binary patch literal 275 zcmV+u0qp*XP)Dbw!AcDSt4i46P9$h*(xHXG|Pa(dE_&60ocjZ^G?UtCPXNKnf+rq&I zmq0?INYbHzpuT0*UG{?9FoiN!-BpxezA+>?qCnf+a6u~@8002ovPDHLkV1inic)kDt literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_filter_list.png b/app/src/main/res/drawable-xxhdpi/ic_filter_list.png new file mode 100644 index 0000000000000000000000000000000000000000..02b0e8679edb80f8dd45589e30554102a1904a15 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!UY;(FAr-gYUfU?hz`(*__*?(1 zfJk3T%X&K|pe#c|h@9#K2PRIH3+)aJ3|UEAxHoK literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_sync.png b/app/src/main/res/drawable-xxhdpi/ic_sync.png new file mode 100644 index 0000000000000000000000000000000000000000..cd065c9b26604ac0260aab3e75ac1cb94ccd9e14 GIT binary patch literal 807 zcmV+?1K9kDP)l)c*W9o46D7 zB?m42O`%7MIzPki(c7e;E>(@7O^QCh#cEtJ8R#`hQbUK;!#~W{rP*Yl9g^aMb?dc8 zvTY{;mDs$GS%aREY?tUU2fZW-z6vy_xA2{0d~ObUN5ZQj{qhRQxM&XgOv0aufapD6 zHwS$q;g3W>qa@?LIp~;#-xmQrAQ|iCpi2^dTLjceGM<}*E?74x0qS7Akum6ygm;U8 zx=6-f=Aar09}xjP)>+xwhi{PZvIwY5GJY}#RY~}=2j+H-@Y@ci4W`PX;RfYhfE>)3S-}SB>!18g$RD$=BNo zL!0y_`L3g+HZ9lVEV6HeCh2GNx*s?93+x`%RkI!i(jmRD+qo977a)yCf?)f9q4-M% zS!dLkxS2?hB}wO^sg`#=TOm^i8Is;*e#jfKHMOy62eKgPUg(Fs5re8uE2?!LRn2K< z%ehLrAP)+o) odC+v0@&a#WMG!#*5j5-i0w&(v8jYXGTmS$707*qoM6N<$f0%uPhyOf50V{jg zbp8acWJNIbiF4!u)Vq2qL-hyjvyLL9_us6PIU|?jL z!l%)x?Oe5hUBRKyVZNHwD{BRZhPv%$&@T=WwmN3Q$Rgmt042aGK}3Y; WVZQetnS(j*f_R>;elF{r5}E+*Fd_{A literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_sync.png b/app/src/main/res/drawable-xxxhdpi/ic_sync.png new file mode 100644 index 0000000000000000000000000000000000000000..82baf0755b089db8cbd5b5231f28f976ff4f9a00 GIT binary patch literal 1055 zcmV+)1mOFLP)zp%_NaQ6id0`ZINbojZ z^&a3dz=it`16;cAEWls)9R;{@-${V$?mGyO>ArIS)P2VQME9Knkh$*=fZTm&0D{~H z&T)cWtYHbmXh&5%0fOBZWebzIk7S$xblktf7(i(}0K&L`DMuJVnacnda)556T%1DJ z;xbz>Q1Dn!s#N6;#7(-;Z8zRj}0k8hdU`{u|H*Gn`*5)Nqq{l5`-1?m7wm_Q>`+g zPFY2U&}AE-^!Mf$2I2obQ~n7+C9N8(s=71uN3lMFO3xB(3J60s0dC>@KgGHTYCRi- zP4&>XY7O8;hH5v{x4z5dO`m zvRmOw!pfXVya?fHH;Y-H&Fo{| zPYqj9g9@R}V;v!E^=88Ofs+>{z(wo8aU2j#KCZ<|^a!Sfz^*LsuX2K5K8R%)!lBCm zmroJ;C9fSEm_nI}XEVmJ?$RQbw@S2O5DQqvwjcbR#djN3ZLvJaOaUSeB}@S#4(3b& zA`Yib0U}Rm%m5-!Da`;PPwLG8JRbeI0`R!>=LW#z)1M0fk5fNCfXAz!A0Uwj$OFW> Z{Q|$m*#j!>l3f4*002ovPDHLkV1hDe)rtTB literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_ower_status.xml b/app/src/main/res/layout/activity_ower_status.xml new file mode 100644 index 000000000..c8cb5b187 --- /dev/null +++ b/app/src/main/res/layout/activity_ower_status.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/owner_status_action_bar.xml b/app/src/main/res/layout/owner_status_action_bar.xml new file mode 100644 index 000000000..30c6fd789 --- /dev/null +++ b/app/src/main/res/layout/owner_status_action_bar.xml @@ -0,0 +1,61 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index 42d4494a2..d2f8f6112 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -23,6 +23,10 @@ android:id="@+id/nav_drafts" android:icon="@drawable/ic_save_white" android:title="@string/drafts" /> + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1ce0b64c9..e42a22177 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -396,6 +396,12 @@ Mb Cache was cleared! %1$s were released + + + Synchronize + Filter + Your toots + No toots were found in database. Please, use the synchronize button from the menu to retrieve them. Recorded data