package com.byagowi.persiancalendar.view.activity; import android.annotation.TargetApi; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.content.LocalBroadcastManager; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; 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.KeyEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; import com.byagowi.persiancalendar.Constants; import com.byagowi.persiancalendar.R; import com.byagowi.persiancalendar.adapter.DrawerAdapter; import com.byagowi.persiancalendar.service.ApplicationService; import com.byagowi.persiancalendar.util.UpdateUtils; import com.byagowi.persiancalendar.util.Utils; import com.byagowi.persiancalendar.view.fragment.AboutFragment; import com.byagowi.persiancalendar.view.fragment.ApplicationPreferenceFragment; import com.byagowi.persiancalendar.view.fragment.CalendarFragment; import com.byagowi.persiancalendar.view.fragment.CompassFragment; import com.byagowi.persiancalendar.view.fragment.ConverterFragment; /** * Program activity for android * * @author ebraminio */ public class MainActivity extends AppCompatActivity { private final String TAG = MainActivity.class.getName(); private Utils utils; private UpdateUtils updateUtils; private DrawerLayout drawerLayout; private DrawerAdapter adapter; private Class<?>[] fragments = { null, CalendarFragment.class, ConverterFragment.class, CompassFragment.class, ApplicationPreferenceFragment.class, AboutFragment.class }; private static final int CALENDAR = 1; private static final int CONVERTER = 2; private static final int COMPASS = 3; private static final int PREFERENCE = 4; private static final int ABOUT = 5; private static final int EXIT = 6; // Default selected fragment private static final int DEFAULT = CALENDAR; private int menuPosition = 0; // it should be zero otherwise #selectItem won't be called private String lastLocale; private String lastTheme; @Override protected void onCreate(Bundle savedInstanceState) { utils = Utils.getInstance(getApplicationContext()); utils.setTheme(this); requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); utils.changeAppLanguage(this); utils.loadLanguageResource(); lastLocale = utils.getAppLanguage(); lastTheme = utils.getTheme(); updateUtils = UpdateUtils.getInstance(getApplicationContext()); if (!Utils.getInstance(this).isServiceRunning(ApplicationService.class)) { startService(new Intent(getBaseContext(), ApplicationService.class)); } updateUtils.update(true); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window w = getWindow(); w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } else { toolbar.setPadding(0, 0, 0, 0); } RecyclerView navigation = (RecyclerView) findViewById(R.id.navigation_view); navigation.setHasFixedSize(true); adapter = new DrawerAdapter(this); navigation.setAdapter(adapter); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); navigation.setLayoutManager(layoutManager); drawerLayout = (DrawerLayout) findViewById(R.id.drawer); final View appMainView = findViewById(R.id.app_main_layout); ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.openDrawer, R.string.closeDrawer) { int slidingDirection = +1; { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { if (isRTL()) slidingDirection = -1; } } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); } @Override public void onDrawerSlide(View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, slideOffset); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { slidingAnimation(drawerView, slideOffset); } } @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void slidingAnimation(View drawerView, float slideOffset) { appMainView.setTranslationX(slideOffset * drawerView.getWidth() * slidingDirection); drawerLayout.bringChildToFront(drawerView); drawerLayout.requestLayout(); } }; drawerLayout.addDrawerListener(drawerToggle); drawerToggle.syncState(); selectItem(DEFAULT); LocalBroadcastManager.getInstance(this).registerReceiver(dayPassedReceiver, new IntentFilter(Constants.LOCAL_INTENT_DAY_PASSED)); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private boolean isRTL() { return getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); utils.changeAppLanguage(this); View v = findViewById(R.id.drawer); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { v.setLayoutDirection(isRTL() ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR); } } public boolean dayIsPassed = false; private BroadcastReceiver dayPassedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { dayIsPassed = true; } }; @Override protected void onResume() { super.onResume(); if (dayIsPassed) { dayIsPassed = false; restartActivity(); } } @Override protected void onDestroy() { LocalBroadcastManager.getInstance(this).unregisterReceiver(dayPassedReceiver); super.onDestroy(); } @Override public void onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawers(); } else if (menuPosition != DEFAULT) { selectItem(DEFAULT); } else { finish(); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // Checking for the "menu" key if (keyCode == KeyEvent.KEYCODE_MENU) { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawers(); } else { drawerLayout.openDrawer(GravityCompat.START); } return true; } else { return super.onKeyDown(keyCode, event); } } private void beforeMenuChange(int position) { if (position != menuPosition) { // reset app lang on menu changes, ugly hack but it seems is needed utils.changeAppLanguage(this); } // only if we are returning from preferences if (menuPosition != PREFERENCE) return; utils.updateStoredPreference(); updateUtils.update(true); boolean needsActivityRestart = false; String locale = utils.getAppLanguage(); if (!locale.equals(lastLocale)) { lastLocale = locale; utils.changeAppLanguage(this); utils.loadLanguageResource(); needsActivityRestart = true; } if (!lastTheme.equals(utils.getTheme())) { needsActivityRestart = true; lastTheme = utils.getTheme(); } if (needsActivityRestart) restartActivity(); } private void restartActivity() { Intent intent = getIntent(); finish(); startActivity(intent); } public void selectItem(int item) { if (item == EXIT) { finish(); return; } beforeMenuChange(item); if (menuPosition != item) { try { getSupportFragmentManager() .beginTransaction() .replace( R.id.fragment_holder, (Fragment) fragments[item].newInstance(), fragments[item].getName() ).commit(); menuPosition = item; } catch (Exception e) { Log.e(TAG, item + " is selected as an index", e); } } adapter.setSelectedItem(menuPosition); drawerLayout.closeDrawers(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == Constants.LOCATION_PERMISSION_REQUEST_CODE) LocalBroadcastManager.getInstance(this).sendBroadcast( new Intent(Constants.LOCATION_PERMISSION_RESULT)); } }