MrZaiko/Polysmee

View on GitHub
app/src/main/java/io/github/polysmee/calendar/CalendarActivity.java

Summary

Maintainability
A
0 mins
Test Coverage
C
70%
package io.github.polysmee.calendar;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;

import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

import io.github.polysmee.R;
import io.github.polysmee.calendar.googlecalendarsync.GoogleCalendarSyncActivity;
import io.github.polysmee.internet.connection.InternetConnection;
import io.github.polysmee.invites.InvitesManagementActivity;
import io.github.polysmee.login.AuthenticationSingleton;
import io.github.polysmee.login.LoginActivity;
import io.github.polysmee.login.MainUser;
import io.github.polysmee.profile.ProfileActivity;
import io.github.polysmee.settings.SettingsActivity;
import io.github.polysmee.znotification.AppointmentReminderNotification;

public class CalendarActivity extends AppCompatActivity {

    private ActivityResultLauncher<String> requestPermissionLauncher;

    private MenuItem wifiLogo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calendar);

        boolean isDarkMode = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean(getApplicationContext().getResources().getString(R.string.preference_key_is_dark_mode), false);
        if (isDarkMode) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        } else {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }

        ViewPager2 pager = findViewById(R.id.calendarActivityPager);
        FragmentStateAdapter pagerAdapter = new CalendarActivityPagerAdapter(this);
        pager.setAdapter(pagerAdapter);

        TabLayout tabs = findViewById(R.id.calendarActivityTabs);
        new TabLayoutMediator(tabs, pager,
                (tab, position) -> tab.setText(getString(CalendarActivityPagerAdapter.FRAGMENT_NAME_ID[position]))).attach();

        AppointmentReminderNotification.appointmentReminderNotificationSetListeners(this);

        initializePermissionRequester();
    }

    /**
     * Initializes the request permission requester
     */
    private void initializePermissionRequester() {
        requestPermissionLauncher =
                this.registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
                    if (isGranted) {
                        checkCalendarPerms();
                    }
                });
    }

    /**
     * @param permission the permission we're checking
     * @return true if the permission given is granted by the user and false otherwise
     */
    private boolean checkPermission(String permission) {
        return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED;
    }

    public boolean checkCalendarPerms() {
        if (!checkPermission(Manifest.permission.WRITE_CALENDAR)) {
            requestPermissionLauncher.launch(Manifest.permission.WRITE_CALENDAR);
            return false;
        }

        if (!checkPermission(Manifest.permission.READ_CALENDAR)) {
            requestPermissionLauncher.launch(Manifest.permission.READ_CALENDAR);
            return false;
        }

        return true;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected void onResume() {
        if(wifiLogo != null) {
            wifiLogo.setVisible(!InternetConnection.isOn());
            InternetConnection.setCommand(((value, key) -> runOnUiThread(() -> wifiLogo.setVisible(key))));
        }


        super.onResume();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.calendar_menu, menu);
        wifiLogo = menu.findItem(R.id.calendarMenuOffline);
        if(InternetConnection.isOn()) {
            wifiLogo.setVisible(false);
        }
        InternetConnection.setCommand(((value, key) -> runOnUiThread(() -> wifiLogo.setVisible(key))));
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        MenuItem item = menu.findItem(R.id.calendarMenuNotifications);
        MainUser.getMainUser().getInvitesAndThen(s -> {
            if (!s.isEmpty()) {
                item.setIcon(R.drawable.baseline_notification_active);
            } else {
                item.setIcon(R.drawable.baseline_notifications);
            }
        });
        return super.onPrepareOptionsMenu(menu);
    }

    @SuppressLint("NonConstantResourceId")
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.calendarMenuProfile:
                Intent profileIntent = new Intent(this, ProfileActivity.class);
                profileIntent.putExtra(ProfileActivity.PROFILE_VISIT_CODE, ProfileActivity.PROFILE_OWNER_MODE);
                startActivity(profileIntent);
                return true;
            case R.id.calendarMenuSettings:
                Intent settingsIntent = new Intent(this, SettingsActivity.class);
                startActivity(settingsIntent);
                return true;
            case R.id.calendarMenuNotifications:
                Intent notificationsIntent = new Intent(this, InvitesManagementActivity.class);
                startActivity(notificationsIntent);
                return true;
            case R.id.calendarMenuExport:
                Intent exportIntent = new Intent(this, GoogleCalendarSyncActivity.class);
                startActivity(exportIntent);
                return true;
            case R.id.calendarMenuLogout:
                AuthenticationSingleton.getAdaptedInstance().signOut();
                Intent logoutIntent = new Intent(this, LoginActivity.class);
                finish();
                startActivity(logoutIntent);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

}