From 09b1fbb34a1147c30cab09af0d64dc84fa97dd8c Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Mon, 14 Mar 2016 16:17:46 +0800 Subject: [PATCH] theme improvements --- resources/Twidere Icon Assets.sketch | Bin 122880 -> 131072 bytes twidere/build.gradle | 2 +- twidere/proguard-rules.pro | 2 +- .../{support => }/ImagePageFragmentTest.java | 3 +- .../twidere/util/DebugModeUtils.java | 2 +- twidere/src/main/AndroidManifest.xml | 52 +-- .../app/ThemedAppCompatDelegateFactory.java | 98 ----- .../{support => }/APIEditorActivity.java | 2 +- .../AccountSelectorActivity.java | 2 +- .../{support => }/ActivityPickerActivity.java | 2 +- .../activity/AssistLauncherActivity.java | 1 - .../{support => }/BaseAppCompatActivity.java | 3 +- .../activity/BasePreferenceActivity.java | 171 -------- .../BaseSupportDialogActivity.java | 3 +- .../{support => }/BrowserSignInActivity.java | 2 +- .../ColorPickerDialogActivity.java | 3 +- .../{support => }/ComposeActivity.java | 2 +- .../CustomTabEditorActivity.java | 2 +- .../{support => }/DataExportActivity.java | 2 +- .../{support => }/DataImportActivity.java | 2 +- .../{support => }/FileSelectorActivity.java | 3 +- .../activity/{support => }/HomeActivity.java | 108 ++--- .../activity/ImageCropperActivity.java | 5 - ...boardShortcutPreferenceCompatActivity.java | 11 +- .../{support => }/LinkHandlerActivity.java | 106 +---- .../twidere/activity/MainActivity.java | 1 - .../{support => }/MediaViewerActivity.java | 2 +- .../{support => }/QuickSearchBarActivity.java | 2 +- .../RequestPermissionsActivity.java | 3 +- .../twidere/activity/SettingsActivity.java | 1 - .../activity/SettingsWizardActivity.java | 24 +- .../{support => }/SignInActivity.java | 19 +- ...vity.java => ThemedAppCompatActivity.java} | 89 +++-- .../{support => }/ThemedFragmentActivity.java | 29 +- .../ThemedImagePickerActivity.java | 3 +- .../activity/TwitterLinkHandlerActivity.java | 1 - .../UserListSelectorActivity.java | 2 +- .../activity/iface/IThemedActivity.java | 2 - .../support/ThemedAppCompatActivity.java | 197 ---------- .../twidere/app/TwidereApplication.java | 14 + .../twidere/fragment/CustomTabsFragment.java | 2 +- .../support/AccountsDashboardFragment.java | 372 ++++++------------ .../support/AccountsManagerFragment.java | 4 +- .../fragment/support/BaseFiltersFragment.java | 14 +- .../fragment/support/BaseSupportFragment.java | 19 - .../support/CursorActivitiesFragment.java | 2 +- .../support/CursorStatusesFragment.java | 2 +- .../support/DirectMessagesFragment.java | 4 +- .../fragment/support/FiltersFragment.java | 2 +- .../fragment/support/ListsFragment.java | 2 +- .../support/MessagesConversationFragment.java | 4 +- .../fragment/support/SearchFragment.java | 4 +- .../fragment/support/StatusFragment.java | 2 +- .../fragment/support/UserFragment.java | 10 +- .../fragment/support/UserListFragment.java | 4 +- .../support/UserProfileEditorFragment.java | 4 +- .../DarkLightThemeTogglePreference.java | 53 --- .../preference/DefaultAPIPreference.java | 2 +- .../twidere/provider/TwidereDataProvider.java | 2 +- .../twidere/util/ActivityTracker.java | 2 +- .../mariotaku/twidere/util/IntentUtils.java | 2 +- .../util/KeyboardShortcutsHandler.java | 4 +- .../org/mariotaku/twidere/util/MenuUtils.java | 10 +- .../twidere/util/MultiSelectEventHandler.java | 2 +- .../util/RestFuNetworkStreamDownloader.java | 2 +- .../mariotaku/twidere/util/ThemeUtils.java | 98 +---- .../util/ThemedLayoutInflaterFactory.java | 269 ------------- .../twidere/util/dagger/GeneralComponent.java | 16 +- .../view/DrawerContentFrameLayout.java | 1 + .../twidere/view/ForegroundImageView.java | 1 + .../twidere/view/HomeActionButton.java | 163 -------- .../twidere/view/HomeActionButtonCompat.java | 203 ---------- .../twidere/view/iface/IHomeActionButton.java | 24 -- .../main/res/drawable-hdpi/ic_action_star.png | Bin 353 -> 0 bytes .../main/res/drawable-mdpi/ic_action_star.png | Bin 260 -> 0 bytes .../res/drawable-xhdpi/ic_action_star.png | Bin 519 -> 0 bytes .../res/drawable-xxhdpi/ic_action_star.png | Bin 528 -> 0 bytes .../layout-v21/layout_home_actions_button.xml | 27 -- .../res/layout/activity_content_fragment.xml | 11 +- twidere/src/main/res/layout/activity_home.xml | 20 +- .../main/res/layout/activity_home_content.xml | 54 +-- .../layout/activity_request_permissions.xml | 2 +- .../main/res/layout/drawer_home_accounts.xml | 4 +- .../layout/fragment_accounts_dashboard.xml | 10 +- .../layout/header_drawer_account_selector.xml | 24 +- .../main/res/layout/layout_actionbar_home.xml | 25 -- .../res/layout/layout_home_actions_button.xml | 28 -- .../main/res/menu/menu_account_dashboard.xml | 55 +++ .../src/main/res/values-notnight/themes.xml | 20 +- twidere/src/main/res/values/attrs.xml | 3 +- twidere/src/main/res/values/dimens.xml | 1 + twidere/src/main/res/values/themes.xml | 37 +- .../src/main/res/xml/preferences_content.xml | 15 +- .../svg/drawable/ic_action_heart-mdpi.svg | 12 +- .../drawable/ic_action_notification-mdpi.svg | 13 +- .../main/svg/drawable/ic_action_star-mdpi.svg | 12 + 96 files changed, 549 insertions(+), 2107 deletions(-) rename twidere/src/androidTest/java/org/mariotaku/twidere/activity/{support => }/ImagePageFragmentTest.java (95%) delete mode 100644 twidere/src/main/java/android/support/v7/app/ThemedAppCompatDelegateFactory.java rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/APIEditorActivity.java (99%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/AccountSelectorActivity.java (99%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/ActivityPickerActivity.java (98%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/BaseAppCompatActivity.java (98%) delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/activity/BasePreferenceActivity.java rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/BaseSupportDialogActivity.java (97%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/BrowserSignInActivity.java (99%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/ColorPickerDialogActivity.java (95%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/ComposeActivity.java (99%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/CustomTabEditorActivity.java (99%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/DataExportActivity.java (99%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/DataImportActivity.java (99%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/FileSelectorActivity.java (98%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/HomeActivity.java (90%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/LinkHandlerActivity.java (78%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/MediaViewerActivity.java (99%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/QuickSearchBarActivity.java (99%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/RequestPermissionsActivity.java (98%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/SignInActivity.java (98%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{BaseThemedActivity.java => ThemedAppCompatActivity.java} (69%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/ThemedFragmentActivity.java (86%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/ThemedImagePickerActivity.java (95%) rename twidere/src/main/java/org/mariotaku/twidere/activity/{support => }/UserListSelectorActivity.java (99%) delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedAppCompatActivity.java delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/preference/DarkLightThemeTogglePreference.java delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/util/ThemedLayoutInflaterFactory.java delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/view/HomeActionButton.java delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/view/HomeActionButtonCompat.java delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/view/iface/IHomeActionButton.java delete mode 100644 twidere/src/main/res/drawable-hdpi/ic_action_star.png delete mode 100644 twidere/src/main/res/drawable-mdpi/ic_action_star.png delete mode 100644 twidere/src/main/res/drawable-xhdpi/ic_action_star.png delete mode 100644 twidere/src/main/res/drawable-xxhdpi/ic_action_star.png delete mode 100644 twidere/src/main/res/layout-v21/layout_home_actions_button.xml delete mode 100644 twidere/src/main/res/layout/layout_actionbar_home.xml delete mode 100644 twidere/src/main/res/layout/layout_home_actions_button.xml create mode 100644 twidere/src/main/res/menu/menu_account_dashboard.xml create mode 100644 twidere/src/main/svg/drawable/ic_action_star-mdpi.svg diff --git a/resources/Twidere Icon Assets.sketch b/resources/Twidere Icon Assets.sketch index ad6dd927309088578b7b6f0889f6ebb3093d91f2..81df014772ed8ce5bc6932d0425df03a4aa5949b 100644 GIT binary patch literal 131072 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%0Dvnh~2^Nc^$S*Jf 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 PX8hm(|NsAndX4^HUi%9O diff --git a/twidere/build.gradle b/twidere/build.gradle index 591f18895..838eb79c7 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -87,6 +87,7 @@ dependencies { compile 'com.android.support:recyclerview-v7:23.2.1' compile 'com.android.support:preference-v7:23.2.1' compile 'com.android.support:preference-v14:23.2.1' + compile('com.github.afollestad:app-theme-engine:1.0.1@aar') { transitive = true } compile 'com.twitter:twitter-text:1.13.0' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' compile 'com.squareup:otto:1.3.8' @@ -106,7 +107,6 @@ dependencies { compile 'org.apache.commons:commons-lang3:3.4' compile 'commons-primitives:commons-primitives:1.0' compile 'com.bluelinelabs:logansquare:1.3.7' - compile 'org.jraf:android-switch-backport:2.0.1' compile 'com.makeramen:roundedimageview:2.1.1' compile 'com.soundcloud.android:android-crop:1.0.1@aar' compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.2' diff --git a/twidere/proguard-rules.pro b/twidere/proguard-rules.pro index 5627fa662..23dea42ce 100644 --- a/twidere/proguard-rules.pro +++ b/twidere/proguard-rules.pro @@ -43,6 +43,6 @@ private android.graphics.drawable.Drawable mWindowContentOverlay; } --keepclassmembers class org.mariotaku.twidere.activity.support.BrowserSignInActivity.InjectorJavaScriptInterface { +-keepclassmembers class org.mariotaku.twidere.activity.BrowserSignInActivity.InjectorJavaScriptInterface { public *; } \ No newline at end of file diff --git a/twidere/src/androidTest/java/org/mariotaku/twidere/activity/support/ImagePageFragmentTest.java b/twidere/src/androidTest/java/org/mariotaku/twidere/activity/ImagePageFragmentTest.java similarity index 95% rename from twidere/src/androidTest/java/org/mariotaku/twidere/activity/support/ImagePageFragmentTest.java rename to twidere/src/androidTest/java/org/mariotaku/twidere/activity/ImagePageFragmentTest.java index 564e39f24..b47e47ac9 100644 --- a/twidere/src/androidTest/java/org/mariotaku/twidere/activity/support/ImagePageFragmentTest.java +++ b/twidere/src/androidTest/java/org/mariotaku/twidere/activity/ImagePageFragmentTest.java @@ -1,8 +1,9 @@ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.net.Uri; import org.junit.Test; +import org.mariotaku.twidere.activity.MediaViewerActivity; import static org.junit.Assert.assertEquals; diff --git a/twidere/src/debug/java/org/mariotaku/twidere/util/DebugModeUtils.java b/twidere/src/debug/java/org/mariotaku/twidere/util/DebugModeUtils.java index 7f2efba54..ac4a58e28 100644 --- a/twidere/src/debug/java/org/mariotaku/twidere/util/DebugModeUtils.java +++ b/twidere/src/debug/java/org/mariotaku/twidere/util/DebugModeUtils.java @@ -33,7 +33,7 @@ import com.squareup.leakcanary.RefWatcher; import com.squareup.leakcanary.ServiceHeapDumpListener; import org.mariotaku.twidere.BuildConfig; -import org.mariotaku.twidere.activity.support.ComposeActivity; +import org.mariotaku.twidere.activity.ComposeActivity; import org.mariotaku.twidere.util.net.NoIntercept; import java.io.IOException; diff --git a/twidere/src/main/AndroidManifest.xml b/twidere/src/main/AndroidManifest.xml index 1a4ed77cf..44f970a21 100644 --- a/twidere/src/main/AndroidManifest.xml +++ b/twidere/src/main/AndroidManifest.xml @@ -139,7 +139,7 @@ @@ -193,10 +193,10 @@ + android:value=".activity.HomeActivity"/> @@ -219,7 +219,7 @@ @@ -232,7 +232,7 @@ @@ -244,15 +244,15 @@ + android:value=".activity.HomeActivity"/> @@ -262,17 +262,17 @@ + android:value=".activity.HomeActivity"/> @@ -284,7 +284,7 @@ + android:value=".activity.HomeActivity"/> @@ -306,7 +306,7 @@ @@ -332,7 +332,7 @@ @@ -369,7 +369,7 @@ @@ -384,15 +384,15 @@ android:label="@string/settings_wizard" android:theme="@style/Theme.Twidere"/> diff --git a/twidere/src/main/java/android/support/v7/app/ThemedAppCompatDelegateFactory.java b/twidere/src/main/java/android/support/v7/app/ThemedAppCompatDelegateFactory.java deleted file mode 100644 index 616280289..000000000 --- a/twidere/src/main/java/android/support/v7/app/ThemedAppCompatDelegateFactory.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * 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 . - */ - -package android.support.v7.app; - -import android.app.Activity; -import android.content.Context; -import android.os.Build; -import android.support.annotation.NonNull; -import android.support.v4.view.LayoutInflaterCompat; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.Window; - -import org.mariotaku.twidere.Constants; -import org.mariotaku.twidere.activity.iface.IThemedActivity; -import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory; - -/** - * Created by mariotaku on 15/4/22. - */ -public class ThemedAppCompatDelegateFactory implements Constants { - - - /** - * Create a {@link android.support.v7.app.AppCompatDelegate} to use with {@code activity}. - * - * @param callback An optional callback for AppCompat specific events - */ - public static ThemedAppCompatDelegate create(@NonNull final IThemedActivity themed, - @NonNull final AppCompatCallback callback) { - final Activity activity = (Activity) themed; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - return new ThemedAppCompatDelegate(themed, activity, activity.getWindow(), callback); - } else { - throw new UnsupportedOperationException(); - } - } - - public static final class ThemedAppCompatDelegate extends AppCompatDelegateImplV14 { - - private final IThemedActivity themed; - private KeyListener keyListener; - - private ThemedAppCompatDelegate(@NonNull final IThemedActivity themed, @NonNull final Context context, - @NonNull final Window window, @NonNull final AppCompatCallback callback) { - super(context, window, callback); - this.themed = themed; - } - - @Override - public void installViewFactory() { - final LayoutInflater inflater = LayoutInflater.from(mContext); - if (inflater.getFactory() == null) { - LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory(themed, this)); - } - } - - @Override - boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyListener != null && keyListener.onKeyDown(keyCode, event)) return true; - return super.onKeyDown(keyCode, event); - } - - @Override - boolean onKeyUp(int keyCode, KeyEvent event) { - if (keyListener != null && keyListener.onKeyUp(keyCode, event)) return true; - return super.onKeyUp(keyCode, event); - } - - public void setKeyListener(KeyListener listener) { - keyListener = listener; - } - } - - public interface KeyListener { - - boolean onKeyDown(int keyCode, KeyEvent event); - - boolean onKeyUp(int keyCode, KeyEvent event); - } -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/APIEditorActivity.java similarity index 99% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/APIEditorActivity.java index 83fccadf5..791adeedd 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/APIEditorActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.app.Dialog; import android.content.Context; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/AccountSelectorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/AccountSelectorActivity.java similarity index 99% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/AccountSelectorActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/AccountSelectorActivity.java index 9276c4f70..d1bb9949f 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/AccountSelectorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/AccountSelectorActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.app.LoaderManager.LoaderCallbacks; import android.content.CursorLoader; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ActivityPickerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/ActivityPickerActivity.java similarity index 98% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/ActivityPickerActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/ActivityPickerActivity.java index 2087c7e86..6ecafdda3 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ActivityPickerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/ActivityPickerActivity.java @@ -1,4 +1,4 @@ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.content.Intent; import android.content.pm.ResolveInfo; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/AssistLauncherActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/AssistLauncherActivity.java index f24bfa286..2f8803d2b 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/AssistLauncherActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/AssistLauncherActivity.java @@ -5,7 +5,6 @@ import android.content.Intent; import android.os.Bundle; import org.mariotaku.twidere.Constants; -import org.mariotaku.twidere.activity.support.ComposeActivity; import org.mariotaku.twidere.util.SharedPreferencesWrapper; public class AssistLauncherActivity extends Activity implements Constants { diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/BaseAppCompatActivity.java similarity index 98% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/BaseAppCompatActivity.java index 215ed1b25..77f578d54 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/BaseAppCompatActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.annotation.SuppressLint; import android.graphics.Rect; @@ -29,6 +29,7 @@ import android.view.MotionEvent; import com.squareup.otto.Bus; import org.mariotaku.twidere.Constants; +import org.mariotaku.twidere.activity.ThemedAppCompatActivity; import org.mariotaku.twidere.activity.iface.IControlBarActivity; import org.mariotaku.twidere.activity.iface.IExtendedActivity; import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/BasePreferenceActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/BasePreferenceActivity.java deleted file mode 100644 index f831be098..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/BasePreferenceActivity.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2014 Mariotaku Lee - * - * 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 . - */ - -package org.mariotaku.twidere.activity; - -import android.content.res.Configuration; -import android.content.res.Resources; -import android.os.Bundle; -import android.preference.PreferenceActivity; -import android.support.annotation.NonNull; -import android.view.KeyEvent; - -import org.mariotaku.twidere.BuildConfig; -import org.mariotaku.twidere.Constants; -import org.mariotaku.twidere.activity.iface.IThemedActivity; -import org.mariotaku.twidere.util.ActivityTracker; -import org.mariotaku.twidere.util.KeyboardShortcutsHandler; -import org.mariotaku.twidere.util.StrictModeUtils; -import org.mariotaku.twidere.util.ThemeUtils; -import org.mariotaku.twidere.util.Utils; -import org.mariotaku.twidere.util.dagger.GeneralComponentHelper; -import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle; - -import javax.inject.Inject; - -public abstract class BasePreferenceActivity extends PreferenceActivity implements Constants, - IThemedActivity, KeyboardShortcutsHandler.KeyboardShortcutCallback { - - // Data fields - private int mCurrentThemeColor; - private int mCurrentThemeBackgroundAlpha; - @ShapeStyle - private int mProfileImageStyle; - private String mCurrentThemeBackgroundOption; - @Inject - protected KeyboardShortcutsHandler mKeyboardShortcutsHandler; - private String mCurrentThemeFontFamily; - @Inject - protected ActivityTracker mActivityTracker; - private int mMetaState; - - @Override - public String getCurrentThemeFontFamily() { - return mCurrentThemeFontFamily; - } - - @Override - public int getCurrentThemeBackgroundAlpha() { - return mCurrentThemeBackgroundAlpha; - } - - @Override - public String getCurrentThemeBackgroundOption() { - return mCurrentThemeBackgroundOption; - } - - @Override - public int getCurrentThemeColor() { - return mCurrentThemeColor; - } - - @Override - public int getThemeBackgroundAlpha() { - return ThemeUtils.getUserThemeBackgroundAlpha(this); - } - - @Override - public String getThemeBackgroundOption() { - return ThemeUtils.getThemeBackgroundOption(this); - } - - @Override - public String getThemeFontFamily() { - return ThemeUtils.getThemeFontFamily(this); - } - - @Override - @ShapeStyle - public int getCurrentProfileImageStyle() { - return mProfileImageStyle; - } - - @Override - public final void restart() { - Utils.restartActivity(this); - } - - @Override - public boolean handleKeyboardShortcutSingle(@NonNull KeyboardShortcutsHandler handler, int keyCode, @NonNull KeyEvent event, int metaState) { - return false; - } - - @Override - public boolean handleKeyboardShortcutRepeat(@NonNull KeyboardShortcutsHandler handler, int keyCode, int repeatCount, @NonNull KeyEvent event, int metaState) { - return false; - } - - @Override - protected void onCreate(final Bundle savedInstanceState) { - if (BuildConfig.DEBUG) { - StrictModeUtils.detectAllVmPolicy(); - StrictModeUtils.detectAllThreadPolicy(); - } - super.onCreate(savedInstanceState); - GeneralComponentHelper.build(this).inject(this); - } - - @Override - public boolean onKeyUp(int keyCode, @NonNull KeyEvent event) { - if (KeyEvent.isModifierKey(keyCode)) { - mMetaState &= ~KeyboardShortcutsHandler.getMetaStateForKeyCode(keyCode); - } - if (handleKeyboardShortcutSingle(mKeyboardShortcutsHandler, keyCode, event, mMetaState)) - return true; - return super.onKeyUp(keyCode, event); - } - - @Override - public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) { - if (KeyEvent.isModifierKey(keyCode)) { - mMetaState |= KeyboardShortcutsHandler.getMetaStateForKeyCode(keyCode); - } - if (handleKeyboardShortcutRepeat(mKeyboardShortcutsHandler, keyCode, event.getRepeatCount(), event, mMetaState)) - return true; - return super.onKeyDown(keyCode, event); - } - - @Override - protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) { - mCurrentThemeColor = getThemeColor(); - mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha(); - mProfileImageStyle = Utils.getProfileImageStyle(this); - mCurrentThemeBackgroundOption = getThemeBackgroundOption(); - mCurrentThemeFontFamily = getThemeFontFamily(); - super.onApplyThemeResource(theme, resId, first); - - if (shouldApplyWindowBackground()) { - ThemeUtils.applyWindowBackground(this, getWindow(), - mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha); - } - } - - - @Override - public void onConfigurationChanged(Configuration newConfig) { - ThemeUtils.fixNightMode(getResources(), newConfig); - super.onConfigurationChanged(newConfig); - } - - protected boolean shouldApplyWindowBackground() { - return true; - } - - -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportDialogActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/BaseSupportDialogActivity.java similarity index 97% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportDialogActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/BaseSupportDialogActivity.java index 5da9af097..704512415 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportDialogActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/BaseSupportDialogActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.annotation.SuppressLint; import android.content.res.Configuration; @@ -33,6 +33,7 @@ import android.view.View; import android.view.ViewGroup; import org.mariotaku.twidere.Constants; +import org.mariotaku.twidere.activity.ThemedFragmentActivity; import org.mariotaku.twidere.util.ThemeUtils; @SuppressLint("Registered") diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BrowserSignInActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/BrowserSignInActivity.java similarity index 99% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/BrowserSignInActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/BrowserSignInActivity.java index 26cd8cc40..71d4a96e5 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BrowserSignInActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/BrowserSignInActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.annotation.SuppressLint; import android.app.Activity; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ColorPickerDialogActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/ColorPickerDialogActivity.java similarity index 95% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/ColorPickerDialogActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/ColorPickerDialogActivity.java index 465111862..cbfd5a1c3 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ColorPickerDialogActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/ColorPickerDialogActivity.java @@ -17,12 +17,13 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; +import org.mariotaku.twidere.activity.BaseSupportDialogActivity; import org.mariotaku.twidere.fragment.support.ColorPickerDialogFragment; import org.mariotaku.twidere.fragment.support.ColorPickerDialogFragment.Callback; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/ComposeActivity.java similarity index 99% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/ComposeActivity.java index cd6c2c94e..90bbc3833 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/ComposeActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.Manifest; import android.app.Activity; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/CustomTabEditorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/CustomTabEditorActivity.java similarity index 99% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/CustomTabEditorActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/CustomTabEditorActivity.java index 35e3c346d..aae163ef3 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/CustomTabEditorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/CustomTabEditorActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.app.AlertDialog; import android.app.Dialog; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/DataExportActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/DataExportActivity.java similarity index 99% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/DataExportActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/DataExportActivity.java index b67896bb2..810657b40 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/DataExportActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/DataExportActivity.java @@ -1,4 +1,4 @@ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.content.Intent; import android.os.AsyncTask; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/DataImportActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/DataImportActivity.java similarity index 99% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/DataImportActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/DataImportActivity.java index d9d5357b9..ac718340c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/DataImportActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/DataImportActivity.java @@ -1,4 +1,4 @@ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.content.Intent; import android.os.AsyncTask; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/FileSelectorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/FileSelectorActivity.java similarity index 98% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/FileSelectorActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/FileSelectorActivity.java index c9baa41c8..792560347 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/FileSelectorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/FileSelectorActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.Manifest; import android.content.Intent; @@ -31,6 +31,7 @@ import android.support.v4.app.DialogFragment; import android.widget.Toast; import org.mariotaku.twidere.R; +import org.mariotaku.twidere.activity.BaseSupportDialogActivity; import org.mariotaku.twidere.fragment.support.FileSelectorDialogFragment; import org.mariotaku.twidere.util.PermissionUtils; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/HomeActivity.java similarity index 90% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/HomeActivity.java index 879ada975..0ed98d96a 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/HomeActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.app.PendingIntent; import android.app.SearchManager; @@ -27,24 +27,22 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.database.ContentObserver; -import android.graphics.Color; -import android.graphics.PorterDuff.Mode; import android.graphics.Rect; import android.net.Uri; import android.os.AsyncTask; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceActivity; import android.support.annotation.NonNull; +import android.support.design.widget.FloatingActionButton; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.NotificationCompat; import android.support.v4.view.GravityCompat; -import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayoutAccessor; +import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; import android.util.SparseIntArray; import android.view.Gravity; @@ -56,16 +54,12 @@ import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.view.ViewGroup.MarginLayoutParams; import android.view.Window; -import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; import com.squareup.otto.Subscribe; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.SettingsActivity; -import org.mariotaku.twidere.activity.SettingsWizardActivity; -import org.mariotaku.twidere.activity.UsageStatisticsActivity; import org.mariotaku.twidere.adapter.SupportTabsAdapter; import org.mariotaku.twidere.annotation.CustomTabType; import org.mariotaku.twidere.annotation.ReadPositionTag; @@ -99,14 +93,9 @@ import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.TwidereColorUtils; import org.mariotaku.twidere.util.TwidereMathUtils; import org.mariotaku.twidere.util.Utils; -import org.mariotaku.twidere.util.support.ActivitySupport; -import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat; -import org.mariotaku.twidere.util.support.ViewSupport; -import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat; +import org.mariotaku.twidere.view.ExtendedFrameLayout; import org.mariotaku.twidere.view.ExtendedViewPager; import org.mariotaku.twidere.view.TabPagerIndicator; -import org.mariotaku.twidere.view.TintedStatusFrameLayout; -import org.mariotaku.twidere.view.iface.IHomeActionButton; import java.util.Collections; import java.util.List; @@ -125,16 +114,15 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen private SupportTabsAdapter mPagerAdapter; private ExtendedViewPager mViewPager; + private Toolbar mActionBar; private TabPagerIndicator mTabIndicator; private DrawerLayout mDrawerLayout; private View mEmptyTabHint; - private View mActionsButton; - private View mActionBarWithOverlay; - private TintedStatusFrameLayout mHomeContent; + private FloatingActionButton mActionsButton; + private ExtendedFrameLayout mHomeContent; private UpdateUnreadCountTask mUpdateUnreadCountTask; - private Toolbar mActionBar; private OnSharedPreferenceChangeListener mReadStateChangeListener = new OnSharedPreferenceChangeListener() { @Override @@ -144,7 +132,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen }; private ControlBarShowHideHelper mControlBarShowHideHelper = new ControlBarShowHideHelper(this); private int mTabColumns; - private View mActionBarContainer; public void closeAccountsDrawer() { if (mDrawerLayout == null) return; @@ -185,8 +172,14 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen @Override public boolean getSystemWindowsInsets(Rect insets) { - final int height = mTabIndicator != null ? mTabIndicator.getHeight() : 0; - insets.top = (height != 0 ? height : ThemeUtils.getActionBarHeight(this)); + if (mTabIndicator == null || mHomeContent == null) return false; + final int height = mTabIndicator.getHeight(); + if (height != 0) { + insets.top = height; + } else { + insets.top = ThemeUtils.getActionBarHeight(this); + } + insets.top += mHomeContent.getTop(); return true; } @@ -327,14 +320,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen */ @Override protected void onCreate(final Bundle savedInstanceState) { - final Window window = getWindow(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); - window.setStatusBarColor(Color.TRANSPARENT); - } - } super.onCreate(savedInstanceState); mMultiSelectHandler = new MultiSelectEventHandler(this); mMultiSelectHandler.dispatchOnCreate(); @@ -353,7 +338,9 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen return; } setContentView(R.layout.activity_home); + setSupportActionBar(mActionBar); + final boolean refreshOnStart = mPreferences.getBoolean(KEY_REFRESH_ON_START, false); int tabDisplayOptionInt = Utils.getTabDisplayOptionInt(this); @@ -362,7 +349,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen mHomeContent.setOnFitSystemWindowsListener(this); mPagerAdapter = new SupportTabsAdapter(this, getSupportFragmentManager(), mTabIndicator, mTabColumns); mViewPager.setAdapter(mPagerAdapter); -// mViewPager.setOffscreenPageLimit(3); mTabIndicator.setViewPager(mViewPager); mTabIndicator.setOnPageChangeListener(this); mTabIndicator.setColumns(mTabColumns); @@ -374,16 +360,22 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen mTabIndicator.setDisplayBadge(mPreferences.getBoolean(KEY_UNREAD_COUNT, true)); mTabIndicator.updateAppearance(); + mHomeContent.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { + if (top != oldTop) { + final Fragment fragment = getLeftDrawerFragment(); + if (fragment instanceof AccountsDashboardFragment) { + ((AccountsDashboardFragment) fragment).requestFitSystemWindows(); + } + } + } + }); + mActionsButton.setOnClickListener(this); mActionsButton.setOnLongClickListener(this); mEmptyTabHint.setOnClickListener(this); - ThemeUtils.setCompatContentViewOverlay(this, new EmptyDrawable()); - ViewCompat.setElevation(mActionBarContainer, ThemeUtils.getSupportActionBarElevation(this)); - ViewSupport.setOutlineProvider(mActionBarContainer, ViewOutlineProviderCompat.BACKGROUND); - final View windowOverlay = findViewById(R.id.window_overlay); - ViewSupport.setBackground(windowOverlay, ThemeUtils.getNormalWindowContentOverlay(this)); - setupSlidingMenu(); setupBars(); showDataProfilingRequest(); @@ -424,11 +416,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen @Override protected void onResume() { super.onResume(); - if (ThemeUtils.isDarkTheme(this)) { - // TODO show dark bar - } else { - ActivitySupport.setTaskDescription(this, new TaskDescriptionCompat(null, null, getThemeColor())); - } invalidateOptionsMenu(); updateActionsButtonStyle(); updateActionsButton(); @@ -533,7 +520,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen if (fragment instanceof AccountsDashboardFragment) { ((AccountsDashboardFragment) fragment).requestFitSystemWindows(); } - mHomeContent.setStatusBarHeight(insets.top); } public void updateUnreadCount() { @@ -588,12 +574,14 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen return 1 - mActionsButton.getTranslationY() / total; } final float totalHeight = getControlBarHeight(); - return 1 + mActionBarWithOverlay.getTranslationY() / totalHeight; + return 1 + mActionBar.getTranslationY() / totalHeight; } @Override public void setControlBarOffset(float offset) { - mActionBarWithOverlay.setTranslationY(mTabColumns > 1 ? 0 : getControlBarHeight() * (offset - 1)); + final ActionBar actionBar = getSupportActionBar(); + if (actionBar == null) return; + mActionBar.setTranslationY(mTabColumns > 1 ? 0 : (int) (getControlBarHeight() * (offset - 1))); final ViewGroup.LayoutParams lp = mActionsButton.getLayoutParams(); if (lp instanceof MarginLayoutParams) { mActionsButton.setTranslationY((((MarginLayoutParams) lp).bottomMargin + mActionsButton.getHeight()) * (1 - offset)); @@ -606,16 +594,13 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen @Override public void onContentChanged() { super.onContentChanged(); - mActionBar = (Toolbar) findViewById(R.id.action_bar); - mActionBarContainer = findViewById(R.id.twidere_action_bar_container); mTabIndicator = (TabPagerIndicator) findViewById(R.id.main_tabs); + mActionBar = (Toolbar) findViewById(R.id.action_bar); mDrawerLayout = (DrawerLayout) findViewById(R.id.home_menu); mViewPager = (ExtendedViewPager) findViewById(R.id.main_pager); mEmptyTabHint = findViewById(R.id.empty_tab_hint); - mActionsButton = findViewById(R.id.actions_button); - mActionBarWithOverlay = findViewById(R.id.twidere_action_bar_with_overlay); - mTabIndicator = (TabPagerIndicator) findViewById(R.id.main_tabs); - mHomeContent = (TintedStatusFrameLayout) findViewById(R.id.home_content); + mActionsButton = (FloatingActionButton) findViewById(R.id.actions_button); + mHomeContent = (ExtendedFrameLayout) findViewById(R.id.home_content); } private Fragment getKeyboardShortcutRecipient() { @@ -747,34 +732,20 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen final String backgroundOption = getCurrentThemeBackgroundOption(); final boolean isTransparent = ThemeUtils.isTransparentBackground(backgroundOption); final int actionBarAlpha = isTransparent ? ThemeUtils.getActionBarAlpha(ThemeUtils.getUserThemeBackgroundAlpha(this)) : 0xFF; - final IHomeActionButton homeActionButton = (IHomeActionButton) mActionsButton; mTabIndicator.setItemContext(ThemeUtils.getActionBarThemedContext(this, themeColor)); - ViewSupport.setBackground(mActionBarContainer, ThemeUtils.getActionBarBackground(this, themeColor, - backgroundOption, true)); - final int actionBarColor = ThemeUtils.getActionBarColor(this, themeColor, backgroundOption); - final int actionItemColor = ThemeUtils.getContrastForegroundColor(this, themeColor); final int[] foregroundColors = new int[2]; ThemeUtils.getColorForegroundAndInverse(this, foregroundColors); if (ThemeUtils.isDarkTheme(this)) { - homeActionButton.setButtonColor(actionBarColor); - homeActionButton.setIconColor(actionItemColor, Mode.SRC_ATOP); mTabIndicator.setStripColor(themeColor); mTabIndicator.setIconColor(foregroundColors[0]); mTabIndicator.setLabelColor(foregroundColors[0]); } else { final int contrastColor = TwidereColorUtils.getContrastYIQ(themeColor, ThemeUtils.ACCENT_COLOR_THRESHOLD, foregroundColors[0], foregroundColors[1]); - homeActionButton.setButtonColor(themeColor); - homeActionButton.setIconColor(actionItemColor, Mode.SRC_ATOP); mTabIndicator.setStripColor(contrastColor); mTabIndicator.setIconColor(contrastColor); mTabIndicator.setLabelColor(contrastColor); } - mHomeContent.setDrawColor(true); - mHomeContent.setDrawShadow(false); - mHomeContent.setColor(actionBarColor, actionBarAlpha); - mHomeContent.setFactor(1); - mActionBarWithOverlay.setAlpha(actionBarAlpha / 255f); mActionsButton.setAlpha(actionBarAlpha / 255f); } @@ -843,11 +814,8 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen icon = R.drawable.ic_action_status_compose; title = R.string.compose; } - if (mActionsButton instanceof IHomeActionButton) { - final IHomeActionButton hab = (IHomeActionButton) mActionsButton; - hab.setIcon(icon); - hab.setTitle(title); - } + mActionsButton.setImageResource(icon); + mActionsButton.setContentDescription(getString(title)); } private void updateActionsButtonStyle() { diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/ImageCropperActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/ImageCropperActivity.java index 7580736fd..15f5e241a 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/ImageCropperActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/ImageCropperActivity.java @@ -138,11 +138,6 @@ public class ImageCropperActivity extends CropImageActivity implements IThemedAc return mProfileImageStyle; } - @Override - public final void restart() { - Utils.restartActivity(this); - } - @Override protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) { mCurrentThemeColor = getThemeColor(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/KeyboardShortcutPreferenceCompatActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/KeyboardShortcutPreferenceCompatActivity.java index 495df222f..d484e383d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/KeyboardShortcutPreferenceCompatActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/KeyboardShortcutPreferenceCompatActivity.java @@ -37,7 +37,8 @@ import org.mariotaku.twidere.util.ThemeUtils; /** * Created by mariotaku on 15/4/20. */ -public class KeyboardShortcutPreferenceCompatActivity extends BaseThemedActivity implements Constants, OnClickListener { +public class KeyboardShortcutPreferenceCompatActivity extends BaseSupportDialogActivity implements + Constants, OnClickListener { public static final String EXTRA_CONTEXT_TAG = "context_tag"; public static final String EXTRA_KEY_ACTION = "key_action"; @@ -74,12 +75,12 @@ public class KeyboardShortcutPreferenceCompatActivity extends BaseThemedActivity switch (v.getId()) { case R.id.button_positive: { if (mKeySpec == null) return; - mKeyboardShortcutHandler.register(mKeySpec, getKeyAction()); + mKeyboardShortcutsHandler.register(mKeySpec, getKeyAction()); finish(); break; } case R.id.button_neutral: { - mKeyboardShortcutHandler.unregister(getKeyAction()); + mKeyboardShortcutsHandler.unregister(getKeyAction()); finish(); break; } @@ -112,10 +113,10 @@ public class KeyboardShortcutPreferenceCompatActivity extends BaseThemedActivity } mKeySpec = spec; mKeysLabel.setText(spec.toKeyString()); - final String oldAction = mKeyboardShortcutHandler.findAction(spec); + final String oldAction = mKeyboardShortcutsHandler.findAction(spec); final KeyboardShortcutSpec copyOfSpec = spec.copy(); copyOfSpec.setContextTag(null); - final String oldGeneralAction = mKeyboardShortcutHandler.findAction(copyOfSpec); + final String oldGeneralAction = mKeyboardShortcutsHandler.findAction(copyOfSpec); if (!TextUtils.isEmpty(oldAction) && !keyAction.equals(oldAction)) { // Conflicts with keys in same context tag mConflictLabel.setVisibility(View.VISIBLE); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/LinkHandlerActivity.java similarity index 78% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/LinkHandlerActivity.java index 13d3b3134..41b11f695 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/LinkHandlerActivity.java @@ -17,30 +17,25 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.annotation.SuppressLint; import android.content.Intent; import android.graphics.Rect; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.NavUtils; -import android.support.v4.view.ViewCompat; import android.support.v7.app.ActionBar; import android.support.v7.widget.ActionBarContainer; import android.support.v7.widget.ActionMenuView; import android.support.v7.widget.Toolbar; import android.view.KeyEvent; -import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager.LayoutParams; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.iface.IControlBarActivity; @@ -53,14 +48,10 @@ import org.mariotaku.twidere.util.KeyboardShortcutsHandler; import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback; import org.mariotaku.twidere.util.MultiSelectEventHandler; import org.mariotaku.twidere.util.ThemeUtils; -import org.mariotaku.twidere.util.TwidereActionModeForChildListener; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.support.ActivitySupport; import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat; import org.mariotaku.twidere.util.support.ViewSupport; -import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat; -import org.mariotaku.twidere.view.TintedStatusFrameLayout; -import org.mariotaku.twidere.view.TintedStatusNativeActionModeAwareLayout; import static org.mariotaku.twidere.util.Utils.createFragmentForIntent; import static org.mariotaku.twidere.util.Utils.matchLinkId; @@ -70,8 +61,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System private ControlBarShowHideHelper mControlBarShowHideHelper = new ControlBarShowHideHelper(this); private MultiSelectEventHandler mMultiSelectHandler; - private TwidereActionModeForChildListener mTwidereActionModeForChildListener; - private TintedStatusFrameLayout mMainContent; private final View.OnLayoutChangeListener mLayoutChangeListener = new View.OnLayoutChangeListener() { private final Rect tempInsets = new Rect(); @@ -81,14 +70,11 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { if (compatCalled) return; if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom && !ViewSupport.isInLayout(v)) { - mMainContent.getSystemWindowsInsets(tempInsets); onFitSystemWindows(tempInsets); compatCalled = true; } } }; - private View mActionBarWithOverlay; - private ActionBarContainer mActionBarContainer; private boolean mFinishOnly; private int mActionBarHeight; @@ -104,14 +90,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System return false; } - @Override - public void onBackPressed() { - if (mTwidereActionModeForChildListener.finishExisting()) { - return; - } - super.onBackPressed(); - } - @Override public void onFitSystemWindows(Rect insets) { final View actionBarContainer = findViewById(R.id.twidere_action_bar_container); @@ -206,28 +184,14 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System final Intent intent = getIntent(); final Uri data = intent.getData(); final int linkId = matchLinkId(data); - requestWindowFeatures(getWindow(), linkId, data); super.onCreate(savedInstanceState); - setContentView(R.layout.activity_content_fragment); - setSupportActionBar((Toolbar) findViewById(R.id.action_bar)); - - mTwidereActionModeForChildListener = new TwidereActionModeForChildListener(this, this, false); - final TintedStatusNativeActionModeAwareLayout layout = (TintedStatusNativeActionModeAwareLayout) findViewById(R.id.main_content); - layout.setActionModeForChildListener(mTwidereActionModeForChildListener); ThemeUtils.setCompatContentViewOverlay(this, new EmptyDrawable()); - final View actionBarContainer = findViewById(R.id.twidere_action_bar_container); - ViewCompat.setElevation(actionBarContainer, ThemeUtils.getSupportActionBarElevation(this)); - ViewSupport.setOutlineProvider(actionBarContainer, ViewOutlineProviderCompat.BACKGROUND); - final View windowOverlay = findViewById(R.id.window_overlay); - ViewSupport.setBackground(windowOverlay, ThemeUtils.getNormalWindowContentOverlay(this)); final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); setActionBarTheme(linkId); } - mMainContent.setOnFitSystemWindowsListener(this); - setStatusBarColor(linkId, data); Utils.logOpenNotificationFromUri(this, data); if (!showFragment(linkId, data)) { finish(); @@ -237,7 +201,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System @Override protected void onStart() { - mMainContent.addOnLayoutChangeListener(mLayoutChangeListener); super.onStart(); mMultiSelectHandler.dispatchOnStart(); } @@ -246,22 +209,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System protected void onStop() { mMultiSelectHandler.dispatchOnStop(); super.onStop(); - mMainContent.removeOnLayoutChangeListener(mLayoutChangeListener); - } - - @Override - public boolean onPreparePanel(int featureId, View view, Menu menu) { - final boolean result = super.onPreparePanel(featureId, view, menu); - if (shouldSetActionItemColor()) { - setupToolbarMenuItemColor(); - mActionBarContainer.post(new Runnable() { - @Override - public void run() { - setupToolbarMenuItemColor(); - } - }); - } - return result; } private void setupToolbarMenuItemColor() { @@ -282,9 +229,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System @Override public void onContentChanged() { super.onContentChanged(); - mMainContent = (TintedStatusFrameLayout) findViewById(R.id.main_content); - mActionBarWithOverlay = findViewById(R.id.twidere_action_bar_with_overlay); - mActionBarContainer = (ActionBarContainer) findViewById(R.id.twidere_action_bar_container); } protected boolean shouldSetActionItemColor() { @@ -313,24 +257,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System return false; } - private void requestWindowFeatures(Window window, int linkId, Uri uri) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - window.addFlags(LayoutParams.FLAG_TRANSLUCENT_STATUS); - } - final int transitionRes; - switch (linkId) { - default: { - transitionRes = 0; - break; - } - } - //noinspection ConstantConditions - if (transitionRes != 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP - && !ThemeUtils.isTransparentBackground(getCurrentThemeBackgroundOption())) { - Utils.setSharedElementTransition(this, window, transitionRes); - } - } - @SuppressLint("AppCompatMethod") private void setActionBarTheme(int linkId) { final int themeColor = getCurrentThemeColor(); @@ -349,28 +275,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System break; } } - final boolean isTransparent = ThemeUtils.isTransparentBackground(option); - final int actionBarAlpha = isTransparent ? ThemeUtils.getActionBarAlpha(ThemeUtils.getUserThemeBackgroundAlpha(this)) : 0xFF; - mActionBarWithOverlay.setAlpha(actionBarAlpha / 255f); - } - - private void setStatusBarColor(int linkId, Uri uri) { - switch (linkId) { - case LINK_ID_USER: { - mMainContent.setDrawShadow(true); - mMainContent.setShadowColor(0xA0000000); - break; - } - default: { - mMainContent.setDrawShadow(false); - break; - } - } - mMainContent.setDrawColor(true); - mMainContent.setFactor(1); - final int alpha = ThemeUtils.getActionBarAlpha(getThemeBackgroundOption(), getCurrentThemeBackgroundAlpha()); - final int statusBarColor = ThemeUtils.getActionBarColor(this, getCurrentThemeColor(), getThemeBackgroundOption()); - mMainContent.setColor(statusBarColor, alpha); } private boolean showFragment(final int linkId, final Uri uri) { @@ -528,7 +432,7 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System } mFinishOnly = Boolean.parseBoolean(uri.getQueryParameter(QUERY_PARAM_FINISH_ONLY)); final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); - ft.replace(R.id.content_fragment, fragment); + ft.replace(android.R.id.content, fragment); ft.commit(); return true; } @@ -549,14 +453,12 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System @Override public float getControlBarOffset() { - return 1 + mActionBarContainer.getTranslationY() / (float) getControlBarHeight(); + return 0; } @Override public void setControlBarOffset(float offset) { final int translationY = -Math.round((1 - offset) * getControlBarHeight()); - mActionBarContainer.setTranslationY(translationY); - mTwidereActionModeForChildListener.setModeTranslationY(translationY); notifyControlBarOffsetChanged(); } @@ -576,7 +478,7 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System } public ActionBarContainer getActionBarContainer() { - return mActionBarContainer; + return null; } public interface HideUiOnScroll { diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/MainActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/MainActivity.java index 1d69674e8..98ddd3254 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/MainActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/MainActivity.java @@ -26,7 +26,6 @@ import android.os.Bundle; import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.Constants; -import org.mariotaku.twidere.activity.support.HomeActivity; import org.mariotaku.twidere.util.StrictModeUtils; import org.mariotaku.twidere.util.ThemeUtils; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/MediaViewerActivity.java similarity index 99% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/MediaViewerActivity.java index 059009ac0..33394a6c6 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/MediaViewerActivity.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.Manifest; import android.annotation.SuppressLint; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/QuickSearchBarActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/QuickSearchBarActivity.java similarity index 99% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/QuickSearchBarActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/QuickSearchBarActivity.java index f32c0da4d..1ff11ebcb 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/QuickSearchBarActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/QuickSearchBarActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.content.ContentResolver; import android.content.Context; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/RequestPermissionsActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/RequestPermissionsActivity.java similarity index 98% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/RequestPermissionsActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/RequestPermissionsActivity.java index 094542ea7..fe646a81c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/RequestPermissionsActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/RequestPermissionsActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; @@ -36,6 +36,7 @@ import android.widget.ImageView; import android.widget.TextView; import org.mariotaku.twidere.R; +import org.mariotaku.twidere.activity.BaseSupportDialogActivity; import org.mariotaku.twidere.util.HtmlEscapeHelper; import org.mariotaku.twidere.util.PermissionsManager; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsActivity.java index 2a85cbd9d..f98c3dbf7 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsActivity.java @@ -51,7 +51,6 @@ import android.widget.ListView; import android.widget.TextView; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.support.BaseAppCompatActivity; import org.mariotaku.twidere.fragment.CustomTabsFragment; import org.mariotaku.twidere.fragment.ExtensionsListFragment; import org.mariotaku.twidere.fragment.SettingsDetailsFragment; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsWizardActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsWizardActivity.java index 28d29de1c..b9766535d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsWizardActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsWizardActivity.java @@ -35,12 +35,9 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.v4.view.LayoutInflaterCompat; -import android.support.v4.view.LayoutInflaterFactory; import android.support.v4.view.ViewPager; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; -import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -48,9 +45,6 @@ import android.view.ViewGroup; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.support.BaseAppCompatActivity; -import org.mariotaku.twidere.activity.support.DataImportActivity; -import org.mariotaku.twidere.activity.support.HomeActivity; import org.mariotaku.twidere.adapter.SupportTabsAdapter; import org.mariotaku.twidere.annotation.CustomTabType; import org.mariotaku.twidere.fragment.BasePreferenceFragment; @@ -70,7 +64,6 @@ import org.mariotaku.twidere.util.CustomTabUtils; import org.mariotaku.twidere.util.InternalParseUtils; import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ThemeUtils; -import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory; import org.mariotaku.twidere.util.TwidereMathUtils; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.view.LinePageIndicator; @@ -174,21 +167,6 @@ public class SettingsWizardActivity extends BaseAppCompatActivity implements Con return ThemeUtils.getUserAccentColor(this); } - @NonNull - @Override - public LayoutInflater getLayoutInflater() { - final LayoutInflater inflater = super.getLayoutInflater(); - if (inflater.getFactory() == null) { - LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory(this, new LayoutInflaterFactory() { - @Override - public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { - return SettingsWizardActivity.this.onCreateView(parent, name, context, attrs); - } - })); - } - return inflater; - } - @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -314,7 +292,7 @@ public class SettingsWizardActivity extends BaseAppCompatActivity implements Con final Intent intent = getIntent(); intent.putExtra(EXTRA_PAGE, mViewPager.getCurrentItem()); setIntent(intent); - restart(); + recreate(); } public static class WizardPageCardsFragment extends BaseWizardPageFragment { diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/SignInActivity.java similarity index 98% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/SignInActivity.java index 9844b4d60..0e1660f13 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/SignInActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.app.Dialog; import android.content.ContentResolver; @@ -41,7 +41,6 @@ import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewCompat; -import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.widget.ActionMenuView; import android.support.v7.widget.Toolbar; @@ -69,7 +68,6 @@ import org.mariotaku.restfu.http.Endpoint; import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.SettingsActivity; import org.mariotaku.twidere.activity.iface.IExtendedActivity; import org.mariotaku.twidere.api.statusnet.model.StatusNetConfig; import org.mariotaku.twidere.api.twitter.Twitter; @@ -533,21 +531,6 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList return true; } - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - setupActionBar(); - } - - private void setupActionBar() { - final ActionBar actionBar = getSupportActionBar(); - if (actionBar == null) return; - - final int themeColor = getCurrentThemeColor(); - final String option = getThemeBackgroundOption(); - ThemeUtils.applyActionBarBackground(actionBar, this, themeColor, option, isActionBarOutlineEnabled()); - } - private void setupTintStatusBar() { if (mMainContent == null) return; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/BaseThemedActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/ThemedAppCompatActivity.java similarity index 69% rename from twidere/src/main/java/org/mariotaku/twidere/activity/BaseThemedActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/ThemedAppCompatActivity.java index b3e3e3824..4af509c0e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/BaseThemedActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/ThemedAppCompatActivity.java @@ -19,32 +19,39 @@ package org.mariotaku.twidere.activity; -import android.app.Activity; import android.content.res.Configuration; import android.content.res.Resources; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.widget.Toolbar; +import android.view.View; +import android.view.Window; + +import com.afollestad.appthemeengine.ATE; +import com.afollestad.appthemeengine.ATEActivity; import org.mariotaku.twidere.BuildConfig; +import org.mariotaku.twidere.Constants; +import org.mariotaku.twidere.activity.iface.IAppCompatActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity; -import org.mariotaku.twidere.util.KeyboardShortcutsHandler; import org.mariotaku.twidere.util.StrictModeUtils; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.Utils; -import org.mariotaku.twidere.util.dagger.GeneralComponentHelper; -import org.mariotaku.twidere.view.ShapedImageView; +import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle; -import javax.inject.Inject; - -public abstract class BaseThemedActivity extends Activity implements IThemedActivity { +public abstract class ThemedAppCompatActivity extends ATEActivity implements Constants, + IThemedActivity, IAppCompatActivity { + // Data fields private int mCurrentThemeColor; private int mCurrentThemeBackgroundAlpha; - private String mCurrentThemeFontFamily; - private String mCurrentThemeBackgroundOption; + @ShapeStyle private int mProfileImageStyle; - @Inject - protected KeyboardShortcutsHandler mKeyboardShortcutHandler; + private String mCurrentThemeBackgroundOption; + private String mCurrentThemeFontFamily; + + private Toolbar mToolbar; @Override public String getCurrentThemeFontFamily() { @@ -72,7 +79,9 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi } @Override - public abstract int getThemeColor(); + public String getThemeBackgroundOption() { + return ThemeUtils.getThemeBackgroundOption(this); + } @Override public String getThemeFontFamily() { @@ -80,52 +89,42 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi } @Override - @ShapedImageView.ShapeStyle + @ShapeStyle public int getCurrentProfileImageStyle() { return mProfileImageStyle; } - @Override - public final void restart() { - Utils.restartActivity(this); - } - - @Override protected void onCreate(final Bundle savedInstanceState) { if (BuildConfig.DEBUG) { StrictModeUtils.detectAllVmPolicy(); StrictModeUtils.detectAllThreadPolicy(); } + final int themeColor = getThemeColor(); + super.onCreate(savedInstanceState); - GeneralComponentHelper.build(this).inject(this); - setActionBarBackground(); } - private void setActionBarBackground() { - } + @Nullable @Override - public void setTheme(int resId) { - super.setTheme(resId); - if (shouldApplyWindowBackground()) { - ThemeUtils.applyWindowBackground(this, getWindow(), - mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha); - } + public String getATEKey() { + return ThemeUtils.getATEKey(this); } @Override protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) { mCurrentThemeColor = getThemeColor(); - mCurrentThemeFontFamily = getThemeFontFamily(); mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha(); - mCurrentThemeBackgroundOption = getThemeBackgroundOption(); mProfileImageStyle = Utils.getProfileImageStyle(this); + mCurrentThemeBackgroundOption = getThemeBackgroundOption(); + mCurrentThemeFontFamily = getThemeFontFamily(); super.onApplyThemeResource(theme, resId, first); - } - - protected boolean shouldApplyWindowBackground() { - return true; + final Window window = getWindow(); + if (shouldApplyWindowBackground()) { + ThemeUtils.applyWindowBackground(this, window, mCurrentThemeBackgroundOption, + mCurrentThemeBackgroundAlpha); + } } @@ -134,4 +133,24 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi ThemeUtils.fixNightMode(getResources(), newConfig); super.onConfigurationChanged(newConfig); } + + @Nullable + public final Toolbar peekActionBarToolbar() { + return mToolbar; + } + + @Nullable + public final Toolbar getActionBarToolbar() { + if (mToolbar != null) return mToolbar; + final View actionBarView = getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar); + if (actionBarView instanceof Toolbar) { + return (Toolbar) actionBarView; + } + return null; + } + + protected boolean shouldApplyWindowBackground() { + return true; + } + } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedFragmentActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/ThemedFragmentActivity.java similarity index 86% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedFragmentActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/ThemedFragmentActivity.java index b883e7f52..6b96ff0d7 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedFragmentActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/ThemedFragmentActivity.java @@ -17,20 +17,14 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; -import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.FragmentActivity; -import android.support.v4.view.LayoutInflaterCompat; -import android.support.v4.view.LayoutInflaterFactory; -import android.util.AttributeSet; import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; import com.squareup.otto.Bus; @@ -46,7 +40,6 @@ import org.mariotaku.twidere.util.PermissionsManager; import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.StrictModeUtils; import org.mariotaku.twidere.util.ThemeUtils; -import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory; import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.dagger.GeneralComponentHelper; @@ -84,21 +77,6 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements private String mCurrentThemeFontFamily; private int mMetaState; - @NonNull - @Override - public LayoutInflater getLayoutInflater() { - final LayoutInflater inflater = super.getLayoutInflater(); - if (inflater.getFactory() == null) { - LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory(this, new LayoutInflaterFactory() { - @Override - public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { - return ThemedFragmentActivity.this.onCreateView(parent, name, context, attrs); - } - })); - } - return inflater; - } - @Override public String getCurrentThemeFontFamily() { return mCurrentThemeFontFamily; @@ -140,11 +118,6 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements return mProfileImageStyle; } - @Override - public final void restart() { - Utils.restartActivity(this); - } - @Override protected void onCreate(final Bundle savedInstanceState) { if (BuildConfig.DEBUG) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedImagePickerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/ThemedImagePickerActivity.java similarity index 95% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedImagePickerActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/ThemedImagePickerActivity.java index 6491b9cfd..742cf7142 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedImagePickerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/ThemedImagePickerActivity.java @@ -1,4 +1,4 @@ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.content.Context; import android.content.Intent; @@ -6,7 +6,6 @@ import android.net.Uri; import android.support.annotation.NonNull; import org.mariotaku.pickncrop.library.ImagePickerActivity; -import org.mariotaku.twidere.activity.ImageCropperActivity; import org.mariotaku.twidere.util.RestFuNetworkStreamDownloader; public class ThemedImagePickerActivity extends ImagePickerActivity { diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java index 5d21103e5..db1adc1ef 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java @@ -15,7 +15,6 @@ import android.util.Pair; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.math.NumberUtils; import org.mariotaku.twidere.Constants; -import org.mariotaku.twidere.activity.support.ComposeActivity; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.support.IntentSupport; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserListSelectorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/UserListSelectorActivity.java similarity index 99% rename from twidere/src/main/java/org/mariotaku/twidere/activity/support/UserListSelectorActivity.java rename to twidere/src/main/java/org/mariotaku/twidere/activity/UserListSelectorActivity.java index 5218f304e..10cfdd807 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserListSelectorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/UserListSelectorActivity.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.activity.support; +package org.mariotaku.twidere.activity; import android.content.Intent; import android.os.AsyncTask; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/iface/IThemedActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/iface/IThemedActivity.java index 9c21eb4ed..7dc004cd8 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/iface/IThemedActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/iface/IThemedActivity.java @@ -42,6 +42,4 @@ public interface IThemedActivity { @ShapedImageView.ShapeStyle int getCurrentProfileImageStyle(); - void restart(); - } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedAppCompatActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedAppCompatActivity.java deleted file mode 100644 index 3ff8e893c..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedAppCompatActivity.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2014 Mariotaku Lee - * - * 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 . - */ - -package org.mariotaku.twidere.activity.support; - -import android.content.res.Configuration; -import android.content.res.Resources; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.ThemedAppCompatDelegateFactory; -import android.support.v7.widget.ActionBarContainer; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.View; -import android.view.Window; - -import org.mariotaku.twidere.BuildConfig; -import org.mariotaku.twidere.Constants; -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.iface.IAppCompatActivity; -import org.mariotaku.twidere.activity.iface.IThemedActivity; -import org.mariotaku.twidere.util.StrictModeUtils; -import org.mariotaku.twidere.util.ThemeUtils; -import org.mariotaku.twidere.util.Utils; -import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle; - -public abstract class ThemedAppCompatActivity extends AppCompatActivity implements Constants, - IThemedActivity, IAppCompatActivity { - - // Data fields - private int mCurrentThemeColor; - private int mCurrentThemeBackgroundAlpha; - @ShapeStyle - private int mProfileImageStyle; - private String mCurrentThemeBackgroundOption; - private String mCurrentThemeFontFamily; - - private ThemedAppCompatDelegateFactory.ThemedAppCompatDelegate mDelegate; - private Toolbar mToolbar; - - @Override - public String getCurrentThemeFontFamily() { - return mCurrentThemeFontFamily; - } - - @Override - public int getCurrentThemeBackgroundAlpha() { - return mCurrentThemeBackgroundAlpha; - } - - @Override - public String getCurrentThemeBackgroundOption() { - return mCurrentThemeBackgroundOption; - } - - @Override - public int getCurrentThemeColor() { - return mCurrentThemeColor; - } - - @Override - public int getThemeBackgroundAlpha() { - return ThemeUtils.getUserThemeBackgroundAlpha(this); - } - - @Override - public String getThemeBackgroundOption() { - return ThemeUtils.getThemeBackgroundOption(this); - } - - @Override - public String getThemeFontFamily() { - return ThemeUtils.getThemeFontFamily(this); - } - - @Override - @ShapeStyle - public int getCurrentProfileImageStyle() { - return mProfileImageStyle; - } - - @Override - public final void restart() { - Utils.restartActivity(this); - } - - @Override - protected void onCreate(final Bundle savedInstanceState) { - if (BuildConfig.DEBUG) { - StrictModeUtils.detectAllVmPolicy(); - StrictModeUtils.detectAllThreadPolicy(); - } - super.onCreate(savedInstanceState); - ThemeUtils.applyToolbarItemColor(this, getActionBarToolbar(), getCurrentThemeColor()); - } - - @Override - public void onSupportActionModeStarted(@NonNull android.support.v7.view.ActionMode mode) { - super.onSupportActionModeStarted(mode); - ThemeUtils.applySupportActionModeColor(mode, getCurrentThemeColor(), - getThemeBackgroundOption(), true); - ThemeUtils.applySupportActionModeItemColor(mode, getCurrentThemeColor()); - } - - @NonNull - @Override - public ThemedAppCompatDelegateFactory.ThemedAppCompatDelegate getDelegate() { - if (mDelegate != null) return mDelegate; - return mDelegate = ThemedAppCompatDelegateFactory.create(this, this); - } - - @Override - protected void onApplyThemeResource(@NonNull Resources.Theme theme, int resId, boolean first) { - mCurrentThemeColor = getThemeColor(); - mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha(); - mProfileImageStyle = Utils.getProfileImageStyle(this); - mCurrentThemeBackgroundOption = getThemeBackgroundOption(); - mCurrentThemeFontFamily = getThemeFontFamily(); - super.onApplyThemeResource(theme, resId, first); - final Window window = getWindow(); - if (shouldApplyWindowBackground()) { - ThemeUtils.applyWindowBackground(this, window, mCurrentThemeBackgroundOption, - mCurrentThemeBackgroundAlpha); - } - } - - @Override - public void onContentChanged() { - super.onContentChanged(); - final Window window = getWindow(); - final Toolbar actionBarToolbar = (Toolbar) window.findViewById(R.id.action_bar); - final ActionBarContainer actionBarContainer = (ActionBarContainer) window.findViewById(R.id.action_bar_container); - ThemeUtils.applyActionBarBackground(actionBarContainer, this, mCurrentThemeColor, - mCurrentThemeBackgroundOption, true); - ThemeUtils.applyToolbarItemColor(this, actionBarToolbar, mCurrentThemeColor); - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - final boolean result = super.onPrepareOptionsMenu(menu); - final Window window = getWindow(); - final Toolbar actionBarToolbar = (Toolbar) window.findViewById(R.id.action_bar); - ThemeUtils.applyToolbarItemColor(this, actionBarToolbar, mCurrentThemeColor); - return result; - } - - @Override - public void setSupportActionBar(Toolbar toolbar) { - super.setSupportActionBar(toolbar); - mToolbar = toolbar; - ThemeUtils.applyToolbarItemColor(this, toolbar, mCurrentThemeColor); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - ThemeUtils.fixNightMode(getResources(), newConfig); - super.onConfigurationChanged(newConfig); - } - - @Nullable - public final Toolbar peekActionBarToolbar() { - return mToolbar; - } - - @Nullable - public final Toolbar getActionBarToolbar() { - if (mToolbar != null) return mToolbar; - final View actionBarView = getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar); - if (actionBarView instanceof Toolbar) { - return (Toolbar) actionBarView; - } - return null; - } - - protected boolean shouldApplyWindowBackground() { - return true; - } - -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java index 63c428609..30c69fcce 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java +++ b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java @@ -36,11 +36,15 @@ import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.multidex.MultiDex; +import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatDelegate; +import com.afollestad.appthemeengine.ATE; + import org.apache.commons.lang3.ArrayUtils; import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.Constants; +import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.AssistLauncherActivity; import org.mariotaku.twidere.activity.MainActivity; import org.mariotaku.twidere.activity.MainHondaJOJOActivity; @@ -114,6 +118,10 @@ public class TwidereApplication extends Application implements Constants, if (BuildConfig.DEBUG) { StrictModeUtils.detectAllVmPolicy(); } + if (!ATE.config(this, null).isConfigured()) { + final int accentColor = ThemeUtils.getUserAccentColor(this); + ATE.config(this, null).primaryColor(accentColor).accentColor(accentColor).commit(); + } resetTheme(getSharedPreferences()); super.onCreate(); initializeAsyncTask(); @@ -255,6 +263,12 @@ public class TwidereApplication extends Application implements Constants, resetTheme(preferences); break; } + case KEY_THEME_COLOR: { + final int themeColor = preferences.getInt(key, ContextCompat.getColor(this, R.color.branding_color)); + ATE.config(this, "light").primaryColor(themeColor).accentColor(themeColor).commit(); + ATE.config(this, "dark").accentColor(themeColor).commit(); + break; + } } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/CustomTabsFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/CustomTabsFragment.java index 233e04231..7f2d1f914 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/CustomTabsFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/CustomTabsFragment.java @@ -60,7 +60,7 @@ import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.RawItemArray; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.SettingsActivity; -import org.mariotaku.twidere.activity.support.CustomTabEditorActivity; +import org.mariotaku.twidere.activity.CustomTabEditorActivity; import org.mariotaku.twidere.fragment.support.BaseSupportFragment; import org.mariotaku.twidere.model.CustomTabConfiguration; import org.mariotaku.twidere.model.CustomTabConfiguration.CustomTabConfigurationComparator; diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AccountsDashboardFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AccountsDashboardFragment.java index 1eb17faa3..cadeaa17c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AccountsDashboardFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AccountsDashboardFragment.java @@ -35,7 +35,6 @@ import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Matrix; -import android.graphics.PorterDuff.Mode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; @@ -43,11 +42,11 @@ import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.design.widget.NavigationView; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; -import android.support.v4.content.res.ResourcesCompat; import android.support.v4.view.MenuItemCompat; import android.support.v7.view.SupportMenuInflater; import android.support.v7.widget.ActionMenuView; @@ -66,23 +65,16 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; -import android.widget.AdapterView; import android.widget.ImageView; -import android.widget.ListAdapter; -import android.widget.ListView; import android.widget.TextView; -import com.commonsware.cwac.merge.MergeAdapter; - import org.apache.commons.lang3.ArrayUtils; import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.twidere.R; +import org.mariotaku.twidere.activity.ComposeActivity; +import org.mariotaku.twidere.activity.HomeActivity; +import org.mariotaku.twidere.activity.QuickSearchBarActivity; import org.mariotaku.twidere.activity.SettingsActivity; -import org.mariotaku.twidere.activity.iface.IThemedActivity; -import org.mariotaku.twidere.activity.support.ComposeActivity; -import org.mariotaku.twidere.activity.support.HomeActivity; -import org.mariotaku.twidere.activity.support.QuickSearchBarActivity; -import org.mariotaku.twidere.adapter.ArrayAdapter; import org.mariotaku.twidere.annotation.CustomTabType; import org.mariotaku.twidere.menu.support.AccountToggleProvider; import org.mariotaku.twidere.model.ParcelableAccount; @@ -96,36 +88,27 @@ import org.mariotaku.twidere.util.DataStoreUtils; import org.mariotaku.twidere.util.IntentUtils; import org.mariotaku.twidere.util.KeyboardShortcutsHandler; import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback; -import org.mariotaku.twidere.util.ListViewUtils; import org.mariotaku.twidere.util.MediaLoaderWrapper; -import org.mariotaku.twidere.util.SharedPreferencesWrapper; -import org.mariotaku.twidere.util.ThemeUtils; +import org.mariotaku.twidere.util.MenuUtils; import org.mariotaku.twidere.util.TransitionUtils; -import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.content.SupportFragmentReloadCursorObserver; -import org.mariotaku.twidere.util.dagger.GeneralComponentHelper; import org.mariotaku.twidere.view.ShapedImageView; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import javax.inject.Inject; - public class AccountsDashboardFragment extends BaseSupportFragment implements LoaderCallbacks, OnSharedPreferenceChangeListener, OnClickListener, KeyboardShortcutCallback, - AdapterView.OnItemClickListener { + NavigationView.OnNavigationItemSelectedListener { private final Rect mSystemWindowsInsets = new Rect(); private ContentResolver mResolver; - private MergeAdapter mAdapter; private AccountSelectorAdapter mAccountsAdapter; - private AccountOptionsAdapter mAccountOptionsAdapter; - private AppMenuAdapter mAppMenuAdapter; - private ListView mListView; + private NavigationView mNavigationView; private View mAccountSelectorView; private RecyclerView mAccountsSelector; private ImageView mAccountProfileBannerView; @@ -197,25 +180,24 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo return false; } } - final int firstVisiblePosition = ListViewUtils.getFirstFullyVisiblePosition(mListView); - final int selectedItem = mListView.getSelectedItemPosition(); - final int count = mListView.getCount(); - int resultPosition; - if (!mListView.isFocused() || selectedItem == ListView.INVALID_POSITION) { - resultPosition = firstVisiblePosition; - } else { - resultPosition = selectedItem + offset; - while (resultPosition >= 0 && resultPosition < count && !mAdapter.isEnabled(resultPosition)) { - resultPosition += offset; - } - } - final View focusedChild = mListView.getFocusedChild(); - if (focusedChild == null) { - mListView.requestChildFocus(mListView.getChildAt(0), null); - } - if (resultPosition >= 0 && resultPosition < count) { - mListView.setSelection(resultPosition); - } +// final int selectedItem = mNavigationView.getSelectedItemPosition(); +// final int count = mNavigationView.getCount(); +// int resultPosition; +// if (!mNavigationView.isFocused() || selectedItem == ListView.INVALID_POSITION) { +// resultPosition = firstVisiblePosition; +// } else { +// resultPosition = selectedItem + offset; +// while (resultPosition >= 0 && resultPosition < count && !mAdapter.isEnabled(resultPosition)) { +// resultPosition += offset; +// } +// } +// final View focusedChild = mNavigationView.getFocusedChild(); +// if (focusedChild == null) { +// mNavigationView.requestChildFocus(mNavigationView.getChildAt(0), null); +// } +// if (resultPosition >= 0 && resultPosition < count) { +// mNavigationView.setSelection(resultPosition); +// } return true; } @@ -225,8 +207,8 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo case REQUEST_SETTINGS: { if (data == null) return; final FragmentActivity activity = getActivity(); - if (data.getBooleanExtra(EXTRA_CHANGED, false) && activity instanceof IThemedActivity) { - ((IThemedActivity) activity).restart(); + if (data.getBooleanExtra(EXTRA_CHANGED, false)) { + activity.recreate(); } return; } @@ -298,8 +280,6 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo } mAccountsAdapter.setSelectedAccountKey(accountKey); - mAccountOptionsAdapter.setSelectedAccount(mAccountsAdapter.getSelectedAccount()); - if (mAccountActionProvider != null) { mAccountActionProvider.setExclusive(false); mAccountActionProvider.setAccounts(accounts); @@ -313,87 +293,6 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo public void onLoaderReset(final Loader loader) { } - @Override - public void onItemClick(final AdapterView parent, final View v, final int position, final long id) { - final ListAdapter adapter = mAdapter.getAdapter(position); - final Object item = mAdapter.getItem(position); - if (adapter instanceof AccountOptionsAdapter) { - final ParcelableAccount account = mAccountsAdapter.getSelectedAccount(); - if (account == null || !(item instanceof OptionItem)) return; - final OptionItem option = (OptionItem) item; - switch (option.id) { - case R.id.search: { - final Intent intent = new Intent(getActivity(), QuickSearchBarActivity.class); - intent.putExtra(EXTRA_ACCOUNT_KEY, account.account_key); - startActivity(intent); - closeAccountsDrawer(); - break; - } - case R.id.compose: { - final Intent composeIntent = new Intent(INTENT_ACTION_COMPOSE); - composeIntent.setClass(getActivity(), ComposeActivity.class); - composeIntent.putExtra(EXTRA_ACCOUNT_KEY, account.account_key); - startActivity(composeIntent); - break; - } - case R.id.favorites: { - IntentUtils.openUserFavorites(getActivity(), account.account_key, - account.account_key.getId(), account.screen_name); - break; - } - case R.id.lists: { - IntentUtils.openUserLists(getActivity(), account.account_key, - account.account_key.getId(), account.screen_name); - break; - } - case R.id.groups: { - IntentUtils.openUserGroups(getActivity(), account.account_key, - account.account_key.getId(), account.screen_name); - break; - } - case R.id.public_timeline: { - IntentUtils.openPublicTimeline(getActivity(), account.account_key); - break; - } - case R.id.messages: { - IntentUtils.openDirectMessages(getActivity(), account.account_key); - break; - } - case R.id.interactions: { - IntentUtils.openInteractions(getActivity(), account.account_key); - break; - } - case R.id.edit: { - IntentUtils.openProfileEditor(getActivity(), account.account_key); - break; - } - } - } else if (adapter instanceof AppMenuAdapter) { - if (!(item instanceof OptionItem)) return; - final OptionItem option = (OptionItem) item; - switch (option.id) { - case R.id.accounts: { - IntentUtils.openAccountsManager(getActivity()); - break; - } - case R.id.drafts: { - IntentUtils.openDrafts(getActivity()); - break; - } - case R.id.filters: { - IntentUtils.openFilters(getActivity()); - break; - } - case R.id.settings: { - final Intent intent = new Intent(getActivity(), SettingsActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); - startActivityForResult(intent, REQUEST_SETTINGS); - break; - } - } - closeAccountsDrawer(); - } - } @Override public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) { @@ -410,9 +309,7 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo private void updateSystemWindowsInsets() { if (mAccountProfileContainer == null) return; - final HomeActivity activity = (HomeActivity) getActivity(); final Rect insets = mSystemWindowsInsets; - if (!activity.getDefaultSystemWindowsInsets(insets)) return; final int top = Utils.getInsetsTopWithoutActionBarHeight(getActivity(), insets.top); mAccountProfileContainer.setPadding(0, top, 0, 0); } @@ -424,28 +321,14 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo final View view = getView(); assert view != null; final Context context = view.getContext(); - mListView.setItemsCanFocus(true); - mAdapter = new MergeAdapter(); final LayoutInflater inflater = getLayoutInflater(savedInstanceState); mAccountsAdapter = new AccountSelectorAdapter(inflater, this); - mAccountOptionsAdapter = new AccountOptionsAdapter(context); - mAppMenuAdapter = new AppMenuAdapter(context); - mAccountSelectorView = inflater.inflate(R.layout.header_drawer_account_selector, mListView, false); - mAccountsSelector = (RecyclerView) mAccountSelectorView.findViewById(R.id.other_accounts_list); final LinearLayoutManager layoutManager = new FixedLinearLayoutManager(context); layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); layoutManager.setStackFromEnd(true); mAccountsSelector.setLayoutManager(layoutManager); mAccountsSelector.setAdapter(mAccountsAdapter); mAccountsSelector.setItemAnimator(null); - mAccountProfileContainer = mAccountSelectorView.findViewById(R.id.profile_container); - mNoAccountContainer = mAccountSelectorView.findViewById(R.id.no_account_container); - mAccountProfileImageView = (ShapedImageView) mAccountSelectorView.findViewById(R.id.profile_image); - mAccountProfileBannerView = (ImageView) mAccountSelectorView.findViewById(R.id.account_profile_banner); - mFloatingProfileImageSnapshotView = (ImageView) mAccountSelectorView.findViewById(R.id.floating_profile_image_snapshot); - mAccountProfileNameView = (TextView) mAccountSelectorView.findViewById(R.id.name); - mAccountProfileScreenNameView = (TextView) mAccountSelectorView.findViewById(R.id.screen_name); - mAccountsToggleMenu = (ActionMenuView) mAccountSelectorView.findViewById(R.id.account_dashboard_menu); final SupportMenuInflater menuInflater = new SupportMenuInflater(context); menuInflater.inflate(R.menu.action_dashboard_timeline_toggle, mAccountsToggleMenu.getMenu()); mAccountsToggleMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { @@ -479,13 +362,7 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo }); mAccountProfileContainer.setOnClickListener(this); - - mAdapter.addView(mAccountSelectorView, true); - mAdapter.addAdapter(mAccountOptionsAdapter); - mAdapter.addView(inflater.inflate(R.layout.layout_divider_drawer, mListView, false), false); - mAdapter.addAdapter(mAppMenuAdapter); - mListView.setAdapter(mAdapter); - mListView.setOnItemClickListener(this); + mNavigationView.setNavigationItemSelectedListener(this); mPreferences.registerOnSharedPreferenceChangeListener(this); loadAccounts(); @@ -510,7 +387,17 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo @Override public void onBaseViewCreated(View view, Bundle savedInstanceState) { super.onBaseViewCreated(view, savedInstanceState); - mListView = (ListView) view.findViewById(android.R.id.list); + mNavigationView = (NavigationView) view.findViewById(R.id.navigation_view); + mAccountSelectorView = mNavigationView.getHeaderView(0); + mAccountsSelector = (RecyclerView) mAccountSelectorView.findViewById(R.id.other_accounts_list); + mAccountProfileContainer = mAccountSelectorView.findViewById(R.id.profile_container); + mNoAccountContainer = mAccountSelectorView.findViewById(R.id.no_account_container); + mAccountProfileImageView = (ShapedImageView) mAccountSelectorView.findViewById(R.id.profile_image); + mAccountProfileBannerView = (ImageView) mAccountSelectorView.findViewById(R.id.account_profile_banner); + mFloatingProfileImageSnapshotView = (ImageView) mAccountSelectorView.findViewById(R.id.floating_profile_image_snapshot); + mAccountProfileNameView = (TextView) mAccountSelectorView.findViewById(R.id.name); + mAccountProfileScreenNameView = (TextView) mAccountSelectorView.findViewById(R.id.screen_name); + mAccountsToggleMenu = (ActionMenuView) mAccountSelectorView.findViewById(R.id.account_dashboard_menu); } @Override @@ -552,40 +439,35 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo } } } - mAccountOptionsAdapter.clear(); - mAccountOptionsAdapter.add(new OptionItem(R.string.search, - R.drawable.ic_action_search, R.id.search)); - if (!hasInteractionsTab) { - mAccountOptionsAdapter.add(new OptionItem(R.string.interactions, - R.drawable.ic_action_notification, R.id.interactions)); - } - if (!hasDmTab) { - mAccountOptionsAdapter.add(new OptionItem(R.string.direct_messages, - R.drawable.ic_action_message, R.id.messages)); - } + final Menu menu = mNavigationView.getMenu(); + MenuUtils.setMenuItemAvailability(menu, R.id.interactions, !hasInteractionsTab); + MenuUtils.setMenuItemAvailability(menu, R.id.messages, !hasDmTab); + if (mUseStarsForLikes) { - mAccountOptionsAdapter.add(new OptionItem(R.string.favorites, R.drawable.ic_action_star, - R.id.favorites)); + MenuUtils.setMenuItemTitle(menu, R.id.favorites, R.string.favorites); + MenuUtils.setMenuItemIcon(menu, R.id.favorites, R.drawable.ic_action_star); } else { - mAccountOptionsAdapter.add(new OptionItem(R.string.likes, R.drawable.ic_action_heart, - R.id.favorites)); + MenuUtils.setMenuItemTitle(menu, R.id.favorites, R.string.likes); + MenuUtils.setMenuItemIcon(menu, R.id.favorites, R.drawable.ic_action_heart); } + boolean hasLists = false, hasGroups = false, hasPublicTimeline = false; switch (ParcelableAccountUtils.getAccountType(account)) { case ParcelableAccount.Type.TWITTER: { - mAccountOptionsAdapter.add(new OptionItem(R.string.lists, R.drawable.ic_action_list, - R.id.lists)); + hasLists = true; break; } case ParcelableAccount.Type.STATUSNET: { - mAccountOptionsAdapter.add(new OptionItem(R.string.groups, R.drawable.ic_action_list, - R.id.groups)); + hasGroups = true; break; } case ParcelableAccount.Type.FANFOU: { - mAccountOptionsAdapter.add(new OptionItem(R.string.public_timeline, R.drawable.ic_action_quote, - R.id.public_timeline)); + hasPublicTimeline = true; + break; } } + MenuUtils.setMenuItemAvailability(menu, R.id.groups, hasGroups); + MenuUtils.setMenuItemAvailability(menu, R.id.lists, hasLists); + MenuUtils.setMenuItemAvailability(menu, R.id.public_timeline, hasPublicTimeline); } private boolean hasAccountInTab(SupportTabSpec tab, UserKey accountId, boolean isActivated) { @@ -693,7 +575,6 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo editor.putString(KEY_DEFAULT_ACCOUNT_KEY, account.account_key.toString()); editor.apply(); mAccountsAdapter.setSelectedAccountKey(account.account_key); - mAccountOptionsAdapter.setSelectedAccount(account); updateAccountActions(); updateAccountOptionsSeparatorLabel(clickedDrawable); snapshotView.setVisibility(View.INVISIBLE); @@ -743,37 +624,80 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo private void updateDefaultAccountState() { } - public static final class AccountOptionsAdapter extends OptionItemsAdapter { - - private final boolean mNameFirst; - private ParcelableAccount mSelectedAccount; - - AccountOptionsAdapter(final Context context) { - super(context); - mNameFirst = mPreferences.getBoolean(KEY_NAME_FIRST); - } - - public void setSelectedAccount(ParcelableAccount account) { - mSelectedAccount = account; - notifyDataSetChanged(); - } - - @Override - public boolean isEnabled(final int position) { - return mSelectedAccount != null; - } - - @Override - protected String getTitle(int position, OptionItem option) { - final ParcelableAccount account = mSelectedAccount; - if (account != null && option.id == R.id.compose) { - final Context context = getContext(); - final String displayName = UserColorNameManager.getDisplayName(account.name, - account.screen_name, mNameFirst); - return context.getString(R.string.tweet_from_name, displayName); + @Override + public boolean onNavigationItemSelected(MenuItem item) { + final ParcelableAccount account = mAccountsAdapter.getSelectedAccount(); + if (account == null) return false; + switch (item.getItemId()) { + case R.id.search: { + final Intent intent = new Intent(getActivity(), QuickSearchBarActivity.class); + intent.putExtra(EXTRA_ACCOUNT_KEY, account.account_key); + startActivity(intent); + closeAccountsDrawer(); + break; + } + case R.id.compose: { + final Intent composeIntent = new Intent(INTENT_ACTION_COMPOSE); + composeIntent.setClass(getActivity(), ComposeActivity.class); + composeIntent.putExtra(EXTRA_ACCOUNT_KEY, account.account_key); + startActivity(composeIntent); + break; + } + case R.id.favorites: { + IntentUtils.openUserFavorites(getActivity(), account.account_key, + account.account_key.getId(), account.screen_name); + break; + } + case R.id.lists: { + IntentUtils.openUserLists(getActivity(), account.account_key, + account.account_key.getId(), account.screen_name); + break; + } + case R.id.groups: { + IntentUtils.openUserGroups(getActivity(), account.account_key, + account.account_key.getId(), account.screen_name); + break; + } + case R.id.public_timeline: { + IntentUtils.openPublicTimeline(getActivity(), account.account_key); + break; + } + case R.id.messages: { + IntentUtils.openDirectMessages(getActivity(), account.account_key); + break; + } + case R.id.interactions: { + IntentUtils.openInteractions(getActivity(), account.account_key); + break; + } + case R.id.edit: { + IntentUtils.openProfileEditor(getActivity(), account.account_key); + break; + } + case R.id.accounts: { + IntentUtils.openAccountsManager(getActivity()); + closeAccountsDrawer(); + break; + } + case R.id.drafts: { + IntentUtils.openDrafts(getActivity()); + closeAccountsDrawer(); + break; + } + case R.id.filters: { + IntentUtils.openFilters(getActivity()); + closeAccountsDrawer(); + break; + } + case R.id.settings: { + final Intent intent = new Intent(getActivity(), SettingsActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + startActivityForResult(intent, REQUEST_SETTINGS); + closeAccountsDrawer(); + break; } - return super.getTitle(position, option); } + return false; } static class AccountProfileImageViewHolder extends ViewHolder implements OnClickListener { @@ -922,17 +846,6 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo } } - private static final class AppMenuAdapter extends OptionItemsAdapter { - - public AppMenuAdapter(final Context context) { - super(context); - add(new OptionItem(R.string.accounts, R.drawable.ic_action_accounts, R.id.accounts)); - add(new OptionItem(R.string.drafts, R.drawable.ic_action_draft, R.id.drafts)); - add(new OptionItem(R.string.filters, R.drawable.ic_action_speaker_muted, R.id.filters)); - add(new OptionItem(R.string.settings, R.drawable.ic_action_settings, R.id.settings)); - } - - } public static class OptionItem { @@ -972,35 +885,4 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo } - public static abstract class OptionItemsAdapter extends ArrayAdapter { - - @Inject - UserColorNameManager mUserColorNameManager; - @Inject - SharedPreferencesWrapper mPreferences; - private final int mActionIconColor; - - OptionItemsAdapter(final Context context) { - super(context, R.layout.list_item_dashboard_menu); - GeneralComponentHelper.build(context).inject(this); - mActionIconColor = ThemeUtils.getThemeForegroundColor(context); - } - - @Override - public View getView(final int position, final View convertView, final ViewGroup parent) { - final View view = super.getView(position, convertView, parent); - final OptionItem option = getItem(position); - final TextView text1 = (TextView) view.findViewById(android.R.id.text1); - final ImageView icon = (ImageView) view.findViewById(android.R.id.icon); - text1.setText(getTitle(position, option)); - icon.setImageDrawable(ResourcesCompat.getDrawable(icon.getResources(), option.icon, null)); - icon.setColorFilter(mActionIconColor, Mode.SRC_ATOP); - return view; - } - - protected String getTitle(int position, OptionItem option) { - return getContext().getString(option.name); - } - - } } \ No newline at end of file diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AccountsManagerFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AccountsManagerFragment.java index d47633a2e..88d670e6b 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AccountsManagerFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AccountsManagerFragment.java @@ -41,8 +41,8 @@ import org.mariotaku.sqliteqb.library.ArgsArray; import org.mariotaku.sqliteqb.library.Columns; import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity; -import org.mariotaku.twidere.activity.support.SignInActivity; +import org.mariotaku.twidere.activity.ColorPickerDialogActivity; +import org.mariotaku.twidere.activity.SignInActivity; import org.mariotaku.twidere.adapter.AccountsAdapter; import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.UserKey; diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseFiltersFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseFiltersFragment.java index 8447c2c4b..ca6c25271 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseFiltersFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseFiltersFragment.java @@ -56,8 +56,7 @@ import org.mariotaku.sqliteqb.library.Columns.Column; import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.RawItemArray; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.iface.IThemedActivity; -import org.mariotaku.twidere.activity.support.UserListSelectorActivity; +import org.mariotaku.twidere.activity.UserListSelectorActivity; import org.mariotaku.twidere.adapter.ComposeAutoCompleteAdapter; import org.mariotaku.twidere.adapter.SourceAutoCompleteAdapter; import org.mariotaku.twidere.model.ParcelableUser; @@ -131,12 +130,6 @@ public abstract class BaseFiltersFragment extends AbsContentListViewFragment - * - * 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 . - */ - -package org.mariotaku.twidere.preference; - -import android.content.Context; -import android.util.AttributeSet; - -import org.jraf.android.backport.switchwidget.SwitchPreference; -import org.mariotaku.twidere.Constants; -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.util.ThemeUtils; - -public class DarkLightThemeTogglePreference extends SwitchPreference implements Constants { - - public DarkLightThemeTogglePreference(final Context context) { - this(context, null); - } - - public DarkLightThemeTogglePreference(final Context context, final AttributeSet attrs) { - this(context, attrs, R.attr.asb_switchPreferenceStyle); - } - - public DarkLightThemeTogglePreference(final Context context, final AttributeSet attrs, final int defStyle) { - super(context, attrs, defStyle); - } - - @Override - protected boolean getPersistedBoolean(final boolean defaultReturnValue) { - return ThemeUtils.isDarkTheme(getPersistedString(VALUE_THEME_NAME_LIGHT)); - } - - @Override - protected boolean persistBoolean(final boolean value) { - return persistString(value ? VALUE_THEME_NAME_DARK : VALUE_THEME_NAME_LIGHT); - } -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java index 54b81fcea..bde2100db 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java +++ b/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java @@ -43,7 +43,7 @@ import android.widget.Toast; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.support.APIEditorActivity; +import org.mariotaku.twidere.activity.APIEditorActivity; import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.preference.iface.IDialogPreference; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; diff --git a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java index 34743b76c..cd9567023 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java +++ b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java @@ -77,7 +77,7 @@ import org.mariotaku.sqliteqb.library.query.SQLSelectQuery; import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.support.HomeActivity; +import org.mariotaku.twidere.activity.HomeActivity; import org.mariotaku.twidere.annotation.CustomTabType; import org.mariotaku.twidere.annotation.NotificationType; import org.mariotaku.twidere.annotation.ReadPositionTag; diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ActivityTracker.java b/twidere/src/main/java/org/mariotaku/twidere/util/ActivityTracker.java index 1ec35c7b9..e002c06b7 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ActivityTracker.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/ActivityTracker.java @@ -27,7 +27,7 @@ import android.os.Bundle; import org.apache.commons.collections.primitives.ArrayIntList; import org.apache.commons.collections.primitives.IntList; -import org.mariotaku.twidere.activity.support.HomeActivity; +import org.mariotaku.twidere.activity.HomeActivity; import edu.tsinghua.hotmobi.HotMobiLogger; import edu.tsinghua.hotmobi.PreProcessing; diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/IntentUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/IntentUtils.java index 68e2d8a94..10cea42f2 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/IntentUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/IntentUtils.java @@ -20,7 +20,7 @@ import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; import org.mariotaku.twidere.TwidereConstants; -import org.mariotaku.twidere.activity.support.MediaViewerActivity; +import org.mariotaku.twidere.activity.MediaViewerActivity; import org.mariotaku.twidere.constant.SharedPreferenceConstants; import org.mariotaku.twidere.fragment.support.SensitiveContentWarningDialogFragment; import org.mariotaku.twidere.fragment.support.UserFragment; diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/KeyboardShortcutsHandler.java b/twidere/src/main/java/org/mariotaku/twidere/util/KeyboardShortcutsHandler.java index 53afec137..802063ac7 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/KeyboardShortcutsHandler.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/KeyboardShortcutsHandler.java @@ -12,8 +12,8 @@ import android.view.KeyEvent; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.support.ComposeActivity; -import org.mariotaku.twidere.activity.support.QuickSearchBarActivity; +import org.mariotaku.twidere.activity.ComposeActivity; +import org.mariotaku.twidere.activity.QuickSearchBarActivity; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.constant.KeyboardShortcutConstants; diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/MenuUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/MenuUtils.java index 0585681e5..098109711 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/MenuUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/MenuUtils.java @@ -27,8 +27,10 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.graphics.drawable.Drawable; +import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.StringRes; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; @@ -43,8 +45,8 @@ import android.view.MenuItem; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; import org.mariotaku.twidere.TwidereConstants; -import org.mariotaku.twidere.activity.support.AccountSelectorActivity; -import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity; +import org.mariotaku.twidere.activity.AccountSelectorActivity; +import org.mariotaku.twidere.activity.ColorPickerDialogActivity; import org.mariotaku.twidere.constant.IntentConstants; import org.mariotaku.twidere.constant.SharedPreferenceConstants; import org.mariotaku.twidere.fragment.support.AbsStatusesFragment; @@ -81,7 +83,7 @@ public class MenuUtils implements Constants { item.setChecked(checked); } - public static void setMenuItemIcon(final Menu menu, final int id, final int icon) { + public static void setMenuItemIcon(final Menu menu, final int id, @DrawableRes final int icon) { if (menu == null) return; final MenuItem item = menu.findItem(id); if (item == null) return; @@ -96,7 +98,7 @@ public class MenuUtils implements Constants { MenuItemCompat.setShowAsAction(item, flags); } - public static void setMenuItemTitle(final Menu menu, final int id, final int icon) { + public static void setMenuItemTitle(final Menu menu, final int id, @StringRes final int icon) { if (menu == null) return; final MenuItem item = menu.findItem(id); if (item == null) return; diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java b/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java index d1378b971..f38137d9f 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java @@ -33,7 +33,7 @@ import com.twitter.Extractor; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.support.BaseAppCompatActivity; +import org.mariotaku.twidere.activity.BaseAppCompatActivity; import org.mariotaku.twidere.menu.AccountActionProvider; import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.ParcelableStatus; diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/RestFuNetworkStreamDownloader.java b/twidere/src/main/java/org/mariotaku/twidere/util/RestFuNetworkStreamDownloader.java index 3772a96c1..404b3c84c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/RestFuNetworkStreamDownloader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/RestFuNetworkStreamDownloader.java @@ -28,7 +28,7 @@ import org.mariotaku.restfu.http.HttpRequest; import org.mariotaku.restfu.http.HttpResponse; import org.mariotaku.restfu.http.RestHttpClient; import org.mariotaku.restfu.http.mime.Body; -import org.mariotaku.twidere.activity.support.ThemedImagePickerActivity; +import org.mariotaku.twidere.activity.ThemedImagePickerActivity; import org.mariotaku.twidere.util.dagger.DependencyHolder; import java.io.IOException; diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java index 0b73e579d..5a98831ce 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java @@ -36,12 +36,7 @@ import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewCompat; -import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatDelegate; -import android.support.v7.app.WindowDecorActionBar; -import android.support.v7.app.WindowDecorActionBar.ActionModeImpl; -import android.support.v7.view.StandaloneActionMode; -import android.support.v7.view.SupportActionModeWrapperAccessor; import android.support.v7.view.menu.ActionMenuItemView; import android.support.v7.widget.ActionBarContainer; import android.support.v7.widget.ActionBarContextView; @@ -52,7 +47,6 @@ import android.support.v7.widget.Toolbar; import android.support.v7.widget.TwidereToolbar; import android.text.TextUtils; import android.util.TypedValue; -import android.view.ActionMode; import android.view.ContextMenu.ContextMenuInfo; import android.view.ContextThemeWrapper; import android.view.Menu; @@ -63,13 +57,12 @@ import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; -import android.widget.TextView; import org.apache.commons.lang3.ArrayUtils; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; +import org.mariotaku.twidere.activity.LinkHandlerActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity; -import org.mariotaku.twidere.activity.support.LinkHandlerActivity; import org.mariotaku.twidere.graphic.ActionBarColorDrawable; import org.mariotaku.twidere.graphic.ActionIconDrawable; import org.mariotaku.twidere.graphic.iface.DoNotWrapDrawable; @@ -96,15 +89,6 @@ public class ThemeUtils implements Constants { } - public static void applyActionBarBackground(final ActionBar actionBar, final Context context, - final int accentColor, String backgroundOption, boolean outlineEnabled) { - if (actionBar == null || context == null) return; - actionBar.setBackgroundDrawable(getActionBarBackground(context, accentColor, backgroundOption, outlineEnabled)); - actionBar.setSplitBackgroundDrawable(getActionBarSplitBackground(context)); - actionBar.setStackedBackgroundDrawable(getActionBarStackedBackground(context, accentColor, backgroundOption, outlineEnabled)); - } - - public static void applyActionBarBackground(final ActionBarContainer actionBar, final Context context, final int accentColor, String backgroundOption, boolean outlineEnabled) { if (actionBar == null || context == null) return; @@ -139,77 +123,6 @@ public class ThemeUtils implements Constants { } } - public static void applySupportActionModeColor(final ActionMode mode, - int accentColor, String backgroundOption, - boolean outlineEnabled) { - android.support.v7.view.ActionMode modeCompat = SupportActionModeWrapperAccessor.getWrappedObject(mode); - if (modeCompat == null) return; - applySupportActionModeColor(modeCompat, accentColor, backgroundOption, - outlineEnabled); - } - - public static void applySupportActionModeColor(final android.support.v7.view.ActionMode modeCompat, - int accentColor, String backgroundOption, - boolean outlineEnabled) { - // Very dirty implementation - // This call ensures TitleView created - modeCompat.setTitle(modeCompat.getTitle()); - final View contextView = findActionBarContextView(modeCompat); - if (!(contextView instanceof ActionBarContextView)) return; - setActionBarContextViewBackground((ActionBarContextView) contextView, accentColor, - backgroundOption, outlineEnabled); - } - - public static void applySupportActionModeItemColor(final ActionMode mode, int accentColor) { - android.support.v7.view.ActionMode modeCompat = SupportActionModeWrapperAccessor.getWrappedObject(mode); - if (modeCompat == null) return; - applySupportActionModeItemColor(modeCompat, accentColor); - } - - public static void applySupportActionModeItemColor(final android.support.v7.view.ActionMode modeCompat, - int accentColor) { - // Very dirty implementation - // This call ensures TitleView created - modeCompat.setTitle(modeCompat.getTitle()); - final View contextView = findActionBarContextView(modeCompat); - if (!(contextView instanceof ActionBarContextView)) return; - setActionBarContextViewItemColor((ActionBarContextView) contextView, accentColor); - } - - private static void setActionBarContextViewItemColor(ActionBarContextView contextView, int toolbarColor) { - final Context context = contextView.getContext(); - final int contrastForegroundColor = getContrastForegroundColor(context, toolbarColor); - if (isDarkTheme(context)) { - return; - } - final View titleView = contextView.findViewById(R.id.action_bar_title); - final View subtitleView = contextView.findViewById(R.id.action_bar_subtitle); - final View closeButton = contextView.findViewById(R.id.action_mode_close_button); - if (titleView instanceof TextView) { - ((TextView) titleView).setTextColor(contrastForegroundColor); - } - if (subtitleView instanceof TextView) { - ((TextView) subtitleView).setTextColor(contrastForegroundColor); - } - if (closeButton instanceof ImageView) { - ((ImageView) closeButton).setColorFilter(contrastForegroundColor, Mode.SRC_ATOP); - } - } - - private static View findActionBarContextView(final android.support.v7.view.ActionMode modeCompat) { - if (modeCompat instanceof ActionModeImpl) { - WindowDecorActionBar actionBar = (WindowDecorActionBar) Utils.findFieldOfTypes(modeCompat, - ActionModeImpl.class, WindowDecorActionBar.class); - if (actionBar == null) return null; - return (View) Utils.findFieldOfTypes(actionBar, WindowDecorActionBar.class, - ActionBarContextView.class); - } else if (modeCompat instanceof StandaloneActionMode) { - return (View) Utils.findFieldOfTypes(modeCompat, StandaloneActionMode.class, - ActionBarContextView.class); - } - return null; - } - public static void setActionBarContextViewBackground(@NonNull ActionBarContextView contextView, int accentColor, String backgroundOption, boolean outlineEnabled) { @@ -1019,6 +932,15 @@ public class ThemeUtils implements Constants { | Configuration.UI_MODE_NIGHT_YES; } + public static String getATEKey(Context context) { + TypedValue value = new TypedValue(); + if (!context.getTheme().resolveAttribute(R.attr.ateThemeKey, value, true)) { + return "dark"; + } + if (TextUtils.isEmpty(value.string)) return "dark"; + return String.valueOf(value.string); + } + public static final class ActionBarContextThemeWrapper extends android.support.v7.view.ContextThemeWrapper { diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ThemedLayoutInflaterFactory.java b/twidere/src/main/java/org/mariotaku/twidere/util/ThemedLayoutInflaterFactory.java deleted file mode 100644 index 829c20f01..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ThemedLayoutInflaterFactory.java +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * 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 . - */ - -package org.mariotaku.twidere.util; - -import android.app.Activity; -import android.content.Context; -import android.content.ContextWrapper; -import android.content.res.ColorStateList; -import android.graphics.Color; -import android.graphics.Typeface; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.content.ContextCompat; -import android.support.v4.view.LayoutInflaterFactory; -import android.support.v4.view.TintableBackgroundView; -import android.support.v4.view.ViewCompat; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.AppCompatDelegate; -import android.support.v7.app.AppCompatDelegateAccessor; -import android.support.v7.view.ContextThemeWrapper; -import android.support.v7.widget.TwidereToolbar; -import android.util.AttributeSet; -import android.view.InflateException; -import android.view.View; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ProgressBar; -import android.widget.TextView; - -import com.rengwuxian.materialedittext.MaterialEditText; - -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.iface.IThemedActivity; -import org.mariotaku.twidere.util.support.ViewSupport; -import org.mariotaku.twidere.view.ProfileImageView; -import org.mariotaku.twidere.view.ShapedImageView; -import org.mariotaku.twidere.view.WizardHighlightTextView; -import org.mariotaku.twidere.view.iface.IThemeAccentView; -import org.mariotaku.twidere.view.iface.IThemeBackgroundTintView; -import org.mariotaku.twidere.view.themed.ThemedTextView; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.HashMap; -import java.util.Map; - -/** - * Created by mariotaku on 15/4/22. - */ -public class ThemedLayoutInflaterFactory implements LayoutInflaterFactory { - - private static final String[] sCustomViewPrefixWhiteList = {"org.mariotaku.twidere.view"}; - private static final Map sConstructorCache = new HashMap<>(); - - private final IThemedActivity activity; - private final LayoutInflaterFactory delegate; - - public ThemedLayoutInflaterFactory(IThemedActivity activity, LayoutInflaterFactory delegate) { - this.activity = activity; - this.delegate = delegate; - } - - @Override - public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { - View view = delegate.onCreateView(parent, name, context, attrs); - if (view == null) { - view = createCustomView(name, context, attrs); - } - initView(view, activity); - return view; - } - - public static View createCustomView(String name, Context context, AttributeSet attrs) { - if (!name.contains(".")) return null; - boolean whiteListed = false; - for (String prefix : sCustomViewPrefixWhiteList) { - if (name.startsWith(prefix)) { - whiteListed = true; - break; - } - } - if (!whiteListed) return null; - //noinspection TryWithIdenticalCatches - try { - Constructor constructor = sConstructorCache.get(name); - if (constructor == null) { - final Class viewCls = Class.forName(name); - if (!View.class.isAssignableFrom(viewCls)) return null; - constructor = viewCls.getConstructor(Context.class, AttributeSet.class); - sConstructorCache.put(name, constructor); - } - return (View) constructor.newInstance(context, attrs); - } catch (ClassNotFoundException ignore) { - } catch (NoSuchMethodException e) { - throw new InflateException(e); - } catch (InvocationTargetException e) { - throw new InflateException(e); - } catch (InstantiationException e) { - throw new InflateException(e); - } catch (IllegalAccessException e) { - throw new InflateException(e); - } - return null; - } - - public static void initView(View view, IThemedActivity activity) { - if (view == null) return; - if (view instanceof ShapedImageView) { - final ShapedImageView shapedImageView = (ShapedImageView) view; - shapedImageView.setStyle(activity.getCurrentProfileImageStyle()); - } - if (view instanceof ProfileImageView) { - final ProfileImageView profileImageView = (ProfileImageView) view; - profileImageView.setOval(activity.getCurrentProfileImageStyle() == ShapedImageView.SHAPE_CIRCLE); - } - if (view instanceof ThemedTextView) { - final String fontFamily = activity.getCurrentThemeFontFamily(); - final TextView textView = (TextView) view; - final Typeface defTypeface = textView.getTypeface(); - textView.setTypeface(ThemeUtils.getUserTypeface((Context) activity, fontFamily, defTypeface)); - } - initViewTint(view, activity); - } - - private static void initViewTint(View view, IThemedActivity activity) { - final int noTintColor, accentColor, backgroundTintColor; - final boolean isColorTint; - // View context is not derived from ActionBar, apply color tint directly - final Context viewContext = view.getContext(); - final boolean isActionBarContext = isActionBarContext(viewContext, getActionBarContext((Activity) activity)); - final boolean isDarkTheme = ThemeUtils.isDarkTheme(viewContext); - final int backgroundColorApprox; - final int currentThemeColor = activity.getCurrentThemeColor(); - if (!isActionBarContext) { - accentColor = currentThemeColor; - final int[] darkLightColors = new int[2]; - ThemeUtils.getDarkLightForegroundColors((Context) activity, - darkLightColors); - noTintColor = TwidereColorUtils.getContrastYIQ(accentColor, ThemeUtils.ACCENT_COLOR_THRESHOLD, - darkLightColors[0], darkLightColors[1]); - backgroundTintColor = accentColor; - backgroundColorApprox = isDarkTheme ? Color.BLACK : Color.WHITE; - isColorTint = true; - } else if (isDarkTheme) { - // View context is derived from ActionBar but is currently dark theme, so we should show - // light - noTintColor = Color.WHITE; - accentColor = currentThemeColor; - backgroundTintColor = noTintColor; - backgroundColorApprox = Color.BLACK; - isColorTint = true; - } else { - // View context is derived from ActionBar and it's light theme, so we use contrast color - accentColor = ThemeUtils.getColorFromAttribute(viewContext, android.R.attr.colorForeground, 0); - noTintColor = ThemeUtils.getColorFromAttribute(viewContext, android.R.attr.colorBackground, 0); - backgroundTintColor = accentColor; - backgroundColorApprox = Color.WHITE; - isColorTint = false; - } - final boolean isAccentOptimal = Math.abs(TwidereColorUtils.getYIQContrast(backgroundColorApprox, accentColor)) > 64; - if (view instanceof TextView) { - final TextView textView = (TextView) view; - if (isAccentOptimal) { - textView.setLinkTextColor(accentColor); - } - } - if (view instanceof WizardHighlightTextView) { - ((WizardHighlightTextView) view).setTextColor(ThemeUtils.getOptimalAccentColor((Context) activity, - currentThemeColor, isActionBarContext)); - } - if (view instanceof IThemeAccentView) { - if (isAccentOptimal || !isColorTint) { - ((IThemeAccentView) view).setAccentTintColor(ColorStateList.valueOf(accentColor)); - } else { - final int defaultAccentColor = ThemeUtils.getColorFromAttribute(viewContext, - R.attr.colorAccent, ContextCompat.getColor(viewContext, R.color.branding_color)); - ((IThemeAccentView) view).setAccentTintColor(ColorStateList.valueOf(defaultAccentColor)); - } - } else if (view instanceof IThemeBackgroundTintView) { - if (isAccentOptimal || !isColorTint) { - ((IThemeBackgroundTintView) view).setBackgroundTintColor(ColorStateList.valueOf(backgroundTintColor)); - } - } else if (view instanceof TwidereToolbar) { - if (viewContext instanceof ContextThemeWrapper) { - ((TwidereToolbar) view).setItemColor(ThemeUtils.getThemeForegroundColor(viewContext, - ((ContextThemeWrapper) viewContext).getThemeResId())); - } else { - ((TwidereToolbar) view).setItemColor(ThemeUtils.getThemeForegroundColor(viewContext)); - } - } else if (view instanceof EditText) { - if (isAccentOptimal || !isColorTint) { - ViewCompat.setBackgroundTintList(view, ColorStateList.valueOf(backgroundTintColor)); - } - if (view instanceof MaterialEditText) { - if (isAccentOptimal || !isColorTint) { - ((MaterialEditText) view).setPrimaryColor(backgroundTintColor); - } - } - } else if (view instanceof ProgressBar) { - if (isAccentOptimal || !isColorTint) { - ViewSupport.setIndeterminateTintList((ProgressBar) view, ColorStateList.valueOf(accentColor)); - ViewSupport.setProgressTintList((ProgressBar) view, ColorStateList.valueOf(accentColor)); - ViewSupport.setProgressBackgroundTintList((ProgressBar) view, ColorStateList.valueOf(accentColor)); - } - } else if (view instanceof TintableBackgroundView) { - final TintableBackgroundView tintable = (TintableBackgroundView) view; - if (isAccentOptimal || !isColorTint) { - applyTintableBackgroundViewTint(tintable, accentColor, noTintColor, backgroundTintColor, isColorTint); - } - } - } - - private static void applyTintableBackgroundViewTint(TintableBackgroundView tintable, int accentColor, int noTintColor, int backgroundTintColor, boolean isColorTint) { - if (tintable instanceof Button) { - } else if (tintable instanceof EditText) { - tintable.setSupportBackgroundTintList(ColorStateList.valueOf(backgroundTintColor)); - } else if (isColorTint) { -// final int[][] states = {{android.R.attr.state_selected}, {android.R.attr.state_focused}, -// {android.R.attr.state_pressed}, {0}}; -// final int[] colors = {accentColor, accentColor, accentColor, noTintColor}; -// tintable.setSupportBackgroundTintList(new ColorStateList(states, colors)); - } else { -// tintable.setSupportBackgroundTintList(ColorStateList.valueOf(accentColor)); - } - } - - private static boolean isActionBarContext(@NonNull Context context, @Nullable Context actionBarContext) { - if (context instanceof ThemeUtils.ActionBarContextThemeWrapper) return true; - if (actionBarContext == null) return false; - if (context == actionBarContext) return true; - Context base = context; - while (base instanceof ContextWrapper && (base = ((ContextWrapper) base).getBaseContext()) != null) { - if (base == actionBarContext) return true; - } - return false; - } - - @Nullable - private static Context getActionBarContext(@NonNull Activity activity) { - Context actionBarContext = null; - if (activity instanceof AppCompatActivity) { - final AppCompatDelegate delegate = ((AppCompatActivity) activity).getDelegate(); - final ActionBar actionBar = AppCompatDelegateAccessor.peekActionBar(delegate); - if (actionBar != null) { - actionBarContext = actionBar.getThemedContext(); - } - } - if (activity != actionBarContext) return actionBarContext; - return null; - } -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/dagger/GeneralComponent.java b/twidere/src/main/java/org/mariotaku/twidere/util/dagger/GeneralComponent.java index cc66c1849..1c0a1da0c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/dagger/GeneralComponent.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/dagger/GeneralComponent.java @@ -21,12 +21,10 @@ package org.mariotaku.twidere.util.dagger; import android.support.v7.widget.RecyclerView; -import org.mariotaku.twidere.activity.BasePreferenceActivity; -import org.mariotaku.twidere.activity.BaseThemedActivity; -import org.mariotaku.twidere.activity.support.BaseAppCompatActivity; -import org.mariotaku.twidere.activity.support.ComposeActivity; -import org.mariotaku.twidere.activity.support.MediaViewerActivity; -import org.mariotaku.twidere.activity.support.ThemedFragmentActivity; +import org.mariotaku.twidere.activity.BaseAppCompatActivity; +import org.mariotaku.twidere.activity.ComposeActivity; +import org.mariotaku.twidere.activity.ThemedFragmentActivity; +import org.mariotaku.twidere.activity.MediaViewerActivity; import org.mariotaku.twidere.adapter.AccountsAdapter; import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter; import org.mariotaku.twidere.adapter.BaseArrayAdapter; @@ -74,10 +72,6 @@ public interface GeneralComponent { void inject(MultiSelectEventHandler object); - void inject(BasePreferenceActivity object); - - void inject(BaseThemedActivity object); - void inject(BaseSupportDialogFragment object); void inject(RefreshService object); @@ -114,8 +108,6 @@ public interface GeneralComponent { void inject(BaseFiltersFragment.FilteredUsersFragment.FilterUsersListAdapter object); - void inject(AccountsDashboardFragment.OptionItemsAdapter object); - void inject(EmojiSpannableFactory object); void inject(EmojiEditableFactory object); diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/DrawerContentFrameLayout.java b/twidere/src/main/java/org/mariotaku/twidere/view/DrawerContentFrameLayout.java index 3634b3e7b..74f2674ff 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/DrawerContentFrameLayout.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/DrawerContentFrameLayout.java @@ -39,4 +39,5 @@ public class DrawerContentFrameLayout extends FrameLayout { super(context, attrs, defStyle); ThemeUtils.setupDrawerBackground(context, this); } + } diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/ForegroundImageView.java b/twidere/src/main/java/org/mariotaku/twidere/view/ForegroundImageView.java index e9d7d417a..811ed7a22 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/ForegroundImageView.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/ForegroundImageView.java @@ -22,6 +22,7 @@ package org.mariotaku.twidere.view; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.annotation.NonNull; diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/HomeActionButton.java b/twidere/src/main/java/org/mariotaku/twidere/view/HomeActionButton.java deleted file mode 100644 index d30754964..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/view/HomeActionButton.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2014 Mariotaku Lee - * - * 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 . - */ - -package org.mariotaku.twidere.view; - -import android.annotation.TargetApi; -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.Color; -import android.graphics.PorterDuff.Mode; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.ShapeDrawable; -import android.graphics.drawable.shapes.OvalShape; -import android.os.Build; -import android.support.v4.view.ViewCompat; -import android.util.AttributeSet; -import android.util.Property; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageView; - -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.iface.IThemedActivity; -import org.mariotaku.twidere.util.ThemeUtils; -import org.mariotaku.twidere.util.support.ViewSupport; -import org.mariotaku.twidere.util.support.graphics.OutlineCompat; -import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat; -import org.mariotaku.twidere.view.iface.IHomeActionButton; - -import me.uucky.colorpicker.internal.EffectViewHelper; - -@TargetApi(Build.VERSION_CODES.LOLLIPOP) -public class HomeActionButton extends FrameLayout implements IHomeActionButton { - - private static class PressElevationProperty extends Property { - private final float mElevation; - - public PressElevationProperty(float elevation) { - super(Float.TYPE, null); - mElevation = elevation; - } - - @Override - public void set(View object, Float value) { - ViewCompat.setTranslationZ(object, mElevation * value); - } - - @Override - public Float get(View object) { - return ViewCompat.getTranslationZ(object) / mElevation; - } - } - - private final EffectViewHelper mHelper; - private final ImageView mIconView; - - public HomeActionButton(final Context context) { - this(context, null); - } - - public HomeActionButton(final Context context, final AttributeSet attrs) { - this(context, attrs, 0); - } - - public HomeActionButton(final Context context, final AttributeSet attrs, final int defStyle) { - super(context, attrs, defStyle); - final Resources resources = context.getResources(); - final float elevation = resources.getDisplayMetrics().density * 4; - mHelper = new EffectViewHelper(this, new PressElevationProperty(elevation), 200); - if (isInEditMode()) { - inflate(context, R.layout.action_item_home_actions, this); - } else if (context instanceof IThemedActivity) { - int themeColor = ((IThemedActivity) context).getCurrentThemeColor(); - inflate(ThemeUtils.getActionBarThemedContext(context, themeColor), - R.layout.action_item_home_actions, this); - } else { - inflate(ThemeUtils.getActionBarThemedContext(context), R.layout.action_item_home_actions, - this); - } - mIconView = (ImageView) findViewById(android.R.id.icon); - ViewSupport.setOutlineProvider(this, new HomeActionButtonOutlineProvider()); - setClipToOutline(true); - setButtonColor(Color.WHITE); - } - - @Override - public void setButtonColor(int color) { - if (isInEditMode()) { - final ShapeDrawable sd = new ShapeDrawable(new OvalShape()); - sd.getPaint().setColor(color); - ViewSupport.setBackground(this, sd); - } else { - ViewSupport.setBackground(this, new ColorDrawable(color)); - } - } - - @Override - public void setIcon(final Bitmap bm) { - mIconView.setImageBitmap(bm); - } - - @Override - public void setIcon(final Drawable drawable) { - mIconView.setImageDrawable(drawable); - } - - @Override - public void setIcon(final int resId) { - mIconView.setImageResource(resId); - } - - @Override - public void setIconColor(int color, Mode mode) { - mIconView.setColorFilter(color, mode); - } - - @Override - public void setTitle(final CharSequence title) { - setContentDescription(title); - } - - @Override - public void setTitle(final int title) { - setTitle(getResources().getText(title)); - } - - @Override - public void setPressed(boolean pressed) { - super.setPressed(pressed); - mHelper.setState(pressed); - } - - private static class HomeActionButtonOutlineProvider extends ViewOutlineProviderCompat { - - @Override - public void getOutline(View view, OutlineCompat outline) { - final int width = view.getWidth(), height = view.getHeight(); - final int size = Math.min(width, height); - final int left = (width - size) / 2, top = (height - size) / 2; - outline.setOval(left, top, left + size, top + size); - } - } - - -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/HomeActionButtonCompat.java b/twidere/src/main/java/org/mariotaku/twidere/view/HomeActionButtonCompat.java deleted file mode 100644 index 2e5bd1ee4..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/view/HomeActionButtonCompat.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2014 Mariotaku Lee - * - * 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 . - */ - -package org.mariotaku.twidere.view; - -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.Bitmap.Config; -import android.graphics.Canvas; -import android.graphics.ColorFilter; -import android.graphics.Paint; -import android.graphics.PixelFormat; -import android.graphics.PorterDuff.Mode; -import android.graphics.PorterDuffXfermode; -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageView; - -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.iface.IThemedActivity; -import org.mariotaku.twidere.util.ThemeUtils; -import org.mariotaku.twidere.util.support.ViewSupport; -import org.mariotaku.twidere.view.iface.IHomeActionButton; - -public class HomeActionButtonCompat extends FrameLayout implements IHomeActionButton { - - private final ImageView mIconView; - private final FloatingActionDrawable mBackground; - - public HomeActionButtonCompat(final Context context) { - this(context, null); - } - - public HomeActionButtonCompat(final Context context, final AttributeSet attrs) { - this(context, attrs, 0); - } - - public HomeActionButtonCompat(final Context context, final AttributeSet attrs, final int defStyle) { - super(context, attrs, defStyle); - if (isInEditMode()) { - inflate(context, R.layout.action_item_home_actions_compat, this); - } else if (context instanceof IThemedActivity) { - int themeColor = ((IThemedActivity) context).getCurrentThemeColor(); - inflate(ThemeUtils.getActionBarThemedContext(context, themeColor), - R.layout.action_item_home_actions_compat, this); - } else { - inflate(ThemeUtils.getActionBarThemedContext(context), R.layout.action_item_home_actions_compat, - this); - } - mIconView = (ImageView) findViewById(android.R.id.icon); - final Resources resources = getResources(); - final int radius = resources.getDimensionPixelSize(R.dimen.element_spacing_small); - mBackground = new FloatingActionDrawable(this, radius); - ViewSupport.setBackground(this, mBackground); - } - - @Override - public void setButtonColor(int color) { - mBackground.setColor(color); - } - - @Override - public void setIcon(final Bitmap bm) { - mIconView.setImageBitmap(bm); - } - - @Override - public void setIcon(final Drawable drawable) { - mIconView.setImageDrawable(drawable); - } - - @Override - public void setIcon(final int resId) { - mIconView.setImageResource(resId); - } - - @Override - public void setIconColor(int color, Mode mode) { - mIconView.setColorFilter(color, mode); - } - - @Override - public void setTitle(final CharSequence title) { - setContentDescription(title); - } - - @Override - public void setTitle(final int title) { - setTitle(getResources().getText(title)); - } - - private static class FloatingActionDrawable extends Drawable { - - - private static final int SHADOW_START_COLOR = 0x37000000; - - private final View mView; - private final float mRadius; - - private Bitmap mBitmap; - private Paint mColorPaint; - private Rect mBounds; - - public FloatingActionDrawable(View view, float radius) { - mView = view; - mRadius = radius; - mColorPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mBounds = new Rect(); - } - - @Override - public void draw(Canvas canvas) { - if (mBitmap != null) { - canvas.drawBitmap(mBitmap, 0, 0, null); - } - final Rect bounds = mBounds; - if (!bounds.isEmpty()) { - final RectF rect = new RectF(mView.getPaddingLeft(), mView.getPaddingTop(), - bounds.width() - mView.getPaddingRight(), bounds.height() - mView.getPaddingBottom()); - canvas.drawOval(rect, mColorPaint); - } - } - - @Override - public void setAlpha(int alpha) { - // No-op - } - - @Override - public void setColorFilter(ColorFilter cf) { - mColorPaint.setColorFilter(cf); - invalidateSelf(); - } - - @Override - public int getOpacity() { - return PixelFormat.TRANSLUCENT; - } - - @Override - protected void onBoundsChange(Rect bounds) { - super.onBoundsChange(bounds); - mBounds.set(bounds); - updateBitmap(); - invalidateSelf(); - } - - @Override - public int getIntrinsicWidth() { - return -1; - } - - @Override - public int getIntrinsicHeight() { - return -1; - } - - public void setColor(int color) { - mColorPaint.setColor(color); - updateBitmap(); - invalidateSelf(); - } - - private void updateBitmap() { - final Rect bounds = mBounds; - if (bounds.isEmpty()) return; - mBitmap = Bitmap.createBitmap(bounds.width(), bounds.height(), Config.ARGB_8888); - final Canvas canvas = new Canvas(mBitmap); - final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); - paint.setColor(0xFF000000 | mColorPaint.getColor()); - final float radius = mRadius; - paint.setShadowLayer(radius, 0, radius * 1.5f / 2, SHADOW_START_COLOR); - final RectF rect = new RectF(mView.getPaddingLeft(), mView.getPaddingTop(), - bounds.width() - mView.getPaddingRight(), bounds.height() - mView.getPaddingBottom()); - canvas.drawOval(rect, paint); - paint.setShadowLayer(0, 0, 0, 0); - paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); - canvas.drawOval(rect, paint); - } - } - -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/iface/IHomeActionButton.java b/twidere/src/main/java/org/mariotaku/twidere/view/iface/IHomeActionButton.java deleted file mode 100644 index 27c8cf794..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/view/iface/IHomeActionButton.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.mariotaku.twidere.view.iface; - -import android.graphics.Bitmap; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; - -/** - * Created by mariotaku on 14/10/23. - */ -public interface IHomeActionButton { - void setButtonColor(int color); - - void setIcon(Bitmap bm); - - void setIcon(Drawable drawable); - - void setIcon(int resId); - - void setIconColor(int color, PorterDuff.Mode mode); - - void setTitle(CharSequence title); - - void setTitle(int title); -} diff --git a/twidere/src/main/res/drawable-hdpi/ic_action_star.png b/twidere/src/main/res/drawable-hdpi/ic_action_star.png deleted file mode 100644 index 60f52a1379dc62a88973a98ac2fbfb8fb2cf0dc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmV-n0iOPeP)D!p0EN*jDiH`o1!5iqqN0u$m{@|qkRU57ClEXW5`jSQ027nQN(5p8S%E-IR8&+T zzKxJ36;Rs#G+CCOBQ+Y0zXk_Kbz;Lt^}!|~!B$ly;&|ae83(#5hZb9k+R{>aSga{xjisuX@yJYOm~iHvGZUF3;+{z67?7tgQ+VX@ zWQq-WHZny>o=|4!lC{IdWk;4R6O2hkcv$*{g-1kcEE6oaTG3Gk9adZ|WP&}g$JGtE zd;xn^M~es_OLt)5^G!=tVPoq7Y-}|ejeqV3hhEb$rcWsn00000NkvXXu0mjfW4VWn diff --git a/twidere/src/main/res/drawable-mdpi/ic_action_star.png b/twidere/src/main/res/drawable-mdpi/ic_action_star.png deleted file mode 100644 index bc7d3a6eb4bd06047628c341a54b67263e37ede3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmV+f0sH=mP)kdg0002XNkl?tS@I>g#~2Sw^MXt5!-p+$olMP*~ej({uy zJBE4&iwUocv6O`Y7oNE=&}%d~ljclQW^nLH@^NI26-g_-g9Ayv%uyvxRi@~17cyl^ z$X!>aSP)s`=mv*1k%dgL0EXc&9t189wkJ-7ii0|dij!0jq%OL;TgZ~ZMRceLg@Vvg*De-{LP4yV3Y`qN z3aOyet%gjZ^rn!Lw-g(U!IDevzsvGJk7QYvWm&N>%dC0_hayEB^$Md@s4%KtVS{__ z*-&rb;`5hJR=q%;hIdLIIZ8B?$SG}1aYw@)Q%W0qG}}|U@CaxY;3++1_(ZD@WRw;L zDbuRVpwhx3HCokJR8r_?lDDj~$u0++;`1DzQx4c=lU3d@Nx$M?iG7YJ;}eHZnIraD zQm1&$PfYp2D|HT+Lu$lT;}BQfA;(AJdQVPqP~ets-BM6oI4pBbH?CR6kqJz5MW?Qq zmMLTyrbH)743m*bcoYeVBBY2X^B7=os3N5CBJy;h5{ZQ1#Wn%%nO;uI8`1695bSS z7~zRM^7RGjQ3W!h>y@#u*UunKAnGAM`QC zS3=-SX5mujk`)}afx`-y{Kl0@%(KprB4UVj=4DxyWm#4ve*jb*0W2Sw>5>2d002ov JPDHLkV1hzu-5&q| diff --git a/twidere/src/main/res/drawable-xxhdpi/ic_action_star.png b/twidere/src/main/res/drawable-xxhdpi/ic_action_star.png deleted file mode 100644 index 9ccdd4aa07f1e459cd537074a0268c2b0b8b5ab7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 zcmV+r0`L8aP)pl~rAB$d(Q~QC zDJSf>wo^{%xYj8jl-yD(7qr~cDi0LgQz!>C+_TsE;pn-i$7$^dJQB2abUe~&-PrP- zt=54J8-7ty@j^?>fuA_g((*z@#fA+V%?VFMMMX0YaNJ;5w#YKq;+7+SX-?DHDm3x2D~!XtJZ*? zv3jM4=NVq95qL&WYBW5fQEGHNqf=TGJQ67=h&-aMXOZRVvhch!pxu6huDMN`=Uq zfl@z2VBk$uD!kd_Gy;x2XT8$E0}-z$;E8}&3Iu{CKp@B%V~jDz7-Nhv|C`@9%)9ZR S?h9T30000 - - \ No newline at end of file diff --git a/twidere/src/main/res/layout/activity_content_fragment.xml b/twidere/src/main/res/layout/activity_content_fragment.xml index dae9f1b11..eee80578b 100644 --- a/twidere/src/main/res/layout/activity_content_fragment.xml +++ b/twidere/src/main/res/layout/activity_content_fragment.xml @@ -17,16 +17,17 @@ ~ along with this program. If not, see . --> - + android:layout_height="match_parent"/> + tools:ignore="UnusedAttribute"/> + android:background="?android:windowContentOverlay"/> diff --git a/twidere/src/main/res/layout/activity_home.xml b/twidere/src/main/res/layout/activity_home.xml index 692f39259..33e70d4c9 100644 --- a/twidere/src/main/res/layout/activity_home.xml +++ b/twidere/src/main/res/layout/activity_home.xml @@ -17,23 +17,25 @@ ~ along with this program. If not, see . --> - - + android:layout_height="match_parent" + android:fitsSystemWindows="true"> + android:layout_height="match_parent"/> - + android:layout_gravity="start" + tools:layout="@layout/fragment_accounts_dashboard"/> \ No newline at end of file diff --git a/twidere/src/main/res/layout/activity_home_content.xml b/twidere/src/main/res/layout/activity_home_content.xml index 1a574b374..84eda5555 100644 --- a/twidere/src/main/res/layout/activity_home_content.xml +++ b/twidere/src/main/res/layout/activity_home_content.xml @@ -17,10 +17,10 @@ ~ along with this program. If not, see . --> - @@ -32,29 +32,33 @@ - + + + + + + android:layout_gravity="bottom|end" + android:layout_margin="@dimen/element_spacing_large" + android:clickable="true" + android:src="@drawable/ic_action_status_compose" + app:elevation="6dp" + app:pressedTranslationZ="12dp"/> - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/twidere/src/main/res/layout/activity_request_permissions.xml b/twidere/src/main/res/layout/activity_request_permissions.xml index 0cdd870b8..d507647da 100644 --- a/twidere/src/main/res/layout/activity_request_permissions.xml +++ b/twidere/src/main/res/layout/activity_request_permissions.xml @@ -26,7 +26,7 @@ android:divider="?android:dividerVertical" android:orientation="vertical" android:showDividers="middle" - tools:context=".activity.support.RequestPermissionsActivity"> + tools:context=".activity.RequestPermissionsActivity"> + android:layout_height="match_parent" + android:focusable="true"> . --> - diff --git a/twidere/src/main/res/layout/header_drawer_account_selector.xml b/twidere/src/main/res/layout/header_drawer_account_selector.xml index faebb4da7..5a1f3ccfc 100644 --- a/twidere/src/main/res/layout/header_drawer_account_selector.xml +++ b/twidere/src/main/res/layout/header_drawer_account_selector.xml @@ -17,7 +17,9 @@ ~ along with this program. If not, see . --> - + tools:src="@drawable/nyan_stars_background"/> + tools:src="@mipmap/ic_launcher"/> + tools:visibility="invisible"/> + tools:text="Name"/> + android:textColor="@color/light_gray" + tools:text="\@username"/> @@ -129,7 +131,7 @@ android:id="@+id/account_dashboard_menu" android:layout_width="match_parent" android:layout_height="match_parent" - android:focusable="true" /> + android:focusable="true"/> @@ -143,7 +145,7 @@ android:focusable="false" android:scaleType="fitCenter" android:visibility="invisible" - tools:ignore="ContentDescription" /> + tools:ignore="ContentDescription"/> + android:text="@string/no_account"/> diff --git a/twidere/src/main/res/layout/layout_actionbar_home.xml b/twidere/src/main/res/layout/layout_actionbar_home.xml deleted file mode 100644 index ccc47ee6f..000000000 --- a/twidere/src/main/res/layout/layout_actionbar_home.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/twidere/src/main/res/layout/layout_home_actions_button.xml b/twidere/src/main/res/layout/layout_home_actions_button.xml deleted file mode 100644 index 69dc640c7..000000000 --- a/twidere/src/main/res/layout/layout_home_actions_button.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - \ No newline at end of file diff --git a/twidere/src/main/res/menu/menu_account_dashboard.xml b/twidere/src/main/res/menu/menu_account_dashboard.xml new file mode 100644 index 000000000..ba63cd883 --- /dev/null +++ b/twidere/src/main/res/menu/menu_account_dashboard.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/twidere/src/main/res/values-notnight/themes.xml b/twidere/src/main/res/values-notnight/themes.xml index 820830a73..50db22ba8 100644 --- a/twidere/src/main/res/values-notnight/themes.xml +++ b/twidere/src/main/res/values-notnight/themes.xml @@ -18,7 +18,8 @@ @color/quote_indicator_background_light true - @style/asb_Preference.SwitchPreference + + light @style/PreferenceThemeOverlay.v14.Material @@ -41,7 +42,8 @@ @color/quote_indicator_background_light true - @style/asb_Preference.SwitchPreference + + light @style/PreferenceThemeOverlay.v14.Material @@ -69,7 +71,9 @@ @color/quote_indicator_background_light true - @style/asb_Preference.SwitchPreference + + light + @@ -94,7 +98,9 @@ @color/quote_indicator_background_light true - @style/asb_Preference.SwitchPreference + + light + @@ -130,7 +136,9 @@ @color/quote_indicator_background_light true - @style/asb_Preference.SwitchPreference + + light + @@ -46,7 +47,8 @@ @color/quote_indicator_background_dark true - @style/asb_Preference.SwitchPreference + + dark @style/PreferenceThemeOverlay.v14.Material @@ -73,7 +75,9 @@ @color/quote_indicator_background_dark true - @style/asb_Preference.SwitchPreference + + dark +