/** * Odoo, Open Source Management Solution * Copyright (C) 2012-today Odoo SA (<http:www.odoo.com>) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http:www.gnu.org/licenses/> * * Created on 30/12/14 3:29 PM */ package com.odoo.core.support.addons.fragment; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SyncStatusObserver; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.view.MenuItemCompat; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.SearchView; import android.text.TextUtils; import android.view.Menu; import android.view.View; import android.widget.ListView; import com.odoo.App; import com.odoo.OdooActivity; import com.odoo.R; import com.odoo.core.orm.OModel; import com.odoo.core.service.receivers.ISyncFinishReceiver; import com.odoo.core.support.OUser; import com.odoo.core.utils.OResource; import odoo.controls.fab.FloatingActionButton; public abstract class BaseFragment extends Fragment implements IBaseFragment { private Context mContext; private OModel syncStatusObserverModel = null; private String drawerRefreshTag = null; private Object mSyncObserverHandle; private ISyncStatusObserverListener mSyncStatusObserverListener = null; private SwipeRefreshLayout mSwipeRefresh = null; private IOnSearchViewChangeListener mOnSearchViewChangeListener; private SearchView mSearchView; private FloatingActionButton mFab = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = getActivity(); parent().setHasActionBarSpinner(false); } public void setTitle(String title) { getActivity().setTitle(title); } public OModel db() { Class<?> model = database(); if (model != null) { return new OModel(mContext, null, user()).createInstance(model); } return null; } public OUser user() { if (mContext != null) return OUser.current(mContext); return null; } public OdooActivity parent() { return (OdooActivity) mContext; } public String _s(int res_id) { return OResource.string(mContext, res_id); } public int _c(int res_id) { return OResource.color(mContext, res_id); } public int _dim(int res_id) { return OResource.dimen(mContext, res_id); } // Sync Observer public void setHasSyncStatusObserver(String drawerRefreshTag, ISyncStatusObserverListener syncStatusObserver, OModel model) { this.drawerRefreshTag = drawerRefreshTag; mSyncStatusObserverListener = syncStatusObserver; syncStatusObserverModel = model; } private SyncStatusObserver mSyncStatusObserver = new SyncStatusObserver() { /** Callback invoked with the sync adapter status changes. */ @Override public void onStatusChanged(int which) { boolean refreshing = false; switch (which) { case ContentResolver.SYNC_OBSERVER_TYPE_PENDING: case ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE: refreshing = true; } final boolean finalRefreshing = refreshing; getActivity().runOnUiThread(new Runnable() { @Override public void run() { mSyncStatusObserverListener.onStatusChange(finalRefreshing); } }); } }; // Swipe refresh view public void setHasSwipeRefreshView(View parent, int resource_id, SwipeRefreshLayout.OnRefreshListener listener) { mSwipeRefresh = (SwipeRefreshLayout) parent.findViewById(resource_id); mSwipeRefresh.setOnRefreshListener(listener); mSwipeRefresh.setColorSchemeResources(R.color.android_blue, R.color.android_green, R.color.android_orange_dark, R.color.android_red); } public void setSwipeRefreshing(boolean refreshing) { if (mSwipeRefresh != null) mSwipeRefresh.setRefreshing(refreshing); } public void hideRefreshingProgress() { if (mSwipeRefresh != null) { new Handler().postDelayed(new Runnable() { @Override public void run() { mSwipeRefresh.setRefreshing(false); } }, 1000); } } public boolean inNetwork() { App app = (App) mContext.getApplicationContext(); return app.inNetwork(); } @Override public void onPause() { super.onPause(); if (mSyncObserverHandle != null) { ContentResolver.removeStatusChangeListener(mSyncObserverHandle); mSyncObserverHandle = null; } try { parent().unregisterReceiver(syncFinishReceiver); } catch (Exception e) { // Skipping issue related to unregister receiver } } @Override public void onDestroy() { super.onDestroy(); onNavSpinnerDestroy(); } protected void onNavSpinnerDestroy() { if (parent().getActionBarSpinner() != null) { parent().getActionBarSpinner().setAdapter(null); parent().setHasActionBarSpinner(false); } } @Override public void onResume() { super.onResume(); if (OUser.current(getActivity()) == null) return; if (mSyncStatusObserverListener != null) { mSyncStatusObserver.onStatusChanged(0); int mask = ContentResolver.SYNC_OBSERVER_TYPE_PENDING | ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE; mSyncObserverHandle = ContentResolver.addStatusChangeListener(mask, mSyncStatusObserver); } parent().registerReceiver(syncFinishReceiver, new IntentFilter(ISyncFinishReceiver.SYNC_FINISH)); } public void setHasSearchView(IOnSearchViewChangeListener listener, Menu menu, int menu_id) { mOnSearchViewChangeListener = listener; mSearchView = (SearchView) MenuItemCompat.getActionView(menu .findItem(menu_id)); if (mSearchView != null) { mSearchView.setOnCloseListener(closeListener); mSearchView.setOnQueryTextListener(searchViewQueryListener); mSearchView.setIconifiedByDefault(true); } } private SearchView.OnCloseListener closeListener = new SearchView.OnCloseListener() { @Override public boolean onClose() { // Restore the SearchView if a query was entered if (!TextUtils.isEmpty(mSearchView.getQuery())) { mSearchView.setQuery(null, true); } mOnSearchViewChangeListener.onSearchViewClose(); return true; } }; private SearchView.OnQueryTextListener searchViewQueryListener = new SearchView.OnQueryTextListener() { public boolean onQueryTextChange(String newText) { String newFilter = !TextUtils.isEmpty(newText) ? newText : null; return mOnSearchViewChangeListener .onSearchViewTextChange(newFilter); } @Override public boolean onQueryTextSubmit(String query) { // Don't care about this. return true; } }; public void setHasFloatingButton(View view, int res_id, ListView list, View.OnClickListener clickListener) { mFab = (FloatingActionButton) view.findViewById(res_id); if (mFab != null) { if (list != null) mFab.listenTo(list); mFab.setOnClickListener(clickListener); } } public void hideFab() { if (mFab != null) { mFab.setVisibility(View.GONE); } } public void showFab() { if (mFab != null) { mFab.setVisibility(View.VISIBLE); } } private ISyncFinishReceiver syncFinishReceiver = new ISyncFinishReceiver() { @Override public void onReceive(Context context, Intent intent) { hideRefreshingProgress(); if (mSyncStatusObserverListener != null) mSyncStatusObserverListener.onStatusChange(false); } }; public void startFragment(Fragment fragment, Boolean addToBackState, Bundle extra) { parent().loadFragment(fragment, addToBackState, extra); } public void startFragment(Fragment fragment, Boolean addToBackState) { startFragment(fragment, addToBackState, null); } }