package io.mrarm.irc; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import androidx.viewpager.widget.ViewPager; import io.mrarm.irc.setting.fragment.theme.ChatThemeSettings; import io.mrarm.irc.setting.fragment.theme.CommonThemeSettings; import io.mrarm.irc.setup.BackupProgressActivity; import io.mrarm.irc.util.AppCompatViewFactory; import io.mrarm.irc.util.theme.ThemeInfo; import io.mrarm.irc.util.theme.ThemeManager; import io.mrarm.irc.util.theme.live.LiveThemeManager; import io.mrarm.irc.util.theme.live.LiveThemeViewFactory; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.webkit.MimeTypeMap; import android.widget.EditText; import android.widget.Toast; import com.google.android.material.tabs.TabLayout; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.UUID; public class ThemeEditorActivity extends ThemedActivity { public static final String ARG_THEME_UUID = "theme"; public static final int REQUEST_CODE_EXPORT = 100; private LiveThemeManager mLiveThemeManager; private SectionsPagerAdapter mSectionsPagerAdapter; private Toolbar mToolbar; private ViewPager mViewPager; private TabLayout mTabLayout; private ThemeInfo mThemeInfo; @Override protected void onCreate(Bundle savedInstanceState) { mLiveThemeManager = new LiveThemeManager(this); getLayoutInflater().setFactory2(new LiveThemeViewFactory(mLiveThemeManager, new AppCompatViewFactory(this))); ThemeManager themeManager = ThemeManager.getInstance(this); mThemeInfo = themeManager.getCustomTheme( UUID.fromString(getIntent().getStringExtra(ARG_THEME_UUID))); if (mThemeInfo == null) throw new RuntimeException("Invalid theme UUID"); super.onCreate(savedInstanceState); setContentView(R.layout.activity_theme_editor); mToolbar = findViewById(R.id.toolbar); setSupportActionBar(mToolbar); mToolbar.setTitle(mThemeInfo.name); getSupportActionBar().setDisplayHomeAsUpEnabled(true); mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); mViewPager = findViewById(R.id.container); mViewPager.setAdapter(mSectionsPagerAdapter); mTabLayout = findViewById(R.id.tabs); mTabLayout.setupWithViewPager(mViewPager, false); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_settings_theme, menu); if (Build.VERSION.SDK_INT < 19) menu.findItem(R.id.action_export).setVisible(false); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { onBackPressed(); return true; } if (item.getItemId() == R.id.action_rename) { View view = LayoutInflater.from(this) .inflate(R.layout.dialog_edit_text, null); EditText text = view.findViewById(R.id.edit_text); text.setText(getThemeInfo().name); new AlertDialog.Builder(this) .setTitle(R.string.action_rename) .setView(view) .setPositiveButton(R.string.action_ok, (dialog1, which) -> { getThemeInfo().name = text.getText().toString(); notifyThemeNameChanged(); }) .setNegativeButton(R.string.action_cancel, null) .show(); return true; } else if (item.getItemId() == R.id.action_export) { if (Build.VERSION.SDK_INT >= 19) { Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("application/x-mrarm-irc-theme"); intent.putExtra(Intent.EXTRA_TITLE, getThemeInfo().name + ".irctheme"); startActivityForResult(intent, REQUEST_CODE_EXPORT); } } return super.onOptionsItemSelected(item); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_EXPORT) { if (data == null || data.getData() == null) return; try { Uri uri = data.getData(); ParcelFileDescriptor desc = getContentResolver().openFileDescriptor(uri, "w"); BufferedWriter wr = new BufferedWriter(new FileWriter(desc.getFileDescriptor())); ThemeManager.getInstance(this).exportTheme(getThemeInfo(), wr); wr.close(); desc.close(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, R.string.error_generic, Toast.LENGTH_SHORT).show(); } return; } super.onActivityResult(requestCode, resultCode, data); } @Override public void onBackPressed() { ThemeManager.getInstance(this).invalidateCurrentCustomTheme(); super.onBackPressed(); } @Override protected void onPause() { super.onPause(); try { ThemeManager.getInstance(this).saveTheme(getThemeInfo()); } catch (IOException e) { Log.w("ThemeEditorActivity", "Failed to save theme"); } } public void notifyThemeNameChanged() { mToolbar.setTitle(mThemeInfo.name); } public ThemeInfo getThemeInfo() { return mThemeInfo; } public LiveThemeManager getLiveThemeManager() { return mLiveThemeManager; } public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { if (position == 0) return new CommonThemeSettings(); if (position == 1) return new ChatThemeSettings(); return null; } @Nullable @Override public CharSequence getPageTitle(int position) { if (position == 0) return getString(R.string.theme_category_common); if (position == 1) return getString(R.string.theme_category_chat); return null; } @Override public int getCount() { return 2; } } }