From 0bf7f466a5b60f5e480a111ed72f188d268c6b31 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Fri, 17 Jul 2015 22:30:41 +0800 Subject: [PATCH] migrating SlidingMenu to DrawerLayout --- build.gradle | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../mariotaku/twidere/TwidereConstants.java | 1 + .../twitter/api/PrivateScheduleResources.java | 16 +- .../api/twitter/model/ExtendedProfile.java | 53 ++++ .../api/twitter/model/ScheduledStatus.java | 34 +++ .../twitter/model/ScheduledStatusesList.java | 21 +- .../model/impl/ExtendedProfileImpl.java | 87 ++++++ .../model/impl/ScheduledStatusImpl.java | 28 ++ .../impl/ScheduledStatusesListWrapper.java | 73 +++++ .../api/twitter/util/TwitterConverter.java | 7 + .../twitter/util/TwitterDateConverter.java | 36 ++- .../mariotaku/twidere/model/ObjectCursor.java | 2 +- .../twidere/model/ParcelableAccount.java | 6 + .../twidere/model/ParcelableStatus.java | 7 +- .../org/mariotaku/twidere/util/AbsLogger.java | 65 +++++ .../twidere/util/TwitterContentUtils.java | 9 + twidere.donate.nyanwp.wear/build.gradle | 2 +- twidere.wear/build.gradle | 2 +- twidere/build.gradle | 8 +- .../support/OpenStreetMapViewerFragment.java | 2 +- .../fragment/support/GoogleMapFragment.java | 2 +- .../fragment/support/WebMapFragment.java | 2 +- .../java/org/mariotaku/twidere/Constants.java | 77 +----- .../twidere/activity/SettingsActivity.java | 4 +- .../activity/TwitterLinkHandlerActivity.java | 4 +- .../support/BaseAppCompatActivity.java | 3 +- .../support/BrowserSignInActivity.java | 2 +- .../activity/support/ComposeActivity.java | 69 ++--- .../activity/support/HomeActivity.java | 251 ++++++++---------- .../activity/support/LinkHandlerActivity.java | 6 +- .../activity/support/MediaViewerActivity.java | 26 +- .../activity/support/SignInActivity.java | 116 ++++---- .../twidere/adapter/AbsActivitiesAdapter.java | 36 +-- .../twidere/adapter/AbsStatusesAdapter.java | 3 + .../twidere/adapter/AbsUserListsAdapter.java | 3 + .../twidere/adapter/AbsUsersAdapter.java | 3 + .../adapter/MessageEntriesAdapter.java | 35 +-- .../adapter/iface/IActivitiesAdapter.java | 3 + .../adapter/iface/IContentCardAdapter.java | 4 + .../adapter/iface/IUserListsAdapter.java | 3 + .../twidere/adapter/iface/IUsersAdapter.java | 3 + .../twidere/app/TwidereApplication.java | 8 +- .../BaseAccountPreferenceFragment.java | 2 +- .../twidere/fragment/BaseFiltersFragment.java | 10 +- .../twidere/fragment/CustomTabsFragment.java | 2 +- .../fragment/ExtensionsListFragment.java | 10 +- .../fragment/HostMappingsListFragment.java | 4 +- .../fragment/KeyboardShortcutsFragment.java | 2 +- .../AbsContentRecyclerViewFragment.java | 7 +- .../fragment/support/AbsStatusesFragment.java | 2 +- .../support/AccountsDashboardFragment.java | 53 ++-- .../support/AccountsManagerFragment.java | 6 +- .../support/DirectMessagesFragment.java | 2 +- .../fragment/support/DraftsFragment.java | 4 +- .../support/MessagesConversationFragment.java | 10 +- .../support/ParcelableStatusesFragment.java | 1 + .../fragment/support/QuickMenuFragment.java | 157 ----------- .../support/ScheduledStatusesFragment.java | 156 +++++++++++ .../fragment/support/SearchFragment.java | 6 +- .../fragment/support/StatusFragment.java | 5 +- .../fragment/support/UserFragment.java | 62 +++-- .../fragment/support/UserListFragment.java | 30 +-- .../support/UserProfileEditorFragment.java | 2 +- .../support/ScheduledStatusesLoader.java | 73 +++++ .../service/BackgroundOperationService.java | 3 +- .../twidere/util/MultiSelectEventHandler.java | 10 +- .../mariotaku/twidere/util/TwidereLogger.java | 76 ++++++ .../twidere/util/TwitterAPIFactory.java | 26 ++ .../org/mariotaku/twidere/util/Utils.java | 72 +++-- .../twidere/view/AssetFontTextView.java | 33 --- .../twidere/view/HandleSpanClickTextView.java | 5 +- .../twidere/view/HomeSlidingMenu.java | 110 -------- .../twidere/view/LeftDrawerFrameLayout.java | 57 +--- .../org/mariotaku/twidere/view/NameView.java | 4 +- .../mariotaku/twidere/view/ShortTimeView.java | 4 +- .../twidere/view/holder/StatusViewHolder.java | 12 +- .../drawable-hdpi/ic_action_cake.png | Bin 0 -> 540 bytes .../drawable-hdpi/ic_action_link.png | Bin 0 -> 669 bytes .../drawable-hdpi/ic_action_location.png | Bin 0 -> 765 bytes .../drawable-hdpi/ic_action_settings.png | Bin 0 -> 870 bytes .../drawable-hdpi/ic_action_time.png | Bin 0 -> 972 bytes .../drawable-mdpi/ic_action_cake.png | Bin 0 -> 346 bytes .../drawable-mdpi/ic_action_link.png | Bin 0 -> 455 bytes .../drawable-mdpi/ic_action_location.png | Bin 0 -> 555 bytes .../drawable-mdpi/ic_action_settings.png | Bin 0 -> 617 bytes .../drawable-mdpi/ic_action_time.png | Bin 0 -> 678 bytes .../drawable-xhdpi/ic_action_cake.png | Bin 0 -> 553 bytes .../drawable-xhdpi/ic_action_link.png | Bin 0 -> 740 bytes .../drawable-xhdpi/ic_action_location.png | Bin 0 -> 920 bytes .../drawable-xhdpi/ic_action_settings.png | Bin 0 -> 1046 bytes .../drawable-xhdpi/ic_action_time.png | Bin 0 -> 1310 bytes .../drawable-xxhdpi/ic_action_cake.png | Bin 0 -> 735 bytes .../drawable-xxhdpi/ic_action_link.png | Bin 0 -> 1014 bytes .../drawable-xxhdpi/ic_action_location.png | Bin 0 -> 1321 bytes .../drawable-xxhdpi/ic_action_settings.png | Bin 0 -> 1536 bytes .../drawable-xxhdpi/ic_action_time.png | Bin 0 -> 1872 bytes .../drawable-xxxhdpi/ic_action_cake.png | Bin 0 -> 921 bytes .../drawable-xxxhdpi/ic_action_link.png | Bin 0 -> 1377 bytes .../drawable-xxxhdpi/ic_action_location.png | Bin 0 -> 1720 bytes .../drawable-xxxhdpi/ic_action_settings.png | Bin 0 -> 1995 bytes .../drawable-xxxhdpi/ic_action_time.png | Bin 0 -> 2435 bytes .../main/res/drawable-hdpi/ic_action_link.png | Bin 524 -> 0 bytes .../res/drawable-hdpi/ic_action_location.png | Bin 418 -> 0 bytes .../drawable-hdpi/ic_action_portal_cake.png | Bin 659 -> 0 bytes .../res/drawable-hdpi/ic_action_settings.png | Bin 362 -> 0 bytes .../main/res/drawable-hdpi/ic_action_time.png | Bin 457 -> 0 bytes .../main/res/drawable-mdpi/ic_action_link.png | Bin 362 -> 0 bytes .../res/drawable-mdpi/ic_action_location.png | Bin 286 -> 0 bytes .../drawable-mdpi/ic_action_portal_cake.png | Bin 442 -> 0 bytes .../res/drawable-mdpi/ic_action_settings.png | Bin 267 -> 0 bytes .../main/res/drawable-mdpi/ic_action_time.png | Bin 329 -> 0 bytes .../res/drawable-xhdpi/ic_action_link.png | Bin 739 -> 0 bytes .../res/drawable-xhdpi/ic_action_location.png | Bin 581 -> 0 bytes .../drawable-xhdpi/ic_action_portal_cake.png | Bin 911 -> 0 bytes .../res/drawable-xhdpi/ic_action_settings.png | Bin 556 -> 0 bytes .../res/drawable-xhdpi/ic_action_time.png | Bin 701 -> 0 bytes .../res/drawable-xxhdpi/ic_action_link.png | Bin 1079 -> 0 bytes .../drawable-xxhdpi/ic_action_location.png | Bin 917 -> 0 bytes .../drawable-xxhdpi/ic_action_portal_cake.png | Bin 1424 -> 0 bytes .../drawable-xxhdpi/ic_action_settings.png | Bin 612 -> 0 bytes .../res/drawable-xxhdpi/ic_action_time.png | Bin 781 -> 0 bytes .../main/res/drawable/drawer_shadow_left.xml | 27 ++ .../res/layout/activity_compose_bottombar.xml | 4 +- twidere/src/main/res/layout/activity_home.xml | 24 +- .../res/layout/card_item_activity_summary.xml | 6 +- .../card_item_activity_summary_compact.xml | 6 +- twidere/src/main/res/layout/card_item_gap.xml | 2 +- .../card_item_message_conversation_common.xml | 2 +- .../res/layout/card_item_status_common.xml | 2 +- .../src/main/res/layout/card_item_user.xml | 12 +- .../res/layout/card_item_user_compact.xml | 12 +- .../main/res/layout/card_item_user_list.xml | 10 +- .../layout/card_item_user_list_compact.xml | 6 +- .../res/layout/drawer_home_quick_menu.xml | 36 --- .../main/res/layout/fragment_quick_menu.xml | 90 ------- .../main/res/layout/header_status_common.xml | 24 +- twidere/src/main/res/layout/header_user.xml | 28 +- ...cky.xml => list_item_scheduled_status.xml} | 26 +- twidere/src/main/res/menu/menu_compose.xml | 31 ++- .../src/main/res/menu/menu_user_profile.xml | 4 + twidere/src/main/res/values/attrs.xml | 3 - twidere/src/main/res/values/strings.xml | 2 + .../main/svg/drawable/ic_action_cake-mdpi.svg | 12 + .../main/svg/drawable/ic_action_link-mdpi.svg | 12 + .../svg/drawable/ic_action_location-mdpi.svg | 12 + .../ic_action_settings-mdpi.svg | 0 .../main/svg/drawable/ic_action_time-mdpi.svg | 13 + 148 files changed, 1398 insertions(+), 1154 deletions(-) create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ExtendedProfile.java rename twidere/src/main/java/org/mariotaku/twidere/util/ErrorLogger.java => twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ScheduledStatusesList.java (63%) create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ExtendedProfileImpl.java create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ScheduledStatusesListWrapper.java create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/util/AbsLogger.java delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/fragment/support/QuickMenuFragment.java create mode 100644 twidere/src/main/java/org/mariotaku/twidere/fragment/support/ScheduledStatusesFragment.java create mode 100644 twidere/src/main/java/org/mariotaku/twidere/loader/support/ScheduledStatusesLoader.java create mode 100644 twidere/src/main/java/org/mariotaku/twidere/util/TwidereLogger.java delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/view/AssetFontTextView.java delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/view/HomeSlidingMenu.java create mode 100644 twidere/src/main/res-svg2png/drawable-hdpi/ic_action_cake.png create mode 100644 twidere/src/main/res-svg2png/drawable-hdpi/ic_action_link.png create mode 100644 twidere/src/main/res-svg2png/drawable-hdpi/ic_action_location.png create mode 100644 twidere/src/main/res-svg2png/drawable-hdpi/ic_action_settings.png create mode 100644 twidere/src/main/res-svg2png/drawable-hdpi/ic_action_time.png create mode 100644 twidere/src/main/res-svg2png/drawable-mdpi/ic_action_cake.png create mode 100644 twidere/src/main/res-svg2png/drawable-mdpi/ic_action_link.png create mode 100644 twidere/src/main/res-svg2png/drawable-mdpi/ic_action_location.png create mode 100644 twidere/src/main/res-svg2png/drawable-mdpi/ic_action_settings.png create mode 100644 twidere/src/main/res-svg2png/drawable-mdpi/ic_action_time.png create mode 100644 twidere/src/main/res-svg2png/drawable-xhdpi/ic_action_cake.png create mode 100644 twidere/src/main/res-svg2png/drawable-xhdpi/ic_action_link.png create mode 100644 twidere/src/main/res-svg2png/drawable-xhdpi/ic_action_location.png create mode 100644 twidere/src/main/res-svg2png/drawable-xhdpi/ic_action_settings.png create mode 100644 twidere/src/main/res-svg2png/drawable-xhdpi/ic_action_time.png create mode 100644 twidere/src/main/res-svg2png/drawable-xxhdpi/ic_action_cake.png create mode 100644 twidere/src/main/res-svg2png/drawable-xxhdpi/ic_action_link.png create mode 100644 twidere/src/main/res-svg2png/drawable-xxhdpi/ic_action_location.png create mode 100644 twidere/src/main/res-svg2png/drawable-xxhdpi/ic_action_settings.png create mode 100644 twidere/src/main/res-svg2png/drawable-xxhdpi/ic_action_time.png create mode 100644 twidere/src/main/res-svg2png/drawable-xxxhdpi/ic_action_cake.png create mode 100644 twidere/src/main/res-svg2png/drawable-xxxhdpi/ic_action_link.png create mode 100644 twidere/src/main/res-svg2png/drawable-xxxhdpi/ic_action_location.png create mode 100644 twidere/src/main/res-svg2png/drawable-xxxhdpi/ic_action_settings.png create mode 100644 twidere/src/main/res-svg2png/drawable-xxxhdpi/ic_action_time.png delete mode 100755 twidere/src/main/res/drawable-hdpi/ic_action_link.png delete mode 100755 twidere/src/main/res/drawable-hdpi/ic_action_location.png delete mode 100755 twidere/src/main/res/drawable-hdpi/ic_action_portal_cake.png delete mode 100644 twidere/src/main/res/drawable-hdpi/ic_action_settings.png delete mode 100755 twidere/src/main/res/drawable-hdpi/ic_action_time.png delete mode 100755 twidere/src/main/res/drawable-mdpi/ic_action_link.png delete mode 100755 twidere/src/main/res/drawable-mdpi/ic_action_location.png delete mode 100755 twidere/src/main/res/drawable-mdpi/ic_action_portal_cake.png delete mode 100644 twidere/src/main/res/drawable-mdpi/ic_action_settings.png delete mode 100755 twidere/src/main/res/drawable-mdpi/ic_action_time.png delete mode 100755 twidere/src/main/res/drawable-xhdpi/ic_action_link.png delete mode 100755 twidere/src/main/res/drawable-xhdpi/ic_action_location.png delete mode 100755 twidere/src/main/res/drawable-xhdpi/ic_action_portal_cake.png delete mode 100644 twidere/src/main/res/drawable-xhdpi/ic_action_settings.png delete mode 100755 twidere/src/main/res/drawable-xhdpi/ic_action_time.png delete mode 100755 twidere/src/main/res/drawable-xxhdpi/ic_action_link.png delete mode 100755 twidere/src/main/res/drawable-xxhdpi/ic_action_location.png delete mode 100755 twidere/src/main/res/drawable-xxhdpi/ic_action_portal_cake.png delete mode 100644 twidere/src/main/res/drawable-xxhdpi/ic_action_settings.png delete mode 100755 twidere/src/main/res/drawable-xxhdpi/ic_action_time.png create mode 100644 twidere/src/main/res/drawable/drawer_shadow_left.xml delete mode 100644 twidere/src/main/res/layout/drawer_home_quick_menu.xml delete mode 100644 twidere/src/main/res/layout/fragment_quick_menu.xml rename twidere/src/main/res/layout/{list_footer_user_profile_uucky.xml => list_item_scheduled_status.xml} (51%) create mode 100644 twidere/src/main/svg/drawable/ic_action_cake-mdpi.svg create mode 100644 twidere/src/main/svg/drawable/ic_action_link-mdpi.svg create mode 100644 twidere/src/main/svg/drawable/ic_action_location-mdpi.svg rename twidere/src/main/svg/{ => drawable}/ic_action_settings-mdpi.svg (100%) create mode 100644 twidere/src/main/svg/drawable/ic_action_time-mdpi.svg diff --git a/build.gradle b/build.gradle index df022d09d..b58f3e952 100644 --- a/build.gradle +++ b/build.gradle @@ -6,9 +6,9 @@ buildscript { jcenter() } dependencies { - classpath 'com.github.ben-manes:gradle-versions-plugin:0.9' + classpath 'com.github.ben-manes:gradle-versions-plugin:0.11.3' classpath 'com.android.tools.build:gradle:1.2.3' - classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' + classpath 'com.neenbedankt.gradle.plugins:android-apt:1.5.1' classpath('fr.avianey.androidsvgdrawable:gradle-plugin:1.0.2') { // should be excluded to avoid conflict exclude group: 'xerces' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 819314ff3..3580a6200 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java index f63ca9b85..889fd1555 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java @@ -83,6 +83,7 @@ public interface TwidereConstants extends SharedPreferenceConstants, IntentConst String AUTHORITY_DIRECT_MESSAGES_CONVERSATION = "direct_messages_conversation"; String AUTHORITY_SEARCH = "search"; String AUTHORITY_MAP = "map"; + String AUTHORITY_SCHEDULED_STATUSES = "scheduled_statuses"; String AUTHORITY_USER_LIST = "user_list"; String AUTHORITY_USER_LIST_TIMELINE = "user_list_timeline"; String AUTHORITY_USER_LIST_MEMBERS = "user_list_members"; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateScheduleResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateScheduleResources.java index 975c3602b..7bf234c22 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateScheduleResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateScheduleResources.java @@ -20,13 +20,19 @@ package org.mariotaku.twidere.api.twitter.api; import org.mariotaku.restfu.annotation.method.DELETE; +import org.mariotaku.restfu.annotation.method.GET; import org.mariotaku.restfu.annotation.method.POST; import org.mariotaku.restfu.annotation.method.PUT; import org.mariotaku.restfu.annotation.param.Body; import org.mariotaku.restfu.annotation.param.Form; +import org.mariotaku.restfu.annotation.param.MethodExtra; import org.mariotaku.restfu.annotation.param.Path; +import org.mariotaku.restfu.annotation.param.Query; import org.mariotaku.restfu.http.BodyType; +import org.mariotaku.twidere.api.twitter.TwitterException; +import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.api.twitter.model.ScheduledStatus; +import org.mariotaku.twidere.api.twitter.model.ScheduledStatusesList; import org.mariotaku.twidere.api.twitter.model.StatusSchedule; /** @@ -36,13 +42,17 @@ public interface PrivateScheduleResources { @POST("/schedule/status/tweet.json") @Body(BodyType.FORM) - ScheduledStatus scheduleTweet(@Form StatusSchedule schedule); + ScheduledStatus scheduleTweet(@Form StatusSchedule schedule) throws TwitterException; @DELETE("/schedule/status/{id}.json") - ScheduledStatus destroyScheduleTweet(@Path("id") long id); + ScheduledStatus destroyScheduleTweet(@Path("id") long id) throws TwitterException; @PUT("/schedule/status/{id}.json") @Body(BodyType.FORM) - ScheduledStatus updateScheduleTweet(@Path("id") long id, @Form StatusSchedule schedule); + ScheduledStatus updateScheduleTweet(@Path("id") long id, @Form StatusSchedule schedule) throws TwitterException; + + @GET("/schedule/status/list.json") + @MethodExtra(name = "extra_params", values = {"include_entities", "include_cards", "cards_platform"}) + ScheduledStatusesList getScheduledStatusesList(@Query Paging paging, @Query("state") ScheduledStatus.State[] states) throws TwitterException; } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ExtendedProfile.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ExtendedProfile.java new file mode 100644 index 000000000..9bcd83984 --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ExtendedProfile.java @@ -0,0 +1,53 @@ +/* + * 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.api.twitter.model; + +/** + * Created by mariotaku on 15/7/8. + */ +public interface ExtendedProfile { + + long getId(); + + Birthdate getBirthdate(); + + interface Birthdate { + int getDay(); + + int getMonth(); + + int getYear(); + + Visibility getVisibility(); + + Visibility getYearVisibility(); + + enum Visibility { + MUTUALFOLLOW, PUBLIC, UNKNOWN; + + public static Visibility parse(String s) { + if ("mutualfollow".equals(s)) return MUTUALFOLLOW; + if ("public".equals(s)) return PUBLIC; + return UNKNOWN; + } + } + } + +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ScheduledStatus.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ScheduledStatus.java index cbd6223e3..df2a3809f 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ScheduledStatus.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ScheduledStatus.java @@ -26,6 +26,12 @@ import java.util.Date; */ public interface ScheduledStatus { + long getUserId(); + + boolean isPossiblySensitive(); + + long getId(); + long[] getMediaIds(); Date getUpdatedAt(); @@ -35,4 +41,32 @@ public interface ScheduledStatus { Date getExecuteAt(); String getText(); + + State getState(); + + enum State { + SCHEDULED("scheduled"), FAILED("failed"), CANCELED("canceled"); + + private final String value; + + State(String value) { + this.value = value; + } + + public static State parse(String value) { + if (SCHEDULED.value.equalsIgnoreCase(value)) { + return SCHEDULED; + } else if (FAILED.value.equalsIgnoreCase(value)) { + return FAILED; + } else if (CANCELED.value.equalsIgnoreCase(value)) { + return CANCELED; + } + return null; + } + + @Override + public String toString() { + return value; + } + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ErrorLogger.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ScheduledStatusesList.java similarity index 63% rename from twidere/src/main/java/org/mariotaku/twidere/util/ErrorLogger.java rename to twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ScheduledStatusesList.java index e3d501f6a..72b678f87 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ErrorLogger.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ScheduledStatusesList.java @@ -17,25 +17,10 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.util; - -import org.acra.ACRA; -import org.mariotaku.twidere.activity.TwitterLinkHandlerActivity; +package org.mariotaku.twidere.api.twitter.model; /** - * Created by mariotaku on 15/5/25. + * Created by mariotaku on 15/7/9. */ -public class ErrorLogger { - - private static boolean sEnabled; - - public static void setEnabled(boolean enabled) { - sEnabled = enabled; - } - - public static void exception(final Throwable t) { - if (!sEnabled) return; - ACRA.getErrorReporter().handleSilentException(t); - } - +public interface ScheduledStatusesList extends ResponseList { } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ExtendedProfileImpl.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ExtendedProfileImpl.java new file mode 100644 index 000000000..7dbd4cfe6 --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ExtendedProfileImpl.java @@ -0,0 +1,87 @@ +/* + * 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.api.twitter.model.impl; + +import com.bluelinelabs.logansquare.annotation.JsonField; +import com.bluelinelabs.logansquare.annotation.JsonObject; + +import org.mariotaku.twidere.api.twitter.model.ExtendedProfile; + +/** + * Created by mariotaku on 15/7/8. + */ +@JsonObject +public class ExtendedProfileImpl implements ExtendedProfile { + + @JsonField(name = "id") + long id; + @JsonField(name = "birthdate") + BirthdateImpl birthdate; + + @Override + public long getId() { + return id; + } + + @Override + public Birthdate getBirthdate() { + return birthdate; + } + + @JsonObject + public static class BirthdateImpl implements Birthdate { + + @JsonField(name = "day") + int day; + @JsonField(name = "month") + int month; + @JsonField(name = "year") + int year; + @JsonField(name = "visibility") + Visibility visibility; + @JsonField(name = "year_visibility") + Visibility yearVisibility; + + @Override + public int getDay() { + return day; + } + + @Override + public int getMonth() { + return month; + } + + @Override + public int getYear() { + return year; + } + + @Override + public Visibility getVisibility() { + return visibility; + } + + @Override + public Visibility getYearVisibility() { + return yearVisibility; + } + } +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ScheduledStatusImpl.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ScheduledStatusImpl.java index 84580b32c..41fefb31b 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ScheduledStatusImpl.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ScheduledStatusImpl.java @@ -43,6 +43,29 @@ public class ScheduledStatusImpl implements ScheduledStatus { String text; @JsonField(name = "media_ids") long[] mediaIds; + @JsonField(name = "id") + long id; + @JsonField(name = "possiblySensitive") + boolean possiblySensitive; + @JsonField(name = "user_id") + long userId; + @JsonField(name = "state") + State state; + + @Override + public long getUserId() { + return userId; + } + + @Override + public boolean isPossiblySensitive() { + return possiblySensitive; + } + + @Override + public long getId() { + return id; + } @Override public long[] getMediaIds() { @@ -68,4 +91,9 @@ public class ScheduledStatusImpl implements ScheduledStatus { public String getText() { return text; } + + @Override + public State getState() { + return state; + } } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ScheduledStatusesListWrapper.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ScheduledStatusesListWrapper.java new file mode 100644 index 000000000..559a25ce2 --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ScheduledStatusesListWrapper.java @@ -0,0 +1,73 @@ +/* + * 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.api.twitter.model.impl; + +import com.bluelinelabs.logansquare.annotation.JsonField; +import com.bluelinelabs.logansquare.annotation.JsonObject; +import com.bluelinelabs.logansquare.annotation.OnJsonParseComplete; + +import org.mariotaku.restfu.http.RestHttpResponse; +import org.mariotaku.twidere.api.twitter.model.RateLimitStatus; +import org.mariotaku.twidere.api.twitter.model.ScheduledStatus; +import org.mariotaku.twidere.api.twitter.model.ScheduledStatusesList; + +import java.util.ArrayList; + +/** + * Created by mariotaku on 15/7/9. + */ +@JsonObject +public class ScheduledStatusesListWrapper implements Wrapper { + + @JsonField(name = "results") + ArrayList list; + private ScheduledStatusesListImpl wrapped; + + @Override + public ScheduledStatusesList getWrapped(Object extra) { + return wrapped; + } + + @Override + public void processResponseHeader(RestHttpResponse resp) { + wrapped.processResponseHeader(resp); + } + + @OnJsonParseComplete + void onParseComplete() { + // Do some fancy post-processing stuff after parsing here + wrapped = new ScheduledStatusesListImpl(); + wrapped.addAll(list); + } + + @Override + public int getAccessLevel() { + return wrapped.getAccessLevel(); + } + + @Override + public RateLimitStatus getRateLimitStatus() { + return wrapped.getRateLimitStatus(); + } + + @JsonObject + public static class ScheduledStatusesListImpl extends ResponseListImpl implements ScheduledStatusesList { + } +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterConverter.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterConverter.java index 9e1a53ce3..6d03f87df 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterConverter.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterConverter.java @@ -37,6 +37,7 @@ import org.mariotaku.twidere.api.twitter.model.Activity; import org.mariotaku.twidere.api.twitter.model.CardEntity; import org.mariotaku.twidere.api.twitter.model.DirectMessage; import org.mariotaku.twidere.api.twitter.model.ErrorInfo; +import org.mariotaku.twidere.api.twitter.model.ExtendedProfile; import org.mariotaku.twidere.api.twitter.model.GeoLocation; import org.mariotaku.twidere.api.twitter.model.HashtagEntity; import org.mariotaku.twidere.api.twitter.model.IDs; @@ -52,6 +53,7 @@ import org.mariotaku.twidere.api.twitter.model.ResponseCode; import org.mariotaku.twidere.api.twitter.model.ResponseList; import org.mariotaku.twidere.api.twitter.model.SavedSearch; import org.mariotaku.twidere.api.twitter.model.ScheduledStatus; +import org.mariotaku.twidere.api.twitter.model.ScheduledStatusesList; import org.mariotaku.twidere.api.twitter.model.Status; import org.mariotaku.twidere.api.twitter.model.StatusActivitySummary; import org.mariotaku.twidere.api.twitter.model.StatusDeletionNotice; @@ -69,6 +71,7 @@ import org.mariotaku.twidere.api.twitter.model.impl.ActivityImpl; import org.mariotaku.twidere.api.twitter.model.impl.CardEntityImpl; import org.mariotaku.twidere.api.twitter.model.impl.DirectMessageImpl; import org.mariotaku.twidere.api.twitter.model.impl.ErrorInfoImpl; +import org.mariotaku.twidere.api.twitter.model.impl.ExtendedProfileImpl; import org.mariotaku.twidere.api.twitter.model.impl.HashtagEntityImpl; import org.mariotaku.twidere.api.twitter.model.impl.IDsImpl; import org.mariotaku.twidere.api.twitter.model.impl.Indices; @@ -84,6 +87,7 @@ import org.mariotaku.twidere.api.twitter.model.impl.RelationshipWrapper; import org.mariotaku.twidere.api.twitter.model.impl.ResponseListImpl; import org.mariotaku.twidere.api.twitter.model.impl.SavedSearchImpl; import org.mariotaku.twidere.api.twitter.model.impl.ScheduledStatusImpl; +import org.mariotaku.twidere.api.twitter.model.impl.ScheduledStatusesListWrapper; import org.mariotaku.twidere.api.twitter.model.impl.StatusActivitySummaryImpl; import org.mariotaku.twidere.api.twitter.model.impl.StatusDeletionNoticeImpl; import org.mariotaku.twidere.api.twitter.model.impl.StatusImpl; @@ -155,6 +159,7 @@ public class TwitterConverter implements Converter { TypeConverterMapper.register(Warning.class, WarningImpl.class); TypeConverterMapper.register(StatusDeletionNotice.class, StatusDeletionNoticeImpl.class); TypeConverterMapper.register(ScheduledStatus.class, ScheduledStatusImpl.class); + TypeConverterMapper.register(ExtendedProfile.class, ExtendedProfileImpl.class); LoganSquare.registerTypeConverter(Indices.class, Indices.CONVERTER); LoganSquare.registerTypeConverter(GeoLocation.class, GeoLocation.CONVERTER); @@ -163,11 +168,13 @@ public class TwitterConverter implements Converter { LoganSquare.registerTypeConverter(MediaEntity.Type.class, EnumConverter.get(MediaEntity.Type.class)); LoganSquare.registerTypeConverter(UserList.Mode.class, EnumConverter.get(UserList.Mode.class)); LoganSquare.registerTypeConverter(Activity.Action.class, EnumConverter.get(Activity.Action.class)); + LoganSquare.registerTypeConverter(ScheduledStatus.State.class, EnumConverter.get(ScheduledStatus.State.class)); registerWrapper(QueryResult.class, QueryResultWrapper.class); registerWrapper(PageableResponseList.class, PageableResponseListWrapper.class); registerWrapper(Relationship.class, RelationshipWrapper.class); registerWrapper(CardEntity.BindingValue.class, CardEntityImpl.BindingValueWrapper.class); + registerWrapper(ScheduledStatusesList.class, ScheduledStatusesListWrapper.class); } @Override diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterDateConverter.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterDateConverter.java index 12dc948cf..fc1831034 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterDateConverter.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterDateConverter.java @@ -19,24 +19,50 @@ package org.mariotaku.twidere.api.twitter.util; -import com.bluelinelabs.logansquare.typeconverters.DateTypeConverter; +import com.bluelinelabs.logansquare.typeconverters.StringBasedTypeConverter; + +import org.mariotaku.twidere.util.AbsLogger; import java.text.DateFormat; +import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Locale; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; /** * Created by mariotaku on 15/5/7. */ -public class TwitterDateConverter extends DateTypeConverter { +public class TwitterDateConverter extends StringBasedTypeConverter { + private static final long ONE_MINUTE = TimeUnit.MILLISECONDS.convert(1, TimeUnit.MINUTES); private final DateFormat mDateFormat; public TwitterDateConverter() { - mDateFormat = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy", Locale.ENGLISH); + mDateFormat = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy", Locale.US); + mDateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); } - public DateFormat getDateFormat() { - return mDateFormat; + @Override + public Date getFromString(String string) { + final Date date; + try { + date = mDateFormat.parse(string); + } catch (ParseException e) { + AbsLogger.error("Unrecognized date: " + string, e); + return null; + } + final long currentTime = System.currentTimeMillis(); + if (date.getTime() - currentTime > ONE_MINUTE) { + AbsLogger.error("Tweet date from future: " + string + ", current time is " + currentTime); + } + return date; } + + @Override + public String convertToString(Date date) { + return mDateFormat.format(date); + } + } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ObjectCursor.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ObjectCursor.java index b53dd4c19..255d74a4f 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ObjectCursor.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ObjectCursor.java @@ -50,7 +50,7 @@ public class ObjectCursor extends AbstractList { mCache.put(location, object); return object; } - throw new ArrayIndexOutOfBoundsException(location); + throw new ArrayIndexOutOfBoundsException("length=" + mCursor.getCount() + "; index=" + location); } private void ensureCursor() { diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableAccount.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableAccount.java index 3157a8ce5..f4bbe4c3d 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableAccount.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableAccount.java @@ -250,6 +250,12 @@ public class ParcelableAccount implements Parcelable { return getCredentialsList(context, activatedOnly, false); } + public static ParcelableCredentials[] getCredentialsArray(final Context context, final boolean activatedOnly, + final boolean officialKeyOnly) { + final List credentialsList = getCredentialsList(context, activatedOnly, officialKeyOnly); + return credentialsList.toArray(new ParcelableCredentials[credentialsList.size()]); + } + public static List getCredentialsList(final Context context, final boolean activatedOnly, final boolean officialKeyOnly) { if (context == null) return Collections.emptyList(); diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java index 63082e4fa..4d8b0a6fd 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java @@ -648,7 +648,12 @@ public class ParcelableStatus implements Parcelable, Comparable + * + * 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.Application; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +/** + * Created by mariotaku on 15/7/8. + */ +public abstract class AbsLogger { + + private static AbsLogger sImplementation; + + public static void setImplementation(AbsLogger impl) { + sImplementation = impl; + } + + public static void log(@Nullable String message, @Nullable Throwable throwable) { + if (sImplementation == null) return; + sImplementation.logImpl(message, throwable); + } + + public static void error(@Nullable String message, @Nullable Throwable throwable) { + if (sImplementation == null) return; + sImplementation.errorImpl(message, throwable); + } + + public static void error(@NonNull String message) { + error(message, null); + } + + public static void init(Application application) { + if (sImplementation == null) return; + sImplementation.initImpl(application); + } + + public static void error(Throwable throwable) { + error(null, throwable); + } + + protected abstract void logImpl(@Nullable String message, @Nullable Throwable throwable); + + protected abstract void errorImpl(@Nullable String message, @Nullable Throwable throwable); + + protected abstract void initImpl(Application application); +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/TwitterContentUtils.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/TwitterContentUtils.java index ce4104113..663e59460 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/util/TwitterContentUtils.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/util/TwitterContentUtils.java @@ -41,6 +41,7 @@ import org.mariotaku.twidere.util.collection.LongSparseMap; import java.nio.charset.Charset; import java.util.List; import java.util.Set; +import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.CRC32; @@ -53,6 +54,7 @@ import static org.mariotaku.twidere.util.HtmlEscapeHelper.toPlainText; public class TwitterContentUtils { public static final int TWITTER_BULK_QUERY_COUNT = 100; + private static final long ONE_MINUTE = TimeUnit.MILLISECONDS.convert(1, TimeUnit.MINUTES); public static String formatDirectMessageText(final DirectMessage message) { if (message == null) return null; @@ -240,4 +242,11 @@ public class TwitterContentUtils { } } } + + public static void checkTime(long that, long current) { + if (that <= 0) return; + if ((that - current) > ONE_MINUTE) { + AbsLogger.error(new Exception("Wrong timestamp " + that + ", current " + current)); + } + } } diff --git a/twidere.donate.nyanwp.wear/build.gradle b/twidere.donate.nyanwp.wear/build.gradle index 7f551661b..e0e435a38 100644 --- a/twidere.donate.nyanwp.wear/build.gradle +++ b/twidere.donate.nyanwp.wear/build.gradle @@ -36,7 +36,7 @@ android { } dependencies { - compile 'com.google.android.support:wearable:1.1.0' + compile 'com.google.android.support:wearable:1.2.0' compile project(':twidere.component.nyan') compile fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/twidere.wear/build.gradle b/twidere.wear/build.gradle index 2acb1900a..03b52ffd7 100644 --- a/twidere.wear/build.gradle +++ b/twidere.wear/build.gradle @@ -41,5 +41,5 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.google.android.support:wearable:1.1.0' - compile 'com.google.android.gms:play-services-wearable:7.3.0' + compile 'com.google.android.gms:play-services-wearable:7.5.0' } diff --git a/twidere/build.gradle b/twidere/build.gradle index e85aafe05..36b7c078a 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -63,21 +63,19 @@ dependencies { compile 'com.android.support:appcompat-v7:22.2.0' compile 'com.android.support:cardview-v7:22.2.0' compile 'com.android.support:recyclerview-v7:22.2.0' - compile 'com.sothree.slidinguppanel:library:3.0.0' compile 'com.twitter:twitter-text:1.12.1' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.4' compile 'com.squareup:otto:1.3.7' compile 'dnsjava:dnsjava:2.1.7' compile 'com.commonsware.cwac:merge:1.1.1' - compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.1.3' - compile 'com.rengwuxian.materialedittext:library:2.1.3' + compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.1.4' + compile 'com.rengwuxian.materialedittext:library:2.1.4' compile 'com.pnikosis:materialish-progress:1.5' compile 'com.squareup.okhttp:okhttp:2.4.0' compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.7' compile 'com.github.johnpersano:supertoasts:1.3.4.1@aar' compile 'com.github.mariotaku:MessageBubbleView:1.2' compile 'com.github.mariotaku:DragSortListView:0.6.1' - compile 'com.github.mariotaku:SlidingMenu:1.3' compile 'com.github.uucky:ColorPicker-Android:0.9.7@aar' compile 'com.github.boxme:asyncmanager:1.0.0' compile 'com.sprylab.android.texturevideoview:texturevideoview:1.0.0' @@ -87,7 +85,7 @@ dependencies { compile 'ch.acra:acra:4.6.2' compile 'org.jraf:android-switch-backport:2.0.1' compile 'com.fasterxml.jackson.jr:jackson-jr-objects:2.3.0' - compile 'com.makeramen:roundedimageview:2.1.0' + compile 'com.makeramen:roundedimageview:2.1.1' compile 'com.soundcloud.android:android-crop:1.0.0@aar' compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.1' compile 'com.github.mariotaku:PickNCrop:44b09cbc69' diff --git a/twidere/src/fdroid/java/org/mariotaku/twidere/fragment/support/OpenStreetMapViewerFragment.java b/twidere/src/fdroid/java/org/mariotaku/twidere/fragment/support/OpenStreetMapViewerFragment.java index fea6c222a..0a3cca86d 100644 --- a/twidere/src/fdroid/java/org/mariotaku/twidere/fragment/support/OpenStreetMapViewerFragment.java +++ b/twidere/src/fdroid/java/org/mariotaku/twidere/fragment/support/OpenStreetMapViewerFragment.java @@ -98,7 +98,7 @@ public class OpenStreetMapViewerFragment extends BaseSupportFragment implements @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { - case MENU_CENTER: { + case R.id.center: { moveToCenter(mLatitude, mLongitude); break; } diff --git a/twidere/src/google/java/org/mariotaku/twidere/fragment/support/GoogleMapFragment.java b/twidere/src/google/java/org/mariotaku/twidere/fragment/support/GoogleMapFragment.java index 97347e4ea..471dfebae 100644 --- a/twidere/src/google/java/org/mariotaku/twidere/fragment/support/GoogleMapFragment.java +++ b/twidere/src/google/java/org/mariotaku/twidere/fragment/support/GoogleMapFragment.java @@ -74,7 +74,7 @@ public class GoogleMapFragment extends SupportMapFragment implements Constants, @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { - case MENU_CENTER: { + case R.id.center: { center(); break; } diff --git a/twidere/src/google/java/org/mariotaku/twidere/fragment/support/WebMapFragment.java b/twidere/src/google/java/org/mariotaku/twidere/fragment/support/WebMapFragment.java index 0aa73e92c..25b6256c4 100644 --- a/twidere/src/google/java/org/mariotaku/twidere/fragment/support/WebMapFragment.java +++ b/twidere/src/google/java/org/mariotaku/twidere/fragment/support/WebMapFragment.java @@ -50,7 +50,7 @@ public class WebMapFragment extends BaseSupportWebViewFragment implements IMapFr @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { - case MENU_CENTER: { + case R.id.center: { center(); break; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/Constants.java b/twidere/src/main/java/org/mariotaku/twidere/Constants.java index d3f396a43..1924dd7d5 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/Constants.java +++ b/twidere/src/main/java/org/mariotaku/twidere/Constants.java @@ -42,82 +42,6 @@ public interface Constants extends TwidereConstants { int MENU_GROUP_USER_LIST_EXTENSION = 14; int MENU_GROUP_STATUS_SHARE = 20; - int MENU_HOME = android.R.id.home; - int MENU_SEARCH = R.id.search; - int MENU_ACTIONS = R.id.actions; - int MENU_COMPOSE = R.id.compose; - int MENU_SEND = R.id.send; - int MENU_EDIT = R.id.edit; - int MENU_INFO = R.id.info; - int MENU_SELECT_ACCOUNT = R.id.select_account; - int MENU_SETTINGS = R.id.settings; - int MENU_ADD_LOCATION = R.id.add_location; - int MENU_TAKE_PHOTO = R.id.take_photo; - int MENU_ADD_IMAGE = R.id.add_image; - int MENU_LOCATION = R.id.location; - int MENU_IMAGE = R.id.image; - int MENU_VIEW = R.id.view; - int MENU_VIEW_PROFILE = R.id.view_profile; - int MENU_DELETE = R.id.delete; - int MENU_DELETE_SUBMENU = R.id.delete_submenu; - int MENU_TOGGLE = R.id.toggle; - int MENU_ADD = R.id.add; - int MENU_PICK_FROM_GALLERY = R.id.pick_from_gallery; - int MENU_PICK_FROM_MAP = R.id.pick_from_map; - int MENU_EDIT_API = R.id.edit_api; - int MENU_OPEN_IN_BROWSER = R.id.open_in_browser; - int MENU_SET_COLOR = R.id.set_color; - int MENU_ADD_ACCOUNT = R.id.add_account; - int MENU_REPLY = R.id.reply; - int MENU_FAVORITE = R.id.favorite; - int MENU_RETWEET = R.id.retweet; - int MENU_QUOTE = R.id.quote; - int MENU_SHARE = R.id.share; - int MENU_DRAFTS = R.id.drafts; - int MENU_DELETE_ALL = R.id.delete_all; - int MENU_SET_AS_DEFAULT = R.id.set_as_default; - int MENU_SAVE = R.id.save; - int MENU_CANCEL = R.id.cancel; - int MENU_BLOCK = R.id.block; - int MENU_REPORT_SPAM = R.id.report_spam; - int MENU_MUTE_SOURCE = R.id.mute_source; - int MENU_MUTE_USER = R.id.mute_user; - int MENU_REFRESH = R.id.refresh; - int MENU_MENTION = R.id.mention; - int MENU_SEND_DIRECT_MESSAGE = R.id.send_direct_message; - int MENU_VIEW_USER_LIST = R.id.view_user_list; - int MENU_UP = R.id.up; - int MENU_DOWN = R.id.down; - int MENU_COPY = R.id.copy; - int MENU_TOGGLE_SENSITIVE = R.id.toggle_sensitive; - int MENU_REVOKE = R.id.revoke; - int MENU_ADD_TO_LIST = R.id.add_to_list; - int MENU_DELETE_FROM_LIST = R.id.delete_from_list; - int MENU_STATUSES = R.id.statuses; - int MENU_FAVORITES = R.id.favorites; - int MENU_LISTS = R.id.lists; - int MENU_LIST_MEMBERSHIPS = R.id.list_memberships; - int MENU_CENTER = R.id.center; - int MENU_FILTERS = R.id.filters; - int MENU_SET_NICKNAME = R.id.set_nickname; - int MENU_CLEAR_NICKNAME = R.id.clear_nickname; - int MENU_ADD_TO_FILTER = R.id.add_to_filter; - int MENU_FOLLOW = R.id.follow; - int MENU_UNFOLLOW = R.id.unfollow; - int MENU_BACK = R.id.back; - int MENU_TRANSLATE = R.id.translate; - int MENU_ACCEPT = R.id.accept; - int MENU_DENY = R.id.deny; - int MENU_IMPORT_SETTINGS = R.id.import_settings; - int MENU_EXPORT_SETTINGS = R.id.export_settings; - int MENU_PROGRESS = R.id.progress; - int MENU_OPEN_WITH_ACCOUNT = R.id.open_with_account; - int MENU_ACCOUNTS = R.id.accounts; - int MENU_INVERSE_SELECTION = R.id.inverse_selection; - int MENU_EDIT_MEDIA = R.id.edit_media; - int MENU_RESET = R.id.reset; - int MENU_ENABLE_RETWEETS = R.id.enable_retweets; - int LINK_ID_STATUS = 1; int LINK_ID_USER = 2; int LINK_ID_USER_TIMELINE = 3; @@ -144,6 +68,7 @@ public interface Constants extends TwidereConstants { int LINK_ID_SEARCH = 28; int LINK_ID_MUTES_USERS = 41; int LINK_ID_MAP = 51; + int LINK_ID_SCHEDULED_STATUSES = 61; int LINK_ID_ACCOUNTS = 101; int LINK_ID_DRAFTS = 102; int LINK_ID_FILTERS = 103; 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 2deb61d2b..1dd44ba4c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsActivity.java @@ -198,12 +198,12 @@ public class SettingsActivity extends BasePreferenceActivity { @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { - case MENU_IMPORT_SETTINGS: { + case R.id.import_settings: { final Intent intent = new Intent(this, DataImportActivity.class); startActivity(intent); return true; } - case MENU_EXPORT_SETTINGS: { + case R.id.export_settings: { final Intent intent = new Intent(this, DataExportActivity.class); startActivity(intent); return true; 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 e82e6e970..9199d1e3d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java @@ -14,7 +14,7 @@ import android.text.TextUtils; import org.apache.commons.lang3.ArrayUtils; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.activity.support.ComposeActivity; -import org.mariotaku.twidere.util.ErrorLogger; +import org.mariotaku.twidere.util.AbsLogger; import org.mariotaku.twidere.util.Utils; import java.util.List; @@ -112,7 +112,7 @@ public class TwitterLinkHandlerActivity extends Activity implements Constants { if (handledIntent != null) { startActivity(handledIntent); } else { - ErrorLogger.exception(new TwitterLinkException("Unable to handle twitter uri " + uri)); + AbsLogger.error(new TwitterLinkException("Unable to handle twitter uri " + uri)); final String packageName = mPreferences.getString(KEY_FALLBACK_TWITTER_LINK_HANDLER, null); final Intent fallbackIntent = new Intent(Intent.ACTION_VIEW, uri); fallbackIntent.setPackage(packageName); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java index fcd672524..d7e8a2703 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java @@ -28,6 +28,7 @@ import android.view.KeyEvent; import android.view.MenuItem; import org.mariotaku.twidere.Constants; +import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.iface.IControlBarActivity; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback; @@ -110,7 +111,7 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { - case MENU_BACK: { + case R.id.back: { onBackPressed(); return true; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BrowserSignInActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BrowserSignInActivity.java index ab18a63a8..62c1ae4ed 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BrowserSignInActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BrowserSignInActivity.java @@ -90,7 +90,7 @@ public class BrowserSignInActivity extends BaseSupportDialogActivity { @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { - case MENU_HOME: { + case android.R.id.home: { finish(); return true; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java index 77a1ed47e..b7a32f4fd 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java @@ -95,8 +95,10 @@ import org.mariotaku.twidere.constant.SharedPreferenceConstants; import org.mariotaku.twidere.fragment.support.BaseSupportDialogFragment; import org.mariotaku.twidere.fragment.support.SupportProgressDialogFragment; import org.mariotaku.twidere.fragment.support.ViewStatusDialogFragment; +import org.mariotaku.twidere.model.ConsumerKeyType; import org.mariotaku.twidere.model.DraftItem; import org.mariotaku.twidere.model.ParcelableAccount; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableLocation; import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMediaUpdate; @@ -120,6 +122,7 @@ import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.TwidereArrayUtils; import org.mariotaku.twidere.util.TwidereValidator; +import org.mariotaku.twidere.util.TwitterContentUtils; import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.view.ActionIconView; @@ -398,36 +401,36 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL @Override public boolean onMenuItemClick(final MenuItem item) { switch (item.getItemId()) { - case MENU_TAKE_PHOTO: + case R.id.take_photo: case R.id.take_photo_sub_item: { takePhoto(); break; } - case MENU_ADD_IMAGE: + case R.id.add_image: case R.id.add_image_sub_item: { pickImage(); break; } - case MENU_ADD_LOCATION: { + case R.id.add_location: { toggleLocation(); break; } - case MENU_DRAFTS: { + case R.id.drafts: { Utils.openDrafts(this); break; } - case MENU_DELETE: { + case R.id.delete: { AsyncTaskUtils.executeTask(new DeleteImageTask(this)); break; } - case MENU_TOGGLE_SENSITIVE: { + case R.id.toggle_sensitive: { if (!hasMedia()) return false; mIsPossiblySensitive = !mIsPossiblySensitive; setMenu(); updateTextCount(); break; } - case MENU_VIEW: { + case R.id.view: { if (mInReplyToStatus == null) return false; final DialogFragment fragment = new ViewStatusDialogFragment(); final Bundle args = new Bundle(); @@ -644,7 +647,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL }); mAccountsAdapter = new AccountIconsAdapter(this); mAccountSelector.setAdapter(mAccountsAdapter); - mAccountsAdapter.setAccounts(ParcelableAccount.getAccounts(this, false, false)); + mAccountsAdapter.setAccounts(ParcelableCredentials.getCredentialsArray(this, false, false)); mMediaPreviewAdapter = new MediaPreviewAdapter(this); mMediaPreviewGrid.setAdapter(mMediaPreviewAdapter); @@ -1009,6 +1012,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL final ParcelableAccount[] accounts = mAccountsAdapter.getSelectedAccounts(); setSelectedAccounts(accounts); mEditText.setAccountId(accounts.length > 0 ? accounts[0].account_id : Utils.getDefaultAccountId(this)); + setMenu(); // mAccountActionProvider.setSelectedAccounts(mAccountsAdapter.getSelectedAccounts()); } @@ -1071,23 +1075,34 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL * Has media & Not reply: [Take photo][Media menu][Attach location][Drafts] * Is reply: [Media menu][View status][Attach location][Drafts] */ - MenuUtils.setMenuItemAvailability(menu, MENU_TAKE_PHOTO, !hasInReplyTo); + MenuUtils.setMenuItemAvailability(menu, R.id.take_photo, !hasInReplyTo); MenuUtils.setMenuItemAvailability(menu, R.id.take_photo_sub_item, hasInReplyTo); - MenuUtils.setMenuItemAvailability(menu, MENU_ADD_IMAGE, !hasMedia && !hasInReplyTo); - MenuUtils.setMenuItemAvailability(menu, MENU_VIEW, hasInReplyTo); + MenuUtils.setMenuItemAvailability(menu, R.id.add_image, !hasMedia && !hasInReplyTo); + MenuUtils.setMenuItemAvailability(menu, R.id.view, hasInReplyTo); MenuUtils.setMenuItemAvailability(menu, R.id.media_menu, hasMedia || hasInReplyTo); - MenuUtils.setMenuItemAvailability(menu, MENU_TOGGLE_SENSITIVE, hasMedia); - MenuUtils.setMenuItemAvailability(menu, MENU_EDIT_MEDIA, hasMedia); + MenuUtils.setMenuItemAvailability(menu, R.id.toggle_sensitive, hasMedia); + MenuUtils.setMenuItemAvailability(menu, R.id.edit_media, hasMedia); MenuUtils.setMenuItemAvailability(menu, R.id.link_to_quoted_status, isQuote()); + MenuUtils.setMenuItemAvailability(menu, R.id.schedule, isScheduleSupported()); menu.setGroupEnabled(MENU_GROUP_IMAGE_EXTENSION, hasMedia); menu.setGroupVisible(MENU_GROUP_IMAGE_EXTENSION, hasMedia); - MenuUtils.setMenuItemChecked(menu, MENU_TOGGLE_SENSITIVE, hasMedia && mIsPossiblySensitive); + MenuUtils.setMenuItemChecked(menu, R.id.toggle_sensitive, hasMedia && mIsPossiblySensitive); MenuUtils.setMenuItemChecked(menu, R.id.link_to_quoted_status, mPreferences.getBoolean(KEY_LINK_TO_QUOTED_TWEET)); ThemeUtils.resetCheatSheet(mMenuBar); // mMenuBar.show(); } + private boolean isScheduleSupported() { + for (ParcelableCredentials account : mAccountsAdapter.getSelectedAccounts()) { + if (TwitterContentUtils.getOfficialKeyType(this, account.consumer_key, account.consumer_secret) + != ConsumerKeyType.TWEETDECK) { + return false; + } + } + return true; + } + private void setProgressVisible(final boolean visible) { mSetProgressVisibleRunnable = new SetProgressVisibleRunnable(this, visible); if (mFragmentResumed) { @@ -1233,18 +1248,6 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL return; } final boolean attachLocation = mPreferences.getBoolean(KEY_ATTACH_LOCATION, false); -// if (mRecentLocation == null && attachLocation) { -// final Location location; -// if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { -// location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); -// } else { -// location = null; -// } -// if (location != null) { -// mRecentLocation = new ParcelableLocation(location); -// } -// setRecentLocation(); -// } final long[] accountIds = mAccountsAdapter.getSelectedAccountIds(); final boolean isQuote = isQuote(); final ParcelableLocation statusLocation = attachLocation ? mRecentLocation : null; @@ -1323,7 +1326,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL private final LongSparseArray mSelection; private final boolean mNameFirst; - private ParcelableAccount[] mAccounts; + private ParcelableCredentials[] mAccounts; public AccountIconsAdapter(ComposeActivity activity) { setHasStableIds(true); @@ -1367,16 +1370,16 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL } @NonNull - public ParcelableAccount[] getSelectedAccounts() { - if (mAccounts == null) return new ParcelableAccount[0]; - final ParcelableAccount[] temp = new ParcelableAccount[mAccounts.length]; + public ParcelableCredentials[] getSelectedAccounts() { + if (mAccounts == null) return new ParcelableCredentials[0]; + final ParcelableCredentials[] temp = new ParcelableCredentials[mAccounts.length]; int selectedCount = 0; - for (ParcelableAccount account : mAccounts) { + for (ParcelableCredentials account : mAccounts) { if (mSelection.get(account.account_id, false)) { temp[selectedCount++] = account; } } - final ParcelableAccount[] result = new ParcelableAccount[selectedCount]; + final ParcelableCredentials[] result = new ParcelableCredentials[selectedCount]; System.arraycopy(temp, 0, result, 0, result.length); return result; } @@ -1403,7 +1406,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL return mAccounts != null ? mAccounts.length : 0; } - public void setAccounts(ParcelableAccount[] accounts) { + public void setAccounts(ParcelableCredentials[] accounts) { mAccounts = accounts; notifyDataSetChanged(); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java index 014b95fd6..10709cda6 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java @@ -27,9 +27,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.content.res.Resources; import android.database.ContentObserver; -import android.graphics.Canvas; import android.graphics.PorterDuff.Mode; import android.graphics.Rect; import android.net.Uri; @@ -41,9 +39,11 @@ import android.support.annotation.NonNull; 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; import android.support.v4.view.ViewPager.OnPageChangeListener; +import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ThemedAppCompatDelegateFactory; import android.support.v7.widget.Toolbar; import android.view.Gravity; @@ -60,10 +60,6 @@ import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; import android.widget.Toast; -import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; -import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.CanvasTransformer; -import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.OnClosedListener; -import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.OnOpenedListener; import com.meizu.flyme.reflect.StatusBarProxy; import com.squareup.otto.Bus; import com.squareup.otto.Subscribe; @@ -107,8 +103,6 @@ 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.ExtendedViewPager; -import org.mariotaku.twidere.view.HomeSlidingMenu; -import org.mariotaku.twidere.view.LeftDrawerFrameLayout; import org.mariotaku.twidere.view.TabPagerIndicator; import org.mariotaku.twidere.view.TintedStatusFrameLayout; import org.mariotaku.twidere.view.iface.IHomeActionButton; @@ -132,7 +126,7 @@ import static org.mariotaku.twidere.util.Utils.openSearch; import static org.mariotaku.twidere.util.Utils.showMenuItemToast; public class HomeActivity extends BaseAppCompatActivity implements OnClickListener, OnPageChangeListener, - SupportFragmentCallback, OnOpenedListener, OnClosedListener, OnLongClickListener { + SupportFragmentCallback, OnLongClickListener { private final Handler mHandler = new Handler(); @@ -153,11 +147,11 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen private ExtendedViewPager mViewPager; private TabPagerIndicator mTabIndicator; - private HomeSlidingMenu mSlidingMenu; + private DrawerLayout mDrawerLayout; private View mEmptyTabHint; private View mActionsButton; private View mActionBarWithOverlay; - private LeftDrawerFrameLayout mLeftDrawerContainer; + private FrameLayout mLeftDrawerContainer; private TintedStatusFrameLayout mColorStatusFrameLayout; private UpdateUnreadCountTask mUpdateUnreadCountTask; @@ -175,8 +169,8 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen private View mActionBarContainer; public void closeAccountsDrawer() { - if (mSlidingMenu == null) return; - mSlidingMenu.showContent(); +// if (mSlidingMenu == null) return; +// mSlidingMenu.showContent(); } public long[] getActivatedAccountIds() { @@ -206,10 +200,14 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen return getSupportFragmentManager().findFragmentById(R.id.left_drawer); } + public boolean getDefaultSystemWindowsInsets(Rect insets) { + return super.getSystemWindowsInsets(insets); + } + @Override public boolean getSystemWindowsInsets(Rect insets) { final int height = mTabIndicator != null ? mTabIndicator.getHeight() : 0; - insets.top = height != 0 ? height : ThemeUtils.getActionBarHeight(this); + insets.top = (height != 0 ? height : ThemeUtils.getActionBarHeight(this)); return true; } @@ -221,24 +219,24 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { - case MENU_HOME: { + case android.R.id.home: { final FragmentManager fm = getSupportFragmentManager(); final int count = fm.getBackStackEntryCount(); - if (mSlidingMenu.isMenuShowing()) { - mSlidingMenu.showContent(); - return true; - } else if (count == 0) { - mSlidingMenu.showMenu(); - return true; - } +// if (mSlidingMenu.isMenuShowing()) { +// mSlidingMenu.showContent(); +// return true; +// } else if (count == 0) { +// mSlidingMenu.showMenu(); +// return true; +// } return true; } - case MENU_SEARCH: { + case R.id.search: { openSearchView(mSelectedAccountToSearch); return true; } - case MENU_ACTIONS: { + case R.id.actions: { triggerActionsClick(); return true; } @@ -253,12 +251,12 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen if (action != null) { switch (action) { case ACTION_HOME_ACCOUNTS_DASHBOARD: { - if (mSlidingMenu.isMenuShowing()) { - mSlidingMenu.showContent(true); - } else { - mSlidingMenu.showMenu(true); - setControlBarVisibleAnimate(true); - } +// if (mSlidingMenu.isMenuShowing()) { +// mSlidingMenu.showContent(true); +// } else { +// mSlidingMenu.showMenu(true); +// setControlBarVisibleAnimate(true); +// } return true; } } @@ -267,33 +265,33 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen if (action != null) { switch (action) { case ACTION_NAVIGATION_PREVIOUS_TAB: { - final int previous = mViewPager.getCurrentItem() - 1; - final int mode = mSlidingMenu.getMode(); - if (previous < 0 && (mode == SlidingMenu.LEFT || mode == SlidingMenu.LEFT_RIGHT)) { - mSlidingMenu.showMenu(true); - setControlBarVisibleAnimate(true); - } else if (previous < mPagerAdapter.getCount()) { - if (mSlidingMenu.isSecondaryMenuShowing()) { - mSlidingMenu.showContent(true); - } else { - mViewPager.setCurrentItem(previous, true); - } - } +// final int previous = mViewPager.getCurrentItem() - 1; +// final int mode = mSlidingMenu.getMode(); +// if (previous < 0 && (mode == SlidingMenu.LEFT || mode == SlidingMenu.LEFT_RIGHT)) { +// mSlidingMenu.showMenu(true); +// setControlBarVisibleAnimate(true); +// } else if (previous < mPagerAdapter.getCount()) { +// if (mSlidingMenu.isSecondaryMenuShowing()) { +// mSlidingMenu.showContent(true); +// } else { +// mViewPager.setCurrentItem(previous, true); +// } +// } return true; } case ACTION_NAVIGATION_NEXT_TAB: { - final int next = mViewPager.getCurrentItem() + 1; - final int mode = mSlidingMenu.getMode(); - if (next >= mPagerAdapter.getCount() && (mode == SlidingMenu.RIGHT || mode == SlidingMenu.LEFT_RIGHT)) { - mSlidingMenu.showSecondaryMenu(true); - setControlBarVisibleAnimate(true); - } else if (next >= 0) { - if (mSlidingMenu.isMenuShowing()) { - mSlidingMenu.showContent(true); - } else { - mViewPager.setCurrentItem(next, true); - } - } +// final int next = mViewPager.getCurrentItem() + 1; +// final int mode = mSlidingMenu.getMode(); +// if (next >= mPagerAdapter.getCount() && (mode == SlidingMenu.RIGHT || mode == SlidingMenu.LEFT_RIGHT)) { +// mSlidingMenu.showSecondaryMenu(true); +// setControlBarVisibleAnimate(true); +// } else if (next >= 0) { +// if (mSlidingMenu.isMenuShowing()) { +// mSlidingMenu.showContent(true); +// } else { +// mViewPager.setCurrentItem(next, true); +// } +// } return true; } } @@ -405,10 +403,10 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen // Steal MENU key event switch (keyCode) { case KeyEvent.KEYCODE_MENU: { - if (mSlidingMenu != null) { - mSlidingMenu.toggle(true); - return true; - } +// if (mSlidingMenu != null) { +// mSlidingMenu.toggle(true); +// return true; +// } break; } } @@ -524,11 +522,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen } } - @Override - public void onClosed() { - updateDrawerPercentOpen(0, true); - } - @Override public boolean onLongClick(final View v) { switch (v.getId()) { @@ -540,19 +533,15 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen return false; } - @Override - public void onOpened() { - updateDrawerPercentOpen(1, true); - } - @Override public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) { } @Override public void onPageSelected(final int position) { - if (mSlidingMenu.isMenuShowing()) { - mSlidingMenu.showContent(); + //TODO handle secondary drawer + if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { + mDrawerLayout.closeDrawers(); } updateSlidingMenuTouchMode(); updateActionsButton(); @@ -566,11 +555,11 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen @Override public void onWindowFocusChanged(final boolean hasFocus) { super.onWindowFocusChanged(hasFocus); - if (mSlidingMenu != null && mSlidingMenu.isMenuShowing()) { - updateDrawerPercentOpen(1, false); - } else { - updateDrawerPercentOpen(0, false); - } +// if (mSlidingMenu != null && mSlidingMenu.isMenuShowing()) { +// updateDrawerPercentOpen(1, false); +// } else { +// updateDrawerPercentOpen(0, false); +// } } @Override @@ -584,10 +573,12 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen onSearchRequested(); } - public void setSystemWindowInsets(Rect insets) { + @Override + public void onFitSystemWindows(Rect insets) { + super.onFitSystemWindows(insets); final Fragment fragment = getLeftDrawerFragment(); if (fragment instanceof AccountsDashboardFragment) { - ((AccountsDashboardFragment) fragment).setStatusBarHeight(insets.top); + ((AccountsDashboardFragment) fragment).requestFitSystemWindows(); } mColorStatusFrameLayout.setStatusBarHeight(insets.top); } @@ -633,8 +624,9 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen @Override public void onBackPressed() { - if (mSlidingMenu != null && mSlidingMenu.isMenuShowing()) { - mSlidingMenu.showContent(); + //TODO handle secondary drawer + if (mDrawerLayout != null && mDrawerLayout.isDrawerOpen(GravityCompat.START)) { + mDrawerLayout.closeDrawers(); return; } super.onBackPressed(); @@ -662,7 +654,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen mActionBar = (Toolbar) findViewById(R.id.action_bar); mActionBarContainer = findViewById(R.id.twidere_action_bar_container); mTabIndicator = (TabPagerIndicator) findViewById(R.id.main_tabs); - mSlidingMenu = (HomeSlidingMenu) findViewById(R.id.home_menu); + 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); @@ -672,9 +664,9 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen } private Fragment getKeyboardShortcutRecipient() { - if (mSlidingMenu.isMenuShowing()) { + if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { return getLeftDrawerFragment(); - } else if (mSlidingMenu.isSecondaryMenuShowing()) { + } else if (mDrawerLayout.isDrawerOpen(GravityCompat.END)) { return null; } else { return getCurrentVisibleFragment(); @@ -774,8 +766,8 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen } private void openAccountsDrawer() { - if (mSlidingMenu == null) return; - mSlidingMenu.showMenu(); + if (mDrawerLayout == null) return; + mDrawerLayout.openDrawer(GravityCompat.START); } private boolean openSettingsWizard() { @@ -844,35 +836,35 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen } private void setupSlidingMenu() { - if (mSlidingMenu == null) return; - final Resources res = getResources(); - final int marginThreshold = res.getDimensionPixelSize(R.dimen.default_sliding_menu_margin_threshold); - final boolean relativeBehindWidth = res.getBoolean(R.bool.relative_behind_width); - mSlidingMenu.setMode(SlidingMenu.LEFT); - mSlidingMenu.setShadowWidthRes(R.dimen.default_sliding_menu_shadow_width); - mSlidingMenu.setShadowDrawable(R.drawable.shadow_left); - mSlidingMenu.setSecondaryShadowDrawable(R.drawable.shadow_right); - if (relativeBehindWidth) { - mSlidingMenu.setBehindOffsetRes(R.dimen.drawer_offset_home); - } else { - mSlidingMenu.setBehindWidthRes(R.dimen.drawer_width_home); - } - mSlidingMenu.setTouchmodeMarginThreshold(marginThreshold); - mSlidingMenu.setFadeDegree(0.5f); - mSlidingMenu.setMenu(R.layout.drawer_home_accounts); - mSlidingMenu.setOnOpenedListener(this); - mSlidingMenu.setOnClosedListener(this); - mLeftDrawerContainer = (LeftDrawerFrameLayout) mSlidingMenu.getMenu().findViewById(R.id.left_drawer_container); - final boolean isTransparentBackground = ThemeUtils.isTransparentBackground(getCurrentThemeBackgroundOption()); - mLeftDrawerContainer.setClipEnabled(isTransparentBackground); - mLeftDrawerContainer.setScrollScale(mSlidingMenu.getBehindScrollScale()); - mSlidingMenu.setBehindCanvasTransformer(new ListenerCanvasTransformer(this)); - final Window window = getWindow(); - ThemeUtils.applyWindowBackground(this, mSlidingMenu.getContent(), getCurrentThemeResourceId(), - getThemeBackgroundOption(), getCurrentThemeBackgroundAlpha()); - window.setBackgroundDrawable(new EmptyDrawable()); - - mSlidingMenu.addIgnoredView(mActionBarContainer); +// if (mSlidingMenu == null) return; +// final Resources res = getResources(); +// final int marginThreshold = res.getDimensionPixelSize(R.dimen.default_sliding_menu_margin_threshold); +// final boolean relativeBehindWidth = res.getBoolean(R.bool.relative_behind_width); +// mSlidingMenu.setMode(SlidingMenu.LEFT); +// mSlidingMenu.setShadowWidthRes(R.dimen.default_sliding_menu_shadow_width); + mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow_left, GravityCompat.START); +// mSlidingMenu.setSecondaryShadowDrawable(R.drawable.shadow_right); +// if (relativeBehindWidth) { +// mSlidingMenu.setBehindOffsetRes(R.dimen.drawer_offset_home); +// } else { +// mSlidingMenu.setBehindWidthRes(R.dimen.drawer_width_home); +// } +// mSlidingMenu.setTouchmodeMarginThreshold(marginThreshold); +// mSlidingMenu.setFadeDegree(0.5f); +// mSlidingMenu.setMenu(R.layout.drawer_home_accounts); +// mSlidingMenu.setOnOpenedListener(this); +// mSlidingMenu.setOnClosedListener(this); +// mLeftDrawerContainer = (LeftDrawerFrameLayout) mSlidingMenu.getMenu().findViewById(R.id.left_drawer_container); +// final boolean isTransparentBackground = ThemeUtils.isTransparentBackground(getCurrentThemeBackgroundOption()); +// mLeftDrawerContainer.setClipEnabled(isTransparentBackground); +// mLeftDrawerContainer.setScrollScale(mSlidingMenu.getBehindScrollScale()); +// mSlidingMenu.setBehindCanvasTransformer(new ListenerCanvasTransformer(this)); +// final Window window = getWindow(); +// ThemeUtils.applyWindowBackground(this, mSlidingMenu.getContent(), getCurrentThemeResourceId(), +// getThemeBackgroundOption(), getCurrentThemeBackgroundAlpha()); +// window.setBackgroundDrawable(new EmptyDrawable()); +// +// mSlidingMenu.addIgnoredView(mActionBarContainer); } private void showDataProfilingRequest() { @@ -943,19 +935,14 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen mActionsButton.setLayoutParams(lp); } - private void updateDrawerPercentOpen(final float percentOpen, final boolean horizontalScroll) { - if (mLeftDrawerContainer == null) return; - mLeftDrawerContainer.setPercentOpen(percentOpen); - } - private void updateSlidingMenuTouchMode() { - if (mViewPager == null || mSlidingMenu == null) return; - final int position = mViewPager.getCurrentItem(); - final boolean pagingEnabled = mViewPager.isEnabled(); - final boolean atFirstOrLast = position == 0 || position == mPagerAdapter.getCount() - 1; - final int mode = !pagingEnabled || atFirstOrLast ? SlidingMenu.TOUCHMODE_FULLSCREEN - : SlidingMenu.TOUCHMODE_MARGIN; - mSlidingMenu.setTouchModeAbove(mode); +// if (mViewPager == null || mSlidingMenu == null) return; +// final int position = mViewPager.getCurrentItem(); +// final boolean pagingEnabled = mViewPager.isEnabled(); +// final boolean atFirstOrLast = position == 0 || position == mPagerAdapter.getCount() - 1; +// final int mode = !pagingEnabled || atFirstOrLast ? SlidingMenu.TOUCHMODE_FULLSCREEN +// : SlidingMenu.TOUCHMODE_MARGIN; +// mSlidingMenu.setTouchModeAbove(mode); } private static final class AccountChangeObserver extends ContentObserver { @@ -978,20 +965,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen } } - private static class ListenerCanvasTransformer implements CanvasTransformer { - private final HomeActivity mHomeActivity; - - public ListenerCanvasTransformer(final HomeActivity homeActivity) { - mHomeActivity = homeActivity; - } - - @Override - public void transformCanvas(final Canvas canvas, final float percentOpen) { - mHomeActivity.updateDrawerPercentOpen(percentOpen, true); - } - - } - private static class UpdateUnreadCountTask extends AsyncTask> { private final Context mContext; private final ReadStateManager mReadStateManager; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java index a301d7590..810760214 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java @@ -153,7 +153,7 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { - case MENU_HOME: { + case android.R.id.home: { if (mFinishOnly) { finish(); } else { @@ -521,6 +521,10 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System setTitle(R.string.edit_profile); break; } + case LINK_ID_SCHEDULED_STATUSES: { + setTitle(getString(R.string.scheduled_statuses)); + break; + } default: { setTitle(getString(R.string.app_name)); break; diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java index 53951de97..526cd0741 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java @@ -426,11 +426,11 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements if (callback.first.isDetached() || callback.first.getActivity() == null) return; final Menu menu = callback.second; final boolean hasImage = result.first; - MenuUtils.setMenuItemAvailability(menu, MENU_REFRESH, !hasImage && !isLoading); - MenuUtils.setMenuItemAvailability(menu, MENU_SHARE, hasImage && !isLoading); - MenuUtils.setMenuItemAvailability(menu, MENU_SAVE, hasImage && !isLoading); + MenuUtils.setMenuItemAvailability(menu, R.id.refresh, !hasImage && !isLoading); + MenuUtils.setMenuItemAvailability(menu, R.id.share, hasImage && !isLoading); + MenuUtils.setMenuItemAvailability(menu, R.id.save, hasImage && !isLoading); if (!hasImage) return; - final MenuItem shareItem = menu.findItem(MENU_SHARE); + final MenuItem shareItem = menu.findItem(R.id.share); shareItem.setIntent(Intent.createChooser(result.second, callback.first.getString(R.string.share))); } }; @@ -449,15 +449,15 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - case MENU_OPEN_IN_BROWSER: { + case R.id.open_in_browser: { openInBrowser(); return true; } - case MENU_SAVE: { + case R.id.save: { saveToGallery(); return true; } - case MENU_REFRESH: { + case R.id.refresh: { loadImage(); return true; } @@ -885,11 +885,11 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements final Pair linkAndType = mVideoUrlAndType; final boolean isLoading = linkAndType != null && mVideoLoader.isLoading(linkAndType.first); final boolean hasVideo = file != null && file.exists() && linkAndType != null; - MenuUtils.setMenuItemAvailability(menu, MENU_REFRESH, !hasVideo && !isLoading); - MenuUtils.setMenuItemAvailability(menu, MENU_SHARE, hasVideo && !isLoading); - MenuUtils.setMenuItemAvailability(menu, MENU_SAVE, hasVideo && !isLoading); + MenuUtils.setMenuItemAvailability(menu, R.id.refresh, !hasVideo && !isLoading); + MenuUtils.setMenuItemAvailability(menu, R.id.share, hasVideo && !isLoading); + MenuUtils.setMenuItemAvailability(menu, R.id.save, hasVideo && !isLoading); if (!hasVideo) return; - final MenuItem shareItem = menu.findItem(MENU_SHARE); + final MenuItem shareItem = menu.findItem(R.id.share); final Intent intent = new Intent(Intent.ACTION_SEND); final Uri fileUri = Uri.fromFile(file); intent.setDataAndType(fileUri, linkAndType.second); @@ -913,11 +913,11 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - case MENU_SAVE: { + case R.id.save: { saveToGallery(); return true; } - case MENU_REFRESH: { + case R.id.refresh: { loadVideo(); return true; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java index fe797758a..324bfd26c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java @@ -62,6 +62,7 @@ import com.meizu.flyme.reflect.StatusBarProxy; import org.mariotaku.restfu.http.Authorization; import org.mariotaku.restfu.http.Endpoint; +import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.SettingsActivity; import org.mariotaku.twidere.api.twitter.Twitter; @@ -78,9 +79,9 @@ import org.mariotaku.twidere.fragment.support.SupportProgressDialogFragment; import org.mariotaku.twidere.graphic.EmptyDrawable; import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; +import org.mariotaku.twidere.util.AbsLogger; import org.mariotaku.twidere.util.AsyncTaskUtils; import org.mariotaku.twidere.util.ContentValuesCreator; -import org.mariotaku.twidere.util.ErrorLogger; import org.mariotaku.twidere.util.OAuthPasswordAuthenticator; import org.mariotaku.twidere.util.OAuthPasswordAuthenticator.AuthenticationException; import org.mariotaku.twidere.util.OAuthPasswordAuthenticator.AuthenticityTokenException; @@ -219,21 +220,21 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { - case MENU_HOME: { + case android.R.id.home: { final long[] account_ids = getActivatedAccountIds(this); if (account_ids.length > 0) { onBackPressed(); } break; } - case MENU_SETTINGS: { + case R.id.settings: { if (mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING) return false; final Intent intent = new Intent(this, SettingsActivity.class); startActivity(intent); break; } - case MENU_EDIT_API: { + case R.id.edit_api: { if (mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING) return false; setDefaultAPI(); @@ -247,7 +248,7 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList startActivityForResult(intent, REQUEST_EDIT_API); break; } - case MENU_OPEN_IN_BROWSER: { + case R.id.open_in_browser: { if (mAuthType != ParcelableCredentials.AUTH_TYPE_OAUTH || mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING) return false; saveEditedText(); @@ -263,7 +264,7 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList @Override public boolean onPrepareOptionsMenu(final Menu menu) { - final MenuItem itemBrowser = menu.findItem(MENU_OPEN_IN_BROWSER); + final MenuItem itemBrowser = menu.findItem(R.id.open_in_browser); if (itemBrowser != null) { final boolean is_oauth = mAuthType == ParcelableCredentials.AUTH_TYPE_OAUTH; itemBrowser.setVisible(is_oauth); @@ -440,18 +441,26 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList ((DialogFragment) f).dismiss(); } if (result != null) { - if (result.succeed) { - insertAccount(result); + if (result.alreadyLoggedIn) { + final ContentValues values = result.toContentValues(); + if (values != null) { + mResolver.update(Accounts.CONTENT_URI, values, Expression.equals(Accounts.ACCOUNT_ID, + result.user.getId()).getSQL(), null); + } + Toast.makeText(this, R.string.error_already_logged_in, Toast.LENGTH_SHORT).show(); + } else if (result.succeed) { + final ContentValues values = result.toContentValues(); + if (values != null) { + mResolver.insert(Accounts.CONTENT_URI, values); + } final long loggedId = result.user.getId(); final Intent intent = new Intent(this, HomeActivity.class); intent.putExtra(EXTRA_REFRESH_IDS, new long[]{loggedId}); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent); finish(); - } else if (result.alreadyLoggedIn) { - Toast.makeText(this, R.string.error_already_logged_in, Toast.LENGTH_SHORT).show(); } else { - ErrorLogger.exception(result.exception); + AbsLogger.error(result.exception); if (result.exception instanceof AuthenticityTokenException) { Toast.makeText(this, R.string.wrong_api_key, Toast.LENGTH_SHORT).show(); } else if (result.exception instanceof WrongUserPassException) { @@ -466,35 +475,6 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList setSignInButton(); } - private void insertAccount(final SignInResponse result) { - final ContentValues values; - switch (result.authType) { - case ParcelableCredentials.AUTH_TYPE_BASIC: { - values = createAccount(result.basicUsername, result.basicPassword, - result.user, result.color, result.apiUrlFormat, result.noVersionSuffix); - break; - } - case ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE: { - values = ContentValuesCreator.createAccount(result.user, result.color, - result.apiUrlFormat, result.noVersionSuffix); - break; - } - case ParcelableCredentials.AUTH_TYPE_OAUTH: - case ParcelableCredentials.AUTH_TYPE_XAUTH: { - values = ContentValuesCreator.createAccount(result.oauth, - result.user, result.authType, result.color, result.apiUrlFormat, - result.sameOauthSigningUrl, result.noVersionSuffix); - break; - } - default: { - values = null; - } - } - if (values != null) { - mResolver.insert(Accounts.CONTENT_URI, values); - } - } - void onSignInStart() { mHandler.post(new Runnable() { @Override @@ -609,13 +589,14 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList protected SignInResponse doInBackground(final Object... params) { try { final String versionSuffix = noVersionSuffix ? null : "1.1"; - final Endpoint endpoint = new Endpoint(TwitterAPIFactory.getApiUrl(apiUrlFormat, "api", versionSuffix)); + Endpoint endpoint = new OAuthEndpoint(TwitterAPIFactory.getApiUrl(apiUrlFormat, "api", null)); final TwitterOAuth oauth = TwitterAPIFactory.getInstance(context, endpoint, new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret()), TwitterOAuth.class); final OAuthToken accessToken = oauth.getAccessToken(requestToken, oauthVerifier); final long userId = accessToken.getUserId(); if (userId <= 0) return new SignInResponse(false, false, null); final OAuthAuthorization auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret(), accessToken); + endpoint = new OAuthEndpoint(TwitterAPIFactory.getApiUrl(apiUrlFormat, "api", versionSuffix)); final Twitter twitter = TwitterAPIFactory.getInstance(context, endpoint, auth, Twitter.class); final User user = twitter.verifyCredentials(); @@ -707,28 +688,14 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList } private SignInResponse authOAuth() throws AuthenticationException, TwitterException { - String endpointUrl, signEndpointUrl; - endpointUrl = TwitterAPIFactory.getApiUrl(apiUrlFormat, "api", null); - if (!sameOAuthSigningUrl) { - signEndpointUrl = TwitterAPIFactory.getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, "api", null); - } else { - signEndpointUrl = endpointUrl; - } - Endpoint endpoint = new OAuthEndpoint(endpointUrl, signEndpointUrl); + Endpoint endpoint = TwitterAPIFactory.getOAuthEndpoint(apiUrlFormat, sameOAuthSigningUrl); OAuthAuthorization auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret()); final TwitterOAuth oauth = TwitterAPIFactory.getInstance(context, endpoint, auth, TwitterOAuth.class); final OAuthPasswordAuthenticator authenticator = new OAuthPasswordAuthenticator(oauth); final OAuthToken accessToken = authenticator.getOAuthAccessToken(username, password); final long userId = accessToken.getUserId(); if (userId <= 0) return new SignInResponse(false, false, null); - final String versionSuffix = noVersionSuffix ? null : "1.1"; - endpointUrl = TwitterAPIFactory.getApiUrl(apiUrlFormat, "api", versionSuffix); - if (!sameOAuthSigningUrl) { - signEndpointUrl = TwitterAPIFactory.getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, "api", versionSuffix); - } else { - signEndpointUrl = endpointUrl; - } - endpoint = new OAuthEndpoint(endpointUrl, signEndpointUrl); + endpoint = TwitterAPIFactory.getRestEndpoint(apiUrlFormat, sameOAuthSigningUrl, noVersionSuffix); auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret(), accessToken); final Twitter twitter = TwitterAPIFactory.getInstance(context, endpoint, auth, Twitter.class); @@ -751,20 +718,14 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList } private SignInResponse authxAuth() throws TwitterException { - String endpointUrl, signEndpointUrl; - endpointUrl = TwitterAPIFactory.getApiUrl(apiUrlFormat, "api", null); - if (!sameOAuthSigningUrl) { - signEndpointUrl = TwitterAPIFactory.getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, "api", null); - } else { - signEndpointUrl = endpointUrl; - } - Endpoint endpoint = new OAuthEndpoint(endpointUrl, signEndpointUrl); + Endpoint endpoint = TwitterAPIFactory.getOAuthEndpoint(apiUrlFormat, sameOAuthSigningUrl); OAuthAuthorization auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret()); final TwitterOAuth oauth = TwitterAPIFactory.getInstance(context, endpoint, auth, TwitterOAuth.class); final OAuthToken accessToken = oauth.getAccessToken(username, password, TwitterOAuth.XAuthMode.CLIENT); final long userId = accessToken.getUserId(); if (userId <= 0) return new SignInResponse(false, false, null); auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret(), accessToken); + endpoint = TwitterAPIFactory.getRestEndpoint(apiUrlFormat, sameOAuthSigningUrl, noVersionSuffix); final Twitter twitter = TwitterAPIFactory.getInstance(context, endpoint, auth, Twitter.class); final User user = twitter.verifyCredentials(); final int color = analyseUserProfileColor(user); @@ -827,6 +788,31 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList this(alreadyLoggedIn, true, null, null, null, null, user, ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE, color, apiUrlFormat, false, noVersionSuffix); } + + private ContentValues toContentValues() { + final ContentValues values; + switch (authType) { + case ParcelableCredentials.AUTH_TYPE_BASIC: { + values = createAccount(basicUsername, basicPassword, user, color, apiUrlFormat, + noVersionSuffix); + break; + } + case ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE: { + values = ContentValuesCreator.createAccount(user, color, apiUrlFormat, noVersionSuffix); + break; + } + case ParcelableCredentials.AUTH_TYPE_OAUTH: + case ParcelableCredentials.AUTH_TYPE_XAUTH: { + values = ContentValuesCreator.createAccount(oauth, user, authType, color, apiUrlFormat, + sameOauthSigningUrl, noVersionSuffix); + break; + } + default: { + values = null; + } + } + return values; + } } public static class SetConsumerKeySecretDialogFragment extends BaseSupportDialogFragment { diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsActivitiesAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsActivitiesAdapter.java index 8ef24468c..d78a6cd54 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsActivitiesAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsActivitiesAdapter.java @@ -25,7 +25,6 @@ import android.support.annotation.NonNull; import android.support.v4.app.FragmentActivity; import android.support.v4.util.Pair; import android.support.v7.widget.CardView; -import android.support.v7.widget.RecyclerView.Adapter; import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.LayoutInflater; import android.view.View; @@ -59,7 +58,7 @@ import org.mariotaku.twidere.view.holder.StatusViewHolder.StatusClickListener; /** * Created by mariotaku on 15/1/3. */ -public abstract class AbsActivitiesAdapter extends Adapter implements Constants, +public abstract class AbsActivitiesAdapter extends LoadMoreSupportAdapter implements Constants, IActivitiesAdapter, StatusClickListener, OnLinkClickListener { private static final int ITEM_VIEW_TYPE_STUB = 0; @@ -83,8 +82,6 @@ public abstract class AbsActivitiesAdapter extends Adapter imp private final TwidereLinkify mLinkify; private final DummyStatusHolderAdapter mStatusAdapterDelegate; private final UserColorNameManager mUserColorNameManager; - private boolean mLoadMoreSupported; - private boolean mLoadMoreIndicatorVisible; private ActivityAdapterListener mActivityAdapterListener; protected AbsActivitiesAdapter(final Context context, boolean compact) { @@ -121,11 +118,13 @@ public abstract class AbsActivitiesAdapter extends Adapter imp @Override public abstract void setData(Data data); + @NonNull @Override public MediaLoaderWrapper getMediaLoader() { return mImageLoader; } + @NonNull @Override public Context getContext() { return mContext; @@ -157,32 +156,6 @@ public abstract class AbsActivitiesAdapter extends Adapter imp return mTextSize; } - @Override - public boolean isLoadMoreIndicatorVisible() { - return mLoadMoreIndicatorVisible; - } - - @Override - public boolean isLoadMoreSupported() { - return mLoadMoreSupported; - } - - @Override - public void setLoadMoreSupported(boolean supported) { - mLoadMoreSupported = supported; - if (!supported) { - mLoadMoreIndicatorVisible = false; - } - notifyDataSetChanged(); - } - - @Override - public void setLoadMoreIndicatorVisible(boolean enabled) { - if (mLoadMoreIndicatorVisible == enabled) return; - mLoadMoreIndicatorVisible = enabled && mLoadMoreSupported; - notifyDataSetChanged(); - } - public int getLinkHighlightingStyle() { return mLinkHighlightingStyle; } @@ -343,7 +316,7 @@ public abstract class AbsActivitiesAdapter extends Adapter imp @Override public final int getItemCount() { - return getActivityCount() + (mLoadMoreIndicatorVisible ? 1 : 0); + return getActivityCount() + (isLoadMoreIndicatorVisible() ? 1 : 0); } @Override @@ -368,6 +341,7 @@ public abstract class AbsActivitiesAdapter extends Adapter imp } + @NonNull @Override public UserColorNameManager getUserColorNameManager() { return mUserColorNameManager; diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java index c353e172d..fc1caccfb 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/AbsStatusesAdapter.java @@ -102,11 +102,13 @@ public abstract class AbsStatusesAdapter extends LoadMoreSupportAdapter extends LoadMoreSupportAdapter extends LoadMoreSupportAdapter extends LoadMoreSupportAdapter extends LoadMoreSupportAdapter extends LoadMoreSupportAdapter extends LoadMoreSupportAdapter extends LoadMoreSupportAdapter implements Constants, +public class MessageEntriesAdapter extends LoadMoreSupportAdapter implements Constants, IContentCardAdapter, OnClickListener, OnReadStateChangeListener { public static final int ITEM_VIEW_TYPE_MESSAGE = 0; @@ -67,8 +67,6 @@ public class MessageEntriesAdapter extends Adapter implements Consta private final AsyncTwitterWrapper mTwitterWrapper; private final boolean mDisplayProfileImage; - private boolean mLoadMoreSupported; - private boolean mLoadMoreIndicatorVisible; private boolean mShowAccountsColor; private Cursor mCursor; private MessageEntriesAdapterListener mListener; @@ -98,6 +96,7 @@ public class MessageEntriesAdapter extends Adapter implements Consta }; } + @NonNull @Override public Context getContext() { return mContext; @@ -130,42 +129,18 @@ public class MessageEntriesAdapter extends Adapter implements Consta return new DirectMessageEntry(c); } + @NonNull @Override public MediaLoaderWrapper getMediaLoader() { return mImageLoader; } + @NonNull @Override public UserColorNameManager getUserColorNameManager() { return mUserColorNameManager; } - @Override - public boolean isLoadMoreIndicatorVisible() { - return mLoadMoreIndicatorVisible; - } - - @Override - public void setLoadMoreIndicatorVisible(boolean enabled) { - if (mLoadMoreIndicatorVisible == enabled) return; - mLoadMoreIndicatorVisible = enabled && mLoadMoreSupported; - notifyDataSetChanged(); - } - - @Override - public boolean isLoadMoreSupported() { - return mLoadMoreSupported; - } - - @Override - public void setLoadMoreSupported(boolean supported) { - mLoadMoreSupported = supported; - if (!supported) { - mLoadMoreIndicatorVisible = false; - } - notifyDataSetChanged(); - } - @Override public void onClick(final View view) { // if (mMultiSelectManager.isActive()) return; @@ -222,7 +197,7 @@ public class MessageEntriesAdapter extends Adapter implements Consta @Override public final int getItemCount() { - return getMessagesCount() + (mLoadMoreIndicatorVisible ? 1 : 0); + return getMessagesCount() + (isLoadMoreIndicatorVisible() ? 1 : 0); } public void onMessageClick(int position) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IActivitiesAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IActivitiesAdapter.java index 3c1e25bab..690785bfc 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IActivitiesAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IActivitiesAdapter.java @@ -19,6 +19,8 @@ package org.mariotaku.twidere.adapter.iface; +import android.support.annotation.NonNull; + import org.mariotaku.twidere.model.ParcelableActivity; import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.MediaLoadingHandler; @@ -38,6 +40,7 @@ public interface IActivitiesAdapter extends IContentCardAdapter, IGapSuppo @PreviewStyle int getMediaPreviewStyle(); + @NonNull @Override MediaLoaderWrapper getMediaLoader(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IContentCardAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IContentCardAdapter.java index b76498e27..dd0807825 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IContentCardAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IContentCardAdapter.java @@ -31,8 +31,11 @@ import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle; * Created by mariotaku on 15/1/3. */ public interface IContentCardAdapter extends ILoadMoreSupportAdapter { + + @NonNull Context getContext(); + @NonNull UserColorNameManager getUserColorNameManager(); int getItemCount(); @@ -47,5 +50,6 @@ public interface IContentCardAdapter extends ILoadMoreSupportAdapter { @NonNull AsyncTwitterWrapper getTwitterWrapper(); + @NonNull MediaLoaderWrapper getMediaLoader(); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IUserListsAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IUserListsAdapter.java index 4683e3a95..ae78b43bf 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IUserListsAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IUserListsAdapter.java @@ -19,6 +19,8 @@ package org.mariotaku.twidere.adapter.iface; +import android.support.annotation.NonNull; + import org.mariotaku.twidere.model.ParcelableUserList; import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.view.holder.UserListViewHolder.UserListClickListener; @@ -40,6 +42,7 @@ public interface IUserListsAdapter extends IContentCardAdapter, UserListCl boolean isNameFirst(); + @NonNull @Override MediaLoaderWrapper getMediaLoader(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IUsersAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IUsersAdapter.java index d9ca6cce7..a1c762b22 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IUsersAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/iface/IUsersAdapter.java @@ -19,6 +19,8 @@ package org.mariotaku.twidere.adapter.iface; +import android.support.annotation.NonNull; + import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.view.holder.UserViewHolder.UserClickListener; @@ -38,6 +40,7 @@ public interface IUsersAdapter extends IContentCardAdapter, UserClickListe boolean shouldShowAccountsColor(); + @NonNull @Override MediaLoaderWrapper getMediaLoader(); 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 09c369235..efb499425 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java +++ b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java @@ -44,7 +44,6 @@ import com.nostra13.universalimageloader.utils.L; import com.squareup.okhttp.internal.Network; import com.squareup.otto.Bus; -import org.acra.ACRA; import org.acra.annotation.ReportsCrashes; import org.acra.sender.HttpSender; import org.mariotaku.twidere.BuildConfig; @@ -53,15 +52,16 @@ import org.mariotaku.twidere.activity.AssistLauncherActivity; import org.mariotaku.twidere.activity.MainActivity; import org.mariotaku.twidere.activity.MainHondaJOJOActivity; import org.mariotaku.twidere.service.RefreshService; +import org.mariotaku.twidere.util.AbsLogger; import org.mariotaku.twidere.util.AsyncTaskManager; import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.DebugModeUtils; -import org.mariotaku.twidere.util.ErrorLogger; import org.mariotaku.twidere.util.KeyboardShortcutsHandler; import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.MultiSelectManager; import org.mariotaku.twidere.util.ReadStateManager; import org.mariotaku.twidere.util.StrictModeUtils; +import org.mariotaku.twidere.util.TwidereLogger; import org.mariotaku.twidere.util.UserAgentUtils; import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.Utils; @@ -271,8 +271,8 @@ public class TwidereApplication extends MultiDexApplication implements Constants } private void initBugReport() { - ACRA.init(this); - ErrorLogger.setEnabled(BuildConfig.DEBUG); + AbsLogger.setImplementation(new TwidereLogger()); + AbsLogger.init(this); } private void migrateUsageStatisticsPreferences() { diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/BaseAccountPreferenceFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/BaseAccountPreferenceFragment.java index 43856c4bd..3ca10fdaf 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/BaseAccountPreferenceFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/BaseAccountPreferenceFragment.java @@ -83,7 +83,7 @@ public abstract class BaseAccountPreferenceFragment extends PreferenceFragment i final String switchKey = getSwitchPreferenceKey(); if (!TextUtils.isEmpty(switchKey)) { inflater.inflate(R.menu.menu_switch_preference, menu); - final View actionView = menu.findItem(MENU_TOGGLE).getActionView(); + final View actionView = menu.findItem(R.id.toggle).getActionView(); final CompoundButton toggle = (CompoundButton) actionView.findViewById(android.R.id.toggle); final SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); toggle.setOnCheckedChangeListener(this); diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/BaseFiltersFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/BaseFiltersFragment.java index 8d72fb042..c08de5549 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/BaseFiltersFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/BaseFiltersFragment.java @@ -159,12 +159,12 @@ public abstract class BaseFiltersFragment extends AbsContentListViewFragment extends BaseSupportFragment +public abstract class AbsContentRecyclerViewFragment extends BaseSupportFragment implements OnRefreshListener, DrawerCallback, RefreshScrollTopInterface, ControlBarOffsetListener, ContentListSupport { @@ -222,7 +223,7 @@ public abstract class AbsContentRecyclerViewFragment extends AbsContentRecyclerViewFr public boolean onMenuItemClick(MenuItem item) { final ParcelableStatus status = mSelectedStatus; if (status == null) return false; - if (item.getItemId() == MENU_SHARE) { + if (item.getItemId() == R.id.share) { final Intent shareIntent = Utils.createStatusShareIntent(getActivity(), status); startActivity(Intent.createChooser(shareIntent, getString(R.string.share_status))); return true; 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 82f1861e4..45aedcc8f 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 @@ -141,6 +141,7 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo private AccountToggleProvider mAccountActionProvider; private boolean mSwitchAccountAnimationPlaying; + private final Rect mSystemWindowsInsets = new Rect(); public long[] getActivatedAccountIds() { if (mAccountActionProvider != null) { @@ -242,7 +243,7 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo @Override public void onLoadFinished(final Loader loader, final Cursor data) { final Menu menu = mAccountsToggleMenu.getMenu(); - mAccountActionProvider = (AccountToggleProvider) MenuItemCompat.getActionProvider(menu.findItem(MENU_SELECT_ACCOUNT)); + mAccountActionProvider = (AccountToggleProvider) MenuItemCompat.getActionProvider(menu.findItem(R.id.select_account)); final ParcelableAccount[] accounts = ParcelableAccount.getAccounts(data); if (accounts.length > 0) { mNoAccountContainer.setVisibility(View.GONE); @@ -285,29 +286,29 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo if (account == null || !(item instanceof OptionItem)) return; final OptionItem option = (OptionItem) item; switch (option.id) { - case MENU_SEARCH: { + case R.id.search: { final Intent intent = new Intent(getActivity(), QuickSearchBarActivity.class); intent.putExtra(EXTRA_ACCOUNT_ID, account.account_id); startActivity(intent); closeAccountsDrawer(); break; } - case MENU_COMPOSE: { + case R.id.compose: { final Intent composeIntent = new Intent(INTENT_ACTION_COMPOSE); composeIntent.setClass(getActivity(), ComposeActivity.class); composeIntent.putExtra(EXTRA_ACCOUNT_IDS, new long[]{account.account_id}); startActivity(composeIntent); break; } - case MENU_FAVORITES: { + case R.id.favorites: { openUserFavorites(getActivity(), account.account_id, account.account_id, account.screen_name); break; } - case MENU_LISTS: { + case R.id.lists: { openUserLists(getActivity(), account.account_id, account.account_id, account.screen_name); break; } - case MENU_EDIT: { + case R.id.edit: { Utils.openProfileEditor(getActivity(), account.account_id); break; } @@ -316,19 +317,19 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo if (!(item instanceof OptionItem)) return; final OptionItem option = (OptionItem) item; switch (option.id) { - case MENU_ACCOUNTS: { + case R.id.accounts: { Utils.openAccountsManager(getActivity()); break; } - case MENU_DRAFTS: { + case R.id.drafts: { Utils.openDrafts(getActivity()); break; } - case MENU_FILTERS: { + case R.id.filters: { Utils.openFilters(getActivity()); break; } - case MENU_SETTINGS: { + case R.id.settings: { final Intent intent = new Intent(getActivity(), SettingsActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivityForResult(intent, REQUEST_SETTINGS); @@ -372,7 +373,17 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo @Override protected void fitSystemWindows(Rect insets) { - // No-op + mSystemWindowsInsets.set(insets); + updateSystemWindowsInsets(); + } + + 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); } @Override @@ -436,6 +447,8 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo mPreferences.registerOnSharedPreferenceChangeListener(this); getLoaderManager().initLoader(0, null, this); + + updateSystemWindowsInsets(); } @Override @@ -466,12 +479,12 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo void initAccountActionsAdapter(ParcelableAccount[] accounts) { mAccountOptionsAdapter.clear(); - mAccountOptionsAdapter.add(new OptionItem(android.R.string.search_go, R.drawable.ic_action_search, MENU_SEARCH)); + mAccountOptionsAdapter.add(new OptionItem(android.R.string.search_go, R.drawable.ic_action_search, R.id.search)); if (accounts.length > 1) { - mAccountOptionsAdapter.add(new OptionItem(R.string.compose, R.drawable.ic_action_status_compose, MENU_COMPOSE)); + mAccountOptionsAdapter.add(new OptionItem(R.string.compose, R.drawable.ic_action_status_compose, R.id.compose)); } - mAccountOptionsAdapter.add(new OptionItem(R.string.favorites, R.drawable.ic_action_star, MENU_FAVORITES)); - mAccountOptionsAdapter.add(new OptionItem(R.string.lists, R.drawable.ic_action_list, MENU_LISTS)); + mAccountOptionsAdapter.add(new OptionItem(R.string.favorites, R.drawable.ic_action_star, R.id.favorites)); + mAccountOptionsAdapter.add(new OptionItem(R.string.lists, R.drawable.ic_action_list, R.id.lists)); } private void closeAccountsDrawer() { @@ -644,7 +657,7 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo @Override protected String getTitle(int position, OptionItem option) { final ParcelableAccount account = mSelectedAccount; - if (account != null && option.id == MENU_COMPOSE) { + if (account != null && option.id == R.id.compose) { final Context context = getContext(); final String displayName = mUserColorNameManager.getDisplayName(-1, account.name, account.screen_name, mNameFirst, false); @@ -802,10 +815,10 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo public AppMenuAdapter(final Context context) { super(context); - add(new OptionItem(R.string.accounts, R.drawable.ic_action_accounts, MENU_ACCOUNTS)); - add(new OptionItem(R.string.drafts, R.drawable.ic_action_draft, MENU_DRAFTS)); - add(new OptionItem(R.string.filters, R.drawable.ic_action_speaker_muted, MENU_FILTERS)); - add(new OptionItem(R.string.settings, R.drawable.ic_action_settings, MENU_SETTINGS)); + 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)); } } 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 12271e4a3..c61de87ce 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 @@ -78,7 +78,7 @@ public class AccountsManagerFragment extends BaseSupportFragment implements Load @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - case MENU_ADD_ACCOUNT: { + case R.id.add_account: { final Intent intent = new Intent(INTENT_ACTION_TWITTER_LOGIN); intent.setClass(getActivity(), SignInActivity.class); startActivity(intent); @@ -118,14 +118,14 @@ public class AccountsManagerFragment extends BaseSupportFragment implements Load mSelectedAccount = mAdapter.getAccount(info.position); if (mSelectedAccount == null) return false; switch (item.getItemId()) { - case MENU_SET_COLOR: { + case R.id.set_color: { final Intent intent = new Intent(getActivity(), ColorPickerDialogActivity.class); intent.putExtra(EXTRA_COLOR, mSelectedAccount.color); intent.putExtra(EXTRA_ALPHA_SLIDER, false); startActivityForResult(intent, REQUEST_SET_COLOR); break; } - case MENU_DELETE: { + case R.id.delete: { final AccountDeletionDialogFragment f = new AccountDeletionDialogFragment(); final Bundle args = new Bundle(); args.putLong(EXTRA_ACCOUNT_ID, mSelectedAccount.account_id); diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesFragment.java index 50767438b..330482bf8 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/DirectMessagesFragment.java @@ -288,7 +288,7 @@ public class DirectMessagesFragment extends AbsContentRecyclerViewFragment mTrendsCallback = new LoaderCallbacks() { - - @Override - public Loader onCreateLoader(final int id, final Bundle args) { - final Uri uri = CachedTrends.Local.CONTENT_URI; - final String table = getTableNameByUri(uri); - final SQLSelectQuery selectQuery = SQLQueryBuilder.select(new Columns(CachedTrends.TIMESTAMP)) - .from(new Table(table)) - .orderBy(new OrderBy(CachedTrends.TIMESTAMP, false)) - .limit(1) - .build(); - final Expression where = Expression.equals(CachedTrends.TIMESTAMP, selectQuery); - return new CursorLoader(getActivity(), uri, CachedTrends.COLUMNS, where.getSQL(), null, null); - } - - @Override - public void onLoaderReset(final Loader loader) { - mTrendsAdapter.swapCursor(null); - } - - @Override - public void onLoadFinished(final Loader loader, final Cursor data) { - mTrendsAdapter.swapCursor(data); - } - - }; - - @Override - public void onActivityCreated(final Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - mQuickMenuContainer.setOnFitSystemWindowsListener(this); - mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); - if (mPreferences.getBoolean(KEY_QUICK_MENU_EXPANDED, false)) { - } else { - } - final Context context = getThemedContext(); - mAdapter = new MergeAdapter(); - mTrendsAdapter = new TrendsAdapter(context); - - mAdapter.addView(Utils.newSectionView(context, R.string.trends), false); - mAdapter.addAdapter(mTrendsAdapter); - mListView.setAdapter(mAdapter); - mListView.setOnItemClickListener(this); - getLoaderManager().initLoader(LOADER_ID_TRENDS, null, mTrendsCallback); - } - - @Override - public LayoutInflater getLayoutInflater(Bundle savedInstanceState) { - return LayoutInflater.from(getThemedContext()); - } - - @Override - public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_quick_menu, container, false); - } - - @Override - public void onDestroy() { - super.onDestroy(); - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(KEY_QUICK_MENU_EXPANDED, mSlidingUpPanel.getPanelState() == PanelState.EXPANDED); - editor.apply(); - } - - @Override - public void onBaseViewCreated(final View view, final Bundle savedInstanceState) { - super.onBaseViewCreated(view, savedInstanceState); - mQuickMenuContainer = (ExtendedFrameLayout) view.findViewById(R.id.quick_menu_fragment); - mListView = (ListView) view.findViewById(android.R.id.list); - mSlidingUpPanel = (SlidingUpPanelLayout) view.findViewById(R.id.activities_drawer); - mActivitiesConfigButton = (ImageButton) view.findViewById(R.id.activities_config_button); - final View activitiesContainer = view.findViewById(R.id.activities_container); - } - - @Override - public void onFitSystemWindows(Rect insets) { - mQuickMenuContainer.setPadding(insets.left, insets.top, insets.right, insets.bottom); - } - - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - final ListAdapter adapter = mAdapter.getAdapter(position); - if (adapter instanceof TrendsAdapter) { - openTweetSearch(getActivity(), getAccountId(), (String) mAdapter.getItem(position)); - } - } - - private long getAccountId() { - return -1; - } - - @Override - public Context getThemedContext() { - if (mThemedContext != null) return mThemedContext; - final Context context = getActivity(); - final int currentThemeResource = ThemeUtils.getNoActionBarThemeResource(context); - final int themeResource = ThemeUtils.getDrawerThemeResource(currentThemeResource); - return mThemedContext = new ContextThemeWrapper(context, themeResource); - } - -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ScheduledStatusesFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ScheduledStatusesFragment.java new file mode 100644 index 000000000..d0cdfaf55 --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/ScheduledStatusesFragment.java @@ -0,0 +1,156 @@ +/* + * 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.fragment.support; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.Loader; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import org.mariotaku.twidere.R; +import org.mariotaku.twidere.adapter.LoadMoreSupportAdapter; +import org.mariotaku.twidere.api.twitter.model.ScheduledStatus; +import org.mariotaku.twidere.loader.support.ScheduledStatusesLoader; +import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder; + +import java.util.List; + +/** + * Created by mariotaku on 15/7/10. + */ +public class ScheduledStatusesFragment extends AbsContentRecyclerViewFragment + implements LoaderManager.LoaderCallbacks> { + + @Override + public boolean isRefreshing() { + return getLoaderManager().hasRunningLoaders(); + } + + @NonNull + @Override + protected ScheduledStatusesAdapter onCreateAdapter(Context context, boolean compact) { + return new ScheduledStatusesAdapter(getActivity()); + } + + @Override + public Loader> onCreateLoader(int id, Bundle args) { + final long accountId = args.getLong(EXTRA_ACCOUNT_ID, -1); + final long sinceId = args.getLong(EXTRA_SINCE_ID, -1); + final long maxId = args.getLong(EXTRA_MAX_ID, -1); + final ScheduledStatus.State[] states = {ScheduledStatus.State.SCHEDULED, ScheduledStatus.State.FAILED}; + return new ScheduledStatusesLoader(getActivity(), accountId, sinceId, maxId, states, null); + } + + @Override + public void onLoadFinished(Loader> loader, List data) { + getAdapter().setData(data); + showContent(); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + final Bundle args = getArguments(); + final Bundle loaderArgs = new Bundle(); + loaderArgs.putLong(EXTRA_ACCOUNT_ID, args.getLong(EXTRA_ACCOUNT_ID)); + getLoaderManager().initLoader(0, loaderArgs, this); + showProgress(); + } + + @Override + public void onLoaderReset(Loader> loader) { + getAdapter().setData(null); + } + + public static class ScheduledStatusesAdapter extends LoadMoreSupportAdapter { + public static final int ITEM_VIEW_TYPE_SCHEDULED_STATUS = 2; + + private final Context mContext; + private final LayoutInflater mInflater; + private List mData; + + public ScheduledStatusesAdapter(Context context) { + mContext = context; + mInflater = LayoutInflater.from(context); + setLoadMoreSupported(false); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + switch (viewType) { + case ITEM_VIEW_TYPE_SCHEDULED_STATUS: { + return new ScheduledStatusViewHolder(mInflater.inflate(R.layout.list_item_scheduled_status, parent, false)); + } + case ITEM_VIEW_TYPE_LOAD_INDICATOR: { + return new LoadIndicatorViewHolder(mInflater.inflate(R.layout.card_item_load_indicator, parent, false)); + } + } + throw new UnsupportedOperationException(); + } + + @Override + public int getItemViewType(int position) { + return ITEM_VIEW_TYPE_SCHEDULED_STATUS; + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + switch (holder.getItemViewType()) { + case ITEM_VIEW_TYPE_SCHEDULED_STATUS: { + ((ScheduledStatusViewHolder) holder).displayScheduledStatus(mData.get(position)); + break; + } + } + } + + @Override + public int getItemCount() { + if (mData == null) return 0; + return mData.size(); + } + + public void setData(List data) { + mData = data; + notifyDataSetChanged(); + } + } + + private static final class ScheduledStatusViewHolder extends RecyclerView.ViewHolder { + + private final TextView textView; + + public ScheduledStatusViewHolder(View itemView) { + super(itemView); + textView = (TextView) itemView.findViewById(R.id.text); + } + + public void displayScheduledStatus(ScheduledStatus status) { + textView.setText(status.getText()); + } + } + +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/SearchFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/SearchFragment.java index 8efcdb0a3..f874f9e48 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/SearchFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/SearchFragment.java @@ -211,14 +211,14 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll @Override public void onPrepareOptionsMenu(Menu menu) { - final MenuItem item = menu.findItem(MENU_COMPOSE); + final MenuItem item = menu.findItem(R.id.compose); item.setTitle(getString(R.string.tweet_hashtag, getQuery())); } @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { - case MENU_SAVE: { + case R.id.save: { final AsyncTwitterWrapper twitter = getTwitterWrapper(); final Bundle args = getArguments(); if (twitter != null && args != null) { @@ -226,7 +226,7 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll } return true; } - case MENU_COMPOSE: { + case R.id.compose: { final Intent intent = new Intent(getActivity(), ComposeActivity.class); intent.setAction(INTENT_ACTION_COMPOSE); intent.putExtra(Intent.EXTRA_TEXT, String.format("#%s ", getQuery())); diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java index 331c9bd85..722b3d9c0 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java @@ -905,7 +905,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac final AsyncTwitterWrapper twitter = fragment.getTwitterWrapper(); final FragmentActivity activity = fragment.getActivity(); final FragmentManager fm = fragment.getFragmentManager(); - if (item.getItemId() == MENU_RETWEET) { + if (item.getItemId() == R.id.retweet) { RetweetQuoteDialogFragment.show(fm, status); return true; } @@ -1146,6 +1146,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac return RecyclerView.NO_POSITION; } + @NonNull @Override public Context getContext() { return mContext; @@ -1172,6 +1173,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac return mDisplayProfileImage; } + @NonNull @Override public MediaLoaderWrapper getMediaLoader() { return mImageLoader; @@ -1256,6 +1258,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac return mMediaLoadingHandler; } + @NonNull @Override public UserColorNameManager getUserColorNameManager() { return mUserColorNameManager; diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java index 179f6ecaa..c4d8a03c1 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java @@ -106,6 +106,7 @@ import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback; import org.mariotaku.twidere.graphic.ActionBarColorDrawable; import org.mariotaku.twidere.graphic.ActionIconDrawable; import org.mariotaku.twidere.loader.support.ParcelableUserLoader; +import org.mariotaku.twidere.model.ConsumerKeyType; import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableUser; @@ -840,15 +841,18 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener final ParcelableUser user = getUser(); final Relationship relationship = mRelationship; if (twitter == null || user == null) return; + final boolean isMyself = user.account_id == user.id; - final MenuItem mentionItem = menu.findItem(MENU_MENTION); + final MenuItem mentionItem = menu.findItem(R.id.mention); if (mentionItem != null) { final String displayName = mUserColorNameManager.getDisplayName(user, mNameFirst, true); mentionItem.setTitle(getString(R.string.mention_user_name, displayName)); } - MenuUtils.setMenuItemAvailability(menu, MENU_MENTION, !isMyself); + MenuUtils.setMenuItemAvailability(menu, R.id.mention, !isMyself); MenuUtils.setMenuItemAvailability(menu, R.id.incoming_friendships, isMyself); MenuUtils.setMenuItemAvailability(menu, R.id.saved_searches, isMyself); + MenuUtils.setMenuItemAvailability(menu, R.id.scheduled_statuses, isMyself + && Utils.getOfficialKeyType(getActivity(), user.account_id) == ConsumerKeyType.TWEETDECK); // final MenuItem followItem = menu.findItem(MENU_FOLLOW); // followItem.setVisible(!isMyself); // final boolean shouldShowFollowItem = !creatingFriendship && !destroyingFriendship && !isMyself @@ -863,38 +867,38 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener // followItem.setIcon(null); // } if (!isMyself && relationship != null) { - MenuUtils.setMenuItemAvailability(menu, MENU_SEND_DIRECT_MESSAGE, relationship.canSourceDMTarget()); - MenuUtils.setMenuItemAvailability(menu, MENU_BLOCK, true); - MenuUtils.setMenuItemAvailability(menu, MENU_MUTE_USER, true); - final MenuItem blockItem = menu.findItem(MENU_BLOCK); + MenuUtils.setMenuItemAvailability(menu, R.id.send_direct_message, relationship.canSourceDMTarget()); + MenuUtils.setMenuItemAvailability(menu, R.id.block, true); + MenuUtils.setMenuItemAvailability(menu, R.id.mute_user, true); + final MenuItem blockItem = menu.findItem(R.id.block); if (blockItem != null) { final boolean blocking = relationship.isSourceBlockingTarget(); ActionIconDrawable.setMenuHighlight(blockItem, new TwidereMenuInfo(blocking)); blockItem.setTitle(blocking ? R.string.unblock : R.string.block); } - final MenuItem muteItem = menu.findItem(MENU_MUTE_USER); + final MenuItem muteItem = menu.findItem(R.id.mute_user); if (muteItem != null) { final boolean muting = relationship.isSourceMutingTarget(); ActionIconDrawable.setMenuHighlight(muteItem, new TwidereMenuInfo(muting)); muteItem.setTitle(muting ? R.string.unmute : R.string.mute); } - final MenuItem filterItem = menu.findItem(MENU_ADD_TO_FILTER); + final MenuItem filterItem = menu.findItem(R.id.add_to_filter); if (filterItem != null) { final boolean filtering = Utils.isFilteringUser(getActivity(), user.id); ActionIconDrawable.setMenuHighlight(filterItem, new TwidereMenuInfo(filtering)); filterItem.setTitle(filtering ? R.string.remove_from_filter : R.string.add_to_filter); } - final MenuItem wantRetweetsItem = menu.findItem(MENU_ENABLE_RETWEETS); + final MenuItem wantRetweetsItem = menu.findItem(R.id.enable_retweets); if (wantRetweetsItem != null) { wantRetweetsItem.setChecked(relationship.isSourceWantRetweetsFromTarget()); } } else { - MenuUtils.setMenuItemAvailability(menu, MENU_SEND_DIRECT_MESSAGE, false); - MenuUtils.setMenuItemAvailability(menu, MENU_ENABLE_RETWEETS, false); - MenuUtils.setMenuItemAvailability(menu, MENU_BLOCK, false); - MenuUtils.setMenuItemAvailability(menu, MENU_MUTE_USER, false); - MenuUtils.setMenuItemAvailability(menu, MENU_REPORT_SPAM, false); + MenuUtils.setMenuItemAvailability(menu, R.id.send_direct_message, false); + MenuUtils.setMenuItemAvailability(menu, R.id.enable_retweets, false); + MenuUtils.setMenuItemAvailability(menu, R.id.block, false); + MenuUtils.setMenuItemAvailability(menu, R.id.mute_user, false); + MenuUtils.setMenuItemAvailability(menu, R.id.report_spam, false); } MenuUtils.setMenuItemAvailability(menu, R.id.muted_users, isMyself); MenuUtils.setMenuItemAvailability(menu, R.id.blocked_users, isMyself); @@ -920,7 +924,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener final Relationship relationship = mRelationship; if (user == null || twitter == null) return false; switch (item.getItemId()) { - case MENU_BLOCK: { + case R.id.block: { if (mRelationship != null) { if (mRelationship.isSourceBlockingTarget()) { twitter.destroyBlockAsync(user.account_id, user.id); @@ -930,11 +934,11 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener } break; } - case MENU_REPORT_SPAM: { + case R.id.report_spam: { ReportSpamDialogFragment.show(getFragmentManager(), user); break; } - case MENU_ADD_TO_FILTER: { + case R.id.add_to_filter: { final boolean filtering = Utils.isFilteringUser(getActivity(), user.id); final ContentResolver cr = getContentResolver(); if (filtering) { @@ -947,7 +951,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener } break; } - case MENU_MUTE_USER: { + case R.id.mute_user: { if (mRelationship != null) { if (mRelationship.isSourceMutingTarget()) { twitter.destroyMuteAsync(user.account_id, user.id); @@ -957,7 +961,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener } break; } - case MENU_MENTION: { + case R.id.mention: { final Intent intent = new Intent(INTENT_ACTION_MENTION); final Bundle bundle = new Bundle(); bundle.putParcelable(EXTRA_USER, user); @@ -965,7 +969,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener startActivity(intent); break; } - case MENU_SEND_DIRECT_MESSAGE: { + case R.id.send_direct_message: { final Uri.Builder builder = new Uri.Builder(); builder.scheme(SCHEME_TWIDERE); builder.authority(AUTHORITY_DIRECT_MESSAGES_CONVERSATION); @@ -977,7 +981,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener startActivity(intent); break; } - case MENU_SET_COLOR: { + case R.id.set_color: { final Intent intent = new Intent(getActivity(), ColorPickerDialogActivity.class); intent.putExtra(EXTRA_COLOR, mUserColorNameManager.getUserColor(user.id, true)); intent.putExtra(EXTRA_ALPHA_SLIDER, false); @@ -985,17 +989,17 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener startActivityForResult(intent, REQUEST_SET_COLOR); break; } - case MENU_CLEAR_NICKNAME: { + case R.id.clear_nickname: { final UserColorNameManager manager = UserColorNameManager.getInstance(getActivity()); manager.clearUserNickname(user.id); break; } - case MENU_SET_NICKNAME: { + case R.id.set_nickname: { final String nick = mUserColorNameManager.getUserNickname(user.id, true); SetUserNicknameDialogFragment.show(getFragmentManager(), user.id, nick); break; } - case MENU_ADD_TO_LIST: { + case R.id.add_to_list: { final Intent intent = new Intent(INTENT_ACTION_SELECT_USER_LIST); intent.setClass(getActivity(), UserListSelectorActivity.class); intent.putExtra(EXTRA_ACCOUNT_ID, user.account_id); @@ -1003,14 +1007,14 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener startActivityForResult(intent, REQUEST_ADD_TO_LIST); break; } - case MENU_OPEN_WITH_ACCOUNT: { + case R.id.open_with_account: { final Intent intent = new Intent(INTENT_ACTION_SELECT_ACCOUNT); intent.setClass(getActivity(), AccountSelectorActivity.class); intent.putExtra(EXTRA_SINGLE_SELECTION, true); startActivityForResult(intent, REQUEST_SELECT_ACCOUNT); break; } - case MENU_FOLLOW: { + case R.id.follow: { if (relationship == null) return false; final boolean isFollowing = relationship.isSourceFollowingTarget(); final boolean isCreatingFriendship = twitter.isCreatingFriendship(user.account_id, user.id); @@ -1024,7 +1028,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener } return true; } - case MENU_ENABLE_RETWEETS: { + case R.id.enable_retweets: { final boolean newState = !item.isChecked(); final FriendshipUpdate update = new FriendshipUpdate(); update.retweets(newState); @@ -1052,6 +1056,10 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener Utils.openSavedSearches(getActivity(), user.account_id); return true; } + case R.id.scheduled_statuses: { + Utils.openScheduledStatuses(getActivity(), user.account_id); + return true; + } default: { if (item.getIntent() != null) { try { diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java index ef1c27b60..1c92a0d45 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java @@ -277,16 +277,16 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList @Override public void onPrepareOptionsMenu(Menu menu) { final ParcelableUserList userList = mUserList; - setMenuItemAvailability(menu, MENU_INFO, userList != null); + setMenuItemAvailability(menu, R.id.info, userList != null); menu.removeGroup(MENU_GROUP_USER_LIST_EXTENSION); if (userList != null) { final boolean isMyList = userList.user_id == userList.account_id; final boolean isFollowing = userList.is_following; - setMenuItemAvailability(menu, MENU_EDIT, isMyList); - setMenuItemAvailability(menu, MENU_FOLLOW, !isMyList); - setMenuItemAvailability(menu, MENU_ADD, isMyList); - setMenuItemAvailability(menu, MENU_DELETE, isMyList); - final MenuItem followItem = menu.findItem(MENU_FOLLOW); + setMenuItemAvailability(menu, R.id.edit, isMyList); + setMenuItemAvailability(menu, R.id.follow, !isMyList); + setMenuItemAvailability(menu, R.id.add, isMyList); + setMenuItemAvailability(menu, R.id.delete, isMyList); + final MenuItem followItem = menu.findItem(R.id.follow); if (isFollowing) { followItem.setIcon(R.drawable.ic_action_cancel); followItem.setTitle(R.string.unsubscribe); @@ -299,10 +299,10 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList extensionsIntent.putExtra(EXTRA_USER_LIST, userList); addIntentToMenu(getActivity(), menu, extensionsIntent, MENU_GROUP_USER_LIST_EXTENSION); } else { - setMenuItemAvailability(menu, MENU_EDIT, false); - setMenuItemAvailability(menu, MENU_FOLLOW, false); - setMenuItemAvailability(menu, MENU_ADD, false); - setMenuItemAvailability(menu, MENU_DELETE, false); + setMenuItemAvailability(menu, R.id.edit, false); + setMenuItemAvailability(menu, R.id.follow, false); + setMenuItemAvailability(menu, R.id.add, false); + setMenuItemAvailability(menu, R.id.delete, false); } } @@ -312,7 +312,7 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList final ParcelableUserList userList = mUserList; if (twitter == null || userList == null) return false; switch (item.getItemId()) { - case MENU_ADD: { + case R.id.add: { if (userList.user_id != userList.account_id) return false; final Intent intent = new Intent(INTENT_ACTION_SELECT_USER); intent.setClass(getActivity(), UserListSelectorActivity.class); @@ -320,12 +320,12 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList startActivityForResult(intent, REQUEST_SELECT_USER); break; } - case MENU_DELETE: { + case R.id.delete: { if (userList.user_id != userList.account_id) return false; DestroyUserListDialogFragment.show(getFragmentManager(), userList); break; } - case MENU_EDIT: { + case R.id.edit: { final Bundle args = new Bundle(); args.putLong(EXTRA_ACCOUNT_ID, userList.account_id); args.putString(EXTRA_LIST_NAME, userList.name); @@ -337,7 +337,7 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList f.show(getFragmentManager(), "edit_user_list_details"); return true; } - case MENU_FOLLOW: { + case R.id.follow: { if (userList.is_following) { DestroyUserListSubscriptionDialogFragment.show(getFragmentManager(), userList); } else { @@ -345,7 +345,7 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList } return true; } - case MENU_OPEN_WITH_ACCOUNT: { + case R.id.open_with_account: { final Intent intent = new Intent(INTENT_ACTION_SELECT_ACCOUNT); intent.setClass(getActivity(), AccountSelectorActivity.class); intent.putExtra(EXTRA_SINGLE_SELECTION, true); diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileEditorFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileEditorFragment.java index bab45485c..48d536007 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileEditorFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileEditorFragment.java @@ -193,7 +193,7 @@ public class UserProfileEditorFragment extends BaseSupportFragment implements On @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - case MENU_SAVE: { + case R.id.save: { final String name = ParseUtils.parseString(mEditName.getText()); final String url = ParseUtils.parseString(mEditUrl.getText()); final String location = ParseUtils.parseString(mEditLocation.getText()); diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ScheduledStatusesLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ScheduledStatusesLoader.java new file mode 100644 index 000000000..7c87558bd --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ScheduledStatusesLoader.java @@ -0,0 +1,73 @@ +/* + * 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.loader.support; + +import android.content.Context; +import android.support.v4.content.AsyncTaskLoader; + +import org.mariotaku.twidere.api.twitter.Twitter; +import org.mariotaku.twidere.api.twitter.TwitterException; +import org.mariotaku.twidere.api.twitter.model.Paging; +import org.mariotaku.twidere.api.twitter.model.ScheduledStatus; +import org.mariotaku.twidere.util.TwitterAPIFactory; + +import java.util.List; + +/** + * Created by mariotaku on 15/7/10. + */ +public class ScheduledStatusesLoader extends AsyncTaskLoader> { + + private final long mAccountId; + private final long mSinceId; + private final long mMaxId; + private final ScheduledStatus.State[] mStates; + + public ScheduledStatusesLoader(Context context, long accountId, long sinceId, long maxId, ScheduledStatus.State[] states, List data) { + super(context); + mAccountId = accountId; + mSinceId = sinceId; + mMaxId = maxId; + mStates = states; + } + + + @Override + public List loadInBackground() { + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(getContext(), mAccountId, true); + final Paging paging = new Paging(); + if (mSinceId > 0) { + paging.setSinceId(mSinceId); + } + if (mMaxId > 0) { + paging.setMaxId(mMaxId); + } + try { + return twitter.getScheduledStatusesList(paging, mStates); + } catch (TwitterException e) { + return null; + } + } + + @Override + protected void onStartLoading() { + forceLoad(); + } +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java b/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java index 3da812351..f69c0b0b2 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java +++ b/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java @@ -44,9 +44,9 @@ import android.widget.Toast; import com.nostra13.universalimageloader.utils.IoUtils; import com.twitter.Extractor; -import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.restfu.http.ContentType; import org.mariotaku.restfu.http.mime.FileTypedData; +import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.MainActivity; @@ -216,6 +216,7 @@ public class BackgroundOperationService extends IntentService implements Constan private void handleSendDraftIntent(Intent intent) { final Uri uri = intent.getData(); if (uri == null) return; + mNotificationManager.cancel(uri.toString(), NOTIFICATION_ID_DRAFTS); final long draftId = ParseUtils.parseLong(uri.getLastPathSegment(), -1); if (draftId == -1) return; final Expression where = Expression.equals(Drafts._ID, draftId); 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 4ede76e9f..64dca9106 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/MultiSelectEventHandler.java @@ -103,7 +103,7 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback, final List selectedItems = mMultiSelectManager.getSelectedItems(); if (selectedItems.isEmpty()) return false; switch (item.getItemId()) { - case MENU_REPLY: { + case R.id.reply: { final Extractor extractor = new Extractor(); final Intent intent = new Intent(INTENT_ACTION_REPLY_MULTIPLE); final Bundle bundle = new Bundle(); @@ -133,7 +133,7 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback, mode.finish(); break; } - case MENU_MUTE_USER: { + case R.id.mute_user: { final ContentResolver resolver = mActivity.getContentResolver(); final ArrayList valuesList = new ArrayList<>(); final Set userIds = new HashSet<>(); @@ -155,7 +155,7 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback, mActivity.sendBroadcast(new Intent(BROADCAST_MULTI_MUTESTATE_CHANGED)); break; } - case MENU_BLOCK: { + case R.id.block: { final long accountId = mMultiSelectManager.getAccountId(); final long[] userIds = MultiSelectManager.getSelectedUserIds(selectedItems); if (accountId > 0 && userIds != null) { @@ -164,7 +164,7 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback, mode.finish(); break; } - case MENU_REPORT_SPAM: { + case R.id.report_spam: { final long accountId = mMultiSelectManager.getAccountId(); final long[] userIds = MultiSelectManager.getSelectedUserIds(selectedItems); if (accountId > 0 && userIds != null) { @@ -190,7 +190,7 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback, @Override public boolean onCreateActionMode(final ActionMode mode, final Menu menu) { mode.getMenuInflater().inflate(R.menu.action_multi_select_contents, menu); - mAccountActionProvider = (AccountActionProvider) menu.findItem(MENU_SELECT_ACCOUNT).getActionProvider(); + mAccountActionProvider = (AccountActionProvider) menu.findItem(R.id.select_account).getActionProvider(); mAccountActionProvider.setSelectedAccountIds(mMultiSelectManager.getFirstSelectAccountId()); return true; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwidereLogger.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwidereLogger.java new file mode 100644 index 000000000..adf3d60c1 --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/util/TwidereLogger.java @@ -0,0 +1,76 @@ +/* + * 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.Application; +import android.os.AsyncTask; +import android.support.annotation.Nullable; +import android.util.Log; + +import org.acra.ACRA; +import org.acra.ErrorReporter; +import org.mariotaku.twidere.BuildConfig; +import org.mariotaku.twidere.Constants; + +/** + * Created by mariotaku on 15/7/8. + */ +public class TwidereLogger extends AbsLogger implements Constants { + + @Override + protected void logImpl(@Nullable String message, @Nullable Throwable throwable) { + Log.d(LOGTAG, message, throwable); + } + + @Override + protected void errorImpl(@Nullable String message, @Nullable Throwable throwable) { + final ErrorReporter errorReporter = ACRA.getErrorReporter(); + if (throwable == null && message == null) { + throw new NullPointerException("Message and Throwable can't be both null"); + } + if (message != null) { + if (BuildConfig.DEBUG) { + Log.w(LOGTAG, message, throwable); + } + + handleSilentException(new Exception(message, throwable)); + return; + } + if (BuildConfig.DEBUG) { + Log.w(LOGTAG, throwable); + } + handleSilentException(throwable); + } + + private void handleSilentException(final Throwable throwable) { + AsyncTask.execute(new Runnable() { + @Override + public void run() { + ACRA.getErrorReporter().handleSilentException(throwable); + } + }); + } + + @Override + protected void initImpl(Application application) { + ACRA.init(application); + } + +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java index e5e50ffe6..b0494fd2a 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java @@ -307,6 +307,9 @@ public class TwitterAPIFactory implements TwidereConstants { case TWITTER_FOR_MAC: { return "Twitter-Mac"; } + case TWEETDECK: { + return "TweetDeck"; + } } return "Twitter"; } @@ -321,6 +324,29 @@ public class TwitterAPIFactory implements TwidereConstants { } } + public static Endpoint getOAuthEndpoint(String apiUrlFormat, boolean sameOAuthSigningUrl) { + String endpointUrl, signEndpointUrl; + endpointUrl = getApiUrl(apiUrlFormat, "api", null); + if (!sameOAuthSigningUrl) { + signEndpointUrl = getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, "api", null); + } else { + signEndpointUrl = endpointUrl; + } + return new OAuthEndpoint(endpointUrl, signEndpointUrl); + } + + public static Endpoint getRestEndpoint(String apiUrlFormat, boolean sameOAuthSigningUrl, boolean noVersionSuffix) { + final String versionSuffix = noVersionSuffix ? null : "1.1"; + String endpointUrl, signEndpointUrl; + endpointUrl = getApiUrl(apiUrlFormat, "api", versionSuffix); + if (!sameOAuthSigningUrl) { + signEndpointUrl = getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, "api", versionSuffix); + } else { + signEndpointUrl = endpointUrl; + } + return new OAuthEndpoint(endpointUrl, signEndpointUrl); + } + public static class TwidereRequestInfoFactory implements RequestInfoFactory { private static HashMap sExtraParams = new HashMap<>(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java index 2359f31b0..c53380329 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java @@ -120,6 +120,9 @@ import org.apache.http.protocol.HTTP; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.mariotaku.restfu.RestAPIFactory; +import org.mariotaku.restfu.RestClient; +import org.mariotaku.restfu.http.Authorization; import org.mariotaku.sqliteqb.library.AllColumns; import org.mariotaku.sqliteqb.library.Columns; import org.mariotaku.sqliteqb.library.Columns.Column; @@ -132,9 +135,6 @@ import org.mariotaku.sqliteqb.library.Selectable; import org.mariotaku.sqliteqb.library.Table; import org.mariotaku.sqliteqb.library.Tables; import org.mariotaku.sqliteqb.library.query.SQLSelectQuery; -import org.mariotaku.restfu.RestAPIFactory; -import org.mariotaku.restfu.RestClient; -import org.mariotaku.restfu.http.Authorization; import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; @@ -162,6 +162,7 @@ import org.mariotaku.twidere.fragment.support.ListsFragment; import org.mariotaku.twidere.fragment.support.MessagesConversationFragment; import org.mariotaku.twidere.fragment.support.MutesUsersListFragment; import org.mariotaku.twidere.fragment.support.SavedSearchesListFragment; +import org.mariotaku.twidere.fragment.support.ScheduledStatusesFragment; import org.mariotaku.twidere.fragment.support.SearchFragment; import org.mariotaku.twidere.fragment.support.SensitiveContentWarningDialogFragment; import org.mariotaku.twidere.fragment.support.SetUserNicknameDialogFragment; @@ -190,6 +191,7 @@ import org.mariotaku.twidere.graphic.ActionIconDrawable; import org.mariotaku.twidere.graphic.PaddingDrawable; import org.mariotaku.twidere.menu.SupportStatusShareProvider; import org.mariotaku.twidere.model.AccountPreferences; +import org.mariotaku.twidere.model.ConsumerKeyType; import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableDirectMessage; @@ -388,6 +390,7 @@ public final class Utils implements Constants { LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_SEARCH, null, LINK_ID_SEARCH); LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_MUTES_USERS, null, LINK_ID_MUTES_USERS); LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_MAP, null, LINK_ID_MAP); + LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_SCHEDULED_STATUSES, null, LINK_ID_SCHEDULED_STATUSES); LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_ACCOUNTS, null, LINK_ID_ACCOUNTS); LINK_HANDLER_URI_MATCHER.addURI(AUTHORITY_DRAFTS, null, LINK_ID_DRAFTS); @@ -941,6 +944,10 @@ public final class Utils implements Constants { fragment = new MutesUsersListFragment(); break; } + case LINK_ID_SCHEDULED_STATUSES: { + fragment = new ScheduledStatusesFragment(); + break; + } case LINK_ID_DIRECT_MESSAGES_CONVERSATION: { fragment = new MessagesConversationFragment(); final String paramRecipientId = uri.getQueryParameter(QUERY_PARAM_RECIPIENT_ID); @@ -2546,18 +2553,23 @@ public final class Utils implements Constants { } public static boolean isOfficialKeyAccount(final Context context, final long accountId) { - if (context == null) return false; + return getOfficialKeyType(context, accountId) != ConsumerKeyType.UNKNOWN; + } + + @NonNull + public static ConsumerKeyType getOfficialKeyType(final Context context, final long accountId) { + if (context == null) return ConsumerKeyType.UNKNOWN; final String[] projection = {Accounts.CONSUMER_KEY, Accounts.CONSUMER_SECRET}; final String selection = Expression.equals(Accounts.ACCOUNT_ID, accountId).getSQL(); final Cursor c = context.getContentResolver().query(Accounts.CONTENT_URI, projection, selection, null, null); //noinspection TryFinallyCanBeTryWithResources try { if (c.moveToPosition(0)) - return TwitterContentUtils.isOfficialKey(context, c.getString(0), c.getString(1)); + return TwitterContentUtils.getOfficialKeyType(context, c.getString(0), c.getString(1)); } finally { c.close(); } - return false; + return ConsumerKeyType.UNKNOWN; } public static boolean isOfficialTwitterInstance(final Context context, final Twitter twitter) { @@ -2761,12 +2773,22 @@ public final class Utils implements Constants { context.startActivity(Intent.createChooser(intent, null)); } - public static void openMutesUsers(final Activity activity, final long account_id) { + public static void openMutesUsers(final Activity activity, final long accountId) { if (activity == null) return; final Uri.Builder builder = new Uri.Builder(); builder.scheme(SCHEME_TWIDERE); builder.authority(AUTHORITY_MUTES_USERS); - builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_ID, String.valueOf(account_id)); + builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_ID, String.valueOf(accountId)); + final Intent intent = new Intent(Intent.ACTION_VIEW, builder.build()); + activity.startActivity(intent); + } + + public static void openScheduledStatuses(final Activity activity, final long accountId) { + if (activity == null) return; + final Uri.Builder builder = new Uri.Builder(); + builder.scheme(SCHEME_TWIDERE); + builder.authority(AUTHORITY_SCHEDULED_STATUSES); + builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_ID, String.valueOf(accountId)); final Intent intent = new Intent(Intent.ACTION_VIEW, builder.build()); activity.startActivity(intent); } @@ -3294,26 +3316,26 @@ public final class Utils implements Constants { final int retweetHighlight = resources.getColor(R.color.highlight_retweet); final int favoriteHighlight = resources.getColor(R.color.highlight_favorite); final boolean isMyRetweet = isMyRetweet(status); - final MenuItem delete = menu.findItem(MENU_DELETE); + final MenuItem delete = menu.findItem(R.id.delete); if (delete != null) { delete.setVisible(isMyStatus(status)); } - final MenuItem retweet = menu.findItem(MENU_RETWEET); + final MenuItem retweet = menu.findItem(R.id.retweet); if (retweet != null) { ActionIconDrawable.setMenuHighlight(retweet, new TwidereMenuInfo(isMyRetweet, retweetHighlight)); retweet.setTitle(isMyRetweet ? R.string.cancel_retweet : R.string.retweet); } - final MenuItem favorite = menu.findItem(MENU_FAVORITE); + final MenuItem favorite = menu.findItem(R.id.favorite); if (favorite != null) { ActionIconDrawable.setMenuHighlight(favorite, new TwidereMenuInfo(status.is_favorite, favoriteHighlight)); favorite.setTitle(status.is_favorite ? R.string.unfavorite : R.string.favorite); } - final MenuItem translate = menu.findItem(MENU_TRANSLATE); + final MenuItem translate = menu.findItem(R.id.translate); if (translate != null) { final boolean isOfficialKey = isOfficialCredentials(context, account); final SharedPreferencesWrapper prefs = SharedPreferencesWrapper.getInstance(context, SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); final boolean forcePrivateApis = prefs.getBoolean(KEY_FORCE_USING_PRIVATE_APIS, false); - MenuUtils.setMenuItemAvailability(menu, MENU_TRANSLATE, forcePrivateApis || isOfficialKey); + MenuUtils.setMenuItemAvailability(menu, R.id.translate, forcePrivateApis || isOfficialKey); } menu.removeGroup(MENU_GROUP_STATUS_EXTENSION); addIntentToMenuForExtension(context, menu, MENU_GROUP_STATUS_EXTENSION, INTENT_ACTION_EXTENSION_OPEN_STATUS, @@ -3599,13 +3621,13 @@ public final class Utils implements Constants { public static boolean handleMenuItemClick(Context context, Fragment fragment, FragmentManager fm, AsyncTwitterWrapper twitter, ParcelableStatus status, MenuItem item) { final UserColorNameManager colorNameManager = UserColorNameManager.getInstance(context); switch (item.getItemId()) { - case MENU_COPY: { + case R.id.copy: { if (ClipboardUtils.setText(context, status.text_plain)) { showOkMessage(context, R.string.text_copied, false); } break; } - case MENU_RETWEET: { + case R.id.retweet: { if (isMyRetweet(status)) { twitter.cancelRetweetAsync(status.account_id, status.id, status.my_retweet_id); } else { @@ -3613,19 +3635,19 @@ public final class Utils implements Constants { } break; } - case MENU_QUOTE: { + case R.id.quote: { final Intent intent = new Intent(INTENT_ACTION_QUOTE); intent.putExtra(EXTRA_STATUS, status); context.startActivity(intent); break; } - case MENU_REPLY: { + case R.id.reply: { final Intent intent = new Intent(INTENT_ACTION_REPLY); intent.putExtra(EXTRA_STATUS, status); context.startActivity(intent); break; } - case MENU_FAVORITE: { + case R.id.favorite: { if (status.is_favorite) { twitter.destroyFavoriteAsync(status.account_id, status.id); } else { @@ -3633,15 +3655,15 @@ public final class Utils implements Constants { } break; } - case MENU_DELETE: { + case R.id.delete: { DestroyStatusDialogFragment.show(fm, status); break; } - case MENU_ADD_TO_FILTER: { + case R.id.add_to_filter: { AddStatusFilterDialogFragment.show(fm, status); break; } - case MENU_SET_COLOR: { + case R.id.set_color: { final Intent intent = new Intent(context, ColorPickerDialogActivity.class); final int color = colorNameManager.getUserColor(status.user_id, true); if (color != 0) { @@ -3656,16 +3678,16 @@ public final class Utils implements Constants { } break; } - case MENU_CLEAR_NICKNAME: { + case R.id.clear_nickname: { colorNameManager.clearUserNickname(status.user_id); break; } - case MENU_SET_NICKNAME: { + case R.id.set_nickname: { final String nick = colorNameManager.getUserNickname(status.user_id, true); SetUserNicknameDialogFragment.show(fm, status.user_id, nick); break; } - case MENU_TRANSLATE: { + case R.id.translate: { final ParcelableCredentials account = ParcelableAccount.getCredentials(context, status.account_id); if (isOfficialCredentials(context, account)) { @@ -3688,7 +3710,7 @@ public final class Utils implements Constants { } break; } - case MENU_OPEN_WITH_ACCOUNT: { + case R.id.open_with_account: { final Intent intent = new Intent(INTENT_ACTION_SELECT_ACCOUNT); intent.setClass(context, AccountSelectorActivity.class); intent.putExtra(EXTRA_SINGLE_SELECTION, true); diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/AssetFontTextView.java b/twidere/src/main/java/org/mariotaku/twidere/view/AssetFontTextView.java deleted file mode 100644 index f98328760..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/view/AssetFontTextView.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.mariotaku.twidere.view; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Typeface; -import android.util.AttributeSet; -import android.widget.TextView; - -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.view.iface.ICustomTypefaceTextView; - -/** - * Created by mariotaku on 14/11/14. - */ -public class AssetFontTextView extends TextView implements ICustomTypefaceTextView { - public AssetFontTextView(Context context) { - this(context, null); - } - - public AssetFontTextView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public AssetFontTextView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AssetFontTextView, defStyleAttr, 0); - final String path = a.getString(R.styleable.AssetFontTextView_fontPath); - if (path != null && !isInEditMode()) { - setTypeface(Typeface.createFromAsset(context.getAssets(), path)); - } - a.recycle(); - } -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/HandleSpanClickTextView.java b/twidere/src/main/java/org/mariotaku/twidere/view/HandleSpanClickTextView.java index 6548c72e8..6839ac991 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/HandleSpanClickTextView.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/HandleSpanClickTextView.java @@ -21,7 +21,6 @@ package org.mariotaku.twidere.view; import android.content.Context; import android.support.annotation.NonNull; -import android.support.v7.widget.AppCompatTextView; import android.text.Layout; import android.text.Spannable; import android.text.SpannableString; @@ -29,7 +28,9 @@ import android.text.style.ClickableSpan; import android.util.AttributeSet; import android.view.MotionEvent; -public class HandleSpanClickTextView extends AppCompatTextView { +import org.mariotaku.twidere.view.themed.ThemedTextView; + +public class HandleSpanClickTextView extends ThemedTextView { private boolean mLongClickPerformed; diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/HomeSlidingMenu.java b/twidere/src/main/java/org/mariotaku/twidere/view/HomeSlidingMenu.java deleted file mode 100644 index 19e0894b2..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/view/HomeSlidingMenu.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.mariotaku.twidere.view; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.graphics.Rect; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.view.ViewPager; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.View; - -import com.jeremyfeinstein.slidingmenu.lib.CustomViewBehind; -import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; - -import org.mariotaku.twidere.Constants; -import org.mariotaku.twidere.activity.support.HomeActivity; - -/** - * Created by mariotaku on 14/10/21. - */ -public class HomeSlidingMenu extends SlidingMenu implements Constants { - - public HomeSlidingMenu(final Context context) { - this(context, null); - } - - public HomeSlidingMenu(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public HomeSlidingMenu(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - @Override - public boolean dispatchTouchEvent(@NonNull final MotionEvent ev) { - switch (ev.getActionMasked()) { - case MotionEvent.ACTION_DOWN: { - final boolean isTouchingMargin = isTouchingMargin(ev); - setTouchModeAbove(isTouchingMargin ? TOUCHMODE_MARGIN : TOUCHMODE_FULLSCREEN); - break; - } - } - return super.dispatchTouchEvent(ev); - } - - @Override - protected boolean fitSystemWindows(Rect insets) { - if (isInEditMode()) return false; - final HomeActivity activity = (HomeActivity) getContext(); - activity.setSystemWindowInsets(insets); - return false; - } - - @Override - protected CustomViewBehind newCustomViewBehind(final Context context) { - if (isInEditMode()) return super.newCustomViewBehind(context); - return new MyCustomViewBehind(context, this); - } - - @Nullable - private ViewPager getViewPager() { - if (isInEditMode()) return null; - final HomeActivity activity = (HomeActivity) getContext(); - if (activity == null) return null; - return activity.getViewPager(); - } - - private boolean isTouchingMargin(final MotionEvent e) { - final float x = e.getX(), marginThreshold = getTouchmodeMarginThreshold(); - final View content = getContent(); - final int mode = getMode(), left = content.getLeft(), right = content.getRight(); - if (mode == SlidingMenu.LEFT) - return x >= left && x <= marginThreshold + left; - else if (mode == SlidingMenu.RIGHT) - return x <= right && x >= right - marginThreshold; - else if (mode == SlidingMenu.LEFT_RIGHT) - return x >= left && x <= marginThreshold + left || x <= right && x >= right - marginThreshold; - return false; - } - - @SuppressLint("ViewConstructor") - private static class MyCustomViewBehind extends CustomViewBehind { - - private final HomeSlidingMenu mSlidingMenu; - - public MyCustomViewBehind(final Context context, final HomeSlidingMenu slidingMenu) { - super(context); - mSlidingMenu = slidingMenu; - } - - @Override - public boolean menuClosedSlideAllowed(final float dx) { - if (mSlidingMenu.getTouchModeAbove() != SlidingMenu.TOUCHMODE_FULLSCREEN) - return super.menuClosedSlideAllowed(dx); - final ViewPager viewPager = mSlidingMenu.getViewPager(); - if (viewPager == null) return false; - final boolean canScrollHorizontally = viewPager.canScrollHorizontally(Math.round(-dx)); - final int mode = getMode(); - if (mode == SlidingMenu.LEFT) - return dx > 0 && !canScrollHorizontally; - else if (mode == SlidingMenu.RIGHT) - return dx < 0 && !canScrollHorizontally; - else if (mode == SlidingMenu.LEFT_RIGHT) return !canScrollHorizontally; - return false; - } - } - -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/LeftDrawerFrameLayout.java b/twidere/src/main/java/org/mariotaku/twidere/view/LeftDrawerFrameLayout.java index 6dd2c8e7b..f0981b0a9 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/LeftDrawerFrameLayout.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/LeftDrawerFrameLayout.java @@ -1,18 +1,18 @@ /* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2014 Mariotaku Lee - * + * 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 . */ @@ -20,11 +20,6 @@ package org.mariotaku.twidere.view; import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; -import android.support.annotation.NonNull; import android.util.AttributeSet; import android.widget.FrameLayout; @@ -32,10 +27,6 @@ import org.mariotaku.twidere.util.ThemeUtils; public class LeftDrawerFrameLayout extends FrameLayout { - private final Paint mClipPaint = new Paint(); - private float mScrollScale, mPercentOpen; - private boolean mClipEnabled; - public LeftDrawerFrameLayout(final Context context) { this(context, null); } @@ -47,41 +38,5 @@ public class LeftDrawerFrameLayout extends FrameLayout { public LeftDrawerFrameLayout(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); ThemeUtils.setupDrawerBackground(context, this); - setWillNotDraw(false); - mClipPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); - } - - @Override - public boolean hasOverlappingRendering() { - return mClipEnabled; - } - - public void setClipEnabled(final boolean clipEnabled) { - mClipEnabled = clipEnabled; - if (!clipEnabled) { - setAlpha(1); - } - } - - public void setPercentOpen(final float percentOpen) { - if (mPercentOpen == percentOpen) return; - mPercentOpen = percentOpen; - if (mClipEnabled) { - setAlpha(1 - (1 - mPercentOpen) * (1.0f / 0xff)); - invalidate(); - } - } - - public void setScrollScale(final float scrollScale) { - mScrollScale = scrollScale; - } - - @Override - protected void dispatchDraw(@NonNull final Canvas canvas) { - super.dispatchDraw(canvas); - if (mClipEnabled && mPercentOpen > 0 && mPercentOpen < 1) { - final int left = Math.round(getWidth() * (1 - (1 - mPercentOpen) * (1 - mScrollScale))); - canvas.drawRect(left, getTop(), getRight(), getBottom(), mClipPaint); - } } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/NameView.java b/twidere/src/main/java/org/mariotaku/twidere/view/NameView.java index 23e31f6a4..ea2acf2b7 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/NameView.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/NameView.java @@ -30,14 +30,14 @@ import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; import android.util.AttributeSet; import android.util.TypedValue; -import android.widget.TextView; import org.mariotaku.twidere.R; +import org.mariotaku.twidere.view.themed.ThemedTextView; /** * Created by mariotaku on 15/5/28. */ -public class NameView extends TextView { +public class NameView extends ThemedTextView { private boolean mNameFirst; diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/ShortTimeView.java b/twidere/src/main/java/org/mariotaku/twidere/view/ShortTimeView.java index 3c8f2a08c..4a9415719 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/ShortTimeView.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/ShortTimeView.java @@ -24,17 +24,17 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Handler; import android.os.SystemClock; -import android.support.v7.widget.AppCompatTextView; import android.text.format.DateUtils; import android.util.AttributeSet; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; +import org.mariotaku.twidere.view.themed.ThemedTextView; import static android.text.format.DateUtils.getRelativeTimeSpanString; import static org.mariotaku.twidere.util.Utils.formatSameDayTime; -public class ShortTimeView extends AppCompatTextView implements Constants, OnSharedPreferenceChangeListener { +public class ShortTimeView extends ThemedTextView implements Constants, OnSharedPreferenceChangeListener { private static final long TICKER_DURATION = 5000L; diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java index 06bf93d73..b1678921e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java @@ -3,7 +3,6 @@ package org.mariotaku.twidere.view.holder; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.text.Html; import android.text.Spanned; @@ -170,15 +169,14 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi nameView.setName(manager.getUserNickname(status.quoted_by_user_id, status.quoted_by_user_name, false)); nameView.setScreenName("@" + status.quoted_by_user_screen_name); - final int idx = status.quote_text_unescaped.lastIndexOf(" twitter.com"); if (translation != null) { quoteTextView.setText(translation.getText()); } else if (adapter.getLinkHighlightingStyle() == VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) { final String text = status.quote_text_unescaped; - quoteTextView.setText(idx > 0 ? text.substring(0, idx) : text); + quoteTextView.setText(text); } else { final Spanned text = Html.fromHtml(status.quote_text_html); - quoteTextView.setText(idx > 0 ? text.subSequence(0, idx) : text); + quoteTextView.setText(text); linkify.applyAllLinks(quoteTextView, status.account_id, getLayoutPosition(), status.is_possibly_sensitive, adapter.getLinkHighlightingStyle()); quoteTextView.setMovementMethod(null); @@ -326,10 +324,7 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi nameView.updateText(); quotedNameView.updateText(); - } - public CardView getCardView() { - return (CardView) itemView.findViewById(R.id.card); } public ImageView getProfileImageView() { @@ -504,11 +499,13 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi updateOptions(); } + @NonNull @Override public MediaLoaderWrapper getMediaLoader() { return loader; } + @NonNull @Override public Context getContext() { return context; @@ -519,6 +516,7 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi return handler; } + @NonNull @Override public UserColorNameManager getUserColorNameManager() { return manager; diff --git a/twidere/src/main/res-svg2png/drawable-hdpi/ic_action_cake.png b/twidere/src/main/res-svg2png/drawable-hdpi/ic_action_cake.png new file mode 100644 index 0000000000000000000000000000000000000000..de39a3d1f8f2114cd4d70a6cf6c059395203c8f8 GIT binary patch literal 540 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCg=CK)Uj~LMH3o);76yi2K%s^g z3=E|}g|8AA7_4S6Fo+k-*%fF5lwe7B^mSxl*w|O|J8&|P&sZGf?!>U}oXkrghb_t5 z-G$*l2rk&W93;(I;1OBOz#uUjgc&_co2P)Zc)B=-RNP8VkYHV$Akxzm=)jn;Z0W=Q z|No0;W@P-he&fcE_OLR8ixv&H8h6Z?CT4Ka;0td<2$MiK!%ZP)L$+UyGgvz+7Z@6r z*f8*XEKqpbpfZI)WV3{q;e=*aoobEB15F+q9bY$EM;tNZQRNq5_{gqe*I_$ZOw91o z28pK(K?~04FdWI2l$4y`vrYPi4D(lqRg9-{8ICzT4#@GkAY;(`LWRXgZNV}pQ-OAd zjeMQAwljR>Nw{>&YJ%YeKHuk7DKEY)$fLESX-eal20l@n1cNB9-l_x* z(Zv_~IxV;KUUpC|Z#YxQc*MK$=qvGAl?*R_ybRH*EMT1QIJ#lpizQV;OjdD?$NJJ6 zzRkC8D0_K9iNEEtVW#!vL(DQIUm6Z%7+Sq*4CD`3D90d{&gXDS?o?@lgKX|%RSSlr z3IzfY`Z5QWPH1g#{1&n%*OT!?IGapWG;W&EWAY&I}i8(N24Y=G6YAoPoV35-Z VZGWy^_YoK;44$rjF6*2UngDMR$EN@Q literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-hdpi/ic_action_link.png b/twidere/src/main/res-svg2png/drawable-hdpi/ic_action_link.png new file mode 100644 index 0000000000000000000000000000000000000000..3de877f733dc19208bc31b508123c52577edb04d GIT binary patch literal 669 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 literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-hdpi/ic_action_time.png b/twidere/src/main/res-svg2png/drawable-hdpi/ic_action_time.png new file mode 100644 index 0000000000000000000000000000000000000000..e021d8127db7f7e18ba70d8c8c586b980781f86f GIT binary patch literal 972 zcmV;-12g=IP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00004XF*Lt006O$eEU(800001 zb5ch_0Itp)=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L02rG902rGANp*vi0009c zNkl z@CBdthfy2?N?y?h`c1T(<~=gV_FU(^5=eF_Od7dOlItaMn;qJd@w33VuMdL+iqnAO zg8d*hu9X1K{*+KOUk-%4vF(VV`a&5S{q}*ssU12n=?8Aoa4%oJ) zdPW5$P!SSJ;sbo zU`^C*h0wSPjPZ%Q!K;x6iANrB-gey;v=JzX`f!LCPZ=iVMtOFtqr4get~7nfW6a0| z-T|8;SFuBor~(&-TdmOwi6#^B4vla6R)F)Kyim>ajDCpDZCS6sfI+38vu^-4*zbyBFvwJxg+ z%KfzS%n!TL^sGuhVNT-nfP4l?0k2dxHeXm?yNrLPYJBKt6+TgyTr1(k?gD45W#Q*^ z_;qufA8qiCbPH{7w&G!Hl2@c7WEVv6DvW>Ll9xFq(a9k&#VJD&sqz&v#}}DI%LuqO uufzsFs=(S3|+xDg{pj2JQUU&t23tOem;x5sDz0000jA5L~c#IY^qbz$3Dlfk9$62s3(?HctTxZuE3<45_%4oFKuvIH7^jSasI_|Nr0L zzi{Ee?Hf0K^u!p?(AY4C+2boip}p$7ghdYdb^@yzHu7FDe8~K;fk`H3m*oR?q2K2n zS`RQQ>|;7IRoR&Te|uBoDb^6i9+e;0*gQ;`H!?FWjdsXvnmF+z*H-5QE5T{a4g3Pz zFDr4Ccm%vQPPug8fnSS?ip?fr72&BuayL0Ab#`&~uVJyA#lfDgw_r=t!Awa3o?QYU c7am|_xFc*BX|&$^6VUMtp00i_>zopr0EV-4{Qv*} literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-mdpi/ic_action_link.png b/twidere/src/main/res-svg2png/drawable-mdpi/ic_action_link.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4b6251a44e976c51b83510c63b89b74e830c05 GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=k0Y$sR$z3=CCj3=9n|3=F@3LJcn% z7)lKo7+xhXFj&oCU=S~uvn$XBD8Z8M=jA5L~c#IY^qbz$3Dlfk9$62s3(?HctU+k@IwM45_%4oFKuvI6}e}aE&pERphJ#L+EFD-`lJTcFafiI;fg|n0emiK+%Mw?Tt6s?-nr~VCV>L z_+fLQr(%;6!-|WH9&gzn={wl4cccq_;++&Hs4$i1h_1sQ_72{{m#GJn{YmrpuUC3MkkynFcWO9%k5O;qjJJq3lTd gPYq~TI5IMjA5L~c#IY^qbz$3Dlfk9$62s3(?HctU+Y4UV&45_%4oFKuvIAIC1Taf9W|Nr9| zJeD$Vb`jIu?T)t`me-@=Yjm3@&b-mHB{0AY0+1qvjvO3y(xE9Fc5r z=D+Hcz$s=pL0PE5f~DPkTF_a>11{Udy-gl4TQ^j_3ovGJSkT(S67BWYg@gN&vCE3t z&2wB=K4Vz0P+|Vlq?40gL~fimCFg`sS5gA&XO@VI9gH*6ET)7o$nKgi_LRYh;plr& z8P0sAwOmS1Rxp@aBwh46tR7%EiP6|{Rzu)NCJE8=3s?m-e19;>mNn<`HCR1Tx*)jV oP=@4%PhS_Wy&Y)4b%K>a(>iJ2$BEaU1EYw+)78&qol`;+09_`?xBvhE literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-mdpi/ic_action_settings.png b/twidere/src/main/res-svg2png/drawable-mdpi/ic_action_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..e058f0d3bd50ec2eeeff8198aaacaec3660cb477 GIT binary patch literal 617 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=k0Y$sR$z3=CCj3=9n|3=F@3LJcn% z7)lKo7+xhXFj&oCU=S~uvn$XBD8Z8M=jA5L~c#IY^qbz$3Dlfk9$62s3(?HctU+IpFEy7*cU7IYEMTal#U2w<43j|Nrlo z@c6ob)7`+xXr0Pc9W^7_cMYy*+GLtfls0fpOq$}#Xs{x(;YyamKgJ`*jX#(KrZX3E z3T$4W`Jd^Cu7ize$J<5==8pLci&ZBJv8ynzwDfRNXfF`>AhJtJe1Y<}NiwVsr&$|9 z*k>8A3oh(hm&RqH;_1hH)j_Ap{U4{mdd5e*4u9DCt#}puj;o$*a(^sqQ{>%XAu6%O zeu5MCl(3i$EB-Pc;V+Op(&N2oTo@il( zsSYlh96_fWmztbm?0T%bV8+J?Ii4lk5>9dk9r*E#;n?rEElk;ZV(cCag)#wu0~h>q zU-FDe+~(&#rVLGwe+*Z6_%q55vpHBEk@Ehf@S?#@p^q_1PUe$ZfDcDQ(IJ@8Mzq literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-mdpi/ic_action_time.png b/twidere/src/main/res-svg2png/drawable-mdpi/ic_action_time.png new file mode 100644 index 0000000000000000000000000000000000000000..054e55a76287a7c2e15430b85f562246a0005d04 GIT binary patch literal 678 zcmV;X0$KfuP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00004XF*Lt006O$eEU(800001 zb5ch_0Itp)=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L02rG902rGANp*vi0005~ zNkl@24!WuYj^!ir`w3&H|54Vg!?6{WDDC_f8| zEGSv%H4CN8LQ<2|6lI|(3#G<)>zjIE?tAlQth`fS-+T9+cg}a;J?Gx%ayjPMe>ahh zb1Iecfc!u+Pyu-P=n04er$UI>p9nzm2GAT(X5xAU%tOd!UIcK~lfVdv9)LYS2c9`r z3iyCNew9yP79uwCAwUBSrGo-n2>hABw-7W6jBzMzCPJ7bZv(9|d5_ig#d`tJGT-Y| zEr(kXM9wD6+t6>x;qwTL|Cp5!2cShjF5iqwtXuIcz_qw;7 z0xE$E_ziQ@GFl1w(T;#SvQJTHTOe8C`xJ8y5q^V_1e}ojOsf42n8IZ%@CvjW zw(xGc9orEgXZ0dy$b-nN?c#tGG0mZV9$X1kCz)-PDvlf zgFqGiSAd0l{*VM&=|vVcpD4r~{lzbtOx~gRC6k?V$aBCk#~ia{U-fIKhtPJ=PXGV_ M07*qoM6N<$f{Q^KG5`Po literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-xhdpi/ic_action_cake.png b/twidere/src/main/res-svg2png/drawable-xhdpi/ic_action_cake.png new file mode 100644 index 0000000000000000000000000000000000000000..b131b3a35d15ffcd4e07ab43208c142e43b88d6c GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=3dtTpz6=aiY77hwEes65fI(JB|KR`;x9@F^4neL0 z94tbHLPuB@3AqPE*f2SAa7^0Db!5^%2_B)w0|)&TIGW}-O`Nj+q{p#CVotxm-77oq znK$dLYWDlg{Ob3&vKWDuHTX_*dbdaCbhFOsu+KL2+@(Bk8&2wHUk(>h^mnp;u+LvK zy36*Yg^{WQ=lbko%THI&e&{kNW{uIFH1YiGE@NS)l4a#vE&rvy^vaeNTh}m|^M1H$ zL89Y+EE_HZW@+vBHdN`=JFvvA?IDqwNZ$9v2_M8{OzaP(5 h^I`yn5d(wTPo`xDf?vGpv{nUiJzf1=);T3K0RZ+~((3>K literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-xhdpi/ic_action_link.png b/twidere/src/main/res-svg2png/drawable-xhdpi/ic_action_link.png new file mode 100644 index 0000000000000000000000000000000000000000..8c9bab5147bd1fb4f0833f4fdb0a66134ea67fe0 GIT binary patch literal 740 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=3dtTpz6=aiY77hwEes65fIQ1-=2H#?Y-8&^&g(!eRt#czVCOx-~0XUXi|%S6Ne&{oS$AV*UFXaU z4zHb3Y>W7BANCPl<(Pkg_us!Oy!Ri+O8n88C7faMWct)gvzoRgeiwbq$MjKX$>n_t z`Lb3=p3ZGNXl=-7d#HV_2NOfz!kYGU-?^Leio6QVYs*eNaGIbHVRyfd@9feYcP}tj zx^uT8ffiGEY} z^=X_V@rT_cKkGvk`^v?Ujr(q0XJJuGR$}OW^j%LTOX~i9U2oQZ9(UplHuCm$A6@rk z;<~Z}jk|m=PvSVVqm##D+j9Fqzxy^!Sly91!DJ_|)-Pq<3hyel{sU(S2oa9oD()THM8h3N;T{)p{R;@)z0Pka7CmIWH8f004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00004XF*Lt006O$eEU(800001 zb5ch_0Itp)=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L02rG902rGANp*vi0008- zNklaM1xK64_E>h!!X=DQv$&7J~S`E>&!>K zgA)*o zUwuG(i+=)OVNGZv2dC-_Up=6M+?0c5a1gu!UIQP2Ys_amA@)_NMK=iw(8ug&5~3K# z+F|mjgHekV_6|R{@?ea*1)Fxx5s>WO7e4 z{-30L!kGY)dB9I*zxNQ~F69EN_-*Qj+w|tS$6Hxy(PH-jFytbd9ib99^X)^pcJD%f z&hP~X8+Xy?a=7R~fH`jkfERp|+@MmhggMrI_JHGJ#};0BeIb%?Q5#-RvT;o=E&x?} zHoPGAJrzFb1uKH%eX;eC#EJmq1*1a4nd7x!Yg1{oHEEJcnQ`GU1ml0WT9>O3NS+E=H^b8~{-etUITe81 zy8kcx!HQt=004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00004XF*Lt006O$eEU(800001 zb5ch_0Itp)=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L02rG902rGANp*vi000AR zNkl;naP`Z z-^{&vZ_aT90)apv5C{YU!T$)?=46YDi+yOaA;Yq+>kimj(+Z2udkW4I`Z2by<^%xN zX^i!1Q2;L?v1(EPPXt&lw*Ugx4m921G&qC^J{9QCpg9ZXzy?LLGvHNl1olcx%t!X> z!E5OMmYM+U+?T+PO@M>o6L1fIZZ@2PoIApU|V{|eKnmGp96MzFzTNS1BomkTv znJ%4!<=3f!_11fg^bnimlkJIgo27+-h)GQR`h>5%Vx7&Zs5VU+-*iysjd_>8VK zEOIvRcgi8&K-}ACAA`FLZ;PK+u0cKpqnbf*6pkNJuuYrtR#OCW{2=U4Scw6ch>q`8 za7tr=XB2JIPLfayinia;T1=cLtTa8#`F#F&E|+_VkE_8gA;WW6;Cl_*bFfW$#`ch* zcfjMYJr^a(Fi#_0m$JQMIJSpEg4c7ycyXaZe*yD%RZBIP2@$GbV6&Ly=A}^%n?&_x zBS0x6vYS+cVVT{0>H^S}1zuO!jTQs*VgKV{?(?ZVh+y(YPFnUV45t{dA^5ma!8Sdd zd{=xxc?7m|K(-uYay-s!^ECvWOgskg@y$Bb1zOWZYe5hqjH7u~MFI@#z5~RO2XrW8Yc@bZ?~3U^ zN38}|;p5Jf1?a@?e@LYo1a9&@?2p_O*@waV9NBvu^Vj2F&fgzHzJjN~6JVpSpN{=d zDw$y5b%>mt=IB1|zvub)gG=m4M&nph&M@G=*ZKXwm2Huz9i|T{zS`?rtC%|!@DvY~}0Jz`?1OkCTAP@)y0zrcK0|TP`A8iif Q?*IS*07*qoM6N<$f_Xf?ssI20 literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-xhdpi/ic_action_time.png b/twidere/src/main/res-svg2png/drawable-xhdpi/ic_action_time.png new file mode 100644 index 0000000000000000000000000000000000000000..b18c53c95971a17b11ddd8ac229a7da27b449dbc GIT binary patch literal 1310 zcmV+(1>yRMP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00004XF*Lt006O$eEU(800001 zb5ch_0Itp)=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L02rG902rGANp*vi000Da zNkl`@1 zQK4lKC>W&~QBjel7!e3Y`w&Fg&y!2LBC+6uv}E7Gvv`?i-Q9cV-d$-9e9X?=yR&n? zIdkUBnKcY8TC`}OPAfew%{KBEYL;@K!Ffhr)^W_M&6jX)=eh-N$iP@ZP{BAdBN z83K-hgu#p@0Ls^*sGa7O0XFOJzzEN-!Tul*COjK%j3NMv=kTnTNgj^^ zmw|2!d^81zxtEtwj^veQ;GBvjFMWpiL#P@I)Gt8xtNv#NFK_xr#3e7=|XxJe+v zi}rpz54uhOl&9^j3&<8`z7)#;RK2@E$q^{qhmSjfIozBD6r;Tz&;MBIH_OJDDuq3s zf|UbMK9nSZ!!e}b8$OxVe@tlS*kx6TEQ_pA#x%>t?g z(+^4p<)qN=GG?mhbI9!)0VR^zA9qW8US=&q^F~()fT>ZGw#d{(Gw~=5C)p06zJ?E9 zj$43NsK0S@_Jv^SqY%`scY}bHLj6e^^BLlA7r8-zc*^^lMgoR}dR{sR2&IvLaDuTp zLO_9JEv8F?(~ZsPNKj=SVX?)pM(v(%tq>5BM1^*xmrj)yqPh7(eb@~G!gd`GOD!i$ z42~-4NZrpT%w%O=g0VSo0T4^(3*T`U#af`vWXcp^wSt6uKw%QyEV1j5tq>4M5EiFG zLIgO0kK2WQ*8#6V!bwiIB^#0l+#sM&jKMKTTd6h99F@|k4v3f>+F{@=`rjsToD}vJ zCm5T00x;MC!PF=xut7m+8wJ{VS#$_{`zpy-b_n$WD_gSFZLmkEpR#KOCL%_GI<|;_ zF?BIwp8Z_o-#lcmo5$g6!X8{GnGr+LvM85il@A$H_lgED8%y~J%UNN}!g&c4eP@dNPEvtQ6&IcN_Mv;AyL+o8cBG{y63IpQI>4 zq&q~fk$S$4mdP{VMzZ&f8ApIXMzN9jZ*qk9zzen+a07*qoM6N<$f_oN9NdN!< literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-xxhdpi/ic_action_cake.png b/twidere/src/main/res-svg2png/drawable-xxhdpi/ic_action_cake.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccf823702fd3e470599363d0fdcffd76b4ace9d GIT binary patch literal 735 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGo3dtTpz6=aiY77hwEes65fI|F_)NAm6~it(itUKY31C;~Hope*EL^mB$}Q-ubb4ljZas zCOd^I*{=U}Nb+2yX=El~aP!`Nh1rYe&A;`s!{I=S#l#g~Yrd=U2^!42Cx0Ss`T2Fp zH@9~%{N;%%xhhi9#jtm8yzaKMimuz1_%Jj6^0U63+#|r!b24t%jeqXWu?rLx>YaR3 z1t(10wQLi|i4$KqQtJgK*soWfQtRaKFQz}>8zbY-V#SZsmVS)AzSq&=oX6t2Q)!`( zDm@Ih=3ig(nqhI?i6e!71YIvqt@+~@%>P-)SV&(e{Z*8rC@TYlO?yb+;q(41DDsJMgHMcF8qEw@}ouye>RD}Yz2Rf{E zVXBd4WndC$V3@_g$icv(z|iHGZMLN$q&Ut;C-rSs&YwlWXDcrjnk-vW>gRZu%VeKY z36O2;yLZ3N%4d5nOxtwLlqt&ZD~GR;KuCbYT@}WyTwEV~g%~&-7!<%x2O19Id`Vm* zZPXkmzIC18@e12%f(Jxe7#tXwU@-}#7wr1OgTe~DWM4fhu9Ih literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-xxhdpi/ic_action_link.png b/twidere/src/main/res-svg2png/drawable-xxhdpi/ic_action_link.png new file mode 100644 index 0000000000000000000000000000000000000000..422ae550995e6327afee5b20957c6ce539516a6c GIT binary patch literal 1014 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGo3dtTpz6=aiY77hwEes65fI%E%<=V?E?l_q z;K73h4<1}dxFB#v=;D)r1pyZqnM?`!!otq#-0IM7E+L{Sa#KK6CorEEx{o4*{N$XvARY_YeI=F3hE#_H@Q zd!@)J>*8}l6yjvM7)~gh{E^3{rYCbx7M{=jJ*n8$Uf7Du?8%C@e7)7LHmb~= zCOB2%b?+DR=l0WLKHk}+de{G$41>09@x0UKOaBycwZ@m}WX$*!Bd5E`^{tM@Z|`}h zyH{G=-}}PXTw`(Y#%&AJZN6TH!CpGx>vTY5*DZb<%Y^F7WhEo#fwx7rJCUpD>Y@m1Gn*X?~5zKiANRx?!D*w(*# zvn?b0HuHn(O3%4}CoJ7*s1w|5?cNLW<&o2G4>;-hzL zo$z*5_7M|kRe}H)L(Mf>;xXMny>NQCi_Gm z{Q9dt?{q3_qQ=5E`zQYVzV(#rxzG}6tNB;&+iy%i>-I+bpx>uEek=4R=ET1aT&Q2o z*khosZ(12~fBK%zr!fvz@|P3XJ-1!HnX&loq>_6*Rt)DBJeP8teJ8B&;E7rlP4ynr z8Rq=^`&HPZUvNA(d0%sJA6KcG%{!x)InC8;PFwu#|8M{7XRXNu+ib--@;TavrcUFY zG}ZZoTF%o?Su5=Mza>uNJ~ZQ0)6|(e&(zD_vWN-+6B65ke1mhF8;goz4yI&-(pnLIMpht*5m{@AzH{8LX{OMQ6==42ug0JqLh=Xq}KiF27h?!3!i4 z4<)^x6H^0O-Q2N!O@Cc4)?gqM=hmZ_iPuoWNRHo6wioDNwTEnk{gPFh-)btS7Nu3yl2_r1V- ze}ci1D95)!ew$G!7d1_P4C12fGfP`4Cp`Cx_p8$ol7m0RV{=|Tey7eLqt!L;{`_;*I%(QkC`xA}=t9n~IMdUUZ$*lmF`Qj4+;q12K#jRu?F~Iain#Fws+=zvGr#u0 zjVHA1*`+_nuKRJsa~R4NdYic76N$B3W?O)3KP^CNv9`BTar>ihRu~A9eEDDx)zpw~ zqYvfb9tuKv@iwkzmle@<0(^As%*GIZ4hzp6Tx%Oh}*t zQLX;yqws-g6SHZh6U2bvsX1mkQ!+efXhtdQB<(sFI=l?)Ovf%lpYV%oP;k|KhD35KtC!pCx7~clz(M0>DAGvfN9a{Snpm`FWNp0c|*0 zO^Gfj|2&V_I5}1JpF-yfTA#h>Qpvz4O#y%xPs) znz4!#QCoh4I$9VT7X}t5Tg4{u(6YhtfyNbTkTG$lQt3o8U9EqSfw#fI73p!6XMzoE z{k|EPvfO|ErH6Cit(3RxHF5sJIy67jy%v9m>e=g0 zh)q|)(tVPB5wI4MmuvH3DPl9iWz`1sN};Ir$~Zgs{wT^xSH&Jw3UU>37uy*YSyBJT bW0D4vM0RCnH+QhK4+;eO1(O>{j7$Fk92P}$ literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-xxhdpi/ic_action_settings.png b/twidere/src/main/res-svg2png/drawable-xxhdpi/ic_action_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..4f400e64642340c39874f6794e4652360a5aa96e GIT binary patch literal 1536 zcmZXUdpHw%9L9fJvu3D`iZhpIhILSGjZ`?yZF1exMKy`kBtdx)E^M zeV29FQU+`QiQ*1GG#&s36M#k8i!lj6qzM4iegN#v0zfr1_aWIzR>02Kx!VCynHIA| z=E*W7oZ?IbLb1k_EWrI;ogKj1x(XU@uh;USB%g2q)Nzp%PXQ#+(0z(8r8##mEl^dD|{(4`S7KN|Rl=0bKvt&(HUK zpGoZgaaoyH@wqUsv(K`{=?ivy7NZ00_Naz?*D87ip8B+btB`z*Nw+Ce>O~ittX|k6 z7d2>qjIHbpLXG0l+vG|EB-`1*mvs2v_X2o`fh!F1iReq2g4Rs=Q=FP0HyFBE@Xo$^ zgFHMydIWIrWweR9CqBEYZEzPR6qY7W+3Dn^%%Ysz=3!@zLQ2p59lU>Osb8`@R%JdT^ea2+wy)@kL^ZvY%mknjy(u z17dM;Z%d|p_)SJZbE71FQ*mbGB_0@6w^6Hj>CaoLC=Jd})OiyYZCwxh0&i7My_PjG zRt7)VS6^zE{rob`zW(6uk@UA6j31cQIE%;jr<+vQv?!{b*J2TsrTs^32lI?{EpXKfgEOgzh zQ;$_P{*9XS1@Sr@o7eSx%(+7VQbhxJLqdbzP?94%rO~@sWyy3!bkQ0WOo>)E5elw1 z7}V;V{K=c4keY1NRn7k{!WB%0m|rZ^-dQ)(`04`zl47rKx{BSWYCwh+wDltDZa|?o z`!bC!sC#oPp*|b4vjmsPX~it6=m8>z-f0|?(48cyh!qU+2djq{4m;P3{D~rHwh5j{ z%|o~YcEiI%LmuM7*>_U+TU8~#F_O4$CNC*tu_XAe-ea?4QP!>m2y410InXRd!PB$8 zlRH0k2{(R~t*Dldn|u+Y4|{ynQ4pWb){Khdge+OE{1s?|peo!|@<|004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00004XF*Lt006O$eEU(800001 zb5ch_0Itp)=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L02rG902rGANp*vi000K3 zNklO+DiRU z?-Z+vRxC}ln5vXup=j|>TB5c}X|$C>l?sAIkwCQvcajgmAjM$(J?{nTac}qTvNJn- zc|Uk;yF0nrdB1sY-psrmV-yO7LZMJ76bgkxp-?Ck3WY+UP$(3NT1F}fFF7+a(~8Rt zkn12#kgFlhkVY<&h2$W4zS94{OQll3C;`e@S9C8?P3}l>E0>Tx) z7?+KZZpgxje}00=7z7#Tm4N>%o?Oe*kkt;Vy9jv~vKvH9&T9go_y$~hA?qOZj;kl- z?}6+C5f|qj0Z@JiE_)#jF?T{5uzNtlkMo8AD4+cNbC3mP{>e1t6y!8VIV6AZ)$kzQ z#E}tQ+aYZgywVh83rP61rU`)JN#U=S>FY@;#~?>JikYmiE+XSD9? z09MG`W%SI*2T87bJLG{ftd1h3&8T~-W(eT8{$t3}5I1uO(vQYxExpH$?E1RHNWeQh zT1y1%;oc{KeEE7b`i!IZ>B8l$khz8vcXXM9#!{HMA)v@vBFE*jK_-*=HJwh6@+|ub zp;$Z0{EV{a5=#L0v_43kP=s90x;Q38Q0xR0`~kbg>xE*SDDxG{<`d_Fc;Ndcz|0Rq z@tZxEh0~z?KIHa*c|yCb$y%MowrvYgKKc5sUaZBWQq$}r$Auy^$9N=B7Jy#Wg3AdZ zft>6M!Dl7!XYip@&WQ zu6=ezhlIx~eYb!P!S|ETA27+m%cig zl8ciSwl!7)nuPoL1QQ^=d$W%OG}j;jxe7a*mjvY00%9BkZ0+wlLN-ZbK%B6(vnNGw z3w$IXCrr?q9T2by^<+5JF-lw`+`r%>0eRa4Rsg6+(yrDCkZ^y5zk8+az{0u(SR&wA zQ&`?EH8>7{gb~QnBm@>N2#DMTVPGFNh5XM00kd)<;gvbMrRF4Az;D9+HVYO&Buqe_ z!9Q1-LT*thx70(kS&*=nvmYvj^zP?kMdI? z?O9<;?|@}N`U~D!0A~|Ri&tGPCIe--CBkZsmL3lIxx0n?N27e_s3&5Fh5Pqb>4R;# zrG}vBjNMOHg>CeLfaAh_O6OSXa%xO_5CPE=4WdCA8kE`LWOFIfDLnk@pYWZO6>)8e z$4l^R7-jx;Nd)Tq3-Sf(rp~dL$AYIo&N-p?(>l+9u-q_$zdPcy1sEe|KTu4)(ZqyH z+!AHxeI8Jha$4(!b)mt?-^)g0(ThH0(=TPhclz|9bkTcLnEH{>`>kYi+gc5MQMgZj zbw3)q&_m^ug}x&wpHgc2ZPZ(5$=uHdL<=`V-t03MikFjvxrjtIY8-!EjUx;3#L4DQsJY zZP3t!ZN00{s9Yb`L5&|W@<$xS>ouR4DvulE0roai$Yx$)%G;Sc2-)f~m(}@kHLRFS z$iQ5T33g$#$JNl5V1Blj^7_r}Q8ly2)l_oq87aIEzc=VwA8{VoL?LRQi7>~eO3-+- z0m?rfN9A!JSw@30onEpshU%%;(=zqzaeg-I%b|S~4sJK47w~L=mPvL(@#Ar~-M3>a z>H91CSh~$pk00Y6f5w+K`+9II4XPccaBwS;QSFI}b2|2H-V#tm21PP-_S;R6MI7x& zM;FgVNLh~OPbKN=Ooc+BP$(1%g+ifFC=?2XLZMJ76bgl+_V6#z3n8742WqhZ0000< KMNUMnLSTY2Zfpnu literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-xxxhdpi/ic_action_cake.png b/twidere/src/main/res-svg2png/drawable-xxxhdpi/ic_action_cake.png new file mode 100644 index 0000000000000000000000000000000000000000..c4f1646d6c84876f13c7f57408213edd7c91e3d5 GIT binary patch literal 921 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRS3dtTpz6=aiYC!Q828LfC`4&6 zh2cL4F4(&qB+Xgi5n0T@ATb++89hszr!X)ueeiT~45_&F_O5-lh@%AigS*|Wtxc(2 zBH=88+T7hDnn5hl-j1vjIm85&Tmlr2>T!84%vhMpReg|uL96^hqgGe0i8U+}4_J1K z^9b4QwLf$2+~)%uRCYGrIhX(Jnc4eiT}(imA>c*R&N=h{BpB?73cY%B*Sh`Bs`#oT z`TxBvs1Uo=JxAS9|MByEg13?~PAl?UXHi&x(_WshzppkseTNcoDYlFe%Q>)_+p=Z?yp(X8*&+6e0!5`R(-m@^2FH>GgKL0yt}<`E@v1A zqsN`Y57Y9eEESj*&2(Yy&HW#4-`*EEYkO-t%L40d?X&mPo7%@1vMgZU{NHKwPU*$3 zn;)_&12r9+@pqQ!<8=&6@>84kt!A3A?y8FUK`9PjG`1^Flb;&SkQ z(|7Z|!4`9-2|G6F*tZ?NZMbV6Ppv(-gZUl4-1qi!_gkJ7@~NwJuX+IVc6jJjo#)S; zcUwGqxZY{EVA}sgzURwyjEp6C!VV>_{ZTpb`HP_U{|XL&x8nJ;oQdIp+J@rU2M%_; zW{aFVd7kA2b4CFM76wKK1_6c`_Kg3(e=Iw(d1vYC7yXuhPwc-`_wjYV=kC-8!)rxOiXZ&4x?Z?@uDN=_dv=8jsXcq`#F-DkPduwTK$aKN{9FW#y;bgEB zhWH#|7bqNnyalV5#fjOyGOnCaaA4V=nQmbW`ivY5ObrYQ3>>iZ2c%E_Wc-=6(%yjo Q#!Qf?r>mdKI;Vst0HgAIr~m)} literal 0 HcmV?d00001 diff --git a/twidere/src/main/res-svg2png/drawable-xxxhdpi/ic_action_link.png b/twidere/src/main/res-svg2png/drawable-xxxhdpi/ic_action_link.png new file mode 100644 index 0000000000000000000000000000000000000000..3365c4ba8a98e38df99cd90964d966c4c3e29d37 GIT binary patch literal 1377 zcmaKs|2NYM7{@=pC0}n{jd3G&DzY$2G{Yv&e7VJZX-Tu$5H_ZRLrdt(+9gTdVkZ)n zZyjF}6WjIW#yBZloNyW2x^{%ISz)uWJO4n>bKcK$-p}it=R7|>dBGP@M*0@|000>I z`}u^Zd+x6G?oroX&*)F;W=-@9IS&BTP2+A9196q?HHhTzxC?7zzn-!fkyI3#9FCrBHz@@v=@K3+< zM7^Tj-v=3%IlaOS`r~3acwmiagnGv__ue_csF8EbPTo8=2-H+E)IaSQ5uej12?^J|71n_E|xvwvD8ju+=qoP~pIm)97 z{fg=A7$aJDDLlw>a311Zag_b znBEr@%L}IB61D+civ#})Lyk3bvLdKoNJI3P_&fCR3VBf6KhN-d{8^V#6Z4RW75pN^olSSO+1CJSL> z%j?vf4E8KeDO%`w9EuyeUX#8PO3@)SXl1=QeOcOJ|6nyt;5hHe#aOAp_$`v_XI-a8 zn~OSA`(;^ed0L(NPxr>HnacvVTyk_e=1VWTABV-&CZwr zvrpO~N)32&PC1PWLD)byDQu2Qe#{jm_IY zi5kG{EexO{cax#Sk?xH5Z*|?k@jFcenJ^2Ig^a}i?wF1ulSgMMk(@Y4e?1z+&%}3; zh6KmDvGC0g@6oD!4K`DPv%;*h}Mxogw+5@-9Y-_}Ri zk}VWwNR?GU%0DYx>LA$s9`D69(ito-!q)b(Q-f;xNv=;ieRuA7BSFe1K#F-fHZb#u<2~E<&YpG4 zItEAKc<+*cVj*R>xva*2mijrV<`(kp36XT!a2Q?*C1b*-RmT&d!vhXVMoTVTj98xJ zp;=2QJl`B*y9kooq&-p4y*jwr$D}=wt;90eC$i!H{#sAb+o&C3-joh-@#0}&Up4Cn zi2foZ%14^B7Y&gACf zM!v;=17bkIj&=X3qps6(sInV_qsS+sn&GN72XOw#sa?F4&D-&pFKt&pmD}!W zp#$hI2GbX}7p>Pt69=K%*~$*^|3@8f{w-(qq@`t~V4#zGa;*LSxjH^7GD>qT+S_{+ z3Y#3A6UC)M*G!_)i+js+h|ivD=cFR|U4MB`t)SR)3&0tgUfu@;j5fSEJV|1H zd%SUeusa|V?(P9B(LD9C*YZJKzISPk%FoPUuTIYJG6xt(?qlj{;MhhHv~P6z5@S<0 zX~~Eo^H>-nuzbbk7}S|SLl5j!yXTIP)?05vo3w*kj&Fpi5w?|Kuc#uPX-jhH z`GVJnUSOH~Q?<970~T++3wnxUKKJ7pi8SGJG|OLo6^Kn~5yS)iH=b;fxx+y-4vFi9 zm^9f1mYs%RdHm}Oqr1ICJueuy85WiycO+YFC~#`Gzp`CC6OE7D_fR%V;@4BmwYmlU zjCM3^-3r1>uJ6W4czGi6Z$XQPyYwwyelIIPZBztbmz^BxA-&}%0%l~mW=8@lm69S_T zVZK9(YA(Dz1}kENBM(b-V_6;w!tD}tjK>ik-Sm_}3PJBVap zxLO?SyN}-e)T~9~owXp&6-vEA;XtKL;UB%SgL#0rdb#d*D^73K%6r1?sW*K_QCTG4 zrsi26YPj(;xdKCcmldTo{!;8&>#$|}i|YKFRY2k{%e7;0OLj&}xzmqQw=aGvHHq8) zjG9n`dFbnnRiZ}D+vJF=u1&4BYhAPXuCT=PiJno;+>0W`5HF=d?sfpbF0vXv8I=FSq2`5 zpH*K?T*mpVbP@I%G|YL3z4mHr0**P8$WcJ<~Yd6ONEb(=~0&W@@2OG zV5)xNs9)OiqA0TP#+%WeG}V0Yg8?>#!f>QdcssFkS9xdWZrv$?mZmBsJ%&xYr$}59 z1aM5wjKBSQL)BUOZjBoG^uGE@s~T3|@>J5DV_Lb~Ay3dnSlUOx)W!?1H`b}(cdIFE zajTeZVYG+nV`KJFB!2F5Hk++hlC&nr<#M^+Lkh_-vDmUJ?Hyq6hRe4(oW#anTL znCr9H+EDA5@Q?~#)3De;i_Eu3Q2zYREyaA=Jy3w)gl9}%2}-xY3n#mgj2#L?u6|NC zvWa`vopm^m(CIYye(DCSJHB#BapoY%rqBIim}$SKof zTL)pQghy$}VR&YmfM7G90wDen05f<1P{jbqN8NqtdPEq&Ladyu0C;>Wam_VP z=pnH_k=ZKogJBwR1;Sm6v`ROwzqVw|OO^f~w688G@lqrDUgP%bpxJz);&`{fkjxNO`FN(FZ^B&KnwuuY&S|*O z)cCJCW>bc8T|$6KgDCy+V_RU0TCZV7P#JAmk>{2d9s6Z$0hQaD23 z1ud?v3(-#geBe(z5up)q0N8{XO7%4U#P{Lt49JX0Y1Ww@e~VgXPR;2azbla)*SJJu zDd(;|Da_7<)C;x?u;kR+)a{gXJy;8J zT%1sRQ@2IV7Dv&$Ylo6lQjJl=+#RzHt8vZfh=YAbvu|;bpvJkKwO1WED-Uxx^MeKBcf!P^_Ls-eL#iIaKrdGGQQG4Un#lu) zi%t??8)>i9#a+w2>g5^r1bOvNdgD+gA35Az$~y^2)E_pqmx&pcMLDB|!20EYb)l`m z$d88uq|zkKz_tTN?Q0IV$t2g0wDqz*zE(Dl4KruLNA^jiDEB*EzN9VN$oG%z9=#?x z^UalQ+Gyb)hBq}^G0ZShWKPC(d~%^k`ih^v79C4IMrdMeI8Wb~xMxZW4tD)Gn|cr$ zl?Gec1vBr+&ExVbqs&Cr!rgms+slg_e`@XyUBfrqwY}{gt}|LyN9V{`(PsN}*YrfN z9%AXWgAlG>Yx=p*p4HFa57?tKgnl8De(HjMkjw^aXFgJ6T4Id*T|-+jZ|a*l0Qgj^Er*{T?Df6Im3v8_NpXo z$v9S|Xy@aE)?#Hh4jR01-TTHh#4S1{$U3vgJQI`1qK*Y}ef$DjUi$_R2jrZ8no+h< z_lML8O5}Yq!{fqUj~pRN8q&>%8j^DZ;_EpznrG`&;J=d9%PxEV69SmVi_q1>Q>gWl zgIleTjBZk3=vn2bQwf6?OOBzrvTDf}FvNiM&=0J(Zy^<+KdzKLu??Z>Pqi;;KHqxg z^Z=7XoH!=)tn5`OG`)im5nJk?7YMnaom{m)n1~qH=zBL)0m?ll=3A!1DBnVOSU?I_ zouNs6Iq*`6=l64w;k>VWY1WKuAjNe()|JPfVTMXF6jr=Fj7qYnV+;f=%@TiOPv{i6 zffLAhfqObi?BbbK60v;#F1j3Bbnq|4tF1Nt`xwUhrvbl|Y(j|c$RXk}ldCus(B6&-r+Psr|oSw4lkHUxaFueTlQBE+ND$9MY^R`<5M!rr9 z(o{Li`?-NNe@{=tH>MVRxcgOsxBX~75M0{0dUN#36PcjHWKMY@jHFV2Fuz^03Px6G z{5vjfn4liTj^U>D;VXG5gIdOaw$r=hgDSXTCJ{k3&Yy>-ieOP&ujId2zdH0oOLzC9 zxpUg*j0F1t*)qD}erhd?Sr-8_X}Fn(x}3sfz|jjH8u9t!?$MAMx}4SWM+ODeiKAHM zE_r>y3^*!-ZF?{No(u4;dH8NPtCj~t!^&zVVsvrjo}ut;3JMZRa!;Xk%cdK7uMtPz zSA&09rWS;|^d~IaFJr-Q)i>2FdL|F~5Wf~aHYmWm=oPifz^=53nHc`q!oD@KkugVk zxm&7`=&hl!9QK{(2dmbAQ8g|9Jv6_eU$eijngFBPsQ#Sm*m6NI1QRo;brwIRCl!Cx z;uPu#%46KlPmVu(+kcYd9-R$gDLOl*dA!<+?CCXl=WMR<;YmuYxG$!TPiOA(`@k5Bt4$J?E3|@j?r!>I z!q)=d>D{@@(BOsEB>A}UW%}xn%RM(~{js?ibSM%=m36d5Yo+{_{_xmrB$)y7w>=ss#OZDuamqa)YYO*KSYrRXS_n=_Dxh zGDqMIDkjQ-%$^6+lREczSVG@FJ1dJ+;2(N=zSZhA#i)YyD=Ec%#f_9Lm1nka8k&Unz2mwZH6e0JxVo+ z?8}TKL{pY5(PSy&*o9*`9Q_6Fdp+0v+}Hhlet)hz(e?sffLEFq0003Z!OZ^1DZd1T z9PJLQNAHoH^di_>13)C|=pF|EyTAAk00>0`zyb*X^m73~A}GJf4s!&+z9!Zt0Pr#` zYR`^-ltIDvcpSiB%g!GKh^H0a3^@EXMXeRTFf54hdoTb<=KT_g7#f=e0MO4wGZV+~ z&r7a>3EAeN1y5;4U~)n;siBHiL^_2uC$|5o%vgGu8GTanXYpgPyXH;hjXDm4R~&XP z6D`rz&O&`6msG;~h2SduWoMu8y;FNOE$Bri@ZBm{9&1opGTh)ahjAk23|{#C^Yh3pBh)9Y<{s!%?oz?aP{XX!Cro?RDxKr-DA}q zKD3idW@_w&x2g(J#&80WdKTPTRvM}bu!1dfxHo1#s&A(-FKUqkfwnVBEcV&-U4%ko zviGy45aUqy8PhNL@DhNN^l?YhWFu;RpNzLd1*Zs@yX0IK&YU%uU%(E;_HU>dI^oe} z==g*0d20{f|8c$U)vH&7h1)Ore)B+OA7)~6lCxXX!wwKXbpxjSJ4(J@kYj!gKVHBV zVz_xooz9i;tx|$}nSQEzfgLW{5I(PWRRla7Fs_n>&{49?ZaP_C@cc#bdPVr<7|5zlT zE;Il6leiOEZHP0s=+Sc~cYXj7^aM1^yW$lZkPed{SAExaJQLW6+aAYh>?iqwMnU*E zPiqrl3f%A-)wAn-XHH&7H|W?X)t0ZU#K(yvfPLG9HBH{0KvAQo-{wCy3ea&Ujk8zp`gZf6 zMIS%{5{$55F2d6QJ-XZe?|+Od#sKz?PYpW3KYpuOipk|-ROA8!hi-CQpvr8(w4}bT z9S#OXUgVB@4njePgKUyu8N4#a>YB*yFh?j@sd75P!EdoBa&h+gyxOV8h%cvvj33Tb zVx&@&iR>vy5w>ec^qNnd>$(;N4+g62d`|bk*d$(#@m4gzsGw|GTj$OqYg`v}5$&==`zC;U&uFTi7v(S?LIftGtVG2<2|;fbqi9y* zgRlQaRz&F3SRv424#usCu$Ds-)`m}qI!*BRKP~cVjXis_^|;EmhLT_$=@KxUdzhUXW z%wn2E$kis{%)!ntV1`1poR9WBD}^fxAlUHl=lN>Us6=q#`d`QD7UUt1LMChJ7~&;x z#_{l6=|>0>(*BsZ@2@DTlhYBbXY=>7^n6e>z+PHYpWL`6`TA8=zeb}NQaam$D_`d(^cMB( z(^%mODngs*(z;Z~fXQHv>vG14sj4Zo{+4rJ>3bANQd2dccK`BlN#CCphw;7gGprsd z2h4$B31)WBT1Ihy1&XM5ktEwRJsW{`l|uTTI~7aLc4=Q~_L2+5me<}9H?MDI;S`VHxNC4NP7|QJT9>KQwbiA*>xBT^OT2@} zXZ00KykhW16Q9k+&Bte|Bc}U!Io|7M+(fq4`>Tn6M;*P<{KSOs>#jFGovYj9svcWR zy?GoDl`Tr==&3aiuh`H3)$ zzHEJ=O5J|LbVNxuBV8FdVFqn6r8xIA+FDgg;k&JkbEU$V^F3*cM0Jxo*C`O-3;fW$0fYIM6fLT^=8M zXPSoel?2cPnW6p}E%;L1pE(Je+8dKFTapaPnZ?eB6*%(AwWVItgHzuK7g3;9Ft?Kt zW25fl*a=E=qt0^pU1bMuDf-YjTA;YTYPlZ{OaZ zDR#XkCJTaOg4*^)x7JR<$GTojkIe9T9&0_O&egI!%OqQNxLW*wmEovW(BjF!PH($u TH=WvaRDA%V`2{lujui7BT!mGz literal 0 HcmV?d00001 diff --git a/twidere/src/main/res/drawable-hdpi/ic_action_link.png b/twidere/src/main/res/drawable-hdpi/ic_action_link.png deleted file mode 100755 index 3eaacfe6f7d34e7b5a21eb8bd9b2e2a2eb959fb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 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 IM6N<$f*on8IsgCw diff --git a/twidere/src/main/res/drawable-mdpi/ic_action_location.png b/twidere/src/main/res/drawable-mdpi/ic_action_location.png deleted file mode 100755 index 0547b3c26010a6f62c321c1130db9ba526761bbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)kdg0002xNkl3#BHRyO7rI%=L6QUstX$X7?=X5ZL9-yVEDS~Qh=mi=YBpTGt zR}X&#aXR;01P4DKX=ANX;hH-Jv?(huwz%S#xgqBy%7YsmiySS5qrx9%%osCdPoZdI z9;tG`6Xr~z=;QrU(+o$Lu0qkrb7Y#Kf$1s~9n1?2j(NjeDij$LjKg6@)D((@2bT3H zDIB|evgm^ytPQCAU^NVKtPQ)Ooiq;7;%>i_@%07*qoM6N<$g2*azxc~qF diff --git a/twidere/src/main/res/drawable-mdpi/ic_action_portal_cake.png b/twidere/src/main/res/drawable-mdpi/ic_action_portal_cake.png deleted file mode 100755 index 804f114adef027543353bfea8f6d991d1cda3f98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmV;r0Y(0aP)kdg0004jNklOq)|Z_ zL}7zb1kofH4Glp3N?YpW%h)iB{`>E*mZA6opcM)S=>9 zOF)`_-xOK_GOk**U%%6yNWW{-W7HXIL%>noa{`}?%i8Ufo1XiM#I#HZD5K9CymrNJ z@7;F6oT^#d6|Jccbh~8CIV^$u4ti{h8-AEEV4E3#bk+xkF{r~!B<2kmH?8WC9SR;u zAOw7L)?T{|Dw&mdW{(Q8r-z*`4ID+3!ux(ykY)90=jz=D!}UfC1? z(r(ByfOihr>8ZcyX%rX*d~jGX{e?{ei;l^;BZg*yq9b}ur~x20W!=g^SK4J=_Y(lW zOvuTm6v^#Fj7t3lsJ8ylf k7b&A%)JTF4R)KK-0Wh!Fc>ZA_s{jB107*qoM6N<$g6E05;Q#;t diff --git a/twidere/src/main/res/drawable-mdpi/ic_action_settings.png b/twidere/src/main/res/drawable-mdpi/ic_action_settings.png deleted file mode 100644 index 7cfdb48ff8559c460a1353a8aaf4f2de7ccbd56b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267 zcmV+m0rdWfP)kdg0002eNkl;ne>uU{RL;Gm%7p z{Ex=x3G@FC;kL8DMOomkc=+FxP&`yYmG+^CPJoJ55{^j93?RY_=J>Qnp#Tc)0RWJX?47yQ R3o`%!002ovPDHLkV1iI5b@~7R diff --git a/twidere/src/main/res/drawable-mdpi/ic_action_time.png b/twidere/src/main/res/drawable-mdpi/ic_action_time.png deleted file mode 100755 index 9fca2514c8ec3924c001493e7b92531c28d7adce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmV-P0k-~$P)kdg0003HNklbeA*zme# z5SHU5&>{Nm4{Z|>dkmb> z+R7q!tHtpVutIAg47AWa~`RV<%EtK&g3f}qQuRp%Vhd6qTQ6IedmAuBp zAjK6^1}XS5I?A`9QI0#IwG%(4og0o*p7RM*zM0GA<_@mWbAG~y5>?nJ)q4H3FKt3k b175&CB^0v*cd{K900000NkvXXu0mjf;FFKb diff --git a/twidere/src/main/res/drawable-xhdpi/ic_action_link.png b/twidere/src/main/res/drawable-xhdpi/ic_action_link.png deleted file mode 100755 index e5bf2cb723828181a63d239cae34a7e2db12bd75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 739 zcmV<90v!E`P)9LMp`^E^Gz-1f}1p_{td(9p)BFo-n_9i$#65z=KOof1kh!lIKJbkIYG2Bo$R z$`TP>A|lhR4r>aw88}1OknAB*QA|NZ*TLrgZ~6Vd4|8*yr~mKS<^Os~u~;k?i$#Va zTKS3(n4{T1mLAM+RH)FH%W0nKA*(_n!*R?grjv{cg%>!C>1R0?FvloTA&_A|<`Oj$ zbqr%VNXs`8?7`$%st`-aVcJN@FTTd)ctzuQotroTyGY6(z9hi8MuR4yk$*9}NXQQs zFoJWJH#G%sa}OtAoBUuM&K*{2TC^~N^N3aQfkxmV?`TGBWEAHI`9O+p*6TT_Ub9kL4GOxk48unt%*HWBQmQpIFERoFinEM-c}xgH+2WYPg6wL|P%z z{Dk?FT1ACz?`61AriDZUUTtSgxp0 z$6uIzq!glrF3dT~mB$XuZB{5MEG388OHv_bZ||ohC(v3i>gJNh?H(A2FAy(FD}7i4U2ls8C5C<`kt0k>p!Uj(Yh-IlY)} z<|>c%m@6!kPb4^s>7`8LNYMe@;#K*@S^}Iun6F7Frk$0_BP&1Hj&qNf^c*yCnFaEJ zPcYw;&nF@&nyLoDWY84tuzF`dKcd9fyXkshxQ><7l7K_Cq^8{uv VA@sPl#ZLeL002ovPDHLkV1ghaO7j2! diff --git a/twidere/src/main/res/drawable-xhdpi/ic_action_location.png b/twidere/src/main/res/drawable-xhdpi/ic_action_location.png deleted file mode 100755 index b17d5a54577ae50f74f753907362edc06f0519c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581 zcmV-L0=oT)P)Ne5zMd_SH}C7{YkM;?Oz7$B z*&KQEjyw8#KGTT%G@X>ywjuIn%(SeV-Zd0=Y1nB-)-|t0-aO-ig{FOO!Y(JYEcCt6 z$eV`a9@Nz}sORG-f;ZguB>whl6v0zYSzPLX?W!dCt$WzOy{aBym8` zysn*5Hfvoq?@ueEY?{6`@3i44o5ZAhy7omCY}7Jm+Ulr+WqvZ}8>3MLi7(7KB8e(U zd?3}aJE~%njvF>aRlMvEzgZSlG2&}q8jk8XW=ay(@s=%7B}0azR;$%&|8M^S1Qz-f Ttpp4K00000NkvXXu0mjfh$;>I diff --git a/twidere/src/main/res/drawable-xhdpi/ic_action_portal_cake.png b/twidere/src/main/res/drawable-xhdpi/ic_action_portal_cake.png deleted file mode 100755 index 015352410ac3b9c7b2001e161e17975c9c1603fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 911 zcmV;A191F_P)7qe)K{9Vy>Y8n-;pBDZ)62Xl(;_=(cM0bEdpZw?|7VyV2hNHAX~l{a zD^^U2NM>4cQ>nMCRMLKcX~?Q=Kfvw&!FJ{C1qk!N^!5XkT8l%jX)i$N=6f`>C7|4N z>wKs#cRk!GXAQfIJ5xyjs%!*&?Fv&(QE3j=i@Z~&+61$$@VNte6b@Jf*rJyw!3LjU z=|!8-SFNYKW3xtC00(p~6j13X_(%sG9Ry^(rc9L@4_oYG2W4DZ+7dkq{|kly#tIJr zc-Lcg_!~gRuQpp@wMKBtGS$f};jMs?x$OrQ8Eh-~)bl3lBc;as&fu(71`46Cw_Cmg zCHk0Tv}#$<=nw$r3bojyQYbUoHgMKT{e>{Vd(L1$%K-P;?E+qwvcsjFSK}&MZ8u04 zPuL00Smh=m^taS0XgS~oP%kBnbK1o%($i-3`gzW8;DR-V2%)DX(oi@cqc(Rn-Z!!! zZIh`|dYkACP2ilhMhc;~g_)*ChFR@2IPU|uxv@uSN*n)jKI)S=EIAcFM@#1smL%JA8p-^7oZ{l@tQF!3Yg@%euHv zj1odu^Bk4Go$gmAL}7r){mOA>c-8{*&2V$>@cEkL?^{!(gt5LbqF_Lt>1vKc^7oyG zlnbM6l))Xz1135se?O^HAq=%v23iNOOulxRsgp1;_XyUOfL$I{DGan+8rl-@iOs3S*I!=IT?oko+-95RI_xDqg=j56ga2-yXLJ>!Jpg+>uA>mi z0VZ5F;78MQhbIa+?h&QU1Mq`sDw2LX9wQCdW1;b`Q!a!Gy{rMimnKQI&g=PI_5mQ{ zxWkS(Ap^+T;vS`~`F)_9dQI}T$=yoY;seFi>MXa#&;F2h+DZGZQ!CZ>--uE==%idE lH=&)U2q*%IfFhs>_!pd!w$S;00&oBT002ovPDHLkV1l6Fsl5OI diff --git a/twidere/src/main/res/drawable-xhdpi/ic_action_settings.png b/twidere/src/main/res/drawable-xhdpi/ic_action_settings.png deleted file mode 100644 index a29fe5dc39c6b3dee256b992b9f34d803bf623ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 556 zcmV+{0@MA8P)7@f}wb}LIy1G^wB=_KDnVe7-f##RaV0c`yM!j(ZQzko#`2nymh zYoUcGiwnvV5R2R}v&YV?H-yYH)xujmuru#FziD|)@OV5P4^tc?bIcU2`m2S>TH*$o z8z0fqZ8Od#n$Kq4p4FMJ_2i8b4Y?9D~iFX(vTk_|fSaz+8bITJPl<7{KgHsj_30U5Sr1m*(!G{Fy3 zfrOGKC`e2MCOKso_he+;GmKLv>kEA6i7IkZx`c#uNy(|=iEs4PA()RiQ6mL zzWFf>8@ZH*&adT71(Q8KvpF=FY|>#*5lpP3+00usTd0g?3vbbE#v+x5XF9jby?__+0$#uic!59va!u?M7+HD%0000 diff --git a/twidere/src/main/res/drawable-xhdpi/ic_action_time.png b/twidere/src/main/res/drawable-xhdpi/ic_action_time.png deleted file mode 100755 index 9103621408a581c5d2d0d393521ef4d21d0e8c5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 701 zcmV;u0z&wQT?j3K?#%;8yD(26 zLv{n{rj~XiQfWY#g{UK+i_6@F9Z1gH$wHa$x11sKk-2m4ImePxQc_Y}VEM#eMzzH!~#EjXeH7@~&6?()>Bc_LkUA(|H=gi6}oni%Q9HJrN zj3K*hP(xkaV3#3hB%s-2p(ue0$0VdgbntMm-R0uZAtL1$M^uUssBuinB>|NwvH_Q* z9I;?7a7cn8#K)a_zl%?(|Ajp>0f%i;MtE2=#$!ZE2RpyOieCAldb~g()L+C>eu18T z_kQMefOD2JuifVgMK7;Fix@?KD;97GP{g$I2sj*|h^SzR1uQCzQS4*O1sa?HkkG-B z3FvH*05GO57x0MzIK#^=aEA*3Vtl#44vHaeZUL7eimqH>fZ_#~TtMeFih*1pMDf5# zU;{-c7nq=^841)-OymM7mRvycJLUpkdCU!C0fScn-*`vE;1w7w!Y4%f0nezKFGA^O zXmgvF!~p!{Bad*4`wY9&HX@xhKJXoYAN0A4W3~|qwql)|JmeI`XI{y-V%cGookiaA z1^CSy`C%kIjdYgWCG7uiNTuV@z^9uzrmLHe>C96K jlmewdDNqXhYXW}&cx~S^Wrcf-00000NkvXXu0mjfmOU;? diff --git a/twidere/src/main/res/drawable-xxhdpi/ic_action_link.png b/twidere/src/main/res/drawable-xxhdpi/ic_action_link.png deleted file mode 100755 index 1220e13ad261995c41f0b095743e48fa7880deb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1079 zcmV-71jze|P)X{}64#VMQ4=5*UR?^^5M_kY}`^T|2CgTL2H@;uM;JkRqy&+{%D z6fl~57_98XWcJhI9INTAY{LsQV}53cvI$RfhE(6vPuYU!X{4RBR+FcHaW6HPbri@&+{SUtCJOXF zCQ*l3NmQ<3Bu6oy(N!sUfHRoIMC1~NvJbPF9%_SUX(W(fJ~6q10qntSr-_z1I$B6WZWi!e!M%LSB>B(R(Qx&Wdq!Zb5ena6YjyBMU4Acqy0I!cvk%%Ig? z2CEauXANefGL7-HIKl{Z5^=T?sHK}Si#&EvO^Gf6qiLj76Md9vlrTY;fa};rU_ZHX z4HN074$+ryF!SUZCQ!#tiqtN;^95!%z2p|gQcH^+6sirbq8wAjV7Y}+93-%bu1Z07 zHe(J`BDXM>qnP!?6+)c#m?MmlTeyKkm~wh5gcz$Z)r?WPaT80}%0}i;s5ThFub6VK zRtQm+V`>Hq;1!Yt&N5Bu#yC!3-XW$Cdh!+KH;R>l7fBFkA7XyzW~CsPl{C`o6tjpZy%@>? z%ti_n!WF!Ssi9Qu;0_k^E_1n2>BbQDW46&nA>{EsrjEPi7KTxY*-0OT5MwE(o=4;s z22zRnf&NOttC*8amRl&~YfKfxbRNc1ORIA{Dz^}01Lj8ts2z-_4rt;jxrPTx5;(wc zb%3dy<~1U64QmMe!7aJ~iis$Mk<3!&v7Nw6x&#bhALqDLnZ`N-Cm5wpqAz=BF<+U+ zbC@cM)d>{xC9T#f(}+`nsbr`wf}U(4@Rl-<>p6(2^uMf diff --git a/twidere/src/main/res/drawable-xxhdpi/ic_action_location.png b/twidere/src/main/res/drawable-xxhdpi/ic_action_location.png deleted file mode 100755 index 4248fde8c06ab09a430eebabdd36d9e17100fdcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 zcmV;G18V$Pv?W`lp)T{NiJ4 z%#Xa%lK_#-M;%fU%N4J%d$eMQVshW$i+n20o0=ml7Tc}fpu051I4U+vv%~DjiscTf zcTA@w>bTp8dSB>>tXQU3y<^s>L>&*PsrR||$cn{wt2gXXEisN}&q=extjLNp?NG0# z%hDLfO5aNJw&uu+1>TTm$QCEYUnJ&vSxvpF=QTxEoZu1Z`n_O+g8&z;z2EuEtlJ8 zy1JbgS#zSThE2ziO`0QX66e^ZX6m+E5_zD}TK%T#piW8TgH}%(F%<(IFf;PQVjroR ztP!s}E%HR-5?v;z<`c^$kuNH)wcljyaj_)wM}u{a_%A=WMiTj?)nkVIn|_8MV*3QAE!2l~Er! zGm6M8?-})k)+izkHXBj1K@vrz;uc5r>5O8MI7hE8E25~(x5u02Mp0??ipM2UR2p5W rGm1=;6QWcql}e>jsZ=VJN@;!vl<~^3%w&ny00000NkvXXu0mjfG7!B7 diff --git a/twidere/src/main/res/drawable-xxhdpi/ic_action_portal_cake.png b/twidere/src/main/res/drawable-xxhdpi/ic_action_portal_cake.png deleted file mode 100755 index 0183b0820095e1272ab837e7cdf2e6aea8e193a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1424 zcmV;B1#kL^P)!Pn*W_gaTohql-db9qeY>Cjx%133Qw#T&_uhSGp6~hZJm+`j z_q})Kd4A{2FXTu`Nl8gbNl8gbNl8gjA(V2w+Z#^yn$IRzV5GOO+k28Kunw>!sR9jv zV=hUiKtCG+YgHssAQ)yp=rlQ*0>KU1!JkznQy^%NMbAz%y)e} zHaFBx@OW<*sPS6>-98t4@-c1bFrmO5&o;CwHOu+JzN-|%Di7$R5%ev!vM z{e8qu>OJWNEwaeEsuTiGh_Kr@!M6Y}m}nPR-a~B0NT2adkNcwovf|L{qT&k-cLKnR zMhJ#E0^k%_XJ9QFi&F=RryLCAe z&E^>_ltN%7fO;-dbpWjv zxggs2Jd3mz^DWfJP?dr;0RCx%!{Wg8f?y^%?A$2+VoM#4#XcNMzQ)6jfls{q0`GOB z25U8Hvp`VibhNohP+HIr zw;d)6GN#(713;@~hR6Pu2ONN63Ty^68JnAVKu;VrO2&7zTkU*jnc;a^0H^%a=xE<_ zG-!d+2y_}B%~VtI3(k z8dp4lcKOof8P}?azP@*9ln*bNp>Od7rmOd=tkctOjft`3@ANlkChIS5i(V2%5||*! zm|~gNboY?P?@fy0GG^wLJUiSPRZB${h{_97-0M;6Z1TLVHd^gIW25JlZnj-Myzcf~ z@)bU9n`y-pn3(7KDxbGSHm~HrVqmUNoNR+m+)`eFjOkvK4?ErM?A$MZjc0U0xdlFH zi+tE;ZghMcWu*=%zd&DqcV^x)$ADbKCD!VM;tFiZTVS`-^M;1#5L08RV~`YqH`Pa{ zvkzLL1(G80j)l(4tr}#WLy#1KL*^TjTQNkv15h4;Nd*fud(g1xZm!lYNQ%HavHPAu zzN!(DB5=|VT^wD;+@ukbB5>S8E{tZT*`_dNluw|KEuM%DF%_<}Nme23Gtc1i2?Uua z`H7y^r4V+Q8+|9rBM^--)@WA9Pyl=cq#1<~IGK z=&}p+u}i*WZS{rdmrtC)pG;FJ2+0%3`dze7$pvosKLt9hH$|mTE`gn{`kw_(`I)QB z)oSnu07uQ%uV8_8t6WjeUWxCCv(I7^ROKmf!jB9uceBSpPs)nZZLg;-Gv6GwYJJ_e zJz||UagKV#=-$z-QfanB3Zcbf7x%7qn@jy%hkQ6}u@CglexVT_a=__0Xr3XxyXmjm z_3EtfoWE+);!}T%jxhlx1nP>Q%ZpyVX?yH>5aH7 zzWk7S6>?mW>BL?-WUe@!H*tl8PcWY<&COiN#60ok4dKLII}Zdp=I}4BX&oU)BHIh& zUv5LXz@IYrHZOm@i|-YP`aPJyXAGhJ%e(mgos&4wsx70f{xVuJs=mlZN=<=NmaW7| zN5Ju&Ak8{jWWI5!1p*_>IOCpN{+VTrOJ{>dB5r2`O`ARyYemZAU8Fp+7WeK@-%@kr zNKKzV)XS+@mkDPdw&Y#B8iRe@m3NVfG#_=qVMk2DayoIr<7ik*gClUc>(AvoX6-2d z9J3BAW%zT!RUgYnysI1h$iaiP>3M+WBk~7t!KP$Vm!dK70 y90NYTfKD?36EFc2FaZ-V0TVC*6EFc2Fo7R11IJDDpvB(+0000WdP)jFnzj!XyUuKM-&Q2m%r zLXtL$q9}@@D2k#e%KrmDsA%XJ`DUc2q2diA9g+{r_@F05&jyn8rUvUaj>DSnU&!}Y-B+`G7V~u0Gjp5&_HNza&|KVY^z23v8#; zK~}&gPbQG#BPdX;3dkfAFf2!BqT|D>O)7AQW4}9Io28(Dz^ghwgk4er=MQ5!fstQi zasq+%W|R}~F-ZjsJ}Mw1aQoKVJ~P$fK|EbOjTTJ!j5zseRCXZ?A76E3 zsTVSV$8L&ZU|US~>`w{jCvZ?;znBWlZp?nMUi>*7D5joF{&QM(LlY_{sLtEalu>7A zfnwTJxm^`ddHtq7R7?{#*`_`)KaBq4ql>B7h>ZfrDv}3VfpBLZY#D~QxhP^gKb z`z6>gU>W5PcSGX<8Zm+JvAvK$#*#px!Dqpy6EGAYtk8&GF$JO(>~^qp@|S$!c(7)S zzGfX+Gn{qN{a{OV_@cXF%L5xNAfPY?JF)!aN160J0RaV=`3yFDG|c?Y5Id3tuc$qZ zj*7QcyUiOF9W(pfu4{N&c$S6Y+Lp6B&(LCDq3LfRh5`3VZI^eBaL2u3<7>%4h=EeJ z@l`$?H7x@Z-%Jd&)VQl!kL5!JR6qq(Km}Al1yn! + + + + + + \ No newline at end of file diff --git a/twidere/src/main/res/layout/activity_compose_bottombar.xml b/twidere/src/main/res/layout/activity_compose_bottombar.xml index 8e4cf7b74..584949f00 100644 --- a/twidere/src/main/res/layout/activity_compose_bottombar.xml +++ b/twidere/src/main/res/layout/activity_compose_bottombar.xml @@ -66,7 +66,7 @@ - - + - - + - + + - \ No newline at end of file + android:layout_gravity="start" /> + + \ No newline at end of file diff --git a/twidere/src/main/res/layout/card_item_activity_summary.xml b/twidere/src/main/res/layout/card_item_activity_summary.xml index ce6726e07..a376a777a 100644 --- a/twidere/src/main/res/layout/card_item_activity_summary.xml +++ b/twidere/src/main/res/layout/card_item_activity_summary.xml @@ -99,7 +99,7 @@ android:layout_margin="2dp" android:contentDescription="@string/profile_image" /> - - - - - - . --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/twidere/src/main/res/layout/fragment_quick_menu.xml b/twidere/src/main/res/layout/fragment_quick_menu.xml deleted file mode 100644 index 97a1bc29e..000000000 --- a/twidere/src/main/res/layout/fragment_quick_menu.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/twidere/src/main/res/layout/header_status_common.xml b/twidere/src/main/res/layout/header_status_common.xml index 7b307ed28..2858fde7c 100644 --- a/twidere/src/main/res/layout/header_status_common.xml +++ b/twidere/src/main/res/layout/header_status_common.xml @@ -44,7 +44,7 @@ android:layout_height="wrap_content" android:layout_margin="@dimen/padding_profile_image_detail_page" /> - - - - - - - - - - - - - - - - - + android:src="@drawable/ic_action_web" /> + android:src="@drawable/ic_action_time" /> - - - - - - - - + + + + \ No newline at end of file diff --git a/twidere/src/main/res/menu/menu_compose.xml b/twidere/src/main/res/menu/menu_compose.xml index 9d73e1b2c..f199591c7 100644 --- a/twidere/src/main/res/menu/menu_compose.xml +++ b/twidere/src/main/res/menu/menu_compose.xml @@ -1,20 +1,20 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + tools:ignore="AlwaysShowAction" /> + tools:ignore="AlwaysShowAction" /> + android:title="@string/take_photo" /> + android:title="@string/add_image" /> + android:title="@string/edit_media" /> + android:title="@string/mark_as_sensitive" /> + tools:ignore="AlwaysShowAction" /> + tools:ignore="AlwaysShowAction" /> + tools:ignore="AlwaysShowAction" /> + app:showAsAction="never" /> + \ No newline at end of file diff --git a/twidere/src/main/res/menu/menu_user_profile.xml b/twidere/src/main/res/menu/menu_user_profile.xml index b6235c334..fb80c3467 100644 --- a/twidere/src/main/res/menu/menu_user_profile.xml +++ b/twidere/src/main/res/menu/menu_user_profile.xml @@ -40,6 +40,10 @@ android:id="@+id/saved_searches" android:icon="@drawable/ic_action_search" android:title="@string/saved_searches" /> + - - - diff --git a/twidere/src/main/res/values/strings.xml b/twidere/src/main/res/values/strings.xml index f41f92dbb..77ca0d866 100644 --- a/twidere/src/main/res/values/strings.xml +++ b/twidere/src/main/res/values/strings.xml @@ -770,4 +770,6 @@ Media preload On mobile network Twidere is reaching token limit, you will have to create an app at https://apps.twitter.com/ and paste consumer key and secret below.\nIf you continue using default key, you may not be able to sign in. + Send at + Scheduled tweets \ No newline at end of file diff --git a/twidere/src/main/svg/drawable/ic_action_cake-mdpi.svg b/twidere/src/main/svg/drawable/ic_action_cake-mdpi.svg new file mode 100644 index 000000000..8a1414bf1 --- /dev/null +++ b/twidere/src/main/svg/drawable/ic_action_cake-mdpi.svg @@ -0,0 +1,12 @@ + + + + Artboard + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/twidere/src/main/svg/drawable/ic_action_link-mdpi.svg b/twidere/src/main/svg/drawable/ic_action_link-mdpi.svg new file mode 100644 index 000000000..4d819e3d0 --- /dev/null +++ b/twidere/src/main/svg/drawable/ic_action_link-mdpi.svg @@ -0,0 +1,12 @@ + + + + Artboard + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/twidere/src/main/svg/drawable/ic_action_location-mdpi.svg b/twidere/src/main/svg/drawable/ic_action_location-mdpi.svg new file mode 100644 index 000000000..9df9d1251 --- /dev/null +++ b/twidere/src/main/svg/drawable/ic_action_location-mdpi.svg @@ -0,0 +1,12 @@ + + + + Artboard + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/twidere/src/main/svg/ic_action_settings-mdpi.svg b/twidere/src/main/svg/drawable/ic_action_settings-mdpi.svg similarity index 100% rename from twidere/src/main/svg/ic_action_settings-mdpi.svg rename to twidere/src/main/svg/drawable/ic_action_settings-mdpi.svg diff --git a/twidere/src/main/svg/drawable/ic_action_time-mdpi.svg b/twidere/src/main/svg/drawable/ic_action_time-mdpi.svg new file mode 100644 index 000000000..26434242f --- /dev/null +++ b/twidere/src/main/svg/drawable/ic_action_time-mdpi.svg @@ -0,0 +1,13 @@ + + + + Artboard + Created with Sketch. + + + + + + + + \ No newline at end of file