package com.app.traver; import android.app.Dialog; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.app.traver.adapter.AdapterCity; import com.app.traver.advertise.AdNetworkHelper; import com.app.traver.data.AppConfig; import com.app.traver.data.DataApp; import com.app.traver.fragment.FragmentHome; import com.app.traver.fragment.FragmentNews; import com.app.traver.fragment.FragmentSaved; import com.app.traver.fragment.FragmentUser; import com.app.traver.model.Listing; import com.app.traver.model.NewsEvent; import com.app.traver.model.User; import com.app.traver.model.type.NotifType; import com.app.traver.model.view.MenuView; import com.app.traver.notification.NotificationHelper; import com.app.traver.room.table.EntityCity; import com.app.traver.room.table.NotificationEntity; import com.app.traver.utils.PermissionUtil; import com.app.traver.utils.Tools; import com.google.android.material.appbar.AppBarLayout; import com.google.gson.Gson; import java.util.HashMap; import java.util.Map; public class ActivityMain extends AppCompatActivity { private Map menuViews = new HashMap<>(); private EntityCity city; private AppBarLayout appBarLayout; private View lytBar, lytBarContent, lytCities, read; private ImageView image_user; private TextView title; private MenuView menuHome, menuSaved, menu_news, menu_user; private MenuView menuSelected; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // launch instruction when first launch if (DataApp.pref().isFirstLaunch()) { ActivityIntro.navigate(this); DataApp.pref().setFirstLaunch(false); } initComponent(); onNavigationMenuClick(findViewById(R.id.menu_home)); refreshData(); prepareAds(); checkNewVersion(); checkNotification(); Tools.RTLMode(getWindow()); } private void initComponent() { menuViews.clear(); menuHome = new MenuView(R.string.menu_home, R.id.menu_home, R.id.menu_home_img, R.id.menu_home_strip, R.id.frame_container_home, FragmentHome.instance()); menuSaved = new MenuView(R.string.menu_saved, R.id.menu_saved, R.id.menu_saved_img, R.id.menu_saved_strip, R.id.frame_container_saved, FragmentSaved.instance()); menu_news = new MenuView(R.string.menu_news, R.id.menu_news, R.id.menu_news_img, R.id.menu_news_strip, R.id.frame_container_news, FragmentNews.instance()); menu_user = new MenuView(R.string.menu_user, R.id.menu_user, R.id.menu_user_img, R.id.menu_user_strip, R.id.frame_container_user, FragmentUser.instance()); menuViews.put(R.id.menu_home, menuHome); menuViews.put(R.id.menu_saved, menuSaved); menuViews.put(R.id.menu_news, menu_news); menuViews.put(R.id.menu_user, menu_user); image_user = findViewById(R.id.image_user); lytCities = findViewById(R.id.lyt_cities); title = findViewById(R.id.title); lytBar = findViewById(R.id.lyt_bar); read = findViewById(R.id.read); lytBarContent = findViewById(R.id.lyt_bar_content); appBarLayout = findViewById(R.id.appbar_layout); findViewById(R.id.toolbar_menu_user).setOnClickListener(v -> { if (menuSelected.fragment instanceof FragmentUser) return; onNavigationMenuClick(findViewById(R.id.menu_user)); }); findViewById(R.id.toolbar_menu_notif).setOnClickListener(v -> { ActivityNotification.navigate(this); }); appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> { int offset = Math.abs(verticalOffset), range = appBarLayout.getTotalScrollRange(); int heightMax = lytBarContent.getHeight(); if (range <= 0) return; int translationY = (offset * heightMax) / range; lytBar.setTranslationY(translationY); }); lytCities.setOnClickListener(view -> showCitySelector()); } public void onNavigationMenuClick(View view) { if(menuSelected != null && view.getId() == menuSelected.parent) return; MenuView menu = menuViews.get(view.getId()); ImageView menu_image = findViewById(menu.image); View menu_strip = findViewById(menu.strip); FrameLayout frame_layout = findViewById(menu.frame); menu_image.setColorFilter(ContextCompat.getColor(this, R.color.primary), android.graphics.PorterDuff.Mode.SRC_IN); menu_strip.setVisibility(View.VISIBLE); frame_layout.setVisibility(View.VISIBLE); title.setText(getString(menu.title)); if (getSupportFragmentManager().findFragmentById(menu.frame) == null) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(menu.frame, menu.fragment); transaction.commit(); } else if (menu.parent == R.id.menu_home) { ((FragmentHome) menu.fragment).onResume(); } else if (menu.parent == R.id.menu_saved) { ((FragmentSaved) menu.fragment).onResume(); } else if (menu.parent == R.id.menu_user) { PermissionUtil.checkAndRequestNotification(this); } if (menuSelected != null) { ((ImageView) findViewById(menuSelected.image)).setColorFilter(ContextCompat.getColor(this, R.color.ic_soft), android.graphics.PorterDuff.Mode.SRC_IN); findViewById(menuSelected.strip).setVisibility(View.INVISIBLE); findViewById(menuSelected.frame).setVisibility(View.GONE); } menuSelected = menu; showTitle(menu.title != R.string.menu_home); } public void validateSession() { if (DataApp.global().isLogin()) { User user = DataApp.global().getUser(); Tools.displayImageCircle(this, image_user, user.image, 0.5f); } else { image_user.setImageResource(R.drawable.shape_circle_soft); } if (menuSelected.fragment instanceof FragmentUser) { ((FragmentUser) menu_user.fragment).validateUserSession(); } } private void refreshData() { city = DataApp.global().getCity(); ((TextView) findViewById(R.id.city_name)).setText(city.name); if (menuSelected.fragment instanceof FragmentHome) { ((FragmentHome) menuSelected.fragment).requestHome(); } MenuView mv = menuViews.get(R.id.menu_news); Fragment fragment = getSupportFragmentManager().findFragmentById(mv.frame); if (fragment != null) getSupportFragmentManager().beginTransaction().remove(fragment).commit(); } public void checkNewVersion() { if (DataApp.pref().getAppStatus().equals("SUGGEST-UPDATE")) { showNewVersion(); } } public void showTitle(boolean show) { title.setVisibility(show ? View.VISIBLE : View.GONE); lytCities.setVisibility(!show ? View.VISIBLE : View.GONE); } private void showCitySelector() { final Dialog dialog = new Dialog(this); dialog.setContentView(R.layout.dialog_city_list); dialog.setCancelable(true); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); Tools.RTLMode(dialog.getWindow()); RecyclerView recycler = dialog.findViewById(R.id.recyclerView); recycler.setPadding(0, Tools.dpToPx(this, 12), 0, Tools.dpToPx(this, 8)); recycler.setLayoutManager(new LinearLayoutManager(this)); recycler.setHasFixedSize(true); //set data and list adapter final AdapterCity mAdapter = new AdapterCity(this, DataApp.dao().getAllCity()); recycler.setAdapter(mAdapter); // on item list clicked mAdapter.setOnItemClickListener((view, obj) -> { DataApp.global().setCity(obj); refreshData(); dialog.dismiss(); }); dialog.show(); dialog.getWindow(); } private void showNewVersion() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.title_info); builder.setMessage(R.string.msg_app_new_version); builder.setCancelable(true); builder.setPositiveButton(R.string.UPDATE, (dialog, which) -> { dialog.dismiss(); Tools.rateAction(ActivityMain.this); finish(); }); builder.setNegativeButton(R.string.Skip, null); builder.show(); } private void checkNotification() { NotificationEntity notification = DataApp.global().getNotification(); if (notification == null) return; Listing listing = null; NewsEvent newsEvent = null; String link = notification.link; String type = notification.type; if (type.equals(NotifType.LISTING.value())) { listing = new Gson().fromJson(notification.object, Listing.class); } else if (type.equals(NotifType.NEWS_EVENT.value())) { newsEvent = new Gson().fromJson(notification.object, NewsEvent.class); } if (type.equals(NotifType.LISTING.value()) && listing != null) { ActivityListingDetails.navigate(this, listing); } else if (type.equals(NotifType.NEWS_EVENT.value()) && newsEvent != null) { ActivityNewsEventDetails.navigate(this, newsEvent); } else if (!TextUtils.isEmpty(link)) { Tools.directLinkCustomTab(this, link); } DataApp.global().setNotification(null); } @Override protected void onResume() { super.onResume(); validateSession(); int new_notif_count = DataApp.dao().getNotificationUnreadCount(); read.setVisibility(new_notif_count > 0 ? View.VISIBLE : View.GONE); } @Override protected void onPostCreate(@Nullable Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); PermissionUtil.checkAndRequestNotification(this); } @Override public void onBackPressed() { doExitApp(); } private long exitTime = 0; public void doExitApp() { if ((System.currentTimeMillis() - exitTime) > 2000) { Toast.makeText(this, R.string.press_again_exit_app, Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { finish(); } } static boolean active = false; @Override public void onStart() { super.onStart(); active = true; } @Override protected void onDestroy() { super.onDestroy(); active = false; } private AdNetworkHelper adNetworkHelper; private void prepareAds() { adNetworkHelper = new AdNetworkHelper(this); adNetworkHelper.showGDPR(); adNetworkHelper.loadBannerAd(AppConfig.ADS_MAIN_BANNER); adNetworkHelper.loadInterstitialAd(AppConfig.ADS_MAIN_INTERS); } public void showInterstitialAd() { adNetworkHelper.showInterstitialAd(AppConfig.ADS_MAIN_INTERS); } }