diff options
| author | Dominik Schürmann <dominik@dominikschuermann.de> | 2015-07-25 15:55:30 +0200 | 
|---|---|---|
| committer | Dominik Schürmann <dominik@dominikschuermann.de> | 2015-07-25 15:55:30 +0200 | 
| commit | 2687e533a696eca032241d3bf5662310c4acf110 (patch) | |
| tree | 0c797f22b01dd20c424e57db20100eaa6cd30879 /OpenKeychain/src/main | |
| parent | 1dafd1b629102180d7e6cb7bb31d1959f1ff6665 (diff) | |
| parent | a8b80b3ff43f9df9583e3e8bb514f84443bab60a (diff) | |
| download | open-keychain-2687e533a696eca032241d3bf5662310c4acf110.tar.gz open-keychain-2687e533a696eca032241d3bf5662310c4acf110.tar.bz2 open-keychain-2687e533a696eca032241d3bf5662310c4acf110.zip  | |
Merge branch 'thialfihar-feature/add-theme-setting'
Diffstat (limited to 'OpenKeychain/src/main')
79 files changed, 561 insertions, 308 deletions
diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml index 83d8bce91..35048b936 100644 --- a/OpenKeychain/src/main/AndroidManifest.xml +++ b/OpenKeychain/src/main/AndroidManifest.xml @@ -9,15 +9,15 @@          ===============          - Last APG 1 version was 10900 (1.0.9 beta 00)          - Keychain starting with versionCode 20000! -         +          Association of file types to Keychain          =====================================          General remarks about file ending conventions:          - *.gpg,*.pgp for binary files          - *.asc for ascii armored files The actual content can be anything. -         +          The file ending only shows if it is binary or ascii encoded. -         +          Remarks about the ugly android:pathPattern:          - We are matching all files with a specific file ending.          This is done in an ugly way because of Android limitations. @@ -73,7 +73,7 @@          android:hardwareAccelerated="true"          android:icon="@drawable/ic_launcher"          android:label="@string/app_name" -        android:theme="@style/KeychainTheme"> +        android:theme="@style/LightTheme">          <activity              android:name=".ui.MainActivity"              android:configChanges="orientation|screenSize|keyboardHidden|keyboard" diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java index 621387ca2..3d58602ab 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java @@ -103,6 +103,13 @@ public final class Constants {          public static final String PROXY_HOST = "proxyHost";          public static final String PROXY_PORT = "proxyPort";          public static final String PROXY_TYPE = "proxyType"; +        public static final String THEME = "theme"; + +        public static final class Theme { +            public static final String LIGHT = "light"; +            public static final String DARK = "dark"; +            public static final String DEFAULT = Constants.Pref.Theme.LIGHT; +        }      }      /** @@ -116,7 +123,7 @@ public final class Constants {      public static final class Defaults {          public static final String KEY_SERVERS = "hkps://hkps.pool.sks-keyservers.net, hkps://pgp.mit.edu"; -        public static final int PREF_VERSION = 4; +        public static final int PREF_VERSION = 5;      }      public static final class key { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java index 627623f47..cd24394d7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java @@ -37,6 +37,7 @@ import org.sufficientlysecure.keychain.provider.KeychainDatabase;  import org.sufficientlysecure.keychain.provider.TemporaryStorageProvider;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.ui.ConsolidateDialogActivity; +import org.sufficientlysecure.keychain.ui.util.FormattingUtils;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.PRNGFixes;  import org.sufficientlysecure.keychain.util.Preferences; @@ -91,12 +92,12 @@ public class KeychainApplication extends Application {          }          brandGlowEffect(getApplicationContext(), -                getApplicationContext().getResources().getColor(R.color.primary)); +            FormattingUtils.getColorFromAttr(getApplicationContext(), R.attr.colorPrimary));          setupAccountAsNeeded(this);          // Update keyserver list as needed -        Preferences.getPreferences(this).updatePreferences(); +        Preferences.getPreferences(this).upgradePreferences();          TlsHelper.addStaticCA("pool.sks-keyservers.net", getAssets(), "sks-keyservers.netCA.cer"); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java index 65baf0593..5ca7c6bc7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java @@ -53,6 +53,7 @@ import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;  import org.sufficientlysecure.keychain.ui.adapter.MultiUserIdsAdapter;  import org.sufficientlysecure.keychain.ui.base.CachingCryptoOperationFragment;  import org.sufficientlysecure.keychain.ui.util.Notify; +import org.sufficientlysecure.keychain.ui.util.FormattingUtils;  import org.sufficientlysecure.keychain.ui.widget.CertifyKeySpinner;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.Preferences; @@ -154,7 +155,7 @@ public class CertifyKeyFragment          // make certify image gray, like action icons          ImageView vActionCertifyImage =                  (ImageView) view.findViewById(R.id.certify_key_action_certify_image); -        vActionCertifyImage.setColorFilter(getResources().getColor(R.color.tertiary_text_light), +        vActionCertifyImage.setColorFilter(FormattingUtils.getColorFromAttr(getActivity(), R.attr.colorTertiaryText),                  PorterDuff.Mode.SRC_IN);          View vCertifyButton = view.findViewById(R.id.certify_key_certify_button); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DeleteKeyDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DeleteKeyDialogActivity.java index 4c1dbd1ee..b22053df1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DeleteKeyDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DeleteKeyDialogActivity.java @@ -49,6 +49,7 @@ import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;  import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;  import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder;  import org.sufficientlysecure.keychain.ui.util.Notify; +import org.sufficientlysecure.keychain.ui.util.ThemeChanger;  import org.sufficientlysecure.keychain.util.Log;  import java.util.Date; @@ -254,8 +255,7 @@ public class DeleteKeyDialogActivity extends FragmentActivity {              final long[] masterKeyIds = getArguments().getLongArray(ARG_DELETE_MASTER_KEY_IDS);              final boolean hasSecret = getArguments().getBoolean(ARG_HAS_SECRET); -            ContextThemeWrapper theme = new ContextThemeWrapper(activity, -                    R.style.Theme_AppCompat_Light_Dialog); +            ContextThemeWrapper theme = ThemeChanger.getDialogThemeWrapper(activity);              CustomAlertDialogBuilder builder = new CustomAlertDialogBuilder(theme); @@ -351,10 +351,7 @@ public class DeleteKeyDialogActivity extends FragmentActivity {              final String CHOICE_REVOKE = getString(R.string.del_rev_dialog_choice_rev_upload);              final String CHOICE_DELETE = getString(R.string.del_rev_dialog_choice_delete); -            // if the dialog is displayed from the application class, design is missing -            // hack to get holo design (which is not automatically applied due to activity's Theme.NoDisplay -            ContextThemeWrapper theme = new ContextThemeWrapper(activity, -                    R.style.Theme_AppCompat_Light_Dialog); +            ContextThemeWrapper theme = ThemeChanger.getDialogThemeWrapper(activity);              CustomAlertDialogBuilder builder = new CustomAlertDialogBuilder(theme);              builder.setTitle(getString(R.string.del_rev_dialog_title, diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpMarkdownFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpMarkdownFragment.java index 97d39feb1..24da13983 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpMarkdownFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/HelpMarkdownFragment.java @@ -78,6 +78,7 @@ public class HelpMarkdownFragment extends Fragment {              Log.e(Constants.TAG, "IOException", e);          } +        text.setBackgroundColor(getResources().getColor(android.R.color.white));          // no flickering when clicking textview for Android < 4          text.setTextColor(getResources().getColor(android.R.color.black)); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java index 95e047b0f..0488d8235 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -68,6 +68,7 @@ import org.sufficientlysecure.keychain.service.ImportKeyringParcel;  import org.sufficientlysecure.keychain.ui.adapter.KeyAdapter;  import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;  import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import org.sufficientlysecure.keychain.ui.util.FormattingUtils;  import org.sufficientlysecure.keychain.ui.util.Notify;  import org.sufficientlysecure.keychain.ui.util.Notify.Style;  import org.sufficientlysecure.keychain.util.FabContainer; @@ -675,8 +676,11 @@ public class KeyListFragment extends LoaderFragment          private HashMap<Integer, Boolean> mSelection = new HashMap<>(); +        private Context mContext; +          public KeyListAdapter(Context context, Cursor c, int flags) {              super(context, c, flags); +            mContext = context;          }          @Override @@ -705,9 +709,11 @@ public class KeyListFragment extends LoaderFragment              // let the adapter handle setting up the row views              View v = super.getView(position, convertView, parent); +            int colorEmphasis = FormattingUtils.getColorFromAttr(mContext, R.attr.colorEmphasis); +              if (mSelection.get(position) != null) {                  // selected position color -                v.setBackgroundColor(parent.getResources().getColor(R.color.emphasis)); +                v.setBackgroundColor(colorEmphasis);              } else {                  // default color                  v.setBackgroundColor(Color.TRANSPARENT); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java index 3c8fbf8c9..1cd1a3099 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java @@ -43,6 +43,7 @@ import org.sufficientlysecure.keychain.operations.results.OperationResult;  import org.sufficientlysecure.keychain.operations.results.OperationResult.LogEntryParcel;  import org.sufficientlysecure.keychain.operations.results.OperationResult.LogLevel;  import org.sufficientlysecure.keychain.operations.results.OperationResult.SubLogEntryParcel; +import org.sufficientlysecure.keychain.ui.util.FormattingUtils;  import org.sufficientlysecure.keychain.util.FileHelper;  import org.sufficientlysecure.keychain.util.Log; @@ -57,10 +58,12 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe      OperationResult mResult;      public static final String EXTRA_RESULT = "log"; +    protected int mTextColor;      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState); +        mTextColor = FormattingUtils.getColorFromAttr(getActivity(), R.attr.colorText);          setHasOptionsMenu(true);      } @@ -357,13 +360,13 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe                          ih.mSecondText.setText(getResources().getString(subEntry.mType.getMsgId(),                                  subEntry.mParameters));                      } -                    ih.mSecondText.setTextColor(subEntry.mType.mLevel == LogLevel.DEBUG ? Color.GRAY : Color.BLACK); +                    ih.mSecondText.setTextColor(subEntry.mType.mLevel == LogLevel.DEBUG ? Color.GRAY : mTextColor);                      switch (subEntry.mType.mLevel) {                          case DEBUG: ih.mSecondImg.setBackgroundColor(Color.GRAY); break; -                        case INFO: ih.mSecondImg.setBackgroundColor(Color.BLACK); break; +                        case INFO: ih.mSecondImg.setBackgroundColor(mTextColor); break;                          case WARN: ih.mSecondImg.setBackgroundColor(getResources().getColor(R.color.android_orange_light)); break;                          case ERROR: ih.mSecondImg.setBackgroundColor(getResources().getColor(R.color.android_red_light)); break; -                        case START: ih.mSecondImg.setBackgroundColor(Color.BLACK); break; +                        case START: ih.mSecondImg.setBackgroundColor(mTextColor); break;                          case OK: ih.mSecondImg.setBackgroundColor(getResources().getColor(R.color.android_green_light)); break;                          case CANCELLED: ih.mSecondImg.setBackgroundColor(getResources().getColor(R.color.android_red_light)); break;                      } @@ -388,13 +391,13 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe                          entry.mParameters));              }              convertView.setPadding((entry.mIndent) * dipFactor, 0, 0, 0); -            ih.mText.setTextColor(entry.mType.mLevel == LogLevel.DEBUG ? Color.GRAY : Color.BLACK); +            ih.mText.setTextColor(entry.mType.mLevel == LogLevel.DEBUG ? Color.GRAY : mTextColor);              switch (entry.mType.mLevel) {                  case DEBUG: ih.mImg.setBackgroundColor(Color.GRAY); break; -                case INFO: ih.mImg.setBackgroundColor(Color.BLACK); break; +                case INFO: ih.mImg.setBackgroundColor(mTextColor); break;                  case WARN: ih.mImg.setBackgroundColor(getResources().getColor(R.color.android_orange_light)); break;                  case ERROR: ih.mImg.setBackgroundColor(getResources().getColor(R.color.android_red_light)); break; -                case START: ih.mImg.setBackgroundColor(Color.BLACK); break; +                case START: ih.mImg.setBackgroundColor(mTextColor); break;                  case OK: ih.mImg.setBackgroundColor(getResources().getColor(R.color.android_green_light)); break;                  case CANCELLED: ih.mImg.setBackgroundColor(getResources().getColor(R.color.android_red_light)); break;              } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java index d00c8f367..6f5d98afd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java @@ -33,6 +33,7 @@ import com.mikepenz.community_material_typeface_library.CommunityMaterial;  import com.mikepenz.google_material_typeface_library.GoogleMaterial;  import com.mikepenz.iconics.typeface.FontAwesome;  import com.mikepenz.materialdrawer.Drawer; +import com.mikepenz.materialdrawer.DrawerBuilder;  import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;  import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; @@ -56,7 +57,7 @@ public class MainActivity extends BaseNfcActivity implements FabContainer, OnBac      public static final String EXTRA_SKIP_FIRST_TIME = "skip_first_time";      public static final String EXTRA_INIT_FRAG = "init_frag"; -    public Drawer.Result mDrawerResult; +    public Drawer mDrawer;      private Toolbar mToolbar;      @Override @@ -68,7 +69,7 @@ public class MainActivity extends BaseNfcActivity implements FabContainer, OnBac          mToolbar.setTitle(R.string.app_name);          setSupportActionBar(mToolbar); -        mDrawerResult = new Drawer() +        mDrawer = new DrawerBuilder()                  .withActivity(this)                  .withHeader(R.layout.main_drawer_header)                  .withToolbar(mToolbar) @@ -89,7 +90,7 @@ public class MainActivity extends BaseNfcActivity implements FabContainer, OnBac                  )                  .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {                      @Override -                    public void onItemClick(AdapterView<?> parent, View view, int position, long id, IDrawerItem drawerItem) { +                    public boolean onItemClick(AdapterView<?> parent, View view, int position, long id, IDrawerItem drawerItem) {                          if (drawerItem != null) {                              Intent intent = null;                              switch(drawerItem.getIdentifier()) { @@ -116,6 +117,8 @@ public class MainActivity extends BaseNfcActivity implements FabContainer, OnBac                                  MainActivity.this.startActivity(intent);                              }                          } + +                        return false;                      }                  })                  .withSelectedItem(-1) @@ -179,28 +182,28 @@ public class MainActivity extends BaseNfcActivity implements FabContainer, OnBac      private void onKeysSelected() {          mToolbar.setTitle(R.string.app_name); -        mDrawerResult.setSelectionByIdentifier(ID_KEYS, false); +        mDrawer.setSelectionByIdentifier(ID_KEYS, false);          Fragment frag = new KeyListFragment();          setFragment(frag, false);      }      private void onEnDecryptSelected() {          mToolbar.setTitle(R.string.nav_encrypt_decrypt); -        mDrawerResult.setSelectionByIdentifier(ID_ENCRYPT_DECRYPT, false); +        mDrawer.setSelectionByIdentifier(ID_ENCRYPT_DECRYPT, false);          Fragment frag = new EncryptDecryptOverviewFragment();          setFragment(frag, true);      }      private void onAppsSelected() {          mToolbar.setTitle(R.string.nav_apps); -        mDrawerResult.setSelectionByIdentifier(ID_APPS, false); +        mDrawer.setSelectionByIdentifier(ID_APPS, false);          Fragment frag = new AppsListFragment();          setFragment(frag, true);      }      private void onBackupSelected() {          mToolbar.setTitle(R.string.nav_backup); -        mDrawerResult.setSelectionByIdentifier(ID_APPS, false); +        mDrawer.setSelectionByIdentifier(ID_APPS, false);          Fragment frag = new BackupFragment();          setFragment(frag, true);      } @@ -208,15 +211,15 @@ public class MainActivity extends BaseNfcActivity implements FabContainer, OnBac      @Override      protected void onSaveInstanceState(Bundle outState) {          // add the values which need to be saved from the drawer to the bundle -        outState = mDrawerResult.saveInstanceState(outState); +        outState = mDrawer.saveInstanceState(outState);          super.onSaveInstanceState(outState);      }      @Override      public void onBackPressed() {          // close the drawer first and if the drawer is closed do regular backstack handling -        if (mDrawerResult != null && mDrawerResult.isDrawerOpen()) { -            mDrawerResult.closeDrawer(); +        if (mDrawer != null && mDrawer.isDrawerOpen()) { +            mDrawer.closeDrawer();          } else {              super.onBackPressed();          } @@ -255,16 +258,16 @@ public class MainActivity extends BaseNfcActivity implements FabContainer, OnBac          // make sure the selected icon is the one shown at this point          if (frag instanceof KeyListFragment) {              mToolbar.setTitle(R.string.app_name); -            mDrawerResult.setSelection(mDrawerResult.getPositionFromIdentifier(ID_KEYS), false); +            mDrawer.setSelection(mDrawer.getPositionFromIdentifier(ID_KEYS), false);          } else if (frag instanceof EncryptDecryptOverviewFragment) {              mToolbar.setTitle(R.string.nav_encrypt_decrypt); -            mDrawerResult.setSelection(mDrawerResult.getPositionFromIdentifier(ID_ENCRYPT_DECRYPT), false); +            mDrawer.setSelection(mDrawer.getPositionFromIdentifier(ID_ENCRYPT_DECRYPT), false);          } else if (frag instanceof AppsListFragment) {              mToolbar.setTitle(R.string.nav_apps); -            mDrawerResult.setSelection(mDrawerResult.getPositionFromIdentifier(ID_APPS), false); +            mDrawer.setSelection(mDrawer.getPositionFromIdentifier(ID_APPS), false);          } else if (frag instanceof BackupFragment) {              mToolbar.setTitle(R.string.nav_backup); -            mDrawerResult.setSelection(mDrawerResult.getPositionFromIdentifier(ID_BACKUP), false); +            mDrawer.setSelection(mDrawer.getPositionFromIdentifier(ID_BACKUP), false);          }      } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java index 8b482584d..d7224bd04 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java @@ -59,6 +59,7 @@ import org.sufficientlysecure.keychain.service.PassphraseCacheService;  import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;  import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;  import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder; +import org.sufficientlysecure.keychain.ui.util.ThemeChanger;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.Passphrase;  import org.sufficientlysecure.keychain.util.Preferences; @@ -196,10 +197,7 @@ public class PassphraseDialogActivity extends FragmentActivity {          public Dialog onCreateDialog(Bundle savedInstanceState) {              final Activity activity = getActivity(); -            // if the dialog is displayed from the application class, design is missing -            // hack to get holo design (which is not automatically applied due to activity's Theme.NoDisplay -            ContextThemeWrapper theme = new ContextThemeWrapper(activity, -                    R.style.Theme_AppCompat_Light_Dialog); +            ContextThemeWrapper theme = ThemeChanger.getDialogThemeWrapper(activity);              mSubKeyId = getArguments().getLong(EXTRA_SUBKEY_ID);              mServiceIntent = getArguments().getParcelable(EXTRA_SERVICE_INTENT); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/RetryUploadDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/RetryUploadDialogActivity.java index 85f2096db..2a00e8b70 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/RetryUploadDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/RetryUploadDialogActivity.java @@ -29,6 +29,7 @@ import android.support.v4.app.FragmentActivity;  import android.view.ContextThemeWrapper;  import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.ui.util.ThemeChanger;  import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder;  public class RetryUploadDialogActivity extends FragmentActivity { @@ -54,8 +55,7 @@ public class RetryUploadDialogActivity extends FragmentActivity {          @Override          public Dialog onCreateDialog(Bundle savedInstanceState) { -            ContextThemeWrapper theme = new ContextThemeWrapper(getActivity(), -                    R.style.Theme_AppCompat_Light_Dialog); +            ContextThemeWrapper theme = ThemeChanger.getDialogThemeWrapper(getActivity());              CustomAlertDialogBuilder dialogBuilder = new CustomAlertDialogBuilder(theme);              dialogBuilder.setTitle(R.string.retry_up_dialog_title); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java index d15cea5a4..534dbfd05 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java @@ -37,6 +37,7 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper;  import org.sufficientlysecure.keychain.service.ImportKeyringParcel;  import org.sufficientlysecure.keychain.ui.base.BaseActivity;  import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; +import org.sufficientlysecure.keychain.ui.util.FormattingUtils;  import org.sufficientlysecure.keychain.ui.util.Notify;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.ParcelableFileCache; @@ -81,7 +82,7 @@ public class SafeSlingerActivity extends BaseActivity          });          ImageView buttonIcon = (ImageView) findViewById(R.id.safe_slinger_button_image); -        buttonIcon.setColorFilter(getResources().getColor(R.color.tertiary_text_light), +        buttonIcon.setColorFilter(FormattingUtils.getColorFromAttr(this, R.attr.colorTertiaryText),                  PorterDuff.Mode.SRC_IN);          View button = findViewById(R.id.safe_slinger_button); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java index bcf42ba74..2fe868b8b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java @@ -41,6 +41,7 @@ import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.compatibility.AppCompatPreferenceActivity;  import org.sufficientlysecure.keychain.ui.util.Notify; +import org.sufficientlysecure.keychain.ui.util.ThemeChanger;  import org.sufficientlysecure.keychain.ui.widget.IntegerListPreference;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.Preferences; @@ -53,15 +54,20 @@ public class SettingsActivity extends AppCompatPreferenceActivity {      public static final String ACTION_PREFS_CLOUD = "org.sufficientlysecure.keychain.ui.PREFS_CLOUD";      public static final String ACTION_PREFS_ADV = "org.sufficientlysecure.keychain.ui.PREFS_ADV";      public static final String ACTION_PREFS_PROXY = "org.sufficientlysecure.keychain.ui.PREFS_PROXY"; +    public static final String ACTION_PREFS_GUI = "org.sufficientlysecure.keychain.ui.PREFS_GUI";      public static final int REQUEST_CODE_KEYSERVER_PREF = 0x00007005;      private PreferenceScreen mKeyServerPreference = null;      private static Preferences sPreferences; +    private ThemeChanger mThemeChanger;      @Override      protected void onCreate(Bundle savedInstanceState) {          sPreferences = Preferences.getPreferences(this); + +        mThemeChanger = new ThemeChanger(this); +        mThemeChanger.changeTheme();          super.onCreate(savedInstanceState);          setupToolbar(); @@ -106,6 +112,21 @@ public class SettingsActivity extends AppCompatPreferenceActivity {              initializeUseNumKeypadForYubiKeyPin(                      (CheckBoxPreference) findPreference(Constants.Pref.USE_NUMKEYPAD_FOR_YUBIKEY_PIN)); +        } else if (action != null && action.equals(ACTION_PREFS_GUI)) { +            addPreferencesFromResource(R.xml.gui_preferences); + +            initializeTheme((ListPreference) findPreference(Constants.Pref.THEME)); +        } +    } + +    @Override +    protected void onResume() { +        super.onResume(); + +        if (mThemeChanger.changeTheme()) { +            Intent intent = getIntent(); +            finish(); +            startActivity(intent);          }      } @@ -425,14 +446,30 @@ public class SettingsActivity extends AppCompatPreferenceActivity {                  mUseTor.setEnabled(true);              }          } +    } + +    /** +     * This fragment shows gui preferences. +     */ +    public static class GuiPrefsFragment extends PreferenceFragment { +        @Override +        public void onCreate(Bundle savedInstanceState) { +            super.onCreate(savedInstanceState); + + +            // Load the preferences from an XML resource +            addPreferencesFromResource(R.xml.gui_preferences); + +            initializeTheme((ListPreference) findPreference(Constants.Pref.THEME)); +        }      } -    @TargetApi(Build.VERSION_CODES.KITKAT)      protected boolean isValidFragment(String fragmentName) {          return AdvancedPrefsFragment.class.getName().equals(fragmentName)                  || CloudSearchPrefsFragment.class.getName().equals(fragmentName)                  || ProxyPrefsFragment.class.getName().equals(fragmentName) +                || GuiPrefsFragment.class.getName().equals(fragmentName)                  || super.isValidFragment(fragmentName);      } @@ -461,6 +498,19 @@ public class SettingsActivity extends AppCompatPreferenceActivity {                  });      } +    private static void initializeTheme(final ListPreference mTheme) { +        mTheme.setValue(sPreferences.getTheme()); +        mTheme.setSummary(mTheme.getEntry()); +        mTheme.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { +            public boolean onPreferenceChange(Preference preference, Object newValue) { +                mTheme.setValue((String) newValue); +                mTheme.setSummary(mTheme.getEntry()); +                sPreferences.setTheme((String) newValue); +                return false; +            } +        }); +    } +      private static void initializeSearchKeyserver(final CheckBoxPreference mSearchKeyserver) {          Preferences.CloudSearchPrefs prefs = sPreferences.getCloudSearchPrefs();          mSearchKeyserver.setChecked(prefs.searchKeyserver); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index 938dbc9f2..1d0e085da 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -691,6 +691,25 @@ public class ViewKeyActivity extends BaseNfcActivity implements      int mPreviousColor = 0; +    /** +     * Calculate a reasonable color for the status bar based on the given toolbar color. +     * Style guides want the toolbar color to be a "700" on the Android scale and the status +     * bar should be the same color at "500", this is roughly 17 / 20th of the value in each +     * channel. +     * http://www.google.com/design/spec/style/color.html#color-color-palette +     */ +    static public int getStatusBarBackgroundColor(int color) { +        int r = (color >> 16) & 0xff; +        int g = (color >> 8) & 0xff; +        int b = color & 0xff; + +        r = r * 17 / 20; +        g = g * 17 / 20; +        b = b * 17 / 20; + +        return (0xff << 24) | (r << 16) | (g << 8) | b; +    } +      @Override      public void onLoadFinished(Loader<Cursor> loader, Cursor data) {          /* TODO better error handling? May cause problems when a key is deleted, @@ -760,7 +779,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements                          mStatusImage.setVisibility(View.VISIBLE);                          KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText,                                  State.REVOKED, R.color.icons, true); -                        color = getResources().getColor(R.color.android_red_light); +                        color = getResources().getColor(R.color.key_flag_red);                          mActionEncryptFile.setVisibility(View.GONE);                          mActionEncryptText.setVisibility(View.GONE); @@ -776,7 +795,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements                          mStatusImage.setVisibility(View.VISIBLE);                          KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText,                                  State.EXPIRED, R.color.icons, true); -                        color = getResources().getColor(R.color.android_red_light); +                        color = getResources().getColor(R.color.key_flag_red);                          mActionEncryptFile.setVisibility(View.GONE);                          mActionEncryptText.setVisibility(View.GONE); @@ -786,7 +805,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements                      } else if (mIsSecret) {                          mStatusText.setText(R.string.view_key_my_key);                          mStatusImage.setVisibility(View.GONE); -                        color = getResources().getColor(R.color.primary); +                        color = getResources().getColor(R.color.key_flag_green);                          // reload qr code only if the fingerprint changed                          if (!mFingerprint.equals(mQrCodeLoaded)) {                              loadQrCode(mFingerprint); @@ -837,7 +856,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements                              mStatusImage.setVisibility(View.VISIBLE);                              KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText,                                      State.VERIFIED, R.color.icons, true); -                            color = getResources().getColor(R.color.primary); +                            color = getResources().getColor(R.color.key_flag_green);                              photoTask.execute(mMasterKeyId);                              mFab.setVisibility(View.GONE); @@ -846,20 +865,21 @@ public class ViewKeyActivity extends BaseNfcActivity implements                              mStatusImage.setVisibility(View.VISIBLE);                              KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText,                                      State.UNVERIFIED, R.color.icons, true); -                            color = getResources().getColor(R.color.android_orange_light); +                            color = getResources().getColor(R.color.key_flag_orange);                              mFab.setVisibility(View.VISIBLE);                          }                      }                      if (mPreviousColor == 0 || mPreviousColor == color) { -                        mStatusBar.setBackgroundColor(color); +                        mStatusBar.setBackgroundColor(getStatusBarBackgroundColor(color));                          mBigToolbar.setBackgroundColor(color);                          mPreviousColor = color;                      } else {                          ObjectAnimator colorFade1 =                                  ObjectAnimator.ofObject(mStatusBar, "backgroundColor", -                                        new ArgbEvaluator(), mPreviousColor, color); +                                        new ArgbEvaluator(), mPreviousColor, +                                        getStatusBarBackgroundColor(color));                          ObjectAnimator colorFade2 =                                  ObjectAnimator.ofObject(mBigToolbar, "backgroundColor",                                          new ArgbEvaluator(), mPreviousColor, color); @@ -943,4 +963,4 @@ public class ViewKeyActivity extends BaseNfcActivity implements      public boolean onCryptoSetProgress(String msg, int progress, int max) {          return true;      } -}
\ No newline at end of file +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java index 6669f2654..673092e61 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java @@ -211,18 +211,18 @@ public class ViewKeyAdvActivity extends BaseActivity implements                      // Note: order is important                      int color;                      if (isRevoked || isExpired) { -                        color = getResources().getColor(R.color.android_red_light); +                        color = getResources().getColor(R.color.key_flag_red);                      } else if (isSecret) { -                        color = getResources().getColor(R.color.primary); +                        color = getResources().getColor(R.color.android_green_light);                      } else {                          if (isVerified) { -                            color = getResources().getColor(R.color.primary); +                            color = getResources().getColor(R.color.android_green_light);                          } else { -                            color = getResources().getColor(R.color.android_orange_light); +                            color = getResources().getColor(R.color.key_flag_orange);                          }                      }                      mToolbar.setBackgroundColor(color); -                    mStatusBar.setBackgroundColor(color); +                    mStatusBar.setBackgroundColor(ViewKeyActivity.getStatusBarBackgroundColor(color));                      mSlidingTabLayout.setBackgroundColor(color);                      break; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java index 65f70ec14..4a46896bc 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvShareFragment.java @@ -58,6 +58,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract;  import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;  import org.sufficientlysecure.keychain.provider.ProviderHelper;  import org.sufficientlysecure.keychain.provider.TemporaryStorageProvider; +import org.sufficientlysecure.keychain.ui.util.FormattingUtils;  import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;  import org.sufficientlysecure.keychain.ui.util.Notify;  import org.sufficientlysecure.keychain.ui.util.Notify.Style; @@ -111,7 +112,7 @@ public class ViewKeyAdvShareFragment extends LoaderFragment implements          View vKeyClipboardButton = view.findViewById(R.id.view_key_action_key_clipboard);          ImageButton vKeySafeSlingerButton = (ImageButton) view.findViewById(R.id.view_key_action_key_safeslinger);          View vKeyUploadButton = view.findViewById(R.id.view_key_action_upload); -        vKeySafeSlingerButton.setColorFilter(getResources().getColor(R.color.tertiary_text_light), +        vKeySafeSlingerButton.setColorFilter(FormattingUtils.getColorFromAttr(getActivity(), R.attr.colorTertiaryText),                  PorterDuff.Mode.SRC_IN);          vFingerprintShareButton.setOnClickListener(new View.OnClickListener() { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java index 93c6593ab..0be7e8f76 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java @@ -177,9 +177,9 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {          }          if (entry.isRevoked()) { -            KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, State.REVOKED, R.color.bg_gray); +            KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, State.REVOKED, R.color.key_flag_gray);          } else if (entry.isExpired()) { -            KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, State.EXPIRED, R.color.bg_gray); +            KeyFormattingUtils.setStatusImage(getContext(), holder.status, null, State.EXPIRED, R.color.key_flag_gray);          }          if (entry.isRevoked() || entry.isExpired()) { @@ -188,9 +188,9 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {              // no more space for algorithm display              holder.algorithm.setVisibility(View.GONE); -            holder.mainUserId.setTextColor(getContext().getResources().getColor(R.color.bg_gray)); -            holder.mainUserIdRest.setTextColor(getContext().getResources().getColor(R.color.bg_gray)); -            holder.keyId.setTextColor(getContext().getResources().getColor(R.color.bg_gray)); +            holder.mainUserId.setTextColor(getContext().getResources().getColor(R.color.key_flag_gray)); +            holder.mainUserIdRest.setTextColor(getContext().getResources().getColor(R.color.key_flag_gray)); +            holder.keyId.setTextColor(getContext().getResources().getColor(R.color.key_flag_gray));          } else {              holder.status.setVisibility(View.GONE);              holder.algorithm.setVisibility(View.VISIBLE); @@ -198,11 +198,11 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {              if (entry.isSecretKey()) {                  holder.mainUserId.setTextColor(Color.RED);              } else { -                holder.mainUserId.setTextColor(Color.BLACK); +                holder.mainUserId.setTextColor(FormattingUtils.getColorFromAttr(mActivity, R.attr.colorText));              } -            holder.mainUserIdRest.setTextColor(Color.BLACK); -            holder.keyId.setTextColor(Color.BLACK); +            holder.mainUserIdRest.setTextColor(FormattingUtils.getColorFromAttr(mActivity, R.attr.colorText)); +            holder.keyId.setTextColor(FormattingUtils.getColorFromAttr(mActivity, R.attr.colorText));          }          if (entry.getUserIds().size() == 1) { @@ -242,9 +242,9 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {                  uidView.setPadding(0, 0, FormattingUtils.dpToPx(getContext(), 8), 0);                  if (entry.isRevoked() || entry.isExpired()) { -                    uidView.setTextColor(getContext().getResources().getColor(R.color.bg_gray)); +                    uidView.setTextColor(getContext().getResources().getColor(R.color.key_flag_gray));                  } else { -                    uidView.setTextColor(getContext().getResources().getColor(R.color.black)); +                    uidView.setTextColor(FormattingUtils.getColorFromAttr(getContext(), R.attr.colorText));                  }                  holder.userIdsList.addView(uidView); @@ -258,9 +258,9 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {                      emailView.setText(highlighter.highlight(email));                      if (entry.isRevoked() || entry.isExpired()) { -                        emailView.setTextColor(getContext().getResources().getColor(R.color.bg_gray)); +                        emailView.setTextColor(getContext().getResources().getColor(R.color.key_flag_gray));                      } else { -                        emailView.setTextColor(getContext().getResources().getColor(R.color.black)); +                        emailView.setTextColor(FormattingUtils.getColorFromAttr(getContext(), R.attr.colorText));                      }                      holder.userIdsList.addView(emailView); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyAdapter.java index fbab1959a..aba1eb0d8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyAdapter.java @@ -42,6 +42,7 @@ import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing;  import org.sufficientlysecure.keychain.pgp.KeyRing;  import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;  import org.sufficientlysecure.keychain.ui.util.Highlighter; +import org.sufficientlysecure.keychain.ui.util.FormattingUtils;  import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;  import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; @@ -49,6 +50,7 @@ public class KeyAdapter extends CursorAdapter {      protected String mQuery;      protected LayoutInflater mInflater; +    protected Context mContext;      // These are the rows that we will retrieve.      public static final String[] PROJECTION = new String[]{ @@ -77,6 +79,7 @@ public class KeyAdapter extends CursorAdapter {      public KeyAdapter(Context context, Cursor c, int flags) {          super(context, c, flags); +        mContext = context;          mInflater = LayoutInflater.from(context);      } @@ -138,26 +141,26 @@ public class KeyAdapter extends CursorAdapter {                  // Note: order is important!                  if (item.mIsRevoked) {                      KeyFormattingUtils -                            .setStatusImage(context, mStatus, null, State.REVOKED, R.color.bg_gray); +                            .setStatusImage(context, mStatus, null, State.REVOKED, R.color.key_flag_gray);                      mStatus.setVisibility(View.VISIBLE);                      mSlinger.setVisibility(View.GONE); -                    textColor = R.color.bg_gray; +                    textColor = context.getResources().getColor(R.color.key_flag_gray);                  } else if (item.mIsExpired) { -                    KeyFormattingUtils.setStatusImage(context, mStatus, null, State.EXPIRED, R.color.bg_gray); +                    KeyFormattingUtils.setStatusImage(context, mStatus, null, State.EXPIRED, R.color.key_flag_gray);                      mStatus.setVisibility(View.VISIBLE);                      mSlinger.setVisibility(View.GONE); -                    textColor = R.color.bg_gray; +                    textColor = context.getResources().getColor(R.color.key_flag_gray);                  } else if (item.mIsSecret) {                      mStatus.setVisibility(View.GONE);                      if (mSlingerButton.hasOnClickListeners()) {                          mSlingerButton.setColorFilter( -                                context.getResources().getColor(R.color.tertiary_text_light), +                                FormattingUtils.getColorFromAttr(context, R.attr.colorTertiaryText),                                  PorterDuff.Mode.SRC_IN);                          mSlinger.setVisibility(View.VISIBLE);                      } else {                          mSlinger.setVisibility(View.GONE);                      } -                    textColor = R.color.black; +                    textColor = FormattingUtils.getColorFromAttr(context, R.attr.colorText);                  } else {                      // this is a public key - show if it's verified                      if (item.mIsVerified) { @@ -168,15 +171,15 @@ public class KeyAdapter extends CursorAdapter {                          mStatus.setVisibility(View.VISIBLE);                      }                      mSlinger.setVisibility(View.GONE); -                    textColor = R.color.black; +                    textColor = FormattingUtils.getColorFromAttr(context, R.attr.colorText);                  }                  if (!enabled) { -                    textColor = R.color.bg_gray; +                    textColor = context.getResources().getColor(R.color.key_flag_gray);                  } -                mMainUserId.setTextColor(context.getResources().getColor(textColor)); -                mMainUserIdRest.setTextColor(context.getResources().getColor(textColor)); +                mMainUserId.setTextColor(textColor); +                mMainUserIdRest.setTextColor(textColor);                  if (item.mHasDuplicate) {                      String dateTime = DateUtils.formatDateTime(context, @@ -187,7 +190,7 @@ public class KeyAdapter extends CursorAdapter {                      mCreationDate.setText(context.getString(R.string.label_key_created,                              dateTime)); -                    mCreationDate.setTextColor(context.getResources().getColor(textColor)); +                    mCreationDate.setTextColor(textColor);                      mCreationDate.setVisibility(View.VISIBLE);                  } else {                      mCreationDate.setVisibility(View.GONE); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java index a6cb52977..4ea651bb5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java @@ -149,11 +149,11 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {          boolean enabled;          if (cursor.getInt(mIndexIsRevoked) != 0) {              h.statusIcon.setVisibility(View.VISIBLE); -            KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, null, State.REVOKED, R.color.bg_gray); +            KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, null, State.REVOKED, R.color.key_flag_gray);              enabled = false;          } else if (cursor.getInt(mIndexIsExpiry) != 0) {              h.statusIcon.setVisibility(View.VISIBLE); -            KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, null, State.EXPIRED, R.color.bg_gray); +            KeyFormattingUtils.setStatusImage(mContext, h.statusIcon, null, State.EXPIRED, R.color.key_flag_gray);              enabled = false;          } else {              h.statusIcon.setVisibility(View.GONE); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java index 87539ea05..24f5f04a1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java @@ -284,27 +284,27 @@ public class SubkeysAdapter extends CursorAdapter {              vStatus.setVisibility(View.VISIBLE);              vCertifyIcon.setColorFilter( -                    mContext.getResources().getColor(R.color.bg_gray), +                    mContext.getResources().getColor(R.color.key_flag_gray),                      PorterDuff.Mode.SRC_IN);              vSignIcon.setColorFilter( -                    mContext.getResources().getColor(R.color.bg_gray), +                    mContext.getResources().getColor(R.color.key_flag_gray),                      PorterDuff.Mode.SRC_IN);              vEncryptIcon.setColorFilter( -                    mContext.getResources().getColor(R.color.bg_gray), +                    mContext.getResources().getColor(R.color.key_flag_gray),                      PorterDuff.Mode.SRC_IN);              vAuthenticateIcon.setColorFilter( -                    mContext.getResources().getColor(R.color.bg_gray), +                    mContext.getResources().getColor(R.color.key_flag_gray),                      PorterDuff.Mode.SRC_IN);              if (isRevoked) {                  vStatus.setImageResource(R.drawable.status_signature_revoked_cutout_24dp);                  vStatus.setColorFilter( -                        mContext.getResources().getColor(R.color.bg_gray), +                        mContext.getResources().getColor(R.color.key_flag_gray),                          PorterDuff.Mode.SRC_IN);              } else if (isExpired) {                  vStatus.setImageResource(R.drawable.status_signature_expired_cutout_24dp);                  vStatus.setColorFilter( -                        mContext.getResources().getColor(R.color.bg_gray), +                        mContext.getResources().getColor(R.color.key_flag_gray),                          PorterDuff.Mode.SRC_IN);              }          } else { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java index d1103ac1f..e2c6b0928 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java @@ -128,7 +128,7 @@ public class UserIdsAdapter extends UserAttributesAdapter {          if (isRevoked) {              // set revocation icon (can this even be primary?) -            KeyFormattingUtils.setStatusImage(mContext, vVerified, null, State.REVOKED, R.color.bg_gray); +            KeyFormattingUtils.setStatusImage(mContext, vVerified, null, State.REVOKED, R.color.key_flag_gray);              // disable revoked user ids              vName.setEnabled(false); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseActivity.java index 9529d8689..66b784f9b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseActivity.java @@ -18,6 +18,7 @@  package org.sufficientlysecure.keychain.ui.base;  import android.app.Activity; +import android.content.Intent;  import android.os.Bundle;  import android.support.v7.app.ActionBar;  import android.support.v7.app.AppCompatActivity; @@ -29,6 +30,7 @@ import android.view.ViewGroup;  import android.widget.TextView;  import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.ui.util.ThemeChanger;  /**   * Setups Toolbar @@ -36,14 +38,28 @@ import org.sufficientlysecure.keychain.R;  public abstract class BaseActivity extends AppCompatActivity {      protected Toolbar mToolbar;      protected View mStatusBar; +    protected ThemeChanger mThemeChanger;      @Override      protected void onCreate(Bundle savedInstanceState) { +        mThemeChanger = new ThemeChanger(this); +        mThemeChanger.changeTheme();          super.onCreate(savedInstanceState);          initLayout();          initToolbar();      } +    @Override +    protected void onResume() { +        super.onResume(); + +        if (mThemeChanger.changeTheme()) { +            Intent intent = getIntent(); +            finish(); +            startActivity(intent); +        } +    } +      protected void initLayout() {      } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java index 8a5cc0656..840b95a3c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/CustomAlertDialogBuilder.java @@ -28,5 +28,4 @@ public class CustomAlertDialogBuilder extends AlertDialog.Builder {      public CustomAlertDialogBuilder(Context context) {          super(context);      } -  } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/OrbotStartDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/OrbotStartDialogFragment.java index f88cf603a..d1d22b6d7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/OrbotStartDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/OrbotStartDialogFragment.java @@ -30,6 +30,7 @@ import android.view.ContextThemeWrapper;  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.ui.util.ThemeChanger;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.orbot.OrbotHelper; @@ -67,11 +68,7 @@ public class OrbotStartDialogFragment extends DialogFragment {          int middleButton = getArguments().getInt(ARG_MIDDLE_BUTTON);          final Activity activity = getActivity(); -        // if the dialog is displayed from the application class, design is missing. -        // hack to get holo design (which is not automatically applied due to activity's -        // Theme.NoDisplay) -        ContextThemeWrapper theme = new ContextThemeWrapper(activity, -                R.style.Theme_AppCompat_Light_Dialog); +        ContextThemeWrapper theme = ThemeChanger.getDialogThemeWrapper(activity);          CustomAlertDialogBuilder builder = new CustomAlertDialogBuilder(theme);          builder.setTitle(title).setMessage(message); @@ -126,4 +123,4 @@ public class OrbotStartDialogFragment extends DialogFragment {          return builder.show();      } -}
\ No newline at end of file +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java index 52a90b323..764291dd0 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/ProgressDialogFragment.java @@ -35,6 +35,7 @@ import android.widget.Button;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.service.KeychainService; +import org.sufficientlysecure.keychain.ui.util.ThemeChanger;  /**   * meant to be used @@ -98,10 +99,7 @@ public class ProgressDialogFragment extends DialogFragment {      public Dialog onCreateDialog(Bundle savedInstanceState) {          final Activity activity = getActivity(); -        // if the progress dialog is displayed from the application class, design is missing -        // hack to get holo design (which is not automatically applied due to activity's Theme.NoDisplay -        ContextThemeWrapper context = new ContextThemeWrapper(activity, -                R.style.Theme_AppCompat_Light); +        ContextThemeWrapper context = ThemeChanger.getDialogThemeWrapper(activity);          ProgressDialog dialog = new ProgressDialog(context);          dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java index eb5c3df45..902a7ec56 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/FormattingUtils.java @@ -18,9 +18,11 @@  package org.sufficientlysecure.keychain.ui.util;  import android.content.Context; +import android.content.res.Resources.Theme;  import android.text.SpannableStringBuilder;  import android.text.Spanned;  import android.text.style.StrikethroughSpan; +import android.util.TypedValue;  public class FormattingUtils { @@ -32,4 +34,10 @@ public class FormattingUtils {          return (int) ((px / context.getResources().getDisplayMetrics().density) + 0.5f);      } +    public static int getColorFromAttr(Context context, int attr) { +        TypedValue typedValue = new TypedValue(); +        Theme theme = context.getTheme(); +        theme.resolveAttribute(attr, typedValue, true); +        return typedValue.data; +    }  } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Highlighter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Highlighter.java index 69338aa3e..ac34d5526 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Highlighter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Highlighter.java @@ -22,6 +22,7 @@ import android.text.Spannable;  import android.text.style.ForegroundColorSpan;  import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.ui.util.FormattingUtils;  import java.util.regex.Matcher;  import java.util.regex.Pattern; @@ -44,9 +45,12 @@ public class Highlighter {          Pattern pattern = Pattern.compile("(?i)(" + mQuery.trim().replaceAll("\\s+", "|") + ")");          Matcher matcher = pattern.matcher(text); + +        int colorEmphasis = FormattingUtils.getColorFromAttr(mContext, R.attr.colorEmphasis); +          while (matcher.find()) {              highlight.setSpan( -                    new ForegroundColorSpan(mContext.getResources().getColor(R.color.emphasis)), +                    new ForegroundColorSpan(colorEmphasis),                      matcher.start(),                      matcher.end(),                      Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/InstallDialogFragmentHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/InstallDialogFragmentHelper.java index 5ddb013db..b2213ed10 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/InstallDialogFragmentHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/InstallDialogFragmentHelper.java @@ -31,6 +31,7 @@ import android.view.ContextThemeWrapper;  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder; +import org.sufficientlysecure.keychain.ui.util.ThemeChanger;  import org.sufficientlysecure.keychain.util.Log;  public class InstallDialogFragmentHelper { @@ -65,11 +66,7 @@ public class InstallDialogFragmentHelper {          final String installPath = args.getString(ARG_INSTALL_PATH);          final boolean useMiddleButton = args.getBoolean(ARG_USE_MIDDLE_BUTTON); -        // if the dialog is displayed from the application class, design is missing. -        // hack to get holo design (which is not automatically applied due to activity's -        // Theme.NoDisplay) -        ContextThemeWrapper theme = new ContextThemeWrapper(activity, -                R.style.Theme_AppCompat_Light_Dialog); +        ContextThemeWrapper theme = ThemeChanger.getDialogThemeWrapper(activity);          CustomAlertDialogBuilder builder = new CustomAlertDialogBuilder(theme);          builder.setTitle(title).setMessage(message); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java index a3cd63d13..224e0085b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java @@ -40,6 +40,7 @@ import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;  import org.sufficientlysecure.keychain.pgp.KeyRing;  import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Algorithm;  import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Curve; +import org.sufficientlysecure.keychain.ui.util.FormattingUtils;  import org.sufficientlysecure.keychain.util.Log;  import java.nio.ByteBuffer; @@ -449,11 +450,11 @@ public class KeyFormattingUtils {              if (signatureResult != null && signatureResult.isSignatureOnly()) {                  encIcon = R.drawable.status_lock_open_24dp;                  encText = R.string.decrypt_result_not_encrypted; -                encColor = R.color.android_red_light; +                encColor = R.color.key_flag_red;              } else {                  encIcon = R.drawable.status_lock_closed_24dp;                  encText = R.string.decrypt_result_encrypted; -                encColor = R.color.android_green_light; +                encColor = R.color.key_flag_green;              }              int encColorRes = context.getResources().getColor(encColor); @@ -470,7 +471,7 @@ public class KeyFormattingUtils {              sigText = R.string.decrypt_result_no_signature;              sigIcon = R.drawable.status_signature_invalid_cutout_24dp; -            sigColor = R.color.bg_gray; +            sigColor = R.color.key_flag_gray;              // won't be used, but makes compiler happy              sigActionText = 0; @@ -481,7 +482,7 @@ public class KeyFormattingUtils {              case OpenPgpSignatureResult.SIGNATURE_SUCCESS_CERTIFIED: {                  sigText = R.string.decrypt_result_signature_certified;                  sigIcon = R.drawable.status_signature_verified_cutout_24dp; -                sigColor = R.color.android_green_light; +                sigColor = R.color.key_flag_green;                  sigActionText = R.string.decrypt_result_action_show;                  sigActionIcon = R.drawable.ic_vpn_key_grey_24dp; @@ -491,7 +492,7 @@ public class KeyFormattingUtils {              case OpenPgpSignatureResult.SIGNATURE_SUCCESS_UNCERTIFIED: {                  sigText = R.string.decrypt_result_signature_uncertified;                  sigIcon = R.drawable.status_signature_unverified_cutout_24dp; -                sigColor = R.color.android_orange_light; +                sigColor = R.color.key_flag_orange;                  sigActionText = R.string.decrypt_result_action_show;                  sigActionIcon = R.drawable.ic_vpn_key_grey_24dp; @@ -501,7 +502,7 @@ public class KeyFormattingUtils {              case OpenPgpSignatureResult.SIGNATURE_KEY_REVOKED: {                  sigText = R.string.decrypt_result_signature_revoked_key;                  sigIcon = R.drawable.status_signature_revoked_cutout_24dp; -                sigColor = R.color.android_red_light; +                sigColor = R.color.key_flag_red;                  sigActionText = R.string.decrypt_result_action_show;                  sigActionIcon = R.drawable.ic_vpn_key_grey_24dp; @@ -511,7 +512,7 @@ public class KeyFormattingUtils {              case OpenPgpSignatureResult.SIGNATURE_KEY_EXPIRED: {                  sigText = R.string.decrypt_result_signature_expired_key;                  sigIcon = R.drawable.status_signature_expired_cutout_24dp; -                sigColor = R.color.android_red_light; +                sigColor = R.color.key_flag_red;                  sigActionText = R.string.decrypt_result_action_show;                  sigActionIcon = R.drawable.ic_vpn_key_grey_24dp; @@ -521,7 +522,7 @@ public class KeyFormattingUtils {              case OpenPgpSignatureResult.SIGNATURE_KEY_MISSING: {                  sigText = R.string.decrypt_result_signature_missing_key;                  sigIcon = R.drawable.status_signature_unknown_cutout_24dp; -                sigColor = R.color.android_red_light; +                sigColor = R.color.key_flag_red;                  sigActionText = R.string.decrypt_result_action_Lookup;                  sigActionIcon = R.drawable.ic_file_download_grey_24dp; @@ -532,7 +533,7 @@ public class KeyFormattingUtils {              case OpenPgpSignatureResult.SIGNATURE_ERROR: {                  sigText = R.string.decrypt_result_invalid_signature;                  sigIcon = R.drawable.status_signature_invalid_cutout_24dp; -                sigColor = R.color.android_red_light; +                sigColor = R.color.key_flag_red;                  sigActionText = R.string.decrypt_result_action_show;                  sigActionIcon = R.drawable.ic_vpn_key_grey_24dp; @@ -595,7 +596,7 @@ public class KeyFormattingUtils {                              context.getResources().getDrawable(R.drawable.status_signature_verified_cutout_24dp));                  }                  if (color == KeyFormattingUtils.DEFAULT_COLOR) { -                    color = R.color.android_green_light; +                    color = R.color.key_flag_green;                  }                  statusIcon.setColorFilter(context.getResources().getColor(color),                          PorterDuff.Mode.SRC_IN); @@ -608,7 +609,7 @@ public class KeyFormattingUtils {                  statusIcon.setImageDrawable(                          context.getResources().getDrawable(R.drawable.status_lock_closed_24dp));                  if (color == KeyFormattingUtils.DEFAULT_COLOR) { -                    color = R.color.android_green_light; +                    color = R.color.key_flag_green;                  }                  statusIcon.setColorFilter(context.getResources().getColor(color),                          PorterDuff.Mode.SRC_IN); @@ -627,7 +628,7 @@ public class KeyFormattingUtils {                              context.getResources().getDrawable(R.drawable.status_signature_unverified_cutout_24dp));                  }                  if (color == KeyFormattingUtils.DEFAULT_COLOR) { -                    color = R.color.android_orange_light; +                    color = R.color.key_flag_orange;                  }                  statusIcon.setColorFilter(context.getResources().getColor(color),                          PorterDuff.Mode.SRC_IN); @@ -640,7 +641,7 @@ public class KeyFormattingUtils {                  statusIcon.setImageDrawable(                          context.getResources().getDrawable(R.drawable.status_signature_unknown_cutout_24dp));                  if (color == KeyFormattingUtils.DEFAULT_COLOR) { -                    color = R.color.android_red_light; +                    color = R.color.key_flag_red;                  }                  statusIcon.setColorFilter(context.getResources().getColor(color),                          PorterDuff.Mode.SRC_IN); @@ -659,7 +660,7 @@ public class KeyFormattingUtils {                              context.getResources().getDrawable(R.drawable.status_signature_revoked_cutout_24dp));                  }                  if (color == KeyFormattingUtils.DEFAULT_COLOR) { -                    color = R.color.android_red_light; +                    color = R.color.key_flag_red;                  }                  statusIcon.setColorFilter(context.getResources().getColor(color),                          PorterDuff.Mode.SRC_IN); @@ -677,7 +678,7 @@ public class KeyFormattingUtils {                              context.getResources().getDrawable(R.drawable.status_signature_expired_cutout_24dp));                  }                  if (color == KeyFormattingUtils.DEFAULT_COLOR) { -                    color = R.color.android_red_light; +                    color = R.color.key_flag_red;                  }                  statusIcon.setColorFilter(context.getResources().getColor(color),                          PorterDuff.Mode.SRC_IN); @@ -690,7 +691,7 @@ public class KeyFormattingUtils {                  statusIcon.setImageDrawable(                          context.getResources().getDrawable(R.drawable.status_lock_open_24dp));                  if (color == KeyFormattingUtils.DEFAULT_COLOR) { -                    color = R.color.android_red_light; +                    color = R.color.key_flag_red;                  }                  statusIcon.setColorFilter(context.getResources().getColor(color),                          PorterDuff.Mode.SRC_IN); @@ -703,7 +704,7 @@ public class KeyFormattingUtils {                  statusIcon.setImageDrawable(                          context.getResources().getDrawable(R.drawable.status_signature_unknown_cutout_24dp));                  if (color == KeyFormattingUtils.DEFAULT_COLOR) { -                    color = R.color.android_red_light; +                    color = R.color.key_flag_red;                  }                  statusIcon.setColorFilter(context.getResources().getColor(color),                          PorterDuff.Mode.SRC_IN); @@ -716,7 +717,7 @@ public class KeyFormattingUtils {                  statusIcon.setImageDrawable(                          context.getResources().getDrawable(R.drawable.status_signature_invalid_cutout_24dp));                  if (color == KeyFormattingUtils.DEFAULT_COLOR) { -                    color = R.color.android_red_light; +                    color = R.color.key_flag_red;                  }                  statusIcon.setColorFilter(context.getResources().getColor(color),                          PorterDuff.Mode.SRC_IN); @@ -730,7 +731,7 @@ public class KeyFormattingUtils {                  statusIcon.setImageDrawable(                          context.getResources().getDrawable(R.drawable.status_signature_invalid_cutout_24dp));                  if (color == KeyFormattingUtils.DEFAULT_COLOR) { -                    color = R.color.bg_gray; +                    color = R.color.key_flag_gray;                  }                  statusIcon.setColorFilter(context.getResources().getColor(color),                          PorterDuff.Mode.SRC_IN); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/ThemeChanger.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/ThemeChanger.java new file mode 100644 index 000000000..f53e43528 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/ThemeChanger.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2015 Thialfihar <thi@thialfihar.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +package org.sufficientlysecure.keychain.ui.util; + +import android.content.Context; +import android.view.ContextThemeWrapper; + +import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.util.Preferences; + +public class ThemeChanger { +    private Context mContext; +    private Preferences mPreferences; +    private String mCurrentTheme = null; + +    static public ContextThemeWrapper getDialogThemeWrapper(Context context) { +        Preferences preferences = Preferences.getPreferences(context); + +        // if the dialog is displayed from the application class, design is missing. +        // hack to get holo design (which is not automatically applied due to activity's +        // Theme.NoDisplay) +        if (Constants.Pref.Theme.DARK.equals(preferences.getTheme())) { +            return new ContextThemeWrapper(context, R.style.Theme_AppCompat_Dialog); +        } else { +            return new ContextThemeWrapper(context, R.style.Theme_AppCompat_Light_Dialog); +        } +    } + +    public ThemeChanger(Context context) { +        mContext = context; +        mPreferences = Preferences.getPreferences(mContext); +    } + +    /** +     * Apply the theme set in preferences if it isn't equal to mCurrentTheme +     * anymore or mCurrentTheme hasn't been set yet. +     * If a new theme is applied in this method, then return true, so +     * the caller can re-create the activity, if need be. +     */ +    public boolean changeTheme() { +        String newTheme = mPreferences.getTheme(); +        if (mCurrentTheme != null && mCurrentTheme.equals(newTheme)) { +            return false; +        } + +        int themeId = R.style.LightTheme; +        if (Constants.Pref.Theme.DARK.equals(newTheme)) { +            themeId = R.style.DarkTheme; +        } + +        ContextThemeWrapper w = new ContextThemeWrapper(mContext, themeId); +        mContext.getTheme().setTo(w.getTheme()); +        mCurrentTheme = newTheme; + +        return true; +    } +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PasswordStrengthView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PasswordStrengthView.java index 30bdfb92a..a7ead8039 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PasswordStrengthView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/PasswordStrengthView.java @@ -99,9 +99,9 @@ public class PasswordStrengthView extends View {      public PasswordStrengthView(Context context, AttributeSet attrs) {          super(context, attrs); -        int COLOR_FAIL = getResources().getColor(R.color.android_red_light); -        int COLOR_WEAK = getResources().getColor(R.color.android_orange_light); -        int COLOR_STRONG = getResources().getColor(R.color.android_green_light); +        int COLOR_FAIL = getResources().getColor(R.color.password_strength_low); +        int COLOR_WEAK = getResources().getColor(R.color.password_strength_medium); +        int COLOR_STRONG = getResources().getColor(R.color.password_strength_high);          TypedArray style = context.getTheme().obtainStyledAttributes(                  attrs, diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java index c13c07503..0596b0079 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java @@ -220,6 +220,15 @@ public class Preferences {          return mSharedPreferences.getBoolean(Pref.TEXT_USE_COMPRESSION, true);      } +    public String getTheme() { +        return mSharedPreferences.getString(Pref.THEME, Pref.Theme.LIGHT); +    } + +    public void setTheme(String value) { +        SharedPreferences.Editor editor = mSharedPreferences.edit(); +        editor.putString(Constants.Pref.THEME, value); +        editor.commit(); +    }      public void setUseArmor(boolean useArmor) {          SharedPreferences.Editor editor = mSharedPreferences.edit(); @@ -347,7 +356,7 @@ public class Preferences {          }      } -    public void updatePreferences() { +    public void upgradePreferences() {          if (mSharedPreferences.getInt(Constants.Pref.PREF_DEFAULT_VERSION, 0) !=                  Constants.Defaults.PREF_VERSION) {              switch (mSharedPreferences.getInt(Constants.Pref.PREF_DEFAULT_VERSION, 0)) { @@ -381,6 +390,10 @@ public class Preferences {                  }                  // fall through                  case 4: { +                    setTheme(Constants.Pref.Theme.DEFAULT); +                } +                // fall through +                case 5: {                  }              } diff --git a/OpenKeychain/src/main/res/drawable/cardview_header.xml b/OpenKeychain/src/main/res/drawable/cardview_header.xml index 9bab96ea9..ff08f9fe3 100644 --- a/OpenKeychain/src/main/res/drawable/cardview_header.xml +++ b/OpenKeychain/src/main/res/drawable/cardview_header.xml @@ -6,6 +6,6 @@          android:height="1dp"          android:width="1000dp" /> -    <solid android:color="@color/bg_gray" /> +    <solid android:color="?attr/colorCardViewHeaderDivider" /> -</shape>
\ No newline at end of file +</shape> diff --git a/OpenKeychain/src/main/res/drawable/fab_label_background.xml b/OpenKeychain/src/main/res/drawable/fab_label_background.xml index 0d8c05b11..aa5e0a88e 100644 --- a/OpenKeychain/src/main/res/drawable/fab_label_background.xml +++ b/OpenKeychain/src/main/res/drawable/fab_label_background.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8"?>  <shape xmlns:android="http://schemas.android.com/apk/res/android"> -    <solid android:color="@color/black_semi_transparent"/> +    <solid android:color="?attr/colorFabBackground"/>      <padding          android:left="16dp"          android:top="4dp" @@ -8,4 +8,4 @@          android:bottom="4dp"/>      <corners          android:radius="2dp"/> -</shape>
\ No newline at end of file +</shape> diff --git a/OpenKeychain/src/main/res/drawable/section_header.xml b/OpenKeychain/src/main/res/drawable/section_header.xml index 04d3d4957..4bee8049b 100644 --- a/OpenKeychain/src/main/res/drawable/section_header.xml +++ b/OpenKeychain/src/main/res/drawable/section_header.xml @@ -6,6 +6,6 @@          android:height="2dp"          android:width="1000dp" /> -    <solid android:color="@color/header_text" /> +    <solid android:color="?attr/colorHeaderText" /> -</shape>
\ No newline at end of file +</shape> diff --git a/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml b/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml deleted file mode 100644 index ed856f281..000000000 --- a/OpenKeychain/src/main/res/drawable/selector_transparent_button.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<!-- Borderless Buttons for API < 11, see http://stackoverflow.com/a/14663170 --> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> -    <item android:state_pressed="true" android:drawable="@color/bg_gray" /> -    <item android:drawable="@android:color/transparent" /> -</selector>
\ No newline at end of file diff --git a/OpenKeychain/src/main/res/layout/add_user_id_dialog.xml b/OpenKeychain/src/main/res/layout/add_user_id_dialog.xml index ffb7493f6..b3969a2bd 100644 --- a/OpenKeychain/src/main/res/layout/add_user_id_dialog.xml +++ b/OpenKeychain/src/main/res/layout/add_user_id_dialog.xml @@ -29,7 +29,7 @@          android:id="@+id/add_user_id_comment"          android:layout_width="match_parent"          android:layout_height="wrap_content" -        android:textColor="@color/tertiary_text_light" +        android:textColor="?attr/colorTertiaryText"          android:singleLine="true"          android:lines="1"          android:maxLines="1" diff --git a/OpenKeychain/src/main/res/layout/api_app_settings_activity.xml b/OpenKeychain/src/main/res/layout/api_app_settings_activity.xml index c3f6e33cb..ea20b77b3 100644 --- a/OpenKeychain/src/main/res/layout/api_app_settings_activity.xml +++ b/OpenKeychain/src/main/res/layout/api_app_settings_activity.xml @@ -117,7 +117,7 @@          android:layout_height="wrap_content"          android:elevation="4dp"          fab:fab_icon="@drawable/ic_play_arrow_white_24dp" -        fab:fab_colorNormal="@color/fab" -        fab:fab_colorPressed="@color/fab_pressed" /> +        fab:fab_colorNormal="?attr/colorFab" +        fab:fab_colorPressed="?attr/colorFabPressed" /> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/certify_fingerprint_fragment.xml b/OpenKeychain/src/main/res/layout/certify_fingerprint_fragment.xml index 9b6b35012..bd7b00823 100644 --- a/OpenKeychain/src/main/res/layout/certify_fingerprint_fragment.xml +++ b/OpenKeychain/src/main/res/layout/certify_fingerprint_fragment.xml @@ -28,7 +28,7 @@                  android:id="@+id/certify_fingerprint_card"                  android:layout_width="match_parent"                  android:layout_height="wrap_content" -                app:cardBackgroundColor="@android:color/white" +                app:cardBackgroundColor="?attr/colorCardViewBackground"                  app:cardUseCompatPadding="true"                  app:cardCornerRadius="4dp"                  android:layout_gravity="top"> @@ -151,4 +151,4 @@ -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/create_key_email_fragment.xml b/OpenKeychain/src/main/res/layout/create_key_email_fragment.xml index 17cfe54ac..d4ece38ac 100644 --- a/OpenKeychain/src/main/res/layout/create_key_email_fragment.xml +++ b/OpenKeychain/src/main/res/layout/create_key_email_fragment.xml @@ -51,7 +51,7 @@          android:layout_alignParentBottom="true"          android:layout_alignParentLeft="true"          android:layout_alignParentStart="true" -        android:background="@color/holo_gray_bright" +        android:background="?attr/colorButtonRow"          android:id="@+id/create_key_buttons">          <TextView @@ -88,4 +88,4 @@              android:clickable="true"              style="?android:attr/borderlessButtonStyle" />      </LinearLayout> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/create_key_final_fragment.xml b/OpenKeychain/src/main/res/layout/create_key_final_fragment.xml index e085fcb09..9a6c33f82 100644 --- a/OpenKeychain/src/main/res/layout/create_key_final_fragment.xml +++ b/OpenKeychain/src/main/res/layout/create_key_final_fragment.xml @@ -28,7 +28,7 @@                  android:layout_height="wrap_content"                  android:layout_marginBottom="2dp"                  android:text="@string/label_name" -                android:textColor="@color/tertiary_text_light" +                android:textColor="?attr/colorTertiaryText"                  android:textAppearance="?android:attr/textAppearanceSmall" />              <TextView @@ -44,7 +44,7 @@                  android:layout_height="wrap_content"                  android:layout_marginBottom="2dp"                  android:text="@string/label_email" -                android:textColor="@color/tertiary_text_light" +                android:textColor="?attr/colorTertiaryText"                  android:textAppearance="?android:attr/textAppearanceSmall" />              <TextView @@ -87,7 +87,7 @@                      android:layout_height="wrap_content"                      android:layout_weight="1"                      android:text="@string/create_key_rsa" -                    android:textColor="@color/android_green_light" +                    android:textColor="?attr/colorPrimary"                      android:textAppearance="?android:attr/textAppearanceMedium"                      android:minHeight="?android:attr/listPreferredItemHeight"                      android:clickable="true" @@ -129,7 +129,7 @@                  android:layout_marginTop="16dp"                  android:layout_marginBottom="8dp"                  android:text="@string/create_key_final_robot_text" -                android:textColor="@color/android_green_light" +                android:textColor="?attr/colorPrimary"                  android:textAppearance="?android:attr/textAppearanceMedium"                  android:drawableLeft="@drawable/create_key_robot"                  android:drawablePadding="8dp" /> @@ -144,7 +144,7 @@          android:layout_alignParentBottom="true"          android:layout_alignParentLeft="true"          android:layout_alignParentStart="true" -        android:background="@color/holo_gray_bright" +        android:background="?attr/colorButtonRow"          android:id="@+id/create_key_buttons">          <TextView @@ -182,4 +182,4 @@              style="?android:attr/borderlessButtonStyle" />      </LinearLayout> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/create_key_name_fragment.xml b/OpenKeychain/src/main/res/layout/create_key_name_fragment.xml index a2f81f74c..7b8ba3fc1 100644 --- a/OpenKeychain/src/main/res/layout/create_key_name_fragment.xml +++ b/OpenKeychain/src/main/res/layout/create_key_name_fragment.xml @@ -45,7 +45,7 @@          android:layout_alignParentBottom="true"          android:layout_alignParentLeft="true"          android:layout_alignParentStart="true" -        android:background="@color/holo_gray_bright" +        android:background="?attr/colorButtonRow"          android:id="@+id/create_key_buttons">          <TextView @@ -82,4 +82,4 @@              android:clickable="true"              style="?android:attr/borderlessButtonStyle" />      </LinearLayout> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/create_key_passphrase_fragment.xml b/OpenKeychain/src/main/res/layout/create_key_passphrase_fragment.xml index abfb2861b..9d10bbe70 100644 --- a/OpenKeychain/src/main/res/layout/create_key_passphrase_fragment.xml +++ b/OpenKeychain/src/main/res/layout/create_key_passphrase_fragment.xml @@ -64,7 +64,7 @@          android:layout_alignParentBottom="true"          android:layout_alignParentLeft="true"          android:layout_alignParentStart="true" -        android:background="@color/holo_gray_bright" +        android:background="?attr/colorButtonRow"          android:id="@+id/create_key_buttons">          <TextView @@ -101,4 +101,4 @@              android:clickable="true"              style="?android:attr/borderlessButtonStyle" />      </LinearLayout> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/create_key_start_fragment.xml b/OpenKeychain/src/main/res/layout/create_key_start_fragment.xml index 2db147475..20c434c02 100644 --- a/OpenKeychain/src/main/res/layout/create_key_start_fragment.xml +++ b/OpenKeychain/src/main/res/layout/create_key_start_fragment.xml @@ -30,7 +30,7 @@          android:layout_alignParentBottom="true"          android:layout_alignParentLeft="true"          android:layout_alignParentStart="true" -        android:background="@color/holo_gray_bright" +        android:background="?attr/colorButtonRow"          android:id="@+id/create_key_buttons">          <TextView diff --git a/OpenKeychain/src/main/res/layout/create_yubi_key_blank_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_blank_fragment.xml index 864e3aecf..ca203d0b5 100644 --- a/OpenKeychain/src/main/res/layout/create_yubi_key_blank_fragment.xml +++ b/OpenKeychain/src/main/res/layout/create_yubi_key_blank_fragment.xml @@ -34,7 +34,7 @@          android:layout_alignParentBottom="true"          android:layout_alignParentLeft="true"          android:layout_alignParentStart="true" -        android:background="@color/holo_gray_bright" +        android:background="?attr/colorButtonRow"          android:id="@+id/create_key_buttons">          <TextView @@ -73,4 +73,4 @@              style="?android:attr/borderlessButtonStyle"              android:layout_gravity="center_vertical" />      </LinearLayout> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/create_yubi_key_import_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_import_fragment.xml index e70188e49..838ee37b4 100644 --- a/OpenKeychain/src/main/res/layout/create_yubi_key_import_fragment.xml +++ b/OpenKeychain/src/main/res/layout/create_yubi_key_import_fragment.xml @@ -84,7 +84,7 @@          android:layout_alignParentBottom="true"          android:layout_alignParentLeft="true"          android:layout_alignParentStart="true" -        android:background="@color/holo_gray_bright" +        android:background="?attr/colorButtonRow"          android:id="@+id/create_key_buttons">          <TextView @@ -123,4 +123,4 @@      </LinearLayout> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/create_yubi_key_pin_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_pin_fragment.xml index b139a1d61..393ec76d4 100644 --- a/OpenKeychain/src/main/res/layout/create_yubi_key_pin_fragment.xml +++ b/OpenKeychain/src/main/res/layout/create_yubi_key_pin_fragment.xml @@ -69,7 +69,7 @@          android:layout_alignParentBottom="true"          android:layout_alignParentLeft="true"          android:layout_alignParentStart="true" -        android:background="@color/holo_gray_bright" +        android:background="?attr/colorButtonRow"          android:id="@+id/create_key_buttons">          <TextView @@ -106,4 +106,4 @@              android:clickable="true"              style="?android:attr/borderlessButtonStyle" />      </LinearLayout> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/create_yubi_key_pin_repeat_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_pin_repeat_fragment.xml index bd32130ad..d233398ca 100644 --- a/OpenKeychain/src/main/res/layout/create_yubi_key_pin_repeat_fragment.xml +++ b/OpenKeychain/src/main/res/layout/create_yubi_key_pin_repeat_fragment.xml @@ -70,7 +70,7 @@          android:layout_alignParentBottom="true"          android:layout_alignParentLeft="true"          android:layout_alignParentStart="true" -        android:background="@color/holo_gray_bright" +        android:background="?attr/colorButtonRow"          android:orientation="horizontal">          <TextView @@ -107,4 +107,4 @@              android:textAllCaps="true"              android:textAppearance="?android:attr/textAppearanceMedium" />      </LinearLayout> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/create_yubi_key_wait_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_wait_fragment.xml index 4e4b53118..a000dc82e 100644 --- a/OpenKeychain/src/main/res/layout/create_yubi_key_wait_fragment.xml +++ b/OpenKeychain/src/main/res/layout/create_yubi_key_wait_fragment.xml @@ -40,7 +40,7 @@          android:layout_alignParentBottom="true"          android:layout_alignParentLeft="true"          android:layout_alignParentStart="true" -        android:background="@color/holo_gray_bright" +        android:background="?attr/colorButtonRow"          android:id="@+id/create_key_buttons">          <TextView @@ -79,4 +79,4 @@      </LinearLayout> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/decrypt_list_entry.xml b/OpenKeychain/src/main/res/layout/decrypt_list_entry.xml index 92f366eda..048595dd8 100644 --- a/OpenKeychain/src/main/res/layout/decrypt_list_entry.xml +++ b/OpenKeychain/src/main/res/layout/decrypt_list_entry.xml @@ -7,7 +7,7 @@      android:layout_width="match_parent"      android:layout_height="wrap_content"      android:layout_margin="4dp" -    custom:cardBackgroundColor="@android:color/white" +    custom:cardBackgroundColor="?attr/colorCardViewBackground"      custom:cardElevation="2dp"      custom:cardUseCompatPadding="true"      custom:cardCornerRadius="4dp" @@ -320,4 +320,4 @@      </org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator> -</android.support.v7.widget.CardView>
\ No newline at end of file +</android.support.v7.widget.CardView> diff --git a/OpenKeychain/src/main/res/layout/drawer_custom_header.xml b/OpenKeychain/src/main/res/layout/drawer_custom_header.xml deleted file mode 100644 index 86465db98..000000000 --- a/OpenKeychain/src/main/res/layout/drawer_custom_header.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" -    android:orientation="vertical" -    android:layout_width="match_parent" -    android:layout_height="match_parent" -    android:gravity="center" -    android:background="@color/primary"> - -    <TextView -        android:layout_width="wrap_content" -        android:layout_height="wrap_content" -        android:textAppearance="?android:attr/textAppearanceMedium" -        android:text="@string/app_name" -        android:textColor="@color/white" -        android:layout_gravity="center_horizontal" /> -</LinearLayout>
\ No newline at end of file diff --git a/OpenKeychain/src/main/res/layout/encrypt_decrypt_overview_fragment.xml b/OpenKeychain/src/main/res/layout/encrypt_decrypt_overview_fragment.xml index 925b7d778..7bd919abc 100644 --- a/OpenKeychain/src/main/res/layout/encrypt_decrypt_overview_fragment.xml +++ b/OpenKeychain/src/main/res/layout/encrypt_decrypt_overview_fragment.xml @@ -124,4 +124,4 @@              android:layout_marginBottom="8dp" />      </LinearLayout> -</ScrollView>
\ No newline at end of file +</ScrollView> diff --git a/OpenKeychain/src/main/res/layout/file_list_entry.xml b/OpenKeychain/src/main/res/layout/file_list_entry.xml index 7f0e1e89e..e1b03f8ae 100644 --- a/OpenKeychain/src/main/res/layout/file_list_entry.xml +++ b/OpenKeychain/src/main/res/layout/file_list_entry.xml @@ -55,4 +55,4 @@          android:clickable="true"          android:layout_centerVertical="true"          android:background="?android:selectableItemBackground" /> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/foldable_linearlayout.xml b/OpenKeychain/src/main/res/layout/foldable_linearlayout.xml index 773a9d416..a7b1e6a53 100644 --- a/OpenKeychain/src/main/res/layout/foldable_linearlayout.xml +++ b/OpenKeychain/src/main/res/layout/foldable_linearlayout.xml @@ -25,7 +25,7 @@              android:layout_height="wrap_content"              android:text="@string/none"              android:layout_gravity="center_vertical" -            android:textColor="@color/header_text" /> +            android:textColor="?attr/colorHeaderText" />      </LinearLayout>      <LinearLayout @@ -34,4 +34,4 @@          android:layout_height="wrap_content"          android:orientation="vertical"          android:visibility="gone" /> -</LinearLayout>
\ No newline at end of file +</LinearLayout> diff --git a/OpenKeychain/src/main/res/layout/help_about_fragment.xml b/OpenKeychain/src/main/res/layout/help_about_fragment.xml index 6afab2e12..f654af181 100644 --- a/OpenKeychain/src/main/res/layout/help_about_fragment.xml +++ b/OpenKeychain/src/main/res/layout/help_about_fragment.xml @@ -1,7 +1,11 @@  <?xml version="1.0" encoding="utf-8"?>  <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="match_parent" -    android:layout_height="match_parent" > +    android:layout_height="match_parent" +    android:paddingLeft="0dp" +    android:paddingRight="0dp" +    android:paddingTop="0dp" +    android:paddingBottom="0dp">      <LinearLayout          android:layout_width="match_parent" @@ -56,7 +60,12 @@              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_marginTop="8dp" +            android:paddingLeft="16dp" +            android:paddingRight="16dp" +            android:paddingTop="16dp" +            android:paddingBottom="16dp" +            android:background="@android:color/white"              android:textAppearance="@android:style/TextAppearance.Small" />      </LinearLayout> -</ScrollView>
\ No newline at end of file +</ScrollView> diff --git a/OpenKeychain/src/main/res/layout/import_keys_activity.xml b/OpenKeychain/src/main/res/layout/import_keys_activity.xml index 332b95ce5..28bb8a0b8 100644 --- a/OpenKeychain/src/main/res/layout/import_keys_activity.xml +++ b/OpenKeychain/src/main/res/layout/import_keys_activity.xml @@ -25,21 +25,11 @@              android:id="@+id/import_keys_top_container"              android:layout_width="match_parent"              android:layout_height="64dp" -            android:orientation="vertical" -            android:background="@android:color/white" /> +            android:orientation="vertical" />          <View              android:layout_width="match_parent" -            android:layout_height="2dip" -            android:background="?android:attr/listDivider" /> - -        <View -            android:layout_width="match_parent" -            android:layout_height="16dp" /> - -        <View -            android:layout_width="match_parent" -            android:layout_height="2dip" +            android:layout_height="1dip"              android:background="?android:attr/listDivider" />          <FrameLayout @@ -47,22 +37,18 @@              android:layout_width="match_parent"              android:layout_height="0dp"              android:orientation="vertical" -            android:layout_weight="1" -            android:background="@android:color/white" /> +            android:layout_weight="1" />          <RelativeLayout              android:id="@+id/import_footer"              android:layout_width="match_parent"              android:layout_height="wrap_content" -            android:orientation="vertical" -            android:background="@android:color/white"> +            android:orientation="vertical">              <View                  android:id="@+id/import_divider"                  android:layout_width="match_parent"                  android:layout_height="1dip" -                android:layout_marginLeft="16dp" -                android:layout_marginRight="16dp"                  android:background="?android:attr/listDivider" />              <TextView @@ -91,4 +77,4 @@          </RelativeLayout>      </LinearLayout> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/key_list_content.xml b/OpenKeychain/src/main/res/layout/key_list_content.xml index bd0239da7..146367082 100644 --- a/OpenKeychain/src/main/res/layout/key_list_content.xml +++ b/OpenKeychain/src/main/res/layout/key_list_content.xml @@ -23,7 +23,7 @@              <!--<LinearLayout                  android:orientation="vertical" -                android:background="@color/holo_gray_bright" +                android:background="?attr/colorButtonRow"                  android:layout_width="match_parent"                  android:layout_height="wrap_content"> diff --git a/OpenKeychain/src/main/res/layout/key_list_fragment.xml b/OpenKeychain/src/main/res/layout/key_list_fragment.xml index ea3426f90..9c41590db 100644 --- a/OpenKeychain/src/main/res/layout/key_list_fragment.xml +++ b/OpenKeychain/src/main/res/layout/key_list_fragment.xml @@ -45,8 +45,8 @@          android:layout_alignParentRight="true"          android:layout_alignParentEnd="true"          android:layout_alignParentBottom="true" -        fab:fab_addButtonColorNormal="@color/primary" -        fab:fab_addButtonColorPressed="@color/primary_dark" +        fab:fab_addButtonColorNormal="?attr/colorPrimary" +        fab:fab_addButtonColorPressed="?attr/colorPrimaryDark"          fab:fab_addButtonSize="normal"          fab:fab_addButtonPlusIconColor="@color/icons"          fab:fab_expandDirection="up" @@ -61,8 +61,8 @@              android:layout_width="wrap_content"              android:layout_height="wrap_content"              fab:fab_icon="@drawable/ic_qrcode_white_24dp" -            fab:fab_colorNormal="@color/primary" -            fab:fab_colorPressed="@color/primary_dark" +            fab:fab_colorNormal="?attr/colorPrimary" +            fab:fab_colorPressed="?attr/colorPrimaryDark"              fab:fab_title="Scan QR Code"              fab:fab_size="mini" /> @@ -71,8 +71,8 @@              android:layout_width="wrap_content"              android:layout_height="wrap_content"              fab:fab_icon="@drawable/ic_cloud_search_24dp" -            fab:fab_colorNormal="@color/primary" -            fab:fab_colorPressed="@color/primary_dark" +            fab:fab_colorNormal="?attr/colorPrimary" +            fab:fab_colorPressed="?attr/colorPrimaryDark"              fab:fab_title="Search Cloud"              fab:fab_size="mini" /> @@ -81,10 +81,10 @@              android:layout_width="wrap_content"              android:layout_height="wrap_content"              fab:fab_icon="@drawable/ic_folder_white_24dp" -            fab:fab_colorNormal="@color/primary" -            fab:fab_colorPressed="@color/primary_dark" +            fab:fab_colorNormal="?attr/colorPrimary" +            fab:fab_colorPressed="?attr/colorPrimaryDark"              fab:fab_title="Import from File"              fab:fab_size="mini" />      </com.getbase.floatingactionbutton.FloatingActionsMenu> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/log_display_item.xml b/OpenKeychain/src/main/res/layout/log_display_item.xml index d35413185..25249003f 100644 --- a/OpenKeychain/src/main/res/layout/log_display_item.xml +++ b/OpenKeychain/src/main/res/layout/log_display_item.xml @@ -15,7 +15,7 @@              android:layout_height="match_parent"              android:id="@+id/log_img"              android:minWidth="10dp" -            android:background="@color/bg_gray" /> +            android:background="?attr/colorLogBackground" />          <TextView              android:layout_width="0dp" @@ -53,7 +53,7 @@              android:layout_height="match_parent"              android:id="@+id/log_second_img"              android:minWidth="10dp" -            android:background="@color/bg_gray" /> +            android:background="?attr/colorLogBackground" />          <TextView              android:layout_width="0dp" @@ -67,4 +67,4 @@              android:layout_gravity="center_vertical"/>      </LinearLayout> -</LinearLayout>
\ No newline at end of file +</LinearLayout> diff --git a/OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml b/OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml index ffc5266b5..9ce8f01fa 100644 --- a/OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml +++ b/OpenKeychain/src/main/res/layout/passphrase_repeat_dialog.xml @@ -40,9 +40,9 @@              android:layout_gravity="end|center_vertical"              custom:strength="medium"              custom:showGuides="false" -            custom:color_fail="@color/android_red_light" -            custom:color_weak="@color/android_orange_light" -            custom:color_strong="@color/android_green_light" /> +            custom:color_fail="@color/password_strength_low" +            custom:color_weak="@color/password_strength_medium" +            custom:color_strong="@color/password_strength_high" />      </FrameLayout> @@ -57,4 +57,4 @@          android:ems="10"          android:layout_gravity="center_horizontal" /> -</LinearLayout>
\ No newline at end of file +</LinearLayout> diff --git a/OpenKeychain/src/main/res/layout/recipient_selection_list_entry.xml b/OpenKeychain/src/main/res/layout/recipient_selection_list_entry.xml index a9e86057c..2b39cf54c 100644 --- a/OpenKeychain/src/main/res/layout/recipient_selection_list_entry.xml +++ b/OpenKeychain/src/main/res/layout/recipient_selection_list_entry.xml @@ -60,4 +60,4 @@          tools:src="@drawable/status_signature_revoked_cutout_24dp"          /> -</LinearLayout>
\ No newline at end of file +</LinearLayout> diff --git a/OpenKeychain/src/main/res/layout/toolbar_result_decrypt.xml b/OpenKeychain/src/main/res/layout/toolbar_result_decrypt.xml index 4f9b5d373..1afa76b60 100644 --- a/OpenKeychain/src/main/res/layout/toolbar_result_decrypt.xml +++ b/OpenKeychain/src/main/res/layout/toolbar_result_decrypt.xml @@ -3,7 +3,7 @@      xmlns:tools="http://schemas.android.com/tools"      android:id="@+id/toolbar_include"      android:elevation="4dp" -    android:background="@color/white" +    android:background="?attr/colorBrightToolbar"      android:layout_width="match_parent"      android:layout_height="wrap_content"> diff --git a/OpenKeychain/src/main/res/layout/toolbar_standalone_white.xml b/OpenKeychain/src/main/res/layout/toolbar_standalone_white.xml index d4269c2ba..8fddfe4ba 100644 --- a/OpenKeychain/src/main/res/layout/toolbar_standalone_white.xml +++ b/OpenKeychain/src/main/res/layout/toolbar_standalone_white.xml @@ -2,7 +2,7 @@  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:id="@+id/toolbar_include"      android:elevation="4dp" -    android:background="@color/white" +    android:background="?attr/colorBrightToolbar"      android:layout_width="match_parent"      android:layout_height="wrap_content"> diff --git a/OpenKeychain/src/main/res/layout/toolbar_tabs.xml b/OpenKeychain/src/main/res/layout/toolbar_tabs.xml index 91efda682..ed42ef52e 100644 --- a/OpenKeychain/src/main/res/layout/toolbar_tabs.xml +++ b/OpenKeychain/src/main/res/layout/toolbar_tabs.xml @@ -17,8 +17,8 @@          android:layout_width="match_parent"          android:layout_height="?attr/actionBarSize"          android:background="?attr/colorPrimary" -        android:textColor="@color/tab_text" -        app:pstsTextColorSelected="@color/tab_text_selected" -        app:pstsIndicatorColor="@color/tab_indicator" /> +        android:textColor="?attr/colorTabText" +        app:pstsTextColorSelected="?attr/colorTabTextSelected" +        app:pstsIndicatorColor="?attr/colorTabIndicator" />  </RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/view_key_activity.xml b/OpenKeychain/src/main/res/layout/view_key_activity.xml index b3f4e721d..8e04f6899 100644 --- a/OpenKeychain/src/main/res/layout/view_key_activity.xml +++ b/OpenKeychain/src/main/res/layout/view_key_activity.xml @@ -75,7 +75,7 @@              android:layout_marginEnd="48dp"              android:text=""              tools:text="My Key" -            android:textColor="@color/tab_text" +            android:textColor="?attr/colorTabText"              android:textAppearance="?android:attr/textAppearanceSmall"              android:layout_above="@+id/toolbar2" /> @@ -200,7 +200,7 @@          tools:visibility="visible"          android:elevation="4dp"          fab:fab_icon="@drawable/ic_qrcode_white_24dp" -        fab:fab_colorNormal="@color/fab" -        fab:fab_colorPressed="@color/fab_pressed" /> +        fab:fab_colorNormal="?attr/colorFab" +        fab:fab_colorPressed="?attr/colorFabPressed" /> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/view_key_adv_certs_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_adv_certs_fragment.xml index d512477aa..3b9215d50 100644 --- a/OpenKeychain/src/main/res/layout/view_key_adv_certs_fragment.xml +++ b/OpenKeychain/src/main/res/layout/view_key_adv_certs_fragment.xml @@ -10,7 +10,7 @@      <TextView          android:layout_width="wrap_content"          android:layout_height="wrap_content" -        android:background="@color/holo_gray_bright" +        android:background="?attr/colorButtonRow"          android:padding="8dp"          android:textAppearance="?android:attr/textAppearanceSmall"          android:text="@string/certs_text" @@ -45,4 +45,4 @@      </FrameLayout> -</LinearLayout>
\ No newline at end of file +</LinearLayout> diff --git a/OpenKeychain/src/main/res/layout/view_key_adv_keybase_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_adv_keybase_fragment.xml index b6679524f..eecb19000 100644 --- a/OpenKeychain/src/main/res/layout/view_key_adv_keybase_fragment.xml +++ b/OpenKeychain/src/main/res/layout/view_key_adv_keybase_fragment.xml @@ -7,7 +7,7 @@      <TextView          android:layout_width="wrap_content"          android:layout_height="wrap_content" -        android:background="@color/holo_gray_bright" +        android:background="?attr/colorButtonRow"          android:padding="8dp"          android:textAppearance="?android:attr/textAppearanceSmall"          android:text="@string/key_trust_header_text" @@ -123,4 +123,4 @@          </LinearLayout>      </ScrollView> -</LinearLayout>
\ No newline at end of file +</LinearLayout> diff --git a/OpenKeychain/src/main/res/layout/view_key_adv_user_id_item.xml b/OpenKeychain/src/main/res/layout/view_key_adv_user_id_item.xml index 1c55a1446..a9ebe43d3 100644 --- a/OpenKeychain/src/main/res/layout/view_key_adv_user_id_item.xml +++ b/OpenKeychain/src/main/res/layout/view_key_adv_user_id_item.xml @@ -34,7 +34,7 @@              android:id="@+id/user_id_item_comment"              android:layout_width="wrap_content"              android:layout_height="wrap_content" -            android:textColor="@color/tertiary_text_light" +            android:textColor="?attr/colorTertiaryText"              android:text="comment"              android:textAppearance="?android:attr/textAppearanceSmall" /> diff --git a/OpenKeychain/src/main/res/layout/view_key_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_fragment.xml index a71eb5880..8c1023427 100644 --- a/OpenKeychain/src/main/res/layout/view_key_fragment.xml +++ b/OpenKeychain/src/main/res/layout/view_key_fragment.xml @@ -17,7 +17,7 @@              android:layout_gravity="center"              android:layout_width="match_parent"              android:layout_height="wrap_content" -            card_view:cardBackgroundColor="@android:color/white" +            card_view:cardBackgroundColor="?attr/colorCardViewBackground"              card_view:cardElevation="2dp"              card_view:cardUseCompatPadding="true"              card_view:cardCornerRadius="4dp"> @@ -47,7 +47,7 @@              android:layout_width="match_parent"              android:layout_height="wrap_content"              android:visibility="gone" -            card_view:cardBackgroundColor="@android:color/white" +            card_view:cardBackgroundColor="?attr/colorCardViewBackground"              card_view:cardElevation="2dp"              card_view:cardUseCompatPadding="true"              card_view:cardCornerRadius="4dp"> diff --git a/OpenKeychain/src/main/res/layout/view_key_yubikey.xml b/OpenKeychain/src/main/res/layout/view_key_yubikey.xml index 83272ef4e..57f93493d 100644 --- a/OpenKeychain/src/main/res/layout/view_key_yubikey.xml +++ b/OpenKeychain/src/main/res/layout/view_key_yubikey.xml @@ -18,7 +18,7 @@              android:layout_width="match_parent"              android:layout_height="wrap_content"              android:transitionName="card" -            card_view:cardBackgroundColor="@android:color/white" +            card_view:cardBackgroundColor="?attr/colorCardViewBackground"              card_view:cardElevation="2dp"              card_view:cardUseCompatPadding="true"              card_view:cardCornerRadius="4dp" diff --git a/OpenKeychain/src/main/res/values-v21/themes.xml b/OpenKeychain/src/main/res/values-v21/themes.xml index b47026e5b..dab38f97a 100644 --- a/OpenKeychain/src/main/res/values-v21/themes.xml +++ b/OpenKeychain/src/main/res/values-v21/themes.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8"?>  <resources> -    <style name="KeychainTheme" parent="KeychainTheme.Base"> +    <style name="LightTheme" parent="LightBaseTheme">          <item name="android:windowTranslucentStatus">true</item>          <!-- enable window content transitions --> @@ -12,4 +12,17 @@          <item name="android:windowSharedElementExitTransition">@android:transition/move</item>      </style> -</resources>
\ No newline at end of file + +     <style name="DarkTheme" parent="DarkBaseTheme"> +        <item name="android:windowTranslucentStatus">true</item> + +        <!-- enable window content transitions --> +        <item name="android:windowContentTransitions">true</item> +        <item name="android:windowAllowEnterTransitionOverlap">true</item> +        <item name="android:windowAllowReturnTransitionOverlap">true</item> +        <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> +        <item name="android:windowSharedElementExitTransition">@android:transition/move</item> + +    </style> + +</resources> diff --git a/OpenKeychain/src/main/res/values/arrays.xml b/OpenKeychain/src/main/res/values/arrays.xml index a9f521b17..ef3970672 100644 --- a/OpenKeychain/src/main/res/values/arrays.xml +++ b/OpenKeychain/src/main/res/values/arrays.xml @@ -61,4 +61,12 @@          <item>@string/key_size_custom</item>      </string-array> +    <string-array name="theme_entries" translatable="false"> +        <item>@string/theme_dark</item> +        <item>@string/theme_light</item> +    </string-array> +    <string-array name="theme_values" translatable="false"> +        <item>"dark"</item> +        <item>"ligh"</item> +    </string-array>  </resources> diff --git a/OpenKeychain/src/main/res/values/attrs.xml b/OpenKeychain/src/main/res/values/attrs.xml new file mode 100644 index 000000000..5c570e62b --- /dev/null +++ b/OpenKeychain/src/main/res/values/attrs.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> +    <declare-styleable name="CustomTheme"> +        <attr name="colorFab" format="color" /> +        <attr name="colorFabPressed" format="color" /> +        <attr name="colorFabBackground" format="color" /> +        <attr name="colorFabText" format="color" /> +        <attr name="colorEmphasis" format="color" /> +        <attr name="colorHeaderText" format="color" /> +        <attr name="colorTertiaryText" format="color" /> +        <attr name="colorButtonRow" format="color" /> +        <attr name="colorLogBackground" format="color" /> +        <attr name="colorCardViewHeaderDivider" format="color" /> +        <attr name="colorText" format="color" /> +        <attr name="colorBrightToolbar" format="color" /> +        <attr name="colorCardViewBackground" format="color" /> +        <attr name="colorTabText" format="color" /> +        <attr name="colorTabTextSelected" format="color" /> +        <attr name="colorTabIndicator" format="color" /> +    </declare-styleable> +</resources> diff --git a/OpenKeychain/src/main/res/values/colors.xml b/OpenKeychain/src/main/res/values/colors.xml index ead006a63..5db66b945 100644 --- a/OpenKeychain/src/main/res/values/colors.xml +++ b/OpenKeychain/src/main/res/values/colors.xml @@ -1,54 +1,22 @@  <?xml version="1.0" encoding="utf-8"?>  <resources> -    <!-- Main theme colors --> - -    <!-- green colors from OpenKeychain logo bottom right --> -    <!-- your app branding color for the app bar -->      <color name="primary">#7bad45</color> -    <!-- darker variant for the status bar and contextual app bars --> -    <color name="primary_dark">#6c983d</color> -    <!-- theme UI controls like checkboxes and text fields --> -    <color name="accent">#2196F3</color> - -    <!-- Other colors --> - -    <color name="black">#000000</color> - -    <color name="primary_light">#C8E6C9</color> -    <color name="fab">@color/accent</color> -    <color name="fab_pressed">#1976D2</color> -    <color name="primary_text">#212121</color> -    <color name="secondary_text">#727272</color> -    <color name="icons">#FFFFFF</color> -    <color name="divider">#B6B6B6</color> -    <color name="transparent">#00FFFFFF</color> - -    <color name="header_text">#212121</color> -    <!-- item selection, search highlight --> -    <color name="emphasis">@color/accent</color> - -    <color name="bg_gray">#cecbce</color> -    <color name="tertiary_text_light">#808080</color> -    <color name="alert">#ffdd3333</color> - -    <color name="holo_gray_light">#33999999</color> -    <color name="holo_gray_bright">#33CCCCCC</color> -    <!-- tabs --> -    <color name="tab_text">#70FFFFFF</color> -    <color name="tab_text_selected">#FFFFFF</color> -    <color name="tab_indicator">#FFFFFF</color> +    <color name="icons">#ffffff</color> +    <color name="transparent">#00ffffff</color> +    <color name="key_flag_gray">#808080</color> +    <color name="key_flag_red">#f44336</color> +    <color name="key_flag_orange">#ff9800</color> +    <color name="key_flag_green">#7bad45</color> -    <!-- floating action buttons --> -    <color name="black_semi_transparent">#B2000000</color> -    <color name="background">#e5e5e5</color> -    <color name="half_black">#808080</color> -    <color name="white">#fafafa</color> -    <color name="white_pressed">#f1f1f1</color> +    <color name="password_strength_low">#f44336</color> +    <color name="password_strength_medium">#ff9800</color> +    <color name="password_strength_high">#7bad45</color>      <!-- +        Standard Android colors:          http://www.google.com/design/spec/style/color.html#color-color-palette          light = normal color          dark = 900 @@ -58,10 +26,7 @@      <color name="android_red_light">#f44336</color>      <color name="android_red_dark">#b71c1c</color>      <color name="android_orange_light">#ff9800</color> -    <color name="android_orange_dark">#e65100</color> -    <color name="android_green_light">@color/primary</color> -    <color name="android_green_dark">@color/primary_dark</color> -    <color name="android_purple_light">#673ab7</color> -    <color name="android_purple_dark">#311b92</color> +    <color name="android_green_light">#7bad45</color> +    <color name="android_green_dark">#6c983d</color>  </resources> diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index db81963c1..faa9aa39c 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -50,6 +50,7 @@      <string name="section_cloud_search">"Cloud search"</string>      <string name="section_passphrase_cache">"Password/PIN Handling"</string>      <string name="section_proxy_settings">"Proxy Settings"</string> +    <string name="section_gui">"Interface"</string>      <string name="section_certify">"Confirm"</string>      <string name="section_actions">"Actions"</string>      <string name="section_share_key">"Key"</string> @@ -167,6 +168,7 @@      <string name="label_verify_keyserver">"Verify keyserver"</string>      <string name="label_enter_keyserver_url">"Enter keyserver URL"</string>      <string name="label_keyserver_dialog_delete">"Delete keyserver"</string> +    <string name="label_theme">"Theme"</string>      <string name="pref_keyserver">"OpenPGP keyservers"</string>      <string name="pref_keyserver_summary">"Search keys on selected OpenPGP keyservers (HKP protocol)"</string> @@ -245,6 +247,8 @@      <string name="filemanager_title_open">"Open…"</string>      <string name="error">"Error"</string>      <string name="error_message">"Error: %s"</string> +    <string name="theme_dark">"Dark"</string> +    <string name="theme_light">"Light"</string>      <!-- key flags -->      <string name="flag_certify">"Certify"</string> diff --git a/OpenKeychain/src/main/res/values/styles.xml b/OpenKeychain/src/main/res/values/styles.xml index c7b326b7a..73a594ac4 100644 --- a/OpenKeychain/src/main/res/values/styles.xml +++ b/OpenKeychain/src/main/res/values/styles.xml @@ -7,7 +7,7 @@          <item name="android:layout_marginTop">16dp</item>          <item name="android:paddingLeft">16dp</item>          <item name="android:textStyle">normal</item> -        <item name="android:textColor">@color/header_text</item> +        <item name="android:textColor">?attr/colorHeaderText</item>          <item name="android:textSize">17sp</item>      </style> @@ -17,13 +17,13 @@          <item name="android:layout_marginTop">8dp</item>          <item name="android:paddingLeft">8dp</item>          <item name="android:textStyle">bold</item> -        <item name="android:textColor">@color/header_text</item> +        <item name="android:textColor">?attr/colorHeaderText</item>          <item name="android:textSize">14sp</item>      </style>      <style name="FabMenuStyle">          <item name="android:background">@drawable/fab_label_background</item> -        <item name="android:textColor">@color/white</item> +        <item name="android:textColor">?attr/colorFabText</item>      </style>      <!-- This style is for use with our drag and drop RecyclerView since ItemDecoration did not @@ -34,4 +34,4 @@          <item name="android:background">?android:attr/listDivider</item>      </style> -</resources>
\ No newline at end of file +</resources> diff --git a/OpenKeychain/src/main/res/values/themes.xml b/OpenKeychain/src/main/res/values/themes.xml index 8e0ea6ac0..3bdbf811d 100644 --- a/OpenKeychain/src/main/res/values/themes.xml +++ b/OpenKeychain/src/main/res/values/themes.xml @@ -1,12 +1,30 @@  <?xml version="1.0" encoding="utf-8"?>  <resources> -    <style name="KeychainTheme" parent="KeychainTheme.Base" /> +    <style name="LightBaseTheme" parent="Theme.AppCompat.Light"> +        <item name="colorPrimary">#7bad45</item> +        <item name="colorPrimaryDark">#6c983d</item> +        <item name="colorAccent">#2196f3</item> +        <item name="colorBrightToolbar">#dddddd</item> -    <style name="KeychainTheme.Base" parent="Theme.AppCompat.Light"> -        <item name="colorPrimary">@color/primary</item> -        <item name="colorPrimaryDark">@color/primary_dark</item> -        <item name="colorAccent">@color/accent</item> +        <item name="colorFab">#2196f3</item> +        <item name="colorFabPressed">#1976d2</item> +        <item name="colorFabBackground">#b2000000</item> +        <item name="colorFabText">#fafafa</item> + +        <item name="colorTabText">#70ffffff</item> +        <item name="colorTabTextSelected">#ffffff</item> +        <item name="colorTabIndicator">#ffffff</item> + +        <item name="colorEmphasis">#2196f3</item> +        <item name="colorButtonRow">#33cccccc</item> +        <item name="colorLogBackground">#cecbce</item> +        <item name="colorCardViewHeaderDivider">#808080</item> +        <item name="colorCardViewBackground">#ffffff</item> + +        <item name="colorText">#000000</item> +        <item name="colorHeaderText">#212121</item> +        <item name="colorTertiaryText">#808080</item>          <!-- remove actionbar and title, we use toolbar! -->          <item name="windowNoTitle">true</item> @@ -16,6 +34,47 @@          <item name="searchViewStyle">@style/MySearchViewStyle</item>      </style> +    <style name="DarkBaseTheme" parent="MaterialDrawerTheme.ActionBar"> +        <item name="colorPrimary">#268bd2</item> +        <item name="colorPrimaryDark">#166bb2</item> +        <item name="colorAccent">#2196f3</item> +        <item name="colorBrightToolbar">#808080</item> + +        <item name="colorFab">#2196f3</item> +        <item name="colorFabPressed">#1976d2</item> +        <item name="colorFabBackground">#b2000000</item> +        <item name="colorFabText">#fafafa</item> + +        <item name="colorTabText">#70ffffff</item> +        <item name="colorTabTextSelected">#ffffff</item> +        <item name="colorTabIndicator">#ffffff</item> + +        <item name="colorEmphasis">#2196f3</item> +        <item name="colorButtonRow">#33cccccc</item> +        <item name="colorLogBackground">#303030</item> +        <item name="colorCardViewHeaderDivider">#808080</item> +        <item name="colorCardViewBackground">#505050</item> + +        <item name="colorText">#ffffff</item> +        <item name="colorHeaderText">#d0d0d0</item> +        <item name="colorTertiaryText">#808080</item> + +        <item name="material_drawer_selected_text">#268bd2</item> + +        <!-- remove actionbar and title, we use toolbar! --> +        <item name="windowNoTitle">true</item> +        <item name="windowActionBar">false</item> +        <!-- multi selection should overlay Toolbar! http://stackoverflow.com/a/26450875 --> +        <item name="windowActionModeOverlay">true</item> +        <item name="searchViewStyle">@style/MySearchViewStyle</item> +    </style> + +    <style name="LightTheme" parent="LightBaseTheme"> +    </style> + +    <style name="DarkTheme" parent="DarkBaseTheme"> +    </style> +      <!-- http://android-developers.blogspot.de/2014/10/appcompat-v21-material-design-for-pre.html -->      <style name="MySearchViewStyle" parent="Widget.AppCompat.SearchView">          <!-- Background for the search query section (e.g. EditText) --> @@ -40,4 +99,4 @@          <item name="windowActionBar">false</item>          <item name="windowNoTitle">true</item>      </style> -</resources>
\ No newline at end of file +</resources> diff --git a/OpenKeychain/src/main/res/xml/gui_preferences.xml b/OpenKeychain/src/main/res/xml/gui_preferences.xml new file mode 100644 index 000000000..cda7beeef --- /dev/null +++ b/OpenKeychain/src/main/res/xml/gui_preferences.xml @@ -0,0 +1,10 @@ +<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> +    <ListPreference +        android:persistent="false" +        android:key="theme" +        android:title="@string/label_theme" +        android:entries="@array/theme_entries" +        android:entryValues="@array/theme_values" +        android:dialogTitle="@string/label_theme" /> + +</PreferenceScreen> diff --git a/OpenKeychain/src/main/res/xml/preference_headers.xml b/OpenKeychain/src/main/res/xml/preference_headers.xml index 70e400567..b7512b062 100644 --- a/OpenKeychain/src/main/res/xml/preference_headers.xml +++ b/OpenKeychain/src/main/res/xml/preference_headers.xml @@ -1,4 +1,7 @@  <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> +    <!--<header--> +        <!--android:fragment="org.sufficientlysecure.keychain.ui.SettingsActivity$GuiPrefsFragment"--> +        <!--android:title="@string/section_gui" />-->      <header          android:fragment="org.sufficientlysecure.keychain.ui.SettingsActivity$CloudSearchPrefsFragment"          android:title="@string/section_cloud_search" />  | 
